2020-10-12 14:39:23 +09:00
@model NP.Model.VMCM
@{
2025-12-26 23:11:05 +09:00
Layout = "~/Views/Shared/_PopupLayout.cshtml";
var ncc = new NP.Model.CMEXLayer() { };
var hasccqdiff = Model.ComCodes.Where(w => w.cgroup == "ccdiff").Count() > 0;
var hascccc1 = Model.ComCodes.Where(w => w.cgroup == "cc1").Count() > 0;
var hascccc2 = Model.ComCodes.Where(w => w.cgroup == "cc2").Count() > 0;
var hascccc3 = Model.ComCodes.Where(w => w.cgroup == "cc3").Count() > 0;
var hascccc4 = Model.ComCodes.Where(w => w.cgroup == "cc4").Count() > 0;
var hascccc5 = Model.ComCodes.Where(w => w.cgroup == "cc5").Count() > 0;
var cssqdiff = hasccqdiff ? "" : "qhide";
var csscc1 = hascccc1 ? "" : "qhide";
var csscc2 = hascccc2 ? "" : "qhide";
var csscc3 = hascccc3 ? "" : "qhide";
var csscc4 = hascccc4 ? "" : "qhide";
var csscc5 = hascccc5 ? "" : "qhide";
int tempInt = 0;
2020-10-12 14:39:23 +09:00
}
<div class="row">
<form id="mform" method="post" enctype="multipart/form-data" class="form-horizontal">
<section class="panel panel-default">
<header class="panel-heading"><strong><i class="fa fa-bars"></i> 기본정보<span class=""></span></strong></header>
<div class="panel-body">
<div class="form-group">
<label class="col-sm-4 col-md-2 control-label req">평가구분</label>
2021-11-10 08:50:20 +09:00
<div class="col-sm-8 col-md-10">@*@Html.Partial("./Partial/Radio", "0:진행평가;1:최종평가", new ViewDataDictionary { { "special", "stringlist" }, { "name", "CMEX.extype" }, { "checked", Model.CMEX.extype } })*@</div>
2025-12-26 23:11:05 +09:00
<div class="col-sm-8 col-md-10">@Html.Partial("./Partial/Radio", "1:최종평가", new ViewDataDictionary { { "special", "stringlist" }, { "name", "vm.CMEX.extype" }, { "checked", Model.CMEX.extype } })</div>
2020-10-12 14:39:23 +09:00
</div>
2025-12-26 23:11:05 +09:00
<div class="form-group">
<label class="col-sm-4 col-md-2 control-label req">교육일정 선택</label>
<div class="col-sm-8 col-md-10">
<select class="form-control dev" id="cmisno" name="vm.CMEX.cmisno">
<option>선택</option>
@foreach (var item in Model.CMInningscds.OrderByDescending(c => c.estart)) {
tempInt = Model.CMInningscds2.Where(c => c.cmino == item.cmino && c.cmisno == item.cmisno && c.intv1 == 2).Count();
<option value="@item.cmisno" @(item.cmisno == Model.CMEX.cmisno ? "selected" : "")>[@item.studyplacename] [@item.estart ~ @item.eend]</option>
}
</select>
</div>
</div>
<div class="form-group">
<label class="col-sm-4 col-md-2 control-label req">시험 응시 일시</label>
<div class="col-sm-8 col-md-10 form-inline">
@Html.Partial("./Partial/Date", string.IsNullOrEmpty(Model.stringval18) ? (DateTime?)null : Convert.ToDateTime(Model.stringval18), new ViewDataDictionary { { "name", "vm.stringval18" } })
@Html.TextBoxFor(m => m.stringval19, new { @class = "form-control text-center onlyNum2", @maxlength = "2", @style = "width:50px;", @Name="vm.stringval19" }) 시
@Html.TextBoxFor(m => m.stringval20, new { @class = "form-control text-center onlyNum2", @maxlength ="2", @style = "width:50px;", @Name = "vm.stringval20" }) 분
~
@Html.Partial("./Partial/Date", string.IsNullOrEmpty(Model.stringval21) ? (DateTime?)null : Convert.ToDateTime(Model.stringval21), new ViewDataDictionary { { "name", "vm.stringval21" } })
@Html.TextBoxFor(m => m.stringval22, new { @class = "form-control text-center onlyNum2", @maxlength = "2", @style = "width:50px;", @Name = "vm.stringval22" }) 시
@Html.TextBoxFor(m => m.stringval23, new { @class = "form-control text-center onlyNum2", @maxlength = "2", @style = "width:50px;", @Name = "vm.stringval23" }) 분
</div>
</div>
2020-10-12 14:39:23 +09:00
<div class="line line-dashed line-lg pull-in"></div><div class="form-group">
<label class="col-sm-4 col-md-2 control-label req">평가명</label>
2025-12-26 23:11:05 +09:00
<div class="col-sm-8 col-md-10">@Html.TextBoxFor(m => m.CMEX.exname, new { @class = "form-control", @maxlength = "100", @Name = "vm.CMEX.exname" })</div>
2020-10-12 14:39:23 +09:00
</div>
<div class="line line-dashed line-lg pull-in"></div><div class="form-group">
<label class="col-sm-4 col-md-2 control-label">평가내용</label>
2025-12-26 23:11:05 +09:00
<div class="col-sm-8 col-md-10">@Html.TextAreaFor(m => m.CMEX.edesc, new { @class = "form-control", @maxlength = "700", @style = "resize: none; height: 70px;", @Name = "vm.CMEX.edesc" })</div>
2020-10-12 14:39:23 +09:00
</div>
<div class="line line-dashed line-lg pull-in"></div><div class="form-group">
<label class="col-sm-2 control-label">총점</label>
<div class="col-sm-10"><span id="spantotal" style="color: red; font-size: 20px;">@Model.CMEX.tpoint</span> 점</div>
</div>
<div class="line line-dashed line-lg pull-in"></div><div class="form-group">
<label class="col-sm-4 col-md-2 control-label req">출석률</label>
2025-12-26 23:11:05 +09:00
<div class="col-sm-8 col-md-10">@Html.TextBoxFor(m => m.CMEX.econdition, new { @class = "form-control disp-init int nocomma text-center", @maxlength = "3", @style = "width: 80px;", @Name = "vm.CMEX.econdition" }) % 이상</div>
2020-10-12 14:39:23 +09:00
</div>
<div class="line line-dashed line-lg pull-in"></div><div class="form-group">
<label class="col-sm-4 col-md-2 control-label req">제한시간</label>
2025-12-26 23:11:05 +09:00
<div class="col-sm-8 col-md-10">@Html.TextBoxFor(m => m.CMEX.etime, new { @class = "form-control text-center disp-init int nocomma", @style = "width: 80px;", @Name = "vm.CMEX.etime" })분 * 0분 입력 시 시간제한 없음</div>
2020-10-12 14:39:23 +09:00
</div>
<div class="line line-dashed line-lg pull-in @(Model.examsavable)"></div><div class="form-group @(Model.examsavable)">
<label class="col-sm-4 col-md-2 control-label">문항출력설정</label>
2025-12-26 23:11:05 +09:00
<div class="col-sm-8 col-md-10">@Html.Partial("./Partial/Select", null, new ViewDataDictionary { { "special", "FromTo" }, { "name", "vm.CMEX.evtype" }, { "selected", Model.CMEX.evtype }, { "start", 1 }, { "end", 10 }, { "textadd", "개" }, { "df", "0:전체" }, { "disabled", Model.examsavable } }) 출력</div>
2020-10-12 14:39:23 +09:00
</div>
<div class="line line-dashed line-lg pull-in @(Model.examsavable)"></div><div class="form-group @(Model.examsavable)">
<label class="col-sm-4 col-md-2 control-label">출제방식설정</label>
2025-12-26 23:11:05 +09:00
<div class="col-sm-8 col-md-10">@Html.Partial("./Partial/Radio", "0:고정문항(모든 응시자들의 시험지가 동일하며, 문제에 등록된 배점 적용);1:임의문항(모든 응시자들의 시험지가 달라짐)", new ViewDataDictionary { { "special", "stringlist" }, { "name", "vm.CMEX.eqtype" }, { "checked", Model.CMEX.eqtype }, { "setbr", 1 }, { "disabled", Model.examsavable } })</div>
2020-10-12 14:39:23 +09:00
</div>
<div id="examlayerbox" style="@(Model.CMEX.eqtype == 0 ? "display: none;":"")">
<div class="line line-dashed line-lg pull-in @(Model.examsavable)"></div><div class="form-group @(Model.examsavable)">
<label class="col-sm-4 col-md-2 control-label req">문제분류 및 배점설정</label>
<div class="col-sm-8 col-md-10">
@if (hasccqdiff)
{
<label><input type="checkbox" id="chkqdiff" @(Model.CMEXLayers.Where(w => w.qdiff > 0).Count() > 0 ? "checked" : "") /><label for="chkqdiff">@Model.ComGroups.Where(w => w.cgroup == "ccdiff").First().cgroupname</label></label>@:
}
@if (hascccc1)
{
<label><input type="checkbox" id="chkcc1" @(Model.CMEXLayers.Where(w => w.cc1 > 0).Count() > 0 ? "checked" : "") /><label for="chkcc1">@Model.ComGroups.Where(w => w.cgroup == "cc1").First().cgroupname</label></label>@:
}
@if (hascccc2)
{
<label><input type="checkbox" id="chkcc2" @(Model.CMEXLayers.Where(w => w.cc2 > 0).Count() > 0 ? "checked" : "") /><label for="chkcc2">@Model.ComGroups.Where(w => w.cgroup == "cc2").First().cgroupname</label></label>@:
}
@if (hascccc3)
{
<label><input type="checkbox" id="chkcc3" @(Model.CMEXLayers.Where(w => w.cc3 > 0).Count() > 0 ? "checked" : "") /><label for="chkcc3">@Model.ComGroups.Where(w => w.cgroup == "cc3").First().cgroupname</label></label>@:
}
@if (hascccc4)
{
<label><input type="checkbox" id="chkcc4" @(Model.CMEXLayers.Where(w => w.cc4 > 0).Count() > 0 ? "checked" : "") /><label for="chkcc4">@Model.ComGroups.Where(w => w.cgroup == "cc4").First().cgroupname</label></label>@:
}
@if (hascccc5)
{
<label><input type="checkbox" id="chkcc5" @(Model.CMEXLayers.Where(w => w.cc5 > 0).Count() > 0 ? "checked" : "") /><label for="chkcc5">@Model.ComGroups.Where(w => w.cgroup == "cc5").First().cgroupname</label></label>@:
}
<a href="#" class="btn btn-dark btn-sm" onclick="apply();" style="@(Model.examsavable == "" ? "" : "display: none;")">적용</a>
<br />
<div class="col-md-12 resultbox" style="margin-bottom: 10px; margin-top: 10px; padding: 0;">
<table class="databox" id="layertable">
<thead>
<tr>
<th class="qdiff @(cssqdiff)">@Model.ComGroups.Where(w => w.cgroup == "ccdiff").First().cgroupname</th>
<th class="cc1 @(csscc1)">@Model.ComGroups.Where(w => w.cgroup == "cc1").First().cgroupname</th>
<th class="cc2 @(csscc2)">@Model.ComGroups.Where(w => w.cgroup == "cc2").First().cgroupname</th>
<th class="cc3 @(csscc3)">@Model.ComGroups.Where(w => w.cgroup == "cc3").First().cgroupname</th>
<th class="cc4 @(csscc4)">@Model.ComGroups.Where(w => w.cgroup == "cc4").First().cgroupname</th>
<th class="cc5 @(csscc5)">@Model.ComGroups.Where(w => w.cgroup == "cc5").First().cgroupname</th>
<th>후보문항수</th>
<th>출제문항수</th>
<th>문항당배점</th>
<th>총배점</th>
</tr>
</thead>
<tbody>
@foreach (var item in Model.CMEXLayers)
{
<tr class="data" data-ccode="@string.Format("{0}:{1}:{2}:{3}:{4}:{5}", item.qdiff, item.cc1, item.cc2, item.cc3, item.cc4, item.cc5)">
<td class="qdiff @(cssqdiff)" data-ccode="@(item.qdiff)">@(item.qdiffname)</td>
<td class="cc1 @(csscc1)" data-ccode="@(item.cc1)">@(item.ccname1 ?? "")</td>
<td class="cc2 @(csscc2)" data-ccode="@(item.cc2)">@(item.ccname2 ?? "")</td>
<td class="cc3 @(csscc3)" data-ccode="@(item.cc3)">@(item.ccname3 ?? "")</td>
<td class="cc4 @(csscc4)" data-ccode="@(item.cc4)">@(item.ccname4 ?? "")</td>
<td class="cc5 @(csscc5)" data-ccode="@(item.cc5)">@(item.ccname5 ?? "")</td>
<td class="poolcount text-center">0</td>
<td class="qcount text-center"><input type="text" class="text-center int" value="@item.qcount" style="width: 90%;" /></td>
<td class="rpoint text-center"><input type="text" class="text-center int" value="@item.rpoint" style="width: 90%;" /></td>
<td class="trpoint text-center">@item.trpoint</td>
</tr>
}
</tbody>
</table>
</div>
</div>
</div>
</div>
<div class="line line-dashed line-lg pull-in @(Model.examsavable)"></div><div class="form-group @(Model.examsavable)">
<label class="col-sm-4 col-md-2 control-label">문제/보기섞기</label>
<div class="col-sm-8 col-md-10">
2025-12-26 23:11:05 +09:00
@Html.HiddenFor(m => m.CMEX.israndq, new { @Name = "vm.CMEX.israndq" })<label><input type="checkbox" id="chkrq" @(Model.CMEX.israndq == 1 ? "checked" : "") @(Model.examsavable == "" ? "" : "disabled") /><label for="chkrq">문제섞기</label></label>
@Html.HiddenFor(m => m.CMEX.israndqi, new { @Name = "vm.CMEX.israndqi" })<label><input type="checkbox" id="chkrqi" @(Model.CMEX.israndqi == 1 ? "checked" : "") @(Model.examsavable == "" ? "" : "disabled") /><label for="chkrqi">보기섞기</label></label>
2020-10-12 14:39:23 +09:00
</div>
</div>
<div class="line line-dashed line-lg pull-in"></div><div class="form-group">
<label class="col-sm-4 col-md-2 control-label">순차응시여부</label>
2025-12-26 23:11:05 +09:00
<div class="col-sm-8 col-md-10">@Html.Partial("./Partial/Radio", "0:자유응시 ;1:순차응시(다음문제로 이동 시 이전 문제를 볼 수 없습니다.)", new ViewDataDictionary { { "special", "stringlist" }, { "name", "vm.CMEX.isseq" }, { "checked", Model.CMEX.isseq } })<span style="color: red;"></span></div>
2020-10-12 14:39:23 +09:00
</div>
<div class="line line-dashed line-lg pull-in"></div><div class="form-group">
<label class="col-sm-4 col-md-2 control-label">시험창이탈허용</label>
2025-12-26 23:11:05 +09:00
<div class="col-sm-8 col-md-10">@Html.Partial("./Partial/Radio", "0:허용 ;1:비허용(시험창 이탈시 강제종료)", new ViewDataDictionary { { "special", "stringlist" }, { "name", "vm.CMEX.isblur" }, { "checked", Model.CMEX.isblur } })<span style="color: red;">※비허용 시 시험창을 벗어나지 않도록 응시자들에게 공지해주세요.</span></div>
2020-10-12 14:39:23 +09:00
</div>
<div class="line line-dashed line-lg pull-in"></div><div class="form-group">
<label class="col-sm-4 col-md-2 control-label">임시저장허용</label>
2025-12-26 23:11:05 +09:00
<div class="col-sm-8 col-md-10">@Html.Partial("./Partial/Radio", "1:예;0:아니오", new ViewDataDictionary { { "special", "stringlist" }, { "name", "vm.CMEX.isusebackup" }, { "checked", Model.CMEX.isusebackup } }) (응시자가 시험응시화면에서 선택한 답안을 제출 전 저장하는 기능입니다. 동시응시인원이 많을 경우 시험응시사이트가 느려질 수 있습니다.)</div>
2020-10-12 14:39:23 +09:00
</div>
<div class="line line-dashed line-lg pull-in @(Model.examsavable)"></div><div class="form-group @(Model.examsavable)">
<label class="col-sm-4 col-md-2 control-label">이어보기설정</label>
2025-12-26 23:11:05 +09:00
<div class="col-sm-8 col-md-10" @Html.Partial("./Partial/Radio", ":무제한;1:1회;2:2회;0:미허용", new ViewDataDictionary { { "special", "stringlist" }, { "name", "vm.CMEX.relaylimit" }, { "checked", Model.CMEX.relaylimit }, { "disabled", Model.examsavable } }) (시험응시화면이 닫혔을 경우, 제한시간 내 다시 응시할 수 있는 기준을 설정)</div>
2020-10-12 14:39:23 +09:00
</div>
2021-05-17 10:14:33 +09:00
<div class="line line-dashed line-lg pull-in"></div><div class="form-group">
<label class="col-sm-4 col-md-2 control-label">재응시허용</label>
2025-12-26 23:11:05 +09:00
<div class="col-sm-8 col-md-10" @Html.Partial("./Partial/Radio", "1:예;0:아니오", new ViewDataDictionary { { "special", "stringlist" }, { "name", "vm.CMEX.isreexamable" }, { "checked", Model.CMEX.exno < 1 ? 1 : Model.CMEX.isreexamable } })</div>
2021-05-17 10:14:33 +09:00
</div>
2020-10-12 14:39:23 +09:00
<div class="line line-dashed line-lg pull-in"></div><div class="form-group">
<label class="col-sm-4 col-md-2 control-label">시험결과공개</label>
2025-12-26 23:11:05 +09:00
<div class="col-sm-8 col-md-10" @Html.Partial("./Partial/Radio", "0:비공개;1:공개", new ViewDataDictionary { { "special", "stringlist" }, { "name", "vm.CMEX.isresultopen" }, { "checked", Model.CMEX.isresultopen } })</div>
2020-10-12 14:39:23 +09:00
</div>
</div>
</section>
<section class="panel panel-default">
<header class="panel-heading"><strong><i class="fa fa-bars"></i> 문제정보<span class=""></span></strong></header>
<div class="col-md-12 resultbox" style="margin-bottom: 70px; padding: 0">
<table class="databox" id="box1" style="overflow-y:scroll;">
<colgroup>
<col style="width: 50px;" />
<col style="width: 70px;" />
<col style="width: 250px;" />
<col />
<col style="width: 80px;" />
<col style="width: 80px;" />
</colgroup>
<thead>
<tr>
<th><input type="checkbox" onclick="javascript: checkall('box1', this);" /></th>
<th>문제유형</th>
<th>분류</th>
<th>문제</th>
<th>문제순서</th>
<th>점수</th>
</tr>
</thead>
<tbody>
@foreach (var item in Model.CMEXQs)
{
<tr class="data center" data-eqno="@(item.eqno)" data-ccode="@item.eqtypes">
<td class="autocheck"><input type="checkbox" class="autocheck qno" value="@item.qno" /></td>
<td class="atname">@item.atypename</td>
<td class="qtypes">@item.eqtypenames</td>
<td class="qts text-left link"><div style="max-height: 30px;"><a href="#" class="link" onclick="viewquestion(@item.qno)">@item.qtextstring</a></div></td>
<td class="qseq"><input type="text" class="int text-center" value="@item.qseq" style="width: 90%;" /></td>
<td class="point"><input @(Model.examsavable == "_hide" ? "readOnly=\"readOnly\"" : "") type="text" class="int text-center readnot@(Model.examsavable) eqtypes eqtype@(Model.CMEX.eqtype)" value="@item.rpoint" data-dpoint="@item.rpoint" style="width: 90%;" /></td>
</tr>
}
</tbody>
</table>
</div>
</section>
<div class="botfixempty"><br /><br /><br /><br /></div>
<div class="botfix islayer" style="left:0px; margin-left:0px;">
<div class="col-sm-6 text-left" style="@(Model.examsavable == "" ? "":"display: none;")">
<a href="#" class="btn btn-facebook" onclick="qadd();">문제추가</a>
<a href="#" class="btn btn-danger" onclick="qdel();">선택문제삭제</a>
</div>
<div class="col-sm-6 text-right">
<a href="#" class="btn btn-primary" onclick="save();">저장</a>
@if (Model.CMEX.exno > 0)
{
<a href="#" class="btn btn-danger" onclick="del();">삭제</a>
}
<a href="#" class="btn btn-default" onclick="goparent(val('IsSavedForParent') == '1');">닫기</a>
</div>
</div>
2025-12-26 23:11:05 +09:00
<input type="hidden" name="vm.CMEX.exno" id="datakey" value="@Model.CMEX.exno" />
@Html.HiddenFor(m => m.CMEX.cmno, new { @Name = "vm.CMEX.cmno" })
@Html.HiddenFor(m => m.cmno, new { @Name = "vm.cmno" })
2020-10-12 14:39:23 +09:00
@Html.HiddenFor(m=>m.IsSavedForParent)
2025-12-26 23:11:05 +09:00
<input type="hidden" name="vm.savedata" id="sdata" />
<input type="hidden" name="vm.savedata2" id="sdata2" />
2020-10-12 14:39:23 +09:00
@Html.Partial("./Partial/DForm", Model)
</form>
</div>
@section styles{
<style type="text/css">
td.qhide, th.qhide{display: none;}
td input.int{background-color: #fce97f; border: 0 none;}
td input.int:read-only{background-color: #ddd;}
div.pull-in._hide, div.form-group._hide {
background-color: #ddd; margin-bottom: 0;
}
div.pull-in._hide {
margin: 0;
}
.form-horizontal .form-group._hide{margin-right: 0 !important; margin-left: 0 !important;}
#layertable td, #box1 td{padding: 2px 4px;}
#findlayerframe {
bottom: 5%;
top:5%;
position: fixed;
left: 0;
right: 0;
margin-left: auto;
margin-right: auto;
border-radius: 5px;
z-index: 2000;
padding: 10px;
font-size: 12px;
width: 100%;
height: 90%;
max-height: 100%;
max-width: 100%;
margin: 0 auto;
overflow-x:scroll;
}
</style>
}
@section scriptsHeader{
@Html.Partial("./Partial/ScriptDate")
<script src="/js/underscore-min.js"></script>
}
@section scripts{
<script>
var qdiff = "@(string.Join(";", Model.ComCodes.Where(w => w.cgroup == "ccdiff").Select(s => s.ccode.ToString() + ":" + s.cname)))";
var cc1 = "@(string.Join(";", Model.ComCodes.Where(w => w.cgroup == "cc1").Select(s => s.ccode.ToString() + ":" + s.cname)))";
var cc2 = "@(string.Join(";", Model.ComCodes.Where(w => w.cgroup == "cc2").Select(s => s.ccode.ToString() + ":" + s.cname)))";
var cc3 = "@(string.Join(";", Model.ComCodes.Where(w => w.cgroup == "cc3").Select(s => s.ccode.ToString() + ":" + s.cname)))";
var cc4 = "@(string.Join(";", Model.ComCodes.Where(w => w.cgroup == "cc4").Select(s => s.ccode.ToString() + ":" + s.cname)))";
var cc5 = "@(string.Join(";", Model.ComCodes.Where(w => w.cgroup == "cc5").Select(s => s.ccode.ToString() + ":" + s.cname)))";
var cssqdiff = '@(cssqdiff)';
var csscc1 = '@(csscc1)';
var csscc2 = '@(csscc2)';
var csscc3 = '@(csscc3)';
var csscc4 = '@(csscc4)';
var csscc5 = '@(csscc5)';
$(document).ready(function () {
2025-12-26 23:11:05 +09:00
$("input[name='vm.CMEX.eqtype']").on("change", function () {
2020-10-12 14:39:23 +09:00
setDND(true);
});
$("#layertable").on("change", "input.int", function (e) {
setDND();
});
$("input._hide").prop("readonly", true);
setDND(false);
2025-12-26 23:11:05 +09:00
if (!$("#vm_CMEX_eqtype0").prop("checked")) {
2020-10-12 14:39:23 +09:00
setqlayer()
}
$("table#box1").on("change", "input.int.eqtypes", function () {
var tot = 0;
$.each($("#box1 tbody tr.data"), function (i, r) {
tot += getint($(r).find("td.point input").val());
});
$("#spantotal").text(tot);
})
focus("CMEX_exname");
2025-12-26 23:11:05 +09:00
$(document).on("keyup", ".onlyNum2", function () {
// 숫자만 남기기
this.value = this.value.replace(/\D/g, '');
// 두 자리까지만 허용
if (this.value.length > 2) {
this.value = this.value.slice(0, 2);
}
// 범위 체크 (00~59)
if (this.value != "") {
let num = parseInt(this.value, 10);
if (num > 59) {
this.value = "59"; // 최대값으로 보정
}
}
});
2020-10-12 14:39:23 +09:00
});
function cartesianProductOf() {
return _.reduce(arguments, function (a, b) {
return _.flatten(_.map(a, function (x) {
return _.map(b, function (y) {
return x.concat([y]);
});
}), true);
}, [[]]);
}
function apply() {
$("#layertable tbody tr.data").remove();
if ($("#chkqdiff:checked").length < 1) {
msg("최소 1개 이상의 문제분류를 설정해주셔야 합니다.<br />문제분류 등록/수정은 코드관리에서 가능합니다.");
}
var layers = cartesianProductOf(cssqdiff != "qhide" && $("#chkqdiff:checked").length > 0 ? qdiff.split(';') : ["0:"],
csscc1 != "qhide" && $("#chkcc1:checked").length > 0 && cc1 != "" ? cc1.split(';') : ["0:"],
csscc2 != "qhide" && $("#chkcc2:checked").length > 0 && cc2 != "" ? cc2.split(';') : ["0:"],
csscc3 != "qhide" && $("#chkcc3:checked").length > 0 && cc3 != "" ? cc3.split(';') : ["0:"],
csscc4 != "qhide" && $("#chkcc4:checked").length > 0 && cc4 != "" ? cc4.split(';') : ["0:"],
csscc5 != "qhide" && $("#chkcc5:checked").length > 0 && cc5 != "" ? cc5.split(';') : ["0:"]);
if (layers.length > 0 && layers[0].toString() != "0:,0:,0:,0:,0:,0:") {
$.each(layers, function (i, a) {
$("#layertable tbody").append("<tr class=\"data\" data-ccode=\"" + a[0].split(':')[0] + ":" + a[1].split(':')[0] + ":" + a[2].split(':')[0] + ":" + a[3].split(':')[0] + ":" + a[4].split(':')[0] + ":" + a[5].split(':')[0] + "\"><td class=\"qdiff " + cssqdiff + "\" data-ccode=\"" + a[0].split(':')[0] + "\">" + a[0].split(':')[1] + "</td><td class=\"cc1 " + csscc1 + "\" data-ccode=\"" + a[1].split(':')[0] + "\">" + a[1].split(':')[1] + "</td><td class=\"cc2 " + csscc2 + "\" data-ccode=\"" + a[2].split(':')[0] + "\">" + a[2].split(':')[1] + "</td><td class=\"cc3 " + csscc3 + "\" data-ccode=\"" + a[3].split(':')[0] + "\">" + a[3].split(':')[1] + "</td><td class=\"cc4 " + csscc4 + "\" data-ccode=\"" + a[4].split(':')[0] + "\">" + a[4].split(':')[1] + "</td><td class=\"cc5 " + csscc5 + "\" data-ccode=\"" + a[5].split(':')[0] + "\">" + a[5].split(':')[1] + "</td><td class=\"poolcount text-center\">0</td><td class=\"qcount text-center\"><input type=\"text\" class=\"text-center int\" value=\"0\" style=\"width: 90%;\" /></td><td class=\"rpoint text-center\"><input type=\"text\" class=\"text-center int\" value=\"0\" style=\"width: 90%;\" /></td><td class=\"trpoint text-center\">0</td></tr>");
});
}
setqlayer();
setDND(false);
}
function selectquestion(jsons) {
var idx = $("#box1 tr.data").length + 1;
var eqtype = getrv("CMEX.eqtype");
$.each(jsons, function (i, r) {
if ($("#box1 tr.data td input.autocheck[value='" + r.qno + "']").length < 1) {
$("#box1 tbody").append("<tr class=\"data center\" data-eqno=\"0\" data-ccode=\"" + r.qdiff + ":" + r.cc1 + ":" + r.cc2 + ":" + r.cc3 + ":" + r.cc4 + ":" + r.cc5 + "\">"
+ "<td class=\"autocheck\"><input type=\"checkbox\" class=\"autocheck qno\" value=\"" + r.qno + "\" /></td>"
+ "<td class=\"atname\">" + r.atypename + "</td>"
+ "<td class=\"qtypes\">" + r.qdiffname + ":" + r.ccname1 + ":" + r.ccname2 + ":" + r.ccname3 + ":" + r.ccname4 + ":" + r.ccname5 + "</td>"
+ "<td class=\"qts link\"><div style=\"max-height: 30px;\"><a href=\"#\" class=\"link\" onclick=\"viewquestion(" + r.qno + ")\">" + r.qtextstring + "</a></div></td>"
+ "<td class=\"qseq\"><input type=\"text\" class=\"int text-center\" value=\"" + (idx++) + "\" style=\"width: 90%;\" /></td>"
+ "<td class=\"point\"><input type=\"text\" class=\"int text-center readnot@(Model.examsavable) eqtypes eqtype" + eqtype+ "\" value=\"" + r.dpoint + "\" data-dpoint=\"" + r.dpoint + "\" style=\"width: 90%;\" /></td></tr>");
}
});
setDND(false);
}
function setqlayer(){
$("#layertable th, #layertable td").show();
$("#layertable th.qhide").hide();
if ($("#chkqdiff").length < 1 || !$("#chkqdiff").prop("checked")) { $("#layertable th.qdiff, #layertable td.qdiff").hide(); }
if ($("#chkcc1").length < 1 || !$("#chkcc1").prop("checked")) { $("#layertable th.cc1, #layertable td.cc1").hide(); }
if ($("#chkcc2").length < 1 || !$("#chkcc2").prop("checked")) { $("#layertable th.cc2, #layertable td.cc2").hide(); }
if ($("#chkcc3").length < 1 || !$("#chkcc3").prop("checked")) { $("#layertable th.cc3, #layertable td.cc3").hide(); }
if ($("#chkcc4").length < 1 || !$("#chkcc4").prop("checked")) { $("#layertable th.cc4, #layertable td.cc4").hide(); }
if ($("#chkcc5").length < 1 || !$("#chkcc5").prop("checked")) { $("#layertable th.cc5, #layertable td.cc5").hide(); }
}
function setDND(setorgpoint) {
$("#examlayerbox").hide();
var tot = 0;
2025-12-26 23:11:05 +09:00
if ($("#vm_CMEX_eqtype0").prop("checked")) {
2020-10-12 14:39:23 +09:00
$("#box1 tr.data td.point input.readnot").prop("readonly", false);
if (setorgpoint && $("#box1 tbody tr.data").length > 0) {
msg("하단 문항들의 점수를 문제은행 기본점수 또는 최종저장된 점수로 변경합니다.");
$.each($("#box1 tbody tr.data"), function (i, r) {
$(r).find("td.point input").val($(r).find("td.point input").attr("data-dpoint"));
tot += getint($(r).find("td.point input").attr("data-dpoint"));
});
}
else if ($("#box1 tbody tr.data").length > 0) {
$.each($("#box1 tbody tr.data"), function (i, r) {
tot += getint($(r).find("td.point input").attr("data-dpoint"));
});
}
} else {
$("#box1 tr.data td.point input").prop("readonly", true);
//배점설정 및 후보문항수 총배점 계산 및 문제점수 설정
//일단 0점으로
$("#box1 tbody tr.data td.point input.int").val(0);
$.each($("#layertable tbody tr.data"), function (i, r) {
var ccodes = $(r).attr("data-ccode").split(':');
var _point = $(r).find("td.rpoint input.int").val();
var qcnt = 0;
//$.each($("#box1 tbody tr.data[data-ccode='" + ccodes + "']"), function (i, r2) {
// qcnt++;
// $(r2).find("td.point input.int").val(_point);
//});
$.each($("#box1 tbody tr.data"), function (i, r2) {
var ccodes2 = $(r2).attr("data-ccode").split(':');
if ((ccodes[0] == "0" || ccodes[0] == ccodes2[0]) &&
(ccodes[1] == "0" || ccodes[1] == ccodes2[1]) &&
(ccodes[2] == "0" || ccodes[2] == ccodes2[2]) &&
(ccodes[3] == "0" || ccodes[3] == ccodes2[3]) &&
(ccodes[4] == "0" || ccodes[4] == ccodes2[4]) &&
(ccodes[5] == "0" || ccodes[5] == ccodes2[5])) {
qcnt++;
$(r2).find("td.point input.int").val(_point);
}
});
$(r).find("td.poolcount").text(qcnt);
$(r).find("td.trpoint").text(getint($(r).find("td.qcount input.int").val()) * getint(_point));
tot += getint($(r).find("td.qcount input.int").val()) * getint(_point);
});
$("#examlayerbox").show();
}
$("#spantotal").text(tot);
}
function save() {
var _isvalid = true;
2025-12-26 23:11:05 +09:00
if (!$("#vm_CMEX_eqtype0").prop("checked")) {
2020-10-12 14:39:23 +09:00
//문항 점검
$.each($("#layertable tbody tr.data"), function (i, r) {
if (getint($(r).find("td.poolcount").text()) < getint($(r).find("td.qcount input.int").val())) {
msg((i + 1) + "번째 문제분류의 출제문항수가 충족되지 않습니다. 해당 문제를 추가해주세요.");
_isvalid = false; return false;
}
else if (getint($(r).find("td.qcount input.int").val()) > 0 && getint($(r).find("td.rpoint input.int").val()) < 1) {
msg((i + 1) + "번째 문제분류의 배점을 입력해주세요.");
_isvalid = false; return false;
}
});
}
if (_isvalid) {
var _layerqcount = 0;
2025-12-26 23:11:05 +09:00
if ($("#vm_CMEX_eqtype1").prop("checked")) {
2020-10-12 14:39:23 +09:00
$.each($("#layertable tbody tr td.qcount input.int"), function (i, c) {
_layerqcount += getint($(c).val());
if (_layerqcount > 0) {
return false;
}
});
}
if (check("CMEX_exname", "", "시험명칭을 입력하세요.")) { }
2025-12-26 23:11:05 +09:00
else if ($("#vm_CMEX_eqtype0").prop("checked") && $("#box1 tbody tr").length < 1) { msg("출제할 문제를 추가해주세요."); }
else if ($("#vm_CMEX_eqtype1").prop("checked") && _layerqcount < 1) { msg("출제문항수를 입력해주세요."); }
2020-10-12 14:39:23 +09:00
else if (getDouble(val("CMEX_econdition")) > 100 || getDouble(val("CMEX_econdition")) < 0) { msg("출석률은 0 ~ 100 사이의 값을 입력해주세요."); }
else if (_isvalid && confirm("시험을 " + (getint(val("CMEX_exno")) < 1 ? "등록" : "수정") + "하시겠습니까?")) {
$("#CMEX_israndq").val($("#chkrq").prop("checked") ? 1 : 0);
$("#CMEX_israndqi").val($("#chkrqi").prop("checked") ? 1 : 0);
var sd = "";
2025-12-26 23:11:05 +09:00
if (!$("#vm_CMEX_eqtype0").prop("checked")) {
2020-10-12 14:39:23 +09:00
$.each($("#layertable tbody tr.data"), function (i, r) {
//코드6, qcount, rpoint
sd += ";" + $(r).attr("data-ccode") + ":" + $(r).find("td.qcount input.int").val() + ":" + $(r).find("td.rpoint input.int").val();
});
}
$("#sdata").val(sd.length > 0 ? sd.substr(1) : sd);
sd = "";
$.each($("#box1 tbody tr.data"), function (i, r) {
sd += ";" + $(r).attr("data-eqno") + ":" + $(r).find("td.qseq input.int").val() + ":" + $(r).find("td.autocheck input.qno").val() + ":" + $(r).find("td.point input.int").val();
});
$("#sdata2").val(sd.length > 0 ? sd.substr(1) : sd);
2025-12-26 23:11:05 +09:00
cap("/acommon/cmexsave2025", "mform", "cbsave");
2020-10-12 14:39:23 +09:00
}
}
}
var pqlist = "";
function qadd() {
framelayer("/cm/qp?stringval13=R");
}
function calcplist() {
pqlist = "";
$.each($("#box1 tbody tr.data input.autocheck.qno"), function (i, c) {
pqlist += "," + $(c).val();
});
}
function qdel() {
if ($("#box1 tr.data td input.autocheck.qno:checked").length < 1) {
msg("삭제할 문제를 선택하세요.");
}
else {
var eqnos = "";
for (var i = $("#box1 tr.data").length - 1; i >= 0; i--) {
var r = $("#box1 tr.data:eq(" + i + ")");
if ($(r).find("td.autocheck input.autocheck.qno:checked").length > 0) {
$(r).remove();
}
}
setDND(false);
msg("저장해야 반영됩니다.");
}
}
function cbdeleq() {
if (capOK) {
for (var i = $("#box1 tr.data").length - 1; i >= 0; i--) {
var r = $("#box1 tr.data:eq(" + i + ")");
if ($(r).find("td.autocheck input.autocheck.qno:checked").length > 0) {
$(r).remove();
}
}
setDND(false);
}
else {
msg("이미 응시가 시작된 문제는 삭제할 수 없습니다.");
}
}
function cbsave() {
if (capOK) {
if ('@(Model.CMEX.exno)' == '0') {
$("#intval").val(capResult.obj);
}
setv("IsSavedForParent", 1);
2025-12-26 23:11:05 +09:00
//timesubmit();
2020-10-12 14:39:23 +09:00
}
else if (capResult.obj == -1) {
msg("이미 최종평가가 등록되어 있습니다.");
}
else {
msg("시험등록 중 올바르지 않는 데이터로 반영되지 않았습니다. 시스템관리자에게 문의해주세요.");
}
}
var _qno;
var _dtype = 2;
function viewquestion(qno) {
_qno = qno;
capp("/acommon/setauthkey", { dtype: _dtype, intval: _qno }, "cbauth");
}
function cbauth() {
if (capResult.code == 1000) {
var pop = window.open("@(ViewBag.fronturl)/Open/ViewQuestion?authtype=" + _dtype +"&authkey=" + capResult.obj + "&qno=" + _qno, 'viewquestion', 'width=' + (screen.width - 200) + ', height=' + (screen.height - 200));
if (pop == null) {
msg("팝업이 차단되어 있습니다. 차단을 해제해 주세요.");
}
}
}
function del() {
if (confirm("삭제하시겠습니까?")) {
capp("/acommon/estdel", { extype: getint(val("cmex.extype")) + 1, no: @Model.CMEX.exno }, "cbdel");
}
}
function cbdel() {
if (capResult.code == 1000) {
msg("삭제했습니다.", null, true, null, true);
goparent(true);
} else {
msg("수강데이터가 생성되어 삭제할 수 없습니다.");
}
}
</script>
}