تست
تحلیل هوشمند نتایج آزمایش پزشکی
سن و جنسیت خود را وارد کرده، سپس مقادیر آزمایشهای مورد نظر را تکمیل و دکمه تحلیل را بزنید.
سلب مسئولیت مهم: این ابزار صرفاً جنبه اطلاعرسانی اولیه دارد و به هیچ عنوان جایگزین تشخیص، توصیه و درمان پزشکی حرفهای نمیباشد. تفسیر نتایج آزمایشها پیچیده است و باید توسط پزشک متخصص و با در نظر گرفتن سوابق پزشکی کامل شما انجام شود. همیشه برای هرگونه تصمیمگیری درمانی به پزشک خود مراجعه کنید. محدودههای طبیعی ارائه شده در این ابزار عمومی هستند و ممکن است با محدودههای مرجع آزمایشگاه شما متفاوت باشند.
<!DOCTYPE html>
<html lang="fa" dir="rtl">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>تحلیل هوشمند نتایج آزمایش پزشکی</title>
<script src="https://cdn.tailwindcss.com"></script>
<link href="https://fonts.googleapis.com/css2?family=Vazirmatn:wght@400;700&display=swap" rel="stylesheet">
<style>
body {
font-family: 'Vazirmatn', sans-serif;
direction: rtl;
background-color: #f0f4f8; /* Light pastel blue-gray background */
}
.container {
max-width: 800px;
margin: 2rem auto;
padding: 2rem;
background-color: #ffffff; /* White container background */
border-radius: 0.75rem; /* Tailwind rounded-xl */
box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05); /* Tailwind shadow-lg */
}
.form-input, .form-select {
border-color: #cbd5e1; /* Tailwind slate-300 */
border-radius: 0.375rem; /* Tailwind rounded-md */
padding-top: 0.5rem;
padding-bottom: 0.5rem;
transition: all 0.15s ease-in-out;
}
.form-input:focus, .form-select:focus {
border-color: #3b82f6; /* Tailwind blue-500 */
box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.2); /* Focus ring */
}
.result-card {
border: 1px solid #e2e8f0; /* Tailwind slate-200 */
border-radius: 0.5rem; /* Tailwind rounded-lg */
padding: 1.5rem;
margin-top: 1rem;
background-color: #f8fafc; /* Tailwind slate-50, slightly off-white */
}
.result-card:first-child {
margin-top: 1.5rem;
}
.result-title {
font-size: 1.125rem; /* Tailwind text-lg */
font-weight: 700; /* Tailwind font-bold */
color: #1e293b; /* Tailwind slate-800 */
}
.result-text {
font-size: 0.95rem;
color: #334155; /* Tailwind slate-700 */
line-height: 1.65;
}
.brief-explanation-text {
font-size: 0.85rem;
color: #475569; /* Tailwind slate-600 */
font-style: italic;
}
.disclaimer {
font-size: 0.875rem;
color: #dc2626; /* Tailwind red-600 */
margin-top: 2rem;
padding: 1rem;
background-color: #fee2e2; /* Tailwind red-100 */
border: 1px solid #fca5a5; /* Tailwind red-300 */
border-radius: 0.375rem;
text-align: center;
font-weight: normal;
}
label {
text-align: right;
display: block;
font-weight: 600; /* Tailwind font-semibold */
color: #475569; /* Tailwind slate-600 */
}
input[type="number"] {
text-align: right;
}
.test-entry {
padding: 1.25rem;
border: 1px solid #e2e8f0;
border-radius: 0.5rem;
margin-bottom: 1rem;
transition: box-shadow 0.2s ease-in-out;
}
.test-entry:hover {
box-shadow: 0 4px 12px -1px rgba(0,0,0,0.07);
}
.test-entry:last-child {
margin-bottom: 0;
}
.user-info-section {
background-color: #eff6ff; /* Tailwind blue-50 */
padding: 1.5rem;
border-radius: 0.5rem;
margin-bottom: 2rem;
border: 1px solid #bfdbfe; /* Tailwind blue-200 */
}
.bg-pastel-1 { background-color: #e0f2fe; border-left: 4px solid #7dd3fc; }
.bg-pastel-2 { background-color: #dcfce7; border-left: 4px solid #86efac; }
.bg-pastel-3 { background-color: #fef3c7; border-left: 4px solid #fde047; }
.bg-pastel-4 { background-color: #f3e8ff; border-left: 4px solid #d8b4fe; }
.bg-pastel-5 { background-color: #ffe4e6; border-left: 4px solid #fda4af; }
</style>
</head>
<body class="bg-gray-100">
<div class="container">
<header class="text-center mb-8">
<h1 class="text-3xl font-bold text-blue-700">تحلیل هوشمند نتایج آزمایش پزشکی</h1>
<p class="text-gray-700 mt-2">سن و جنسیت خود را وارد کرده، سپس مقادیر آزمایشهای مورد نظر را تکمیل و دکمه تحلیل را بزنید.</p>
</header>
<div class="user-info-section grid grid-cols-1 sm:grid-cols-2 gap-6">
<div>
<label for="age" class="block text-sm font-medium text-gray-700 mb-1">سن:</label>
<input type="number" id="age" name="age" class="form-input mt-1 block w-full py-2 px-3 shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 sm:text-sm" placeholder="مثال: 35">
</div>
<div>
<label for="gender" class="block text-sm font-medium text-gray-700 mb-1">جنسیت:</label>
<select id="gender" name="gender" class="form-select mt-1 block w-full py-2 px-3 shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 sm:text-sm">
<option value="">انتخاب کنید...</option>
<option value="male">آقا</option>
<option value="female">خانم</option>
</select>
</div>
</div>
<div class="bg-white p-6 rounded-lg shadow-md">
<div id="testInputsContainer" class="space-y-4">
</div>
<button onclick="analyzeAllTests()" class="w-full mt-8 bg-blue-600 hover:bg-blue-700 text-white font-bold py-3 px-4 rounded-md focus:outline-none focus:shadow-outline transition duration-150 ease-in-out text-lg">
تحلیل تمام نتایج وارد شده
</button>
</div>
<div id="resultArea" class="mt-6">
</div>
<div class="disclaimer">
<strong>سلب مسئولیت مهم:</strong> این ابزار صرفاً جنبه اطلاعرسانی اولیه دارد و به هیچ عنوان جایگزین تشخیص، توصیه و درمان پزشکی حرفهای نمیباشد. تفسیر نتایج آزمایشها پیچیده است و باید توسط پزشک متخصص و با در نظر گرفتن سوابق پزشکی کامل شما انجام شود. همیشه برای هرگونه تصمیمگیری درمانی به پزشک خود مراجعه کنید. محدودههای طبیعی ارائه شده در این ابزار عمومی هستند و ممکن است با محدودههای مرجع آزمایشگاه شما متفاوت باشند.
</div>
</div>
<script>
// Data for medical tests in the specified order
const testData = {
fbs: {
name: "قند خون ناشتا (FBS)",
briefExplanation: "میزان قند موجود در خون پس از ۸ تا ۱۲ ساعت ناشتایی را اندازهگیری میکند.",
unit: "mg/dL",
ranges: [
{ limit: 70, interpretation: "پایینتر از حد طبیعی (هیپوگلیسمی). نیاز به بررسی بیشتر.", status: "پایین" },
{ limit: 100, interpretation: "در محدوده طبیعی.", status: "طبیعی" },
{ limit: 125, interpretation: "بالاتر از حد طبیعی (پیشدیابت).", status: "مرزی بالا" },
{ limit: Infinity, interpretation: "بسیار بالاتر از حد طبیعی (احتمال دیابت). مراجعه فوری به پزشک ضروری است.", status: "بالا" }
],
normalRangeTextGeneral: "70-100 mg/dL",
specialist: "پزشک عمومی، متخصص داخلی، متخصص غدد"
},
hba1c: {
name: "هموگلوبین ایوانسی (HbA1c)",
briefExplanation: "میانگین قند خون طی ۲-۳ ماه گذشته را نشان میدهد و برای تشخیص و کنترل دیابت استفاده میشود.",
unit: "%",
ranges: [
{ limit: 5.7, interpretation: "طبیعی، نشاندهنده کنترل خوب قند خون در افراد غیر دیابتی.", status: "طبیعی" },
{ limit: 6.5, interpretation: "پیشدیابت، ریسک ابتلا به دیابت در آینده افزایش یافته است.", status: "پیشدیابت" },
{ limit: Infinity, interpretation: "دیابت، نیاز به مدیریت و درمان دیابت تحت نظر پزشک.", status: "دیابت" }
],
normalRangeTextGeneral: "کمتر از 5.7% (طبیعی)، 5.7%-6.4% (پیشدیابت)، 6.5% و بالاتر (دیابت)",
specialist: "پزشک عمومی، متخصص داخلی، متخصص غدد"
},
bun: {
name: "نیتروژن اوره خون (BUN)",
briefExplanation: "محصول زائد متابولیسم پروتئین است که توسط کلیهها دفع میشود و عملکرد کلیه را نشان میدهد.",
unit: "mg/dL",
ranges: [ // Example ranges, can vary
{ limit: 7, interpretation: "ممکن است پایینتر از حد طبیعی باشد، نیاز به بررسی بیشتر.", status: "پایین" },
{ limit: 20, interpretation: "در محدوده طبیعی.", status: "طبیعی" },
{ limit: Infinity, interpretation: "بالاتر از حد طبیعی، ممکن است نشانهای از مشکل کلیوی یا دهیدراتاسیون باشد.", status: "بالا" }
],
normalRangeTextGeneral: "حدود 7-20 mg/dL",
specialist: "پزشک عمومی، متخصص داخلی، متخصص کلیه (نفرولوژیست)"
},
creat: {
name: "کراتینین (Creatinine)",
briefExplanation: "محصول زائد عضلانی است که توسط کلیهها فیلتر میشود و شاخص مهمی برای عملکرد کلیه است.",
unit: "mg/dL",
genderSpecificRanges: {
male: [
{ limit: 0.7, interpretation: "ممکن است پایینتر از حد طبیعی باشد.", status: "پایین" },
{ limit: 1.3, interpretation: "در محدوده طبیعی برای آقایان.", status: "طبیعی" },
{ limit: Infinity, interpretation: "بالاتر از حد طبیعی برای آقایان، ممکن است نشانهای از مشکل کلیوی باشد.", status: "بالا" }
],
female: [
{ limit: 0.6, interpretation: "ممکن است پایینتر از حد طبیعی باشد.", status: "پایین" },
{ limit: 1.1, interpretation: "در محدوده طبیعی برای خانمها.", status: "طبیعی" },
{ limit: Infinity, interpretation: "بالاتر از حد طبیعی برای خانمها، ممکن است نشانهای از مشکل کلیوی باشد.", status: "بالا" }
]
},
normalRangeTextMale: "آقایان: حدود 0.7-1.3 mg/dL",
normalRangeTextFemale: "خانمها: حدود 0.6-1.1 mg/dL",
specialist: "پزشک عمومی، متخصص داخلی، متخصص کلیه (نفرولوژیست)"
},
uric_acid: {
name: "اسید اوریک (Uric Acid)",
briefExplanation: "محصول نهایی متابولیسم پورینها است و افزایش آن میتواند منجر به نقرس یا سنگ کلیه شود.",
unit: "mg/dL",
genderSpecificRanges: {
male: [
{ limit: 3.4, interpretation: "ممکن است پایینتر از حد طبیعی باشد.", status: "پایین" },
{ limit: 7.0, interpretation: "در محدوده طبیعی برای آقایان.", status: "طبیعی" },
{ limit: Infinity, interpretation: "بالاتر از حد طبیعی برای آقایان، ریسک نقرس افزایش مییابد.", status: "بالا" }
],
female: [
{ limit: 2.4, interpretation: "ممکن است پایینتر از حد طبیعی باشد.", status: "پایین" },
{ limit: 6.0, interpretation: "در محدوده طبیعی برای خانمها.", status: "طبیعی" },
{ limit: Infinity, interpretation: "بالاتر از حد طبیعی برای خانمها، ریسک نقرس افزایش مییابد.", status: "بالا" }
]
},
normalRangeTextMale: "آقایان: حدود 3.4-7.0 mg/dL",
normalRangeTextFemale: "خانمها: حدود 2.4-6.0 mg/dL",
specialist: "پزشک عمومی، متخصص داخلی، روماتولوژیست"
},
tg: {
name: "تریگلیسرید (Triglycerides - TG)",
briefExplanation: "نوعی چربی در خون است که افزایش آن با خطر بیماریهای قلبی و پانکراتیت مرتبط است.",
unit: "mg/dL",
ranges: [
{ limit: 150, interpretation: "مطلوب.", status: "مطلوب" },
{ limit: 200, interpretation: "مرزی بالا.", status: "مرزی بالا" },
{ limit: 500, interpretation: "بالا، نیاز به مداخله و تغییر سبک زندگی.", status: "بالا" },
{ limit: Infinity, interpretation: "بسیار بالا، ریسک پانکراتیت و بیماری قلبی شدیداً افزایش یافته است.", status: "بسیار بالا" }
],
normalRangeTextGeneral: "کمتر از 150 mg/dL (مطلوب)",
specialist: "پزشک عمومی، متخصص داخلی، متخصص قلب و عروق، متخصص غدد"
},
chol: {
name: "کلسترول تام (Total Cholesterol)",
briefExplanation: "مجموع انواع چربیهای موجود در خون را نشان میدهد و برای ارزیابی خطر بیماریهای قلبی مهم است.",
unit: "mg/dL",
ranges: [
{ limit: 200, interpretation: "مطلوب.", status: "مطلوب" },
{ limit: 240, interpretation: "مرزی بالا.", status: "مرزی بالا" },
{ limit: Infinity, interpretation: "بالا، ریسک بیماریهای قلبی افزایش یافته است.", status: "بالا" }
],
normalRangeTextGeneral: "کمتر از 200 mg/dL (مطلوب)",
specialist: "پزشک عمومی، متخصص داخلی، متخصص قلب و عروق"
},
hdl: {
name: "کلسترول خوب (HDL Cholesterol)",
briefExplanation: "کلسترول 'خوب' خون است که به خارج کردن کلسترول اضافی از عروق و کاهش خطر بیماری قلبی کمک میکند.",
unit: "mg/dL",
genderSpecificRanges: { // HDL levels: Higher is better
male: [
{ limit: 40, interpretation: "پایین، ریسک بیماری قلبی افزایش یافته است.", status: "پایین" },
{ limit: Infinity, interpretation: "مطلوب برای آقایان.", status: "مطلوب" } // Typically >40 is good, >60 is protective
],
female: [
{ limit: 50, interpretation: "پایین، ریسک بیماری قلبی افزایش یافته است.", status: "پایین" },
{ limit: Infinity, interpretation: "مطلوب برای خانمها.", status: "مطلوب" } // Typically >50 is good, >60 is protective
]
},
normalRangeTextMale: "آقایان: بیشتر از 40 mg/dL (مطلوب)",
normalRangeTextFemale: "خانمها: بیشتر از 50 mg/dL (مطلوب)",
specialist: "پزشک عمومی، متخصص داخلی، متخصص قلب و عروق"
},
ldl: {
name: "کلسترول بد (LDL Cholesterol)",
briefExplanation: "کلسترول 'بد' خون است که افزایش آن باعث تجمع پلاک در عروق و افزایش خطر بیماری قلبی میشود.",
unit: "mg/dL",
ranges: [ // LDL levels: Lower is better
{ limit: 100, interpretation: "مطلوب (یا کمتر از 70 در افراد با ریسک بسیار بالا).", status: "مطلوب" },
{ limit: 130, interpretation: "نزدیک به مطلوب/بالای مطلوب.", status: "نزدیک به مطلوب" },
{ limit: 160, interpretation: "مرزی بالا.", status: "مرزی بالا" },
{ limit: 190, interpretation: "بالا.", status: "بالا" },
{ limit: Infinity, interpretation: "بسیار بالا.", status: "بسیار بالا" }
],
normalRangeTextGeneral: "کمتر از 100 mg/dL (مطلوب)",
specialist: "پزشک عمومی، متخصص داخلی، متخصص قلب و عروق"
},
sgot: {
name: "اسجیاوتی (SGOT/AST)",
briefExplanation: "آنزیمی است که عمدتاً در کبد، قلب و عضلات یافت میشود و افزایش آن میتواند نشانهای از آسیب به این اعضا باشد.",
unit: "U/L",
ranges: [ // Example ranges
{ limit: 5, interpretation: "ممکن است پایینتر از حد طبیعی باشد.", status: "پایین" },
{ limit: 40, interpretation: "در محدوده طبیعی.", status: "طبیعی" },
{ limit: Infinity, interpretation: "بالاتر از حد طبیعی، ممکن است نشانهای از آسیب کبدی یا قلبی باشد.", status: "بالا" }
],
normalRangeTextGeneral: "حدود 5-40 U/L",
specialist: "پزشک عمومی، متخصص داخلی، متخصص گوارش و کبد (هپاتولوژیست)"
},
sgpt: {
name: "اسجیپیتی (SGPT/ALT)",
briefExplanation: "آنزیمی است که عمدتاً در کبد یافت میشود و حساسترین شاخص آسیب سلولهای کبدی است.",
unit: "U/L",
ranges: [ // Example ranges
{ limit: 7, interpretation: "ممکن است پایینتر از حد طبیعی باشد.", status: "پایین" },
{ limit: 56, interpretation: "در محدوده طبیعی.", status: "طبیعی" },
{ limit: Infinity, interpretation: "بالاتر از حد طبیعی، معمولاً نشانهای از آسیب کبدی است.", status: "بالا" }
],
normalRangeTextGeneral: "حدود 7-56 U/L",
specialist: "پزشک عمومی، متخصص داخلی، متخصص گوارش و کبد (هپاتولوژیست)"
},
alk: {
name: "آلکالین فسفاتاز (Alkaline Phosphatase - ALP)",
briefExplanation: "آنزیمی است که در کبد، استخوانها، روده و کلیه یافت میشود و در بیماریهای کبدی و استخوانی تغییر میکند.",
unit: "U/L",
ranges: [ // Example ranges, can be age-dependent
{ limit: 44, interpretation: "ممکن است پایینتر از حد طبیعی باشد.", status: "پایین" },
{ limit: 147, interpretation: "در محدوده طبیعی (در بزرگسالان).", status: "طبیعی" },
{ limit: Infinity, interpretation: "بالاتر از حد طبیعی، ممکن است نشانهای از بیماری کبدی یا استخوانی باشد.", status: "بالا" }
],
normalRangeTextGeneral: "حدود 44-147 U/L (در بزرگسالان)",
specialist: "پزشک عمومی، متخصص داخلی، متخصص گوارش و کبد، متخصص ارتوپدی"
},
iron: {
name: "آهن (Iron)",
briefExplanation: "میزان آهن سرم خون را اندازهگیری میکند که برای ساخت هموگلوبین و انتقال اکسیژن ضروری است.",
unit: "µg/dL",
genderSpecificRanges: {
male: [
{ limit: 65, interpretation: "پایینتر از حد طبیعی برای آقایان.", status: "پایین" },
{ limit: 176, interpretation: "در محدوده طبیعی برای آقایان.", status: "طبیعی" },
{ limit: Infinity, interpretation: "بالاتر از حد طبیعی برای آقایان.", status: "بالا" }
],
female: [
{ limit: 50, interpretation: "پایینتر از حد طبیعی برای خانمها.", status: "پایین" },
{ limit: 170, interpretation: "در محدوده طبیعی برای خانمها.", status: "طبیعی" },
{ limit: Infinity, interpretation: "بالاتر از حد طبیعی برای خانمها.", status: "بالا" }
]
},
normalRangeTextMale: "آقایان: حدود 65-176 µg/dL",
normalRangeTextFemale: "خانمها: حدود 50-170 µg/dL",
specialist: "پزشک عمومی، متخصص داخلی، متخصص خون (هماتولوژیست)"
},
ferritin: {
name: "فریتین (Ferritin)",
briefExplanation: "پروتئینی است که آهن را در بدن ذخیره میکند و سطح آن نشاندهنده میزان ذخایر آهن بدن است.",
unit: "ng/mL",
genderSpecificRanges: {
male: [
{ limit: 30, interpretation: "پایینتر از حد طبیعی برای آقایان (کمبود آهن محتمل).", status: "پایین" },
{ limit: 300, interpretation: "در محدوده طبیعی برای آقایان.", status: "طبیعی" },
{ limit: Infinity, interpretation: "بالاتر از حد طبیعی برای آقایان (اضافه بار آهن یا التهاب محتمل).", status: "بالا" }
],
female: [
{ limit: 15, interpretation: "پایینتر از حد طبیعی برای خانمها (کمبود آهن محتمل).", status: "پایین" },
{ limit: 150, interpretation: "در محدوده طبیعی برای خانمها.", status: "طبیعی" },
{ limit: Infinity, interpretation: "بالاتر از حد طبیعی برای خانمها (اضافه بار آهن یا التهاب محتمل).", status: "بالا" }
]
},
normalRangeTextMale: "آقایان: حدود 30-300 ng/mL",
normalRangeTextFemale: "خانمها: حدود 15-150 ng/mL",
specialist: "پزشک عمومی، متخصص داخلی، متخصص خون (هماتولوژیست)"
},
tibc: {
name: "ظرفیت اتصال کل آهن (TIBC)",
briefExplanation: "توانایی پروتئینهای خون (عمدتاً ترانسفرین) برای اتصال به آهن را نشان میدهد و در ارزیابی وضعیت آهن بدن کاربرد دارد.",
unit: "µg/dL",
ranges: [ // Example ranges
{ limit: 240, interpretation: "ممکن است پایینتر از حد طبیعی باشد.", status: "پایین" },
{ limit: 450, interpretation: "در محدوده طبیعی.", status: "طبیعی" },
{ limit: Infinity, interpretation: "بالاتر از حد طبیعی، معمولاً در کمبود آهن دیده میشود.", status: "بالا" }
],
normalRangeTextGeneral: "حدود 240-450 µg/dL",
specialist: "پزشک عمومی، متخصص داخلی، متخصص خون (هماتولوژیست)"
},
t3: {
name: "ترییدوتیرونین (Total T3)",
briefExplanation: "یکی از هورمونهای فعال تیروئید است که متابولیسم بدن را تنظیم میکند.",
unit: "ng/dL",
ranges: [ // Example ranges for Total T3
{ limit: 80, interpretation: "ممکن است پایینتر از حد طبیعی باشد (کمکاری تیروئید).", status: "پایین" },
{ limit: 200, interpretation: "در محدوده طبیعی.", status: "طبیعی" },
{ limit: Infinity, interpretation: "بالاتر از حد طبیعی (پرکاری تیروئید).", status: "بالا" }
],
normalRangeTextGeneral: "حدود 80-200 ng/dL (برای Total T3)",
specialist: "پزشک عمومی، متخصص داخلی، متخصص غدد"
},
t4: {
name: "تیروکسین (Total T4)",
briefExplanation: "هورمون اصلی تیروئید است که نقش مهمی در متابولیسم، رشد و نمو دارد.",
unit: "µg/dL",
ranges: [ // Example ranges for Total T4
{ limit: 4.5, interpretation: "ممکن است پایینتر از حد طبیعی باشد (کمکاری تیروئید).", status: "پایین" },
{ limit: 12.0, interpretation: "در محدوده طبیعی.", status: "طبیعی" },
{ limit: Infinity, interpretation: "بالاتر از حد طبیعی (پرکاری تیروئید).", status: "بالا" }
],
normalRangeTextGeneral: "حدود 4.5-12.0 µg/dL (برای Total T4)",
specialist: "پزشک عمومی، متخصص داخلی، متخصص غدد"
},
tsh: {
name: "هورمون محرک تیروئید (TSH)",
briefExplanation: "هورمونی است که از غده هیپوفیز ترشح شده و عملکرد غده تیروئید را کنترل میکند.",
unit: "µIU/mL",
ranges: [
{ limit: 0.4, interpretation: "پایینتر از حد طبیعی (احتمال پرکاری تیروئید).", status: "پایین" },
{ limit: 4.0, interpretation: "در محدوده طبیعی.", status: "طبیعی" }, // Some labs use up to 4.5 or 5.0
{ limit: Infinity, interpretation: "بالاتر از حد طبیعی (احتمال کمکاری تیروئید).", status: "بالا" }
],
normalRangeTextGeneral: "حدود 0.4-4.0 µIU/mL",
specialist: "پزشک عمومی، متخصص داخلی، متخصص غدد"
},
wbc: {
name: "شمارش گلبولهای سفید (WBC)",
briefExplanation: "تعداد گلبولهای سفید خون را نشان میدهد که نقش مهمی در سیستم ایمنی بدن و مبارزه با عفونتها دارند.",
unit: "cells/µL",
ranges: [
{ limit: 4500, interpretation: "پایینتر از حد طبیعی (لکوپنی).", status: "پایین" },
{ limit: 11000, interpretation: "در محدوده طبیعی.", status: "طبیعی" },
{ limit: Infinity, interpretation: "بالاتر از حد طبیعی (لکوسیتوز). ممکن است نشاندهنده عفونت یا التهاب باشد.", status: "بالا" }
],
normalRangeTextGeneral: "4,500-11,000 cells/µL",
specialist: "پزشک عمومی، متخصص داخلی، متخصص عفونی یا هماتولوژیست"
},
hb: {
name: "هموگلوبین (Hb)",
briefExplanation: "پروتئین موجود در گلبولهای قرمز است که اکسیژن را به بافتهای بدن حمل میکند و کمبود آن باعث کمخونی میشود.",
unit: "g/dL",
genderSpecificRanges: {
male: [
{ limit: 13.5, interpretation: "پایینتر از حد طبیعی برای آقایان (احتمال کمخونی).", status: "پایین" },
{ limit: 17.5, interpretation: "در محدوده طبیعی برای آقایان.", status: "طبیعی" },
{ limit: Infinity, interpretation: "بالاتر از حد طبیعی برای آقایان (احتمال پلیسیتمی).", status: "بالا" }
],
female: [
{ limit: 12.0, interpretation: "پایینتر از حد طبیعی برای خانمها (احتمال کمخونی).", status: "پایین" },
{ limit: 15.5, interpretation: "در محدوده طبیعی برای خانمها.", status: "طبیعی" },
{ limit: Infinity, interpretation: "بالاتر از حد طبیعی برای خانمها (احتمال پلیسیتمی).", status: "بالا" }
]
},
normalRangeTextMale: "آقایان: 13.5-17.5 g/dL",
normalRangeTextFemale: "خانمها: 12.0-15.5 g/dL",
specialist: "پزشک عمومی، متخصص داخلی، متخصص خون (هماتولوژیست)"
},
hct: {
name: "هماتوکریت (HCT)",
briefExplanation: "درصد حجم خون که توسط گلبولهای قرمز اشغال شده است را نشان میدهد و در تشخیص کمخونی یا غلظت خون کاربرد دارد.",
unit: "%",
genderSpecificRanges: {
male: [
{ limit: 40, interpretation: "پایینتر از حد طبیعی برای آقایان (احتمال کمخونی).", status: "پایین" },
{ limit: 54, interpretation: "در محدوده طبیعی برای آقایان.", status: "طبیعی" },
{ limit: Infinity, interpretation: "بالاتر از حد طبیعی برای آقایان (احتمال پلیسیتمی یا دهیدراتاسیون).", status: "بالا" }
],
female: [
{ limit: 36, interpretation: "پایینتر از حد طبیعی برای خانمها (احتمال کمخونی).", status: "پایین" },
{ limit: 48, interpretation: "در محدوده طبیعی برای خانمها.", status: "طبیعی" },
{ limit: Infinity, interpretation: "بالاتر از حد طبیعی برای خانمها (احتمال پلیسیتمی یا دهیدراتاسیون).", status: "بالا" }
]
},
normalRangeTextMale: "آقایان: حدود 40-54%",
normalRangeTextFemale: "خانمها: حدود 36-48%",
specialist: "پزشک عمومی، متخصص داخلی، متخصص خون (هماتولوژیست)"
},
plt: {
name: "پلاکتها (Platelets - PLT)",
briefExplanation: "سلولهای کوچکی در خون هستند که به لخته شدن خون و جلوگیری از خونریزی کمک میکنند.",
unit: "x10³/µL", // or cells/µL; often reported as e.g., 150 for 150,000
ranges: [
{ limit: 150, interpretation: "پایینتر از حد طبیعی (ترومبوسیتوپنی)، ریسک خونریزی افزایش مییابد.", status: "پایین" },
{ limit: 450, interpretation: "در محدوده طبیعی.", status: "طبیعی" },
{ limit: Infinity, interpretation: "بالاتر از حد طبیعی (ترومبوسیتوز)، ریسک لخته شدن خون افزایش مییابد.", status: "بالا" }
],
normalRangeTextGeneral: "150,000-450,000/µL (یا 150-450 x10³/µL)",
specialist: "پزشک عمومی، متخصص داخلی، متخصص خون (هماتولوژیست)"
}
};
const pastelClasses = ['bg-pastel-1', 'bg-pastel-2', 'bg-pastel-3', 'bg-pastel-4', 'bg-pastel-5'];
function populateTestInputs() {
const container = document.getElementById('testInputsContainer');
container.innerHTML = '';
let colorIndex = 0;
// Iterate in the order defined in testData
Object.keys(testData).forEach(key => {
const test = testData[key];
const testInputDiv = document.createElement('div');
const pastelClass = pastelClasses[colorIndex % pastelClasses.length];
testInputDiv.classList.add('test-entry', 'flex', 'flex-col', 'sm:flex-row', 'sm:items-center', 'sm:justify-between', pastelClass);
testInputDiv.innerHTML = `
<div class="sm:w-2/5 mb-2 sm:mb-0">
<label for="testValue-${key}" class="block text-md font-medium text-gray-800">${test.name}</label>
<p class="text-xs text-gray-600 mt-1">${test.briefExplanation}</p>
</div>
<div class="flex items-center space-x-2 space-x-reverse w-full sm:w-3/5">
<input type="number" step="any" id="testValue-${key}" data-test-key="${key}" class="form-input test-value-input mt-1 block w-full py-2 px-3 border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm" placeholder="مقدار...">
<span class="text-sm text-gray-600 whitespace-nowrap min-w-[70px] text-left">${test.unit}</span>
</div>
`;
container.appendChild(testInputDiv);
colorIndex++;
});
}
window.onload = populateTestInputs;
function analyzeAllTests() {
const ageInput = document.getElementById('age').value;
const gender = document.getElementById('gender').value;
const resultArea = document.getElementById('resultArea');
resultArea.innerHTML = '';
let hasValues = false;
let hasErrors = false;
if (!ageInput || !gender) {
displayGlobalError("لطفاً سن و جنسیت را مشخص کنید. این اطلاعات برای تفسیر دقیقتر برخی آزمایشها ضروری است.");
return;
}
const age = parseInt(ageInput);
if (isNaN(age) || age <= 0 || age > 120) {
displayGlobalError("سن وارد شده معتبر نیست. لطفاً سن صحیح را وارد کنید.");
return;
}
const allInputs = document.querySelectorAll('.test-value-input');
allInputs.forEach(input => {
const testKey = input.getAttribute('data-test-key');
const testValueInput = input.value.trim();
if (testValueInput === '') {
return;
}
hasValues = true;
const testValue = parseFloat(testValueInput);
const currentTest = testData[testKey];
if (isNaN(testValue)) {
appendErrorCard(currentTest.name, `مقدار وارد شده نامعتبر است. لطفاً یک عدد صحیح وارد کنید.`);
hasErrors = true;
return;
}
if (!currentTest) {
appendErrorCard("خطای نامشخص", `اطلاعات مربوط به آزمایش با کلید ${testKey} یافت نشد.`);
hasErrors = true;
return;
}
let interpretation = "اطلاعات کافی برای تفسیر این مقدار وجود ندارد.";
let status = "نامشخص";
let rangesToUse = currentTest.ranges;
let normalRangeTextToDisplay = currentTest.normalRangeTextGeneral || "محدوده طبیعی مشخص نشده. لطفاً به برگه آزمایش خود مراجعه کنید.";
if (currentTest.genderSpecificRanges && gender) {
if (gender === 'male' && currentTest.genderSpecificRanges.male) {
rangesToUse = currentTest.genderSpecificRanges.male;
normalRangeTextToDisplay = currentTest.normalRangeTextMale || normalRangeTextToDisplay;
} else if (gender === 'female' && currentTest.genderSpecificRanges.female) {
rangesToUse = currentTest.genderSpecificRanges.female;
normalRangeTextToDisplay = currentTest.normalRangeTextFemale || normalRangeTextToDisplay;
}
}
if (rangesToUse) {
for (const range of rangesToUse) {
if (testValue < range.limit) {
interpretation = range.interpretation;
status = range.status;
break;
}
// Handle cases where value might be exactly on a limit or above last limit
if (range.limit === Infinity && testValue >= (rangesToUse[rangesToUse.length-2]?.limit || 0) ) {
interpretation = range.interpretation;
status = range.status;
}
}
} else { // Fallback if no ranges defined (should not happen with current data)
interpretation = "محدوده طبیعی برای این آزمایش و جنسیت مشخص نشده است.";
}
appendResultCard(currentTest, testValue, normalRangeTextToDisplay, status, interpretation);
});
if (!hasValues && !hasErrors) {
displayGlobalError("هیچ مقداری برای آزمایشها وارد نشده است. لطفاً حداقل یک مقدار را وارد کنید.");
}
if (hasValues || hasErrors) {
resultArea.style.display = 'block';
} else {
resultArea.style.display = 'none';
}
}
function appendResultCard(test, value, normalRange, status, interpretation) {
const resultArea = document.getElementById('resultArea');
const resultCard = document.createElement('div');
resultCard.classList.add('result-card');
resultCard.innerHTML = `
<h2 class="result-title">تحلیل نتیجه آزمایش: ${test.name}</h2>
<p class="brief-explanation-text mt-1 mb-2">${test.briefExplanation || ''}</p>
<div class="result-text mt-3 space-y-1">
<p><strong>مقدار وارد شده:</strong> ${value} ${test.unit}</p>
<p><strong>محدوده طبیعی مرجع (بر اساس جنسیت و آزمایشگاه):</strong> ${normalRange}</p>
<p><strong>وضعیت:</strong> <span class="font-semibold ${getStatusColor(status)}">${status}</span></p>
<p><strong>تفسیر اولیه:</strong> ${interpretation}</p>
<p><strong>پزشک متخصص مرتبط (جهت پیگیری در صورت نیاز):</strong> ${test.specialist || 'مشورت با پزشک عمومی توصیه میشود.'}</p>
</div>
`;
resultArea.appendChild(resultCard);
}
function appendErrorCard(testName, message) {
const resultArea = document.getElementById('resultArea');
const errorCard = document.createElement('div');
errorCard.classList.add('result-card', 'bg-red-50', 'border-red-300');
errorCard.innerHTML = `
<h2 class="result-title text-red-700">خطا در تحلیل آزمایش: ${testName}</h2>
<p class="result-text mt-2 text-red-600">${message}</p>
`;
resultArea.appendChild(errorCard);
}
function displayGlobalError(message) {
const resultArea = document.getElementById('resultArea');
resultArea.innerHTML = '';
resultArea.style.display = 'block';
const errorCard = document.createElement('div');
errorCard.classList.add('result-card', 'bg-red-100', 'border-red-400', 'text-red-700');
errorCard.innerHTML = `
<h2 class="result-title text-red-700">توجه</h2>
<p class="result-text mt-2">${message}</p>
`;
resultArea.appendChild(errorCard);
}
function getStatusColor(status) {
status = (status || "").toLowerCase();
if (status.includes("پایین") || status.includes("کمبود") || status.includes("بالا") || status.includes("ناکافی") || status.includes("مثبت") || status.includes("مشکوک") || status.includes("دیابت")) {
return "text-red-600";
} else if (status.includes("مرزی") || status.includes("پیشدیابت")) {
return "text-yellow-600";
} else if (status.includes("طبیعی") || status.includes("مطلوب") || status.includes("کافی") || status.includes("منفی")) {
return "text-green-600";
}
return "text-gray-700";
}
</script>
</body>
</html>
تحلیل هوشمند نتایج آزمایش پزشکی
سن و جنسیت خود را وارد کرده، سپس مقادیر آزمایشهای مورد نظر را تکمیل و دکمه تحلیل را بزنید.
سلب مسئولیت مهم: این ابزار صرفاً جنبه اطلاعرسانی اولیه دارد و به هیچ عنوان جایگزین تشخیص، توصیه و درمان پزشکی حرفهای نمیباشد. تفسیر نتایج آزمایشها پیچیده است و باید توسط پزشک متخصص و با در نظر گرفتن سوابق پزشکی کامل شما انجام شود. همیشه برای هرگونه تصمیمگیری درمانی به پزشک خود مراجعه کنید. محدودههای طبیعی ارائه شده در این ابزار عمومی هستند و ممکن است با محدودههای مرجع آزمایشگاه شما متفاوت باشند.