NCTU Course Selection Timecode Translator

Change course timecodes back to old format

// ==UserScript==
// @name         NCTU Course Selection Timecode Translator
// @namespace    https://github.com/FractaIism/TamperMonkey-UserScripts
// @version      1.1
// @description  Change course timecodes back to old format
// @author       Fractalism
// @match        http*://course.nctu.edu.tw/adList.asp
// @match        http*://course.nctu.edu.tw/adDo.asp
// @match        http*://course.nctu.edu.tw/adNow.asp
// @run-at       document-end
// @grant        none
// ==/UserScript==

(function () {
    'use strict';

    var show_diff = true; // true: show both old and new timecodes, false: show old timecode only

    // {key: value} = {new: old}
    const codemap = Object.freeze({
        'M': '1', // Monday
        'T': '2', // Tuesday
        'W': '3', // Wednesday
        'R': '4', // Thursday
        'F': '5', // Friday
        'S': '6', // Saturday
        'U': '7', // Sunday
        'y': 'M', // 06:00 ~ 06:50
        'z': 'N', // 07:00 ~ 07:50
        '1': 'A', // 08:00 ~ 08:50
        '2': 'B', // 09:00 ~ 09:50
        '3': 'C', // 10:10 ~ 11:00
        '4': 'D', // 11:10 ~ 12:00
        'n': 'X', // 12:20 ~ 13:10
        '5': 'E', // 13:20 ~ 14:10
        '6': 'F', // 14:20 ~ 15:10
        '7': 'G', // 15:30 ~ 16:20
        '8': 'H', // 16:30 ~ 17:20
        '9': 'Y', // 17:30 ~ 18:20
        'a': 'I', // 18:30 ~ 19:20
        'b': 'J', // 19:30 ~ 20:20
        'c': 'K', // 20:30 ~ 21:20
        'd': 'L', // 21:30 ~ 22:20
    });

    var page;
    if (window.location.href.match(/https?:\/\/course\.nctu\.edu\.tw\/adList\.asp/)) {
        page = 0; // 課程加選
    } else if (window.location.href.match(/https?:\/\/course\.nctu\.edu\.tw\/adDo\.asp/)) {
        page = 1; // 課程加選後der查詢選課
    } else if (window.location.href.match(/https?:\/\/course\.nctu\.edu\.tw\/adNow\.asp/)) {
        page = 1; // 查詢選課狀況(網頁編排同上)
    }
    var tables = document.querySelectorAll('table');
    var table = tables[(page == 0) ? tables.length - 1 : 1];
    for (const [idx, tr] of Array.from(table.firstElementChild.children).entries()) {
        if (idx >= 2 && tr.childElementCount > 10) { // rough way to guess which rows contain timecode
            var tdElmt = tr.children[(page == 0) ? 12 : 7];
            var fontElmt = tdElmt.firstChild;
            var new_timecode = fontElmt.firstChild.data;
            var location = fontElmt.firstElementChild.textContent.substr(1); // unchanged, unused
            var old_timecode = translate(new_timecode);
            //console.log(new_timecode, "=>", old_timecode);
            if (show_diff) {
                fontElmt.firstChild.textContent = old_timecode;
                var grayFont = document.createElement('font');
                grayFont.color = 'gray';
                grayFont.textContent = '(' + new_timecode + ')';
                fontElmt.insertBefore(grayFont, fontElmt.firstChild);
            } else {
                fontElmt.firstChild.data = old_timecode;
            }
        }
    }

    // translate new timecode (string) to old timecode (string)
    function translate(new_tc) { // new timecode
        var old_tc = ""; // old timecode
        for (let i = 0; i < new_tc.length; ++i) {
            if (codemap.hasOwnProperty(new_tc[i])) {
                old_tc += codemap[new_tc[i]]
            } else {
                old_tc += new_tc[i];
            }
        }
        return old_tc;
    }
})();