educoder/public/javascripts/edu/edu_tpi.js

549 lines
23 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 实训游戏需要的js功能
var EXPAND = 0; // 放大
var SHRINK = 1; // 缩小
$(function(){
// TPI拖拽功能 begin
var doc = $(document);
var lab = $(".b-label");
var cen = $(".h-center");
var nextW2,nextW1;
var dragging = false;
var flag = false;
var wrapWidth;
var wrapHeight;
lab.live('mousedown',function(){
dragging = true;
leftOffset = $(".labelN").offset().left;
wrapWidth = $(".labelN").width();
return false;
}
);
cen.live('mousedown',function(){
flag = true;
topOffset = $(".centerH").offset().top;
wrapHeight = $(".centerH").height();
return false;
}
);
doc.live('mousemove',function(e){
$(".-brother").show();// 代码行的遮罩显示
if(dragging) {
clickX = e.pageX;
if(clickX > leftOffset+300&&clickX<leftOffset+1600) {
//console.log(1);
lab.css('left', clickX - 7 - leftOffset + 'px');
$("#game_left_contents").width( clickX-leftOffset + 'px');
nextW2 = clickX-leftOffset;
$("#game_right_contents").width( wrapWidth - nextW2 + 'px');
//console.log(lab.next().width());
} else {
lab.css('left', '0px');
}
}
if(flag){
clickY = e.pageY;
if(clickY > topOffset +100) {
cen.css('top', clickY - 7 - topOffset + 'px');
$("#games_repository_contents").height( clickY-topOffset + 'px');
nextW1 = clickY-topOffset;
$("#games_valuation_contents").height( wrapHeight - nextW1 + 'px');
var h = $("#games_repository_contents").height() - $("#top_repository").height() - 50;
var m = $("#games_repository_contents").height() - 50;
$(".game_webssh").css("min-height", m);
$(".game_webssh").css("max-height", m);
var rows = parseInt(m / 18);
$("#file_entry_content").find(".CodeMirror-scroll").css("min-height", h);
$("#file_entry_content").find(".CodeMirror-scroll").css("max-height", h);
} else {
cen.css('top', '0px');
}
}
});
doc.live("mouseup", function(e) {
flag = false;
dragging = false;
e.cancelBubble = true;
$(".-brother").hide(); // 代码行的遮罩隐藏
});
// end;
//解決IE瀏覽器大小改變時webssh佈局變亂。
window.onresize = function(){
var m = $("#games_repository_contents").height() - 50;
$(".game_webssh").css("min-height", m);
$(".game_webssh").css("max-height", m);
}
// 评论区域的回复按钮
function reply_to_dis(id, name){
$("#comment_news").attr("placeholder", "回复"+name+":");
$("#dis_reply_id").val(id);
$("#comment_news").focus();
}
// end
// 点击全部任务向右侧展开
$("#all_task_show").on("click", function(e){
c = 0;
$("#all_task_tab").removeClass('leftnav-active');
$("#all_task_show").css("background","rgba(0,0,0,0)");
$("#all_task_index").css("left", 0).stop().animate({
left: "-505px"
}, 400, function(){
$("#all_task_show").hide();
fadein = 0;
});
});
// end
// 列表区域阻止事件冒泡
$("#all_task_index").on("click", function(e){
e.stopPropagation();
});
// end
// 下一关增加loading效果
$("#next_step").live("click", function(){
nNext = $("#code_estimate");
html = "<a href='javascript:void(0);' class='task-btn mr15 mt8'>下一关<img src='/images/bigdata/loading2.svg' style='width:25px;float:left;margin-top: 3px' /></a>";
nNext.html(html);
});
// end
// 上一关增加loading效果
$("#prev_step").live("click", function(){
nNext = $("#prev_step_area");
html = "<a href='javascript:void(0);' class='task-btn mr15 mt8'>上一关<img src='/images/bigdata/loading2.svg' style='width:25px;float:left;margin-top: 3px' /></a>";
nNext.html(html);
});
// end
});
// 查看参考答案
function open_answer(game, myshixun){
$.ajax({
url: "/myshixuns/" + myshixun + "/stages/" + game + "/answer",
dataType: "script"
})
}
// 代码/webssh的tab点击事件
//function g_l(o){return document.getElementById(o);}
//function HoverLi_new(n){
// for(var i=1;i<=2;i++){
// g_l('codetab_nav_'+i).className='blacktab_nomal';
// g_l('codetab_con_'+i).className='undis';
//
// }
// if(n==2){
// $("#games_repository_contents").removeClass("-bg-black").addClass("-bg-weightblack");
// $("#-bg-change-color").removeClass("-bg-black").addClass("-bg-weightblack");
// }else{
// $("#games_repository_contents").removeClass("-bg-weightblack").addClass("-bg-black");
// $("#-bg-change-color").removeClass("-bg-weightblack").addClass("-bg-black");
// }
// g_l('codetab_con_'+n).className='dis -relative';
// g_l('codetab_nav_'+n).className='blacktab_hover';
//};
// 选择题选择答案
function choice_answer(st, nThis){
if(st == "1"){
//$(nThis).hasClass("card-check") ? $(nThis).removeClass("card-check") : $(nThis).addClass("card-check");
$(nThis).toggleClass("card-check");
$(nThis).toggleClass("color_white");
} else if (st == "2"){
var choice = $(".color_white");
choice.removeClass("card-check");
choice.removeClass("color_white");
$(nThis).addClass("card-check");
$(nThis).toggleClass("color_white");
}
}
// end
// 评测区域点击TAB切换样式
function check_tab(allClassName,addClassName,item){
//点击tab添加样式
$("."+allClassName).removeClass(addClassName);
$(item).addClass(addClassName);
//获取当前点击的tab的索引位置
var index=$(item).index()+1;
//显示或隐藏对应的内容块
$("#"+allClassName+"_"+index).siblings().addClass("undis");
$("#"+allClassName+"_"+index).removeClass("undis");
}
// end
// 公开的测试集允许展开与隐藏
function toggle_test_case(t_case, id){
if(true){
var nTest = $("#test_case_"+id).parent().prev(".-task-ces-top").children("i:first-child"); //图标节点
console.log(nTest);
if (nTest.hasClass("fa-caret-down")){
nTest.addClass("fa-caret-right");
nTest.removeClass("fa-caret-down");
}else if( nTest.hasClass("fa-caret-right") ){
nTest.addClass("fa-caret-down");
nTest.removeClass("fa-caret-right");
}
$("#test_case_"+id).toggle();
}
}
// end
// codemirror渲染textarea
function CodeMirror_fromTextArea(id){
var Code = CodeMirror.fromTextArea(document.getElementById(id), {
/* mode: {name: "text/x-c++src",
// version: 2,
singleLineStringErrors: false},*/ // 目前补全js是引入的javascript-hint,因此目前不能指定语言
lineNumbers: true,
theme: "railscasts",
// extraKeys: {"Ctrl-Q": "autocomplete"}, // 快捷键
indentUnit: 4, //代码缩进为一个tab的距离
matchBrackets: true,
autoRefresh: true,
smartIndent: true,//智能换行
extraKeys: {"Ctrl-Q": "autocomplete"},
autofocus: true,
styleActiveLine: true,
lint: true,
gutters: ["CodeMirror-linenumbers", "breakpoints"]
});
return Code;
}
// end
var control = 0; // 版本库控制 0表示点击放大 1表示点击缩小
var control_1 = 0; // 测评控制 0表示点击放大 1表示点击缩小
// 版本库的放大与缩小
function repository_extend_and_zoom(){
var nGameRes = $("#games_repository_contents"); // 版本库区域
var nGameEva = $("#games_valuation_contents"); // 评测区域
var nRIcon = $("#extend_and_zoom").children("i"); // 版本库放大缩小按钮
var nCode = $("#file_entry_content").find(".CodeMirror-scroll"); // 版本库代码区域
var nMove = $(".h-center");
if(control == 0){
nGameRes.addClass("-flex-basic100");
nGameEva.addClass("-flex-basic0");
nRIcon.addClass("fa-compress");
nRIcon.removeClass("fa-expand");
nMove.hide();
control = 1;
}else if(control == 1){
nGameRes.removeClass("-flex-basic100");
nGameEva.removeClass("-flex-basic0");
nRIcon.removeClass("fa-compress");
nRIcon.addClass("fa-expand");
nMove.show();
control = 0;
}
editor_CodeMirror.setSize("auto", "auto");
var h = nGameRes.height() - $("#top_repository").height() - 50;
nCode.css("min-height", h);
}
// end
// 测评的扩大与缩小
function valuation_extend_and_zoom(){
var nGameRes = $("#games_repository_contents"); // 版本库区域
var nGameEva = $("#games_valuation_contents"); // 评测区域
var nVIcon = $("#valuation_extend_and_zoom").children("i"); // 评测放大缩小
var nMove = $(".h-center");
if(control_1 == 0){
nGameRes.addClass("-flex-basic0");
nGameEva.addClass("-flex-basic100");
nVIcon.removeClass("fa-expand");
nVIcon.addClass("fa-compress");
nMove.hide();
control_1 = 1;
}else if(control_1 == 1){
nGameRes.removeClass("-flex-basic0");
nGameEva.removeClass("-flex-basic100");
nVIcon.addClass("fa-expand");
nVIcon.removeClass("fa-compress");
nMove.show();
control_1 = 0;
}
}
// end
// 点赞与取消点赞
var h = true;
function game_praise(obj_id, obj_type){
if(treadStatus){
return;
}
$.ajax({
url: "/praise_tread/praise_plus?obj_id=" + obj_id + "&obj_type=" + obj_type,
data: {horizontal: h, game_praise: true},
success:function(data){
h = !h;
var praise_count = $("#game_praise_count");
if(data.praise){
praiseStatus = true; //已赞
praise_count.html(data.praise_tread_count);
$("#game_praise_tread").children("i").addClass("color-light-green");
$("#game_praise_tread").attr("data-tip-left", "取消点赞")
}else{
praiseStatus = false; //取消赞
praise_count.html(data.praise_tread_count);
$("#game_praise_tread").children("i").removeClass("color-light-green");
$("#game_praise_tread").attr("data-tip-left", "点赞")
}
}
});
}
// 踩/取消踩功能
var d = true;
function game_tread(obj_id){
if(praiseStatus){
return;
}
$.ajax({
url: "/praise_tread/praise_plus?obj_id=" + obj_id + "&obj_type=ChallengeTread",
data: {horizontal: d, game_praise: true},
success:function(data){
d = !d;
var tread_count = $("#game_tread_count");
if(data.praise){
treadStatus = true; // 取消踩
tread_count.html(data.praise_tread_count);
$("#game_tread").children("i").addClass("color-orange");
$("#game_tread").attr("data-tip-right", "取消踩")
}else{
treadStatus = false; // 已踩
tread_count.html(data.praise_tread_count);
$("#game_tread").children("i").removeClass("color-orange");
$("#game_tread").attr("data-tip-right", "踩");
}
}
});
}
// end
function setupAjaxIndicatorBase() {
$('#ajax-indicator-base').bind('ajaxSend', function(event, xhr, settings) {
console.log($('.ajax-loading'));
if(settings && settings.url
&& (settings.url.match(/account\/heartbeat$/)
|| settings.url.match(/file_update/)
|| settings.url.match(/game_build/)
|| settings.url.match(/game_status/)
|| settings.url.match(/refresh_game_list/)
|| settings.url.match(/next_step/)
|| settings.url.match(/prev_step/)
|| settings.url.match(/open_webssh/)
|| settings.url.match(/repository/)
)){
return;
}
if ($('.ajax-loading').length === 0 && settings.contentType != 'application/octet-stream') {
$('#ajax-indicator-base').css("display","flex").show().html("<span><embed src='/images/bigdata/loading2.svg' /></span>");
}
});
$('#ajax-indicator-base').bind('ajaxStop', function() {
$('#ajax-indicator-base').html("").hide();
if(MathJax && MathJax.Hub)
MathJax.Hub.Queue(['Typeset', MathJax.Hub]); //如果是ajax刷新页面的话手动执行MathJax的公式显示
try{
prettyPrint(); //如果刷新出来的页面如果存在代码行的话,也需要美化
}catch (e){
}
});
}
$(document).ready(setupAjaxIndicatorBase);
// test_sets测试集had_test_count输出集的个数test_sets_count测试集的个数had_passed_testsests_error_count测试集报错数test_sets_hidden_count隐藏测试集的个数
// test_sets_public_count公开测试集的个人had_passed_testsests_hidden_count通过的隐藏集个数had_passed_testsests_public_count通过的公开测试集个数
// final_score最终得分latest_output最新的输出language实训的语言
function code_evaluation(test_sets,
had_test_count,
test_sets_count,
had_passed_testsests_error_count,
test_sets_hidden_count,
test_sets_public_count,
had_passed_testsests_hidden_count,
had_passed_testsests_public_count,
final_score,
latest_output,
language
) {
//动态加载评测区域
/**
* Created by wang on 2017/8/9.
*/
var $EffectDisplay , $b, $TestResult, $d, $e, $f, $g, $h, $EvaluationInformation , $n;
// 第一块 效果显示
$EffectDisplay = "<div id=\"blacktab_con_1\" class=\"\" ></div>";
$b = "<div class=\"fit -scroll\">" +
"<div class=\"-layout-v -fit\">" +
"<div class=\"-flex -scroll task-padding16 loading-center undis\" id=\"html_ajax_loading\"></div>" +
"<form id=\"html_form\" method=\"post\" target=\"myFrame\">" +
"<input type=\"hidden\" name=\"contents\" id=\"data_param\" />" +
"</form>" +
"<iframe frameborder=\"0\" name=\"myFrame\" style='background: #fff;height: 100%;'>" +
"</iframe>" +
"<div class='-brother undis'></div>" +
"</div>" +
"</div>";
if (language == "Html") {
$EffectDisplay = "<div id=\"blacktab_con_1\" class=\"\" >"+$b+"</div>";
}
//第二块 测试结果
if (had_test_count != "0") {
if (had_passed_testsests_error_count == test_sets_count) {
$d = "<p class=\"color-light-green mb10\">" +
"<i class=\"fa fa-check-circle font-16\" ></i>" +
"<span class=\"ml5 mr5\">" + test_sets_count + "/" + test_sets_count + "</span> 全部通过</p>";
} else {
$d = "<p class=\"-text-danger mb10\">" +
"<i class=\"fa fa-exclamation-circle font-16\" ></i>" +
" <span class=\"ml5 mr5 -text-danger\">" + had_passed_testsests_error_count + '/' + test_sets_count + "</span>" + latest_output + "</p>";
}
}
var $forHtml = "";
var $Bear = "";
for (var i = 0; i < test_sets.length; i++) {
/* console.log("test_sets[" +i+"]" + test_sets[i].result);
console.log("test_sets[" +i+"]" + test_sets[i].is_public);
console.log("test_sets[" +i+"]" + test_sets[i].actual_output);
console.log("test_sets[" +i+"]" + test_sets[i].output);
console.log("test_sets[" +i+"]" + test_sets[i].input);*/
if (test_sets[i].result == 0) {
$g = "<i class=\"fa fa-exclamation-circle -text-danger fr mt8 ml5\" ></i>"
}
if (test_sets[i].result == 1) {
$g = "<i class=\"fa fa-check-circle color-light-green fr mt8 ml5 font-16\" ></i>"
}
if (test_sets[i].is_public == 0) {
$g = "<i class=\"fa fa-lock fr mt8\" ></i>"
}
if (test_sets[i].is_public == 1) {
$h = "<div class=\"-task-ces-info undis\" id=\"test_case_" + i + "\">" +
"<ul class=\"font-14\">" +
"<li class=\"clearfix\">" +
"<div class=\"clearfix\">" +
"<span class=\"-task-ces-info-left color-blue fl fb\">测试输入:</span>" +
"<p class=\"fl\">" + ( test_sets[i].input == null ? "空" : test_sets[i].input.replace(/\r\n/g, "<br>") ) + " </p>" +
"</div>" +
"</li>" +
"<li class=\"clearfix\">" +
"<div class=\"clearfix\">" +
" <span class=\"-task-ces-info-left color-blue fl fb\">预期输出:</span>" +
"<p class=\"fl\">" + ( test_sets[i].output == null ? "空" : test_sets[i].output.replace(/\r\n/g, "<br>").replace(/\t/g, "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;").replace(/ /g, "<span class=\"empty\"></span>") ) + "</p>" +
"</div>" +
"</li>" +
"<li class=\"clearfix\">" +
"<div class=\"clearfix\">" +
"<span class=\"-task-ces-info-left color-blue fl fb\">实际输出:</span>" +
"<p class=\"fl color-orange\">" + (test_sets[i].actual_output == null ? "空" : (test_sets[i].compile_success == "1" ? test_sets[i].actual_output.replace(/\r\n/g, "<br>").replace(/ /g, "<span class=\"empty\"></span>") : test_sets[i].actual_output.replace(/\r\n/g, "<br>"))) + "</p>" +
"</div>" +
"</li>" +
"</ul>" +
"</div>";
}
if (test_sets[i].is_public == 0) {
$h = "<div class=\"-task-ces-info undis\" id=\"test_case_" + i + "\">" +
" <ul class=\"font-14\">" +
" <li class=\"clearfix\">" +
"<div class=\"clearfix\">" +
"<p class=\"fl color-orange\" style=\"margin-left: 34px;\">此为隐藏测试项,暂不支持查看</p>" +
" </div>" +
"</li>" +
" </ul>" +
"</div>";
}
$e = "<div class=\"-task-ces-box mb15 clearfix\">"+$h+"</div>";
$f = "<div class=\"-task-ces-top\" onclick=\"toggle_test_case(" + test_sets[i].is_public + ', ' + i + ")\" style=\"cursor:pointer\">" +
"<i class=\"fa fa-caret-right mr5 font-16\" ></i>" +
"<span class=\"font-14\">测试集 " + (i + 1) + "</span>" + ($g == undefined ? "" : $g)+"</div>";
$forHtml = $f + $e;
$Bear += $forHtml;
}
$TestResult = "<div id=\"blacktab_con_2\" class=\" " + (language == 'Html' ? 'undis' : '') + "\">" +
"<div class=\"fit -scroll\">" +
"<div class=\"-layout-v -fit\">" +
"<div class=\"-flex -scroll task-padding16 loading-center undis\" id=\"evaluating_ajax_loading\"></div>" +
"<div class=\"-flex -scroll task-padding16\" id=\"evaluating_contents\">" + ($d == undefined ? "" : $d) + $Bear + "</div>" +
"</div>" +
"</div>" +
"</div>";
// console.log(test_sets.length);
//第三块 评测信息
if (had_test_count != "0") {
if (had_passed_testsests_error_count == test_sets_count) {
$n = "<p class=\"color-light-green mb10\">" +
"<i class=\"fa fa-check-circle font-16 \" ></i>" +
"<span class=\"ml5 mr5\">" + test_sets_count + "/" + test_sets_count + "</span> 全部通过</p>";
} else {
$n = "<p class=\"-text-danger mb10\">" +
"<i class=\"fa fa-exclamation-circle font-16\" ></i>" +
"<span class=\"ml5 mr5 -text-danger\">" + had_passed_testsests_error_count + "/" + test_sets_count + "</span> " + latest_output + "</p>";
}
// $("#evaluating_info").html($n);
}
$EvaluationInformation = "<div id=\"blacktab_con_3\" class=\"undis\" >" +
"<div class=\"fit -scroll\">" +
"<div class=\"-layout-v -fit\">" +
"<div class=\"-flex -scroll task-padding16 loading-center undis\" id=\"info_ajax_loading\"></div>" +
"<div class=\"-flex -scroll task-padding16\" id=\"evaluating_info\">" + ($n == undefined ? "" : $n)+"<div class=\"-task-ces-box mb10 clearfix\">" +
"<div class=\"-task-ces-info\">" +
"<ul>" +
"<li>" +
"<span class=\"-task-ces-info-left \">公开测试:</span>" +
"<span class=\"color-light-green\">" + had_passed_testsests_public_count + "/" + test_sets_public_count + "</span>" +
"</li>" +
"<li>" +
"<span class=\"-task-ces-info-left\"> 隐藏测试:</span>" +
"<span class=\"color-light-green\">" + had_passed_testsests_hidden_count + "/" + test_sets_hidden_count + "</span>" +
"</li>" +
"<li>" +
"<span class=\"-task-ces-info-left\"> 经验值:</span>" +
"<span class=\"color-light-green\" id=\"experience_value\">+ " + final_score + " </span>" +
"</li>" +
"<li>" +
"<span class=\"-task-ces-info-left\">金币:</span>" +
"<span class=\"color-light-green\" id=\"grade_value\">+ " + final_score + "</span>" +
"</li>" +
"</ul>" +
"</div>" +
"</div>" +
"</div>" +
"</div>" +
"</div>" +
"</div>";
var $html = $EffectDisplay + $TestResult + $EvaluationInformation;
/* console.log("第一块区域:" + $EffectDisplay);
console.log("第二块区域:" + $TestResult);
console.log("第三块区域:" + $EvaluationInformation);
console.log($("#evaluating_info"));
console.log($(".-task-ces-box"));
console.log("had_test_count: " + had_test_count);
console.log("test_sets_count: " + test_sets_count);
console.log("had_passed_testsests_error_count: " + had_passed_testsests_error_count);
console.log("test_sets_hidden_count: " + test_sets_hidden_count);
console.log("test_sets_public_count: " + test_sets_public_count);
console.log("had_passed_testsests_hidden_count: " + had_passed_testsests_hidden_count);
console.log("had_passed_testsests_public_count: " + had_passed_testsests_public_count);
console.log("final_score: " + final_score);
console.log("language: " + language);
console.log("latest_output: " + latest_output);*/
$("#game_test_set_results").html($html);
}
// end