Help
RSS
API
Feed
Maltego
Contact
Domain > chatbot-marina.devcustomprojects.online
×
More information on this domain is in
AlienVault OTX
Is this malicious?
Yes
No
DNS Resolutions
Date
IP Address
2025-08-28
104.21.47.65
(
ClassC
)
2025-12-14
3.135.126.69
(
ClassC
)
Port 443
HTTP/1.1 200 OKAccept-Ranges: bytesContent-Length: 84736Content-Type: text/html; charsetutf-8Date: Sun, 14 Dec 2025 14:54:08 GMTEtag: 7f73c386685b64493bf00c319cb20c88Last-Modified: Mon, 01 Dec 2025 20:20:01 GMTServer: uvicorn !DOCTYPE html>html langen>head> meta charsetUTF-8> meta nameviewport contentwidthdevice-width, initial-scale1.0> title>AI Health Assistant/title> link hrefhttps://fonts.googleapis.com/css2?familyInter:wght@300;400;500;600;700&displayswap relstylesheet> link relstylesheet hrefhttps://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css> style> :root { --primary: #2563eb; --primary-light: #3b82f6; --primary-dark: #1d4ed8; --secondary: #10b981; --accent: #f59e0b; --danger: #ef4444; --warning: #f59e0b; --success: #10b981; --gray-50: #f9fafb; --gray-100: #f3f4f6; --gray-200: #e5e7eb; --gray-300: #d1d5db; --gray-400: #9ca3af; --gray-500: #6b7280; --gray-600: #4b5563; --gray-700: #374151; --gray-800: #1f2937; --gray-900: #111827; } * { box-sizing: border-box; margin: 0; padding: 0; } body { font-family: Inter, sans-serif; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); min-height: 100vh; color: var(--gray-800); line-height: 1.6; } .container { max-width: 1000px; margin: 0 auto; padding: 20px; min-height: 100vh; display: flex; flex-direction: column; } /* CONSENT MODAL STYLES */ .consent-modal { display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0, 0, 0, 0.8); z-index: 10000; overflow-y: auto; padding: 20px; } .consent-modal.active { display: flex; align-items: center; justify-content: center; } .consent-content { background: white; border-radius: 16px; max-width: 700px; width: 100%; max-height: 90vh; overflow-y: auto; box-shadow: 0 20px 60px rgba(0, 0, 0, 0.5); } .consent-header { background: linear-gradient(135deg, var(--primary), var(--primary-dark)); color: white; padding: 30px; border-radius: 16px 16px 0 0; text-align: center; } .consent-header h2 { font-size: 1.8rem; margin-bottom: 10px; } .consent-header p { opacity: 0.9; font-size: 0.95rem; } .consent-body { padding: 30px; } .consent-section { margin-bottom: 25px; padding: 20px; background: var(--gray-50); border-radius: 12px; border-left: 4px solid var(--primary); } .consent-section h3 { color: var(--primary-dark); margin-bottom: 12px; font-size: 1.1rem; display: flex; align-items: center; gap: 8px; } .consent-section p { color: var(--gray-700); font-size: 0.95rem; line-height: 1.6; } .consent-checkbox { display: flex; align-items: flex-start; gap: 12px; padding: 15px; background: white; border-radius: 8px; margin-bottom: 12px; border: 2px solid var(--gray-200); transition: all 0.3s ease; cursor: pointer; } .consent-checkbox:hover { border-color: var(--primary-light); background: var(--gray-50); } .consent-checkbox inputtypecheckbox { width: 20px; height: 20px; cursor: pointer; margin-top: 2px; } .consent-checkbox label { flex: 1; cursor: pointer; font-size: 0.9rem; color: var(--gray-700); } .consent-checkbox.required label::after { content: *; color: var(--danger); } .consent-actions { display: flex; gap: 12px; justify-content: flex-end; padding: 20px 30px; background: var(--gray-50); border-radius: 0 0 16px 16px; } .consent-btn { padding: 12px 24px; border: none; border-radius: 8px; font-weight: 600; cursor: pointer; transition: all 0.3s ease; display: flex; align-items: center; gap: 8px; } .consent-btn.decline { background: var(--gray-300); color: var(--gray-700); } .consent-btn.decline:hover { background: var(--gray-400); } .consent-btn.accept { background: var(--primary); color: white; } .consent-btn.accept:hover:not(:disabled) { background: var(--primary-dark); } .consent-btn.accept:disabled { background: var(--gray-400); cursor: not-allowed; } /* DISCLAIMER BAR */ .disclaimer-bar { background: linear-gradient(135deg, #ef4444, #dc2626); color: white; padding: 15px 20px; text-align: center; font-size: 0.9rem; display: flex; align-items: center; justify-content: center; gap: 10px; box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); margin-bottom: 20px; border-radius: 12px; } .disclaimer-bar i { font-size: 1.2rem; } header { text-align: center; margin-bottom: 30px; color: white; } h1 { font-size: 2.5rem; font-weight: 700; margin-bottom: 10px; text-shadow: 0 2px 4px rgba(0,0,0,0.3); } .subtitle { font-size: 1.2rem; opacity: 0.9; font-weight: 400; } .page-description { background: rgba(255,255,255,0.1); border-radius: 16px; padding: 30px; margin-bottom: 30px; backdrop-filter: blur(10px); border: 1px solid rgba(255,255,255,0.2); text-align: center; } .description-content h2 { color: white; font-size: 1.8rem; font-weight: 600; margin-bottom: 15px; display: flex; align-items: center; justify-content: center; gap: 12px; } .description-content p { color: rgba(255,255,255,0.9); font-size: 1.1rem; line-height: 1.6; margin-bottom: 25px; max-width: 800px; margin-left: auto; margin-right: auto; } .features-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 20px; max-width: 600px; margin: 0 auto; } .feature-item { display: flex; flex-direction: column; align-items: center; gap: 8px; color: white; font-weight: 500; } .feature-item i { font-size: 1.5rem; color: rgba(255,255,255,0.8); } .user-id-section { background: rgba(255,255,255,0.1); border-radius: 12px; padding: 20px; margin-bottom: 30px; backdrop-filter: blur(10px); border: 1px solid rgba(255,255,255,0.2); } .user-id-section h3 { color: white; margin-bottom: 15px; font-size: 1.1rem; display: flex; align-items: center; gap: 8px; } .user-id-input { display: flex; gap: 12px; align-items: center; flex-wrap: wrap; } #user-id-field { flex: 1; min-width: 200px; padding: 12px 16px; border: 2px solid rgba(255,255,255,0.3); border-radius: 8px; background: rgba(255,255,255,0.9); font-family: inherit; font-size: 16px; transition: all 0.3s ease; } #user-id-field:focus { outline: none; border-color: var(--primary); box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1); } .set-user-btn { background: var(--primary); color: white; border: none; padding: 12px 20px; border-radius: 8px; cursor: pointer; font-weight: 600; transition: all 0.3s ease; display: flex; align-items: center; gap: 6px; } .set-user-btn:hover { background: var(--primary-dark); transform: translateY(-1px); } .set-user-btn:disabled { background: var(--gray-400); cursor: not-allowed; transform: none; } .current-user { color: white; font-style: italic; margin-top: 8px; font-size: 0.9rem; display: flex; align-items: center; gap: 6px; } .user-status { display: inline-flex; align-items: center; gap: 6px; padding: 4px 8px; border-radius: 6px; font-size: 0.8rem; font-weight: 500; } .user-status.valid { background: rgba(16, 185, 129, 0.2); color: #10b981; border: 1px solid rgba(16, 185, 129, 0.3); } .user-status.invalid { background: rgba(239, 68, 68, 0.2); color: #ef4444; border: 1px solid rgba(239, 68, 68, 0.3); } .track-selector { display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 20px; margin-bottom: 30px; } .track-card { background: white; border-radius: 16px; padding: 24px; cursor: pointer; transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06); border: 2px solid transparent; position: relative; overflow: hidden; } .track-card.disabled { opacity: 0.6; cursor: not-allowed; transform: none !important; } .track-card::before { content: ; position: absolute; top: 0; left: 0; right: 0; height: 4px; background: var(--primary); transform: scaleX(0); transition: transform 0.3s ease; } .track-card:hover:not(.disabled) { transform: translateY(-4px); box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04); border-color: var(--primary); } .track-card:hover:not(.disabled)::before { transform: scaleX(1); } .track-icon { width: 48px; height: 48px; background: linear-gradient(135deg, var(--primary), var(--primary-light)); border-radius: 12px; display: flex; align-items: center; justify-content: center; margin-bottom: 16px; color: white; font-size: 24px; } .track-title { font-size: 1.25rem; font-weight: 600; color: var(--gray-800); margin-bottom: 8px; } .track-description { color: var(--gray-600); font-size: 0.95rem; line-height: 1.5; } .chat-container { background: white; border-radius: 20px; box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25); overflow: hidden; display: none; height: 70vh; flex-direction: column; position: relative; } .chat-header { background: linear-gradient(135deg, var(--primary), var(--primary-light)); color: white; padding: 20px 24px; display: flex; justify-content: space-between; align-items: center; box-shadow: 0 2px 4px rgba(0,0,0,0.1); } .chat-title { display: flex; align-items: center; font-weight: 600; font-size: 1.1rem; } .chat-title i { margin-right: 12px; font-size: 1.2rem; } .back-btn { background: rgba(255,255,255,0.2); border: none; color: white; cursor: pointer; padding: 8px 16px; border-radius: 8px; display: flex; align-items: center; font-weight: 500; transition: background 0.3s ease; } .back-btn:hover { background: rgba(255,255,255,0.3); } .back-btn i { margin-right: 6px; } .chat-messages { flex: 1; padding: 24px; overflow-y: auto; display: flex; flex-direction: column; gap: 16px; } .message { max-width: 75%; padding: 16px 20px; border-radius: 18px; position: relative; animation: messageSlide 0.4s cubic-bezier(0.4, 0, 0.2, 1); } @keyframes messageSlide { from { opacity: 0; transform: translateY(20px) scale(0.95); } to { opacity: 1; transform: translateY(0) scale(1); } } .bot-message { background: white; align-self: flex-start; border-bottom-left-radius: 6px; box-shadow: 0 2px 8px rgba(0,0,0,0.08); border: 1px solid var(--gray-200); position: relative; } .bot-message::before { content: ; position: absolute; left: -8px; bottom: 6px; width: 0; height: 0; border-style: solid; border-width: 0 8px 8px 0; border-color: transparent white transparent transparent; } .user-message { background: linear-gradient(135deg, var(--primary), var(--primary-light)); color: white; align-self: flex-end; border-bottom-right-radius: 6px; box-shadow: 0 2px 8px rgba(37, 99, 235, 0.3); } .user-message::after { content: ; position: absolute; right: -8px; bottom: 6px; width: 0; height: 0; border-style: solid; border-width: 0 0 8px 8px; border-color: transparent transparent var(--primary-light) transparent; } .urgent-message { background: linear-gradient(135deg, var(--danger), #dc2626); color: white; align-self: flex-start; border-left: 4px solid #b91c1c; animation: urgentPulse 2s infinite; } @keyframes urgentPulse { 0%, 100% { box-shadow: 0 0 0 0 rgba(239, 68, 68, 0.4); } 50% { box-shadow: 0 0 0 15px rgba(239, 68, 68, 0); } } .typing-indicator { display: none; align-self: flex-start; background: white; padding: 16px 20px; border-radius: 18px; border-bottom-left-radius: 6px; box-shadow: 0 2px 8px rgba(0,0,0,0.08); border: 1px solid var(--gray-200); align-items: center; gap: 8px; } .typing-text { color: var(--gray-600); font-style: italic; } .typing-dots { display: flex; gap: 4px; } .dot { width: 8px; height: 8px; border-radius: 50%; background-color: var(--gray-400); animation: typingDot 1.4s infinite ease-in-out; } .dot:nth-child(1) { animation-delay: -0.32s; } .dot:nth-child(2) { animation-delay: -0.16s; } @keyframes typingDot { 0%, 80%, 100% { transform: scale(0.8); opacity: 0.5; } 40% { transform: scale(1); opacity: 1; } } .diagnosis-button-container { display: none; padding: 16px 24px; background: var(--gray-50); border-top: 1px solid var(--gray-200); border-bottom: 1px solid var(--gray-200); justify-content: center; } .diagnosis-btn { background: linear-gradient(135deg, var(--success), #059669); color: white; border: none; padding: 12px 24px; border-radius: 10px; cursor: pointer; font-weight: 600; font-family: inherit; transition: all 0.3s ease; display: flex; align-items: center; gap: 8px; box-shadow: 0 4px 12px rgba(16, 185, 129, 0.3); } .diagnosis-btn:hover { transform: translateY(-2px); box-shadow: 0 8px 20px rgba(16, 185, 129, 0.4); } .diagnosis-btn:active { transform: translateY(0); } /* Consultant Button Styles */ .consultant-btn { background: linear-gradient(135deg, var(--primary), var(--primary-dark)); color: white; border: none; padding: 12px 24px; border-radius: 10px; cursor: pointer; font-weight: 600; font-family: inherit; transition: all 0.3s ease; display: flex; align-items: center; gap: 8px; box-shadow: 0 4px 12px rgba(37, 99, 235, 0.3); } .consultant-btn:hover { transform: translateY(-2px); box-shadow: 0 8px 20px rgba(37, 99, 235, 0.4); } .consultant-btn:active { transform: translateY(0); } .action-buttons-row { display: flex; gap: 12px; flex-wrap: wrap; justify-content: center; } /* Success Message Modal */ .success-modal { display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0, 0, 0, 0.5); z-index: 9999; align-items: center; justify-content: center; } .success-modal.active { display: flex; } .success-content { background: white; border-radius: 16px; padding: 32px; max-width: 400px; text-align: center; box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3); animation: slideUp 0.3s ease-out; } @keyframes slideUp { from { opacity: 0; transform: translateY(30px); } to { opacity: 1; transform: translateY(0); } } .success-icon { font-size: 3rem; color: var(--success); margin-bottom: 16px; } .success-content h3 { color: var(--gray-800); margin-bottom: 12px; font-size: 1.5rem; } .success-content p { color: var(--gray-600); margin-bottom: 24px; line-height: 1.6; } .success-close-btn { background: var(--primary); color: white; border: none; padding: 12px 32px; border-radius: 8px; cursor: pointer; font-weight: 600; font-family: inherit; transition: all 0.3s ease; } .success-close-btn:hover { background: var(--primary-dark); transform: translateY(-2px); } .result-container { background: white; border-radius: 16px; padding: 24px; margin: 16px 0; box-shadow: 0 4px 16px rgba(0,0,0,0.1); border: 1px solid var(--gray-200); animation: resultSlide 0.6s cubic-bezier(0.4, 0, 0.2, 1); } @keyframes resultSlide { from { opacity: 0; transform: translateY(30px); } to { opacity: 1; transform: translateY(0); } } .result-header { display: flex; align-items: center; margin-bottom: 20px; padding-bottom: 16px; border-bottom: 2px solid var(--gray-100); } .result-icon { width: 40px; height: 40px; background: linear-gradient(135deg, var(--success), #059669); border-radius: 10px; display: flex; align-items: center; justify-content: center; color: white; margin-right: 16px; font-size: 20px; } .result-title { color: var(--gray-800); font-size: 1.4rem; font-weight: 600; } .result-item { margin-bottom: 16px; padding: 12px 0; border-bottom: 1px solid var(--gray-100); display: flex; flex-direction: column; } .result-item:last-child { border-bottom: none; margin-bottom: 0; } .result-label { font-weight: 600; color: var(--gray-700); margin-bottom: 6px; font-size: 0.95rem; } .result-value { color: var(--gray-600); line-height: 1.6; } .risk-low { color: var(--success); font-weight: 600; } .risk-moderate { color: var(--warning); font-weight: 600; } .risk-high { color: var(--danger); font-weight: 600; } .risk-critical { color: var(--danger); font-weight: 700; animation: riskBlink 1s infinite; } @keyframes riskBlink { 0%, 50% { opacity: 1; } 51%, 100% { opacity: 0.7; } } .input-area { display: flex; padding: 20px 24px; background: white; border-top: 1px solid var(--gray-200); gap: 12px; } #user-input { flex: 1; padding: 14px 18px; border: 2px solid var(--gray-200); border-radius: 12px; outline: none; font-size: 16px; font-family: inherit; transition: all 0.3s ease; background: var(--gray-50); } #user-input:focus { border-color: var(--primary); background: white; box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1); } #user-input::placeholder { color: var(--gray-400); } #send-btn { background: linear-gradient(135deg, var(--primary), var(--primary-light)); color: white; border: none; border-radius: 12px; padding: 14px 24px; cursor: pointer; font-weight: 600; font-family: inherit; transition: all 0.3s ease; display: flex; align-items: center; gap: 8px; min-width: 100px; justify-content: center; } #send-btn:hover:not(:disabled) { transform: translateY(-1px); box-shadow: 0 8px 16px rgba(37, 99, 235, 0.3); } #send-btn:disabled { background: var(--gray-300); cursor: not-allowed; transform: none; box-shadow: none; } .action-buttons { display: flex; gap: 12px; margin-top: 20px; justify-content: center; flex-wrap: wrap; } .btn { padding: 12px 24px; border-radius: 10px; font-weight: 600; cursor: pointer; transition: all 0.3s ease; border: none; font-family: inherit; display: flex; align-items: center; gap: 8px; } .btn-primary { background: linear-gradient(135deg, var(--primary), var(--primary-light)); color: white; } .btn-primary:hover { transform: translateY(-1px); box-shadow: 0 8px 16px rgba(37, 99, 235, 0.3); } .btn-secondary { background: var(--gray-100); color: var(--gray-700); border: 2px solid var(--gray-200); } .btn-secondary:hover { background: var(--gray-200); border-color: var(--gray-300); } .error-message { background: linear-gradient(135deg, var(--danger), #dc2626); color: white; padding: 16px 20px; border-radius: 12px; margin: 16px 0; display: none; align-items: center; gap: 12px; animation: errorSlide 0.4s ease; } @keyframes errorSlide { from { opacity: 0; transform: translateY(-10px); } to { opacity: 1; transform: translateY(0); } } .hidden { display: none !important; } @media (max-width: 768px) { .container { padding: 15px; } h1 { font-size: 2rem; } .page-description { padding: 20px; margin-bottom: 20px; } .description-content h2 { font-size: 1.5rem; flex-direction: column; gap: 8px; } .description-content p { font-size: 1rem; } .features-grid { grid-template-columns: repeat(2, 1fr); gap: 15px; } .feature-item { font-size: 0.9rem; } .track-selector { grid-template-columns: 1fr; gap: 16px; } .track-card { padding: 20px; } .chat-container { height: 75vh; } .message { max-width: 90%; padding: 12px 16px; } .result-container { padding: 20px; } .input-area { padding: 16px; flex-direction: column; gap: 12px; } #send-btn { width: 100%; } .user-id-input { flex-direction: column; align-items: stretch; } #user-id-field { min-width: auto; } .diagnosis-btn { padding: 10px 20px; font-size: 0.95rem; } .consent-content { margin: 10px; } .consent-header { padding: 20px; } .consent-body { padding: 20px; } .consent-actions { flex-direction: column; padding: 15px 20px; } .consent-btn { width: 100%; justify-content: center; } } .chat-messages::-webkit-scrollbar { width: 6px; } .chat-messages::-webkit-scrollbar-track { background: var(--gray-100); } .chat-messages::-webkit-scrollbar-thumb { background: var(--gray-300); border-radius: 3px; } .chat-messages::-webkit-scrollbar-thumb:hover { background: var(--gray-400); } /* Summary and Booking Modal Styles */ .summary-modal { display: none; position: fixed; z-index: 10001; left: 0; top: 0; width: 100%; height: 100%; background-color: rgba(0,0,0,0.6); overflow-y: auto; animation: fadeIn 0.3s ease; } .summary-modal.active { display: flex; align-items: flex-start; justify-content: center; padding: 40px 20px; } .summary-modal-content { background-color: white; margin: auto; padding: 0; border-radius: 16px; width: 90%; max-width: 900px; box-shadow: 0 10px 40px rgba(0,0,0,0.3); animation: slideDown 0.3s ease; max-height: 90vh; overflow: hidden; display: flex; flex-direction: column; } .summary-modal-header { background: linear-gradient(135deg, var(--primary), var(--primary-dark)); color: white; padding: 24px 30px; border-radius: 16px 16px 0 0; display: flex; justify-content: space-between; align-items: center; } .summary-modal-header h2 { margin: 0; font-size: 1.5rem; display: flex; align-items: center; gap: 10px; } .summary-close { color: white; font-size: 32px; font-weight: bold; cursor: pointer; background: none; border: none; padding: 0; width: 32px; height: 32px; display: flex; align-items: center; justify-content: center; border-radius: 50%; transition: all 0.3s; } .summary-close:hover { background: rgba(255,255,255,0.2); transform: rotate(90deg); } .summary-modal-body { padding: 30px; overflow-y: auto; flex: 1; } .summary-section { margin-bottom: 25px; padding: 20px; background: var(--gray-50); border-radius: 12px; border-left: 4px solid var(--gray-300); } .summary-section.highlight { background: linear-gradient(135deg, #e0f2fe 0%, #dbeafe 100%); border-left-color: var(--primary); } .summary-section h3 { margin: 0 0 15px 0; color: var(--gray-800); font-size: 1.1rem; display: flex; align-items: center; gap: 8px; } .summary-section p { margin: 8px 0; color: var(--gray-700); line-height: 1.6; } .summary-section strong { color: var(--gray-900); } .risk-display { text-align: center; padding: 20px; } .risk-badge { display: inline-block; padding: 15px 40px; font-size: 1.5rem; font-weight: 700; border-radius: 12px; margin: 10px 0; text-transform: uppercase; letter-spacing: 1px; } .risk-low { background: linear-gradient(135deg, #d1fae5 0%, #a7f3d0 100%); color: #065f46; border: 2px solid #34d399; } .risk-moderate { background: linear-gradient(135deg, #fef3c7 0%, #fde68a 100%); color: #92400e; border: 2px solid #fbbf24; } .risk-high { background: linear-gradient(135deg, #fecaca 0%, #fca5a5 100%); color: #991b1b; border: 2px solid #ef4444; } .risk-critical { background: linear-gradient(135deg, #dc2626 0%, #991b1b 100%); color: white; border: 2px solid #7f1d1d; animation: pulse 2s infinite; } @keyframes pulse { 0%, 100% { transform: scale(1); } 50% { transform: scale(1.05); } } .summary-actions { padding: 20px 30px; background: var(--gray-50); border-top: 1px solid var(--gray-200); display: flex; justify-content: center; gap: 15px; } .btn-book-consultation { padding: 15px 40px; font-size: 1.1rem; background: linear-gradient(135deg, #10b981 0%, #059669 100%); color: white; border: none; border-radius: 10px; cursor: pointer; font-weight: 600; transition: all 0.3s ease; display: flex; align-items: center; gap: 10px; } .btn-book-consultation:hover { transform: translateY(-2px); box-shadow: 0 8px 20px rgba(16, 185, 129, 0.4); } .btn-summary { padding: 12px 30px; font-size: 1rem; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; border: none; border-radius: 10px; cursor: pointer; font-weight: 600; transition: all 0.3s ease; display: flex; align-items: center; gap: 8px; } .btn-summary:hover { transform: translateY(-2px); box-shadow: 0 8px 20px rgba(102, 126, 234, 0.4); } .booking-success { text-align: center; padding: 60px 40px; } .success-icon { font-size: 80px; margin-bottom: 20px; animation: bounceIn 0.6s ease; } @keyframes bounceIn { 0% { transform: scale(0); } 50% { transform: scale(1.2); } 100% { transform: scale(1); } } .booking-success h3 { color: var(--success); margin-bottom: 15px; font-size: 1.8rem; } .booking-success p { font-size: 1.1rem; color: var(--gray-600); line-height: 1.8; margin-bottom: 30px; } @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } @keyframes slideDown { from { transform: translateY(-50px); opacity: 0; } to { transform: translateY(0); opacity: 1; } } @media (max-width: 768px) { .summary-modal-content { width: 95%; margin: 20px auto; } .summary-modal-header { padding: 20px; } .summary-modal-body { padding: 20px; } .risk-badge { font-size: 1.2rem; padding: 12px 30px; } .btn-book-consultation { padding: 12px 30px; font-size: 1rem; } } /style>/head>body> !-- CONSENT MODAL --> div classconsent-modal idconsentModal> div classconsent-content> div classconsent-header> h2>i classfas fa-shield-alt>/i> Medical Information Consent/h2> p>Please review and accept the following terms before proceeding/p> /div> div classconsent-body> div classconsent-section> h3>i classfas fa-exclamation-triangle>/i> Important Disclaimer/h3> p>This AI health assistant is designed to provide general health information and guidance. It is strong>NOT/strong> a substitute for professional medical advice, diagnosis, or treatment. Always seek the advice of your physician or other qualified health provider with any questions you may have regarding a medical condition./p> /div> div classconsent-section> h3>i classfas fa-lock>/i> Privacy & Data Usage/h3> p>Your health information will be processed to provide personalized recommendations. We maintain strict confidentiality and security measures to protect your data. Your information will not be shared with third parties without your explicit consent./p> /div> div classconsent-section> h3>i classfas fa-heartbeat>/i> Emergency Situations/h3> p>If you are experiencing a medical emergency, please call emergency services immediately. Do not rely on this AI assistant for urgent medical situations requiring immediate attention./p> /div> div classconsent-checkbox required> input typecheckbox idconsent-understand /> label forconsent-understand>I understand that this AI assistant provides general health information and is not a replacement for professional medical advice/label> /div> div classconsent-checkbox required> input typecheckbox idconsent-emergency /> label forconsent-emergency>I acknowledge that in case of emergency, I should contact emergency services immediately instead of using this service/label> /div> div classconsent-checkbox required> input typecheckbox idconsent-privacy /> label forconsent-privacy>I agree to the privacy policy and understand how my health information will be used/label> /div> div classconsent-checkbox> input typecheckbox idconsent-communication /> label forconsent-communication>I agree to receive health-related communications and updates (optional)/label> /div> /div> div classconsent-actions> button classconsent-btn decline iddeclineBtn> i classfas fa-times>/i> Decline /button> button classconsent-btn accept idacceptBtn disabled> i classfas fa-check>/i> Accept & Continue /button> /div> /div> /div> div classcontainer> !-- DISCLAIMER BAR --> div classdisclaimer-bar> i classfas fa-exclamation-triangle>/i> strong>Medical Disclaimer:/strong> This AI assistant provides general information only and is not a substitute for professional medical advice. /div> header> h1>i classfas fa-robot>/i> AI Health Assistant/h1> p classsubtitle>Your Intelligent Healthcare Companion/p> /header> div classpage-description> div classdescription-content> h2>i classfas fa-heart-pulse>/i> Comprehensive Health Assessment Platform/h2> p>Our AI-powered health assistant provides personalized medical insights across four specialized tracks. Select the appropriate assessment category below to begin your consultation with our intelligent healthcare companion./p> div classfeatures-grid> div classfeature-item> i classfas fa-robot>/i> span>AI-Powered Analysis/span> /div> div classfeature-item> i classfas fa-shield-alt>/i> span>Secure & Confidential/span> /div> div classfeature-item> i classfas fa-clock>/i> span>24/7 Available/span> /div> div classfeature-item> i classfas fa-user-md>/i> span>Professional Grade/span> /div> /div> /div> /div> div classuser-id-section> h3>i classfas fa-user>/i> Patient Identification/h3> div classuser-id-input> input typetext iduser-id-field placeholderEnter Patient ID (e.g., test-user-1-2) valuetest-user-1-2> button classset-user-btn idset-user-btn> i classfas fa-check>/i> Verify Patient /button> /div> div classcurrent-user> i classfas fa-info-circle>/i> Current Patient: span idcurrent-user-id>test-user-1-2/span> span classuser-status valid iduser-status> i classfas fa-check-circle>/i> Valid /span> /div> /div> div classtrack-selector idtrack-selector> div classtrack-card data-tracktrack1> div classtrack-icon> i classfas fa-stethoscope>/i> /div> div classtrack-title>Primary Care/div> div classtrack-description>Get insights about your symptoms with personalized health recommendations and diagnostic guidance/div> /div> div classtrack-card data-tracktrack2> div classtrack-icon> i classfas fa-brain>/i> /div> div classtrack-title>Mental Wellness/div> div classtrack-description>Receive professional support for your mental health and emotional wellbeing journey/div> /div> div classtrack-card data-tracktrack3> div classtrack-icon> i classfas fa-heart-pulse>/i> /div> div classtrack-title>Weight Management/div> div classtrack-description>Personalized guidance for healthy weight loss, nutrition, and sustainable lifestyle changes/div> /div> div classtrack-card data-tracktrack4> div classtrack-icon> i classfas fa-user-doctor>/i> /div> div classtrack-title>Integrative Holistic Approach/div> div classtrack-description>A holistic approach addressing mind, body, and spirit for overall well-being./div> /div> /div> div classchat-container idchat-container> div classchat-header> div classchat-title idchat-title> i classfas fa-comments>/i> Health Assessment /div> button classback-btn idback-btn> i classfas fa-arrow-left>/i> Back to Menu /button> /div> div classchat-messages idchat-messages>/div> div classdiagnosis-button-container iddiagnosis-button-container> div classaction-buttons-row> button classdiagnosis-btn iddiagnosis-btn> i classfas fa-stethoscope>/i> Get Diagnosis Now /button> button classconsultant-btn idconsultant-btn> i classfas fa-user-md>/i> Talk to Consultant /button> /div> /div> div classtyping-indicator idtyping-indicator> span classtyping-text>AI Assistant is thinking/span> div classtyping-dots> div classdot>/div> div classdot>/div> div classdot>/div> /div> /div> div classinput-area> input typetext iduser-input placeholderShare whats on your mind... autocompleteoff maxlength500 > button idsend-btn> i classfas fa-paper-plane>/i> Send /button> /div> /div> div classerror-message iderror-message> i classfas fa-exclamation-triangle>/i> span iderror-text>/span> !-- Success Modal for Consultant Request --> div classsuccess-modal idsuccess-modal> div classsuccess-content> div classsuccess-icon> i classfas fa-check-circle>/i> /div> h3>Request Received!/h3> p>Thank you for your interest. Our consultant will contact you soon./p> button classsuccess-close-btn idsuccess-close-btn> Got it /button> /div> /div> /div> /div> script> const API_BASE_URL https://chatbot-marina.devcustomprojects.online; const trackSelector document.getElementById(track-selector); const chatContainer document.getElementById(chat-container); const chatMessages document.getElementById(chat-messages); const userInput document.getElementById(user-input); const sendBtn document.getElementById(send-btn); const backBtn document.getElementById(back-btn); const errorMessage document.getElementById(error-message); const errorText document.getElementById(error-text); const typingIndicator document.getElementById(typing-indicator); const chatTitle document.getElementById(chat-title); const diagnosisBtn document.getElementById(diagnosis-btn); const diagnosisBtnContainer document.getElementById(diagnosis-button-container); const consultantBtn document.getElementById(consultant-btn); const successModal document.getElementById(success-modal); const successCloseBtn document.getElementById(success-close-btn); const userIdField document.getElementById(user-id-field); const setUserBtn document.getElementById(set-user-btn); const currentUserSpan document.getElementById(current-user-id); const userStatus document.getElementById(user-status); // Consent modal elements const consentModal document.getElementById(consentModal); const acceptBtn document.getElementById(acceptBtn); const declineBtn document.getElementById(declineBtn); const consentUnderstand document.getElementById(consent-understand); const consentEmergency document.getElementById(consent-emergency); const consentPrivacy document.getElementById(consent-privacy); let currentTrack ; let sessionId ; let isWaitingForResponse false; let currentUserId test-user-1-2; let userValidated false; let consentGiven false; const trackConfig { track1: { title: Primary Care, icon: fas fa-stethoscope, color: #2563eb }, track2: { title: Mental Wellness, icon: fas fa-brain, color: #7c3aed }, track3: { title: Weight Management, icon: fas fa-heart-pulse, color: #10b981 }, track4: { title: Integrative Holistic Approach, icon: fas fa-user-doctor, color: #f59e0b } }; // Check consent status function checkConsent() { const consentStatus sessionStorage.getItem(healthAssistantConsent); if (consentStatus accepted) { consentGiven true; return true; } return false; } // Show consent modal function showConsentModal() { // Reset all checkboxes consentUnderstand.checked false; consentEmergency.checked false; consentPrivacy.checked false; document.getElementById(consent-communication).checked false; updateAcceptButton(); consentModal.classList.add(active); } // Hide consent modal function hideConsentModal() { consentModal.classList.remove(active); } // Check if all required consents are checked function updateAcceptButton() { const allRequired consentUnderstand.checked && consentEmergency.checked && consentPrivacy.checked; acceptBtn.disabled !allRequired; } // Handle consent acceptance acceptBtn.addEventListener(click, () > { sessionStorage.setItem(healthAssistantConsent, accepted); consentGiven true; hideConsentModal(); showError(Consent accepted. You may now proceed with assessments., success); }); // Handle consent decline declineBtn.addEventListener(click, () > { hideConsentModal(); showError(You must accept the terms to use this service.); consentGiven false; }); // Add event listeners to checkboxes consentUnderstand, consentEmergency, consentPrivacy.forEach(checkbox > { checkbox.addEventListener(change, updateAcceptButton); }); async function validateUser(userId) { if (!userId.trim()) { showError(Please enter a Patient ID); return false; } console.log(Validating user:, userId); console.log(API URL:, `${API_BASE_URL}/validate-user/${userId}`); setUserBtn.disabled true; setUserBtn.innerHTML i classfas fa-spinner fa-spin>/i> Validating...; try { const encodedUserId encodeURIComponent(userId); console.log(Encoded user ID:, encodedUserId); const url `${API_BASE_URL}/validate-user/${encodedUserId}`; console.log(Final URL:, url); const response await fetch(url); console.log(Response status:, response.status); const data await response.json(); console.log(Response data:, data); if (data.valid) { currentUserId userId; currentUserSpan.textContent userId; userStatus.className user-status valid; userStatus.innerHTML i classfas fa-check-circle>/i> Valid; userValidated true; document.querySelectorAll(.track-card).forEach(card > { card.classList.remove(disabled); }); showError(`Patient verified: ${userId}`, success); return true; } else { console.error(Validation failed:, data.message); userStatus.className user-status invalid; userStatus.innerHTML i classfas fa-times-circle>/i> Invalid; userValidated false; document.querySelectorAll(.track-card).forEach(card > { card.classList.add(disabled); }); showError(data.message || Patient ID not found); return false; } } catch (error) { console.error(Validation error:, error); console.error(Error details:, error.message, error.stack); userStatus.className user-status invalid; userStatus.innerHTML i classfas fa-times-circle>/i> Error; userValidated false; document.querySelectorAll(.track-card).forEach(card > { card.classList.add(disabled); }); if (error.message.includes(Failed to fetch) || error.message.includes(NetworkError)) { showError(Network connection failed. Please check if the server is running on http://127.0.0.1:8000); } else if (error.message.includes(Server error)) { showError(Server error occurred. Please try again later.); } else { showError(`Error validating Patient ID: ${error.message}. Please try again.`); } return false; } finally { setUserBtn.disabled false; setUserBtn.innerHTML i classfas fa-check>/i> Verify Patient; } } function initializeEventListeners() { trackSelector?.addEventListener(click, (e) > { const trackCard e.target.closest(.track-card); if (trackCard && !trackCard.classList.contains(disabled)) { if (!consentGiven) { showConsentModal(); return; } if (userValidated) { startAssessment(trackCard.dataset.track); } else { showError(Please verify a valid Patient ID first); } } }); setUserBtn?.addEventListener(click, async (e) > { e.preventDefault(); await validateUser(userIdField.value.trim()); }); userIdField?.addEventListener(keypress, async (e) > { if (e.key Enter) { e.preventDefault(); await validateUser(userIdField.value.trim()); } }); sendBtn?.addEventListener(click, (e) > { e.preventDefault(); e.stopPropagation(); sendMessage(); }); diagnosisBtn?.addEventListener(click, (e) > { e.preventDefault(); e.stopPropagation(); requestDiagnosis(); }); consultantBtn?.addEventListener(click, (e) > { e.preventDefault(); e.stopPropagation(); showConsultantMessage(); }); successCloseBtn?.addEventListener(click, (e) > { e.preventDefault(); successModal.classList.remove(active); }); userInput?.addEventListener(keypress, (e) > { if (e.key Enter && !isWaitingForResponse) { e.preventDefault(); sendMessage(); } }); backBtn?.addEventListener(click, (e) > { e.preventDefault(); e.stopPropagation(); resetConversation(); }); } function startAssessment(track) { if (!consentGiven) { showConsentModal(); return; } if (!userValidated) { showError(Please verify a valid Patient ID first); return; } currentTrack track; const config trackConfigtrack; chatTitle.innerHTML `i class${config.icon}>/i> ${config.title} - Patient: ${currentUserId}`; trackSelector.style.opacity 0; setTimeout(() > { trackSelector.style.display none; chatContainer.style.display flex; chatContainer.style.opacity 0; setTimeout(() > { chatContainer.style.opacity 1; }, 50); }, 300); chatMessages.innerHTML ; sessionId ; userInput.disabled false; sendBtn.disabled false; diagnosisBtnContainer.style.display none; hideError(); fetchQuestion(); setTimeout(() > { userInput?.focus(); }, 500); } async function fetchQuestion(answer null, forceDiagnosis false) { if (isWaitingForResponse) return; setLoadingState(true); const payload { answer: answer, user_id: currentUserId, force_diagnosis: forceDiagnosis }; if (sessionId) { payload.session_id sessionId; } try { const response await fetch(`${API_BASE_URL}/assess/${currentTrack}`, { method: POST, headers: { Content-Type: application/json, }, body: JSON.stringify(payload) }); if (!response.ok) { const errorData await response.json().catch(() > ({})); throw new Error(errorData.detail || `Server error: ${response.status}`); } const data await response.json(); if (data.session_id) { sessionId data.session_id; } // ✅ FIX: Check completion status FIRST if (data.completed && (data.diagnosis || data.summary)) { console.log(✅ Assessment completed - showing results); showResults(data); return; } if (data.urgent) { addUrgentMessage(data.question); } else if (data.question) { addBotMessage(data.question); if (data.show_diagnosis_button) { showDiagnosisButton(); } } else if (data.diagnosis || data.eligibility) { showResults(data); return; } else { throw new Error(Unexpected response format); } } catch (error) { console.error(Error:, error); showError(`Connection issue: ${error.message}. Please try again.`); addBotMessage(Im having some technical difficulties. Could you please try again?); } finally { setLoadingState(false); } } function sendMessage() { const message userInput.value.trim(); if (!message || isWaitingForResponse) return; if (message.length > 500) { showError(Please keep your message under 500 characters.); return; } addUserMessage(message); userInput.value ; fetchQuestion(message); } function requestDiagnosis() { if (isWaitingForResponse) return; diagnosisBtnContainer.style.display none; addBotMessage(Let me analyze everything youve shared and provide you with a comprehensive assessment...); fetchQuestion(null, true); } function showDiagnosisButton() { diagnosisBtnContainer.style.display flex; } function hideDiagnosisButton() { diagnosisBtnContainer.style.display none; } function addBotMessage(text) { const messageDiv document.createElement(div); messageDiv.className message bot-message; messageDiv.innerHTML formatMessage(text); chatMessages.appendChild(messageDiv); smoothScrollToBottom(); } function addUserMessage(text) { const messageDiv document.createElement(div); messageDiv.className message user-message; messageDiv.textContent text; chatMessages.appendChild(messageDiv); smoothScrollToBottom(); } function addUrgentMessage(text) { const messageDiv document.createElement(div); messageDiv.className message urgent-message; messageDiv.innerHTML `i classfas fa-exclamation-triangle stylemargin-right: 8px;>/i>${formatMessage(text)}`; chatMessages.appendChild(messageDiv); smoothScrollToBottom(); userInput.disabled true; sendBtn.disabled true; hideDiagnosisButton(); } function formatMessage(text) { // Handle non-string values if (typeof text ! string) { // If its an array, join with commas if (Array.isArray(text)) { if (text.length 0) return None; return text.join(, ); } // If its an object, stringify it if (typeof text object && text ! null) { return JSON.stringify(text); } // For other types, convert to string return String(text); } // Format string with markdown-like syntax return text .replace(/\*\*(.*?)\*\*/g, strong>$1/strong>) .replace(/\*(.*?)\*/g, em>$1/em>) .replace(/\n/g, br>); } function showResults(data) { const resultDiv document.createElement(div); resultDiv.className result-container; let resultsHTML ` div classresult-header> div classresult-icon> i classfas fa-clipboard-check>/i> /div> div classresult-title>Assessment Complete/div> /div> `; const fieldMappings { diagnosis: Assessment, eligibility: Eligibility Status, risk_score: Risk Level, reasoning: Analysis, lab_recommendations: Recommended Tests, recommended_consultation: Next Steps, supportive_message: Support Note, encouragement: Encouragement, preventive_care: Preventive Measures, follow_up_plan: Follow-up Plan, coping_strategies: Coping Strategies, next_steps: Next Steps, red_flags: Warning Signs, integrative_therapies: Integrative Therapies, conventional_treatments: Conventional Treatments, lifestyle_modifications: Lifestyle Changes }; for (const key, value of Object.entries(data)) { if (disclaimer, session_id, urgent, patient_info, integrative_approach_used.includes(key)) continue; const label fieldMappingskey || key.replace(/_/g, ).replace(/\b\w/g, c > c.toUpperCase()); resultsHTML + `div classresult-item>`; resultsHTML + `div classresult-label>${label}/div>`; if (Array.isArray(value)) { resultsHTML + `div classresult-value>${value.join(, ) || None specified}/div>`; } else { let valueClass ; if (key risk_score) { if (value.toLowerCase().includes(critical)) { valueClass risk-critical; } else if (value.toLowerCase().includes(high)) { valueClass risk-high; } else if (value.toLowerCase().includes(moderate)) { valueClass risk-moderate; } else if (value.toLowerCase().includes(low)) { valueClass risk-low; } } resultsHTML + `div classresult-value ${valueClass}>${formatMessage(value)}/div>`; } resultsHTML + `/div>`; } if (data.disclaimer) { resultsHTML + ` div classresult-item styleborder-top: 2px solid var(--gray-200); margin-top: 16px; padding-top: 16px;> div classresult-value stylefont-style: italic; color: var(--gray-500);> i classfas fa-info-circle stylemargin-right: 6px;>/i> ${data.disclaimer} /div> /div> `; } resultsHTML + ` div classaction-buttons> button classbtn btn-summary onclickopenSummaryModal()> i classfas fa-file-medical>/i> Generate Summary /button> button classbtn btn-primary onclickresetConversation()> i classfas fa-redo>/i> New Assessment /button> /div> `; resultDiv.innerHTML resultsHTML; chatMessages.appendChild(resultDiv); smoothScrollToBottom(); userInput.disabled true; sendBtn.disabled true; hideDiagnosisButton(); } function resetConversation() { isWaitingForResponse false; hideTypingIndicator(); chatContainer.style.opacity 0; setTimeout(() > { chatContainer.style.display none; trackSelector.style.display grid; trackSelector.style.opacity 0; setTimeout(() > { trackSelector.style.opacity 1; }, 50); }, 300); chatMessages.innerHTML ; currentTrack ; sessionId ; if (userInput) { userInput.disabled false; userInput.value ; } if (sendBtn) { sendBtn.disabled false; } hideDiagnosisButton(); hideError(); } function showConsultantMessage() { // Show success modal if (successModal) { successModal.classList.add(active); } } function setLoadingState(loading) { isWaitingForResponse loading; if (userInput) userInput.disabled loading; if (sendBtn) sendBtn.disabled loading; if (diagnosisBtn) diagnosisBtn.disabled loading; if (consultantBtn) consultantBtn.disabled loading; if (loading) { showTypingIndicator(); if (sendBtn) { sendBtn.innerHTML i classfas fa-spinner fa-spin>/i> Sending; } } else { hideTypingIndicator(); if (sendBtn) { sendBtn.innerHTML i classfas fa-paper-plane>/i> Send; } setTimeout(() > { if (userInput && !userInput.disabled) { userInput.focus(); } }, 100); } } function showTypingIndicator() { typingIndicator.style.display flex; smoothScrollToBottom(); } function hideTypingIndicator() { typingIndicator.style.display none; } function showError(message, type error) { errorText.textContent message; if (type success) { errorMessage.style.background linear-gradient(135deg, var(--success), #059669); errorMessage.querySelector(i).className fas fa-check-circle; } else { errorMessage.style.background linear-gradient(135deg, var(--danger), #dc2626); errorMessage.querySelector(i).className fas fa-exclamation-triangle; } errorMessage.style.display flex; setTimeout(hideError, 5000); } function hideError() { errorMessage.style.display none; } function smoothScrollToBottom() { setTimeout(() > { chatMessages.scrollTo({ top: chatMessages.scrollHeight, behavior: smooth }); }, 100); } document.addEventListener(DOMContentLoaded, async () > { initializeEventListeners(); if (currentUserSpan) { currentUserSpan.textContent currentUserId; } // Check if consent was previously given if (!checkConsent()) { showConsentModal(); } await validateUser(currentUserId); }); /script> !-- Summary Modal --> div idsummaryModal classsummary-modal> div classsummary-modal-content> div classsummary-modal-header> h2>i classfas fa-file-medical>/i> Consultation Summary/h2> button classsummary-close onclickcloseSummaryModal()>×/button> /div> div classsummary-modal-body idsummary-content> !-- Content will be populated by JavaScript --> /div> div classsummary-actions> button classbtn-book-consultation onclickbookConsultation()> i classfas fa-calendar-check>/i> Book Consultation /button> /div> /div> /div> !-- Booking Confirmation Modal --> div idbookingModal classsummary-modal> div classsummary-modal-content stylemax-width: 600px;> div classsummary-modal-header> h2>i classfas fa-check-circle>/i> Booking Confirmation/h2> button classsummary-close onclickcloseBookingModal()>×/button> /div> div classbooking-success> div classsuccess-icon>✅/div> h3>Booking Confirmed!/h3> p>Thank you! A specialist will contact you within 24-48 hours based on your consultation summary./p> button classbtn btn-primary onclickcloseBookingModal()> i classfas fa-times>/i> Close /button> /div> /div> /div> script> // Global variable to store current diagnosis data let currentDiagnosisData null; // Open Summary Modal async function openSummaryModal() { if (!sessionId) { alert(No active session found); return; } try { const response await fetch(`${API_BASE_URL}/api/generate-summary`, { method: POST, headers: { Content-Type: application/json }, body: JSON.stringify({ session_id: sessionId }) }); if (!response.ok) { throw new Error(Failed to generate summary); } const data await response.json(); if (data.success) { displaySummary(data.summary, data.diagnosis); document.getElementById(summaryModal).classList.add(active); document.body.style.overflow hidden; } else { throw new Error(Summary generation failed); } } catch (error) { console.error(Error generating summary:, error); alert(Failed to generate summary. Please try again.); } } // Close Summary Modal function closeSummaryModal() { document.getElementById(summaryModal).classList.remove(active); document.body.style.overflow auto; } // Display Summary function displaySummary(summary, diagnosis) { const contentDiv document.getElementById(summary-content); let html ` !-- Bot Info --> div classsummary-section> h3>i classfas fa-robot>/i> ${summary.bot_name || AI Assistant}/h3> p>strong>Date:/strong> ${summary.consultation_date || N/A}/p> p>strong>Time:/strong> ${summary.consultation_time || N/A}/p> /div> !-- Patient Info --> div classsummary-section> h3>i classfas fa-user>/i> Patient Information/h3> p>strong>Name:/strong> ${summary.patient_info?.name || N/A}/p> p>strong>Age:/strong> ${summary.patient_info?.age || N/A}/p> p>strong>Gender:/strong> ${summary.patient_info?.gender || N/A}/p> /div> !-- Responses --> div classsummary-section> h3>i classfas fa-comments>/i> Your Responses/h3> `; if (summary.collected_responses && Object.keys(summary.collected_responses).length > 0) { for (const key, value of Object.entries(summary.collected_responses)) { html + `p>strong>${key}:/strong> ${value}/p>`; } } else { html + p>No responses recorded/p>; } html + /div>; // Health Analysis (PROMINENT) html + ` div classsummary-section highlight> h3>i classfas fa-heartbeat>/i> Health Analysis/h3> p>${summary.analysis || diagnosis?.analysis_summary || No analysis available}/p> `; if (diagnosis?.detailed_reasoning) { html + `p>strong>Details:/strong> ${diagnosis.detailed_reasoning}/p>`; } html + /div>; // Risk Score (PROMINENT) const riskLevel summary.risk_score || diagnosis?.risk_score || Unknown; const riskClass getRiskClass(riskLevel); html + ` div classsummary-section highlight> h3>i classfas fa-exclamation-triangle>/i> Risk Assessment/h3> div classrisk-display> div classrisk-badge ${riskClass}>${riskLevel}/div> `; if (diagnosis?.risk_explanation) { html + `p>${diagnosis.risk_explanation}/p>`; } html + /div>/div>; // Recommendations html + ` div classsummary-section> h3>i classfas fa-stethoscope>/i> Recommendations/h3> p>strong>Specialist:/strong> ${summary.recommendations || diagnosis?.recommended_consultation || General consultation}/p> `; // Immediate Actions if (diagnosis?.immediate_actions && diagnosis.immediate_actions.length > 0) { html + p>strong>Immediate Actions:/strong>/p>ul>; diagnosis.immediate_actions.forEach(action > { html + `li>${action}/li>`; }); html + /ul>; } // Self-care Tips if (diagnosis?.self_care_tips && diagnosis.self_care_tips.length > 0) { html + p>strong>Self-Care Tips:/strong>/p>ul>; diagnosis.self_care_tips.forEach(tip > { html + `li>${tip}/li>`; }); html + /ul>; } html + /div>; contentDiv.innerHTML html; } // Get risk class for styling function getRiskClass(risk) { const riskLower String(risk).toLowerCase(); if (riskLower.includes(critical)) return risk-critical; if (riskLower.includes(high)) return risk-high; if (riskLower.includes(moderate)) return risk-moderate; return risk-low; } // Book Consultation async function bookConsultation() { if (!sessionId) { alert(No active session found); return; } try { const response await fetch(`${API_BASE_URL}/api/book-specialist`, { method: POST, headers: { Content-Type: application/json }, body: JSON.stringify({ session_id: sessionId }) }); if (!response.ok) { throw new Error(Failed to book consultation); } const data await response.json(); if (data.success) { // Close summary modal closeSummaryModal(); // Show booking confirmation setTimeout(() > { document.getElementById(bookingModal).classList.add(active); document.body.style.overflow hidden; }, 300); } else { throw new Error(Booking failed); } } catch (error) { console.error(Error booking consultation:, error); alert(Failed to book consultation. Please try again.); } } // Close Booking Modal function closeBookingModal() { document.getElementById(bookingModal).classList.remove(active); document.body.style.overflow auto; } // Close modal when clicking outside window.onclick function(event) { const summaryModal document.getElementById(summaryModal); const bookingModal document.getElementById(bookingModal); if (event.target summaryModal) { closeSummaryModal(); } if (event.target bookingModal) { closeBookingModal(); } } /script>/body>/html>
View on OTX
|
View on ThreatMiner
Please enable JavaScript to view the
comments powered by Disqus.
Data with thanks to
AlienVault OTX
,
VirusTotal
,
Malwr
and
others
. [
Sitemap
]