OneToOneQnaDetailForm.html 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486
  1. <!DOCTYPE html>
  2. <html lang="ko"
  3. xmlns:th="http://www.thymeleaf.org">
  4. <!--
  5. *******************************************************************************
  6. * @source : OneToOneQnaDetailForm.html
  7. * @desc : 1:1문의 상세 팝업 Page
  8. *============================================================================
  9. * STYLE24
  10. * Copyright(C) 2020 TSIT, All rights reserved.
  11. *============================================================================
  12. * VER DATE AUTHOR DESCRIPTION
  13. * === =========== ========== =============================================
  14. * 1.0 2020.12.24 gagamel 최초 작성
  15. *******************************************************************************
  16. -->
  17. <div class="modelessPopup draggable" data-width="1200" data-height="900" id="popupOneToOneQnaDetail">
  18. <div class="panelStyle">
  19. <!-- TITLE -->
  20. <div class="panelTitle">
  21. <strong>1:1문의 상세</strong>
  22. <button type="button" class="close" onclick="uifnPopupClose('popupOneToOneQnaDetail');"><em class="fa fa-times"></em></button>
  23. </div>
  24. <!-- //TITLE -->
  25. <!-- CONTENT -->
  26. <div class="panelContent" style="height:90%; overflow-y:auto; padding-right: 10px !important;">
  27. <form id="qnaDetailForm" name="qnaDetailForm" action="#" th:action="@{'/customer/qna/answer/save'}" th:method="post" th:object="${counselInfo}">
  28. <input type="hidden" name="counselSq" th:value="*{counselSq}"/>
  29. <input type="hidden" name="smsReqYn" th:value="*{smsReqYn}"/>
  30. <input type="hidden" name="counselType" value="C"/>
  31. <h4>상담정보</h4>
  32. <table class="tableStyle" aria-describedby="상담정보">
  33. <colgroup>
  34. <col style="width:10%;"/>
  35. <!-- <col style="width:10%;"/> -->
  36. <col style="width:12%;"/>
  37. <col style="width:15%;"/>
  38. <col/>
  39. <!-- <col style="width:10%;"/> -->
  40. <!-- <col style="width:10%;"/> -->
  41. <col style="width:30%;"/>
  42. </colgroup>
  43. <thead>
  44. <tr>
  45. <th>상담일련번호</th>
  46. <!-- <th>사이트</th> -->
  47. <th>상담분류</th>
  48. <th>문의일시</th>
  49. <th>고객정보</th>
  50. <!-- <th>주문번호</th> -->
  51. <!-- <th>답변의뢰</th> -->
  52. <th>답변상태</th>
  53. </tr>
  54. </thead>
  55. <tbody id="otoQnaCounselInfo">
  56. <tr>
  57. <td th:text="*{counselSq}"></td>
  58. <!-- <td th:text="*{siteNm}"></td> -->
  59. <td th:utext="*{counselClsfNm}"></td>
  60. <td th:text="*{questDt}"></td>
  61. <!-- <td><a href="javascript:void(0);" th:onclick="|cfnOpenCustDetailPopup(*{custNo});|"><span th:utext="*{maskingCustNm + ' / ' + maskingCellPhnno + ' / ' + maskingEmail}"></span></a></td> -->
  62. <td th:utext="*{maskingCustNm + ' / ' + maskingCellPhnno + ' / ' + maskingEmail}"></td>
  63. <!-- <td th:text="*{relOrdNo}"></td> -->
  64. <!-- <td th:utext="*{ansTransYn == 'Y' ? ansTransDt + '<br/>' + ansCompNm : ''}"></td> -->
  65. <td th:utext="*{ansStat == 'G060_20' ? ansStatNm + ' / ' + ansDt + ' / ' + ansNm : ansStatNm}"></td>
  66. </tr>
  67. </tbody>
  68. </table>
  69. <h4>고객문의</h4>
  70. <table class="frmStyle" aria-describedby="고객문의">
  71. <colgroup>
  72. <col style="width:10%;"/>
  73. <col style="width:50%;"/>
  74. <col style="width:10%;"/>
  75. <col/>
  76. </colgroup>
  77. <tbody>
  78. <tr>
  79. <th>문의 제목</th>
  80. <td th:text="*{questTitle}" id="otoQnaQuestTitle"></td>
  81. <th>SMS답변요청</th>
  82. <td th:text="*{smsReqYn == 'Y' ? '수신' : '미수신'}" id="otoQnaSmsReqYn"></td>
  83. </tr>
  84. <tr>
  85. <th>문의 내용</th>
  86. <td>
  87. <textarea class="textareaR4" style="resize: none;" name="questContent" th:text="*{questContent}" disabled="disabled"></textarea>
  88. </td>
  89. <th>첨부 이미지</th>
  90. <td class="userImg" id="otoQnaUserImg">
  91. <img th:if="${counselInfo.sysFileNm1 != null}" style="height: 100px;" th:src="${@environment.getProperty('domain.image') + '/' + counselInfo.sysFileNm1}" onclick="fnPopupOpen('layer_review_pic', this);" alt="" onerror='this.src="/image/no.png"'/>
  92. <img th:if="${counselInfo.sysFileNm2 != null}" style="height: 100px;" th:src="${@environment.getProperty('domain.image') + '/' + counselInfo.sysFileNm2}" onclick="fnPopupOpen('layer_review_pic', this);" alt="" onerror='this.src="/image/no.png"'/>
  93. </td>
  94. </tr>
  95. </tbody>
  96. </table>
  97. <h4>답변등록</h4>
  98. <table class="frmStyle" aria-describedby="답변등록">
  99. <colgroup>
  100. <col style="width:10%;"/>
  101. <col style="width:90%;"/>
  102. </colgroup>
  103. <tbody>
  104. <tr>
  105. <th>답변 템플릿</th>
  106. <td>
  107. <select name="ansSq">
  108. <option value="">[선택]</option>
  109. <option th:if="${ansPhaseList}" th:each="oneData, statue : ${ansPhaseList}" th:value="${oneData.cd}" th:text="${oneData.cdNm}"></option>
  110. </select>
  111. </td>
  112. </tr>
  113. <tr>
  114. <th>답변 제목<i class="required" title="필수" aria-hidden="true"></i></th>
  115. <td>
  116. <input type="text" class="" name="ansTitle" th:value="*{ansTitle}" required="required" data-valid-name="답변 제목"/>
  117. </td>
  118. </tr>
  119. <tr>
  120. <th>
  121. 답변 내용<i class="required" title="필수" aria-hidden="true"></i>
  122. <br/>
  123. <span id="dpLocAnsContent">0</span>/4,000Byte
  124. </th>
  125. <td>
  126. <textarea class="textareaR15" style="resize: none;" name="ansContent" th:text="*{ansContent}" onkeyup="cfnGetTextLength(this, 4000, $('#dpLocAnsContent'));" required="required" data-valid-name="답변 내용"></textarea>
  127. </td>
  128. </tr>
  129. </tbody>
  130. </table>
  131. <h4>상담사 할당</h4>
  132. <table class="frmStyle" aria-describedby="상담사 할당">
  133. <colgroup>
  134. <col style="width:10%;"/>
  135. <col style="width:40%;"/>
  136. <col style="width:10%;"/>
  137. <col style="width:40%;"/>
  138. </colgroup>
  139. <tbody>
  140. <tr>
  141. <th>상담사</th>
  142. <td>
  143. <select name="assignedCsNo" th:if="${sessionInfo.roleCd == 'G001_A300' or sessionInfo.roleCd == 'G001_0000' or sessionInfo.roleCd == 'G001_A000'}">
  144. <option value="">[상담사 선택]</option>
  145. <option th:if="${counselorList}" th:each="oneData, status : ${counselorList}" th:value="${oneData.cd}" th:text="|${oneData.cdNm}|" th:selected="${#strings.equals(counselInfo.assignedCsNo, oneData.cd)}"></option>
  146. </select>
  147. <button type="button" class="btn btn-warning btn-lg" id="btnAssignCounselor">담당할당</button>
  148. </td>
  149. <th>할당자</th>
  150. <td th:if="${counselInfo.assignerNm != null}" th:utext="${counselInfo.assignerNm + ' / ' + counselInfo.assignedDt}" id="assignerNm"></td>
  151. <td th:if="${counselInfo.assignerNm == null}" id="assignerNm"></td>
  152. </tr>
  153. </tbody>
  154. </table>
  155. </form>
  156. <h4>1:1문의 이력</h4>
  157. <div id="custOneToOneCounselList" style="width: 100%; height: 300px" class="ag-theme-balham"></div>
  158. </div>
  159. <!-- //CONTENT -->
  160. <!-- 버튼 배치 영역 -->
  161. <ul class="panelBar">
  162. <li class="right">
  163. <button type="button" class="btn btn-gray btn-lg" id="btnSaveTemp">임시저장</button>
  164. <button type="button" class="btn btn-info btn-lg" id="btnSaveAnswer">답변저장</button>
  165. </li>
  166. </ul>
  167. <!-- //버튼 배치 영역 -->
  168. </div>
  169. </div>
  170. <!-- 사용자 레이어팝업 : 등록 파일 출력 -->
  171. <div class="uPopupWrap off" id="layer_review_pic">
  172. <div class="area reviewPic" style="width:700px; height:700px;">
  173. <ul class="picList" th:object="${counselInfo}" id="otoQnaLayerReviewPic">
  174. <!-- <li><div class="img"></div></li> -->
  175. <li th:if="${counselInfo.sysFileNm1 != null}"><div class="img" th:style="${'background-image:url(' + @environment.getProperty('domain.image') + '/' + counselInfo.sysFileNm1 + ');'}"></div></li>
  176. <li th:if="${counselInfo.sysFileNm2 != null}"><div class="img" th:style="${'background-image:url(' + @environment.getProperty('domain.image') + '/' + counselInfo.sysFileNm2 + ');'}"></div></li>
  177. </ul>
  178. <!-- <button type="button" class="btnArr prev" onclick="fnPicPrev('layer_review_pic');">이전</button> -->
  179. <!-- <button type="button" class="btnArr next" onclick="fnPicNext('layer_review_pic');">다음</button> -->
  180. <button type="button" id="prev" class="btnArr prev">이전</button>
  181. <button type="button" id="next" class="btnArr next">다음</button>
  182. <button type="button" class="btnClose">닫기</button>
  183. </div>
  184. </div>
  185. <!-- //사용자 레이어팝업 : 등록 파일 출력 -->
  186. <script th:inline="javascript">
  187. /*<![CDATA[*/
  188. let counselClsfList = gagajf.convertToArray([[${counselClsfList}]]); // 상담분류
  189. let ansStatList = gagajf.convertToArray([[${ansStatList}]]); // 답변상태
  190. const columnOneToOneCounselDefs = [
  191. { headerName: "상담일련번호", field: "counselSq", width: 100, cellClass: 'text-center' },
  192. {
  193. headerName: "상담분류", field: "counselClsf", width: 150, cellClass: 'text-center',
  194. valueFormatter: function (params) { return gagaAgGrid.lookupValue(counselClsfList, params.value); }
  195. },
  196. {
  197. headerName: "문의일시", field: "questDt", width: 150, cellClass: 'text-center',
  198. cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }
  199. },
  200. {
  201. headerName: "문의제목", field: "questTitle", width: 380,
  202. cellRenderer: function (params) { return '<a href="javascript:void(0);">' + params.value + '</a>'; }
  203. },
  204. { headerName: "상담사", field: "assignedCsNm", width: 90, cellClass: 'text-center' },
  205. {
  206. headerName: "답변상태", field: "ansStat", width: 90, cellClass: 'text-center',
  207. valueGetter: function (params) { return gagaAgGrid.lookupValue(ansStatList, params.data.ansStat); }
  208. },
  209. {
  210. headerName: "답변일시", field: "ansDt", width: 150, cellClass: 'text-center',
  211. cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }
  212. }
  213. ];
  214. let gridOneToOneCounselOptions = gagaAgGrid.getGridOptions(columnOneToOneCounselDefs); // 1:1문의이력
  215. // 셀 클릭 이벤트
  216. gridOneToOneCounselOptions.onCellClicked = function(event) {
  217. if (event.colDef.field == 'questTitle') {
  218. fnSetOneToOneQnaDetail(event.data.counselSq);
  219. }
  220. }
  221. // 1:1문의 상세 데이터 설정
  222. var fnSetOneToOneQnaDetail = function(counselSq) {
  223. const actionUrl = 'customer/onetoone/qna/detail/' + counselSq;
  224. $.getJSON(actionUrl
  225. , function(result) {
  226. $('#qnaDetailForm input[name=counselSq]').val(result.counselSq);
  227. $('#qnaDetailForm input[name=smsReqYn]').val(result.smsReqYn);
  228. let tag = '';
  229. tag += '<tr>\n';
  230. tag += ' <td>' + result.counselSq + '</td>\n';
  231. tag += ' <td>' + result.counselClsfNm + '</td>\n';
  232. tag += ' <td>' + result.questDt + '</td>\n';
  233. tag += ' <td>' + result.maskingCustNm + ' / ' + result.maskingCellPhnno + ' / ' + result.maskingEmail + '</td>\n';
  234. tag += ' <td>' + (result.ansStat == "G060_20" ? (result.ansStatNm + ' / ' + result.ansDt + ' / ' + result.ansNm) : result.ansStatNm) + '</td>\n';
  235. tag += '</tr>\n';
  236. $('#otoQnaCounselInfo').html(tag);
  237. $('#otoQnaQuestTitle').html(result.questTitle.replaceXSS());
  238. $('#otoQnaSmsReqYn').html((result.smsReqYn == "Y" ? "수신" : "미수신"));
  239. $('#qnaDetailForm textarea[name=questContent]').val(result.questContent.replaceXSS());
  240. tag = '';
  241. if (!gagajf.isNull(result.sysFileNm1)) {
  242. tag += '<img style="height: 100px;" src="' + _imgUrl + '/' + result.sysFileNm1 + '" onclick=\"fnPopupOpen(\'layer_review_pic\', this);\" alt=\"\" onerror=\'this.src=\"/image/no.png\"\'/>\n';
  243. }
  244. if (!gagajf.isNull(result.sysFileNm2)) {
  245. tag += '<img style="height: 100px;" src="' + _imgUrl + '/' + result.sysFileNm2 + '" onclick=\"fnPopupOpen(\'layer_review_pic\', this);\" alt=\"\" onerror=\'this.src=\"/image/no.png\"\'/>\n';
  246. }
  247. $('#otoQnaUserImg').html(tag);
  248. tag = '';
  249. if (!gagajf.isNull(result.sysFileNm1)) {
  250. tag += '<li><div class="img" style=\"background-image:url(' + _imgUrl + '/' + result.sysFileNm1 + ');\"></div></li>\n';
  251. }
  252. if (!gagajf.isNull(result.sysFileNm2)) {
  253. tag += '<li><div class="img" style=\"background-image:url(' + _imgUrl + '/' + result.sysFileNm2 + ');\"></div></li>\n';
  254. }
  255. $('#otoQnaLayerReviewPic').html(tag);
  256. $('#qnaDetailForm input[name=ansTitle]').val(result.ansTitle.replaceXSS());
  257. $('#qnaDetailForm textarea[name=ansContent]').val(result.ansContent.replaceXSS());
  258. cfnGetTextLength($('textarea[name=ansContent]'), 4000, $('#dpLocAnsContent'));
  259. $('#qnaDetailForm select[name=assignedCsNo]').val(result.assignedCsNo);
  260. $('#assignerNm').html(gagajf.isNull(result.assignerNm) ? '' : (result.assignerNm + ' / ' + result.assignedDt));
  261. fnShowOrHideOneToOneQnaButton(result.ansStat);
  262. });
  263. }
  264. // 담당할당
  265. $('#btnAssignCounselor').on('click', function() {
  266. if (gagajf.isNull($('#qnaDetailForm select[name=assignedCsNo]').val())) {
  267. mcxDialog.alertC('상담사를 선택해 주세요.', {
  268. sureBtnText: "확인",
  269. sureBtnClick: function() {
  270. $('#qnaDetailForm select[name=assignedCsNo]').focus();
  271. }
  272. });
  273. return;
  274. }
  275. mcxDialog.confirm("담당을 할당하시겠습니까?", {
  276. cancelBtnText: "취소",
  277. sureBtnText: "확인",
  278. sureBtnClick: function() {
  279. var jsonData = JSON.stringify({
  280. counselSq : $('#qnaDetailForm input[name=counselSq]').val(),
  281. assignedCsNo : $('#qnaDetailForm select[name=assignedCsNo]').val()
  282. });
  283. gagajf.ajaxJsonSubmit('/customer/onetoone/qna/assign', jsonData, function() {
  284. let assignerNm = [[${sessionInfo.userNm}]] + ' / ' + new Date().format("YYYY-MM-DD HH:mm:ss");
  285. $('#assignerNm').html(assignerNm);
  286. fnSearchOneToOneCustomerHistory();
  287. });
  288. }
  289. });
  290. });
  291. // 임시 저장
  292. $('#btnSaveTemp').on('click', function() {
  293. mcxDialog.confirm("임시로 저장하시겠습니까?", {
  294. cancelBtnText: "취소",
  295. sureBtnText: "확인",
  296. sureBtnClick: function() {
  297. gagajf.ajaxFormSubmit('/customer/qna/answer/temp/save', '#qnaDetailForm', function() {
  298. uifnPopupClose('popupOneToOneQnaDetail');
  299. $('#btnSearch').trigger('click');
  300. });
  301. }
  302. });
  303. });
  304. // 답변 저장
  305. $('#btnSaveAnswer').on('click', function() {
  306. // 입력 값 체크
  307. if (!gagajf.validation('#qnaDetailForm'))
  308. return false;
  309. mcxDialog.confirm("저장하시겠습니까?", {
  310. cancelBtnText: "취소",
  311. sureBtnText: "확인",
  312. sureBtnClick: function() {
  313. gagajf.ajaxFormSubmit($('#qnaDetailForm').prop('action'), '#qnaDetailForm', function() {
  314. uifnPopupClose('popupOneToOneQnaDetail');
  315. $('#btnSearch').trigger('click');
  316. });
  317. }
  318. });
  319. });
  320. // 답변템플릿 선택 시
  321. $('select[name=ansSq]').on('change', function() {
  322. var ansSq = $(this).val();
  323. if (!gagajf.isNull(ansSq)) {
  324. var actionUrl = '/customer/qna/answerphase/' + ansSq + '/G061_20';
  325. $.get(actionUrl
  326. , function(data) {
  327. if (!gagajf.isNull(data.ansSq)) {
  328. $('input[name=ansTitle]').val(data.ansTitle);
  329. $('textarea[name=ansContent]').val(data.ansContent);
  330. cfnGetTextLength($('textarea[name=ansContent]'), 4000, $('#dpLocAnsContent'));
  331. }
  332. });
  333. } else {
  334. // 답변 내용 초기화
  335. $('input[name=ansTitle]').val('');
  336. $('textarea[name=ansContent]').val('');
  337. cfnGetTextLength($('textarea[name=ansContent]'), 4000, $('#dpLocAnsContent'));
  338. }
  339. });
  340. // 팝업 열기
  341. function fnPopupOpen(id,el,kind) {
  342. $("#"+id).removeClass("off"); //레이어 Open
  343. $("#"+id).find(".picList li").removeClass("on");
  344. $(".picList").find("div").attr("style","background-image:url("+el.src+")");
  345. let onIdx = $(el).index();
  346. $("#"+id).find(".picList li").eq(onIdx).addClass("on");
  347. let picTot = $("#"+id).find(".picList li").length - 1;
  348. if (onIdx == 0) {
  349. $("#"+id).find("button.prev").addClass("off");
  350. }
  351. if (onIdx == picTot) {
  352. $("#"+id).find("button.next").addClass("off");
  353. }
  354. }
  355. $("#layer_review_pic .btnClose").click(function() {
  356. $("#layer_review_pic").addClass("off"); //레이어 닫기
  357. $("#layer_review_pic").find("button.btnArr").removeClass("off"); //버튼 초기화
  358. });
  359. //등록파일 상세보기 팝업 버튼
  360. var togglePlayer = function (type) {
  361. let layers = document.querySelectorAll('#layer_review_pic .picList li');
  362. let len = layers.length - 1
  363. let activePlayerIndex = -1;
  364. layers.forEach(function (item, index) {
  365. if (item.classList.contains('on')) {
  366. activePlayerIndex = index;
  367. item.classList.remove('on');
  368. }
  369. });
  370. if (type === 'next') {
  371. if (activePlayerIndex >= len ) {
  372. activePlayerIndex = 0
  373. } else {
  374. activePlayerIndex += 1;
  375. }
  376. } else if (type === 'prev') {
  377. if (activePlayerIndex <= 0) {
  378. activePlayerIndex = len;
  379. } else {
  380. activePlayerIndex -= 1;
  381. }
  382. } else {
  383. activePlayerIndex = type;
  384. };
  385. //버튼 비활성화
  386. if (activePlayerIndex == 0 ) {
  387. document.getElementById('prev').classList.add("off");
  388. } else if (activePlayerIndex == len ) {
  389. document.getElementById('next').classList.add("off");
  390. } else {
  391. document.getElementById('prev').classList.remove("off");
  392. document.getElementById('next').classList.remove("off");
  393. };
  394. layers[activePlayerIndex].classList.add('on');
  395. };
  396. //이전버튼
  397. var prev = document.getElementById('prev');
  398. prev.addEventListener('click', function () {
  399. togglePlayer('prev');
  400. });
  401. //다음버튼
  402. var next = document.getElementById('next');
  403. next.addEventListener('click', function () {
  404. togglePlayer('next');
  405. });
  406. var fnShowOrHideOneToOneQnaButton = function(ansStat) {
  407. let roleCd = [[${sessionInfo.roleCd}]];
  408. if (ansStat != 'G060_20') {
  409. if (roleCd == 'G001_A300' || roleCd == 'G001_0000' || roleCd == 'G001_A000') {
  410. $('#btnAssignCounselor').show();
  411. } else {
  412. $('#btnAssignCounselor').hide();
  413. }
  414. $('#btnSaveTemp').show();
  415. $('#btnSaveAnswer').show();
  416. } else {
  417. $('#btnAssignCounselor').hide();
  418. $('#btnSaveTemp').hide();
  419. $('#btnSaveAnswer').hide();
  420. }
  421. }
  422. var fnSearchOneToOneCustomerHistory = function() {
  423. const actionUrl = '/customer/counsel/list/' + [[${counselInfo.custNo}]];
  424. gagaAgGrid.fetch(actionUrl, gridOneToOneCounselOptions);
  425. }
  426. var fnUnEscapeHtml = function(){ //XSS변환
  427. $('#qnaDetailForm textarea[name=questContent]').val($('#qnaDetailForm textarea[name=questContent]').val().replaceXSS());
  428. $('#qnaDetailForm input[name=ansTitle]').val($('#qnaDetailForm input[name=ansTitle]').val().replaceXSS());
  429. $('#qnaDetailForm textarea[name=ansContent]').val($('#qnaDetailForm textarea[name=ansContent]').val().replaceXSS());
  430. };
  431. $(document).ready(function() {
  432. cfnGetTextLength($('textarea[name=ansContent]'), 4000, $('#dpLocAnsContent'));
  433. gagaAgGrid.createGrid('custOneToOneCounselList', gridOneToOneCounselOptions);
  434. fnSearchOneToOneCustomerHistory();
  435. fnShowOrHideOneToOneQnaButton([[${counselInfo.ansStat}]]);
  436. $('#popupOneToOneQnaDetail .modelessPopup').draggable({'cancel':'.panelContent'});
  437. });
  438. /*]]>*/
  439. </script>
  440. </html>