CINXE.COM

Search Exhibitors by Country - 2024 BIO International Convention

<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>Search Exhibitors by Country - 2024 BIO International Convention</title> <meta name="description" content="Find exhibitors from a particular country or region at 2024 BIO International Convention."> <meta property="og:url" content="https&#x3a;&#x2f;&#x2f;bio2024.mapyourshow.com&#x2f;8_0&#x2f;explore&#x2f;countries.cfm" /> <meta property="og:type" content="website" /> <meta property="og:title" content="Search Exhibitors by Country - 2024 BIO International Convention" /> <meta property="og:description" content="Find exhibitors from a particular country or region at 2024 BIO International Convention." /> <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="Search Exhibitors by Country - 2024 BIO International Convention" /> <meta name="twitter:description" content="Find exhibitors from a particular country or region at 2024 BIO International Convention." /> <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/js/mys-bundled/quicklists-min.css" rel="stylesheet" /><script src="/8_0/assets/js/mys-bundled/quicklists-min.js"></script> <script> /*Vue.mixin({ data: function() { return { get searchcontent() { return {"includes\\vue\\search\\featured-search-results-display.cfm":{"tableHeadSummary":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\featured-search-results-display.cfm","TEXT":"Summary","APP_VERSION":"8_0","SECTION":"tableHeadSummary"}],"viewAllButton":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\featured-search-results-display.cfm","TEXT":"See All Results","APP_VERSION":"8_0","SECTION":"viewAllButton"}],"tableHeadPlanner":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\featured-search-results-display.cfm","TEXT":"Add to Planner","APP_VERSION":"8_0","SECTION":"tableHeadPlanner"}],"tableHeadBooth":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\featured-search-results-display.cfm","TEXT":"Booth","APP_VERSION":"8_0","SECTION":"tableHeadBooth"}],"of":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\featured-search-results-display.cfm","TEXT":"of","APP_VERSION":"8_0","SECTION":"of"}],"tableHeadLegend":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\featured-search-results-display.cfm","TEXT":"Legend","APP_VERSION":"8_0","SECTION":"tableHeadLegend"}],"displayResultHeader":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\featured-search-results-display.cfm","TEXT":"Featured Exhibitors","APP_VERSION":"8_0","SECTION":"displayResultHeader"}],"tableHeadExhibitor":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\featured-search-results-display.cfm","TEXT":"Exhibitor","APP_VERSION":"8_0","SECTION":"tableHeadExhibitor"}],"viewOnFloorplan":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\featured-search-results-display.cfm","TEXT":"See Results on Floor Plan","APP_VERSION":"8_0","SECTION":"viewOnFloorplan"}],"loadMoreResults":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\featured-search-results-display.cfm","TEXT":"Load More Results","APP_VERSION":"8_0","SECTION":"loadMoreResults"}],"viewAllFeaturedButton":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\featured-search-results-display.cfm","TEXT":"See All Results","APP_VERSION":"8_0","SECTION":"viewAllFeaturedButton"}]},"includes\\vue\\generic\\backtotop-button.cfm":{"backToTopText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\backtotop-button.cfm","TEXT":"Back to Top","APP_VERSION":"8_0","SECTION":"backToTopText"}]},"includes\\vue\\search\\search-results-summary-display.cfm":{"relatedsearchesheader":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\search-results-summary-display.cfm","TEXT":"Related Searches","APP_VERSION":"8_0","SECTION":"relatedsearchesheader"}],"recommendedexhibitorsheader":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\search-results-summary-display.cfm","TEXT":"Recommended","APP_VERSION":"8_0","SECTION":"recommendedexhibitorsheader"}],"onDemandLabel":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\search-results-summary-display.cfm","TEXT":"On Demand","APP_VERSION":"8_0","SECTION":"onDemandLabel"}],"loadingoptionstext":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\search-results-summary-display.cfm","TEXT":"Loading...","APP_VERSION":"8_0","SECTION":"loadingoptionstext"}],"sessionsheader":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\search-results-summary-display.cfm","TEXT":"Sessions","APP_VERSION":"8_0","SECTION":"sessionsheader"}],"allexhibitorsheader":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\search-results-summary-display.cfm","TEXT":"All Exhibitors","APP_VERSION":"8_0","SECTION":"allexhibitorsheader"}],"featuredexhibitorsheader":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\search-results-summary-display.cfm","TEXT":"Featured","APP_VERSION":"8_0","SECTION":"featuredexhibitorsheader"}],"exhibitorsheader":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\search-results-summary-display.cfm","TEXT":"Exhibitors","APP_VERSION":"8_0","SECTION":"exhibitorsheader"}]},"includes\\vue\\search\\booth-search-results-display.cfm":{"tableHeadSummary":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\booth-search-results-display.cfm","TEXT":"Summary","APP_VERSION":"8_0","SECTION":"tableHeadSummary"}],"viewAllButton":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\booth-search-results-display.cfm","TEXT":"See All Results","APP_VERSION":"8_0","SECTION":"viewAllButton"}],"tableHeadPlanner":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\booth-search-results-display.cfm","TEXT":"Add to Planner","APP_VERSION":"8_0","SECTION":"tableHeadPlanner"}],"tableHeadBooth":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\booth-search-results-display.cfm","TEXT":"Booth","APP_VERSION":"8_0","SECTION":"tableHeadBooth"}],"of":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\booth-search-results-display.cfm","TEXT":"of","APP_VERSION":"8_0","SECTION":"of"}],"tableHeadLegend":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\booth-search-results-display.cfm","TEXT":"Legend","APP_VERSION":"8_0","SECTION":"tableHeadLegend"}],"displayResultHeader":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\booth-search-results-display.cfm","TEXT":"Exhibitors in Booths","APP_VERSION":"8_0","SECTION":"displayResultHeader"}],"tableHeadExhibitor":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\booth-search-results-display.cfm","TEXT":"Exhibitor","APP_VERSION":"8_0","SECTION":"tableHeadExhibitor"}],"viewOnFloorplan":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\booth-search-results-display.cfm","TEXT":"See Results on Floor Plan","APP_VERSION":"8_0","SECTION":"viewOnFloorplan"}],"loadMoreResults":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\booth-search-results-display.cfm","TEXT":"Load More Results","APP_VERSION":"8_0","SECTION":"loadMoreResults"}],"viewAllFeaturedButton":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\booth-search-results-display.cfm","TEXT":"See All Results","APP_VERSION":"8_0","SECTION":"viewAllFeaturedButton"}]},"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\\search\\collateral-search-results-display.cfm":{"subtitleHeader":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\collateral-search-results-display.cfm","TEXT":"Exhibitor","APP_VERSION":"8_0","SECTION":"subtitleHeader"}],"displayResultHeader":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\collateral-search-results-display.cfm","TEXT":"Collateral","APP_VERSION":"8_0","SECTION":"displayResultHeader"}],"titleHeader":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\collateral-search-results-display.cfm","TEXT":"Title","APP_VERSION":"8_0","SECTION":"titleHeader"}]},"includes\\vue\\search\\requireplanner-search-results-display.cfm":{"of":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\requireplanner-search-results-display.cfm","TEXT":"of","APP_VERSION":"8_0","SECTION":"of"}],"requirePlannerText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\requireplanner-search-results-display.cfm","TEXT":"My Show Planner","APP_VERSION":"8_0","SECTION":"requirePlannerText"}]},"includes\\vue\\generic\\modal-display.cfm":{"closeText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\modal-display.cfm","TEXT":"Close","APP_VERSION":"8_0","SECTION":"closeText"}]},"includes\\vue\\generic\\toggle-favorite.cfm":{"processingText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Please check back, we are still processing your request.","APP_VERSION":"8_0","SECTION":"processingText"}],"savingText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Saving...","APP_VERSION":"8_0","SECTION":"savingText"}],"waitlistModalText2":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Please confirm you would like to be removed from the waitlist.","APP_VERSION":"8_0","SECTION":"waitlistModalText2"}],"waitlistModalText1":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Removing this session will cause you to lose your position in the waitlist queue.","APP_VERSION":"8_0","SECTION":"waitlistModalText1"}],"addToMyShowPlannerText-session":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Add to My Show Planner","APP_VERSION":"8_0","SECTION":"addToMyShowPlannerText-session"}],"noAccessText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Not Available","APP_VERSION":"8_0","SECTION":"noAccessText"}],"processingModalTitle":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Processing request","APP_VERSION":"8_0","SECTION":"processingModalTitle"}],"reserveModalText1":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"By hitting confirm you are losing your reserved seat in this session. If you choose to add it back, there may not be any seats available. We cannot guarantee you will get your seat back.","APP_VERSION":"8_0","SECTION":"reserveModalText1"}],"removeFromPlannerText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Remove From Planner","APP_VERSION":"8_0","SECTION":"removeFromPlannerText"}],"reservedRemoveText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"This session has been removed from your schedule.","APP_VERSION":"8_0","SECTION":"reservedRemoveText"}],"reserveModalText2":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Please confirm you want to remove this session.","APP_VERSION":"8_0","SECTION":"reserveModalText2"}],"processingModalText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Please Wait...","APP_VERSION":"8_0","SECTION":"processingModalText"}],"waitlistRemoveText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Remove from Waitlist","APP_VERSION":"8_0","SECTION":"waitlistRemoveText"}],"confirmModalTitle":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Confirm Request","APP_VERSION":"8_0","SECTION":"confirmModalTitle"}],"noAccessHintText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Your registration does not grant you access to this session.","APP_VERSION":"8_0","SECTION":"noAccessHintText"}],"loginText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Log In Required","APP_VERSION":"8_0","SECTION":"loginText"}],"confirmTitle":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Confirm Change","APP_VERSION":"8_0","SECTION":"confirmTitle"}],"filledText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Session Filled","APP_VERSION":"8_0","SECTION":"filledText"}],"reserveAddText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Add to Schedule","APP_VERSION":"8_0","SECTION":"reserveAddText"}],"confirmText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Confirm","APP_VERSION":"8_0","SECTION":"confirmText"}],"addToMyShowPlannerText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Add To My Show Planner","APP_VERSION":"8_0","SECTION":"addToMyShowPlannerText"}],"reserveRemoveText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Remove from Schedule","APP_VERSION":"8_0","SECTION":"reserveRemoveText"}],"cancelText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Cancel","APP_VERSION":"8_0","SECTION":"cancelText"}],"savedToMyShowPlannerText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Saved to My Show Planner","APP_VERSION":"8_0","SECTION":"savedToMyShowPlannerText"}],"waitlistAddText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Join Waitlist","APP_VERSION":"8_0","SECTION":"waitlistAddText"}],"filledHintText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"This session does not have any seats available, and the waitlist is currently full.","APP_VERSION":"8_0","SECTION":"filledHintText"}],"loginHintText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Please log in to your planner","APP_VERSION":"8_0","SECTION":"loginHintText"}],"appointmentRemoveFromPlannerText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Cancel Appointment","APP_VERSION":"8_0","SECTION":"appointmentRemoveFromPlannerText"}],"cancelTitle":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Cancel Change","APP_VERSION":"8_0","SECTION":"cancelTitle"}],"conflictModalText2":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"This session time overlaps with another session on your schedule. In order to add this session, the following session(s) will be removed from your schedule:","APP_VERSION":"8_0","SECTION":"conflictModalText2"}],"conflictModalText3":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Please confirm you would like to proceed with this update.","APP_VERSION":"8_0","SECTION":"conflictModalText3"}],"updatingText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Updating","APP_VERSION":"8_0","SECTION":"updatingText"}],"waitlistRemovedText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"You have been removed from the waitlist.","APP_VERSION":"8_0","SECTION":"waitlistRemovedText"}],"conflictModalText1":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"ALERT: Schedule Conflict","APP_VERSION":"8_0","SECTION":"conflictModalText1"}],"reservedText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Your seat has successfully been reserved.","APP_VERSION":"8_0","SECTION":"reservedText"}],"waitlistText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"You have been added to the waitlist for this session and will automatically be moved to reserved should a seat become available.","APP_VERSION":"8_0","SECTION":"waitlistText"}]},"includes\\vue\\generic\\loading-display.cfm":{"loadingText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\loading-display.cfm","TEXT":"Loading...","APP_VERSION":"8_0","SECTION":"loadingText"}]},"includes\\vue\\generic\\recommendations-modal.cfm":{"closeButtonText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\recommendations-modal.cfm","TEXT":"Close","APP_VERSION":"8_0","SECTION":"closeButtonText"}],"recommenendedResultsText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\recommendations-modal.cfm","TEXT":"Recommended Results","APP_VERSION":"8_0","SECTION":"recommenendedResultsText"}],"dontHaveRecsText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\recommendations-modal.cfm","TEXT":"You don't have any recommendations yet. As you browse through the directory recommendations will be made based on your interests.","APP_VERSION":"8_0","SECTION":"dontHaveRecsText"}],"sessionButtonText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\recommendations-modal.cfm","TEXT":"Sessions","APP_VERSION":"8_0","SECTION":"sessionButtonText"}],"exhibitorButtonText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\recommendations-modal.cfm","TEXT":"Exhibitors","APP_VERSION":"8_0","SECTION":"exhibitorButtonText"}],"loadingText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\recommendations-modal.cfm","TEXT":"Loading...","APP_VERSION":"8_0","SECTION":"loadingText"}],"topSixRecText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\recommendations-modal.cfm","TEXT":"Below are up to the first 6 recommendations for you. To see your entire list and easily add to your planner or dismiss","APP_VERSION":"8_0","SECTION":"topSixRecText"}],"errorLoadingRecommendations":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\recommendations-modal.cfm","TEXT":"Error loading recommendations","APP_VERSION":"8_0","SECTION":"errorLoadingRecommendations"}],"dismssText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\recommendations-modal.cfm","TEXT":"Dismiss","APP_VERSION":"8_0","SECTION":"dismssText"}],"loginOrCreatePlannerText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\recommendations-modal.cfm","TEXT":"Log in or Create a Planner","APP_VERSION":"8_0","SECTION":"loginOrCreatePlannerText"}]},"includes\\vue\\search\\showfeature-search-results-display.cfm":{"viewAllButton":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\showfeature-search-results-display.cfm","TEXT":"See All Results","APP_VERSION":"8_0","SECTION":"viewAllButton"}],"tableHeadMatchingExhibitors":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\showfeature-search-results-display.cfm","TEXT":"Matching","APP_VERSION":"8_0","SECTION":"tableHeadMatchingExhibitors"}],"tableHeadPavilion":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\showfeature-search-results-display.cfm","TEXT":"Pavilion","APP_VERSION":"8_0","SECTION":"tableHeadPavilion"}],"tableHeadPlanner":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\showfeature-search-results-display.cfm","TEXT":"Add to Planner","APP_VERSION":"8_0","SECTION":"tableHeadPlanner"}],"of":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\showfeature-search-results-display.cfm","TEXT":"of","APP_VERSION":"8_0","SECTION":"of"}],"displayResultHeader":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\showfeature-search-results-display.cfm","TEXT":"Show Features","APP_VERSION":"8_0","SECTION":"displayResultHeader"}],"loadMoreResults":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\showfeature-search-results-display.cfm","TEXT":"Load More Results","APP_VERSION":"8_0","SECTION":"loadMoreResults"}]},"includes\\vue\\search\\exhibitor-search-results-display.cfm":{"tableHeadSummary":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\exhibitor-search-results-display.cfm","TEXT":"Summary","APP_VERSION":"8_0","SECTION":"tableHeadSummary"}],"viewAllButton":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\exhibitor-search-results-display.cfm","TEXT":"See All Results","APP_VERSION":"8_0","SECTION":"viewAllButton"}],"tableHeadPlanner":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\exhibitor-search-results-display.cfm","TEXT":"Add to Planner","APP_VERSION":"8_0","SECTION":"tableHeadPlanner"}],"tableHeadBooth":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\exhibitor-search-results-display.cfm","TEXT":"Booth","APP_VERSION":"8_0","SECTION":"tableHeadBooth"}],"of":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\exhibitor-search-results-display.cfm","TEXT":"of","APP_VERSION":"8_0","SECTION":"of"}],"tableHeadLegend":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\exhibitor-search-results-display.cfm","TEXT":"Legend","APP_VERSION":"8_0","SECTION":"tableHeadLegend"}],"displayResultHeader":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\exhibitor-search-results-display.cfm","TEXT":"All Exhibitors","APP_VERSION":"8_0","SECTION":"displayResultHeader"}],"tableHeadExhibitor":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\exhibitor-search-results-display.cfm","TEXT":"Exhibitor","APP_VERSION":"8_0","SECTION":"tableHeadExhibitor"}],"viewOnFloorplan":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\exhibitor-search-results-display.cfm","TEXT":"See Results on Floor Plan","APP_VERSION":"8_0","SECTION":"viewOnFloorplan"}],"loadMoreResults":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\exhibitor-search-results-display.cfm","TEXT":"Load More Results","APP_VERSION":"8_0","SECTION":"loadMoreResults"}],"viewAllFeaturedButton":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\exhibitor-search-results-display.cfm","TEXT":"See All Results","APP_VERSION":"8_0","SECTION":"viewAllFeaturedButton"}]},"includes\\vue\\generic\\exhibitor-result-tr.cfm":{"seeText":[{"CONTAINSVAR":0,"LANGUAGECODE":"EN","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\exhibitor-result-tr.cfm","TEXT":"Also Known As","APP_VERSION":"8_0","SECTION":"seeText"}]},"includes\\vue\\generic\\noresults-display.cfm":{"noResultsFoundForText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\noresults-display.cfm","TEXT":"No results found for","APP_VERSION":"8_0","SECTION":"noResultsFoundForText"}],"noResults":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\noresults-display.cfm","TEXT":"Sorry, No Results Found","APP_VERSION":"8_0","SECTION":"noResults"}],"didNotReturnAnyResultsText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\noresults-display.cfm","TEXT":"did not return any results","APP_VERSION":"8_0","SECTION":"didNotReturnAnyResultsText"}],"searchSpelledText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\noresults-display.cfm","TEXT":"Make sure that your search is spelled correctly","APP_VERSION":"8_0","SECTION":"searchSpelledText"}],"suggestionsText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\noresults-display.cfm","TEXT":"Suggestions","APP_VERSION":"8_0","SECTION":"suggestionsText"}],"yourSearchForText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\noresults-display.cfm","TEXT":"Your search for","APP_VERSION":"8_0","SECTION":"yourSearchForText"}],"tryDifferentSearchText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\noresults-display.cfm","TEXT":"Try a different search","APP_VERSION":"8_0","SECTION":"tryDifferentSearchText"}],"tryGeneralSearchText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\noresults-display.cfm","TEXT":"Try a more general search","APP_VERSION":"8_0","SECTION":"tryGeneralSearchText"}]},"includes\\vue\\search\\countries-search-results-display.cfm":{"exhibitorsSubTextSingular":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\countries-search-results-display.cfm","TEXT":"Exhibitor","APP_VERSION":"8_0","SECTION":"exhibitorsSubTextSingular"}],"tableHeadCountry":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\countries-search-results-display.cfm","TEXT":"Country","APP_VERSION":"8_0","SECTION":"tableHeadCountry"}],"tableHeadMatchingExhibitors":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\countries-search-results-display.cfm","TEXT":"Matching","APP_VERSION":"8_0","SECTION":"tableHeadMatchingExhibitors"}],"exhibitorsSubTextPlural":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\countries-search-results-display.cfm","TEXT":"Exhibitors","APP_VERSION":"8_0","SECTION":"exhibitorsSubTextPlural"}]},"includes\\vue\\search\\category-search-results-display.cfm":{"viewAllButton":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\category-search-results-display.cfm","TEXT":"See All Results","APP_VERSION":"8_0","SECTION":"viewAllButton"}],"tableHeadMatchingExhibitors":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\category-search-results-display.cfm","TEXT":"Matching","APP_VERSION":"8_0","SECTION":"tableHeadMatchingExhibitors"}],"countSuffixSingular":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\category-search-results-display.cfm","TEXT":"Exhibitor","APP_VERSION":"8_0","SECTION":"countSuffixSingular"}],"of":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\category-search-results-display.cfm","TEXT":"of","APP_VERSION":"8_0","SECTION":"of"}],"countSuffixPlural":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\category-search-results-display.cfm","TEXT":"Exhibitors","APP_VERSION":"8_0","SECTION":"countSuffixPlural"}],"displayResultHeader":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\category-search-results-display.cfm","TEXT":"Product Categories","APP_VERSION":"8_0","SECTION":"displayResultHeader"}],"tableHeadCategory":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\category-search-results-display.cfm","TEXT":"Category","APP_VERSION":"8_0","SECTION":"tableHeadCategory"}],"loadMoreResults":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\category-search-results-display.cfm","TEXT":"Load More Results","APP_VERSION":"8_0","SECTION":"loadMoreResults"}]},"includes\\vue\\search\\generic-search-results-display.cfm":{"tableHeadSummary":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\generic-search-results-display.cfm","TEXT":"Summary","APP_VERSION":"8_0","SECTION":"tableHeadSummary"}],"viewAllButton":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\generic-search-results-display.cfm","TEXT":"See All Results","APP_VERSION":"8_0","SECTION":"viewAllButton"}],"tableHeadPlanner":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\generic-search-results-display.cfm","TEXT":"Add to Planner","APP_VERSION":"8_0","SECTION":"tableHeadPlanner"}],"tableHeadBooth":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\generic-search-results-display.cfm","TEXT":"Booth","APP_VERSION":"8_0","SECTION":"tableHeadBooth"}],"of":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\generic-search-results-display.cfm","TEXT":"of","APP_VERSION":"8_0","SECTION":"of"}],"tableHeadExhibitor":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\generic-search-results-display.cfm","TEXT":"Exhibitor","APP_VERSION":"8_0","SECTION":"tableHeadExhibitor"}],"viewOnFloorplan":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\generic-search-results-display.cfm","TEXT":"See Results on Floor Plan","APP_VERSION":"8_0","SECTION":"viewOnFloorplan"}],"loadMoreResults":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\generic-search-results-display.cfm","TEXT":"Load More Results","APP_VERSION":"8_0","SECTION":"loadMoreResults"}],"addToPlanner":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\generic-search-results-display.cfm","TEXT":"Add to Planner","APP_VERSION":"8_0","SECTION":"addToPlanner"}],"viewAllFeaturedButton":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\generic-search-results-display.cfm","TEXT":"See All Results","APP_VERSION":"8_0","SECTION":"viewAllFeaturedButton"}]},"includes\\vue\\search\\search-results-display.cfm":{"onDemandSessionLabelSingular":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\search-results-display.cfm","TEXT":"On Demand Session","APP_VERSION":"8_0","SECTION":"onDemandSessionLabelSingular"}],"listText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\search-results-display.cfm","TEXT":"List","APP_VERSION":"8_0","SECTION":"listText"}],"resultPlural":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\search-results-display.cfm","TEXT":"Results","APP_VERSION":"8_0","SECTION":"resultPlural"}],"gridText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\search-results-display.cfm","TEXT":"Grid","APP_VERSION":"8_0","SECTION":"gridText"}],"forText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\search-results-display.cfm","TEXT":"for","APP_VERSION":"8_0","SECTION":"forText"}],"onDemandSessionLabelPlural":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\search-results-display.cfm","TEXT":"On Demand Sessions","APP_VERSION":"8_0","SECTION":"onDemandSessionLabelPlural"}],"relatedSearchesText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\search-results-display.cfm","TEXT":"Related Searches","APP_VERSION":"8_0","SECTION":"relatedSearchesText"}],"resultSingular":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\search-results-display.cfm","TEXT":"Result","APP_VERSION":"8_0","SECTION":"resultSingular"}]},"includes\\vue\\search\\pavilion-search-results-display.cfm":{"viewAllButton":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\pavilion-search-results-display.cfm","TEXT":"See All Results","APP_VERSION":"8_0","SECTION":"viewAllButton"}],"tableHeadMatchingExhibitors":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\pavilion-search-results-display.cfm","TEXT":"Matching","APP_VERSION":"8_0","SECTION":"tableHeadMatchingExhibitors"}],"loadingoptionstext":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\pavilion-search-results-display.cfm","TEXT":"Loading...","APP_VERSION":"8_0","SECTION":"loadingoptionstext"}],"tableHeadPavilion":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\pavilion-search-results-display.cfm","TEXT":"Pavilion","APP_VERSION":"8_0","SECTION":"tableHeadPavilion"}],"of":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\pavilion-search-results-display.cfm","TEXT":"of","APP_VERSION":"8_0","SECTION":"of"}],"displayResultHeader":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\pavilion-search-results-display.cfm","TEXT":"Pavilion","APP_VERSION":"8_0","SECTION":"displayResultHeader"}],"loadMoreResults":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\pavilion-search-results-display.cfm","TEXT":"Load More Results","APP_VERSION":"8_0","SECTION":"loadMoreResults"}]},"includes\\vue\\generic\\exhibitor-result-list.cfm":{"seeText":[{"CONTAINSVAR":0,"LANGUAGECODE":"EN","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\exhibitor-result-list.cfm","TEXT":"Also Known As","APP_VERSION":"8_0","SECTION":"seeText"}]},"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\\search\\featured-search-results-display.cfm":{"tableHeadSummary":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\featured-search-results-display.cfm","TEXT":"Summary","APP_VERSION":"8_0","SECTION":"tableHeadSummary"}],"viewAllButton":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\featured-search-results-display.cfm","TEXT":"See All Results","APP_VERSION":"8_0","SECTION":"viewAllButton"}],"tableHeadPlanner":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\featured-search-results-display.cfm","TEXT":"Add to Planner","APP_VERSION":"8_0","SECTION":"tableHeadPlanner"}],"tableHeadBooth":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\featured-search-results-display.cfm","TEXT":"Booth","APP_VERSION":"8_0","SECTION":"tableHeadBooth"}],"of":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\featured-search-results-display.cfm","TEXT":"of","APP_VERSION":"8_0","SECTION":"of"}],"tableHeadLegend":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\featured-search-results-display.cfm","TEXT":"Legend","APP_VERSION":"8_0","SECTION":"tableHeadLegend"}],"displayResultHeader":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\featured-search-results-display.cfm","TEXT":"Featured Exhibitors","APP_VERSION":"8_0","SECTION":"displayResultHeader"}],"tableHeadExhibitor":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\featured-search-results-display.cfm","TEXT":"Exhibitor","APP_VERSION":"8_0","SECTION":"tableHeadExhibitor"}],"viewOnFloorplan":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\featured-search-results-display.cfm","TEXT":"See Results on Floor Plan","APP_VERSION":"8_0","SECTION":"viewOnFloorplan"}],"loadMoreResults":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\featured-search-results-display.cfm","TEXT":"Load More Results","APP_VERSION":"8_0","SECTION":"loadMoreResults"}],"viewAllFeaturedButton":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\featured-search-results-display.cfm","TEXT":"See All Results","APP_VERSION":"8_0","SECTION":"viewAllFeaturedButton"}]},"includes\\vue\\generic\\backtotop-button.cfm":{"backToTopText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\backtotop-button.cfm","TEXT":"Back to Top","APP_VERSION":"8_0","SECTION":"backToTopText"}]},"includes\\vue\\search\\search-results-summary-display.cfm":{"relatedsearchesheader":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\search-results-summary-display.cfm","TEXT":"Related Searches","APP_VERSION":"8_0","SECTION":"relatedsearchesheader"}],"recommendedexhibitorsheader":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\search-results-summary-display.cfm","TEXT":"Recommended","APP_VERSION":"8_0","SECTION":"recommendedexhibitorsheader"}],"onDemandLabel":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\search-results-summary-display.cfm","TEXT":"On Demand","APP_VERSION":"8_0","SECTION":"onDemandLabel"}],"loadingoptionstext":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\search-results-summary-display.cfm","TEXT":"Loading...","APP_VERSION":"8_0","SECTION":"loadingoptionstext"}],"sessionsheader":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\search-results-summary-display.cfm","TEXT":"Sessions","APP_VERSION":"8_0","SECTION":"sessionsheader"}],"allexhibitorsheader":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\search-results-summary-display.cfm","TEXT":"All Exhibitors","APP_VERSION":"8_0","SECTION":"allexhibitorsheader"}],"featuredexhibitorsheader":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\search-results-summary-display.cfm","TEXT":"Featured","APP_VERSION":"8_0","SECTION":"featuredexhibitorsheader"}],"exhibitorsheader":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\search-results-summary-display.cfm","TEXT":"Exhibitors","APP_VERSION":"8_0","SECTION":"exhibitorsheader"}]},"includes\\vue\\search\\booth-search-results-display.cfm":{"tableHeadSummary":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\booth-search-results-display.cfm","TEXT":"Summary","APP_VERSION":"8_0","SECTION":"tableHeadSummary"}],"viewAllButton":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\booth-search-results-display.cfm","TEXT":"See All Results","APP_VERSION":"8_0","SECTION":"viewAllButton"}],"tableHeadPlanner":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\booth-search-results-display.cfm","TEXT":"Add to Planner","APP_VERSION":"8_0","SECTION":"tableHeadPlanner"}],"tableHeadBooth":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\booth-search-results-display.cfm","TEXT":"Booth","APP_VERSION":"8_0","SECTION":"tableHeadBooth"}],"of":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\booth-search-results-display.cfm","TEXT":"of","APP_VERSION":"8_0","SECTION":"of"}],"tableHeadLegend":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\booth-search-results-display.cfm","TEXT":"Legend","APP_VERSION":"8_0","SECTION":"tableHeadLegend"}],"displayResultHeader":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\booth-search-results-display.cfm","TEXT":"Exhibitors in Booths","APP_VERSION":"8_0","SECTION":"displayResultHeader"}],"tableHeadExhibitor":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\booth-search-results-display.cfm","TEXT":"Exhibitor","APP_VERSION":"8_0","SECTION":"tableHeadExhibitor"}],"viewOnFloorplan":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\booth-search-results-display.cfm","TEXT":"See Results on Floor Plan","APP_VERSION":"8_0","SECTION":"viewOnFloorplan"}],"loadMoreResults":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\booth-search-results-display.cfm","TEXT":"Load More Results","APP_VERSION":"8_0","SECTION":"loadMoreResults"}],"viewAllFeaturedButton":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\booth-search-results-display.cfm","TEXT":"See All Results","APP_VERSION":"8_0","SECTION":"viewAllFeaturedButton"}]},"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\\search\\collateral-search-results-display.cfm":{"subtitleHeader":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\collateral-search-results-display.cfm","TEXT":"Exhibitor","APP_VERSION":"8_0","SECTION":"subtitleHeader"}],"displayResultHeader":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\collateral-search-results-display.cfm","TEXT":"Collateral","APP_VERSION":"8_0","SECTION":"displayResultHeader"}],"titleHeader":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\collateral-search-results-display.cfm","TEXT":"Title","APP_VERSION":"8_0","SECTION":"titleHeader"}]},"includes\\vue\\search\\requireplanner-search-results-display.cfm":{"of":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\requireplanner-search-results-display.cfm","TEXT":"of","APP_VERSION":"8_0","SECTION":"of"}],"requirePlannerText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\requireplanner-search-results-display.cfm","TEXT":"My Show Planner","APP_VERSION":"8_0","SECTION":"requirePlannerText"}]},"includes\\vue\\generic\\modal-display.cfm":{"closeText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\modal-display.cfm","TEXT":"Close","APP_VERSION":"8_0","SECTION":"closeText"}]},"includes\\vue\\generic\\toggle-favorite.cfm":{"processingText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Please check back, we are still processing your request.","APP_VERSION":"8_0","SECTION":"processingText"}],"savingText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Saving...","APP_VERSION":"8_0","SECTION":"savingText"}],"waitlistModalText2":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Please confirm you would like to be removed from the waitlist.","APP_VERSION":"8_0","SECTION":"waitlistModalText2"}],"waitlistModalText1":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Removing this session will cause you to lose your position in the waitlist queue.","APP_VERSION":"8_0","SECTION":"waitlistModalText1"}],"addToMyShowPlannerText-session":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Add to My Show Planner","APP_VERSION":"8_0","SECTION":"addToMyShowPlannerText-session"}],"noAccessText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Not Available","APP_VERSION":"8_0","SECTION":"noAccessText"}],"processingModalTitle":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Processing request","APP_VERSION":"8_0","SECTION":"processingModalTitle"}],"reserveModalText1":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"By hitting confirm you are losing your reserved seat in this session. If you choose to add it back, there may not be any seats available. We cannot guarantee you will get your seat back.","APP_VERSION":"8_0","SECTION":"reserveModalText1"}],"removeFromPlannerText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Remove From Planner","APP_VERSION":"8_0","SECTION":"removeFromPlannerText"}],"reservedRemoveText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"This session has been removed from your schedule.","APP_VERSION":"8_0","SECTION":"reservedRemoveText"}],"reserveModalText2":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Please confirm you want to remove this session.","APP_VERSION":"8_0","SECTION":"reserveModalText2"}],"processingModalText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Please Wait...","APP_VERSION":"8_0","SECTION":"processingModalText"}],"waitlistRemoveText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Remove from Waitlist","APP_VERSION":"8_0","SECTION":"waitlistRemoveText"}],"confirmModalTitle":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Confirm Request","APP_VERSION":"8_0","SECTION":"confirmModalTitle"}],"noAccessHintText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Your registration does not grant you access to this session.","APP_VERSION":"8_0","SECTION":"noAccessHintText"}],"loginText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Log In Required","APP_VERSION":"8_0","SECTION":"loginText"}],"confirmTitle":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Confirm Change","APP_VERSION":"8_0","SECTION":"confirmTitle"}],"filledText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Session Filled","APP_VERSION":"8_0","SECTION":"filledText"}],"reserveAddText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Add to Schedule","APP_VERSION":"8_0","SECTION":"reserveAddText"}],"confirmText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Confirm","APP_VERSION":"8_0","SECTION":"confirmText"}],"addToMyShowPlannerText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Add To My Show Planner","APP_VERSION":"8_0","SECTION":"addToMyShowPlannerText"}],"reserveRemoveText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Remove from Schedule","APP_VERSION":"8_0","SECTION":"reserveRemoveText"}],"cancelText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Cancel","APP_VERSION":"8_0","SECTION":"cancelText"}],"savedToMyShowPlannerText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Saved to My Show Planner","APP_VERSION":"8_0","SECTION":"savedToMyShowPlannerText"}],"waitlistAddText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Join Waitlist","APP_VERSION":"8_0","SECTION":"waitlistAddText"}],"filledHintText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"This session does not have any seats available, and the waitlist is currently full.","APP_VERSION":"8_0","SECTION":"filledHintText"}],"loginHintText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Please log in to your planner","APP_VERSION":"8_0","SECTION":"loginHintText"}],"appointmentRemoveFromPlannerText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Cancel Appointment","APP_VERSION":"8_0","SECTION":"appointmentRemoveFromPlannerText"}],"cancelTitle":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Cancel Change","APP_VERSION":"8_0","SECTION":"cancelTitle"}],"conflictModalText2":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"This session time overlaps with another session on your schedule. In order to add this session, the following session(s) will be removed from your schedule:","APP_VERSION":"8_0","SECTION":"conflictModalText2"}],"conflictModalText3":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Please confirm you would like to proceed with this update.","APP_VERSION":"8_0","SECTION":"conflictModalText3"}],"updatingText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Updating","APP_VERSION":"8_0","SECTION":"updatingText"}],"waitlistRemovedText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"You have been removed from the waitlist.","APP_VERSION":"8_0","SECTION":"waitlistRemovedText"}],"conflictModalText1":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"ALERT: Schedule Conflict","APP_VERSION":"8_0","SECTION":"conflictModalText1"}],"reservedText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"Your seat has successfully been reserved.","APP_VERSION":"8_0","SECTION":"reservedText"}],"waitlistText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\toggle-favorite.cfm","TEXT":"You have been added to the waitlist for this session and will automatically be moved to reserved should a seat become available.","APP_VERSION":"8_0","SECTION":"waitlistText"}]},"includes\\vue\\generic\\loading-display.cfm":{"loadingText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\loading-display.cfm","TEXT":"Loading...","APP_VERSION":"8_0","SECTION":"loadingText"}]},"includes\\vue\\generic\\recommendations-modal.cfm":{"closeButtonText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\recommendations-modal.cfm","TEXT":"Close","APP_VERSION":"8_0","SECTION":"closeButtonText"}],"recommenendedResultsText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\recommendations-modal.cfm","TEXT":"Recommended Results","APP_VERSION":"8_0","SECTION":"recommenendedResultsText"}],"dontHaveRecsText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\recommendations-modal.cfm","TEXT":"You don't have any recommendations yet. As you browse through the directory recommendations will be made based on your interests.","APP_VERSION":"8_0","SECTION":"dontHaveRecsText"}],"sessionButtonText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\recommendations-modal.cfm","TEXT":"Sessions","APP_VERSION":"8_0","SECTION":"sessionButtonText"}],"exhibitorButtonText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\recommendations-modal.cfm","TEXT":"Exhibitors","APP_VERSION":"8_0","SECTION":"exhibitorButtonText"}],"loadingText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\recommendations-modal.cfm","TEXT":"Loading...","APP_VERSION":"8_0","SECTION":"loadingText"}],"topSixRecText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\recommendations-modal.cfm","TEXT":"Below are up to the first 6 recommendations for you. To see your entire list and easily add to your planner or dismiss","APP_VERSION":"8_0","SECTION":"topSixRecText"}],"errorLoadingRecommendations":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\recommendations-modal.cfm","TEXT":"Error loading recommendations","APP_VERSION":"8_0","SECTION":"errorLoadingRecommendations"}],"dismssText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\recommendations-modal.cfm","TEXT":"Dismiss","APP_VERSION":"8_0","SECTION":"dismssText"}],"loginOrCreatePlannerText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\recommendations-modal.cfm","TEXT":"Log in or Create a Planner","APP_VERSION":"8_0","SECTION":"loginOrCreatePlannerText"}]},"includes\\vue\\search\\showfeature-search-results-display.cfm":{"viewAllButton":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\showfeature-search-results-display.cfm","TEXT":"See All Results","APP_VERSION":"8_0","SECTION":"viewAllButton"}],"tableHeadMatchingExhibitors":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\showfeature-search-results-display.cfm","TEXT":"Matching","APP_VERSION":"8_0","SECTION":"tableHeadMatchingExhibitors"}],"tableHeadPavilion":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\showfeature-search-results-display.cfm","TEXT":"Pavilion","APP_VERSION":"8_0","SECTION":"tableHeadPavilion"}],"tableHeadPlanner":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\showfeature-search-results-display.cfm","TEXT":"Add to Planner","APP_VERSION":"8_0","SECTION":"tableHeadPlanner"}],"of":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\showfeature-search-results-display.cfm","TEXT":"of","APP_VERSION":"8_0","SECTION":"of"}],"displayResultHeader":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\showfeature-search-results-display.cfm","TEXT":"Show Features","APP_VERSION":"8_0","SECTION":"displayResultHeader"}],"loadMoreResults":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\showfeature-search-results-display.cfm","TEXT":"Load More Results","APP_VERSION":"8_0","SECTION":"loadMoreResults"}]},"includes\\vue\\search\\exhibitor-search-results-display.cfm":{"tableHeadSummary":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\exhibitor-search-results-display.cfm","TEXT":"Summary","APP_VERSION":"8_0","SECTION":"tableHeadSummary"}],"viewAllButton":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\exhibitor-search-results-display.cfm","TEXT":"See All Results","APP_VERSION":"8_0","SECTION":"viewAllButton"}],"tableHeadPlanner":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\exhibitor-search-results-display.cfm","TEXT":"Add to Planner","APP_VERSION":"8_0","SECTION":"tableHeadPlanner"}],"tableHeadBooth":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\exhibitor-search-results-display.cfm","TEXT":"Booth","APP_VERSION":"8_0","SECTION":"tableHeadBooth"}],"of":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\exhibitor-search-results-display.cfm","TEXT":"of","APP_VERSION":"8_0","SECTION":"of"}],"tableHeadLegend":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\exhibitor-search-results-display.cfm","TEXT":"Legend","APP_VERSION":"8_0","SECTION":"tableHeadLegend"}],"displayResultHeader":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\exhibitor-search-results-display.cfm","TEXT":"All Exhibitors","APP_VERSION":"8_0","SECTION":"displayResultHeader"}],"tableHeadExhibitor":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\exhibitor-search-results-display.cfm","TEXT":"Exhibitor","APP_VERSION":"8_0","SECTION":"tableHeadExhibitor"}],"viewOnFloorplan":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\exhibitor-search-results-display.cfm","TEXT":"See Results on Floor Plan","APP_VERSION":"8_0","SECTION":"viewOnFloorplan"}],"loadMoreResults":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\exhibitor-search-results-display.cfm","TEXT":"Load More Results","APP_VERSION":"8_0","SECTION":"loadMoreResults"}],"viewAllFeaturedButton":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\exhibitor-search-results-display.cfm","TEXT":"See All Results","APP_VERSION":"8_0","SECTION":"viewAllFeaturedButton"}]},"includes\\vue\\generic\\exhibitor-result-tr.cfm":{"seeText":[{"CONTAINSVAR":0,"LANGUAGECODE":"EN","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\exhibitor-result-tr.cfm","TEXT":"Also Known As","APP_VERSION":"8_0","SECTION":"seeText"}]},"includes\\vue\\generic\\noresults-display.cfm":{"noResultsFoundForText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\noresults-display.cfm","TEXT":"No results found for","APP_VERSION":"8_0","SECTION":"noResultsFoundForText"}],"noResults":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\noresults-display.cfm","TEXT":"Sorry, No Results Found","APP_VERSION":"8_0","SECTION":"noResults"}],"didNotReturnAnyResultsText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\noresults-display.cfm","TEXT":"did not return any results","APP_VERSION":"8_0","SECTION":"didNotReturnAnyResultsText"}],"searchSpelledText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\noresults-display.cfm","TEXT":"Make sure that your search is spelled correctly","APP_VERSION":"8_0","SECTION":"searchSpelledText"}],"suggestionsText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\noresults-display.cfm","TEXT":"Suggestions","APP_VERSION":"8_0","SECTION":"suggestionsText"}],"yourSearchForText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\noresults-display.cfm","TEXT":"Your search for","APP_VERSION":"8_0","SECTION":"yourSearchForText"}],"tryDifferentSearchText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\noresults-display.cfm","TEXT":"Try a different search","APP_VERSION":"8_0","SECTION":"tryDifferentSearchText"}],"tryGeneralSearchText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\noresults-display.cfm","TEXT":"Try a more general search","APP_VERSION":"8_0","SECTION":"tryGeneralSearchText"}]},"includes\\vue\\search\\countries-search-results-display.cfm":{"exhibitorsSubTextSingular":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\countries-search-results-display.cfm","TEXT":"Exhibitor","APP_VERSION":"8_0","SECTION":"exhibitorsSubTextSingular"}],"tableHeadCountry":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\countries-search-results-display.cfm","TEXT":"Country","APP_VERSION":"8_0","SECTION":"tableHeadCountry"}],"tableHeadMatchingExhibitors":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\countries-search-results-display.cfm","TEXT":"Matching","APP_VERSION":"8_0","SECTION":"tableHeadMatchingExhibitors"}],"exhibitorsSubTextPlural":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\countries-search-results-display.cfm","TEXT":"Exhibitors","APP_VERSION":"8_0","SECTION":"exhibitorsSubTextPlural"}]},"includes\\vue\\search\\category-search-results-display.cfm":{"viewAllButton":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\category-search-results-display.cfm","TEXT":"See All Results","APP_VERSION":"8_0","SECTION":"viewAllButton"}],"tableHeadMatchingExhibitors":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\category-search-results-display.cfm","TEXT":"Matching","APP_VERSION":"8_0","SECTION":"tableHeadMatchingExhibitors"}],"countSuffixSingular":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\category-search-results-display.cfm","TEXT":"Exhibitor","APP_VERSION":"8_0","SECTION":"countSuffixSingular"}],"of":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\category-search-results-display.cfm","TEXT":"of","APP_VERSION":"8_0","SECTION":"of"}],"countSuffixPlural":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\category-search-results-display.cfm","TEXT":"Exhibitors","APP_VERSION":"8_0","SECTION":"countSuffixPlural"}],"displayResultHeader":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\category-search-results-display.cfm","TEXT":"Product Categories","APP_VERSION":"8_0","SECTION":"displayResultHeader"}],"tableHeadCategory":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\category-search-results-display.cfm","TEXT":"Category","APP_VERSION":"8_0","SECTION":"tableHeadCategory"}],"loadMoreResults":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\category-search-results-display.cfm","TEXT":"Load More Results","APP_VERSION":"8_0","SECTION":"loadMoreResults"}]},"includes\\vue\\search\\generic-search-results-display.cfm":{"tableHeadSummary":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\generic-search-results-display.cfm","TEXT":"Summary","APP_VERSION":"8_0","SECTION":"tableHeadSummary"}],"viewAllButton":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\generic-search-results-display.cfm","TEXT":"See All Results","APP_VERSION":"8_0","SECTION":"viewAllButton"}],"tableHeadPlanner":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\generic-search-results-display.cfm","TEXT":"Add to Planner","APP_VERSION":"8_0","SECTION":"tableHeadPlanner"}],"tableHeadBooth":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\generic-search-results-display.cfm","TEXT":"Booth","APP_VERSION":"8_0","SECTION":"tableHeadBooth"}],"of":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\generic-search-results-display.cfm","TEXT":"of","APP_VERSION":"8_0","SECTION":"of"}],"tableHeadExhibitor":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\generic-search-results-display.cfm","TEXT":"Exhibitor","APP_VERSION":"8_0","SECTION":"tableHeadExhibitor"}],"viewOnFloorplan":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\generic-search-results-display.cfm","TEXT":"See Results on Floor Plan","APP_VERSION":"8_0","SECTION":"viewOnFloorplan"}],"loadMoreResults":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\generic-search-results-display.cfm","TEXT":"Load More Results","APP_VERSION":"8_0","SECTION":"loadMoreResults"}],"addToPlanner":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\generic-search-results-display.cfm","TEXT":"Add to Planner","APP_VERSION":"8_0","SECTION":"addToPlanner"}],"viewAllFeaturedButton":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\generic-search-results-display.cfm","TEXT":"See All Results","APP_VERSION":"8_0","SECTION":"viewAllFeaturedButton"}]},"includes\\vue\\search\\search-results-display.cfm":{"onDemandSessionLabelSingular":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\search-results-display.cfm","TEXT":"On Demand Session","APP_VERSION":"8_0","SECTION":"onDemandSessionLabelSingular"}],"listText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\search-results-display.cfm","TEXT":"List","APP_VERSION":"8_0","SECTION":"listText"}],"resultPlural":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\search-results-display.cfm","TEXT":"Results","APP_VERSION":"8_0","SECTION":"resultPlural"}],"gridText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\search-results-display.cfm","TEXT":"Grid","APP_VERSION":"8_0","SECTION":"gridText"}],"forText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\search-results-display.cfm","TEXT":"for","APP_VERSION":"8_0","SECTION":"forText"}],"onDemandSessionLabelPlural":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\search-results-display.cfm","TEXT":"On Demand Sessions","APP_VERSION":"8_0","SECTION":"onDemandSessionLabelPlural"}],"relatedSearchesText":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\search-results-display.cfm","TEXT":"Related Searches","APP_VERSION":"8_0","SECTION":"relatedSearchesText"}],"resultSingular":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\search-results-display.cfm","TEXT":"Result","APP_VERSION":"8_0","SECTION":"resultSingular"}]},"includes\\vue\\search\\pavilion-search-results-display.cfm":{"viewAllButton":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\pavilion-search-results-display.cfm","TEXT":"See All Results","APP_VERSION":"8_0","SECTION":"viewAllButton"}],"tableHeadMatchingExhibitors":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\pavilion-search-results-display.cfm","TEXT":"Matching","APP_VERSION":"8_0","SECTION":"tableHeadMatchingExhibitors"}],"loadingoptionstext":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\pavilion-search-results-display.cfm","TEXT":"Loading...","APP_VERSION":"8_0","SECTION":"loadingoptionstext"}],"tableHeadPavilion":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\pavilion-search-results-display.cfm","TEXT":"Pavilion","APP_VERSION":"8_0","SECTION":"tableHeadPavilion"}],"of":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\pavilion-search-results-display.cfm","TEXT":"of","APP_VERSION":"8_0","SECTION":"of"}],"displayResultHeader":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\pavilion-search-results-display.cfm","TEXT":"Pavilion","APP_VERSION":"8_0","SECTION":"displayResultHeader"}],"loadMoreResults":[{"CONTAINSVAR":0,"LANGUAGECODE":"en","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\search\\pavilion-search-results-display.cfm","TEXT":"Load More Results","APP_VERSION":"8_0","SECTION":"loadMoreResults"}]},"includes\\vue\\generic\\exhibitor-result-list.cfm":{"seeText":[{"CONTAINSVAR":0,"LANGUAGECODE":"EN","STYLE":"","DISPLAYORDER":1,"PAGE":"includes\\vue\\generic\\exhibitor-result-list.cfm","TEXT":"Also Known As","APP_VERSION":"8_0","SECTION":"seeText"}]},"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=4519AA1C-E3E1-6F73-7613F41EEF6EFD27" srcset="/mys_shared/BIO2024/showfiles/imgs/BIO2024_IDS_header@2x.png?breakcache=4519AA1D-B629-F4B6-B84D872604CBED23 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.useExhSubVersion3 = false; Vue.MYS.useExhSubVersion2 = true; Vue.MYS.exhSubVersion = 02; Vue.MYS.sessionSubVersion = 02; Vue.MYS.validRooms = []; Vue.MYS.validHalls = ["A"]; Vue.MYS.altregid = ""; Vue.MYS.regtype = ""; Vue.MYS.genericKey = "production/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/explore/countries.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="getIconUrl(icon)" :title="icon.title" :alt="icon.title" v-if="iscrossref != 1"/> <slot> </slot> </div> <a v-if="!intersected" v-bind:href="exhURL()">{{exhname}}</a> </li></script> <script> var 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, subShowVersion: Vue.MYS.useExhSubVersion3 } }, computed: { content: function(){ return { seeText: this.displaycontent(this.compincludepath, 'seeText') }; }, boothlist: function(){ if (this.booths){ return this.booths.join(", "); } else { return ""; } }, getIconUrl: function() { return function(icon) { if (this.subShowVersion) { return this.getServerlessImageURL(icon.iconfile); } else { return icon.iconfile; } }; }, 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); }, getServerlessImageURL: function(iconfile) { const bucket = 'mys-showfiles'; const environment = Vue.MYS.environment; const showid = this.showidlowercase; const s3key = `${environment}/${showid}/exhicons/${iconfile}`; return Vue.MYS.getServerlessURL(bucket, s3key, null, 56, 'cover'); }, handleClick: function(){ if (this.isrecommendation){ // log function(useraction, useractiontype, actionvalue, altvalue) this.logStats("Recommendation Selected: Exhibitor", "", this.exhid, this.exhname); } this.goToURL(this.exhURL()); } } }); </script> <script> var VLazyImageComponent = { props: { src: { type: String, required: true }, srcPlaceholder: { type: String, default: "" }, srcset: { type: String }, intersectionOptions: { type: Object, default: function(){ return {} } } }, data: function() { return { observer: null, intersected: false, loaded: false } }, computed: { srcImage: function() { return this.intersected ? this.src : this.srcPlaceholder; }, srcsetImage: function() { return this.intersected && this.srcset ? this.srcset : false; } }, render: function(h) { return h("img", { attrs: { src: this.srcImage, srcset: this.srcsetImage }, class: { "v-lazy-image": true, "v-lazy-image-loaded": this.loaded } }); }, mounted: function() { var vObj = this; vObj.$el.addEventListener("load", function() { if (vObj.$el.getAttribute('src') !== vObj.srcPlaceholder) { vObj.loaded = true; vObj.$emit("load"); } }); this.observer = new IntersectionObserver(function(entries) { var image = entries[0]; if (image.isIntersecting) { vObj.intersected = true; vObj.observer.disconnect(); vObj.$emit("intersect"); } }, vObj.intersectionOptions); vObj.observer.observe(vObj.$el); }, destroyed: function() { this.observer.disconnect(); } }; /*var VLazyImagePlugin = { install: (Vue, opts) => { Vue.component("VLazyImage", VLazyImageComponent); } };*/ Vue.component("VLazyImage", VLazyImageComponent); </script> <script type="text/x-template" id="featured-result-card-template"> <li class="js-Card card br3 dib float pa3" v-bind:style="manualHeight" v-on:click.self="handleClick();"> <div v-if="intersected" v-on:click.self="handleClick();"> <div class="card-Details mb2" v-on:click.self="handleClick();"> <div v-if="logo !== '' && hideimg != true && bitToBool(exhadvind) && iscrossref != 1" class="flex-Thumb thumb-Border mr3 pa2"> <a v-bind:href="exhURL()" v-on:click.self="handleClick();"> <v-lazy-image v-bind:src="logo" v-bind:alt=exhname v-bind:title=exhname class="mw-100 js-LogoImg" v-bind:ref="'js' + exhname+'logo'" v-bind:src-placeholder="placeholderimg" onerror="this.onerror=null;this.src='/8_0/assets/imgs/1x1.gif';" /> </a> </div> <div class="flex-Title mb0 mr3" v-on:click.self="handleClick();"> <h3 class="card-Title break-word f2 mb1 mt0" v-on:click.self="handleClick();"> <a class="bb-0" v-bind:href="exhURL()" v-on:click.self="handleClick();"> <span>{{exhname}}</span> <span v-if="iscrossref && crossrefname">({{content.seeText}}: {{crossrefname}})</span> </a> </h3> <p class="card-Subtitle f5 ma0 muted" v-if="booths && booths.length > 0 && showbooths && iscrossref != 1" v-on:click.self="handleClick()"> <span v-for="i in numOfBoothsToShow" > <a v-if="floorplanactive && validHalls.includes(hallids[i-1])" class="bb-0 color-inherit" v-bind:href="boothURL((booths[i-1]+'').replace('randomstring', ''))" title="Visit this booth">{{(boothsdisplay[i-1]+'').replace('randomstring', '')}}<span v-if="i+1 <= numOfBoothsToShow">, </span></a> <span v-else class="bb-0 color-inherit f6">{{(boothsdisplay[i-1]+'').replace('randomstring', '')}}<span v-if="i+1 <= numOfBoothsToShow">, </span></span> </span> <span v-if="booths.length > numOfBoothsToShow" class="bb-0 color-inherit f6"> + {{booths.length - numOfBoothsToShow}} more </span> </p> </div> <toggle-favorite :type="'exhibitor'" v-bind:keys="exhid" v-bind:addedtoplanner="addedtoplanner" v-on:toggle-favorite="$emit('toggle-favorite', $event)"> </toggle-favorite> </div> <div class="mt3" v-on:click.self="handleClick()"> <a class="bb-0" v-bind:href="exhURL()" v-on:click.self="handleClick()"> <span v-for="tag in tags" :class="tag.color + ' br1 dark-gray dib f7 normal mb2 mr1 pa2 pt1 pb1'">{{tag.display}}</span> </a> </div> <p class="card-Desc f5 lh-copy ma0 muted" v-if="iscrossref != 1"> <a class="bb-0" v-bind:href="exhURL()" v-on:click.self="handleClick();">{{summary}}</a> </p> <img class="mt3 mr2 mb2 mw4 mw-100" v-for="icon in icons" :src="getIconUrl(icon)" :title="icon.title" :alt="icon.title" v-if="iscrossref != 1" /> <slot></slot> </div> <a v-if="!intersected" v-bind:href="exhURL()">{{exhname}}</a> </li></script> <script> var FeaturedResultCard = Vue.component('featured-result-card', ExhibitorResultCard.extend({ template:"#featured-result-card-template", computed: { summary: function(){ if (this.bitToBool(this.exhadvind)){ return this.createSummary(this.description, 170); } else { return this.createSummary(this.description, 85); } }, manualHeight: function(){ return (this.intersected) ? "" : "height: 240px"; }, placeholderimg: function(){ return this.path2approot + "/assets/imgs/grey.gif"; }, numOfBoothsToShow: function (){ return (this.maxshowbooths == 0 ? this.booths.length: (this.maxshowbooths > this.booths.length ? this.booths.length : this.maxshowbooths)); } }, methods: { hideImage: function(e){ // this.hideimg = true; // console.log(this.$refs); // this.$refs[e].$el.onerror = function(){ // alert("hey"); // }; // console.log(this); }, exhURL: function(){ return this.getExhibitorURL(this.exhid, this.exhname); } } }) ); </script> <script type="text/x-template" id="session-result-card-template"> <li class="js-Card card br3 dib float pa3" v-on:click.self="handleClick()"> <div class="card-Details mb2" v-on:click.self="handleClick()" v-if="intersected"> <div class="flex-Title mb0 mr3" v-on:click.self="handleClick()"> <p class="card-Subtitle b f5 mb0" v-if="scheduledate"> <a class="bb-0" v-bind:href="sessionURL()" v-on:click.self="handleClick()" v-if="showDateTime && !hidesessiontimes"> <span v-if="showfulldate"> <span class="">{{formatSessionDay(schedulestarttime)}},</span> {{formatSessionMonth(scheduledate)}} {{toDate(scheduledate).getDate()}} <span class="ml1 mr1 normal o-50">&bull;</span> </span> <div v-if="schedulestarttime != ''"> {{formatSessionTime(schedulestarttime)}} - {{formatSessionTime(scheduleendtime)}}<span v-if="showtimezone"> {{timezonelabel}}</span> </div> </a> <a class="bb-0" v-bind:href="sessionURL()" v-on:click.self="handleClick()" v-if="!showDateTime"> <span>{{content.onDemandLabel}}</span> </a> </p> <p class="f5 mb3 muted"> <template v-if="!hidesessionlocations"> <a class="bb-0" v-if="floorplanactive && validRooms.includes(location)" v-bind:href="floorplanlink">{{location}}</a> <span v-else>{{location}}</span> </template> </p> <h3 class="card-Title break-word f2 mb0 mt0"> <a class="bb-0" v-bind:href="sessionURL()" v-on:click.self="handleClick()"> {{title}} </a> </h3> </div> <toggle-favorite v-if="!seatrestriction" :type="'session'" v-bind:keys="scheduleidstring" v-bind:addedtoplanner="addedtoplanner" v-bind:enabled="bitToBool(allowadd)" v-bind:disabledtext="content.regRequiredText" v-on:toggle-favorite="$emit('toggle-favorite', $event)"> </toggle-favorite> </div> <p class="card-Desc f5 lh-copy ma0 muted" v-on:click.self="handleClick()" v-if="intersected"> {{summary}} </p> <div class="flex items-center mt3" v-if="tracktitle.length > 0 && intersected" v-on:click.self="handleClick()"> <div v-if="tracktitle.length <= 3"> <div class="muted mb2 pb1" v-for="(track, index) in tracktitle" v-on:click.capture="handleClick()"> <span class="dib token-track mr2" v-bind:style="{ backgroundColor: getTrackBgColor(track) }"></span>{{track}} </div> </div> <div v-if="tracktitle.length > 3"> <div class="muted mb2 pb1" v-for="i in 3" v-on:click.capture="handleClick()"> <span class="dib token-track mr2" v-bind:style="{ backgroundColor: getTrackBgColor(tracktitle[i]) }"></span>{{tracktitle[i]}} </div> <div class="muted" v-on:click.capture="handleClick()"> + {{tracktitle.length-3}} {{content.moreText}}</div> </div> </div> <div v-if="ondemand" class="mt3"> <span class="bg-color-brand-09 br1 dark-gray dib f7 normal pa2 pt1 pb1">{{content.onDemandLabel}}</span> </div> <slot> </slot> <a v-if="!intersected" v-bind:href="sessionURL()">{{title}}</a> </li></script> <script> var SessionResultCard = Vue.component('session-result-card', { template:"#session-result-card-template", props: ["title","tracktitle","location","description","scheduledate","scheduleid","schedulestarttime","scheduleendtime","addedtoplanner", "backgroundcolorhexarray", "textcolorhexarray","showfulldate", "isrecommendation", "handoutnamearray", "sponsorarray", "score", "allowadd", "ondemand"], data: function(){ return { compincludepath: "includes/vue/generic/session-result-card.cfm", menuvisible: false, showtimezone: Vue.MYS.settingsConfig.timesettings.showtimezone, timezonelabel: Vue.MYS.settingsConfig.timesettings.timezonelabel, hidesessiontimes: Vue.MYS.settingsConfig.searchsettings.hidesessiontimes, hidesessionlocations: Vue.MYS.settingsConfig.searchsettings.hidesessionlocations, intersected: false, observer: null, validRooms: Vue.MYS.validRooms, seatrestriction: Vue.MYS.seatrestriction } }, mounted: function(){ var vObj = this; vObj.observer = new IntersectionObserver(function(entries) { var image = entries[0]; if (image.isIntersecting) { vObj.intersected = true; vObj.observer.disconnect(); } }, {}); vObj.observer.observe(vObj.$el); }, destroyed: function() { this.observer.disconnect(); }, computed: { boothlist: function(){ if (this.booths){ return this.booths.join(", "); } else { return ""; } }, summary: function(){ return this.createSummary(this.description, 85); }, scheduleidstring: function(){ return this.scheduleid+""; }, content: function(){ return { regRequiredText: this.displaycontent(this.compincludepath, 'regRequiredText'), moreText: this.displaycontent(this.compincludepath, 'moreText'), onDemandLabel: this.displaycontent(this.compincludepath, 'onDemandLabel') }; }, floorplanlink: function(){ return this.path2approot + '/floorplan_link.cfm?show_id=' + this.showid + '&alt_entry=true&curr_pri=facility&object_type=room&booth=' + this.location; }, showDateTime: function(){ return (this.scheduledate == "1900-01-01T00:00:00Z" || this.scheduledate == "1970-01-01T00:00:00Z" ? false : true); } }, methods: { toggleMenu: function(){ this.menuvisible = !this.menuvisible; }, sessionURL: function(){ return this.path2approot + "/sessions/session-details.cfm?scheduleid=" + this.scheduleid; }, handleClick: function(){ if (this.isrecommendation){ // log function(useraction, useractiontype, actionvalue, altvalue) this.logStats("Recommendation Selected: Session", "", this.scheduleid, this.title); } this.goToURL(this.sessionURL()); }, getTrackBgColor: function(trackname) { if (trackname in Vue.MYS.trackcss && "backgroundcolorhex" in Vue.MYS.trackcss[trackname]) { return Vue.MYS.trackcss[trackname]["backgroundcolorhex"]; } else { return "#b2b2b2"; } } } }); </script> <script type="text/x-template" id="recommendations-modal-template"> <div id="rec-modal"> <message-display v-bind:messages="messages" v-bind:type="messagetype" v-bind:showmessage="showmessage" :timeout="20"> </message-display> <transition name="modal" v-if="showmodal"> <div class="modal-mask"> <div class="modal-wrapper" v-on:click.self="closeModal();"> <div class="modal-container"> <div class="modal-header flex justify-between items-center"> <h2 class="mt0">{{content.recommenendedResultsText}} </h2> <button class="btn-tertiary modal-default-button nowrap" v-on:click.stop.prevent="closeModal();"> {{content.closeButtonText}} </button> </div> <div class="mb4"> <a class="toggle-grid btn-tertiary" href="" v-if="exhibitorrecommendationsactive" v-on:click.stop.prevent="switchDisplay('exhibitor');" v-bind:class="[rectype == 'exhibitor' ? 'is-selected' : '']"> <span class="v-mid">{{content.exhibitorButtonText}}</span> </a> <a class="toggle-grid btn-tertiary" href="" v-if="sessionrecommendationsactive" v-on:click.stop.prevent="switchDisplay('session');" v-bind:class="[rectype == 'session' ? 'is-selected' : '']"> <span class="v-mid">{{content.sessionButtonText}}</span> </a> </div> <div v-if="!isloggedinmyshow"> <p class="mb4" v-if="recommendedresults.totalhits > 0"> {{content.topSixRecText}} <a :href="path2approot + '/myshow/'">{{content.loginOrCreatePlannerText}}</a>. </p> <p class="mb4" v-if="recommendedresults.totalhits == 0 && !loading"> {{content.dontHaveRecsText}} </p> </div> <div v-if="loading"> {{content.loadingText}} </div> <div class="o-Recommendation_toggle bg-white mb0-last pb3 tl" > <!-- card view --> <transition-group name="staggered-fade" appear tag="ul" id="rec-result-card" class="cards exh-basic" v-bind:css="false" v-on:before-enter="beforeEnterStaggered" v-on:enter="enterStaggered" v-on:leave="leaveStaggered"> <component v-for="(result, index) in recommendedresults.results" v-on:toggle-favorite="onToggleFavorite" :key="'recommendedresults'+index" :is="getCardTypeDisplay(result)" :data-index="index" :data-maxopacity="getFadedExhibitorOpacity(index)" v-bind="getComponentProps(result)" v-bind:style=""> </component> </transition-group> </div> <div class="modal-footer"> <slot name="footer"></slot> </div> </div> </div> </div> </transition> </div></script> <script> var overriderecstatus = ""; var RecommendationsModal = Vue.component('recommendations-modal', { template:"#recommendations-modal-template", props: { recommendationCategory: { default: "Recommendations", type: String }, recommendedTotal: { default: 0, type: Number }, showmodal:{ default: false, type: Boolean }, isloggedinmyshow: { default: false, type: Boolean } }, mixins: [staggeredTransitionsMixin, fixElementMixin, messagedisplayMixin], data: function(){ return { compincludepath: "includes/vue/generic/recommendations-modal.cfm", recommendationCounter: this.recommendedTotal, recommendedresults: { results: [], totalhits: 0 }, loading: false, maxunfadedexhibitors: 3, rectype: "exhibitor" } }, mounted: function(){ if (this.exhibitorrecommendationsactive && !this.sessionrecommendationsactive){ this.rectype = "exhibitor"; } else if (!this.exhibitorrecommendationsactive && this.sessionrecommendationsactive) { this.rectype = "session"; } }, watch:{ showmodal: function(val){ if (val == true){ this.openModal(); } } }, methods: { switchDisplay: function(rectype){ this.rectype = rectype; this.loadRecs(); }, resetRecommendedResults: function(){ this.recommendedresults = { results: [], totalhits: 0 }; }, isFadedExhibitor: function(index){ if (!this.isloggedinmyshow && index > this.recommendedresults.results.length - this.maxunfadedexhibitors-1){ return true; } else { return false; } }, getFadedExhibitorOpacity: function(index){ if (this.isFadedExhibitor(index)){ // note: commenting out for as we revist how last recs display. Love, Stephen. Have a great day // return 0.3 ; return 1 ; } else { return 1 ; } }, // using this to determine which card component type to display getCardTypeDisplay: function(result){ switch(this.rectype) { case "exhibitor": if (result.MYS.exhfeatured_t == true ){ return "featured-result-card"; } else { return "exhibitor-result-card"; } break; case "session": return "session-result-card"; break; } }, // we can dynamically bind properties to a component. So instead of v-bind:exhid="0000" we can put them in an obj and say v-bind=obj. See <component> above getComponentProps: function(result){ var vObj = this; switch(vObj.rectype){ case "exhibitor": return { "exhid" : result.MYS.exhid_l, "exhname" : result.MYS.exhname_t, "description" : result.MYS.exhdesc_t, "categories" : result.MYS.categories_ta, "categoryids" : result.MYS.categoryid_la, "booths" : result.MYS.booths_la, "boothsdisplay" : result.MYS.boothsdisplay_la, "hallids" : result.MYS.hallid_la, "logo" : vObj.displayLogoURL(result.MYS.exhlogo_t), "slotted" : result.MYS.exhslotted_t, "addedtoplanner" : result.MYS.MYS.addedtoplanner, "search" : result.MYS.search, "searchtype" : result.MYS.searchtype, "searchtypedisplay" : result.MYS.searchtypedisplay, "isrecommendation" : true } break; case "session": var tempresult = { "title":result.MYS.title , "tracktitle":result.MYS.tracktitle , "location":result.MYS.location , "description":result.MYS.description , "scheduledate":result.MYS.scheduledate , "scheduleid":result.MYS.scheduleid , "schedulestarttime":result.MYS.starttime , "scheduleendtime":result.MYS.endtime , "addedtoplanner":result.MYS.addedtoplanner, "allowadd": vObj.bitToBool(result.MYS.allowadd), "backgroundcolorhexarray": [], "textcolorhexarray": [], "showfulldate": true, "isrecommendation" : true }; if ("MYS" in result && "backgroundcolorhexarray" in result.MYS){ tempresult["backgroundcolorhexarray"] = result.MYS.backgroundcolorhexarray; } if ("MYS" in result && "textcolorhexarray" in result.MYS){ tempresult["textcolorhexarray"] = result.MYS.textcolorhexarray; } return tempresult; break; } }, closeModal: function(){ this.$emit('close-modal'); }, loadRecs: function(){ var vObj = this; var overriderecstatusstring = ""; vObj.loading = true; if (overriderecstatus.length > 0){ overriderecstatusstring = "&recstatus=" + overriderecstatus; } if (vObj.hasLocalStorage()){ requestString = localStorage.getItem("userinterests"); vObj.resetRecommendedResults(); // ajaxJsonPost() defined in _global-mixin vObj.ajaxJsonPost(vObj.path2approot + '/ajax/remote-proxy.cfm?action=recommended' + overriderecstatusstring + '&returntype=' + vObj.rectype + '&from=modal', requestString, function(response){ // success vObj.loading = false; if (vObj.rectype == "session"){ vObj.recommendedresults["results"] = response["DATA"].results[vObj.rectype].filteredbuckets; } else { vObj.recommendedresults["results"] = response["DATA"].results[vObj.rectype].filteredbuckets; } vObj.recommendedresults["totalhits"] = response["DATA"].totalhitsfiltered; // now mark new recs as new if (vObj.hasLocalStorage() ){ localStorage.setItem("hasnewrecommendations", false); } }, function(response){ // error vObj.loading = false; vObj.showMessage("error", vObj.content.errorLoadingRecommendations); }); // end ajaxJsonPost } }, openModal: function(){ this.loadRecs(); }, onToggleFavorite: function(){ this.openModal(); }, startDismissTip: function(){ var recommendationsIntroShown = localStorage.getItem('vts_recommendation_dismiss_shown') == 'true'; if (recommendationsIntroShown) return; var intro2 = introJs(".o-Recommendation_Dismiss"); intro2.setOptions({ showBullets: false }) intro2.start(); intro2.oncomplete(function() { localStorage.setItem('vts_recommendation_dismiss_shown', 'true'); }) intro2.onexit(function() { localStorage.setItem('vts_recommendation_dismiss_shown', 'true'); }) }, dismissRec: function(result){ var vObj = this; var actionvalue; if (vObj.rectype == "session"){ actionvalue = result.MYS.scheduleid_l; } else { actionvalue = result.MYS.exhid_l; } if (vObj.isloggedinmyshow){ // ajaxGet() defined in _global-mixin vObj.ajaxGet(vObj.path2approot + '/ajax/remote-proxy.cfm?action=recommended' + "&type=" + vObj.rectype + '&actionvalue=' + actionvalue + '&returntype=dismiss', // ajaxGet() defined in _global-mixin function(response){ // success vObj.loading = false; vObj.openModal(); }, function(error){ // error vObj.loading = false; vObj.showMessage("error", "Error dismissing recommendation"); }); // end ajaxGet } else { // add tooltip vObj.startDismissTip(); } return false; }, // TODO :: STEPHEN :: Should this be self contained in a mixin? This is a copy of what's happening in session search results display getSessionsBySchedule: function(results){ var returnArray = []; var vObj = this; for (var i = 0; i < results.length; i++){ for (var j = 0; j < results[i].MYS.scheduleid_la.length; j++){ var tracktitle = '' if ('tracktitle_la' in results[i].MYS){ tracktitle = results[i].MYS.tracktitle_la; } var scheduleObj = { scheduleid: results[i].MYS.scheduleid_la[j], location: results[i].MYS.schedulelocation_ta[j], title: results[i].MYS.sessiontitle_t, tracktitle: tracktitle, description: results[i].MYS.sessiontitle_t, scheduledate: vObj.toDate(results[i].MYS.scheduledate_da[j]), starttime: vObj.toDate(results[i].MYS.schedulestarttime_da[j]), endtime: vObj.toDate(results[i].MYS.scheduleendtime_da[j]), addedtoplanner: results[i].MYS.addedtoplanner_la[j] }; returnArray.push(scheduleObj); } } returnArray.sort(function(a,b){ if (a.starttime < b.starttime) return -1; if (a.starttime > b.starttime) return 1; return 0; }); // sort array by date return returnArray; }, clearLocalStorageRecommendationData: function(){ vObj = this; if (vObj.hasLocalStorage()){ localStorage.removeItem('vts_recommendation_first_message_shown'); localStorage.removeItem('vts_recommendation_second_message_shown'); localStorage.removeItem('userinterests'); } } }, computed: { content: function(){ return { recommenendedResultsText: this.displaycontent(this.compincludepath, 'recommenendedResultsText'), closeButtonText: this.displaycontent(this.compincludepath, 'closeButtonText'), exhibitorButtonText: this.displaycontent(this.compincludepath, 'exhibitorButtonText'), sessionButtonText: this.displaycontent(this.compincludepath, 'sessionButtonText'), topSixRecText: this.displaycontent(this.compincludepath, 'topSixRecText'), loginOrCreatePlannerText: this.displaycontent(this.compincludepath, 'loginOrCreatePlannerText'), dontHaveRecsText: this.displaycontent(this.compincludepath, 'dontHaveRecsText'), loadingText: this.displaycontent(this.compincludepath, 'loadingText'), dismssText: this.displaycontent(this.compincludepath, 'dismssText'), errorLoadingRecommendations: this.displaycontent(this.compincludepath, 'errorLoadingRecommendations') }; }, previousRecommendationCounter: function(){ var previousRecommendNumber = this.recommendationCounter - 1; if (previousRecommendNumber < 0) { previousRecommendNumber = 0; } return previousRecommendNumber; }, nextRecommendationCounter: function(){ return this.recommendationCounter + 1; }, shouldShowOnExpoMYS: function(){ return (this.showidlowercase === 'expomys' || this.showidlowercase === 'expomys1' || this.showidlowercase === 'expomys2' || this.showidlowercase === 'expomys3' || this.showidlowercase === 'expomys4' || this.showidlowercase === 'expomys5' || this.showidlowercase === 'imts18'); } } }); </script> <script type="text/x-template" id="contactImageTemplate"> <div> <div v-if="userimage && intersected && !imgerror"> <img class="o-chat_avatar" :class="status.toLowerCase() == 'available' ? 'is-available' : ''" :src="imgsrc" :srcset="srcset" @error="imgerror = true" :alt="username" :width="width" :height="height" v-bind:style="imgStyleObject" /> </div> <div v-else class="contact-image-wrapper" :class="status.toLowerCase() == 'available' ? 'is-available' : ''" style=""> <span class="contact-image-initials" :style="{color: colorlookup[firstinitial]}" :title="username">{{initials}}</span> </div> </div></script> <style> .contact-image-wrapper { background-color: white; background-image: none; border: 1px solid #CCC; border-radius: 50%; display: flex; align-items: center; justify-content: center; margin-right: 12px; width: 48px; height: 48px; } .contact-image-initials { font-weight: bold; font-size: 1.250em; color: #333; text-align: center; } </style> <script> var ContactImage = Vue.component("contact-image", { template:"#contactImageTemplate", props: { username: { default: "", type: String }, userimage: { default: "", type: String }, status: { default: "", type: String }, large: { default: false, type: Boolean }, width: { type: [String, Number], default: "" }, height: { type: [String, Number], default: "" } }, data: function(){ return { compincludepath: "includes/vue/generic/contact-image.cfm", intersected: false, observer: null, imgsrc: "", imgsrc2x: "", imgerror: false } }, mounted: function(){ var vObj = this; vObj.observer = new IntersectionObserver(function(entries) { var image = entries[0]; if (image.isIntersecting) { vObj.intersected = true; vObj.observer.disconnect(); if (vObj.userimage){ var cachedImgPath = vObj.getCachedImgPath(false); var cachedImgPath2x = vObj.getCachedImgPath(true); if (cachedImgPath !== "" && cachedImgPath2x !== ""){ vObj.imgsrc = cachedImgPath; vObj.imgsrc2x = cachedImgPath2x; } else { vObj.ajaxGet(vObj.path2approot + '/ajax/remote-proxy.cfm?action=misc&function=profileimage&image=' + vObj.userimage + '&large=' + vObj.large, // ajaxGet() defined in _global-mixin function(response){ // success if ("url" in response.DATA){ vObj.imgsrc = response.DATA["url"]; vObj.imgsrc2x = response.DATA["url2x"]; vObj.imgerror = false; if (vObj.hasSessionStorage()) { sessionStorage.setItem(vObj.username + "-" + vObj.userimage + "-" + vObj.large, vObj.imgsrc); sessionStorage.setItem(vObj.username + "-" + vObj.userimage + "-" + vObj.large + "-2x", vObj.imgsrc2x); } } }, function(response){ // error }); // end ajaxGet } } } }, {}); vObj.observer.observe(vObj.$el); }, computed:{ content: function(){ return { backToTopText: this.displaycontent(this.compincludepath, 'backToTopText'), }; }, colorlookup: function(){ var colorStruct = {}; colorStruct["?"] = "#9fadad"; colorStruct["A"] = "ff3019"; colorStruct["B"] = "#6b1315"; colorStruct["C"] = "#87b95f"; colorStruct["D"] = "#8c59dd"; colorStruct["E"] = "#8058f8"; colorStruct["F"] = "#8dfb54"; colorStruct["G"] = "#bc0a4e"; colorStruct["H"] = "#685a34"; colorStruct["I"] = "#ed94bb"; colorStruct["J"] = "#9b6371"; colorStruct["K"] = "#58226c"; colorStruct["L"] = "#3c1e38"; colorStruct["M"] = "#b2451e"; colorStruct["N"] = "#3e4f9d"; colorStruct["O"] = "#ba12c8"; colorStruct["P"] = "#e8d247"; colorStruct["Q"] = "#2c1a96"; colorStruct["R"] = "#c4a31b"; colorStruct["S"] = "#35a8a7"; colorStruct["T"] = "#ec8721"; colorStruct["U"] = "#c0547d"; colorStruct["V"] = "#b387b3"; colorStruct["W"] = "#d528d3"; colorStruct["X"] = "#792006"; colorStruct["Y"] = "#10073c"; colorStruct["Z"] = "#5ebf4f"; return colorStruct; }, initials: function(){ var name = this.username.replace(/[^A-z\s]/gi, '').trim(); var tempNameArray = name.split(" "); var nameArray = []; var returnVal = "??"; // trim any empty items from array for (var i = 0; i < tempNameArray.length; i++) { if (tempNameArray[i].trim() !== ""){ nameArray.push(tempNameArray[i].trim()); } } // one element in array and string is 1 char if (nameArray.length == 1 && nameArray[0].length == 1){ returnVal = nameArray[0]; } else if (nameArray.length == 1 && nameArray[0].length > 1){ returnVal = nameArray[0].charAt(0); } else if (nameArray.length == 1 && nameArray[0].length == 2){ // one element in array and the length is 2 characters returnVal = nameArray[0].charAt(0) + nameArray[0].charAt(1); } else if (nameArray.length == 2){ // if there are two elements in the array, get first letter of each returnVal = nameArray[0].charAt(0) + nameArray[1].charAt(0); } else if (nameArray.length >= 3){ // if the array length is >= 3, get letters 1 and 3 returnVal = nameArray[0].charAt(0) + nameArray[2].charAt(0); } return returnVal.toUpperCase(); }, firstinitial: function(){ return this.initials.charAt(0); }, srcset: function(){ if (this.imgsrc2x) { return this.imgsrc2x + " 2x"; } else { return ""; } }, imgStyleObject: function(){ if (this.width && this.height){ return { width: this.width + 'px', height: this.height + 'px' } } else { return {}; } } }, methods: { getCachedImgPath: function(twox){ var vObj = this; var returnURL = ""; var is2xstring = (twox) ? "-2x" : ""; if (vObj.hasSessionStorage()) { var imgurl = sessionStorage.getItem(vObj.username + "-" + vObj.userimage + "-" + vObj.large + is2xstring); if (imgurl){ returnURL = imgurl; } } return returnURL; } } }); </script> <link rel="stylesheet" href="/8_0/assets/css/navbar-v2.css?myscache=20221018A"> <div id="navbar-v2" class="nav--wrapper_outer" :data-hasmyshow="''+hasmyshow" v-cloak> <form ref="logoutform" action="/8_0/login/logout.cfm" method="post" style="display:none;" id="logoutformmys"> <input type="hidden" name="logouttoken" value="312A64C752E9B0B7CBE3674BB8D633433A810A48"> <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=4519AB81-F627-3C67-622ACB43FB9AD39F" srcset="/mys_shared/BIO2024/BIO2024_Custom_logo@2x.png?breakcache=4519AB82-C9B3-A0A6-3AF321D8D19338E6 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> <script> var searchconfig = [{"placeholdertext":"Search by Exhibitor","isadvanced":0,"displayoptions":[{"display":"Grid","active":true,"default":true,"name":"grid"},{"display":"List","active":true,"default":true,"name":"list"}],"ismain":1,"requireplanner":0,"isfloor":1,"searchfieldtype":"search","featuredsearchsize":"","hideslotted":0,"resultspage":"","numcolumns":1,"datafunction":"","display":"Exhibitor Name","element":"exhibitor","searchsize":12,"icon":"","type":"search"},{"placeholdertext":"Search by Keyword","isadvanced":0,"displayoptions":"","ismain":1,"requireplanner":0,"isfloor":1,"searchfieldtype":"search","featuredsearchsize":"","hideslotted":0,"resultspage":"","numcolumns":1,"datafunction":"","display":"Keyword","element":"keyword","searchsize":6,"icon":"","type":"search"},{"placeholdertext":"Search by Category","isadvanced":1,"displayoptions":[{"transition":"fade","display":"List","active":true,"displayoptioncontentid":0,"default":true,"name":"list"}],"ismain":1,"requireplanner":0,"isfloor":1,"searchfieldtype":"select","featuredsearchsize":"","hideslotted":0,"resultspage":"","numcolumns":1,"datafunction":"getsearchcategories","display":"Category","element":"category","searchsize":6,"icon":"","type":"search"},{"placeholdertext":"Search By Exhibitor Country","isadvanced":0,"displayoptions":[{"display":"Grid","active":true,"default":true,"name":"grid"},{"display":"List","active":true,"default":true,"name":"list"}],"ismain":1,"requireplanner":0,"isfloor":0,"searchfieldtype":"select","featuredsearchsize":"","hideslotted":0,"resultspage":"","numcolumns":1,"datafunction":"getCountries","display":"Countries","element":"country","searchsize":50,"icon":"","type":"search"},{"placeholdertext":"Search By Pavilions","isadvanced":0,"displayoptions":[{"display":"Grid","active":true,"default":true,"name":"grid"},{"display":"List","active":true,"default":true,"name":"list"}],"ismain":1,"requireplanner":0,"isfloor":0,"searchfieldtype":"select","featuredsearchsize":"","hideslotted":0,"resultspage":"","numcolumns":1,"datafunction":"getPavilions","display":"Pavilions","element":"pavilion","searchsize":50,"icon":"","type":"search"},{"placeholdertext":"Advanced","displayoptions":{},"ismain":1,"isfloor":0,"searchfieldtype":"search","hideslotted":0,"numcolumns":1,"datafunction":"","display":"Advanced Search","element":"advanced","searchsize":50,"type":"search"}]; var advancedsearchconfig = [{"placeholdertext":"Search by Exhibitor","isadvanced":0,"displayoptions":[{"display":"Grid","active":true,"default":true,"name":"grid"},{"display":"List","active":true,"default":true,"name":"list"}],"ismain":1,"requireplanner":0,"isfloor":1,"searchfieldtype":"search","featuredsearchsize":"","hideslotted":0,"resultspage":"","numcolumns":1,"datafunction":"","display":"Exhibitor Name","element":"exhibitor","searchsize":12,"icon":"","type":"search"},{"placeholdertext":"Search by Keyword","isadvanced":0,"displayoptions":"","ismain":1,"requireplanner":0,"isfloor":1,"searchfieldtype":"search","featuredsearchsize":"","hideslotted":0,"resultspage":"","numcolumns":1,"datafunction":"","display":"Keyword","element":"keyword","searchsize":6,"icon":"","type":"search"},{"placeholdertext":"Search by Category","isadvanced":1,"displayoptions":[{"transition":"fade","display":"List","active":true,"displayoptioncontentid":0,"default":true,"name":"list"}],"ismain":1,"requireplanner":0,"isfloor":1,"searchfieldtype":"select","featuredsearchsize":"","hideslotted":0,"resultspage":"","numcolumns":1,"datafunction":"getsearchcategories","display":"Category","element":"category","searchsize":6,"icon":"","type":"search"},{"placeholdertext":"Search By Exhibitor Country","isadvanced":0,"displayoptions":[{"display":"Grid","active":true,"default":true,"name":"grid"},{"display":"List","active":true,"default":true,"name":"list"}],"ismain":1,"requireplanner":0,"isfloor":0,"searchfieldtype":"select","featuredsearchsize":"","hideslotted":0,"resultspage":"","numcolumns":1,"datafunction":"getCountries","display":"Countries","element":"country","searchsize":50,"icon":"","type":"search"},{"placeholdertext":"Search By Pavilions","isadvanced":0,"displayoptions":[{"display":"Grid","active":true,"default":true,"name":"grid"},{"display":"List","active":true,"default":true,"name":"list"}],"ismain":1,"requireplanner":0,"isfloor":0,"searchfieldtype":"select","featuredsearchsize":"","hideslotted":0,"resultspage":"","numcolumns":1,"datafunction":"getPavilions","display":"Pavilions","element":"pavilion","searchsize":50,"icon":"","type":"search"},{"placeholdertext":"Advanced","displayoptions":{},"ismain":1,"isfloor":0,"searchfieldtype":"search","hideslotted":0,"numcolumns":1,"datafunction":"","display":"Advanced Search","element":"advanced","searchsize":50,"type":"search"}]; var keywordsearchconfig = [{"display":"Exhibitors","active":1,"requireplanner":0,"searchsize":50,"section":"exhibitor"},{"display":"Product Categories","active":1,"requireplanner":0,"searchsize":50,"section":"category"},{"display":"Show Features","active":1,"requireplanner":0,"searchsize":50,"section":"showfeature"},{"display":"Booth, Hall","active":1,"requireplanner":0,"searchsize":50,"section":"booth"},{"display":"Pavilion","active":1,"requireplanner":0,"searchsize":50,"section":"pavilion"},{"display":"Points of Interest","active":1,"requireplanner":0,"searchsize":50,"section":"room"},{"display":"Collateral","active":1,"requireplanner":0,"searchsize":50,"section":"collateral"}]; var relatedsearchesconfig = {}; var MAXRECENTSEARCHES = 5; var advancedsearchoptions = { exhibitor: ["booth","category","country","exhibitor","exhibitorname","georegion","pavilion","state","tradename"], session: ["audience", "sessiondate", "sessionlevels", "sessionsearch", "sessionspeakers", "sessionsponsor", "sessiontrack", "sessiontype"] }; for (i = 0; i < advancedsearchconfig.length; i++){ var search = advancedsearchoptions["exhibitor"].filter(function(advancedoption){ return advancedsearchconfig[i].element == advancedoption && advancedsearchconfig[i].type == "search"; })[0]; if (typeof search !== "undefined") { advancedsearchconfig[i]["isadvanced"] = 1; } var search = advancedsearchoptions["session"].filter(function(advancedoption){ return advancedsearchconfig[i].element == advancedoption && advancedsearchconfig[i].type == "sessionsearch"; })[0]; if (typeof search !== "undefined") { advancedsearchconfig[i]["isadvanced"] = 1; } } var searchMixin = { computed: { noresults: function(){ return (("totalhits" in this.searchresults && this.searchresults.totalhits == 0 ) ) ? true : false ; }, activesearchconfig: function(){ var activeArray = this.searchconfig.filter(function(item){ return (item.ismain == true); }); return activeArray; }, activeadvancedsearchconfig: function(){ var activeArray = this.advancedsearchconfig.filter(function(item){ return (item.ismain == true); }); return activeArray; }, filteredrecommededsearches: function(){ var vObj = this; if (vObj.recommendedsearches.results.constructor === Array){ var tempResults = vObj.recommendedsearches.results; } else { var tempResults = []; } return { // this filter filters out searches that equal the actual search performed results: tempResults.filter(function(a){ return (a.MYS.search+"".toLowerCase() !== vObj.searchtext+"".toLowerCase() || a.MYS.searchtype.toLowerCase().replace("exhibitor","keyword") !== vObj.searchtype); }) // this filter filters out duplicates. The .replace("keyword", "exhbitor") lets us find exhibitor only exhibitor keywords .filter(function(item, pos, self) { return (self.map(function(x){ return x.MYS.search + '|' + x.MYS.searchtype.replace("keyword","exhibitor"); }).indexOf(item.MYS.search + '|' + item.MYS.searchtype.replace("keyword","exhibitor")) == pos); }) }; }, hasexhibitorsearches: function(){ var returnVal = false; for (var i = 0; i < this.searchconfig.length; i++){ if (this.searchconfig[i].type == "search"){ returnVal = true; break; } } return returnVal; }, hassessionsearches: function(){ var returnVal = false; for (var i = 0; i < this.searchconfig.length; i++){ if (this.searchconfig[i].type == "sessionsearch"){ returnVal = true; break; } } return returnVal; } }, watch: { selectedsearchindex: function(val){ if ("element" in this.searchconfig[val]){ this.searchtype = this.searchconfig[val].element; } } }, data: { breadcrumbcontent: "", show: "all", // this is used to determine whether we want to get all results searchsize: 50, recommendedsize: 6, searchtext: "", searchtype: searchconfig[0].element, searchperformed: false, selectedselectoptions: [], selectedsearchindex: 0, searchresults: { searchtext: "", totalhits: 0, results: {} }, recommendedexhibitors: { results: [] }, recommendedsearches: { results: [] }, recommendedcategories: { results: [] }, searchconfig: searchconfig, advancedsearchconfig: advancedsearchconfig, recommendedexhibitorsconfig: {}, recommendedcategoriesconfig: {}, relatedsearchesconfig: relatedsearchesconfig, keywordsearchconfig: keywordsearchconfig, // searchsizeconfig: searchsizeconfig, recentsearches: [], searching: false, searchajaxcount:0, errors: [], error: false, globalsearchtype: "exhibitor" }, methods: { updateBreadcrumb: function(requestArray){ var vObj = this; // ajaxJsonPost() defined in _global-mixin vObj.ajaxJsonPost(vObj.path2approot + '/ajax/remote-proxy.cfm?action=breadcrumbs&function=update', JSON.stringify(requestArray), function(response){ // success vObj.breadcrumbcontent = response["DATA"].breadcrumbcontent; return response["DATA"]; }, function(response){ // error vObj.error = true; vObj.errors.push.apply(vObj.errors, vObj.getAjaxErrors(response)); // push add array to errors return {}; }); // end ajaxJsonPost }, getRecentSearches: function(){ var vObj = this; if (this.hasSessionStorage()){ var recentSearchArrayString = sessionStorage.getItem("recentsearches"); // if array if (recentSearchArrayString && (this.isJsonString(recentSearchArrayString))){ var recentSearchArray = JSON.parse(recentSearchArrayString); vObj.recentsearches = recentSearchArray.filter(function(obj){ return obj.globalsearchtype == vObj.globalsearchtype; }); } } }, getVuePath: function(){ return "/#" + this.$router.currentRoute.path; }, updateURLStringAlt: function(){ var vueURLParams = encodeURIComponent(this.getVuePath()) , vObj = this; vObj.ajaxGet(vObj.path2approot + '/ajax/remote-proxy.cfm?action=misc&function=updateURLStringAlt&queryString='+vueURLParams, // ajaxGet() defined in _global-mixin function(response){ // success // do nothing }, function(response){ // error vObj.error = true; vObj.errors.push.apply(vObj.errors, vObj.getAjaxErrors(response)); // push add array to errors }); // end ajaxGet }, resetAll: function(){ this.clearSearchResults(); this.clearRecommendedResults(); this.show = ""; this.selectedsearchindex = 0 this.searching = false; this.recentsearches = []; this.searchperformed = false; }, clearSearchResults: function(){ this.searchresults = { searchtext: "", totalhits: 0, results: {} }; }, clearRecommendedResults: function(){ this.recommendedexhibitors = { results: {} }; this.recommendedsearches = { results: {} }; }, resetErrors: function(){ this.errors = []; this.error = false; }, setSelectedIndexByType: function(type) { for (var i = 0; i < this.searchconfig.length; i++){ if (this.searchconfig[i].element === type){ this.selectedsearchindex = i; break; } } }, getSearchConfigByType: function(type){ var returnConfig = {}; for (var i = 0; i < this.searchconfig.length; i++){ if (this.searchconfig[i].element === type){ returnConfig = this.searchconfig[i]; break; } } return returnConfig; }, saveRecentSearch: function(globalsearchtype, searchtype, search, searchdisplay){ var recentSearchArray = []; if (this.hasSessionStorage()){ var recentSearchArrayString = sessionStorage.getItem("recentsearches"); // if array if (recentSearchArrayString && (this.isJsonString(recentSearchArrayString))){ recentSearchArray = JSON.parse(recentSearchArrayString); } if (globalsearchtype && searchtype && search && searchdisplay){ var alreadyinarray = false; // check if already exists in array for (var i = 0; i < recentSearchArray.length; i++){ if(recentSearchArray[i].globalsearchtype === globalsearchtype && recentSearchArray[i].searchtype == searchtype && recentSearchArray[i].search == search && recentSearchArray[i].searchdisplay == searchdisplay){ alreadyinarray = true; } } // if not already in array then add if (!alreadyinarray){ var searchObj = { globalsearchtype: globalsearchtype, searchtype: searchtype, search: search, searchdisplay: searchdisplay }; recentSearchArray.unshift(searchObj); } // now take top X if over max if (recentSearchArray.length > MAXRECENTSEARCHES){ recentSearchArray = recentSearchArray.slice(0, MAXRECENTSEARCHES); } } sessionStorage.setItem("recentsearches", JSON.stringify(recentSearchArray)); } } } }; </script> <script> var quicklistconfig = [{"displaytitle_extralinks":"","active":1,"backgroundcolor":"","searchoption":"","vtsurl_target":"","showresultcount":0,"url":"explore/exhibitor-categories.cfm","displaytitlecontentid":55,"linkorder":0,"linktype":"tile","quicklistdata":"{\"shortcuts\":[],\"resultcount\":false,\"requireplanner\":false,\"newtab\":false,\"linkid\":\"exhibitorcategories\",\"url\":\"explore/exhibitor-categories.cfm\"}","svgpath":"","icon":"","type":"core","imageurl":"https://d3fv3oe83qat1b.cloudfront.net/eyJlZGl0cyI6eyJyZXNpemUiOnsiZml0IjoiY292ZXIiLCJxdWFsaXR5IjoiNzAiLCJ3aWR0aCI6ODAwLCJoZWlnaHQiOjY1MH19LCJidWNrZXQiOiJteXMtc2hvd2ZpbGVzIiwia2V5Ijoic3RhZ2luZy9iaW8yMDI0L2xhbmRpbmcvaW1hZ2VzL2dsb2JhbF8yQTY1QTQ3RC1BQzM4LUVCRkItQzY4OUI0MEI2NUVDMjc4Mi5qcGcifQ==","vtsurl":"/8_0/explore/exhibitor-categories.cfm","hasmultiplelinks":0,"displaytitle":"Product Categories","requireplanner":0,"name":"exhibitorcategories","tileindex":2,"module":"Exhibitors","groupid":0,"buttoncolor":"","hidelabel":0},{"displaytitle_extralinks":"","active":1,"backgroundcolor":"","searchoption":"","vtsurl_target":"","showresultcount":1,"url":"explore/pavilions.cfm","displaytitlecontentid":277,"linkorder":0,"linktype":"tile","quicklistdata":"{\"requireplanner\":false,\"resultcount\":\"true\",\"newtab\":false,\"linkid\":\"pavilions\",\"url\":\"explore/pavilions.cfm\"}","svgpath":"","icon":"","type":"core","imageurl":"https://d3fv3oe83qat1b.cloudfront.net/eyJidWNrZXQiOiJteXMtc2hvd2ZpbGVzIiwia2V5Ijoic3RhZ2luZy9iaW8yMDI0L2xhbmRpbmcvaW1hZ2VzL0VBQjIzMERELUZDQkYtRTdGMi04QkJFODkxMDIyRTQxQTA2LnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6ODAwLCJoZWlnaHQiOjY1MCwiZml0IjoiY292ZXIiLCJxdWFsaXR5IjoiNzAifX19","vtsurl":"/8_0/explore/pavilions.cfm","hasmultiplelinks":0,"displaytitle":"Pavilions","requireplanner":0,"name":"pavilions","tileindex":3,"module":"Exhibitors","groupid":0,"buttoncolor":"","hidelabel":0},{"displaytitle_extralinks":"","active":1,"backgroundcolor":"","searchoption":"","vtsurl_target":"","showresultcount":0,"url":"floorplan/","displaytitlecontentid":631,"linkorder":0,"linktype":"tile","quicklistdata":"{\"shortcuts\":[],\"resultcount\":false,\"requireplanner\":false,\"newtab\":false,\"linkid\":\"floorplan\",\"url\":\"floorplan/\"}","svgpath":"","icon":"","type":"core","imageurl":"https://d3fv3oe83qat1b.cloudfront.net/eyJidWNrZXQiOiJteXMtc2hvd2ZpbGVzIiwia2V5Ijoic3RhZ2luZy9iaW8yMDI0L2xhbmRpbmcvaW1hZ2VzL0VBQ0I4MjYwLTkwOEUtMUMwNS0zQjY3QTk0OEMxMDdGMUFGLnBuZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6ODAwLCJoZWlnaHQiOjY1MCwiZml0IjoiY292ZXIiLCJxdWFsaXR5IjoiNzAifX19","vtsurl":"/8_0/floorplan/","hasmultiplelinks":0,"displaytitle":"Floor Plan","requireplanner":0,"name":"floorplan","tileindex":1,"module":"Exhibitors","groupid":0,"buttoncolor":"","hidelabel":0},{"displaytitle_extralinks":"","active":1,"backgroundcolor":"","searchoption":"","vtsurl_target":"","showresultcount":0,"url":"explore/exhibitor-gallery.cfm","displaytitlecontentid":34571,"linkorder":0,"linktype":"tile","quicklistdata":"{\"requireplanner\":false,\"resultcount\":false,\"newtab\":false,\"linkid\":\"exhibitoralpha2\",\"url\":\"explore/exhibitor-gallery.cfm\"}","svgpath":"","icon":"","type":"core","imageurl":"https://d3fv3oe83qat1b.cloudfront.net/eyJlZGl0cyI6eyJyZXNpemUiOnsiZml0IjoiY292ZXIiLCJxdWFsaXR5IjoiNzAiLCJ3aWR0aCI6ODAwLCJoZWlnaHQiOjY1MH19LCJidWNrZXQiOiJteXMtc2hvd2ZpbGVzIiwia2V5Ijoic3RhZ2luZy9iaW8yMDI0L2xhbmRpbmcvaW1hZ2VzL2dsb2JhbF9FQUVDQjlEQi1GMTY5LTk4MjUtRjMzMjZFMDBGNEYwMDRCMC5qcGcifQ==","vtsurl":"/8_0/explore/exhibitor-gallery.cfm","hasmultiplelinks":0,"displaytitle":"Exhibitor List","requireplanner":0,"name":"exhibitoralpha2","tileindex":0,"module":"Exhibitors","groupid":0,"buttoncolor":"","hidelabel":0},{"displaytitle_extralinks":"","active":1,"backgroundcolor":"","searchoption":"","vtsurl_target":"","showresultcount":1,"url":"explore/countries.cfm","displaytitlecontentid":43015,"linkorder":0,"linktype":"tile","quicklistdata":"{\"requireplanner\":false,\"resultcount\":true,\"newtab\":false,\"linkid\":\"countries\",\"url\":\"explore/countries.cfm\"}","svgpath":"","icon":"","type":"core","imageurl":"https://d3fv3oe83qat1b.cloudfront.net/eyJlZGl0cyI6eyJyZXNpemUiOnsiZml0IjoiY292ZXIiLCJxdWFsaXR5IjoiNzAiLCJ3aWR0aCI6ODAwLCJoZWlnaHQiOjY1MH19LCJidWNrZXQiOiJteXMtc2hvd2ZpbGVzIiwia2V5Ijoic3RhZ2luZy9iaW8yMDI0L2xhbmRpbmcvaW1hZ2VzL2dsb2JhbF9FQTM0MUI1MS0wOUUxLUY4MjYtMjdFMkE4NTJBMjY0MDY5Ny5qcGcifQ==","vtsurl":"/8_0/explore/countries.cfm","hasmultiplelinks":0,"displaytitle":"Countries","requireplanner":0,"name":"countries","tileindex":4,"module":"Exhibitors","groupid":0,"buttoncolor":"","hidelabel":0}]; var sessionquicklistconfig = [{"displaytitle_extralinks":"","active":1,"backgroundcolor":"","searchoption":"","vtsurl_target":"","showresultcount":1,"url":"explore/session-speakers.cfm","displaytitlecontentid":2767,"linkorder":0,"linktype":"tile","quicklistdata":"{\r\n \"requireplanner\": false,\r\n \"resultcount\": true,\r\n \"newtab\": false,\r\n \"linkid\": \"sessionspeakers\",\r\n \"url\": \"explore/session-speakers.cfm\"\r\n }","svgpath":"","icon":"","type":"core","imageurl":"https://d3fv3oe83qat1b.cloudfront.net/eyJidWNrZXQiOiJteXMtYXNzZXRzIiwia2V5IjoidnRzL2ltZy90aWxlLWxpYnJhcnkvc2Vzc2lvbi1zcGVha2Vycy0wMi5qcGciLCJlZGl0cyI6eyJyZXNpemUiOnsid2lkdGgiOjgwMCwiaGVpZ2h0Ijo2NTAsImZpdCI6ImNvdmVyIiwicXVhbGl0eSI6IjcwIn19fQ==","vtsurl":"/8_0/explore/session-speakers.cfm","hasmultiplelinks":0,"displaytitle":"Speakers","requireplanner":0,"name":"sessionspeakers","tileindex":1,"module":"Exhibitors","groupid":0,"buttoncolor":"","hidelabel":""},{"displaytitle_extralinks":"","active":1,"backgroundcolor":"","searchoption":"","vtsurl_target":"","showresultcount":1,"url":"explore/session-tracks.cfm","displaytitlecontentid":15173,"linkorder":0,"linktype":"tile","quicklistdata":"{\r\n \"requireplanner\": false,\r\n \"resultcount\": true,\r\n \"newtab\": false,\r\n \"linkid\": \"sessiontracks\",\r\n \"url\": \"explore/session-tracks.cfm\"\r\n }","svgpath":"","icon":"","type":"core","imageurl":"https://d3fv3oe83qat1b.cloudfront.net/eyJidWNrZXQiOiJteXMtYXNzZXRzIiwia2V5IjoidnRzL2ltZy90aWxlLWxpYnJhcnkvc2Vzc2lvbi10cmFja3MtMDEuanBnIiwiZWRpdHMiOnsicmVzaXplIjp7IndpZHRoIjo4MDAsImhlaWdodCI6NjUwLCJmaXQiOiJjb3ZlciIsInF1YWxpdHkiOiI3MCJ9fX0","vtsurl":"/8_0/explore/session-tracks.cfm","hasmultiplelinks":0,"displaytitle":"Tracks","requireplanner":0,"name":"sessiontracks","tileindex":2,"module":"Exhibitors","groupid":0,"buttoncolor":"","hidelabel":""},{"displaytitle_extralinks":"","active":1,"backgroundcolor":"","searchoption":"","vtsurl_target":"","showresultcount":1,"url":"explore/session-gallery.cfm","displaytitlecontentid":51573,"linkorder":0,"linktype":"tile","quicklistdata":"{\r\n \"requireplanner\": false,\r\n \"resultcount\": true,\r\n \"newtab\": false,\r\n \"linkid\": \"sessiongallery\",\r\n \"url\": \"explore/session-gallery.cfm\"\r\n }","svgpath":"","icon":"","type":"core","imageurl":"https://d3fv3oe83qat1b.cloudfront.net/eyJidWNrZXQiOiJteXMtYXNzZXRzIiwia2V5IjoidnRzL2ltZy90aWxlLWxpYnJhcnkvYWxsLXNlc3Npb25zLTAxLmpwZyIsImVkaXRzIjp7InJlc2l6ZSI6eyJ3aWR0aCI6ODAwLCJoZWlnaHQiOjY1MCwiZml0IjoiY292ZXIiLCJxdWFsaXR5IjoiNzAifX19","vtsurl":"/8_0/explore/session-gallery.cfm","hasmultiplelinks":0,"displaytitle":"All Sessions","requireplanner":0,"name":"sessiongallery","tileindex":0,"module":"Exhibitors","groupid":0,"buttoncolor":"","hidelabel":""}]; var masterlinkconfig = [{"module":"Exhibitors","showid":"Master","label":"Brochures","link":"explore/collateral.cfm?type=brochure","linkid":"brochure"},{"module":"Exhibitors","showid":"Master","label":"Exhibitor Collateral","link":"explore/collateral.cfm","linkid":"collateral"},{"module":"Exhibitors","showid":"Master","label":"Countries","link":"explore/countries.cfm","linkid":"countries"},{"module":"Conferences","showid":"Master","label":"Education Units","link":"explore/educationunits.cfm","linkid":"educationunits"},{"module":"Exhibitors","showid":"Master","label":"Exhibitor Alpha List","link":"explore/exhibitor-alphalist.cfm","linkid":"exhibitoralpha"},{"module":"Exhibitors","showid":"Master","label":"Product Categories","link":"explore/exhibitor-categories.cfm","linkid":"exhibitorcategories"},{"module":"Exhibitors","showid":"Master","label":"Exhibitor PDF List","link":"exhibitor/exhibitor-list.cfm?export=pdf","linkid":"exhibitorpdf"},{"module":"Exhibitors","showid":"Master","label":"Search The Show","link":"index.cfm","linkid":"exhibitorsearch"},{"module":"Exhibitors","showid":"Master","label":"Featured Exhibitors","link":"explore/featured-exhibitors.cfm","linkid":"featuredexhibitors"},{"module":"Conferences","showid":"Master","label":"Key Note Sessions","link":"explore/featured-sessions.cfm","linkid":"featuredsessions"},{"module":"","showid":"Master","label":"Floorplan","link":"floorplan/","linkid":"floorplan"},{"module":"Exhibitors","showid":"Master","label":"Exhibitor Meetings","link":"explore/meetings.cfm","linkid":"meetings"},{"module":"","showid":"Master","label":"My Show Planner","link":"myshow/index.cfm","linkid":"myshowlogin"},{"module":"Exhibitors","showid":"Master","label":"New Exhibitors","link":"explore/newexhibitor.cfm","linkid":"newexhibitors"},{"module":"Exhibitors","showid":"Master","label":"Press Releases","link":"explore/collateral.cfm?type=press","linkid":"press"},{"module":"Exhibitors","showid":"Master","label":"New Products and Technologies","link":"explore/products.cfm","linkid":"products"},{"module":"Sessions","showid":"Master","label":"Session Alpha List","link":"explore/session-alphalist.cfm","linkid":"sessionalpha"},{"module":"Conferences","showid":"Master","label":"Session Categories","link":"explore/session-categories.cfm","linkid":"sessioncategories"},{"module":"","showid":"Master","label":"All Sessions","link":"explore/session-fulllist.cfm","linkid":"sessionfulllist"},{"module":"Sessions","showid":"Master","label":"Session Grid","link":"sessions/session-grid.cfm","linkid":"sessiongrid"},{"module":"Sessions","showid":"Master","label":"Session Search","link":"sessions/index.cfm","linkid":"sessionsearch"},{"module":"Sessions","showid":"Master","label":"Session Speakers","link":"explore/session-speakers.cfm","linkid":"sessionspeakers"},{"module":"Sessions","showid":"Master","label":"Session Tracks","link":"explore/session-tracks.cfm","linkid":"sessiontracks"},{"module":"Exhibitors","showid":"Master","label":"Exhibitor Spotlights","link":"explore/show-features.cfm","linkid":"showfeatures"},{"module":"Exhibitors","showid":"Master","label":"Show Specials","link":"explore/specials.cfm","linkid":"specials"},{"module":"Exhibitors","showid":"Master","label":"White Papers","link":"explore/collateral.cfm?type=whitepaper","linkid":"whitepaper"}]; var navconfig = {"nav":[{"target":"","active":1,"mobileonly":0,"hasdropdown":false,"dropdownlinks":[],"displayorder":1.0,"linkid":"FA40C753-E8C9-5E12-405A7685DE9CC324","module":"","displaytitlecontentid":186491,"iscurrentpage":false,"myscore":0,"newwindow":0,"link":"https://convention.bio.org","type":"externallink","ismyshow":false,"displaytitle":"BIO 2024 Home"},{"target":"","active":1,"mobileonly":0,"hasdropdown":false,"dropdownlinks":[],"displayorder":2.0,"linkid":"exhibitorsearch","module":"exhibitors","displaytitlecontentid":63799,"iscurrentpage":false,"myscore":1,"newwindow":0,"link":"/8_0/index.cfm","type":"myslink","ismyshow":false,"displaytitle":"Directory"},{"target":"_blank","active":1,"mobileonly":0,"hasdropdown":false,"dropdownlinks":[],"displayorder":3.0,"linkid":"floorplan","module":"","displaytitlecontentid":631,"iscurrentpage":false,"myscore":0,"newwindow":1,"link":"/8_0/floorplan/","type":"myslink","ismyshow":false,"displaytitle":"Floor Plan"},{"target":"","active":1,"mobileonly":0,"hasdropdown":true,"dropdownlinks":[{"target":"","active":true,"mobileonly":false,"displayorder":1.0,"linkid":"planner","module":"","displaytitlecontentid":1004,"myscore":true,"newwindow":false,"link":"/8_0/myshow/index.cfm","type":"myslink","displaytitle":"My Planner"},{"target":"","active":true,"mobileonly":false,"displayorder":2.0,"linkid":"profile","module":"","displaytitlecontentid":36434,"myscore":true,"newwindow":false,"link":"/8_0/myshow/preview.cfm","type":"myslink","displaytitle":"My Profile"},{"target":"","active":true,"mobileonly":false,"displayorder":3.0,"linkid":"chat","module":"","displaytitlecontentid":110313,"myscore":true,"newwindow":false,"link":"/8_0/myshow/chat.cfm","type":"myslink","displaytitle":"Messages"},{"target":"","active":true,"mobileonly":false,"displayorder":4.0,"linkid":"recommendations","module":"","displaytitlecontentid":38109,"myscore":true,"newwindow":false,"link":"/8_0/myshow/index.cfm?s=recommendations","type":"myslink","displaytitle":"Recommendations"},{"target":"","active":true,"mobileonly":false,"displayorder":5.0,"linkid":"logout","module":"","displaytitlecontentid":160122,"myscore":true,"newwindow":false,"link":"/8_0/login/logout.cfm","type":"myslink","displaytitle":"Sign Out"}],"displayorder":4.0,"linkid":"myshowlogin","module":"","displaytitlecontentid":271,"iscurrentpage":false,"myscore":0,"newwindow":0,"link":"/8_0/myshow/index.cfm","type":"dropdownmenu","ismyshow":true,"displaytitle":"My Show Planner"},{"target":"","active":1,"mobileonly":0,"hasdropdown":false,"dropdownlinks":[],"displayorder":5.0,"linkid":"exhibitoralpha","module":"Exhibitors","displaytitlecontentid":59319,"iscurrentpage":false,"myscore":0,"newwindow":0,"link":"/8_0/explore/exhibitor-alphalist.cfm?nav=1","type":"myslink","ismyshow":false,"displaytitle":"Exhibitors A-Z"},{"target":"","active":1,"mobileonly":0,"hasdropdown":false,"dropdownlinks":[],"displayorder":6.0,"linkid":"pavilions","module":"Exhibitors","displaytitlecontentid":277,"iscurrentpage":false,"myscore":0,"newwindow":0,"link":"/8_0/explore/pavilions.cfm?nav=1","type":"myslink","ismyshow":false,"displaytitle":"Pavilions"},{"target":"_blank","active":1,"mobileonly":0,"hasdropdown":false,"dropdownlinks":[],"displayorder":7.0,"linkid":"exhibitorexcel","module":"Exhibitors","displaytitlecontentid":186847,"iscurrentpage":false,"myscore":0,"newwindow":1,"link":"/8_0/exhibitor/exhibitor-list.cfm?export=excel","type":"myslink","ismyshow":false,"displaytitle":"Exhibitors List via Excel"}]}; var quicklistMixin = { mixins: [searchMixin, messagedisplayMixin], data: function() { return { globalquicklistconfig: quicklistconfig, sessionquicklistconfig: sessionquicklistconfig, masterlinkconfig: masterlinkconfig, navconfig: navconfig, name: "" }; }, mounted: function(){ var vObj = this; // fixing IE11 issue - https://github.com/vuejs/vue-router/issues/1849 if (vObj.detectIE()) { window.addEventListener('hashchange', function() { var currentPath = window.location.hash.slice(1) if (vObj.$route.path !== currentPath) { vObj.$router.push(currentPath) } }, false); } }, computed: { quicklistconfig: function(){ var config = { displayoptions: [] }; var joinedconfig = this.globalquicklistconfig.concat(this.sessionquicklistconfig); // TODO :: STEPHEN :: wil this be a problem if session configs have a ql with the same name? for (var i = 0; i < joinedconfig.length; i++){ if (joinedconfig[i].name == this.name){ config = joinedconfig[i]; } } return config; }, issessionquicklist: function(){ var returnval = false; for (var i = 0; i < this.sessionquicklistconfig.length; i++){ if (this.name == this.sessionquicklistconfig[i].name){ returnval = true; break; } } return returnval; }, isnavclick: function(){ var navClick = (this.thispageurl.indexOf("nav=1") >= 0) ? true : false; return navClick; }, navtitle: function(){ var urlToCheck = this.getCurrentURL().replace("/#/", "").replace("#/", ""); var urlToCheck2 = this.thispageurl.replace("/#/", "").replace("#/", ""); for (var i = 0; i < this.navconfig.nav.length; i++){ if (urlToCheck === this.navconfig.nav[i].link || urlToCheck2 === this.navconfig.nav[i].link || urlToCheck2 === this.navconfig.nav[i].link+"/"){ return this.navconfig.nav[i].displaytitle; } } return ""; }, navtitlecontentid: function(){ var urlToCheck = this.getCurrentURL().replace("#/", ""); var urlToCheck2 = this.thispageurl.replace("/#/", "").replace("#/", ""); for (var i = 0; i < this.navconfig.nav.length; i++){ if (urlToCheck === this.navconfig.nav[i].link || urlToCheck2 === this.navconfig.nav[i].link || urlToCheck2 === this.navconfig.nav[i].link+"/"){ return this.navconfig.nav[i].displaytitlecontentid; } } return 0; }, customtitle: function(){ var navClick = (this.thispageurl.indexOf("nav=1") >= 0) ? true : false; if (navClick) { return this.navtitle; } else if (this.quicklistconfig.displaytitle){ return this.quicklistconfig.displaytitle; } else if (this.navtitle){ return this.navtitle; } else { var returnString = ""; var urlToCheck = this.getCurrentURL().replace("?nav=1","").replace("&nav=1","").replace("#/", "").replace(this.path2approot+"/", ""); var urlToCheck2 = this.thispageurl.replace("?nav=1","").replace("&nav=1","").replace("#/", "").replace(this.path2approot+"/", ""); for (var i = 0; i < this.masterlinkconfig.length; i++){ if (urlToCheck === this.masterlinkconfig[i].link || urlToCheck2 === this.masterlinkconfig[i].link){ returnString = this.masterlinkconfig[i].label; } } return returnString; } }, customtitlecontentid: function(){ var navClick = (this.thispageurl.indexOf("nav=1") >= 0) ? true : false; if (navClick) { // var urlToCheck = this.getCurrentURL().replace("?nav=1","").replace("&nav=1","").replace("#/", "").replace(this.path2approot, ""); console.log(urlToCheck); return this.navtitlecontentid; } else if (this.quicklistconfig.displaytitlecontentid){ return this.quicklistconfig.displaytitlecontentid; } else if (this.navtitlecontentid){ return this.navtitlecontentid; } else { return ""; } } }, created: function(){ this.performSearch(); }, methods: { performSearch: function(onSuccess){ var action = "search" , search = this.customURIEncode(this.searchtext+"".trim()) , searchtype = this.searchtype , searchsize = this.searchsize , show = this.customURIEncode(this.show+"".trim()) , vObj = this; if (this.searchtype){ vObj.searchperformed = true; vObj.clearSearchResults(); vObj.searching = true; vObj.clearLazyLoadSearchCounts(); if (vObj.issessionquicklist){ var resettto = "resetsessions"; } else { var resettto = "reset"; } // update breadcrumb var response = vObj.updateBreadcrumb([{ title: vObj.customtitle, titlecontentid: vObj.customtitlecontentid, scriptname: vObj.thispageurl, querystring: "", resetto: resettto }]); // ajaxGet() defined in _global-mixin vObj.ajaxGet(vObj.path2approot + '/ajax/remote-proxy.cfm?action=' + action + "&search=" + search + "&searchtype=" + searchtype + "&show=" + show + vObj.getLazyLoadURLString(), function(response){ // success vObj.searching = false; // set results vObj.searchresults["searchtext"] = response["DATA"].searchtext+""; vObj.searchresults["totalhits"] = response["DATA"].totalhits; vObj.searchresults["results"] = response["DATA"].results; if (onSuccess !== undefined){ onSuccess(); } }, function(error){ // error vObj.searching = false; vObj.showMessage("error", "Error loading data"); }); // end ajaxGet } else { this.searchresults["results"] = {}; } }, loadMoreResults: function(searchsection){ var start = -1; var vObj = this; var search = vObj.searchtext+""; var searchtype = this.searchtype; var show = vObj.show; var action = "search"; start = vObj.searchresults["results"][searchsection]["start"]; start += vObj.searchresults["results"][searchsection]["hit"].length; vObj.ajaxGet(vObj.path2approot + '/ajax/remote-proxy.cfm?action=' + action + "&search=" + search + "&searchtype=" + searchtype +"&searchsize=" + this.searchsize + "&start=" + start + "&show=" + searchsection + "&lazyload=true", // ajaxGet() defined in _global-mixin function(response){ // success vObj.searching = false; vObj.searchresults["results"][searchsection]["hit"] = vObj.searchresults["results"][searchsection]["hit"].concat(response["DATA"]["results"][searchsection]["hit"]); vObj.saveLazyLoadSearchCounts(); }, function(response){ // error vObj.showMessage("error", "Error loading more searches"); vObj.searchajaxcount--; vObj.searching = false; vObj.error = true; }); // end ajaxGet }, viewAllResults: function(searchsection){ var start = -1; var vObj = this; var search = vObj.searchtext+""; var searchtype = this.searchtype; var show = vObj.show; var action = "search"; var size = vObj.searchresults["results"][searchsection]["found"] vObj.ajaxGet(vObj.path2approot + '/ajax/remote-proxy.cfm?action=' + action + "&search=" + search + "&searchtype=" + searchtype +"&searchsize=" + size + "&start=0" + "&show=" + searchsection + "&lazyload=true" + "&size-" + searchsection + "=" + size, // ajaxGet() defined in _global-mixin function(response){ // success vObj.searching = false; vObj.searchresults["results"][searchsection]["hit"] = response["DATA"]["results"][searchsection]["hit"]; }, function(response){ // error vObj.showMessage("error", "Error loading more searches"); vObj.searchajaxcount--; vObj.searching = false; vObj.error = true; }); // end ajaxGet }, saveLazyLoadSearchCounts: function(){ if (this.hasSessionStorage()){ var lazyLoadSearchCounts = {}; var pageurl = this.getSearchURL(); var countObj = {}; if (sessionStorage.getItem('lazyloadsearchcounts') ){ lazyLoadSearchCounts = JSON.parse(sessionStorage.getItem('lazyloadsearchcounts')); } for (key in this.searchresults.results){ countObj[key] = this.searchresults.results[key].hit.length; } lazyLoadSearchCounts[pageurl] = countObj; sessionStorage.setItem('lazyloadsearchcounts', JSON.stringify(lazyLoadSearchCounts)); } }, clearLazyLoadSearchCounts: function(){ if (this.hasSessionStorage()){ var pageurl = this.getSearchURL(); var lazyLoadSearchCounts = {}; if (sessionStorage.getItem('lazyloadsearchcounts') ){ lazyLoadSearchCounts = JSON.parse(sessionStorage.getItem('lazyloadsearchcounts')); } if (!(pageurl in lazyLoadSearchCounts)) { sessionStorage.removeItem('lazyloadsearchcounts'); } } }, getLazyLoadURLString: function(){ var returnString = ""; var pageurl = this.getSearchURL(); if (this.hasSessionStorage()){ var lazyLoadSearchCounts = {}; if (sessionStorage.getItem('lazyloadsearchcounts') ){ lazyLoadSearchCounts = JSON.parse(sessionStorage.getItem('lazyloadsearchcounts')); } if (pageurl in lazyLoadSearchCounts){ for (key in lazyLoadSearchCounts[pageurl]){ returnString += "&size-" + key + "=" + lazyLoadSearchCounts[pageurl][key]; } } } return returnString; }, getSearchURL: function(){ // return this.path2approot + "/#/searchtype/" + this.searchtype + "/search/" + this.searchtext; return window.location.href.replace(this.httphost, ""); } } }; </script> <script type="text/x-template" id="noresults-template"> <div> <div v-if="searchterm"> <p>{{content.yourSearchForText}} <strong>{{searchterm}}</strong> {{content.didNotReturnAnyResultsText}}.</p> <p><em>{{content.suggestionsText}}:</em></p> <ul> <li>{{content.searchSpelledText}}</li> <li>{{content.tryGeneralSearchText}}</li> <li>{{content.tryDifferentSearchText}}</li> </ul> </div> <div v-else> <p>{{content.noResultsFoundForText}} {{searchtype}}.</p> </div> <slot></slot> </div></script> <script> var NoResultsDisplay = Vue.component('noresults-display', { data: function(){ return { compincludepath: "includes/vue/generic/noresults-display.cfm" } }, computed:{ content: function(){ return { yourSearchForText: this.displaycontent(this.compincludepath, 'yourSearchForText'), didNotReturnAnyResultsText: this.displaycontent(this.compincludepath, 'didNotReturnAnyResultsText'), suggestionsText: this.displaycontent(this.compincludepath, 'suggestionsText'), noResultsFoundForText: this.displaycontent(this.compincludepath, 'noResultsFoundForText'), searchSpelledText: this.displaycontent(this.compincludepath, 'searchSpelledText'), tryGeneralSearchText: this.displaycontent(this.compincludepath, 'tryGeneralSearchText'), tryDifferentSearchText: this.displaycontent(this.compincludepath, 'tryDifferentSearchText') }; } }, props: { searchterm: { default: "", type: String }, searchtype: { default: "", type: String } }, template:"#noresults-template", methods: {}, }); </script> <script type="text/x-template" id="backToTopButtonTemplate"> <a href="#" class="btn-primary btn-back_to_top center fixed bottom-2 right-2 animated" v-bind:class="[backToTopButtonShowing ? 'slideInRight': 'slideOutRight']" v-scroll-to=scrollto>&uarr; {{content.backToTopText}}</a></script> <script> var BackToTopButton = Vue.component("backtotop-button", { template:"#backToTopButtonTemplate", props: { scrollto: { default: "#nav", type: String } }, data: function(){ return { compincludepath: "includes/vue/generic/backtotop-button.cfm", backToTopButtonShowing: false } }, computed:{ content: function(){ return { backToTopText: this.displaycontent(this.compincludepath, 'backToTopText'), }; } }, methods: { toggleBackToTopButton: function(){ var viewport = window.innerHeight, offset = window.pageYOffset; if (offset > viewport) { this.backToTopButtonShowing = true; } else { this.backToTopButtonShowing = false; } } } }); </script> <script> // search display mixin var searchDisplayMixin = { // props: ["searchtext", "searchtype", "displayoptions", "showheader", "showresultcount", "defaultselectedview", "selectedview"], props: { searchtext: { type: String, default: "" }, searchtype: { type: String, default: "" }, show: { type: String, default: "" }, floorplanresultsurl: { type: String, default: "" }, displayoptions: { type: Array, default: function () { return [] } }, showheader: { type: [Boolean,Number], default: true }, showresultcount: { type: [Boolean,Number], default: true }, defaultselectedview: { type: String, default: "" }, selectedview: { type: String, default: "grid" }, searchconfig:{ type: Array, default: function(){ return [] } }, keywordsearchconfig:{ type: Array, default: function(){ return [] } } }, data: function(){ return { } }, methods: { getUniqueSessionDays: function(key){ if(key == undefined) { var key = 'session'; } var dayArray = []; var dayStruct = {}; if ("searchresults" in this && "results" in this.searchresults && key in this.searchresults.results){ for (var i = 0; i < this.searchresults.results[key].hit.length; i++){ var currentDate = this.searchresults.results[key].hit[i].scheduledate; dayStruct[currentDate] = true; } } dayArray = Object.keys(dayStruct); return dayArray; }, isSelected: function(selectedview){ return (this.selectedview == selectedview); }, switchDisplay: function(selectedview){ this.selectedview = selectedview; }, 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; }, getSearchConfigByType: function(type){ var returnConfig = {}; for (var i = 0; i < this.searchconfig.length; i++){ if (this.searchconfig[i].element === type){ returnConfig = this.searchconfig[i]; break; } } return returnConfig; } }, computed:{ sectionheaderdisplay: function(){ var returntext = (this.content.displayResultHeader) ? this.content.displayResultHeader: ""; if (this.searchtype == "keyword" || this.searchtype == "sessionkeyword"){ for (var i = 0; i < this.keywordsearchconfig.length; i++){ if (this.keywordsearchconfig[i].section == this.resultsection){ returntext = this.keywordsearchconfig[i].display; break; } } } else { for (var i = 0; i < this.searchconfig.length; i++){ if (this.searchconfig[i].element == this.resultsection){ returntext = this.searchconfig[i].display; } } } return returntext; }, activedisplayoptions:function(){ return this.displayoptions; }, defaultdisplayoption: function(){ var defaultVal = "grid"; if (this.activedisplayoptions.length == 1){ defaultVal = this.activedisplayoptions[0].name; } else { for (var i = 0; i < this.activedisplayoptions.length; i++){ if (this.activedisplayoptions[i].default) { defaultVal = this.activedisplayoptions[i].name; break; } } } return defaultVal; } } }; </script> <script type="text/x-template" id="requireplanner-search-results-template"> <section class="results-section_wrapper" v-bind:id="sectionid"> <div class="result-heading mb0 pb4"> <h2 class="db dib-l f3 ma0 mb3 mb0-l normal" v-if="Object.keys(searchresults.results).length > 1 && searchresults.results[resultsection].found > 0"> <span class="ttu">{{content.displayResultHeader}}</span> <span class="f5 mr3 muted normal" v-if="(showresultcount == true || showresultcount == 1) && !hideallresults"> ( <span v-if="searchresults.results[resultsection].hit.length < searchresults.results[resultsection].found"> {{searchresults.results[resultsection].hit.length}} {{content.of}} </span> {{searchresults.results[resultsection].found}} ) </span> </h2> </div> <div> <em> Create or Log in to <a v-bind:href="path2approot + '/login/login.cfm?redirect_to=' + customURIEncode(displaySearchURL(searchtype, searchtext, show))">{{content.requirePlannerText}}</a> to view these results </em> </div> </section></script> <script> var requireplannerSearchResults = Vue.component('requireplanner-search-results', { data: function(){ return { compincludepath: "includes/vue/search/requireplanner-search-results-display.cfm", contentIncludePath: ("includes/vue/search/-search-results-display.cfm").replace("-search", this.$vnode.key+"-search"), sectionid: this.$vnode.key+"-results", hideallresults: Vue.MYS.settingsConfig.searchsettings.hideallresults // startindex: 0 // used for staggered transition }; }, props: ["searchresults", "searchconfig", "searchsize","showresultcount", "show", "searchtype", "searchtext"], template:"#requireplanner-search-results-template", computed: { content: function() { return { displayResultHeader: this.displaycontent(this.contentIncludePath, 'displayResultHeader'), requirePlannerText: this.displaycontent(this.compincludepath, 'requirePlannerText'), of: this.displaycontent(this.compincludepath, 'of') }; }, resultsection: function() { return this.$vnode.key; } } }); </script> <script type="text/x-template" id="loading-results-template"> <div>{{content.loadingText}}.</div></script> <script> var LoadingDisplay = Vue.component('loading-display', { data: function(){ return { compincludepath: "includes/vue/generic/loading-display.cfm" } }, props: [], template:"#loading-results-template", methods: { }, computed:{ content: function(){ return { loadingText: this.displaycontent(this.compincludepath, 'loadingText') }; } } }); </script> <script type="text/x-template" id="search-results-summary-template"> <div class="results-match-tally_wrapper" ref="resultsTallyBox"> <div class="results-match-tally" v-bind:class="{ 'is-fixed': isFixed }" v-if="getDisplayArray().length > 1"> <fieldset id="filterByTrack" class="bn mb4 pa0 mb0-last"> <ul class="ma0 list text" v-if="hasresults && !searching "> <li class="mb0 w-100" v-for="(ksc,index) in getDisplayArray()" v-if="(ksc.count > 0)"> <a class="color-inherit link pa1 underline-hover" v-on:click="logStats(ksc.searchsection,ksc.count)" v-bind:href="ksc.section + '-results'" v-bind:id="ksc.section" v-scroll-to="'#' + ksc.section + '-results'" v-bind:class="{'is-selected': scrolledToSection == ksc.section, 'parent': ksc.parent, 'b': ksc.parent, 'ml0': ksc.parent, 'lastchild': (ksc.parent == false && getDisplayArray()[index+1] && getDisplayArray()[index+1].parent == true || ksc.parent == true && getDisplayArray()[index+1] && getDisplayArray()[index+1].parent == true) || ksc.parent == true && index == getDisplayArray().length-1 }"> <span v-html="ksc.label"></span> <span v-if="(showresultcount == true || showresultcount == 1) && !hideallresults" v-html="ksc.countdisplay"></span> </a> </li> </ul> </fieldset> <transition name="fade"> <loading-display v-if="searching"></loading-display> </transition> </div> </div></script> <script> var SearchResultsSummaryDisplay = Vue.component('search-results-summary-display', { mixins: [fixElementMixin, scrollHighlightMixin, searchDisplayMixin], data: function(){ return { compincludepath: "includes/vue/search/search-results-summary-display.cfm", isFixed: false, scrolledToSection: '', hideallresults: Vue.MYS.settingsConfig.searchsettings.hideallresults, hidesessiontimes: Vue.MYS.settingsConfig.searchsettings.hidesessiontimes } }, props: ["searchresults", "searchconfig", "keywordsearchconfig", "recommendedexhibitors", "recommendedsearches", "showresultcount", "show", "searching", "searchtype", "searchtext", "searchMainContentHeight", "showadvancedsearch"], template:"#search-results-summary-template", methods: { logStats: function(section, countdisplay){ var vObj = this; var searchtype = vObj.searchtype; var searchtext = vObj.searchtext; var searchcount = countdisplay; vObj.ajaxGet(vObj.path2approot + '/ajax/remote-proxy.cfm?&action=misc&function=searchstats&styp=' + section + '&stext=' + searchtext + '&c=' + searchcount, // ajaxGet() defined in _global-mixin function(response){ // success vObj.loading = false; }, function(response){ // error }); // end ajaxGet }, shouldShow: function(section){ if ((this.show == section) || (this.show == "all")) { return true; } else { return false; } }, getDisplayArray: function(){ var returnArray = [] , indent = "" , conf , searchnames = {}; if (this.searchtype == "keyword" || this.searchtype == "sessionkeyword"){ for (var i = 0; i < this.keywordsearchconfig.length; i++){ var ksc = this.keywordsearchconfig[i]; if (searchnames[ksc.section]){ continue; } else{ searchnames[ksc.section] = true; } // need to inject recommended searches at the right point /*if ((i == 0) && (this.recommendedsearches.results.length > 0)){ returnArray.push({ parent: true, label: this.content["relatedsearchesheader"], count: this.recommendedsearches.results.length, countdisplay: "", section: "recommendedsearches" }); }*/ if (ksc.section in this.searchresults.results && "found" in this.searchresults.results[ksc.section] && this.searchresults.results[ksc.section].found > 0) { var label, count, countdisplay, section, featuredCount = 0; if (ksc.section == "exhibitor"){ // want to push featured right below total exhibitor count returnArray.push({ parent: true, label: ksc.display, count: this.searchresults.results[ksc.section].found + this.recommendedExhibitorsCount, countdisplay: "", section: "allexhibitors", searchsection: ksc.section }); if ('featured' in this.searchresults.results) { returnArray.push({ parent: false, label: indent + this.content["featuredexhibitorsheader"], count: this.searchresults.results["featured"].found, countdisplay: this.searchresults.results["featured"].found, section: "featured", searchsection: ksc.section }); featuredCount = this.searchresults.results["featured"].found; } returnArray.push({ parent: false, label: indent + this.content["allexhibitorsheader"], count: this.searchresults.results[ksc.section].found, countdisplay: this.searchresults.results[ksc.section].found, section: ksc.section, searchsection: ksc.section }); returnArray.push({ parent: false, label: indent + this.content["recommendedexhibitorsheader"], count: this.recommendedexhibitors.results.length, countdisplay: this.recommendedExhibitorsCount, section: "recommended", searchsection: ksc.section }); } else if (ksc.section == "category"){ returnArray.push({ parent: true, label: ksc.display, count: this.searchresults.results[ksc.section].found, countdisplay: this.searchresults.results[ksc.section].found, section: ksc.section, searchsection: ksc.section }); } else if (ksc.section == "session"){ returnArray.push({ parent: true, label: ksc.display, count: this.searchresults.results[ksc.section].found, countdisplay: this.searchresults.results[ksc.section].found, section: ksc.section, searchsection: ksc.section }); // now get the unique days if(!this.hidesessiontimes) { var uniqueDays = this.getUniqueSessionDays('session'); var hasOnDemand = false; for (var ud = 0; ud < uniqueDays.length; ud++) { var tempdate = this.toDate(uniqueDays[ud]); var displaydate = this.formatSessionDay(tempdate)+ ", " + this.formatSessionMonth(tempdate) + " " + tempdate.getDate(); if (this.toDate(tempdate).getFullYear() > 2000 ) { var labeltext = displaydate; } else { if (hasOnDemand) continue; var labeltext = this.content["onDemandLabel"]; hasOnDemand = true; } returnArray.push({ parent: false, label: labeltext, count: this.searchresults.results[ksc.section].found, countdisplay: "", section: "dateheader" + ud, searchsection: ksc.section }); } } } else { returnArray.push({ parent: true, label: ksc.display, count: this.searchresults.results[ksc.section].found, countdisplay: this.searchresults.results[ksc.section].found, section: ksc.section, searchsection: ksc.section }); } } } // end for } // if theres's session results and they are the only set of results... typically for quickilst else if ("session" in this.searchresults.results && Object.keys(this.searchresults.results).length == 1){ returnArray.push({ parent: true, label: this.content["sessionsheader"], count: this.searchresults.results["session"].found, countdisplay: this.searchresults.results["session"].found, section: currentelement, searchsection: "session" }); // now get the unique days if(!this.hidesessiontimes) { var uniqueDays = this.getUniqueSessionDays('session'); var hasOnDemand = false; for (var ud = 0; ud < uniqueDays.length; ud++){ var tempdate = this.toDate(uniqueDays[ud]); var displaydate = this.formatSessionDay(tempdate)+ ", " + this.formatSessionMonth(tempdate) + " " + tempdate.getDate(); if (this.toDate(tempdate).getFullYear() > 2000 ) { var labeltext = displaydate; } else { if (hasOnDemand) continue; var labeltext = this.content["onDemandLabel"]; hasOnDemand = true; } returnArray.push({ parent: false, label: labeltext, count: this.searchresults.results["session"].found, countdisplay: "", section: "dateheader" + ud, searchsection: "session" }); } } } // if no exhibitor search is set up but there's exhibitor results then just display that else if (("exhibitor" in this.searchresults.results && Object.keys(this.searchresults.results).length == 1) || ("exhibitor" in this.searchresults.results && "featured" in this.searchresults.results && Object.keys(this.searchresults.results).length == 2)){ returnArray.push({ parent: true, label: this.content["exhibitorsheader"], count: this.searchresults.results["exhibitor"].found, countdisplay: "", section: "allexhibitors", searchsection: "exhibitor" }); if ('featured' in this.searchresults.results) { returnArray.push({ parent: false, label: indent + this.content["featuredexhibitorsheader"], count: this.searchresults.results["featured"].found, countdisplay: this.searchresults.results["featured"].found, section: "featured", searchsection: "exhibitor" }); featuredCount = this.searchresults.results["featured"].found; } returnArray.push({ parent: false, label: indent + this.content["allexhibitorsheader"], count: this.searchresults.results["exhibitor"].found, countdisplay: this.searchresults.results["exhibitor"].found, section: "exhibitor", searchsection: "exhibitor" }); } else { var displayedExhibitorSection = false; for (var i = 0; i < this.searchconfig.length; i++){ if (this.searchconfig[i].element.startsWith("exhibitor") && "exhibitor" in this.searchresults.results && !displayedExhibitorSection){ var exhibitordisplay = this.searchconfig[i].display; returnArray.push({ parent: true, label: exhibitordisplay, count: this.searchresults.results["exhibitor"].found, countdisplay: "", section: "allexhibitors", searchsection: this.searchconfig[i].element }); if ('featured' in this.searchresults.results) { returnArray.push({ parent: false, label: indent + this.content["featuredexhibitorsheader"], count: this.searchresults.results["featured"].found, countdisplay: this.searchresults.results["featured"].found, section: "featured", searchsection: this.searchconfig[i].element }); featuredCount = this.searchresults.results["featured"].found; } returnArray.push({ parent: false, label: indent + this.content["allexhibitorsheader"], count: this.searchresults.results["exhibitor"].found, countdisplay: this.searchresults.results["exhibitor"].found, section: "exhibitor", searchsection: this.searchconfig[i].element }); displayedExhibitorSection = true; } else { var currentelement = this.searchconfig[i].element; if (currentelement == "sessionsearch"){ currentelement = "session"; } if (currentelement in this.searchresults.results) { returnArray.push({ parent: true, label: this.content.sessionsheader, count: this.searchresults.results[currentelement].found, countdisplay: this.searchresults.results[currentelement].found, section: currentelement, searchsection: currentelement }); if (currentelement == "session"){ // now get the unique days if(!this.hidesessiontimes) { var uniqueDays = this.getUniqueSessionDays('session'); for (var ud = 0; ud < uniqueDays.length; ud++){ var tempdate = this.toDate(uniqueDays[ud]); var displaydate = this.formatSessionDay(tempdate)+ ", " + this.formatSessionMonth(tempdate) + " " + tempdate.getDate(); returnArray.push({ parent: false, label: displaydate, count: this.searchresults.results[currentelement].found, countdisplay: "", section: "dateheader" + ud, searchsection: currentelement }); } } } } } } // end for } // end else return returnArray; } }, mounted: function(){ var vObj = this; vObj.$nextTick(function(){ if (vObj.$refs.resultsTallyBox) { vObj.fixElementOnScrollTrackObserver('.search-main', '.l-nav'); vObj.highlightSectionsOnScrollObserver('.results-match-tally li a', '.results-section_wrapper'); } }); }, watch: { showadvancedsearch: function(){ var vObj = this; vObj.$nextTick(function(){ if (vObj.$refs.resultsTallyBox) { vObj.destroyScrollObserver(); vObj.fixElementOnScrollTrackObserver('.search-main', '.l-nav'); vObj.highlightSectionsOnScrollObserver('.results-match-tally li a', '.results-section_wrapper'); } }); } }, computed: { content: function(){ return { loadingoptionstext: this.displaycontent(this.compincludepath, 'loadingoptionstext'), allexhibitorsheader: this.displaycontent(this.compincludepath, 'allexhibitorsheader'), exhibitorsheader: this.displaycontent(this.compincludepath, 'exhibitorsheader'), featuredexhibitorsheader: this.displaycontent(this.compincludepath, 'featuredexhibitorsheader'), relatedsearchesheader: this.displaycontent(this.compincludepath, 'relatedsearchesheader'), recommendedexhibitorsheader: this.displaycontent(this.compincludepath, 'recommendedexhibitorsheader'), sessionsheader: this.displaycontent(this.compincludepath, 'recommendedexhibitorsheader'), onDemandLabel: this.displaycontent(this.compincludepath, 'onDemandLabel') }; }, hasresults: function(){ return (this.searchresults.totalhits > 0); }, recommendedExhibitorsCount: function(){ var count = 0; for (var i = 0; i < this.recommendedexhibitors.results.length; i++){ if (Object.keys(this.recommendedexhibitors.results[i].MYS).length !== 0){ count++; } } return count; }, totalhits: function(){ var value = 0; if (!isNaN(this.searchresults.totalhits)) { value += this.searchresults.totalhits; } if (!isNaN(this.recommendedexhibitors.results.length)){ value += this.recommendedexhibitors.results.length; } if (isNaN(value)){ return "..."; } else { return value; } } } }); </script> <script type="text/x-template" id="exhibitor-result-tr-template"> <tr class="js-List justify-between" v-if="$mq != 'large'"> <td class="is-hidden_small" v-if="intersected"> <span> <div v-if="logo !== '' && bitToBool(exhadvind) && iscrossref != 1" class="mr3 pa2 flex-Thumb thumb-Border"> <a v-bind:href="exhURL()"> <v-lazy-image v-bind:src="logo" v-bind:alt=exhname v-bind:title=exhname class="mw-100" v-bind:src-placeholder="placeholderimg" onerror="this.onerror=null;this.src='/8_0/assets/imgs/1x1.gif';" /> </a> </div> <div v-else>&nbsp;</div> </span> </td> <td v-if="intersected && brand"> {{brand}} </td> <td v-if="intersected && tradename"> {{tradename}} </td> <td v-if="intersected" > <h3 class="card-Title break-word dib f5 ma0"> <a class="bb-0 color-inherit" v-bind:href="exhURL()"> <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> </td> <td v-if="intersected" class="is-hidden_small card-Desc f6"> <span v-if="iscrossref != 1">{{ summary }}</span> <span v-else>&nbsp;</span> </td> <td v-if="intersected && showbooths" class="card-Subtitle"> <span class="card-Subtitle muted" v-if="booths && booths.length > 0 && iscrossref != 1"> <span v-for="i in numOfBoothsToShow"> <a v-if="floorplanactive && validHalls.includes(hallids[i-1])" class="bb-0 color-inherit f6 pointer" 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" class="bb-0 color-inherit f6">, </span></span> </span> <span v-if="booths.length > numOfBoothsToShow" class="bb-0 color-inherit f6"> + {{booths.length - numOfBoothsToShow}} more </span> </span> </td> <td class="tc" v-if="intersected && hasexhicons"> <span v-for="tag in tags" :class="tag.color + ' br1 dark-gray dib f7 normal mb2 mr1 pa2 pt1 pb1'">{{tag.display}}</span> <img class="ml2 mr2 mw4 mw-100" v-for="icon in icons" :src="getIconUrl(icon)" :title="icon.title" :alt="icon.title" v-if="iscrossref != 1" /> </td> <td v-if="intersected" class="centered pointer tc w-15" > <toggle-favorite :type="'exhibitor'" v-bind:keys="exhid" v-bind:addedtoplanner="addedtoplanner"> </toggle-favorite> </td> <td class="is-hidden_small" v-if="!intersected">&nbsp;</td> <td v-if="!intersected && brand">brand</td> <td v-if="!intersected && tradename">tradename</td> <td v-if="!intersected" style="height: 150px; "> <a v-bind:href="exhURL()">{{exhname}}</a> </td> <td v-if="!intersected" class="is-hidden_small card-Desc f6">{{ summary }}</td> <td v-if="!intersected && showbooths" class="card-Subtitle">&nbsp;</td> <td class="tc" v-if="!intersected && hasexhicons">&nbsp;</td> <td v-if="!intersected" class="centered pointer tc w-15">&nbsp;</td> </tr></script> <script> var ExhibitorResultTr = Vue.component('exhibitor-result-tr', { template:"#exhibitor-result-tr-template", props: ["exhid", "exhname", "booths", "hallids", "description", "logo", "boothsdisplay", "slotted", "addedtoplanner", "tradename", "brand", "icons", "tags", "exhadvind", "iscrossref", "crossrefname"], data: function(){ return { compincludepath: "includes/vue/generic/exhibitor-result-tr.cfm", menuvisible: false, toggleVisible: false, intersected: false, validHalls: Vue.MYS.validHalls, observer: null, subShowVersion: Vue.MYS.useExhSubVersion3 } }, computed: { content: function(){ return { seeText: this.displaycontent(this.compincludepath, 'seeText') }; }, boothlist: function(){ if (this.booths){ return this.booths.join(", "); } else { return ""; } }, getIconUrl: function() { return function(icon) { if (this.subShowVersion) { return this.getServerlessImageURL(icon.iconfile); } else { return icon.iconfile; } }; }, summary: function(){ return this.createSummary(this.description,200) }, 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: { toggleMenu: function(){ this.menuvisible = !this.menuvisible; }, exhURL: function(exhid){ return this.getExhibitorURL(this.exhid, this.exhname); }, boothURL: function(booth) { return (this.path2approot + "/floorplan_link.cfm?exhid=" + this.exhid + "&booth=" + (booth+'').replace('randomstring', '') + "&show_id=" + this.showid); }, displayBooths: function(boothArray){ return boothArray.join(", "); }, getServerlessImageURL: function(iconfile) { const bucket = 'mys-showfiles'; const environment = Vue.MYS.environment; const showid = this.showidlowercase; const s3key = `${environment}/${showid}/exhicons/${iconfile}`; return Vue.MYS.getServerlessURL(bucket, s3key, null, 56, 'cover'); }, displayTradenames: function(tn){ if (tn.constructor !== Array){ return tn; } else { if (tn.length > 2){ return tn[0] + ", " + tn[1] + " + " + (tn.length - 2) + " more"; } else { return tn.join(", "); } } } } }); </script> <script> var printMixin = { data: function(){ return {} }, methods: { idsIsPrinting: function(){ return window.idsIsPrinting; } } }; </script> <script type="text/x-template" id="exhibitor-result-list-template"> <li class="js-Card card ba0 br0 db pa3" v-on:click.capture="goToURL(exhURL());"> <div v-if="intersected || idsIsPrinting"> <div class="card-Details"> <div v-if="logo !== '' && bitToBool(exhadvind)" class="flex-Thumb thumb-Border mr3 pa2"> <a v-bind:href="exhURL()"> <v-lazy-image v-bind:src="logo" v-bind:alt=exhname v-bind:title=exhname style="max-width: 65px;" /> </a> </div> <div v-if="logo == '' || !bitToBool(exhadvind)" class="mr3 pa2" style="width: 82px;"> &nbsp; </div> <div class="flex-Title mb0 mr3"> <h3 class="card-Title break-word f3 mb1 mt0" v-if="(tradename || brand)"> <span v-if="tradename">{{tradename}}</span> <span v-if="brand">{{brand}}</span> <span class="db f4 normal mb3"> <a class="muted" v-bind:href="exhURL()"> {{exhname}} <span v-if="iscrossref && crossrefname">({{content.seeText}}: {{crossrefname}})</span> </a> </span> </h3> <h3 class="card-Title break-word f3 mb1 mt0" v-if="!(tradename || brand)"> <a v-bind:href="exhURL()">{{exhname}}</a> </h3> <template v-if="booths && booths.length > 0"> <span v-for="i in numOfBoothsToShow" v-if="showbooths && iscrossref != 1" class="muted"> <a v-if="floorplanactive && validHalls.includes(hallids[i-1])" class="bb-0 color-inherit f6 pointer" 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" class="bb-0 color-inherit f6">, </span></span> </span> <span v-if="booths.length > numOfBoothsToShow" class="bb-0 color-inherit f6"> + {{booths.length - numOfBoothsToShow}} more </span> </template> </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 v-if="icons && icons.length > 0 && iscrossref != 1" class="mt4" style="margin-left: 82px;"> <span v-for="tag in tags" :class="tag.color + ' br1 dark-gray dib f7 normal mb2 mr1 pa2 pt1 pb1'">{{tag.display}}</span> <img class="mb2 mw4 mw-100" v-for="icon in icons" :src="getIconUrl(icon)" :title="icon.title" :alt="icon.title" /> </div> <slot></slot> </div> <a v-if="!intersected" v-bind:href="exhURL()">{{exhname}}</a> </li></script> <script> var ExhibitorResultList = Vue.component('exhibitor-result-list', { template:"#exhibitor-result-list-template", props: ["exhid", "exhname", "booths", "hallids", "description", "logo", "boothsdisplay", "slotted", "addedtoplanner", "tradename", "brand", "icons", "tags", "exhadvind", "iscrossref", "crossrefname"], mixins: [printMixin], data: function(){ return { compincludepath: "includes/vue/generic/exhibitor-result-list.cfm", menuvisible: false, toggleVisible: false, intersected: false, validHalls: Vue.MYS.validHalls, observer: null, subShowVersion: Vue.MYS.useExhSubVersion3 } }, computed: { content: function(){ return { seeText: this.displaycontent(this.compincludepath, 'seeText') }; }, boothlist: function(){ if (this.booths){ return this.booths.join(", "); } else { return ""; } }, getIconUrl: function() { return function(icon) { if (this.subShowVersion) { return this.getServerlessImageURL(icon.iconfile); } else { return icon.iconfile; } }; }, summary: function(){ return this.createSummary(this.description,200) }, 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: { toggleMenu: function(){ this.menuvisible = !this.menuvisible; }, exhURL: function(){ return this.getExhibitorURL(this.exhid, this.exhname); }, getServerlessImageURL: function(iconfile) { const bucket = 'mys-showfiles'; const environment = Vue.MYS.environment; const showid = this.showidlowercase; const s3key = `${environment}/${showid}/exhicons/${iconfile}`; return Vue.MYS.getServerlessURL(bucket, s3key, null, 56, 'cover'); }, boothURL: function(booth){ return (this.path2approot + "/floorplan_link.cfm?exhid=" + this.exhid + "&booth=" + (booth+'').replace('randomstring', '') + "&show_id=" + this.showid); }, displayBooths: function(boothArray){ return boothArray.join(", "); }, displayTradenames: function(tn){ if (tn.constructor !== Array){ return tn; } else { if (tn.length > 2){ return tn[0] + ", " + tn[1] + " + " + (tn.length - 2) + " more"; } else { return tn.join(", "); } } } } }); </script> <script type="text/x-template" id="exhibitor-search-results-template"> <section class="results-section_wrapper" v-bind:id="sectionid"> <div class="result-heading mb0 pb4"> <h2 class="db dib-l f3 ma0 mb3 mb0-l normal" v-if="Object.keys(searchresults.results).length > 1 && searchresults.results[resultsection].found > 0"> <span class="ttu">{{getDisplayHeader()}}</span> <span class="f5 mr3 muted normal" v-if="(showresultcount == true || showresultcount == 1) && !hideallresults"> ( <span v-if="searchresults.results[resultsection].hit.length < searchresults.results[resultsection].found"> {{searchresults.results[resultsection].hit.length}} {{content.of}} </span> {{searchresults.results[resultsection].found}} ) </span> </h2> <span v-if="searchresults.results[resultsection].hit.length < searchresults.results[resultsection].found"> <a class="btn-tertiary btn-tertiary_small" v-on:click="scrollToTop(); $emit('view-all-results', resultsection);" > <span v-if="resultsection != 'featured'">{{content.viewAllButton}}</span> <span v-if="resultsection == 'featured'">{{content.viewAllFeaturedButton}}</span> </a> </span> <span v-if="shouldshowfloorplanbutton"> <a class="btn-tertiary btn-tertiary_small" v-bind:href="floorplanresultsurl" v-on:click="scrollToTop();"> <span>{{content.viewOnFloorplan}}</span> </a> </span> </div> <div class="flex items-center mb5 flex-wrap" v-if="hasbanner && resultsection == 'featured'"> <a class="bb-0 mb2 mr2" v-bind:href="exhURL(selectedbanner.exhid, selectedbanner.exhname)" v-if="selectedbanner.mediafile && selectedbanner.exhid" v-on:click="logBannerClick()"> <v-lazy-image v-bind:src="displayBannerURL(selectedbanner.mediafile)" v-bind:srcset="displayBannerURL(encodeURIComponent(selectedbanner.mediafile)) + ', ' + displayBannerURL(encodeURIComponent(selectedbanner.mediafile2x))" :alt="selectedbanner.exhname + '-' + selectedbanner.categorydisplay + ' Sponsor'" :srcplaceholder="path2approot + '/assets/imgs/grey.gif'" v-on:intersect="logBannerView()"/> </a> <v-lazy-image v-if="selectedbanner.mediafile && !selectedbanner.exhid" v-bind:src="displayBannerURL(selectedbanner.mediafile)" v-bind:srcset="displayBannerURL(encodeURIComponent(selectedbanner.mediafile)) + ', ' + displayBannerURL(encodeURIComponent(selectedbanner.mediafile2x))" :alt="selectedbanner.exhname + '-' + selectedbanner.categorydisplay + ' Sponsor'" :srcplaceholder="path2approot + '/assets/imgs/grey.gif'" v-on:intersect="logBannerView()" /> <div v-if="selectedbanner.exhname && selectedbanner.categorydisplay"> <p class="f5 muted"><em>{{selectedbanner.exhname}} &mdash; {{selectedbanner.categorydisplay}} Sponsor</em></p> </div> </div> <transition-group name="staggered-fade" appear tag="ul" class="cards" v-bind:class="ulclass" v-if="selectedview == 'grid'" v-bind:css="false" v-on:before-enter="beforeEnterStaggered" v-on:enter="enterStaggered" v-on:leave="leaveStaggered" v-on:enter-cancelled="enterCancelled"> <component v-for="(result, index) in searchresults.results[resultsection].hit" v-bind:is="getCardTypeDisplay(result.fields.exhfeatured_t)" v-bind:data-index="index - startindex" v-bind:data-totalitemcount="searchresults.results[resultsection].hit.length" v-bind:data-searchsize="searchsize" :key="'exhcard'+ index" v-bind:exhid="result.fields.exhid_l" v-bind:exhname="result.fields.exhname_t" v-bind:description="result.fields.exhdesc_t" v-bind:slotted="result.fields.exhslotted_t" v-bind:booths="result.fields.booths_la" v-bind:boothsdisplay="result.fields.boothsdisplay_la" v-bind:hallids="result.fields.hallid_la" v-bind:exhadvind="result.fields.exhadvind_t" v-bind:logo="displayLogoURL(result.fields.exhlogo_t)" v-bind:addedtoplanner="result.fields.MYS.addedtoplanner" v-bind:icons="getExhibitorIconArray(result.fields.exhicons_l)" v-bind:tags="getExhibitorTagsArray(result.fields.exhtags_la)" v-bind:iscrossref="result.fields.iscrossref_l" v-bind:crossrefname="result.fields.MYS.crossrefname_t" > </component> </transition-group> <div class="results-list-view toggle-list-view" v-if="selectedview == 'list' && $mq != 'medium' && $mq != 'large'"> <table class="results-table word-wrap" cellpadding="0" cellspacing="0"> <thead> <th class="tl" style="min-width: 125px;"></th> <th class="tl" style="min-width: 300px;">{{content.tableHeadExhibitor}}</th> <th class="tl">{{content.tableHeadSummary}}</th> <th class="tl" style="min-width: 175px;" v-if="showbooths">{{content.tableHeadBooth}}</th> <th class="centered tc" style="min-width: 175px;" v-if="hasexhicons"> {{content.tableHeadLegend}} <span :title="tippyTitle" v-tippy="{theme : 'light'}"> <a class="bb-0"> <svg width="20" height="20" xmlns="http://www.w3.org/2000/svg" class="v-mid ml1" role="img" aria-hidden="true"> <path v-bind:d="legendicon" fill-rule="nonzero" fill="#969696"></path> </svg> </a> </span> </th> <th class="centered tc" style="min-width: 90px;"><span v-if="hasmyshow">{{content.tableHeadPlanner}}</span></th> </thead> <transition-group name="staggered-fade2" appear tag="tbody" v-bind:css="false" v-on:before-enter="beforeEnterStaggered" v-on:enter="enterStaggered" v-on:leave="leaveStaggered" v-on:enter-cancelled="enterCancelled"> <exhibitor-result-tr v-for="(result, index) in searchresults.results[resultsection].hit" v-bind:data-index="index - startindex" v-bind:data-totalitemcount="searchresults.results[resultsection].hit.length" v-bind:data-searchsize="searchsize" v-bind:key="'exhtr-'+index" v-bind:exhid="result.fields.exhid_l" v-bind:exhname="result.fields.exhname_t" v-bind:description="result.fields.exhdesc_t" v-bind:slotted="result.fields.exhslotted_t" v-bind:booths="result.fields.booths_la" v-bind:hallids="result.fields.hallid_la" v-bind:exhadvind="result.fields.exhadvind_t" v-bind:boothsdisplay="result.fields.boothsdisplay_la" v-bind:logo="displayLogoURL(result.fields.exhlogo_t)" v-bind:addedtoplanner="result.fields.MYS.addedtoplanner" v-bind:icons="getExhibitorIconArray(result.fields.exhicons_l)" v-bind:tags="getExhibitorTagsArray(result.fields.exhtags_la)" v-bind:iscrossref="result.fields.iscrossref_l" v-bind:crossrefname="result.fields.MYS.crossrefname_t"> </exhibitor-result-tr> </transition-group> </table> </div> <div class="results-list-view toggle-list-view" v-if="selectedview == 'list' && ($mq == 'large' || $mq == 'medium')"> <transition-group name="staggered-fade2" appear tag="ul" v-bind:css="false" v-on:before-enter="beforeEnterStaggered" v-on:enter="enterStaggered" v-on:leave="leaveStaggered" v-on:enter-cancelled="enterCancelled"> <exhibitor-result-list v-for="(result, index) in searchresults.results[resultsection].hit" v-bind:data-index="startindex - index" v-bind:data-totalitemcount="searchresults.results[resultsection].hit.length" v-bind:data-searchsize="searchsize" v-bind:key="'exhlist'+index" v-bind:exhid="result.fields.exhid_l" v-bind:exhname="result.fields.exhname_t" v-bind:description="result.fields.exhdesc_t" v-bind:slotted="result.fields.exhslotted_t" v-bind:booths="result.fields.booths_la" v-bind:hallids="result.fields.hallid_la" v-bind:exhadvind="result.fields.exhadvind_t" v-bind:boothsdisplay="result.fields.boothsdisplay_la" v-bind:logo="displayLogoURL(result.fields.exhlogo_t)" v-bind:addedtoplanner="result.fields.MYS.addedtoplanner" v-bind:icons="getExhibitorIconArray(result.fields.exhicons_l)" v-bind:tags="getExhibitorTagsArray(result.fields.exhtags_la)" v-bind:iscrossref="result.fields.iscrossref_l" v-bind:crossrefname="result.fields.MYS.crossrefname_t"> </exhibitor-result-list> </transition-group> </div> <div class="o-BorderBehind pa0 pt3 pb3 tc" v-if="searchresults.results[resultsection].hit.length < searchresults.results[resultsection].found"> <span><a class="btn-secondary" v-on:click.stop.prevent="loadMore()">{{content.loadMoreResults}}</a></span> </div> </section></script> <script> var ExhibitorSearchResults = Vue.component('exhibitor-search-results', { data: function(){ return { compincludepath: "includes/vue/search/exhibitor-search-results-display.cfm", sectionid: "exhibitor-results", displaycardtype: "exhibitor-result-card", ulclass: "exh-basic", viewallsection: "exhibitor", startindex: 0, // used for staggered transition legendicon: "M10 0C4.478 0 0 4.477 0 10s4.478 10 10 10c5.523 0 10-4.477 10-10S15.523 0 10 0zm0 15.208a1.042 1.042 0 1 1 0-2.084 1.042 1.042 0 0 1 0 2.084zm1.634-4.94c-.753.813-.789 1.262-.779 1.815h-1.67c-.007-1.229.016-1.77 1.192-2.89.477-.453.854-.812.801-1.517-.048-.671-.608-1.022-1.137-1.022-.591 0-1.282.44-1.282 1.678H7.084c0-2 1.174-3.292 2.992-3.292.863 0 1.618.282 2.125.796.475.481.72 1.143.711 1.915-.013 1.152-.714 1.909-1.278 2.517z", hideallresults: Vue.MYS.settingsConfig.searchsettings.hideallresults, subShowVersion: Vue.MYS.useExhSubVersion3 } }, mixins: [staggeredTransitionsMixin, searchDisplayMixin], props: ["searchresults", "searchconfig", "searchsize"], template:"#exhibitor-search-results-template", methods: { loadMore: function(){ this.startindex = this.searchresults.results[this.resultsection].hit.length; this.$emit('load-more-results', this.resultsection); }, displayBooths: function(boothArray){ return boothArray.join(", "); }, getCardTypeDisplay: function(featured){ if (featured){ return "featured-result-card"; } else { return "exhibitor-result-card"; } }, exhURL: function(exhid, exhname) { if (this.selectedbanner.bannerhref == "internal"){ return this.getExhibitorURL(exhid, exhname); } else { return this.selectedbanner.bannerhref; } }, getServerlessImageURL: function(iconfile) { const bucket = 'mys-showfiles'; const environment = Vue.MYS.environment; const showid = this.showidlowercase; const s3key = `${environment}/${showid}/exhicons/${iconfile}`; return Vue.MYS.getServerlessURL(bucket, s3key, null, 56, 'cover'); }, logBannerView: function(){ this.logStats("Banner View", "" , this.searchresults.results.banner.categoryid, this.searchresults.results.banner.bannerid ); }, logBannerClick: function(){ this.logStats("Banner Click", "" , this.searchresults.results.banner.categoryid, this.searchresults.results.banner.bannerid ); }, getDisplayHeader: function() { if(this.$attrs.displayheader && this.$attrs.displayheader.length) { return this.$attrs.displayheader; } else { return this.content.displayResultHeader; } }, getExhibitorIconArray: function(json){ var returnArray = []; try { if (json.startsWith('"') && json.endsWith('"')){ json = json.substring(1, json.length-1); } returnArray = JSON.parse(json); } catch(err){/* do nothing */} return returnArray; }, getExhibitorTagsArray: function(tagArray){ var returnArray = []; if (tagArray && tagArray.constructor === Array){ for (var i = 0; i < tagArray.length; i++){ var currentColor = 'bg-light-silver'; for (var j = 0; j < Vue.MYS.exhibitorTags.length; j++){ if (tagArray[i] === Vue.MYS.exhibitorTags[j].title){ currentColor = Vue.MYS.exhibitorTags[j].color; } } returnArray.push({display: tagArray[i], color: currentColor }); } } return returnArray; } }, computed: { content: function(){ return { displayResultHeader: this.displaycontent(this.compincludepath, 'displayResultHeader'), viewAllButton: this.displaycontent(this.compincludepath, 'viewAllButton'), viewAllFeaturedButton: this.displaycontent(this.compincludepath, 'viewAllFeaturedButton'), viewOnFloorplan: this.displaycontent(this.compincludepath, 'viewOnFloorplan'), tableHeadExhibitor: this.displaycontent(this.compincludepath, 'tableHeadExhibitor'), tableHeadSummary: this.displaycontent(this.compincludepath, 'tableHeadSummary'), tableHeadBooth: this.displaycontent(this.compincludepath, 'tableHeadBooth'), tableHeadPlanner: this.displaycontent(this.compincludepath, 'tableHeadPlanner'), loadMoreResults: this.displaycontent(this.compincludepath, 'loadMoreResults'), of: this.displaycontent(this.compincludepath, 'of'), tableHeadLegend: this.displaycontent(this.compincludepath, 'tableHeadLegend') }; }, resultsection: function(){ if (this.displaycardtype == "featured-result-card"){ return "featured"; } else { return "exhibitor"; } }, selectedbanner: function(){ var returnObj = {}; if ("banner" in this.searchresults.results){ returnObj = this.searchresults.results["banner"]; // now create @2x value if (returnObj && "mediafile" in returnObj && returnObj.mediafile){ var indexOfDot = returnObj.mediafile.lastIndexOf(returnObj.mediafile); var filenameArray = returnObj.mediafile.split(/\.(?=[^\.]+$)/); if (filenameArray.length == 2){ returnObj["mediafile2x"] = filenameArray[0] + "@2x." + filenameArray[1]; } else { returnObj["mediafile2x"] = returnObj.mediafile; } } } return returnObj; }, hasbanner: function(){ return ("banner" in this.searchresults.results && "mediafile" in this.searchresults.results.banner && this.searchresults.results.banner.mediafile && this.searchresults.results.banner.exhid); }, tippyTitle: function(){ if (!this.enabled){ var divHTML = "<div class='db'>"; for (var i = 0; i < this.legendcontent.DATA.length; i++) { var tempImgSrc = this.httphost + this.legendcontent.DATA[i][1]; if (this.subShowVersion){ tempImgSrc = this.getServerlessImageURL(this.legendcontent.DATA[i][1]); } divHTML += "<div class='flex items-center mt2 mb2'>" + "<img class='mw3 mr3' src='" + tempImgSrc + "' alt='" + this.legendcontent.DATA[i][7] + "'/>" + "<div class='f6 flex-auto tl'>" + this.legendcontent.DATA[i][7] + "</div></div>"; } divHTML += "</div>"; return divHTML; } else { return ""; } }, shouldshowfloorplanbutton: function(){ var returnvalue = false; if ('isfloor' in this.getSearchConfigByType(this.searchtype) && this.getSearchConfigByType(this.searchtype).isfloor == 1 && this.floorplanresultsurl && this.showbooths && this.floorplanactive){ returnvalue = true; } // we don't have a good way of determining if something is coming from a quicklist call but need to be able to show button if necessary. So if the 'isfloor' option is in the results (a search option) then continue checkinng if the we have a valid floorplanresultsurl... we may change this at some point to take a config option into account else if (!('isfloor' in this.getSearchConfigByType(this.searchtype)) && this.floorplanresultsurl && this.showbooths && this.floorplanactive){ returnvalue = true; } return returnvalue; } } }); </script> <script> var FeaturedSearchResults = Vue.component('featured-search-results', ExhibitorSearchResults.extend({ data: function(){ return { compincludepath: "includes/vue/search/featured-search-results-display.cfm", sectionid: "featured-results", displaycardtype: "featured-result-card", ulclass: "exh-featured" } }, props: ["searchresults","searchtext", "searchtype", "searchsize"], template:"#exhibitor-search-results-template", computed: { content: function(){ return { displayResultHeader: this.displaycontent(this.compincludepath, 'displayResultHeader'), viewAllButton: this.displaycontent(this.compincludepath, 'viewAllButton'), viewAllFeaturedButton: this.displaycontent(this.compincludepath, 'viewAllFeaturedButton'), viewOnFloorplan: this.displaycontent(this.compincludepath, 'viewOnFloorplan'), tableHeadExhibitor: this.displaycontent(this.compincludepath, 'tableHeadExhibitor'), tableHeadSummary: this.displaycontent(this.compincludepath, 'tableHeadSummary'), tableHeadBooth: this.displaycontent(this.compincludepath, 'tableHeadBooth'), tableHeadPlanner: this.displaycontent(this.compincludepath, 'tableHeadPlanner'), loadMoreResults: this.displaycontent(this.compincludepath, 'loadMoreResults'), of: this.displaycontent(this.compincludepath, 'of'), tableHeadLegend: this.displaycontent(this.compincludepath, 'tableHeadLegend'), }; } } }) ); </script> <script type="text/x-template" id="category-result-card-template"> <li class="js-Card card br3 dib float pa3" v-on:click.capture="scrollToTop();goToURL(catSubSearchURL(categoryid));"> <div class="card-Details mb2"> <div class="flex-Title mb0 mr3"> <h3 class="card-Title break-word f2 mb2 mt0">{{category}}</h3> <p class="card-Subtitle f5 ma0 muted" v-if="categoryresultcount > 0">{{categoryresultcount}} <span v-if="categoryresultcount == 1"> {{countsuffixsingular}} </span> <span v-else> {{countsuffixplural}} </span> </p> </div> </div> </li></script> <script> var CategoryResultCard = Vue.component('category-result-card', { data: function(){ return { menuvisible: false } }, props: ["category", "categorydisplay", "categoryresultcount", "parentcategoryid", "categoryid", "searchtext", "searchtype", "bannermediafile", "bannermediafile2x", "bannerexhid", "bannerexhname", "bannerid", "countsuffixsingular", "countsuffixplural", "type", "searchsection", "hidetype", "viewallresult", "bannerhref"], template:"#category-result-card-template", methods: { catSubSearchURL: function(categoryid){ var path2approotnew = this.path2approot; if (this.thispageurl == this.path2approot + "/sessions/index.cfm"){ path2approotnew += "/sessions" } if (this.parentcategoryid){ return path2approotnew + "/#/searchtype/" + this.searchtype + "/search/" + this.parentcategoryid + "/show/cat-" + this.searchsection + "|" + encodeURIComponent(categoryid); } else { return path2approotnew + "/#/searchtype/" + this.searchtype + "/search/" + this.searchtext + "/show/cat-" + this.searchsection + "|" + encodeURIComponent(categoryid); } } } }); </script> <script type="text/x-template" id="category-result-tr-template"> <tr v-bind:class="{'js-List':true, 'js-viewAllResultRow': viewallresult, 'b': viewallresult}"> <td v-if="!hidetype"><a class="bb-0 color-inherit db w-100" v-bind:href="catSubSearchURL(categoryid)" v-on:click="scrollToTop();" v-if="type">{{type}}</a></td> <td class=""> <h3 class="card-Title break-word f5 ma0 normal"> <a v-bind:class="{'bb-0':true, 'color-inherit':true, 'db':true, 'w-100':true, 'b': viewallresult}" v-bind:href="catSubSearchURL(categoryid)" v-on:click="scrollToTop();">{{category}}</a> </h3> </td> <td class="card-Subtitle is-hidden_small "> <p class="card-Subtitle f5 ma0 muted" v-if="categoryresultcount > 0"> {{categoryresultcount}} <span v-if="categoryresultcount == 1"> {{countsuffixsingular}} </span> <span v-else> {{countsuffixplural}} </span> </p> </td> <td class="tr"> <a v-bind:href="exhURL(selectedbanner.exhid, selectedbanner.exhname)" v-if="selectedbanner && selectedbanner.mediafile && selectedbanner.exhid" v-on:click="logBannerClick()" :target="linktarget" class="bb-0"> <v-lazy-image v-bind:src="displayBannerURL(selectedbanner.mediafile)" v-bind:srcset="displayBannerURL(selectedbanner.mediafile) + ', ' + displayBannerURL(selectedbanner.mediafile2x)" v-bind:alt="selectedbanner.exhname + '-' + categorydisplay + ' Sponsor'" :srcPlaceholder="path2approot + '/assets/imgs/grey.gif'" v-on:intersect="logBannerView()"/> </a> <v-lazy-image v-if="selectedbanner && selectedbanner.mediafile && !selectedbanner.exhid" v-bind:src="displayBannerURL(selectedbanner.mediafile)" v-bind:srcset="displayBannerURL(selectedbanner.mediafile) + ', ' + displayBannerURL(selectedbanner.mediafile2x)" v-bind:alt="selectedbanner.exhname + '-' + categorydisplay + ' Sponsor'" :srcPlaceholder="path2approot + '/assets/imgs/grey.gif'" v-on:intersect="logBannerView()" /> </td> </tr></script> <script> var CategoryResultTr = Vue.component('category-result-tr', { data: function(){ return { menuvisible: false, randomSeed: 0 } }, props: ["category", "categorydisplay", "categoryresultcount", "parentcategoryid", "categoryid", "searchtext", "searchtype", "countsuffixsingular", "countsuffixplural", "type", "searchsection", "hidetype", "viewallresult", "bannerarray"], template:"#category-result-tr-template", created: function(){ this.randomSeed = Math.random(); }, computed: { linktarget: function(){ if (this.bannerhref == "internal"){ return ""; } else { return "_blank"; } }, selectedbanner: function(){ var arrayLength = 0; var selectedArrayElement; var returnObj = {}; if (this.bannerarray && this.bannerarray.constructor === Array) { arrayLength = this.bannerarray.length; selectedArrayElement = Math.floor(this.randomSeed * arrayLength); returnObj = this.bannerarray[selectedArrayElement]; } // now create @2x value if (returnObj && "mediafile" in returnObj && returnObj.mediafile){ var indexOfDot = returnObj.mediafile.lastIndexOf('.'); returnObj["mediafile"] = encodeURI(returnObj.mediafile); returnObj["mediafile2x"] = encodeURI(returnObj.mediafile.substring(0, indexOfDot-1) + "@2x." + returnObj.mediafile.substring(indexOfDot+1, returnObj.mediafile.length)); } return returnObj; } }, methods: { catSubSearchURL: function(categoryid){ var path2approotnew = this.path2approot; if (this.thispageurl == this.path2approot + "/sessions/index.cfm"){ path2approotnew += "/sessions" } if (this.parentcategoryid){ return path2approotnew + "/#/searchtype/" + this.searchtype + "/search/" + this.parentcategoryid + "/show/cat-" + this.searchsection + "|" + encodeURIComponent(categoryid); } else { return path2approotnew + "/#/searchtype/" + this.searchtype + "/search/" + this.searchtext + "/show/cat-" + this.searchsection + "|" + encodeURIComponent(categoryid); } }, exhURL: function(exhid, exhname) { if (this.selectedbanner.bannerhref == "internal"){ return this.getExhibitorURL(exhid, exhname); } else { return this.selectedbanner.bannerhref; } }, logBannerView: function(){ this.logStats("Banner View", "" ,this.categoryid, this.selectedbanner.bannerid ); }, logBannerClick: function(){ this.logStats("Banner Click", "" , this.categoryid, this.selectedbanner.bannerid ); } } }); </script> <script type="text/x-template" id="category-result-list-template"> <li class="js-Card card ba0 br0 db pa3" v-on:click.capture="goToURL(catSubSearchURL(categoryid));"> <div v-if="intersected || idsIsPrinting"> <div class="card-Details items-center"> <div class="flex-Thumb thumb-Border mr3 pa2"> <a v-bind:href="exhURL(selectedbanner.exhid, selectedbanner.exhname)" v-if="selectedbanner && selectedbanner.mediafile && selectedbanner.exhid" v-on:click="logBannerClick()" :target="linktarget"> <v-lazy-image v-bind:src="displayBannerURL(selectedbanner.mediafile)" v-bind:srcset="displayBannerURL(selectedbanner.mediafile) + ', ' + displayBannerURL(selectedbanner.mediafile2x)" alt="selectedbanner.exhname + '-' + categorydisplay + ' Sponsor'" :srcPlaceholder="path2approot + '/assets/imgs/grey.gif'" style="max-width: 65px;" v-on:intersect="logBannerView()" /> </a> <v-lazy-image v-if="selectedbanner && selectedbanner.mediafile && !selectedbanner.exhid" v-bind:src="displayBannerURL(selectedbanner.mediafile)" v-bind:srcset="displayBannerURL(selectedbanner.mediafile) + ', ' + displayBannerURL(selectedbanner.mediafile2x)" alt="selectedbanner.exhname + '-' + categorydisplay + ' Sponsor'" :srcPlaceholder="path2approot + '/assets/imgs/grey.gif'" style="max-width: 65px;" v-on:intersect="logBannerView()" /> </div> <div class="flex-Title mb0 mr3"> <h3 class="card-Title break-word f3 mb1 mt0"> <a class="bb-0" v-bind:href="catSubSearchURL(categoryid)">{{category}}</a> </h3> </div> </div> </div> <div v-if="!intersected">&nbsp;</div> </li></script> <script> var CategoryResultList = Vue.component('category-result-list', CategoryResultTr.extend({ name: "category-result-list", data: function(){ return { menuvisible: false, intersected: false, } }, props: ["category", "categorydisplay", "categoryresultcount", "parentcategoryid", "categoryid", "searchtext", "searchtype", "bannermediafile", "bannermediafile2x", "bannerexhid", "bannerexhname", "bannerid", "searchsection", "viewallresult", "bannerhref"], template:"#category-result-list-template", mixins: [printMixin], 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(); } })); </script> <script type="text/x-template" id="category-search-results-template"> <section class="results-section_wrapper mb6" id="category-results"> <div class="result-heading mb0 pb4" v-if="showresultheader || showviewallbutton || showdisplayoptions"> <h2 class="db dib-l f3 ma0 mb3 mb0-l normal" v-if="showresultheader"> <span class="ttu"> {{sectionheaderdisplay}} </span> <span class="f5 mr3 muted normal" v-if="showresultcount"> ( <span v-if="searchresults.results.category.hit.length < searchresults.results.category.found"> {{searchresults.results.category.hit.length}} {{content.of}} </span> {{searchresults.results.category.found}} ) </span> </h2> <span class="dib" v-if="showviewallbutton"> <a class="btn-tertiary btn-tertiary_small" href="" v-on:click.stop.prevent="scrollToTop(); $emit('view-all-results', 'category');"> {{content.viewAllButton}} </a> </span> <div class="btn-toggle-view-wrapper" v-if="showdisplayoptions"> <span v-for="(displayoption, index) in displayoptions"> <a class="toggle-grid btn-tertiary" href="" v-on:click.stop.prevent="switchDisplay(displayoption.name);" v-bind:class="[isSelected(displayoption.name) ? 'is-selected' : '']"> <svg class="v-mid mr2" width="24" height="24" role="img" aria-hidden="true"> <path viewBox="0 0 24 24" d="M4 22H0v-4h4v4zm0-12H0v4h4v-4zm0-8H0v4h4V2zm3 0v4h17V2H7zm0 12h17v-4H7v4zm0 8h17v-4H7v4z" id="toggle-list"></path> </svg> <span class="v-mid">{{displayoption.display}}</span> </a> </span> </div> </div> <transition-group name="staggered-fade" appear tag="ul" id="category-result-card" class="cards" v-if="tempSelectedView == 'grid'" v-bind:css="false" v-on:before-enter="beforeEnterStaggered" v-on:enter="enterStaggered"s v-on:leave="leaveStaggered"> <category-result-card v-for="(result, index) in searchresults.results.category.hit" v-bind:data-index="index" v-bind:data-totalitemcount="searchresults.results.category.hit.length" v-bind:data-searchsize="searchsize" v-bind:key="result.id" v-bind:category="result.fields.category_t" v-bind:categorydisplay="result.fields.categorydisplay_t" v-bind:categoryresultcount="getExhibitorCount(result)" v-bind:parentcategoryid="result.fields.categoryparentid_l" v-bind:categoryid="result.fields.categoryid_l" v-bind:searchtext="searchtext" v-bind:searchtype="searchtype" v-bind:viewallresult="result.fields.viewallresult"> </category-result-card> </transition-group> <div id="category-result-list" class="results-list-view toggle-list-view" v-if="tempSelectedView == 'list' && $mq != 'medium' && $mq != 'large'"> <table id="category-result-list-table" class="results-table" cellpadding="0" cellspacing="0"> <thead> <th style="width:0px;">&nbsp;</th> <th class="tl">{{content.tableHeadCategory}}</th> <th class="tl">{{content.tableHeadMatchingExhibitors}}</th> <th class="" style="max-width: 320px; width: 320px;"></th> </thead> <transition-group name="staggered-fade2" appear tag="tbody" v-bind:css="false" v-on:before-enter="beforeEnterStaggered" v-on:enter="enterStaggered" v-on:leave="leaveStaggered"> <category-result-tr v-for="(result, index) in searchresults.results.category.hit" v-bind:data-index="index - startindex" v-bind:data-totalitemcount="searchresults.results.category.hit.length" v-bind:data-searchsize="searchsize" v-bind:key="result.id" v-bind:category="result.fields.category_t" v-bind:categorydisplay="result.fields.categorydisplay_t" v-bind:categoryresultcount="getExhibitorCount(result)" v-bind:categoryid="result.fields.categoryid_l" v-bind:searchtext="searchtext" v-bind:searchtype="searchtype" v-bind:countsuffixsingular="content.countSuffixSingular" v-bind:countsuffixplural="content.countSuffixPlural" v-bind:bannerarray="getBannerArray(result.fields.banners_l)" :searchsection="'category'" v-bind:viewallresult="result.fields.viewallresult"> </category-result-tr> </transition-group> </table> </div> <div id="category-result-list-small" class="results-list-view toggle-list-view" v-if="tempSelectedView == 'list' && ($mq == 'large' || $mq == 'medium')"> <transition-group name="staggered-fade2" appear tag="ul" v-bind:css="false" v-on:before-enter="beforeEnterStaggered" v-on:enter="enterStaggered" v-on:leave="leaveStaggered" v-on:enter-cancelled="enterCancelled"> <category-result-list v-for="(result, index) in searchresults.results.category.hit" v-bind:data-index="index - startindex" v-bind:data-totalitemcount="searchresults.results.category.hit.length" v-bind:data-searchsize="searchsize" v-bind:key="result.id" v-bind:category="result.fields.category_t" v-bind:categorydisplay="result.fields.categorydisplay_t" v-bind:categoryresultcount="getExhibitorCount(result)" v-bind:categoryid="result.fields.categoryid_l" v-bind:searchtext="searchtext" v-bind:searchtype="searchtype" v-bind:bannerarray="getBannerArray(result.fields.banners_l)" :searchsection="'category'" v-bind:viewallresult="result.fields.viewallresult"> </category-result-list> </transition-group> </div> <div class="o-BorderBehind pa0 pt3 pb3 tc" v-if="searchresults.results.category.hit.length < searchresults.results.category.found"> <span><a class="btn-secondary" v-on:click.stop.prevent="loadMore();">{{content.loadMoreResults}}</a></span> </div> </section></script> <script> var CategorySearchResults = Vue.component('category-search-results', { data: function(){ return { resultsection: "category", compincludepath: "includes/vue/search/category-search-results-display.cfm", tempSelectedView: 'list', startindex: 0 // used for staggered transition } }, mixins: [staggeredTransitionsMixin, searchDisplayMixin], props: ["searchresults", "searchtext", "searchtype", "searchsize"], template:"#category-search-results-template", methods: { loadMore: function(){ this.startindex = this.searchresults.results['category'].hit.length; this.$emit('load-more-results', 'category'); }, getCategoryID: function(id){ // gets the categoryid from the cloudsearch id so 4310-Category-IMTS18 gets you 4310 return (id.replace("-Category-" + this.showid.toUpperCase(), "")); }, getExhibitorCount: function(resultObj){ var exhidfield = "exhid_t"; if (this.requireboothsfordisplay){ exhidfield = "exhid_with_booth_t"; } if (exhidfield in resultObj.fields){ return resultObj.fields[exhidfield].split(", ").length; } else { return 0; } }, getBannerArray: function(json){ var returnArray = []; try { if (json.startsWith('"') && json.endsWith('"')){ json = json.substring(1, json.length-1); } returnArray = JSON.parse(json); } catch(err){/* do nothing */} return returnArray; } }, computed: { content: function(){ return { viewAllButton: this.displaycontent(this.compincludepath, 'viewAllButton'), displayResultHeader: this.displaycontent(this.compincludepath, 'displayResultHeader'), tableHeadCategory: this.displaycontent(this.compincludepath, 'tableHeadCategory'), tableHeadMatchingExhibitors: this.displaycontent(this.compincludepath, 'tableHeadMatchingExhibitors'), loadMoreResults: this.displaycontent(this.compincludepath, 'loadMoreResults'), countSuffixPlural: this.displaycontent(this.compincludepath, 'countSuffixPlural'), countSuffixSingular: this.displaycontent(this.compincludepath, 'countSuffixSingular'), of: this.displaycontent(this.compincludepath, 'of') }; }, showresultheader: function(){ return Object.keys(this.searchresults.results).length > 1 && this.searchresults.results.category.found > 0 ; }, showviewallbutton: function(){ return this.searchresults.results.category.hit.length < this.searchresults.results.category.found; }, showdisplayoptions: function(){ return this.displayoptions.length > 1; } } }); </script> <script type="text/x-template" id="generic-result-card-template"> <li class="js-Card card br3 dib float pa3" v-on:click.self="goToURLGeneric(url)"> <div class="card-Details mb2" v-on:click.self="goToURLGeneric(url)" v-if="intersected"> <v-lazy-image v-on:click.self="goToURLGeneric(url)" v-bind:src="imgurl" v-if="hasimgurl" class="flex-Thumb mr3 w-100" v-bind:alt="title" :srcplaceholder="path2approot + '/assets/imgs/grey.gif'" :onError="'this.onerror=null;this.src=\'' + path2approot + '/assets/imgs/error-broken-image.png\''"/> <div v-on:click.self="goToURLGeneric(url)" class="flex-Title mb0 mr3"> <h3 class="card-Title break-word f2 mb1 mt0" v-on:click.self="goToURLGeneric(url)">{{title}}</h3> <p class="card-Subtitle f5 ma0 muted" v-on:click.self="goToURLGeneric(url)"> <span v-on:click.self="goToURLGeneric()">{{subtitle}}</span> </p> </div> <toggle-favorite :type="type" v-if="showtogglefavorite" v-bind:keys="favoritekey" v-bind:exhid="exhid" v-bind:addedtoplanner="addedtoplanner" v-on:toggle-favorite="$emit('toggle-favorite', $event)"> </toggle-favorite> </div> <p v-on:click.self="goToURL(url)" class="card-Desc f5 lh-copy ma0 muted" v-if="intersected"> <slot></slot> </p> <a v-if="!intersected" v-bind:href="url">{{title}}</a> </li></script> <script> var GenericResultCard = Vue.component('generic-result-card', { template:"#generic-result-card-template", props: { title:{ type: String, default: "" }, subtitle:{ type: String, default: "" }, url:{ type: String, default: "" }, exhid:{ type: [String, Number], default: "" }, summary:{ type: String, default: "" }, imgurl:{ type: String, default: "" }, addedtoplanner:{ type: [String, Boolean], default: "" }, type:{ type: String, default: "" }, favoritekey:{ type: [String, Number], default: "" }, showtogglefavorite: { type: Boolean, default: true } }, data: function(){ return { menuvisible: false, intersected: false, observer: null } }, 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: { hasimgurl: function(){ return (this.imgurl); } }, methods: { toggleMenu: function(){ this.menuvisible = !this.menuvisible; }, goToURLGeneric: function(url){ var eventObj = { clickedurl: url, exhid: this.exhid, title: this.title, type: this.type, subtitle: this.subtitle, favoritekey: this.favoritekey }; this.$emit('url-clicked', eventObj); this.goToURL(url); } } }); </script> <script type="text/x-template" id="generic-result-tr-template"> <tr class="js-List"> <td v-if="intersected"> <h3 class="card-Title break-word dib f5 ma0 normal"> <a @click.prevent="goToURLGeneric(url)" class="bb-0 color-inherit b" v-bind:href="url">{{title}}</a> </h3> <p v-if="computedsummary" class="card-Desc f6 lh-copy mb0 muted"> <a class="bb-0 color-inherit" v-bind:href="url" @click.prevent="goToURLGeneric(url)">{{ computedsummary }}</a> </p> </td> <td class="card-Subtitle" v-if="intersected"> <a class="bb-0 color-inherit" v-bind:href="computedsubtitleurl" @click.prevent="goToURLGeneric(computedsubtitleurl)"><span>{{subtitle}}</span></a> </td> <td v-if="intersected"> <toggle-favorite :type="type" v-if="showtogglefavorite" v-bind:keys="favoritekey" v-bind:exhid="exhid" v-bind:addedtoplanner="addedtoplanner" v-on:toggle-favorite="$emit('toggle-favorite', $event)" :ref="type + '-' + favoritekey"> </toggle-favorite> </td> <td v-if="!intersected" colspan="3"> <a v-bind:href="url">{{title}}</a> </td> </tr></script> <script> var GenericResultTr = Vue.component('generic-result-tr', { template:"#generic-result-tr-template", props: { title:{ type: [String,Number], default: "" }, subtitle:{ type: [String,Number], default: "" }, url:{ type: String, default: "" }, subtitleurl:{ type: String, default: "" }, exhid:{ type: [String, Number], default: "" }, summary:{ type: String, default: "" }, imgurl:{ type: String, default: "" }, videourl: { type: String, default: "" }, addedtoplanner:{ type: [String, Boolean], default: "" }, type:{ type: String, default: "" }, favoritekey:{ type: [String,Number], default: "" }, showtogglefavorite: { type: Boolean, default: true } }, data: function(){ return { menuvisible: false, toggleVisible: false, intersected: false, observer: null } }, 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 ""; } }, computedsummary: function(){ return this.createSummary(this.summary,200) }, computedsubtitleurl: function(){ if (this.subtitleurl){ return this.subtitleurl; } else { return this.url; } } }, methods: { toggleMenu: function(){ this.menuvisible = !this.menuvisible; }, goToURLGeneric: function(url){ var eventObj = { clickedurl: this.url, exhid: this.exhid, title: this.title, type: this.type, subtitle: this.subtitle, favoritekey: this.favoritekey }; this.$emit('url-clicked', eventObj); if (!this.addedtoplanner && this.type == 'collateral' && this.regemail != '') { setTimeout(function(scope) { scope.$refs[scope.type + '-' + scope.favoritekey].toggleAddToPlanner(); }, 500, this); } // If this is collateral and a video link, then open a new tab if(this.type == 'collateral' && this.videourl != "" && this.videourl != null) { this.goToURL(this.url,true); } else { this.goToURL(this.url); } } } }); </script> <script type="text/x-template" id="generic-result-list-template"> <li class="js-Card card ba0 br0 db pa3" > <div v-if="intersected"> <div class="card-Details"> <div class="flex-Title mb0 mr3"> <p class="card-Desc f5 lh-copy ma0 muted"> <a class="bb-0 color-inherit" v-bind:href="computedsubtitleurl" @click.prevent="goToURLGeneric(computedsubtitleurl)">{{ subtitle }}</a> </p> <h3 class="card-Title break-word f2 mb2 mt0"> <a class="bb-0 color-inherit" v-bind:href="url" @click.prevent="goToURLGeneric(url)">{{title}}</a> </h3> <p class="card-Subtitle f5 ma0 muted"> {{computedsummary}} </p> </div> <toggle-favorite :type="type" v-if="showtogglefavorite" v-bind:keys="favoritekey" v-bind:exhid="exhid" v-bind:addedtoplanner="addedtoplanner" v-on:toggle-favorite="$emit('toggle-favorite', $event)" :ref="type + '-' + favoritekey"> </toggle-favorite> </div> </div> <a v-if="!intersected" v-bind:href="url">{{title}}</a> </li></script> <script> var GenericResultList = Vue.component('generic-result-list', { data: function(){ return { menuvisible: false, toggleVisible: false, intersected: false, observer: null } }, props: { title:{ type: [String, Number], default: "" }, subtitle:{ type: [String, Number], default: "" }, url:{ type: String, default: "" }, subtitleurl:{ type: String, default: "" }, exhid:{ type: [String, Number], default: "" }, summary:{ type: [String, Number], default: "" }, imgurl:{ type: String, default: "" }, videourl:{ type: String, default: "" }, addedtoplanner:{ type: [String, Boolean], default: "" }, type:{ type: [String, Number], default: "" }, favoritekey:{ type: [String, Number], default: "" }, showtogglefavorite: { type: Boolean, default: true } }, template:"#generic-result-list-template", methods: { catSubSearchURL: function(categoryid){ return this.path2approot + "/#/searchtype/" + this.searchtype + "/search/" + this.searchtext + "/show/cat-category|" + categoryid; }, goToURLGeneric: function(url){ var eventObj = { clickedurl: this.url, exhid: this.exhid, title: this.title, type: this.type, subtitle: this.subtitle, favoritekey: this.favoritekey }; this.$emit('url-clicked', eventObj); if (!this.addedtoplanner && this.type == 'collateral' && this.regemail != '') { setTimeout(function(scope) { scope.$refs[scope.type + '-' + scope.favoritekey].toggleAddToPlanner(); }, 500, this); } // If this is collateral and a video link, then open a new tab if (this.type == 'collateral' && this.videourl != "" && this.videourl != null) { this.goToURL(url,true); } else { this.goToURL(url); } } }, 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 ""; } }, computedsummary: function(){ return this.createSummary(this.summary,200) }, computedsubtitleurl: function(){ if (this.subtitleurl){ return this.subtitleurl; } else { return this.url; } } } }); </script> <script type="text/x-template" id="pavilion-search-results-template"> <section class="results-section_wrapper mb6" id="pavilion-results"> <div class="result-heading flex items-end mb3 pb2 justify-between"> <h2 class="f3 ma0 mb4 mb0-l normal" v-if="searchresults.results.pavilion.found > 0"> <span class="ttu"> {{sectionheaderdisplay}} </span> <span class="f5 mr3 muted normal" v-if="showresultcount"> ( <span v-if="searchresults.results.pavilion.hit.length < searchresults.results.pavilion.found"> {{ searchresults.results.pavilion.hit.length}} {{content.of}} </span> {{ searchresults.results.pavilion.found }} ) </span> <span v-if="searchresults.results.pavilion.hit.length < searchresults.results.pavilion.found"> <a class="btn-tertiary btn-tertiary_small" v-bind:href="path2approot + '/#/searchtype/' + searchtype + '/search/' + searchtext + '/show/' + viewallsection" v-on:click="scrollToTop();"> {{content.viewAllButton}} </a> </span> </h2> <div class="btn-toggle-view-wrapper" v-if="tempDisplayOptions.length > 1"> <span v-for="(displayoption, index) in tempDisplayOptions"> <a class="toggle-grid btn-tertiary" href="" v-on:click.stop.prevent="switchDisplay(displayoption.name);" v-bind:class="[isSelected(displayoption.name) ? 'is-selected' : '']"> <svg class="v-mid mr2" width="24" height="24" role="img" aria-hidden="true"> <path viewBox="0 0 24 24" d="M4 22H0v-4h4v4zm0-12H0v4h4v-4zm0-8H0v4h4V2zm3 0v4h17V2H7zm0 12h17v-4H7v4zm0 8h17v-4H7v4z" id="toggle-list"></path> </svg> <span class="v-mid">{{displayoption.display}}</span> </a> </span> </div> </div> <div id="pavilion-result-list" class="results-list-view toggle-list-view" v-if="$mq != 'medium' && $mq != 'large'"> <table id="pavilion-result-list-table" class="results-table" cellpadding="0" cellspacing="0"> <thead> <th class="tl">{{content.tableHeadPavilion}}</th> <th class="tl">{{content.tableHeadMatchingExhibitors}}</th> <th class="centered min-w2-xl tc"><span v-if="hasmyshow">{{content.tableHeadPlanner}}</span></th> </thead> <transition-group name="staggered-fade2" appear tag="tbody" v-bind:css="false" v-on:before-enter="beforeEnterStaggered" v-on:enter="enterStaggered" v-on:leave="leaveStaggered"> <generic-result-tr v-for="(result, index) in searchresults.results.pavilion.hit" v-bind:data-index="index" v-bind:data-totalitemcount="searchresults.results.pavilion.hit.length" v-bind:data-searchsize="searchsize" v-bind:key="'paviliontr'+index" v-bind:title="result.fielddisplay" v-bind:subtitle="result.exhcount" v-bind:url="getPavilionSubSearchURL(result.fieldvalue)" :showtogglefavorite="false"> </generic-result-tr> </transition-group> </table> </div> <div id="pavilion-result-list-small" class="results-list-view toggle-list-view" v-if="($mq == 'large' || $mq == 'medium')"> <transition-group name="staggered-fade2" appear tag="ul" v-bind:css="false" v-on:before-enter="beforeEnterStaggered" v-on:enter="enterStaggered" v-on:leave="leaveStaggered" v-on:enter-cancelled="enterCancelled"> <generic-result-list v-for="(result, index) in searchresults.results.pavilion.hit" v-bind:data-index="index" v-bind:data-totalitemcount="searchresults.results.pavilion.hit.length" v-bind:data-searchsize="searchsize" v-bind:key="'pavilionlist'+index" v-bind:title="result.fielddisplay" v-bind:subtitle="result.exhcount" v-bind:url="getPavilionSubSearchURL(result.fieldvalue)" :showtogglefavorite="false"> </generic-result-list> </transition-group> </table> </div> </section></script> <script> var PavilionSearchResults = Vue.component('pavilion-search-results', { data: function(){ return { resultsection: "pavilion", compincludepath: "includes/vue/search/pavilion-search-results-display.cfm", tempDisplayOptions: [{"transition":"fade","display":"List","active":true,"displayoptioncontentid":0,"default":true,"name":"list"}], tempSelectedView: 'list', startindex: 0 // used for staggered transition } }, mixins: [staggeredTransitionsMixin, searchDisplayMixin], props: ["searchresults", "searchtext", "searchtype", "searchsize"], template:"#pavilion-search-results-template", computed: { content: function(){ return { loadingoptionstext: this.displaycontent(this.compincludepath, 'loadingOptionsText'), viewAllButton: this.displaycontent(this.compincludepath, 'viewAllButton'), displayResultHeader: this.displaycontent(this.compincludepath, 'displayResultHeader'), tableHeadPavilion: this.displaycontent(this.compincludepath, 'tableHeadPavilion'), tableHeadPlanner: "", tableHeadMatchingExhibitors: this.displaycontent(this.compincludepath, 'tableHeadMatchingExhibitors'), loadMoreResults: this.displaycontent(this.compincludepath, 'loadMoreResults'), of: this.displaycontent(this.compincludepath, 'of') }; } }, methods: { loadMore: function(){ this.startindex = this.searchresults.results[this.resultsection].hit.length; this.$emit('load-more-results', this.resultsection); }, getPavilionSubSearchURL: function(pavilion){ return this.thispageurl + "/#/searchtype/" + this.searchtype + "/search/" + this.searchtext + "/show/cat-pavilion|" + pavilion; } } }); </script> <style> .card-Wrapper { display: flex; justify-content: left; } </style> <script type="text/x-template" id="showfeature-result-card-template"> <li class="js-Card card br3 dib float relative" v-on:click.self="goToURL(featureURL());"> <div class="card-Details flex-column mb2" v-on:click.self="goToURL(featureURL());"> <div class="gallery" v-on:click.self="goToURL(featureURL());"> <a v-bind:class="['bb-0']" onclick="onsiteBigPictureOpen(event);"> <v-lazy-image v-if="showfeaturethumbnail" v-bind:src="showfeaturethumbnail" v-bind:data-bp="showfeaturethumbnail" v-bind:vidsrc="showfeaturemediafile" v-bind:data-caption="exhname" v-bind:alt="exhname" v-bind:title="exhname" :srcplaceholder="path2approot + '/assets/imgs/error-broken-image.png'" :onError="'this.onerror=null;this.src=\'' + path2approot + '/assets/imgs/error-broken-image.png\''" class="flex-Thumb_full_width mr3 w-100" /> </a> </div> <toggle-favorite :type="'showfeature'" v-bind:keys="showfeatureid" v-bind:addedtoplanner="addedtoplanner" v-on:toggle-favorite="$emit('toggle-favorite', $event)" absolute> </toggle-favorite> <div class="flex-Title mb0 mr3 pa3"> <h3 class="card-Title break-word f3 mb2 mt0"> <a class="bb-0" v-bind:href="featureURL()">{{showfeaturetitledisplay}}</a> </h3> <p class="card-Subtitle f5 ma0 muted" v-if="exhname"> <a class="bb-0" v-bind:href="featureURL()">{{exhname}}</a> </p> <p class="card-Subtitle f5 ma0 muted" v-if="dateadded"> {{content.dateheader}}: {{formatSessionMonth(toDate(dateadded))}} {{toDate(dateadded).getDate()}} {{toDate(dateadded).getFullYear()}} </p> </div> </div> </li></script> <style> #bp_caption button.bp-x { display: none; } </style> <script> var ShowFeatureResultCard = Vue.component('showfeature-result-card', { data: function(){ return { menuvisible: false } }, props: ["showfeaturethumbnail", "showfeaturecategory", "showfeaturetitle", "showfeaturemediafile", "showfeaturetext", "exhid", "exhname", "showfeatureid", "addedtoplanner", "dateadded"], template:"#showfeature-result-card-template", methods: { toggleMenu: function(){ this.menuvisible = !this.menuvisible; }, openBigPictureLightbox: function(event){ event.preventDefault(); var sourceHref = event.target.closest('a').getAttribute('href'), sourceType = event.target.closest('a').getAttribute('href').match(/\.[0-9a-z]+$/i)[0]; if ((sourceType === '.jpg') || (sourceType === '.png') || (sourceType === '.gif')) { BigPicture({ el: event.target, gallery: '.myshow_gallery', vidSrc: event.target.getAttribute('vidsrc') }); } else if (sourceType === '.mp4') { BigPicture({ el: event.target, vidSrc: event.target.getAttribute('vidsrc') }); } }, featureURL: function(){ return this.getExhibitorURL(this.exhid, this.exhname) + '&featureid=' + this.showfeatureid; } }, computed:{ content: function(){ return { dateheader: this.displaycontent(this.compincludepath, 'dateheader') + "Date Added" }; }, showfeaturetitledisplay: function(){ if (this.showfeaturetitle.length > 140){ return (this.showfeaturetitle.substring(0, 140) + "..."); } else { return this.showfeaturetitle; } } } }); </script> <script type="text/x-template" id="showfeature-result-card-template-v2"> <li class="js-Card card br3 dib float relative" v-on:click.self="goToURL(featureURL());"> <div class="card-Details flex-column mb2" v-on:click.self="goToURL(featureURL());"> <div class="gallery" v-on:click.self="goToURL(featureURL());"> <a v-bind:class="['bb-0']" @click="openBigPictureLightbox($event);"> <v-lazy-image v-if="showfeaturethumbnail" v-bind:src="showfeaturethumbnail" v-bind:data-bp="showfeaturemediafile" v-bind:vidsrc="showfeaturemediafile" v-bind:data-caption="exhname" v-bind:alt="exhname" v-bind:title="exhname" v-bind:data-alternativeThumbnail="'/mys_shared/'+showidlowercase+'/showfeatures/'+exhid+'/'+thumbnailFileName+','+path2approot + '/assets/imgs/error-broken-image.png'" v-bind:data-alternativeMediaFile="'/mys_shared/'+showidlowercase+'/showfeatures/'+exhid+'/'+mediaFileName+','+path2approot + '/assets/imgs/error-broken-image.png'" :srcPlaceholder="path2approot + '/assets/imgs/error-broken-image.png'" :onError="'imageLoadError(this, this.getAttribute(\'data-alternativeThumbnail\').split(/,/), this.getAttribute(\'data-alternativeMediaFile\').split(/,/))'" class="flex-Thumb_full_width mr3 w-100" /> </a> </div> <toggle-favorite :type="'showfeature'" v-bind:keys="getFeatureID()" v-bind:exhid="exhid" v-bind:addedtoplanner="addedtoplanner" v-on:toggle-favorite="$emit('toggle-favorite', $event)" absolute> </toggle-favorite> <div class="flex-Title mb0 mr3 pa3"> <h3 class="card-Title break-word f3 mb2 mt0"> <a class="bb-0" v-bind:href="featureURL()">{{showfeaturetitledisplay}}</a> </h3> <p class="card-Subtitle f5 ma0 muted" v-if="exhname"> <a class="bb-0" v-bind:href="featureURL()">{{exhname}}</a> </p> <p class="card-Subtitle f5 ma0 muted" v-if="dateadded"> {{content.dateheader}}: {{formatSessionMonth(toDate(dateadded))}} {{toDate(dateadded).getDate()}} {{toDate(dateadded).getFullYear()}} </p> </div> </div> </li></script> <style> #bp_caption button.bp-x { display: none; } /* Fix for transparent PNG product images */ #bp_container img { background: #ccc; } #showfeature-result-card-v2 .button-addtoplanner { right: 0.5rem; top: 0.5rem; background-color: var(--color-neutral-100); } #showfeature-result-card-v2 .button-addtoplanner:hover { background-color: var(--color-neutral-80); } #showfeature-result-card-v2 .card-Details { align-items: stretch; } </style> <script> var ShowFeatureResultCard2 = Vue.component('showfeature-result-card-v2', { data: function(){ return { menuvisible: false } }, props: ["showfeaturethumbnail", "showfeaturethumbnailfile", "showfeaturecategory", "showfeaturetitle", "showfeaturemediafile", "showfeaturetext", "exhid", "exhname", "showfeatureid", "addedtoplanner", "dateadded"], template:"#showfeature-result-card-template-v2", methods: { toggleMenu: function(){ this.menuvisible = !this.menuvisible; }, openBigPictureLightbox: function(event){ event.preventDefault(); var sourceHref = event.target.closest('img').getAttribute('data-bp'), sourceType = event.target.closest('img').getAttribute('data-bp').match(/\.[0-9a-z]+$/i)[0]; if ((sourceType === '.jpg') || (sourceType === '.png') || (sourceType === '.gif') || (sourceType === '.jpeg')) { BigPicture({ el: event.target, gallery: '.myshow_gallery', imgSrc: sourceHref }); } else if (sourceType === '.mp4') { BigPicture({ el: event.target, vidSrc: sourceHref }); } }, featureURL: function(){ var exhURL = this.getExhibitorURL(this.exhid, this.exhname); return exhURL + (exhURL.indexOf('?') != -1 ? '&' : '?') + 'featureid=' + this.getFeatureID(); }, getFeatureID: function(){ return (this.showfeatureid.indexOf('-') != -1 ? this.showfeatureid.substr(0, this.showfeatureid.indexOf('-')) : this.showfeatureid); } }, computed:{ content: function(){ return { dateheader: this.displaycontent(this.compincludepath, 'dateheader') + "Date Added" }; }, showfeaturetitledisplay: function(){ if (this.showfeaturetitle.length > 140){ return (this.showfeaturetitle.substring(0, 140) + "..."); } else { return this.showfeaturetitle; } }, mediaFileName: function() { return (this.showfeaturemediafile).split('/').pop(); }, thumbnailFileName: function() { if(this.showfeaturethumbnailfile) { return (this.showfeaturethumbnailfile).split('/').pop(); } else { return this.showfeaturethumbnailfile; } } } }); function imageLoadError(element, thumbList, mediaList) { var image = new Image(); image.onload = function() { element.setAttribute('data-bp', mediaList.shift()); element.src = this.src; } image.onerror = function() { if (thumbList.length) { imageLoadError(element, thumbList, mediaList); } } image.src = thumbList.shift(); } </script> <script type="text/x-template" id="showfeature-search-results-template"> <section class="results-section_wrapper mb6" id="showfeature-results"> <div class="result-heading mb0 pb4"> <h2 class="db dib-l f3 ma0 mb3 mb0-l normal" v-if="Object.keys(searchresults.results).length > 1 && searchresults.results.showfeature.found > 0"> <span class="ttu"> {{content.displayResultHeader}} </span> <span class="f5 mr3 muted normal" v-if="showresultcount"> ( <span v-if="searchresults.results.showfeature.hit.length < searchresults.results.showfeature.found"> {{searchresults.results.showfeature.hit.length}} {{content.of}} </span> {{searchresults.results.showfeature.found}} ) </span> </h2> <span class="dib" v-if="searchresults.results.showfeature.hit.length < searchresults.results.showfeature.found"> <a class="btn-tertiary btn-tertiary_small" v-on:click.stop.prevent="scrollToTop(); $emit('view-all-results', 'showfeature');"> {{content.viewAllButton}} </a> </span> </div> <ul :id="getCardComponentName()" class="cards exh-show-features myshow_gallery"> <component v-for="(result, index) in searchresults.results.showfeature.hit" :is="getCardComponentName()" :key="index" v-bind:data-index="index - startindex" v-bind:showfeatureid="getShowFeatureID(result.id)" v-bind:showfeaturethumbnail="showFeaturePath(result.fields.exhid_l, result.fields.showfeaturethumbnail_l, 'thumb', result.fields.showfeaturemediafile_l, result.fields.showfeaturetype_l)" v-bind:showfeaturethumbnailfile="result.fields.showfeaturethumbnail_l" v-bind:showfeaturemediafile="showFeaturePath(result.fields.exhid_l, result.fields.showfeaturemediafile_l, 'media', '', result.fields.showfeaturetype_l)" v-bind:showfeaturecategory="result.fields.showfeaturecategory_l" v-bind:showfeaturetitle="result.fields.showfeaturetitle_t" v-bind:showfeaturetext="result.fields.showfeaturetext_t" v-bind:exhid="result.fields.exhid_l" v-bind:exhname="result.fields.exhname_t" v-bind:dateadded="result.fields.dateadded_d" v-bind:addedtoplanner="result.MYS.addedtoplanner"> </component> </ul> <div class="o-BorderBehind pa0 pt3 pb3 tc" v-if="searchresults.results.showfeature.hit.length < searchresults.results.showfeature.found"> <span><a class="btn-secondary" v-on:click.stop.prevent="loadMore();">{{content.loadMoreResults}}</a></span> </div> </section></script> <script> var ShowFeatureSearchResults = Vue.component('showfeature-search-results', { data: function(){ return { resultsection: "showfeature", compincludepath: "includes/vue/search/showfeature-search-results-display.cfm", startindex: 0,// used for staggered transition useExhSubVersion2: Vue.MYS.useExhSubVersion2 } }, mixins: [staggeredTransitionsMixin, searchDisplayMixin], props: ["searchresults"], template:"#showfeature-search-results-template", mounted: function(){ var vObj = this; }, computed: { content: function(){ return { viewAllButton: this.displaycontent(this.compincludepath, 'viewAllButton'), displayResultHeader: this.displaycontent(this.compincludepath, 'displayResultHeader'), tableHeadPavilion: this.displaycontent(this.compincludepath, 'tableHeadPavilion'), tableHeadPlanner: this.displaycontent(this.compincludepath, 'tableHeadPlanner'), tableHeadMatchingExhibitors: this.displaycontent(this.compincludepath, 'tableHeadMatchingExhibitors'), loadMoreResults: this.displaycontent(this.compincludepath, 'loadMoreResults'), of: this.displaycontent(this.compincludepath, 'of') }; } }, methods: { loadMore: function(){ this.startindex = this.searchresults.results['showfeature'].hit.length; this.$emit('load-more-results', 'showfeature'); }, showFeaturePath: function(exhid, file, type, mediaFile, featuretype){ if (this.useExhSubVersion2) { var showID = this.showidlowercase; var path2approot = this.path2approot; var thumbFileToUse = ''; if (type == "thumb" && mediaFile && isNaN(featuretype) && featuretype.toLowerCase() != "video") { thumbFileToUse = mediaFile; } else if (type=="thumb" && mediaFile && featuretype < 6) { thumbFileToUse = mediaFile; } else if (type=="thumb" && file) { thumbFileToUse = file; } if (thumbFileToUse.length > 0) { thumbFileToUse = encodeURIComponent(thumbFileToUse).replace(/%([0-9A-F]{2})/g, function(match, p1) { return String.fromCharCode('0x' + p1); }); var pathConfig = {}; pathConfig.bucket = 'mys-showfiles'; pathConfig.key = "production/"+this.showidlowercase+"/show_features/"+exhid.toString().toLowerCase()+"/"+thumbFileToUse; pathConfig.edits = {}; pathConfig.edits.resize = {}; pathConfig.edits.resize.height = 200; pathConfig.edits.resize.width = 234; pathConfig.edits.resize.fit = 'cover'; pathConfig.edits.resize.quality = 70; return ('https://d3fv3oe83qat1b.cloudfront.net/' + btoa(JSON.stringify(pathConfig))); } else if (file) { return ("https://mys-showfiles.s3.amazonaws.com/production/"+this.showidlowercase+"/show_features/"+exhid.toString().toLowerCase()+"/"+file); } else { return (this.path2approot + '/assets/imgs/feature-text-only.png'); } } else if (file){ return '/mys_shared/' + this.showid + '/showfeatures/' + exhid + '/' + file; } else { return this.path2approot + '/assets/imgs/feature-text-only.png'; } }, getShowFeatureID: function(idtext){ var returntext = idtext returntext = idtext.replace("-ShowFeature-" + this.showid, ""); returntext = returntext.replace("-ShowFeatures-" + this.showid, "") return returntext; }, getCardComponentName: function(){ if (Vue.MYS.useExhSubVersion2) { return "showfeature-result-card-v2"; } else { return "showfeature-result-card"; } } } }); </script> <script> var BoothSearchResults = Vue.component('booth-search-results', ExhibitorSearchResults.extend({ data: function(){ return { compincludepath: "includes/vue/search/booth-search-results-display.cfm", headerdisplay: this.sectionheaderdisplay, sectionid: "booth-results", displaycardtype: "featured-result-card", ulclass: "exh-featured", viewallsection: "booth", startindex: 0 } }, props: ["searchresults","searchtext", "searchtype"], template:"#exhibitor-search-results-template", mounted: function(){ this.headerdisplay = this.sectionheaderdisplay; }, computed: { resultsection: function(){ return "booth"; }, content: function(){ return { displayResultHeader: this.headerdisplay, viewAllButton: this.displaycontent(this.compincludepath, 'viewAllButton'), viewAllFeaturedButton: this.displaycontent(this.compincludepath, 'viewAllFeaturedButton'), viewOnFloorplan: this.displaycontent(this.compincludepath, 'viewOnFloorplan'), tableHeadExhibitor: this.displaycontent(this.compincludepath, 'tableHeadExhibitor'), tableHeadSummary: this.displaycontent(this.compincludepath, 'tableHeadSummary'), tableHeadBooth: this.displaycontent(this.compincludepath, 'tableHeadBooth'), tableHeadPlanner: this.displaycontent(this.compincludepath, 'tableHeadPlanner'), loadMoreResults: this.displaycontent(this.compincludepath, 'loadMoreResults'), of: this.displaycontent(this.compincludepath, 'of'), tableHeadLegend: this.displaycontent(this.compincludepath, 'tableHeadLegend') }; } } }) ); </script> <script type="text/x-template" id="generic-result-card-template2"> <li class="js-Card card br3 dib float relative"> <div class="card-Details flex-column mb2"> <div class="gallery"> <a v-bind:class="['bb-0']" v-bind:href="imgurl" v-on:click="openBigPictureLightbox"> <v-lazy-image v-bind:src="imgurl" v-bind:data-bp="imgurl" v-bind:vidsrc="imgurl" v-if="hasimgurl" class="flex-Thumb_full_width mr3 w-100" v-bind:data-caption="title" v-bind:alt="title" v-bind:title="title"/> </a> </div> <toggle-favorite :type="'product'" v-bind:keys="itemkey" v-bind:exhid="exhid" v-bind:addedtoplanner="addedtoplanner" v-on:toggle-favorite="$emit('toggle-favorite', $event)" absolute> </toggle-favorite> <div class="flex-Title mb0 mr3 pa3"> <h3 class="card-Title break-word f2 mb2 mt0"> <a class="bb-0" v-bind:href="url">{{title}}</a> </h3> <p class="card-Subtitle f5 ma0 muted"> <a class="bb-0" v-bind:href="url">{{subtitle}}</a> </p> </div> </div> </li></script> <script> var GenericResultCard = Vue.component('generic-result-card2', { template:"#generic-result-card-template2", props: ["title", "subtitle", "url", "summary", "imgurl", "addedtoplanner", "itemkey", "exhid"], data: function(){ return { menuvisible: false } }, computed: { hasimgurl: function(){ return (this.imgurl); } }, methods: { toggleMenu: function(){ this.menuvisible = !this.menuvisible; }, openBigPictureLightbox: function(event){ event.preventDefault(); var sourceHref = event.target.closest('a').getAttribute('href'), sourceType = event.target.closest('a').getAttribute('href').match(/\.[0-9a-z]+$/i)[0]; if ((sourceType === '.jpg') || (sourceType === '.png') || (sourceType === '.gif')) { BigPicture({ el: event.target, gallery: '.myshow_gallery', vidSrc: event.target.getAttribute('vidsrc') }); } else if (sourceType === '.mp4') { BigPicture({ el: event.target, vidSrc: event.target.getAttribute('vidsrc') }); } } } }); </script> <script type="text/x-template" id="generic-search-results-template"> <section class="results-section_wrapper mb6" v-bind:id="sectionid" v-if="!searching"> <div class="result-heading flex-l items-end-l mb3 pb2 justify-between-l" v-if="(searchresults.found > 0) && (showheader == true || showheader == 1)"> <h2 class="f3 ma0 mb4 mb0-l normal"> <span class="ttu"> {{resultsheader}} </span> <span class="f5 mr3 muted normal" v-if="showresultcount"> ( <span v-if="searchresults.hit.length < searchresults.found"> {{searchresults.hit.length}} {{content.of}} </span> {{searchresults.found}} ) </span> </h2> <div class="btn-toggle-view-wrapper" v-if="activedisplayoptions.length > 1"> <span v-for="(displayoption, index) in activedisplayoptions"> <a class="toggle-grid btn-tertiary" href="" v-on:click.stop.prevent="$emit('switch-display', displayoption.name)" v-bind:class="[isSelected(displayoption.name) ? 'is-selected' : '']"> <svg class="v-mid mr2" width="24" height="24" role="img" aria-hidden="true"> <path viewBox="0 0 24 24" d="M4 22H0v-4h4v4zm0-12H0v4h4v-4zm0-8H0v4h4V2zm3 0v4h17V2H7zm0 12h17v-4H7v4zm0 8h17v-4H7v4z" id="toggle-list"></path> </svg> <span class="v-mid">{{displayoption.display}}</span> </a> </span> </div> </div> <slot name="filter"></slot> <transition-group name="staggered-fade" appear tag="ul" id="generic-result-card" class="cards myshow_gallery" v-bind:class="ulclass" v-if="selectedview == 'grid' && searchresults.hit.length" v-bind:css="false" v-on:before-enter="beforeEnterStaggered" v-on:enter="enterStaggered" v-on:leave="leaveStaggered"> <component v-for="(result, index) in searchresults.hit" v-bind:is="thisdisplaycardtype" v-bind:favoritekey="result[keyname]" v-bind:type="type" v-bind:data-index="index" v-bind:data-totalitemcount="searchresults.hit.length" v-bind:data-searchsize="searchsize" v-bind:key="'generic_c'+index" v-bind:title="result.title" v-bind:subtitle="result.subtitle" v-bind:subtitleurl="result.subtitleurl" v-bind:url="result.url" v-bind:summary="result.summary" v-bind:imgurl="result.imgurl" v-bind:videourl="result.videourl" v-bind:exhid="result.exhid" v-bind:showtogglefavorite="showtogglefavorite" v-bind:addedtoplanner="result.addedtoplanner" v-on:toggle-favorite="$emit('toggle-favorite', $event)" v-on:url-clicked="$emit('url-clicked', $event)"> {{createSummary(result.summary, 1000)}} </component> </transition-group> <div id="generic-result-list" class="results-list-view toggle-list-view" v-if="selectedview == 'list' && $mq != 'medium' && $mq != 'large'"> <table id="generic-result-list-table" class="results-table" cellpadding="0" cellspacing="0"> <thead> <th class="tl"> <a href="#" v-if="showsorting" :title="sort.column == 0 ? ('Sort' + headeroptions.titleheader + ' ' + (sort.asc ? 'Z-A' : 'A-Z')) : 'Sort By' + headeroptions.titleheader" @click="changeSort(0)" class="flex items-center" > <span class="mr1">{{headeroptions.titleheader}}</span> <span v-if="sort.column == 0" class="f3"> <span v-if="sort.asc" class="relative o-arrow-sort_up"></span> <span v-else class="relative o-arrow-sort_down"></span> </span> </a> <span v-else>{{headeroptions.titleheader}}</span> </th> <th class="tl"> <a href="#" v-if="showsorting" :title="sort.column == 1 ? ('Sort' + headeroptions.subtitleheader + ' ' + (sort.asc ? 'Z-A' : 'A-Z')) : 'Sort By' + headeroptions.subtitleheader" @click="changeSort(1)" class="flex items-center" > <span class="mr1">{{headeroptions.subtitleheader}}</span> <span v-if="sort.column == 1" class="f3"> <span v-if="sort.asc" class="relative o-arrow-sort_up"></span> <span v-else class="relative o-arrow-sort_down"></span> </span> </a> <span v-else>{{headeroptions.subtitleheader}}</span> </th> <th class="centered tc" style="min-width: 90px;"><span v-if="hasmyshow">{{content.addToPlanner}}</span></th> </thead> <transition-group name="staggered-fade2" appear tag="tbody" v-bind:css="false" v-on:before-enter="beforeEnterStaggered" v-on:enter="enterStaggered" v-on:leave="leaveStaggered"> <generic-result-tr v-for="(result, index) in searchresults.hit" v-bind:favoritekey="result[keyname]" v-bind:type="type" v-bind:data-index="index" v-bind:data-totalitemcount="searchresults.hit.length" v-bind:data-searchsize="searchsize" v-bind:key="'generic_tr'+index" v-bind:title="result.title" v-bind:subtitle="result.subtitle" v-bind:subtitleurl="result.subtitleurl" v-bind:url="result.url" v-bind:summary="result.summary" v-bind:imgurl="result.imgurl" v-bind:videourl="result.videourl" v-bind:exhid="result.exhid" v-bind:showtogglefavorite="showtogglefavorite" v-bind:addedtoplanner="result.addedtoplanner" v-on:toggle-favorite="$emit('toggle-favorite', $event)" v-on:url-clicked="$emit('url-clicked', $event)"> </generic-result-tr> </transition-group> </table> </div> <div id="generic-result-list-small" class="results-list-view toggle-list-view" v-if="selectedview == 'list' && ($mq == 'large' || $mq == 'medium')"> <transition-group name="staggered-fade2" appear tag="ul" v-bind:css="false" v-on:before-enter="beforeEnterStaggered" v-on:enter="enterStaggered" v-on:leave="leaveStaggered" v-on:enter-cancelled="enterCancelled"> <generic-result-list v-for="(result, index) in searchresults.hit" v-bind:favoritekey="result[keyname]" v-bind:type="type" v-bind:data-index="index" v-bind:data-totalitemcount="searchresults.hit.length" v-bind:data-searchsize="searchsize" v-bind:key="'genericlist'+index" v-bind:title="result.title" v-bind:subtitle="result.subtitle" v-bind:subtitleurl="result.subtitleurl" v-bind:url="result.url" v-bind:summary="result.summary" v-bind:imgurl="result.imgurl" v-bind:videourl="result.videourl" v-bind:exhid="result.exhid" v-bind:showtogglefavorite="showtogglefavorite" v-bind:addedtoplanner="result.addedtoplanner" v-on:toggle-favorite="$emit('toggle-favorite', $event)" v-on:url-clicked="$emit('url-clicked', $event)"> </generic-result-list> </transition-group> </div> <div class="o-BorderBehind pa0 pt3 pb3 tc" v-if="searchresults.hit.length < searchresults.found"> <span><a class="btn-secondary" v-on:click.stop.prevent="loadMore()">{{content.loadMoreResults}}</a></span> </div> </section></script> <script> var GenericSearchResults = Vue.component('generic-search-results', { data: function(){ return { compincludepath: "includes/vue/search/generic-search-results-display.cfm", defaultdisplaycardtype: "generic-result-card", ulclass: "exh-featured", sort: { column: 0, asc: true } } }, mixins: [staggeredTransitionsMixin, searchDisplayMixin], props: ["searchresults","resultsheader", "sortoptions", "headeroptions", "searching", "type", "headerdisplay", "sectionid", "displaycardtype", "keyname", "searchsize", "showtogglefavorite", "showsorting"], template:"#generic-search-results-template", computed: { content: function(){ return { viewAllButton: this.displaycontent(this.compincludepath, 'viewAllButton'), viewAllFeaturedButton: this.displaycontent(this.compincludepath, 'viewAllFeaturedButton'), viewOnFloorplan: this.displaycontent(this.compincludepath, 'viewOnFloorplan'), tableHeadExhibitor: this.displaycontent(this.compincludepath, 'tableHeadExhibitor'), tableHeadSummary: this.displaycontent(this.compincludepath, 'tableHeadSummary'), tableHeadBooth: this.displaycontent(this.compincludepath, 'tableHeadBooth'), tableHeadPlanner: this.displaycontent(this.compincludepath, 'tableHeadPlanner'), loadMoreResults: this.displaycontent(this.compincludepath, 'loadMoreResults'), addToPlanner: this.displaycontent(this.compincludepath, 'addToPlanner'), of: this.displaycontent(this.compincludepath, 'of') }; }, thisdisplaycardtype: function(){ return ((this.displaycardtype) ? this.displaycardtype : this.defaultdisplaycardtype) } }, mounted: function(){ var vObj = this; var sortObj = vObj.getViewState(vObj.thispageurl, this.type+"genericsort"); if (sortObj["column"] == 0 || sortObj["column"] == 1){ vObj.sort["column"] = sortObj["column"]; } if (typeof sortObj["asc"] === "boolean"){ vObj.sort["asc"] = sortObj["asc"]; } vObj.$emit('change-sort', vObj.sort); }, methods: { loadMore: function(){ this.$emit('load-more-results'); }, isSelected: function(selectedview){ return (this.selectedview == selectedview); }, changeSort: function(column){ this.sort["column"] = column; this.sort["asc"] = !this.sort["asc"]; this.saveViewState(this.thispageurl, this.type+"genericsort", this.sort); this.$emit('change-sort', this.sort); } } }); </script> <script> var collateralMixin = { data: function(){ return {} }, methods: { formatCollateralResults: function(resultObj){ var returnObj = resultObj; if (resultObj && "hit" in resultObj) { // check if all the press type names are the same var showpressnamesubheader = false; for (var i = 0; i < resultObj.hit.length-1; i++){ if ("typename_t" in resultObj.hit[i].fields && "typename_t" in resultObj.hit[i+1].fields && resultObj.hit[i].fields["typename_t"] !== resultObj.hit[i+1].fields["typename_t"]) { showpressnamesubheader = true; break; } } for (var i = 0; i < resultObj.hit.length; i++){ resultObj.hit[i]["imgurl"] = ''; resultObj.hit[i]["releasedate"] = ''; resultObj.hit[i]["summary"] = ''; resultObj.hit[i]["url"] = this.path2approot + '/explore/collateral_redirect.cfm?CollateralID=' + resultObj.hit[i].fields["releaseid_l"]; if ("typename_t" in resultObj.hit[i].fields && showpressnamesubheader){ resultObj.hit[i]["summary"] = resultObj.hit[i].fields["typename_t"]; } if ("exhid_t" in resultObj.hit[i].fields) { resultObj.hit[i]["exhid"] = resultObj.hit[i].fields["exhid_t"]; } if ("releaseid_l" in resultObj.hit[i].fields) { resultObj.hit[i]["releaseid"] = resultObj.hit[i].fields["releaseid_l"]; } if ("exhname_t" in resultObj.hit[i].fields) { resultObj.hit[i]["subtitle"] = resultObj.hit[i].fields["exhname_t"]; } if ("exhid_t" in resultObj.hit[i].fields) { resultObj.hit[i]["subtitleurl"] = this.getExhibitorURL(resultObj.hit[i].fields["exhid_t"], resultObj.hit[i].fields["exhname_t"]); } if ("title_t" in resultObj.hit[i].fields) { resultObj.hit[i]["title"] = resultObj.hit[i].fields["title_t"]; } if ("videourl_t" in resultObj.hit[i].fields) { resultObj.hit[i]["videourl"] = resultObj.hit[i].fields["videourl_t"]; } if ("MYS" in resultObj.hit[i] && "addedtoplanner" in resultObj.hit[i]["MYS"] && resultObj.hit[i]["MYS"]["addedtoplanner"]) { resultObj.hit[i]["addedtoplanner"] = true; } else { resultObj.hit[i]["addedtoplanner"] = false; } } } return returnObj; } } }; </script> <script type="text/x-template" id="collateral-search-results-template"> <generic-search-results :type="'collateral'" :keyname="'releaseid'" v-bind:type="type" v-bind:resultsheader="sectionheaderdisplay" v-bind:searchresults="formatCollateralResults(searchresults.results.collateral)" v-bind:headeroptions="headeroptions" v-bind:searchtext="searchtext" v-bind:searchtype="searchtype" v-bind:displayoptions="[]" v-bind:showheader="showheader" v-bind:showresultcount="showresultcount" v-bind:sectionid="sectionid" v-bind:selectedview="cselectedview" v-on:view-all-results="$emit('view-all-results', $event);" v-on:load-more-results="$emit('load-more-results', 'collateral');" v-on:url-clicked="urlClicked($event)"> </generic-search-results></script> <script> var CollateralSearchResults = Vue.component('collateral-search-results', { data: function(){ return { resultsection: "collateral", compincludepath: "includes/vue/search/collateral-search-results-display.cfm", sectionid: "collateral-results", type:"collateral", cselectedview: 'list' } }, computed: { headeroptions: function() { return { titleheader: this.displaycontent(this.compincludepath, 'titleHeader'), subtitleheader: this.displaycontent(this.compincludepath, 'subtitleHeader') } }, content: function(){ return { displayResultHeader: this.displaycontent(this.compincludepath, 'displayResultHeader') }; } }, mixins: [ searchDisplayMixin,collateralMixin], // defined in /includes/generic/_searchDisplayMixin.cfm props: ["searchresults"], template:"#collateral-search-results-template", methods: { urlClicked: function(event){ var urlString = (event.clickedurl+'').toLowerCase() , exhid = event.exhid , releaseid = event.favoritekey; if (urlString.indexOf("collateral_redirect.cfm") < 0) { this.logStats('URL Link', '', releaseid, urlString, 'Collateral'); } } } }); </script> <script type="text/x-template" id="search-results-template"> <div class="search-results-wrapper db flex-l h-auto"> <aside class="l-aside result-match-tally mid-gray ma4 mt2 mb2" v-if="shouldShowSidebar()"> <search-results-summary-display v-bind:searchresults="searchresults" v-bind:recommendedexhibitors="recommendedexhibitors" v-bind:recommendedsearches="recommendedsearches" v-bind:searchconfig="searchconfig" v-bind:keywordsearchconfig="keywordsearchconfig" v-bind:show="show" v-bind:searching="searching" v-bind:searchtype="searchtype" v-bind:search="searchtext" v-bind:searchtext="searchtext" v-bind:showresultcount="showresultcount" v-bind:showadvancedsearch="showadvancedsearch" > </search-results-summary-display> </aside> <main class="l-main search-results pa4 pt2 pb2 pr5-m pl5-m " id="main-searchresults-display"> <loading-display v-if="searching"></loading-display> <div class="mb6" v-if="showsearchresults"> <slot name="top"></slot> <slot v-if="showsearchresults"></slot> <transition name="fade"> <section class="mb6" id="recommendedsearches-results" v-if="recommendedsearches.results.length > 0"> <div class="result-heading mb4 pb2"> <h2 class="f3 ma0 normal ttu"> {{content.relatedSearchesText}} <a class="dib ml2 v-mid" href="./view-rec-details.cfm?" target="_blank" title="View related searches" v-bind:href="'view-rec-details.cfm?rectype=searches&search=' + searchtext + '&searchtype=' + searchconfig[selectedsearchindex].element"> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" role="img" aria-hidden="true"><path fill="#1B69B8" d="M12.015 7c4.751 0 8.063 3.012 9.504 4.636-1.401 1.837-4.713 5.364-9.504 5.364-4.42 0-7.93-3.536-9.478-5.407 1.493-1.647 4.817-4.593 9.478-4.593zm0-2c-7.569 0-12.015 6.551-12.015 6.551s4.835 7.449 12.015 7.449c7.733 0 11.985-7.449 11.985-7.449s-4.291-6.551-11.985-6.551zm-.015 3c-2.21 0-4 1.791-4 4s1.79 4 4 4c2.209 0 4-1.791 4-4s-1.791-4-4-4zm-.004 3.999c-.564.564-1.479.564-2.044 0s-.565-1.48 0-2.044c.564-.564 1.479-.564 2.044 0s.565 1.479 0 2.044z"></path></svg> </a> </h2> </div> <span v-for="i in 5" v-if="validRecommendation(i-1)"> <a class="btn-tertiary pointer mb2" v-bind:href="displaySearchURL(recommendedsearches.results[i-1].MYS.searchtype, recommendedsearches.results[i-1].MYS.search, show)" v-on:click.self="logRelated(displaySearchURL(recommendedsearches.results[i-1].MYS.searchtype, recommendedsearches.results[i-1].MYS.search, show))">{{recommendedsearches.results[i-1].MYS.search}} </a> </span> </section> </transition> <h1 class="f1 mb4 mt0" v-html="resultsheader" v-if="showheader"> </h1> <div class="bb b--black-10 flex-l justify-between-l mb4 mb6-l pb3"> <h1 class="f1 ma0 mb3 mb0-l normal"> <span> <span v-if="(showresultcount == true || showresultcount == 1) && !hideallresults"> {{totalhits()}} </span> <span v-if="totalhits() == 1">{{content.resultSingular}}</span> <span v-else>{{content.resultPlural}}</span> <span v-if="searchresultstext || searchresultheader">{{content.forText}} <span v-if="searchresultheader"> <span v-html="searchresultheader"></span><span v-if="searchresultstext">:<strong> &ldquo;{{searchresultstext}}&rdquo;</strong> </span> </span> <strong v-else>{{searchresultstext}}</strong> </span> </span> </h1> <div v-if="getValidDisplayOptions().length > 1" class="btn-toggle-view-wrapper"> <span v-for="(displayoption, index) in getValidDisplayOptions()"> <a class="bb-0" href="" v-on:click.stop.prevent="switchDisplay(displayoption.name);" v-bind:title="'View results by ' + displayoption.name"> <span v-bind:class="[isSelected(displayoption.name) ? 'is-selected' : '', 'toggle-grid', 'btn-tertiary']"> <svg class="v-mid mr1" width="18" height="18" role="img" aria-hidden="true"> <path v-if="displayoption.name == 'grid'" viewBox="0 0 18 18" d="M4.5 4.5H0V0h4.5v4.5zM11.25 0h-4.5v4.5h4.5V0zM18 0h-4.5v4.5H18V0zM4.5 6.75H0v4.5h4.5v-4.5zm6.75 0h-4.5v4.5h4.5v-4.5zm6.75 0h-4.5v4.5H18v-4.5zM4.5 13.5H0V18h4.5v-4.5zm6.75 0h-4.5V18h4.5v-4.5zm6.75 0h-4.5V18H18v-4.5z" id="toggle-grid"></path> <path v-if="displayoption.name == 'list'" viewBox="0 0 18 18" d="M3 16.5H0v-3h3v3zm0-9H0v3h3v-3zm0-6H0v3h3v-3zm2.25 0v3H18v-3H5.25zm0 9H18v-3H5.25v3zm0 6H18v-3H5.25v3z" id="toggle-list"></path> </svg> <span class="v-mid">{{displayoption.display}}</span> </span> </a> </span> </div> </div> <slot name="filter"></slot> <slot name="sort"></slot> <div class="searchResultWrapper" v-for="(section, index) in getDisplaySections()"> <section id="allexhibitors-results" v-if="(section == 'exhibitor')"></section> <featured-search-results v-if="((section == 'exhibitor') && ('featured' in searchresults.results) && (searchresults.results.featured.found > 0) && section)" v-bind:searchresults="searchresults" v-bind:searchtext="searchtext" v-bind:searchtype="searchtype" v-bind:show="show" v-bind:searchconfig="searchconfig" v-bind:searching="searching" v-bind:displayoptions="getSectionDisplayOptions(section)" v-bind:showheader="showheader" v-bind:showresultcount="showresultcount" v-bind:selectedview="searchselectedview" v-bind:searchsize="searchsize" v-bind:floorplanresultsurl="getFloorplanLink()" v-on:load-more-results="$emit('load-more-results', $event);" v-on:view-all-results="$emit('view-all-results', $event);"> </featured-search-results> <hr class="o-PageDivider" v-if="((section == 'exhibitor') && ('featured' in searchresults.results) && (searchresults.results.featured.found > 0) && section)" /> <section class=""> <component :key="section" v-bind:is="getComponentType(section, hasmyshow, regemail)" v-bind:recommendedresults="recommendedexhibitors" v-bind:searchresults="searchresults" v-bind:searchtext="searchtext" v-bind:searchtype="searchtype" v-bind:show="show" v-bind:searchconfig="searchconfig" v-bind:keywordsearchconfig="keywordsearchconfig" v-bind:displayoptions="getSectionDisplayOptions(section)" v-bind:showheader="showheader" v-bind:showresultcount="showresultcount" v-bind:selectedview="searchselectedview" v-bind:searchsize="searchsize" v-bind:floorplanresultsurl="getFloorplanLink()" v-on:load-more-results="$emit('load-more-results', $event);" v-on:view-all-results="$emit('view-all-results', $event);"> </component> <hr class="o-PageDivider" /> </section> </div> </div> <div v-if="noresults"> <slot name="top"></slot> <slot></slot> <noresults-display v-bind:searchterm="noresultstext" v-bind:searchtype="searchtype"> </noresults-display> </div> <backtotop-button ref="backtotopbutton"> </backtotop-button> </main> </div></script> <script> var SearchResultsDisplay = Vue.component('search-results-display', { data: function(){ return { compincludepath: "includes/vue/search/search-results-display.cfm", backToTopButtonShowing: false, tempDisplayOptions: [{"transition":"fade","display":"Grid","active":true,"displayoptioncontentid":0,"default":true,"name":"grid"},{"transition":"fade","display":"List","active":true,"displayoptioncontentid":0,"default":true,"name":"list"}], searchselectedview: Vue.MYS.settingsConfig.searchsettings.defaultsearchview, hideallresults: Vue.MYS.settingsConfig.searchsettings.hideallresults, hidesessiontimes: Vue.MYS.settingsConfig.searchsettings.hidesessiontimes, path: this.path2approot } }, mixins: [searchDisplayMixin], props: ["searchresults", "recommendedsearches", "recommendedexhibitors","selectedsearchindex", "searchconfig", "keywordsearchconfig", "recommendedexhibitorsconfig", "relatedsearchesconfig", "searching", "show", "searchtext", "searchtype", "resultsheader", "displayoptions", "showheader", "showresultcount", "showsidebar", "searchsize", "searchMainContentHeight", "searchresultheader", "showadvancedsearch"], template:"#search-results-template", created: function(){ var vObj = this; var selectedview = vObj.getViewState(vObj.path, "exhsearchpage"); if (selectedview == "grid"){ vObj.searchselectedview = "grid"; } else if (selectedview == "list"){ vObj.searchselectedview = "list"; } // set up unload when user clicks away window.addEventListener('beforeunload', function(event){ vObj.saveScrollPosition(); }); }, mounted: function(){ window.addEventListener("scroll", this.$refs.backtotopbutton.toggleBackToTopButton); this.$refs.backtotopbutton.$el.classList.add('dn'); // Keep button from flashing on load this.$refs.backtotopbutton.toggleBackToTopButton(); }, watch: { searchresults: function(){ this.$forceUpdate(); }, showsearchresults: function(x){ var offsetHeight = document.getElementById('main-searchresults-display').offsetHeight; var scrollp = this.getScrollPosition(); // document.getElementById('main-searchresults-display').style.minHeight = offsetHeight + "px"; // kind of a hack, since we don't exactly where to scroll yet lets just check if teh scroll position is even a little bit. // If it is, just show any results we have. We need to do setTimeout because of the delay rendering from Vue if (scrollp > 10){ setTimeout(function(){ var x = document.getElementsByClassName("js-Card"); for (var i = 0; i < x.length; i++) { x[i].style.opacity = 1; } var x = document.getElementsByClassName("js-List"); for (var i = 0; i < x.length; i++) { x[i].style.opacity = 1; } }, 550); } // if we are showing results, check to see if scrollPosition is stored and if it is scroll there after results are on the page // We need to do setTimeout because of the delay rendering from Vue if (x){ if (this.hasSessionStorage() && sessionStorage.getItem("scrollPosition") && sessionStorage.getItem("scrollURL") && sessionStorage.getItem("scrollURL") === this.getCurrentURL()){ var scrollPos = sessionStorage.getItem("scrollPosition"); if (!isNaN(scrollPos)){ setTimeout(function(){ window.scrollTo(0, scrollPos); // values are x,y-offset sessionStorage.removeItem("scrollPosition"); }, 550); } } } } }, methods: { logRelated: function(url){ // log function(useraction, useractiontype, actionvalue, altvalue) this.logStats("Related Search Click", "", encodeURIComponent(url), ""); }, shouldShowSidebar: function(){ var returnvalue = false; var sectioncount = 0; var sessionDayCount = this.getUniqueSessionDays('session').length; // for (var i = 0; i < this.searchresults.results.length; i++){ for (key in this.searchresults.results){ var result = this.searchresults.results[key]; if ("found" in result && result.found > 0){ sectioncount++; } } if (sessionDayCount > 1 && !this.hidesessiontimes){ sectioncount += sessionDayCount; } if (typeof this.showsidebar === "boolean"){ return this.showsidebar; } else if (sectioncount > 1){ return true; } else { return false; } }, // okay this is a little bit of a hack... we got rid of the ability to switch views on each individual section, so we will just bind the appropriate display config as needed getSectionDisplayOptions: function(section){ var tempReturn = []; switch (section){ case "session": case "exhibitor": case "guestappearances": tempReturn = [{"transition":"fade","display":this.content.gridText,"active":true,"displayoptioncontentid":0,"default":true,"name":"grid"},{"transition":"fade","display":this.content.listText,"active":true,"displayoptioncontentid":0,"default":true,"name":"list"}]; break; default: tempReturn = [{"transition":"fade","display":"List","active":true,"displayoptioncontentid":0,"default":true,"name":"list"}]; break; } return tempReturn; }, // now that we have the global section switcher and not the one at the top of the page we need a way of only getting options that are valid. So if // my searchresults only contains product categories (which are list only) then we only return list as the options getValidDisplayOptions: function(){ var searchResultsKeys = []; // array of search results names ['exhibitor', 'collateral', 'showfeature'] var returnDisplayOptions = []; // return array var returnDisplayOptionNames = {}; // this will be a structure of the names of sections that will be going back {'grid':true, 'list':true} // get search result sections if ("results" in this.searchresults){ // searchResultsKeys = Object.keys(this.searchresults.results); for (resultkey in this.searchresults.results){ if ("found" in this.searchresults.results[resultkey] && this.searchresults.results[resultkey].found > 0){ searchResultsKeys.push(resultkey); } } } // loop over search result sections and add to return as needed for (var i = 0; i < searchResultsKeys.length; i++){ var section = searchResultsKeys[i]; var currentDisplayOption = this.getSectionDisplayOptions(section); // for the current section we are on, only add if its not in our returnDisplayOptionNames struct for (var j = 0; j < currentDisplayOption.length; j++){ if (!(currentDisplayOption[j].name in returnDisplayOptionNames)){ returnDisplayOptions.push(currentDisplayOption[j]); } returnDisplayOptionNames[currentDisplayOption[j].name] = true; } } return returnDisplayOptions; }, getDisplaySections: function(){ var returnArray = []; for (key in this.searchresults.results){ if ((key in this.searchresults.results) && (this.searchresults.results[key].found > 0) && key != "featured") { returnArray.push(key); } } return returnArray; }, isSelected: function(selectedview2){ return (this.searchselectedview == selectedview2); }, switchDisplay: function(selectedview){ this.searchselectedview = selectedview; // var selectedview = vObj.getViewState(vObj.path, "exhsearchpage"); this.saveViewState(this.path, "exhsearchpage", selectedview); for (var i = 0; i < this.tempDisplayOptions.length; i++){ if (this.tempDisplayOptions[i].name == this.searchselectedview){ this.tempDisplayOptions[i].default=true; this.tempDisplayOptions[i].active=true; } else { this.tempDisplayOptions[i].default=false; this.tempDisplayOptions[i].active=false; } } }, validRecommendation: function(index){ return ((this.recommendedsearches.results.length > 0) && (this.recommendedsearches.results[index]) && ('MYS' in this.recommendedsearches.results[index])); }, getComponentType: function(name, hasmyshow, regemail){ var type = ""; for (var i = 0; i < keywordsearchconfig.length; i++) { if (keywordsearchconfig[i]['section'].toLowerCase() == name && keywordsearchconfig[i]['requireplanner'] == 1 && hasmyshow && regemail.length == 0) { return "requireplanner-search-results"; } } switch(name){ case "exhibitor": type = "exhibitor-search-results"; break; case "category": type = "category-search-results"; break; case "showfeature": type = "showfeature-search-results"; break; case "collateral": type = "collateral-search-results"; break; case "session": type = "session-search-results"; break; case "pavilion": type = "pavilion-search-results"; break; case "tradename": type = "tradename-search-results"; break; case "booth": type = "booth-search-results"; break; case "participatingexhibitors": type = "participatingexhibitors-search-results"; break; default: type = name + "-search-results"; break; } return type; }, totalhits: function(){ var value = 0; if (!isNaN(this.searchresults.totalhits)) { value += this.searchresults.totalhits; } if (!isNaN(this.recommendedexhibitors.results.length)){ value += this.recommendedexhibitors.results.length; } if (isNaN(value)){ return "..."; } else { return value; } }, getFloorplanSearchParameters: function(){ var returnObj = { st: "", sv: "" }; if (this.show.lastIndexOf("cat-", 0) === 0){ // use custom encode uri compoennt in global mixin var showsearchtype = decodeURIComponent(this.customURIEncode(this.show)).replace("cat-", "").replace(/\|[A-z0-9]+/g, ""); var showsearchval = decodeURIComponent(this.customURIEncode(this.show)).replace("cat-", "").replace(/[A-z0-9]+\|/g, ""); returnObj.sv = showsearchval; switch(showsearchtype){ case "category": case "countries": case "exhibitorcategoriesparents": returnObj.st = "category" if(showsearchval.slice(0,6) == "999999"){ returnObj.sv = showsearchval.slice(6,showsearchval.length); } break; case "pavilion": returnObj.st = "pavilion" break; } } else { returnObj.sv = this.searchtext; switch (this.searchtype){ case "exhibitor": case "keyword": returnObj.st = "keyword"; break; case "pavilion": returnObj.st = "pavilion"; returnObj.sv = this.searchtext; if ("selectvalues" in this.searchconfig[this.selectedsearchindex]){ for (var i = 0; i < this.searchconfig[this.selectedsearchindex].selectvalues.length; i++){ if (this.searchconfig[this.selectedsearchindex].selectvalues[i].fieldvalue == this.searchtext){ returnObj.sv = this.searchconfig[this.selectedsearchindex].selectvalues[i].fieldvalue; break; } } } break; case "category": returnObj.st = "category"; returnObj.sv = this.searchtext; break; case "state": returnObj.st = "state"; break; case "country": case "countries": returnObj.st = "country"; break; case "booth": returnObj.st = "booth"; break; case "exhibitoralpha": returnObj.st = "exhibitor"; returnObj.sv = (this.searchtext == "0") ? "#" : this.searchtext; break; case "featuredexhibitors": returnObj.st = "featuredexhibitors"; returnObj.sv = ""; break; case "newexhibitors": returnObj.st = "newexhibitors"; returnObj.sv = ""; break; case "meetings": returnObj.st = "meetings"; returnObj.sv = ""; break; case "exhibitorname": returnObj.st = "exhibitorname"; returnObj.sv = this.searchtext; break; case "subshow": returnObj.st = "subshow"; break; } } return returnObj; }, getFloorplanLink: function(){ var searchtype = this.getFloorplanSearchParameters().st; if(searchtype == 'category' && this.getFloorplanSearchParameters().sv.substring(0,6) == '999999'){ var searchvalue = this.getFloorplanSearchParameters().sv.substring(6); }else{ var searchvalue = this.getFloorplanSearchParameters().sv; } if (searchtype){ return this.path2approot + "/floorplan/index.cfm?st=" + encodeURIComponent(searchtype) + "&sv=" + encodeURIComponent(searchvalue); } else { return ""; } } }, computed: { shouldShowExhibitorHeader: function(){ return (('exhibitor' in this.searchresults.results) && (this.searchresults.results.exhibitor.found > 0) && (this.show == "all")); }, shouldShowCategoryHeader: function(){ return (('category' in this.searchresults.results) && (this.searchresults.results.category.found > 0) && (this.show == "all")); }, showRecommendedSearches: function(){ if ((this.recommendedsearches) && ("results" in this.recommendedsearches) && (this.recommendedsearches.results.length > 0)){ return true; } else { return false; } }, showsearchresults: function(){ return (this.searchresults.totalhits > 0 || this.recommendedexhibitors.results.length > 0) && !this.searching; }, noresultstext: function(){ if (this.searchtext == "1900-01-01T00:00:00Z" && (this.searchtype == "sessiondate" || this.searchtype == "sessionfulllist")) { return this.content.onDemandSessionLabelPlural; } else if (this.searchresults.searchtext){ return this.searchresults.searchtext; } else if (this.searchresultheader){ return this.searchresultheader; } else { return ""; } }, noresults: function(){ // TODO :: STEPHEN :: Make sure this is the right way to make sure we have no results //return (("totalhits" in this.searchresults && this.searchresults.totalhits == 0 && this.searchresults.searchtext.length > 0) ) ? true : false ; return (("totalhits" in this.searchresults && this.searchresults.totalhits == 0 && !this.searching) ) ? true : false ; }, content: function(){ return { resultPlural: this.displaycontent(this.compincludepath, 'resultPlural'), resultSingular: this.displaycontent(this.compincludepath, 'resultSingular'), forText: this.displaycontent(this.compincludepath, 'forText'), gridText: this.displaycontent(this.compincludepath, 'gridText'), listText: this.displaycontent(this.compincludepath, 'listText'), relatedSearchesText: this.displaycontent(this.compincludepath, 'relatedSearchesText'), onDemandSessionLabelSingular: this.displaycontent(this.compincludepath, 'onDemandSessionLabelSingular'), onDemandSessionLabelPlural: this.displaycontent(this.compincludepath, 'onDemandSessionLabelPlural') }; }, searchresultstext: function() { if (this.searchtext == "1900-01-01T00:00:00Z" && (this.searchtype == "sessiondate" || this.searchtype == "sessionfulllist")) { return (this.searchresults.totalhits > 1 ? this.content.onDemandSessionLabelPlural : this.content.onDemandSessionLabelSingular); } else { return this.searchresults.searchtext; } } } }); </script> <script type="text/x-template" id="countries-search-results-template"> <section class="results-section_wrapper mb6" id="country-results"> <div class="result-heading flex items-end mb3 pb2 justify-between" v-if="showresultheader || showviewallbutton || showdisplayoptions"> <h2 class="f3 ma0 mb4 mb0-l normal" v-if="searchresults.results.countries.found > 0"> <span class="ttu"> {{sectionheaderdisplay}} </span> <span class="f5 mr3 muted normal" v-if="showresultcount"> ( <span v-if="searchresults.results.countries.hit.length < searchresults.results.countries.found"> {{ searchresults.results.countries.hit.length}} {{content.of}} </span> {{ searchresults.results.countries.found }} ) </span> <span v-if="searchresults.results.countries.hit.length < searchresults.results.countries.found"> <a class="btn-tertiary btn-tertiary_small" v-bind:href="path2approot + '/#/searchtype/' + searchtype + '/search/' + searchtext + '/show/' + viewallsection" v-on:click="scrollToTop();"> {{content.viewAllButton}} </a> </span> </h2> <div class="btn-toggle-view-wrapper" v-if="tempDisplayOptions.length > 1"> <span v-for="(displayoption, index) in tempDisplayOptions"> <a class="toggle-grid btn-tertiary" href="" v-on:click.stop.prevent="switchDisplay(displayoption.name);" v-bind:class="[isSelected(displayoption.name) ? 'is-selected' : '']"> <svg class="v-mid mr2" width="24" height="24" role="img" aria-hidden="true"> <path viewBox="0 0 24 24" d="M4 22H0v-4h4v4zm0-12H0v4h4v-4zm0-8H0v4h4V2zm3 0v4h17V2H7zm0 12h17v-4H7v4zm0 8h17v-4H7v4z" id="toggle-list"></path> </svg> <span class="v-mid">{{displayoption.display}}</span> </a> </span> </div> </div> <div id="country-result-list" class="results-list-view toggle-list-view" v-if="$mq != 'medium' && $mq != 'large'"> <table id="country-result-list-table" class="results-table" cellpadding="0" cellspacing="0"> <thead> <th class="tl">{{content.tableHeadCountry}}</th> <th class="tl">{{content.tableHeadMatchingExhibitors}}</th> <th class="centered min-w2-xl tc"><span v-if="hasmyshow">{{content.tableHeadPlanner}}</span></th> </thead> <transition-group name="staggered-fade2" appear tag="tbody" v-bind:css="false" v-on:before-enter="beforeEnterStaggered" v-on:enter="enterStaggered" v-on:leave="leaveStaggered"> <generic-result-tr v-for="(result, index) in searchresults.results.countries.hit" v-bind:data-index="index" v-bind:data-totalitemcount="searchresults.results.countries.hit.length" v-bind:data-searchsize="searchsize" v-bind:key="'countriestr'+index" v-bind:title="result.fielddisplay" v-bind:subtitle="result.exhcount" v-bind:url="getCountrySubSearchURL(result.fieldvalue)" :showtogglefavorite="false"> </generic-result-tr> </transition-group> </table> </div> <div id="country-result-list-small" class="results-list-view toggle-list-view" v-if="($mq == 'large' || $mq == 'medium')"> <transition-group name="staggered-fade2" appear tag="ul" v-bind:css="false" v-on:before-enter="beforeEnterStaggered" v-on:enter="enterStaggered" v-on:leave="leaveStaggered" v-on:enter-cancelled="enterCancelled"> <generic-result-list v-for="(result, index) in searchresults.results.countries.hit" v-bind:data-index="index" v-bind:data-totalitemcount="searchresults.results.countries.hit.length" v-bind:data-searchsize="searchsize" v-bind:key="'countrieslist'+index" v-bind:title="result.fielddisplay" v-bind:subtitle="result.exhcount" v-bind:url="getCountrySubSearchURL(result.fieldvalue)" :showtogglefavorite="false"> </generic-result-list> </transition-group> </table> </div> </section></script> <script> var CountrySearchResults = Vue.component('countries-search-results', { data: function(){ return { resultsection: "countries", compincludepath: "includes/vue/search/countries-search-results-display.cfm", tempDisplayOptions: [{"transition":"fade","display":"List","active":true,"displayoptioncontentid":0,"default":true,"name":"list"}], tempSelectedView: 'list', startindex: 0 // used for staggered transition } }, mixins: [staggeredTransitionsMixin, searchDisplayMixin], props: ["searchresults", "searchtext", "searchtype", "searchsize"], template:"#countries-search-results-template", computed: { content: function(){ return { loadingoptionstext: this.displaycontent(this.compincludepath, 'loadingOptionsText'), viewAllButton: this.displaycontent(this.compincludepath, 'viewAllButton'), displayResultHeader: this.displaycontent(this.compincludepath, 'displayResultHeader'), tableHeadCountry: this.displaycontent(this.compincludepath, 'tableHeadCountry'), tableHeadPlanner: "", tableHeadMatchingExhibitors: this.displaycontent(this.compincludepath, 'tableHeadMatchingExhibitors'), loadMoreResults: this.displaycontent(this.compincludepath, 'loadMoreResults'), of: this.displaycontent(this.compincludepath, 'of') }; }, showresultheader: function(){ return Object.keys(this.searchresults.results).length > 1 && this.searchresults.results.countries.found > 0 ; }, showviewallbutton: function(){ return this.searchresults.results.countries.hit.length < this.searchresults.results.countries.found; }, showdisplayoptions: function(){ return this.displayoptions.length > 1; } }, methods: { loadMore: function(){ this.startindex = this.searchresults.results[this.resultsection].hit.length; this.$emit('load-more-results', this.resultsection); }, getCountrySubSearchURL: function(country){ return this.thispageurl + "/#/show/cat-countries|" + encodeURIComponent(country); } } }); </script> <style> .card-Wrapper { display: flex; justify-content: left; } </style> <script type="text/x-template" id="breadcrumb-display-template"> <div class="breadcrumbs-wrapper flex-l justify-between-l mt2 mb5" v-html="breadcrumbdisplaycontent"></div></script> <script> var BreadcrumbsDisplay = Vue.component('breadcrumbs-display', { template:"#breadcrumb-display-template", props: ["content"], computed: { breadcrumbdisplaycontent: function(){ if (!this.content){ return "\r\n\t\t<ul class=\"o-Breadcrumbs list f6 ma0 mb4\">\r\n\t\t\t\r\n\t\t\t\t\t<li class=\"dib\"><a class=\"link_basic\" href=\"&#x2f;8_0&#x2f;index.cfm&#x3b;jsessionid&#x3d;86BDC7B6ACD523DBE8933E058CFA1BF9.vts&#x3f;CFID&#x3d;51998055&amp;CFTOKEN&#x3d;328b006cbeab152b-4519A59F-0E66-4616-0EBF6D39BF9E1BA4\">\r\n\t\t\t\tHome \r\n\t\t\t\t\t</a></li>\r\n\t\t\t\t\r\n\t\t\t\t\t<li class=\"dib\" title=\"Countries\">\r\n\t\t\t\tCountries \r\n\t\t\t\t\t</li>\r\n\t\t\t\t\r\n\t\t</ul>\r\n\t\r\n\t\r\n\t\r\n\t<span>\r\n\t\t\r\n\t</span>\r\n"; } else { return this.content; } } }, methods: { getUpdatedBreadcrumbs: function(){ } } }); </script> <div id="search" class="l-search mt3"> <message-display v-bind:messages="messages" v-bind:type="messagetype" v-bind:showmessage="showmessage" :timeout="5"> </message-display> <search-results-display v-bind:searchresults="searchresults" v-bind:recommendedexhibitors="recommendedexhibitors" v-bind:recommendedsearches="recommendedsearches" v-bind:searchconfig="searchconfig" v-bind:selectedsearchindex="selectedsearchindex" v-bind:keywordsearchconfig="keywordsearchconfig" v-bind:searching="searching" v-bind:show="show" v-bind:searchtext="searchtext" v-bind:searchtype="searchtype" v-bind:searchresultheader="customtitle" v-bind:displayoptions="quicklistconfig.displayoptions" v-bind:showheader="true" v-bind:showresultcount="quicklistconfig.showresultcount" v-on:load-more-results="loadMoreResults" v-on:view-all-results="viewAllResults" v-if="searchperformed"> <breadcrumbs-display v-if="searchperformed" slot="top" v-bind:content="breadcrumbcontent"></breadcrumbs-display> </search-results-display> </div> <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">&bull;</span>&copy;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> <script> quicklistMixin.created = function(){ var currentRoute = this.$router.currentRoute; // the current route we are on if (currentRoute.params.show) { this.show = currentRoute.params.show; } this.customPerformSearch(); }; var router = new VueRouter({ routes: [ { path: '/show/:show' }] }); var app = new Vue({ el: '#search', router: router, mixins: [quicklistMixin], // see /includes/vue/generic/_global-mixin.cfm for definition watch: { '$route': function(to, from) { console.log(to.params.show); if (typeof to.params.show != 'undefined'){ this.show = to.params.show; this.customPerformSearch(); // call search } else { this.show = 'countries'; this.customPerformSearch(); } } }, data: { name: "countries", searchtype:"countries", resultsheader: "Countries", headeroptions: { titleheader:"", // *** Step 3 *** fill in appropriate header subtitleheader:"" // *** Step 4 *** fill in appropriate subtitle header }, selectedview2: 'grid', show: "countries" }, methods: { switchDisplayGeneric: function(view){ this.selectedview2 = view; }, customPerformSearch: function(){ var onSuccess = function(){}; var vObj = this; onSuccess = function(){ var header = vObj.searchresults.searchtext; var breadcrumbRequest = []; if (vObj.show != "all"){ breadcrumbRequest = [{ title: vObj.customtitle, titlecontentid: vObj.customtitlecontentid, scriptname: vObj.path2approot + "/explore/countries.cfm#/", querystring: "", resetto: "reset" },{ title: vObj.searchresults["searchtext"], scriptname: vObj.path2approot + "/explore/countries.cfm/#/show/" + vObj.show, querystring: "", resetto: "" }]; } else { breadcrumbRequest = [{ title: vObj.customtitle, titlecontentid: vObj.customtitlecontentid, scriptname: vObj.path2approot + "/explore/countries.cfm/#/show/" + vObj.show, querystring: "", resetto: "reset" }]; } var response = vObj.updateBreadcrumb(breadcrumbRequest); }; this.performSearch(onSuccess); } } }); </script> </body> </html>

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