CINXE.COM

Floor Plan - SATELLITE 2025

<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>Floor Plan - SATELLITE 2025</title> <meta name="description" content="The floor plan provides a visual map of the entire event. Find exhibitors and make a plan for SATELLITE 2025."> <meta property="og:url" content="https&#x3a;&#x2f;&#x2f;satellite2025.mapyourshow.com&#x2f;8_0&#x2f;floorplan&#x2f;index.cfm" /> <meta property="og:type" content="website" /> <meta property="og:title" content="Floor Plan - SATELLITE 2025" /> <meta property="og:description" content="The floor plan provides a visual map of the entire event. Find exhibitors and make a plan for SATELLITE 2025." /> <meta property="og:image" content="" /> <meta property="og:site_name" content="SATELLITE 2025" /> <meta name="twitter:card" content="summary"> <meta name="twitter:title" content="Floor Plan - SATELLITE 2025" /> <meta name="twitter:description" content="The floor plan provides a visual map of the entire event. Find exhibitors and make a plan for SATELLITE 2025." /> <meta name="twitter:image" content="" /> <meta name="viewport" content="width=device-width, minimum-scale=1, initial-scale=1"> <link rel="icon" href="/8_0/includes/imgs/favicon.ico" /> <link rel="stylesheet" href="/8_0/assets/css/main.css?myscache=20240926A"> <script> function parse_query_string(query) { var vars = query.split("&"); var query_string = {}; for (var i = 0; i < vars.length; i++) { var pair = vars[i].split("="); var key = decodeURIComponent(pair[0]); var value = decodeURIComponent(pair[1]); // If first entry with this name if (typeof query_string[key] === "undefined") { query_string[key] = decodeURIComponent(value); // If second entry with this name } else if (typeof query_string[key] === "string") { var arr = [query_string[key], decodeURIComponent(value)]; query_string[key] = arr; // If third or later entry with this name } else { query_string[key].push(decodeURIComponent(value)); } } return query_string; } // handles the language change in includes/_language.cfm function changeLanguage(languageFormId){ if (languageFormId === undefined){ languageFormId = 'mys-langset'; } var query = window.location.search.substring(1); var qs; if (query){ qs = parse_query_string(query); for (var key in qs) { var input = document.createElement("input"); input.setAttribute("type", "hidden"); input.setAttribute("name", key); input.setAttribute("value", qs[key]); //append to form element that you want . document.getElementById(languageFormId).appendChild(input); } } document.getElementById(languageFormId).action = window.location.pathname + window.location.hash; document.getElementById(languageFormId).submit(); } var query = window.location.search.substring(1); var qs; if (query){ qs = parse_query_string(query); } </script> <!-- Grab theme CSS --> <style> :root {--color-accent-10: hsl(170, 78%, 36%);--color-accent-20: hsl(170, 78%, 46%);--color-accent-30: hsl(170, 78%, 56%);--color-accent-40: hsl(170, 78%, 66%);--color-accent-50: hsl(170, 78%, 76%);--color-brand-10: hsl(245, 100%, 21%);--color-brand-20: hsl(245, 87%, 29%);--color-brand-30: hsl(245, 82%, 33%);--color-brand-40: hsl(245, 76%, 39%);--color-brand-50: hsl(245, 67%, 45%);--color-brand-60: hsl(245, 65%, 55%);--color-brand-70: hsl(245, 74%, 65%);--color-brand-80: hsl(245, 84%, 74%);--color-brand-90: hsl(245, 97%, 85%);--color-brand-100: hsl(245, 75%, 97%);--color-header: hsl(0, 0%, 100%);--color-header-background: hsl(0, 0%, 100%);--color-nav: hsl(0, 0%, 100%);--color-nav-background: hsl(245, 69%, 29%);--color-shortcut: hsl(0, 0%, 100%);--color-shortcut-background: hsl(205, 82%, 33%);--color-nav-2: hsl(0, 0%, 0%);--color-nav-background-2: hsl(0, 0%, 100%);--style-search-background: hsl(0, 0%, 60%);--border-radius: 0.5rem;--event-info-font-weight: normal;--event-info-visibility: 0.875rem;--nav-links-alignment-navbar-v2: center;} </style> <!-- Grab Gardner Styles --> <style> .nav--wrapper_inner.is-mobile { --color-nav-background: #FFFFFF; --color-nav: black; } .is-floorplan .o-nav_avatar_button .o-bell_icon path { stroke: var(--color-nav-2); } </style> <link rel="stylesheet" href="/8_0/assets/css/global.css?mysv=20221018A"> <link rel="stylesheet" href="/8_0/assets/css/floorplan.css?mysv=20221018A"> <script type="text/javascript" src="/8_0/assets/js/modernizr.custom.16899.js"></script> <link href="/8_0/assets/css/jqueryui/1.10.3/jquery-ui-1.10.3.custom.min.css" rel="stylesheet" /> <link href="/8_0/assets/css/magnific-popup/1.1.0/magnific.css" rel="stylesheet" /> <link href="/8_0/assets/css/chosen/chosen.min.css" rel="stylesheet" /> <link href="/8_0/assets/css/introjs/2.9.3/introjs.min.css" rel="stylesheet" /><script src="/8_0/assets/js/jquery/3.7.0/jquery-3.7.0.min.js"></script> <script src="/8_0/assets/js/jqueryui/1.10.3/jquery-ui.min.js"></script> <script src="/8_0/assets/js/magnific-popup/1.1.0/magnific-min.js"></script> <script src="/8_0/assets/js/imglazyload/1.9.0/jquery.lazyload.min.js"></script> <script src="/8_0/assets/js/head.min.js"></script> <script src="/8_0/assets/js/enquire/2.1.0/enquire.min.js"></script> <script src="/8_0/assets/js/chosen/1.7.0/chosen.jquery.min.js"></script> <script src="/8_0/assets/js/vue/2.7.14/vue.min.js"></script> <script src="/8_0/assets/js/es6-promise/es6-promise.auto.min.js"></script> <script src="/8_0/assets/js/velocity/1.2.3/velocity.min.js"></script> <script src="/8_0/assets/js/vue-tippy/2.1.2/vue-tippy.min.js"></script> <script src="/8_0/assets/js/vue-scrollto/vue-scrollto.min.js"></script> <script src="/8_0/assets/js/css-element-queries/1.2.1/ResizeSensor.min.js"></script> <script src="/8_0/assets/js/css-element-queries/1.2.1/ElementQueries.min.js"></script> <script src="/8_0/assets/js/bigpicture/bigpicture.min.js"></script> <script src="/8_0/assets/js/css-vars-ponyfill/2.0.2/css-vars-ponyfill.min.js"></script> <script src="/8_0/assets/js/introjs/2.9.3/introjs.min.js"></script> <script src="/8_0/assets/js/fontfaceobserver/fontfaceobserver.min.js"></script><script src="/8_0/assets/js/jquerymigrate/3.4.1/jquery-migrate-3.4.1.min.js"></script> <script type='text/javascript'> var $mysjquery = $ , Path2AppRoot = "/8_0" , ShowID = "SATELLITE2025" , Datasource = "MYS_SATELLITE2025" , mysJSVersion = "20221018A" , PopState = 'popstate' , userSession = '' , UseHTML5Video = false ; </script> <script type='text/javascript'> window.idsVueScrolling = false; var manualScroll = false; VueScrollTo.setDefaults({ container: "body", duration: 300, easing: "ease", offset: 0, force: true, cancelable: true, onStart: function(el){ window.idsVueScrolling = true; }, onDone: function(el){ window.idsVueScrolling = false; if (!manualScroll){ VueScrollTo.scrollTo(el, 300, {onDone:function(){ manualScroll = false; } }); manualScroll = true; } }, onCancel: false, x: false, y: true }); </script> <script type='text/javascript'> cssVars({ //onlyLegacy: false, onComplete: function(cssText, styleNodes, cssVariables, benchmark) { //console.log(cssText); } }); </script> <script> /*Vue.mixin({ data: function() { return { get searchcontent() { return {"includes\\vue\\generic\\backtotop-button.cfm":{"backToTopText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\backtotop-button.cfm","TEXT":"Back to Top","APP_VERSION":"8_0","SECTION":"backToTopText"}]},"includes\\vue\\mixin\\global-mixin.cfm":{"septemberText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"September","APP_VERSION":"8_0","SECTION":"septemberText"}],"julyText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"July","APP_VERSION":"8_0","SECTION":"julyText"}],"julyAbbrText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"Jul","APP_VERSION":"8_0","SECTION":"julyAbbrText"}],"tuesdayAbbrText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"Tue","APP_VERSION":"8_0","SECTION":"tuesdayAbbrText"}],"wednesdayAbbrText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"Wed","APP_VERSION":"8_0","SECTION":"wednesdayAbbrText"}],"februaryText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"February","APP_VERSION":"8_0","SECTION":"februaryText"}],"mayText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"May","APP_VERSION":"8_0","SECTION":"mayText"}],"thursdayText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"Thursday","APP_VERSION":"8_0","SECTION":"thursdayText"}],"mondayText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"Monday","APP_VERSION":"8_0","SECTION":"mondayText"}],"juneAbbrText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"Jun","APP_VERSION":"8_0","SECTION":"juneAbbrText"}],"marchAbbrText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"Mar","APP_VERSION":"8_0","SECTION":"marchAbbrText"}],"novemberText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"November","APP_VERSION":"8_0","SECTION":"novemberText"}],"octoberAbbrText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"Oct","APP_VERSION":"8_0","SECTION":"octoberAbbrText"}],"aprilAbbrText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"Apr","APP_VERSION":"8_0","SECTION":"aprilAbbrText"}],"fridayText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"Friday","APP_VERSION":"8_0","SECTION":"fridayText"}],"saturdayText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"Saturday","APP_VERSION":"8_0","SECTION":"saturdayText"}],"tuesdayText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"Tuesday","APP_VERSION":"8_0","SECTION":"tuesdayText"}],"augustText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"August","APP_VERSION":"8_0","SECTION":"augustText"}],"februaryAbbrText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"Feb","APP_VERSION":"8_0","SECTION":"februaryAbbrText"}],"marchText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"March","APP_VERSION":"8_0","SECTION":"marchText"}],"sundayAbbrText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"Sun","APP_VERSION":"8_0","SECTION":"sundayAbbrText"}],"saturdayAbbrText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"Sat","APP_VERSION":"8_0","SECTION":"saturdayAbbrText"}],"mondayAbbrText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"Mon","APP_VERSION":"8_0","SECTION":"mondayAbbrText"}],"octoberText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"October","APP_VERSION":"8_0","SECTION":"octoberText"}],"decemberAbbrText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"Dec","APP_VERSION":"8_0","SECTION":"decemberAbbrText"}],"mayAbbrText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"May","APP_VERSION":"8_0","SECTION":"mayAbbrText"}],"decemberText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"December","APP_VERSION":"8_0","SECTION":"decemberText"}],"januaryAbbrText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"Jan","APP_VERSION":"8_0","SECTION":"januaryAbbrText"}],"thursdayAbbrText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"Thu","APP_VERSION":"8_0","SECTION":"thursdayAbbrText"}],"septemberAbbrText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"Sep","APP_VERSION":"8_0","SECTION":"septemberAbbrText"}],"aprilText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"April","APP_VERSION":"8_0","SECTION":"aprilText"}],"novemberAbbrText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"Nov","APP_VERSION":"8_0","SECTION":"novemberAbbrText"}],"januaryText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"January","APP_VERSION":"8_0","SECTION":"januaryText"}],"juneText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"June","APP_VERSION":"8_0","SECTION":"juneText"}],"sundayText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"Sunday","APP_VERSION":"8_0","SECTION":"sundayText"}],"fridayAbbrText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"Fri","APP_VERSION":"8_0","SECTION":"fridayAbbrText"}],"augustAbbrText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"Aug","APP_VERSION":"8_0","SECTION":"augustAbbrText"}],"wednesdayText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"Wednesday","APP_VERSION":"8_0","SECTION":"wednesdayText"}]},"includes\\vue\\myshow\\myshow-email-exhibitor-form.cfm":{"emailText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\myshow\\myshow-email-exhibitor-form.cfm","TEXT":"My Email Address","APP_VERSION":"8_0","SECTION":"emailText"}],"errorMessage":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\myshow\\myshow-email-exhibitor-form.cfm","TEXT":"Message is a required field to send an email.","APP_VERSION":"8_0","SECTION":"errorMessage"}],"messageText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\myshow\\myshow-email-exhibitor-form.cfm","TEXT":"Message","APP_VERSION":"8_0","SECTION":"messageText"}],"sendEmailText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\myshow\\myshow-email-exhibitor-form.cfm","TEXT":"Send Email","APP_VERSION":"8_0","SECTION":"sendEmailText"}],"phoneText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\myshow\\myshow-email-exhibitor-form.cfm","TEXT":"Phone","APP_VERSION":"8_0","SECTION":"phoneText"}]},"includes\\vue\\chat\\chat-box.cfm":{"unblockcontacttext":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\chat\\chat-box.cfm","TEXT":"Unblock","APP_VERSION":"8_0","SECTION":"unblockcontacttext"}],"sendmessagetext":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\chat\\chat-box.cfm","TEXT":"Send Message","APP_VERSION":"8_0","SECTION":"sendmessagetext"}],"userofflinetext":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\chat\\chat-box.cfm","TEXT":"This user is offline and no longer available for chat.","APP_VERSION":"8_0","SECTION":"userofflinetext"}],"addmessagestext":[{"CONTAINSVAR":1,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\chat\\chat-box.cfm","TEXT":"Add your messages to {{talkingtousername}} below","APP_VERSION":"8_0","SECTION":"addmessagestext"}],"blockcontacttext":[{"CONTAINSVAR":0,"LANGUAGECODE":"EN","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\chat\\chat-box.cfm","TEXT":"Block","APP_VERSION":"8_0","SECTION":"blockcontacttext"}],"start":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\chat\\chat-box.cfm","TEXT":"Start a Conversation...","APP_VERSION":"8_0","SECTION":"start"}],"characterlimittext":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\chat\\chat-box.cfm","TEXT":"You Have Reached the Character Limit. Shorten the Message to Send It.","APP_VERSION":"8_0","SECTION":"characterlimittext"}],"charactercounttext":[{"CONTAINSVAR":1,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\chat\\chat-box.cfm","TEXT":"Maximum 1000 characters ({{charactersleft}} remaining)","APP_VERSION":"8_0","SECTION":"charactercounttext"}],"loadmoremessagestext":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\chat\\chat-box.cfm","TEXT":"Load More Messages","APP_VERSION":"8_0","SECTION":"loadmoremessagestext"}],"reply":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\chat\\chat-box.cfm","TEXT":"Reply...","APP_VERSION":"8_0","SECTION":"reply"}]},"includes\\vue\\generic\\modal-display.cfm":{"closeText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\modal-display.cfm","TEXT":"Close","APP_VERSION":"8_0","SECTION":"closeText"}]},"includes\\vue\\generic\\toggle-favorite.cfm":{"processingText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Please check back, we are still processing your request.","APP_VERSION":"8_0","SECTION":"processingText"}],"savingText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Saving...","APP_VERSION":"8_0","SECTION":"savingText"}],"waitlistModalText2":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Please confirm you would like to be removed from the waitlist.","APP_VERSION":"8_0","SECTION":"waitlistModalText2"}],"waitlistModalText1":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Removing this session will cause you to lose your position in the waitlist queue.","APP_VERSION":"8_0","SECTION":"waitlistModalText1"}],"addToMyShowPlannerText-session":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Add to My Show Planner","APP_VERSION":"8_0","SECTION":"addToMyShowPlannerText-session"}],"noAccessText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Not Available","APP_VERSION":"8_0","SECTION":"noAccessText"}],"processingModalTitle":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Processing request","APP_VERSION":"8_0","SECTION":"processingModalTitle"}],"reserveModalText1":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"By hitting confirm you are losing your reserved seat in this session. If you choose to add it back, there may not be any seats available. We cannot guarantee you will get your seat back.","APP_VERSION":"8_0","SECTION":"reserveModalText1"}],"removeFromPlannerText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Remove From Planner","APP_VERSION":"8_0","SECTION":"removeFromPlannerText"}],"reservedRemoveText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"This session has been removed from your schedule.","APP_VERSION":"8_0","SECTION":"reservedRemoveText"}],"reserveModalText2":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Please confirm you want to remove this session.","APP_VERSION":"8_0","SECTION":"reserveModalText2"}],"processingModalText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Please Wait...","APP_VERSION":"8_0","SECTION":"processingModalText"}],"waitlistRemoveText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Remove from Waitlist","APP_VERSION":"8_0","SECTION":"waitlistRemoveText"}],"confirmModalTitle":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Confirm Request","APP_VERSION":"8_0","SECTION":"confirmModalTitle"}],"noAccessHintText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Your registration does not grant you access to this session.","APP_VERSION":"8_0","SECTION":"noAccessHintText"}],"loginText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Log In Required","APP_VERSION":"8_0","SECTION":"loginText"}],"confirmTitle":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Confirm Change","APP_VERSION":"8_0","SECTION":"confirmTitle"}],"filledText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Session Filled","APP_VERSION":"8_0","SECTION":"filledText"}],"reserveAddText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Add to Schedule","APP_VERSION":"8_0","SECTION":"reserveAddText"}],"confirmText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Confirm","APP_VERSION":"8_0","SECTION":"confirmText"}],"addToMyShowPlannerText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Add To My Show Planner","APP_VERSION":"8_0","SECTION":"addToMyShowPlannerText"}],"reserveRemoveText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Remove from Schedule","APP_VERSION":"8_0","SECTION":"reserveRemoveText"}],"cancelText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Cancel","APP_VERSION":"8_0","SECTION":"cancelText"}],"savedToMyShowPlannerText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Saved to My Show Planner","APP_VERSION":"8_0","SECTION":"savedToMyShowPlannerText"}],"waitlistAddText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Join Waitlist","APP_VERSION":"8_0","SECTION":"waitlistAddText"}],"filledHintText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"This session does not have any seats available, and the waitlist is currently full.","APP_VERSION":"8_0","SECTION":"filledHintText"}],"loginHintText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Please log in to your planner","APP_VERSION":"8_0","SECTION":"loginHintText"}],"appointmentRemoveFromPlannerText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Cancel Appointment","APP_VERSION":"8_0","SECTION":"appointmentRemoveFromPlannerText"}],"cancelTitle":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Cancel Change","APP_VERSION":"8_0","SECTION":"cancelTitle"}],"conflictModalText2":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"This session time overlaps with another session on your schedule. In order to add this session, the following session(s) will be removed from your schedule:","APP_VERSION":"8_0","SECTION":"conflictModalText2"}],"conflictModalText3":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Please confirm you would like to proceed with this update.","APP_VERSION":"8_0","SECTION":"conflictModalText3"}],"updatingText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Updating","APP_VERSION":"8_0","SECTION":"updatingText"}],"waitlistRemovedText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"You have been removed from the waitlist.","APP_VERSION":"8_0","SECTION":"waitlistRemovedText"}],"conflictModalText1":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"ALERT: Schedule Conflict","APP_VERSION":"8_0","SECTION":"conflictModalText1"}],"reservedText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Your seat has successfully been reserved.","APP_VERSION":"8_0","SECTION":"reservedText"}],"waitlistText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"You have been added to the waitlist for this session and will automatically be moved to reserved should a seat become available.","APP_VERSION":"8_0","SECTION":"waitlistText"}]},"includes\\vue\\generic\\loading-display.cfm":{"loadingText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\loading-display.cfm","TEXT":"Loading...","APP_VERSION":"8_0","SECTION":"loadingText"}]},"includes\\vue\\generic\\recommendations-modal.cfm":{"closeButtonText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\recommendations-modal.cfm","TEXT":"Close","APP_VERSION":"8_0","SECTION":"closeButtonText"}],"recommenendedResultsText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\recommendations-modal.cfm","TEXT":"Recommended Results","APP_VERSION":"8_0","SECTION":"recommenendedResultsText"}],"dontHaveRecsText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\recommendations-modal.cfm","TEXT":"You don't have any recommendations yet. As you browse through the directory recommendations will be made based on your interests.","APP_VERSION":"8_0","SECTION":"dontHaveRecsText"}],"sessionButtonText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\recommendations-modal.cfm","TEXT":"Sessions","APP_VERSION":"8_0","SECTION":"sessionButtonText"}],"exhibitorButtonText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\recommendations-modal.cfm","TEXT":"Exhibitors","APP_VERSION":"8_0","SECTION":"exhibitorButtonText"}],"loadingText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\recommendations-modal.cfm","TEXT":"Loading...","APP_VERSION":"8_0","SECTION":"loadingText"}],"topSixRecText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\recommendations-modal.cfm","TEXT":"Below are up to the first 6 recommendations for you. To see your entire list and easily add to your planner or dismiss","APP_VERSION":"8_0","SECTION":"topSixRecText"}],"errorLoadingRecommendations":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\recommendations-modal.cfm","TEXT":"Error loading recommendations","APP_VERSION":"8_0","SECTION":"errorLoadingRecommendations"}],"dismssText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\recommendations-modal.cfm","TEXT":"Dismiss","APP_VERSION":"8_0","SECTION":"dismssText"}],"loginOrCreatePlannerText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\recommendations-modal.cfm","TEXT":"Log in or Create a Planner","APP_VERSION":"8_0","SECTION":"loginOrCreatePlannerText"}]},"includes\\vue\\myshow\\myshow-add-onsitephotos-form.cfm":{"cancelButton":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\myshow\\myshow-add-onsitephotos-form.cfm","TEXT":"Cancel","APP_VERSION":"8_0","SECTION":"cancelButton"}],"notesHeader":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\myshow\\myshow-add-onsitephotos-form.cfm","TEXT":"Notes","APP_VERSION":"8_0","SECTION":"notesHeader"}],"uploadPhotoHeader":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\myshow\\myshow-add-onsitephotos-form.cfm","TEXT":"Upload a Photo","APP_VERSION":"8_0","SECTION":"uploadPhotoHeader"}],"addNotesHeader":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\myshow\\myshow-add-onsitephotos-form.cfm","TEXT":"Add Notes","APP_VERSION":"8_0","SECTION":"addNotesHeader"}],"selectExhibitorFirstOption":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\myshow\\myshow-add-onsitephotos-form.cfm","TEXT":"Select an Exhibitor","APP_VERSION":"8_0","SECTION":"selectExhibitorFirstOption"}],"saveMyChangesHeader":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\myshow\\myshow-add-onsitephotos-form.cfm","TEXT":"Save My Changes","APP_VERSION":"8_0","SECTION":"saveMyChangesHeader"}],"submitButton":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\myshow\\myshow-add-onsitephotos-form.cfm","TEXT":"Submit","APP_VERSION":"8_0","SECTION":"submitButton"}],"uploadMyPhotoHeader":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\myshow\\myshow-add-onsitephotos-form.cfm","TEXT":"Upload My Photo","APP_VERSION":"8_0","SECTION":"uploadMyPhotoHeader"}],"selectExhibitorHeader":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\myshow\\myshow-add-onsitephotos-form.cfm","TEXT":"Choose an Exhibitor to Tag","APP_VERSION":"8_0","SECTION":"selectExhibitorHeader"}]},"includes\\vue\\myshow\\myshow-add-appointments-form_v2.cfm":{"booth_label":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\myshow\\myshow-add-appointments-form_v2.cfm","TEXT":"Booth","APP_VERSION":"8_0","SECTION":"booth_label"}],"dateHeader":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\myshow\\myshow-add-appointments-form_v2.cfm","TEXT":"Date","APP_VERSION":"8_0","SECTION":"dateHeader"}],"noteInfoText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\myshow\\myshow-add-appointments-form_v2.cfm","TEXT":"Notes you add will be shared with this exhibitor","APP_VERSION":"8_0","SECTION":"noteInfoText"}],"maxcharacters":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\myshow\\myshow-add-appointments-form_v2.cfm","TEXT":"Max characters","APP_VERSION":"8_0","SECTION":"maxcharacters"}],"noteHeader":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\myshow\\myshow-add-appointments-form_v2.cfm","TEXT":"Add a Note","APP_VERSION":"8_0","SECTION":"noteHeader"}],"submitButton":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\myshow\\myshow-add-appointments-form_v2.cfm","TEXT":"Submit","APP_VERSION":"8_0","SECTION":"submitButton"}],"exhibitorHeader":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\myshow\\myshow-add-appointments-form_v2.cfm","TEXT":"Exhibitor","APP_VERSION":"8_0","SECTION":"exhibitorHeader"}],"timeHeaderText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\myshow\\myshow-add-appointments-form_v2.cfm","TEXT":"Choose a Meeting Time","APP_VERSION":"8_0","SECTION":"timeHeaderText"}],"virtualLocationText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\myshow\\myshow-add-appointments-form_v2.cfm","TEXT":"Virtual","APP_VERSION":"8_0","SECTION":"virtualLocationText"}],"timeZoneInfo":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\myshow\\myshow-add-appointments-form_v2.cfm","TEXT":"Appointment times are in {{timezonelabel}}","APP_VERSION":"8_0","SECTION":"timeZoneInfo"}],"textPlaceholder":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\myshow\\myshow-add-appointments-form_v2.cfm","TEXT":"What would you like to discuss with {{exhname}}?","APP_VERSION":"8_0","SECTION":"textPlaceholder"}],"meetingDetailsHeader":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\myshow\\myshow-add-appointments-form_v2.cfm","TEXT":"Meeting Details","APP_VERSION":"8_0","SECTION":"meetingDetailsHeader"}],"cancelButton":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\myshow\\myshow-add-appointments-form_v2.cfm","TEXT":"Cancel","APP_VERSION":"8_0","SECTION":"cancelButton"}],"requiredText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\myshow\\myshow-add-appointments-form_v2.cfm","TEXT":"Indicates required fields.","APP_VERSION":"8_0","SECTION":"requiredText"}],"timeHeader":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\myshow\\myshow-add-appointments-form_v2.cfm","TEXT":"Time","APP_VERSION":"8_0","SECTION":"timeHeader"}],"dateHeaderText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\myshow\\myshow-add-appointments-form_v2.cfm","TEXT":"Available Dates","APP_VERSION":"8_0","SECTION":"dateHeaderText"}],"locationHeader":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\myshow\\myshow-add-appointments-form_v2.cfm","TEXT":"Location","APP_VERSION":"8_0","SECTION":"locationHeader"}]},"includes\\vue\\exhibitor\\exh-products-display.cfm":{"dateaddedtext":[{"CONTAINSVAR":1,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\exhibitor\\exh-products-display.cfm","TEXT":"Added - {{formatDateForDisplay(dateadded)}}","APP_VERSION":"8_0","SECTION":"dateaddedtext"}],"learnmoretext":[{"CONTAINSVAR":1,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\exhibitor\\exh-products-display.cfm","TEXT":"Learn More About {{exhibitorname}}","APP_VERSION":"8_0","SECTION":"learnmoretext"}],"videotagtext":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\exhibitor\\exh-products-display.cfm","TEXT":"Video","APP_VERSION":"8_0","SECTION":"videotagtext"}],"readlesstext":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\exhibitor\\exh-products-display.cfm","TEXT":"Read Less","APP_VERSION":"8_0","SECTION":"readlesstext"}],"readmoretext":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\exhibitor\\exh-products-display.cfm","TEXT":"Read More","APP_VERSION":"8_0","SECTION":"readmoretext"}]},"includes\\vue\\generic\\gallery-display.cfm":{"readLessText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\gallery-display.cfm","TEXT":"Read Less","APP_VERSION":"8_0","SECTION":"readLessText"}],"readMoreText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\gallery-display.cfm","TEXT":"Read More","APP_VERSION":"8_0","SECTION":"readMoreText"}]},"includes\\vue\\exhibitor\\exh-onlinecontacts-display.cfm":{"loginToContact":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\exhibitor\\exh-onlinecontacts-display.cfm","TEXT":"Create or Log in to <a>My Show Planner</a> to Contact This Person","APP_VERSION":"8_0","SECTION":"loginToContact"}]},"includes\\vue\\generic\\session-result-card.cfm":{"onDemandLabel":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\session-result-card.cfm","TEXT":"On Demand","APP_VERSION":"8_0","SECTION":"onDemandLabel"}],"moreText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\session-result-card.cfm","TEXT":"more","APP_VERSION":"8_0","SECTION":"moreText"}],"regRequiredText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\session-result-card.cfm","TEXT":"Registration Required*","APP_VERSION":"8_0","SECTION":"regRequiredText"}]},"includes\\vue\\myshow\\myshow-email-online-contact-form.cfm":{"emailText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\myshow\\myshow-email-online-contact-form.cfm","TEXT":"My Email Address","APP_VERSION":"8_0","SECTION":"emailText"}],"errorMessage":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\myshow\\myshow-email-online-contact-form.cfm","TEXT":"Message is a required field to send an email.","APP_VERSION":"8_0","SECTION":"errorMessage"}],"messageText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\myshow\\myshow-email-online-contact-form.cfm","TEXT":"Message","APP_VERSION":"8_0","SECTION":"messageText"}],"sendEmailText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\myshow\\myshow-email-online-contact-form.cfm","TEXT":"Send Email","APP_VERSION":"8_0","SECTION":"sendEmailText"}],"phoneText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\myshow\\myshow-email-online-contact-form.cfm","TEXT":"Phone","APP_VERSION":"8_0","SECTION":"phoneText"}]},"includes\\vue\\generic\\recommendations-widget.cfm":{"okayGotItText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\recommendations-widget.cfm","TEXT":"Okay, Got it!","APP_VERSION":"8_0","SECTION":"okayGotItText"}]},"includes\\vue\\generic\\exhibitor-result-card.cfm":{"seeText":[{"CONTAINSVAR":0,"LANGUAGECODE":"EN","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\exhibitor-result-card.cfm","TEXT":"Also Known As","APP_VERSION":"8_0","SECTION":"seeText"}]}}; } } } });*/ const searchcontent = {"includes\\vue\\generic\\backtotop-button.cfm":{"backToTopText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\backtotop-button.cfm","TEXT":"Back to Top","APP_VERSION":"8_0","SECTION":"backToTopText"}]},"includes\\vue\\mixin\\global-mixin.cfm":{"septemberText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"September","APP_VERSION":"8_0","SECTION":"septemberText"}],"julyText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"July","APP_VERSION":"8_0","SECTION":"julyText"}],"julyAbbrText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"Jul","APP_VERSION":"8_0","SECTION":"julyAbbrText"}],"tuesdayAbbrText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"Tue","APP_VERSION":"8_0","SECTION":"tuesdayAbbrText"}],"wednesdayAbbrText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"Wed","APP_VERSION":"8_0","SECTION":"wednesdayAbbrText"}],"februaryText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"February","APP_VERSION":"8_0","SECTION":"februaryText"}],"mayText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"May","APP_VERSION":"8_0","SECTION":"mayText"}],"thursdayText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"Thursday","APP_VERSION":"8_0","SECTION":"thursdayText"}],"mondayText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"Monday","APP_VERSION":"8_0","SECTION":"mondayText"}],"juneAbbrText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"Jun","APP_VERSION":"8_0","SECTION":"juneAbbrText"}],"marchAbbrText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"Mar","APP_VERSION":"8_0","SECTION":"marchAbbrText"}],"novemberText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"November","APP_VERSION":"8_0","SECTION":"novemberText"}],"octoberAbbrText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"Oct","APP_VERSION":"8_0","SECTION":"octoberAbbrText"}],"aprilAbbrText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"Apr","APP_VERSION":"8_0","SECTION":"aprilAbbrText"}],"fridayText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"Friday","APP_VERSION":"8_0","SECTION":"fridayText"}],"saturdayText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"Saturday","APP_VERSION":"8_0","SECTION":"saturdayText"}],"tuesdayText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"Tuesday","APP_VERSION":"8_0","SECTION":"tuesdayText"}],"augustText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"August","APP_VERSION":"8_0","SECTION":"augustText"}],"februaryAbbrText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"Feb","APP_VERSION":"8_0","SECTION":"februaryAbbrText"}],"marchText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"March","APP_VERSION":"8_0","SECTION":"marchText"}],"sundayAbbrText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"Sun","APP_VERSION":"8_0","SECTION":"sundayAbbrText"}],"saturdayAbbrText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"Sat","APP_VERSION":"8_0","SECTION":"saturdayAbbrText"}],"mondayAbbrText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"Mon","APP_VERSION":"8_0","SECTION":"mondayAbbrText"}],"octoberText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"October","APP_VERSION":"8_0","SECTION":"octoberText"}],"decemberAbbrText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"Dec","APP_VERSION":"8_0","SECTION":"decemberAbbrText"}],"mayAbbrText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"May","APP_VERSION":"8_0","SECTION":"mayAbbrText"}],"decemberText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"December","APP_VERSION":"8_0","SECTION":"decemberText"}],"januaryAbbrText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"Jan","APP_VERSION":"8_0","SECTION":"januaryAbbrText"}],"thursdayAbbrText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"Thu","APP_VERSION":"8_0","SECTION":"thursdayAbbrText"}],"septemberAbbrText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"Sep","APP_VERSION":"8_0","SECTION":"septemberAbbrText"}],"aprilText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"April","APP_VERSION":"8_0","SECTION":"aprilText"}],"novemberAbbrText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"Nov","APP_VERSION":"8_0","SECTION":"novemberAbbrText"}],"januaryText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"January","APP_VERSION":"8_0","SECTION":"januaryText"}],"juneText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"June","APP_VERSION":"8_0","SECTION":"juneText"}],"sundayText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"Sunday","APP_VERSION":"8_0","SECTION":"sundayText"}],"fridayAbbrText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"Fri","APP_VERSION":"8_0","SECTION":"fridayAbbrText"}],"augustAbbrText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"Aug","APP_VERSION":"8_0","SECTION":"augustAbbrText"}],"wednesdayText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\mixin\\global-mixin.cfm","TEXT":"Wednesday","APP_VERSION":"8_0","SECTION":"wednesdayText"}]},"includes\\vue\\myshow\\myshow-email-exhibitor-form.cfm":{"emailText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\myshow\\myshow-email-exhibitor-form.cfm","TEXT":"My Email Address","APP_VERSION":"8_0","SECTION":"emailText"}],"errorMessage":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\myshow\\myshow-email-exhibitor-form.cfm","TEXT":"Message is a required field to send an email.","APP_VERSION":"8_0","SECTION":"errorMessage"}],"messageText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\myshow\\myshow-email-exhibitor-form.cfm","TEXT":"Message","APP_VERSION":"8_0","SECTION":"messageText"}],"sendEmailText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\myshow\\myshow-email-exhibitor-form.cfm","TEXT":"Send Email","APP_VERSION":"8_0","SECTION":"sendEmailText"}],"phoneText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\myshow\\myshow-email-exhibitor-form.cfm","TEXT":"Phone","APP_VERSION":"8_0","SECTION":"phoneText"}]},"includes\\vue\\chat\\chat-box.cfm":{"unblockcontacttext":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\chat\\chat-box.cfm","TEXT":"Unblock","APP_VERSION":"8_0","SECTION":"unblockcontacttext"}],"sendmessagetext":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\chat\\chat-box.cfm","TEXT":"Send Message","APP_VERSION":"8_0","SECTION":"sendmessagetext"}],"userofflinetext":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\chat\\chat-box.cfm","TEXT":"This user is offline and no longer available for chat.","APP_VERSION":"8_0","SECTION":"userofflinetext"}],"addmessagestext":[{"CONTAINSVAR":1,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\chat\\chat-box.cfm","TEXT":"Add your messages to {{talkingtousername}} below","APP_VERSION":"8_0","SECTION":"addmessagestext"}],"blockcontacttext":[{"CONTAINSVAR":0,"LANGUAGECODE":"EN","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\chat\\chat-box.cfm","TEXT":"Block","APP_VERSION":"8_0","SECTION":"blockcontacttext"}],"start":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\chat\\chat-box.cfm","TEXT":"Start a Conversation...","APP_VERSION":"8_0","SECTION":"start"}],"characterlimittext":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\chat\\chat-box.cfm","TEXT":"You Have Reached the Character Limit. Shorten the Message to Send It.","APP_VERSION":"8_0","SECTION":"characterlimittext"}],"charactercounttext":[{"CONTAINSVAR":1,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\chat\\chat-box.cfm","TEXT":"Maximum 1000 characters ({{charactersleft}} remaining)","APP_VERSION":"8_0","SECTION":"charactercounttext"}],"loadmoremessagestext":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\chat\\chat-box.cfm","TEXT":"Load More Messages","APP_VERSION":"8_0","SECTION":"loadmoremessagestext"}],"reply":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\chat\\chat-box.cfm","TEXT":"Reply...","APP_VERSION":"8_0","SECTION":"reply"}]},"includes\\vue\\generic\\modal-display.cfm":{"closeText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\modal-display.cfm","TEXT":"Close","APP_VERSION":"8_0","SECTION":"closeText"}]},"includes\\vue\\generic\\toggle-favorite.cfm":{"processingText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Please check back, we are still processing your request.","APP_VERSION":"8_0","SECTION":"processingText"}],"savingText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Saving...","APP_VERSION":"8_0","SECTION":"savingText"}],"waitlistModalText2":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Please confirm you would like to be removed from the waitlist.","APP_VERSION":"8_0","SECTION":"waitlistModalText2"}],"waitlistModalText1":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Removing this session will cause you to lose your position in the waitlist queue.","APP_VERSION":"8_0","SECTION":"waitlistModalText1"}],"addToMyShowPlannerText-session":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Add to My Show Planner","APP_VERSION":"8_0","SECTION":"addToMyShowPlannerText-session"}],"noAccessText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Not Available","APP_VERSION":"8_0","SECTION":"noAccessText"}],"processingModalTitle":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Processing request","APP_VERSION":"8_0","SECTION":"processingModalTitle"}],"reserveModalText1":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"By hitting confirm you are losing your reserved seat in this session. If you choose to add it back, there may not be any seats available. We cannot guarantee you will get your seat back.","APP_VERSION":"8_0","SECTION":"reserveModalText1"}],"removeFromPlannerText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Remove From Planner","APP_VERSION":"8_0","SECTION":"removeFromPlannerText"}],"reservedRemoveText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"This session has been removed from your schedule.","APP_VERSION":"8_0","SECTION":"reservedRemoveText"}],"reserveModalText2":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Please confirm you want to remove this session.","APP_VERSION":"8_0","SECTION":"reserveModalText2"}],"processingModalText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Please Wait...","APP_VERSION":"8_0","SECTION":"processingModalText"}],"waitlistRemoveText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Remove from Waitlist","APP_VERSION":"8_0","SECTION":"waitlistRemoveText"}],"confirmModalTitle":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Confirm Request","APP_VERSION":"8_0","SECTION":"confirmModalTitle"}],"noAccessHintText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Your registration does not grant you access to this session.","APP_VERSION":"8_0","SECTION":"noAccessHintText"}],"loginText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Log In Required","APP_VERSION":"8_0","SECTION":"loginText"}],"confirmTitle":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Confirm Change","APP_VERSION":"8_0","SECTION":"confirmTitle"}],"filledText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Session Filled","APP_VERSION":"8_0","SECTION":"filledText"}],"reserveAddText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Add to Schedule","APP_VERSION":"8_0","SECTION":"reserveAddText"}],"confirmText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Confirm","APP_VERSION":"8_0","SECTION":"confirmText"}],"addToMyShowPlannerText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Add To My Show Planner","APP_VERSION":"8_0","SECTION":"addToMyShowPlannerText"}],"reserveRemoveText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Remove from Schedule","APP_VERSION":"8_0","SECTION":"reserveRemoveText"}],"cancelText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Cancel","APP_VERSION":"8_0","SECTION":"cancelText"}],"savedToMyShowPlannerText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Saved to My Show Planner","APP_VERSION":"8_0","SECTION":"savedToMyShowPlannerText"}],"waitlistAddText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Join Waitlist","APP_VERSION":"8_0","SECTION":"waitlistAddText"}],"filledHintText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"This session does not have any seats available, and the waitlist is currently full.","APP_VERSION":"8_0","SECTION":"filledHintText"}],"loginHintText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Please log in to your planner","APP_VERSION":"8_0","SECTION":"loginHintText"}],"appointmentRemoveFromPlannerText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Cancel Appointment","APP_VERSION":"8_0","SECTION":"appointmentRemoveFromPlannerText"}],"cancelTitle":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Cancel Change","APP_VERSION":"8_0","SECTION":"cancelTitle"}],"conflictModalText2":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"This session time overlaps with another session on your schedule. In order to add this session, the following session(s) will be removed from your schedule:","APP_VERSION":"8_0","SECTION":"conflictModalText2"}],"conflictModalText3":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Please confirm you would like to proceed with this update.","APP_VERSION":"8_0","SECTION":"conflictModalText3"}],"updatingText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Updating","APP_VERSION":"8_0","SECTION":"updatingText"}],"waitlistRemovedText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"You have been removed from the waitlist.","APP_VERSION":"8_0","SECTION":"waitlistRemovedText"}],"conflictModalText1":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"ALERT: Schedule Conflict","APP_VERSION":"8_0","SECTION":"conflictModalText1"}],"reservedText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Your seat has successfully been reserved.","APP_VERSION":"8_0","SECTION":"reservedText"}],"waitlistText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"You have been added to the waitlist for this session and will automatically be moved to reserved should a seat become available.","APP_VERSION":"8_0","SECTION":"waitlistText"}]},"includes\\vue\\generic\\loading-display.cfm":{"loadingText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\loading-display.cfm","TEXT":"Loading...","APP_VERSION":"8_0","SECTION":"loadingText"}]},"includes\\vue\\generic\\recommendations-modal.cfm":{"closeButtonText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\recommendations-modal.cfm","TEXT":"Close","APP_VERSION":"8_0","SECTION":"closeButtonText"}],"recommenendedResultsText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\recommendations-modal.cfm","TEXT":"Recommended Results","APP_VERSION":"8_0","SECTION":"recommenendedResultsText"}],"dontHaveRecsText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\recommendations-modal.cfm","TEXT":"You don't have any recommendations yet. As you browse through the directory recommendations will be made based on your interests.","APP_VERSION":"8_0","SECTION":"dontHaveRecsText"}],"sessionButtonText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\recommendations-modal.cfm","TEXT":"Sessions","APP_VERSION":"8_0","SECTION":"sessionButtonText"}],"exhibitorButtonText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\recommendations-modal.cfm","TEXT":"Exhibitors","APP_VERSION":"8_0","SECTION":"exhibitorButtonText"}],"loadingText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\recommendations-modal.cfm","TEXT":"Loading...","APP_VERSION":"8_0","SECTION":"loadingText"}],"topSixRecText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\recommendations-modal.cfm","TEXT":"Below are up to the first 6 recommendations for you. To see your entire list and easily add to your planner or dismiss","APP_VERSION":"8_0","SECTION":"topSixRecText"}],"errorLoadingRecommendations":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\recommendations-modal.cfm","TEXT":"Error loading recommendations","APP_VERSION":"8_0","SECTION":"errorLoadingRecommendations"}],"dismssText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\recommendations-modal.cfm","TEXT":"Dismiss","APP_VERSION":"8_0","SECTION":"dismssText"}],"loginOrCreatePlannerText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\recommendations-modal.cfm","TEXT":"Log in or Create a Planner","APP_VERSION":"8_0","SECTION":"loginOrCreatePlannerText"}]},"includes\\vue\\myshow\\myshow-add-onsitephotos-form.cfm":{"cancelButton":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\myshow\\myshow-add-onsitephotos-form.cfm","TEXT":"Cancel","APP_VERSION":"8_0","SECTION":"cancelButton"}],"notesHeader":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\myshow\\myshow-add-onsitephotos-form.cfm","TEXT":"Notes","APP_VERSION":"8_0","SECTION":"notesHeader"}],"uploadPhotoHeader":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\myshow\\myshow-add-onsitephotos-form.cfm","TEXT":"Upload a Photo","APP_VERSION":"8_0","SECTION":"uploadPhotoHeader"}],"addNotesHeader":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\myshow\\myshow-add-onsitephotos-form.cfm","TEXT":"Add Notes","APP_VERSION":"8_0","SECTION":"addNotesHeader"}],"selectExhibitorFirstOption":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\myshow\\myshow-add-onsitephotos-form.cfm","TEXT":"Select an Exhibitor","APP_VERSION":"8_0","SECTION":"selectExhibitorFirstOption"}],"saveMyChangesHeader":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\myshow\\myshow-add-onsitephotos-form.cfm","TEXT":"Save My Changes","APP_VERSION":"8_0","SECTION":"saveMyChangesHeader"}],"submitButton":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\myshow\\myshow-add-onsitephotos-form.cfm","TEXT":"Submit","APP_VERSION":"8_0","SECTION":"submitButton"}],"uploadMyPhotoHeader":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\myshow\\myshow-add-onsitephotos-form.cfm","TEXT":"Upload My Photo","APP_VERSION":"8_0","SECTION":"uploadMyPhotoHeader"}],"selectExhibitorHeader":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\myshow\\myshow-add-onsitephotos-form.cfm","TEXT":"Choose an Exhibitor to Tag","APP_VERSION":"8_0","SECTION":"selectExhibitorHeader"}]},"includes\\vue\\myshow\\myshow-add-appointments-form_v2.cfm":{"booth_label":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\myshow\\myshow-add-appointments-form_v2.cfm","TEXT":"Booth","APP_VERSION":"8_0","SECTION":"booth_label"}],"dateHeader":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\myshow\\myshow-add-appointments-form_v2.cfm","TEXT":"Date","APP_VERSION":"8_0","SECTION":"dateHeader"}],"noteInfoText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\myshow\\myshow-add-appointments-form_v2.cfm","TEXT":"Notes you add will be shared with this exhibitor","APP_VERSION":"8_0","SECTION":"noteInfoText"}],"maxcharacters":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\myshow\\myshow-add-appointments-form_v2.cfm","TEXT":"Max characters","APP_VERSION":"8_0","SECTION":"maxcharacters"}],"noteHeader":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\myshow\\myshow-add-appointments-form_v2.cfm","TEXT":"Add a Note","APP_VERSION":"8_0","SECTION":"noteHeader"}],"submitButton":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\myshow\\myshow-add-appointments-form_v2.cfm","TEXT":"Submit","APP_VERSION":"8_0","SECTION":"submitButton"}],"exhibitorHeader":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\myshow\\myshow-add-appointments-form_v2.cfm","TEXT":"Exhibitor","APP_VERSION":"8_0","SECTION":"exhibitorHeader"}],"timeHeaderText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\myshow\\myshow-add-appointments-form_v2.cfm","TEXT":"Choose a Meeting Time","APP_VERSION":"8_0","SECTION":"timeHeaderText"}],"virtualLocationText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\myshow\\myshow-add-appointments-form_v2.cfm","TEXT":"Virtual","APP_VERSION":"8_0","SECTION":"virtualLocationText"}],"timeZoneInfo":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\myshow\\myshow-add-appointments-form_v2.cfm","TEXT":"Appointment times are in {{timezonelabel}}","APP_VERSION":"8_0","SECTION":"timeZoneInfo"}],"textPlaceholder":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\myshow\\myshow-add-appointments-form_v2.cfm","TEXT":"What would you like to discuss with {{exhname}}?","APP_VERSION":"8_0","SECTION":"textPlaceholder"}],"meetingDetailsHeader":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\myshow\\myshow-add-appointments-form_v2.cfm","TEXT":"Meeting Details","APP_VERSION":"8_0","SECTION":"meetingDetailsHeader"}],"cancelButton":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\myshow\\myshow-add-appointments-form_v2.cfm","TEXT":"Cancel","APP_VERSION":"8_0","SECTION":"cancelButton"}],"requiredText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\myshow\\myshow-add-appointments-form_v2.cfm","TEXT":"Indicates required fields.","APP_VERSION":"8_0","SECTION":"requiredText"}],"timeHeader":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\myshow\\myshow-add-appointments-form_v2.cfm","TEXT":"Time","APP_VERSION":"8_0","SECTION":"timeHeader"}],"dateHeaderText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\myshow\\myshow-add-appointments-form_v2.cfm","TEXT":"Available Dates","APP_VERSION":"8_0","SECTION":"dateHeaderText"}],"locationHeader":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\myshow\\myshow-add-appointments-form_v2.cfm","TEXT":"Location","APP_VERSION":"8_0","SECTION":"locationHeader"}]},"includes\\vue\\exhibitor\\exh-products-display.cfm":{"dateaddedtext":[{"CONTAINSVAR":1,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\exhibitor\\exh-products-display.cfm","TEXT":"Added - {{formatDateForDisplay(dateadded)}}","APP_VERSION":"8_0","SECTION":"dateaddedtext"}],"learnmoretext":[{"CONTAINSVAR":1,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\exhibitor\\exh-products-display.cfm","TEXT":"Learn More About {{exhibitorname}}","APP_VERSION":"8_0","SECTION":"learnmoretext"}],"videotagtext":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\exhibitor\\exh-products-display.cfm","TEXT":"Video","APP_VERSION":"8_0","SECTION":"videotagtext"}],"readlesstext":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\exhibitor\\exh-products-display.cfm","TEXT":"Read Less","APP_VERSION":"8_0","SECTION":"readlesstext"}],"readmoretext":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\exhibitor\\exh-products-display.cfm","TEXT":"Read More","APP_VERSION":"8_0","SECTION":"readmoretext"}]},"includes\\vue\\generic\\gallery-display.cfm":{"readLessText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\gallery-display.cfm","TEXT":"Read Less","APP_VERSION":"8_0","SECTION":"readLessText"}],"readMoreText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\gallery-display.cfm","TEXT":"Read More","APP_VERSION":"8_0","SECTION":"readMoreText"}]},"includes\\vue\\exhibitor\\exh-onlinecontacts-display.cfm":{"loginToContact":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\exhibitor\\exh-onlinecontacts-display.cfm","TEXT":"Create or Log in to <a>My Show Planner</a> to Contact This Person","APP_VERSION":"8_0","SECTION":"loginToContact"}]},"includes\\vue\\generic\\session-result-card.cfm":{"onDemandLabel":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\session-result-card.cfm","TEXT":"On Demand","APP_VERSION":"8_0","SECTION":"onDemandLabel"}],"moreText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\session-result-card.cfm","TEXT":"more","APP_VERSION":"8_0","SECTION":"moreText"}],"regRequiredText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\session-result-card.cfm","TEXT":"Registration Required*","APP_VERSION":"8_0","SECTION":"regRequiredText"}]},"includes\\vue\\myshow\\myshow-email-online-contact-form.cfm":{"emailText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\myshow\\myshow-email-online-contact-form.cfm","TEXT":"My Email Address","APP_VERSION":"8_0","SECTION":"emailText"}],"errorMessage":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\myshow\\myshow-email-online-contact-form.cfm","TEXT":"Message is a required field to send an email.","APP_VERSION":"8_0","SECTION":"errorMessage"}],"messageText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\myshow\\myshow-email-online-contact-form.cfm","TEXT":"Message","APP_VERSION":"8_0","SECTION":"messageText"}],"sendEmailText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\myshow\\myshow-email-online-contact-form.cfm","TEXT":"Send Email","APP_VERSION":"8_0","SECTION":"sendEmailText"}],"phoneText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\myshow\\myshow-email-online-contact-form.cfm","TEXT":"Phone","APP_VERSION":"8_0","SECTION":"phoneText"}]},"includes\\vue\\generic\\recommendations-widget.cfm":{"okayGotItText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\recommendations-widget.cfm","TEXT":"Okay, Got it!","APP_VERSION":"8_0","SECTION":"okayGotItText"}]},"includes\\vue\\generic\\exhibitor-result-card.cfm":{"seeText":[{"CONTAINSVAR":0,"LANGUAGECODE":"EN","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\exhibitor-result-card.cfm","TEXT":"Also Known As","APP_VERSION":"8_0","SECTION":"seeText"}]}}; ; </script> </head> <body class="l-wrapper mysIDS is-floorplan theme_2" > <header class="mys-directory-header l-header dn" id="js-navigation"> <div class="center mw9"> <a href="http://www.satshow.com/"> <img class="center tc o-show_header" alt="SATELLITE 2025 logo"> </a> </div> </header> <script> var fixElementMixin = { data: function(){ return { isFixed: false, elementToFixHeight: null, fixOnScrollObserver: null } }, methods: { getElementToFix: function(element, extraTopOffset){ var elementToFixOffsetTop = this.getElementOffset(element).topRelative; if (extraTopOffset) { elementToFixOffsetTop = elementToFixOffsetTop + extraTopOffset; } return elementToFixOffsetTop; }, fixElement: function(elementOffset){ if (window.pageYOffset > elementOffset) { this.isFixed = true; } else { this.isFixed = false; } }, fixElementOnScrollTrackObserver: function(primaryReferenceElement, backupReferenceElement){ var vObj = this, primaryElement = document.querySelector(primaryReferenceElement) || document.querySelector('.l-nav'), backupElement = document.querySelector(backupReferenceElement); vObj.fixOnScrollObserver = new IntersectionObserver(function (entries, observer) { if (entries[0].isIntersecting) { vObj.isFixed = false; } else { vObj.isFixed = true; } }); vObj.fixOnScrollObserver.observe(primaryElement || backupElement); }, destroyScrollObserver: function(){ if (this.fixOnScrollObserver){ this.fixOnScrollObserver.disconnect(); this.fixOnScrollObserver = null } } } }; </script> <script> var scrollHighlightMixin = { mixins: [fixElementMixin], data: function(){ return { scrolledToSection: '' } }, methods: { getElementsToScrollTrack: function(highlightElement, trackingElements, extraOffsetValue){ var extraOffsetValueFromParameter; if (typeof extraOffsetValue !== 'undefined' && typeof extraOffsetValue == 'number') { extraOffsetValueFromParameter = extraOffsetValue; } else { extraOffsetValueFromParameter = 0; } var elementOne = document.querySelector(highlightElement), elementTwo = document.querySelectorAll(trackingElements), elementsToScrollTrack = { highlightElement: elementOne, trackingElements: elementTwo, extraOffsetValue: extraOffsetValueFromParameter }; this.highlightSectionsOnScroll(elementsToScrollTrack); }, highlightSectionsOnScroll: function(trackElements){ var windowOffset = window.pageYOffset, currentElementID, divPos, divHeight, divID, highlightedAnchors; for (var i = 0; i < trackElements.trackingElements.length; i++) { currentElementID = trackElements.trackingElements[i], divPos = currentElementID.offsetTop + trackElements.extraOffsetValue, divHeight = currentElementID.clientHeight, divID = trackElements.trackingElements[i].id; if (windowOffset >= divPos && windowOffset < divPos + divHeight) { highlightedAnchors = document.querySelectorAll("a[href='" + divID + "']"); highlightedAnchors.forEach(function(element) { element.classList.add('is-selected'); }); this.scrolledToSection = divID; } else { highlightedAnchors = document.querySelectorAll("a[href='" + divID + "']"); highlightedAnchors.forEach(function(element) { element.classList.remove('is-selected'); }); this.scrolledToSection = ''; } } }, highlightSectionsOnScrollObserver: function(ElementsToHighlight, ElementsToTrack, highlightIoOverrides){ var scrollElementsToHighlight = document.querySelectorAll(ElementsToHighlight), scrollElementsToTrack = document.querySelectorAll(ElementsToTrack), highlightOnScrollConfigDefaults = { root: null, rootMargin: '0px 0px -97% 0px', threshold: 0 }, highlightOnScrollConfigUpdatedSettings = Object.assign({}, highlightOnScrollConfigDefaults, highlightIoOverrides); var highLightScrollObserver = new IntersectionObserver(function (entries, observer){ entries.forEach(function (entry){ if (entry.isIntersecting){ intersectionHandler(entry); } }); }, highlightOnScrollConfigUpdatedSettings); scrollElementsToTrack.forEach(function (element){ highLightScrollObserver.observe(element); }); function intersectionHandler(entry){ var id = entry.target.id, currentlyActive = document.querySelector(ElementsToHighlight + '.is-selected'), shouldBeActive = document.querySelector(ElementsToHighlight + '[href=' + id + ']'); if (currentlyActive) { currentlyActive.classList.remove('is-selected'); } if (shouldBeActive) { shouldBeActive.classList.add('is-selected'); } } } } }; </script> <script type="text/x-template" id="error-template"> <div v-if="showmessage && animationClass" v-bind:class="[alertclass, animationClass, 'o-Alert', 'animated']" v-bind:style="{ zIndex: zindex }" v-cloak> <div class="center mw9 flex justify-between items-center"> <div class="mb0 center" v-for="(e, index) in messages"> <span v-html="e"></span> </div> <a href="" class="bb-0 pa1 ml2" @click.prevent="closeDisplay()" title="Close this message"> <svg width="24" height="24" xmlns="http://www.w3.org/2000/svg" role="img" aria-hidden="true"><path fill="#000" fill-rule="nonzero" d="M23.954 21.03l-9.184-9.095 9.092-9.174L21.03-.046l-9.09 9.179L2.764.045l-2.81 2.81L9.14 11.96.045 21.144l2.81 2.81 9.112-9.192 9.18 9.1z"/></svg> </a> </div> </div></script> <script> var MessageDisplay = Vue.component('message-display', { template:"#error-template", props: { showmessage:{ type: Boolean, default: false }, messages: { type: Array, default: [] }, type:{ type:String, default: "info" // warning, info, error, or success }, timeout:{ type: Number, default: 20 } }, data: function(){ return { hidemessage: null, alertclass: "o-Alert_Info", headertext: "", zindex: 9999, dateseed: 0, timeoutid: null } }, created: function(){ this.dateseed = Vue.MYS.getShowDateTime().getTime(); }, watch:{ stuff: function(e){ var vObj = this; if (vObj.hidemessage == false){ vObj.hidemessage = true; } setTimeout(function(){ vObj.hidemessage = false; vObj.zindex = 10000 + Vue.MYS.getShowDateTime().getTime() - vObj.dateseed; if (vObj.timeoutid){ clearTimeout(vObj.timeoutid); } switch(vObj.type){ case "warning": vObj.alertclass = "o-Alert_Warning"; vObj.headertext = "Warning"; break; case "info": vObj.alertclass = "o-Alert_Info"; vObj.headertext = "Note"; break; case "error": vObj.alertclass = "o-Alert_Error"; vObj.headertext = "Error"; break; case "success": vObj.alertclass = "o-Alert_Success"; vObj.headertext = "Success"; break; default: vObj.alertclass = "o-Alert_Info"; vObj.headertext = ""; break; } if (e){ vObj.timeoutid = setTimeout(function(){ vObj.hidemessage = true; }, vObj.timeout * 1000); } }, 500); } }, computed: { stuff: function(){ return { showmessage: this.showmessage, messages: this.messages, type: this.type } }, animationClass: function(){ if (this.hidemessage == true){ return 'fadeOutUp'; } else if (this.hidemessage == false){ return 'fadeInDown'; } else { return ''; } } }, methods: { closeDisplay:function(){ this.hidemessage = true; } } }); // this is a helper mixin to assist with display and ssuch var messagedisplayMixin = { data: function() { return { messagetype: "", messages: [], showmessage: false }; }, methods: { showMessage: function(type, msg){ this.messagetype = type; if (msg.constructor === Array){ this.messages = []; this.messages.push.apply(this.messages,msg); } else { this.messages = []; this.messages.push(msg); } this.showmessage = true; } } }; </script> <style> .slide-fade-enter-active { transition: all .3s ease; } .slide-fade-leave-active { /* transition: all .8s cubic-bezier(1.0, 0.5, 0.8, 1.0);*/ transition: all .3s ease; } .slide-fade-enter, .slide-fade-leave-to /* .slide-fade-leave-active below version 2.1.8 */ { transform: translateX(10px); opacity: 0; } </style> <script type="text/x-template" id="recommendations-widget-template"> <a class="icon-recommendation bb-0 dib" href="#" style="position:absolute; right:0; top:12px;" aria-label="View your recommendations" v-if="recommendationsactive" v-on:click.stop.prevent="handleClick();" v-bind="getBindings()"> <svg class="dib moon-gray" width="21" height="24" xmlns="http://www.w3.org/2000/svg" role="img" aria-hidden="true"><path d="M10.88 0C10 0 9.28.6 8.8 1.52c-3.88.92-5.48 4.4-5.48 8.56v3.8c0 1.72-1.68 3.8-2.52 3.8v1.28H21v-1.28c-.84 0-2.52-2.08-2.52-3.8v-3.8c0-4.16-1.6-7.64-5.48-8.56C12.48.6 11.76 0 10.88 0zm-3.8 20.2c0 2.08 1.68 3.8 3.8 3.8s3.8-1.68 3.8-3.8h-7.6z" fill-rule="nonzero"></path></svg> <transition enter-active-class="animated pulse" leave-active-class="animated pulse"> <div v-if="hasnewrecommendations" class="token-recommendation absolute bg-accent ba b--white dib"></div> </transition> </a></script> <script> var RecommendationsWidget = Vue.component('recommendations-widget', { template:"#recommendations-widget-template", props: { rectype:{ default: "exhibitor", type: String }, id:{ default: "", type: String }, firsttimemessage:{ default: "", type: String }, secondtimemessage: { default: "", type: String }, useraction: { default: "", type: String }, actionvalue: { default: "", type: String }, maxuserinterestactions: { default: 100, type: Number }, isloggedinmyshow: { default: false, type: Boolean } }, mixins: [], data: function(){ return { compincludepath: "includes/vue/generic/recommendations-widget.cfm", showModal: false, hasnewrecommendations: false, userinterests: [], intro: null, // was {} modalstatus: "", getBindingsReturnObj: {} } }, computed: { content: function(){ return { okayGotItText: this.displaycontent(this.compincludepath, 'okayGotItText') } } }, mounted: function(){ var vObj = this; if (vObj.hasLocalStorage() && (vObj.firsttimemessage || vObj.secondtimemessage)){ var recommendationsFirstMessageShown = localStorage.getItem('vts_recommendation_first_message_shown') == 'true', recommendationsSecondMessageShown = localStorage.getItem('vts_recommendation_second_message_shown') == 'true'; if (!recommendationsFirstMessageShown && !recommendationsSecondMessageShown){ this.modalstatus = "firsttime"; } else if (recommendationsFirstMessageShown && !recommendationsSecondMessageShown){ this.modalstatus = "secondtime"; } else { this.modalstatus = "none"; } // add to user's session vObj.intro = introJs(); // check if user is using a browser with session storage, if so log and get their recs if (vObj.hasLocalStorage()){ if (localStorage.getItem("userinterests")){ vObj.userinterests = JSON.parse(localStorage.getItem("userinterests")); } if (vObj.userinterests.length > 0){ setTimeout(function(){ vObj.hasnewrecommendations = true; }, 1500); } if (localStorage.getItem("hasnewrecommendations")){ // vObj.hasnewrecommendations = (localStorage.getItem("hasnewrecommendations") === 'true'); } if (vObj.actionvalue.length > 0 && vObj.useraction.length > 0){ // https://stackoverflow.com/questions/24812930/how-to-remove-element-from-array-in-foreach-loop /*vObj.userinterests.slice().reverse().forEach(function(item, index, obj){ if (item.useraction === useraction && item.actionvalue === actionvalue){ vObj.userinterests.splice(obj.length - 1 - index, 1); } });*/ var recObj = { useraction: vObj.useraction, actionvalue: vObj.actionvalue, actiondate: new Date() }; vObj.userinterests.unshift(recObj); // vObj.hasnewrecommendations = true; // now keep top x recs in session vObj.userinterests.slice(0, vObj.maxuserinterestactions); localStorage.setItem("userinterests", JSON.stringify(vObj.userinterests)); localStorage.setItem("hasnewrecommendations", true); } } //run IntroJS tip vObj.$nextTick(function(){ var vObj = this; vObj.startRecommendationTip(); }); } }, beforeDestroy: function() { var vObj = this; if (vObj.intro) { vObj.intro.exit(); } }, methods: { getBindings: function(){ var vObj = this; if (vObj.modalstatus == "firsttime" && vObj.firsttimemessage){ vObj.getBindingsReturnObj["data-intro"] = vObj.firsttimemessage; vObj.getBindingsReturnObj["id"]= vObj.id; } else if (vObj.modalstatus == "secondtime" && vObj.secondtimemessage){ vObj.getBindingsReturnObj["data-intro"] = vObj.secondtimemessage; vObj.getBindingsReturnObj["id"]= vObj.id; } return vObj.getBindingsReturnObj; }, handleClick: function(){ if (typeof this.intro === 'function') { this.intro.exit(); } if (this.isloggedinmyshow){ window.location.href = this.path2approot + "/myshow/?s=recommendations"; } else { this.openModal(); } }, openModal: function(){ var vObj = this, requestArray = []; vObj.showModal = true; // vObj.hasnewrecommendations = false; this.$emit("open-modal"); return true; }, startRecommendationTip: function(){ var vObj = this, recommendationsFirstMessageShown = localStorage.getItem('vts_recommendation_first_message_shown') == 'true', recommendationsSecondMessageShown = localStorage.getItem('vts_recommendation_second_message_shown') == 'true'; if (recommendationsFirstMessageShown && recommendationsSecondMessageShown || vObj.userinterests.length < 1){ return; } else if (recommendationsFirstMessageShown && !recommendationsSecondMessageShown && vObj.userinterests.length < 6){ return; } vObj.intro.setOptions({ showBullets: false, exitOnOverlayClick: false, doneLabel: vObj.content.okayGotItText, tooltipClass: "is-introjs" }); vObj.intro.start(); if (vObj.getBindingsReturnObj["data-intro"] == vObj.firsttimemessage){ vObj.intro.oncomplete(function(){ localStorage.setItem('vts_recommendation_first_message_shown', 'true'); }); vObj.intro.onexit(function(){ localStorage.setItem('vts_recommendation_first_message_shown', 'true'); }); } else if (vObj.getBindingsReturnObj["data-intro"] == vObj.secondtimemessage) { vObj.intro.oncomplete(function(){ localStorage.setItem('vts_recommendation_second_message_shown', 'true'); }); vObj.intro.onexit(function(){ localStorage.setItem('vts_recommendation_second_message_shown', 'true'); }); } } } }); </script> <script> /* Set global variable to determine printing state to adjust necesessary styles, such as removing IntersectionObserver() so content is rendered when printing */ window.idsIsPrinting = false; window.addEventListener('beforeprint', function(){ window.idsIsPrinting = true; }); window.addEventListener('afterprint', function(){ window.idsIsPrinting = false; }); </script> <script> var VueMYS = {}; VueMYS.install = function(Vue, options){ Vue.MYS = {}; Vue.MYS.exhibitorTags = [{"color":"bg-color-brand-09","title":"Products"},{"color":"bg-color-accent-05","title":"Press Releases"},{"color":"bg-light-silver","title":"Business Cards"}]; Vue.MYS.trackcss = {}; Vue.MYS.isValidURL = function(str){ // https://stackoverflow.com/questions/5717093/check-if-a-javascript-string-is-a-url var pattern = new RegExp('^(https?:\\/\\/)?'+ // protocol '((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|'+ // domain name '((\\d{1,3}\\.){3}\\d{1,3}))'+ // OR ip (v4) address '(\\:\\d+)?(\\/[-a-z\\d#%_.~+]*)*'+ // port and path '(\\?[;&a-z\\d%_.~+=-]*)?'+ // query string '(\\#[-a-z\\d_]*)?$','i'); // fragment locator return !!pattern.test(str); }; Vue.MYS.productsVoting = []; Vue.MYS.settingsConfig = {"timesettings":{"timezonelabel":"Eastern Time (US & Canada)","showtimezone":false},"spotlightsettings":{"spotlightcount":3},"exhibitorsettings":{"sendemail":[]},"numconcurrentmeetings":5,"schedulepage":{"topsection":"disabled","rotatetop":[],"searchtypes":["Sessions","Guest Appearances"],"days":7,"topdisplay":"date","rotatetime":7,"happeningtoday":"daily","hours":2,"livestreamoption":"youtube","sessions":{"display":"freetext","secondaryfilter":"disabled","texten":"Sessions"},"guestappearances":{"display":"freetext","secondaryfilter":"disabled","texten":"Exhibitor Scheduled Event"},"homepage":false,"liveevents":{"display":"freetext","secondaryfilter":"disabled","texten":"Exhibitor Interactive Demo"},"restricttop":[]},"alertsettings":{"liveeventalerts":"none","sessionalerts":"none"},"sessionsettings":{},"searchsettings":{"hidechildsessions":false,"hideoriginaltimes":false,"defaultsearchview":"grid","hidesessionlocations":false,"hidesessiontimes":false,"myshowincludesessionexhibitors":false,"hideallresults":true}}; Vue.MYS.useExhSubVersion3 = false; Vue.MYS.useExhSubVersion2 = true; Vue.MYS.exhSubVersion = 02; Vue.MYS.sessionSubVersion = 02; Vue.MYS.validRooms = []; Vue.MYS.validHalls = ["A"]; Vue.MYS.altregid = ""; Vue.MYS.regtype = ""; Vue.MYS.genericKey = "production/satellite2025"; Vue.MYS.seatrestriction = false; Vue.MYS.allowedschedules = []; Vue.MYS.lockdown = false; Vue.MYS.getTimezoneDisplay = function(){ if ("timesettings" in Vue.MYS.settingsConfig && "showtimezone" in Vue.MYS.settingsConfig.timesettings && Vue.MYS.settingsConfig.timesettings.showtimezone) { if ("timezonelabelen" in Vue.MYS.settingsConfig.timesettings) { return Vue.MYS.settingsConfig.timesettings["timezonelabelen"]; } else { return ""; } } else { return ""; } }; Vue.MYS.getActiveVotingRound = function(showtime){ return false; }; Vue.MYS.getShowDateTime = function(){ var dt = new Date(); var returnDate = new Date(dt.getTime() + Vue.MYS.compareToShowDate(dt)); return returnDate; }; Vue.MYS.compareToShowDate = function(datetocompare) { // Get the current date for the user, JS gets the date in the user's time zone var currentdate = new Date(); // Get the offset for the current user based on where they are and add it back in. This will calculate their time in UTC time // currentdate.getTimezoneOffset() will return how far off the user is from UTC time // Add in the show's offset and that will calculate the user's time from UTC in the show's timezone // this.timezoneoffset will be the show's offset value var currentdateinshowtimezone = new Date(currentdate.getTime() + (-300 + currentdate.getTimezoneOffset()) * 60000); var isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream; var isSafari = !!navigator.userAgent.match(/Version\/[\d\.]+.*Safari/); var getVersion = navigator.userAgent.replace(/(.*)Version\//,"") var version = getVersion.substr(0, getVersion.indexOf(" ")); if((isSafari && parseFloat(version) < 14) || (isIOS && (window.navigator.userAgent.search('OS 13') > -1 || window.navigator.userAgent.search('OS X 10') > -1 || window.navigator.userAgent.search('OS 12') > -1 || window.navigator.userAgent.search('OS 11') > -1))) { var datetocompare = new Date(datetocompare.getTime() + (datetocompare.getTimezoneOffset() * 60000)); } return currentdateinshowtimezone.getTime() - datetocompare.getTime(); }; Vue.MYS.isAjaxSuccess = function(response){ if ("SUCCESS" in response && response.SUCCESS){ return true; } else { return false; } }; Vue.MYS.getAjaxErrors = function(response){ if ("ERRORS" in response && response.ERRORS.length > 0) { return response.ERRORS; } else { return response; } }; Vue.MYS.ajaxPost = function(url, formData, successCallback, errorCallback, keepalive){ keepalive = typeof keepalive !== 'undefined' ? keepalive : false; fetch(url, { method: "POST", body: formData, headers: { "X-Requested-With": "XMLHttpRequest" }, credentials:'include', redirect: "manual", keepalive: keepalive }) .then(function(fetchResponse) { fetchResponse.json() .then(function(response){ if (Vue.MYS.isAjaxSuccess(response)){ successCallback(response); } else { errorCallback(response); } }) .catch(function(error){ errorCallback(error); }); }) .catch(function (error) { console.log(error); errorCallback(error); }); }; Vue.MYS.formatSpeakerName = function(result, keynote) { var speakerName = Vue.MYS.settingsConfig.searchsettings.speakernamedisplay; if(keynote) { var replacements = { PREFIX: result.prefix || '', SUFFIX: result.suffix || '', FIRSTNAME: result.firstname || '', LASTNAME: result.lastname || '', MIDDLENAME: result.middlename || '', }; } else { var replacements = { PREFIX: result.fields.speakerprefix_t || '', SUFFIX: result.fields.speakersuffix_t || '', FIRSTNAME: result.fields.speakerfname_t || '', LASTNAME: result.fields.speakerlname_t || '', MIDDLENAME: result.fields.speakermname_t || '', }; } for (var [key, value] of Object.entries(replacements)) { if((key == 'SUFFIX' || key == 'LASTNAME') && value.length == 0) { speakerName = speakerName.replaceAll(`[${key}],`, ''); if(key == 'SUFFIX') { speakerName = speakerName.replaceAll(`[LASTNAME],`, '[LASTNAME]'); } } speakerName = speakerName.replaceAll(`[${key}]`, value); } return speakerName.trim(); }; Vue.MYS.sendBeacon = function(url, data) { if (navigator.sendBeacon){ navigator.sendBeacon(url, data); } else { Vue.MYS.ajaxPost(url, data, function(){ /* do nothing */ }, function(){ /* do nothing */ }); } }; Vue.MYS.getServerlessURL = function(s3bucket, s3key, width, height, fit) { var returnurl = "https://d3fv3oe83qat1b.cloudfront.net/"; var sharpparams = {}; sharpparams["bucket"] = s3bucket; sharpparams["key"] = s3key; sharpparams["edits"] = { resize: { width: width, height: height, fit: fit || "contain", quality:"70" } }; returnurl += btoa(JSON.stringify(sharpparams)); return returnurl; }; Vue.MYS.environment = 'production'; }; Vue.use(VueMYS); </script> <script> // https://stackoverflow.com/questions/36170425/detect-click-outside-element Vue.directive('click-outside', { bind: function (el, binding, vnode) { el.clickOutsideEvent = function (event) { // here I check that click was outside the el and his childrens if (!(el == event.target || el.contains(event.target))) { // and if it did, call method provided in attribute value vnode.context[binding.expression](event); } }; document.body.addEventListener('click', el.clickOutsideEvent) }, unbind: function (el) { document.body.removeEventListener('click', el.clickOutsideEvent) }, }); // global mixin Vue.mixin({ data: function() { return { get hasmyshow(){ return true; }, get globalcompincludepath(){ return "includes/vue/mixin/global-mixin.cfm"; }, get hasvalidation() { return true; }, get validated() { return false; }, get showid() { return "SATELLITE2025"; }, get showidlowercase() { return ("SATELLITE2025").toLowerCase(); }, get thispageurl(){ var temppath = "/8_0/floorplan/index.cfm" ; if (temppath === this.path2approot + '/index.cfm'){ return this.path2approot } else { return temppath; } }, get path2approot(){ return "/8_0" }, get httphost(){ return "https://satellite2025.mapyourshow.com" }, get exhibitorrecommendationstatus(){ return "A" }, get sessionrecommendationstatus(){ return "I" }, get regemail(){ return "" }, get availableforchat() { return false }, get hasattendeechat() { return false }, get hasexhibitorchat() { return false }, get hassessiongroupchat() { return true }, get isexhibitor() { return false }, get showbooths(){ return true }, get maxshowbooths(){ return 3 }, get requireboothsfordisplay(){ return false }, get speakernamedisplay(){ return false }, get modules(){ return ["ExhChecklist","Exhibitors","Floorplan","groups","Sessions","Surveying"] }, get hasexhicons(){ return true }, get hasnetworking(){ return false }, get legendcontent(){ return {"COLUMNS":["ICONID","ICONFILE","DISPLAYID","TYPE","COLUMNNAME","DATESTART","DAYSPAN","DISPLAYTEXT","USEFORNEWEXHIBITORFILTER","USEFORGREENFILTER"],"DATA":[[1,"/mys_shared/SATELLITE2025/showfiles/exhicons/New_Exhibitor.png",708,"bit","newexhibitor",null,null,"First Time Exhibitor",true,false],[2,"/mys_shared/SATELLITE2025/showfiles/exhicons/SAT22-Sponsor-Logo.png",127138,"bit","issponsor",null,null,"Sponsor",false,false]]} }, get floorplanactive(){ return true }, get advancedsearchmaxparameters(){ return 10 }, get hassessionconferences(){ return false }, get showsessionconferences(){ return false }, get usefriendlyexhibitorurl(){ return false }, get virtualtradeshow() { return false; }, get timezoneoffset() { return -300; }, get httpreferer() { return ""; } } }, computed:{ exhibitorrecommendationsactive: function(){ var hasExhModule = false; for (var i = 0 ; i < this.modules.length; i++){ if (this.modules[i] == "Exhibitors"){ hasExhModule = true; break; } } return (this.exhibitorrecommendationstatus != "I" && this.exhibitorrecommendationstatus != "X" && hasExhModule) ? true : false; }, sessionrecommendationsactive: function(){ var hasSessModule = false; for (var i = 0 ; i < this.modules.length; i++){ if ((this.modules[i] == "Sessions") || (this.modules[i] == "Conferences")){ hasSessModule = true; } } return (this.sessionrecommendationstatus != "I" && this.sessionrecommendationstatus != "X" && hasSessModule) ? true : false; }, recommendationsactive: function(){ return this.exhibitorrecommendationsactive || this.sessionrecommendationsactive; }, globalcontent: function(){ return this.getContentObject(this.globalcompincludepath); } }, methods: { // this is a function to check if one of the MYS formatted ajax responses is a valid one isAjaxSuccess: function(response){ if ("SUCCESS" in response && response.SUCCESS){ return true; } else { return false; } }, getAjaxErrors: function(response){ if ("ERRORS" in response && response.ERRORS.length > 0) { return response.ERRORS; } else { return response; } }, ajaxGet: function(url, successCallback, errorCallback){ var vObj = this; const controller = new AbortController(); setTimeout(() => controller.abort(), 60000); fetch(url, { headers: {"X-Requested-With": "XMLHttpRequest", "cache-control":"no-cache", "pragma":"no-cache"}, credentials:'include', cache: "no-store", signal: controller.signal }) .then(function(fetchResponse) { fetchResponse.json() .then(function(response){ if (vObj.isAjaxSuccess(response)){ successCallback(response); } else { errorCallback(response); } }) .catch(function(error){ console.log(error); errorCallback(error); }); }) .catch(function (error) { console.log(error); errorCallback(error); }); }, ajaxJsonPost: function(url, jsonString, successCallback, errorCallback){ var vObj = this; const controller = new AbortController(); setTimeout(() => controller.abort(), 60000); fetch(url, { method: "POST", body: jsonString, headers: { "Content-Type": "application/json; charset=utf-8", "X-Requested-With": "XMLHttpRequest" }, credentials:'include', signal: controller.signal }) .then(function(fetchResponse) { fetchResponse.json().then(function(response){ if (vObj.isAjaxSuccess(response)){ successCallback(response); } else { errorCallback(response); } }); }) .catch(function (error) { console.log(error); errorCallback(error); }); }, ajaxPost: function(url, formData, successCallback, errorCallback){ var vObj = this; const controller = new AbortController(); setTimeout(() => controller.abort(), 60000); fetch(url, { method: "POST", body: formData, headers: { "X-Requested-With": "XMLHttpRequest" }, credentials:'include', signal: controller.signal }) .then(function(fetchResponse) { fetchResponse.json().then(function(response){ if (vObj.isAjaxSuccess(response)){ successCallback(response); } else { errorCallback(response); } }); }) .catch(function (error) { console.log(error); errorCallback(error); }); }, getCurrentURL: function(){ return window.location.href.replace(this.httphost, ""); }, displayLogoURL: function(logo){ if (typeof logo !== 'undefined') { return '/mys_shared/' + this.showid + '/logos/' + logo; } else { return ""; } }, displayBannerURL: function(mediafile){ if (typeof mediafile !== 'undefined') { return '/mys_shared/' + this.showid + '/banners/' + mediafile; } else { return ""; } }, goToURL: function(url, newtab){ if(newtab && url) { window.open(url, '_blank'); } else if (url){ window.location = url; } }, displaySearchURL: function(searchtype, search, show){ if (searchtype && search){ return this.httphost + this.path2approot + "/#/searchtype/" + encodeURI(searchtype) + "/search/" + encodeURI(search) + "/show/" + encodeURI(show); } else { return ""; } }, createSummary: function(htmldescription, maxLength){ var text = htmldescription; if (!text || typeof text !== 'string'){ text = ""; } else { // https://stackoverflow.com/questions/45816265/remove-style-tags-globally-using-regex-in-javascript text = text.replace( /((<style>)|(<style type=.+))((\s+)|(\S+)|(\r+)|(\n+))(.+)((\s+)|(\S+)|(\r+)|(\n+))(<\/style>)/g,''); var doc = new DOMParser().parseFromString(text, 'text/html'); text = doc.body.textContent || ""; } if (text && text.length > maxLength){ text = text.substring(0, maxLength) + "..."; } return text; }, scrollToTop: function(){ if (typeof VueScrollTo !== 'undefined' && "scrollTo" in VueScrollTo){ VueScrollTo.scrollTo('#jq-keywordSearchForm'); } }, getScrollPosition: function(){ return window.scrollY || window.scrollTop || document.getElementsByTagName("html")[0].scrollTop; }, saveScrollPosition: function(){ var scrollPos = this.getScrollPosition(); var scrollURL = this.getCurrentURL(); if (this.hasSessionStorage()){ sessionStorage.setItem("scrollPosition", scrollPos); sessionStorage.setItem("scrollURL", scrollURL); } }, storageAvailable: function(type) { try { var storage = window[type], x = '__storage_test__'; storage.setItem(x, x); storage.removeItem(x); return true; } catch(e) { return e instanceof DOMException && ( // everything except Firefox e.code === 22 || // Firefox e.code === 1014 || // test name field too, because code might not be present // everything except Firefox e.name === 'QuotaExceededError' || // Firefox e.name === 'NS_ERROR_DOM_QUOTA_REACHED') && // acknowledge QuotaExceededError only if there's something already stored storage.length !== 0; } }, hasLocalStorage: function(){ var hasLocalStorage = this.storageAvailable('localStorage'); return hasLocalStorage; }, hasSessionStorage: function(){ var hasSessionStorage = this.storageAvailable('sessionStorage'); return hasSessionStorage; }, objectToURLValues: function(obj){ var queryString = Object.keys(obj).map(function(key){ return key + '=' + obj[key] }).join('&'); return queryString; }, // Pass 'log' as second argument to log returned offsets{} (including element) getElementOffset: function(element, log){ var rect = element.getBoundingClientRect(), scrollTop = window.pageYOffset || document.documentElement.scrollTop, scrollLeft = window.pageXOffset || document.documentElement.scrollLeft; var offsets = { element: element, rect: rect, top: rect.top, right: rect.right, bottom: rect.top, left: rect.left, topRelative: rect.top + scrollTop, leftRelative: rect.left + scrollLeft, scrollTop: scrollTop, scrollLeft: scrollLeft, height: rect.height, width: rect.width }; if ((arguments[1] !== undefined) && (arguments[1].toLowerCase() === 'log')) { console.log(offsets); } return offsets; }, toDate: function(date){ var date2; if (date instanceof Date) { date2 = date; } else if (date){ var datePart = (date+"").split('T')[0]; var timePart = (date+"").split('T')[1].replace("Z", ""); if (this.detectIE()){ date2 = new Date(datePart + "T" + timePart); } else if (this.detectSafari()){ date2 = new Date(datePart + "T" + timePart); var myyear = datePart.substring(0, 4)+""; var mymonth = datePart.substring(5, 7)+""; var myday = datePart.substring(8, 10)+""; var newdate = new Date(mymonth + "/" + myday + "/" + myyear + " " + timePart); if (newdate && newdate != 'Invalid Date'){ date2 = newdate; } } else { date2 = new Date(datePart + " " + timePart); } } else { date2 = new Date(); } return date2; }, formatSessionMonth: function(date){ if (!(typeof date.getMonth === 'function')) { date = this.toDate(date); } // var monthNames = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]; var monthNames = [ this.globalcontent.januaryAbbrText , this.globalcontent.februaryAbbrText , this.globalcontent.marchAbbrText , this.globalcontent.aprilAbbrText , this.globalcontent.mayAbbrText , this.globalcontent.juneAbbrText , this.globalcontent.julyAbbrText , this.globalcontent.augustAbbrText , this.globalcontent.septemberAbbrText , this.globalcontent.octoberAbbrText , this.globalcontent.novemberAbbrText , this.globalcontent.decemberAbbrText ]; return monthNames[date.getMonth()]; }, bitToBool: function(bit){ if (bit == 1){ return true; } else { return false; } }, logStats: function(useraction, useractiontype, actionvalue, altvalue, optionvalue) { var optionvalue = optionvalue || ''; var referrer = ''; var AjaxURL = this.path2approot + '/includes/stats.cfm'; this.ajaxGet(AjaxURL + '?useraction=' + useraction + '&useractiontype=' + useractiontype + '&actionvalue=' + encodeURIComponent(actionvalue) + '&altvalue=' + altvalue + '&optionvalue=' + optionvalue + '&referrer=' + referrer, function(response){ // success }, function(response){ // error }); // end ajaxGet }, logAttendance: function(tablename, tablekey, subtablename, subtablekey, meetingkey, action, duringevent, requireplanner) { var AjaxURL = this.path2approot + '/includes/attendancelogs.cfm'; this.ajaxGet(AjaxURL + '?tablename=' + tablename + '&tablekey=' + tablekey + '&subtablename=' + subtablename + '&subtablekey=' + subtablekey + '&meetingkey=' + meetingkey + '&action=' + action + '&duringevent=' + duringevent + '&requireplanner=' + requireplanner, function(response){ // success }, function(response){ // error if(!response.success) { location.reload(true); } }); // end ajaxGet }, formatSessionDay: function(date){ if (!(typeof date.getMonth === 'function')) { date = this.toDate(date); } var weekday = []; weekday[0] = this.globalcontent.sundayText; weekday[1] = this.globalcontent.mondayText; weekday[2] = this.globalcontent.tuesdayText; weekday[3] = this.globalcontent.wednesdayText; weekday[4] = this.globalcontent.thursdayText; weekday[5] = this.globalcontent.fridayText; weekday[6] = this.globalcontent.saturdayText; return weekday[date.getDay()]; }, formatSessionDate: function(date){ if (!(typeof date.getMonth === 'function')) { date = this.toDate(date); } var month = new Array(); month[0] = this.globalcontent.januaryAbbrText; month[1] = this.globalcontent.februaryAbbrText; month[2] = this.globalcontent.marchAbbrText; month[3] = this.globalcontent.aprilAbbrText; month[4] = this.globalcontent.mayAbbrText; month[5] = this.globalcontent.juneAbbrText; month[6] = this.globalcontent.julyAbbrText; month[7] = this.globalcontent.augustAbbrText; month[8] = this.globalcontent.septemberAbbrText; month[9] = this.globalcontent.octoberAbbrText; month[10] = this.globalcontent.novemberAbbrText; month[11] = this.globalcontent.decemberAbbrText; if('us' == 'us') { return this.formatSessionDay(date) + ", " + month[date.getMonth()] + " " + date.getDate()+ " "; } else { return this.formatSessionDay(date) + ", " + date.getDate() + " " + month[date.getMonth()] + " "; } }, getMonthAsString: function(date){ if (!(typeof date.getMonth === 'function')) { date = this.toDate(date); } // var month = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]; var month = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]; var monthcontent = { "Jan": this.globalcontent.januaryAbbrText, "Feb": this.globalcontent.februaryAbbrText, "Mar": this.globalcontent.marchAbbrText, "Apr": this.globalcontent.aprilAbbrText, "May": this.globalcontent.mayAbbrText, "Jun": this.globalcontent.juneAbbrText, "Jul": this.globalcontent.julyAbbrText, "Aug": this.globalcontent.augustAbbrText, "Sep": this.globalcontent.septemberAbbrText, "Oct": this.globalcontent.octoberAbbrText, "Nov": this.globalcontent.novemberAbbrText, "Dec": this.globalcontent.decemberAbbrText }; var monthreturn = monthcontent[month[date.getMonth()]]; return monthreturn; }, formatSessionTime: function(date){ if (!(typeof date.getMonth === 'function')) { date = this.toDate(date); } var weekday = []; weekday[0] = this.globalcontent.sundayAbbrText; weekday[1] = this.globalcontent.mondayAbbrText; weekday[2] = this.globalcontent.tuesdayAbbrText; weekday[3] = this.globalcontent.wednesdayAbbrText; weekday[4] = this.globalcontent.thursdayAbbrText; weekday[5] = this.globalcontent.fridayAbbrText; weekday[6] = this.globalcontent.saturdayAbbrText; var Time = []; Time[0] = "12"; Time[1] = "1"; Time[2] = "2"; Time[3] = "3"; Time[4] = "4"; Time[5] = "5"; Time[6] = "6"; Time[7] = "7"; Time[8] = "8"; Time[9] = "9"; Time[10] = "10"; Time[11] = "11"; Time[12] = "12"; Time[13] = "1"; Time[14] = "2"; Time[15] = "3"; Time[16] = "4"; Time[17] = "5"; Time[18] = "6"; Time[19] = "7"; Time[20] = "8"; Time[21] = "9"; Time[22] = "10"; Time[23] = "11"; var leadingZero = '' if(date.getMinutes() < 10){ leadingZero = '0'; } if(date.getHours() < 12){ newStartTime = /*this.formatSessionDay(date) + ', ' +*/ Time[date.getHours()] + ':' + leadingZero + date.getMinutes() + ' AM'; }else{ newStartTime = /*this.formatSessionDay(date) + ', ' +*/ Time[date.getHours()] + ':' + leadingZero + date.getMinutes() + ' PM'; } return newStartTime; }, isJsonString: function (str) { try { JSON.parse(str); } catch (e) { return false; } return true; }, saveViewState: function(path, section, value){ if (this.hasSessionStorage()){ var requestString = sessionStorage.getItem("resultviewstate"); if (requestString && (this.isJsonString(requestString))){ var viewStateObj = JSON.parse(sessionStorage.getItem("resultviewstate")); } else { var viewStateObj = {}; } if (!(path in viewStateObj)) { viewStateObj[path] = {}; } if (!(section in viewStateObj[path])) { viewStateObj[path][section] = {}; } viewStateObj[path][section] = value; sessionStorage.setItem("resultviewstate", JSON.stringify(viewStateObj)); } }, getViewState: function(path, section){ var returnval = ""; if (this.hasSessionStorage()){ var requestString = sessionStorage.getItem("resultviewstate"); if (requestString && (this.isJsonString(requestString))){ var viewStateObj = JSON.parse(sessionStorage.getItem("resultviewstate")); if (path in viewStateObj && section in viewStateObj[path]) { returnval = viewStateObj[path][section]; } } } return returnval; }, getContentObject: function(page) { let sections = this.getContentSections(page); let contentObj = {}; for (let i = 0; i < sections.length; i++) { contentObj[sections[i]] = this.displaycontent(page, sections[i]); } return contentObj; }, getContentSections: function(page) { var returnval = []; var pagescrubbed = ""; if (page){ pagescrubbed = page.replace(/\//g, "\\"); // replace forward slashes with back slashes } if (searchcontent && page in searchcontent){ returnval = Object.keys(searchcontent[page]); } else if (searchcontent && pagescrubbed in searchcontent){ returnval = Object.keys(searchcontent[pagescrubbed]); } return returnval; }, displaycontent: function(page, section){ var pagescrubbed = ""; if (page){ pagescrubbed = page.replace(/\//g, "\\"); // replace forward slashes with back slashes } if (searchcontent && page in searchcontent && section in searchcontent[page]){ return searchcontent[page][section][0]["TEXT"]; } else if (searchcontent && pagescrubbed in searchcontent && section in searchcontent[pagescrubbed]){ return searchcontent[pagescrubbed][section][0]["TEXT"]; } else { return ""; } }, customURIEncode: function(text){ text = encodeURIComponent(text); // https://stackoverflow.com/questions/4540753/should-i-use-encodeuri-or-encodeuricomponent-for-encoding-urls text = text.replace(/\(/g, '%28').replace(/\)/g, '%29'); // parenthesis text = text.replace(/\~/g, '%7E'); // ~ character text = text.replace(/\!/g, '%21'); // ! character text = text.replace(/\*/g, '%2A'); // * character text = text.replace(/\'/g, '%27'); // ' character text = text.replace(/\+/g, '%2B'); // + character return text; }, // from https://codepen.io/gapcode/pen/vEJNZN detectIE: function() { var ua = window.navigator.userAgent; // Test values; Uncomment to check result … // IE 10 // ua = 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)'; // IE 11 // ua = 'Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko'; // Edge 12 (Spartan) // ua = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36 Edge/12.0'; // Edge 13 // ua = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Safari/537.36 Edge/13.10586'; var msie = ua.indexOf('MSIE '); if (msie > 0) { // IE 10 or older => return version number return parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10); } var trident = ua.indexOf('Trident/'); if (trident > 0) { // IE 11 => return version number var rv = ua.indexOf('rv:'); return parseInt(ua.substring(rv + 3, ua.indexOf('.', rv)), 10); } var edge = ua.indexOf('Edge/'); if (edge > 0) { // Edge (IE 12+) => return version number return parseInt(ua.substring(edge + 5, ua.indexOf('.', edge)), 10); } // other browser return false; }, detectSafari: function(){ var isSafari = !!navigator.userAgent.match(/Version\/[\d\.]+.*Safari/); var isChromeForiOS = !!navigator.userAgent.match(/CriOS\/[\d\.]+.*Safari/); var iOS = /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream; var returnval = false; if (iOS || isSafari || isChromeForiOS) { returnval = true; } return returnval; }, detectFirefox: function(){ var isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1; return isFirefox }, detectChrome: function(){ var isChromium = window.chrome; var winNav = window.navigator; var vendorName = winNav.vendor; var isOpera = typeof window.opr !== "undefined"; var isIEedge = winNav.userAgent.indexOf("Edge") > -1; var isIOSChrome = winNav.userAgent.match("CriOS"); if (isIOSChrome) { // is Google Chrome on IOS } else if( isChromium !== null && typeof isChromium !== "undefined" && vendorName === "Google Inc." && isOpera === false && isIEedge === false ) { // is Google Chrome return true; } else { // not Google Chrome return false; } }, detectMobileDevice: function(){ return navigator.userAgent.match(/Android|iPhone|iPad|iPod|BlackBerry|Opera Mini|IEMobile/i); }, getDataUriFromResponse: function(response, mimetype) { var uInt8Array = new Uint8Array(response); var i = uInt8Array.length; var binaryString = new Array(i); while (i--) { binaryString[i] = String.fromCharCode(uInt8Array[i]); } var data = binaryString.join(''); var base64 = window.btoa(data); var dataUrl = 'data:' + mimetype + ';charset=utf-16le;base64,' + base64; return dataUrl; }, getBlobUriFromResponse: function(response, mimetype) { var blob = new Blob([response], { type: mimetype }); var downloadUrl = URL.createObjectURL(blob); return downloadUrl; }, getExhibitorURL: function(exhid, exhname){ var returnstring = ""; if (exhname){ exhname = (exhname+'').replace(/[^A-z_0-9-]+/g, " ").replace(/\s/g, "-"); // replace no alphanumerics with a space, then replace all spaces with a dash if (exhname.lastIndexOf("-") == exhname.length-1){ exhname = exhname.substring(0, exhname.lastIndexOf("-")); } if (exhname.charAt(0) == "-"){ exhname = exhname.substring(1, exhname.length-1); } } if ((!this.usefriendlyexhibitorurl) || (!exhname && exhid)) { return this.path2approot + "/exhibitor/exhibitor-details.cfm?exhid=" + exhid; } else if (exhname && exhid) { return this.path2approot + "/exhibitor/" + exhid + "/" + exhname; } else { return ""; } }, sendEmailVerfication: function() { var vObj = this; vObj.ajaxGet(vObj.path2approot + '/myshow/myshow-actions.cfm?action=SendEmailVerficationMessage', function(response) { vObj.showMessage("success", "Email successfully sent. Please check your email and click the verification link provided."); }, function(error) { vObj.showMessage("error", "Error sending verification email"); }); } } }); </script> <style> [v-cloak] { display: none; } </style> <script> if (window.jQuery) { var V = $.Velocity; } else { var V = Velocity; } if (typeof $ !== 'undefined') { V = $.Velocity; } else { V = Velocity; } if (typeof Velocity !== 'undefined'){ V = Velocity; } // staggered transition mixins var staggeredTransitionsMixin = { data: function(){ return { timeoutIntervalIDs: [], alreadyVisibleCount: 0 } }, methods: { beforeEnterStaggered: function (el) { //el.style.opacity = 0 }, enterStaggered: function (el, done) { done(); /*var delayOffset = 25 , delay , intervalID , maxopacity = 1; if ( "dataset" in el && "searchsize" in el.dataset && "index" in el.dataset){ delay = (el.dataset.index % el.dataset.searchsize) * delayOffset; } else if ( "dataset" in el && "totalitemcount" in el.dataset && "index" in el.dataset){ delay = (el.dataset.index * 1/el.dataset.totalitemcount) * delayOffset; } else { if ("dataset" in el && "index" in el.dataset){ delay = el.dataset.index * delayOffset; } else { delay = 1 * delayOffset; } } // get opacity if ("dataset" in el && "maxopacity" in el.dataset){ maxopacity = el.dataset.maxopacity; } intervalID = setTimeout(function () { V( el, { opacity: maxopacity }, { complete: done } ) }, delay); this.timeoutIntervalIDs.push(intervalID);*/ }, leaveStaggered: function (el, done) { done(); /*var delay = el.dataset.index * 25 setTimeout(function () { V( el, { opacity: 0 }, { complete: done } ) }, delay);*/ }, enterCancelled: function(el){ /*for (var i = 0; i < this.timeoutIntervalIDs.length; i++){ clearInterval(this.timeoutIntervalIDs[i]); }*/ } } }; // end staggeredTransitionsMixin </script> <script type="text/x-template" id="modal-template"> <transition name="modal" v-if="showmodal"> <div class="modal-mask" @keyup.esc="onEscape" tabindex="0" ref="modalparent"> <div class="modal-wrapper" v-on:click.self="closeModal(true);"> <div class="modal-container relative" v-bind:class="[small ? 'modal-container_small' : '']"> <div class="modal-header flex justify-between items-center"> <h2 class="mt0">{{title}}</h2> <button v-if="allowclose" v-on:click.stop.prevent="closeModal(false);" class="button-close bb-0 btn-reset" aria-label="Close this Window"> <svg width="36" height="36" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img"> <g transform="translate(-1108 -386)" fill="none" fill-rule="evenodd"><rect class="icon-close__circle" x="1108" y="386" width="36" height="36" rx="18"/><path class="icon-close__x" d="M1126 402.822l8.822-8.822 1.178 1.178-8.822 8.822 8.822 8.822-1.178 1.178-8.822-8.822-8.822 8.822-1.178-1.178 8.822-8.822-8.822-8.822 1.178-1.178z"/></g></svg> </button> </div> <slot></slot> </div> </div> </div> </transition></script> <style> .modal-wrapper .button-close { position: absolute; top: 0.5rem; right: 0.5rem; } .modal-wrapper .icon-close__x { fill: #333; } .modal-wrapper .button-close:hover .icon-close__circle, .modal-wrapper .button-close:focus .icon-close__circle { fill: rgba(0,0,0,0.1); } </style> <script> var ModalDisplay = Vue.component('modal-display', { template:"#modal-template", props: { showmodal: { default: false, type: Boolean }, title: { default: "", type: String }, small: { default: false, type: Boolean }, closeonoutsideclick: { default: true, type: Boolean }, allowcloseonesc: { default: true, type: Boolean }, allowclose: { default: true, type: Boolean } }, data: function(){ return { compincludepath: "includes/vue/generic/modal-display.cfm" } }, watch: { showmodal: function(){ var vObj = this; if (vObj.showmodal == true){ Vue.nextTick(function(){ vObj.$refs.modalparent.focus(); }); } } }, computed:{ content: function(){ return { closeText: this.displaycontent(this.compincludepath, 'closeText') }; } }, methods: { closeDisplay:function(){ vObj.hideerror = true; }, openModal: function(){ this.$emit("open-modal"); }, closeModal: function(outsideclicked) { if(this.allowclose && !outsideclicked || (outsideclicked && this.closeOnOutsideClick)) { this.$emit("close-modal"); } }, onEscape: function(){ if (this.allowcloseonesc){ this.closeModal(); } } } }); </script> <script type="text/x-template" id="toggleFavoriteTemplate"> <span :title="tippyTitle" v-tippy> <message-display :messages="messages" :type="messagetype" :showmessage="showmessage" :timeout="5"> </message-display> <modal-display :title="content.confirmModalTitle" :showmodal="showconflict" v-on:close-modal="showconflict = false" > <p>{{content.conflictModalText1}}</p> <p>{{content.conflictModalText2}}</p> <template v-for="session in conflictingsessions"> <p>{{session.title}}</p> <p>{{formatSessionDate(session.isodate)}} {{session.starttime}} - {{session.endtime}}</p> </template> <p>{{content.conflictModalText3}}</p> <button :aria-label="content.cancelText" :title="content.cancelTitle" v-on:click="showconflict = false" class="btn btn-tertiary">{{content.cancelText}}</button> <button :aria-label="content.confirmText" :title="content.confirmTitle" v-on:click.stop.prevent="toggleAddToPlanner" class="btn btn-primary">{{content.confirmText}}</button> </modal-display> <modal-display :title="content.confirmModalTitle" :showmodal="showconfirm" v-on:close-modal="showconfirm = false" > <template v-if="currentStatus == 'Reserved' || attendancestatus == 'Reserved'"> <p>{{content.reserveModalText1}}</p> <p>{{content.reserveModalText2}}</p> </template> <template v-else-if="currentStatus == 'Waitlist' || attendancestatus == 'Waitlist'"> <p>{{content.waitlistModalText1}}</p> <p>{{content.waitlistModalText2}}</p> </template> <button :aria-label="content.cancelText" :title="content.cancelTitle" v-on:click.stop="showconfirm = false" class="btn btn-tertiary">{{content.cancelText}}</button> <button :aria-label="content.confirmText" :title="content.confirmTitle" v-on:click.stop.prevent="toggleAddToPlanner" class="btn btn-primary">{{content.confirmText}}</button> </modal-display> <modal-display :title="content.processingModalTitle" :showmodal="seatrestriction && loading && sessionCheck" :allowclose="false" > {{content.processingModalText}} </modal-display> <template v-if="hasmyshow"> <template v-if="exhSubVersion < 3"> <template v-if="fullbuttondisplay"> <a v-on:click.stop.prevent="evaluateAdd()" :title="myshowTitleText" class="btn-primary center js-myShow" v-bind:class="[absolute ? 'absolute' : '', {'is-saved': addedtoplannerfinal, 'is-disabled': !computedEnabled }]"> <svg width="24" height="24" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" v-bind:class="{'is-saved': addedtoplannerfinal, 'icon': true,'rotating': loading}" role="img" aria-hidden="true"> <path v-if="!addedtoplannerfinal && !loading" d="M24 10H14V0h-4v10H0v4h10v10h4V14h10z" fill="white"></path> <path v-if="addedtoplannerfinal && !loading" d="M9 21.035l-9-8.638 2.791-2.87 6.156 5.874 12.21-12.436L24 5.782z" fill="white"></path> <path v-if="loading" v-bind:d="loadingIcon" fill="white"></path> </svg> <span class="b ml2 v-mid" v-if="!loading">{{buttonLabel}}</span> <span class="b ml2 v-mid" v-if="loading">{{content.updatingText}}...</span> </a> </template> <template v-else> <a class="flex-Icon center js-myShow pointer" v-on:click.stop.prevent="evaluateAdd()" v-bind:class="[absolute ? 'absolute' : '', {'is-saved': addedtoplannerfinal, 'is-disabled': !computedEnabled }]" :title="myshowTitleText"> <transition name="favorite-icon"> <svg v-bind:class="{'is-saved': addedtoplannerfinal, 'icon': true, 'rotating': loading}" width="24" height="24" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" role="img" aria-hidden="true"> <path v-if="!addedtoplannerfinal && !loading" v-bind:d="notAddedToPlannerIcon"></path> <path v-if="addedtoplannerfinal && !loading" v-bind:d="addedToPlannerIcon"></path> <path v-if="loading" v-bind:d="loadingIcon"></path> </svg> </transition> </a> </template> </template> <template v-else> <template v-if="fullbuttondisplay"> <button class="btn-primary btn-addtoplanner" @click="evaluateAdd()" v-bind:class="[absolute ? 'absolute' : '', {'is-saved': addedtoplannerfinal, 'is-disabled': !computedEnabled }]"> <span> <svg v-show="addedtoplannerfinal" class="addtoplannericon animated fadeIn" xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none"> <path d="m15.784 8.375-2.16-2.16.914-.936 1.246 1.247L18.87 3.42l.936.935-4.02 4.02ZM5.313 18.22V5.145c0-.442.153-.816.459-1.123.306-.306.68-.46 1.122-.46h5.755a5.169 5.169 0 0 0-.58 1.154 3.843 3.843 0 0 0-.194 1.253c0 1.033.335 1.936 1.004 2.707a4.025 4.025 0 0 0 2.496 1.387c.251.033.47.049.656.049.186 0 .405-.016.656-.049v8.156L11 15.78l-5.687 2.44Z"/></g></svg> <svg v-show="!addedtoplannerfinal" class="addtoplannericon animated fadeIn" xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none"> <path stroke-width=".025" d="M5.512 20.231V5.308c0-.502.173-.927.52-1.274a1.732 1.732 0 0 1 1.275-.521h5.68v1.474h-5.68a.307.307 0 0 0-.22.1.307.307 0 0 0-.1.22V17.97l.017-.008 4.995-2.147 4.995 2.148.018.007v-6.957h1.474v9.219l-6.482-2.781.002-.005-.012.005-6.482 2.781ZM18.486 7v1.987h-1.474v-2h-2V5.513h2v-2h1.474v2h2.001v1.474h-2V7Z"/></g></svg> </span> <span v-if="!loading">{{buttonLabel}}</span> <span v-if="loading">{{content.updatingText}}...</span> </button> </template> <button v-else class="button-addtoplanner" @click="evaluateAdd()" v-bind:class="[absolute ? 'absolute' : '', {'is-saved': addedtoplannerfinal, 'is-disabled': !computedEnabled }]"> <svg v-show="addedtoplannerfinal" class="addtoplannericon animated fadeIn" xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none"> <path d="m15.784 8.375-2.16-2.16.914-.936 1.246 1.247L18.87 3.42l.936.935-4.02 4.02ZM5.313 18.22V5.145c0-.442.153-.816.459-1.123.306-.306.68-.46 1.122-.46h5.755a5.169 5.169 0 0 0-.58 1.154 3.843 3.843 0 0 0-.194 1.253c0 1.033.335 1.936 1.004 2.707a4.025 4.025 0 0 0 2.496 1.387c.251.033.47.049.656.049.186 0 .405-.016.656-.049v8.156L11 15.78l-5.687 2.44Z"/> </svg> <svg v-show="!addedtoplannerfinal" class="addtoplannericon animated fadeIn" xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none"> <path stroke-width=".025" d="M5.512 20.231V5.308c0-.502.173-.927.52-1.274a1.732 1.732 0 0 1 1.275-.521h5.68v1.474h-5.68a.307.307 0 0 0-.22.1.307.307 0 0 0-.1.22V17.97l.017-.008 4.995-2.147 4.995 2.148.018.007v-6.957h1.474v9.219l-6.482-2.781.002-.005-.012.005-6.482 2.781ZM18.486 7v1.987h-1.474v-2h-2V5.513h2v-2h1.474v2h2.001v1.474h-2V7Z"/> </svg> </button> </template> </template> </span></script> <script> var ToggleFavorite = Vue.component("toggle-favorite", { props: { keys:{ default: "", type: [String, Number] }, exhid:{ default: "", type: [String, Number] }, addedtoplanner: { default: false, type: [String, Boolean] }, type: { default: "exhibitor", type: String }, absolute: { default: false, type: Boolean }, tablename: { default: "", type: String }, fullbuttondisplay: { default: false, type: Boolean }, enabled: { default: true, type: Boolean }, disabledtext: { default: "", type: String }, appointment: { default: false, type: Boolean }, fromcalendar: { default: false, type: Boolean }, seatsqty: { default: 0, type: Number }, waitlistqty: { default: 0, type: Number }, attendancestatus: { default: "", type: String }, conflictingsessions: { default: () => [], type: Array } }, mixins: [messagedisplayMixin], template:"#toggleFavoriteTemplate", data: function(){ return { compincludepath: "includes/vue/generic/toggle-favorite.cfm", loading: false, showconflict: false, showconfirm: false, addedtoplannerfinal: (String(this.addedtoplanner).toLowerCase() === 'true'), addedToPlannerIcon: "M9 21.035l-9-8.638 2.791-2.87 6.156 5.874 12.21-12.436L24 5.782z", notAddedToPlannerIcon: "M24 10H14V0h-4v10H0v4h10v10h4V14h10z", loadingIcon: "M11.501 4.025v-4.025h1v4.025l-.5-.025-.5.025zm-7.079 5.428l-3.884-1.041-.26.966 3.881 1.04c.067-.331.157-.651.263-.965zm5.995-5.295l-1.039-3.878-.967.259 1.041 3.883c.315-.106.635-.197.965-.264zm-6.416 7.842l.025-.499h-4.026v1h4.026l-.025-.501zm2.713-5.993l-2.846-2.845-.707.707 2.846 2.846c.221-.251.457-.487.707-.708zm-1.377 1.569l-3.48-2.009-.5.866 3.484 2.012c.15-.299.312-.591.496-.869zm13.696.607l3.465-2-.207-.36-3.474 2.005.216.355zm.751 1.993l3.873-1.038-.129-.483-3.869 1.037.125.484zm-3.677-5.032l2.005-3.472-.217-.125-2.002 3.467.214.13zm-1.955-.843l1.037-3.871-.16-.043-1.038 3.873.161.041zm3.619 2.168l2.835-2.834-.236-.236-2.834 2.833.235.237zm-9.327-1.627l-2.011-3.484-.865.5 2.009 3.479c.276-.184.568-.346.867-.495zm-4.285 8.743l-3.88 1.04.26.966 3.884-1.041c-.106-.314-.197-.634-.264-.965zm11.435 5.556l2.01 3.481.793-.458-2.008-3.478c-.255.167-.522.316-.795.455zm3.135-2.823l3.477 2.007.375-.649-3.476-2.007c-.116.224-.242.439-.376.649zm-1.38 1.62l2.842 2.842.59-.589-2.843-2.842c-.187.207-.383.403-.589.589zm2.288-3.546l3.869 1.037.172-.644-3.874-1.038c-.049.218-.102.434-.167.645zm.349-2.682l.015.29-.015.293h4.014v-.583h-4.014zm-6.402 8.132l1.039 3.879.967-.259-1.041-3.884c-.315.106-.635.197-.965.264zm-1.583.158l-.5-.025v4.025h1v-4.025l-.5.025zm-5.992-2.712l-2.847 2.846.707.707 2.847-2.847c-.25-.22-.487-.456-.707-.706zm-1.165-1.73l-3.485 2.012.5.866 3.48-2.009c-.185-.278-.347-.57-.495-.869zm2.734 3.106l-2.01 3.481.865.5 2.013-3.486c-.299-.149-.591-.311-.868-.495zm1.876.915l-1.042 3.886.967.259 1.04-3.881c-.33-.067-.65-.158-.965-.264z", tippy: null, timesran: 0, intervalid: '', seatrestriction: Vue.MYS.seatrestriction, allowedschedules: Vue.MYS.allowedschedules, lockdown: Vue.MYS.lockdown, exhSubVersion: Vue.MYS.exhSubVersion } }, watch: { addedtoplanner: { deep: true, handler: function(e){ this.addedtoplannerfinal = e; } } }, computed:{ buttonLabel: function() { if(this.addedtoplannerfinal) { if(this.seatrestriction && this.sessionCheck) { switch(this.currentStatus) { case 'Waitlist': return this.content.waitlistRemoveText; break; case 'Reserved': return this.content.reserveRemoveText; break; } } else { return this.content.savedToMyShowPlannerText; } } else { if(!this.computedEnabled && this.enabled) { if(this.regemail.length == 0) { return this.content.loginText; } else { return this.content.noAccessText; } } else if(this.seatrestriction && this.sessionCheck) { switch(this.currentStatus) { case 'Waitlist': return this.content.waitlistAddText; break; case 'Reserved': return this.content.reserveAddText; break; case 'Filled': return this.content.filledText; break; } } else { return this.content.addToMyShowPlannerText; } } }, computedEnabled: function() { if(this.sessionCheck) { if(!this.lockdown || (this.allowedschedules.includes(''+this.keys) || this.attendancestatus != '')) { return this.enabled; } else { return false; } } else { return this.enabled; } }, content: function() { var formattedURL = this.thispageurl.toLowerCase().trim(); var sessionDetailsSuffix = formattedURL.indexOf("/sessions/session-details.cfm") >= 0 ? "-session" : ""; return { addToMyShowPlannerText: this.displaycontent(this.compincludepath, `addToMyShowPlannerText${sessionDetailsSuffix}`), savedToMyShowPlannerText: this.displaycontent(this.compincludepath, 'savedToMyShowPlannerText'), removeFromPlannerText: this.displaycontent(this.compincludepath, 'removeFromPlannerText'), appointmentRemoveFromPlannerText: this.displaycontent(this.compincludepath, 'appointmentRemoveFromPlannerText'), updatingText: this.displaycontent(this.compincludepath, 'updatingText'), filledText: this.displaycontent(this.compincludepath, 'filledText'), filledHintText: this.displaycontent(this.compincludepath, 'filledHintText'), loginText: this.displaycontent(this.compincludepath, 'loginText'), loginHintText: this.displaycontent(this.compincludepath, 'loginHintText'), noAccessText: this.displaycontent(this.compincludepath, 'noAccessText'), noAccessHintText: this.displaycontent(this.compincludepath, 'noAccessHintText'), waitlistText: this.displaycontent(this.compincludepath, 'waitlistText'), waitlistRemovedText: this.displaycontent(this.compincludepath, 'waitlistRemovedText'), waitlistAddText: this.displaycontent(this.compincludepath, 'waitlistAddText'), waitlistRemoveText: this.displaycontent(this.compincludepath, 'waitlistRemoveText'), reservedText: this.displaycontent(this.compincludepath, 'reservedText'), reservedRemoveText: this.displaycontent(this.compincludepath, 'reservedRemoveText'), reserveAddText: this.displaycontent(this.compincludepath, 'reserveAddText'), reserveRemoveText: this.displaycontent(this.compincludepath, 'reserveRemoveText'), processingText: this.displaycontent(this.compincludepath, 'processingText'), cancelText: this.displaycontent(this.compincludepath, 'cancelText'), confirmText: this.displaycontent(this.compincludepath, 'confirmText'), reserveModalText1: this.displaycontent(this.compincludepath, 'reserveModalText1'), reserveModalText2: this.displaycontent(this.compincludepath, 'reserveModalText2'), waitlistModalText1: this.displaycontent(this.compincludepath, 'waitlistModalText1'), waitlistModalText2: this.displaycontent(this.compincludepath, 'waitlistModalText2'), conflictModalText1: this.displaycontent(this.compincludepath, 'conflictModalText1'), conflictModalText2: this.displaycontent(this.compincludepath, 'conflictModalText2'), conflictModalText3: this.displaycontent(this.compincludepath, 'conflictModalText3'), confirmModalTitle: this.displaycontent(this.compincludepath, 'confirmModalTitle'), processingModalTitle: this.displaycontent(this.compincludepath, 'processingModalTitle'), processingModalText: this.displaycontent(this.compincludepath, 'processingModalText'), cancelTitle: this.displaycontent(this.compincludepath, 'cancelTitle'), confirmTitle: this.displaycontent(this.compincludepath, 'confirmTitle') }; }, currentStatus: function() { if(this.sessionCheck) { if(this.attendancestatus == 'Reserved' || this.attendancestatus == 'Waitlist') { return this.attendancestatus; } else if(this.seatsqty > 0) { return 'Reserved'; } else if (this.waitlistqty > 0) { return 'Waitlist'; } else { return 'Filled'; } } else { return ''; } }, myshowTitleText: function() { if (this.computedEnabled){ if (this.addedtoplannerfinal){ if(this.appointment) { return this.content.appointmentRemoveFromPlannerText; } else { return this.buttonLabel; } } else { return this.buttonLabel; } } else { if(this.sessionCheck && this.seatrestriction) { if(this.currentStatus == 'Filled') { return this.content.filledHintText; } else if (this.regemail.length == 0) { return this.content.loginHintText; } else { return this.content.noAccessHintText; } } else { return this.disabledtext; } } }, tippyTitle: function() { if (!this.computedEnabled) { return this.myshowTitleText; } else { return ""; } }, scheduleConflict: function() { if(this.sessionCheck && this.attendancestatus == 'Conflict') { return true; } else { return false; } }, sessionCheck: function() { if(this.type == 'session' || this.type == 'calendar') { return true; } else { return false; } } }, methods: { checkStatus: function() { var vObj = this, requestObj = {}; requestObj["scheduleid"] = vObj.keys; if (!vObj.addedtoplannerfinal) { requestObj["status"] = vObj.currentStatus; } else { requestObj["status"] = "Remove"; } vObj.timesran += 1; if(vObj.timesran >= 5) { vObj.intervalid = clearInterval(vObj.intervalid); vObj.timesran = 0; vObj.loading = false; vObj.showMessage("error", vObj.content.processingText); } else { vObj.ajaxGet(vObj.path2approot + '/myshow/myshow-actions.cfm?action=sessionstatus&' + vObj.objectToURLValues(requestObj), // ajaxGet() defined in _global-mixin function(response) { // success if(response.DATA == 'Reserved') { vObj.showMessage("success", vObj.content.reservedText); } else if(response.DATA == 'Waitlist') { vObj.showMessage("success", vObj.content.waitlistText); } else if (requestObj["status"] == 'Remove') { if(vObj.currentStatus == 'Reserved') { vObj.showMessage("success", vObj.content.reservedRemoveText); } else { vObj.showMessage("success", vObj.content.waitlistRemovedText); } } vObj.intervalid = clearInterval(vObj.intervalid); vObj.timesran = 0; vObj.loading = false; vObj.addedtoplannerfinal = !vObj.addedtoplannerfinal; vObj.$emit('toggle-favorite', {type: vObj.type, keys: vObj.keys, status: response.DATA}); }, function(response) { // error }); // end ajaxGet } }, evaluateAdd: function() { if(this.computedEnabled) { if(this.type == 'session' && this.scheduleConflict) { this.showconflict = true; } else if (this.seatrestriction && this.addedtoplannerfinal && (this.type == 'session' || (this.type == 'calendar' && this.attendancestatus))) { this.showconfirm = true; } else { this.toggleAddToPlanner(); } } }, toggleAddToPlanner: function() { var myshowfunction = "" , requestObj = {} , vObj = this , callback = function(){ } , errormessage = ""; if (vObj.computedEnabled && !vObj.fromcalendar){ switch(vObj.type){ case "exhibitor": // if not added to planner then add if (!vObj.addedtoplannerfinal){ myshowfunction = "AddExhibitor"; requestObj["keys"] = vObj.keys; errormessage = "Error adding exhibitor to planner"; callback = function(){ vObj.addedtoplannerfinal = true; }; } else { myshowfunction = "RemoveExhibitor"; requestObj["keys"] = vObj.keys; errormessage = "Error removing exhibitor from planner"; callback = function(){ vObj.addedtoplannerfinal = false; }; } break; case "session": if (!vObj.addedtoplannerfinal){ myshowfunction = "AddSession"; requestObj["keys"] = vObj.keys; requestObj["status"] = vObj.currentStatus; errormessage = "Error adding session to planner"; callback = function(){ vObj.addedtoplannerfinal = true; }; } else { myshowfunction = "RemoveSession"; requestObj["keys"] = vObj.keys; requestObj["status"] = 'Remove'; errormessage = "Error removing session from planner"; callback = function(){ vObj.addedtoplannerfinal = false; }; } break; case "showfeature": if (!vObj.addedtoplannerfinal){ myshowfunction = "AddFavorite"; requestObj["keys"] = vObj.keys; requestObj["tablename"] = "ShowFeatures"; errormessage = "Error adding show feature to planner"; if (vObj.exhid){ requestObj["exhid"] = vObj.exhid; } callback = function(){ vObj.addedtoplannerfinal = true; }; } else { myshowfunction = "RemoveFavorite"; requestObj["keys"] = vObj.keys; requestObj["tablename"] = "ShowFeatures"; errormessage = "Error removing show feature from planner"; if (vObj.exhid){ requestObj["exhid"] = vObj.exhid; } callback = function(){ vObj.addedtoplannerfinal = false; }; } break; case "collateral": if (!vObj.addedtoplannerfinal){ myshowfunction = "AddFavorite"; requestObj["keys"] = vObj.keys; requestObj["tablename"] = "PressReleases"; errormessage = "Error adding collateral to planner"; if (vObj.exhid){ requestObj["exhid"] = vObj.exhid; } callback = function(){ vObj.addedtoplannerfinal = true; }; } else { myshowfunction = "RemoveFavorite"; requestObj["keys"] = vObj.keys; requestObj["tablename"] = "PressReleases"; errormessage = "Error removing collateral from planner"; if (vObj.exhid){ requestObj["exhid"] = vObj.exhid; } callback = function(){ vObj.addedtoplannerfinal = false; }; } break; case "special": if (!vObj.addedtoplannerfinal){ myshowfunction = "AddFavorite"; requestObj["keys"] = vObj.keys; requestObj["tablename"] = "ShowSpecials"; errormessage = "Error adding special to planner"; if (vObj.exhid){ requestObj["exhid"] = vObj.exhid; } callback = function(){ vObj.addedtoplannerfinal = true; }; } else { myshowfunction = "RemoveFavorite"; requestObj["keys"] = vObj.keys; requestObj["tablename"] = "ShowSpecials"; errormessage = "Error removing special from planner"; if (vObj.exhid){ requestObj["exhid"] = vObj.exhid; } callback = function(){ vObj.addedtoplannerfinal = false; }; } break; case "product": if (!vObj.addedtoplannerfinal){ myshowfunction = "AddFavorite"; requestObj["keys"] = vObj.keys; requestObj["tablename"] = "ExhibitorProducts"; errormessage = "Error adding product to planner"; if (vObj.exhid){ requestObj["exhid"] = vObj.exhid; } callback = function(){ vObj.addedtoplannerfinal = true; }; } else { myshowfunction = "RemoveFavorite"; requestObj["keys"] = vObj.keys; requestObj["tablename"] = "ExhibitorProducts"; errormessage = "Error removing product from planner"; if (vObj.exhid){ requestObj["exhid"] = vObj.exhid; } callback = function(){ vObj.addedtoplannerfinal = false; }; } break; case "guestappearances": if (!vObj.addedtoplannerfinal){ myshowfunction = "AddFavorite"; requestObj["keys"] = vObj.keys; requestObj["tablename"] = "exhibitor_guests"; errormessage = "Error adding guest appearance to planner"; if (vObj.exhid){ requestObj["exhid"] = vObj.exhid; } callback = function(){ vObj.addedtoplannerfinal = true; }; } else { myshowfunction = "RemoveFavorite"; requestObj["keys"] = vObj.keys; requestObj["tablename"] = "exhibitor_guests"; errormessage = "Error removing guest appearance from planner"; if (vObj.exhid){ requestObj["exhid"] = vObj.exhid; } callback = function(){ vObj.addedtoplannerfinal = false; }; } break; case "onlinecontact": if (!vObj.addedtoplannerfinal){ myshowfunction = "AddFavorite"; requestObj["keys"] = vObj.keys; requestObj["tablename"] = "AdditionalContacts"; errormessage = "Error adding online contact to planner"; if (vObj.exhid){ requestObj["exhid"] = vObj.exhid; } callback = function(){ vObj.addedtoplannerfinal = true; }; } else { myshowfunction = "RemoveFavorite"; requestObj["keys"] = vObj.keys; requestObj["tablename"] = "AdditionalContacts"; errormessage = "Error removing online contact from planner"; if (vObj.exhid){ requestObj["exhid"] = vObj.exhid; } callback = function(){ vObj.addedtoplannerfinal = false; }; } break; case "scheduledevent": if (!vObj.addedtoplannerfinal){ myshowfunction = "AddFavorite"; requestObj["keys"] = vObj.keys; requestObj["tablename"] = "ScheduledEvents"; errormessage = "Error adding event to planner"; if (vObj.exhid){ requestObj["exhid"] = vObj.exhid; } callback = function(){ vObj.addedtoplannerfinal = true; }; } else { myshowfunction = "RemoveFavorite"; requestObj["keys"] = vObj.keys; requestObj["tablename"] = "ScheduledEvents"; errormessage = "Error removing event from planner"; if (vObj.exhid){ requestObj["exhid"] = vObj.exhid; } callback = function(){ vObj.addedtoplannerfinal = false; }; } break; default: if (vObj.tablename){ if (!vObj.addedtoplannerfinal){ myshowfunction = "AddFavorite"; requestObj["keys"] = vObj.keys; requestObj["tablename"] = vObj.tablename; errormessage = "Error adding to planner"; if (vObj.exhid){ requestObj["exhid"] = vObj.exhid; } callback = function(){ vObj.addedtoplannerfinal = true; }; } else { myshowfunction = "RemoveFavorite"; requestObj["keys"] = vObj.keys; requestObj["tablename"] = vObj.tablename; errormessage = "Error removing from planner"; if (vObj.exhid){ requestObj["exhid"] = vObj.exhid; } callback = function(){ vObj.addedtoplannerfinal = false; }; } } } vObj.showconflict = false; vObj.showconfirm = false; vObj.loading = true; var return_to = encodeURIComponent(vObj.getCurrentURL()); vObj.ajaxGet(vObj.path2approot + '/myshow/myshow-actions.cfm?action=' + myshowfunction + "&" + vObj.objectToURLValues(requestObj) + "&return_to=" + return_to, // ajaxGet() defined in _global-mixin function(response){ // success if(vObj.type == "session" && vObj.seatrestriction) { vObj.intervalid = setInterval(function(){vObj.checkStatus()}, 2000); } else { vObj.loading = false; callback(); vObj.$emit('toggle-favorite', {type: vObj.type, keys: vObj.keys}); } }, function(response){ // error vObj.loading = false; if ("ERRORCODE" in response && response.ERRORCODE == "12345"){ location.href = vObj.path2approot + '/login/login.cfm'; } else { vObj.showMessage("error", "Error favoriting item"); } }); // end ajaxGet } // end if else if (vObj.fromcalendar){ vObj.$emit('toggle-favorite', {type: vObj.type, keys: vObj.keys}); } } // end toggleAddToPlanner } }); </script> <style> @-webkit-keyframes rotating /* Safari and Chrome */ { from { -webkit-transform: rotate(0deg); -o-transform: rotate(0deg); transform: rotate(0deg); } to { -webkit-transform: rotate(360deg); -o-transform: rotate(360deg); transform: rotate(360deg); } } @keyframes rotating { from { -ms-transform: rotate(0deg); -moz-transform: rotate(0deg); -webkit-transform: rotate(0deg); -o-transform: rotate(0deg); transform: rotate(0deg); } to { -ms-transform: rotate(360deg); -moz-transform: rotate(360deg); -webkit-transform: rotate(360deg); -o-transform: rotate(360deg); transform: rotate(360deg); } } .rotating { -webkit-animation: rotating 2s linear infinite; -moz-animation: rotating 2s linear infinite; -ms-animation: rotating 2s linear infinite; -o-animation: rotating 2s linear infinite; animation: rotating 2s linear infinite; } </style> <script type="text/x-template" id="exhibitor-result-card-template"> <li class="js-Card card br3 dib float pa3" v-bind:style="manualHeight" v-on:click.self="handleClick()"> <div v-if="intersected" v-on:click.self="handleClick()"> <div class="card-Details mb2" v-on:click.self="handleClick()"> <div v-if="logo !== '' && iscrossref != 1" class="flex-Thumb thumb-Border mr3 pa2"> <a v-bind:href="exhURL()" v-on:click.self="handleClick();"> <v-lazy-image v-bind:src="logo" v-bind:alt=exhname v-bind:title=exhname class="mw-100 js-LogoImg" v-bind:ref="'js' + exhname+'logo'" v-bind:src-placeholder="placeholderimg" onerror="this.onerror=null;this.src='/8_0/assets/imgs/1x1.gif';" /> </a> </div> <div class="flex-Title mb0 mr3" v-on:click.self="handleClick()"> <h3 class="card-Title break-word f2 mb1 mt0" v-on:click.self="handleClick()"> <a class="bb-0" v-bind:href="exhURL()" v-on:click.self="handleClick()"> <span class="b" v-if="slotted"> {{exhname}} <span v-if="iscrossref && crossrefname">({{content.seeText}}: {{crossrefname}})</span> </span> <span class="normal" v-else> {{exhname}} <span v-if="iscrossref && crossrefname">({{content.seeText}}: {{crossrefname}})</span> </span> </a> </h3> <p class="card-Subtitle f5 ma0 muted" v-if="booths && booths.length > 0 && showbooths && iscrossref != 1" v-on:click.self="handleClick()"> <span v-for="i in numOfBoothsToShow"> <a v-if="floorplanactive && validHalls.includes(hallids[i-1])" class="bb-0 color-inherit" v-bind:href="boothURL((booths[i-1]+'').replace('randomstring', ''))" title="Visit this booth">{{(boothsdisplay[i-1]+'').replace('randomstring', '')}}<span v-if="i+1 <= numOfBoothsToShow">, </span></a> <span v-else class="bb-0 color-inherit f6">{{(boothsdisplay[i-1]+'').replace('randomstring', '')}}<span v-if="i+1 <= numOfBoothsToShow">, </span></span> </span> <span v-if="booths.length > numOfBoothsToShow" class="bb-0 color-inherit f6"> + {{booths.length - numOfBoothsToShow}} more </span> </p> </div> <toggle-favorite :type="'exhibitor'" v-bind:keys="exhid" v-bind:addedtoplanner="addedtoplanner" v-on:toggle-favorite="$emit('toggle-favorite', $event)"> </toggle-favorite> </div> <div class="mt3" v-on:click.self="handleClick()"> <a class="bb-0" v-bind:href="exhURL()" v-on:click.self="handleClick()"> <span v-for="tag in tags" :class="tag.color + ' br1 dark-gray dib f7 normal mb2 mr1 pa2 pt1 pb1'">{{tag.display}}</span> </a> </div> <p class="card-Desc f5 lh-copy ma0 muted" v-if="iscrossref != 1"> <a class="bb-0" v-bind:href="exhURL()" v-on:click.self="handleClick()"> {{summary}}</a> </p> <img class="mt3 mr2 mb2 mw4 mw-100" v-for="icon in icons" :src="icon.iconfile" :title="icon.title" :alt="icon.title" v-if="iscrossref != 1"/> <slot> </slot> </div> <a v-if="!intersected" v-bind:href="exhURL()">{{exhname}}</a> </li></script> <script> var ExhibitorResultCard = Vue.component('exhibitor-result-card', { template:"#exhibitor-result-card-template", props: ["exhid", "exhname", "booths", "hallids", "description", "logo", "boothsdisplay", "slotted", "addedtoplanner", "isrecommendation", "icons", "tags", "exhadvind", "iscrossref", "crossrefname"], data: function(){ return { compincludepath: "includes/vue/generic/exhibitor-result-card.cfm", menuvisible: false, intersected: false, observer: null, validHalls: Vue.MYS.validHalls, hideimg: false } }, computed: { content: function(){ return { seeText: this.displaycontent(this.compincludepath, 'seeText') }; }, boothlist: function(){ if (this.booths){ return this.booths.join(", "); } else { return ""; } }, summary: function(){ if (this.bitToBool(this.exhadvind)){ return this.createSummary(this.description, 170); } else { return this.createSummary(this.description, 85); } }, manualHeight: function(){ return (this.intersected) ? "" : "height: 189px"; }, placeholderimg: function(){ return this.path2approot + "/assets/imgs/grey.gif"; }, numOfBoothsToShow: function (){ return (this.maxshowbooths == 0 ? this.booths.length: (this.maxshowbooths > this.booths.length ? this.booths.length : this.maxshowbooths)); } }, mounted: function(){ var vObj = this; vObj.observer = new IntersectionObserver(function(entries) { var image = entries[0]; if (image.isIntersecting) { vObj.intersected = true; vObj.observer.disconnect(); } }, {}); vObj.observer.observe(vObj.$el); }, destroyed: function() { this.observer.disconnect(); }, methods: { boothURL: function(booth){ return (this.path2approot + "/floorplan_link.cfm?exhid=" + this.exhid + "&booth=" + (booth+'').replace('randomstring', '') + "&show_id=" + this.showid); }, toggleMenu: function(){ this.menuvisible = !this.menuvisible; }, exhURL: function(){ return this.getExhibitorURL(this.exhid, this.exhname); }, handleClick: function(){ if (this.isrecommendation){ // log function(useraction, useractiontype, actionvalue, altvalue) this.logStats("Recommendation Selected: Exhibitor", "", this.exhid, this.exhname); } this.goToURL(this.exhURL()); } } }); </script> <script> var VLazyImageComponent = { props: { src: { type: String, required: true }, srcPlaceholder: { type: String, default: "" }, srcset: { type: String }, intersectionOptions: { type: Object, default: function(){ return {} } } }, data: function() { return { observer: null, intersected: false, loaded: false } }, computed: { srcImage: function() { return this.intersected ? this.src : this.srcPlaceholder; }, srcsetImage: function() { return this.intersected && this.srcset ? this.srcset : false; } }, render: function(h) { return h("img", { attrs: { src: this.srcImage, srcset: this.srcsetImage }, class: { "v-lazy-image": true, "v-lazy-image-loaded": this.loaded } }); }, mounted: function() { var vObj = this; vObj.$el.addEventListener("load", function() { if (vObj.$el.getAttribute('src') !== vObj.srcPlaceholder) { vObj.loaded = true; vObj.$emit("load"); } }); this.observer = new IntersectionObserver(function(entries) { var image = entries[0]; if (image.isIntersecting) { vObj.intersected = true; vObj.observer.disconnect(); vObj.$emit("intersect"); } }, vObj.intersectionOptions); vObj.observer.observe(vObj.$el); }, destroyed: function() { this.observer.disconnect(); } }; /*var VLazyImagePlugin = { install: (Vue, opts) => { Vue.component("VLazyImage", VLazyImageComponent); } };*/ Vue.component("VLazyImage", VLazyImageComponent); </script> <script type="text/x-template" id="featured-result-card-template"> <li class="js-Card card br3 dib float pa3" v-bind:style="manualHeight" v-on:click.self="handleClick();"> <div v-if="intersected" v-on:click.self="handleClick();"> <div class="card-Details mb2" v-on:click.self="handleClick();"> <div v-if="logo !== '' && hideimg != true && bitToBool(exhadvind) && iscrossref != 1" class="flex-Thumb thumb-Border mr3 pa2"> <a v-bind:href="exhURL()" v-on:click.self="handleClick();"> <v-lazy-image v-bind:src="logo" v-bind:alt=exhname v-bind:title=exhname class="mw-100 js-LogoImg" v-bind:ref="'js' + exhname+'logo'" v-bind:src-placeholder="placeholderimg" onerror="this.onerror=null;this.src='/8_0/assets/imgs/1x1.gif';" /> </a> </div> <div class="flex-Title mb0 mr3" v-on:click.self="handleClick();"> <h3 class="card-Title break-word f2 mb1 mt0" v-on:click.self="handleClick();"> <a class="bb-0" v-bind:href="exhURL()" v-on:click.self="handleClick();"> <span>{{exhname}}</span> <span v-if="iscrossref && crossrefname">({{content.seeText}}: {{crossrefname}})</span> </a> </h3> <p class="card-Subtitle f5 ma0 muted" v-if="booths && booths.length > 0 && showbooths && iscrossref != 1" v-on:click.self="handleClick()"> <span v-for="i in numOfBoothsToShow" > <a v-if="floorplanactive && validHalls.includes(hallids[i-1])" class="bb-0 color-inherit" v-bind:href="boothURL((booths[i-1]+'').replace('randomstring', ''))" title="Visit this booth">{{(boothsdisplay[i-1]+'').replace('randomstring', '')}}<span v-if="i+1 <= numOfBoothsToShow">, </span></a> <span v-else class="bb-0 color-inherit f6">{{(boothsdisplay[i-1]+'').replace('randomstring', '')}}<span v-if="i+1 <= numOfBoothsToShow">, </span></span> </span> <span v-if="booths.length > numOfBoothsToShow" class="bb-0 color-inherit f6"> + {{booths.length - numOfBoothsToShow}} more </span> </p> </div> <toggle-favorite :type="'exhibitor'" v-bind:keys="exhid" v-bind:addedtoplanner="addedtoplanner" v-on:toggle-favorite="$emit('toggle-favorite', $event)"> </toggle-favorite> </div> <div class="mt3" v-on:click.self="handleClick()"> <a class="bb-0" v-bind:href="exhURL()" v-on:click.self="handleClick()"> <span v-for="tag in tags" :class="tag.color + ' br1 dark-gray dib f7 normal mb2 mr1 pa2 pt1 pb1'">{{tag.display}}</span> </a> </div> <p class="card-Desc f5 lh-copy ma0 muted" v-if="iscrossref != 1"> <a class="bb-0" v-bind:href="exhURL()" v-on:click.self="handleClick();">{{summary}}</a> </p> <img class="mt3 mr2 mb2 mw4 mw-100" v-for="icon in icons" :src="getIconUrl(icon)" :title="icon.title" :alt="icon.title" v-if="iscrossref != 1" /> <slot></slot> </div> <a v-if="!intersected" v-bind:href="exhURL()">{{exhname}}</a> </li></script> <script> var FeaturedResultCard = Vue.component('featured-result-card', ExhibitorResultCard.extend({ template:"#featured-result-card-template", computed: { summary: function(){ if (this.bitToBool(this.exhadvind)){ return this.createSummary(this.description, 170); } else { return this.createSummary(this.description, 85); } }, manualHeight: function(){ return (this.intersected) ? "" : "height: 240px"; }, placeholderimg: function(){ return this.path2approot + "/assets/imgs/grey.gif"; }, numOfBoothsToShow: function (){ return (this.maxshowbooths == 0 ? this.booths.length: (this.maxshowbooths > this.booths.length ? this.booths.length : this.maxshowbooths)); } }, methods: { hideImage: function(e){ // this.hideimg = true; // console.log(this.$refs); // this.$refs[e].$el.onerror = function(){ // alert("hey"); // }; // console.log(this); }, exhURL: function(){ return this.getExhibitorURL(this.exhid, this.exhname); } } }) ); </script> <script type="text/x-template" id="session-result-card-template"> <li class="js-Card card br3 dib float pa3" v-on:click.self="handleClick()"> <div class="card-Details mb2" v-on:click.self="handleClick()" v-if="intersected"> <div class="flex-Title mb0 mr3" v-on:click.self="handleClick()"> <p class="card-Subtitle b f5 mb0" v-if="scheduledate"> <a class="bb-0" v-bind:href="sessionURL()" v-on:click.self="handleClick()" v-if="showDateTime && !hidesessiontimes"> <span v-if="showfulldate"> <span class="">{{formatSessionDay(schedulestarttime)}},</span> {{formatSessionMonth(scheduledate)}} {{toDate(scheduledate).getDate()}} <span class="ml1 mr1 normal o-50">&bull;</span> </span> <div v-if="schedulestarttime != ''"> {{formatSessionTime(schedulestarttime)}} - {{formatSessionTime(scheduleendtime)}}<span v-if="showtimezone"> {{timezonelabel}}</span> </div> </a> <a class="bb-0" v-bind:href="sessionURL()" v-on:click.self="handleClick()" v-if="!showDateTime"> <span>{{content.onDemandLabel}}</span> </a> </p> <p class="f5 mb3 muted"> <template v-if="!hidesessionlocations"> <a class="bb-0" v-if="floorplanactive && validRooms.includes(location)" v-bind:href="floorplanlink">{{location}}</a> <span v-else>{{location}}</span> </template> </p> <h3 class="card-Title break-word f2 mb0 mt0"> <a class="bb-0" v-bind:href="sessionURL()" v-on:click.self="handleClick()"> {{title}} </a> </h3> </div> <toggle-favorite v-if="!seatrestriction" :type="'session'" v-bind:keys="scheduleidstring" v-bind:addedtoplanner="addedtoplanner" v-bind:enabled="bitToBool(allowadd)" v-bind:disabledtext="content.regRequiredText" v-on:toggle-favorite="$emit('toggle-favorite', $event)"> </toggle-favorite> </div> <p class="card-Desc f5 lh-copy ma0 muted" v-on:click.self="handleClick()" v-if="intersected"> {{summary}} </p> <div class="flex items-center mt3" v-if="tracktitle.length > 0 && intersected" v-on:click.self="handleClick()"> <div v-if="tracktitle.length <= 3"> <div class="muted mb2 pb1" v-for="(track, index) in tracktitle" v-on:click.capture="handleClick()"> <span class="dib token-track mr2" v-bind:style="{ backgroundColor: getTrackBgColor(track) }"></span>{{track}} </div> </div> <div v-if="tracktitle.length > 3"> <div class="muted mb2 pb1" v-for="i in 3" v-on:click.capture="handleClick()"> <span class="dib token-track mr2" v-bind:style="{ backgroundColor: getTrackBgColor(tracktitle[i]) }"></span>{{tracktitle[i]}} </div> <div class="muted" v-on:click.capture="handleClick()"> + {{tracktitle.length-3}} {{content.moreText}}</div> </div> </div> <div v-if="ondemand" class="mt3"> <span class="bg-color-brand-09 br1 dark-gray dib f7 normal pa2 pt1 pb1">{{content.onDemandLabel}}</span> </div> <slot> </slot> <a v-if="!intersected" v-bind:href="sessionURL()">{{title}}</a> </li></script> <script> var SessionResultCard = Vue.component('session-result-card', { template:"#session-result-card-template", props: ["title","tracktitle","location","description","scheduledate","scheduleid","schedulestarttime","scheduleendtime","addedtoplanner", "backgroundcolorhexarray", "textcolorhexarray","showfulldate", "isrecommendation", "handoutnamearray", "sponsorarray", "score", "allowadd", "ondemand"], data: function(){ return { compincludepath: "includes/vue/generic/session-result-card.cfm", menuvisible: false, showtimezone: Vue.MYS.settingsConfig.timesettings.showtimezone, timezonelabel: Vue.MYS.settingsConfig.timesettings.timezonelabel, hidesessiontimes: Vue.MYS.settingsConfig.searchsettings.hidesessiontimes, hidesessionlocations: Vue.MYS.settingsConfig.searchsettings.hidesessionlocations, intersected: false, observer: null, validRooms: Vue.MYS.validRooms, seatrestriction: Vue.MYS.seatrestriction } }, mounted: function(){ var vObj = this; vObj.observer = new IntersectionObserver(function(entries) { var image = entries[0]; if (image.isIntersecting) { vObj.intersected = true; vObj.observer.disconnect(); } }, {}); vObj.observer.observe(vObj.$el); }, destroyed: function() { this.observer.disconnect(); }, computed: { boothlist: function(){ if (this.booths){ return this.booths.join(", "); } else { return ""; } }, summary: function(){ return this.createSummary(this.description, 85); }, scheduleidstring: function(){ return this.scheduleid+""; }, content: function(){ return { regRequiredText: this.displaycontent(this.compincludepath, 'regRequiredText'), moreText: this.displaycontent(this.compincludepath, 'moreText'), onDemandLabel: this.displaycontent(this.compincludepath, 'onDemandLabel') }; }, floorplanlink: function(){ return this.path2approot + '/floorplan_link.cfm?show_id=' + this.showid + '&alt_entry=true&curr_pri=facility&object_type=room&booth=' + this.location; }, showDateTime: function(){ return (this.scheduledate == "1900-01-01T00:00:00Z" || this.scheduledate == "1970-01-01T00:00:00Z" ? false : true); } }, methods: { toggleMenu: function(){ this.menuvisible = !this.menuvisible; }, sessionURL: function(){ return this.path2approot + "/sessions/session-details.cfm?scheduleid=" + this.scheduleid; }, handleClick: function(){ if (this.isrecommendation){ // log function(useraction, useractiontype, actionvalue, altvalue) this.logStats("Recommendation Selected: Session", "", this.scheduleid, this.title); } this.goToURL(this.sessionURL()); }, getTrackBgColor: function(trackname) { if (trackname in Vue.MYS.trackcss && "backgroundcolorhex" in Vue.MYS.trackcss[trackname]) { return Vue.MYS.trackcss[trackname]["backgroundcolorhex"]; } else { return "#b2b2b2"; } } } }); </script> <script type="text/x-template" id="recommendations-modal-template"> <div id="rec-modal"> <message-display v-bind:messages="messages" v-bind:type="messagetype" v-bind:showmessage="showmessage" :timeout="20"> </message-display> <transition name="modal" v-if="showmodal"> <div class="modal-mask"> <div class="modal-wrapper" v-on:click.self="closeModal();"> <div class="modal-container"> <div class="modal-header flex justify-between items-center"> <h2 class="mt0">{{content.recommenendedResultsText}} </h2> <button class="btn-tertiary modal-default-button nowrap" v-on:click.stop.prevent="closeModal();"> {{content.closeButtonText}} </button> </div> <div class="mb4"> <a class="toggle-grid btn-tertiary" href="" v-if="exhibitorrecommendationsactive" v-on:click.stop.prevent="switchDisplay('exhibitor');" v-bind:class="[rectype == 'exhibitor' ? 'is-selected' : '']"> <span class="v-mid">{{content.exhibitorButtonText}}</span> </a> <a class="toggle-grid btn-tertiary" href="" v-if="sessionrecommendationsactive" v-on:click.stop.prevent="switchDisplay('session');" v-bind:class="[rectype == 'session' ? 'is-selected' : '']"> <span class="v-mid">{{content.sessionButtonText}}</span> </a> </div> <div v-if="!isloggedinmyshow"> <p class="mb4" v-if="recommendedresults.totalhits > 0"> {{content.topSixRecText}} <a :href="path2approot + '/myshow/'">{{content.loginOrCreatePlannerText}}</a>. </p> <p class="mb4" v-if="recommendedresults.totalhits == 0 && !loading"> {{content.dontHaveRecsText}} </p> </div> <div v-if="loading"> {{content.loadingText}} </div> <div class="o-Recommendation_toggle bg-white mb0-last pb3 tl" > <!-- card view --> <transition-group name="staggered-fade" appear tag="ul" id="rec-result-card" class="cards exh-basic" v-bind:css="false" v-on:before-enter="beforeEnterStaggered" v-on:enter="enterStaggered" v-on:leave="leaveStaggered"> <component v-for="(result, index) in recommendedresults.results" v-on:toggle-favorite="onToggleFavorite" :key="'recommendedresults'+index" :is="getCardTypeDisplay(result)" :data-index="index" :data-maxopacity="getFadedExhibitorOpacity(index)" v-bind="getComponentProps(result)" v-bind:style=""> </component> </transition-group> </div> <div class="modal-footer"> <slot name="footer"></slot> </div> </div> </div> </div> </transition> </div></script> <script> var overriderecstatus = ""; var RecommendationsModal = Vue.component('recommendations-modal', { template:"#recommendations-modal-template", props: { recommendationCategory: { default: "Recommendations", type: String }, recommendedTotal: { default: 0, type: Number }, showmodal:{ default: false, type: Boolean }, isloggedinmyshow: { default: false, type: Boolean } }, mixins: [staggeredTransitionsMixin, fixElementMixin, messagedisplayMixin], data: function(){ return { compincludepath: "includes/vue/generic/recommendations-modal.cfm", recommendationCounter: this.recommendedTotal, recommendedresults: { results: [], totalhits: 0 }, loading: false, maxunfadedexhibitors: 3, rectype: "exhibitor" } }, mounted: function(){ if (this.exhibitorrecommendationsactive && !this.sessionrecommendationsactive){ this.rectype = "exhibitor"; } else if (!this.exhibitorrecommendationsactive && this.sessionrecommendationsactive) { this.rectype = "session"; } }, watch:{ showmodal: function(val){ if (val == true){ this.openModal(); } } }, methods: { switchDisplay: function(rectype){ this.rectype = rectype; this.loadRecs(); }, resetRecommendedResults: function(){ this.recommendedresults = { results: [], totalhits: 0 }; }, isFadedExhibitor: function(index){ if (!this.isloggedinmyshow && index > this.recommendedresults.results.length - this.maxunfadedexhibitors-1){ return true; } else { return false; } }, getFadedExhibitorOpacity: function(index){ if (this.isFadedExhibitor(index)){ // note: commenting out for as we revist how last recs display. Love, Stephen. Have a great day // return 0.3 ; return 1 ; } else { return 1 ; } }, // using this to determine which card component type to display getCardTypeDisplay: function(result){ switch(this.rectype) { case "exhibitor": if (result.MYS.exhfeatured_t == true ){ return "featured-result-card"; } else { return "exhibitor-result-card"; } break; case "session": return "session-result-card"; break; } }, // we can dynamically bind properties to a component. So instead of v-bind:exhid="0000" we can put them in an obj and say v-bind=obj. See <component> above getComponentProps: function(result){ var vObj = this; switch(vObj.rectype){ case "exhibitor": return { "exhid" : result.MYS.exhid_l, "exhname" : result.MYS.exhname_t, "description" : result.MYS.exhdesc_t, "categories" : result.MYS.categories_ta, "categoryids" : result.MYS.categoryid_la, "booths" : result.MYS.booths_la, "boothsdisplay" : result.MYS.boothsdisplay_la, "hallids" : result.MYS.hallid_la, "logo" : vObj.displayLogoURL(result.MYS.exhlogo_t), "slotted" : result.MYS.exhslotted_t, "addedtoplanner" : result.MYS.MYS.addedtoplanner, "search" : result.MYS.search, "searchtype" : result.MYS.searchtype, "searchtypedisplay" : result.MYS.searchtypedisplay, "isrecommendation" : true } break; case "session": var tempresult = { "title":result.MYS.title , "tracktitle":result.MYS.tracktitle , "location":result.MYS.location , "description":result.MYS.description , "scheduledate":result.MYS.scheduledate , "scheduleid":result.MYS.scheduleid , "schedulestarttime":result.MYS.starttime , "scheduleendtime":result.MYS.endtime , "addedtoplanner":result.MYS.addedtoplanner, "allowadd": vObj.bitToBool(result.MYS.allowadd), "backgroundcolorhexarray": [], "textcolorhexarray": [], "showfulldate": true, "isrecommendation" : true }; if ("MYS" in result && "backgroundcolorhexarray" in result.MYS){ tempresult["backgroundcolorhexarray"] = result.MYS.backgroundcolorhexarray; } if ("MYS" in result && "textcolorhexarray" in result.MYS){ tempresult["textcolorhexarray"] = result.MYS.textcolorhexarray; } return tempresult; break; } }, closeModal: function(){ this.$emit('close-modal'); }, loadRecs: function(){ var vObj = this; var overriderecstatusstring = ""; vObj.loading = true; if (overriderecstatus.length > 0){ overriderecstatusstring = "&recstatus=" + overriderecstatus; } if (vObj.hasLocalStorage()){ requestString = localStorage.getItem("userinterests"); vObj.resetRecommendedResults(); // ajaxJsonPost() defined in _global-mixin vObj.ajaxJsonPost(vObj.path2approot + '/ajax/remote-proxy.cfm?action=recommended' + overriderecstatusstring + '&returntype=' + vObj.rectype + '&from=modal', requestString, function(response){ // success vObj.loading = false; if (vObj.rectype == "session"){ vObj.recommendedresults["results"] = response["DATA"].results[vObj.rectype].filteredbuckets; } else { vObj.recommendedresults["results"] = response["DATA"].results[vObj.rectype].filteredbuckets; } vObj.recommendedresults["totalhits"] = response["DATA"].totalhitsfiltered; // now mark new recs as new if (vObj.hasLocalStorage() ){ localStorage.setItem("hasnewrecommendations", false); } }, function(response){ // error vObj.loading = false; vObj.showMessage("error", vObj.content.errorLoadingRecommendations); }); // end ajaxJsonPost } }, openModal: function(){ this.loadRecs(); }, onToggleFavorite: function(){ this.openModal(); }, startDismissTip: function(){ var recommendationsIntroShown = localStorage.getItem('vts_recommendation_dismiss_shown') == 'true'; if (recommendationsIntroShown) return; var intro2 = introJs(".o-Recommendation_Dismiss"); intro2.setOptions({ showBullets: false }) intro2.start(); intro2.oncomplete(function() { localStorage.setItem('vts_recommendation_dismiss_shown', 'true'); }) intro2.onexit(function() { localStorage.setItem('vts_recommendation_dismiss_shown', 'true'); }) }, dismissRec: function(result){ var vObj = this; var actionvalue; if (vObj.rectype == "session"){ actionvalue = result.MYS.scheduleid_l; } else { actionvalue = result.MYS.exhid_l; } if (vObj.isloggedinmyshow){ // ajaxGet() defined in _global-mixin vObj.ajaxGet(vObj.path2approot + '/ajax/remote-proxy.cfm?action=recommended' + "&type=" + vObj.rectype + '&actionvalue=' + actionvalue + '&returntype=dismiss', // ajaxGet() defined in _global-mixin function(response){ // success vObj.loading = false; vObj.openModal(); }, function(error){ // error vObj.loading = false; vObj.showMessage("error", "Error dismissing recommendation"); }); // end ajaxGet } else { // add tooltip vObj.startDismissTip(); } return false; }, // TODO :: STEPHEN :: Should this be self contained in a mixin? This is a copy of what's happening in session search results display getSessionsBySchedule: function(results){ var returnArray = []; var vObj = this; for (var i = 0; i < results.length; i++){ for (var j = 0; j < results[i].MYS.scheduleid_la.length; j++){ var tracktitle = '' if ('tracktitle_la' in results[i].MYS){ tracktitle = results[i].MYS.tracktitle_la; } var scheduleObj = { scheduleid: results[i].MYS.scheduleid_la[j], location: results[i].MYS.schedulelocation_ta[j], title: results[i].MYS.sessiontitle_t, tracktitle: tracktitle, description: results[i].MYS.sessiontitle_t, scheduledate: vObj.toDate(results[i].MYS.scheduledate_da[j]), starttime: vObj.toDate(results[i].MYS.schedulestarttime_da[j]), endtime: vObj.toDate(results[i].MYS.scheduleendtime_da[j]), addedtoplanner: results[i].MYS.addedtoplanner_la[j] }; returnArray.push(scheduleObj); } } returnArray.sort(function(a,b){ if (a.starttime < b.starttime) return -1; if (a.starttime > b.starttime) return 1; return 0; }); // sort array by date return returnArray; }, clearLocalStorageRecommendationData: function(){ vObj = this; if (vObj.hasLocalStorage()){ localStorage.removeItem('vts_recommendation_first_message_shown'); localStorage.removeItem('vts_recommendation_second_message_shown'); localStorage.removeItem('userinterests'); } } }, computed: { content: function(){ return { recommenendedResultsText: this.displaycontent(this.compincludepath, 'recommenendedResultsText'), closeButtonText: this.displaycontent(this.compincludepath, 'closeButtonText'), exhibitorButtonText: this.displaycontent(this.compincludepath, 'exhibitorButtonText'), sessionButtonText: this.displaycontent(this.compincludepath, 'sessionButtonText'), topSixRecText: this.displaycontent(this.compincludepath, 'topSixRecText'), loginOrCreatePlannerText: this.displaycontent(this.compincludepath, 'loginOrCreatePlannerText'), dontHaveRecsText: this.displaycontent(this.compincludepath, 'dontHaveRecsText'), loadingText: this.displaycontent(this.compincludepath, 'loadingText'), dismssText: this.displaycontent(this.compincludepath, 'dismssText'), errorLoadingRecommendations: this.displaycontent(this.compincludepath, 'errorLoadingRecommendations') }; }, previousRecommendationCounter: function(){ var previousRecommendNumber = this.recommendationCounter - 1; if (previousRecommendNumber < 0) { previousRecommendNumber = 0; } return previousRecommendNumber; }, nextRecommendationCounter: function(){ return this.recommendationCounter + 1; }, shouldShowOnExpoMYS: function(){ return (this.showidlowercase === 'expomys' || this.showidlowercase === 'expomys1' || this.showidlowercase === 'expomys2' || this.showidlowercase === 'expomys3' || this.showidlowercase === 'expomys4' || this.showidlowercase === 'expomys5' || this.showidlowercase === 'imts18'); } } }); </script> <script type="text/x-template" id="contactImageTemplate"> <div> <div v-if="userimage && intersected && !imgerror"> <img class="o-chat_avatar" :class="status.toLowerCase() == 'available' ? 'is-available' : ''" :src="imgsrc" :srcset="srcset" @error="imgerror = true" :alt="username" :width="width" :height="height" v-bind:style="imgStyleObject" /> </div> <div v-else class="contact-image-wrapper" :class="status.toLowerCase() == 'available' ? 'is-available' : ''" style=""> <span class="contact-image-initials" :style="{color: colorlookup[firstinitial]}" :title="username">{{initials}}</span> </div> </div></script> <style> .contact-image-wrapper { background-color: white; background-image: none; border: 1px solid #CCC; border-radius: 50%; display: flex; align-items: center; justify-content: center; margin-right: 12px; width: 48px; height: 48px; } .contact-image-initials { font-weight: bold; font-size: 1.250em; color: #333; text-align: center; } </style> <script> var ContactImage = Vue.component("contact-image", { template:"#contactImageTemplate", props: { username: { default: "", type: String }, userimage: { default: "", type: String }, status: { default: "", type: String }, large: { default: false, type: Boolean }, width: { type: [String, Number], default: "" }, height: { type: [String, Number], default: "" } }, data: function(){ return { compincludepath: "includes/vue/generic/contact-image.cfm", intersected: false, observer: null, imgsrc: "", imgsrc2x: "", imgerror: false } }, mounted: function(){ var vObj = this; vObj.observer = new IntersectionObserver(function(entries) { var image = entries[0]; if (image.isIntersecting) { vObj.intersected = true; vObj.observer.disconnect(); if (vObj.userimage){ var cachedImgPath = vObj.getCachedImgPath(false); var cachedImgPath2x = vObj.getCachedImgPath(true); if (cachedImgPath !== "" && cachedImgPath2x !== ""){ vObj.imgsrc = cachedImgPath; vObj.imgsrc2x = cachedImgPath2x; } else { vObj.ajaxGet(vObj.path2approot + '/ajax/remote-proxy.cfm?action=misc&function=profileimage&image=' + vObj.userimage + '&large=' + vObj.large, // ajaxGet() defined in _global-mixin function(response){ // success if ("url" in response.DATA){ vObj.imgsrc = response.DATA["url"]; vObj.imgsrc2x = response.DATA["url2x"]; vObj.imgerror = false; if (vObj.hasSessionStorage()) { sessionStorage.setItem(vObj.username + "-" + vObj.userimage + "-" + vObj.large, vObj.imgsrc); sessionStorage.setItem(vObj.username + "-" + vObj.userimage + "-" + vObj.large + "-2x", vObj.imgsrc2x); } } }, function(response){ // error }); // end ajaxGet } } } }, {}); vObj.observer.observe(vObj.$el); }, computed:{ content: function(){ return { backToTopText: this.displaycontent(this.compincludepath, 'backToTopText'), }; }, colorlookup: function(){ var colorStruct = {}; colorStruct["?"] = "#9fadad"; colorStruct["A"] = "ff3019"; colorStruct["B"] = "#6b1315"; colorStruct["C"] = "#87b95f"; colorStruct["D"] = "#8c59dd"; colorStruct["E"] = "#8058f8"; colorStruct["F"] = "#8dfb54"; colorStruct["G"] = "#bc0a4e"; colorStruct["H"] = "#685a34"; colorStruct["I"] = "#ed94bb"; colorStruct["J"] = "#9b6371"; colorStruct["K"] = "#58226c"; colorStruct["L"] = "#3c1e38"; colorStruct["M"] = "#b2451e"; colorStruct["N"] = "#3e4f9d"; colorStruct["O"] = "#ba12c8"; colorStruct["P"] = "#e8d247"; colorStruct["Q"] = "#2c1a96"; colorStruct["R"] = "#c4a31b"; colorStruct["S"] = "#35a8a7"; colorStruct["T"] = "#ec8721"; colorStruct["U"] = "#c0547d"; colorStruct["V"] = "#b387b3"; colorStruct["W"] = "#d528d3"; colorStruct["X"] = "#792006"; colorStruct["Y"] = "#10073c"; colorStruct["Z"] = "#5ebf4f"; return colorStruct; }, initials: function(){ var name = this.username.replace(/[^A-z\s]/gi, '').trim(); var tempNameArray = name.split(" "); var nameArray = []; var returnVal = "??"; // trim any empty items from array for (var i = 0; i < tempNameArray.length; i++) { if (tempNameArray[i].trim() !== ""){ nameArray.push(tempNameArray[i].trim()); } } // one element in array and string is 1 char if (nameArray.length == 1 && nameArray[0].length == 1){ returnVal = nameArray[0]; } else if (nameArray.length == 1 && nameArray[0].length > 1){ returnVal = nameArray[0].charAt(0); } else if (nameArray.length == 1 && nameArray[0].length == 2){ // one element in array and the length is 2 characters returnVal = nameArray[0].charAt(0) + nameArray[0].charAt(1); } else if (nameArray.length == 2){ // if there are two elements in the array, get first letter of each returnVal = nameArray[0].charAt(0) + nameArray[1].charAt(0); } else if (nameArray.length >= 3){ // if the array length is >= 3, get letters 1 and 3 returnVal = nameArray[0].charAt(0) + nameArray[2].charAt(0); } return returnVal.toUpperCase(); }, firstinitial: function(){ return this.initials.charAt(0); }, srcset: function(){ if (this.imgsrc2x) { return this.imgsrc2x + " 2x"; } else { return ""; } }, imgStyleObject: function(){ if (this.width && this.height){ return { width: this.width + 'px', height: this.height + 'px' } } else { return {}; } } }, methods: { getCachedImgPath: function(twox){ var vObj = this; var returnURL = ""; var is2xstring = (twox) ? "-2x" : ""; if (vObj.hasSessionStorage()) { var imgurl = sessionStorage.getItem(vObj.username + "-" + vObj.userimage + "-" + vObj.large + is2xstring); if (imgurl){ returnURL = imgurl; } } return returnURL; } } }); </script> <link rel="stylesheet" href="/8_0/assets/css/navbar-v2.css?myscache=20221018A"> <div id="navbar-v2" class="nav--wrapper_outer" :data-hasmyshow="''+hasmyshow" v-cloak> <form ref="logoutform" action="/8_0/login/logout.cfm" method="post" style="display:none;" id="logoutformmys"> <input type="hidden" name="logouttoken" value="7D5C5079DD7B75059794250E16CA780BC0F50921"> <input type="submit" value="Logout" /> </form> <div class="nav--wrapper_inner wrapper" :class="{'is-desktop': navDisplayType === 'desktop', 'is-mobile': navDisplayType === 'mobile'}"> <div class="show-logo" :class="[!showLogoVisible ? 'is-visually-hidden-nav-item' : '']"> <a href="http://www.satshow.com/" class="dim" v-show="showLogoVisible"> <img class="logo" src="/mys_shared/SATELLITE2025/SATELLITE2025_Custom_logo.png?breakcache=38E01A99-F114-F931-E7E5A9E756251CD9" srcset="/mys_shared/SATELLITE2025/SATELLITE2025_Custom_logo@2x.png?breakcache=38E01A9A-FDF5-1D88-315E43CA6E8AB7D9 2x" width="200" height="70" alt="SATELLITE 2025 logo"> </a> <ul class="show-info list" :class="[showInfoVisible ? '' : 'is-hidden']"> <li class="show-date"> March 10-13, 2025 </li> <li class="show-location">Walter E. Washington</li> <li class="show-optional_text">Washington, D.C.</li> </ul> </div> <nav id="nav" class="navigation--wrapper l-nav" :class="[mobileMenuOpen ? 'is-open' : '', isLoggedIntoMyShow ? 'is-loggedin' : '']" aria-label="Primary"> <button id="js-toggle-nav" class="btn-toggle btn-tertiary o-mobile-menu_button" v-show="navDisplayType === 'mobile'" :aria-expanded="mobileMenuOpen.toString()" aria-controls="js-nav" aria-haspopup="true" @click.prevent="toggleMobileMenu()"> <span class="hamburger__text"> Menu</span> <span aria-hidden="true" id="js-toggle-icon" class="hamburger" :class="mobileMenuOpen ? 'hamburger--open' : ''"> <span class="hamburger__inner"></span> </span> </button> <button v-if="hasmyshow" class="btn-avatar btn-reset" v-show="navDisplayType === 'mobile'" @click.prevent="toggleProfileActionsMenu" alt="Log In or Create a Free Planner"> <a v-if="!isLoggedIntoMyShow" class="bb-0" @click="openModal()"> <svg width="22" height="25" xmlns="http://www.w3.org/2000/svg" class="o-bell_icon ml2"><path d="M17.667 8.3a6.87 6.87 0 0 0-1.953-4.808A6.6 6.6 0 0 0 11 1.5a6.601 6.601 0 0 0-4.714 1.992A6.87 6.87 0 0 0 4.333 8.3C4.333 16.233 1 18.5 1 18.5h20s-3.333-2.267-3.333-10.2ZM13 22.5a2.186 2.186 0 0 1-.846.732A2.588 2.588 0 0 1 11 23.5c-.405 0-.803-.092-1.154-.268A2.186 2.186 0 0 1 9 22.5" fill="transparent" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg> </a> <div v-if="hasnewrecommendations && isLoggedIntoMyShow" class="o-nav_avatar_recommendation"></div> <svg v-if="isLoggedIntoMyShow" class="dib ml1 o-arrow_down_svg" :class="profileActionsMenuOpen ? 'rotated-up' : ''" width="13" height="8" xmlns="http://www.w3.org/2000/svg" aria-describedby="arrow-down-title" role="img"> <title id="arrow-down-title">See more links</title> <path fill-rule="nonzero" d="M0 1.665L1.532.25l4.97 4.67L11.468.25 13 1.665 6.502 7.75z"></path> </svg> </button> <span v-if="navDisplayType === 'mobile' && hasmyshow" id="js-profile-actions_dropdown" class="o-profile-actions_dropdown" :class="profileActionsMenuOpen ? 'animated fadeIn' : 'dn'"> <div v-if="isLoggedIntoMyShow" class="o-profile-actions_dropdown_inner"> <div class="pa3 pt2 pb2"> <span class="db"> <svg width="19" height="20" fill="none" xmlns="http://www.w3.org/2000/svg" class="o-planner_icon"><path fill-rule="evenodd" clip-rule="evenodd" d="M9.514.176a.833.833 0 0 0-1.025 0L.321 6.54A.833.833 0 0 0 0 7.197v10a2.653 2.653 0 0 0 2.648 2.652h12.706a2.647 2.647 0 0 0 2.649-2.652v-10c0-.257-.119-.5-.321-.657L9.514.176Zm3.043 18.006h2.797a.98.98 0 0 0 .982-.985V7.604L9.001 1.89 1.667 7.604v9.593a.986.986 0 0 0 .981.985h2.797V9.924c0-.46.374-.833.834-.833h5.445c.46 0 .833.373.833.833v8.258Zm-5.445 0h3.779v-7.424H7.112v7.424Z" /></svg> <a href="/8_0/myshow/index.cfm" target="" class="dim dib bb-0 ml2">My Planner</a> </span> <span class="db"> <svg width="20" height="21" fill="none" xmlns="http://www.w3.org/2000/svg" class="o-profile_icon"><g clip-path="url(#a)" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13.348a2.5 2.5 0 1 0 0-5 2.5 2.5 0 0 0 0 5Z"/><path d="M16.167 13.348a1.375 1.375 0 0 0 .275 1.517l.05.05a1.666 1.666 0 0 1-.541 2.72 1.669 1.669 0 0 1-1.818-.362l-.05-.05a1.375 1.375 0 0 0-1.516-.274 1.375 1.375 0 0 0-.834 1.258v.142a1.667 1.667 0 0 1-3.333 0v-.076a1.375 1.375 0 0 0-.9-1.258 1.374 1.374 0 0 0-1.517.275l-.05.05a1.668 1.668 0 1 1-2.358-2.358l.05-.05a1.375 1.375 0 0 0 .275-1.517 1.375 1.375 0 0 0-1.258-.833H2.5a1.667 1.667 0 0 1 0-3.334h.075a1.375 1.375 0 0 0 1.258-.9 1.375 1.375 0 0 0-.275-1.516l-.05-.05a1.667 1.667 0 1 1 2.359-2.359l.05.05a1.375 1.375 0 0 0 1.516.275H7.5a1.375 1.375 0 0 0 .833-1.258v-.142a1.667 1.667 0 0 1 3.334 0v.075a1.375 1.375 0 0 0 .833 1.259 1.375 1.375 0 0 0 1.517-.275l.05-.05a1.667 1.667 0 1 1 2.358 2.358l-.05.05a1.375 1.375 0 0 0-.275 1.517v.066a1.376 1.376 0 0 0 1.258.834h.142a1.667 1.667 0 1 1 0 3.333h-.075a1.375 1.375 0 0 0-1.258.833v0Z"/></g><defs><clipPath id="a"><path fill="#fff" transform="translate(0 .849)" d="M0 0h20v20H0z"/></clipPath></defs></svg> <a href="/8_0/myshow/preview.cfm" target="" class="dim dib bb-0 ml2">My Profile</a> </span> <span class="db"> <svg width="18" height="21" fill="none" xmlns="http://www.w3.org/2000/svg" class="o-recommendations_icon"><path fill-rule="evenodd" clip-rule="evenodd" d="M9 .849c-.827 0-1.647.164-2.41.484a6.295 6.295 0 0 0-2.045 1.38A6.369 6.369 0 0 0 3.18 4.778c-.317.772-.48 1.6-.48 2.436 0 3.047-.644 4.941-1.239 6.042-.3.553-.59.917-.792 1.132a2.7 2.7 0 0 1-.275.257l-.003.002a.908.908 0 0 0-.35 1.02.909.909 0 0 0 .325.462.893.893 0 0 0 .535.177h16.198c.193 0 .38-.062.535-.177a.909.909 0 0 0 .316-1.03.909.909 0 0 0-.34-.452l-.003-.002a2.702 2.702 0 0 1-.275-.257 5.403 5.403 0 0 1-.792-1.132c-.594-1.102-1.24-2.995-1.24-6.042 0-.836-.163-1.664-.48-2.436a6.37 6.37 0 0 0-1.365-2.065 6.297 6.297 0 0 0-2.044-1.38A6.244 6.244 0 0 0 9 .849Zm5.96 13.278c.068.126.137.246.205.36H2.835c.069-.114.138-.234.206-.36.756-1.399 1.46-3.597 1.46-6.913a4.57 4.57 0 0 1 1.342-3.17 4.476 4.476 0 0 1 3.158-1.306c1.181 0 2.315.47 3.157 1.307A4.57 4.57 0 0 1 13.5 7.214c0 3.317.704 5.514 1.46 6.913Zm-6.739 4.45a.892.892 0 0 0-1.226-.324.917.917 0 0 0-.33 1.236c.238.414.578.757.988.995a2.679 2.679 0 0 0 2.695 0c.41-.238.75-.581.988-.995a.916.916 0 0 0-.327-1.242.892.892 0 0 0-1.23.33.906.906 0 0 1-.778.452.894.894 0 0 1-.779-.452Z" /></svg> <a href="/8_0/myshow/index.cfm?s=recommendations" target="" class="dim dib bb-0 ml2">Recommendations</a> </span> <span class="db"> <svg width="20" height="21" fill="none" xmlns="http://www.w3.org/2000/svg" class="o-logout_icon"><path d="M7.5 18.349H4.167A1.667 1.667 0 0 1 2.5 16.681V5.015A1.667 1.667 0 0 1 4.167 3.35H7.5M13.333 15.015l4.167-4.167-4.167-4.166M17.5 10.848h-10" stroke-linecap="round" stroke-linejoin="round" /></svg> <button class="btn-reset dim dib bb-0 ml2" @click="logout">Sign Out</button> </span> </div> </div> </span> <ul id="js-nav" class="main-navigation" :class="mobileMenuOpen ? '' : 'is-visually-hidden'"> <li class="" id="link-exhibitorsearch" > <a class="link js-nav_width" href="/8_0/index.cfm" target=""> <span class="link_hover">Home</span> </a> </li> <li class="" id="link-exhibitoralpha2" > <a class="link js-nav_width" href="/8_0/explore/exhibitor-gallery.cfm?nav=1" target=""> <span class="link_hover">Exhibitors and Sponsors</span> </a> </li> <li class="" id="link-floorplan" > <a class="link js-nav_width is-selected" href="/8_0/floorplan/" target=""> <span class="link_hover">Floor Plan</span> </a> </li> <li class="" id="link-40636233-A848-BBFB-ADE4132F52779B3E" > <a class="link js-nav_width" href="http://www.satshow.com/" target=""> <span class="link_hover">SATELLITE Website</span> </a> </li> <li v-if="hasmyshow" id="link-myshowavatar" :class="[navDisplayType === 'mobile' && isLoggedIntoMyShow ? 'is-visually-hidden-nav-item' : '']" @mouseover="openTogglePlannerMenu" @mouseleave="closeTogglePlannerMenu"> <button class="o-nav_avatar_button link" aria-controls="js-profile-actions_dropdown" alt="Log In or Create a Free Planner"> <a v-if="!isLoggedIntoMyShow" href="/8_0/login/login.cfm" class="link_hover dib js-nav_width"> My Show Planner </a> <span v-show="navDisplayType === 'desktop'" class="o-profile-image_wrapper"> <div v-if="hasnewrecommendations && isLoggedIntoMyShow" class="o-nav_avatar_recommendation"></div> </span> <span v-if="isLoggedIntoMyShow" class="link_hover o-arrow_down"> <svg class="dib ml1 o-arrow_down_svg" :class="profileActionsMenuOpen ? 'rotated-up' : ''" width="13" height="8" xmlns="http://www.w3.org/2000/svg" aria-describedby="arrow-down-title" role="img"> <title id="arrow-down-title">See more links</title> <path fill-rule="nonzero" d="M0 1.665L1.532.25l4.97 4.67L11.468.25 13 1.665 6.502 7.75z"></path> </svg> </span> <a v-if="!isLoggedIntoMyShow" :class="[navDisplayType === 'mobile' ? 'is-visually-hidden-nav-item' : '']" class="dim dib bb-0 b" @click="openModal()"> <svg width="22" height="25" xmlns="http://www.w3.org/2000/svg" class="o-bell_icon ml2"><path d="M17.667 8.3a6.87 6.87 0 0 0-1.953-4.808A6.6 6.6 0 0 0 11 1.5a6.601 6.601 0 0 0-4.714 1.992A6.87 6.87 0 0 0 4.333 8.3C4.333 16.233 1 18.5 1 18.5h20s-3.333-2.267-3.333-10.2ZM13 22.5a2.186 2.186 0 0 1-.846.732A2.588 2.588 0 0 1 11 23.5c-.405 0-.803-.092-1.154-.268A2.186 2.186 0 0 1 9 22.5" fill="transparent" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg> </a> </button> <span id="js-profile-actions_dropdown" class="o-profile-actions_dropdown" :class="profileActionsMenuOpen ? 'animated fadeIn' : 'dn'"> <div class="o-profile-actions_dropdown_spacer"></div> <div v-if="isLoggedIntoMyShow" class="o-profile-actions_dropdown_inner"> <div class="pa3 pt2 pb2"> <span class="db"> <svg width="19" height="20" fill="none" xmlns="http://www.w3.org/2000/svg" class="o-planner_icon"><path fill-rule="evenodd" clip-rule="evenodd" d="M9.514.176a.833.833 0 0 0-1.025 0L.321 6.54A.833.833 0 0 0 0 7.197v10a2.653 2.653 0 0 0 2.648 2.652h12.706a2.647 2.647 0 0 0 2.649-2.652v-10c0-.257-.119-.5-.321-.657L9.514.176Zm3.043 18.006h2.797a.98.98 0 0 0 .982-.985V7.604L9.001 1.89 1.667 7.604v9.593a.986.986 0 0 0 .981.985h2.797V9.924c0-.46.374-.833.834-.833h5.445c.46 0 .833.373.833.833v8.258Zm-5.445 0h3.779v-7.424H7.112v7.424Z" /></svg> <a href="/8_0/myshow/index.cfm" target="" class="dim dib bb-0 ml2">My Planner</a> </span> <span class="db"> <svg width="20" height="21" fill="none" xmlns="http://www.w3.org/2000/svg" class="o-profile_icon"><g clip-path="url(#a)" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13.348a2.5 2.5 0 1 0 0-5 2.5 2.5 0 0 0 0 5Z"/><path d="M16.167 13.348a1.375 1.375 0 0 0 .275 1.517l.05.05a1.666 1.666 0 0 1-.541 2.72 1.669 1.669 0 0 1-1.818-.362l-.05-.05a1.375 1.375 0 0 0-1.516-.274 1.375 1.375 0 0 0-.834 1.258v.142a1.667 1.667 0 0 1-3.333 0v-.076a1.375 1.375 0 0 0-.9-1.258 1.374 1.374 0 0 0-1.517.275l-.05.05a1.668 1.668 0 1 1-2.358-2.358l.05-.05a1.375 1.375 0 0 0 .275-1.517 1.375 1.375 0 0 0-1.258-.833H2.5a1.667 1.667 0 0 1 0-3.334h.075a1.375 1.375 0 0 0 1.258-.9 1.375 1.375 0 0 0-.275-1.516l-.05-.05a1.667 1.667 0 1 1 2.359-2.359l.05.05a1.375 1.375 0 0 0 1.516.275H7.5a1.375 1.375 0 0 0 .833-1.258v-.142a1.667 1.667 0 0 1 3.334 0v.075a1.375 1.375 0 0 0 .833 1.259 1.375 1.375 0 0 0 1.517-.275l.05-.05a1.667 1.667 0 1 1 2.358 2.358l-.05.05a1.375 1.375 0 0 0-.275 1.517v.066a1.376 1.376 0 0 0 1.258.834h.142a1.667 1.667 0 1 1 0 3.333h-.075a1.375 1.375 0 0 0-1.258.833v0Z"/></g><defs><clipPath id="a"><path fill="#fff" transform="translate(0 .849)" d="M0 0h20v20H0z"/></clipPath></defs></svg> <a href="/8_0/myshow/preview.cfm" target="" class="dim dib bb-0 ml2">My Profile</a> </span> <span class="db"> <svg width="18" height="21" fill="none" xmlns="http://www.w3.org/2000/svg" class="o-recommendations_icon"><path fill-rule="evenodd" clip-rule="evenodd" d="M9 .849c-.827 0-1.647.164-2.41.484a6.295 6.295 0 0 0-2.045 1.38A6.369 6.369 0 0 0 3.18 4.778c-.317.772-.48 1.6-.48 2.436 0 3.047-.644 4.941-1.239 6.042-.3.553-.59.917-.792 1.132a2.7 2.7 0 0 1-.275.257l-.003.002a.908.908 0 0 0-.35 1.02.909.909 0 0 0 .325.462.893.893 0 0 0 .535.177h16.198c.193 0 .38-.062.535-.177a.909.909 0 0 0 .316-1.03.909.909 0 0 0-.34-.452l-.003-.002a2.702 2.702 0 0 1-.275-.257 5.403 5.403 0 0 1-.792-1.132c-.594-1.102-1.24-2.995-1.24-6.042 0-.836-.163-1.664-.48-2.436a6.37 6.37 0 0 0-1.365-2.065 6.297 6.297 0 0 0-2.044-1.38A6.244 6.244 0 0 0 9 .849Zm5.96 13.278c.068.126.137.246.205.36H2.835c.069-.114.138-.234.206-.36.756-1.399 1.46-3.597 1.46-6.913a4.57 4.57 0 0 1 1.342-3.17 4.476 4.476 0 0 1 3.158-1.306c1.181 0 2.315.47 3.157 1.307A4.57 4.57 0 0 1 13.5 7.214c0 3.317.704 5.514 1.46 6.913Zm-6.739 4.45a.892.892 0 0 0-1.226-.324.917.917 0 0 0-.33 1.236c.238.414.578.757.988.995a2.679 2.679 0 0 0 2.695 0c.41-.238.75-.581.988-.995a.916.916 0 0 0-.327-1.242.892.892 0 0 0-1.23.33.906.906 0 0 1-.778.452.894.894 0 0 1-.779-.452Z" /></svg> <a href="/8_0/myshow/index.cfm?s=recommendations" target="" class="dim dib bb-0 ml2">Recommendations</a> </span> <span class="db"> <svg width="20" height="21" fill="none" xmlns="http://www.w3.org/2000/svg" class="o-logout_icon"><path d="M7.5 18.349H4.167A1.667 1.667 0 0 1 2.5 16.681V5.015A1.667 1.667 0 0 1 4.167 3.35H7.5M13.333 15.015l4.167-4.167-4.167-4.166M17.5 10.848h-10" stroke-linecap="round" stroke-linejoin="round" /></svg> <button class="btn-reset dim dib bb-0 ml2" @click="logout" class="">Sign Out</button> </span> </div> </div> </span> </li> </ul> <recommendations-modal v-bind:showmodal="showModal" v-bind:rectype="'exhibitor'" v-bind:isloggedinmyshow="false" v-on:close-modal="closeModal()"> </recommendations-modal> </nav> </div> </div> <div id="mobileSearchFormDiv" class="mys-form-flex-wrapper mys-form-floorplan-search-default mys-is-hidden-md"> <div class="mys-hero"> <form action=""> <a class="mys-large" id="floorPlanMobileSearchToggle" href="#0" title="Expand Search Options"> <div class="mys-form-flex"> <span class="mys-ico-actions mys-vert-align-middle mys-link-color"></span> <strong>Search</strong> <p class="mys-hall-name-preview mys-large mys-align-right" id="floorPlanMobileSearchHallDisplay"></p> </div> </a> <div class="mys-toggleShow jq-toggleShow mys-display-none" id="floorPlanMobileSearchDiv" style="display: none;"> <div class="mys-insideToggle"> <div class="mys-form-flex"> <a class="mys-btn mys-primary mys-btn-nav jq-disabled" href="#" id="floorplan-mobile-listview-button">List View</a> <a class="mys-btn mys-primary mys-btn-nav" href="/8_0/index.cfm">New Search</a> </div> <div class="mys-form-flex"> <select id="hallIDSelectMobile" class="fm-Select"></select> </div> <div class="mys-form-flex"> <a class="mys-form-button-options mys-btn mys-tertiary jq-mys-legend"><span class="mys-ico-info-i mys-ico-large"></span> </a> <a class="mys-form-button-options mys-btn mys-tertiary jq-mys-options"><span class="mys-ico-eye-options mys-ico-large"></span> </a> </div> </div> </div> </form> <form name="mys_langset" id="mys-langsetMobile" action="/8_0/floorplan/index.cfm;jsessionid=9C9E8A1079206BFB9568EFECDE479979.vts?CFID=52097315&CFTOKEN=6e01a365c5fd09c4-38DFFEDB-941D-A892-8AE419133BB3AC4C" method="get"> <input type="hidden" name="locale" id="mobileLocale" value="" /> </form> </div> </div> <header class="mys-floor-plan-header "> <div class="nav-search-wrapper"> <div class="mys-form-flex-wrapper mys-form-floorplan-search"> <div id="searchMessageDiv" class="mys-alert-error mys-display-none"> <ul> <a id="searchMessageA" class="mys-alert-close" href="#0" title="Close">x</a> <li id="searchMessageLi"> Search requires 2 characters minimum. </li> </ul> </div> <div class="mys-form-flex"> <select id="searchTypeDropdown" class="mys-form-select mys-form-filter"> <option value="getExhibitorsByKeyword" data-search-type="keyword" data-stats-user-action="Keyword Search" data-stats-alt-value="[[recordCount]]" data-placeholder="Search by Keyword" > Keyword </option> <option value="getExhibitorsByExhibitorName" data-search-type="exhibitorname" data-stats-user-action="Exhibitor Name Search" data-stats-alt-value="[[recordCount]]" data-placeholder="" > Exhibitor Name </option> <option value="getExhibitorsByCategory" data-search-type="category" data-search-option-function="getExhibitorCategories" data-stats-user-action="Product selected" data-stats-alt-value="Multiselect:" data-placeholder="Search by Category" > Category </option> <option value="getExhibitorsByBooth" data-search-type="booth" data-stats-user-action="Booth Search" data-stats-alt-value="[[recordCount]]" data-placeholder="Search by Booth" > Booths </option> <option value="getExhibitorsByNewExhibitors" data-search-type="newexhibitors" data-auto-search data-stats-user-action="Exhibitor List" data-stats-alt-value="[[recordCount]]" data-stats-action-value="New Exhibitor" data-placeholder="" > New Exhibitors </option> </select> <input id="floorplan-search-input" class="jq-searchfield jq-search-query mys-form-input mys-form-search" type="search" placeholder="Search by Keyword" /> <div id="chosenMultiselect" class="mys-form-multiselect mys-form-chosen" style="display: none;"> <select id="floorplan-search-value-select" class="chosen-select" multiple="multiple" data-placeholder="Begin typing or click for options"></select> </div> <input id="floorplan-search-button" class="mys-form-button-submit mys-btn mys-primary" type="submit" value="Search"> </div> </div> </div> </header> <script> if (window.jQuery) { var V = $.Velocity; } else { var V = Velocity; } if (typeof $ !== 'undefined') { V = $.Velocity; } else { V = Velocity; } if (typeof Velocity !== 'undefined'){ V = Velocity; } // staggered transition mixins var staggeredTransitionsMixin = { data: function(){ return { timeoutIntervalIDs: [], alreadyVisibleCount: 0 } }, methods: { beforeEnterStaggered: function (el) { //el.style.opacity = 0 }, enterStaggered: function (el, done) { done(); /*var delayOffset = 25 , delay , intervalID , maxopacity = 1; if ( "dataset" in el && "searchsize" in el.dataset && "index" in el.dataset){ delay = (el.dataset.index % el.dataset.searchsize) * delayOffset; } else if ( "dataset" in el && "totalitemcount" in el.dataset && "index" in el.dataset){ delay = (el.dataset.index * 1/el.dataset.totalitemcount) * delayOffset; } else { if ("dataset" in el && "index" in el.dataset){ delay = el.dataset.index * delayOffset; } else { delay = 1 * delayOffset; } } // get opacity if ("dataset" in el && "maxopacity" in el.dataset){ maxopacity = el.dataset.maxopacity; } intervalID = setTimeout(function () { V( el, { opacity: maxopacity }, { complete: done } ) }, delay); this.timeoutIntervalIDs.push(intervalID);*/ }, leaveStaggered: function (el, done) { done(); /*var delay = el.dataset.index * 25 setTimeout(function () { V( el, { opacity: 0 }, { complete: done } ) }, delay);*/ }, enterCancelled: function(el){ /*for (var i = 0; i < this.timeoutIntervalIDs.length; i++){ clearInterval(this.timeoutIntervalIDs[i]); }*/ } } }; // end staggeredTransitionsMixin </script> <script> /* Set global variable to determine printing state to adjust necesessary styles, such as removing IntersectionObserver() so content is rendered when printing */ window.idsIsPrinting = false; window.addEventListener('beforeprint', function(){ window.idsIsPrinting = true; }); window.addEventListener('afterprint', function(){ window.idsIsPrinting = false; }); </script> <script> var VueMYS = {}; VueMYS.install = function(Vue, options){ Vue.MYS = {}; Vue.MYS.exhibitorTags = [{"color":"bg-color-brand-09","title":"Products"},{"color":"bg-color-accent-05","title":"Press Releases"},{"color":"bg-light-silver","title":"Business Cards"}]; Vue.MYS.trackcss = {}; Vue.MYS.isValidURL = function(str){ // https://stackoverflow.com/questions/5717093/check-if-a-javascript-string-is-a-url var pattern = new RegExp('^(https?:\\/\\/)?'+ // protocol '((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|'+ // domain name '((\\d{1,3}\\.){3}\\d{1,3}))'+ // OR ip (v4) address '(\\:\\d+)?(\\/[-a-z\\d#%_.~+]*)*'+ // port and path '(\\?[;&a-z\\d%_.~+=-]*)?'+ // query string '(\\#[-a-z\\d_]*)?$','i'); // fragment locator return !!pattern.test(str); }; Vue.MYS.productsVoting = []; Vue.MYS.settingsConfig = {"timesettings":{"timezonelabel":"Eastern Time (US & Canada)","showtimezone":false},"spotlightsettings":{"spotlightcount":3},"exhibitorsettings":{"sendemail":[]},"numconcurrentmeetings":5,"schedulepage":{"topsection":"disabled","rotatetop":[],"searchtypes":["Sessions","Guest Appearances"],"days":7,"topdisplay":"date","rotatetime":7,"happeningtoday":"daily","hours":2,"livestreamoption":"youtube","sessions":{"display":"freetext","secondaryfilter":"disabled","texten":"Sessions"},"guestappearances":{"display":"freetext","secondaryfilter":"disabled","texten":"Exhibitor Scheduled Event"},"homepage":false,"liveevents":{"display":"freetext","secondaryfilter":"disabled","texten":"Exhibitor Interactive Demo"},"restricttop":[]},"alertsettings":{"liveeventalerts":"none","sessionalerts":"none"},"sessionsettings":{},"searchsettings":{"hidechildsessions":false,"hideoriginaltimes":false,"defaultsearchview":"grid","hidesessionlocations":false,"hidesessiontimes":false,"myshowincludesessionexhibitors":false,"hideallresults":true}}; Vue.MYS.useExhSubVersion3 = false; Vue.MYS.useExhSubVersion2 = true; Vue.MYS.exhSubVersion = 02; Vue.MYS.sessionSubVersion = 02; Vue.MYS.validRooms = []; Vue.MYS.validHalls = ["A"]; Vue.MYS.altregid = ""; Vue.MYS.regtype = ""; Vue.MYS.genericKey = "production/satellite2025"; Vue.MYS.seatrestriction = false; Vue.MYS.allowedschedules = []; Vue.MYS.lockdown = false; Vue.MYS.getTimezoneDisplay = function(){ if ("timesettings" in Vue.MYS.settingsConfig && "showtimezone" in Vue.MYS.settingsConfig.timesettings && Vue.MYS.settingsConfig.timesettings.showtimezone) { if ("timezonelabelen" in Vue.MYS.settingsConfig.timesettings) { return Vue.MYS.settingsConfig.timesettings["timezonelabelen"]; } else { return ""; } } else { return ""; } }; Vue.MYS.getActiveVotingRound = function(showtime){ return false; }; Vue.MYS.getShowDateTime = function(){ var dt = new Date(); var returnDate = new Date(dt.getTime() + Vue.MYS.compareToShowDate(dt)); return returnDate; }; Vue.MYS.compareToShowDate = function(datetocompare) { // Get the current date for the user, JS gets the date in the user's time zone var currentdate = new Date(); // Get the offset for the current user based on where they are and add it back in. This will calculate their time in UTC time // currentdate.getTimezoneOffset() will return how far off the user is from UTC time // Add in the show's offset and that will calculate the user's time from UTC in the show's timezone // this.timezoneoffset will be the show's offset value var currentdateinshowtimezone = new Date(currentdate.getTime() + (-300 + currentdate.getTimezoneOffset()) * 60000); var isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream; var isSafari = !!navigator.userAgent.match(/Version\/[\d\.]+.*Safari/); var getVersion = navigator.userAgent.replace(/(.*)Version\//,"") var version = getVersion.substr(0, getVersion.indexOf(" ")); if((isSafari && parseFloat(version) < 14) || (isIOS && (window.navigator.userAgent.search('OS 13') > -1 || window.navigator.userAgent.search('OS X 10') > -1 || window.navigator.userAgent.search('OS 12') > -1 || window.navigator.userAgent.search('OS 11') > -1))) { var datetocompare = new Date(datetocompare.getTime() + (datetocompare.getTimezoneOffset() * 60000)); } return currentdateinshowtimezone.getTime() - datetocompare.getTime(); }; Vue.MYS.isAjaxSuccess = function(response){ if ("SUCCESS" in response && response.SUCCESS){ return true; } else { return false; } }; Vue.MYS.getAjaxErrors = function(response){ if ("ERRORS" in response && response.ERRORS.length > 0) { return response.ERRORS; } else { return response; } }; Vue.MYS.ajaxPost = function(url, formData, successCallback, errorCallback, keepalive){ keepalive = typeof keepalive !== 'undefined' ? keepalive : false; fetch(url, { method: "POST", body: formData, headers: { "X-Requested-With": "XMLHttpRequest" }, credentials:'include', redirect: "manual", keepalive: keepalive }) .then(function(fetchResponse) { fetchResponse.json() .then(function(response){ if (Vue.MYS.isAjaxSuccess(response)){ successCallback(response); } else { errorCallback(response); } }) .catch(function(error){ errorCallback(error); }); }) .catch(function (error) { console.log(error); errorCallback(error); }); }; Vue.MYS.formatSpeakerName = function(result, keynote) { var speakerName = Vue.MYS.settingsConfig.searchsettings.speakernamedisplay; if(keynote) { var replacements = { PREFIX: result.prefix || '', SUFFIX: result.suffix || '', FIRSTNAME: result.firstname || '', LASTNAME: result.lastname || '', MIDDLENAME: result.middlename || '', }; } else { var replacements = { PREFIX: result.fields.speakerprefix_t || '', SUFFIX: result.fields.speakersuffix_t || '', FIRSTNAME: result.fields.speakerfname_t || '', LASTNAME: result.fields.speakerlname_t || '', MIDDLENAME: result.fields.speakermname_t || '', }; } for (var [key, value] of Object.entries(replacements)) { if((key == 'SUFFIX' || key == 'LASTNAME') && value.length == 0) { speakerName = speakerName.replaceAll(`[${key}],`, ''); if(key == 'SUFFIX') { speakerName = speakerName.replaceAll(`[LASTNAME],`, '[LASTNAME]'); } } speakerName = speakerName.replaceAll(`[${key}]`, value); } return speakerName.trim(); }; Vue.MYS.sendBeacon = function(url, data) { if (navigator.sendBeacon){ navigator.sendBeacon(url, data); } else { Vue.MYS.ajaxPost(url, data, function(){ /* do nothing */ }, function(){ /* do nothing */ }); } }; Vue.MYS.getServerlessURL = function(s3bucket, s3key, width, height, fit) { var returnurl = "https://d3fv3oe83qat1b.cloudfront.net/"; var sharpparams = {}; sharpparams["bucket"] = s3bucket; sharpparams["key"] = s3key; sharpparams["edits"] = { resize: { width: width, height: height, fit: fit || "contain", quality:"70" } }; returnurl += btoa(JSON.stringify(sharpparams)); return returnurl; }; Vue.MYS.environment = 'production'; }; Vue.use(VueMYS); </script> <script> // https://stackoverflow.com/questions/36170425/detect-click-outside-element Vue.directive('click-outside', { bind: function (el, binding, vnode) { el.clickOutsideEvent = function (event) { // here I check that click was outside the el and his childrens if (!(el == event.target || el.contains(event.target))) { // and if it did, call method provided in attribute value vnode.context[binding.expression](event); } }; document.body.addEventListener('click', el.clickOutsideEvent) }, unbind: function (el) { document.body.removeEventListener('click', el.clickOutsideEvent) }, }); // global mixin Vue.mixin({ data: function() { return { get hasmyshow(){ return true; }, get globalcompincludepath(){ return "includes/vue/mixin/global-mixin.cfm"; }, get hasvalidation() { return true; }, get validated() { return false; }, get showid() { return "SATELLITE2025"; }, get showidlowercase() { return ("SATELLITE2025").toLowerCase(); }, get thispageurl(){ var temppath = "/8_0/floorplan/index.cfm" ; if (temppath === this.path2approot + '/index.cfm'){ return this.path2approot } else { return temppath; } }, get path2approot(){ return "/8_0" }, get httphost(){ return "https://satellite2025.mapyourshow.com" }, get exhibitorrecommendationstatus(){ return "A" }, get sessionrecommendationstatus(){ return "I" }, get regemail(){ return "" }, get availableforchat() { return false }, get hasattendeechat() { return false }, get hasexhibitorchat() { return false }, get hassessiongroupchat() { return true }, get isexhibitor() { return false }, get showbooths(){ return true }, get maxshowbooths(){ return 3 }, get requireboothsfordisplay(){ return false }, get speakernamedisplay(){ return false }, get modules(){ return ["ExhChecklist","Exhibitors","Floorplan","groups","Sessions","Surveying"] }, get hasexhicons(){ return true }, get hasnetworking(){ return false }, get legendcontent(){ return {"COLUMNS":["ICONID","ICONFILE","DISPLAYID","TYPE","COLUMNNAME","DATESTART","DAYSPAN","DISPLAYTEXT","USEFORNEWEXHIBITORFILTER","USEFORGREENFILTER"],"DATA":[[1,"/mys_shared/SATELLITE2025/showfiles/exhicons/New_Exhibitor.png",708,"bit","newexhibitor",null,null,"First Time Exhibitor",true,false],[2,"/mys_shared/SATELLITE2025/showfiles/exhicons/SAT22-Sponsor-Logo.png",127138,"bit","issponsor",null,null,"Sponsor",false,false]]} }, get floorplanactive(){ return true }, get advancedsearchmaxparameters(){ return 10 }, get hassessionconferences(){ return false }, get showsessionconferences(){ return false }, get usefriendlyexhibitorurl(){ return false }, get virtualtradeshow() { return false; }, get timezoneoffset() { return -300; }, get httpreferer() { return ""; } } }, computed:{ exhibitorrecommendationsactive: function(){ var hasExhModule = false; for (var i = 0 ; i < this.modules.length; i++){ if (this.modules[i] == "Exhibitors"){ hasExhModule = true; break; } } return (this.exhibitorrecommendationstatus != "I" && this.exhibitorrecommendationstatus != "X" && hasExhModule) ? true : false; }, sessionrecommendationsactive: function(){ var hasSessModule = false; for (var i = 0 ; i < this.modules.length; i++){ if ((this.modules[i] == "Sessions") || (this.modules[i] == "Conferences")){ hasSessModule = true; } } return (this.sessionrecommendationstatus != "I" && this.sessionrecommendationstatus != "X" && hasSessModule) ? true : false; }, recommendationsactive: function(){ return this.exhibitorrecommendationsactive || this.sessionrecommendationsactive; }, globalcontent: function(){ return this.getContentObject(this.globalcompincludepath); } }, methods: { // this is a function to check if one of the MYS formatted ajax responses is a valid one isAjaxSuccess: function(response){ if ("SUCCESS" in response && response.SUCCESS){ return true; } else { return false; } }, getAjaxErrors: function(response){ if ("ERRORS" in response && response.ERRORS.length > 0) { return response.ERRORS; } else { return response; } }, ajaxGet: function(url, successCallback, errorCallback){ var vObj = this; const controller = new AbortController(); setTimeout(() => controller.abort(), 60000); fetch(url, { headers: {"X-Requested-With": "XMLHttpRequest", "cache-control":"no-cache", "pragma":"no-cache"}, credentials:'include', cache: "no-store", signal: controller.signal }) .then(function(fetchResponse) { fetchResponse.json() .then(function(response){ if (vObj.isAjaxSuccess(response)){ successCallback(response); } else { errorCallback(response); } }) .catch(function(error){ console.log(error); errorCallback(error); }); }) .catch(function (error) { console.log(error); errorCallback(error); }); }, ajaxJsonPost: function(url, jsonString, successCallback, errorCallback){ var vObj = this; const controller = new AbortController(); setTimeout(() => controller.abort(), 60000); fetch(url, { method: "POST", body: jsonString, headers: { "Content-Type": "application/json; charset=utf-8", "X-Requested-With": "XMLHttpRequest" }, credentials:'include', signal: controller.signal }) .then(function(fetchResponse) { fetchResponse.json().then(function(response){ if (vObj.isAjaxSuccess(response)){ successCallback(response); } else { errorCallback(response); } }); }) .catch(function (error) { console.log(error); errorCallback(error); }); }, ajaxPost: function(url, formData, successCallback, errorCallback){ var vObj = this; const controller = new AbortController(); setTimeout(() => controller.abort(), 60000); fetch(url, { method: "POST", body: formData, headers: { "X-Requested-With": "XMLHttpRequest" }, credentials:'include', signal: controller.signal }) .then(function(fetchResponse) { fetchResponse.json().then(function(response){ if (vObj.isAjaxSuccess(response)){ successCallback(response); } else { errorCallback(response); } }); }) .catch(function (error) { console.log(error); errorCallback(error); }); }, getCurrentURL: function(){ return window.location.href.replace(this.httphost, ""); }, displayLogoURL: function(logo){ if (typeof logo !== 'undefined') { return '/mys_shared/' + this.showid + '/logos/' + logo; } else { return ""; } }, displayBannerURL: function(mediafile){ if (typeof mediafile !== 'undefined') { return '/mys_shared/' + this.showid + '/banners/' + mediafile; } else { return ""; } }, goToURL: function(url, newtab){ if(newtab && url) { window.open(url, '_blank'); } else if (url){ window.location = url; } }, displaySearchURL: function(searchtype, search, show){ if (searchtype && search){ return this.httphost + this.path2approot + "/#/searchtype/" + encodeURI(searchtype) + "/search/" + encodeURI(search) + "/show/" + encodeURI(show); } else { return ""; } }, createSummary: function(htmldescription, maxLength){ var text = htmldescription; if (!text || typeof text !== 'string'){ text = ""; } else { // https://stackoverflow.com/questions/45816265/remove-style-tags-globally-using-regex-in-javascript text = text.replace( /((<style>)|(<style type=.+))((\s+)|(\S+)|(\r+)|(\n+))(.+)((\s+)|(\S+)|(\r+)|(\n+))(<\/style>)/g,''); var doc = new DOMParser().parseFromString(text, 'text/html'); text = doc.body.textContent || ""; } if (text && text.length > maxLength){ text = text.substring(0, maxLength) + "..."; } return text; }, scrollToTop: function(){ if (typeof VueScrollTo !== 'undefined' && "scrollTo" in VueScrollTo){ VueScrollTo.scrollTo('#jq-keywordSearchForm'); } }, getScrollPosition: function(){ return window.scrollY || window.scrollTop || document.getElementsByTagName("html")[0].scrollTop; }, saveScrollPosition: function(){ var scrollPos = this.getScrollPosition(); var scrollURL = this.getCurrentURL(); if (this.hasSessionStorage()){ sessionStorage.setItem("scrollPosition", scrollPos); sessionStorage.setItem("scrollURL", scrollURL); } }, storageAvailable: function(type) { try { var storage = window[type], x = '__storage_test__'; storage.setItem(x, x); storage.removeItem(x); return true; } catch(e) { return e instanceof DOMException && ( // everything except Firefox e.code === 22 || // Firefox e.code === 1014 || // test name field too, because code might not be present // everything except Firefox e.name === 'QuotaExceededError' || // Firefox e.name === 'NS_ERROR_DOM_QUOTA_REACHED') && // acknowledge QuotaExceededError only if there's something already stored storage.length !== 0; } }, hasLocalStorage: function(){ var hasLocalStorage = this.storageAvailable('localStorage'); return hasLocalStorage; }, hasSessionStorage: function(){ var hasSessionStorage = this.storageAvailable('sessionStorage'); return hasSessionStorage; }, objectToURLValues: function(obj){ var queryString = Object.keys(obj).map(function(key){ return key + '=' + obj[key] }).join('&'); return queryString; }, // Pass 'log' as second argument to log returned offsets{} (including element) getElementOffset: function(element, log){ var rect = element.getBoundingClientRect(), scrollTop = window.pageYOffset || document.documentElement.scrollTop, scrollLeft = window.pageXOffset || document.documentElement.scrollLeft; var offsets = { element: element, rect: rect, top: rect.top, right: rect.right, bottom: rect.top, left: rect.left, topRelative: rect.top + scrollTop, leftRelative: rect.left + scrollLeft, scrollTop: scrollTop, scrollLeft: scrollLeft, height: rect.height, width: rect.width }; if ((arguments[1] !== undefined) && (arguments[1].toLowerCase() === 'log')) { console.log(offsets); } return offsets; }, toDate: function(date){ var date2; if (date instanceof Date) { date2 = date; } else if (date){ var datePart = (date+"").split('T')[0]; var timePart = (date+"").split('T')[1].replace("Z", ""); if (this.detectIE()){ date2 = new Date(datePart + "T" + timePart); } else if (this.detectSafari()){ date2 = new Date(datePart + "T" + timePart); var myyear = datePart.substring(0, 4)+""; var mymonth = datePart.substring(5, 7)+""; var myday = datePart.substring(8, 10)+""; var newdate = new Date(mymonth + "/" + myday + "/" + myyear + " " + timePart); if (newdate && newdate != 'Invalid Date'){ date2 = newdate; } } else { date2 = new Date(datePart + " " + timePart); } } else { date2 = new Date(); } return date2; }, formatSessionMonth: function(date){ if (!(typeof date.getMonth === 'function')) { date = this.toDate(date); } // var monthNames = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]; var monthNames = [ this.globalcontent.januaryAbbrText , this.globalcontent.februaryAbbrText , this.globalcontent.marchAbbrText , this.globalcontent.aprilAbbrText , this.globalcontent.mayAbbrText , this.globalcontent.juneAbbrText , this.globalcontent.julyAbbrText , this.globalcontent.augustAbbrText , this.globalcontent.septemberAbbrText , this.globalcontent.octoberAbbrText , this.globalcontent.novemberAbbrText , this.globalcontent.decemberAbbrText ]; return monthNames[date.getMonth()]; }, bitToBool: function(bit){ if (bit == 1){ return true; } else { return false; } }, logStats: function(useraction, useractiontype, actionvalue, altvalue, optionvalue) { var optionvalue = optionvalue || ''; var referrer = ''; var AjaxURL = this.path2approot + '/includes/stats.cfm'; this.ajaxGet(AjaxURL + '?useraction=' + useraction + '&useractiontype=' + useractiontype + '&actionvalue=' + encodeURIComponent(actionvalue) + '&altvalue=' + altvalue + '&optionvalue=' + optionvalue + '&referrer=' + referrer, function(response){ // success }, function(response){ // error }); // end ajaxGet }, logAttendance: function(tablename, tablekey, subtablename, subtablekey, meetingkey, action, duringevent, requireplanner) { var AjaxURL = this.path2approot + '/includes/attendancelogs.cfm'; this.ajaxGet(AjaxURL + '?tablename=' + tablename + '&tablekey=' + tablekey + '&subtablename=' + subtablename + '&subtablekey=' + subtablekey + '&meetingkey=' + meetingkey + '&action=' + action + '&duringevent=' + duringevent + '&requireplanner=' + requireplanner, function(response){ // success }, function(response){ // error if(!response.success) { location.reload(true); } }); // end ajaxGet }, formatSessionDay: function(date){ if (!(typeof date.getMonth === 'function')) { date = this.toDate(date); } var weekday = []; weekday[0] = this.globalcontent.sundayText; weekday[1] = this.globalcontent.mondayText; weekday[2] = this.globalcontent.tuesdayText; weekday[3] = this.globalcontent.wednesdayText; weekday[4] = this.globalcontent.thursdayText; weekday[5] = this.globalcontent.fridayText; weekday[6] = this.globalcontent.saturdayText; return weekday[date.getDay()]; }, formatSessionDate: function(date){ if (!(typeof date.getMonth === 'function')) { date = this.toDate(date); } var month = new Array(); month[0] = this.globalcontent.januaryAbbrText; month[1] = this.globalcontent.februaryAbbrText; month[2] = this.globalcontent.marchAbbrText; month[3] = this.globalcontent.aprilAbbrText; month[4] = this.globalcontent.mayAbbrText; month[5] = this.globalcontent.juneAbbrText; month[6] = this.globalcontent.julyAbbrText; month[7] = this.globalcontent.augustAbbrText; month[8] = this.globalcontent.septemberAbbrText; month[9] = this.globalcontent.octoberAbbrText; month[10] = this.globalcontent.novemberAbbrText; month[11] = this.globalcontent.decemberAbbrText; if('us' == 'us') { return this.formatSessionDay(date) + ", " + month[date.getMonth()] + " " + date.getDate()+ " "; } else { return this.formatSessionDay(date) + ", " + date.getDate() + " " + month[date.getMonth()] + " "; } }, getMonthAsString: function(date){ if (!(typeof date.getMonth === 'function')) { date = this.toDate(date); } // var month = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]; var month = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]; var monthcontent = { "Jan": this.globalcontent.januaryAbbrText, "Feb": this.globalcontent.februaryAbbrText, "Mar": this.globalcontent.marchAbbrText, "Apr": this.globalcontent.aprilAbbrText, "May": this.globalcontent.mayAbbrText, "Jun": this.globalcontent.juneAbbrText, "Jul": this.globalcontent.julyAbbrText, "Aug": this.globalcontent.augustAbbrText, "Sep": this.globalcontent.septemberAbbrText, "Oct": this.globalcontent.octoberAbbrText, "Nov": this.globalcontent.novemberAbbrText, "Dec": this.globalcontent.decemberAbbrText }; var monthreturn = monthcontent[month[date.getMonth()]]; return monthreturn; }, formatSessionTime: function(date){ if (!(typeof date.getMonth === 'function')) { date = this.toDate(date); } var weekday = []; weekday[0] = this.globalcontent.sundayAbbrText; weekday[1] = this.globalcontent.mondayAbbrText; weekday[2] = this.globalcontent.tuesdayAbbrText; weekday[3] = this.globalcontent.wednesdayAbbrText; weekday[4] = this.globalcontent.thursdayAbbrText; weekday[5] = this.globalcontent.fridayAbbrText; weekday[6] = this.globalcontent.saturdayAbbrText; var Time = []; Time[0] = "12"; Time[1] = "1"; Time[2] = "2"; Time[3] = "3"; Time[4] = "4"; Time[5] = "5"; Time[6] = "6"; Time[7] = "7"; Time[8] = "8"; Time[9] = "9"; Time[10] = "10"; Time[11] = "11"; Time[12] = "12"; Time[13] = "1"; Time[14] = "2"; Time[15] = "3"; Time[16] = "4"; Time[17] = "5"; Time[18] = "6"; Time[19] = "7"; Time[20] = "8"; Time[21] = "9"; Time[22] = "10"; Time[23] = "11"; var leadingZero = '' if(date.getMinutes() < 10){ leadingZero = '0'; } if(date.getHours() < 12){ newStartTime = /*this.formatSessionDay(date) + ', ' +*/ Time[date.getHours()] + ':' + leadingZero + date.getMinutes() + ' AM'; }else{ newStartTime = /*this.formatSessionDay(date) + ', ' +*/ Time[date.getHours()] + ':' + leadingZero + date.getMinutes() + ' PM'; } return newStartTime; }, isJsonString: function (str) { try { JSON.parse(str); } catch (e) { return false; } return true; }, saveViewState: function(path, section, value){ if (this.hasSessionStorage()){ var requestString = sessionStorage.getItem("resultviewstate"); if (requestString && (this.isJsonString(requestString))){ var viewStateObj = JSON.parse(sessionStorage.getItem("resultviewstate")); } else { var viewStateObj = {}; } if (!(path in viewStateObj)) { viewStateObj[path] = {}; } if (!(section in viewStateObj[path])) { viewStateObj[path][section] = {}; } viewStateObj[path][section] = value; sessionStorage.setItem("resultviewstate", JSON.stringify(viewStateObj)); } }, getViewState: function(path, section){ var returnval = ""; if (this.hasSessionStorage()){ var requestString = sessionStorage.getItem("resultviewstate"); if (requestString && (this.isJsonString(requestString))){ var viewStateObj = JSON.parse(sessionStorage.getItem("resultviewstate")); if (path in viewStateObj && section in viewStateObj[path]) { returnval = viewStateObj[path][section]; } } } return returnval; }, getContentObject: function(page) { let sections = this.getContentSections(page); let contentObj = {}; for (let i = 0; i < sections.length; i++) { contentObj[sections[i]] = this.displaycontent(page, sections[i]); } return contentObj; }, getContentSections: function(page) { var returnval = []; var pagescrubbed = ""; if (page){ pagescrubbed = page.replace(/\//g, "\\"); // replace forward slashes with back slashes } if (searchcontent && page in searchcontent){ returnval = Object.keys(searchcontent[page]); } else if (searchcontent && pagescrubbed in searchcontent){ returnval = Object.keys(searchcontent[pagescrubbed]); } return returnval; }, displaycontent: function(page, section){ var pagescrubbed = ""; if (page){ pagescrubbed = page.replace(/\//g, "\\"); // replace forward slashes with back slashes } if (searchcontent && page in searchcontent && section in searchcontent[page]){ return searchcontent[page][section][0]["TEXT"]; } else if (searchcontent && pagescrubbed in searchcontent && section in searchcontent[pagescrubbed]){ return searchcontent[pagescrubbed][section][0]["TEXT"]; } else { return ""; } }, customURIEncode: function(text){ text = encodeURIComponent(text); // https://stackoverflow.com/questions/4540753/should-i-use-encodeuri-or-encodeuricomponent-for-encoding-urls text = text.replace(/\(/g, '%28').replace(/\)/g, '%29'); // parenthesis text = text.replace(/\~/g, '%7E'); // ~ character text = text.replace(/\!/g, '%21'); // ! character text = text.replace(/\*/g, '%2A'); // * character text = text.replace(/\'/g, '%27'); // ' character text = text.replace(/\+/g, '%2B'); // + character return text; }, // from https://codepen.io/gapcode/pen/vEJNZN detectIE: function() { var ua = window.navigator.userAgent; // Test values; Uncomment to check result … // IE 10 // ua = 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)'; // IE 11 // ua = 'Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko'; // Edge 12 (Spartan) // ua = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36 Edge/12.0'; // Edge 13 // ua = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Safari/537.36 Edge/13.10586'; var msie = ua.indexOf('MSIE '); if (msie > 0) { // IE 10 or older => return version number return parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10); } var trident = ua.indexOf('Trident/'); if (trident > 0) { // IE 11 => return version number var rv = ua.indexOf('rv:'); return parseInt(ua.substring(rv + 3, ua.indexOf('.', rv)), 10); } var edge = ua.indexOf('Edge/'); if (edge > 0) { // Edge (IE 12+) => return version number return parseInt(ua.substring(edge + 5, ua.indexOf('.', edge)), 10); } // other browser return false; }, detectSafari: function(){ var isSafari = !!navigator.userAgent.match(/Version\/[\d\.]+.*Safari/); var isChromeForiOS = !!navigator.userAgent.match(/CriOS\/[\d\.]+.*Safari/); var iOS = /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream; var returnval = false; if (iOS || isSafari || isChromeForiOS) { returnval = true; } return returnval; }, detectFirefox: function(){ var isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1; return isFirefox }, detectChrome: function(){ var isChromium = window.chrome; var winNav = window.navigator; var vendorName = winNav.vendor; var isOpera = typeof window.opr !== "undefined"; var isIEedge = winNav.userAgent.indexOf("Edge") > -1; var isIOSChrome = winNav.userAgent.match("CriOS"); if (isIOSChrome) { // is Google Chrome on IOS } else if( isChromium !== null && typeof isChromium !== "undefined" && vendorName === "Google Inc." && isOpera === false && isIEedge === false ) { // is Google Chrome return true; } else { // not Google Chrome return false; } }, detectMobileDevice: function(){ return navigator.userAgent.match(/Android|iPhone|iPad|iPod|BlackBerry|Opera Mini|IEMobile/i); }, getDataUriFromResponse: function(response, mimetype) { var uInt8Array = new Uint8Array(response); var i = uInt8Array.length; var binaryString = new Array(i); while (i--) { binaryString[i] = String.fromCharCode(uInt8Array[i]); } var data = binaryString.join(''); var base64 = window.btoa(data); var dataUrl = 'data:' + mimetype + ';charset=utf-16le;base64,' + base64; return dataUrl; }, getBlobUriFromResponse: function(response, mimetype) { var blob = new Blob([response], { type: mimetype }); var downloadUrl = URL.createObjectURL(blob); return downloadUrl; }, getExhibitorURL: function(exhid, exhname){ var returnstring = ""; if (exhname){ exhname = (exhname+'').replace(/[^A-z_0-9-]+/g, " ").replace(/\s/g, "-"); // replace no alphanumerics with a space, then replace all spaces with a dash if (exhname.lastIndexOf("-") == exhname.length-1){ exhname = exhname.substring(0, exhname.lastIndexOf("-")); } if (exhname.charAt(0) == "-"){ exhname = exhname.substring(1, exhname.length-1); } } if ((!this.usefriendlyexhibitorurl) || (!exhname && exhid)) { return this.path2approot + "/exhibitor/exhibitor-details.cfm?exhid=" + exhid; } else if (exhname && exhid) { return this.path2approot + "/exhibitor/" + exhid + "/" + exhname; } else { return ""; } }, sendEmailVerfication: function() { var vObj = this; vObj.ajaxGet(vObj.path2approot + '/myshow/myshow-actions.cfm?action=SendEmailVerficationMessage', function(response) { vObj.showMessage("success", "Email successfully sent. Please check your email and click the verification link provided."); }, function(error) { vObj.showMessage("error", "Error sending verification email"); }); } } }); </script> <style> [v-cloak] { display: none; } </style> <script type="text/x-template" id="modal-template"> <transition name="modal" v-if="showmodal"> <div class="modal-mask" @keyup.esc="onEscape" tabindex="0" ref="modalparent"> <div class="modal-wrapper" v-on:click.self="closeModal(true);"> <div class="modal-container relative" v-bind:class="[small ? 'modal-container_small' : '']"> <div class="modal-header flex justify-between items-center"> <h2 class="mt0">{{title}}</h2> <button v-if="allowclose" v-on:click.stop.prevent="closeModal(false);" class="button-close bb-0 btn-reset" aria-label="Close this Window"> <svg width="36" height="36" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img"> <g transform="translate(-1108 -386)" fill="none" fill-rule="evenodd"><rect class="icon-close__circle" x="1108" y="386" width="36" height="36" rx="18"/><path class="icon-close__x" d="M1126 402.822l8.822-8.822 1.178 1.178-8.822 8.822 8.822 8.822-1.178 1.178-8.822-8.822-8.822 8.822-1.178-1.178 8.822-8.822-8.822-8.822 1.178-1.178z"/></g></svg> </button> </div> <slot></slot> </div> </div> </div> </transition></script> <style> .modal-wrapper .button-close { position: absolute; top: 0.5rem; right: 0.5rem; } .modal-wrapper .icon-close__x { fill: #333; } .modal-wrapper .button-close:hover .icon-close__circle, .modal-wrapper .button-close:focus .icon-close__circle { fill: rgba(0,0,0,0.1); } </style> <script> var ModalDisplay = Vue.component('modal-display', { template:"#modal-template", props: { showmodal: { default: false, type: Boolean }, title: { default: "", type: String }, small: { default: false, type: Boolean }, closeonoutsideclick: { default: true, type: Boolean }, allowcloseonesc: { default: true, type: Boolean }, allowclose: { default: true, type: Boolean } }, data: function(){ return { compincludepath: "includes/vue/generic/modal-display.cfm" } }, watch: { showmodal: function(){ var vObj = this; if (vObj.showmodal == true){ Vue.nextTick(function(){ vObj.$refs.modalparent.focus(); }); } } }, computed:{ content: function(){ return { closeText: this.displaycontent(this.compincludepath, 'closeText') }; } }, methods: { closeDisplay:function(){ vObj.hideerror = true; }, openModal: function(){ this.$emit("open-modal"); }, closeModal: function(outsideclicked) { if(this.allowclose && !outsideclicked || (outsideclicked && this.closeOnOutsideClick)) { this.$emit("close-modal"); } }, onEscape: function(){ if (this.allowcloseonesc){ this.closeModal(); } } } }); </script> <script type="text/x-template" id="error-template"> <div v-if="showmessage && animationClass" v-bind:class="[alertclass, animationClass, 'o-Alert', 'animated']" v-bind:style="{ zIndex: zindex }" v-cloak> <div class="center mw9 flex justify-between items-center"> <div class="mb0 center" v-for="(e, index) in messages"> <span v-html="e"></span> </div> <a href="" class="bb-0 pa1 ml2" @click.prevent="closeDisplay()" title="Close this message"> <svg width="24" height="24" xmlns="http://www.w3.org/2000/svg" role="img" aria-hidden="true"><path fill="#000" fill-rule="nonzero" d="M23.954 21.03l-9.184-9.095 9.092-9.174L21.03-.046l-9.09 9.179L2.764.045l-2.81 2.81L9.14 11.96.045 21.144l2.81 2.81 9.112-9.192 9.18 9.1z"/></svg> </a> </div> </div></script> <script> var MessageDisplay = Vue.component('message-display', { template:"#error-template", props: { showmessage:{ type: Boolean, default: false }, messages: { type: Array, default: [] }, type:{ type:String, default: "info" // warning, info, error, or success }, timeout:{ type: Number, default: 20 } }, data: function(){ return { hidemessage: null, alertclass: "o-Alert_Info", headertext: "", zindex: 9999, dateseed: 0, timeoutid: null } }, created: function(){ this.dateseed = Vue.MYS.getShowDateTime().getTime(); }, watch:{ stuff: function(e){ var vObj = this; if (vObj.hidemessage == false){ vObj.hidemessage = true; } setTimeout(function(){ vObj.hidemessage = false; vObj.zindex = 10000 + Vue.MYS.getShowDateTime().getTime() - vObj.dateseed; if (vObj.timeoutid){ clearTimeout(vObj.timeoutid); } switch(vObj.type){ case "warning": vObj.alertclass = "o-Alert_Warning"; vObj.headertext = "Warning"; break; case "info": vObj.alertclass = "o-Alert_Info"; vObj.headertext = "Note"; break; case "error": vObj.alertclass = "o-Alert_Error"; vObj.headertext = "Error"; break; case "success": vObj.alertclass = "o-Alert_Success"; vObj.headertext = "Success"; break; default: vObj.alertclass = "o-Alert_Info"; vObj.headertext = ""; break; } if (e){ vObj.timeoutid = setTimeout(function(){ vObj.hidemessage = true; }, vObj.timeout * 1000); } }, 500); } }, computed: { stuff: function(){ return { showmessage: this.showmessage, messages: this.messages, type: this.type } }, animationClass: function(){ if (this.hidemessage == true){ return 'fadeOutUp'; } else if (this.hidemessage == false){ return 'fadeInDown'; } else { return ''; } } }, methods: { closeDisplay:function(){ this.hidemessage = true; } } }); // this is a helper mixin to assist with display and ssuch var messagedisplayMixin = { data: function() { return { messagetype: "", messages: [], showmessage: false }; }, methods: { showMessage: function(type, msg){ this.messagetype = type; if (msg.constructor === Array){ this.messages = []; this.messages.push.apply(this.messages,msg); } else { this.messages = []; this.messages.push(msg); } this.showmessage = true; } } }; </script> <style> .slide-fade-enter-active { transition: all .3s ease; } .slide-fade-leave-active { /* transition: all .8s cubic-bezier(1.0, 0.5, 0.8, 1.0);*/ transition: all .3s ease; } .slide-fade-enter, .slide-fade-leave-to /* .slide-fade-leave-active below version 2.1.8 */ { transform: translateX(10px); opacity: 0; } </style> <script> var VLazyImageComponent = { props: { src: { type: String, required: true }, srcPlaceholder: { type: String, default: "" }, srcset: { type: String }, intersectionOptions: { type: Object, default: function(){ return {} } } }, data: function() { return { observer: null, intersected: false, loaded: false } }, computed: { srcImage: function() { return this.intersected ? this.src : this.srcPlaceholder; }, srcsetImage: function() { return this.intersected && this.srcset ? this.srcset : false; } }, render: function(h) { return h("img", { attrs: { src: this.srcImage, srcset: this.srcsetImage }, class: { "v-lazy-image": true, "v-lazy-image-loaded": this.loaded } }); }, mounted: function() { var vObj = this; vObj.$el.addEventListener("load", function() { if (vObj.$el.getAttribute('src') !== vObj.srcPlaceholder) { vObj.loaded = true; vObj.$emit("load"); } }); this.observer = new IntersectionObserver(function(entries) { var image = entries[0]; if (image.isIntersecting) { vObj.intersected = true; vObj.observer.disconnect(); vObj.$emit("intersect"); } }, vObj.intersectionOptions); vObj.observer.observe(vObj.$el); }, destroyed: function() { this.observer.disconnect(); } }; /*var VLazyImagePlugin = { install: (Vue, opts) => { Vue.component("VLazyImage", VLazyImageComponent); } };*/ Vue.component("VLazyImage", VLazyImageComponent); </script> <script type="text/x-template" id="gallery-display-template"> <div class="showroom-sidebar bg-light-gray pa4"> <div class="result-heading mb3"> <h2 class="f3 ma0 ttu">{{gallerytitle}}</h2> </div> <div class="flex flex-wrap items-start"> <figure class="sr-Thumbnail gallery-cell dib ma0 pa0" v-for="(galleryitem, index) in gallerydata"> <a href="#" class="bb-0 dib dim mr3 mb3" v-bind:id="'jq-featureid-' + galleryitem.togglekeys" v-bind:title="galleryitem.title" v-on:click.stop.prevent="selectPhoto(index)" v-bind:class="[(index === selectedIndex) ? 'is-selected' : '']" > <v-lazy-image width=100 class="mys-jq-lazy o-ThumbnailImg" :srcPlaceholder="path2approot + '/assets/imgs/grey.gif'" v-bind:src="galleryitem.thumbnailurl" v-bind:alt="galleryitem.exhname +'-' + galleryitem.title" v-bind:title="galleryitem.exhname +'-' + galleryitem.title" /> <figcaption class="f7 mt2">{{galleryitem.featurecaption}}</figcaption> </a> </figure> </div> <hr class="o-PageDivider mt2 mb3" /> <div id="jq-feature-body" class="sc-FeatureWrapper" > <div class="flex items-center mb3"> <toggle-favorite v-bind:type="gallerydata[selectedIndex].toggletype" v-bind:keys="gallerydata[selectedIndex].togglekeys" v-bind:exhid="gallerydata[selectedIndex].exhid" v-bind:addedtoplanner="bitToBool(gallerydata[selectedIndex].addedtoplanner)" v-on:toggle-favorite="$emit('toggle-favorite', $event); onToggleFavorite();"> </toggle-favorite> <h3 id="jq-feature-title" class="flex-auto ma0 ml3"> <span id="jq-feature-title-text"> {{gallerydata[selectedIndex].title}} </span> </h3> </div> <div id="jq-feature-truncation"> <div id="jq-feature-text" style="height: auto;" v-bind:style="{overflowY: (readMoreTextClicked || !readMoreButtonShowing) ? 'hidden' : 'hidden', height: (readMoreTextClicked || !readMoreButtonShowing) ? 'auto' : jqFeatureTextHeightTestHeight + 'px'}"> <div class="jqFeatureText" ref="jqFeatureText"> <div class="o-Showcase-Selected_Container" ref="oShowcaseSelectedContainer"> <v-lazy-image v-if="gallerydata[selectedIndex].mediatype == 'image'" v-bind:src="gallerydata[selectedIndex].mediafileurl" v-bind:alt="gallerydata[selectedIndex].exhname + '-' + gallerydata[selectedIndex].title" v-bind:title="gallerydata[selectedIndex].exhname + '-' + gallerydata[selectedIndex].title" class="o-ShowcaseImage" v-bind:class="{'o-ShowcaseImage_Float': showCaseImageFloats}" ref="oShowcaseImage" @load="compareSelectedImageAndContainerWidths()" /> <video v-if="gallerydata[selectedIndex].mediatype == 'video'" class="mys-showcase-video-default mb3 mw-100 h-auto w-100-l" v-bind:src="gallerydata[selectedIndex].mediafileurl" controls="" > </video> </div> <div class="o-DynamicContent" v-html="gallerydata[selectedIndex].description" ref="oShowcaseDescription"></div> </div> </div> <div class="o-FadeReadMore" v-if="!readMoreTextClicked && readMoreButtonShowing"></div> <div class="o-BorderBehind mt0 pa0 pt3 pb3 tc animated short" v-bind:class="[(readMoreButtonShowing) ? 'fadeIn' : 'dn']"> <span> <a class="btn-secondary" href="#" v-if="gallerydata[selectedIndex].description" v-on:click.stop.prevent="readMoreClick()"> <div class="dib" v-if="!readMoreTextClicked">{{content.readMoreText}}</div> <div class="dib" v-if="readMoreTextClicked">{{content.readLessText}}</div> </a> </span> </div> </div> </div> </div> </script> <script> var GalleryDisplay = Vue.component('gallery-display', { data: function(){ return { compincludepath: "includes/vue/generic/gallery-display.cfm", selectedIndex: this.defaultselectedindex, loading: false, readMoreTextClicked: false, readMoreButtonShowing: false, jqFeatureTextHeight: null, showCaseImageFloats: false, jqFeatureTextHeightTestHeight: 600 } }, template:"#gallery-display-template", props: { gallerydata:{ type: Array, default: function () { return [] } }, gallerytitle:{ type: String, default:"" }, defaultselectedindex: { type: [String, Number], default: 0 } }, updated: function(){ var vObj = this; vObj.compareSelectedImageAndContainerWidths(); }, mounted: function(){ var vObj = this; vObj.selectPhoto(vObj.selectedIndex); // so we log and do other stuff vObj.$nextTick(function(){ //Using a setTimeout here since we had to use one below to get the height of the featured section to determine whether to show or hide the Show More button. Might be a better way to do this. setTimeout(function(){ vObj.showOrHideReadMoreButton(); vObj.compareSelectedImageAndContainerWidths(); }, 150); }); }, mixins: [messagedisplayMixin], // messagedisplayMixin is declared in \includes\vue\generic\message-display.cfm computed:{ content: function(){ return { readMoreText: this.displaycontent(this.compincludepath, 'readMoreText'), readLessText: this.displaycontent(this.compincludepath, 'readLessText') }; } }, methods:{ onToggleFavorite: function(){ if (this.gallerydata[this.selectedIndex].addedtoplanner == 0){ this.gallerydata[this.selectedIndex].addedtoplanner = 1; } else if (this.gallerydata[this.selectedIndex].addedtoplanner == 1){ this.gallerydata[this.selectedIndex].addedtoplanner = 0; } }, selectPhoto: function(index){ var vObj = this; this.selectedIndex = index; this.readMoreTextClicked = false; this.$emit('item-selected', this.gallerydata[this.selectedIndex]); this.showOrHideReadMoreButton(); }, readMoreClick: function(){ this.readMoreTextClicked = !this.readMoreTextClicked; }, getCurrentImageClass: function(){ if (this.gallerydata[this.selectedIndex].mediatype == "image"){ switch (this.gallerydata[this.selectedIndex].imagealignment){ case "top": return "o-Showroom_Top"; break; case "left": return "o-Showroom_Left"; break; case "right": return "o-Showroom_Right"; break; } } else { return ""; } }, showOrHideReadMoreButton: function(){ var vObj = this; if (vObj.$refs.jqFeatureText) { setTimeout(function(){ vObj.jqFeatureTextHeight = vObj.getElementOffset(vObj.$refs.jqFeatureText).height; if (vObj.jqFeatureTextHeight < vObj.jqFeatureTextHeightTestHeight) { vObj.readMoreButtonShowing = false; } else { vObj.readMoreButtonShowing = true; } }, 100); } }, compareSelectedImageAndContainerWidths: function(){ var showSelectedDescriptionWidth = this.getElementOffset(document.querySelector('#jq-feature-text')).width; if (this.gallerydata[this.selectedIndex].mediatype !== 'image') { return } else if (this.gallerydata[this.selectedIndex].mediatype == 'image'){ var showSelectedImageWidth = this.getElementOffset(document.querySelector('.o-ShowcaseImage')).width; if ((showSelectedDescriptionWidth - showSelectedImageWidth) > 250) { this.showCaseImageFloats = true; } else { this.showCaseImageFloats = false; } } } } }); </script> <script type="text/x-template" id="onlinecontacts-template"> <div id="onlinecontacts-result-list-table" class="o-online-contacts_container"> <message-display v-bind:messages="messages" v-bind:type="messagetype" v-bind:showmessage="showmessage" :timeout="20"> </message-display> <div class="js-List" v-for="(onlinecontact, index) in onlinecontactsdatamodel" :key="index"> <div class="flex items-start mb6 mb0-last jq-favorite-wrapper"> <div class="flex jq-card-media_image"> <div v-if="!displayroundedcornerimages" class="jq-contact-image-wrapper relative"> <img v-if="onlinecontact.headshot" style="border-radius: 50%; min-width: 75px; margin-right: 0;" :src="onlinecontact.s3img" class="w-100 mw4 mb3 ba b--black-10 v-lazy-image v-lazy-image-loaded" :alt="onlinecontact.fullname" :title="onlinecontact.fullname" onerror="this.onerror=null;this.src='/8_0/assets/imgs/FPO-default-speaker.png';"> <img v-else style="border-radius: 50%; min-width: 75px; margin-right: 0;" :src="path2approot + '/assets/imgs/FPO-default-speaker.png'" class="w-100 mw4 mb3 ba b--black-10 v-lazy-image v-lazy-image-loaded" :alt="onlinecontact.fullname" :title="onlinecontact.fullname" onerror="this.onerror=null;this.src='/8_0/assets/imgs/1x1.gif';"> </div> <div v-else class="contact"> <img v-if="onlinecontact.headshot" :src="onlinecontact.s3img" class="border-radius-v3 mw4 mb3 ba b--black-10 v-lazy-image v-lazy-image-loaded" :alt="onlinecontact.fullname" :title="onlinecontact.fullname" onerror="this.onerror=null;this.src='/8_0/assets/imgs/FPO-default-speaker.png';"> <img v-else :src="path2approot + '/assets/imgs/FPO-default-speaker.png'" class="border-radius-v3 mw4 mb3 ba b--black-10 v-lazy-image v-lazy-image-loaded" :alt="onlinecontact.fullname" :title="onlinecontact.fullname" onerror="this.onerror=null;this.src='/8_0/assets/imgs/1x1.gif';"> </div> <div class="ma0 mw3 mr4 jq-favorite-icon-wrapper absolute"> <toggle-favorite :type="'onlinecontact'" v-bind:keys="onlinecontact.contactid" v-bind:addedtoplanner="bitToBool(onlinecontact.hasplanner)" v-on:toggle-favorite="$emit('toggle-favorite', $event)" v-bind:exhid="onlinecontact.exhid" v-if="loggedin" ></toggle-favorite> </div> </div> <div class="jq-card-media_body"> <div class="flex items-center mb3"> <div class="flex"> <h3 class="flex-auto ma0"> {{onlinecontact.fullname}} <span class="normal" v-if="onlinecontact.title">- {{onlinecontact.title}}</span> <span class="normal" v-if="showexhibitorlink">at</span> <a class="normal" v-if="showexhibitorlink" :href="getExhibitorURL(onlinecontact.exhid, onlinecontact.exhname)">{{onlinecontact.exhname}}</a> </h3> <span class="bg-green-1 br1 dark-gray dib f7 normal mr1 ml3 pa2 pt1 pb1" v-if="onlinecontact.contactstatus == 'Available'">{{onlinecontact.contactstatus}}</span> </div> </div> <p v-if="loggedin" class="f6 ma0 mb2"> <span class="muted">{{onlinecontact.phone}}</span> </p> <p v-if="!loggedin"> <a class="card-Title break-word f5 ma0 normal bb-0" v-bind:href="path2approot + '/login/login.cfm?redirect_to=' + customURIEncode(thispageurl)"><em>Log in to contact this person</em></a> </p> <div class="is-hidden_small"> <div v-if="onlinecontact.description" v-html="onlinecontact.description"></div> </div> <div class="card-Subtitle"> <button v-if="loggedin && hasvalidation && validated && onlinecontact.availableforchat && onlinecontact.contactstatus == 'Available'" @click="initiateChat(onlinecontact.contactid, onlinecontact.exhid, onlinecontact.chatid, onlinecontact.fullname, onlinecontact.email, onlinecontact.hasplanner, index)" class="btn-primary" title="Chat"> Chat </button> <button v-else-if="loggedin && hasvalidation && !validated && onlinecontact.contactstatus == 'Available'" class="btn-secondary" @click="sendEmailVerfication()"> Confirm your email to chat </button> <a v-if="loggedin" class="bb-0 ma0 mr2 mb2 darken dib" style="cursor: pointer;" v-on:click.stop.prevent="emailButtonClick(onlinecontact.contactid, onlinecontact.fullname, onlinecontact.email);" v-cloak :title="'Email ' + onlinecontact.fullname"> <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" role="img" aria-hidden="true"><path class="moon-gray" d="M16 .02c-8.836 0-16 7.164-16 16s7.164 16 16 16 16-7.164 16-16-7.164-16-16-16zm9.32 9.307L16 16.88 6.679 9.327H25.32zm.013 13.333H6.667V11.32L16 18.884l9.333-7.563V22.66z"></path></svg> </a> <a v-if="onlinecontact.facebook.replace('http://', '').trim().length > 0" class="bb-0 ma0 mr2 mb2 darken dib" :href="onlinecontact.facebook" target="_blank" :title="'Like ' + onlinecontact.fullname + ' on Facebook'" @click="logStats('URL Link', '', onlinecontact.exhid, onlinecontact.facebook, 'facebook');"> <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" role="img" aria-hidden="true"><path class="moon-gray" d="M16,0 C7.164,0 0,7.164 0,16 C0,24.836 7.164,32 16,32 C24.836,32 32,24.836 32,16 C32,7.164 24.836,0 16,0 Z M20,10.6666667 L18.2,10.6666667 C17.4826667,10.6666667 17.3333333,10.9613333 17.3333333,11.704 L17.3333333,13.3333333 L20,13.3333333 L19.7213333,16 L17.3333333,16 L17.3333333,25.3333333 L13.3333333,25.3333333 L13.3333333,16 L10.6666667,16 L10.6666667,13.3333333 L13.3333333,13.3333333 L13.3333333,10.256 C13.3333333,7.89733333 14.5746667,6.66666667 17.372,6.66666667 L20,6.66666667 L20,10.6666667 Z"></path></svg> </a> <a v-if="onlinecontact.twitter.replace('http://', '').trim().length > 0" class="bb-0 ma0 mr2 mb2 darken dib" :href="onlinecontact.twitter" target="_blank" :title="'Follow ' + onlinecontact.fullname + ' on Twitter'" @click="logStats('URL Link', '', onlinecontact.exhid, onlinecontact.twitter, 'twitter');"> <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" role="img" aria-hidden="true"><path class="moon-gray" d="M16,0 C7.164,0 0,7.164 0,16 C0,24.836 7.164,32 16,32 C24.836,32 32,24.836 32,16 C32,7.164 24.836,0 16,0 Z M24.088,12.86 C24.332,18.2466667 20.3146667,24.252 13.2026667,24.252 C11.04,24.252 9.028,23.6173333 7.33333333,22.5306667 C9.36533333,22.7706667 11.3933333,22.2053333 13.0026667,20.9453333 C11.328,20.9146667 9.91333333,19.8066667 9.424,18.2853333 C10.0253333,18.4 10.6173333,18.3666667 11.1546667,18.22 C9.31333333,17.8493333 8.04133333,16.1906667 8.08266667,14.416 C8.6,14.7026667 9.18933333,14.8746667 9.81733333,14.8946667 C8.112,13.7546667 7.62933333,11.5026667 8.632,9.78133333 C10.52,12.0986667 13.3426667,13.6226667 16.5253333,13.7826667 C15.9666667,11.388 17.784,9.08 20.2573333,9.08 C21.3573333,9.08 22.3533333,9.54533333 23.052,10.2893333 C23.924,10.1186667 24.7453333,9.79866667 25.484,9.36 C25.1973333,10.2546667 24.5906667,11.004 23.8,11.4786667 C24.5746667,11.3853333 25.3133333,11.18 25.9986667,10.8746667 C25.4866667,11.6453333 24.8386667,12.32 24.088,12.86 Z"></path></svg> </a> <a v-if="onlinecontact.linkedin.replace('http://', '').trim().length > 0" class="bb-0 ma0 mr2 mb2 darken dib" :href="onlinecontact.linkedin" target="_blank" :title="'Connect with ' + onlinecontact.fullname + ' on LinkedIn'" @click="logStats('URL Link', '', onlinecontact.exhid, onlinecontact.linkedin, 'linkedin');"> <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" role="img" aria-hidden="true"><path class="moon-gray" d="M16,0 C7.164,0 0,7.164 0,16 C0,24.836 7.164,32 16,32 C24.836,32 32,24.836 32,16 C32,7.164 24.836,0 16,0 Z M13.3333333,21.3333333 L10.6666667,21.3333333 L10.6666667,13.3333333 L13.3333333,13.3333333 L13.3333333,21.3333333 Z M12,12.1453333 C11.1906667,12.1453333 10.5333333,11.484 10.5333333,10.6666667 C10.5333333,9.85066667 11.1893333,9.188 12,9.188 C12.8106667,9.188 13.4666667,9.85066667 13.4666667,10.6666667 C13.4666667,11.484 12.8093333,12.1453333 12,12.1453333 Z M22.6666667,21.3333333 L20.0026667,21.3333333 L20.0026667,17.5186667 C20.0026667,15.0106667 17.3333333,15.2226667 17.3333333,17.5186667 L17.3333333,21.3333333 L14.6666667,21.3333333 L14.6666667,13.3333333 L17.3333333,13.3333333 L17.3333333,14.7906667 C18.496,12.636 22.6666667,12.476 22.6666667,16.8546667 L22.6666667,21.3333333 Z"></path></svg> </a> <a v-if="onlinecontact.instagram.replace('http://', '').trim().length > 0" class="bb-0 ma0 mr2 mb2 darken dib" :href="onlinecontact.instagram" target="_blank" :title="'Follow ' + onlinecontact.fullname + ' on Instagram'" @click="logStats('URL Link', '', onlinecontact.exhid, onlinecontact.instagram, 'instagram');"> <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" role="img" aria-hidden="true"><path class="moon-gray" d="M19.772,8.40266667 C18.788,8.35733333 18.492,8.34933333 16,8.34933333 C13.508,8.34933333 13.2133333,8.35866667 12.2293333,8.40266667 C9.69733333,8.51866667 8.51866667,9.71733333 8.40266667,12.2293333 C8.35866667,13.2133333 8.348,13.508 8.348,16 C8.348,18.492 8.35866667,18.7866667 8.40266667,19.772 C8.51866667,22.2773333 9.692,23.4826667 12.2293333,23.5986667 C13.212,23.6426667 13.508,23.6533333 16,23.6533333 C18.4933333,23.6533333 18.788,23.644 19.772,23.5986667 C22.304,23.484 23.4813333,22.2813333 23.5986667,19.772 C23.6426667,18.788 23.652,18.492 23.652,16 C23.652,13.508 23.6426667,13.2133333 23.5986667,12.2293333 C23.4813333,9.71866667 22.3013333,8.51866667 19.772,8.40266667 Z M16,20.7933333 C13.3533333,20.7933333 11.2066667,18.648 11.2066667,16 C11.2066667,13.3533333 13.3533333,11.208 16,11.208 C18.6466667,11.208 20.7933333,13.3533333 20.7933333,16 C20.7933333,18.6466667 18.6466667,20.7933333 16,20.7933333 Z M20.9826667,12.1386667 C20.364,12.1386667 19.8626667,11.6373333 19.8626667,11.0186667 C19.8626667,10.4 20.364,9.89866667 20.9826667,9.89866667 C21.6013333,9.89866667 22.1026667,10.4 22.1026667,11.0186667 C22.1026667,11.636 21.6013333,12.1386667 20.9826667,12.1386667 Z M19.1106667,16 C19.1106667,17.7186667 17.7173333,19.1106667 16,19.1106667 C14.2826667,19.1106667 12.8893333,17.7186667 12.8893333,16 C12.8893333,14.2813333 14.2826667,12.8893333 16,12.8893333 C17.7173333,12.8893333 19.1106667,14.2813333 19.1106667,16 Z M16,0 C7.164,0 0,7.164 0,16 C0,24.836 7.164,32 16,32 C24.836,32 32,24.836 32,16 C32,7.164 24.836,0 16,0 Z M25.2773333,19.848 C25.124,23.2413333 23.2346667,25.1213333 19.8493333,25.2773333 C18.8533333,25.3226667 18.5346667,25.3333333 16,25.3333333 C13.4653333,25.3333333 13.148,25.3226667 12.152,25.2773333 C8.76,25.1213333 6.87866667,23.2386667 6.72266667,19.848 C6.67733333,18.8533333 6.66666667,18.5346667 6.66666667,16 C6.66666667,13.4653333 6.67733333,13.148 6.72266667,12.152 C6.87866667,8.76 8.76133333,6.87866667 12.152,6.724 C13.148,6.67733333 13.4653333,6.66666667 16,6.66666667 C18.5346667,6.66666667 18.8533333,6.67733333 19.8493333,6.724 C23.2426667,6.88 25.1253333,8.76666667 25.2773333,12.152 C25.3226667,13.148 25.3333333,13.4653333 25.3333333,16 C25.3333333,18.5346667 25.3226667,18.8533333 25.2773333,19.848 Z"></path></svg> </a> </div> </div> </div> </div> </div> </script> <style> .jq-favorite-wrapper { flex-direction: column; } .jq-contact-image-wrapper { min-width: 75px; max-width: 75px; } .jq-favorite-icon-wrapper { left: 52px } /* CSS Element Queries: */ /* (was @media only screen and (min-width: 680px)) */ .o-online-contacts_container[min-width~="605px"] .jq-favorite-wrapper { flex-direction: row; } /* (was @media only screen and (min-width: 680px)) */ .o-online-contacts_container[min-width~="605px"] .jq-contact-image-wrapper { min-width: 128px; max-width: 128px; } /* (was @media only screen and (min-width: 680px)) */ .o-online-contacts_container[min-width~="605px"] .jq-favorite-icon-wrapper { left: 95px; } /* NEW spacing for positioned avatar and checkmark */ .o-online-contacts_container[min-width~="605px"] .jq-card-media_body { margin-left: 2.5rem; } /* (was @media only screen and (min-width: 960px) - for Exh Showroom (with show features sidebar)) */ .showcase-wrapper_featured .o-online-contacts_container[min-width~="330px"] .jq-favorite-wrapper { flex-direction: column; } /* (was @media only screen and (min-width: 1200px) - for Exh Showroom (with show features sidebar)) */ .showcase-wrapper_featured .o-online-contacts_container[min-width~="566px"] .jq-favorite-wrapper { flex-direction: row; } /* NEW Style fixes 6-12-20: */ /* NEW spacing for positioned avatar and checkmark */ .showcase-wrapper_featured .o-online-contacts_container[min-width~="566px"] .jq-card-media_body { margin-left: 2.5rem; } /* NEW fix for offset with larger contact image size - for Exh Showroom (with show features sidebar) */ .showcase-wrapper_featured .o-online-contacts_container[min-width~="566px"] .jq-favorite-icon-wrapper { left: 95px; } /* NEW allow contact image to be larger - for Exh Showroom (with show features sidebar) */ .showcase-wrapper_featured .o-online-contacts_container[min-width~="566px"] .jq-contact-image-wrapper { min-width: 128px; max-width: 128px; } </style> <script> var OnlineContactsDisplay = Vue.component('onlinecontacts-display', { data: function(){ return { compincludepath: "includes/vue/myshow/onlinecontacts-display.cfm", loading: false, onlinecontactsdatamodel: this.onlinecontactsdata } }, props:{ onlinecontactsdata:{ type: Array, required: false, default: [] }, loggedin:{ type: Boolean, required: false, default: false }, showexhibitorlink:{ type: Boolean, required: false, default: false } }, mixins: [messagedisplayMixin], // messagedisplayMixin is declared in \includes\vue\generic\message-display.cfm template:"#onlinecontacts-template", computed:{ displayroundedcornerimages: function(){ if ("sessionSubVersion" in Vue.MYS && Vue.MYS.sessionSubVersion >= 3){ return true; } else { return false; } } }, methods: { emailButtonClick: function(contactid, fullname, email) { this.$emit('email-contact', {contactid: contactid, fullname: fullname, email: email} ); }, initiateChat: function(contactid, exhid, userid, fullname, email, addedtoplanner, contactindex) { if(!addedtoplanner) { var myshowfunction = "AddFavorite" , requestObj = {"keys": contactid, "tablename": "additionalcontacts", "exhid": exhid} , vObj = this , callback = function(){ vObj.addedtoplannerfinal = true; } , errormessage = "Error adding online contact to planner", return_to = encodeURIComponent(vObj.getCurrentURL()); vObj.ajaxGet( vObj.path2approot + '/myshow/myshow-actions.cfm?action=' + myshowfunction + "&" + vObj.objectToURLValues(requestObj) + "&return_to=" + return_to, // ajaxGet() defined in _global-mixin function(response) { console.log('here'); // success callback(); }, function(response) { // error if ("ERRORCODE" in response && response.ERRORCODE == "12345") { location.href = vObj.path2approot + '/login/login.cfm'; } else { vObj.showMessage("error", "Error favoriting item"); } } ); // end ajaxGet this.onlinecontactsdatamodel[contactindex].hasplanner = 1; } this.$emit('chat-initiated', {userid: userid, fullname: fullname, email: email}); } } }); </script> <script type="text/x-template" id="toggleFavoriteTemplate"> <span :title="tippyTitle" v-tippy> <message-display :messages="messages" :type="messagetype" :showmessage="showmessage" :timeout="5"> </message-display> <modal-display :title="content.confirmModalTitle" :showmodal="showconflict" v-on:close-modal="showconflict = false" > <p>{{content.conflictModalText1}}</p> <p>{{content.conflictModalText2}}</p> <template v-for="session in conflictingsessions"> <p>{{session.title}}</p> <p>{{formatSessionDate(session.isodate)}} {{session.starttime}} - {{session.endtime}}</p> </template> <p>{{content.conflictModalText3}}</p> <button :aria-label="content.cancelText" :title="content.cancelTitle" v-on:click="showconflict = false" class="btn btn-tertiary">{{content.cancelText}}</button> <button :aria-label="content.confirmText" :title="content.confirmTitle" v-on:click.stop.prevent="toggleAddToPlanner" class="btn btn-primary">{{content.confirmText}}</button> </modal-display> <modal-display :title="content.confirmModalTitle" :showmodal="showconfirm" v-on:close-modal="showconfirm = false" > <template v-if="currentStatus == 'Reserved' || attendancestatus == 'Reserved'"> <p>{{content.reserveModalText1}}</p> <p>{{content.reserveModalText2}}</p> </template> <template v-else-if="currentStatus == 'Waitlist' || attendancestatus == 'Waitlist'"> <p>{{content.waitlistModalText1}}</p> <p>{{content.waitlistModalText2}}</p> </template> <button :aria-label="content.cancelText" :title="content.cancelTitle" v-on:click.stop="showconfirm = false" class="btn btn-tertiary">{{content.cancelText}}</button> <button :aria-label="content.confirmText" :title="content.confirmTitle" v-on:click.stop.prevent="toggleAddToPlanner" class="btn btn-primary">{{content.confirmText}}</button> </modal-display> <modal-display :title="content.processingModalTitle" :showmodal="seatrestriction && loading && sessionCheck" :allowclose="false" > {{content.processingModalText}} </modal-display> <template v-if="hasmyshow"> <template v-if="exhSubVersion < 3"> <template v-if="fullbuttondisplay"> <a v-on:click.stop.prevent="evaluateAdd()" :title="myshowTitleText" class="btn-primary center js-myShow" v-bind:class="[absolute ? 'absolute' : '', {'is-saved': addedtoplannerfinal, 'is-disabled': !computedEnabled }]"> <svg width="24" height="24" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" v-bind:class="{'is-saved': addedtoplannerfinal, 'icon': true,'rotating': loading}" role="img" aria-hidden="true"> <path v-if="!addedtoplannerfinal && !loading" d="M24 10H14V0h-4v10H0v4h10v10h4V14h10z" fill="white"></path> <path v-if="addedtoplannerfinal && !loading" d="M9 21.035l-9-8.638 2.791-2.87 6.156 5.874 12.21-12.436L24 5.782z" fill="white"></path> <path v-if="loading" v-bind:d="loadingIcon" fill="white"></path> </svg> <span class="b ml2 v-mid" v-if="!loading">{{buttonLabel}}</span> <span class="b ml2 v-mid" v-if="loading">{{content.updatingText}}...</span> </a> </template> <template v-else> <a class="flex-Icon center js-myShow pointer" v-on:click.stop.prevent="evaluateAdd()" v-bind:class="[absolute ? 'absolute' : '', {'is-saved': addedtoplannerfinal, 'is-disabled': !computedEnabled }]" :title="myshowTitleText"> <transition name="favorite-icon"> <svg v-bind:class="{'is-saved': addedtoplannerfinal, 'icon': true, 'rotating': loading}" width="24" height="24" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" role="img" aria-hidden="true"> <path v-if="!addedtoplannerfinal && !loading" v-bind:d="notAddedToPlannerIcon"></path> <path v-if="addedtoplannerfinal && !loading" v-bind:d="addedToPlannerIcon"></path> <path v-if="loading" v-bind:d="loadingIcon"></path> </svg> </transition> </a> </template> </template> <template v-else> <template v-if="fullbuttondisplay"> <button class="btn-primary btn-addtoplanner" @click="evaluateAdd()" v-bind:class="[absolute ? 'absolute' : '', {'is-saved': addedtoplannerfinal, 'is-disabled': !computedEnabled }]"> <span> <svg v-show="addedtoplannerfinal" class="addtoplannericon animated fadeIn" xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none"> <path d="m15.784 8.375-2.16-2.16.914-.936 1.246 1.247L18.87 3.42l.936.935-4.02 4.02ZM5.313 18.22V5.145c0-.442.153-.816.459-1.123.306-.306.68-.46 1.122-.46h5.755a5.169 5.169 0 0 0-.58 1.154 3.843 3.843 0 0 0-.194 1.253c0 1.033.335 1.936 1.004 2.707a4.025 4.025 0 0 0 2.496 1.387c.251.033.47.049.656.049.186 0 .405-.016.656-.049v8.156L11 15.78l-5.687 2.44Z"/></g></svg> <svg v-show="!addedtoplannerfinal" class="addtoplannericon animated fadeIn" xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none"> <path stroke-width=".025" d="M5.512 20.231V5.308c0-.502.173-.927.52-1.274a1.732 1.732 0 0 1 1.275-.521h5.68v1.474h-5.68a.307.307 0 0 0-.22.1.307.307 0 0 0-.1.22V17.97l.017-.008 4.995-2.147 4.995 2.148.018.007v-6.957h1.474v9.219l-6.482-2.781.002-.005-.012.005-6.482 2.781ZM18.486 7v1.987h-1.474v-2h-2V5.513h2v-2h1.474v2h2.001v1.474h-2V7Z"/></g></svg> </span> <span v-if="!loading">{{buttonLabel}}</span> <span v-if="loading">{{content.updatingText}}...</span> </button> </template> <button v-else class="button-addtoplanner" @click="evaluateAdd()" v-bind:class="[absolute ? 'absolute' : '', {'is-saved': addedtoplannerfinal, 'is-disabled': !computedEnabled }]"> <svg v-show="addedtoplannerfinal" class="addtoplannericon animated fadeIn" xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none"> <path d="m15.784 8.375-2.16-2.16.914-.936 1.246 1.247L18.87 3.42l.936.935-4.02 4.02ZM5.313 18.22V5.145c0-.442.153-.816.459-1.123.306-.306.68-.46 1.122-.46h5.755a5.169 5.169 0 0 0-.58 1.154 3.843 3.843 0 0 0-.194 1.253c0 1.033.335 1.936 1.004 2.707a4.025 4.025 0 0 0 2.496 1.387c.251.033.47.049.656.049.186 0 .405-.016.656-.049v8.156L11 15.78l-5.687 2.44Z"/> </svg> <svg v-show="!addedtoplannerfinal" class="addtoplannericon animated fadeIn" xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none"> <path stroke-width=".025" d="M5.512 20.231V5.308c0-.502.173-.927.52-1.274a1.732 1.732 0 0 1 1.275-.521h5.68v1.474h-5.68a.307.307 0 0 0-.22.1.307.307 0 0 0-.1.22V17.97l.017-.008 4.995-2.147 4.995 2.148.018.007v-6.957h1.474v9.219l-6.482-2.781.002-.005-.012.005-6.482 2.781ZM18.486 7v1.987h-1.474v-2h-2V5.513h2v-2h1.474v2h2.001v1.474h-2V7Z"/> </svg> </button> </template> </template> </span></script> <script> var ToggleFavorite = Vue.component("toggle-favorite", { props: { keys:{ default: "", type: [String, Number] }, exhid:{ default: "", type: [String, Number] }, addedtoplanner: { default: false, type: [String, Boolean] }, type: { default: "exhibitor", type: String }, absolute: { default: false, type: Boolean }, tablename: { default: "", type: String }, fullbuttondisplay: { default: false, type: Boolean }, enabled: { default: true, type: Boolean }, disabledtext: { default: "", type: String }, appointment: { default: false, type: Boolean }, fromcalendar: { default: false, type: Boolean }, seatsqty: { default: 0, type: Number }, waitlistqty: { default: 0, type: Number }, attendancestatus: { default: "", type: String }, conflictingsessions: { default: () => [], type: Array } }, mixins: [messagedisplayMixin], template:"#toggleFavoriteTemplate", data: function(){ return { compincludepath: "includes/vue/generic/toggle-favorite.cfm", loading: false, showconflict: false, showconfirm: false, addedtoplannerfinal: (String(this.addedtoplanner).toLowerCase() === 'true'), addedToPlannerIcon: "M9 21.035l-9-8.638 2.791-2.87 6.156 5.874 12.21-12.436L24 5.782z", notAddedToPlannerIcon: "M24 10H14V0h-4v10H0v4h10v10h4V14h10z", loadingIcon: "M11.501 4.025v-4.025h1v4.025l-.5-.025-.5.025zm-7.079 5.428l-3.884-1.041-.26.966 3.881 1.04c.067-.331.157-.651.263-.965zm5.995-5.295l-1.039-3.878-.967.259 1.041 3.883c.315-.106.635-.197.965-.264zm-6.416 7.842l.025-.499h-4.026v1h4.026l-.025-.501zm2.713-5.993l-2.846-2.845-.707.707 2.846 2.846c.221-.251.457-.487.707-.708zm-1.377 1.569l-3.48-2.009-.5.866 3.484 2.012c.15-.299.312-.591.496-.869zm13.696.607l3.465-2-.207-.36-3.474 2.005.216.355zm.751 1.993l3.873-1.038-.129-.483-3.869 1.037.125.484zm-3.677-5.032l2.005-3.472-.217-.125-2.002 3.467.214.13zm-1.955-.843l1.037-3.871-.16-.043-1.038 3.873.161.041zm3.619 2.168l2.835-2.834-.236-.236-2.834 2.833.235.237zm-9.327-1.627l-2.011-3.484-.865.5 2.009 3.479c.276-.184.568-.346.867-.495zm-4.285 8.743l-3.88 1.04.26.966 3.884-1.041c-.106-.314-.197-.634-.264-.965zm11.435 5.556l2.01 3.481.793-.458-2.008-3.478c-.255.167-.522.316-.795.455zm3.135-2.823l3.477 2.007.375-.649-3.476-2.007c-.116.224-.242.439-.376.649zm-1.38 1.62l2.842 2.842.59-.589-2.843-2.842c-.187.207-.383.403-.589.589zm2.288-3.546l3.869 1.037.172-.644-3.874-1.038c-.049.218-.102.434-.167.645zm.349-2.682l.015.29-.015.293h4.014v-.583h-4.014zm-6.402 8.132l1.039 3.879.967-.259-1.041-3.884c-.315.106-.635.197-.965.264zm-1.583.158l-.5-.025v4.025h1v-4.025l-.5.025zm-5.992-2.712l-2.847 2.846.707.707 2.847-2.847c-.25-.22-.487-.456-.707-.706zm-1.165-1.73l-3.485 2.012.5.866 3.48-2.009c-.185-.278-.347-.57-.495-.869zm2.734 3.106l-2.01 3.481.865.5 2.013-3.486c-.299-.149-.591-.311-.868-.495zm1.876.915l-1.042 3.886.967.259 1.04-3.881c-.33-.067-.65-.158-.965-.264z", tippy: null, timesran: 0, intervalid: '', seatrestriction: Vue.MYS.seatrestriction, allowedschedules: Vue.MYS.allowedschedules, lockdown: Vue.MYS.lockdown, exhSubVersion: Vue.MYS.exhSubVersion } }, watch: { addedtoplanner: { deep: true, handler: function(e){ this.addedtoplannerfinal = e; } } }, computed:{ buttonLabel: function() { if(this.addedtoplannerfinal) { if(this.seatrestriction && this.sessionCheck) { switch(this.currentStatus) { case 'Waitlist': return this.content.waitlistRemoveText; break; case 'Reserved': return this.content.reserveRemoveText; break; } } else { return this.content.savedToMyShowPlannerText; } } else { if(!this.computedEnabled && this.enabled) { if(this.regemail.length == 0) { return this.content.loginText; } else { return this.content.noAccessText; } } else if(this.seatrestriction && this.sessionCheck) { switch(this.currentStatus) { case 'Waitlist': return this.content.waitlistAddText; break; case 'Reserved': return this.content.reserveAddText; break; case 'Filled': return this.content.filledText; break; } } else { return this.content.addToMyShowPlannerText; } } }, computedEnabled: function() { if(this.sessionCheck) { if(!this.lockdown || (this.allowedschedules.includes(''+this.keys) || this.attendancestatus != '')) { return this.enabled; } else { return false; } } else { return this.enabled; } }, content: function() { var formattedURL = this.thispageurl.toLowerCase().trim(); var sessionDetailsSuffix = formattedURL.indexOf("/sessions/session-details.cfm") >= 0 ? "-session" : ""; return { addToMyShowPlannerText: this.displaycontent(this.compincludepath, `addToMyShowPlannerText${sessionDetailsSuffix}`), savedToMyShowPlannerText: this.displaycontent(this.compincludepath, 'savedToMyShowPlannerText'), removeFromPlannerText: this.displaycontent(this.compincludepath, 'removeFromPlannerText'), appointmentRemoveFromPlannerText: this.displaycontent(this.compincludepath, 'appointmentRemoveFromPlannerText'), updatingText: this.displaycontent(this.compincludepath, 'updatingText'), filledText: this.displaycontent(this.compincludepath, 'filledText'), filledHintText: this.displaycontent(this.compincludepath, 'filledHintText'), loginText: this.displaycontent(this.compincludepath, 'loginText'), loginHintText: this.displaycontent(this.compincludepath, 'loginHintText'), noAccessText: this.displaycontent(this.compincludepath, 'noAccessText'), noAccessHintText: this.displaycontent(this.compincludepath, 'noAccessHintText'), waitlistText: this.displaycontent(this.compincludepath, 'waitlistText'), waitlistRemovedText: this.displaycontent(this.compincludepath, 'waitlistRemovedText'), waitlistAddText: this.displaycontent(this.compincludepath, 'waitlistAddText'), waitlistRemoveText: this.displaycontent(this.compincludepath, 'waitlistRemoveText'), reservedText: this.displaycontent(this.compincludepath, 'reservedText'), reservedRemoveText: this.displaycontent(this.compincludepath, 'reservedRemoveText'), reserveAddText: this.displaycontent(this.compincludepath, 'reserveAddText'), reserveRemoveText: this.displaycontent(this.compincludepath, 'reserveRemoveText'), processingText: this.displaycontent(this.compincludepath, 'processingText'), cancelText: this.displaycontent(this.compincludepath, 'cancelText'), confirmText: this.displaycontent(this.compincludepath, 'confirmText'), reserveModalText1: this.displaycontent(this.compincludepath, 'reserveModalText1'), reserveModalText2: this.displaycontent(this.compincludepath, 'reserveModalText2'), waitlistModalText1: this.displaycontent(this.compincludepath, 'waitlistModalText1'), waitlistModalText2: this.displaycontent(this.compincludepath, 'waitlistModalText2'), conflictModalText1: this.displaycontent(this.compincludepath, 'conflictModalText1'), conflictModalText2: this.displaycontent(this.compincludepath, 'conflictModalText2'), conflictModalText3: this.displaycontent(this.compincludepath, 'conflictModalText3'), confirmModalTitle: this.displaycontent(this.compincludepath, 'confirmModalTitle'), processingModalTitle: this.displaycontent(this.compincludepath, 'processingModalTitle'), processingModalText: this.displaycontent(this.compincludepath, 'processingModalText'), cancelTitle: this.displaycontent(this.compincludepath, 'cancelTitle'), confirmTitle: this.displaycontent(this.compincludepath, 'confirmTitle') }; }, currentStatus: function() { if(this.sessionCheck) { if(this.attendancestatus == 'Reserved' || this.attendancestatus == 'Waitlist') { return this.attendancestatus; } else if(this.seatsqty > 0) { return 'Reserved'; } else if (this.waitlistqty > 0) { return 'Waitlist'; } else { return 'Filled'; } } else { return ''; } }, myshowTitleText: function() { if (this.computedEnabled){ if (this.addedtoplannerfinal){ if(this.appointment) { return this.content.appointmentRemoveFromPlannerText; } else { return this.buttonLabel; } } else { return this.buttonLabel; } } else { if(this.sessionCheck && this.seatrestriction) { if(this.currentStatus == 'Filled') { return this.content.filledHintText; } else if (this.regemail.length == 0) { return this.content.loginHintText; } else { return this.content.noAccessHintText; } } else { return this.disabledtext; } } }, tippyTitle: function() { if (!this.computedEnabled) { return this.myshowTitleText; } else { return ""; } }, scheduleConflict: function() { if(this.sessionCheck && this.attendancestatus == 'Conflict') { return true; } else { return false; } }, sessionCheck: function() { if(this.type == 'session' || this.type == 'calendar') { return true; } else { return false; } } }, methods: { checkStatus: function() { var vObj = this, requestObj = {}; requestObj["scheduleid"] = vObj.keys; if (!vObj.addedtoplannerfinal) { requestObj["status"] = vObj.currentStatus; } else { requestObj["status"] = "Remove"; } vObj.timesran += 1; if(vObj.timesran >= 5) { vObj.intervalid = clearInterval(vObj.intervalid); vObj.timesran = 0; vObj.loading = false; vObj.showMessage("error", vObj.content.processingText); } else { vObj.ajaxGet(vObj.path2approot + '/myshow/myshow-actions.cfm?action=sessionstatus&' + vObj.objectToURLValues(requestObj), // ajaxGet() defined in _global-mixin function(response) { // success if(response.DATA == 'Reserved') { vObj.showMessage("success", vObj.content.reservedText); } else if(response.DATA == 'Waitlist') { vObj.showMessage("success", vObj.content.waitlistText); } else if (requestObj["status"] == 'Remove') { if(vObj.currentStatus == 'Reserved') { vObj.showMessage("success", vObj.content.reservedRemoveText); } else { vObj.showMessage("success", vObj.content.waitlistRemovedText); } } vObj.intervalid = clearInterval(vObj.intervalid); vObj.timesran = 0; vObj.loading = false; vObj.addedtoplannerfinal = !vObj.addedtoplannerfinal; vObj.$emit('toggle-favorite', {type: vObj.type, keys: vObj.keys, status: response.DATA}); }, function(response) { // error }); // end ajaxGet } }, evaluateAdd: function() { if(this.computedEnabled) { if(this.type == 'session' && this.scheduleConflict) { this.showconflict = true; } else if (this.seatrestriction && this.addedtoplannerfinal && (this.type == 'session' || (this.type == 'calendar' && this.attendancestatus))) { this.showconfirm = true; } else { this.toggleAddToPlanner(); } } }, toggleAddToPlanner: function() { var myshowfunction = "" , requestObj = {} , vObj = this , callback = function(){ } , errormessage = ""; if (vObj.computedEnabled && !vObj.fromcalendar){ switch(vObj.type){ case "exhibitor": // if not added to planner then add if (!vObj.addedtoplannerfinal){ myshowfunction = "AddExhibitor"; requestObj["keys"] = vObj.keys; errormessage = "Error adding exhibitor to planner"; callback = function(){ vObj.addedtoplannerfinal = true; }; } else { myshowfunction = "RemoveExhibitor"; requestObj["keys"] = vObj.keys; errormessage = "Error removing exhibitor from planner"; callback = function(){ vObj.addedtoplannerfinal = false; }; } break; case "session": if (!vObj.addedtoplannerfinal){ myshowfunction = "AddSession"; requestObj["keys"] = vObj.keys; requestObj["status"] = vObj.currentStatus; errormessage = "Error adding session to planner"; callback = function(){ vObj.addedtoplannerfinal = true; }; } else { myshowfunction = "RemoveSession"; requestObj["keys"] = vObj.keys; requestObj["status"] = 'Remove'; errormessage = "Error removing session from planner"; callback = function(){ vObj.addedtoplannerfinal = false; }; } break; case "showfeature": if (!vObj.addedtoplannerfinal){ myshowfunction = "AddFavorite"; requestObj["keys"] = vObj.keys; requestObj["tablename"] = "ShowFeatures"; errormessage = "Error adding show feature to planner"; if (vObj.exhid){ requestObj["exhid"] = vObj.exhid; } callback = function(){ vObj.addedtoplannerfinal = true; }; } else { myshowfunction = "RemoveFavorite"; requestObj["keys"] = vObj.keys; requestObj["tablename"] = "ShowFeatures"; errormessage = "Error removing show feature from planner"; if (vObj.exhid){ requestObj["exhid"] = vObj.exhid; } callback = function(){ vObj.addedtoplannerfinal = false; }; } break; case "collateral": if (!vObj.addedtoplannerfinal){ myshowfunction = "AddFavorite"; requestObj["keys"] = vObj.keys; requestObj["tablename"] = "PressReleases"; errormessage = "Error adding collateral to planner"; if (vObj.exhid){ requestObj["exhid"] = vObj.exhid; } callback = function(){ vObj.addedtoplannerfinal = true; }; } else { myshowfunction = "RemoveFavorite"; requestObj["keys"] = vObj.keys; requestObj["tablename"] = "PressReleases"; errormessage = "Error removing collateral from planner"; if (vObj.exhid){ requestObj["exhid"] = vObj.exhid; } callback = function(){ vObj.addedtoplannerfinal = false; }; } break; case "special": if (!vObj.addedtoplannerfinal){ myshowfunction = "AddFavorite"; requestObj["keys"] = vObj.keys; requestObj["tablename"] = "ShowSpecials"; errormessage = "Error adding special to planner"; if (vObj.exhid){ requestObj["exhid"] = vObj.exhid; } callback = function(){ vObj.addedtoplannerfinal = true; }; } else { myshowfunction = "RemoveFavorite"; requestObj["keys"] = vObj.keys; requestObj["tablename"] = "ShowSpecials"; errormessage = "Error removing special from planner"; if (vObj.exhid){ requestObj["exhid"] = vObj.exhid; } callback = function(){ vObj.addedtoplannerfinal = false; }; } break; case "product": if (!vObj.addedtoplannerfinal){ myshowfunction = "AddFavorite"; requestObj["keys"] = vObj.keys; requestObj["tablename"] = "ExhibitorProducts"; errormessage = "Error adding product to planner"; if (vObj.exhid){ requestObj["exhid"] = vObj.exhid; } callback = function(){ vObj.addedtoplannerfinal = true; }; } else { myshowfunction = "RemoveFavorite"; requestObj["keys"] = vObj.keys; requestObj["tablename"] = "ExhibitorProducts"; errormessage = "Error removing product from planner"; if (vObj.exhid){ requestObj["exhid"] = vObj.exhid; } callback = function(){ vObj.addedtoplannerfinal = false; }; } break; case "guestappearances": if (!vObj.addedtoplannerfinal){ myshowfunction = "AddFavorite"; requestObj["keys"] = vObj.keys; requestObj["tablename"] = "exhibitor_guests"; errormessage = "Error adding guest appearance to planner"; if (vObj.exhid){ requestObj["exhid"] = vObj.exhid; } callback = function(){ vObj.addedtoplannerfinal = true; }; } else { myshowfunction = "RemoveFavorite"; requestObj["keys"] = vObj.keys; requestObj["tablename"] = "exhibitor_guests"; errormessage = "Error removing guest appearance from planner"; if (vObj.exhid){ requestObj["exhid"] = vObj.exhid; } callback = function(){ vObj.addedtoplannerfinal = false; }; } break; case "onlinecontact": if (!vObj.addedtoplannerfinal){ myshowfunction = "AddFavorite"; requestObj["keys"] = vObj.keys; requestObj["tablename"] = "AdditionalContacts"; errormessage = "Error adding online contact to planner"; if (vObj.exhid){ requestObj["exhid"] = vObj.exhid; } callback = function(){ vObj.addedtoplannerfinal = true; }; } else { myshowfunction = "RemoveFavorite"; requestObj["keys"] = vObj.keys; requestObj["tablename"] = "AdditionalContacts"; errormessage = "Error removing online contact from planner"; if (vObj.exhid){ requestObj["exhid"] = vObj.exhid; } callback = function(){ vObj.addedtoplannerfinal = false; }; } break; case "scheduledevent": if (!vObj.addedtoplannerfinal){ myshowfunction = "AddFavorite"; requestObj["keys"] = vObj.keys; requestObj["tablename"] = "ScheduledEvents"; errormessage = "Error adding event to planner"; if (vObj.exhid){ requestObj["exhid"] = vObj.exhid; } callback = function(){ vObj.addedtoplannerfinal = true; }; } else { myshowfunction = "RemoveFavorite"; requestObj["keys"] = vObj.keys; requestObj["tablename"] = "ScheduledEvents"; errormessage = "Error removing event from planner"; if (vObj.exhid){ requestObj["exhid"] = vObj.exhid; } callback = function(){ vObj.addedtoplannerfinal = false; }; } break; default: if (vObj.tablename){ if (!vObj.addedtoplannerfinal){ myshowfunction = "AddFavorite"; requestObj["keys"] = vObj.keys; requestObj["tablename"] = vObj.tablename; errormessage = "Error adding to planner"; if (vObj.exhid){ requestObj["exhid"] = vObj.exhid; } callback = function(){ vObj.addedtoplannerfinal = true; }; } else { myshowfunction = "RemoveFavorite"; requestObj["keys"] = vObj.keys; requestObj["tablename"] = vObj.tablename; errormessage = "Error removing from planner"; if (vObj.exhid){ requestObj["exhid"] = vObj.exhid; } callback = function(){ vObj.addedtoplannerfinal = false; }; } } } vObj.showconflict = false; vObj.showconfirm = false; vObj.loading = true; var return_to = encodeURIComponent(vObj.getCurrentURL()); vObj.ajaxGet(vObj.path2approot + '/myshow/myshow-actions.cfm?action=' + myshowfunction + "&" + vObj.objectToURLValues(requestObj) + "&return_to=" + return_to, // ajaxGet() defined in _global-mixin function(response){ // success if(vObj.type == "session" && vObj.seatrestriction) { vObj.intervalid = setInterval(function(){vObj.checkStatus()}, 2000); } else { vObj.loading = false; callback(); vObj.$emit('toggle-favorite', {type: vObj.type, keys: vObj.keys}); } }, function(response){ // error vObj.loading = false; if ("ERRORCODE" in response && response.ERRORCODE == "12345"){ location.href = vObj.path2approot + '/login/login.cfm'; } else { vObj.showMessage("error", "Error favoriting item"); } }); // end ajaxGet } // end if else if (vObj.fromcalendar){ vObj.$emit('toggle-favorite', {type: vObj.type, keys: vObj.keys}); } } // end toggleAddToPlanner } }); </script> <style> @-webkit-keyframes rotating /* Safari and Chrome */ { from { -webkit-transform: rotate(0deg); -o-transform: rotate(0deg); transform: rotate(0deg); } to { -webkit-transform: rotate(360deg); -o-transform: rotate(360deg); transform: rotate(360deg); } } @keyframes rotating { from { -ms-transform: rotate(0deg); -moz-transform: rotate(0deg); -webkit-transform: rotate(0deg); -o-transform: rotate(0deg); transform: rotate(0deg); } to { -ms-transform: rotate(360deg); -moz-transform: rotate(360deg); -webkit-transform: rotate(360deg); -o-transform: rotate(360deg); transform: rotate(360deg); } } .rotating { -webkit-animation: rotating 2s linear infinite; -moz-animation: rotating 2s linear infinite; -ms-animation: rotating 2s linear infinite; -o-animation: rotating 2s linear infinite; animation: rotating 2s linear infinite; } </style> <script type="text/javascript"> var graphqlmixin = { data: function() { return { graphqlstage: 'production', graphqllink: '', graphqlaccesstoken: '', graphqlrefreshtoken: '', graphqlshowid: '' } }, created: async function() { // When this mixin is created, we need to connect the user this.graphqllink = 'https://graphql.mapyourshow.com/' + this.graphqlstage + '/graphql'; }, watch: { }, computed: { }, methods: { sendGraphQLPOSTCall: function(query, queryVariables, queryToResend, queryVariablesToResend) { var vObj = this; const controller = new AbortController(); setTimeout(() => controller.abort(), 60000); fetch(this.graphqllink, { method: "POST", body: JSON.stringify({query, variables: queryVariables}), headers: { "showid": this.graphqlshowid, "token": this.graphqlaccesstoken, "Content-Type": "application/json" }, signal: controller.signal }).then( function(fetchResponse) { fetchResponse.json().then( function(response) { // JEFF :: TODO :: Change the response so it's not a general error message. Needs to be more speficif towards expired access tokens if(typeof response.errors !== 'undefined' && response.errors[0].message == 'General Error. Contact MYS.' && vObj.graphqlshowid.length > 0) { vObj.refreshAccessToken(query, JSON.stringify(queryVariables)); } else if(typeof response.data.authorize !== 'undefined' && typeof response.data.authorize[0].accesstoken !== 'undefined' && response.data.authorize[0].accesstoken[0] != 'Invalid Login') { vObj.graphqlaccesstoken = response.data.authorize[0].accesstoken[0]; vObj.resetSessionAccessToken(vObj.graphqlaccesstoken); vObj.sendGraphQLPOSTCall(queryToResend, queryVariablesToResend); } else if(typeof response.data.authorize !== 'undefined' && typeof response.data.authorize[0].accesstoken !== 'undefined' && response.data.authorize[0].accesstoken[0] == 'Invalid Login') { document.getElementById('logoutformmys').submit(); } } ).catch( function(error) { /* console.log(error); */ } ); }) .catch( function(error) { /* console.log(error); */ errorCallback(error); } ); }, refreshAccessToken: function(queryToResend, queryVariablesToResend) { var query = `Query.authorize(username: $username, refreshtoken: $refreshtoken, app: $app, showid: $showid) { accesstoken refreshtoken }`; var query = `query Authorize( $username: String!, $refreshtoken: String!, $app: String!, $showid: String! ) { authorize( username: $username, refreshtoken: $refreshtoken, app: $app, showid: $showid ) { accesstoken refreshtoken } }`; var queryVariables = { 'username': this.regemail, 'refreshtoken': this.graphqlrefreshtoken, 'app': 'directory', 'showid': this.graphqlshowid } console.log(queryVariables); this.sendGraphQLPOSTCall(query, queryVariables, queryToResend, queryVariablesToResend); }, resetSessionAccessToken: function(newAccessToken) { var vObj = this, formData = new FormData(); formData.append('newAccessToken', newAccessToken) vObj.ajaxPost(vObj.path2approot + '/myshow/myshow-actions.cfm?action=updateAccessToken', formData, // ajaxPost() defined in _global-mixin function(response) { // success console.log('Access Token Updated'); }, function(response) { // error console.log('There was an error updating access token'); } ); // end ajaxPost } } } </script> <script type="text/javascript"> var chatmixin = { mixins: [graphqlmixin], data: function() { return { // Socket information socket: null, apikey: 'mwskxdxctb', stage: 'production', unnamedvariable: '', // My contact information username: '', userid: '', userimage: 'https://image.flaticon.com/icons/svg/145/145867.svg', usercompany: '', usertitle: '', // Who I am talking to's information talkingtouserid: '', talkingtousername: '', talkingtouserimage: '', talkingtousercompany: '', talkingtousertitle: '', talkingtouserstatus: '', loadingmessages: false, // Array of users I am actively talking to and default view activechats:[], // Array of my favorited contacts // JEFF :: TODO :: Need to get all favorited contacts, right now it is entire list allcontacts: [ ], // Messages in the current conversation, max number of messages loaded in each batch, and the option to load more messagelist: [], maxmessagesloaded: 20, showloadmoremessages: false, onlinecontactsdata: [], // Messages in blocked converstaion, max number, option to load more blocked messages, and blocked contacts blockeduserid: null, blockedmessagelist: [], showloadmoreblockedmessages: false, blockedusers: [ ], // Determines is there is a new message from another user outside of the current chat newnotification: false, audio: null, //Determines if a user has joined in the group chat or not joinedgroupchat: false, groupchatid: '', groupchathost: 0, groupchatmod: 0, groupchatadmin: 0, isgroupchat: false, loadingnewuser: false, showdirectmessagemodal: false, showReplyModal: false, replymessageusername: '', replymessage: '', replymessagetime: null, replymessageid: '', // List of roles assigned to the user roles: [ ], rolesthatcanchat: [ ], // Array of all online users for this show onlineusers: [ ], currenturl: window.location.pathname } }, created: async function() { // When this mixin is created, we need to connect the user // if(this.userid.length > 0) // { await this.connectUser(); var vObj = this; vObj.audio = new Audio(this.path2approot + '/assets/audio/notification.wav'); window.onbeforeunload = function() { vObj.removeUserConnection(); } // } }, watch: { }, computed: { rolecansendmessages: function() { // Returns true if at least one of the roles I have assigned to me is allowed to initiate messages with other users return this.roles.filter(item1 => this.rolesthatcanchat.some(item2 => item1 === item2)).length > 0 } }, methods: { removeUserConnection: function() { var removeuserconnectionaction = { "action": "removeuserconnection", "showid": this.showid.toLowerCase(), "userid": this.userid }; this.socket.send(JSON.stringify(removeuserconnectionaction)); }, closeChatWindow: function() { this.talkingtouserid = ''; this.talkingtousername = ''; }, /* Connect a user to the websocket */ connectUser: async function() { var vObj = this; this.socket = await new WebSocket('wss://' + this.apikey + '.execute-api.us-east-1.amazonaws.com/' + this.stage); this.socket.onclose = async function(e) { vObj.connectUser(); } // Method ran once socket is opened this.socket.onopen = async function(e) { if(vObj.userid.length > 0) { var connectuseraction = { "action": "connectuser", "showid": vObj.showid.toLowerCase(), "userid": vObj.userid, 'groupchatconnection': vObj.groupchatid.length > 0 || vObj.isgroupchat ? 1234 : 1, 'unnamedvariable': vObj.unnamedvariable, 'thispageurl': vObj.thispageurl } await vObj.socket.send(JSON.stringify(connectuseraction)); } } // When the socket receives a message, do something this.socket.onmessage = function(event, callback) { var messagedata = JSON.parse(event.data), messageclass = ''; /* Based on what type of message was received, we are going to do different things */ /* New message received */ if(messagedata.messagetype == 'newmessage' && vObj.groupchatid == '') { if(vObj.hasnetworking && typeof messagedata.userstatus !== "undefined" && messagedata.userstatus.toLowerCase() == 'offline') { var formData = new FormData(); formData.append("userid", messagedata.to.split('[')[1].split(']')[0]); formData.append("message", messagedata.message); formData.append("messagetime", vObj.formatSessionTime(new Date(messagedata.messagetime))); formData.append("username", messagedata.username); vObj.ajaxPost(vObj.path2approot + '/myshow/myshow-actions.cfm?action=sendofflineemail', formData, // ajaxPost() defined in _global-mixin function(response) { // success // console.log('Message sent successfully', response); }, function(response) { // error console.log('Error occurred', response); } ); // end ajaxPost } if(messagedata.userid != vObj.userid.replace('^ShowID^', vObj.graphqlshowid)) { vObj.audio.play(); } var showasunread = true; if(messagedata.userid == vObj.userid.replace('^ShowID^', vObj.graphqlshowid) || messagedata.userid == vObj.talkingtouserid.replace('^ShowID^', vObj.graphqlshowid)) { if(messagedata.userid == vObj.talkingtouserid.replace('^ShowID^', vObj.graphqlshowid) || messagedata.to == vObj.talkingtouserid.replace('^ShowID^', vObj.graphqlshowid)) { showasunread = false; if(messagedata.userid == vObj.userid.replace('^ShowID^', vObj.graphqlshowid)) { var messageclass = 'o-message_sent'; } else { var messageclass = 'o-message_received'; vObj.markMessagesAsRead(); } vObj.messagelist.push( { "msgclass": messageclass, "message": messagedata.message, "messagetime": vObj.formatSessionTime(new Date(messagedata.messagetime)), "username": messagedata.username, "userimage": messagedata.userimage, "lastread": false }); } if(messagedata.userid == vObj.userid.replace('^ShowID^', vObj.graphqlshowid)) { vObj.reorderActiveChats(messagedata.to.replace(vObj.graphqlshowid, '^ShowID^'), showasunread, messagedata.messagetime); } else { vObj.reorderActiveChats(messagedata.userid.replace(vObj.graphqlshowid, '^ShowID^'), showasunread, messagedata.messagetime); } } else if(vObj.onlinecontactsdata.length == 0) { vObj.reorderActiveChats(messagedata.userid.replace(vObj.graphqlshowid, '^ShowID^'), showasunread, messagedata.messagetime); } else { sessionStorage.setItem("newnotification", true); vObj.newnotification = true; } } else if(messagedata.messagetype == 'unnamedvariable' && messagedata.value.length > 0) { vObj.unnamedvariable = messagedata.value; if(vObj.onlinecontactsdata.length == 0 && vObj.currenturl.search('/myshow/chat.cfm') > -1) { // vObj.loadContacts(); } else { vObj.getContactStatuses('online'); } vObj.$emit('socket-connected'); } else if(messagedata.messagetype == 'messagedeleted' && messagedata.groupchatid == vObj.groupchatid) { vObj.messagelist = vObj.messagelist.filter(function( obj ) { return obj.messageid !== messagedata.messageid; }); } else if(messagedata.messagetype == 'userbanned' && messagedata.groupchatid == vObj.groupchatid) { vObj.messagelist = vObj.messagelist.filter(function( obj ) { return obj.userid.replace('^ShowID^', vObj.graphqlshowid) !== messagedata.userid; }); if(messagedata.userid == vObj.userid.replace('^ShowID^', vObj.graphqlshowid)) { vObj.joinedgroupchat = false; var url = window.location.href; if(url.indexOf('?') > -1) { url += '&banned=true' } else { url += '?banned=true' } window.location.href = url; } } else if(messagedata.messagetype == 'newgroupmessage' && messagedata.groupchatid == vObj.groupchatid) { if(messagedata.userid == vObj.userid.replace('^ShowID^', vObj.graphqlshowid)) { var messageclass = 'o-message_sent'; } else { var messageclass = 'o-message_received'; } /* Check if the user's roles and the message roles list have intersecting values */ var intersectingRoles = JSON.parse(messagedata.blockedroles).filter(function(n) { return vObj.roles.indexOf(n) !== -1;}); vObj.messagelist.push( { "msgclass": messageclass, "message": messagedata.message, "messagetime": vObj.formatSessionTime(new Date(messagedata.messagetime)), "username": messagedata.username, "userimage": messagedata.userimage, "lastread": false, "messageid": messagedata.messageid, "ishost": messagedata.ishost, "ismod": messagedata.ismod, "isadmin": messagedata.isadmin, "isexh": messagedata.isexh, "userid": messagedata.userid.replace(vObj.graphqlshowid, '^ShowID^'), "isquestion": messagedata.message.search('\\?') > -1 ? true : false, "bannedrole": intersectingRoles.length > 0, "originalmessageid": messagedata.originalmessageid }); } else if(messagedata.messagetype == 'loadedgroupmessages' && messagedata.groupchatid == vObj.groupchatid) { var currentdate = new Date(); vObj.showloadmoremessages = false; vObj.showloadmoreblockedmessages = false; messagedata.messages.forEach(function(message, index) { if(message.userid == vObj.userid) { var messageclass = 'o-message_sent'; } else { var messageclass = 'o-message_received'; } var messagedate = new Date(message.messagetime); /* Check if the user's roles and the message roles list have intersecting values */ var intersectingRoles = JSON.parse(message.blockedroles).filter(function(n) { return vObj.roles.indexOf(n) !== -1;}); vObj.messagelist.push( { "msgclass": messageclass, "messageid": message.messageid, "message": message.message, "messagetime": (currentdate.getDate() != messagedate.getDate() ? vObj.formatSessionDate(messagedate) : vObj.formatSessionTime(messagedate)), "username": message.username, "userimage": message.userimage, "lastread": (index > 0 && message.status == 'unread' && messagedata.messages[index -1].status != 'unread' ? true : false), "ismod": message.ismod, "isadmin": message.isadmin, "ishost": message.ishost, "userid": message.userid, "isexh": message.isexh, "isquestion": message.message.search('\\?') > -1 ? true : false, "bannedrole": intersectingRoles.length > 0, "originalmessageid": message.originalmessageid }); }); } else if(messagedata.messagetype == 'loadedmessages') { if(messagedata.messages.length > 0) { vObj.markMessagesAsRead(); } var currentdate = new Date(); if(this.blockeduserid !== null) { vObj.showloadmoreblockedmessages = messagedata.moremessages; vObj.showloadmoremessages = false; } else { vObj.showloadmoremessages = messagedata.moremessages; vObj.showloadmoreblockedmessages = false; } messagedata.messages.forEach(function(message, index) { if(message.userid == vObj.userid.replace('^ShowID^', vObj.graphqlshowid)) { var messageclass = 'o-message_sent'; } else { var messageclass = 'o-message_received'; } var messagedate = new Date(message.messagetime); if(vObj.blockeduserid !== null) { vObj.blockedmessagelist.unshift( { "msgclass": messageclass, "message": message.message, "messagetime": (currentdate.getDate() != messagedate.getDate() ? vObj.formatSessionDate(messagedate) : vObj.formatSessionTime(messagedate)), "username": message.username, "userimage": message.userimage, "lastread": (index > 0 && message.status == 'unread' && messagedata.messages[index -1].status != 'unread' ? true : false) }); } else { vObj.messagelist.unshift( { "msgclass": messageclass, "message": message.message, "messagetime": (currentdate.getDate() != messagedate.getDate() ? vObj.formatSessionDate(messagedate) : vObj.formatSessionTime(messagedate)), "username": message.username, "userimage": message.userimage, "lastread": (index > 0 && message.status == 'unread' && messagedata.messages[index -1].status != 'unread' ? true : false) }); } }); vObj.loadingmessages = false; } else if(messagedata.messagetype == 'loadedusers') { messagedata.users.forEach(function(userdata, index) { vObj.activechats.push( { "isconnected": userdata.isconnected, "contactstatus": userdata.contactstatus, "username": userdata.username, "userid": userdata.userid, "userimage": userdata.avatar, "messagesread": false, "lastmessagestatus": userdata.lastmessagestatus, "lastmessagefrom": userdata.lastmessagefromuserid, "title": userdata.title, "company": userdata.company, "lastmessagetime": userdata.lastmessagetime }); }); } else if(messagedata.messagetype == 'userdata') { if(Object.keys(messagedata.userdata).length > 0) { if(vObj.loadingnewuser) { messagedata.userdata.userid = messagedata.userdata.userid.replace(vObj.graphqlshowid, '^ShowID^'); messagedata.userdata.lastmessagestatus = 'unread'; messagedata.userdata.contactstatus = messagedata.userdata.status; /* Time formatting functin found here: https://stackoverflow.com/questions/12945003/format-date-as-yyyy-mm-ddthhmmss-sssz */ messagedata.userdata.lastmessagetime = new Date(new Date().getTime() - new Date().getTimezoneOffset() * 60000).toISOString(); messagedata.userdata.lastmessagestatus = 'unread'; vObj.activechats.unshift(messagedata.userdata); vObj.loadingnewuser = false; } else if(vObj.blockedusers.length > 0) { vObj.blockedusers.forEach(function(contact, index) { if(messagedata.userdata.isconnected == 'true' && messagedata.userdata.userid == contact.userid.replace('^ShowID^', vObj.graphqlshowid)) { vObj.blockedusers[index].contactstatus = 'Available'; } }); } else { vObj.onlinecontactsdata.forEach(function(contact, index) { if(messagedata.userdata.isconnected == 'true' && messagedata.userdata.userid == contact.chatid.replace('^ShowID^', vObj.graphqlshowid)) { vObj.onlinecontactsdata[index].contactstatus = 'Available'; } }); } } } else if(messagedata.messagetype == 'availableusers') { // Store all the online users in a single array. This way when a search is done, we don't have to get all users who are online every time vObj.onlineusers = messagedata.users; // The list of online users may not return before the search runs, so we need to loop over all users in this instance vObj.onlineusers.forEach(function(userid, index) { vObj.allcontacts.forEach(function(contact, index) { if(contact.userid === userid) { vObj.allcontacts[index].contactstatus = 'Available'; } }); }); } else if(messagedata.messagetype == 'userblocked') { if(vObj.userid == messagedata.removedfrom.replace(vObj.graphqlshowid, '^ShowID^')) { if(messagedata.blockstatus == 'true') { /* If the current user we are talking to has been blocked, reset the active user who we are talking to */ if(vObj.talkingtouserid == messagedata.useridtoremove.replace(vObj.graphqlshowid, '^ShowID^')) { vObj.talkingtouserid = ''; } /* Remove the blocked user from the contact list */ vObj.allcontacts = vObj.allcontacts.filter(function(contact) { return contact.userid !== messagedata.useridtoremove.replace(vObj.graphqlshowid, '^ShowID^'); }); /* Remove the user from the list of active chats */ vObj.activechats = vObj.activechats.filter(function(contact) { return contact.userid !== messagedata.useridtoremove.replace(vObj.graphqlshowid, '^ShowID^'); }); } else { /* Remove the user from the list of active chats */ vObj.blockedusers = vObj.blockedusers.filter(function(contact) { return contact.userid !== messagedata.useridtoremove.replace(vObj.graphqlshowid, '^ShowID^'); }); } vObj.$emit('user-blocked', messagedata.blockstatus); } else if(vObj.userid == messagedata.useridtoremove.replace(vObj.graphqlshowid, '^ShowID^')) { if(messagedata.blockstatus == 'true') { if(vObj.talkingtouserid == messagedata.removedfrom.replace(vObj.graphqlshowid, '^ShowID^')) { vObj.talkingtouserid = ''; vObj.talkingtousername = ''; vObj.talkingtouserimage = ''; vObj.talkingtousercompany = ''; vObj.talkingtousertitle = ''; vObj.talkingtouserstatus = ''; } /* If the current user we are talking to has been blocked, reset the active user who we are talking to */ if(vObj.talkingtouserid == messagedata.removedfrom.replace(vObj.graphqlshowid, '^ShowID^')) { vObj.talkingtouserid = ''; } /* Remove the blocked user from the contact list */ vObj.allcontacts = vObj.allcontacts.filter(function(contact) { return contact.userid !== messagedata.removedfrom.replace(vObj.graphqlshowid, '^ShowID^'); }); /* Remove the user from the list of active chats */ vObj.activechats = vObj.activechats.filter(function(contact) { return contact.userid !== messagedata.removedfrom.replace(vObj.graphqlshowid, '^ShowID^'); }); } } location.reload(); } else if(messagedata.messagetype == 'userstatus') { if(messagedata.status == 'Available') { // If new online user, add them to the online users array vObj.onlineusers.push(messagedata.userid); } else { // If user signed off, remove them from the online users array vObj.onlineusers.splice(vObj.onlineusers.indexOf(messagedata.userid), 1); } // Loop over all existing contact search results and update their status vObj.allcontacts.forEach(function(contact, index) { if(contact.userid === messagedata.userid) { vObj.allcontacts[index].contactstatus = messagedata.status; } }); vObj.onlinecontactsdata.forEach(function(contact, index) { if(contact.chatid === messagedata.userid) { vObj.onlinecontactsdata[index].contactstatus = messagedata.status; } }); // Loop over all existing conversations and update that user's status vObj.activechats.forEach(function(contact, index) { if(contact.userid === messagedata.userid) { vObj.activechats[index].contactstatus = messagedata.status; } }); } } }, reorderActiveChats: function(newmessagefromuserid, showasunread, messagetime) { /* This function will move active chats around so that the most recent is moved towards the top This prevent us from having to constantly laod up a new contact list every time a message is sent */ if(this.activechats.length > 0) { for(var i = 0; i < this.activechats.length; i++) { if(this.activechats[i].userid == newmessagefromuserid) { if(showasunread) { this.activechats[i].lastmessagestatus = 'unread'; } /* Time formatting functin found here: https://stackoverflow.com/questions/12945003/format-date-as-yyyy-mm-ddthhmmss-sssz */ this.activechats[i].lastmessagetime = new Date(messagetime).toISOString(); this.array_move(this.activechats, i, 0); break; } else if(i + 1 == this.activechats.length) { // Made it to the end of the array and didn't find the user. Make a getuser call to get the user's data and populate the array with it this.loadingnewuser = true; this.getUser(newmessagefromuserid); } } } else { // Made it to the end of the array and didn't find the user. Make a getuser call to get the user's data and populate the array with it this.loadingnewuser = true; this.getUser(newmessagefromuserid); } }, disconnectUser: async function() { var removeuseraction = { "action": "disconnectuser", "showid": this.showid.toLowerCase(), "userid": this.userid } this.socket.send(JSON.stringify(removeuseraction)); this.socket.close(); }, joinGroupChat: async function(username, message, messagetime) { if(this.groupchatid.length > 0) { var query = `query MYSChat( $action: String!, $groupchatid: String!, $ishost: Int!, $userid: String!, ) { myschat( action: $action, groupchatid: $groupchatid, ishost: $ishost, userid: $userid, ) { result } }`; var queryvariables = { 'action': "U2FsdGVkX1+BBjI7nN9e6G/8HtHgEst1bXZQkzBSuKpJNMLUgbMbxcRLObzsGNbL", 'groupchatid': this.groupchatid, 'ishost': this.groupchathost ? 1 : 0, 'userid': this.userid } this.sendGraphQLPOSTCall(query, JSON.stringify(queryvariables)); this.joinedgroupchat = true; if(message && this.messagelist.length == 0) { this.messagelist.push( { "msgclass": 'o-message_received', "messageid": new Date().getTime(), "message": message, "messagetime": messagetime, "username": username, "userimage": '', "lastread": true, "ismod": false, "isadmin": false, "ishost": false, "userid": 'show:^ShowID^-p-[' + this.graphqlshowid + ']', "isquestion": false, "originalmessageid": '' }); } // Only try to load the messages if the only existing message is the default group message, or none at all if(this.messagelist.length <= 1) { this.loadGroupMessages(0, 50); } } }, removeUserFromGroup: async function() { this.joinedgroupchat = false; var removeUserAction = { "action": "removeuserfromgroup", "groupchatid": this.groupchatid, "removeduserid": this.userid } this.socket.send(JSON.stringify(removeUserAction)); }, sendGroupMessage: async function(newmessage, originalmessageid) { const text = newmessage.replace(/</g, '<').replace(/>/g, '>').trim(); var isanswer = false; if(text === '') { return -1; //empty messages cannot be sent } else { if(this.replymessageusername.length > 0 && this.replymessage.length > 0) { isanswer = true; newmessage = '<reply><strong>' + this.replymessageusername + '</strong> - ' + this.replymessage + '</reply>' + newmessage; this.closeReplyModal(); } var query = `query MYSChat( $action: String!, $messagetext: String!, $fromuserid: String!, $userid: String!, $groupchatid: String!, $ishost: Int!, $ismod: Int!, $company: String!, $isadmin: Int!, $isanswer: Boolean!, $messagesetid: String! ) { myschat( action: $action, messagetext: $messagetext, fromuserid: $fromuserid, userid: $userid, groupchatid: $groupchatid, ishost: $ishost, company: $company, ismod: $ismod, isadmin: $isadmin, isanswer: $isanswer, messagesetid: $messagesetid ) { result } }`; var queryvariables = { 'action': "U2FsdGVkX19oJPD02S4ulPf6C9gedpY9PVHjoBwEClzLmIz9B9Ip3K7q95y/WED8/VqXUgkEnx9uYtIyqn5rTg==", 'messagetext': newmessage, 'fromuserid': this.userid, 'userid': this.userid, 'groupchatid': this.groupchatid, 'ishost': this.groupchathost, 'company': this.isexhibitor ? 'exhibitor' : 'attendee', 'ismod': this.groupchatmod, 'isadmin': this.groupchatadmin, 'isanswer': isanswer, 'messagesetid': this.replymessageid } // Blank out the reply message id once it has been sent if(this.replymessageid.length > 0) { this.replymessageid = ''; } this.sendGraphQLPOSTCall(query, JSON.stringify(queryvariables)); } }, deleteGroupMessage: async function(messageid) { var query = `query MYSChat( $action: String!, $groupchatid: String!, $userid: String!, $removedmessageid: String!, ) { myschat( action: $action, groupchatid: $groupchatid, userid: $userid, removedmessageid: $removedmessageid, ) { result } }`; var queryvariables = { 'action': "U2FsdGVkX1/EemVitj8A3u0ylvr0mCpdVN56fRwDHVBBllrQxraMmrmf7LYaeP1e+ce4JxjHSwtcukP5c56/Dw==", 'groupchatid': this.groupchatid, 'userid': this.userid, 'removedmessageid': messageid } this.sendGraphQLPOSTCall(query, JSON.stringify(queryvariables)); }, deleteUser: async function (userid, countasstrike) { var query = `query MYSChat( $action: String!, $groupchatid: String!, $userid: String!, $removeduserid: String!, $banned: String!, $countasstrike: String! ) { myschat( action: $action, groupchatid: $groupchatid, userid: $userid, removeduserid: $removeduserid, banned: $banned, countasstrike: $countasstrike ) { result } }`; var queryvariables = { 'action': "U2FsdGVkX19aFHuca3dk1QqHN+tZ/CiqTqWVdet5PqJ4BB86v96Zh+BDXXJfwmdaP3aouu5CENcnymsvh1dGVw==", 'groupchatid': this.groupchatid, 'userid': this.userid, 'removeduserid': userid, 'banned': 'true', 'countasstrike': countasstrike.toString() }; this.sendGraphQLPOSTCall(query, JSON.stringify(queryvariables)); }, openDirectMessageModal: function(userid, username) { this.talkingtouserid = userid; this.talkingtousername = username; this.showdirectmessagemodal = true; }, closeDirectMessageModal: function() { this.showdirectmessagemodal = false; }, openReplyModal: function(username, message, messagetime, messageid) { this.showReplyModal = true; this.replymessageid = messageid; this.replymessageusername = username; this.replymessage = message; this.replymessagetime = messagetime; }, closeReplyModal: function() { this.showReplyModal = false; this.replymessage = ''; this.replymessageusername = ''; this.replymessagetime = null; }, sendDirectMessage: async function(newmessage) { this.showdirectmessagemodal = false; this.sendMessage(newmessage); }, sendMessage: async function(newmessage) { const text = newmessage.replace(/</g, '<').replace(/>/g, '>').trim(); if(text === '') { return -1; //empty messages cannot be sent } else { var query = `query MYSChat( $action: String!, $messagetext: String!, $fromuserid: String!, $userid: String!, $touserid: String!, ) { myschat( action: $action, messagetext: $messagetext, fromuserid: $fromuserid, userid: $userid, touserid: $touserid, ) { result } }`; var queryvariables = { 'action': "U2FsdGVkX1/pLmGw+zUw8vqmxJf8scHewScrGjstafS4a03OoPkZ1E1U+h5ontIGAyEpF903/BkHfuA1fWq7xg==", 'messagetext': newmessage, 'fromuserid': this.userid, 'userid': this.userid, 'touserid': this.talkingtouserid } this.sendGraphQLPOSTCall(query, JSON.stringify(queryvariables)); } }, markMessagesAsRead: async function() { var query = `query MYSChat( $action: String!, $fromuserid: String!, $userid: String!, $touserid: String!, ) { myschat( action: $action, fromuserid: $fromuserid, userid: $userid, touserid: $touserid, ) { result } }`; var queryvariables = { 'action': "U2FsdGVkX1965QOqHjdEpEL2FVIdcP6Gvp6l5/4wxAlyPoAw6B8qmY/X159VQqAErHZxFeRgUCY2ET7ORIQNKw==", 'fromuserid': this.talkingtouserid, 'userid': this.userid, 'touserid': this.userid } this.sendGraphQLPOSTCall(query, JSON.stringify(queryvariables)); }, loadMessages: async function(startingindex, endingindex, loadingblocked) { var messagesetid; if(loadingblocked !== undefined && loadingblocked) { var messagesetid = 'messageset:' + [this.userid, this.blockeduserid].sort().join('-') if(startingindex == 0) { this.blockedmessagelist = []; } } else if(this.talkingtouserid !== null) { var messagesetid = 'messageset:' + [this.userid, this.talkingtouserid].sort().join('-') if(startingindex == 0) { this.messagelist = []; } } var query = `query MYSChat( $action: String!, $fromuserid: String!, $userid: String!, $touserid: String!, $firstmessageindex: String!, $lastmessageindex: String!, $unnamedvariable: String!, ) { myschat( action: $action, fromuserid: $fromuserid, userid: $userid, touserid: $touserid, firstmessageindex: $firstmessageindex, lastmessageindex: $lastmessageindex, unnamedvariable: $unnamedvariable, ) { result } }`; var queryvariables = { 'action': "U2FsdGVkX19HuNnApIC9L4LI/wng0/KZoEz0WrY0fj8P0PH8OSEzdGJ69kN0f6WSVCyak63GcITKaKWgyw48KA==", 'fromuserid': this.userid, 'userid': this.userid, 'touserid': loadingblocked !== undefined && loadingblocked ? this.blockeduserid : this.talkingtouserid, 'firstmessageindex': startingindex.toString(), 'lastmessageindex': endingindex.toString(), 'unnamedvariable': this.unnamedvariable } this.sendGraphQLPOSTCall(query, queryvariables); var vObj = this; setTimeout(function() { vObj.loadingmessages = false; }, 4000); }, loadGroupMessages: async function(startingindex, endingindex) { var query = `query MYSChat( $action: String!, $groupchatid: String!, $userid: String!, $firstmessageindex: String!, $lastmessageindex: String!, $unnamedvariable: String!, ) { myschat( action: $action, groupchatid: $groupchatid, userid: $userid, firstmessageindex: $firstmessageindex, lastmessageindex: $lastmessageindex, unnamedvariable: $unnamedvariable, ) { result } }`; var queryvariables = { 'action': "U2FsdGVkX1/TAYOddO6Wdv7svNYAY+WUwfb6KLoejB7r/6hDifDojz0WQpLDHWR09mygvBbQ+OtciSt+2ZpTTw==", 'groupchatid': this.groupchatid, 'userid': this.userid, 'firstmessageindex': startingindex.toString(), 'lastmessageindex': endingindex.toString(), 'unnamedvariable': this.unnamedvariable } this.sendGraphQLPOSTCall(query, JSON.stringify(queryvariables)); }, loadContacts: async function() { this.activechats = []; var query = `query MYSChat( $action: String!, $userid: String!, $unnamedvariable: String!, ) { myschat( action: $action, userid: $userid, unnamedvariable: $unnamedvariable, ) { result } }`; var queryvariables = { 'action': "U2FsdGVkX18yyTTAhFDNuObdsUpi2tCFTl9Cpax/Pz72yIvMK84Ey0VBz4PR3Uu5Q9RscmXWLT8fiBJK8K/qPA==", 'userid': this.userid, 'unnamedvariable': this.unnamedvariable } this.sendGraphQLPOSTCall(query, JSON.stringify(queryvariables)); }, addContact: async function(addingtouserid, newuserid) { var query = `query MYSChat( $action: String!, $addingtouserid: String!, $newuserid: String!, $userid: String! ) { myschat( action: $action, addingtouserid: $addingtouserid, newuserid: $newuserid, userid: $userid ) { result } }`; var queryvariables = { 'action': "U2FsdGVkX18220RL+QNCo1xiiYfL35C1ZftzYtNcH2p+PrhAJsDjx7MmLIcy3lRY4mSmHDn4nrD4wcevS+mYNw==", 'addingtouserid': addingtouserid, 'newuserid': newuserid, 'userid': this.userid } this.sendGraphQLPOSTCall(query, JSON.stringify(queryvariables)); }, updateConvo: function(selecteduserid, selectedusername, selectedusercompany, selectedusertitle, selecteduserimage, selecteduserstatus) { this.loadingmessages = true; this.blockeduserid = null; for(var i = 0; i < this.activechats.length; i++) { if(this.activechats[i].userid == selecteduserid) { this.activechats[i].lastmessagestatus = 'read'; break; } } this.showloadmoremessages = false; this.talkingtouserid = selecteduserid; this.talkingtouserstatus = selecteduserstatus; this.talkingtousername = selectedusername; this.talkingtousercompany = selectedusercompany; this.talkingtousertitle = selectedusertitle; this.talkingtouserimage = selecteduserimage; this.loadMessages(0, this.maxmessagesloaded); }, getUser: function(userid) { var query = `query MYSChat( $action: String!, $userid: String!, $touserid: String!, $unnamedvariable: String!, ) { myschat( action: $action, userid: $userid, touserid: $touserid, unnamedvariable: $unnamedvariable, ) { result } }`; var queryvariables = { 'action': "U2FsdGVkX1/1FqiHaZ/OMcU3i44g971ItFp+DPjmiwkYaX6IK8EFmbHYFAi2Lton", 'userid': this.userid, 'touserid': userid, 'unnamedvariable': this.unnamedvariable } this.sendGraphQLPOSTCall(query, JSON.stringify(queryvariables)); }, getContactStatuses: async function(type) { var vObj = this; if(type == 'online') { this.onlinecontactsdata.forEach(async function(contact, index) { if(contact.isreguser) { vObj.getUser(contact.chatid); } }); } else if(type == 'all') { var query = `query MYSChat( $action: String!, $userid: String!, $unnamedvariable: String!, ) { myschat( action: $action, userid: $userid, unnamedvariable: $unnamedvariable, ) { result } }`; var queryvariables = { 'action': "U2FsdGVkX184Bh62aqxxE14S6dvVmacxU4aWmbtv8GiFoGzeyYCzqco6VsEmMVDPB5IUMfcaWhxRiptjVqrZXg==", 'userid': this.userid, 'unnamedvariable': this.unnamedvariable, } this.sendGraphQLPOSTCall(query, JSON.stringify(queryvariables)); } else if(type == 'archived') { this.blockedusers.forEach(async function(contact, index) { vObj.getUser(contact.userid); }); } }, blockContact: function(contact) { if(contact.banned) { var message = 'Are you sure you want to block ' + contact.username + '? They will not be able to send you messages if you proceed.'; } else { var message = 'Are you sure you want to unblock ' + contact.username + '? This will allow them to contact you.'; } if(confirm(message)) { var query = `query MYSChat( $action: String!, $unnamedvariable: String!, $removingfromuserid: String!, $removeduserid: String!, $userid: String!, $banned: String! ) { myschat( action: $action, unnamedvariable: $unnamedvariable, removingfromuserid: $removingfromuserid, removeduserid: $removeduserid, userid: $userid, banned: $banned ) { result } }`; var queryvariables = { 'action': "U2FsdGVkX1+9aJ6YjNbhQa7bdDwSjUY2WI/+Jswg4KdW12xsTZUft9nzQXkoC7m2", 'unnamedvariable': this.unnamedvariable, 'removingfromuserid': this.userid, 'removeduserid': contact.userid, 'userid': this.userid, 'banned': contact.banned.toString() } this.sendGraphQLPOSTCall(query, JSON.stringify(queryvariables)); } else { alert('Action averted.'); } /* Block user lambda function name encrypted: */ }, array_move: function(arr, old_index, new_index) { if (new_index >= arr.length) { var k = new_index - arr.length + 1; while (k--) { arr.push(undefined); } } arr.splice(new_index, 0, arr.splice(old_index, 1)[0]); } } } </script> <script type="text/x-template" id="messagetemplate"> <div :class="'o-chat_message_bubble ' + messageclass"> <div class="o-chat_message_bubble_inner"> <div class="o-chat_text_wrapper"> <div class="o-chat_name_wrapper"> <div class="o-chat_name dn">{{username}}</div> <div class="o-chat_timestamp">{{messagetime}}</div> </div> <img v-if="isimage" :src="readablemessage" alt="" role="presentation" /> <div v-else-if="islink" class="o-chat_description" v-html="readablemessage"></div> <div v-else class="o-chat_description" v-html="readablemessage"></div> </div> </div> </div> </script> <script type="text/javascript"> var Message = Vue.component('message', { data: function() { return { compincludepath: "includes/vue/chat/message.cfm", islink: false, isimage: false, httpregex: /(\b(https?|ftp):\/\/([a-zA-Z0-9.-]+(?:\/[a-zA-Z0-9.%:_()+=-]*)*(?:\?[a-zA-Z0-9.%:_+&/()=-]*)?(?:#[a-zA-Z0-9.%:()_+=-]*)?))/g, nonhttpregex: /(\bwww\.([a-zA-Z0-9.-]+(?:\/[a-zA-Z0-9.%:_()+=-]*)*(?:\?[a-zA-Z0-9.%:_+&/()=-]*)?(?:#[a-zA-Z0-9.%:()_+=-]*)?))/g, imageregex: /\.jpg|\.gif|.png|.jpeg/g } }, props: ["message","messagetime","lastread","username","messageclass"], template:"#messagetemplate", created: async function() { }, watch: {}, methods: { }, computed: { readabledate: function() { return new Date(this.messagetime); }, readablemessage: function() { var newmessage = this.message.toString().trim(); if(newmessage.search(this.httpregex) == 0 && newmessage.slice(-4).search(this.imageregex) == 0) { this.isimage = true; } else if(newmessage.search(this.nonhttpregex) == 0 && newmessage.slice(-4).search(this.imageregex) == 0) { this.isimage = true; newmessage = 'http://' + this.message; } else if(newmessage.search(this.httpregex) >= 0) { this.islink = true; newmessage = newmessage.replace(this.httpregex, '<a target="_blank" href="$1">$1</a>'); } else if(newmessage.search(this.nonhttpregex) >= 0) { this.islink = true; newmessage = newmessage.replace(this.nonhttpregex, '<a target="_blank" href="http://$1">$1</a>'); } return newmessage; } } }); </script> <script type="text/x-template" id="loading-results-template"> <div>{{content.loadingText}}.</div></script> <script> var LoadingDisplay = Vue.component('loading-display', { data: function(){ return { compincludepath: "includes/vue/generic/loading-display.cfm" } }, props: [], template:"#loading-results-template", methods: { }, computed:{ content: function(){ return { loadingText: this.displaycontent(this.compincludepath, 'loadingText') }; } } }); </script> <script> var dynamicContentMixin = { data: function(){ return { templateRender: null } }, methods: { renderDynamicContent: function(text){ var returnText = ""; text = (text) ? text : ""; if (text != ""){ var test = Vue.compile("<span>" + text + "</span>"); this.templateRender = test.render; if (this.templateRender){ var vnode = this.templateRender(); if ("tag" in vnode && vnode.tag == "span" && "children" in vnode && vnode.children && vnode.children.length == 1) { if ("text" in vnode.children[0]){ returnText = vnode.children[0].text; } } } this.templateRender = null; } return returnText; } } }; </script> <script type="text/x-template" id="chatboxtemplate"> <div class="l-chat_box_wrapper"> <div class="l-chat_mymessages_header o-chat_message_bubble" v-if="!sidechat"> <div class="o-chat_message_bubble_inner"> <div class="flex items-center mb2"> <div class="o-chat_status_color"></div> <div class="o-chat_avatar_wrapper"> <contact-image :key="talkingtouserid" :large="true" v-bind:username="talkingtousername" v-bind:userimage="talkingtouserimage"> </contact-image> </div> <div class="o-chat_text_wrapper"> <div class="o-chat_name_wrapper"> <div class="o-chat_name">{{talkingtousername}}</div> </div> <div class="o-chat_job_wrapper"> <span class="o-chat_job_title" v-if="talkingtousertitle.length > 0">{{talkingtousertitle}}</span> <span v-if="talkingtousertitle.length > 0 && talkingtousercompany.length > 0"> at </span> <span class="o-chat_company" v-if="talkingtousercompany.length > 0"> {{talkingtousercompany}} </span> </div> </div> </div> <div class="mb2" v-if="talkingtouserid != userid"> <button class="o-chat_action_button btn-tertiary" @click="blockContact()" v-if="!blocked"> <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24"><path d="M12 0c-6.627 0-12 5.373-12 12s5.373 12 12 12 12-5.373 12-12-5.373-12-12-12zm9 12c0 1.94-.624 3.735-1.672 5.207l-12.535-12.535c1.472-1.048 3.267-1.672 5.207-1.672 4.962 0 9 4.038 9 9zm-18 0c0-1.94.624-3.735 1.672-5.207l12.534 12.534c-1.471 1.049-3.266 1.673-5.206 1.673-4.962 0-9-4.038-9-9z"/></svg> {{content.blockcontacttext}} </button> <button class="o-chat_action_button btn-tertiary" @click="blockContact()" v-else> {{content.unblockcontacttext}} </button> </div> </div> </div> <div v-if="loadingmessages" id="messagecontainer" class="o-chat_conversation_wrapper"> <loading-display ></loading-display> </div> <div v-else id="messagecontainer" class="o-chat_conversation_wrapper"> <div class="o-chat_conversation_empty_text" v-if="messagelist.length == 0"> <p>{{content.addmessagestext}}</p> </div> <a v-if="showloadmoremessages" class="btn-primary o-chat_loadmore_button" style="float: right;" @click="loadOlderMessages()">{{content.loadmoremessagestext}}</a> <message v-for="(message, index) in messagelist" :key="index" :message="message.message" :messagetime="message.messagetime" :username="message.username" :userimage="message.userimage" :messageclass="message.msgclass" :lastread="message.lastread" ></message> </div> <div class="o-chat_reply_wrapper" v-if="allownewmessages"> <div class="o-chat_textarea_wrapper"> <label for="chat-textrea" class="is-visually-hidden">{{content.yourmessagetext}}</label> <textarea id="chat-textrea" class="o-chat_textarea" v-model="newmessage" :style="newmessage.length > 1000 ? 'border: 2px solid #DA2215;' : ''" :placeholder="messagelist.length == 0 ? content.start : content.reply" @keydown.enter.exact.prevent @keyup.enter.exact="sendMessage()" @keydown.enter.shift.exact="newline()"></textarea> </div> <div class="o-chat_send_wrapper" v-if="newmessage.length < 1001"> <button class="o-chat_action_button btn-primary" @click="sendMessage()" aria-label="Send a Message">{{content.sendmessagetext}}</button> </div> <div class="o-chat_character_count_error" v-else> <span>{{content.characterlimittext}}</span> </div> </div> </div> </script> <script type="text/javascript"> Vue.component('chat-box', { data: function() { return { compincludepath: "includes/vue/chat/chat-box.cfm", newmessage: '', loadingoldermessages: false, scrolltobottom: false } }, mixins: [dynamicContentMixin], props: { messagelist: { Type: Array, default: function(){ return [] } }, talkingtouserid: { Type: String, default: "" }, userid: { Type: String, default: "" }, talkingtousername: { Type: String, default: "" }, talkingtouserimage: { Type: String, default: "" }, talkingtousercompany: { Type: String, default: "" }, talkingtousertitle: { Type: String, default: "" }, talkingtouserstatus: { Type: String, default: "Offline" }, showloadmoremessages: { Type: Boolean, default: false }, sidechat: { Type: Boolean, default: false }, allownewmessages: { Type: Boolean, default: true }, blocked: { Type: Boolean, default: false }, loadingmessages: { Type: Boolean, default: false } }, template:"#chatboxtemplate", mounted: async function() { this.scrollToBottomOfMessages(); }, computed: { charactersleft: function(){ return 1000 - this.newmessage.length; }, content: function() { return { addmessagestext: this.renderDynamicContent(this.displaycontent(this.compincludepath, 'addmessagestext')), charactercounttext: this.renderDynamicContent(this.displaycontent(this.compincludepath, 'charactercounttext')), sendmessagetext: this.displaycontent(this.compincludepath, 'sendmessagetext'), characterlimittext: this.displaycontent(this.compincludepath, 'characterlimittext'), userofflinetext: this.displaycontent(this.compincludepath, 'userofflinetext'), loadmoremessagestext: this.displaycontent(this.compincludepath, 'loadmoremessagestext'), blockcontacttext: this.displaycontent(this.compincludepath, 'blockcontacttext'), unblockcontacttext: this.displaycontent(this.compincludepath, 'unblockcontacttext'), reply: this.displaycontent(this.compincludepath, 'reply'), start: this.displaycontent(this.compincludepath, 'start'), yourmessagetext: 'Your Message' // this.displaycontent(this.compincludepath, 'yourmessagetext') } } }, updated: function() { if(this.scrolltobottom && !this.loadingoldermessages) { this.scrollToBottomOfMessages(); } else if(this.loadingoldermessages) { this.loadingoldermessages = false; } this.scrolltobottom = false; }, watch: { messagelist: function() { this.scrolltobottom = true; } }, methods: { newline: function() { this.newmessage = `${this.newmessage}\n`; }, blockContact: function() { this.$emit('block-contact', {'userid': this.talkingtouserid, 'username': this.talkingtousername, 'banned': !this.blocked}); }, loadOlderMessages: function() { this.$emit('load-messages'); this.loadingoldermessages = true; }, sendMessage: function() { if(this.newmessage.length < 1001) { this.$emit('send-message', this.newmessage); this.newmessage = ''; } }, scrollToBottomOfMessages: function() { var container = this.$el.querySelector("#messagecontainer"); container.scrollTop = container.scrollHeight; } } }); </script> <script type="text/x-template" id="contactImageTemplate"> <div> <div v-if="userimage && intersected && !imgerror"> <img class="o-chat_avatar" :class="status.toLowerCase() == 'available' ? 'is-available' : ''" :src="imgsrc" :srcset="srcset" @error="imgerror = true" :alt="username" :width="width" :height="height" v-bind:style="imgStyleObject" /> </div> <div v-else class="contact-image-wrapper" :class="status.toLowerCase() == 'available' ? 'is-available' : ''" style=""> <span class="contact-image-initials" :style="{color: colorlookup[firstinitial]}" :title="username">{{initials}}</span> </div> </div></script> <style> .contact-image-wrapper { background-color: white; background-image: none; border: 1px solid #CCC; border-radius: 50%; display: flex; align-items: center; justify-content: center; margin-right: 12px; width: 48px; height: 48px; } .contact-image-initials { font-weight: bold; font-size: 1.250em; color: #333; text-align: center; } </style> <script> var ContactImage = Vue.component("contact-image", { template:"#contactImageTemplate", props: { username: { default: "", type: String }, userimage: { default: "", type: String }, status: { default: "", type: String }, large: { default: false, type: Boolean }, width: { type: [String, Number], default: "" }, height: { type: [String, Number], default: "" } }, data: function(){ return { compincludepath: "includes/vue/generic/contact-image.cfm", intersected: false, observer: null, imgsrc: "", imgsrc2x: "", imgerror: false } }, mounted: function(){ var vObj = this; vObj.observer = new IntersectionObserver(function(entries) { var image = entries[0]; if (image.isIntersecting) { vObj.intersected = true; vObj.observer.disconnect(); if (vObj.userimage){ var cachedImgPath = vObj.getCachedImgPath(false); var cachedImgPath2x = vObj.getCachedImgPath(true); if (cachedImgPath !== "" && cachedImgPath2x !== ""){ vObj.imgsrc = cachedImgPath; vObj.imgsrc2x = cachedImgPath2x; } else { vObj.ajaxGet(vObj.path2approot + '/ajax/remote-proxy.cfm?action=misc&function=profileimage&image=' + vObj.userimage + '&large=' + vObj.large, // ajaxGet() defined in _global-mixin function(response){ // success if ("url" in response.DATA){ vObj.imgsrc = response.DATA["url"]; vObj.imgsrc2x = response.DATA["url2x"]; vObj.imgerror = false; if (vObj.hasSessionStorage()) { sessionStorage.setItem(vObj.username + "-" + vObj.userimage + "-" + vObj.large, vObj.imgsrc); sessionStorage.setItem(vObj.username + "-" + vObj.userimage + "-" + vObj.large + "-2x", vObj.imgsrc2x); } } }, function(response){ // error }); // end ajaxGet } } } }, {}); vObj.observer.observe(vObj.$el); }, computed:{ content: function(){ return { backToTopText: this.displaycontent(this.compincludepath, 'backToTopText'), }; }, colorlookup: function(){ var colorStruct = {}; colorStruct["?"] = "#9fadad"; colorStruct["A"] = "ff3019"; colorStruct["B"] = "#6b1315"; colorStruct["C"] = "#87b95f"; colorStruct["D"] = "#8c59dd"; colorStruct["E"] = "#8058f8"; colorStruct["F"] = "#8dfb54"; colorStruct["G"] = "#bc0a4e"; colorStruct["H"] = "#685a34"; colorStruct["I"] = "#ed94bb"; colorStruct["J"] = "#9b6371"; colorStruct["K"] = "#58226c"; colorStruct["L"] = "#3c1e38"; colorStruct["M"] = "#b2451e"; colorStruct["N"] = "#3e4f9d"; colorStruct["O"] = "#ba12c8"; colorStruct["P"] = "#e8d247"; colorStruct["Q"] = "#2c1a96"; colorStruct["R"] = "#c4a31b"; colorStruct["S"] = "#35a8a7"; colorStruct["T"] = "#ec8721"; colorStruct["U"] = "#c0547d"; colorStruct["V"] = "#b387b3"; colorStruct["W"] = "#d528d3"; colorStruct["X"] = "#792006"; colorStruct["Y"] = "#10073c"; colorStruct["Z"] = "#5ebf4f"; return colorStruct; }, initials: function(){ var name = this.username.replace(/[^A-z\s]/gi, '').trim(); var tempNameArray = name.split(" "); var nameArray = []; var returnVal = "??"; // trim any empty items from array for (var i = 0; i < tempNameArray.length; i++) { if (tempNameArray[i].trim() !== ""){ nameArray.push(tempNameArray[i].trim()); } } // one element in array and string is 1 char if (nameArray.length == 1 && nameArray[0].length == 1){ returnVal = nameArray[0]; } else if (nameArray.length == 1 && nameArray[0].length > 1){ returnVal = nameArray[0].charAt(0); } else if (nameArray.length == 1 && nameArray[0].length == 2){ // one element in array and the length is 2 characters returnVal = nameArray[0].charAt(0) + nameArray[0].charAt(1); } else if (nameArray.length == 2){ // if there are two elements in the array, get first letter of each returnVal = nameArray[0].charAt(0) + nameArray[1].charAt(0); } else if (nameArray.length >= 3){ // if the array length is >= 3, get letters 1 and 3 returnVal = nameArray[0].charAt(0) + nameArray[2].charAt(0); } return returnVal.toUpperCase(); }, firstinitial: function(){ return this.initials.charAt(0); }, srcset: function(){ if (this.imgsrc2x) { return this.imgsrc2x + " 2x"; } else { return ""; } }, imgStyleObject: function(){ if (this.width && this.height){ return { width: this.width + 'px', height: this.height + 'px' } } else { return {}; } } }, methods: { getCachedImgPath: function(twox){ var vObj = this; var returnURL = ""; var is2xstring = (twox) ? "-2x" : ""; if (vObj.hasSessionStorage()) { var imgurl = sessionStorage.getItem(vObj.username + "-" + vObj.userimage + "-" + vObj.large + is2xstring); if (imgurl){ returnURL = imgurl; } } return returnURL; } } }); </script> <script type="text/x-template" id="backToTopButtonTemplate"> <a href="#" class="btn-primary btn-back_to_top center fixed bottom-2 right-2 animated" v-bind:class="[backToTopButtonShowing ? 'slideInRight': 'slideOutRight']" v-scroll-to=scrollto>&uarr; {{content.backToTopText}}</a></script> <script> var BackToTopButton = Vue.component("backtotop-button", { template:"#backToTopButtonTemplate", props: { scrollto: { default: "#nav", type: String } }, data: function(){ return { compincludepath: "includes/vue/generic/backtotop-button.cfm", backToTopButtonShowing: false } }, computed:{ content: function(){ return { backToTopText: this.displaycontent(this.compincludepath, 'backToTopText'), }; } }, methods: { toggleBackToTopButton: function(){ var viewport = window.innerHeight, offset = window.pageYOffset; if (offset > viewport) { this.backToTopButtonShowing = true; } else { this.backToTopButtonShowing = false; } } } }); </script> <script type="text/x-template" id="myshow-add-onsitephotos-form-template"> <section class="" id="myshow-add-onsitephotos-form"> <div class="mb4"> <label class="mys-optional db b mb2" v-if="!editMode"> {{content.selectExhibitorHeader}}: </label> <span v-if="!editMode"> <select name="sectionkey" id="exhibitor" class="jq-chosen fm-Select w-50-l w-100" v-model="selectedexhid"> <option value="">{{content.selectExhibitorFirstOption}}</option> <option v-for="(exhibitor,index) in exhibitordata.exhibitors" v-bind:value="exhibitor.exhid"> {{exhibitor.exhname}} </option> </select> </span> <span class="b" v-if="editMode"> {{exhname}} <input type="hidden" name="sectionkey" v-model="exhid" /> </span> </div> <div class="mb4"> <label class="mys-required db b mb2" v-if="!editMode"> {{content.uploadPhotoHeader}}: </label> <input id="file" type="file" required accept='image/*' @change="processFile($event)" v-if="!editMode" /> <v-lazy-image v-if="editMode" v-bind:src="imgurlthumb" /> </div> <div class="mb4"> <label class="mys-optional db b mb2"> <span v-if="!editMode">{{content.addNotesHeader}}: </span> <span v-if="editMode">{{content.notesHeader}}: </span> </label> <textarea class="w-100" name="notes" id="notes" rows="10" v-model="editnotes" style="height: 150px" maxlength="255"></textarea> </div> <div class="o-PageDivider mt1 mb3"></div> <button type="button" class="btn-primary" value="Submit" v-on:click="submitFile()"> <span v-if="editMode">{{content.saveMyChangesHeader}}</span> <span v-if="!editMode">{{content.uploadMyPhotoHeader}}</span> </button> </section> </script> <script> var MyShowAddOnsitePhotosDisplay = Vue.component('myshow-add-onsitephotos-form', { data: function(){ return { compincludepath: "includes/vue/myshow/myshow-add-onsitephotos-form.cfm", file: '', editnotes: this.notes, selectedexhid: this.exhid, exhibitordata:{} } }, props: { exhid: { type: String, default: "" }, exhname:{ type:String, default: "" }, imagename: { type: String, default: "" }, imgurl: { type: String, default: "" }, imgurlthumb: { type: String, default: "" }, imgurlthumb2x: { type: String, default: "" }, notes: { type:String, default:"" } }, computed: { content: function(){ return { selectExhibitorHeader: this.displaycontent(this.compincludepath, 'selectExhibitorHeader'), selectExhibitorFirstOption: this.displaycontent(this.compincludepath, 'selectExhibitorFirstOption'), uploadPhotoHeader: this.displaycontent(this.compincludepath, 'uploadPhotoHeader'), addNotesHeader: this.displaycontent(this.compincludepath, 'addNotesHeader'), notesHeader: this.displaycontent(this.compincludepath, 'notesHeader'), saveMyChangesHeader: this.displaycontent(this.compincludepath, 'saveMyChangesHeader'), uploadMyPhotoHeader: this.displaycontent(this.compincludepath, 'uploadMyPhotoHeader'), submitButton: this.displaycontent(this.compincludepath, 'submitButton'), cancelButton: this.displaycontent(this.compincludepath, 'cancelButton') }; }, editMode: function(){ return !(!this.imagename); } }, created: function(){ var vObj = this; vObj.ajaxGet(vObj.path2approot + '/myshow/myshow-actions.cfm?action=GetMyShowExhibitors&startrow=&length=', function(response){ vObj.exhibitordata = response.DATA; }); }, methods: { submitFile: function(){ this.$emit("add-photo-submit", { imagename: this.imagename, notes: this.editnotes, file: this.file, exhid: (this.selectedexhid) ? this.selectedexhid : this.exhid }); }, processFile: function(e){ this.file = e.target.files[0]; } }, template:"#myshow-add-onsitephotos-form-template" }); </script> <script type="text/x-template" id="myshow-email-exhibitor-form-template"> <section id="myshow-email-exhibitor-form"> <div class="mb4"> <label class="mys-required db b mb2"> {{content.emailText}}: </label> <input class="fm-Input w-100" v-bind:value="regemail" maxLength="255"> <input type="hidden" name="email" /> </div> <div class="mb4"> <label class="mys-optional db b mb2"> {{content.phoneText}}: </label> <input class="fm-Input mw5 w-100" type="phone" name="phone" maxLength="255" v-model="phone"> </div> <div class="mb4"> <label class="mys-required db b mb2"> {{content.messageText}}: </label> <textarea class="w-100" name="message" id="message" rows="10" v-model="editmessage" required style="height: 150px"></textarea> </div> <div class="o-PageDivider mt1 mb3"></div> <input class="btn-primary" type="button" v-bind:value="content.sendEmailText" v-on:click="submitForm()" /> <br /><br /> <label id="MessageAlert" v-if="displayError"> <font color="red"> {{content.errorMessage}} </font> </label> </section> </script> <script> var MyShowEmailExhibitorFormDisplay = Vue.component('myshow-email-exhibitor-form', { data: function(){ return { compincludepath: "includes/vue/myshow/myshow-email-exhibitor-form.cfm", file: '', editmessage: this.message, selectedexhid: this.exhid, phone: '', displayError: false } }, template:"#myshow-email-exhibitor-form-template", props: { exhid: { type: String, default: "" }, exhname:{ type:String, default: "" }, message: { type:String, default:"" } }, computed: { content: function(){ return { emailText: this.displaycontent(this.compincludepath, 'emailText'), phoneText: this.displaycontent(this.compincludepath, 'phoneText'), messageText: this.displaycontent(this.compincludepath, 'messageText'), sendEmailText: this.displaycontent(this.compincludepath, 'sendEmailText'), errorMessage: this.displaycontent(this.compincludepath, 'errorMessage') }; } }, methods: { submitForm: function(){ if (!this.editmessage.trim()) { this.displayError = true; } else { this.$emit("email-exhibitor-submit", { phone: this.phone, email: this.regemail, message: this.editmessage, exhid: (this.selectedexhid) ? this.selectedexhid : this.exhid }); } } } }); </script> <script type="text/x-template" id="myshow-email-online-contact-form-template"> <section id="myshow-email-online-contact-form"> <div class="mb4"> <label class="mys-required db b mb2"> {{content.emailText}}: </label> <input class="fm-Input w-100" v-bind:value="regemail" readonly> <input type="hidden" name="email" /> </div> <div class="mb4"> <label class="mys-optional db b mb2"> {{content.phoneText}}: </label> <input class="fm-Input mw5 w-100" type="phone" name="phone" maxLength="255" v-model="phone"> </div> <div class="mb4"> <label class="mys-required db b mb2"> {{content.messageText}}: </label> <textarea class="w-100" name="message" id="message" rows="10" v-model="editmessage" required style="height: 150px"></textarea> </div> <div class="o-PageDivider mt1 mb3"></div> <input class="btn-primary" type="button" v-bind:value="content.sendEmailText" v-on:click="submitForm()" /> <br /><br /> <label id="MessageAlert" v-if="displayError"> <font color="red"> {{content.errorMessage}} </font> </label> </section> </script> <script> var MyShowEmailOnlineContactFormDisplay = Vue.component('myshow-email-online-contact-form', { data: function() { return { compincludepath: "includes/vue/myshow/myshow-email-online-contact-form.cfm", file: '', editmessage: this.message, phone: '', displayError: false, submitted: false } }, template:"#myshow-email-online-contact-form-template", props: { contactid: { type: Number, default: "" }, fullname: { type:String, default: "" }, email: { type:String, default: "" }, message: { type:String, default:"" } }, computed: { content: function() { return { emailText: this.displaycontent(this.compincludepath, 'emailText'), phoneText: this.displaycontent(this.compincludepath, 'phoneText'), messageText: this.displaycontent(this.compincludepath, 'messageText'), sendEmailText: this.displaycontent(this.compincludepath, 'sendEmailText'), errorMessage: this.displaycontent(this.compincludepath, 'errorMessage') }; } }, methods: { submitForm: function() { if (!this.editmessage.trim()) { this.displayError = true; } else if(!this.submitted) { this.submitted = true; this.$emit("email-online-contact-submit", { phone: this.phone, email: this.regemail, message: this.editmessage, contactid: this.contactid }); } } } }); </script> <script type="text/x-template" id="exh-gallery-display-template"> <div> <div class="center mb4 showcase-wrapper_featured_inner"> <div class="showroom-media_wrapper"> <span class="showcase-counter animated fadeIn"> <p class="mb0 tc showcase-counter_inner" style="min-width:100px"> <span class="showcase-counter_current b">{{selectedIndexFormatted}}</span> <span class="showcase-counter_total">of</span> <span class="showcase-counter_total b js-showcase-counter_total">{{this.gallerydata.length}}</span> </p> </span> <a class="showcase-btn_prev bb-0 dim pointer" href="#" aria-label="Go to the previous item in the gallery" v-on:click.stop.prevent="changeSlide('left')"> <svg width="16" height="24" xmlns="http://www.w3.org/2000/svg" role="img" aria-hidden="true"><path d="M6.5 12l9 9-3.054 3L.5 12 12.446 0 15.5 3l-9 9z" fill-rule="nonzero"/></svg> </a> <a class="showcase-btn_next bb-0 dim pointer" href="#" aria-label="Go to the next item in the gallery" v-on:click.stop.prevent="changeSlide('right')"> <svg width="16" height="24" xmlns="http://www.w3.org/2000/svg" role="img" aria-hidden="true"><path d="M9.5 12l-9 9 3.054 3L15.5 12 3.554 0 .5 3l9 9z" fill-rule="nonzero"/></svg> </a> <div class="showroom-media-image_wrapper js-animation-element-1 js-animated-element"> <img v-if="gallerydata[selectedIndex].mediatype === 'image'" class="ba b--black-10 db ma0 js-animation-element-1b showroom-media-image_featured" ref="jsImagePreview" :src="gallerydata[selectedIndex].previewSrc" :alt="gallerydata[selectedIndex].featureTitleText" @error="revertToDirectory(selectedIndex, 'preview')" @load="handlePreviewImageLoad(gallerydata[selectedIndex].previewSrc)" /> <div v-if="gallerydata[selectedIndex].mediatype === 'video'" class="js-gallery-video_wrapper relative"> <video class="mys-showcase-video-default ma0 js-animation-element-1d showroom-media-video_featured" ref="jsImagePreview" :src="gallerydata[selectedIndex].previewSrc" @error="revertToDirectory(selectedIndex, 'preview')" @loadedmetadata="handlePreviewImageLoad(gallerydata[selectedIndex].previewSrc)" controls controlsList="nodownload" oncontextmenu="return false" > </video> <svg v-if="videoPosterShowing" class="icon-play-button_video-poster" width="100" height="100" xmlns="http://www.w3.org/2000/svg" title="Click to play video" @click="hideVideoPoster()" > <path d="M50 8.333c22.975 0 41.667 18.692 41.667 41.667S72.975 91.667 50 91.667 8.333 72.975 8.333 50 27.025 8.333 50 8.333zM50 0C22.387 0 0 22.387 0 50c0 27.612 22.387 50 50 50 27.612 0 50-22.388 50-50 0-27.613-22.388-50-50-50zM37.5 70.833V29.167L75 50.608 37.5 70.833z" fill="#FFF" fill-rule="nonzero"/> </svg> </div> </div> </div> <div class="showcase-header js-animated-element js-animation-element-2" :class="[(index === selectedIndex) ? '' : 'is-visually-hidden']" v-for="(galleryitem, index) in gallerydata"> <div class="flex mb3 showcase-feature-title_wrapper"> <toggle-favorite v-bind:type="gallerydata[selectedIndex].toggletype" v-bind:keys="gallerydata[selectedIndex].togglekeys" v-bind:exhid="gallerydata[selectedIndex].exhid" v-bind:addedtoplanner="bitToBool(gallerydata[selectedIndex].addedtoplanner)" v-on:toggle-favorite="$emit('toggle-favorite', $event); onToggleFavorite();"> </toggle-favorite> <h2 id="jq-feature-title" class="color-brand-02 flex-auto f1 ma0 mb3 mb0-l ml3"> <span id="jq-feature-title-text">{{gallerydata[selectedIndex].featureTitleText}}</span> </h2> </div> <div class="showcase-desc ml3"> <div v-if="gallerydata[selectedIndex].tags" class="bg-green-1 br1 dark-gray dib f6 normal mb2 pa2 pt1 pb1">{{gallerydata[selectedIndex].tags}}</div> <div class="o-DynamicContent js-read-more" data-rm-characters="1200" v-html="galleryitem.description" ref="oShowcaseDescription"></div> </div> </div> </div> <div class="showcase-thumbnails flex-wrap items-start justify-center mb3 js-animated-element js-animation-element-3" style="transform: translateY(40%) translateZ(0px); overflow: hidden;"> <figure class="sr-Thumbnail gallery-cell dib ma0 pa0" v-for="(galleryitem, index) in gallerydata"> <a href="#" v-on:click.stop.prevent="selectPhoto(index, galleryitem)" v-on:keyup.left="changeSlide('left', index)" v-on:keyup.right="changeSlide('right', index)" ref="jsThumbnail" :title="galleryitem.featureTitleText" class="bb-0 dib dim mr3 mb3 gallery-cell_anchor" v-bind:class="[(index === selectedIndex) ? 'is-selected' : '', (gallerydata[index].mediatype === 'video') ? 'is-video' : '']" > <img class="mys-jq-lazy o-ThumbnailImg v-lazy-image" style="transition: border-color 0.3s;" :src="galleryitem.thumbnailSrc2" :alt="galleryitem.featureTitleText" :title="galleryitem.featureTitleText" @error="revertToDirectory(index, 'thumbnail')" > <svg class="icon-play-button" v-if="gallerydata[index].mediatype === 'video'" width="28" height="28" xmlns="http://www.w3.org/2000/svg"><path d="M14 2.333c6.433 0 11.667 5.234 11.667 11.667S20.433 25.667 14 25.667 2.333 20.433 2.333 14 7.567 2.333 14 2.333zM14 0C6.269 0 0 6.269 0 14c0 7.732 6.269 14 14 14 7.732 0 14-6.268 14-14 0-7.731-6.268-14-14-14zm-3.5 19.833V8.167L21 14.17l-10.5 5.663z" fill-rule="nonzero"/></svg> <figcaption class="f7 ma0 is-visually-hidden">{{galleryitem.featureTitleText}}</figcaption> </a> </figure> </div> </div> </script> <script> var GalleryDisplay = Vue.component('exh-gallery-display', { data: function(){ return { selectedIndex: this.defaultselectedindex, loadAnimationRun: false, // This is only run once on page load videoPoster: null, videoPosterShowing: false } }, template:"#exh-gallery-display-template", props: { gallerydata:{ type: Array, default: function () { return [] } }, gallerytitle:{ type: String, default:"" }, defaultselectedindex: { type: [Number], default: 0 } }, mounted: function() { this.$emit('item-selected', this.gallerydata[this.selectedIndex]); }, computed: { selectedIndexFormatted: function() { var adjustedIndex = this.selectedIndex; adjustedIndex += 1; if (adjustedIndex === this.gallerydata.length - 1) { adjustedIndex = this.gallerydata.length - 1; } return adjustedIndex; }, selectedMediaType: function() { return this.gallerydata[this.selectedIndex].mediatype; } }, methods: { revertToDirectory: function(imgindex, type) { if(type == 'preview') { this.gallerydata[imgindex].previewSrc = this.gallerydata[imgindex].directorypreviewSrc; } else { this.gallerydata[imgindex].thumbnailSrc = this.gallerydata[imgindex].directorythumbnailSrc; this.gallerydata[imgindex].thumbnailSrc2 = this.gallerydata[imgindex].directorythumbnailSrc2; } }, selectPhoto: function(index, galleryitem) { // Return if the already selected thumbnail is clicked again if (this.selectedIndex === index) return /* Check if galleryitem.previewSrc of item clicked matches previewSrc of selectedIndex in this.gallerydata, and if it does, DO NOT reset opacity to 0 so duplicate image is not hidden and instead animate (second) duplicate image, since animation normally runs on load of image, otherwise reset feature opacity to 0 */ if (this.gallerydata[this.selectedIndex].previewSrc == galleryitem.previewSrc) { this.runImageChangeAnimation(); } else { // Reset video feature opacity to 0 to prevent size jumping if (this.$refs.jsImagePreview) { this.$refs.jsImagePreview.style.opacity = 0; } } this.selectedIndex = index; this.$emit('item-selected', this.gallerydata[this.selectedIndex]); }, handlePreviewImageLoad: function(index) { var videoElementForPreview = document.querySelector('.showroom-media-video_featured'); this.adjustShowroomFeatureImage(); if (!this.loadAnimationRun) { // Only run these once (on first load): this.runLoadAnimation(); this.runSlideNumberAnimation(); // Only run these once (on first load): if (this.selectedMediaType === 'video') { this.showVideoPreview(); } } else { // Run on each slide change: this.runImageChangeAnimation(index); this.videoPosterShowing = false; if (this.selectedMediaType === 'video') { if (videoElementForPreview) { videoElementForPreview.play(); } } } }, changeSlide: function(direction, index) { if (direction === 'left') { this.selectedIndex === 0 ? this.selectedIndex = this.gallerydata.length - 1 : this.selectedIndex = this.selectedIndex - 1; } else if (direction === 'right') { this.selectedIndex === this.gallerydata.length - 1 ? this.selectedIndex = 0 : this.selectedIndex = this.selectedIndex + 1; } }, adjustShowroomFeatureImage: function() { var nav = document.querySelector('#nav'), showroomHeader = document.querySelector('.showroom-header_sticky'), screenWidth = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth, screenHeight = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight, offsetAdjustment = 126 + 45; //126 is height of thumbnails container, 45 is various adjusted padding and margins if (nav) { var navHeight = parseFloat(window.getComputedStyle(nav).height, 10); } if (showroomHeader) { var showroomHeaderHeight = parseFloat(window.getComputedStyle(showroomHeader).height, 10); } if (screenWidth >= 1200) { this.$refs.jsImagePreview.style.maxHeight = (window.innerHeight - (showroomHeaderHeight + offsetAdjustment)) > 900 ? 900 : window.innerHeight - (showroomHeaderHeight + offsetAdjustment) + 'px'; } }, runLoadAnimation: function() { var loginAnimationTimeline = anime.timeline({ easing: 'linear', duration: 550 }); loginAnimationTimeline .add({ targets: '.js-animation-element-1', opacity: [0,1] }) .add({ targets: '.js-animation-element-1b', scale: 1, translateZ: '0px', opacity: [0,1], duration: 750 }) .add({ targets: '.js-animation-element-2', opacity: [0,1] }) .add({ targets: '.js-animation-element-3', translateY: '0%', translateZ: '0px', opacity: [0,1] }) this.loadAnimationRun = true; }, runImageChangeAnimation: function(index) { // Don't re-run animation if the already selected thumbnail is clicked again if (this.selectedIndex === index) return // Reset transform style back to none so element animates again this.$refs.jsImagePreview.style.transform = 'scale(1.22) translateZ(0px)'; if (this.selectedMediaType === 'image') { var imageChangeAnimation = anime({ targets: '.js-animation-element-1b', easing: 'linear', scale: 1, translateZ: '0px', opacity: [0,1], duration: 350 }); imageChangeAnimation.play(); } if (this.selectedMediaType === 'video') { var imageChangeAnimation2 = anime({ targets: '.js-animation-element-1d', easing: 'linear', scale: 1, translateZ: '0px', opacity: [0,1], duration: 350 }); imageChangeAnimation2.play(); } }, runSlideNumberAnimation: function(index) { var animatedCounts = { startingIndex: 0, totalSlides: 0 }; var slideNumberAnimation = anime({ targets: animatedCounts, autoplay: true, round: 1, startingIndex: 1, totalSlides: this.gallerydata.length, easing: 'easeInOutExpo', duration: 1200, update: function() { var total = document.querySelector('.js-showcase-counter_total'); total.innerHTML = animatedCounts.totalSlides; } }); }, showVideoPreview: function() { var videoElementForPreview = document.querySelector('.showroom-media-video_featured'), vObj = this; if (videoElementForPreview) { try { videoElementForPreview.style.opacity = 0; // Prevent flash of video element before video is seeked videoElementForPreview.currentTime = 3; // Number of seconds to seek video videoElementForPreview.addEventListener('play', playVideo, false); vObj.videoPosterShowing = true; videoElementForPreview.style.opacity = 1; function playVideo() { videoElementForPreview.currentTime = 0; videoElementForPreview.play(); videoElementForPreview.removeEventListener('play', playVideo, false); vObj.videoPosterShowing = false; } } catch (error) { videoElementForPreview.currentTime = 0; videoElementForPreview.removeEventListener('play', playVideo, false); vObj.videoPosterShowing = false; videoElementForPreview.style.opacity = 1; } } }, hideVideoPoster: function() { var videoElementForPreview = document.querySelector('.showroom-media-video_featured'); this.videoPosterShowing = false; this.runImageChangeAnimation(); if (videoElementForPreview) { videoElementForPreview.play(); } } } }); </script> <script type="text/x-template" id="exh-onlinecontacts-display-template"> <div class="vbc_contact"> <div class="jq-contact-image-wrapper center mb3 mw4 relative"> <div class="absolute ma0 mw3 jq-favorite-icon-wrapper"> <toggle-favorite :type="'onlinecontact'" v-bind:keys="contactid" v-bind:addedtoplanner="bitToBool(hasplanner)" v-on:toggle-favorite="$emit('toggle-favorite', $event)" v-bind:exhid="exhid" v-if="loggedin" ></toggle-favorite> </div> <v-lazy-image class="vbc_contact_avatar ba b--black-10" :class="isavailable && hasexhibitorchat ? 'is-available' : ''" :src="thumbnail ? thumbnail : path2approot + '/assets/imgs/FPO-default-speaker.png'" :srcPlaceholder="thumbnail ? thumbnail : path2approot + '/assets/imgs/FPO-default-speaker.png'" :alt="name" :title="name"> </v-lazy-image> </div> <div v-if="name" class="tc mb0"> <h3 class="dib f2 ma0 mb1">{{name}}</span></h3> <span v-if="isavailable && hasexhibitorchat" class="bg-green-1 br1 dark-gray dib f7 normal ml2 pa2 pt1 pb1" style="vertical-align:text-bottom;">Available</span> </div> <p v-if="title" class="f3 lh-title muted tc">{{title}}</p> <div v-if="loggedin && hasvalidation && validated && hasexhibitorchat && isoptedin" class="center mb3 tc"> <button title="Chat" :class="(isavailable ? 'btn-primary' : 'btn-tertiary') + ' pl5 pr5'" @click="initiateChat(contactid, exhid, chatid, name, email, hasplanner)">Message</button> </div> <div v-else-if="loggedin && hasvalidation && !validated && isavailable" class="tc"> <button class="btn-secondary pl5 pr5" @click="sendEmailVerfication()">Confirm your email to chat</button> </div> <div v-if="bio" class="muted tc"> <p class="description" v-html="bio"></p> </div> <div v-if="hasmyshow && !loggedin" class="tc mb3 i"> <a class="bb-0" style="color: inherit;" v-bind:href="path2approot + '/login/login.cfm?redirect_to=' + customURIEncode(thispageurl)" v-html="content.loginToContact"></a> </div> <div class="center tc"> <a v-if="loggedin" style="cursor: pointer;" v-on:click.stop.prevent="emailButtonClick(contactid, name, email);" v-cloak :title="'Email ' + name" class="bb-0 ma0 mr2 mb2 darken dib"> <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" role="img" aria-hidden="true"><path class="gray" d="M16 .02c-8.836 0-16 7.164-16 16s7.164 16 16 16 16-7.164 16-16-7.164-16-16-16zm9.32 9.307L16 16.88 6.679 9.327H25.32zm.013 13.333H6.667V11.32L16 18.884l9.333-7.563V22.66z"></path></svg> </a> <a v-if="twitter" :href="twitter" target="_blank" :title="'Follow ' + name + ' on X'" class="bb-0 ma0 mr2 mb2 darken dib" @click="logStats('URL Link', '', exhid, twitter, 'twitter');"> <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" role="img" aria-hidden="true"><path class="gray" d="M16 0C7.2 0 0 7.2 0 16s7.2 16 16 16 16-7.2 16-16S24.8 0 16 0zm7.2 8l-5.5 6.4h0l5.9 8.6h-4.4l-4-5.8-5 5.8H8.9l5.7-6.7L8.9 8h4.4l3.8 5.5L21.8 8h1.3zm-7.8 7.6l.6.8h0l4 5.7h2l-4.8-6.9-.6-.8-3.7-5.3h-2l4.6 6.6z"></path></svg></a> <a v-if="facebook" :href="facebook" target="_blank" :title="'Follow ' + name + ' on Facebook'" class="bb-0 ma0 mr2 mb2 darken dib" @click="logStats('URL Link', '', exhid, facebook, 'facebook');"> <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" role="img" aria-hidden="true"><path class="gray" d="M16,0 C7.164,0 0,7.164 0,16 C0,24.836 7.164,32 16,32 C24.836,32 32,24.836 32,16 C32,7.164 24.836,0 16,0 Z M20,10.6666667 L18.2,10.6666667 C17.4826667,10.6666667 17.3333333,10.9613333 17.3333333,11.704 L17.3333333,13.3333333 L20,13.3333333 L19.7213333,16 L17.3333333,16 L17.3333333,25.3333333 L13.3333333,25.3333333 L13.3333333,16 L10.6666667,16 L10.6666667,13.3333333 L13.3333333,13.3333333 L13.3333333,10.256 C13.3333333,7.89733333 14.5746667,6.66666667 17.372,6.66666667 L20,6.66666667 L20,10.6666667 Z"></path></svg></a> <a v-if="linkedin" :href="linkedin" target="_blank" :title="'Connect with ' + name + ' on LinkedIn'" class="bb-0 ma0 mr2 mb2 darken dib" @click="logStats('URL Link', '', exhid, linkedin, 'linkedin');"> <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" role="img" aria-hidden="true"><path d="M16,0 C7.164,0 0,7.164 0,16 C0,24.836 7.164,32 16,32 C24.836,32 32,24.836 32,16 C32,7.164 24.836,0 16,0 Z M13.3333333,21.3333333 L10.6666667,21.3333333 L10.6666667,13.3333333 L13.3333333,13.3333333 L13.3333333,21.3333333 Z M12,12.1453333 C11.1906667,12.1453333 10.5333333,11.484 10.5333333,10.6666667 C10.5333333,9.85066667 11.1893333,9.188 12,9.188 C12.8106667,9.188 13.4666667,9.85066667 13.4666667,10.6666667 C13.4666667,11.484 12.8093333,12.1453333 12,12.1453333 Z M22.6666667,21.3333333 L20.0026667,21.3333333 L20.0026667,17.5186667 C20.0026667,15.0106667 17.3333333,15.2226667 17.3333333,17.5186667 L17.3333333,21.3333333 L14.6666667,21.3333333 L14.6666667,13.3333333 L17.3333333,13.3333333 L17.3333333,14.7906667 C18.496,12.636 22.6666667,12.476 22.6666667,16.8546667 L22.6666667,21.3333333 Z" class="gray"></path></svg></a> <a v-if="instagram" :href="instagram" target="_blank" :title="'Follow ' + name + ' on Instagram'" class="bb-0 ma0 mr2 mb2 darken dib" @click="logStats('URL Link', '', exhid, instagram, 'instagram');"> <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" role="img" aria-hidden="true"><path d="M19.772,8.40266667 C18.788,8.35733333 18.492,8.34933333 16,8.34933333 C13.508,8.34933333 13.2133333,8.35866667 12.2293333,8.40266667 C9.69733333,8.51866667 8.51866667,9.71733333 8.40266667,12.2293333 C8.35866667,13.2133333 8.348,13.508 8.348,16 C8.348,18.492 8.35866667,18.7866667 8.40266667,19.772 C8.51866667,22.2773333 9.692,23.4826667 12.2293333,23.5986667 C13.212,23.6426667 13.508,23.6533333 16,23.6533333 C18.4933333,23.6533333 18.788,23.644 19.772,23.5986667 C22.304,23.484 23.4813333,22.2813333 23.5986667,19.772 C23.6426667,18.788 23.652,18.492 23.652,16 C23.652,13.508 23.6426667,13.2133333 23.5986667,12.2293333 C23.4813333,9.71866667 22.3013333,8.51866667 19.772,8.40266667 Z M16,20.7933333 C13.3533333,20.7933333 11.2066667,18.648 11.2066667,16 C11.2066667,13.3533333 13.3533333,11.208 16,11.208 C18.6466667,11.208 20.7933333,13.3533333 20.7933333,16 C20.7933333,18.6466667 18.6466667,20.7933333 16,20.7933333 Z M20.9826667,12.1386667 C20.364,12.1386667 19.8626667,11.6373333 19.8626667,11.0186667 C19.8626667,10.4 20.364,9.89866667 20.9826667,9.89866667 C21.6013333,9.89866667 22.1026667,10.4 22.1026667,11.0186667 C22.1026667,11.636 21.6013333,12.1386667 20.9826667,12.1386667 Z M19.1106667,16 C19.1106667,17.7186667 17.7173333,19.1106667 16,19.1106667 C14.2826667,19.1106667 12.8893333,17.7186667 12.8893333,16 C12.8893333,14.2813333 14.2826667,12.8893333 16,12.8893333 C17.7173333,12.8893333 19.1106667,14.2813333 19.1106667,16 Z M16,0 C7.164,0 0,7.164 0,16 C0,24.836 7.164,32 16,32 C24.836,32 32,24.836 32,16 C32,7.164 24.836,0 16,0 Z M25.2773333,19.848 C25.124,23.2413333 23.2346667,25.1213333 19.8493333,25.2773333 C18.8533333,25.3226667 18.5346667,25.3333333 16,25.3333333 C13.4653333,25.3333333 13.148,25.3226667 12.152,25.2773333 C8.76,25.1213333 6.87866667,23.2386667 6.72266667,19.848 C6.67733333,18.8533333 6.66666667,18.5346667 6.66666667,16 C6.66666667,13.4653333 6.67733333,13.148 6.72266667,12.152 C6.87866667,8.76 8.76133333,6.87866667 12.152,6.724 C13.148,6.67733333 13.4653333,6.66666667 16,6.66666667 C18.5346667,6.66666667 18.8533333,6.67733333 19.8493333,6.724 C23.2426667,6.88 25.1253333,8.76666667 25.2773333,12.152 C25.3226667,13.148 25.3333333,13.4653333 25.3333333,16 C25.3333333,18.5346667 25.3226667,18.8533333 25.2773333,19.848 Z" class="gray"></path></svg></a> </div> </div> </script> <script> var GalleryDisplay = Vue.component('exh-onlinecontacts-display', { data: function(){ return { compincludepath: "includes/vue/exhibitor/exh-onlinecontacts-display.cfm" } }, template:"#exh-onlinecontacts-display-template", props: ["name", "title", "isavailable", "bio", "email", "twitter", "facebook", "linkedin", "instagram", "thumbnail", "loggedin", "exhid", "hasplanner", "contactid", "chatid", "isoptedin"], mounted: function() { }, computed: { content: function() { return { loginToContact: this.displaycontent(this.compincludepath, 'loginToContact') } } }, methods:{ emailButtonClick: function(contactid, fullname, email) { this.$emit('email-contact', {contactid: contactid, fullname: fullname, email: email} ); }, initiateChat: function(contactid, exhid, userid, fullname, email, addedtoplanner, contactindex) { if(!addedtoplanner) { var myshowfunction = "AddFavorite" , requestObj = {"keys": contactid, "tablename": "additionalcontacts", "exhid": exhid} , vObj = this , callback = function(){ vObj.addedtoplannerfinal = true; } , errormessage = "Error adding online contact to planner", return_to = encodeURIComponent(vObj.getCurrentURL()); vObj.ajaxGet( vObj.path2approot + '/myshow/myshow-actions.cfm?action=' + myshowfunction + "&" + vObj.objectToURLValues(requestObj) + "&return_to=" + return_to, // ajaxGet() defined in _global-mixin function(response) { // success callback(); }, function(response) { // error if ("ERRORCODE" in response && response.ERRORCODE == "12345") { location.href = vObj.path2approot + '/login/login.cfm'; } else { vObj.showMessage("error", "Error favoriting item"); } } ); // end ajaxGet this.$emit('contact-favorited'); } this.$emit('chat-initiated', {userid: userid, fullname: fullname, email: email}); } } }); </script> <script type="text/x-template" id="toggleVoteTemplate"> <span :data-original-title="tippyTitle" :title="tippyTitle" v-tippy> <template v-if="votenow"> <a v-on:click.stop.prevent="toggleVote" class="btn-primary js-myShow w-100" :class="[{'is-saved': hasvotedforfinal, 'is-disabled': !allowvoting || (!allowvotechanges && hasvotedforfinal)}]" :title="!hasvotedforfinal ? 'Cast your vote' : 'Vote has been made'"> <svg width="24" height="24" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" :class="{'is-saved': hasvotedforfinal, 'icon': true,'rotating': loading}" role="img" aria-hidden="true"> <path v-if="!hasvotedforfinal && !loading" d="M21.406 9.558c-1.21-.051-2.87-.278-3.977-.744.809-3.283 1.253-8.814-2.196-8.814-1.861 0-2.351 1.668-2.833 3.329-1.548 5.336-3.946 6.816-6.4 7.401v-.73h-6v12h6v-.904c2.378.228 4.119.864 6.169 1.746 1.257.541 3.053 1.158 5.336 1.158 2.538 0 4.295-.997 5.009-3.686.5-1.877 1.486-7.25 1.486-8.25 0-1.648-1.168-2.446-2.594-2.506zm-17.406 10.442h-2v-8h2v8zm15.896-5.583s.201.01 1.069-.027c1.082-.046 1.051 1.469.004 1.563l-1.761.099c-.734.094-.656 1.203.141 1.172 0 0 .686-.017 1.143-.041 1.068-.056 1.016 1.429.04 1.551-.424.053-1.745.115-1.745.115-.811.072-.706 1.235.109 1.141l.771-.031c.822-.074 1.003.825-.292 1.661-1.567.881-4.685.131-6.416-.614-2.239-.965-4.438-1.934-6.959-2.006v-6c3.264-.749 6.328-2.254 8.321-9.113.898-3.092 1.679-1.931 1.679.574 0 2.071-.49 3.786-.921 5.533 1.061.543 3.371 1.402 6.12 1.556 1.055.059 1.024 1.455-.051 1.584l-1.394.167s-.608 1.111.142 1.116z" fill="white"></path> <path v-if="hasvotedforfinal && !loading" d="M9 21.035l-9-8.638 2.791-2.87 6.156 5.874 12.21-12.436L24 5.782z" fill="white"></path> <path v-if="loading" :d="loadingIcon" fill="white"></path> </svg> <span v-if="!loading" class="b ml2 v-mid"> {{voteStatus}} </span> </a> </template> </span></script> <script> var ToggleVote = Vue.component("toggle-vote", { props: { keys: { default: "", type: [String, Number] }, categoryid: { default: "", type: [String, Number] }, categorytypeid: { default: "", type: [String, Number] }, uservotecount: { default: 0, type: Number }, usercategoryvotecount: { default: 0, type: Number }, hasvotedfor: { default: false, type: Boolean }, votenow: { default: false, type: Boolean }, type: { default: "exhibitor", type: String }, tablename: { default: "", type: String }, enabled: { default: true, type: Boolean }, disabledtext: { default: "You have already reached your maximum votes for this product category or overall.", type: String } }, mixins: [messagedisplayMixin], template:"#toggleVoteTemplate", data: function() { return { compincludepath: "includes/vue/generic/toggle-vote.cfm", loading: false, hasvotedforfinal: this.hasvotedfor, votedForIcon: "M9 21.035l-9-8.638 2.791-2.87 6.156 5.874 12.21-12.436L24 5.782z", notVotedForIcon: "M24 10H14V0h-4v10H0v4h10v10h4V14h10z", loadingIcon: "M11.501 4.025v-4.025h1v4.025l-.5-.025-.5.025zm-7.079 5.428l-3.884-1.041-.26.966 3.881 1.04c.067-.331.157-.651.263-.965zm5.995-5.295l-1.039-3.878-.967.259 1.041 3.883c.315-.106.635-.197.965-.264zm-6.416 7.842l.025-.499h-4.026v1h4.026l-.025-.501zm2.713-5.993l-2.846-2.845-.707.707 2.846 2.846c.221-.251.457-.487.707-.708zm-1.377 1.569l-3.48-2.009-.5.866 3.484 2.012c.15-.299.312-.591.496-.869zm13.696.607l3.465-2-.207-.36-3.474 2.005.216.355zm.751 1.993l3.873-1.038-.129-.483-3.869 1.037.125.484zm-3.677-5.032l2.005-3.472-.217-.125-2.002 3.467.214.13zm-1.955-.843l1.037-3.871-.16-.043-1.038 3.873.161.041zm3.619 2.168l2.835-2.834-.236-.236-2.834 2.833.235.237zm-9.327-1.627l-2.011-3.484-.865.5 2.009 3.479c.276-.184.568-.346.867-.495zm-4.285 8.743l-3.88 1.04.26.966 3.884-1.041c-.106-.314-.197-.634-.264-.965zm11.435 5.556l2.01 3.481.793-.458-2.008-3.478c-.255.167-.522.316-.795.455zm3.135-2.823l3.477 2.007.375-.649-3.476-2.007c-.116.224-.242.439-.376.649zm-1.38 1.62l2.842 2.842.59-.589-2.843-2.842c-.187.207-.383.403-.589.589zm2.288-3.546l3.869 1.037.172-.644-3.874-1.038c-.049.218-.102.434-.167.645zm.349-2.682l.015.29-.015.293h4.014v-.583h-4.014zm-6.402 8.132l1.039 3.879.967-.259-1.041-3.884c-.315.106-.635.197-.965.264zm-1.583.158l-.5-.025v4.025h1v-4.025l-.5.025zm-5.992-2.712l-2.847 2.846.707.707 2.847-2.847c-.25-.22-.487-.456-.707-.706zm-1.165-1.73l-3.485 2.012.5.866 3.48-2.009c-.185-.278-.347-.57-.495-.869zm2.734 3.106l-2.01 3.481.865.5 2.013-3.486c-.299-.149-.591-.311-.868-.495zm1.876.915l-1.042 3.886.967.259 1.04-3.881c-.33-.067-.65-.158-.965-.264z", activeRound: Vue.MYS.getActiveVotingRound(Vue.MYS.getShowDateTime()), regtype: Vue.MYS.regtype, altregid: Vue.MYS.altregid } }, watch: { hasvotedfor: { deep: true, handler: function(e) { this.hasvotedforfinal = e; } } }, computed: { content: function() { return { castVoteText: this.displaycontent(this.compincludepath, 'castVoteText'), voteCastedText: this.displaycontent(this.compincludepath, 'voteCastedText'), removeVoteText: this.displaycontent(this.compincludepath, 'removeVoteText'), updatingText: this.displaycontent(this.compincludepath, 'updatingText') }; }, tippyTitle: function() { if (!this.allowvoting) { if(this.hasvotedfor && this.activeRound.allowvotechanges == 0) { return 'Votes cannot be changed once cast for this round of voting.' } else { return this.disabledtext; } } else { return ""; } }, allowvoting: function() { if (this.activeRound.attendeesonly == 1 && this.attendee == true && ( (!this.activeRound.allowvotechanges == 1 && !this.hasvotedfor && !this.activeRound.usecategories == 1 && this.uservotecount < this.activeRound.maxvotes) || (this.activeRound.allowvotechanges == 1 && !this.activeRound.usecategories == 1 && (this.uservotecount < this.activeRound.maxvotes || this.hasvotedfor)) || (!this.activeRound.allowvotechanges == 1 && !this.hasvotedfor && this.activeRound.usecategories == 1 && this.usercategoryvotecount < this.activeRound.maxvotes) || (this.activeRound.allowvotechanges == 1 && this.activeRound.usecategories == 1 && (this.usercategoryvotecount < this.activeRound.maxvotes || this.hasvotedfor)) ) ) { if(this.activeRound.attendeetypes.length) { if (this.activeRound.attendeetypes.includes(this.regtype)){ return true; } else { return false; } } else { return true; } } else if (this.activeRound.attendeesonly == 0 && ( (!this.activeRound.allowvotechanges == 1 && !this.hasvotedfor && !this.activeRound.usecategories == 1 && this.uservotecount < this.activeRound.maxvotes) || (this.activeRound.allowvotechanges == 1 && !this.activeRound.usecategories == 1 && (this.uservotecount < this.activeRound.maxvotes || this.hasvotedfor)) || (!this.activeRound.allowvotechanges == 1 && !this.hasvotedfor && this.activeRound.usecategories == 1 && this.usercategoryvotecount < this.activeRound.maxvotes) || (this.activeRound.allowvotechanges == 1 && this.activeRound.usecategories == 1 && (this.usercategoryvotecount < this.activeRound.maxvotes || this.hasvotedfor)) ) ) { return true; } else { return false; } }, hasactiveround: function() { if(typeof this.activeRound.roundid != 'undefined') { return true; } else { return false; } }, allowvotechanges: function() { if(this.activeRound.allowvotechanges == 1) { return true; } else { return false; } }, voteStatus: function() { if(this.hasvotedforfinal) { return 'Vote Saved'; } else { return 'Vote'; } }, attendee: function() { if(this.altregid.length) { return true; } else { return false; } } }, methods: { toggleVote: function() { var myshowfunction = "" , requestObj = {} , vObj = this , callback = function(){ } , errormessage = ""; var confirmvote = false; if(!vObj.allowvotechanges && vObj.uservotecount == 0) { if(confirm("Once your vote is saved, you will not be able to change it. Are you sure you want to vote for this product?")) { confirmvote = true; } } else { confirmvote = true; } if (vObj.enabled && vObj.allowvoting && confirmvote) { switch(vObj.type) { case "product": if (!vObj.hasvotedforfinal) { myshowfunction = "AddVote"; requestObj["keys"] = vObj.keys; requestObj["ctid"] = vObj.categorytypeid; requestObj["cid"] = vObj.categoryid; requestObj["rid"] = vObj.activeRound.roundid; requestObj["tablename"] = 'ShowFeatures'; requestObj["tablecolumn"] = 'FeatureID'; errormessage = "Error voting for product"; callback = function(){ vObj.hasvotedforfinal = true; vObj.$emit('reset-vote-button', {pid: vObj.keys, hasvotedfor: true, cid: vObj.categoryid, ctid: vObj.categorytypeid, tablename: 'ShowFeatures', tablecolumn: 'FeatureID'}); }; } else { myshowfunction = "RemoveVote"; requestObj["keys"] = vObj.keys; requestObj["ctid"] = vObj.categorytypeid; requestObj["cid"] = vObj.categoryid; requestObj["rid"] = vObj.activeRound.roundid; requestObj["tablename"] = 'ShowFeatures'; requestObj["tablecolumn"] = 'FeatureID'; errormessage = "Error removing vote for product"; callback = function(){ vObj.hasvotedforfinal = false; vObj.$emit('reset-vote-button', {pid: vObj.keys, hasvotedfor: false, cid: vObj.categoryid, ctid: vObj.categorytypeid, tablename: 'ShowFeatures', tablecolumn: 'FeatureID'}); }; } break; default: if (vObj.tablename) { if (!vObj.hasvotedforfinal) { myshowfunction = "AddVote"; requestObj["keys"] = vObj.keys; requestObj["tablename"] = vObj.tablename; errormessage = "Error adding vote"; callback = function(){ vObj.hasvotedforfinal = true; vObj.$emit('reset-vote-button', {pid: vObj.keys, hasvotedfor: true, cid: vObj.categoryid}); }; } else { myshowfunction = "RemoveVote"; requestObj["keys"] = vObj.keys; requestObj["tablename"] = vObj.tablename; errormessage = "Error removing vote"; callback = function(){ vObj.hasvotedforfinal = false; vObj.$emit('reset-vote-button', {pid: vObj.keys, hasvotedfor: false, cid: vObj.categoryid}); }; } } } vObj.loading = true; var return_to = encodeURIComponent(vObj.getCurrentURL()); vObj.ajaxGet(vObj.path2approot + '/myshow/myshow-actions.cfm?action=' + myshowfunction + "&" + vObj.objectToURLValues(requestObj) + "&return_to=" + return_to, // ajaxGet() defined in _global-mixin function(response){ // success vObj.loading = false; callback(); vObj.$emit('toggle-vote', {type: vObj.type, keys: vObj.keys}); }, function(response){ // error vObj.loading = false; if ("ERRORCODE" in response && response.ERRORCODE == "12345"){ location.href = vObj.path2approot + '/login/login.cfm'; } else { vObj.showMessage("error", "Error favoriting item"); } }); // end ajaxGet } // end if } // end toggleVote } }); </script> <style> @-webkit-keyframes rotating /* Safari and Chrome */ { from { -webkit-transform: rotate(0deg); -o-transform: rotate(0deg); transform: rotate(0deg); } to { -webkit-transform: rotate(360deg); -o-transform: rotate(360deg); transform: rotate(360deg); } } @keyframes rotating { from { -ms-transform: rotate(0deg); -moz-transform: rotate(0deg); -webkit-transform: rotate(0deg); -o-transform: rotate(0deg); transform: rotate(0deg); } to { -ms-transform: rotate(360deg); -moz-transform: rotate(360deg); -webkit-transform: rotate(360deg); -o-transform: rotate(360deg); transform: rotate(360deg); } } .rotating { -webkit-animation: rotating 2s linear infinite; -moz-animation: rotating 2s linear infinite; -ms-animation: rotating 2s linear infinite; -o-animation: rotating 2s linear infinite; animation: rotating 2s linear infinite; } </style> <script src="https://unpkg.com/dayjs@1.8.21/dayjs.min.js"></script> <script type="text/x-template" id="exh-products-display-template"> <div class="product-item animteOnScroll"> <div class="gallery"> <a class="dim" href="#" @click="openLightBox($event, false)"> <v-lazy-image :alt="title" class="gallery-image ba b--black-10 mb3 w-100 h-auto" :src="productimage" :data-caption="captionvalue" :data-bp="productimagesrcset" :data-featureid="featureid" :data-alternativeThumbnail="'/mys_shared/'+showidlowercase+'/showfeatures/'+exhid+'/'+thumbnail+','+path2approot + '/assets/imgs/error-broken-image.png'" :data-alternativeMediaFile="'/mys_shared/'+showidlowercase+'/showfeatures/'+exhid+'/'+mediafile+','+path2approot + '/assets/imgs/error-broken-image.png'" :srcPlaceholder="path2approot + '/assets/imgs/error-broken-image.png'" :onError="'imageLoadError(this, this.getAttribute(\'data-alternativeThumbnail\').split(/,/), this.getAttribute(\'data-alternativeMediaFile\').split(/,/))'" /> </a> </div> <div class="pa3 w-100" v-if="votenow"> <toggle-vote :type="'product'" :keys="featureid" :hasvotedfor="hasvotedfor" :attendeetype="attendeetype" :attendee="attendee" :votenow="votenow" :categoryid="categoryid" :categorytypeid="categorytypeid" :uservotecount="uservotecount" :usercategoryvotecount="usercategoryvotecount" v-on:reset-vote-button="$emit('reset-vote-button', $event)" > </toggle-vote> </div> <div class="flex mb3" style="flex:1;"> <div class="ma0 mw3 jq-favorite-icon-wrapper"> <toggle-favorite :type="'showfeature'" :keys="featureid" :addedtoplanner="addedtoplanner" :exhid="exhid" v-on:toggle-favorite="$emit('toggle-favorite', $event)" ></toggle-favorite> </div> <div class="ml3 mb0-last showroom-media_body"> <h2 class="dib f2 ma0 mb3 mr2"> <a href="#" class="mr2" @click="openLightBox($event, true)"><span>{{title}}</span></a> <span v-if="isvideo" class="bg-color-brand-09 br1 dark-gray dib f7 normal pa2 pt1 pb1">{{content.videotagtext}}</span> <span v-for="tag in tags" :style="tagStyling(tag)" :class="tag.class">{{tag.text}}</span> </h2> <p v-if="dateadded" class="mb3 muted">{{content.dateaddedtext}}</p> <div class="o-DynamicContent"> <p class="mb2 js-read-more" data-rm-characters="150"> <span v-html="getDescription()"></span> <span v-if="description && description.length > descriptionLength" class="read-more__link-wrap"> <a id="read-more_1" class="read-more__link" style="cursor:pointer;" v-if="!fullDescription" @click="updateDescription(true)">{{content.readmoretext}}</a> <a id="read-more_1" class="read-more__link" style="cursor:pointer;" v-else @click="updateDescription(false)">{{content.readlesstext}}</a> </span> </p> </div> <p v-if="!shareenabled" class="b mt3"> <a :href="getExhURL(exhid)">{{content.learnmoretext}}</a> </p> </div> </div> </div> </script> <style> /* Fix for transparent PNG product images */ #bp_container img { background: #ccc; } </style> <script> var GalleryDisplay = Vue.component('exh-products-display', { data: function(){ return { compincludepath: "includes/vue/exhibitor/exh-products-display.cfm", fullDescription: false, descriptionLength: 150 } }, mixins: [dynamicContentMixin], template:"#exh-products-display-template", props: ["productimage", "productimagesrcset", "title", "description", "dateadded", "shareenabled", "exhibitorname", "featureid", "addedtoplanner", "exhid", "mediafile", "thumbnail", "isvideo", "tags", "votenow", "uservotecount", "usercategoryvotecount", "categorytypeid", "categoryid","attendee","attendeetype","hasvotedfor"], computed: { thumbimage: function() { if (this.productimage) { return this.productimage; } else { return this.path2approot + '/assets/imgs/error-broken-image.png'; } }, captionvalue: function() { var returnString = ''; // var bulletdisplay = (this.computedboothdisplay.trim() !== "")? "<span class='ml2 mr2'>&bull;</span>" : ""; returnString = "<h4 class='center db f2 ma0 mb2 mw8 tc'>" + this.title + "</h4>"; // + bulletdisplay // + this.computedboothdisplay + "</p>"; returnString += "<p class='center f6 mw8 tc'>" + (this.description && this.description.length > this.descriptionLength ? this.description.slice(0,this.descriptionLength)+'...' : this.description) + "</p>"; return returnString; }, content: function(){ return { dateaddedtext: this.renderDynamicContent(this.displaycontent(this.compincludepath, 'dateaddedtext')), learnmoretext: this.renderDynamicContent(this.displaycontent(this.compincludepath, 'learnmoretext')), videotagtext: this.displaycontent(this.compincludepath, 'videotagtext'), readmoretext: this.displaycontent(this.compincludepath, 'readmoretext'), readlesstext: this.displaycontent(this.compincludepath, 'readlesstext') } } }, methods:{ openLightBox: function(event, fromTitle) { vObj = this; event.preventDefault(); if (fromTitle) { var img = event.target.closest('div.product-item').getElementsByTagName('img')[0]; var featureID = event.target.closest('div.product-item').getElementsByTagName('img')[0].getAttribute('data-featureid'); var sourceType = event.target.closest('div.product-item').getElementsByTagName('img')[0].getAttribute('data-bp').match(/\.[0-9a-z]+$/i)[0].toLowerCase(); var path = event.target.closest('div.product-item').getElementsByTagName('img')[0].getAttribute('data-bp'); } else { var img = event.target; var featureID = event.target.closest('img').getAttribute('data-featureid'); var sourceType = event.target.closest('img').getAttribute('data-bp').match(/\.[0-9a-z]+$/i)[0].toLowerCase(); var path = event.target.getAttribute('data-bp'); // var extIndex = event.target.getAttribute('data-bp').lastIndexOf('.'); // var path2x = path.substr(0,extIndex)+'@2x'+path.substr(extIndex); } vObj.logShowFeatureStats(featureID); if ((sourceType === '.jpg') || (sourceType === '.png') || (sourceType === '.gif') || (sourceType === '.jpeg')) { BigPicture({ el: img, imgSrc: path }); } else if (sourceType === '.mp4') { BigPicture({ el: img, vidSrc: path, animationStart: function () { var video = document.querySelector('#bp_vid'); video.setAttribute("controlsList", "nodownload"); video.setAttribute("oncontextmenu", "return false"); } }); } return false; }, formatDateForDisplay: function(dateToFormat) { //Day.js - https://day.js.org/docs/en/installation/installation var formattedDate = dayjs(dateToFormat).format('MMMM DD, YYYY'); return formattedDate; }, logShowFeatureStats: function(featureID){ this.logStats('Show Feature Viewed', "", this.exhid, featureID, this.httpreferer); }, getExhURL: function(exhid){ var exhURL = this.getExhibitorURL(exhid,''); return exhURL + (exhURL.indexOf('?') != -1 ? '&' : '?') + 'featureid=' + this.featureid; }, getDescription: function() { var vObj = this; if (vObj.fullDescription) { return (vObj.description ? vObj.description : ''); } else if (!vObj.description || vObj.description == null) { return ''; } else if (vObj.description.length > vObj.descriptionLength) { return vObj.description.slice(0,vObj.descriptionLength)+'...'; } else { return vObj.description; } }, updateDescription: function(loadMore) { var vObj = this; if (loadMore) { vObj.fullDescription = true; } else { vObj.fullDescription = false; } }, tagStyling: function(object) { var style = ''; if(object.textcolor) { style += 'color: ' + object.textcolor + '; '; } if(object.color) { style += 'background-color: ' + object.color + '; '; } return style; } } }); function imageLoadError(element, thumbList, mediaList) { var image = new Image(); image.onload = function() { element.setAttribute('data-bp', mediaList.shift()); element.src = this.src; } image.onerror = function() { if (thumbList.length) { imageLoadError(element, thumbList, mediaList); } } image.src = thumbList.shift(); } </script> <script type="text/x-template" id="exh-product-category-template"> <div v-if="category && subcategory" class="w-100 w-50-m w-33-l lh-title mb3 pa2 pl4 pr4" role="listitem"> <h4 class="color-brand-02 f5 ma0 mb2 normal tc ttu"> <a :href="url"><strong>{{category}}</strong></a> </h4> <h2 class="f3 ma0 tc">{{subcategory}}</h2> </div> <div v-else class="w-100 w-50-m w-33-l lh-title mb3 pa2 pl4 pr4" role="listitem"> <h2 class="f3 ma0 tc"><a :href="url">{{category}}</a></h2> </div> </script> <script> var ProductCategory = Vue.component('exh-product-category', { data: function(){ return {} }, template:"#exh-product-category-template", props: ["category", "subcategory", "url"], mounted: function() {} }); </script> <script type="text/x-template" id="exh-product-gallery-template"> <div class="flex-l mb5 justify-between has-border items-start"> <div class="flex"> <div class="ma0 mw3 jq-favorite-icon-wrapper"> <toggle-favorite :type="'showfeature'" v-bind:keys="featureid" v-bind:addedtoplanner="addedtoplanner" v-bind:exhid="exhid" v-on:toggle-favorite="$emit('toggle-favorite', $event)" ></toggle-favorite> </div> <div class="ml3 mb0-last showroom-media_body"> <h4 class="color-brand-02 f5 ma0 mb1 normal ttu">{{subtitle}}</h4> <h2 class="dib f2 ma0 mb3">{{title}}</h2> <p class="mb0" v-html="description"></p> </div> </div> <div v-if="imagesource" class="showroom-media_image ml5-l"> <img class="ba b--black-10 h-auto" :src="imagesource" :alt="title" v-bind:data-alternativeMediaFile="''+directorymediafileurl+','+path2approot + '/assets/imgs/error-broken-image.png'" v-bind:data-alternativeThumbnail="''+directorythumbnailurl+','+path2approot + '/assets/imgs/error-broken-image.png'" :onError="'imageLoadError(this, this.getAttribute(\'data-alternativeThumbnail\').split(/,/), this.getAttribute(\'data-alternativeMediaFile\').split(/,/))'"> </div> </div> </script> <script> var productGallery = Vue.component('exh-product-gallery', { data: function(){ return {} }, template:"#exh-product-gallery-template", props: ["title", "description", "imagesource", "imagesourceset", "subtitle", "featureid", "addedtoplanner", "exhid", "directorythumbnailurl", "directorymediafileurl"], mounted: function() {} }); function imageLoadError(element, thumbList, mediaList) { var image = new Image();; image.onload = function() { //element.setAttribute('data-bp', mediaList.shift()); element.src = this.src; } image.onerror = function() { if (thumbList.length) { imageLoadError(element, thumbList, mediaList); } } image.src = thumbList.shift(); } </script> <script type="text/x-template" id="exh-show-special-template"> <div class="flex-l mb5 showroom-media_container has-border"> <div class="flex mb5 mb0-l"> <div class="ma0 mw3 jq-favorite-icon-wrapper"> <toggle-favorite :type="'special'" v-bind:keys="specialid" v-bind:addedtoplanner="addedtoplanner" v-bind:exhid="exhid" v-on:toggle-favorite="$emit('toggle-favorite', $event)" ></toggle-favorite> </div> <div class="ml3 mb0-last showroom-media_body"> <h4 class="color-brand-02 f5 ma0 mb1 normal ttu">{{subtitle}}</h4> <h2 class="dib f2 ma0 mb3">{{title}}</h2> <p class="mb0 showroom-media_description" v-html="description"></p> </div> </div> <div v-if="imagesource" class="showroom-media_image ml5-l"> <img v-if="imagesource.length > 0" class="ba b--black-10 w-100 h-auto" :alt="title" :src="imagesource" :srcset="imagesourceset" :onError="'this.onerror=null;this.srcset=\'\';this.src=\'' + path2approot + '/assets/imgs/error-broken-image.png\''"> </div> </div> </script> <script> var ShowSpecial = Vue.component('exh-show-special', { data: function(){ return {} }, template:"#exh-show-special-template", props: ["title", "description", "imagesource", "imagesourceset", "subtitle", "specialid", "addedtoplanner", "exhid"], mounted: function() {} }); </script> <script type="text/x-template" id="exh-show-event-template"> <div class="flex-l mb5 showroom-media_container has-border"> <div class="flex mb5 mb0-l"> <div class="ma0 mw3 jq-favorite-icon-wrapper"> <toggle-favorite :tablename="tablename" :type="type" v-bind:keys="keyvalue" v-bind:addedtoplanner="addedtoplanner" v-bind:exhid="exhid" v-on:toggle-favorite="$emit('toggle-favorite', $event)" ></toggle-favorite> </div> <div class="ml3 mb0-last showroom-media_body"> <h4 class="color-brand-02 f5 ma0 mb1 normal ttu">{{category}}</h4> <h2 v-if="startdate == enddate" class="f2 ma0 mb3">{{startdate}} <span class="ml2 mr2 muted normal">&ndash;</span> {{starttime}} - {{endtime}} <span v-if="showtimezone">{{timezone}}</span></h2> <h2 v-if="startdate != enddate" class="f2 ma0 mb3">{{starttime}} {{startdate}} <span class="ml2 mr2 muted normal">&ndash;</span> {{endtime}} {{enddate}} <span v-if="showtimezone">{{timezone}}</span></h2> <p class="b dib f3 mb2"><a v-on:click="urlClicked(url)" :href="url" :title="title">{{title}}</a></p> <p class="mb0 showroom-media_description" v-html="description"></p> </div> </div> <div v-if="imgsrc" class="showroom-media_image ml5-l"> <a v-on:click="urlClicked(url)" :href="url" title=""> <img class="ba b--black-10 w-100 h-auto" :alt="title" :src="imgsrc" :srcset="imgsrcset" :onError="'this.onerror=null;this.srcset=\'\';this.src=\'' + path2approot + '/assets/imgs/error-broken-image.png\''"> </a> </div> </div> </script> <style> /*.wrapper-stretch > hr.o-PageDivider:last-child { display: none; }*/ </style> <script> var ShowEvent = Vue.component('exh-show-event', { data: function(){ return {} }, template:"#exh-show-event-template", props: ["addedtoplanner", "exhid", "title", "description", "category", "keyvalue", "starttime", "startdate", "endtime", "enddate", "url", "imgsrc", "imgsrcset", "showtimezone", "timezone", "tablename", "type"], mounted: function() {}, methods: { urlClicked: function(url){ var urlString = (url+'').toLowerCase(); if (urlString.includes('http')) { this.logStats('URL Link', '', this.exhid, urlString, 'Scheduled Event Link'); } } } }); </script> <script type="text/x-template" id="exh-additional-info-template"> <div class="flex-m w-50-m w-33-l lh-title mb3 pa2 pl4 pr4"> <div class="flex mb3"> <div class="ma0 mw3 jq-favorite-icon-wrapper"> <toggle-favorite :type="'collateral'" v-bind:keys="id" v-bind:addedtoplanner="addedtoplanner" v-bind:exhid="exhid" v-on:toggle-favorite="$emit('toggle-favorite', $event)" ></toggle-favorite> </div> <div class="ml3 mb0-last showroom-media_body"> <h4 class="color-brand-02 f5 ma0 mb1 normal ttu">{{category}}</h4> <h2 class="dib f3 ma0 mb3"><a @click="linkClicked()" :href="url" target="_blank">{{title}}</a></h2> </div> </div> </div> </script> <script> var AdditionalInfo = Vue.component('exh-additional-info', { data: function(){ return {} }, template:"#exh-additional-info-template", props: ["title", "url", "category", "id", "addedtoplanner", "exhid"], mounted: function() {}, methods: { linkClicked: function() { this.$emit('link-clicked'); } } }); </script> <script type="text/x-template" id="exh-live-demos-template"> <div :class="(starttimeformatted <= currenttime && endtimeformatted >= currenttime) ? ' pa4 o-Alert_Info flex-l showroom-media_container mb5 has-border' : ' flex-l showroom-media_container mb5 has-border'" role="alert"> <div class="flex"> <toggle-favorite v-bind:type="type" v-bind:keys="id" v-bind:exhid="exhid" v-bind:addedtoplanner="addedtoplanner" v-on:toggle-favorite="$emit('toggle-favorite', $event)"> </toggle-favorite> <div class="ml3 mb0-last showroom-media_body"> <span v-if="ondemand==true"> <h2 class="f2 ma0 mb1">On Demand</h2> <p class="muted">Originally Aired: {{startdate}} <span class="ml1 mr1 muted normal">&ndash;</span> {{ondemandstarttime}} - {{ondemandendtime}} <span v-if="showtimezone">{{timezone}}</span></p> </span> <span v-else> <h2 class="f2 ma0 mb3">{{startdate}} <span class="ml1 mr1 muted normal">&ndash;</span> {{starttime}} - {{endtime}} <span v-if="showtimezone">{{timezone}}</span></h2> </span> <p class="b dib f3 mb2"><a :href="url" :title="title">{{title}}</a></p> <p class="mb0 showroom-media_description">{{description}}</p> </div> </div> <div v-if="imgsrc" class="showroom-media_image ml5-l"> <a :href="url" :title="title" class="bb-0"> <img class="ba b--black-10 w-100 h-auto" v-bind:alt="title" v-bind:src="imgsrc" v-bind:srcset="imgsrcset"> </a> </div> </div> </script> <style> /*.wrapper-stretch > hr.o-PageDivider:last-child { display: none; }*/ </style> <script> var ShowEvent = Vue.component('exh-live-demos', { data: function(){ return {} }, computed: { ondemandstartdate: function(){ if(this.meetingstartdate && this.meetingstartdate.length > 0){ return this.meetingstartdate; } else { return this.startdate; } }, ondemandstarttime: function(){ if(this.meetingstarttime && this.meetingstarttime.length > 0){ return this.meetingstarttime; } else { return this.starttime; } }, ondemandendtime: function(){ if(this.meetingendtime && this.meetingendtime.length > 0){ return this.meetingendtime; } else { return this.endtime; } } }, template:"#exh-live-demos-template", props: ["addedtoplanner", "type", "id", "exhid", "timezone", "showtimezone", "currenttime", "title", "description", "starttime", "startdate", "endtime", "url", "imgsrc", "imgsrcset", "starttimeformatted", "endtimeformatted", "ondemand", "meetingstartdate", "meetingstarttime", "meetingendtime"], mounted: function() {} }); </script> <script type="text/x-template" id="exh-onsiteproduct-gallery-template"> <div class="flex-l mb5 justify-between has-border items-start"> <div class="flex"> <div class="ma0 mw3 jq-favorite-icon-wrapper"> <toggle-favorite :type="'showfeature'" v-bind:keys="featureid" v-bind:addedtoplanner="addedtoplanner" v-bind:exhid="exhid" v-on:toggle-favorite="$emit('toggle-favorite', $event)" ></toggle-favorite> </div> <div class="ml3 mb0-last showroom-media_body"> <h4 class="color-brand-02 f5 ma0 mb1 normal ttu">{{subtitle}}</h4> <h2 class="dib f2 ma0 mb3">{{title}}</h2> <span v-if="tags.length > 0" class="bg-green-1 br1 dark-gray dib f7 normal ml1 pa2 pt1 pb1">{{tags}}</span> <p class="mb0" v-html="description"></p> </div> </div> <img @click="openLightBox($event)" :src="thumbnailsource" alt="title" :data-caption="captionvalue" v-bind:data-bp="imagesource" v-bind:data-alternativeMediaFile="''+directorymediafileurl+','+path2approot + '/assets/imgs/error-broken-image.png'" v-bind:data-alternativeThumbnail="''+directorythumbnailurl+','+path2approot + '/assets/imgs/error-broken-image.png'" :onError="'imageLoadError(this, this.getAttribute(\'data-alternativeThumbnail\').split(/,/), this.getAttribute(\'data-alternativeMediaFile\').split(/,/))'" /> </div> </script> <style> @media screen and (min-width: 100em) { .o-sort-form_outer { padding-left: 1.5rem; } #bp_caption { display: block; } } .is-visually-hidden { clip: rect(0, 0, 0, 0); display: inherit; position: absolute; } @media screen and (max-width: 60em) { .is-visually-hidden_medium { clip: rect(0, 0, 0, 0); display: inherit; position: absolute; } } #bp_container img, #bp_sv, #bp_aud, #bp_vid { top: 30px; bottom: initial; } /* Fix for transparent PNG product images */ #bp_container img { background: #ccc; } </style> <script> var onsiteproductGallery = Vue.component('exh-onsiteproduct-gallery', { data: function(){ return {} }, template:"#exh-onsiteproduct-gallery-template", props: ["title", "description", "thumbnailsource", "imagesource", "subtitle", "featureid", "addedtoplanner", "exhid", "directorythumbnailurl", "directorymediafileurl" ,"mediatype", "tags"], computed: { captionvalue: function() { var returnString = ''; returnString = "<h4 class='center db f2 ma0 mb2 mw8 tc'>" + this.title + "</h4>"; + "</p>"; return returnString; } }, methods:{ openLightBox: function(event) { var vObj = this; event.preventDefault(); vObj.logShowFeatureStats(vObj.featureid); var imgElement = event.target; var path = imgElement.getAttribute('data-bp'); if (vObj.mediatype == 'image') { BigPicture({ el: imgElement, imgSrc: path }); } else if (vObj.mediatype == 'video') { BigPicture({ el: imgElement, vidSrc: path, animationStart: function () { var video = document.querySelector('#bp_vid'); video.setAttribute("controlsList", "nodownload"); video.setAttribute("oncontextmenu", "return false"); } }); } return false; }, logShowFeatureStats: function(event){ var featureid = event; this.logStats('Show Feature Viewed', "", this.exhid, featureid); } } }); function imageLoadError(element, thumbList, mediaList) { var image = new Image(); image.onload = function() { element.setAttribute('data-bp', mediaList.shift()); element.src = this.src; } image.onerror = function() { if (thumbList.length) { imageLoadError(element, thumbList, mediaList); } } image.src = thumbList.shift(); } </script> <script> var fixElementMixin = { data: function(){ return { isFixed: false, elementToFixHeight: null, fixOnScrollObserver: null } }, methods: { getElementToFix: function(element, extraTopOffset){ var elementToFixOffsetTop = this.getElementOffset(element).topRelative; if (extraTopOffset) { elementToFixOffsetTop = elementToFixOffsetTop + extraTopOffset; } return elementToFixOffsetTop; }, fixElement: function(elementOffset){ if (window.pageYOffset > elementOffset) { this.isFixed = true; } else { this.isFixed = false; } }, fixElementOnScrollTrackObserver: function(primaryReferenceElement, backupReferenceElement){ var vObj = this, primaryElement = document.querySelector(primaryReferenceElement) || document.querySelector('.l-nav'), backupElement = document.querySelector(backupReferenceElement); vObj.fixOnScrollObserver = new IntersectionObserver(function (entries, observer) { if (entries[0].isIntersecting) { vObj.isFixed = false; } else { vObj.isFixed = true; } }); vObj.fixOnScrollObserver.observe(primaryElement || backupElement); }, destroyScrollObserver: function(){ if (this.fixOnScrollObserver){ this.fixOnScrollObserver.disconnect(); this.fixOnScrollObserver = null } } } }; </script> <script> var scrollHighlightMixin = { mixins: [fixElementMixin], data: function(){ return { scrolledToSection: '' } }, methods: { getElementsToScrollTrack: function(highlightElement, trackingElements, extraOffsetValue){ var extraOffsetValueFromParameter; if (typeof extraOffsetValue !== 'undefined' && typeof extraOffsetValue == 'number') { extraOffsetValueFromParameter = extraOffsetValue; } else { extraOffsetValueFromParameter = 0; } var elementOne = document.querySelector(highlightElement), elementTwo = document.querySelectorAll(trackingElements), elementsToScrollTrack = { highlightElement: elementOne, trackingElements: elementTwo, extraOffsetValue: extraOffsetValueFromParameter }; this.highlightSectionsOnScroll(elementsToScrollTrack); }, highlightSectionsOnScroll: function(trackElements){ var windowOffset = window.pageYOffset, currentElementID, divPos, divHeight, divID, highlightedAnchors; for (var i = 0; i < trackElements.trackingElements.length; i++) { currentElementID = trackElements.trackingElements[i], divPos = currentElementID.offsetTop + trackElements.extraOffsetValue, divHeight = currentElementID.clientHeight, divID = trackElements.trackingElements[i].id; if (windowOffset >= divPos && windowOffset < divPos + divHeight) { highlightedAnchors = document.querySelectorAll("a[href='" + divID + "']"); highlightedAnchors.forEach(function(element) { element.classList.add('is-selected'); }); this.scrolledToSection = divID; } else { highlightedAnchors = document.querySelectorAll("a[href='" + divID + "']"); highlightedAnchors.forEach(function(element) { element.classList.remove('is-selected'); }); this.scrolledToSection = ''; } } }, highlightSectionsOnScrollObserver: function(ElementsToHighlight, ElementsToTrack, highlightIoOverrides){ var scrollElementsToHighlight = document.querySelectorAll(ElementsToHighlight), scrollElementsToTrack = document.querySelectorAll(ElementsToTrack), highlightOnScrollConfigDefaults = { root: null, rootMargin: '0px 0px -97% 0px', threshold: 0 }, highlightOnScrollConfigUpdatedSettings = Object.assign({}, highlightOnScrollConfigDefaults, highlightIoOverrides); var highLightScrollObserver = new IntersectionObserver(function (entries, observer){ entries.forEach(function (entry){ if (entry.isIntersecting){ intersectionHandler(entry); } }); }, highlightOnScrollConfigUpdatedSettings); scrollElementsToTrack.forEach(function (element){ highLightScrollObserver.observe(element); }); function intersectionHandler(entry){ var id = entry.target.id, currentlyActive = document.querySelector(ElementsToHighlight + '.is-selected'), shouldBeActive = document.querySelector(ElementsToHighlight + '[href=' + id + ']'); if (currentlyActive) { currentlyActive.classList.remove('is-selected'); } if (shouldBeActive) { shouldBeActive.classList.add('is-selected'); } } } } }; </script> <script type="text/x-template" id="myshow-add-appointments-form_v2-template"> <section class="" id="myshow-add-appointments-form_v2"> <div class="mb3"> <span class="mys-required i"> <span class="o-Highlight"> *</span> {{content.requiredText}} </span> </div> <message-display v-bind:messages="messages" v-bind:type="messagetype" v-bind:showmessage="showmessage" :timeout="20"> </message-display> <div class="mb4"> <div class="b mb2"> {{content.locationHeader}} <span class="o-Highlight">*</span> </div> <div v-if="availableLocations.length == 1">{{getLocationDisplay(availableLocations[0].location, availableLocations[0].locationtype)}}</div> <template v-if="availableLocations.length > 1" v-for="location in availableLocations"> <label :for="location.location" class="fm-Control fm-Radio ml3 mb2">{{getLocationDisplay(location.location, location.locationtype)}} <input type="radio" :id="location.location" name="location" :value="location.location" v-model="selectedLocation" @change="clearSelection('location')"> <div class="fm-Control_Indicator"></div> </label> </template> </div> <div v-if="(selectedLocation+'').length > 0" class="mb4"> <div class="b mb2"> {{content.dateHeaderText}} <span class="o-Highlight">*</span> </div> <div v-if="availableDates.length == 1">{{availableDates[0].datedisplay}}</div> <template v-if="availableDates.length > 1" v-for="date in availableDates"> <label :for="date.date" class="fm-Control fm-Radio ml3 mb2">{{date.datedisplay}} <input type="radio" :id="date.date" name="date.date" :value="date.date" v-model="selectedDate" @change="clearSelection('date')"> <div class="fm-Control_Indicator"></div> </label> </template> </div> <div v-if="selectedDate.length > 0 && (selectedLocation+'').length > 0" class="mb4"> <div class="b mb1"> {{content.timeHeaderText}} <span class="o-Highlight">*</span> </div> <span v-if="showtimezone" class="i muted f6 db mb2">{{dynamiccontent.timeZoneInfo}}</span> <div v-if="availableTimes.length == 1">{{availableTimes[0].starttimedisplay}} - {{availableTimes[0].endtimedisplay}}</div> <select v-if="availableTimes.length > 1" v-model="selectedTime" class="fm-Select w-50-l w-100"> <option value="" disabled selected>{{content.timeHeaderText}}</option> <option v-for="time in availableTimes" :value="time.starttime+'|'+time.endtime">{{time.starttimedisplay}} - {{time.endtimedisplay}}</option> </select> </div> <div v-if="selectedDate.length > 0 && (selectedLocation+'').length > 0 && selectedTime.length > 0" class="mb4"> <label class="db b mb1"> {{content.noteHeader}} </label> <span class="i muted f6 db mb2">{{content.noteInfoText}}</span> <textarea class="w-100 fm-Textarea" name="meetingDetails" id="meetingDetails" v-model="meetingDetails" :placeholder="dynamiccontent.textPlaceholder" rows="10" maxlength="2000"></textarea> <span class="i muted f6 db mb2">{{meetingDetailscount}} / 2000</span> </div> <div class="o-PageDivider mt1 mb3"></div> <input type="button" class="btn-primary" v-bind:value="content.submitButton" v-on:click="submitAppointment()" /> </section> </script> <script> var MyShowAddappointmentsDisplay = Vue.component('myshow-add-appointments-form_v2', { data: function() { return { compincludepath: "includes/vue/myshow/myshow-add-appointments-form_v2.cfm" , availableDates: [] , availableTimes: [] , selectedLocation : '' , selectedDate: '' , selectedTime: '' , meetingDetails: '' , showtimezone: Vue.MYS.settingsConfig.timesettings.showtimezone , timezonelabel: Vue.MYS.settingsConfig.timesettings.timezonelabel , appointmentdata: [] } }, mixins: [messagedisplayMixin, dynamicContentMixin], // messagedisplayMixin is declared in \includes\vue\generic\message-display.cfm props: { exhid: { type: String, default: "" }, exhname: { type: String, default: "" } }, created: function() { if (this.appointmentdata.length == 0) { this.getAppointmentData(); } else { this.getAvailableDates(); this.getAvailableTimes(); } }, computed: { content: function() { return this.getContentObject(this.compincludepath); }, dynamiccontent: function() { return { timeZoneInfo: this.renderDynamicContent(this.displaycontent(this.compincludepath, 'timeZoneInfo')), textPlaceholder: this.renderDynamicContent(this.displaycontent(this.compincludepath, 'textPlaceholder')) }; }, meetingDetailscount: function(){ var text = this.meetingDetails; return text.length; }, availableLocations: function() { var distinctLocations = []; if (this.appointmentdata.length > 0) { for (date of this.appointmentdata) { var match = distinctLocations.filter(function(e) { return (date.location == e.location); }); if (match.length == 0) { distinctLocations.push({location: date.location, locationtype: date.locationtype}); } } if (distinctLocations.length == 1) { this.selectedLocation = distinctLocations[0].location; this.getAvailableDates(); } } return distinctLocations; } }, methods: { getAppointmentData: function(){ var vObj = this; vObj.loading = true; vObj.ajaxGet(vObj.path2approot + '/myshow/myshow-actions.cfm?action=GetAppointmentData&ExhID='+vObj.exhid, // ajaxGet() defined in _global-mixin function(response){ // success vObj.searching = false; vObj.loading = false; vObj.appointmentdata = []; for (var i = 0; i < response["DATA"]["appointmentdata"].length; i++) { if (vObj.isFutureDate(response["DATA"]["appointmentdata"][i].endtime)) { vObj.appointmentdata.push(response["DATA"]["appointmentdata"][i]); } } vObj.getAvailableDates(); vObj.getAvailableTimes(); }, function(response){ // error vObj.searching = false; vObj.loading = false; vObj.showMessage("error", "Error getting scheduled appointment time slots"); }); // end ajaxGet }, getLocationDisplay: function(location, locationType) { if (location == "virtual") { return this.content.virtualLocationText; } else if (locationType == 'booth') { return this.content.boothLabel + ' ' + location; } else { return location; } }, getAvailableDates: function() { var distinctDates = []; for (date of this.appointmentdata) { if (this.selectedLocation == date.location && distinctDates.filter(function(e) { return (e.date == date.appdate); }).length == 0) { distinctDates.push({'date': date.appdate, 'datedisplay': date.datedisplay}); } } if (distinctDates.length == 1) { this.selectedDate = distinctDates[0].date; this.getAvailableTimes(); } this.availableDates = distinctDates; }, getAvailableTimes: function() { var distinctTimes = []; for (date of this.appointmentdata) { if (this.selectedLocation == date.location && this.selectedDate == date.appdate && distinctTimes.filter(function(e) { return (e.starttime == date.starttime && e.endtime == date.endtime); }).length == 0) { distinctTimes.push({starttime: date.starttime, starttimedisplay: date.starttimedisplay, endtime: date.endtime, endtimedisplay: date.endtimedisplay}); } } if (distinctTimes.length == 1) { this.selectedTime = distinctTimes[0].starttime+'|'+distinctTimes[0].endtime; } this.availableTimes = distinctTimes; }, clearSelection: function(question) { if (question == 'location') { this.selectedDate = ""; this.selectedTime = ""; this.getAvailableDates(); this.getAvailableTimes(); } else if (question == 'date') { this.selectedTime = ""; this.getAvailableTimes(); } }, submitAppointment: function() { if ((this.selectedLocation+'').length == 0 || this.selectedDate.length == 0 || this.selectedTime.length == 0) { this.showMessage("error", "You must answer the required questions"); } else { this.$emit("add-appointment-submit", { date: this.selectedDate, time: this.selectedTime, location: this.selectedLocation, meetingdetails: this.meetingDetails, exhid: this.exhid }); } }, isFutureDate: function(apptTime) { var apptTime = new Date(apptTime); var timediff = Vue.MYS.compareToShowDate(apptTime); return (timediff <= 0 ? true : false); } }, template:"#myshow-add-appointments-form_v2-template" }); </script> <div class="mys-floorplan-wrapper"> <div class="mys-floorplan"> <div class="mys-floorplan-controls"> <ul class="mys-nav mys-floorplan-controls__left"> <a id="zoomInLink" class="bb-0" href="#0" title="Zoom In"><li><span class="mys-ico-zoom-plus mys-ico-large mys-ico-dark"></span> <span class="mys-floorplan-controls-labels">Zoom In</span></li></a> <a id="zoomOutLink" class="bb-0" href="#0" title="Zoom Out"><li><span class="mys-ico-zoom-minus mys-ico-large mys-ico-dark"></span> <span class="mys-floorplan-controls-labels">Zoom Out</span></li></a> <a id="maxFitLink" class="bb-0" href="#0" title="Max Fit"><li><span class="mys-ico-max-fit mys-ico-large mys-ico-dark"></span> <span class="mys-floorplan-controls-labels">Max Fit</span></li></a> <a id="legendLink" class="bb-0" href="#0" title="Legend"><li><span class="mys-ico-info-i mys-ico-large mys-ico-dark"></span> <span class="mys-floorplan-controls-labels">Legend</span></li></a> <a id="optionsLink" class="bb-0" href="#0" title="Options" ><li><span class="mys-ico-eye-options mys-ico-large mys-ico-dark "></span> <span class="mys-floorplan-controls-labels">Options</span></li></a> <a class="ct-PrintLink bb-0" id="mys-IDSPrintLink" href="#0" title="Print"><li><span class="mys-ico-print mys-ico-large mys-ico-dark"></span> <span class="mys-floorplan-controls-labels">Print</span></li></a> </ul> <div class="mys-floorplan-controls__right"> <select id="hallIDSelect" class="fm-Select "> <option id="hallIDSelectOption_A" value="A" title="Exhibit Hall A & B" data-exhview="1"> Exhibit Hall A & B </option> </select> </div> </div> <div id="mys-floorplan-canvas-div" class="mys-floorplan-canvas"> <div id="js-progressLine" class="mys-progress-line"></div> <div class="mys-spinner mys-spinner-centered mys-spinner-large"> <div class="mys-spinner-double-bounce1 "></div> <div class="mys-spinner-double-bounce2 "></div> <p class="mys-spinner-txt">Loading...</p> </div> </div> <div class="mys-floorplan-sponsor"> <a id="floorplanHallSponsorLink" href="#0"> <div id="floorplanHallSponsorDiv" class="mys-floorplan-sponsor-wrapper" style="display: none;"> <p id="floorplanHallSponsorP"> <strong id="floorplanHallSponsorStrong"></strong><br /> <em>Official Hall Sponsor of SATELLITE 2025</em> </p> <div id="floorplanHallSponsorBannerDiv" class="mys-banner-hall-sponsor"> <img id="floorplanHallSponsorImg" alt="Official Hall Sponsor of SATELLITE 2025"> </div><!-- /.mys-banner-hall-sponsor --> </div> </a> </div> </div> <div id="search-results-sidebar" class="mys-sidebar"> <div id="loadingSideBar" class="js-sidebar-item mys-results-none mys-is-shown-md" style="display:none"; > <div class="mys-spinner"> <div class="mys-spinner-double-bounce1"></div> <div class="mys-spinner-double-bounce2"></div> <p class="mys-spinner-txt">Loading...</p> </div> </div> <span id="js-sidebarCover" class="mys-sidebar-cover animated"></span> <div id="emptyStateTips" class="js-sidebar-item mys-results-none mys-is-shown-md" style="display:none;"> <h2> Using The Floor Plan </h2> <p>Explore the show floor by searching and viewing different halls.</p> <p class="mys-spacing-mini"><em>You can search for:</em></p> <ul> <li>Exhibitors</li> <li>Booths</li> <li>Product categories</li> <li>And more</li> </ul> <h2> Make A Plan </h2> <p>Save exhibitors, products and other things you want to remember with a free My Show Planner account.</p> <p><span class="mys-ico-star-default mys-ico-medium mys-ico-dark"></span> Save anything where you see the star icon.</p> </div> <div id="noSearchResultsDiv" class="js-sidebar-item mys-results-none mys-is-shown-md" style="display: none;"> <h2> Search Results </h2> <p>Your search <span id="noResultsSearchValueWrapperSpan">&mdash; <strong>&ldquo;<span id="noResultsSearchValueSpan"></span>&rdquo;</strong></span> did not match any <span id="noResultsSearchTypeSpan"></span>. <p class="mys-spacing-mini"><em>Suggestions:</em></p> <ul> <li>Make sure that your search is spelled correctly</li> <li>Try a more general search</li> <li>Try a different search</li> </ul> </div><!-- /.mys-results-none --> <div id="specialBoothStatusDiv" class="js-sidebar-item mys-results-none" style="display: none;"> <a id="specialStatusDivMobileCloseBtn" class="mys-nav-close mys-ico-close mys-ico-large" href="#0"></a> <span id="availableBoothH2ContentSpan" style="display: none;"> *THIS BOOTH IS AVAILABLE: {BOOTHID}* </span> <span id="availableBoothPContentSpan" style="display: none;"> The area of the booth is approximately:<br />{AVAILBOOTHSQFEET} sq. ft.<br/>To make reservations for this booth,<br>call 1 (301) 354-1691 for more information, <br /> or contact via email at <a href="mailto:mcassinelli@accessintel.com ?subject=I am interested in SATELLITE 2025 - Booth: {BOOTHID}"> mcassinelli@accessintel.com </a> </span> <span id="onHoldBoothH2ContentSpan" style="display: none;"> *THIS BOOTH IS ON HOLD: {BOOTHID}* </span> <span id="onHoldBoothPContentSpan" style="display: none;"> This booth is currently on hold. </span> <span id="privateBoothPContentSpan" style="display: none;"> Booth: {BTH_DISPLAY} - This booth has been reserved. </span> <span id="roomPContentSpan" style="display: none;"> Location: {BTH_DISPLAY} </span> <h2 id="specialBoothStatusH2"></h2> <p id="specialBoothStatusP"></p> </div><!-- /.mys-results-none --> <div id="sidebarSponsorDiv" class="mys-sidebar-sponsor js-sidebar-item" style="display: none;"> <a id="sidebarSponsorDivA" href="#0"></a> </div> <div id="searchResultsDiv" class="js-sidebar-item mys-sidebar-results"> <nav> <a id="backToAllSearchResultsLink" class="js-sidebar-item nav-back-breadcrumb mys-is-shown-md" href="#0" style="display: none;">&laquo; Back to All Search Results</a> </nav> <h2 id="featured-exhibitors-h2" class="js-sidebar-item mys-is-shown-md" style="display: none;">Featured By Booth (<span id="matchingSlottedExhibitorsCount"></span>)</h2> <div id="exhBoothSearchHitDiv" class="js-sidebar-item mys-is-shown-md"> <script id="exhBoothSearchHitDivTemplate" type="text/x-handlebars-template"> <table class="mys-results-compact mys-zebra mys-hover"> <tbody id="featuredExhibitorsTableBody"> {{#each this}} {{#ifIsExhibitorSlotted slotted}} <tr {{#ifIsExhibitorNotInSelectedHall hallid "featured"}} style="display: none;"{{/ifIsExhibitorNotInSelectedHall}} {{#ifIsOddExhibitorRow "featured"}}class="mys-zebra-odd"{{/ifIsOddExhibitorRow}} {{#if sponsorcategoryid}} data-is-category-sponsor data-exhid="{{exhid}}"{{/if}} > <td class="mys-table-bullet"> <img class="mys-featuredIcon" src="/8_0/assets/imgs/ico/featured-exhibitor.png" width="8" height="8" title="" alt="Featured exhibitor" role="presentation"> </td> <td class="mys-table-exhname" style="padding-right:10px;"> <a class="js-exhShowroomPanelLink" href="#0" data-hallid="{{hallid}}" data-exhid="{{exhid}}" data-booth="{{booth}}"><strong>{{exhname}}</strong></a> <span class="mys-booth-num">({{#renderboothdisplay}}{{boothdisplay}}{{/renderboothdisplay}})</span> </td> <td class="mys-table-addtomyshow"> <a class="js-myShowFeatureBtn js-myShowFeatureBtnAdd js-myShowFeatureBtn-{{exhid}}" href="#0" {{#if regid}} {{#ifCondition regid "==" 0}}style="display: none;"{{/ifCondition}} {{/if}} data-my-show-action-url="../myshow/myshow-actions.cfm?action=addexhibitor&keys={{exhid}}" data-exhid="{{exhid}}" title="Add to Myshow" > <svg width="24" height="24" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" class="icon mys-ico-star-default mys-ico-medium mys-ico-dark" role="img" aria-hidden="true"> <path d="M24 10h-10v-10h-4v10h-10v4h10v10h4v-10h10z"></path> </svg> </a> </td> </tr> {{/ifIsExhibitorSlotted}} {{/each}} </tbody> </table> <h2>Exhibitors By Booth (<span id="matchingExhibitorsCount"></span>)</h2> <table id="matchingExhibitorsTable" class="mys-results-compact mys-zebra mys-hover"> <tbody> {{#each this}} <tr {{#ifIsExhibitorNotInSelectedHall hallid "default"}}style="display: none;"{{/ifIsExhibitorNotInSelectedHall}} {{#ifIsOddExhibitorRow "default"}}class="mys-zebra-odd"{{/ifIsOddExhibitorRow}} > <td class="mys-table-bullet"> {{#if bullet}} <img class="mys-featuredIcon" src="/8_0/assets/imgs/ico/featured-exhibitor.png" width="8" height="8" title="" alt="Featured exhibitor" role="presentation" /> {{else}} &nbsp; {{/if}} </td> <td class="mys-table-exhname" style="padding-right:10px;"> <a {{#if bullet}}style="font-weight:bold;"{{/if}} class="js-exhShowroomPanelLink" href="#0" data-hallid="{{hallid}}" data-exhid="{{exhid}}" data-booth="{{booth}}">{{exhname}}</a> <span class="mys-booth-num">({{#renderboothdisplay}}{{boothdisplay}}{{/renderboothdisplay}})</span> </td> <td class="mys-table-addtomyshow"> <a class="js-myShowFeatureBtn js-myShowFeatureBtnAdd js-myShowFeatureBtn-{{exhid}}" href="#0" {{#if regid}} {{#ifCondition regid "==" 0}}style="display: none;"{{/ifCondition}} {{/if}} data-my-show-action-url="../myshow/myshow-actions.cfm?action=addexhibitor&keys={{exhid}}" data-exhid="{{exhid}}" title="Add to Myshow" > <svg width="24" height="24" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" class="icon mys-ico-star-default mys-ico-medium mys-ico-dark" role="img" aria-hidden="true"> <path d="M24 10h-10v-10h-4v10h-10v4h10v10h4v-10h10z"></path> </svg> </a> </td> </tr> {{/each}} </tbody> </table> </script> </div> <div id="exhBoothSharesDiv" class="js-sidebar-item" style="display: none;"> <script id="exhBoothSharesDivTemplate" type="text/x-handlebars-template"> {{#ifIsExistingSearch}} <nav> <a id="backToSearchResultsLink" class="nav-back-breadcrumb mys-is-shown-md" href="#0">&laquo; Back to Search Results</a> </nav> {{/ifIsExistingSearch}} <h2> Shared Booth Exhibitors (<span id="sharedExhibitorsCount"></span>) <a id="exhBoothSharesDivMobileCloseBtn" class="mys-nav-close mys-ico-close mys-ico-large" href="#0"></a> </h2> <ul class="mys-zebra results-exh"> <table style="" class="mys-results-compact mys-zebra mys-hover"> <tbody> {{#each this}} {{#ifIsExhibitorNotInSelectedHall hallid "default"}}{{/ifIsExhibitorNotInSelectedHall}} <tr{{#ifIsOddExhibitorRow "default"}} class="mys-zebra-odd"{{/ifIsOddExhibitorRow}}> <td class="mys-table-bullet"> {{#if bullet}} <img class="mys-featuredIcon" src="/8_0/assets/imgs/ico/featured-exhibitor.png" width="8" height="8" title="" alt="Featured exhibitor" role="presentation" /> {{else}} &nbsp; {{/if}} </td> <td class="mys-table-exhname" style="padding-right:10px;"> <a {{#if bullet}}style="font-weight:bold;"{{/if}} class="js-exhShowroomPanelLink" href="#0" data-share data-hallid="{{hallid}}" data-exhid="{{exhid}}" data-booth="{{booth}}">{{exhname}}</a> <span class="mys-booth-num">({{#renderboothdisplay}}{{boothdisplay}}{{/renderboothdisplay}})</span> </td> <td class="mys-table-addtomyshow"> <a class="js-myShowFeatureBtn js-myShowFeatureBtnAdd js-myShowFeatureBtn-{{exhid}}" href="#0" {{#if regid}} {{#ifCondition regid "==" 0}}style="display: none;"{{/ifCondition}} {{/if}} data-my-show-action-url="../myshow/myshow-actions.cfm?action=addexhibitor&keys={{exhid}}" data-exhid="{{exhid}}" data-booth="{{booth}}" title="Add to Myshow" > <svg width="24" height="24" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" class="icon mys-ico-star-default mys-ico-medium mys-ico-dark" role="img" aria-hidden="true"> <path d="M24 10h-10v-10h-4v10h-10v4h10v10h4v-10h10z"></path> </svg> </a> </td> </tr> {{/each}} </tbody> </table> </script> </div> <div id="exhShowroomPanel" class="js-sidebar-item sc-WrapperFloorPlan" style="display: none;"></div> </div> </div> </div> <script async src="https://www.googletagmanager.com/gtag/js?id=G-N77RQK6L8Y"></script> <script> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-N77RQK6L8Y'); </script> <script> var app2 = new Vue({ el: '#navbar-v2', name: 'navbar-v2', data: function() { return { showModal: false, hasnewrecommendations: false, firsttimemessage: "Click here to view your personalized recommendations based on your activity.", secondtimemessage: "Reminder: You have personalized recommendations waiting for you here.", navDisplayType: 'desktop', numberunreadmessages: 0, profileActionsMenuOpen: false, mobileMenuOpen: false, hasHeaderImage: false, hasDropdownsInNav: false, svgArrowsAll: null, dropdownContainerAll: null, navLinks: null, currentWindowWidth: window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth, themeVersion: 2, isLoggedIntoMyShow: false } }, mounted:function() { var vObj = this; vObj.setupDynamicNavAndHeader(); window.addEventListener('popstate', function(event) { vObj.showModal = false; }); if(vObj.hasSessionStorage()) { if(sessionStorage.getItem("numberunreadmessages")) { this.numberunreadmessages = parseInt(sessionStorage.getItem("numberunreadmessages")); } } this.$root.$on('new-message', function(numberunread) { vObj.numberunreadmessages = numberunread; }) }, computed: { showLogoVisible: function() { return (!this.hasHeaderImage && this.themeVersion === 1) || (this.hasHeaderImage && this.themeVersion === 2 && this.navDisplayType === 'mobile') || (this.isFloorplanPage) ? true : false; }, showInfoVisible: function() { return ((this.themeVersion === 1) || (this.hasHeaderImage && this.themeVersion === 2 && this.navDisplayType === 'mobile') || (this.isFloorplanPage)) && (this.currentWindowWidth >= 630) ? true : false; }, isFloorplanPage: function() { return this.getCurrentURL().includes('/8_0/floorplan/'); } }, methods:{ isTouchDevice: function() { return (('ontouchstart' in window) || (navigator.maxTouchPoints > 0) || (navigator.msMaxTouchPoints > 0)); }, openTogglePlannerMenu: function() { this.profileActionsMenuOpen = true; if (this.mobileMenuOpen && this.isLoggedIntoMyShow) { this.mobileMenuOpen = false; this.resetAnimation(this.navLinks); } }, closeTogglePlannerMenu: function() { if (this.mobileMenuOpen) return this.profileActionsMenuOpen = false; }, closePlannerMenu: function() { this.profileActionsMenuOpen = false; }, toggleMobileMenu: function() { this.mobileMenuOpen = !this.mobileMenuOpen; this.closePlannerMenu(); this.animateElements(this.navLinks); if (!this.mobileMenuOpen) { this.resetAnimation(this.navLinks); } }, closeMobileMenu: function() { if (this.mobileMenuOpen) { this.mobileMenuOpen = false; this.resetAnimation(this.navLinks); } }, openModal: function() { this.showModal = !this.showModal; }, closeModal: function() { this.showModal = false; }, toggleProfileActionsMenuCallback: function (event) { var vObj = this; if (event.target.closest('.o-profile-actions_dropdown') || event.target.closest('.btn-avatar') && this.profileActionsMenuOpen === false) { vObj.openTogglePlannerMenu(); } else { vObj.closeTogglePlannerMenu(); document.removeEventListener('click', vObj.toggleProfileActionsMenuCallback); } }, toggleProfileActionsMenu: function () { var vObj = this; document.addEventListener('click', vObj.toggleProfileActionsMenuCallback); }, onResizeChangeNavAndHeader: function() { var vObj = this, showHeaderContainer = document.querySelector('.l-header'), showInfoElement = document.querySelector('.show-info'), windowWidth = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth, showLogoWidth = 200, // This is the widest the show logo can be and there should always be a show logo present so we can use a set width showInfoWidth = showInfoElement ? vObj.getElementOffset(showInfoElement).width : 0, // Get the width of the show info element (show dates, location and optional text) extraNavWidth = (vObj.themeVersion === 1) || (vObj.isFloorplanPage) ? 215 : 100, // Extra padding and spacing in the <nav>, increased on theme 1 and the floorplan since there the show logo is present in the nav windowWidthMinusExtraSpace = windowWidth - showLogoWidth - extraNavWidth - showInfoWidth, // This number is the window with minus the max width of the logo plus the width of the show info div plus extra spacing in and around the <nav> navLinksTotalWidth = 0; // Total width of individual <nav> menu items so a number can be calculated accurately regardless of current nav view type // Update window width in app data{} so it can be used in window size calculations vObj.currentWindowWidth = windowWidth; // Get total width of individual nav items to use to determine which nav type to show for (var i = 0; i < vObj.navLinks.length; i++) { navLinksTotalWidth += vObj.getElementOffset(vObj.navLinks[i]).width; } // To determine nav type to show, compare window width (minus extra space) to nav type switchover point (calculated above) if (navLinksTotalWidth > windowWidthMinusExtraSpace) { // SHOW THE MOBILE NAV VIEW vObj.navDisplayType = 'mobile'; if (vObj.hasHeaderImage) { // Hide header image and display show logo on MOBILE NAV view if (showHeaderContainer) { showHeaderContainer.classList.add('dn'); } } } else { // SHOW THE DESKTOP NAV VIEW vObj.navDisplayType = 'desktop'; if (vObj.hasHeaderImage) { // Hide logo and show header image on DESKTOP NAV VIEW when header image is present if (showHeaderContainer) { showHeaderContainer.classList.remove('dn'); } } } }, setupDynamicNavAndHeader: function() { var vObj = this, dropdownLinks = document.querySelectorAll('.l-dropdown_link'), showHeaderSrc = (document.querySelector('.o-show_header')) ? document.querySelector('.o-show_header').src : ""; // Update navlinks in data {} (Used for calculating total width of first level nav children) vObj.navLinks = document.querySelectorAll('.main-navigation .js-nav_width'); // Check to see if any dropdowns are present by checking all navLinks to see if any contain the class .l-dropdown_link (var dropdownLinks above) and if so set vObj.hasDropdownsInNav = true if (dropdownLinks.length) { vObj.hasDropdownsInNav = true; } // Check to see if show header exists in theme to ensure that JS does not try to hide and show it when onResizeChangeNavAndHeader() runs and if so set vObj.hasHeaderImage = true if (showHeaderSrc.length) { vObj.hasHeaderImage = true; } // Call on page load to ensure offset calculations are correct for when the last nav link begins to wrap. vObj.onResizeChangeNavAndHeader(); // Check window size to determine which nav to show and close the hamburger menu (if open) window.addEventListener('resize', function() { vObj.onResizeChangeNavAndHeader(); vObj.closeMobileMenu(); vObj.closePlannerMenu(); }); // Close nav link dropdowns or planner menu with Escape key document.addEventListener('keydown', function(event){ if (event.key === "Escape" || event.code === "Escape") { vObj.closePlannerMenu(); vObj.handClicksOutsideDropdown(event); } }); // Call toggleNavLinkDropdown() when clicking links with dropdown sub menus to open and close the sub menus is dropdowns are present if (vObj.hasDropdownsInNav) { dropdownLinks.forEach(function(element) { element.addEventListener('click', vObj.toggleNavLinkDropdown); }); } }, toggleNavLinkDropdown: function(event) { var vObj = this, elementClicked = event.target, elementClickedParent = elementClicked.closest('li.l-dropdown_link'), elementClickedParentId = elementClicked.closest('li.l-dropdown_link').getAttribute('id'), dropdownContainerClosest = elementClickedParent.querySelector('ul#' + elementClickedParentId), dropdownLink = elementClickedParent.querySelector('li a'), arrowSpanClosestDown = elementClickedParent.querySelector('span.o-arrow_down'), svgArrowSpanClosestDown = elementClickedParent.querySelector('svg.o-arrow_down_svg'); // Update values in data {} vObj.dropdownContainerAll = document.querySelectorAll('ul.l-nav-dropdown_container'); vObj.svgArrowsAll = document.querySelectorAll('span.o-arrow_down svg.o-arrow_down_svg'); // Prevent default action on these targets so the dropdown menu works as expected, otherwise follow the links within the dropdown menu if (event.target == elementClickedParent || event.target == arrowSpanClosestDown || event.target == dropdownLink || event.target == svgArrowSpanClosestDown) { event.preventDefault(); } // Open only dropdown that is clicked on and only close the appropriate dropdowns thereafter if (dropdownContainerClosest.classList.contains('dn')) { var dropdownContainerAllOpen = document.querySelectorAll('ul.l-nav-dropdown_container'); if (dropdownContainerAllOpen.length > 1) { // Close all dropdowns not clicked on dropdownContainerAllOpen.forEach(function(element) { element.classList.add('dn'); }); // Return dropdown indicator arrows to their original position vObj.svgArrowsAll.forEach(function(element) { element.classList.remove('rotated-up'); element.classList.add('rotated-down'); }); } // Open dropdown clicked on dropdownContainerClosest.classList.remove('dn'); // Close planner menu when opening a dropdown vObj.closePlannerMenu(); } else { // Close dropdown clicked on dropdownContainerClosest.classList.add('dn'); } // Return dropdown indicator arrows to their original position if (svgArrowSpanClosestDown.classList.contains('rotated-up')) { svgArrowSpanClosestDown.classList.remove('rotated-up'); svgArrowSpanClosestDown.classList.add('rotated-down'); } else { svgArrowSpanClosestDown.classList.add('rotated-up'); svgArrowSpanClosestDown.classList.remove('rotated-down'); } // Detect all clicks on the document after toggleNavLinkDropdown() is called document.addEventListener('click', vObj.handClicksOutsideDropdown); }, handClicksOutsideDropdown: function(event) { var vObj = this; // If user clicks outside the dropdown or uses the Escape key, reset dropdowns and remove event listener if (event.key === "Escape" || event.code === "Escape" || !event.target.closest('li.l-dropdown_link')) { if (vObj.hasDropdownsInNav) { vObj.resetDropdowns(); } document.removeEventListener('click', vObj.handClicksOutsideDropdown); } else { return } }, resetDropdowns: function() { var vObj = this; // Close all dropdowns vObj.dropdownContainerAll.forEach(function(element) { element.classList.add('dn'); }); // Also revert all dropdown arrows to the correct rotation vObj.svgArrowsAll.forEach(function(element) { element.classList.remove('rotated-up'); element.classList.add('rotated-down'); }); }, // Animate links into mobile nav dropdown animateElements: function(elementsToAnimate) { elementsToAnimate.forEach(function(element, i) { element.classList.add('animated'); element.classList.add('fadeInUp'); element.style[ 'animationDelay' ] = ( i * 90 ) + 'ms'; }); }, // Reset animation properties on links in mobile nav dropdown set by animateElements() resetAnimation: function(elementsToReset) { elementsToReset.forEach(function(element, i) { element.classList.remove('animated'); element.classList.remove('fadeInUp'); element.style['animationDelay'] = 0 + 'ms'; }); }, // Offset utility function. Pass 'log' (String) as second argument to log returned offsets {} getElementOffset: function(element, log) { var rect = element.getBoundingClientRect(), scrollTop = window.pageYOffset || document.documentElement.scrollTop, scrollLeft = window.pageXOffset || document.documentElement.scrollLeft; var offsets = { element: element, rect: rect, top: rect.top, right: rect.right, bottom: rect.top, left: rect.left, topRelative: rect.top + scrollTop, leftRelative: rect.left + scrollLeft, scrollTop: scrollTop, scrollLeft: scrollLeft, height: rect.height, width: rect.width } if ((arguments[1] !== undefined) && (arguments[1].toLowerCase() === 'log')) { console.log(offsets); } return offsets; }, logout: function(){ if(this.hasSessionStorage()) { sessionStorage.removeItem("numberunreadmessages"); } this.$refs.logoutform.submit(); } } }); </script> <script type="text/javascript" src="/mys_shared/js/printthis/printThis.min.js?mysv=20221018A"></script> <script src="/mys_shared/js/fontfaceobserver/fontfaceobserver.js?mysv=20221018A"></script> <script type="text/javascript" src="/8_0/assets/js/global.js?mysv=20221018A"></script> <script src="/mys_shared/js/handlebars/handlebars-v4.0.2.js"></script> <script src="/mys_shared/js/handlebars/handlebars-helpers-1.0.js"></script> <script src="/mys_shared/js/flickity/flickity.pkgd.min.js"></script> <script src="/mys_shared/js/chosen/js/chosen.jquery.min.js"></script> <script src="/mys_shared/js/d3plus/d3.min.js"></script> <script src="/mys_shared/js/d3plus/d3plus.min.js"></script> <script src='/mys_shared/js/turf/v5.1.6/turf.min.js'></script> <script src='/mys_shared/js/maplibre/maplibre-gl-3.1.0/maplibre-gl.js'></script> <link rel='stylesheet' href='/mys_shared/js/maplibre/maplibre-gl-3.1.0/maplibre-gl.css' type='text/css'/> <!-- Tippy JS for Lightweight JS Tooltips (includes Popper.js bundeled)--> <script src="/mys_shared/js/tippy/1.4.1/js/tippy.min.js"></script> <link rel="stylesheet" href="/mys_shared/js/tippy/1.4.1/css/tippy.css"> <script> var MYSFloorplan_1_0 = { showID: "SATELLITE2025" , environment: "production" , regID: "0" , graphqlshowid: 'U2FsdGVkX1+yUYeKufZGa5z6xVy8gg+cpKZDVuFHE0g=' , mediaPlayerURL: "" , halls: ["A"] , statsSearchID_Prefix: "" // TODO :: STEPHEN :: GOTTA FIGURE OUT WHAT TO DO , showavailablebooths: "1" , showavailableboothsbydefault: "1" , appLaunchStatAltValue: "nav bar link" , measuretype: "us" , roomPrefix: "Location: " , objBoothSearchHitsByHall: {} , objBoothSearchHitCountsByHall: {} , ajaxDirectoryPath: "/8_0/ajax/" , exhDirectoryPath: "/8_0/exhibitor/" , floorPlanDirectoryPath: "/8_0/floorplan/" , builderversion: "8.0" , facilityOverviewHallID: "OO" , exhibitorview: false , viewer: "attendee" }; maplibregl.prewarm(); </script> <script src="/8_0/floorplan/02/js/app2.min.js?breakcache=20240926A"></script> <script src="/mys_shared/js/jspdf/jspdf.min.js"></script> <div id="mys-jq-legend" class="mys-display-none ui-dialog-title" title="Legend"> <div id="mys-jq-moreoptions-menu"> <ul id="mys-jq-moreoptions-links" class="mys-nav-stack"> <li> <img class="legend-ico" src="/mys_shared/globalfiles/floorplan_v8_0_0/img/legend-icons/legend-selected-exhibitor.png" srcset="/mys_shared/globalfiles/floorplan_v8_0_0/img/legend-icons/legend-selected-exhibitor@2x.png 2x" alt="Selected exhibitor beacon"> <span class="mys-grey mys-shiftLeft-5px">Selected Exhibitor</span> </li> <li> <img class="legend-ico" src="/mys_shared/globalfiles/floorplan_v8_0_0/img/legend-icons/legend-search-result.png" srcset="/mys_shared/globalfiles/floorplan_v8_0_0/img/legend-icons/legend-search-result@2x.png 2x" alt="Search results dot"> <span class="mys-grey mys-shiftLeft-5px">Search Results</span> </li> <li> <img class="legend-ico" src="/mys_shared/globalfiles/floorplan_v8_0_0/img/legend-icons/legend-myshow-exhibitor.png" srcset="/mys_shared/globalfiles/floorplan_v8_0_0/img/legend-icons/legend-myshow-exhibitor@2x.png 2x" alt="Saved exhibitors outline"> <span class="mys-grey mys-shiftLeft-5px">Saved Exhibitors</span> </li> <li > <img class="legend-ico" src="/mys_shared/globalfiles/floorplan_v8_0_0/img/legend-icons/legend-corner-peel.png" srcset="/mys_shared/globalfiles/floorplan_v8_0_0/img/legend-icons/legend-corner-peel@2x.png 2x" alt="Featured exhibitors corner peel"> <span class="mys-grey mys-shiftLeft-5px">Featured Exhibitor</span> </li> <li id="mys-jq-legend-available-booths" > <img class="legend-ico" src="/mys_shared/globalfiles/floorplan_v8_0_0/img/legend-icons/ico-legend-available.png" srcset="/mys_shared/globalfiles/floorplan_v8_0_0/img/legend-icons/ico-legend-available@2x.png 2x" alt="Available Booth"> <span class="mys-grey mys-shiftLeft-5px">Available Booth</span> </li> </ul> </div> </div> <div class="mys-display-none ui-dialog-title mys-jq-floorplan-options" title="Floor Plan Options"> <div id="mys-jq-moreoptions-menu"> <ul id="mys-jq-moreoptions-links" class="mys-nav-stack"> <li class="mys-is-hidden-md"> <a class="zoomInLink" href="#0" title="Zoom In"> <span class="mys-ico-zoom-plus mys-ico-large mys-ico-dark"></span> <span class="mys-shiftLeft-5px">Zoom In</span> </a> </li> <li class="mys-is-hidden-md"> <a class="zoomOutLink" href="#0" title="Zoom Out"> <span class="mys-ico-zoom-minus mys-ico-large mys-ico-dark"></span> <span class="mys-shiftLeft-5px">Zoom Out</span> </a> </li> <li class="mys-is-hidden-md"> <a class="maxFitLink" href="#0" title="Max Fit"> <span class="mys-ico-max-fit mys-ico-large mys-ico-dark"></span> <span class="mys-shiftLeft-5px">Max Fit</span> </a> </li> <li> <form id="optionsMenu" action=""> <label class="mys-options-available-booths"> <input type="checkbox" class="mys-jq-showavailablebooths" name="showavailablebooths" checked="checked"> Show Available Booths </label> </form> </li> </ul> </div> </div> <div id="print-dialog" title="Print Options" style="display: none;"> <div id="mys-jq-moreoptions" class=" ui-dialog-title"> <div id="mys-jq-moreoptions-menu"> <div id="mys-jq-moreoptions-links" class="mys-nav-stack-anchor"> <div id="mys-jq-print-form-contents"> <form action=""> <h4 class="mb2"> Orientation: </h4> <div class="mys-form-indent"> <div class="mb6"> <label class="fm-Control fm-Radio" id="mys-print-fp-landscape-label"> <input type="radio" name="orientation" value="l" checked="checked">Landscape <div class="fm-Control_Indicator"></div> </label> <label class="fm-Control fm-Radio" id="mys-print-fp-portrait-label"> <input type="radio" name="orientation" value="p">Portrait <div class="fm-Control_Indicator"></div> </label> </div> </div><!-- /.mys-form-indent --> <hr /> <h4 class="mb2"> Include Exhibitor Results: </h4> <div id="mys-print-form-disable"> <div class="mys-form-indent"> <div class="mb6"> <label class="fm-Control fm-Radio" id="mys-print-fp-none-label"> <input type="radio" name="results" value="none" checked="checked">None <div class="fm-Control_Indicator"></div> </label> <label class="fm-Control fm-Radio" id="mys-print-fp-searchresults-label"> <input type="radio" name="results" value="searchresults">Search Results <div class="fm-Control_Indicator"></div> </label> <label class="fm-Control fm-Radio" id="mys-print-fp-myshow-label"> <input type="radio" name="results" value="myshowplanner">My Show Planner <div class="fm-Control_Indicator"></div> </label> </div> </div><!-- /.mys-form-indent --> <h4 class="mb2">Include Exhibitor Names on Floor Plan:</h4> <div class="mys-form-indent"> <div class="mb6"> <label class="fm-Control fm-Checkbox" id="mys-print-fp-currenthall-label"> <input type="checkbox" name="areExhNamesIncluded" value="yes" checked>Yes <div class="fm-Control_Indicator"></div> </label> </div> </div><!-- /.mys-form-indent --> <h4 class="mb2">Include Exhibitor Notes on Floor Plan:</h4> <div class="mys-form-indent"> <div class="mb6"> <label class="fm-Control fm-Checkbox"> <input type="checkbox" name="areExhNotesIncluded" value="yes" />Yes <div class="fm-Control_Indicator"></div> </label> </div> </div><!-- /.mys-form-indent --> <h4 class="mb2">Print Hall(s):</h4> <div class="mys-form-indent"> <div class="mb6"> <label class="fm-Control fm-Radio" id="mys-print-fp-currenthall-label"> <input type="radio" name="halls" value="currenthall" checked="checked">Current Hall <div class="fm-Control_Indicator"></div> </label> <label class="fm-Control fm-Radio" id="mys-print-fp-allhalls-label"> <input type="radio" name="halls" value="allhalls">All Halls <div class="fm-Control_Indicator"></div> </label> </div> </div><!-- /.mys-form-indent --> <div class="mb6"> <label class="fm-Control fm-Checkbox" id="mys-print-fp-show-available-booths"> <input type="checkbox" name="ShowAvailableBooths" value="true" checked="checked" /> Show Available Booths <div class="fm-Control_Indicator"></div> </label> </div> </div> </form> </div> <div id="mys-jq-print-processing-message"style="display: none;"> <h4>Your floor plan printout is processing. If you selected multiple halls it may take a minute for your print to finish.</h4> <br /><br /> <div id="jq-myssearchresultsloading" > <div class="mys-spinner "> <div class="mys-spinner-double-bounce1 "></div> <div class="mys-spinner-double-bounce2 "></div> <p class="mys-spinner-txt">Loading...</p> </div> <span class="mys-small"> Creating Printout..... </span> </div> </div> </div> <hr class="o-PageDivider mt2 mb4"> <a class="btn-primary db w-100-ns w-40 mys-jq-submit-btn" href="#" id="mys-jq-print-button" data-myshow="false">PRINT MY FLOOR PLAN</a> </div> </div> </div> <script> Handlebars.registerHelper('renderboothdisplay', function(options) { return new Handlebars.SafeString( (options.fn(this)+"").replace("randomstring", "") ); }); </script> </body> </html>

Pages: 1 2 3 4 5 6 7 8 9 10