2025년 7월 23일 수요일

자살 등 html

 <!DOCTYPE html>


<html lang="ko">


<head>


  <meta charset="UTF-8" />


  <meta name="viewport" content="width=device-width, initial-scale=1" />


  <title>정신건강 및 자살예방 메뉴얼</title>


  <style>


    body { font-family: sans-serif; padding: 1rem; background-color: #f7f7f7; }


    .section { margin-bottom: 2rem; background: white; padding: 1rem; border-radius: 8px; box-shadow: 0 0 10px rgba(0,0,0,0.1); }


    input[type="radio"] { margin-right: 0.3rem; }


    label { margin-right: 1rem; cursor: pointer; }


    button {


  display: block;  /* ← 변경: 줄바꿈 되게 */


  margin: 0.3rem 0;


  padding: 0.4rem 1rem;


  cursor: pointer;


  border-radius: 4px;


  border: 1px solid #ccc;


  background-color: #eee;


}


    button.active, .flow-button.selected { background-color: #007BFF; color: white; border-color: #007BFF; }


    .sub-content { margin-top: 0.5rem; background: #eef; padding: 0.8rem; border-radius: 4px; }


    .detail-list { margin-left: 1rem; list-style: disc; padding-left: 1rem; }


    .flow-section { margin-top: 0.8rem; margin-left: 1rem; border-left: 3px solid #007BFF; padding-left: 1rem; background: #f0f8ff; border-radius: 4px; }


    .hidden { display: none; }


    .flow-button { margin: 0.3rem 0.5rem 0.3rem 0; padding: 0.5rem 1rem; border: 1px solid #ccc; background-color: #fff; cursor: pointer; border-radius: 5px; }


  </style>


</head>


<body>




<h1 style="font-size: 1.8rem; margin-bottom: 1rem;">정신질환자 등 처리절차</h1>




<div class="section">


  <h2>1. 해당 항목 선택</h2>


  <input type="radio" name="category" value="자의입원" id="self" />


  <label for="self">자의입원</label>




  <input type="radio" name="category" value="동의입원" id="consent" />


  <label for="consent">동의입원</label>




  <input type="radio" name="category" value="보호입원" id="guardian" />


  <label for="guardian">보호입원</label>




  <input type="radio" name="category" value="행정입원" id="admin" />


  <label for="admin">행정입원</label>




  <input type="radio" name="category" value="응급입원" id="emergency" />


  <label for="emergency">응급입원</label>


</div>




<div class="section hidden" id="procedure-section">


  <h2>2. 절차는~</h2>


  <div id="procedure-buttons"></div>


</div>




<div class="section hidden" id="checklist-section">


  <h2>3. 체크 등..</h2>


  <div id="checklist-buttons"></div>


</div>




<script>


  document.addEventListener('DOMContentLoaded', () => {


    const procedureSection = document.getElementById('procedure-section');


    const checklistSection = document.getElementById('checklist-section');


    const procedureButtonsDiv = document.getElementById('procedure-buttons');


    const checklistButtonsDiv = document.getElementById('checklist-buttons');


    let currentCategory = null;




    function formatText(text) {


    // Step 1: 블루/레드 마커를 임시 토큰으로 변환


      text = text


        .replace(/b(.*?)b/gs, '[[BLUE::$1]]')


        .replace(/r(.*?)r/gs, '[[RED::$1]]');




    // Step 2: HTML escape 처리


      text = text


       .replace(/&/g, "&amp;")


       .replace(/</g, "&lt;")


       .replace(/>/g, "&gt;")


       .replace(/"/g, "&quot;")


       .replace(/'/g, "&#039;")


       .replace(/\/\//g, '<br>');




    // Step 3: 토큰을 다시 스타일 태그로 변환


      text = text


       .replace(/\[\[BLUE::(.*?)\]\]/gs, '<span style="color:blue;">$1</span>')


       .replace(/\[\[RED::(.*?)\]\]/gs, '<span style="color:red;">$1</span>');




      return text;


    }




    const data = {


      "자의입원": {


        "절차": ["전문의 면담", "자의입원 신청", "입원", "퇴원신청", "퇴원"],


        "핵심체크": ["입원대상자","입원신청 등 주체","병원의무사항"],


        "절차내용": {


          "전문의 면담": ["정신질환자 본인"],


          "자의입원 신청": ["전문의와 면담 후 정신질환자 본인의 자필로 자의입원 신청서를 작성 제출"],


          "퇴원신청": ["입원기간 중 환자 본인의 퇴원 신청"],


          "퇴원": ["정신의료기관등의 장은 지체 없이 퇴원시켜야 한다"]


        },


        "핵심체크내용": {


          "입원대상자": ["정신질환자나 그 밖에 정신건강상 문제가 있는 사람"],

      

          "입원신청 등 주체": ["환자 본인의 입원 신청"],


          "병원의무사항": ["2개월 마다 환자의 퇴원의사를 확인"]


        }


      },


      "동의입원": {


        "절차": ["전문의 면담", "동의입원 신청", "입원", "퇴원 신청", "보호의무자 퇴원 동의 여부"],


        "핵심체크": ["입원대상자", "입원신청 등 주체",],


        "절차내용": {


          "전문의 면담": ["정신질환자 본인"],


          "동의입원 신청": ["전문의와 면담 후 입원 권고를 받으면 보호의무자의 동의를 받아 환자가 자필로 동의입원 신청서 작성"],


          "퇴원 신청": ["환자 본인이 신청"],


          "보호의무자 퇴원 동의 여부": ["환자 본인이 퇴원을 원하지만 보호의무자가 퇴원에 동의하지 않고 // 의사가 계속적인 치료가 필요하다고 판단할 경우에는 // 다른 유형의 입원(보호입원·행정입원)으로 전환될 수 있다."]


        },


        "핵심체크내용": {


          "입원대상자": ["정신질환자"],

          "입원신청 등 주체": ["환자 본인의 입원 신청 + 보호의무자 1인 동의"],


        }


      },


      "보호입원": {


        "절차": ["전문의 진단 및 입원결정", "보호입원 신청", "2주 이내에 다른 정신건강의학과 전문의 추가 소견","입원유지","입원적합성심사","입원유지 및 연장"],


        "핵심체크": ["입원대상자","입원신청 등 주체",],


        "절차내용": {


          "보호입원 신청": ["정신질환자를 대면진단 한 후 r보호의무자 2인r의 b자필b로 '보호입원 등 신청서'를 증빙서류와 함께 제출"],


          "2주 이내에 다른 정신건강의학과 전문의 추가 소견": ["입원 후 2주 내 r다른r 정신건강의료기관 소속의 전문의 소견을 추가로 받아야 b입원이 유지b(2명의 의사 소견이 b일치하지 않으면b r퇴원r)"],


          "입원적합성심사": ["입원 시 권리고지를 받을 때 입원적합성심사 대면조사를 신청하면 조사원과 대면조사 실시됨. // 입원적합성심사는 입원일로부터 1개월 이내에 완료(부적합시 퇴원)."],


          "입원유지 및 연장":["입원 기간을 연장하기 위해서 정신건강심사위원회의 심사"]


        },


        "핵심체크내용": {


          "입원대상자": ["입원치료 또는 요양을 받을 만한 정도 또는 성질의 정신질환을 앓고 있는 경우//자신의 건강 또는 안전이나 다른 사람에게 해를 끼칠 위험이 있어 입원등을 할 필요가 있는 경우"],


          "입원신청 등 주체": ["보호의무자 2인 이상 신청(단, 보호의무자가 1인만 있는 경우 1인으로 함"],

        }


      },


       "행정입원": {


        "절차": ["진단 및 보호신청", "전문의 진단", "행정입원개시","2주 이내에 2명의 정신건강의학과 전문의 소견 확인","입원유지","입원적합성심사","입원유지 및 연장"],


        "핵심체크": ["입원대상자", "입원신청 등 주체"],


        "절차내용": {


          "진단 및 보호신청": ["발견한 경찰관 등(보건소에 의뢰)"],


          "전문의 진단": ["입원이 필요한 진단을 내린 경우 특별시장 등은 지정정신의료기관에 정신질환자 입원을 의뢰// 의뢰받은 병원에서 행정입원이 개시됨"],


          "2주 이내에 2명의 정신건강의학과 전문의 소견 확인":["2명의 정신건강의학과 전문의 소견 불일치 경우 퇴원"],


          "입원유지": ["소견 일치한 경우 입원유지"],


          "입원적합성심사": ["입원 시 권리고지를 받을 때 입원적합성심사 대면조사를 신청하면 조사원과 대면조사 실시됨.//입원적합성심사는 입원일로부터 1개월 이내에 완료(부적합시 퇴원)."],


          "입원유지 및 연장": ["특별시장 등은 3개월 이내에 정신질환자의 행정 입원을 해제//입원 기간을 연장하기 위해서 정신건강심사위원회의 심사"],


        },


        "핵심체크내용": {


          "입원대상자": ["자신의 건강 또는 안전이나 다른 사람에게 해를 끼칠 위험이 있다고 의심되는 사람// 시간적 긴급r(X)r"],

          "입원신청 등 주체": ["지자체장의 행정입원 의뢰//경찰관은 지자체장에게 진단과 보호를 신청//진단을 위한 행정입원(2주 이내) 및 치료를 위한 행정입원(3개월 이내)"],


        }


      },


       "응급입원": {


        "절차": ["응급입원의뢰", "3일간 응급입원 및 전문의 진단", "입원필요성 및 입원유형전환"],


        "핵심체크": ["입원대상자","입원신청 등 주체","서울청 정신응급 합동대응센터","정신질환자 치료연계 협업병원","주취자 응급의료센터 연락처","입원적합성심사위원회 설치기관","자살시도자 절차","자살시도자 사후관리"],


        "절차내용": {


          "응급입원의뢰": ["정신질환자로 추정되는 사람 + //자신의 건강 또는 안전이나 다른 사람에게 해를 끼칠 위험이 큰 사람 + //상황이 매우 급박하여 보호입원 등(제41조부터 제44조)까지의 규정에 따른 입원등을// 시킬 시간적 여유가 없을 때//의사와 경찰관(r2r인)의 동의"],


          "3일간 응급입원 및 전문의 진단": ["정신의료기관의 장은 응급입원이 의뢰된 환자를 3일 이내의 기간 동안 입원 시킬 수 있음// 위 기간 지체 없이 정신건강의학과전문의 증상을 진단"],


          "입원필요성 및 입원유형전환":["진단 결과 자신의 건강 또는 안전이나 다른 사람에게 해를 끼칠 위험이 있어//계속하여 입원할 필요가 있다고 인정된 경우에는// 제41조부터 제44조까지의 규정에 따라 입원을 할 수 있도록 필요한 조치//(입원할 필요가 없다고 인정된 경우에는 즉시 퇴원)"],


        },


        "핵심체크내용": {


          "입원대상자": ["- 정신질환자로 추정되는 사람//- b자 타의 위협b//- r시간적 긴급r"],


          "입원신청 등 주체": ["입원대상자를 발견한 사람(경찰관)이 경찰관과 의사의 동의를 받아 의뢰//의사는 정신건강의학과전문의가 아니어도 됨//"],


          "서울청 정신응급 합동대응센터":["-연락처: 02-700-2912/3//- 야간, 휴일(17:30~익일 08:30)- 현장경찰 지원 요청시 현장출동 전담 처리//- 주간, 평일: 코칭, 병상정보, 이송지원(현장경찰 응급입원 이송 후 복귀했으나 병상이 없어 타병원 재이송이 필요한 경우 현정경찰 대신 재이송 업무도 처리) "],


          "정신질환자 치료연계 협업병원":["서울아산병원  1688-7575 응급입원가능시간 24시//보라매병원 02-700-2959 응급입원가능시간 24시//서울의료원 02-700-2958 응급입원가능시간 24시//국립정신건강센터 02-2204-0231 응급입원가능시간 24시//r은평시립병원 02-300-8117-9r 응급입원가능시간 월-목 09:00~16:00//마인드웰병원 02-433-1195 응급입원가능시간 24시//김포다은병원 031-996-1338 응급입원가능시간 24시//송파미소병원 02-1661-9299 응급입원가능시간 평일 09:00~17:30, (토)10:00~13:30//연세서울병원 031-907-9920 응급입원가능시간 24시//W진병원 1577-1581 응급입원가능시간 24시//연세하늘병원 031-836-7341 응급입원가능시간 평일 10:00~16:30, (토)10:00~12:00//힐링스병원 031-853-9222 응급입원가능시간 24시//베이직병원 02-990-2999 응급입원가능시간 평일 09:30~17:30, (토)09:00~12:00//지혜병원 02-6279-0129 응급입원가능시간 평일 08:30~18:30, (토)08:30~15:00//r혜상병원 02-844-6119r 응급입원가능시간 평일 09:00~22:00 (토) 09:00~22:00//부천사랑병원 032-678-0114 응급입원가능시간 24시//화정병원 031-979-7572 응급입원가능시간 평일 09:00~17:00//r루카스병원 032-310-0100r 응급입원가능시간 평일 09:00~19:00, 주말 09:00~19:00//건국대학병원 02-2030-5555 응급입원가능시간 24시//명병원 02-965-2800 응급입원가능시간 평일 09:00~21:00 주말 09:00~21:00//r구로다나병원 02-2613-8001r 응급입원가능시간 평일 09:30~20:00, 주말 09:30~20:00//라엘마음병원 031-978-5454 평일 09:30~17:00//휴엔병원 031-753-1000 응급입원가능시간 09:00~17:00//멘토스병원 02-2214-5100 응급입원가능시간 24시//r강서필병원 02-2608-8855r 응급입원가능시간 평일 09:30~22:00//성지병원 02-867-7056 응급입원가능시간 10:00~1700//r글로리 병원 032-262-9000r 응급입원가능시간 24시, 18세 이상//r삼정병원 032-543-7530r 응급입원가능시간 22시~05 X)"],

          

          "주취자 응급의료센터 연락처":["보라매병원 02-700-2959, 010-6572-8997// 서울의료원 02-700-2958, 010-7489-2482// 국립의료원 02-700-2957, 010-3016-9783//적십자병원 02-700-2977, 010-7489-0980//동부시립병원 "],


          "입원적합성심사위원회 설치기관":["국립정신건강센터 02-2204-0156(0043, 0046, 0047)"],


          "자살시도자 절차":["응급입원 절차에 따라 입원//"],


          "자살시도자 사후관리":["- b자살시도자 등에게b관할 구역 안에 있는 b관계 지원기관(자살예방센터 및 정신건강복지센터)에 관한 정보를 제공b(자살시도자 등의 r동의 필요 없음r)(서면, 전자우편 또는 휴대폰메시지)//- 자살시도자등의 정보(강제 또는 무리한 수집 지양)를 관할 구역 내 다음 각 호의 기관에 제공(b'자살시도자 등 개인정보 제공내역서' (생활질서계 통보))b"]


        }


      },


    };






    for (const category in data) {


      const 절차내용 = data[category].절차내용;


      const 핵심체크내용 = data[category].핵심체크내용;




      for (const key in 절차내용) {


        절차내용[key] = 절차내용[key].map(formatText);


      }




      for (const key in 핵심체크내용) {


        핵심체크내용[key] = 핵심체크내용[key].map(formatText);


      }


    }




    function createContent(category, key, section) {


      const container = document.createElement('div');


      container.className = 'sub-content';




      let items = [];


      if (section === "절차") {


        items = data[category]?.절차내용?.[key] || [];


      } else if (section === "핵심체크") {


        items = data[category]?.핵심체크내용?.[key] || [];


      }




      if (items.length === 0 && key !== "보호의무자 퇴원 동의 여부") return container;




      if (key === "보호의무자 퇴원 동의 여부") {


        const flow = document.createElement('div');


        flow.className = 'flow-section';


        flow.innerHTML = `<strong>보호의무자 퇴원 동의 여부</strong>`;




        if (items.length > 0) {


          const descUl = document.createElement('ul');


          descUl.className = 'detail-list';


          items.forEach(item => {


            const li = document.createElement('li');


            li.innerHTML = item;


            descUl.appendChild(li);


          });


          flow.appendChild(descUl);


        }




        const agreeBtn = createButton("동의함", () => {


          agreeBtn.classList.add("selected");


          disagreeBtn.classList.remove("selected");


          removeFlowBelow(flow);


          const result = document.createElement('div');


          result.className = 'flow-section';


          result.innerHTML = `<strong>→ 퇴원</strong>`;


          flow.appendChild(result);


        });




        const disagreeBtn = createButton("동의하지 않음", () => {


          disagreeBtn.classList.add("selected");


          agreeBtn.classList.remove("selected");


          removeFlowBelow(flow);




          const step2 = document.createElement('div');


          step2.className = 'flow-section';


          step2.innerHTML = `<strong>→ 의사 치료 필요성 여부 의견</strong>`;




          const docAgree = createButton("치료 필요 없음 의견", () => {


            docAgree.classList.add("selected");


            docDisagree.classList.remove("selected");


            removeFlowBelow(step2);


            const result = document.createElement('div');


            result.className = 'flow-section';


            result.innerHTML = `<strong>→ 퇴원</strong>`;


            step2.appendChild(result);


          });




          const docDisagree = createButton("치료 필요 의견", () => {


            docDisagree.classList.add("selected");


            docAgree.classList.remove("selected");


            removeFlowBelow(step2);


            const result = document.createElement('div');


            result.className = 'flow-section';


            result.innerHTML = `<strong>→ 퇴원거부(72시간), 입원형태(보호입원, 행정입원) 전환</strong>`;


            step2.appendChild(result);


          });




          step2.appendChild(document.createElement("br"));


          step2.appendChild(docAgree);


          step2.appendChild(docDisagree);


          flow.appendChild(step2);


        });




        flow.appendChild(document.createElement("br"));


        flow.appendChild(agreeBtn);


        flow.appendChild(disagreeBtn);


        container.appendChild(flow);


        return container;


      }




      const ul = document.createElement('ul');


      ul.className = 'detail-list';


      items.forEach(item => {


        const li = document.createElement('li');


        li.innerHTML = item;


        ul.appendChild(li);


      });


      container.appendChild(ul);


      return container;


    }




    function toggleActive(button, container) {


      const buttons = container.querySelectorAll('button');


      buttons.forEach(btn => btn.classList.remove('active'));


      button.classList.add('active');


    }




    function createButton(text, onClick) {


      const btn = document.createElement("button");


      btn.textContent = text;


      btn.className = "flow-button";


      btn.onclick = onClick;


      return btn;


    }




    function removeFlowBelow(container) {


      const flows = Array.from(container.children).filter(el => el.classList?.contains('flow-section'));


      flows.forEach(el => el.remove());


    }




    document.querySelectorAll('input[name="category"]').forEach(radio => {


      radio.addEventListener('change', () => {


        currentCategory = radio.value;


        procedureButtonsDiv.innerHTML = '';


        checklistButtonsDiv.innerHTML = '';


        procedureSection.classList.remove('hidden');


        checklistSection.classList.remove('hidden');




        if (!data[currentCategory]) return;




        data[currentCategory].절차.forEach(proc => {


          const btn = document.createElement('button');


          btn.textContent = proc;


          btn.addEventListener('click', () => {


            toggleActive(btn, procedureButtonsDiv);


            const existing = procedureButtonsDiv.querySelector('.sub-content');


            if (existing) existing.remove();


            const content = createContent(currentCategory, proc, "절차");


            btn.insertAdjacentElement('afterend', content);


          });


          procedureButtonsDiv.appendChild(btn);


        });




        data[currentCategory].핵심체크.forEach(check => {


          const btn = document.createElement('button');


          btn.textContent = check;


          btn.addEventListener('click', () => {


            toggleActive(btn, checklistButtonsDiv);


            const existing = checklistButtonsDiv.querySelector('.sub-content');


            if (existing) existing.remove();


            const content = createContent(currentCategory, check, "핵심체크");


            btn.insertAdjacentElement('afterend', content);


          });


          checklistButtonsDiv.appendChild(btn);


        });


      });


    });


  });


</script>




</body>


</html>

댓글 없음:

댓글 쓰기