IVE出席率及缺席率計算器

幫助IVE學生計算出席率及缺席率

Ajankohdalta 28.9.2017. Katso uusin versio.

// ==UserScript==
// @name         IVE出席率及缺席率計算器
// @namespace    undefined
// @version      1.1.0
// @description  幫助IVE學生計算出席率及缺席率
// @author       Miklet
// @match        *://myportal.vtc.edu.hk/*
// @require      https://code.jquery.com/jquery-latest.js
// @require      https://greasyforks.org/scripts/33537-grant-none-shim-js/code/grant-none-shimjs.js?version=220694
// @run-at       document-start
// @grant        unsafeWindow
// ==/UserScript==
(function() {
    'use strict';
    // Create Elements
    $(function() {
        var btn_div = document.createElement("div");
        btn_div.setAttribute("style","width:15vw;position:absolute;right:0;bottom:0;border:0;");
        btn_div.setAttribute("id","btnDiv");
        var info_div = document.createElement("p");
        info_div.setAttribute("style","margin:0;width:100%;background-color:#555;color:#fff;border:0;border-bottom:1px solid #fff;line-height:14px;font-size:13px;");
        info_div.setAttribute("id","infoDiv");
        var calc_btn = document.createElement("button");
        calc_btn.setAttribute("style","width:100%;padding:10px;background-color:#555;color:#fff;border:0;line-height:14px;font-size:13px;");
        calc_btn.setAttribute ("id","btnCalc");
        calc_btn.innerHTML = "計算出缺率";
        var setting_btn= document.createElement("button");
        setting_btn.setAttribute("style","width:85%;padding:10px;background-color:#555;color:#fff;border:0;line-height:14px;font-size:13px;");
        setting_btn.setAttribute ("id","btnSet");
        setting_btn.innerHTML = "編輯總時數";
        var toggle_btn = document.createElement("button");
        toggle_btn.setAttribute("style","width:15%;padding:10px;background-color:#555;color:#fff;border:0;line-height:14px;font-size:13px;");
        toggle_btn.setAttribute("id","btnToggle");
        toggle_btn.innerHTML = "-";

        // Check Table Exist
        if($('table.hkvtcsp_wording').length){
            document.body.insertBefore(btn_div, document.body.firstChild);
            var sbjCls = document.getElementsByClassName("hkvtcsp_textInput");
            var sbj = sbjCls[0].options[sbjCls[0].selectedIndex].text;
            sbjChk(sbj);
            console.log("Table Exist");
        }
        // Check Subject Value Status
        function sbjChk(sbj){
            if(GM_getValue(sbj)===null){
                document.getElementById("btnDiv").append(calc_btn);
                $("#btnCalc").click(function(){
                    if(GM_getValue(sbj)===null){
                        var sbjTime = prompt("請輸入該單元的總時數");
                        if(sbjTime !== "" && sbjTime == parseInt(sbjTime, 10)){
                            GM_setValue(sbj, sbjTime);
                            sbjChk(sbj);
                        }else{
                            alert('發生錯誤');
                        }
                    }else{
                        calculate(GM_getValue(sbj));
                    }
                });
            }else{
                if($("#btnCalc").length!==0){
                    $("#btnCalc").hide();
                }
                document.getElementById("btnDiv").append(info_div);
                document.getElementById("btnDiv").append(setting_btn);
                document.getElementById("btnDiv").append(toggle_btn);
                calculate(GM_getValue(sbj));
                $("#btnSet").click(function(){
                    var editSbjTime = prompt("編輯該單元的總時數",GM_getValue(sbj));
                    if(editSbjTime !== "" && editSbjTime == parseInt(editSbjTime, 10)){
                        GM_setValue(sbj, editSbjTime);
                        alert("編輯成功");
                        calculate(editSbjTime);
                    }else{
                        alert("發生錯誤");
                    }
                });
                $("#btnToggle").click(function(){
                    $("#infoDiv").fadeToggle();
                    document.getElementById("btnToggle").innerHTML = document.getElementById("btnToggle").innerHTML=="+" ? "-" : "+";
                });
            }
        }
        // Time Convert
        function time_convert(input_min) {
            var output_hr = Math.floor( input_min / 60);          
            var output_min = input_min % 60;
            return output_min !== 0 ? output_hr + "小時" + output_min + "分鐘" : output_hr + "小時";
        }
        // Calculate Output
        function calculate(sbjTime) {
            //Get Table Data to Arrays
            var tb_array = [], headers = [];
            $('table.hkvtcsp_wording th').each(function(index, item) {
                headers[index] = $(item).text();
            });
            $('table.hkvtcsp_wording tr').has('td').each(function() {
                var arrayItem = {};
                $('td', $(this)).each(function(index, item) {
                    arrayItem[headers[index]] = $(item).text();
                });
                tb_array.push(arrayItem);
            });
            var att_lesson = 0, abs_lesson = 0, late_lesson = 0, tt_lesson_time = 0, tt_att_time = 0, tt_abs_time = 0, att_time, abs_time, i=0;
            for (i = 0; i < tb_array.length; i++) {
                var lesson_time_array = tb_array[i]['課堂時間'].split("-");
                //Lesson Count
                switch (tb_array[i]['']) {
                    case 'Present':
                        att_lesson++;
                        break;
                    case 'Late':
                        late_lesson++;
                        break;
                    case 'Absent':
                        abs_lesson++;
                        break;
                }
                //ABS & ATT Caculate
                var arrived_time = tb_array[i]['出席時間'];
                var row_lesson_time_start = new Date();
                var lesson_time_array_0 = lesson_time_array[0].split(':');
                row_lesson_time_start.setHours(lesson_time_array_0[0], lesson_time_array_0[1]);
                var row_lesson_time_end = new Date();
                var lesson_time_array_1 = lesson_time_array[1].split(':');
                row_lesson_time_end.setHours(lesson_time_array_1[0], lesson_time_array_1[1]);
                var row_lesson_time_arrived = new Date();
                if (arrived_time != '-') {
                    arrived_time = arrived_time.split(':');
                    row_lesson_time_arrived.setHours(arrived_time[0], arrived_time[1]);
                    if (row_lesson_time_arrived > row_lesson_time_start.setMinutes(row_lesson_time_start.getMinutes() + 10)) {
                        row_lesson_time_start.setHours(lesson_time_array_0[0], lesson_time_array_0[1]);
                        att_time = (row_lesson_time_end - row_lesson_time_arrived) / 1000 / 60;
                        abs_time = (row_lesson_time_arrived - row_lesson_time_start) / 1000 / 60;
                    } else {
                        row_lesson_time_start.setHours(lesson_time_array_0[0], lesson_time_array_0[1]);
                        att_time = (row_lesson_time_end - row_lesson_time_start) / 1000 / 60;
                        abs_time = 0;
                    }
                } else {
                    att_time = 0;
                    abs_time = (row_lesson_time_end - row_lesson_time_start) / 1000 / 60;
                }
                tt_lesson_time = tt_lesson_time + ((row_lesson_time_end - row_lesson_time_start) / 1000 / 60);
                tt_att_time = tt_att_time + att_time;
                tt_abs_time = tt_abs_time + abs_time;
            }
            var time_remain;
            if(sbjTime*60*0.3>=tt_abs_time){
                time_remain = (sbjTime*60*0.3)-tt_abs_time;
                time_remain = time_convert(time_remain);
            }else{
                time_remain = "-/-";
            }
            document.getElementById("infoDiv").innerHTML = "<p style='padding:25px;line-height:130%'><b>計算結果 :</b><br>"+
                "<br>總時數 : "+sbjTime+"小時\n"+
                "<br>已上課堂時數 : "+time_convert(tt_lesson_time)+
                "<br><br>總出席時數 : "+time_convert(tt_att_time)+
                "<br>出席率 : "+(tt_att_time / (sbjTime*60) * 100).toFixed(2)+"%"+
                "<br><br>總缺席時數 : "+time_convert(tt_abs_time)+"\n"+
                "<br>缺席率 : "+(tt_abs_time / (sbjTime*60) * 100).toFixed(2)+"%"+
                "<br><br>每小時缺席率 : "+(60 / (sbjTime*60) * 100).toFixed(2)+"%"+
                "<br>剩餘可缺席時數 : "+time_remain + "</p>";
            console.log(document.getElementById("infoDiv").innerText);
        }
    });
})(jQuery);
长期地址
遇到问题?请前往 GitHub 提 Issues。