CINXE.COM
Find Exhibitors - 2024 BIO International Convention
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>Find Exhibitors - 2024 BIO International Convention</title> <meta name="description" content="Find exhibitors at 2024 BIO International Convention. Create a free My Show Planner to save and remember your favorites, and get recommendations."> <meta property="og:url" content="https://bio2024.mapyourshow.com/8_0/sitemap.cfm" /> <meta property="og:type" content="website" /> <meta property="og:title" content="Find Exhibitors - 2024 BIO International Convention" /> <meta property="og:description" content="Find exhibitors at 2024 BIO International Convention. Create a free My Show Planner to save and remember your favorites, and get recommendations." /> <meta property="og:image" content="" /> <meta property="og:site_name" content="2024 BIO International Convention" /> <meta name="twitter:card" content="summary"> <meta name="twitter:title" content="Find Exhibitors - 2024 BIO International Convention" /> <meta name="twitter:description" content="Find exhibitors at 2024 BIO International Convention. Create a free My Show Planner to save and remember your favorites, and get recommendations." /> <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(255, 51%, 10%);--color-accent-20: hsl(255, 51%, 20%);--color-accent-30: hsl(255, 51%, 30%);--color-accent-40: hsl(255, 51%, 40%);--color-accent-50: hsl(255, 51%, 50%);--color-brand-10: hsl(178, 100%, 21%);--color-brand-20: hsl(178, 87%, 29%);--color-brand-30: hsl(178, 82%, 33%);--color-brand-40: hsl(178, 76%, 39%);--color-brand-50: hsl(178, 67%, 45%);--color-brand-60: hsl(178, 65%, 55%);--color-brand-70: hsl(178, 74%, 65%);--color-brand-80: hsl(178, 84%, 74%);--color-brand-90: hsl(178, 97%, 85%);--color-brand-100: hsl(178, 75%, 97%);--color-header: hsl(0, 0%, 100%);--color-header-background: hsl(255, 51%, 37%);--color-nav: hsl(0, 0%, 100%);--color-nav-background: hsl(255, 51%, 37%);--color-shortcut: hsl(0, 0%, 100%);--color-shortcut-background: hsl(205, 82%, 33%);--color-nav-2: hsl(0, 0%, 100%);--color-nav-background-2: hsl(178, 92%, 36%);--style-search-background: hsl(0, 0%, 60%);--border-radius: 0.5rem;--event-info-font-weight: bold;--event-info-visibility: 0.875rem;--nav-links-alignment-navbar-v2: center;} </style> <!-- Grab Gardner Styles --> <style> </style> <link href="/8_0/assets/css/introjs/2.9.3/introjs.min.css" rel="stylesheet" /><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/css-vars-ponyfill/2.0.2/css-vars-ponyfill.min.js"></script> <script src="/8_0/assets/js/velocity/1.2.3/velocity.min.js"></script> <script src="/8_0/assets/js/introjs/2.9.3/introjs.min.js"></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\\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\\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\\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\\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\\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\\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\\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\\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\\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\\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 theme_2" > <header class="mys-directory-header l-header" id="js-navigation"> <div class="center mw9"> <a href="https://www.bio.org/events/bio-international-convention"> <img class="db center tc o-show_header" src="/mys_shared/BIO2024/showfiles/imgs/BIO2024_IDS_header.png?breakcache=8360A451-DD1D-6D96-6F2B0297954BF1F4" srcset="/mys_shared/BIO2024/showfiles/imgs/BIO2024_IDS_header@2x.png?breakcache=8360A452-F87A-D2E4-5B8F6EB776567FB0 2x" alt="2024 BIO International Convention 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 = []; 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":"","showtimezone":false},"spotlightsettings":{"spotlightcount":3},"numconcurrentmeetings":5,"schedulepage":{"topsection":"disabled","hours":"2","sessions":{"display":"freetext","secondaryfilter":"disabled","text":"Sessions"},"searchtypes":["Sessions","Guest Appearances"],"guestappearances":{"display":"freetext","secondaryfilter":"disabled","text":"Scheduled Appearance"},"homepage":false,"liveevents":{"display":"freetext","secondaryfilter":"disabled","text":"Interactive Demos"},"happeningtoday":"daily"},"searchsettings":{"hidechildsessions":false,"hideoriginaltimes":false,"defaultsearchview":"grid","hidesessionlocations":false,"hidesessiontimes":false,"myshowincludesessionexhibitors":false,"hideallresults":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/bio2024"; 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() + (-480 + 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 false; }, get globalcompincludepath(){ return "includes/vue/mixin/global-mixin.cfm"; }, get hasvalidation() { return true; }, get validated() { return false; }, get showid() { return "BIO2024"; }, get showidlowercase() { return ("BIO2024").toLowerCase(); }, get thispageurl(){ var temppath = "/8_0/sitemap.cfm" ; if (temppath === this.path2approot + '/index.cfm'){ return this.path2approot } else { return temppath; } }, get path2approot(){ return "/8_0" }, get httphost(){ return "https://bio2024.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 true }, get speakernamedisplay(){ return false }, get modules(){ return ["Boothsales","ExhChecklist","Exhibitors","Floorplan","groups","Surveying"] }, get hasexhicons(){ return false }, get hasnetworking(){ return false }, get legendcontent(){ return {"COLUMNS":["ICONID","ICONFILE","DISPLAYID","TYPE","COLUMNNAME","DATESTART","DAYSPAN","DISPLAYTEXT","USEFORNEWEXHIBITORFILTER","USEFORGREENFILTER"],"DATA":[]} }, 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 -480; }, 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 !== '' && 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 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="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 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">•</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: "session" } }, 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="FD8BA3BE4217342E1EF55F80807FE1C2AC0A9DA6"> <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="https://www.bio.org/events/bio-international-convention" class="dim" v-show="showLogoVisible"> <img class="logo" src="/mys_shared/BIO2024/BIO2024_Custom_logo.png?breakcache=8360A504-B815-42B8-2C50E888FBF6A187" srcset="/mys_shared/BIO2024/BIO2024_Custom_logo@2x.png?breakcache=8360A505-D4A7-9A3D-7E0C76373CF48A10 2x" width="200" height="70" alt="2024 BIO International Convention logo"> </a> <ul class="show-info list" :class="[showInfoVisible ? '' : 'is-hidden']"> <li class="show-date"> June 3-6, 2024 </li> <li class="show-location">San Diego, CA</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-FA40C753-E8C9-5E12-405A7685DE9CC324" > <a class="link js-nav_width" href="https://convention.bio.org" target=""> <span class="link_hover">BIO 2024 Home</span> </a> </li> <li class="" id="link-exhibitorsearch" > <a class="link js-nav_width" href="/8_0/index.cfm" target=""> <span class="link_hover">Directory</span> </a> </li> <li class="" id="link-floorplan" > <a class="link js-nav_width" href="/8_0/floorplan/" target="_blank"> <span class="link_hover">Floor Plan</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> <li class="" id="link-exhibitoralpha" > <a class="link js-nav_width" href="/8_0/explore/exhibitor-alphalist.cfm?nav=1" target=""> <span class="link_hover">Exhibitors A-Z</span> </a> </li> <li class="" id="link-pavilions" > <a class="link js-nav_width" href="/8_0/explore/pavilions.cfm?nav=1" target=""> <span class="link_hover">Pavilions</span> </a> </li> <li class="" id="link-exhibitorexcel" > <a class="link js-nav_width" href="/8_0/exhibitor/exhibitor-list.cfm?export=excel" target="_blank"> <span class="link_hover">Exhibitors List via Excel</span> </a> </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> <main class="l-main pa5 pr6-l pl6-l bg-white w-100"> <div class="center mw9"> <div class="l-content pa4 pr5-m pl5-m pr6-l pl6-l"> <h1>Site map for 2024 BIO International Convention</h1> <nav class="bg-light-gray pa3 mb7" aria-labelledby="tocheading" id="toc"> <header id="tocheading" class="b db f3 mb3"> Page Contents</header> <div> <ul id="toc" class="o-List_Bullets"> <li><a href="#toc-exhibitors" id="toc-exhibitors"> Exhibitors</a></li> <li><a href="#toc-floorplan" id="toc-floorplan"> Floor Plan</a></li> </ul> </div> </nav> <h2 id="toc-exhibitors"> Exhibitors</h2> <ul class="o-List_Bullets"> <li><a href="/8_0/explore/exhibitor-categories.cfm">Product Categories</a></li> <li><a href="/8_0/explore/pavilions.cfm">Pavilions</a></li> <li><a href="/8_0/floorplan/">Floor Plan</a></li> <li><a href="/8_0/explore/exhibitor-gallery.cfm">Exhibitor List</a></li> <li><a href="/8_0/explore/countries.cfm">Countries</a></li> </ul> <hr class="o-PageDivider mt5 mb5"> <h2 id="toc-floorplan"> Floor Plan</h2> <ul class="o-List_Bullets"> <li><a href="/8_0/floorplan/"> Floor Plan</a></li> </ul> <hr class="o-PageDivider mt5 mb5"> </div> </div> </main> <footer class="l-footer bg-light-gray"> <div class="center f7 mid-gray mw9 pa4 pr5-m pl5-m pr6-l pl6-l"> <div id="js-CustomFooter" class="mb3"> </div> <div class="flex-l justify-between-l"> <div class="mb3 mb0-l"> <p class="f7 mb0"> 2024 BIO International Convention<span class="ml1 mr1">•</span>©2024 All Rights Reserved </p> </div> <div class="mb0-last"> <p class="f7 mb0 tr-l"> <a class="bb-0" href="/8_0/sitemap.cfm"> Sitemap</a> <span class="mr2 ml2 o-50" aria-hidden="true">|</span> <a class="bb-0 is-visually-hidden" aria-hidden="true" href="/8_0/sitemap.xml"> XML Sitemap</a> <span class="mr2 ml2 o-50 is-visually-hidden" aria-hidden="true">|</span> <a class="bb-0" href="/8_0/explore/help.cfm"> Help</a> <span class="mr2 ml2 o-50" aria-hidden="true">|</span> <a class="bb-0" href="https://www.bio.org/privacy-policy" target="_blank"> Privacy Policy</a> </p> </div> </div> </div> </footer> <script type="text/javascript"> /* * Check the dynamic content inside of #js-CustomFooter * This content gets entered through the admin and can be a script or text * If the content is text do nothing * If the content is a script remove the mb3 (margin-bottom) class from the div so there's not extra space */ var customFooter = document.querySelector("#js-CustomFooter"); var reg = new RegExp("<[^>]*script"); // Is the content a script? If so if (reg.test(customFooter.innerHTML)) { customFooter.classList.remove("mb3"); } </script> </body> </html> <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> </body> </html>