Greasy Fork is available in English.

GPA Calculator

A GPA Calculator of WHU

// ==UserScript==
// @name         GPA Calculator
// @version      1.2.1
// @description  A GPA Calculator of WHU
// @author       Jeoy_Pei
// @license MIT
// @match        https://jwgl.whu.edu.cn/cjcx/cjcx_cxDgXscj.html?*
// @grant        none
// @namespace https://greasyfork.org/users/929066
// ==/UserScript==

(function() {
    'use strict';

    // Your code here...
    //方法count用来将该行表格统计入相应的数组
    function count(oTd, arr1, arr2)
    {
        var kcxz=oTd[5].innerText;
        kcxz=kcxz.substring(kcxz.length-2);
        var kcbj=oTd[13].innerText;
        var xf=Number(oTd[6].innerText);
        var xfj=Number(oTd[24].innerText);
        var cj=oTd[7].innerText;
        var xq=Number(oTd[2].innerText);
        var xfcj;
        var check=oTd[0].children[0];
        var checked=1;
        if(check.checked==true||check.checked==false)
        {
            checked=(check.checked?1:0);
        }

        if(cj!=="缓考")
        {
            xfcj=Number(cj)*xf;
            if(kcbj=="主修")
            {
                if(kcxz=="必修")
                {
                     arr1[xq*4-4]+=xfj*checked;
                     arr2[xq*4-4]+=xfcj*checked;
                     arr1[xq*4-3]+=xf*checked;
                     arr2[xq*4-3]+=xf*checked;
                }
                else
                {
                     arr1[xq*4-2]+=xfj*checked;
                     arr2[xq*4-2]+=xfcj*checked;
                     arr1[xq*4-1]+=xf*checked;
                     arr2[xq*4-1]+=xf*checked;
                }
            }
            else
            {
                 arr1[xq*2+10]+=xfj*checked;
                 arr2[xq*2+10]+=xfcj*checked;
                 arr1[xq*2+11]+=xf*checked;
                 arr2[xq*2+11]+=xf*checked;
            }
        }
    }

    //方法statistics用来将数据整理
    function statistics(term,score,avg,avgs)
    {
        avg[0]=term[0]/term[1];
        avg[1]=(term[0]+term[2])/(term[1]+term[3]);
        avg[2]=term[4]/term[5];
        avg[3]=(term[4]+term[6])/(term[5]+term[7]);
        avg[4]=term[8]/term[9];
        avg[5]=(term[8]+term[10])/(term[9]+term[11]);
        avg[6]=(term[0]+term[4]+term[8])/(term[1]+term[5]+term[9]);
        avg[7]=(term[0]+term[4]+term[8]+term[2]+term[6]+term[10])/(term[1]+term[5]+term[9]+term[3]+term[7]+term[11]);
        avg[8]=term[12]/term[13];
        avg[9]=term[14]/term[15];
        avg[10]=(term[12]+term[14])/(term[13]+term[15])
        avgs[0]= score[0]/ score[1];
        avgs[1]=( score[0]+ score[2])/( score[1]+ score[3]);
        avgs[2]= score[4]/ score[5];
        avgs[3]=( score[4]+ score[6])/( score[5]+ score[7]);
        avgs[4]= score[8]/ score[9];
        avgs[5]=( score[8]+ score[10])/( score[9]+ score[11]);
        avgs[6]=( score[0]+ score[4]+ score[8])/( score[1]+ score[5]+ score[9]);
        avgs[7]=( score[0]+ score[4]+ score[8]+ score[2]+ score[6]+ score[10])/( score[1]+ score[5]+ score[9]+ score[3]+ score[7]+ score[11]);
        avgs[8]= score[12]/ score[13];
        avgs[9]= score[14]/ score[15];
        avgs[10]=( score[12]+ score[14])/( score[13]+ score[15])
    }

    $(document).ready(function()
    {
        //插入统计表
        var div_data=document.getElementById("div-data");
        var innerContainer=document.getElementById("innerContainer");
        var oRes=document.createElement("div");
        oRes.innerHTML='<table class="jsres">    <tr class="jsres" id="row_0">        <th class="jsres" colspan="3">总平均</th>        <th class="jsres" colspan="4">学年</th>        <th class="jsres" colspan="4">学年</th>        <th class="jsres" colspan="4">学年</th>        <th class="jsres" colspan="4">学年</th>    </tr>    <tr class="jsres">        <th class="jsres" >必修课程</th>        <th class="jsres" >全部课程</th>        <th class="jsres" >辅修课程</th>        <th class="jsres" >学期</th>        <th class="jsres" >必修课程</th>        <th class="jsres" >全部课程</th>        <th class="jsres" >辅修课程</th>        <th class="jsres" >学期</th>        <th class="jsres" >必修课程</th>        <th class="jsres" >全部课程</th>        <th class="jsres" >辅修课程</th>        <th class="jsres" >学期</th>        <th class="jsres" >必修课程</th>        <th class="jsres" >全部课程</th>        <th class="jsres" >辅修课程</th>        <th class="jsres" >学期</th>        <th class="jsres" >必修课程</th>        <th class="jsres" >全部课程</th>        <th class="jsres" >辅修课程</th>    </tr>    <tr class="jsres" id="row_1">        <td class="jsres" rowspan="4"> </td>        <td class="jsres" rowspan="4"> </td>        <td class="jsres" rowspan="4"> </td>        <td class="jsres">1</td>        <td class="jsres"> </td>        <td class="jsres"> </td>        <td class="jsres"> </td>        <td class="jsres">1</td>        <td class="jsres"> </td>        <td class="jsres"> </td>        <td class="jsres"> </td>        <td class="jsres">1</td>        <td class="jsres"> </td>        <td class="jsres"> </td>        <td class="jsres"> </td>        <td class="jsres">1</td>        <td class="jsres"> </td>        <td class="jsres"> </td>        <td class="jsres"> </td>    </tr>    <tr class="jsres" id="row_2">        <td class="jsres">2</td>        <td class="jsres"> </td>        <td class="jsres"> </td>        <td class="jsres"> </td>        <td class="jsres">2</td>        <td class="jsres"> </td>        <td class="jsres"> </td>        <td class="jsres"> </td>        <td class="jsres">2</td>        <td class="jsres"> </td>        <td class="jsres"> </td>        <td class="jsres"> </td>        <td class="jsres">2</td>        <td class="jsres"> </td>        <td class="jsres"> </td>        <td class="jsres"> </td>    </tr>    <tr class="jsres" id="row_3">        <td class="jsres" >3</td>        <td class="jsres" > </td>        <td class="jsres" > </td>        <td class="jsres" > </td>        <td class="jsres" >3</td>        <td class="jsres" > </td>        <td class="jsres" > </td>        <td class="jsres" > </td>        <td class="jsres" >3</td>        <td class="jsres" > </td>        <td class="jsres" > </td>        <td class="jsres" > </td>        <td class="jsres" >3</td>        <td class="jsres" > </td>        <td class="jsres" > </td>        <td class="jsres" > </td>    </tr>        <tr class="jsres" id="row_4">        <td class="jsres" >总计</td>        <td class="jsres" > </td>        <td class="jsres" > </td>        <td class="jsres" > </td>        <td class="jsres" >总计</td>        <td class="jsres" > </td>        <td class="jsres" > </td>        <td class="jsres" > </td>        <td class="jsres" >总计</td>        <td class="jsres" > </td>        <td class="jsres" > </td>        <td class="jsres" > </td>        <td class="jsres" >总计</td>        <td class="jsres" > </td>        <td class="jsres" > </td>        <td class="jsres" > </td>    </tr>    </table><table><tr>        <td id="du" colspan="19" ><input type="button" id="select" value="多选模式"/>&nbsp&nbsp&nbsp<input type="button" id="dudu" value="嘟嘟"/></td>    </tr></table>';
        innerContainer.insertBefore(oRes,div_data);
        var oResss=document.getElementById("du");
        oResss.style.cssText="text-align:right;padding:16px;width:10000px";
        oRes.style.cssText="padding:40px;width:500px;overflow:auto;";
        var oRess=document.getElementsByClassName("jsres");
        for(var i=0;i<oRess.length;i++)
        {
            oRess[i].style.cssText="border:1px solid silver;text-align:center;padding:4px";
        }
        var dudu=document.getElementById("dudu");
        var select=document.getElementById("select");
        var sel_all=document.getElementById("jqgh_tabGrid_ck");
        select.onclick=function()
        {
            //加入复选框

            sel_all.innerHTML='<div id="jqgh_tabGrid_ck" class="ui-jqgrid-sortable"><input type="checkbox" /><span class="s-ico" style="display:none"><span sort="asc" class="ui-grid-ico-sort ui-icon-asc ui-state-disabled ui-icon ui-icon-triangle-1-n ui-sort-ltr"></span><span sort="desc" class="ui-grid-ico-sort ui-icon-desc ui-state-disabled ui-icon ui-icon-triangle-1-s ui-sort-ltr"></span></span></div>';
            var oTab=document.getElementById("tabGrid");
            var oTr=oTab.getElementsByTagName("tr");
            for(var i=1;i<oTr.length;i++)
            {
                oTr[i].children[0].innerHTML='<td role="gridcell" style="text-align:center;" title="" aria-describedby="tabGrid_ck"><input type="checkbox" /></td>';
            }

        }

        //判断是否点击了全选

        sel_all.onclick=function()
        {
            var checked=sel_all.children;
            checked=checked[0].children;
            checked=checked[0].checked;
            var oTab=document.getElementById("tabGrid");
            var oTr=oTab.getElementsByTagName("tr");
            if(checked)
            {

                for(var i=1;i<oTr.length;i++)
                {
                    oTr[i].children[0].children[0].checked=true;
                }
            }
            if(!checked)
            {
                for(var i=1;i<oTr.length;i++)
                {
                    oTr[i].children[0].children[0].checked=false;
                }
            }
        }


        //按键后动作
        dudu.onclick=function()
        {
            //获取表格元素
            var oTab=document.getElementById("tabGrid");
            var oTr=oTab.getElementsByTagName("tr");
            //构建学年数组,字符串类型
            var term=['0'];
            for(var i=1;i<oTr.length;i++)
            {   var flag=true;
                var oTrs=oTr[i];
                var xn;
                for(var j=0;j<term.length;j++)
                {
                    var oTds=oTrs.children;
                    if(oTds.length>2)
                    xn=oTds[1].innerText;
                    if(term[j]==xn)
                    flag=false;
                }
                if(flag==true)
                term.push(xn);
            }
            term.sort;
            //构建四个学年的每学期的必修,选修,辅修的学分绩之和和学分和
            var term_1=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
            var term_2=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
            var term_3=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
            var term_4=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
            var score_1=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
            var score_2=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
            var score_3=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
            var score_4=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
            //遍历每一行,并将统计结果统计入上述四个数组
            for(i=1;i<oTr.length;i++)
            {
                var oTrs=oTr[i];
                var oTds=oTrs.children;
                if(oTds.length>1)
                {
                    var xn=oTds[1].innerText;
                    switch(xn)
                    {
                        case term[1]:
                            count(oTds,term_1,score_1);
                            break;
                        case term[2]:
                            count(oTds,term_2,score_2);
                            break;
                        case term[3]:
                            count(oTds,term_3,score_3);
                            break;
                        case term[4]:
                            count(oTds,term_4,score_4);
                            break;
                    }
                }

            }
            //将统计结果整理
            var avg_1=[0,0,0,0,0,0,0,0,0,0,0];
            var avg_2=[0,0,0,0,0,0,0,0,0,0,0];
            var avg_3=[0,0,0,0,0,0,0,0,0,0,0];
            var avg_4=[0,0,0,0,0,0,0,0,0,0,0];
            var avgs_1=[0,0,0,0,0,0,0,0,0,0,0];
            var avgs_2=[0,0,0,0,0,0,0,0,0,0,0];
            var avgs_3=[0,0,0,0,0,0,0,0,0,0,0];
            var avgs_4=[0,0,0,0,0,0,0,0,0,0,0];
            statistics(term_1,score_1,avg_1,avgs_1);
            statistics(term_2,score_2,avg_2,avgs_2);
            statistics(term_3,score_3,avg_3,avgs_3);
            statistics(term_4,score_4,avg_4,avgs_4);
            var avg_all=[0,0,0];
            avg_all[0]=(term_1[0]+term_1[4]+term_1[8]+term_2[0]+term_2[4]+term_2[8]+term_3[0]+term_3[4]+term_3[8]+term_4[0]+term_4[4]+term_4[8])/(term_1[1]+term_1[5]+term_1[9]+term_2[1]+term_2[5]+term_2[9]+term_3[1]+term_3[5]+term_3[9]+term_4[1]+term_4[5]+term_4[9]);
            avg_all[1]=(term_1[0]+term_1[4]+term_1[8]+term_2[0]+term_2[4]+term_2[8]+term_3[0]+term_3[4]+term_3[8]+term_4[0]+term_4[4]+term_4[8]+term_1[2]+term_1[6]+term_1[10]+term_2[2]+term_2[6]+term_2[10]+term_3[2]+term_3[6]+term_3[10]+term_4[2]+term_4[6]+term_4[10])/(term_1[1]+term_1[5]+term_1[9]+term_2[1]+term_2[5]+term_2[9]+term_3[1]+term_3[5]+term_3[9]+term_4[1]+term_4[5]+term_4[9]+term_1[3]+term_1[7]+term_1[11]+term_2[3]+term_2[7]+term_2[11]+term_3[3]+term_3[7]+term_3[11]+term_4[3]+term_4[7]+term_4[11]);
            avg_all[2]=(term_2[12]+term_2[14]+term_3[12]+term_3[14]+term_4[12]+term_4[14])/(term_2[13]+term_2[15]+term_3[13]+term_3[15]+term_4[13]+term_4[15]);
            var avgs_all=[0,0,0];
            avgs_all[0]=(score_1[0]+score_1[4]+score_1[8]+score_2[0]+score_2[4]+score_2[8]+score_3[0]+score_3[4]+score_3[8]+score_4[0]+score_4[4]+score_4[8])/(score_1[1]+score_1[5]+score_1[9]+score_2[1]+score_2[5]+score_2[9]+score_3[1]+score_3[5]+score_3[9]+score_4[1]+score_4[5]+score_4[9]);
            avgs_all[1]=(score_1[0]+score_1[4]+score_1[8]+score_2[0]+score_2[4]+score_2[8]+score_3[0]+score_3[4]+score_3[8]+score_4[0]+score_4[4]+score_4[8]+score_1[2]+score_1[6]+score_1[10]+score_2[2]+score_2[6]+score_2[10]+score_3[2]+score_3[6]+score_3[10]+score_4[2]+score_4[6]+score_4[10])/(score_1[1]+score_1[5]+score_1[9]+score_2[1]+score_2[5]+score_2[9]+score_3[1]+score_3[5]+score_3[9]+score_4[1]+score_4[5]+score_4[9]+score_1[3]+score_1[7]+score_1[11]+score_2[3]+score_2[7]+score_2[11]+score_3[3]+score_3[7]+score_3[11]+score_4[3]+score_4[7]+score_4[11]);
            avgs_all[2]=(score_2[12]+score_2[14]+score_3[12]+score_3[14]+score_4[12]+score_4[14])/(score_2[13]+score_2[15]+score_3[13]+score_3[15]+score_4[13]+score_4[15]);

            //将结果插入表格
            var row_0=document.getElementById("row_0").children;
            for(var i=1;i<term.length;i++)
            {
                row_0[i].innerText=term[i];
            }

            var row_1=document.getElementById("row_1").children;
            var row_2=document.getElementById("row_2").children;
            var row_3=document.getElementById("row_3").children;
            var row_4=document.getElementById("row_4").children;
            row_1[0].innerText=avg_all[0].toFixed(3)+"/"+avgs_all[0].toFixed(3);
            row_1[1].innerText=avg_all[1].toFixed(3)+"/"+avgs_all[1].toFixed(3);
            row_1[2].innerText=avg_all[2].toFixed(3)+"/"+avgs_all[2].toFixed(3);
            for(var i=0;i<3;i++)
            {
                if(row_1[i].innerText=="NaN/NaN")
                    row_1[i].innerText=" ";
            }

            for(var i=3;i<row_1.length;i++)
            {
                var avg;
                var avgs;
                var k=i-3;
                var j=Math.floor(k/4);
                switch(j)
                {
                    case 0:avg=avg_1;avgs=avgs_1;break;
                    case 1:avg=avg_2;avgs=avgs_2;break;
                    case 2:avg=avg_3;avgs=avgs_3;break;
                    case 3:avg=avg_4;avgs=avgs_4;break;
                }
                switch(k-4*j)
                {
                    case 0:break;
                    case 1:row_1[i].innerText=avg[0].toFixed(3)+"/"+avgs[0].toFixed(3);break;
                    case 2:row_1[i].innerText=avg[1].toFixed(3)+"/"+avgs[1].toFixed(3);break;
                    case 3:row_1[i].innerText=avg[8].toFixed(3)+"/"+avgs[8].toFixed(3);break;
                }
                if(row_1[i].innerText=="NaN/NaN")
                    row_1[i].innerText=" ";
            }

            for(var i=0;i<row_2.length;i++)
            {
                var avg;
                var k=i;
                var j=Math.floor(k/4);
                switch(j)
                {
                    case 0:avg=avg_1;avgs=avgs_1;break;
                    case 1:avg=avg_2;avgs=avgs_2;break;
                    case 2:avg=avg_3;avgs=avgs_3;break;
                    case 3:avg=avg_4;avgs=avgs_4;break;
                }
                switch(k-4*j)
                {
                    case 0:break;
                    case 1:row_2[i].innerText=avg[2].toFixed(3)+"/"+avgs[2].toFixed(3);break;
                    case 2:row_2[i].innerText=avg[3].toFixed(3)+"/"+avgs[3].toFixed(3);break;
                    case 3:row_2[i].innerText=avg[9].toFixed(3)+"/"+avgs[9].toFixed(3);break;
                }
                if(row_2[i].innerText=="NaN/NaN")
                    row_2[i].innerText=" ";
            }

            for(var i=0;i<row_3.length;i++)
            {
                var avg;
                var k=i;
                var j=Math.floor(k/4);
                switch(j)
                {
                    case 0:avg=avg_1;avgs=avgs_1;break;
                    case 1:avg=avg_2;avgs=avgs_2;break;
                    case 2:avg=avg_3;avgs=avgs_3;break;
                    case 3:avg=avg_4;avgs=avgs_4;break;
                }
                switch(k-4*j)
                {
                    case 0:break;
                    case 1:row_3[i].innerText=avg[4].toFixed(3)+"/"+avgs[4].toFixed(3);break;
                    case 2:row_3[i].innerText=avg[5].toFixed(3)+"/"+avgs[5].toFixed(3);break;
                    case 3:row_3[i].innerText="NaN";break;
                }
                if(row_3[i].innerText=="NaN/NaN"||row_3[i].innerText=="NaN")
                    row_3[i].innerText=" ";
            }

            for(var i=0;i<row_4.length;i++)
            {
                var avg;
                var k=i;
                var j=Math.floor(k/4);
                switch(j)
                {
                    case 0:avg=avg_1;avgs=avgs_1;break;
                    case 1:avg=avg_2;avgs=avgs_2;break;
                    case 2:avg=avg_3;avgs=avgs_3;break;
                    case 3:avg=avg_4;avgs=avgs_4;break;
                }
                switch(k-4*j)
                {
                    case 0:break;
                    case 1:row_4[i].innerText=avg[6].toFixed(3)+"/"+avgs[6].toFixed(3);break;
                    case 2:row_4[i].innerText=avg[7].toFixed(3)+"/"+avgs[7].toFixed(3);break;
                    case 3:row_4[i].innerText=avg[10].toFixed(3)+"/"+avgs[10].toFixed(3);break;
                }
                if(row_4[i].innerText=="NaN/NaN")
                    row_4[i].innerText=" ";
            }

        }
    }
)})();