{"version":3,"names":["escapeHtml","text","div","document","createElement","textContent","innerHTML","sanitizeUrl","url","urlObj","URL","protocol","href","e","console","error","WARNING_STATUSES","alertClassForStatus","status","indexOf","String","toLowerCase","$","remove","ajax","timeout","dataType","done","res","alertMessage","ongoing_incidents","Array","isArray","length","incident","name","updateTime","Date","last_update_at","toLocaleString","safeName","safeStatus","safeUrl","safeUpdateTime","incidentClass","in_progress_maintenances","maintenance","prepend","fail","jqXHR","textStatus","errorThrown"],"sources":["theme-11-inline-common-body_tag.js"],"sourcesContent":["\n  // Utility function to escape HTML to prevent XSS\n  function escapeHtml(text) {\n    if (!text) return '';\n    var div = document.createElement('div');\n    div.textContent = text;\n    return div.innerHTML;\n  }\n\n  // Utility function to validate and sanitize URLs\n  function sanitizeUrl(url) {\n    if (!url) return '#';\n    try {\n      var urlObj = new URL(url);\n      // Only allow https and http protocols\n      if (urlObj.protocol === 'https:' || urlObj.protocol === 'http:') {\n        return urlObj.href;\n      }\n    } catch (e) {\n      console.error('Invalid URL:', url);\n    }\n    return '#';\n  }\n\n  // Statuses that should show yellow instead of red\n  var WARNING_STATUSES = ['identified', 'monitoring'];\n\n  function alertClassForStatus(status) {\n    return WARNING_STATUSES.indexOf(String(status || '').toLowerCase()) !== -1\n      ? 'warning-alert'\n      : 'high-alert';\n  }\n\n  // Remove any existing status alerts\n  $('.discourse-status-alert').remove();\n\n  // Fetch the status from incident.io API with timeout\n  $.ajax({\n    url: \"https://statuspage.incident.io/bubbleapp/api/v1/summary\",\n    timeout: 10000, // 10 second timeout\n    dataType: 'json'\n  })\n  .done(function(res) {\n    try {\n      var alertMessage = '';\n\n      // 1. Check if there are any ongoing incidents\n      if (res?.ongoing_incidents && Array.isArray(res.ongoing_incidents) && res.ongoing_incidents.length > 0) {\n        var incident = res.ongoing_incidents[0];\n\n        // Validate required fields\n        if (!incident.name || !incident.url) {\n          console.error('Incident missing required fields:', incident);\n          return;\n        }\n\n        var updateTime = '';\n        try {\n          updateTime = new Date(incident.last_update_at).toLocaleString();\n        } catch (e) {\n          updateTime = 'Unknown';\n        }\n\n        // Escape all user-controllable content\n        var safeName = escapeHtml(incident.name);\n        var safeStatus = escapeHtml(incident.status || 'Unknown');\n        var safeUrl = sanitizeUrl(incident.url);\n        var safeUpdateTime = escapeHtml(updateTime);\n\n        // Yellow for identified/monitoring, red for everything else\n        var incidentClass = alertClassForStatus(incident.status);\n\n        alertMessage = `\n          <div class=\"discourse-status-alert ${incidentClass}\">\n            <a href=\"${safeUrl}\" target=\"_blank\" rel=\"noopener noreferrer\">\n              <strong>${safeName}</strong> &mdash; Status: ${safeStatus} | Last update: ${safeUpdateTime}\n            </a>\n          </div>\n        `;\n      }\n      // 2. If no ongoing incidents, check for in-progress maintenances\n      else if (res?.in_progress_maintenances && Array.isArray(res.in_progress_maintenances) && res.in_progress_maintenances.length > 0) {\n        var maintenance = res.in_progress_maintenances[0];\n\n        // Validate required fields\n        if (!maintenance.name || !maintenance.url) {\n          console.error('Maintenance missing required fields:', maintenance);\n          return;\n        }\n\n        var updateTime = '';\n        try {\n          updateTime = new Date(maintenance.last_update_at).toLocaleString();\n        } catch (e) {\n          updateTime = 'Unknown';\n        }\n\n        // Escape all user-controllable content\n        var safeName = escapeHtml(maintenance.name);\n        var safeStatus = escapeHtml(maintenance.status || 'Unknown');\n        var safeUrl = sanitizeUrl(maintenance.url);\n        var safeUpdateTime = escapeHtml(updateTime);\n\n        alertMessage = `\n          <div class=\"discourse-status-alert maintenance-alert\">\n            <a href=\"${safeUrl}\" target=\"_blank\" rel=\"noopener noreferrer\">\n              <strong>${safeName}</strong> &mdash; Status: ${safeStatus} | Last update: ${safeUpdateTime}\n            </a>\n          </div>\n        `;\n      }\n\n      // 3. If an alert message is defined, prepend it to the #main-outlet element\n      if (alertMessage) {\n        $('#main-outlet').prepend(alertMessage);\n      }\n    } catch (error) {\n      console.error('Error processing incident.io status:', error);\n    }\n  })\n  .fail(function(jqXHR, textStatus, errorThrown) {\n    console.error('Failed to fetch incident.io status:', textStatus, errorThrown);\n    // Optionally show a fallback message to users\n    // $('#main-outlet').prepend('<div class=\"discourse-status-alert error-alert\">Unable to load status information</div>');\n  });\n"],"mappings":"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","ignoreList":[]}