CINXE.COM
Search the Agenda
<!DOCTYPE html> <html lang="en"> <head> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /> <meta charset="utf-8" /><script type="text/html" id="sf-tracking-consent-manager"> <style> /*Consent Form*/ #tracking-consent-dialog { padding: 15px; position: fixed; bottom: 0; right: 5px; width: 337px; border: 3px solid #1e82e0; border-radius: 5px 5px 0px 0px; background: rgba(255, 255, 255, .95); font-size: 16px; z-index: 999; } #tracking-consent-dialog-accept { background-color: #1e82e0; color: #fff; font-size: 16px; font-weight: 500; float: right; } .consent-close { font-weight: bold; float: right; padding: 2px 7px; right: 6px; top: 3px; cursor: pointer; font-size: 11px; position: absolute; background-color: #1e82e0; color: #fff; z-index: 999; border-radius: 50%; } @media (max-width: 767px) { #tracking-consent-dialog { width: 100%; font-size: 14px; } } </style> <div id="tracking-consent-dialog"> <div class="consent-close" onclick="TrackingConsentManager.updateUserConsent(true)">X</div> <strong>Cookie Policy</strong> <p>CII uses cookies to improve your website & conference experiences, including enhancing website navigation, personalized features & promotions, evaluating our services, and customizing content and ads based on your preferences as you browse or engage with us. By clicking "Continue" or continuing to use our site, you are agreeing to our and our partners use of cookies. See our <a href="https://www.cambridgeinnovationinstitute.com/Privacy-Policy/">Privacy Policy</a> for more information.</p> <button type="button" onclick="TrackingConsentManager.updateUserConsent(true)" id="tracking-consent-dialog-accept" class="btn btn-default">Continue</button> </div> </script><script type="text/javascript" src="/WebResource.axd?d=DzHrpQl5URXarFHAtrmzFrNeeCwCLwHK2gvGZ95fW9WnidZLXrfDlGTuxUr3l463ttkzDVh9D8Bug9pu7NHdr_V4jKJPpR5aBflu4f8Ts5edKoXW2sH8LcSZSfqlYNJ5LpoUn5WBE_fdKcz0yNVMxY3w_4XLcip6ESbZeM3DDdUqeeNFFCEiKQKGKqR186oo0&t=637922505220000000"> </script> <script src="/ScriptResource.axd?d=okuX3IVIBwfJlfEQK32K3iZZtiInnD21Q3naS01thH9-fzUaksT1ZtMUjWfsR2IfFrdwuSgx30ngwb9MjfyLwf8qicr33ktg3mwcpW2o3dsDH8d3-t4otTq9qT-5mrFfzK1f5nCn185AY5nCZScdoqJ1WOdlA_-4T4B_v3AbufPsc2J5Jr9-kOiHGAB_hap-0&t=4e1c7b51" type="text/javascript"></script><script src="/ScriptResource.axd?d=EydukmxBmDstn7gSYzQESGX1Bc6SUabUViYB9LpdmFW6eZLmGFNo26FA-YqkH5f3QjtPWjAHxth32_ExmLGGY1zv6AdaQenYAqaM29qW1bTxx1r5T--aFytKsL9IQMjnWBhhM3Ox0iMnCMCJK5xrzQardvmrid9DGkma-HwbE57flKsxZSkIFbT-h8oEIp2m0&t=4e1c7b51" type="text/javascript"></script><link href="/ResourcePackages/Bootstrap/assets/dist/css/main.min.css" rel="stylesheet" type="text/css" /><link href="/css/global.css" rel="stylesheet" type="text/css" /><link href="/css/editor.css" rel="stylesheet" type="text/css" /> <link href="//fonts.googleapis.com/css?family=Roboto:500,400,700" rel="stylesheet" type="text/css"> <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no" /> <meta property="og:title" content="Search the Agenda" /><meta property="og:url" content="https://www.nextgenerationdx.com/search" /><meta property="og:type" content="website" /><meta property="og:site_name" content="Next Generation DX" /><link href="/css/24/adx/style-adx.css" media="all" rel="stylesheet" type="text/css" /><script type="text/javascript"> (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src='https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);})(window,document,'script','dataLayer','GTM-WHXWSB9'); </script><script type="text/javascript"> var link = document.createElement('link'); link.id = 'dynamic-favicon'; link.rel = 'shortcut icon'; link.href = '/images/librariesprovider44/template-images/24/favicon.png'; document.head.appendChild(link); </script><style type="text/css" media="all"> .agenda-search { font-size: 30px; margin-bottom: 5px; font-weight: 500; line-height: 1.1; } #searchInput { border: 2px solid #c3454c; height: 40px; } #searchButton { background-color: #c3454c; font-size: 16px; height: 40px; } .description { font-size: 16px; } #results { margin-top: 20px; } /* Add more custom styles as needed */ .highlight { display: inline; background-color: yellow; /* Example highlight */ } .card { margin-bottom: 30px; } .card-title { color: #c3454c; font-size: 20px; font-weight: bold; } #resultsCount { padding-top: 10px; font-weight: 500; } .card-text.text-medium-small { font-size: 16px; } .card-date-footer { color: #c3454c; font-size: 16px; } .speakerX { font-style: italic; font-size: 16px; } a { text-decoration: none; } .margin-left-custom { margin-left: 0.5rem; /* Or 1rem, or whatever space you need */ } .margin-top-2 { margin-top: 5px; /* This emulates 'mb-3' in Bootstrap 4 which typically means 1rem (16px) */ } .margin-bottom-2 { margin-bottom: 5px; /* This emulates 'mb-3' in Bootstrap 4 which typically means 1rem (16px) */ } /*.margin-bottom-3 { margin-bottom: 10px; /* This emulates 'mb-3' in Bootstrap 4 which typically means 1rem (16px) */ } .padding-3 { padding: 10px; } .header-with-spinner { display: flex; align-items: center; /* Ensures vertical center alignment */ line-height: normal; /* Ensure the line height is normal for better control */ } .loader { border: 4px solid #f3f3f3; /* Light grey */ border-top: 4px solid rgb(89, 112, 178); /* Blue */ border-radius: 50%; width: 20px; height: 20px; animation: spin 2s linear infinite; display: none; /* Hidden by default */ margin-left: 10px; /* Adds some space between the text and the spinner */ margin-bottom: -8px; /* Adds some space between the text and the spinner */ } @keyframes spin { 0% { transform: translate(-50%, -50%) rotate(0deg); } 100% { transform: translate(-50%, -50%) rotate(360deg); } } </style><meta name="Generator" content="Sitefinity 14.2.7900.0 DX" /><link rel="canonical" href="https://www.nextgenerationdx.com/search" /><script type="application/json" id="sf-insight-metadata"> {"contentMetadata":"{\"Id\":\"d12fbbb4-0b93-42f4-8955-7173d7dd8f2b\",\"ContentType\":\"Page\",\"Title\":\"Search the Agenda\",\"CanonicalTitle\":\"Search the Agenda\",\"CanonicalUrl\":\"https://www.nextgenerationdx.com/search\",\"CreatedOn\":\"2024-07-01T14:50:22Z\",\"ModifiedOn\":\"2024-07-10T14:21:08Z\",\"SiteName\":\"Next Generation DX\",\"PageId\":\"d12fbbb4-0b93-42f4-8955-7173d7dd8f2b\"}","videosMetadata":"[]"} </script><script type="application/json" id="sf-insight-settings"> {"apiServerUrl":"https://api.insight.sitefinity.com/","apiKey":"62dc77b5-9fbc-74c6-8f79-d05463f0565e","applicationName":"CII_DEC","trackingCookieDomain":"","keepDecTrackingCookieOnTrackingConsentRejection":false,"slidingExpirationForTrackingCookie":false,"maxAgeForTrackingCookieInDays":365,"trackYouTubeVideos":true,"strategy":"Persist|False","docsHrefTestExpressions":[".*\\/docs\\/.+\\.{1}.+((\\?|\\\u0026)sfvrsn=.+){1}$",".+((\\?|\\\u0026)sf_dm_key=.+){1}$"]} </script><script type="text/javascript" src="/WebResource.axd?d=HtQyXelCu6mzSPcVcvK_BrDGcMZ2eaAwTGCTL_5l9xvo0iV9h2YYkvXanQ1uf0LidxbxWd8AzxNrppPmU7C9KnzDV98eKbg88D2zgKyY_GVq-IK4cwpq3ApmVVQHZ20G6_cSyVvbsc3d7cEOVVpoZalFAGFOo2fFcbG9u0riPX3ha1PNvfZCNU2C8dj5lXB2aevtM9BprQUEvuhENe--svD7i9F-8WutvDj5rAfLCkI1&t=637922505220000000"> </script><script src="https://cdn.insight.sitefinity.com/sdk/sitefinity-insight-client.min.3.1.7.js" async="async"> </script><link href="/Telerik.Web.UI.WebResource.axd?d=PMrIT5dOWaVYIcpFWUE4nCGcRFDqtHj8a0dT9N7jtPAWgyp5t5fff0pvXeFargWg3kuRljuyyjKW8grLvrafOr9X0kIEdj24q9AbiZ0prs7qITvLoGQxdqYfpMFPSD250&t=638482241021526486&compress=0&_TSM_CombinedScripts_=%3b%3bTelerik.Sitefinity.Resources%2c+Version%3d14.2.7900.0%2c+Culture%3dneutral%2c+PublicKeyToken%3db28c218413bdf563%3aen%3aec7772cc-ee32-478e-8437-4242283bb12f%3a7a90d6a" type="text/css" rel="stylesheet" /><title> Search the Agenda </title></head> <body><form method="post" action="./search" id="aspnetForm"> <div class="aspNetHidden"> <input type="hidden" name="ctl04_TSM" id="ctl04_TSM" value="" /> <input type="hidden" name="ctl05_TSSM" id="ctl05_TSSM" value="" /> <input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" /> <input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" /> <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="kdSBeqcRxX+oMrrJvwqEnnp00P8fB8Rz6AIAxjfY+KNLBa5GTaRgIA+eI2T4g0fzV69iOZGLJh8qxsicqodkM3KEOxpghl748pQV6z4FWzI=" /> </div> <script type="text/javascript"> //<![CDATA[ var theForm = document.forms['aspnetForm']; if (!theForm) { theForm = document.aspnetForm; } function __doPostBack(eventTarget, eventArgument) { if (!theForm.onsubmit || (theForm.onsubmit() != false)) { theForm.__EVENTTARGET.value = eventTarget; theForm.__EVENTARGUMENT.value = eventArgument; theForm.submit(); } } //]]> </script> <script src="/WebResource.axd?d=pynGkmcFUV13He1Qd6_TZA_YQJD9xSUnUi70uTXUUGkw9zf_LlVkiouvQJnBXeCn1svgT4yxk9LfN7iuqrWtXg2&t=638459680569584809" type="text/javascript"></script> <script type="text/javascript"> //<![CDATA[ var __cultureInfo = {"name":"en","numberFormat":{"CurrencyDecimalDigits":2,"CurrencyDecimalSeparator":".","IsReadOnly":true,"CurrencyGroupSizes":[3],"NumberGroupSizes":[3],"PercentGroupSizes":[3],"CurrencyGroupSeparator":",","CurrencySymbol":"$","NaNSymbol":"NaN","CurrencyNegativePattern":0,"NumberNegativePattern":1,"PercentPositivePattern":1,"PercentNegativePattern":1,"NegativeInfinitySymbol":"-∞","NegativeSign":"-","NumberDecimalDigits":2,"NumberDecimalSeparator":".","NumberGroupSeparator":",","CurrencyPositivePattern":0,"PositiveInfinitySymbol":"∞","PositiveSign":"+","PercentDecimalDigits":2,"PercentDecimalSeparator":".","PercentGroupSeparator":",","PercentSymbol":"%","PerMilleSymbol":"‰","NativeDigits":["0","1","2","3","4","5","6","7","8","9"],"DigitSubstitution":1},"dateTimeFormat":{"AMDesignator":"AM","Calendar":{"MinSupportedDateTime":"\/Date(-62135578800000)\/","MaxSupportedDateTime":"\/Date(253402300799999)\/","AlgorithmType":1,"CalendarType":1,"Eras":[1],"TwoDigitYearMax":2029,"IsReadOnly":true},"DateSeparator":"/","FirstDayOfWeek":0,"CalendarWeekRule":0,"FullDateTimePattern":"dddd, MMMM d, yyyy h:mm:ss tt","LongDatePattern":"dddd, MMMM d, yyyy","LongTimePattern":"h:mm:ss tt","MonthDayPattern":"MMMM d","PMDesignator":"PM","RFC1123Pattern":"ddd, dd MMM yyyy HH\u0027:\u0027mm\u0027:\u0027ss \u0027GMT\u0027","ShortDatePattern":"M/d/yyyy","ShortTimePattern":"h:mm tt","SortableDateTimePattern":"yyyy\u0027-\u0027MM\u0027-\u0027dd\u0027T\u0027HH\u0027:\u0027mm\u0027:\u0027ss","TimeSeparator":":","UniversalSortableDateTimePattern":"yyyy\u0027-\u0027MM\u0027-\u0027dd HH\u0027:\u0027mm\u0027:\u0027ss\u0027Z\u0027","YearMonthPattern":"MMMM yyyy","AbbreviatedDayNames":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],"ShortestDayNames":["Su","Mo","Tu","We","Th","Fr","Sa"],"DayNames":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"AbbreviatedMonthNames":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec",""],"MonthNames":["January","February","March","April","May","June","July","August","September","October","November","December",""],"IsReadOnly":true,"NativeCalendarName":"Gregorian Calendar","AbbreviatedMonthGenitiveNames":["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec",""],"MonthGenitiveNames":["January","February","March","April","May","June","July","August","September","October","November","December",""]},"eras":[1,"A.D.",null,0]};//]]> </script> <script src="/Telerik.Web.UI.WebResource.axd?_TSM_HiddenField_=ctl04_TSM&compress=0&_TSM_CombinedScripts_=%3b%3bSystem.Web.Extensions%2c+Version%3d4.0.0.0%2c+Culture%3dneutral%2c+PublicKeyToken%3d31bf3856ad364e35%3aen%3a18f1b484-bbc5-4e2e-8ca4-477603537f34%3aea597d4b%3ab25378d2" type="text/javascript"></script> <script src="/ScriptResource.axd?d=oBrf1f-DLFBYf_XnAiQIerYbp6DB1yP-XX6e2f1MfVZVh0-b8UJuYKCCtCgeTZdgs__r0fZWEGLHIbAdafwt8M9e685ZdEjP_79w8Op8pqlhtK8RVD9yvuuHQYso7wAeipQsr1KNKlxF-82gFsHvkROGzjmcQ59FFLTFjwumrh-7zfhoHiIXFsqfCwU3VcIw0&t=4e1c7b51" type="text/javascript"></script> <script src="/Telerik.Web.UI.WebResource.axd?_TSM_HiddenField_=ctl04_TSM&compress=0&_TSM_CombinedScripts_=%3b%3bTelerik.Sitefinity.Resources%3aen%3aec7772cc-ee32-478e-8437-4242283bb12f%3ab162b7a1" type="text/javascript"></script> <script src="/Frontend-Assembly/Telerik.Sitefinity.Frontend/Mvc/Scripts/Bootstrap/js/bootstrap.min.js?package=Bootstrap&v=MTQuMi43OTAwLjA%3d" type="text/javascript"></script> <script src="/js/sgs/menu-wsub.js" type="text/javascript"></script> <div class="aspNetHidden"> <input type="hidden" name="__VIEWSTATEGENERATOR" id="__VIEWSTATEGENERATOR" value="DF093757" /> </div><script type="text/javascript"> //<![CDATA[ Sys.WebForms.PageRequestManager._initialize('ctl00$ctl04', 'aspnetForm', [], [], [], 90, 'ctl00'); //]]> </script> <input type="hidden" name="ctl00$ctl04" id="ctl04" /> <script type="text/javascript"> //<![CDATA[ Sys.Application.setServerId("ctl04", "ctl00$ctl04"); Sys.Application._enableHistoryInScriptManager(); //]]> </script> <iframe id="__historyFrame" src="/ScriptResource.axd?d=DhpBo2bIVq6NTYGcjOGYPRgaW7lU4zND1H_tLloqwFCsND0b1E7zihC0yRV6EIZSIkDflrACzL7zIfOvnprsZmrsx0aKqJ8TNq8ZrC259Co1" style="display:none;"> </iframe> <div> <div class="navbar navbar-default navbar-fixed-top"> <a class="navbar-brand large" href="/"></a> <div class="navbar-header"> <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse"> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> </div> <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"> <ul class="nav navbar-nav large-nav" role="menu"> <li class="dropdown"> <a href="#" class="dropdown-toggle" role="button"> Agenda </a> <ul role="menu" class="dropdown-menu"> <li class=""> <a href="/programs" target="_self">Programs</a> </li> <li class=""> <a href="/plenary-session" target="_self">Plenary Session</a> </li> <li class=""> <a href="/poc-special-forums" target="_self">POC Special Forums</a> </li> <li class=""> <a href="/Interactive-Discussions" target="_self">Interactive Discussions</a> </li> <li class=""> <a href="/Speaker-Biographies" target="_self">Speaker Biographies</a> </li> <li class=""> <a href="/attendees" target="_self">Attendees</a> </li> <li class="active"> <a href="/search" target="_self">Search the Agenda</a> </li> <li class=""> <a href="/networking" target="_self">1-on-1 Networking</a> </li> <li class=""> <a href="/testimonials" target="_self">Testimonials</a> </li> <li class=""> <a href="/archives" target="_self">Archives</a> </li> </ul> </li> <li class="dropdown"> <a href="#" class="dropdown-toggle" role="button"> Sponsor/Exhibitor </a> <ul role="menu" class="dropdown-menu"> <li class=""> <a href="/Sponsor" target="_self">Event Features & Attendee Demographics</a> </li> <li class=""> <a href="/Sponsorship-Opportunities" target="_self">Sponsorship Opportunities</a> </li> <li class=""> <a href="/current-sponsors" target="_self">Current Sponsors</a> </li> <li class=""> <a href="https://www.intheorious.com/chi/pub/adx2024b_pub/" target="_blank">Current Exhibitors/Floorplan</a> </li> <li class=""> <a href="https://www.intheorious.com/chi/pub/adx2025b_pub/" target="_blank">Re-sign Floorplan</a> </li> <li class=""> <a href="/Exhibitor-prospectus-download-form" target="_self">Exhibitor Prospectus</a> </li> <li class=""> <a href="/Exhibit-Services-Schedule" target="_self">Exhibit Services/Schedule</a> </li> <li class=""> <a href="http://www.healthtech.com/Lead-Gen/" target="_blank">Lead Generation Opportunities</a> </li> <li class=""> <a href="/FAQ" target="_self">FAQ</a> </li> </ul> </li> <li class="dropdown"> <a href="#" class="dropdown-toggle" role="button"> Downloads </a> <ul role="menu" class="dropdown-menu"> <li class=""> <a href="/brochures" target="_self">Brochures</a> </li> <li class=""> <a href="/articles" target="_self">Articles</a> </li> <li class=""> <a href="/video-gallery" target="_self">Videos</a> </li> <li class=""> <a href="/media-gallery" target="_self">Media Gallery</a> </li> </ul> </li> <li class=""><a href="/travel" target="_self">Travel</a></li> <li class="dropdown"> <a href="#" class="dropdown-toggle" role="button"> Posters </a> <ul role="menu" class="dropdown-menu"> <li class=""> <a href="/posters" target="_self">Poster Information</a> </li> <li class=""> <a href="/poster-titles" target="_self">Poster Titles</a> </li> </ul> </li> <li class="dropdown"> <a href="#" class="dropdown-toggle" role="button"> Get Involved </a> <ul role="menu" class="dropdown-menu"> <li class=""> <a href="/ways-to-participate" target="_self">Ways to Participate</a> </li> <li class=""> <a href="/get-involved/media-partners" target="_self">Media Partners</a> </li> </ul> </li> <li class="dropdown"> <a href="#" class="dropdown-toggle" role="button"> Register </a> <ul role="menu" class="dropdown-menu"> <li class=""> <a href="https://register.cambridgeinnovationinstitute.com/reg/adx" target="_self">Conference Pricing</a> </li> <li class=""> <a href="https://register.cambridgeinnovationinstitute.com/reg/adx/group" target="_self">Group Pricing</a> </li> <li class=""> <a href="https://register.cambridgeinnovationinstitute.com/reg/adx/ondemand" target="_self">On-Demand Pricing</a> </li> <li class=""> <a href="https://www.healthtech.com/press.aspx" target="_self">Request a Press Pass</a> </li> </ul> </li> </ul> </div><!-- /.navbar-collapse --> </div> </div> <div > <div class="sf-Long-text" ><!-- Mobile Banner --> <div class="mobile-header hidden-sm hidden-md hidden-lg"><a href="/"><img src="/images/librariesprovider44/template-images/24/header-mob.png?sfvrsn=b7b04764_3" title="Next Generation DX" alt="Next Generation DX" class="imageResize" /></a> </div></div> </div> <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-WHXWSB9" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript> <div class="main-content"> <div id="cph1" class="container internal"> <div class="row"> <div class="row" data-sf-element="Row"> <div class="col-sm-9"> <div id="Contentplaceholder1_TAF1834A7001_Col00" class="sf_colsIn pad-lr" data-sf-element="Column 1" data-placeholder-label="Column 1"> <div > <div class="sf-Long-text" ><div class="container-relative"><div class="title-header"><p class="agenda-search">Search Agenda </p><p class="description">Search across our conference programs and speakers. Find the presentations and topics most relevant to you. </p></div><div class="row"><div class="col-md-12 col-lg-12 mx-auto"><div class="input-group"><input class="form-control" id="searchInput" maxlength="260" name="query" placeholder="Search..." type="text" /><span class="input-group-btn"><button class="btn btn-primary" id="searchButton" type="button">Search</button></span> </div><div class="text-center mt-1" id="resultsCount"></div></div></div><div class="mt-2" id="results"></div><div class="loader mx-auto" id="spinner"></div></div></div> </div></div> </div> <div class="col-sm-3"> <div id="Contentplaceholder1_TAF1834A7001_Col01" class="sf_colsIn pad-lr" data-sf-element="Column 2" data-placeholder-label="Column 2"><div class='sfContentBlock'><hr class="hidden-md hidden-lg" /><div class="social-icons"><a target="_blank" href="/docs/librariesprovider44/ics/24/adx24.ics?sfvrsn=8ee14db0_1&download=true" title="Outlook"><img src="/images/default-source/social/calendar-gray.png?sfvrsn=91696e36_6" title="Outlook" alt="Outlook" class="social-icon" /></a> <a href="https://www.youtube.com/playlist?list=PLlQuNnp-neQYao99lVeLbtnG5LLg4MsGc" target="_blank" title="YouTube"><img src="/images/default-source/social/youtube-gray.png?sfvrsn=6bad7b8f_4" title="YouTube" alt="YouTube" class="social-icon" /></a> <a href="https://www.facebook.com/HealthtechConferences" target="_blank" title="Facebook"><img src="/images/default-source/social/facebook-gray.png?sfvrsn=35d4a48c_4" title="Facebook" alt="Facebook" class="social-icon" /></a> <a href="https://www.linkedin.com/groups/4334406/" target="_blank" title="LinkedIn"><img src="/images/default-source/social/linkedin-gray.png?sfvrsn=ed70471e_4" title="LinkedIn" alt="LinkedIn" class="social-icon" /></a> <a href="https://twitter.com/CHI_Healthtech" target="_blank" title="Twitter"><img src="/images/default-source/social/twitter-gray.png?sfvrsn=bac909e7_7" title="Twitter" alt="Twitter" class="social-icon" /></a> </div><div class="sidebar-hashtag"><b>#NGDx</b> </div><hr /><div><a href="https://register.cambridgeinnovationinstitute.com/reg/adx/ondemand"><img src="/images/librariesprovider44/sidebar/24/early-bird-registration.png?sfvrsn=97bf9bcf_13" class="imageResize" alt="Register" /></a> </div><div class="sidebar-item"><a href="/docs/librariesprovider44/agenda-files/24/adx24-cag.pdf?sfvrsn=9614f596_2" target="_blank"><img src="/images/librariesprovider44/sidebar/24/download-cag.png?sfvrsn=59baf8c3_1" class="imageResize" alt="CAG" /></a> </div><div class="sidebar-item"><a href="/2024-brochure-download-form"><img src="/images/librariesprovider44/sidebar/24/download-brochure.png?sfvrsn=ea489451_1" class="imageResize" alt="Download Brochure" /></a> </div><div class="sidebar-item"><a href="/posters"><img src="/images/librariesprovider44/sidebar/24/submit-poster.png?sfvrsn=dddefc4_1" class="imageResize" alt="Present a Research Poster" /></a> </div><div class="sidebar-item"><a href="/ways-to-participate"><img src="/images/librariesprovider44/sidebar/24/ways-to-participate.png?sfvrsn=c749063b_1" class="imageResize" alt="Ways to Participate" /></a> </div><!-- <div class="sidebar-item"><a href="/2023-brochure-download-form"><img src="/images/librariesprovider44/agenda/23/download-brochure.png?sfvrsn=f7097138_1" class="imageResize" alt="Download Brochure" sfref="[images%7ClibrariesProvider44]050831f0-5d01-4021-b2ce-afebbf7a03e9" data-sf-ec-immutable="" /></a> </div> <div class="sidebar-item"><a href="/docs/librariesprovider44/agenda-files/23/adx23-cag.pdf?sfvrsn=4d2687b3_4" target="_blank" sfref="[documents%7ClibrariesProvider44]1b9bc89d-dfbd-4f48-ad7f-893730ebd666"><img src="/images/librariesprovider44/sidebar/23/download-cag.png?sfvrsn=e2908130_2" class="imageResize" alt="CAG" sfref="[images%7ClibrariesProvider44]a6c8ce92-8f58-4f28-a668-cb5a65d1cc8a" data-sf-ec-immutable="" /></a> </div> <div class="sidebar-item"><a href="/attendees"><img src="/images/librariesprovider44/sidebar/23/rc-view-attendees.png?sfvrsn=97e38fe3_2" class="imageResize" alt="attendees" sfref="[images%7ClibrariesProvider44]7a7dc451-8e9e-4ba6-aecd-632a91175c14" data-sf-ec-immutable="" /></a> </div> --> <hr /><p class="terciary-text text-center"><b>2024 Conference Programs</b></p><div class="sidebar-cag sidebar-cag-one flush-top"><p><a href="/stream/poct-infectious-disease"><img src="/images/librariesprovider44/sidebar/24/stream1.png?sfvrsn=8ba3bf89_1" class="imageResize" alt="POCT and Infectious Disease Stream" /></a></p><p><a href="/point-of-care-diagnostics" data-sf-ec-immutable="">Enabling Point-of-Care Diagnostics</a></p><p><a href="/infectious-disease-diagnostics" data-sf-ec-immutable="">Advanced Diagnostics for Infectious Disease</a></p></div><div class="sidebar-cag sidebar-cag-two"><p><a href="/stream/companion-dx-reimbursement"><img src="/images/librariesprovider44/sidebar/24/stream2.png?sfvrsn=5c10e359_1" class="imageResize" alt="Companion DX Reimbursement Stream" /></a></p><p><a href="/companion-diagnostics" data-sf-ec-immutable="">Advancing Novel Frameworks for Companion Diagnostics</a></p><p><a href="/reimbursement-diagnostics" data-sf-ec-immutable="">Coverage and Reimbursement for Advanced Diagnostics</a></p></div><div class="sidebar-cag sidebar-cag-three"><p><a href="/stream/liquid-biopsy"><img src="/images/librariesprovider44/sidebar/24/stream3.png?sfvrsn=99bb9fde_1" class="imageResize" alt="Early Detection and Liquid Biopsy Stream" /></a></p><p><a href="/liquid-biopsy" data-sf-ec-immutable="">Liquid Biopsy for Disease Management</a></p><p><a href="/early-cancer-surveillance" data-sf-ec-immutable="">Early Cancer Surveillance</a></p></div><div class="sidebar-cag sidebar-cag-four"><p><a href="/stream/decentralized-testing"><img src="/images/librariesprovider44/sidebar/24/stream4.png?sfvrsn=aa9fd25a_1" class="imageResize" alt="POTC Product Stream" /></a></p><p><a href="/point-of-care-diagnostics" data-sf-ec-immutable="">Enabling Point-of-Care Diagnostics</a></p><p><a href="/decentralized-poc-testing" data-sf-ec-immutable="">Decentralized POC Testing</a></p></div><div class="sidebar-cag sidebar-cag-poc"><p><a href="/poc-special-forums"><img src="/images/librariesprovider44/sidebar/24/forums.png?sfvrsn=6debf4e6_1" class="imageResize" alt="POTC Product Stream" /></a></p><div class="sidebar-cag-poc-inner"><p><a href="/point-of-care-strategies" data-sf-ec-immutable="">POC Product Strategies, Market Access, and Implementation</a></p><p><a href="/point-of-care-technologies" data-sf-ec-immutable="">POC Histology</a></p><p><a href="/regulatory-strategies-for-poct" data-sf-ec-immutable="">Regulatory Strategies for POC Diagnostics</a></p></div></div> </div></div> </div> </div> </div> </div> </div> <footer> <div > <div class="sf-Long-text" ><div class="footer"><div class="container"><div class="row"><div class="col-sm-3 col-xs-12"><div class="footer-small"><div class="footer-small-inner"><img alt="CHI | Cambridge HealthTech Institute" class="CII-footer" src="/UploadedImages/CHI-logo.png" data-sf-ec-immutable="" /><br /><p>250 First Avenue, Suite 300<br />Needham, MA 02494<br /><br />P: 781.972.5400<br />F: 781.972.5425 <br />E: <a href="mailto:chi@healthtech.com?cdtConferenceId=404272006.1663694140&cdtRollupId=404272006.1663694140" data-sf-ec-immutable="">chi@healthtech.com</a> </p><div class="row"><div class="col-sm-12 footer-social"><a href="https://twitter.com/CHI_Healthtech" data-sf-ec-immutable=""><img src="/images/default-source/social/twitter-gray.png?sfvrsn=bac909e7_7" alt="" class="footer-social-icons" /></a> <a href="https://www.linkedin.com/company/cambridge-healthtech-institute" data-sf-ec-immutable=""><img src="/images/default-source/social/linkedin-gray.png?sfvrsn=ed70471e_4" class="footer-social-icons" alt="" /></a> <a href="https://www.facebook.com/HealthtechConferences" data-sf-ec-immutable=""><img src="/images/default-source/social/facebook-gray.png?sfvrsn=35d4a48c_4" class="footer-social-icons" alt="" /></a> </div></div></div></div></div><div class="col-sm-4 footer-border hidden-xs"><div class="row"><div class="col-sm-12"><p>Life Science Portals</p></div><div class="col-sm-6"><p><a href="http://biologicaltherapeutics.cambridgeinnovationinstitute.com/home">Biological Therapeutic Products</a></p><p><a href="http://biomarkers.cambridgeinnovationinstitute.com/home">Biomarkers & Diagnostics</a></p><p><a href="http://biopharmastrategy.cambridgeinnovationinstitute.com/home">Biopharma Strategy</a></p><p><a href="https://bioprocessing.cambridgeinnovationinstitute.com/home">Bioprocess & Manufacturing</a></p><p><a href="http://chemistry.cambridgeinnovationinstitute.com/home">Chemistry</a></p><p><a href="http://clinicaltrials.cambridgeinnovationinstitute.com/home">Clinical Trials &<br data-sf-ec-immutable="" />Translational Medicine</a></p><p><a href="http://druganddevice.cambridgeinnovationinstitute.com/home">Drug & Device Safety</a></p></div><div class="col-sm-6"><p><a href="http://drugdevelopment.cambridgeinnovationinstitute.com/home">Drug Discovery & Development</a></p><p><a href="http://drugtargets.cambridgeinnovationinstitute.com/home">Drug Targets</a></p><p><a href="http://healthcare.cambridgeinnovationinstitute.com/home">Healthcare</a></p><p><a href="http://it.cambridgeinnovationinstitute.com/home">IT, AI, ML & Informatics</a></p><p><a href="http://techtools.cambridgeinnovationinstitute.com/home">Technology & Tools For<br data-sf-ec-immutable="" />Life Science</a></p><p><a href="http://therapeutics.cambridgeinnovationinstitute.com/home">Therapeutic Indications</a></p><p><a href="https://www.cambridgeinnovationinstitute.com/vip-series" data-sf-ec-immutable="">Venture, Innovation & Partnering</a></p></div></div></div><div class="col-sm-3 footer-border hidden-xs"><p>CHI Divisions</p><p><a href="https://www.healthtech.com/?cdtConferenceId=404272006.1663694140&cdtRollupId=404272006.1663694140" data-sf-ec-immutable="">Conferences</a></p><p><a href="https://www.insightpharmareports.com/" data-sf-ec-immutable="">Reports & Market Research</a></p><p><a href="https://www.barnettinternational.com/" data-sf-ec-immutable="">Barnett Educational Services</a></p><p><a href="https://www.healthtech.com/publishing" data-sf-ec-immutable="">News & Advertising</a></p><p><a href="https://proservices.healthtech.com/?cdtConferenceId=404272006.1663694140&cdtRollupId=404272006.1663694140" data-sf-ec-immutable="">Professional Services</a></p></div><div class="col-sm-2 footer-border hidden-xs"><p>Corporate Information</p><p><a href="https://www.cambridgeinnovationinstitute.com/" data-sf-ec-immutable="">Cambridge Innovation<br />Institute</a></p><p><a href="https://www.cambridgeinnovationinstitute.com/Executive-Team/" data-sf-ec-immutable="">Executive Team</a></p><p><a href="https://www.cambridgeinnovationinstitute.com/Testimonials/" data-sf-ec-immutable="">Testimonials</a></p><p><a href="https://www.cambridgeinnovationinstitute.com/mailing-list.html" data-sf-ec-immutable="">Mailing List</a></p><p><a href="https://www.cambridgeinnovationinstitute.com/Careers/" title="Careers" data-sf-ec-immutable="">Careers</a></p><hr /><p><a href="https://www.cambridgeinnovationinstitute.com/request-information" data-sf-ec-immutable="">Request Information</a></p><p><a href="https://www.cambridgeinnovationinstitute.com/Privacy-Policy/" data-sf-ec-immutable="">Privacy Policy</a></p></div></div></div></div></div> </div> </footer> <script type="text/javascript"> //<![CDATA[ window.__TsmHiddenField = $get('ctl04_TSM');;(function() { function loadHandler() { var hf = $get('ctl05_TSSM'); if (!hf._RSSM_init) { hf._RSSM_init = true; hf.value = ''; } hf.value += ';Telerik.Sitefinity.Resources, Version=14.2.7900.0, Culture=neutral, PublicKeyToken=b28c218413bdf563:en:ec7772cc-ee32-478e-8437-4242283bb12f:7a90d6a'; Sys.Application.remove_load(loadHandler); }; Sys.Application.add_load(loadHandler); })();//]]> </script> </form><script type="application/json" id="PersonalizationTracker"> {"IsPagePersonalizationTarget":false,"IsUrlPersonalizationTarget":false,"PageId":"d12fbbb4-0b93-42f4-8955-7173d7dd8f2b"} </script><script type="text/javascript" src="/WebResource.axd?d=Oiw5o8i74rDb2VpVaCaMSouKRnJ2rn_cgRr8eXgFzWmU6yVv8fmvjGNlDReMboLSikSmK5y_KsDt9j-18b7ZqBNiz0-92AjY43-6qMcq4O__3MjW1Pd6kS68TTYuxCxnF4HnqcusO3ivgfHZzR9usujs8YAzvYku29ledrs3mezPir5ikBP0Pxh4nDmiJEk2WgW0YVPdsdMlu69MVd6jI94nvC3-40pMaRxtm9HTV2I1&t=637922505260000000"> </script><script type="text/javascript" src="/bower_components/js-url/url.min.js"></script><script type="text/javascript" src="/js/TrackClicks.js"></script><script type="text/javascript" src="/js/CrossDomainClient.js"></script><script type="text/javascript"> function preprocessDocument(document) { let agendaText = ''; let speakerText = ''; if (document.title) { agendaText = [document.title, document.abstract, document.speakerX].join(' ').toLowerCase(); } if (document.name) { speakerText = [document.name, document.bio].join(' ').toLowerCase(); } const combinedText = `${agendaText} ${speakerText}`; return replacePunctuationAndTokenize(combinedText); } const tokenCache = {}; // Replaces punctuation with spaces, tokenizes the text, and caches the result function replacePunctuationAndTokenize(text) { // Check if the tokenized version of the text exists in the cache if (tokenCache[text]) { return tokenCache[text]; // Return cached result } // Tokenize the text if not found in cache const punctuationRegex = /[.,\/#!$%\^&\*;:{}=\-_`~()\[\]\"'’\s]/g; const cleanText = text.replace(punctuationRegex, ' ').toLowerCase(); const words = cleanText.match(/\b[\w']+\b/g) || []; // Generate partial word matches const partialMatches = words.flatMap(word => { return Array.from({ length: word.length }, (_, i) => word.slice(0, i + 1)); }); // Combine words and partial matches const tokens = [...words, ...partialMatches]; // Cache the tokenized version of the text tokenCache[text] = tokens; // Return the tokenized result return tokens; } // Calculates the inverse document frequency (IDF) for a term function idf(term, documents) { let df = documents.filter(doc => doc.includes(term)).length; return Math.log((documents.length - df + 0.5) / (df + 0.5) + 1); } // Calculates the BM25 score for a document based on query tokens function calculateBM25Score(tokens, queryTokens, documentsAvgLength, k1, b, idfs) { let score = 0; const docLength = tokens.length; queryTokens.forEach(term => { const termFrequency = tokens.filter(token => token === term).length; const termIDF = idfs[term] || 0; // Ensure IDF is precomputed or set to 0 if not found score += termIDF * ((termFrequency * (k1 + 1)) / (termFrequency + k1 * (1 - b + b * docLength / documentsAvgLength))); }); return score; } // Performs a BM25 search on the dataset based on the query, returning results in batches function bm25Search(query, data, k1 = 1.2, b = 0.75, threshold = 0.05) { // Preprocess query using the same preprocessing steps const queryTokens = replacePunctuationAndTokenize(query); // Flatten the dataset and prepare it for scoring let documents = data.speakers.concat(data.agenda ); let documentsAvgLength = documents.reduce((acc, doc) => acc + preprocessDocument(doc).length, 0) / documents.length; // Calculate IDF values for query tokens let idfs = {}; queryTokens.forEach(term => { idfs[term] = idf(term, documents.map(doc => preprocessDocument(doc).join(' '))); }); // Score each document let scores = documents.map(doc => { const docTokens = preprocessDocument(doc); return { doc, score: calculateBM25Score(docTokens, queryTokens, documentsAvgLength, k1, b, idfs) }; }); // Sort by score scores.sort((a, b) => b.score - a.score); // Filter based on the threshold let filteredScores = scores.filter(item => item.score > threshold); // Apply query regex filter const filteredQuery = filterStopWords(query); if (filteredQuery === '') { // If the query contains only stop words, return no results return { results: [], totalResults: 0 }; } const escapedQuery = filteredQuery.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&').split(' ').join('|'); const queryRegex = new RegExp(escapedQuery, 'gi'); let highlightedResults = filterAndHighlightResults(filteredScores.map(item => item.doc), queryRegex); // Total number of filtered and highlighted results const totalResults = highlightedResults.length; // Return the results and the total count return { results: highlightedResults, totalResults }; } // Checks if any text in the document matches the query and will be highlighted function filterAndHighlightResults(results, queryRegex) { return results.filter(result => { const combinedText = [ result.title || '', result.abstract || '', (result.speakerX || []).join(' '), result.name || '', result.bio || '' ].join(' ').toLowerCase(); // Reset lastIndex to 0 before each test to avoid issues with global regex queryRegex.lastIndex = 0; const matches = queryRegex.test(combinedText); return matches; }); } </script><script type="text/javascript"> async function extractFiltered(apiData) { let agendaList = []; let speakerList = []; let homeLandingPage = '' for (let agendaData of apiData) { let programTitle = agendaData.program.title; let uri = agendaData.conference.cii_homeURI; if ('cii_homeURI' in agendaData.program) { uri = agendaData.program.cii_homeURI; } if (homeLandingPage == '') { homeLandingPage = getBaseURL(uri) } let agendaDataSpeaker = JSON.parse(JSON.stringify(agendaData)); // Deep copy in JavaScript removeNestedKeys(agendaData, listOfFlattenedKeysToRemoveAgenda); removeUnwantedAndEmpty(agendaData); removeNestedKeys(agendaDataSpeaker, listOfFlattenedKeysToRemovePeople); removeUnwantedAndEmpty(agendaDataSpeaker); agendaData = cleanup(agendaData); agendaDataSpeaker = cleanup(agendaDataSpeaker); let extractedPresentations = extractPresentations(agendaData, uri, programTitle); let extractedSpeakers = extractSpeakers(agendaDataSpeaker, uri, programTitle); agendaList = agendaList.concat(extractedPresentations); speakerList = speakerList.concat(extractedSpeakers); } speakerList = removeDuplicateSpeakers(speakerList); agendaList = removeDuplicateAgendaEntries(agendaList); speakerList = mapSpeakerLinks(speakerList,homeLandingPage) agendaList = mapAgendaLinks(agendaList,homeLandingPage) speakerList = mapAgendaDataToSpeakerOptimized(agendaList, speakerList); return {agendaList, speakerList}; } function getBaseURL(url) { // Create a URL object const urlObj = new URL(url); // Get the base URL const baseURL = `${urlObj.protocol}//${urlObj.host}/`; return baseURL; } function mapSpeakerLinks(speakerList,homeLandingPage) { speakerList.forEach(speaker => { let proceedingId = String(speaker['proceedingId'] || ''); let firstName = speaker['first_name'] || ''; let lastName = speaker['last_name'] || ''; let uri_program_link = speaker['uri_program_link'] || ''; speaker['uri_speaker_bio_link'] = homeLandingPage + 'speaker-biographies' + '#' + firstName + lastName; let events = speaker['events'] || []; events.forEach((event, eventIndex) => { let eventProceedingId = String(event['proceedingId'] || ''); speaker['events'][eventIndex]['uri_proceeding_date_link'] = uri_program_link + '#' + firstName + lastName + eventProceedingId; }); }); return speakerList; } function mapAgendaLinks(agendaList,homeLandingPage) { agendaList.forEach(proceeding => { let proceedingId = String(proceeding['proceedingId'] || ''); let firstName = proceeding['speakerXFirstName'] || ''; let lastName = proceeding['speakerXLastName'] || ''; let uri_program_link = proceeding['uri_program_link'] || ''; proceeding['uri_program_link'] = uri_program_link; proceeding['uri_proceeding_date_link'] = uri_program_link + '#' + firstName + lastName + proceedingId; }); return agendaList; } function cleanup(data) { data = cleanJson(data); data = removeSingleKvObjects(data); data = cleanJson(data); data = removeObjectsWithOnlyStartTime(data); return cleanJson(data); } function removeDuplicateSpeakers(speakersList) { const seen = new Set(); const uniqueSpeakers = []; speakersList.forEach(speaker => { if (!seen.has(speaker.name)) { uniqueSpeakers.push(speaker); seen.add(speaker.name); } }); return uniqueSpeakers; } function mapAgendaDataToSpeakerOptimized(agendaData, agendaDataSpeaker) { const speakerEventsMap = {}; // Build a map of events for each speaker agendaData.forEach(agendaItem => { const speakerNames = agendaItem.speakerX || []; speakerNames.forEach(name => { let containsSubstring = /tessier/i.test(name); // 'i' for case-insensitive if (!name) { // Skip empty names return; } // Initialize the speaker in the map if not already present if (!speakerEventsMap[name]) { speakerEventsMap[name] = { eventsSet: new Set(), eventsList: [] }; } // Generate a unique key for the current event to check for duplicates const eventKey = `${agendaItem.title || ''}${agendaItem.session_time || ''}${agendaItem.date || ''}`; // Check if the event is already added for the speaker if (!speakerEventsMap[name].eventsSet.has(eventKey)) { // If not, add it to both the set and list speakerEventsMap[name].eventsSet.add(eventKey); speakerEventsMap[name].eventsList.push({ title: agendaItem.title, program_title: agendaItem.program_title, session_time: agendaItem.session_time, date: agendaItem.date, uri_program_link: agendaItem.uri_program_link, uri_proceeding_date_link: agendaItem.uri_proceeding_date_link, proceedingId: agendaItem.proceedingId, }); } }); }); // Update agenda_data_speaker with the found events, using the events_list agendaDataSpeaker.forEach(speaker => { const speakerName = speaker.name; // Directly access the speaker's events list from the map, if any speaker.events = (speakerEventsMap[speakerName] && speakerEventsMap[speakerName].eventsList.map(event => ({ ...event }))) || []; }); return agendaDataSpeaker; } function removeDuplicateAgendaEntries(data) { const seen = new Set(); const uniqueData = []; data.forEach(item => { const identifier = item.title + '|' + item.abstract; // Create a unique string identifier if (!seen.has(identifier)) { uniqueData.push(item); seen.add(identifier); } }); return uniqueData; } function cleanJson(obj) { if (Array.isArray(obj)) { return obj.map(item => cleanJson(item)).filter(item => item != null && typeof item !== 'object' || Object.keys(item).length > 0); } else if (obj !== null && typeof obj === 'object') { let newObj = {}; for (let [key, value] of Object.entries(obj)) { value = cleanJson(value); if (value != null && typeof value !== 'object' || Object.keys(value).length > 0) { newObj[key] = value; } } return newObj; } return obj; } function removeSingleKvObjects(obj) { if (obj !== null && typeof obj === 'object' && !Array.isArray(obj)) { for (let key in obj) { let value = obj[key]; if (typeof value === 'object' && value !== null && !Array.isArray(value) && Object.keys(value).length === 1) { let subKey = Object.keys(value)[0]; let subValue = value[subKey]; if (typeof subValue !== 'object' || Array.isArray(subValue) && subValue.length === 0) { delete obj[key]; } else { obj[key] = removeSingleKvObjects(value); } } else if (Array.isArray(value)) { obj[key] = value.map(item => removeSingleKvObjects(item)).filter(item => item != null && typeof item !== 'object' || Object.keys(item).length > 0); } else { obj[key] = removeSingleKvObjects(value); } } } return obj; } function removeObjectsWithOnlyStartTime(obj) { if (obj !== null && typeof obj === 'object') { for (let key in obj) { let value = obj[key]; if (typeof value === 'object' && value !== null && Object.keys(value).length === 1 && 'startTime' in value) { delete obj[key]; } else { obj[key] = removeObjectsWithOnlyStartTime(value); } } } return obj; } function removeNestedKeys(data, keysToRemove) { let removeRecursively = (currentData, keyParts) => { if (!keyParts.length) return; if (Array.isArray(currentData)) { currentData.forEach(item => removeRecursively(item, keyParts)); } else if (currentData !== null && typeof currentData === 'object') { let currentKey = keyParts[0]; if (currentKey in currentData) { if (keyParts.length === 1) { delete currentData[currentKey]; } else { removeRecursively(currentData[currentKey], keyParts.slice(1)); } } } }; keysToRemove.forEach(key => { let keyParts = key.split('**'); removeRecursively(data, keyParts); }); } function removeUnwantedAndEmpty(data) { if (Array.isArray(data)) { return data.map(item => removeUnwantedAndEmpty(item)).filter(item => item != null && typeof item !== 'object' || Object.keys(item).length > 0); } else if (data !== null && typeof data === 'object') { for (let key in data) { let value = data[key]; if (key == 'proceedingId'){ continue } if (value === null || value === false || typeof value === 'boolean' || (typeof value === 'number' && !isNaN(value)) || typeof value === 'string' && value.trim() === '') { delete data[key]; } else { data[key] = removeUnwantedAndEmpty(value); } } return data; } return data; } function extractSpeakers(data, uri, programTitle) { let speakers = []; // Recursive function to handle both arrays and objects function traverse(data) { if (Array.isArray(data)) { data.forEach(item => traverse(item)); } else if (data !== null && typeof data === 'object') { // Check if the current dictionary represents a speaker if ("preferredNameAndAfilliationAppellation" in data) { let firstName = data.firstName || ""; let lastName = data.lastName || ""; let speakerInfo = { name: data.preferredNameAndAfilliationAppellation || "Unknown", bio: data.bio || "No biography provided.", first_name: firstName, last_name: lastName, uri_program_link: uri, program_title: programTitle, title: data.proceedingTitleSanitized || "" }; speakers.push(speakerInfo); } // Recurse through each value of the object Object.values(data).forEach(value => traverse(value)); } } traverse(data); // Start the recursive traversal return speakers; } function sanitizeString(htmlString) { // Replace <br> and <br/> with newline characters htmlString = htmlString.replace(/<br\s*\/?>/gi, '\n'); // Replace <p> with newline characters htmlString = htmlString.replace(/<\/p>/gi, '\n').replace(/<p[^>]*>/gi, '\n'); // Use a regular expression to replace <a> tags with their text and URL htmlString = htmlString.replace(/<a[^>]+href="([^"]+)"[^>]*>(.*?)<\/a>/gi, '$2 ($1)'); // Use a regular expression to remove all remaining HTML tags htmlString = htmlString.replace(/<\/?[^>]+(>|$)/g, ""); // Trim extra whitespace and return the result return htmlString.trim(); } function extractPresentations(scheduleData, uri, programTitle) { let extractedPresentations = []; if (!scheduleData.scheduleBlocks) { return extractedPresentations; } // Iterate through each block in the schedule scheduleData.scheduleBlocks.forEach(block => { let blockDate = block.blockDate || ''; let sessionTimeBlock = block.blockDateStartTime || ''; // Check if there's content for this date if (block.scheduleBlockContent) { block.scheduleBlockContent.forEach(content => { let sessionTime = content.startTime || sessionTimeBlock; // Handle direct textBlock if (content.textBlock) { let textBlock = content.textBlock; let proceedingId = content.proceedingId || ''; let tBlockDescription = textBlock.textBlockDescription || ''; extractedPresentations.push({ date: blockDate, session_time: sessionTime, session_name: 'Direct Event: ' + (textBlock.textBlockName || ''), presentation_time: sessionTime, title: textBlock.textBlockName || '', abstract: sanitizeString(tBlockDescription), uri_program_link: uri, proceedingId: proceedingId, program_title: programTitle, speakerX: [] }); } // Handle sessionBlock if (content.sessionBlock) { let sessionBlock = content.sessionBlock; let sessionName = sessionBlock.sessionBlockName || 'Unnamed Session'; if (sessionBlock.sessionBlockContent) { sessionBlock.sessionBlockContent.forEach(sessionContent => { let presentationTime = sessionContent.startTime || sessionTime; if (sessionContent.presentationBlock) { let presentationBlock = sessionContent.presentationBlock; let extractedPresentationsBlockList = []; if (presentationBlock.presentationBlockPresentations) { presentationBlock.presentationBlockPresentations.forEach(presentation => { let speakerData = presentation.speakerPortalPresentation || presentation.spexPresentation || {}; let title = speakerData.proceedingTitleSanitized || ''; let abstract = speakerData.webAbstractSanitized || ''; let preferredName = speakerData.preferredNameAndAfilliationAppellation || ''; let speakerXFirstName = speakerData.firstName || ''; let speakerXLastName = speakerData.lastName || ''; let proceedingId = speakerData.proceedingId || ''; let copresentors = (speakerData.copresentors || []).map(coP => ({ preferredNameAndAfilliationAppellation: coP.preferredNameAndAfilliationAppellation, firstName: coP.firstName, lastName: coP.lastName })); let speakerX_full = { preferredNameAndAfilliationAppellation: preferredName, firstName: speakerXFirstName, lastName: speakerXLastName }; extractedPresentationsBlockList.push({ date: blockDate, session_time: sessionTime, session_name: sessionName, presentation_time: presentationTime, title: title, abstract: abstract || 'No abstract provided', uri_program_link: uri, proceedingId: proceedingId, program_title: programTitle, speakerX: [preferredName].concat(copresentors.map(co => co.preferredNameAndAfilliationAppellation)), speakerXFirstName: speakerXFirstName, speakerXLastName: speakerXLastName, speakerX_full: [speakerX_full].concat(copresentors) }); }); // Add all presentations in the block list directly extractedPresentationsBlockList.forEach(presentation => { extractedPresentations.push(presentation); }); } } }); } } }); } }); return extractedPresentations; } listOfFlattenedKeysToRemoveAgenda= [ 'scheduleBlocks**scheduleBlockName', 'scheduleBlocks**scheduleBlockContent**sessionBlock**id', 'scheduleBlocks**scheduleBlockContent**id', 'scheduleBlocks**scheduleBlockContent**textBlock**id', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**headerBlock**id', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**id', 'scheduleBlocks**scheduleBlockContent**shareId', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**blockDefaultText', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**id', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**id', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**speakerGuid', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**programConfId', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**proceedingTitle', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**speakerTypeName', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**fullName', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**bio', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**stagePhotoUrl', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**productionPhotoUrl', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**title', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**organizationName', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**speakerDescription', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**printAbstractSanitized', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**groupName', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**spexPresentation**proceedingTitle', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**spexPresentation**speakerTypeName', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**spexPresentation**presentationTypeName', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**spexPresentation**fullName', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**spexPresentation**title', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**spexPresentation**organizationName', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**spexPresentation**speakerDescription', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**spexPresentation**printAbstractSanitized', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**spexPresentation**groupName', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**middleInitials', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**department', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**printAbstract', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**webAbstract', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**copresentors**speakerGuid', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**copresentors**programConfId', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**copresentors**proceedingTitle', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**copresentors**proceedingTitleSanitized', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**copresentors**speakerTypeName', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**copresentors**middleInitials', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**copresentors**fullName', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**copresentors**bio', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**copresentors**stagePhotoUrl', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**copresentors**productionPhotoUrl', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**copresentors**title', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**copresentors**department', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**copresentors**organizationName', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**copresentors**speakerDescription', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**copresentors**printAbstract', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**copresentors**printAbstractSanitized', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**copresentors**webAbstract', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**copresentors**webAbstractSanitized', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**copresentors**groupName', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**preferredName', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**copresentors**preferredName', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**spexPresentation**stagePhotoUrl', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**spexPresentation**productionPhotoUrl', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**spexPresentation**organizationLogoEpsUri', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**spexPresentation**logoUri', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**spexPresentation**printAbstract', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**spexPresentation**webAbstract', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**spexPresentation**copresentors**proceedingTitle', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**spexPresentation**copresentors**proceedingTitleSanitized', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**spexPresentation**copresentors**presentationTypeName', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**spexPresentation**copresentors**fullName', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**spexPresentation**copresentors**organizationLogoEpsUri', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**spexPresentation**copresentors**logoUri', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**spexPresentation**copresentors**title', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**spexPresentation**copresentors**organizationName', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**spexPresentation**copresentors**speakerDescription', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**spexPresentation**copresentors**printAbstract', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**spexPresentation**copresentors**printAbstractSanitized', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**spexPresentation**copresentors**webAbstract', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**spexPresentation**copresentors**webAbstractSanitized', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**spexPresentation**copresentors**groupName', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**spexPresentation**department', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**spexPresentation**copresentors**stagePhotoUrl', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**spexPresentation**copresentors**productionPhotoUrl', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**spexPresentation**copresentors**department', 'scheduleBlocks**scheduleBlockContent**sharedProceedings**id', 'scheduleBlocks**scheduleBlockContent**textBlock**logoUri', 'scheduleBlocks**scheduleBlockContent**textBlock**logoId', 'scheduleBlocks**scheduleBlockProceedings**id', 'scheduleBlocks**id', 'scheduleBlocks**scheduleBlockContent**oldId', 'conference**proceedingGuid', 'conference**label', 'conference**title', 'conference**startTime', 'conference**endTime', 'conference**description', 'conference**tagLine', 'conference**cii_conf_id', 'conference**cii_confdate', 'conference**cii_confdate_end', 'conference**cii_conftitle', 'conference**cii_Acronym', 'conference**cii_Account_Code', 'conference**cii_homeURI', 'conference**cii_homeImageURI_square', 'conference**cii_currency_code', 'conference**cii_hotel_deadline', 'conference**timeZone', 'conference**venue**venueGuid', 'conference**venue**name', 'conference**venue**address', 'conference**venue**city', 'conference**venue**stateOrProvince', 'conference**venue**postalCode', 'conference**venue**phone', 'conference**venue**createdDtm', 'conference**venue**createdByUserId', 'conference**venue**lastModifiedDtm', 'conference**venue**lastModifiedByUserId', 'conference**swapcardEventId', 'conference**createdDtm', 'conference**createdByUserId', 'conference**lastModifiedDtm', 'conference**lastModifiedByUserId', 'program**proceedingGuid', 'program**title', 'program**startTime', 'program**endTime', 'program**description', 'program**tagLine', 'program**cii_conf_id', 'program**cii_confdate', 'program**cii_confdate_end', 'program**cii_conftitle', 'program**cii_Acronym', 'program**cii_Account_Code', 'program**cii_homeURI', 'program**timeZone', 'program**venue**venueGuid', 'program**venue**name', 'program**venue**address', 'program**venue**city', 'program**venue**stateOrProvince', 'program**venue**postalCode', 'program**venue**phone', 'program**venue**createdDtm', 'program**venue**createdByUserId', 'program**venue**lastModifiedDtm', 'program**venue**lastModifiedByUserId', 'program**createdDtm', 'program**createdByUserId', 'program**lastModifiedDtm', 'program**lastModifiedByUserId', 'id' ] listOfFlattenedKeysToRemovePeople = [ 'scheduleBlocks**scheduleBlockName', 'scheduleBlocks**blockDate', 'scheduleBlocks**scheduleBlockContent**startTime', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockName', 'scheduleBlocks**scheduleBlockContent**sessionBlock**id', 'scheduleBlocks**scheduleBlockContent**id', 'scheduleBlocks**scheduleBlockContent**textBlock**textBlockName', 'scheduleBlocks**scheduleBlockContent**textBlock**textBlockDescription', 'scheduleBlocks**scheduleBlockContent**textBlock**id', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**headerBlock**headerBlockName', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**headerBlock**id', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**id', 'scheduleBlocks**scheduleBlockContent**shareId', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**startTime', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockName', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**blockDefaultText', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**id', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**id', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**speakerGuid', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**programConfId', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**proceedingTitle', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**proceedingTitleSanitized', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**speakerTypeName', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**fullName', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**stagePhotoUrl', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**productionPhotoUrl', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**title', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**organizationName', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**speakerDescription', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**printAbstractSanitized', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**webAbstractSanitized', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**groupName', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**spexPresentation**proceedingTitle', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**spexPresentation**proceedingTitleSanitized', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**spexPresentation**speakerTypeName', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**spexPresentation**presentationTypeName', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**spexPresentation**fullName', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**spexPresentation**title', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**spexPresentation**organizationName', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**spexPresentation**speakerDescription', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**spexPresentation**printAbstractSanitized', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**spexPresentation**webAbstractSanitized', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**spexPresentation**groupName', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**middleInitials', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**department', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**printAbstract', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**webAbstract', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**copresentors**speakerGuid', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**copresentors**programConfId', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**copresentors**proceedingTitle', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**copresentors**proceedingTitleSanitized', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**copresentors**speakerTypeName', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**copresentors**middleInitials', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**copresentors**stagePhotoUrl', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**copresentors**productionPhotoUrl', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**copresentors**title', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**copresentors**department', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**copresentors**organizationName', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**copresentors**speakerDescription', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**copresentors**printAbstract', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**copresentors**printAbstractSanitized', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**copresentors**webAbstract', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**copresentors**webAbstractSanitized', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**copresentors**groupName', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**preferredName', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**speakerPortalPresentation**copresentors**preferredName', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**spexPresentation**stagePhotoUrl', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**spexPresentation**productionPhotoUrl', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**spexPresentation**organizationLogoEpsUri', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**spexPresentation**logoUri', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**spexPresentation**printAbstract', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**spexPresentation**webAbstract', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**spexPresentation**copresentors**proceedingTitle', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**spexPresentation**copresentors**proceedingTitleSanitized', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**spexPresentation**copresentors**presentationTypeName', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**spexPresentation**copresentors**organizationLogoEpsUri', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**spexPresentation**copresentors**logoUri', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**spexPresentation**copresentors**title', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**spexPresentation**copresentors**organizationName', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**spexPresentation**copresentors**speakerDescription', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**spexPresentation**copresentors**printAbstract', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**spexPresentation**copresentors**printAbstractSanitized', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**spexPresentation**copresentors**webAbstract', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**spexPresentation**copresentors**webAbstractSanitized', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**spexPresentation**copresentors**groupName', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**spexPresentation**department', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**spexPresentation**copresentors**stagePhotoUrl', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**spexPresentation**copresentors**productionPhotoUrl', 'scheduleBlocks**scheduleBlockContent**sessionBlock**sessionBlockContent**presentationBlock**presentationBlockPresentations**spexPresentation**copresentors**department', 'scheduleBlocks**scheduleBlockContent**sharedProceedings**id', 'scheduleBlocks**scheduleBlockContent**textBlock**logoUri', 'scheduleBlocks**scheduleBlockContent**textBlock**logoId', 'scheduleBlocks**scheduleBlockProceedings**id', 'scheduleBlocks**id', 'scheduleBlocks**scheduleBlockContent**oldId', 'conference**proceedingGuid', 'conference**label', 'conference**title', 'conference**startTime', 'conference**endTime', 'conference**description', 'conference**tagLine', 'conference**cii_conf_id', 'conference**cii_confdate', 'conference**cii_confdate_end', 'conference**cii_conftitle', 'conference**cii_Acronym', 'conference**cii_Account_Code', 'conference**cii_homeURI', 'conference**cii_homeImageURI_square', 'conference**cii_currency_code', 'conference**cii_hotel_deadline', 'conference**timeZone', 'conference**venue**venueGuid', 'conference**venue**name', 'conference**venue**address', 'conference**venue**city', 'conference**venue**stateOrProvince', 'conference**venue**postalCode', 'conference**venue**phone', 'conference**venue**createdDtm', 'conference**venue**createdByUserId', 'conference**venue**lastModifiedDtm', 'conference**venue**lastModifiedByUserId', 'conference**swapcardEventId', 'conference**createdDtm', 'conference**createdByUserId', 'conference**lastModifiedDtm', 'conference**lastModifiedByUserId', 'program**proceedingGuid', 'program**title', 'program**startTime', 'program**endTime', 'program**description', 'program**tagLine', 'program**cii_conf_id', 'program**cii_confdate', 'program**cii_confdate_end', 'program**cii_conftitle', 'program**cii_Acronym', 'program**cii_Account_Code', 'program**cii_homeURI', 'program**timeZone', 'program**venue**venueGuid', 'program**venue**name', 'program**venue**address', 'program**venue**city', 'program**venue**stateOrProvince', 'program**venue**postalCode', 'program**venue**phone', 'program**venue**createdDtm', 'program**venue**createdByUserId', 'program**venue**lastModifiedDtm', 'program**venue**lastModifiedByUserId', 'program**createdDtm', 'program**createdByUserId', 'program**lastModifiedDtm', 'program**lastModifiedByUserId', 'id' ] </script><script type="text/javascript"> function loadEventData() { const apiEndpoint = 'https://api.speakers.healthtech.com/api/schedule/adx248000'; // Extract the last part of the API endpoint const endpointParts = apiEndpoint.split('/'); const cacheKey = `cachedEventData_${endpointParts[endpointParts.length - 1]}`; addLinkRedirector(); addSubmitHandling(); try { const cachedEntry = sessionStorage.getItem(cacheKey); if (cachedEntry) { console.log('Loading from cache'); const { data, timestamp } = JSON.parse(cachedEntry); const now = new Date().getTime(); const cacheAge = now - timestamp; if (cacheAge < 24 * 60 * 60 * 1000) { // 24 hours in milliseconds const keywordData = extractKeywords(data); useData(data, keywordData); return; } else { console.log('Cache is stale, reloading data'); sessionStorage.removeItem(cacheKey); } } } catch (error) { console.error('Error accessing sessionStorage:', error); } fetchEventData(apiEndpoint,cacheKey); } function fetchEventData(apiEndpoint,cacheKey) { document.getElementById('spinner').style.display = 'block'; fetch(apiEndpoint) .then(response => response.json()) .then(data => extractFiltered(data)) .then(data => { if (data.agendaList) { data.agenda = preprocessAgendaData(data.agendaList); } if (data.speakerList) { data.speakers = preprocessSpeakerData(data.speakerList); } const keywordData = extractKeywords(data); try { const dataToCache = { data: data, timestamp: new Date().getTime() }; sessionStorage.setItem(cacheKey, JSON.stringify(dataToCache)); } catch (error) { console.error('Failed to cache data in sessionStorage:', error); } useData(data, keywordData); }) .catch(error => { console.error('Failed to fetch data from API:', error); document.getElementById('spinner').style.display = 'none'; }); } function useData(data, keywords) { document.getElementById('spinner').style.display = 'block'; window.eventData = data; window.keywords = keywords; const urlParams = new URLSearchParams(window.location.search); const query = urlParams.get('query'); if (query) { document.getElementById('searchInput').value = query; searchEvents(query); } document.getElementById('spinner').style.display = 'none'; const lastScrollPosition = sessionStorage.getItem('lastScrollPosition'); if (lastScrollPosition) { window.scrollTo(0, parseInt(lastScrollPosition)); sessionStorage.removeItem('lastScrollPosition'); } } function addSubmitHandling() { document.getElementById('searchButton').addEventListener('click', function(event) { event.preventDefault(); var query = document.getElementById("searchInput").value; clearErrorMessages(); if (query.length <= 1) { displayErrorMessage("Please include more than one character in your search."); } else { // Call your search function here var currentUrl = window.location.href; var updatedUrl = updateQueryStringParameter(currentUrl, "query", encodeURIComponent(query)); window.location.href = updatedUrl; } }); document.getElementById('searchInput').addEventListener('keypress', function(event) { if (event.key === "Enter") { event.preventDefault(); document.getElementById('searchButton').click(); } }); } function displayErrorMessage(message) { var resultsDiv = document.getElementById('results'); resultsDiv.textContent = ''; // Clear the results var errorMessage = document.createElement('p'); errorMessage.className = 'text-center text-danger'; errorMessage.id = 'error-message'; errorMessage.textContent = message; resultsDiv.appendChild(errorMessage); } function clearErrorMessages() { var errorMessage = document.getElementById('error-message'); if (errorMessage) { errorMessage.remove(); } document.getElementById('results').textContent = ''; // Clear the results } function updateQueryStringParameter(uri, key, value) { var re = new RegExp("([?&])" + key + "=.*?(&|$)", "i"); var separator = uri.indexOf("?") !== -1 ? "&" : "?"; if (uri.match(re)) { return uri.replace(re, '$1' + key + "=" + value + '$2'); } else { return uri + separator + key + "=" + value; } } function searchEvents(query) { query = query.trim(); if (!query) { document.getElementById('resultsCount').textContent = ''; return; } const { results, totalResults } = bm25Search(query, window.eventData); const filteredQuery = filterStopWords(query); const escapedQuery = filteredQuery.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&').split(' ').join('|'); const queryRegex = new RegExp(escapedQuery, 'gi'); displayResults(results, query); document.getElementById('resultsCount').textContent = `${totalResults} Ranked Results Returned`; } function preprocessAgendaData(agenda) { return agenda.map(item => { if (item.date) { item.date = formatDate(item.date); } if (item.presentation_time) { item.time = formatTime(item.presentation_time); delete item.presentation_time; } if (item.speakerX && Array.isArray(item.speakerX)) { item.speakerX_string = item.speakerX.join(' '); } delete item.session_time; delete item.session_name; if (startsWithScOrTsDigit(item.program_title)) { item.abstract = item.abstract + '\n - Short Course or Training Seminar'; } return item; }); } function formatDate(dateString) { const [month, day, year] = dateString.split('/'); const date = new Date(year, month - 1, day, 12); const dateOptions = { year: 'numeric', month: 'long', day: 'numeric', timeZone: 'UTC', }; return isNaN(date.getTime()) ? 'Invalid Date' : date.toLocaleDateString('en-US', dateOptions); } function formatTime(timeString) { const time = new Date(`1970-01-01T${timeString}Z`); const timeOptions = { hour: '2-digit', minute: '2-digit', hour12: true, timeZone: 'UTC' }; return isNaN(time.getTime()) ? 'Invalid Time' : time.toLocaleTimeString('en-US', timeOptions); } function preprocessSpeakerData(speaker) { return speaker.map(item => { if (item.events && item.events.length > 0) { item.events.forEach(event => { if (event.date) { event.date = formatDate(event.date); } if (event.session_time) { event.time = formatTime(event.session_time); delete event.session_time; } }); } return item; }); } function filterStopWords(query) { const words = query.split(/\s+/); if (words.length === 1 && stopWords_global.has(words[0].toLowerCase())) { return query; } return words.filter(word => !stopWords_global.has(word.toLowerCase())).join(' '); } const stopWords_global = new Set([ "and", "the", "for", "with", "on", "in", "of", "to", "a", "an", "is", "it", "as", "are", "at", "by", "be", "this", "that", "from", "or", "have", "had", "not", "but", "they", "you", "she", "he", "we", "her", "him", "his", "hers", "its", "their", "theirs", "our", "ours", "who", "whom", "whose", "which", "what", "where", "when", "why", "how", "all", "any", "both", "each", "few", "more", "most", "other", "some", "such", "no", "nor", "too", "very", "can", "will", "just" ]); function createHighlightElement(text, queryRegex) { const fragment = document.createDocumentFragment(); let lastIndex = 0; let match; queryRegex.lastIndex = 0; while ((match = queryRegex.exec(text)) !== null) { const index = match.index; if (index === lastIndex && match[0] === '') { queryRegex.lastIndex++; continue; } if (index > lastIndex) { const textNode = document.createTextNode(text.slice(lastIndex, index)); fragment.appendChild(textNode); } const highlightSpan = document.createElement('span'); highlightSpan.classList.add('highlight'); highlightSpan.textContent = match[0]; fragment.appendChild(highlightSpan); lastIndex = index + match[0].length; } if (lastIndex < text.length) { const textNode = document.createTextNode(text.slice(lastIndex)); fragment.appendChild(textNode); } return fragment; } function encodeURLWithFragment(url) { const [baseUrl, fragment] = url.split('#'); const encodedFragment = fragment ? encodeURIComponent(fragment) : ''; return baseUrl + (encodedFragment ? '#' + encodedFragment : ''); } function displayResults(results, query) { const resultsDiv = document.getElementById('results'); while (resultsDiv.firstChild) resultsDiv.removeChild(resultsDiv.firstChild); if (!query) return; const filteredQuery = filterStopWords(query); const escapedQuery = filteredQuery.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&').split(' ').join('|'); const queryRegex = new RegExp(escapedQuery, 'gi'); results.forEach(result => { const cardDiv = document.createElement('div'); cardDiv.classList.add('card', 'margin-bottom-3'); const cardBodyDiv = document.createElement('div'); cardBodyDiv.classList.add('card-body', 'border-thin', 'padding-3'); if (result.title) { const commonLink = document.createElement('a'); let titleLink = encodeURLWithFragment(result.uri_proceeding_date_link); if (startsWithScOrTsDigit(result.program_title)) { const hashRedirectNumber = getNumberAfterScOrTs(result.program_title); titleLink = encodeURLWithFragment(result.uri_program_link + '#' + hashRedirectNumber); } commonLink.href = titleLink; commonLink.classList.add('search-result-link'); const titleH5 = document.createElement('h5'); titleH5.classList.add('card-title'); titleH5.appendChild(createHighlightElement(result.title, queryRegex)); commonLink.appendChild(titleH5); cardBodyDiv.appendChild(commonLink.cloneNode(true)); if (result.speakerX && result.speakerX.length > 0) { result.speakerX.forEach(speaker => { const speakerDiv = document.createElement('div'); speakerDiv.classList.add('card-text', 'speakerX', 'margin-bottom-2'); speakerDiv.appendChild(createHighlightElement(speaker, queryRegex)); cardBodyDiv.appendChild(speakerDiv); }); } const abstractDiv = document.createElement('div'); abstractDiv.classList.add('card-text'); abstractDiv.appendChild(createHighlightElement(result.abstract, queryRegex)); abstractDiv.classList.add('text-medium-small'); cardBodyDiv.appendChild(abstractDiv); const calendarIcon = document.createElementNS('http://www.w3.org/2000/svg', 'svg'); calendarIcon.setAttribute("aria-hidden", "true"); calendarIcon.setAttribute("focusable", "false"); calendarIcon.setAttribute("data-prefix", "fas"); calendarIcon.setAttribute("data-icon", "user"); calendarIcon.setAttribute("class", "svg-inline--fa fa-user fa-w-14 fa-h-14"); calendarIcon.setAttribute("role", "img"); calendarIcon.setAttribute("xmlns", "http://www.w3.org/2000/svg"); calendarIcon.setAttribute("viewBox", "0 0 448 512"); calendarIcon.setAttribute("style", "width: 1em; height: 1em; vertical-align: -0.125em;"); const path = document.createElementNS('http://www.w3.org/2000/svg', 'path'); path.setAttribute("fill", "currentColor"); path.setAttribute("d", "M152 24c0-13.3-10.7-24-24-24s-24 10.7-24 24V64H64C28.7 64 0 92.7 0 128v16 48V448c0 35.3 28.7 64 64 64H384c35.3 0 64-28.7 64-64V192 144 128c0-35.3-28.7-64-64-64H344V24c0-13.3-10.7-24-24-24s-24 10.7-24 24V64H152V24zM48 192h80v56H48V192zm0 104h80v64H48V296zm128 0h96v64H176V296zm144 0h80v64H320V296zm80-48H320V192h80v56zm0 160v40c0 8.8-7.2 16-16 16H320V408h80zm-128 0v56H176V408h96zm-144 0v56H64c-8.8 0-16-7.2-16-16V408h80zM272 248H176V192h96v56z"); calendarIcon.appendChild(path); const commonLink_footer = document.createElement('div'); commonLink_footer.classList.add('margin-top-2', 'card-date-footer'); const dateFooterIcon = document.createElement('span'); dateFooterIcon.classList.add('card-text', 'card-date-footer'); let dateFooterLink = encodeURLWithFragment(result.uri_proceeding_date_link); let programFooterLink = encodeURLWithFragment(result.uri_program_link); const dateFooter = document.createElement('a'); if (startsWithScOrTsDigit(result.program_title)) { const hashRedirectNumber = getNumberAfterScOrTs(result.program_title); dateFooterLink = encodeURLWithFragment(result.uri_program_link + '#' + hashRedirectNumber); programFooterLink = encodeURLWithFragment(result.uri_program_link + '#' + hashRedirectNumber); } dateFooter.href = dateFooterLink; dateFooter.classList.add('card-text', 'card-date-footer', 'search-result-link'); const dateFooter_pipe = document.createElement('span'); dateFooter_pipe.classList.add('card-text', 'card-date-footer'); const dateFooter_program = document.createElement('a'); dateFooter_program.href = programFooterLink; dateFooter_program.classList.add('card-text', 'card-date-footer', 'search-result-link'); const dateTimeSessionText = document.createTextNode(` ${result.date} at ${result.time}`); const dateTimeSessionText_pipe = document.createTextNode(` | `); const dateTimeSessionText_program = document.createTextNode(`${result.program_title ? result.program_title : ''}`); dateFooterIcon.appendChild(calendarIcon); dateFooter.appendChild(dateTimeSessionText); dateFooter_pipe.appendChild(dateTimeSessionText_pipe); dateFooter_program.appendChild(dateTimeSessionText_program); commonLink_footer.appendChild(dateFooterIcon); commonLink_footer.appendChild(dateFooter); commonLink_footer.appendChild(dateFooter_pipe); commonLink_footer.appendChild(dateFooter_program); cardBodyDiv.appendChild(commonLink_footer.cloneNode(true)); } else if (result.name) { const nameLink = document.createElement('a'); const programTitleFormatted = result.program_title.replace(/\s+/g, '-'); const fullNameFormatted = (result.first_name + result.last_name).replace(/\s+/g, '-'); const uriWithName = `${result.uri_program_link}#${fullNameFormatted}`; nameLink.href = encodeURLWithFragment(result.uri_speaker_bio_link); nameLink.classList.add('search-result-link'); const nameH5 = document.createElement('h5'); nameH5.classList.add('card-title'); nameH5.appendChild(createHighlightElement(result.name, queryRegex)); nameLink.appendChild(nameH5); cardBodyDiv.appendChild(nameLink); const bioDiv = document.createElement('div'); bioDiv.classList.add('card-text', 'text-medium-small'); bioDiv.appendChild(createHighlightElement(result.bio, queryRegex)); cardBodyDiv.appendChild(bioDiv); const eventLink = document.createElement('div'); eventLink.classList.add('margin-top-2'); if (result.events && result.events.length > 0) { result.events.forEach(event => { const eventDiv = document.createElement('div'); eventDiv.classList.add('card-text', 'card-date-footer'); const calendarIcon = document.createElementNS('http://www.w3.org/2000/svg', 'svg'); calendarIcon.setAttribute("aria-hidden", "true"); calendarIcon.setAttribute("focusable", "false"); calendarIcon.setAttribute("data-prefix", "fas"); calendarIcon.setAttribute("data-icon", "user"); calendarIcon.setAttribute("class", "svg-inline--fa fa-user fa-w-14 fa-h-14"); calendarIcon.setAttribute("role", "img"); calendarIcon.setAttribute("xmlns", "http://www.w3.org/2000/svg"); calendarIcon.setAttribute("viewBox", "0 0 448 512"); calendarIcon.setAttribute("style", "width: 1em; height: 1em; vertical-align: -0.125em;"); const path = document.createElementNS('http://www.w3.org/2000/svg', 'path'); path.setAttribute("fill", "currentColor"); path.setAttribute("d", "M224 256c70.7 0 128-57.3 128-128S294.7 0 224 0 96 57.3 96 128s57.3 128 128 128zm89.6 32h-16.7c-22.2 10.1-46.6 16-72.9 16s-50.7-5.9-72.9-16h-16.7C60.2 288 0 348.2 0 422.4V464c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48v-41.6c0-74.2-60.2-134.4-134.4-134.4zM224 448c-70.7 0 128-57.3-128-128h256c0 70.7-57.3 128-128 128z"); calendarIcon.appendChild(path); eventDiv.appendChild(calendarIcon); let dateFooterLink = encodeURLWithFragment(event.uri_proceeding_date_link); let programFooterLink = encodeURLWithFragment(event.uri_program_link); const dateFooter = document.createElement('a'); if (startsWithScOrTsDigit(event.program_title)) { const hashRedirectNumber = getNumberAfterScOrTs(event.program_title); dateFooterLink = encodeURLWithFragment(event.uri_program_link + '#' + hashRedirectNumber); programFooterLink = encodeURLWithFragment(event.uri_program_link + '#' + hashRedirectNumber); } dateFooter.href = dateFooterLink; dateFooter.classList.add('card-text', 'card-date-footer', 'margin-left-custom', 'search-result-link'); const dateTimeSession = document.createTextNode(` ${event.date} at ${event.time}`); dateFooter.appendChild(dateTimeSession); eventDiv.appendChild(dateFooter); const dateTimeSession_pipe = document.createTextNode(` |`); eventDiv.appendChild(dateTimeSession_pipe); const dateFooter_program = document.createElement('a'); dateFooter_program.href = programFooterLink; dateFooter_program.classList.add('card-text', 'card-date-footer', 'margin-left-custom', 'search-result-link'); const dateTimeSession_program = document.createTextNode(`${event.program_title || ''}`); dateFooter_program.appendChild(dateTimeSession_program); eventDiv.appendChild(dateFooter_program); eventLink.appendChild(eventDiv); cardBodyDiv.appendChild(eventLink); }); } } cardDiv.appendChild(cardBodyDiv); resultsDiv.appendChild(cardDiv); }); } function startsWithScOrTsDigit(inputString) { const regex = /^(sc|ts)[0-9]/i; return regex.test(inputString); } function getNumberAfterScOrTs(inputString) { const regex = /^(sc|ts)([^:]+):/i; const match = inputString.match(regex); return match ? match[2] : null; } function addLinkRedirector() { document.getElementById('results').addEventListener('click', function(event) { const target = event.target.closest('.search-result-link'); if (!target) return; event.preventDefault(); const currentQuery = document.getElementById('searchInput').value; const currentUrl = new URL(window.location.href); currentUrl.searchParams.set('query', currentQuery); // window.history.pushState({ path: currentUrl.toString() }, '', currentUrl.toString()); const scrollPosition = window.scrollY; sessionStorage.setItem('lastScrollPosition', scrollPosition.toString()); window.location.href = target.getAttribute('href'); }); } function extractKeywords(data) { let keywordsSet = new Set(); data.agenda.forEach(item => { extractTextForKeywords(item.title).forEach(word => keywordsSet.add(word)); extractTextForKeywords(item.abstract).forEach(word => keywordsSet.add(word)); extractTextForKeywords(item.speakerX_string).forEach(word => keywordsSet.add(word)); }); data.speakers.forEach(speaker => { extractTextForKeywords(speaker.name).forEach(word => keywordsSet.add(word)); if (speaker.bio) { extractTextForKeywords(speaker.bio).forEach(word => keywordsSet.add(word)); } }); return Array.from(keywordsSet); } function extractTextForKeywords(text) { let words = text.toLowerCase().match(/\b(\w+)\b/g); if (!words) return []; words = words.filter(word => !stopWords_global.has(word) && word.length > 3); let keywords = new Set(words); for (let i = 0; i < words.length - 1; i++) { let bigram = words[i] + " " + words[i + 1]; keywords.add(bigram); } for (let i = 0; i < words.length - 2; i++) { let trigram = words[i] + " " + words[i + 1] + " " + words[i + 2]; keywords.add(trigram); } return Array.from(keywords); } window.onload = loadEventData; </script></body> </html>