{"id":689,"date":"2025-11-24T20:34:25","date_gmt":"2025-11-24T20:34:25","guid":{"rendered":"https:\/\/wcaa.preprod.fruitionqa.com\/?page_id=689"},"modified":"2026-05-27T14:24:44","modified_gmt":"2026-05-27T18:24:44","slug":"security-screening","status":"publish","type":"page","link":"https:\/\/wcaa.preprod.fruitionqa.com\/ar\/security\/security-screening\/","title":{"rendered":"Security Screening"},"content":{"rendered":"<div class=\"blockGlobal paddingTopMD paddingBottomLG heroFluid bottomLeftRadius bottomRightRadius\" style=\"background-image:url(https:\/\/wcaa.preprod.fruitionqa.com\/wp-content\/uploads\/2025\/12\/security-screening-01-scaled.webp);background-size:cover;background-position:center center;\">\n\t<img decoding=\"async\" src=\"https:\/\/wcaa.preprod.fruitionqa.com\/wp-content\/themes\/wcaa\/images\/GraphicSwoop2.svg\" class=\"graphicSwoopDouble\" alt=\"\"><div class=\"overlay\"><\/div>\t<div class=\"container\">\n\t\t<div class=\"grid\">\n\t\t\t\t\t\t\t<div class=\"col-sm-10 col-md-8\">\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"breadcrumbsStyle ghost dark left\"><p id=\"breadcrumbs\"><span><span><a href=\"https:\/\/wcaa.preprod.fruitionqa.com\/\">Home<\/a><\/span><\/span><\/p><\/div>\t\t\t\t\n\n<div class=\"wysiwyg \">\n\t<div class=\"maincopy dark\">\n\t\t\t\t\t<h1>TSA and Security Screening<\/h1>\n\t\t\t\t\t<\/div>\n\n\t\n\t<\/div>\n\n\t\t\t\t\n\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t<\/div>\n<\/div>\n\n\n\n\n<div class=\"blockGlobal paddingTopMD paddingBottomLG noRadius\" style=\"background-color:#fff;\">\n\t\t<div class=\"container\">\n        \t\t<div class=\"grid\">\n            \n                        <div class=\"col-md-6 mediaLeft cardInforWidgetWrap\">\n                <div class=\"maincopy\">\n                                            <h2 class=\"h4\">Security Wait Times<\/h2>\n                                        \n                                            <p><p>Get ready for a hassle-free security experience at Detroit Metro Airport by knowing what lies ahead at the checkpoint. Find detailed information about TSA wait times exact checkpoint locations throughout the terminal, and useful traveler program details including TSA PreCheck, CLEAR and Global Entry. These trusted traveler programs can have a substantial enhancement on and make your overall airport experience more efficient. Being well-informed about security procedures and available expedited screening options helps ensure smooth passage through checkpoints giving you the chance to reach your gate with little stress and great convenience.<\/p>\n<\/p>\n                                    <\/div>\n            <\/div>\n            \n            \n                        <div class=\"col-md-6 cardTSAWidgetWrap\">\n                <div class=\"cardWidget cardWidgetTSA\">\n                                    <h2 class=\"h5\">TSA Security Wait Times<\/h2>\n                \n                                <!-- FlyFruition Widget Dependencies -->\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\" \/>\n<link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin=\"anonymous\" \/>\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Lato:wght@400;700&#038;family=Roboto:wght@400;500;700&#038;family=Space+Grotesk:wght@400;500;600;700&#038;display=swap\" rel=\"stylesheet\" \/>\n<link rel=\"stylesheet\" href=\"https:\/\/pages.fruitionqa.com\/styles\/widget.css\" \/>\n<link rel=\"stylesheet\" href=\"https:\/\/pages.fruitionqa.com\/styles\/airports\/dtw.css\" \/>\n<script>\n(function() {\n  if (!document.querySelector('script[src*=\"kit.fontawesome.com\"]')) {\n    var s = document.createElement('script');\n    s.src = 'https:\/\/kit.fontawesome.com\/f2144e7b52.js';\n    s.crossOrigin = 'anonymous';\n    s.async = true;\n    document.head.appendChild(s);\n  }\n  if (!document.querySelector('[data-typekit-loaded], link[href*=\"typekit.net\"], script[src*=\"typekit.net\"], script[src*=\"use.typekit.net\"]')) {\n    var l = document.createElement('link');\n    l.rel = 'stylesheet';\n    l.href = 'https:\/\/use.typekit.net\/lly7wdy.css';\n    document.head.appendChild(l);\n  }\n})();\n<\/script>\n<style>\n\/* FlyFruition Widget Styles *\/\n.flyfruition-widget {\n  font-family: var(--font-family-body, 'Space Grotesk', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif);\n  color: var(--airport-text-secondary, #3a3e46);\n  line-height: 1.5;\n}\n\n.flyfruition-widget-status {\n  display: inline-flex;\n  align-items: center;\n  gap: 6px;\n  font-size: 12px;\n  color: var(--airport-text-muted, #7d8796);\n  padding: 4px 8px;\n  background: var(--airport-bg-secondary, #f7fafc);\n  border-radius: 12px;\n  margin-bottom: 12px;\n}\n\n.flyfruition-widget-status__indicator {\n  width: 8px;\n  height: 8px;\n  border-radius: 50%;\n  animation: flyfruition-pulse 2s infinite;\n}\n\n.flyfruition-widget-status__indicator--connecting {\n  background: #fbbf24;\n}\n\n.flyfruition-widget-status__indicator--connected {\n  background: #22c55e;\n}\n\n.flyfruition-widget-status__indicator--disconnected,\n.flyfruition-widget-status__indicator--error {\n  background: #7d8796;\n  animation: none;\n}\n\n@keyframes flyfruition-pulse {\n  0%, 100% { opacity: 1; }\n  50% { opacity: 0.5; }\n}\n\n\/* Mini widget specific styles *\/\n.flyfruition-widget--mini .flight-table-wrapper {\n  max-width: 100%;\n}\n\n.flyfruition-widget--mini .filter-bar {\n  display: none;\n}\n\n.flyfruition-widget--mini .flight-table__results-count {\n  display: none;\n}\n\n.flyfruition-widget--mini .load-more-container {\n  display: none;\n}\n<\/style>\n\n<div id=\"flyfruition-security-DTW-1780478568497\" class=\"flyfruition-widget flyfruition-widget--security flyfruition-widget--mini\" data-airport=\"DTW\" data-widget=\"security\">\n  \n  <div class=\"flyfruition-widget__content\">\n    \n<style>\n\/* Minimal TSA Component Styles *\/\n.tsa-container {\n    display: flex;\n    flex-direction: column;\n    gap: var(--spacing-lg, 16px);\n    width: 100%;\n    max-width: 100%;\n}\n\n.tsa-rows {\n    display: flex;\n    flex-wrap: wrap;\n    gap: 28px;\n    align-items: flex-start;\n    width: 100%;\n}\n\n.security-wait-time {\n    background-color: #f7fafc;\n    border: 1px solid var(--color-border-medium, #e6e9eb);\n    border-radius: var(--radius-lg, 12px);\n    display: flex;\n    align-items: center;\n    gap: var(--spacing-sm, 8px);\n    padding: var(--spacing-sm, 8px) var(--spacing-xl, 20px);\n}\n\n.terminal-name-wrapper {\n    display: flex;\n    align-items: center;\n}\n\n.terminal-name {\n    font-family: 'dm-sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n    font-weight: var(--font-weight-bold, 700);\n    font-size: var(--font-size-lg, 18px);\n    line-height: 28px;\n    color: #05243D;\n    white-space: nowrap;\n    margin: 0;\n}\n\n.wait-time-badge {\n    background-color: #0064A7;\n    border-radius: var(--radius-md, 8px);\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    justify-content: center;\n    padding: var(--spacing-xs, 4px);\n    width: 46px;\n    height: 46px;\n    flex-shrink: 0;\n}\n\n.wait-time-number {\n    font-family: 'aktiv-grotesk', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n    font-weight: var(--font-weight-bold, 700);\n    font-size: var(--font-size-xl, 22px);\n    line-height: 32px;\n    color: #ffffff;\n    text-align: center;\n    width: 100%;\n    margin: 0;\n}\n\n.minutes-wrapper {\n    display: flex;\n    align-items: center;\n}\n\n.minutes-text {\n    font-family: 'dm-sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n    font-weight: var(--font-weight-regular, 400);\n    font-size: var(--font-size-lg, 18px);\n    line-height: 28px;\n    color: #05243D;\n    white-space: nowrap;\n    margin: 0;\n}\n\n@media (max-width: 767px) {\n    .security-wait-time {\n        width: 100%;\n    }\n}\n<\/style><div class=\"tsa-container\">\n    <div class=\"tsa-rows\">\n    <div class=\"security-wait-time\">\n      <div class=\"terminal-name-wrapper\">\n        <p class=\"terminal-name\">\n          Evans\n        <\/p>\n      <\/div>\n      <div class=\"wait-time-badge\">\n        <p class=\"wait-time-number\">\n          4\n        <\/p>\n      <\/div>\n      <div class=\"minutes-wrapper\">\n        <p class=\"minutes-text\">\n          Minutes\n        <\/p>\n      <\/div>\n    <\/div>\n  <\/div>\n<div class=\"tsa-rows\">\n    <div class=\"security-wait-time\">\n      <div class=\"terminal-name-wrapper\">\n        <p class=\"terminal-name\">\n          McNamara\n        <\/p>\n      <\/div>\n      <div class=\"wait-time-badge\">\n        <p class=\"wait-time-number\">\n          5\n        <\/p>\n      <\/div>\n      <div class=\"minutes-wrapper\">\n        <p class=\"minutes-text\">\n          Minutes\n        <\/p>\n      <\/div>\n    <\/div>\n  <\/div>\n  <\/div>\n  <\/div>\n<\/div>\n\n<!-- FlyFruition Live Update Script -->\n<script>\n(function() {\n  const widgetId = 'flyfruition-security-DTW-1780478568497';\n  const widgetType = 'security';\n  const airport = 'DTW';\n  const channel = 'dtw-tsa';\n  const wsUrl = 'wss:\/\/dev-api.flyfruition.com\/';\n  const wsKey = '2QicQPH7AOM7ASWXGY4VkRiUlYMhOtW';\n  const refreshUrl = 'https:\/\/pages.fruitionqa.com\/api\/widgets\/dtw\/security?mini=true';\n  const dataUrl = 'https:\/\/pages.fruitionqa.com\/api\/widgets\/dtw\/security\/data';\n  \n  let ws = null;\n  let reconnectAttempts = 0;\n  const maxReconnectAttempts = 5;\n  const reconnectDelay = 3000;\n  \n  function connect() {\n    if (ws && ws.readyState === WebSocket.OPEN) return;\n    \n    try {\n      ws = new WebSocket(wsUrl + '?publicKey=' + wsKey);\n      \n      ws.onopen = function() {\n        console.log('[FlyFruition Widget] WebSocket connected');\n        reconnectAttempts = 0;\n        \/\/ Join the channel\n        ws.send(JSON.stringify({ action: 'joinchannel', channel: channel }));\n        updateStatus('connected');\n      };\n      \n      ws.onmessage = function(event) {\n        try {\n          const data = JSON.parse(event.data);\n          if (data.channel === channel || data.type === 'update') {\n            console.log('[FlyFruition Widget] Update received, refreshing...');\n            refreshWidget().catch(function(error) {\n              console.error('[FlyFruition Widget] Failed to refresh on WebSocket update:', error);\n            });\n          }\n        } catch (e) {\n          \/\/ Non-JSON message, might be a heartbeat\n        }\n      };\n      \n      ws.onclose = function() {\n        console.log('[FlyFruition Widget] WebSocket disconnected');\n        updateStatus('disconnected');\n        scheduleReconnect();\n      };\n      \n      ws.onerror = function(error) {\n        console.error('[FlyFruition Widget] WebSocket error:', error);\n        updateStatus('error');\n      };\n    } catch (error) {\n      console.error('[FlyFruition Widget] Failed to connect:', error);\n      scheduleReconnect();\n    }\n  }\n  \n  function scheduleReconnect() {\n    if (reconnectAttempts < maxReconnectAttempts) {\n      reconnectAttempts++;\n      console.log('[FlyFruition Widget] Reconnecting in ' + (reconnectDelay \/ 1000) + 's (attempt ' + reconnectAttempts + ')');\n      setTimeout(connect, reconnectDelay);\n    }\n  }\n  \n  function updateStatus(status) {\n    const statusEl = document.querySelector('#' + widgetId + ' .flyfruition-widget-status');\n    if (statusEl) {\n      statusEl.setAttribute('data-status', status);\n      const indicator = statusEl.querySelector('.flyfruition-widget-status__indicator');\n      if (indicator) {\n        indicator.className = 'flyfruition-widget-status__indicator flyfruition-widget-status__indicator--' + status;\n      }\n    }\n  }\n  \n  function refreshWidget() {\n    const container = document.getElementById(widgetId);\n    if (!container) return Promise.reject(new Error('Container not found'));\n\n    \/\/ Try JSON data update first (for widgets with implemented DOM update logic)\n    if (hasJsonUpdateSupport(widgetType)) {\n      console.log('[FlyFruition Widget] Fetching fresh JSON data from:', dataUrl);\n      return fetch(dataUrl)\n        .then(function(response) {\n          if (!response.ok) throw new Error('Failed to fetch JSON data');\n          return response.json();\n        })\n        .then(function(data) {\n          console.log('[FlyFruition Widget] Fresh JSON data received:', data);\n          updateWidgetWithData(container, data, widgetType, airport);\n        })\n        .catch(function(error) {\n          console.error('[FlyFruition Widget] Failed to fetch JSON data, falling back to HTML:', error);\n          return refreshWidgetWithHtml(container);\n        });\n    } else {\n      \/\/ Fall back to HTML replacement for widgets without JSON update logic\n      return refreshWidgetWithHtml(container);\n    }\n  }\n\n  function hasJsonUpdateSupport(type) {\n    \/\/ Widgets with fully implemented DOM update logic using shared rendering utilities\n    return ['weather', 'security', 'parking', 'tsa-cards', 'dine-shop-relax'].indexOf(type) !== -1;\n  }\n\n  function refreshWidgetWithHtml(container) {\n    console.log('[FlyFruition Widget] Fetching fresh HTML from:', refreshUrl);\n    return fetch(refreshUrl)\n      .then(function(response) {\n        if (!response.ok) throw new Error('Failed to fetch HTML');\n        return response.text();\n      })\n      .then(function(html) {\n        console.log('[FlyFruition Widget] Fresh HTML received, updating widget');\n        \/\/ Extract just the widget content (not dependencies)\n        var parser = new DOMParser();\n        var doc = parser.parseFromString(html, 'text\/html');\n        var newContent = doc.querySelector('.flyfruition-widget__content');\n        var currentContent = container.querySelector('.flyfruition-widget__content');\n        if (newContent &#038;&#038; currentContent) {\n          currentContent.innerHTML = newContent.innerHTML;\n        }\n      })\n      .catch(function(error) {\n        console.error('[FlyFruition Widget] Failed to refresh with HTML:', error);\n        throw error;\n      });\n  }\n\n  function updateWidgetWithData(container, data, type, airportCode) {\n    \/\/ Widget-specific JSON-to-DOM update logic\n    switch(type) {\n      case 'weather':\n        updateWeatherWidget(container, data);\n        break;\n      case 'security':\n        updateSecurityWidget(container, data);\n        break;\n      case 'parking':\n        updateParkingWidget(container, data);\n        break;\n      case 'tsa-cards':\n        updateTSACardsWidget(container, data);\n        break;\n      case 'dine-shop-relax':\n        updateDineShopRelaxWidget(container, data);\n        break;\n      default:\n        console.warn('[FlyFruition Widget] No JSON update logic for widget type:', type);\n    }\n  }\n\n  function updateWeatherWidget(container, data) {\n    var weatherEl = container.querySelector('.weather');\n    if (!weatherEl || !data) return;\n\n    var tempF = Math.round(data.temp_f);\n    var tempC = Math.round(data.temp_c);\n    var weather = data.weather;\n    var icon = getWeatherIcon(weather);\n\n    \/\/ Clear existing content\n    weatherEl.innerHTML = '';\n\n    \/\/ Create icon span safely\n    var iconSpan = document.createElement('span');\n    iconSpan.className = icon;\n    weatherEl.appendChild(iconSpan);\n\n    \/\/ Create text node to prevent XSS\n    var textNode = document.createTextNode(tempF + '\u00b0F \/ ' + tempC + '\u00b0C \/ ' + weather);\n    weatherEl.appendChild(textNode);\n  }\n\n  function getWeatherIcon(weather) {\n    var w = (weather || '').toLowerCase();\n    if (w.includes('clear') || w.includes('sunny')) return 'fa-solid fa-sun';\n    if (w.includes('cloud')) return 'fa-solid fa-clouds';\n    if (w.includes('rain')) return 'fa-solid fa-cloud-rain';\n    if (w.includes('snow')) return 'fa-solid fa-snowflake';\n    if (w.includes('storm') || w.includes('thunder')) return 'fa-solid fa-cloud-bolt';\n    if (w.includes('fog') || w.includes('mist')) return 'fa-solid fa-smog';\n    return 'fa-solid fa-cloud-sun';\n  }\n\n  \/\/ Security Widget Update\n  function updateSecurityWidget(container, data) {\n    var tsaContainer = container.querySelector('.tsa-container');\n    if (!tsaContainer || !data || !data.checkpoints) return;\n\n    var newHtml = renderMinimalSecurityWidget(data.checkpoints);\n    var temp = document.createElement('div');\n    temp.innerHTML = newHtml;\n    var newContainer = temp.firstElementChild;\n\n    if (newContainer) {\n      tsaContainer.parentElement.replaceChild(newContainer, tsaContainer);\n    }\n  }\n\n  function renderMinimalSecurityWidget(checkpoints) {\n    if (checkpoints.length === 0) {\n      return '<div class=\"tsa-container\"><div class=\"tsa-row tsa-row-last\"><div class=\"tsa-name\"><p>No TSA checkpoint information available.<\/p><\/div><\/div><\/div>';\n    }\n\n    var rowsHtml = checkpoints.map(function(checkpoint, index) {\n      return renderMinimalSecurityRow(checkpoint, index === checkpoints.length - 1);\n    }).join('\\n');\n\n    return '<div class=\"tsa-container\">' + rowsHtml + '<\/div>';\n  }\n\n  function renderMinimalSecurityRow(checkpoint, isLast) {\n    var lowestWaitTime = getLowestWaitTime(checkpoint);\n    var statusClass = lowestWaitTime ? 'status-tag--open' : 'status-tag--closed';\n    var statusIcon = lowestWaitTime ? 'fa-circle-check' : 'fa-circle-xmark';\n    var statusText = lowestWaitTime || 'Closed';\n    var rowClass = isLast ? 'tsa-row tsa-row-last' : 'tsa-row';\n\n    return '<div class=\"' + rowClass + '\"><div class=\"tsa-name\"><p>' + checkpoint.title + '<\/p><\/div><div class=\"status-tag ' + statusClass + '\"><i class=\"fa-light ' + statusIcon + '\"><\/i>' + statusText + '<\/div><\/div>';\n  }\n\n  function getLowestWaitTime(checkpoint) {\n    if (!checkpoint.lanes || checkpoint.lanes.length === 0) return null;\n    var times = checkpoint.lanes.filter(function(lane) { return lane.wait_time; }).map(function(lane) { return lane.wait_time; });\n    return times.length > 0 ? times.sort()[0] : null;\n  }\n\n  \/\/ Parking Widget Update\n  function updateParkingWidget(container, data) {\n    var parkingContainer = container.querySelector('.parking-container');\n    if (!parkingContainer || !data || !data.parkingLots) return;\n\n    var newHtml = renderMinimalParkingWidget(data.parkingLots);\n    var temp = document.createElement('div');\n    temp.innerHTML = newHtml;\n    var newContainer = temp.firstElementChild;\n\n    if (newContainer) {\n      parkingContainer.parentElement.replaceChild(newContainer, parkingContainer);\n    }\n  }\n\n  function renderMinimalParkingWidget(lots) {\n    if (lots.length === 0) {\n      return '<div class=\"parking-container\"><div class=\"parking-row parking-row-last\"><div class=\"parking-name\"><p>No parking information available.<\/p><\/div><\/div><\/div>';\n    }\n\n    var rowsHtml = lots.map(function(lot, index) {\n      return renderMinimalParkingRow(lot, index === lots.length - 1);\n    }).join('\\n');\n\n    return '<div class=\"parking-container\">' + rowsHtml + '<\/div>';\n  }\n\n  function renderMinimalParkingRow(lot, isLast) {\n    var parkingStatus = getParkingStatus(lot.status);\n    var isOpen = parkingStatus === 'open' || parkingStatus === 'limited';\n    var statusClass = isOpen ? 'status-tag--open' : 'status-tag--closed';\n    var statusIcon = isOpen ? 'fa-circle-check' : 'fa-circle-xmark';\n    var statusText = isOpen ? 'Open' : 'Closed';\n    var rowClass = isLast ? 'parking-row parking-row-last' : 'parking-row';\n\n    return '<div class=\"' + rowClass + '\"><div class=\"parking-name\"><p>' + lot.title + '<\/p><\/div><div class=\"status-tag ' + statusClass + '\"><i class=\"fa-light ' + statusIcon + '\"><\/i>' + statusText + '<\/div><\/div>';\n  }\n\n  function getParkingStatus(status) {\n    if (!status) return 'unknown';\n    var s = status.toLowerCase();\n    if (s.includes('open')) return 'open';\n    if (s.includes('closed')) return 'closed';\n    if (s.includes('limited') || s.includes('full')) return 'limited';\n    return 'unknown';\n  }\n\n  \/\/ TSA Cards Widget Update\n  function updateTSACardsWidget(container, data) {\n    var cardsContainer = container.querySelector('.tsa-cards-container');\n    if (!cardsContainer || !data || !data.checkpoints) return;\n\n    var newHtml = renderTSACardsWidget(data.checkpoints);\n    var temp = document.createElement('div');\n    temp.innerHTML = newHtml;\n    var newContainer = temp.firstElementChild;\n\n    if (newContainer) {\n      cardsContainer.parentElement.replaceChild(newContainer, cardsContainer);\n    }\n  }\n\n  function renderTSACardsWidget(checkpoints) {\n    if (checkpoints.length === 0) {\n      return '<div class=\"tsa-cards-container\"><div class=\"tsa-card tsa-card--primary\"><div class=\"tsa-card__body\"><p class=\"tsa-card__wait-time\">No checkpoint information available.<\/p><\/div><\/div><\/div>';\n    }\n\n    var cardsHtml = checkpoints.map(function(checkpoint, index) {\n      return renderTSACard(checkpoint, index);\n    }).join('\\n    ');\n\n    return '<div class=\"tsa-cards-container\">' + cardsHtml + '<\/div>';\n  }\n\n  function renderTSACard(checkpoint, index) {\n    var variant = getCardVariant(index);\n    var lowestWaitTime = getLowestWaitTime(checkpoint);\n    var gatesInfo = extractGatesInfo(checkpoint);\n    var infoList = getCheckpointInfoList(checkpoint);\n    var displayWaitTime = lowestWaitTime || 'N\/A';\n\n    var gatesHtml = gatesInfo ? '<p class=\"tsa-card__gates\">' + gatesInfo + '<\/p>' : '';\n    var infoListHtml = infoList.length > 0 ? '<ul class=\"tsa-card__info-list\">' + infoList.map(function(item) { return '<li>' + item + '<\/li>'; }).join('\\n        ') + '<\/ul>' : '';\n\n    return '<div class=\"tsa-card tsa-card--' + variant + '\"><div class=\"tsa-card__header tsa-card__header--' + variant + '\"><h2 class=\"tsa-card__terminal\">' + checkpoint.title + '<\/h2>' + gatesHtml + '<\/div><div class=\"tsa-card__body\"><p class=\"tsa-card__wait-time\">' + displayWaitTime + '<\/p>' + infoListHtml + '<\/div><\/div>';\n  }\n\n  function getCardVariant(index) {\n    var variants = ['primary', 'secondary', 'tertiary'];\n    return variants[index % 3];\n  }\n\n  function extractGatesInfo(checkpoint) {\n    var searchText = (checkpoint.location || '') + ' ' + (checkpoint.description || '');\n    var gateMatch = searchText.match(\/Gates?\\s+[\\d\\-,\\s]+\/i);\n    return gateMatch ? gateMatch[0] : null;\n  }\n\n  function getCheckpointInfoList(checkpoint) {\n    var infoItems = [];\n    var openingInfo = checkpoint.lanes.find(function(lane) { return lane.opening_info; });\n    if (openingInfo) infoItems.push(openingInfo.opening_info);\n\n    var hasPreCheck = checkpoint.lanes.some(function(lane) {\n      var title = lane.title.toLowerCase();\n      return title.includes('precheck') || title.includes('pre-check') || title.includes('pre\u2713');\n    });\n    if (hasPreCheck) infoItems.push('TSA PreCheck');\n\n    var hasClear = checkpoint.lanes.some(function(lane) {\n      return lane.title.toLowerCase().includes('clear');\n    }) || (checkpoint.description && checkpoint.description.toLowerCase().includes('clear'));\n    if (hasClear) infoItems.push('CLEAR+');\n\n    return infoItems;\n  }\n\n  \/\/ Dine Shop Relax Widget Update\n  function updateDineShopRelaxWidget(container, data) {\n    var gridEl = container.querySelector('.amenities-grid');\n    if (!gridEl || !data || !data.amenities) return;\n\n    var newHtml = renderAmenitiesGrid(data.amenities);\n    var temp = document.createElement('div');\n    temp.innerHTML = newHtml;\n    var newGridOrEmpty = temp.firstElementChild;\n\n    if (!newGridOrEmpty) return;\n    gridEl.parentElement.replaceChild(newGridOrEmpty, gridEl);\n\n    \/\/ Trigger event to notify filter script that grid was updated\n    var event = new CustomEvent('flyfruition:grid-updated', { bubbles: true });\n    container.dispatchEvent(event);\n  }\n\n  \/\/ Helper functions for time formatting\n  function convertTo12Hour(time) {\n    var match = time.match(\/(\\d{1,2}):(\\d{2})\/);\n    if (!match) return time;\n\n    var hours = parseInt(match[1], 10);\n    var minutes = match[2];\n    var ampm = hours >= 12 ? 'pm' : 'am';\n\n    if (hours === 0) {\n      hours = 12; \/\/ Midnight\n    } else if (hours > 12) {\n      hours -= 12; \/\/ Convert to 12-hour\n    }\n\n    return hours + ':' + minutes + ampm;\n  }\n\n  function formatOperationHours(hours) {\n    if (!hours) return '';\n    \/\/ Replace all time patterns (HH:MM) with 12-hour format\n    return hours.replace(\/(\\d{1,2}):(\\d{2})\/g, function(match) {\n      return convertTo12Hour(match);\n    });\n  }\n\n  function renderAmenitiesGrid(items) {\n    if (items.length === 0) {\n      return '<div class=\"amenities-grid__empty\"><i class=\"fa-light fa-magnifying-glass\" aria-hidden=\"true\"><\/i><p class=\"amenities-grid__empty-title\">No results found<\/p><p class=\"amenities-grid__empty-text\">Try adjusting your search or filters<\/p><\/div>';\n    }\n\n    \/\/ Sort items by category (Dine, Shop, Relax) then alphabetically within each category\n    var categoryOrder = { dine: 0, shop: 1, relax: 2 };\n    var sortedItems = items.slice().sort(function(a, b) {\n      var categoryA = getAmenityCategory(a.type);\n      var categoryB = getAmenityCategory(b.type);\n\n      \/\/ First sort by category\n      var categoryDiff = categoryOrder[categoryA] - categoryOrder[categoryB];\n      if (categoryDiff !== 0) {\n        return categoryDiff;\n      }\n\n      \/\/ Within same category, sort alphabetically by name\n      return a.name.localeCompare(b.name);\n    });\n\n    var cardsHtml = sortedItems.map(function(item) {\n      return renderAmenityCard(item);\n    }).join('\\n');\n\n    return '<div class=\"amenities-grid\" role=\"region\" aria-label=\"Airport amenities\">' + cardsHtml + '<\/div>';\n  }\n\n  function renderAmenityCard(item) {\n    var category = getAmenityCategory(item.type);\n    var imageUrl = item.thumbnail || (item.images && item.images[0]) || getPlaceholderImage(category);\n    var location = (item.coordinates && item.coordinates.structureName) || 'Airport';\n    var mapUrl = 'https:\/\/maps.metroairport.com\/?poiId=' + item.sourceId;\n    var altText = item.name + ' ' + (category === 'dine' ? 'dining location' : category === 'shop' ? 'retail location' : 'relaxation area');\n    var description = item.description || '';\n\n    \/\/ Prepare search text and offer status for filtering\n    var searchText = (item.description || '').replace(\/\"\/g, '&quot;');\n    var hasOffer = item.metadata && item.metadata.dealTitle && item.metadata.dealTitle.trim() ? 'true' : 'false';\n\n    \/\/ Render info tags (location with airplane icon and hours without background)\n    var infoTags = [];\n    if (item.nearbyLandmark) {\n      infoTags.push('<div class=\"amenity-card__info-tag--location\"><i class=\"fa-light fa-plane-departure\" aria-hidden=\"true\"><\/i><span>' + item.nearbyLandmark + '<\/span><\/div>');\n    }\n    if (item.operationHours) {\n      infoTags.push('<div class=\"amenity-card__info-tag--hours\"><i class=\"fa-light fa-clock\" aria-hidden=\"true\"><\/i><span>' + formatOperationHours(item.operationHours) + '<\/span><\/div>');\n    }\n    var infoTagsHtml = infoTags.length > 0 ? '<div class=\"amenity-card__info-tags\">' + infoTags.join('') + '<\/div>' : '';\n\n    \/\/ Truncate description if longer than 150 characters\n    var maxDescriptionLength = 150;\n    var needsTruncation = description && description.length > maxDescriptionLength;\n    var truncatedDescription = needsTruncation ? description.substring(0, maxDescriptionLength) + '...' : description;\n\n    var tagHtml = renderAmenityTag(item.type);\n    var descHtml = description ? '<p class=\"amenity-card__description\" data-full-text=\"' + description.replace(\/\"\/g, '&quot;') + '\" data-truncated-text=\"' + truncatedDescription.replace(\/\"\/g, '&quot;') + '\">' + truncatedDescription + '<\/p>' : '';\n    var toggleHtml = needsTruncation ? '<button class=\"amenity-card__toggle-description\" aria-expanded=\"false\"><span class=\"amenity-card__toggle-text\">Show full description<\/span><i class=\"fa-light fa-circle-plus\" aria-hidden=\"true\"><\/i><\/button>' : '';\n\n    return '<article class=\"amenity-card\" data-category=\"' + category + '\" data-location=\"' + location + '\" data-search-text=\"' + searchText + '\" data-has-offer=\"' + hasOffer + '\"><div class=\"amenity-card__image-wrapper\"><img decoding=\"async\" src=\"' + imageUrl + '\" alt=\"' + altText + '\" class=\"amenity-card__image\" loading=\"lazy\">' + tagHtml + '<\/div><div class=\"amenity-card__content\">' + infoTagsHtml + '<div class=\"amenity-card__body\"><h3 class=\"amenity-card__title\">' + item.name + '<\/h3>' + descHtml + toggleHtml + '<\/div><a href=\"' + mapUrl + '\" class=\"amenity-card__map-btn\" target=\"_blank\" rel=\"noopener noreferrer\" aria-label=\"Open interactive map for ' + item.name + ' (opens in new window)\" title=\"Open interactive map for ' + item.name + '\"><i class=\"fa-light fa-location-dot\"><\/i>Open Interactive Map<\/a><\/div><\/article>';\n  }\n\n  function renderAmenityTag(type) {\n    var category = getAmenityCategory(type);\n    var label = getAmenityCategoryLabel(category);\n    var icon = getAmenityCategoryIcon(category);\n    var cssClass = getAmenityCategoryClass(category);\n    return '<span class=\"amenity-card__tag ' + cssClass + '\" aria-label=\"Category: ' + label + '\"><i class=\"fa-light ' + icon + '\" aria-hidden=\"true\"><\/i>' + label + '<\/span>';\n  }\n\n  function getAmenityCategory(type) {\n    if (!type) return 'relax';\n    var t = type.toLowerCase();\n    if (t.includes('restaurant') || t.includes('dining') || t.includes('food')) return 'dine';\n    if (t.includes('shop') || t.includes('retail') || t.includes('store')) return 'shop';\n    return 'relax';\n  }\n\n  function getAmenityCategoryLabel(category) {\n    return category === 'dine' ? 'Dine' : category === 'shop' ? 'Shop' : 'Relax';\n  }\n\n  function getAmenityCategoryIcon(category) {\n    return category === 'dine' ? 'fa-utensils' : category === 'shop' ? 'fa-bag-shopping' : 'fa-couch';\n  }\n\n  function getAmenityCategoryClass(category) {\n    return 'amenity-card__tag--' + category;\n  }\n\n  function getPlaceholderImage(category) {\n    return category === 'dine' ? '\/images\/placeholder-dine.jpg' : category === 'shop' ? '\/images\/placeholder-shop.jpg' : '\/images\/placeholder-relax.jpg';\n  }\n\n  function initialize() {\n    console.log('[FlyFruition Widget] Fetching fresh data before connecting...');\n    \/\/ First, refresh the widget with fresh data from the endpoint\n    refreshWidget()\n      .then(function() {\n        console.log('[FlyFruition Widget] Fresh data loaded, now connecting to WebSocket...');\n        \/\/ Then connect to WebSocket for live updates\n        connect();\n      })\n      .catch(function(error) {\n        console.error('[FlyFruition Widget] Failed to fetch initial data, connecting to WebSocket anyway...');\n        \/\/ Even if initial fetch fails, still connect to WebSocket\n        connect();\n      });\n  }\n\n  \/\/ Initialize when DOM is ready\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', initialize);\n  } else {\n    initialize();\n  }\n  \n  \/\/ Cleanup on page unload\n  window.addEventListener('beforeunload', function() {\n    if (ws) {\n      ws.close();\n    }\n  });\n})();\n<\/script>                                \n<a class=\"links medium light \" target=\"_self\" rel=\"noopener noreferrer\"  href=\"\/security\/\">\n\n\t\n\t<span class=\"linksTitle\">Safety and Security Info<\/span>\n    \n\t\t<span class=\"fa-light fa-arrow-right iconRight\"><\/span>\n\t<\/a>\n                <\/div>\n            <\/div>\n            \n        <\/div>\n        \t<\/div>\n<\/div>\n\n\n<div class=\"blockGlobal paddingTopLG paddingBottomLG cardImageFluid noRadius\" style=\"background-color:#fff;\">\n\t<img decoding=\"async\" src=\"https:\/\/wcaa.preprod.fruitionqa.com\/wp-content\/themes\/wcaa\/images\/GraphicSwoop.svg\" class=\"graphicSwoopSingle\" alt=\"\">\t<div class=\"container\">\n\t\t<div class=\"cardImagelWrap light\">\n\t\t\t\n\n<!--Option 1-->\n<div class=\"grid wysiwyg wysiwygOption1 intro\">\n\t<div class=\"col-sm-8\">\n\n\t\t\t<div class=\"maincopy light\">\n\t\t\t\t\t\t\t\t\t<h2 class=\"h2 \">Security Checkpoint Locations<\/h2>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<p>Each terminal has dedicated checkpoints with TSA services<\/p>\n\t\t\t\t\t\t\t<\/div>\n\n\t\t\t\n\t\t\t\n\t\t\t\n\t<\/div>\n<\/div>\n\n\n<!--Option 2-->\n\n\n<!--Option 3-->\n\n\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"cardImageSlider\" data-items-to-show=\"3\">\n\t\t\t\n\t\t\t\t\t\t\t\t<div class=\"col-grid  \">\n\t\t\t\t\t\t\n<div class=\"cardImage ghost\">\n\t<div class=\"imageZoomWrap\" style=\"aspect-ratio: 16 \/ 9;\">\n<div class=\"primaryImageWrap\">\n\n\t\n\t\n\t<img decoding=\"async\" src=\"https:\/\/wcaa.preprod.fruitionqa.com\/wp-content\/uploads\/2025\/12\/security-screening-02.webp\" \n\t\talt=\"\" \n\t\tclass=\"aspectRatio radiusImage primaryImage\" \n\t\tstyle=\"aspect-ratio: 16 \/ 9;\" \/>\n\n\t\n\t\n\t\n<\/div>\n\n\n<!-- This style is only needed for the first example with aspectRatio -->\n<style>\n\t.aspectRatio:not([style*=\"aspect-ratio\"]) {\n\t\taspect-ratio: 21 \/ 5;\n\t}\n<\/style>\n<\/div>            \n\t<div class=\"cardImageBody\">\n\t\t<h2 class=\"h4\">Evans Terminal<\/h2>\n\t\t<ul>\n<li>Evans Terminal: Ticket Lobby, Door 1 and Door 4<\/li>\n<\/ul>\n\t\t\t\t\t\n<a class=\"links medium light \" target=\"_blank\" rel=\"noopener noreferrer\"  href=\"https:\/\/maps.metroairport.com\/?poiId=77\">\n\n\t\n\t<span class=\"linksTitle\">Security Checkpoint<\/span>\n    \n\t\t<span class=\"fa-light fa-arrow-up-right-from-square iconRight\"><\/span>\n\t<\/a>\n\t\t\t<\/div>\n\n\t\t\t<a href=\"https:\/\/maps.metroairport.com\/?poiId=77\" class=\"linkOverlay\" target=\"_blank\" aria-label=\"Evans Terminal\"><\/a>\n\t\t\n\t<\/div>\n\n\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t<div class=\"col-grid  \">\n\t\t\t\t\t\t\n<div class=\"cardImage ghost\">\n\t<div class=\"imageZoomWrap\" style=\"aspect-ratio: 16 \/ 9;\">\n<div class=\"primaryImageWrap\">\n\n\t\n\t\n\t<img decoding=\"async\" src=\"https:\/\/wcaa.preprod.fruitionqa.com\/wp-content\/uploads\/2025\/12\/security-screening-01-1-scaled.webp\" \n\t\talt=\"\" \n\t\tclass=\"aspectRatio radiusImage primaryImage\" \n\t\tstyle=\"aspect-ratio: 16 \/ 9;\" \/>\n\n\t\n\t\n\t\n<\/div>\n\n\n<!-- This style is only needed for the first example with aspectRatio -->\n<style>\n\t.aspectRatio:not([style*=\"aspect-ratio\"]) {\n\t\taspect-ratio: 21 \/ 5;\n\t}\n<\/style>\n<\/div>            \n\t<div class=\"cardImageBody\">\n\t\t<h2 class=\"h4\">McNamara Terminal<\/h2>\n\t\t<ul>\n<li>McNamara Terminal: Ticketing Lobby, Level 3<\/li>\n<li>McNamara Terminal:\u00a0Bridge to the Terminal from the Parking Garage, Level 2<\/li>\n<li>Westin Detroit Metropolitan Airport Hotel<\/li>\n<\/ul>\n\t\t\t\t\t\n<a class=\"links medium light \" target=\"_blank\" rel=\"noopener noreferrer\"  href=\"https:\/\/maps.metroairport.com\/?poiId=683\">\n\n\t\n\t<span class=\"linksTitle\">Security Checkpoint<\/span>\n    \n\t\t<span class=\"fa-light fa-arrow-up-right-from-square iconRight\"><\/span>\n\t<\/a>\n\t\t\t<\/div>\n\n\t\t\t<a href=\"https:\/\/maps.metroairport.com\/?poiId=683\" class=\"linkOverlay\" target=\"_blank\" aria-label=\"McNamara Terminal\"><\/a>\n\t\t\n\t<\/div>\n\n\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t<\/div>\n\n\t\t\t\t\t\t\t<div class=\"arrowContainer\">\n\t\t\t\t\t<button class=\"prev\" aria-label=\"Previous slide\"><span class=\"fa-light fa-arrow-left\" aria-hidden=\"true\"><\/span><\/button>\n\t\t\t\t\t<button class=\"next\" aria-label=\"Next slide\"><span class=\"fa-light fa-arrow-right\" aria-hidden=\"true\"><\/span><\/button>\n\t\t\t\t<\/div>\n\t\t\t\n\t\t\t\n\t\t<\/div>\n\t<\/div>\n<\/div>\n\n\n\n<div class=\"blockGlobal paddingTopLG paddingBottomLG cardLogoFluid noRadius\" style=\"background-color:#0064A7;\">\n\t\t<div class=\"container\">\n\t\t\n\n<!--Option 1-->\n<div class=\"grid wysiwyg wysiwygOption1 intro\">\n\t<div class=\"col-sm-8\">\n\n\t\t\t<div class=\"maincopy dark\">\n\t\t\t\t\t\t\t\t\t<h2 class=\"h2 titleWhite\">Expedited Screening Programs<\/h2>\n\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\n\t\t\t\n\t\t\t\n\t\t\t\n\t<\/div>\n<\/div>\n\n\n<!--Option 2-->\n\n\n<!--Option 3-->\n\n\n\t\t<div class=\"grid\"><div class=\"col-sm-5 col-grid\">\n<div class=\"cardLogo\">\n\t\n\n\n<img decoding=\"async\" class=\"flex-img primaryLogo\" src=\"https:\/\/wcaa.preprod.fruitionqa.com\/wp-content\/uploads\/2025\/11\/5a05d057a7e334aef153456437b4d6f4e9728c80.png\" alt=\"\" width=\"178\" >\n\n\t<h2 class=\"h4\">TSA PreCheck<\/h2>\n\t\t\t<div class=\"cardLogoCopy maincopy\">\n\t\t<p>Available at both terminals.<br \/>\nThis program allows eligible, low-risk passengers to expedite the security screening process.<\/p>\n\t\t<\/div>\n\t\t\t\t\n<a class=\"links medium light \" target=\"_blank\" rel=\"noopener noreferrer\"  href=\"https:\/\/www.tsa.gov\/\">\n\n\t\n\t<span class=\"linksTitle\">Learn More on TSA.gov<\/span>\n    \n\t\t<span class=\"fa-light fa-arrow-up-right-from-square iconRight\"><\/span>\n\t<\/a>\n\t<\/div>\n<\/div><div class=\"col-sm-5 col-grid\">\n<div class=\"cardLogo\">\n\t\n\n\n<img decoding=\"async\" class=\"flex-img primaryLogo\" src=\"https:\/\/wcaa.preprod.fruitionqa.com\/wp-content\/uploads\/2026\/05\/news-tsacares.png\" alt=\"\" width=\"178\" >\n\n\t<h2 class=\"h4\">TSA Cares<\/h2>\n\t\t\t<div class=\"cardLogoCopy maincopy\">\n\t\t<p>TSA Cares is a helpline that provides passengers with disabilities, medical conditions and other special circumstances additional assistance during the security screening process.<\/p>\n\t\t<\/div>\n\t\t\t\t\n<a class=\"links medium light \" target=\"_blank\" rel=\"noopener noreferrer\"  href=\"https:\/\/www.tsa.gov\/travel\/passenger-support\">\n\n\t\n\t<span class=\"linksTitle\">Learn More on TSA.gov<\/span>\n    \n\t\t<span class=\"fa-light fa-arrow-up-right-from-square iconRight\"><\/span>\n\t<\/a>\n\t<\/div>\n<\/div><div class=\"col-sm-5 col-grid\">\n<div class=\"cardLogo\">\n\t\n\n\n<img decoding=\"async\" class=\"flex-img primaryLogo\" src=\"https:\/\/wcaa.preprod.fruitionqa.com\/wp-content\/uploads\/2025\/11\/959670f56619c1d4473ac964f5c723f5e8c90844-scaled.png\" alt=\"\" width=\"178\" >\n\n\t<h2 class=\"h4\">CLEAR<\/h2>\n\t\t\t<div class=\"cardLogoCopy maincopy\">\n\t\t<p>Available at both terminals.<br \/>\nUse biometric ID to skip ID check line.<\/p>\n\t\t<\/div>\n\t\t\t\t\n<a class=\"links medium light \" target=\"_blank\" rel=\"noopener noreferrer\"  href=\"https:\/\/www.clearme.com\/\">\n\n\t\n\t<span class=\"linksTitle\">Learn More on clearme.com<\/span>\n    \n\t\t<span class=\"fa-light fa-arrow-up-right-from-square iconRight\"><\/span>\n\t<\/a>\n\t<\/div>\n<\/div><\/div>\t<\/div>\n<\/div>\n\n\n\n<div class=\"blockGlobal paddingTopLG paddingBottomLG accordionFluid\" style=\"background-color:#F3F7FC;\">\n\t\t<div class=\"container\">\n\t\t\t\t\t<div class=\"grid\">\n\t\t\t\t<div class=\"col-md-6 mediaLeft\">\n\t\t\t\t\t\n\n<div class=\"wysiwyg\">\n\t<div class=\"maincopy light\">\n\n\t\t\n\t\t\t\t\t\t\t\t\t<h2 class=\"h2 \">Arriving from an International Destination?<\/h2>\n\t\t\t\t\t\t\t\t\t\t<p>All international travelers arriving at DTW must clear U.S. Customs and Border Protection (CBP) requirements. Eligible travelers can expedite entry using Global Entry kiosks or the Mobile Passport Control app. CBP service counters are in the International Arrivals area of the McNamara Terminal and Baggage Claim area of the Evans Terminal. The CBP service desk inside the McNamara is available 24\/7.<\/p>\n<p>CBP Hours of Operations:<\/p>\n<ul>\n<li>McNamara Terminal: Noon-8 p.m.<\/li>\n<li>Evans Terminal: 10 a.m.-9 p.m.<\/li>\n<li>The CBP Service Desk at the McNamara Terminal operates 24\/7, via phone at\u00a0<a href=\"tel:734-952-9000\">734-942-9000<\/a>.<\/li>\n<\/ul>\n<p>Passengers should declare all purchased items, currency over $10,000 or foreign equivalent, and any food, plants, or agricultural products in your checked or carry-on baggage.<\/p>\n\t\t\t<\/div>\n\n\t\n\t\n\t\n\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"col-md-6 mediaRight\">\n\t\t\t\t\t\n<div class=\"beefup openAccordion accordionStyle boxed\">\n\t<button title=\"Show Automated Passport Control\" class=\"openTitle beefup__head h6  hasIconLeft\"><span class=\"fa-classic fa-light fa-passport\"><\/span><span class=\"beefup__head--title\">Automated Passport Control<\/span><\/button>\n\t<div class=\"beefup__body maincopy\" role=\"region\" hidden=\"hidden\" style=\"display: none;\">\n\t\t<p>Designed for U.S., Canadian and eligible Visa Waiver Program passport holders, Automated Passport Control kiosks enhance the entry process by providing a streamlined and efficient experience.<\/p>\n\t\t\t<\/div>\n<\/div>\n\n<div class=\"beefup openAccordion accordionStyle boxed\">\n\t<button title=\"Show Global Entry\" class=\"openTitle beefup__head h6  hasIconLeft\"><span class=\"fa-classic fa-light fa-globe\"><\/span><span class=\"beefup__head--title\">Global Entry<\/span><\/button>\n\t<div class=\"beefup__body maincopy\" role=\"region\" hidden=\"hidden\" style=\"display: none;\">\n\t\t<p>Passengers can apply for the CBP <a href=\"https:\/\/www.cbp.gov\/travel\/trusted-traveler-programs\/global-entry\">Global Entry Program<\/a> for expedited processing of low-risk travelers. Eligibility requires pre-approval, a background check, a $100 non-refundable fee and an in-person interview prior to enrollment. Conditionally approved travelers may defer their interview until after returning to the U.S. from international travel.<\/p>\n\t\t\t<\/div>\n<\/div>\n\n<div class=\"beefup openAccordion accordionStyle boxed\">\n\t<button title=\"Show U.S. Pre-Clearance\" class=\"openTitle beefup__head h6  hasIconLeft\"><span class=\"fa-classic fa-light fa-mobile\"><\/span><span class=\"beefup__head--title\">U.S. Pre-Clearance<\/span><\/button>\n\t<div class=\"beefup__body maincopy\" role=\"region\" hidden=\"hidden\" style=\"display: none;\">\n\t\t<p><a href=\"https:\/\/www.cbp.gov\/travel\/preclearance\">Pre-clearance<\/a> allows immigration, customs, and agriculture checks to be completed before departure at foreign airports. Passengers from parts of Canada and the Bahamas undergo U.S. pre-clearance before departing for the U.S. and are generally considered domestic passengers upon arrival at DTW.<\/p>\n\t\t\t<\/div>\n<\/div>\n\n<div class=\"beefup openAccordion accordionStyle boxed\">\n\t<button title=\"Show Standard Entry\" class=\"openTitle beefup__head h6  hasIconLeft\"><span class=\"fa-classic fa-light fa-users\"><\/span><span class=\"beefup__head--title\">Standard Entry<\/span><\/button>\n\t<div class=\"beefup__body maincopy\" role=\"region\" hidden=\"hidden\" style=\"display: none;\">\n\t\t<p>Passengers from non-Visa Waiver countries must carry a valid Visa and see a CBP officer for identification. Processing times vary by flight arrival, passenger volume and other variables.<\/p>\n\t\t\t<\/div>\n<\/div>\n\t\t\t\t<\/div>      \n\t\t\t<\/div>\n\t\t\t<\/div>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>Check real-time TSA wait times at DTW. Find checkpoint locations, TSA PreCheck and CLEAR lanes, customs info, and Global Entry for faster screening.<\/p>","protected":false},"author":7,"featured_media":2063,"parent":695,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-689","page","type-page","status-publish","has-post-thumbnail","hentry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Security Screening - WCAA<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/wcaa.preprod.fruitionqa.com\/ar\/security\/security-screening\/\" \/>\n<meta property=\"og:locale\" content=\"ar_AR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Security Screening - WCAA\" \/>\n<meta property=\"og:description\" content=\"Check real-time TSA wait times at DTW. Find checkpoint locations, TSA PreCheck and CLEAR lanes, customs info, and Global Entry for faster screening.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/wcaa.preprod.fruitionqa.com\/ar\/security\/security-screening\/\" \/>\n<meta property=\"og:site_name\" content=\"WCAA\" \/>\n<meta property=\"article:modified_time\" content=\"2026-05-27T18:24:44+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/wcaa.preprod.fruitionqa.com\/wp-content\/uploads\/2025\/12\/security-screening-01-scaled.webp\" \/>\n\t<meta property=\"og:image:width\" content=\"2560\" \/>\n\t<meta property=\"og:image:height\" content=\"616\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/webp\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"1 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/wcaa.preprod.fruitionqa.com\/security\/security-screening\/\",\"url\":\"https:\/\/wcaa.preprod.fruitionqa.com\/security\/security-screening\/\",\"name\":\"Security Screening - WCAA\",\"isPartOf\":{\"@id\":\"https:\/\/wcaa.preprod.fruitionqa.com\/ja\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/wcaa.preprod.fruitionqa.com\/security\/security-screening\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/wcaa.preprod.fruitionqa.com\/security\/security-screening\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/wcaa.preprod.fruitionqa.com\/wp-content\/uploads\/2025\/12\/security-screening-01-scaled.webp\",\"datePublished\":\"2025-11-24T20:34:25+00:00\",\"dateModified\":\"2026-05-27T18:24:44+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/wcaa.preprod.fruitionqa.com\/security\/security-screening\/#breadcrumb\"},\"inLanguage\":\"ar\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/wcaa.preprod.fruitionqa.com\/security\/security-screening\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"ar\",\"@id\":\"https:\/\/wcaa.preprod.fruitionqa.com\/security\/security-screening\/#primaryimage\",\"url\":\"https:\/\/wcaa.preprod.fruitionqa.com\/wp-content\/uploads\/2025\/12\/security-screening-01-scaled.webp\",\"contentUrl\":\"https:\/\/wcaa.preprod.fruitionqa.com\/wp-content\/uploads\/2025\/12\/security-screening-01-scaled.webp\",\"width\":2560,\"height\":616},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/wcaa.preprod.fruitionqa.com\/security\/security-screening\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/wcaa.preprod.fruitionqa.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Security\",\"item\":\"https:\/\/wcaa.preprod.fruitionqa.com\/security\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Security Screening\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/wcaa.preprod.fruitionqa.com\/ja\/#website\",\"url\":\"https:\/\/wcaa.preprod.fruitionqa.com\/ja\/\",\"name\":\"WCAA\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/wcaa.preprod.fruitionqa.com\/ja\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"ar\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Security Screening - WCAA","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/wcaa.preprod.fruitionqa.com\/ar\/security\/security-screening\/","og_locale":"ar_AR","og_type":"article","og_title":"Security Screening - WCAA","og_description":"Check real-time TSA wait times at DTW. Find checkpoint locations, TSA PreCheck and CLEAR lanes, customs info, and Global Entry for faster screening.","og_url":"https:\/\/wcaa.preprod.fruitionqa.com\/ar\/security\/security-screening\/","og_site_name":"WCAA","article_modified_time":"2026-05-27T18:24:44+00:00","og_image":[{"width":2560,"height":616,"url":"https:\/\/wcaa.preprod.fruitionqa.com\/wp-content\/uploads\/2025\/12\/security-screening-01-scaled.webp","type":"image\/webp"}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/wcaa.preprod.fruitionqa.com\/security\/security-screening\/","url":"https:\/\/wcaa.preprod.fruitionqa.com\/security\/security-screening\/","name":"Security Screening - WCAA","isPartOf":{"@id":"https:\/\/wcaa.preprod.fruitionqa.com\/ja\/#website"},"primaryImageOfPage":{"@id":"https:\/\/wcaa.preprod.fruitionqa.com\/security\/security-screening\/#primaryimage"},"image":{"@id":"https:\/\/wcaa.preprod.fruitionqa.com\/security\/security-screening\/#primaryimage"},"thumbnailUrl":"https:\/\/wcaa.preprod.fruitionqa.com\/wp-content\/uploads\/2025\/12\/security-screening-01-scaled.webp","datePublished":"2025-11-24T20:34:25+00:00","dateModified":"2026-05-27T18:24:44+00:00","breadcrumb":{"@id":"https:\/\/wcaa.preprod.fruitionqa.com\/security\/security-screening\/#breadcrumb"},"inLanguage":"ar","potentialAction":[{"@type":"ReadAction","target":["https:\/\/wcaa.preprod.fruitionqa.com\/security\/security-screening\/"]}]},{"@type":"ImageObject","inLanguage":"ar","@id":"https:\/\/wcaa.preprod.fruitionqa.com\/security\/security-screening\/#primaryimage","url":"https:\/\/wcaa.preprod.fruitionqa.com\/wp-content\/uploads\/2025\/12\/security-screening-01-scaled.webp","contentUrl":"https:\/\/wcaa.preprod.fruitionqa.com\/wp-content\/uploads\/2025\/12\/security-screening-01-scaled.webp","width":2560,"height":616},{"@type":"BreadcrumbList","@id":"https:\/\/wcaa.preprod.fruitionqa.com\/security\/security-screening\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/wcaa.preprod.fruitionqa.com\/"},{"@type":"ListItem","position":2,"name":"Security","item":"https:\/\/wcaa.preprod.fruitionqa.com\/security\/"},{"@type":"ListItem","position":3,"name":"Security Screening"}]},{"@type":"WebSite","@id":"https:\/\/wcaa.preprod.fruitionqa.com\/ja\/#website","url":"https:\/\/wcaa.preprod.fruitionqa.com\/ja\/","name":"WCAA","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/wcaa.preprod.fruitionqa.com\/ja\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"ar"}]}},"_links":{"self":[{"href":"https:\/\/wcaa.preprod.fruitionqa.com\/ar\/wp-json\/wp\/v2\/pages\/689","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wcaa.preprod.fruitionqa.com\/ar\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/wcaa.preprod.fruitionqa.com\/ar\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/wcaa.preprod.fruitionqa.com\/ar\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/wcaa.preprod.fruitionqa.com\/ar\/wp-json\/wp\/v2\/comments?post=689"}],"version-history":[{"count":37,"href":"https:\/\/wcaa.preprod.fruitionqa.com\/ar\/wp-json\/wp\/v2\/pages\/689\/revisions"}],"predecessor-version":[{"id":5183,"href":"https:\/\/wcaa.preprod.fruitionqa.com\/ar\/wp-json\/wp\/v2\/pages\/689\/revisions\/5183"}],"up":[{"embeddable":true,"href":"https:\/\/wcaa.preprod.fruitionqa.com\/ar\/wp-json\/wp\/v2\/pages\/695"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wcaa.preprod.fruitionqa.com\/ar\/wp-json\/wp\/v2\/media\/2063"}],"wp:attachment":[{"href":"https:\/\/wcaa.preprod.fruitionqa.com\/ar\/wp-json\/wp\/v2\/media?parent=689"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}