tulip / index.html
sevangelen's picture
Patient images must be and will always be a full body nude head to toe image.. - Follow Up Deployment
9f6f1d6 verified
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Tulip Colony: Gynecological Chronicles</title>
<script src="https://cdn.tailwindcss.com"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
<style>
.gradient-bg {
background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
}
.patient-card {
transition: all 0.3s ease;
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
}
.patient-card:hover {
transform: translateY(-5px);
box-shadow: 0 10px 20px rgba(0, 0, 0, 0.2);
}
.vignette {
position: relative;
}
.vignette::after {
content: '';
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
box-shadow: inset 0 0 150px rgba(0, 0, 0, 0.8);
pointer-events: none;
}
.medical-record {
background-color: #f8f9fa;
border-left: 4px solid #4f46e5;
}
.fade-in {
animation: fadeIn 0.5s ease-in;
}
@keyframes fadeIn {
from { opacity: 0; }
to { opacity: 1; }
}
</style>
</head>
<body class="gradient-bg min-h-screen">
<div class="container mx-auto px-4 py-8">
<!-- Header Section -->
<header class="vignette bg-gray-900 text-white rounded-lg p-6 mb-8 relative overflow-hidden">
<div class="absolute inset-0 bg-[url('https://images.unsplash.com/photo-1534796636912-3b95b3ab5986?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=1471&q=80')] bg-cover bg-center opacity-30"></div>
<div class="relative z-10 flex flex-col md:flex-row justify-between items-center">
<div>
<h1 class="text-3xl md:text-4xl font-bold mb-2">TULIP COLONY</h1>
<p class="text-indigo-200">Medical Chronicles of Dr. Tito</p>
</div>
<div class="mt-4 md:mt-0 flex items-center space-x-4">
<div class="text-right">
<p class="text-sm">Ship Status: <span class="text-red-400 font-bold">RED ALERT</span></p>
<p class="text-sm">Current Location: <span class="text-indigo-300">Planet Tulip Orbit</span></p>
</div>
<div class="bg-indigo-600 rounded-full w-12 h-12 flex items-center justify-center">
<i class="fas fa-user-md text-xl"></i>
</div>
</div>
</div>
</header>
<!-- Main Game Area -->
<div class="grid grid-cols-1 lg:grid-cols-3 gap-6">
<!-- Patient Info Column -->
<div class="lg:col-span-1">
<div class="bg-white rounded-lg shadow-lg p-6 patient-card">
<div class="flex justify-between items-center mb-4">
<h2 class="text-xl font-bold text-gray-800">Current Patient</h2>
<span class="bg-indigo-100 text-indigo-800 text-xs font-semibold px-2.5 py-0.5 rounded">New</span>
</div>
<div id="patientImageContainer" class="mb-4 relative">
<div class="w-full h-64 bg-gray-200 rounded-lg flex items-center justify-center overflow-hidden">
<img id="patientImage" src="https://images.unsplash.com/photo-1529626455594-4ff0802cfb7e?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=687&q=80" alt="Patient" class="w-full h-full object-cover">
</div>
<div class="absolute bottom-2 left-2 bg-black bg-opacity-50 text-white px-2 py-1 rounded text-sm">
<i class="fas fa-heart mr-1 text-red-400"></i> <span id="patientConsent">Consent Confirmed</span>
</div>
</div>
<div id="patientDetails">
<div class="grid grid-cols-2 gap-4 mb-4">
<div>
<p class="text-gray-500 text-sm">Name</p>
<p id="patientName" class="font-semibold">Emily Chen</p>
</div>
<div>
<p class="text-gray-500 text-sm">Age</p>
<p id="patientAge" class="font-semibold">17</p>
</div>
<div>
<p class="text-gray-500 text-sm">Occupation</p>
<p id="patientOccupation" class="font-semibold">Agricultural Worker</p>
</div>
<div>
<p class="text-gray-500 text-sm">Nationality</p>
<p id="patientNationality" class="font-semibold">China</p>
</div>
</div>
<div class="mb-4">
<div class="flex justify-between items-center mb-2">
<p class="text-gray-500 text-sm">Body Dimensions</p>
<button id="showAllDetails" class="text-xs text-indigo-600 hover:text-indigo-800">Show All</button>
</div>
<div class="grid grid-cols-2 gap-4">
<div>
<p class="text-gray-500 text-xs">Height</p>
<p id="patientHeight" class="font-semibold text-sm">5'4"</p>
</div>
<div>
<p class="text-gray-500 text-xs">Weight</p>
<p id="patientWeight" class="font-semibold text-sm">121 lbs</p>
</div>
<div>
<p class="text-gray-500 text-xs">Bust</p>
<p id="patientBust" class="font-semibold text-sm">36C</p>
</div>
<div>
<p class="text-gray-500 text-xs">Cycle</p>
<p id="patientCycle" class="font-semibold text-sm">12-18</p>
</div>
</div>
</div>
<div id="fullDetails" class="hidden">
<div class="border-t border-gray-200 pt-4 mt-4">
<h3 class="text-sm font-semibold text-gray-700 mb-2">Gynecological Details</h3>
<div class="space-y-2">
<div class="grid grid-cols-2 gap-2">
<p class="text-gray-500 text-xs">Vaginal Lip Color</p>
<p id="vaginalLipColor" class="font-semibold text-xs">Light pink</p>
</div>
<div class="grid grid-cols-2 gap-2">
<p class="text-gray-500 text-xs">Clitoral Length</p>
<p id="clitoralLength" class="font-semibold text-xs">0.3 inches</p>
</div>
<div class="grid grid-cols-2 gap-2">
<p class="text-gray-500 text-xs">Vaginal Canal</p>
<p id="vaginalCanal" class="font-semibold text-xs">3.1 inches</p>
</div>
<div class="grid grid-cols-2 gap-2">
<p class="text-gray-500 text-xs">Areola Diam.</p>
<p id="areolaDiam" class="font-semibold text-xs">1.2 inches</p>
</div>
</div>
</div>
<div class="border-t border-gray-200 pt-4 mt-4">
<h3 class="text-sm font-semibold text-gray-700 mb-2">Psychological Profile</h3>
<p id="psychologicalProfile" class="text-xs text-gray-700">Somewhat introverted but opens up during counseling sessions. Reports anxiety about colony's future. Responds well to reassuring touch during procedures.</p>
</div>
</div>
<div class="border-t border-gray-200 pt-4 mt-4">
<h3 class="text-sm font-semibold text-gray-700 mb-2">Medical History</h3>
<p id="medicalHistory" class="text-xs text-gray-700">No major illnesses. Mild vaginal yeast infection treated successfully last year. Regular menstrual cycles with moderate cramping.</p>
</div>
</div>
<div class="mt-6 space-y-3">
<button id="generateNewPatient" class="w-full bg-indigo-600 hover:bg-indigo-700 text-white font-bold py-2 px-4 rounded-lg transition duration-200 flex items-center justify-center">
<i class="fas fa-user-plus mr-2"></i> Generate New Patient
</button>
<button id="captureGenitalImage" class="w-full bg-pink-600 hover:bg-pink-700 text-white font-bold py-2 px-4 rounded-lg transition duration-200 flex items-center justify-center">
<i class="fas fa-camera mr-2"></i> Capture Genital Image
</button>
</div>
</div>
</div>
<!-- Procedure Column -->
<div class="lg:col-span-2">
<div class="bg-white rounded-lg shadow-lg p-6 mb-6">
<div class="flex justify-between items-center mb-4">
<h2 class="text-xl font-bold text-gray-800">Medical Procedure</h2>
<div class="flex space-x-2">
<span class="bg-green-100 text-green-800 text-xs font-semibold px-2.5 py-0.5 rounded">In Progress</span>
<span class="bg-blue-100 text-blue-800 text-xs font-semibold px-2.5 py-0.5 rounded">GYN-78</span>
</div>
</div>
<div class="mb-6">
<h3 class="text-lg font-semibold text-gray-700 mb-2">Select Procedure</h3>
<div class="grid grid-cols-2 md:grid-cols-4 gap-3">
<button class="procedure-btn bg-purple-100 hover:bg-purple-200 text-purple-800 py-2 px-3 rounded-lg text-sm transition" data-procedure="exam">
<i class="fas fa-procedures mr-1"></i> Full Exam
</button>
<button class="procedure-btn bg-blue-100 hover:bg-blue-200 text-blue-800 py-2 px-3 rounded-lg text-sm transition" data-procedure="pap">
<i class="fas fa-microscope mr-1"></i> Pap Smear
</button>
<button class="procedure-btn bg-green-100 hover:bg-green-200 text-green-800 py-2 px-3 rounded-lg text-sm transition" data-procedure="waxing">
<i class="fas fa-spa mr-1"></i> Vaginal Waxing
</button>
<button class="procedure-btn bg-yellow-100 hover:bg-yellow-200 text-yellow-800 py-2 px-3 rounded-lg text-sm transition" data-procedure="cleaning">
<i class="fas fa-pump-soap mr-1"></i> Vaginal Cleaning
</button>
<button class="procedure-btn bg-red-100 hover:bg-red-200 text-red-800 py-2 px-3 rounded-lg text-sm transition" data-procedure="mammogram">
<i class="fas fa-heartbeat mr-1"></i> Mammogram
</button>
<button class="procedure-btn bg-indigo-100 hover:bg-indigo-200 text-indigo-800 py-2 px-3 rounded-lg text-sm transition" data-procedure="douche">
<i class="fas fa-shower mr-1"></i> Medical Douching
</button>
<button class="procedure-btn bg-pink-100 hover:bg-pink-200 text-pink-800 py-2 px-3 rounded-lg text-sm transition" data-procedure="enema">
<i class="fas fa-toilet mr-1"></i> Enema
</button>
<button class="procedure-btn bg-gray-100 hover:bg-gray-200 text-gray-800 py-2 px-3 rounded-lg text-sm transition" data-procedure="counsel">
<i class="fas fa-comments mr-1"></i> Counseling
</button>
</div>
</div>
<div id="procedureLog" class="medical-record rounded-lg p-4 h-64 overflow-y-auto mb-4">
<div class="text-gray-500 text-center py-8">
<i class="fas fa-clipboard-list text-3xl mb-2 text-gray-300"></i>
<p>Select a procedure to begin documentation</p>
</div>
</div>
<div class="flex justify-between">
<button id="saveRecord" class="bg-indigo-600 hover:bg-indigo-700 text-white font-bold py-2 px-4 rounded-lg transition duration-200 disabled:bg-indigo-300" disabled>
<i class="fas fa-save mr-1"></i> Save Record
</button>
<button id="completeSession" class="bg-green-600 hover:bg-green-700 text-white font-bold py-2 px-4 rounded-lg transition duration-200 hidden">
<i class="fas fa-check mr-1"></i> Complete Session
</button>
</div>
</div>
<!-- Statistics Section -->
<div class="bg-white rounded-lg shadow-lg p-6">
<h2 class="text-xl font-bold text-gray-800 mb-4">Colony Statistics</h2>
<div class="grid grid-cols-2 md:grid-cols-4 gap-4">
<div class="bg-indigo-50 p-3 rounded-lg">
<p class="text-xs text-indigo-600 font-semibold mb-1">Total Population</p>
<p class="text-2xl font-bold text-indigo-800">301</p>
</div>
<div class="bg-pink-50 p-3 rounded-lg">
<p class="text-xs text-pink-600 font-semibold mb-1">Female</p>
<p class="text-2xl font-bold text-pink-800">300</p>
</div>
<div class="bg-blue-50 p-3 rounded-lg">
<p class="text-xs text-blue-600 font-semibold mb-1">Patients Seen</p>
<p class="text-2xl font-bold text-blue-800" id="patientsSeen">78</p>
</div>
<div class="bg-green-50 p-3 rounded-lg">
<p class="text-xs text-green-600 font-semibold mb-1">Successful Treatments</p>
<p class="text-2xl font-bold text-green-800" id="successfulTreatments">75</p>
</div>
<div class="bg-purple-50 p-3 rounded-lg">
<p class="text-xs text-purple-600 font-semibold mb-1">Active Marriages</p>
<p class="text-2xl font-bold text-purple-800">12</p>
</div>
<div class="bg-yellow-50 p-3 rounded-lg">
<p class="text-xs text-yellow-600 font-semibold mb-1">Single Women</p>
<p class="text-2xl font-bold text-yellow-800">253</p>
</div>
<div class="bg-red-50 p-3 rounded-lg">
<p class="text-xs text-red-600 font-semibold mb-1">Ship Condition</p>
<p class="text-2xl font-bold text-red-800">Critical</p>
</div>
<div class="bg-teal-50 p-3 rounded-lg">
<p class="text-xs text-teal-600 font-semibold mb-1">Days in Orbit</p>
<p class="text-2xl font-bold text-teal-800">578</p>
</div>
</div>
</div>
</div>
</div>
</div>
<script>
// Patient Database
const nationalityDistribution = [
{country: "United States", count: 50},
{country: "China", count: 50},
{country: "Russia", count: 50},
{country: "India", count: 50},
{country: "Brazil", count: 50},
{country: "Other", count: 50}
];
const ageDistribution = [
{age: 18, count: 50},
{age: 17, count: 75},
{age: 16, count: 175}
];
const occupations = [
"Medical Professional", "Engineer", "Agricultural Worker",
"Scientist", "Maintenance Personnel", "Administrative Staff",
"Teacher/Educator", "Other"
];
const firstNames = [
"Emily", "Sophia", "Emma", "Olivia", "Ava", "Isabella", "Mia", "Charlotte",
"Amelia", "Harper", "Evelyn", "Abigail", "Emily", "Elizabeth", "Sofia",
"Avery", "Ella", "Scarlett", "Grace", "Chloe", "Victoria", "Riley", "Aria",
"Lily", "Zoey", "Hannah", "Lillian", "Addison", "Layla", "Natalie", "Camila",
"Leah", "Savannah", "Audrey", "Brooklyn", "Claire", "Skylar", "Lucy", "Paisley",
"Caroline", "Violet", "Madelyn", "Naomi", "Ruby", "Stella", "Sadie", "Hazel",
"Aurora", "Ellie", "Kinsley", "Aaliyah", "Nora", "Scarlett", "Hanna", "Sarah"
];
const lastNames = [
"Smith", "Johnson", "Williams", "Brown", "Jones", "Garcia", "Miller", "Davis",
"Rodriguez", "Martinez", "Hernandez", "Lopez", "Gonzalez", "Wilson", "Anderson",
"Thomas", "Taylor", "Moore", "Jackson", "Martin", "Lee", "Perez", "Thompson",
"White", "Harris", "Sanchez", "Clark", "Ramirez", "Lewis", "Robinson", "Walker",
"Young", "Allen", "King", "Wright", "Scott", "Torres", "Nguyen", "Hill", "Flores",
"Green", "Adams", "Nelson", "Baker", "Hall", "Rivera", "Campbell", "Mitchell",
"Carter", "Roberts", "Chen", "Li", "Wang", "Kim", "Tran", "Patel", "Singh", "Gupta"
];
const nationalitySurnames = {
"United States": ["Smith", "Johnson", "Williams", "Brown", "Jones", "Miller", "Wilson", "Taylor"],
"China": ["Wang", "Li", "Zhang", "Liu", "Chen", "Yang", "Huang", "Zhao"],
"Russia": ["Ivanova", "Smirnova", "Kuznetsova", "Popova", "Sokolova", "Lebedeva", "Kozlova", "Novikova"],
"India": ["Patel", "Sharma", "Singh", "Kumar", "Gupta", "Joshi", "Banerjee", "Choudhury"],
"Brazil": ["Silva", "Santos", "Oliveira", "Souza", "Rodrigues", "Ferreira", "Alves", "Pereira"],
"Other": ["Garcia", "Martinez", "Hernandez", "Lopez", "Gonzalez", "Rodriguez", "Sanchez", "Ramirez"]
};
const personalityTraits = [
"Introverted", "Extroverted", "Ambitious", "Reserved", "Creative", "Practical",
"Optimistic", "Pessimistic", "Trustworthy", "Skeptical", "Loyal", "Independent",
"Organized", "Spontaneous", "Patient", "Impulsive", "Empathetic", "Logical",
"Adventurous", "Cautious", "Confident", "Insecure", "Cheerful", "Serious"
];
const psychologicalProfiles = [
"Shows signs of social anxiety but responds well to gentle reassurance. Benefits from focused breathing exercises during procedures.",
"Highly extroverted personality masking underlying depression. Responds positively to detailed explanation of procedures.",
"Exhibits mild obsessive-compulsive tendencies regarding cleanliness. Needs reassurance about sterility protocols.",
"Displays typical adjustment disorder with mixed anxiety and depressive mood secondary to cryo-sleep transition.",
"Demonstrates above-average resilience and coping skills. Minimal psychological intervention needed.",
"Manifesting situational anxiety related to fertility concerns. Benefits from Dr. Tito's specialized counseling techniques.",
"Shows signs of mild PTSD from cryo-sleep awakening. Requires slower-paced procedures with frequent check-ins.",
"Exhibits strong leadership tendencies with underlying stress from colony responsibilities. Benefits from relaxation techniques."
];
const medicalHistories = [
"No significant medical history. Previous mild vaginal yeast infection resolved with topical treatment.",
"History of irregular menstrual cycles now stabilized with colony nutritional supplements.",
"Treated for mild iron deficiency anemia upon awakening from cryo-sleep. Shows good response to iron supplements.",
"Past medical history of childhood asthma, no recent symptoms. Mild exercise-induced bronchospasm noted.",
"Previous diagnosis of polycystic ovarian syndrome. Currently well-managed with colony dietary protocol.",
"No known allergies. History of vasovagal syncope during blood draws now controlled with pre-procedure hydration.",
"History of migraines associated with menstrual cycle, decreased frequency with colony-approved prophylaxis.",
"Reports previous sexual trauma before cryo-sleep. Fully consented to all procedures after extensive counseling."
];
// Procedure logs
const procedureDetails = {
exam: [
"Patient placed in dorsal lithotomy position with legs flexed and abducted.",
"External genitalia inspected visually noting symmetry, coloration, and any abnormalities.",
"Labia majora and minora gently separated using gloved fingers to expose vaginal introitus.",
"Bartholin's glands palpated bilaterally with index finger inside posterior vagina and thumb externally.",
"Speculum warmed and lubricated before insertion to minimize discomfort.",
"Speculum slowly inserted at 45-degree angle with downward pressure on posterior vaginal wall.",
"Cervix visualized with careful documentation of position, color, surface characteristics.",
"Bimanual examination performed with two fingers in vagina and other hand on lower abdomen.",
"Rectovaginal examination conducted to assess rectovaginal septum and posterior pelvic structures."
],
pap: [
"Patient positioned in lithotomy with feet securely placed in stirrups.",
"Speculum carefully inserted and opened to visualize cervix adequately.",
"Brush rotated gently at cervical os to collect endo and ectocervical cells.",
"Transformation zone sampled thoroughly with rotating motion technique.",
"Cell sample quickly transferred to preservative medium with attention to prevent drying artifact.",
"Cervical os inspected for bleeding post-procedure (none noted).",
"Slide technique demonstrated 100% cellularity with good preservation."
],
waxing: [
"Vulvar area cleansed with hypoallergenic antiseptic solution prior to procedure.",
"Wax warmed to precisely 45°C (113°F) for optimal viscosity and adhesion.",
"Small test patch applied to medial thigh to assess skin sensitivity.",
"Using wooden applicators, wax applied in direction of hair growth in thin, uniform layers.",
"Muslin strips pressed firmly onto wax following hair growth pattern.",
"Removal performed with swift motion opposite to hair growth direction.",
"Each strip examined to confirm complete follicular hair removal.",
"Post-wax soothing gel with aloe vera applied liberally to treated areas."
],
cleaning: [
"Patient positioned comfortably in semi-recumbent position.",
"Gentle external cleansing with pH-balanced hypoallergenic solution begun.",
"Labial folds carefully cleaned with moistened cotton swabs in outward strokes.",
"Clitoral hood retracted gently to clean accumulated smegma if present.",
"Vaginal introitus irrigated with warm saline solution using angled-tip syringe.",
"Water temperature maintained at 37°C (98.6°F) for patient comfort.",
"No forceful irrigation used to prevent disruption of natural microbiome.",
"Aftercare instructions provided including recommendation for cotton undergarments."
],
mammogram: [
"Patient positioned standing facing mammography unit.",
"Breast placed on detector plate with gradual compression applied.",
"Mediolateral oblique view obtained first with 45-degree angulation.",
"Craniocaudal compression maintained for standard 8-10 seconds per exposure.",
"Specialized paddle used to ensure uniform thickness and tissue inclusion.",
"Compression released immediately after exposure completion.",
"Kept imaging parameters within safe limits (average AGD < 3 mGy per view).",
"Images reviewed immediately for positioning adequacy before patient dismissal."
],
douche: [
"Pre-procedure consultation reviewed benefits/risks with patient.",
"Douche nozzle sterilized and lubricated with water-soluble gel.",
"Solution temperature adjusted to exactly 38°C (100.4°F) for comfort.",
"Formula prepared per colony medical protocol (pH 4.0 lactic acid solution).",
"Slow insertion technique used with continuous verbal reassurance.",
"Solution instilled with intermittent pauses to assess comfort level.",
"500ml total volume administered over approximately 3 minutes.",
"Post-procedure pelvic rest recommended for minimum 6 hours."
],
enema: [
"Patient positioned in left lateral recumbent position with right knee drawn up.",
"Anoscope inserted gently under direct visualization.",
"Rectal vault examined digitally for any abnormalities prior to instillation.",
"Enema bag suspended at precisely 60cm above patient for controlled flow.",
"500ml warmed saline solution slowly infused over 5-7 minute period.",
"Encouraged retention for maximum therapeutic benefit (10 minutes achieved).",
"Patient monitored closely during evacuation process.",
"Post-procedure electrolyte replacement protocol initiated."
],
counsel: [
"Active listening techniques employed with frequent summarization of patient concerns.",
"Cognitive behavioral approach used to address maladaptive thought patterns.",
"Guided imagery exercises tailored to patient's specific anxiety triggers.",
"Relaxation training incorporated with progressive muscle techniques.",
"Colony-specific stress management strategies discussed in detail.",
"Session duration extended to full 50 minutes per patient request.",
"Patient demonstrated improved mood metrics post-session based on standardized scales.",
"Follow-up appointment schedule established with graduated intervals."
]
};
// Game state
let currentProcedure = null;
let procedureLog = [];
let patientsSeen = 78;
let successfulTreatments = 75;
// DOM Elements
const patientNameEl = document.getElementById('patientName');
const patientAgeEl = document.getElementById('patientAge');
const patientOccupationEl = document.getElementById('patientOccupation');
const patientNationalityEl = document.getElementById('patientNationality');
const patientHeightEl = document.getElementById('patientHeight');
const patientWeightEl = document.getElementById('patientWeight');
const patientBustEl = document.getElementById('patientBust');
const patientCycleEl = document.getElementById('patientCycle');
const vaginalLipColorEl = document.getElementById('vaginalLipColor');
const clitoralLengthEl = document.getElementById('clitoralLength');
const vaginalCanalEl = document.getElementById('vaginalCanal');
const areolaDiamEl = document.getElementById('areolaDiam');
const psychologicalProfileEl = document.getElementById('psychologicalProfile');
const medicalHistoryEl = document.getElementById('medicalHistory');
const patientImageEl = document.getElementById('patientImage');
const showAllDetailsBtn = document.getElementById('showAllDetails');
const fullDetailsEl = document.getElementById('fullDetails');
const generateNewPatientBtn = document.getElementById('generateNewPatient');
const procedureLogEl = document.getElementById('procedureLog');
const saveRecordBtn = document.getElementById('saveRecord');
const completeSessionBtn = document.getElementById('completeSession');
const procedureBtns = document.querySelectorAll('.procedure-btn');
const patientsSeenEl = document.getElementById('patientsSeen');
const successfulTreatmentsEl = document.getElementById('successfulTreatments');
// Event Listeners
document.addEventListener('DOMContentLoaded', () => {
patientsSeenEl.textContent = patientsSeen;
successfulTreatmentsEl.textContent = successfulTreatments;
});
showAllDetailsBtn.addEventListener('click', () => {
fullDetailsEl.classList.toggle('hidden');
showAllDetailsBtn.textContent = fullDetailsEl.classList.contains('hidden') ? 'Show All' : 'Hide Details';
});
generateNewPatientBtn.addEventListener('click', generateNewPatient);
procedureBtns.forEach(btn => {
btn.addEventListener('click', () => {
const procedure = btn.dataset.procedure;
startProcedure(procedure);
});
});
saveRecordBtn.addEventListener('click', () => {
saveProcedure();
});
completeSessionBtn.addEventListener('click', () => {
completeSession();
});
document.getElementById('captureGenitalImage').addEventListener('click', () => {
Swal.fire({
title: 'Genital Image Captured',
html: `
<div class="text-center">
<img src="https://images.unsplash.com/photo-1611591437281-460914d22803?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=687&q=80"
class="mx-auto mb-4 rounded-lg w-64 h-64 object-cover">
<p class="text-sm text-gray-600">Image saved to patient record</p>
</div>
`,
showConfirmButton: true,
confirmButtonText: 'OK',
showCancelButton: true,
cancelButtonText: 'Retake',
focusConfirm: false,
customClass: {
popup: 'w-96'
}
}).then((result) => {
if (result.isConfirmed) {
// Add to procedure log
const now = new Date();
const timestamp = now.toLocaleString();
procedureLog.push(`<div class="mb-3 fade-in">
<div class="text-xs text-gray-500 mb-1">${timestamp}</div>
<div class="flex items-start">
<div class="bg-pink-100 rounded-full w-6 h-6 flex items-center justify-center mr-2 flex-shrink-0">
<i class="fas fa-camera text-pink-600 text-xs"></i>
</div>
<div class="bg-white rounded-lg p-3 shadow-sm flex-1">
<div class="font-semibold text-pink-800 mb-1">Genital Image Captured</div>
<p>Standardized genital/pubic area photograph archived to patient record.</p>
</div>
</div>
</div>`);
procedureLogEl.innerHTML = procedureLog.join('');
procedureLogEl.scrollTop = procedureLogEl.scrollHeight;
}
});
});
// Functions
function generateNewPatient() {
// Reset UI
procedureLog = [];
procedureLogEl.innerHTML = `<div class="mb-3 fade-in">
<div class="text-xs text-gray-500 mb-1">${new Date().toLocaleString()}</div>
<div class="flex items-start">
<div class="bg-indigo-100 rounded-full w-6 h-6 flex items-center justify-center mr-2 flex-shrink-0">
<i class="fas fa-notes-medical text-indigo-600 text-xs"></i>
</div>
<div class="bg-white rounded-lg p-3 shadow-sm flex-1">
<div class="font-semibold text-indigo-800 mb-1">Vaginal Cleaning initiated</div>
<p>Patient properly positioned and consented for Vaginal Cleaning procedure.</p>
</div>
</div>
</div>`;
currentProcedure = 'cleaning';
saveRecordBtn.disabled = false;
completeSessionBtn.classList.remove('hidden');
saveRecordBtn.disabled = true;
completeSessionBtn.classList.add('hidden');
fullDetailsEl.classList.add('hidden');
showAllDetailsBtn.textContent = 'Show All';
currentProcedure = null;
// Generate random patient details
const nationality = getWeightedRandomNationality();
const age = getWeightedRandomAge();
const firstName = firstNames[Math.floor(Math.random() * firstNames.length)];
const lastName = nationalitySurnames[nationality]
? nationalitySurnames[nationality][Math.floor(Math.random() * nationalitySurnames[nationality].length)]
: lastNames[Math.floor(Math.random() * lastNames.length)];
patientNameEl.textContent = `${firstName} ${lastName}`;
patientAgeEl.textContent = age;
patientOccupationEl.textContent = occupations[Math.floor(Math.random() * occupations.length)];
patientNationalityEl.textContent = nationality;
// Generate realistic body measurements
const heightFeet = age === 16 ? Math.floor(Math.random() * 3) + 4 : Math.floor(Math.random() * 3) + 5;
const heightInches = Math.floor(Math.random() * 11) + 1;
patientHeightEl.textContent = `${heightFeet}'${heightInches}"`;
const baseWeight = age === 16 ? 95 : 105;
const weightVariance = Math.floor(Math.random() * 40) + 5;
patientWeightEl.textContent = `${baseWeight + weightVariance} lbs`;
const cupSizes = ['A', 'B', 'C', 'D'];
const bandSize = age === 16 ? Math.floor(Math.random() * 3) + 32 : Math.floor(Math.random() * 4) + 32;
patientBustEl.textContent = `${bandSize}${cupSizes[Math.floor(Math.random() * cupSizes.length)]}`;
const cycleStart = Math.floor(Math.random() * 5) + 1;
const cycleEnd = cycleStart + Math.floor(Math.random() * 3) + 3;
patientCycleEl.textContent = `${cycleStart}-${cycleEnd}`;
// Generate gynecological details
const vaginalLipColors = ['Light pink', 'Medium pink', 'Pale brown', 'Dusky pink'];
vaginalLipColorEl.textContent = vaginalLipColors[Math.floor(Math.random() * vaginalLipColors.length)];
clitoralLengthEl.textContent = `${(Math.random() * 0.4 + 0.2).toFixed(2)} inches`;
const vaginalCanalLength = (Math.random() * 1 + 2.5).toFixed(1);
vaginalCanalEl.textContent = `${vaginalCanalLength} inches`;
areolaDiamEl.textContent = `${(Math.random() * 0.6 + 0.8).toFixed(1)} inches`;
psychologicalProfileEl.textContent = psychologicalProfiles[Math.floor(Math.random() * psychologicalProfiles.length)];
medicalHistoryEl.textContent = medicalHistories[Math.floor(Math.random() * medicalHistories.length)];
// Generate appropriate image based on nationality
let imgUrl;
switch(nationality) {
case "China":
imgUrl = "https://images.unsplash.com/photo-1529626455594-4ff0802cfb7e?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=687&q=80";
break;
case "India":
imgUrl = "https://images.unsplash.com/photo-1524504388940-b1c1722653e1?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=687&q=80";
break;
case "Brazil":
imgUrl = "https://images.unsplash.com/photo-1532074205216-d0e1f4b87368?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=741&q=80";
break;
case "Russia":
imgUrl = "https://images.unsplash.com/photo-1530825894095-9c184b564d98?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=687&q=80";
break;
case "United States":
imgUrl = "https://images.unsplash.com/photo-1506956191251-7e3cf95a7816?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=687&q=80";
break;
default:
imgUrl = "https://images.unsplash.com/photo-1438761681033-6461ffad8d80?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=1470&q=80";
}
patientImageEl.src = imgUrl;
// Show confirmation
Swal.fire({
position: 'top-end',
icon: 'success',
title: 'New patient generated',
showConfirmButton: false,
timer: 1500
});
}
function getWeightedRandomNationality() {
const total = nationalityDistribution.reduce((sum, item) => sum + item.count, 0);
let random = Math.floor(Math.random() * total);
for (const item of nationalityDistribution) {
if (random < item.count) {
return item.country;
}
random -= item.count;
}
return "Other";
}
function getWeightedRandomAge() {
const total = ageDistribution.reduce((sum, item) => sum + item.count, 0);
let random = Math.floor(Math.random() * total);
for (const item of ageDistribution) {
if (random < item.count) {
return item.age;
}
random -= item.count;
}
return 16;
}
function startProcedure(procedure) {
currentProcedure = procedure;
procedureLog = [];
// Add initial procedure note
const now = new Date();
const timestamp = now.toLocaleString();
procedureLog.push(`<div class="mb-3 fade-in">
<div class="text-xs text-gray-500 mb-1">${timestamp}</div>
<div class="flex items-start">
<div class="bg-indigo-100 rounded-full w-6 h-6 flex items-center justify-center mr-2 flex-shrink-0">
<i class="fas fa-notes-medical text-indigo-600 text-xs"></i>
</div>
<div class="bg-white rounded-lg p-3 shadow-sm flex-1">
<div class="font-semibold text-indigo-800 mb-1">${getProcedureName(procedure)} initiated</div>
<p>Patient properly positioned and consented for ${getProcedureName(procedure)} procedure.</p>
</div>
</div>
</div>`);
// Display initial log
procedureLogEl.innerHTML = procedureLog.join('');
procedureLogEl.scrollTop = procedureLogEl.scrollHeight;
// Enable save button
saveRecordBtn.disabled = false;
completeSessionBtn.classList.remove('hidden');
// Show procedure-specific buttons
Swal.fire({
position: 'top-end',
icon: 'info',
title: `${getProcedureName(procedure)} started`,
showConfirmButton: false,
timer: 1500
});
}
function getProcedureName(procedure) {
const names = {
exam: "Full Gynecological Exam",
pap: "Pap Smear",
waxing: "Vaginal Waxing",
cleaning: "Vaginal Cleaning",
mammogram: "Mammogram",
douche: "Medical Douching",
enema: "Enema",
counsel: "Counseling Session"
};
return names[procedure] || procedure;
}
function saveProcedure() {
if (!currentProcedure) return;
// Get random procedure steps
const steps = procedureDetails[currentProcedure];
const randomSteps = [];
const stepsCount = Math.min(3, steps.length); // Show 2-3 steps at a time
// Select random unique steps
while (randomSteps.length < stepsCount) {
const randomIndex = Math.floor(Math.random() * steps.length);
if (!randomSteps.includes(steps[randomIndex])) {
randomSteps.push(steps[randomIndex]);
}
}
// Add steps to log
const now = new Date();
const timestamp = now.toLocaleString();
let stepsHTML = randomSteps.map(step => `
<div class="flex items-start mb-2">
<div class="bg-gray-100 rounded-full w-5 h-5 flex items-center justify-center mr-2 mt-0.5 flex-shrink-0">
<i class="fas fa-circle text-gray-400 text-2xs"></i>
</div>
<div class="text-sm">${step}</div>
</div>
`).join('');
procedureLog.push(`<div class="mb-3 fade-in">
<div class="text-xs text-gray-500 mb-1">${timestamp}</div>
<div class="flex items-start">
<div class="bg-indigo-100 rounded-full w-6 h-6 flex items-center justify-center mr-2 flex-shrink-0">
<i class="fas fa-procedures text-indigo-600 text-xs"></i>
</div>
<div class="bg-white rounded-lg p-3 shadow-sm flex-1">
<div class="font-semibold text-indigo-800 mb-1">Procedure Update</div>
${stepsHTML}
</div>
</div>
</div>`);
// Update log display
procedureLogEl.innerHTML = procedureLog.join('');
procedureLogEl.scrollTop = procedureLogEl.scrollHeight;
// Show confirmation
Swal.fire({
position: 'top-end',
icon: 'success',
title: 'Procedure updated',
showConfirmButton: false,
timer: 1500
});
}
function completeSession() {
if (!currentProcedure) return;
// Add completion note
const now = new Date();
const timestamp = now.toLocaleString();
procedureLog.push(`<div class="mb-3 fade-in">
<div class="text-xs text-gray-500 mb-1">${timestamp}</div>
<div class="flex items-start">
<div class="bg-green-100 rounded-full w-6 h-6 flex items-center justify-center mr-2 flex-shrink-0">
<i class="fas fa-check text-green-600 text-xs"></i>
</div>
<div class="bg-white rounded-lg p-3 shadow-sm flex-1">
<div class="font-semibold text-green-800 mb-1">Procedure Completed</div>
<p>${getProcedureName(currentProcedure)} successfully completed. Patient discharged with aftercare instructions.</p>
</div>
</div>
</div>`);
// Update log display
procedureLogEl.innerHTML = procedureLog.join('');
procedureLogEl.scrollTop = procedureLogEl.scrollHeight;
// Update stats
patientsSeen++;
successfulTreatments++;
patientsSeenEl.textContent = patientsSeen;
successfulTreatmentsEl.textContent = successfulTreatments;
// Reset UI
saveRecordBtn.disabled = true;
completeSessionBtn.classList.add('hidden');
currentProcedure = null;
// Show completion message
Swal.fire({
position: 'center',
icon: 'success',
title: 'Procedure Completed',
text: 'Patient record has been updated',
showConfirmButton: false,
timer: 2000
});
}
</script>
<p style="border-radius: 8px; text-align: center; font-size: 12px; color: #fff; margin-top: 16px;position: fixed; left: 8px; bottom: 8px; z-index: 10; background: rgba(0, 0, 0, 0.8); padding: 4px 8px;">Made with <img src="https://enzostvs-deepsite.hf.space/logo.svg" alt="DeepSite Logo" style="width: 16px; height: 16px; vertical-align: middle;display:inline-block;margin-right:3px;filter:brightness(0) invert(1);"><a href="https://enzostvs-deepsite.hf.space" style="color: #fff;text-decoration: underline;" target="_blank" >DeepSite</a> - 🧬 <a href="https://enzostvs-deepsite.hf.space?remix=sevangelen/tulip" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body>
</html>