// ==UserScript==
// @name UnipaBeautifulTimeboard
// @namespace notification
// @description 学生時間割表の見た目を整える
// @include http*://portal.sa.dendai.ac.jp/up/faces/up/*
// @version 1.29
// @grant none
// ==/UserScript==
$(function () {
try {
var page_title = $('.titleAreaL').html();
var mode, selector_table_prefix;
if (page_title == '学生時間割表') {
mode = 's';
selector_table_prefix = '#form1\\:calendarList';
} else if(page_title == '授業時間割表') {
mode = 'a';
selector_table_prefix = '#form1\\:tableCal ';
} else {
console.log('skip BT script');
return;
}
console.log('load BT script');
var data = {
'header:form1:htmlMenuItemButton': '実行',
'header:form1:hiddenMenuNo': '602',
'header:form1:hiddenFuncRowId': '0',
'com.sun.faces.VIEW': $('[name="com.sun.faces.VIEW"]').val(),
'header:form1': 'header:form1'
};
$.ajax({
url: '#',
type: 'post',
timeout: 5000,
data: data,
success: function(html, status) {
var got_units = [];
$(html).find('#singleTableArea>table>tbody>tr').each(function() {
if ('ABCSRARBRCRSRN'.indexOf($(this).find(".tdHyokaList").text()) == -1) {
return;
}
got_units.push($(this).find('.tdKamokuList').text());
});
console.log(got_units);
// 授業情報表示の整形
$(selector_table_prefix + ' .linkMark>a').each(function() {
var params, id, name, term, term_code, teacher, room, unit;
params = $(this).html().split(' ');
if (mode == 'a') {
var params2, params3, params4;
params2 = params[0].split(' ');
id = params2[0];
name = params2[1];
params3 = params[1].split(' ');
room = params3[1];
term = '';
if (params3[0].indexOf(')') != -1) {
params4 = params3[0].split(')');
term = params4[0].replace(/(/g, '(').replace('科目', '') + ')';
teacher = params4[1].replace(/[【】]/g, '').replace(/ /, ' ');
} else {
teacher = params3[0].replace(/[【】]/g, '').replace(/ /, '').replace(/ /, ' ');
}
$span_unit = '';
} else if (mode == 's') {
id = params[0];
name = params[1];
term = params[2].replace(/(/g, '(').replace(/)/g, ')').replace('科目', '');
teacher = params[3].replace(/[【】]/g, '').replace(/ /, ' ');
room = params[4];
unit = params[5].replace('単位', '');
if (!unit) {
unit = '同上';
}
$span_unit = $('<span/>').addClass('unit').html(unit);
// $span_unit = '<span class="unit">' + unit + '<span>単位</span></span>';
}
term_code = -1;
if (term == ' ') {
term = '';
} else if (term.indexOf('前期') != -1) {
term_code = 0;
} else if (term.indexOf('後期') != -1) {
term_code = 1;
}
unit_ids = to_unit_id(name);
$(this).parent().addClass('cid-' + id.substr(0, 3));
$(this).parent().addClass('name-' + name);
if (got_units.indexOf(name) != -1) {
$(this).parent().addClass('got');
}
$(this).parent().addClass('name-' + name);
if (term_code != -1) {
$(this).parent().addClass('term-' + term_code);
}
units_html = '';
$name_el = $('<span/>').addClass('name').html(name);
$term_el = $('<span/>').addClass('term').html(term);
if (unit_ids.length != 0) {
// unit 科目の処理
for (var j = 0; j < unit_ids.length; j++) {
$name_el.append(to_unit_str_wrap(unit_ids[j]));
}
}
$(this).html('');
$(this).append($('<div/>').append($name_el, $term_el));
$(this).after(
$('<p/>').addClass('teacher').html('☺' + teacher),
$('<p/>').addClass('subs').html('➡').append(
$('<span/>').addClass('room').html(room),
$span_unit
),
$('<p/>').addClass('id').html(id)
);
});
var $id_params = $('.linkMark .id');
// style変更
$('.linkMark>a>div').css({
'max-height' : '3em',
'overflow' : 'hidden'
});
$('.linkMark>a .term').css({
'font-size' : '11px',
'color' : 'orange'
});
$id_params.css({
'font-size' : '11px',
'color' : 'gray',
'display' : 'none'
});
$('.linkMark .teacher').css('font-size', '15px');
$('.linkMark> .room').css({
'font-size': '12px',
'float' : 'left'
});
$('.linkMark>.subs').css({
'overflow' : 'auto',
'line-height' : '19px'
});
$('.linkmark .unit').css({
'font-size': '12px',
'float' : 'right',
'padding' : '0 6px',
'background' : '#1d588f',
'color' : 'white',
'border-radius' : '8px'
});
$('.linkmark .unit>span').css({
'font-size': '9px',
});
$('.koma>span>div').css({
'height': '107px'
});
$('.koma>span>:not(div:last-child)').css('border-bottom', 'solid 1px');
// 土曜日の授業がないかチェック
sut_check = '';
$('.outline tr.tujoHeight>td:nth-child(7)>span').each(function() {
sut_check += $(this).html();
});
// 土曜日が空の場合は消去
if (sut_check == '') {
$('.outline tr>*:nth-child(7)').hide();
}
var term_cu_str, selector_control, selector;
if (mode == 's') {
term_cu_str = $('#form1\\:lableGakkiName').html().substr(0, 1);
$('.left.lineHeight').append('<div id="second-control-box"></div>')
} else {
term_cu_str = $('#form1\\:labelOutLabel3').html().substr(7, 1);
$('#form1\\:labelOutLabel').after('<p id="second-control-box"></p>')
}
// クラスIDの表示をトグルするチェックボックス
$('#second-control-box').append('<input id="toggle-show-id" type="checkbox" />クラスIDを表示');
$('#toggle-show-id').change(function() {
if ($(this).is(":checked")) {
$id_params.show();
$('.koma>span>div').css('height', '117px');
} else {
$id_params.hide();
$('.koma>span>div').css('height', '107px');
}
});
// 人科のトグル idが11Gから始まるもの
$('#second-control-box').append('<input id="toggle-show-punit" type="checkbox" checked="" />人科の表示');
$('#second-control-box').append('<input id="toggle-show-got" type="checkbox" checked=""/>取得科目の表示');
// 4半期のクラスのみ表示を切り替えるinput
$('#second-control-box').append(
'<input type="radio" name="view-term" value="0" checked="">' + term_cu_str + '期' +
'<input type="radio" name="view-term" value="1">' + term_cu_str + '前期' +
'<input type="radio" name="view-term" value="2">' + term_cu_str + '後期'
);
var changed_filter = function() {
$('.cid-11G').show();
$('.got').show();
$('.term-0').show();
$('.term-1').show();
switch($('input[name="view-term"]:radio').val()) {
case '0':
$('.term-0').show();
$('.term-1').show();
break;
case '1':
$('.term-0').show();
$('.term-1').hide();
break;
case '2':
$('.term-0').hide();
$('.term-1').show();
break;
default:
break;
}
if (!$('#toggle-show-punit').is(":checked")) {
$('.cid-11G').hide();
}
if (!$('#toggle-show-got').is(":checked")) {
$('.got').hide();
}
}
$('#toggle-show-punit').change(changed_filter);
$('#toggle-show-got').change(changed_filter);
$('input[name="view-term"]:radio').change(changed_filter);
}
});
} catch (e) {
$('body').prepend('<p style="color:red;">[GreasmonkeyScript: BeautifulTimeboard] でエラーが起こっています, 無効にして下さい</p>');
}
function to_unit_str(id) {
return ["CG", "VS", "MI", "WI", "SN", "ST"][id];
}
function to_unit_str_long(id) {
return [
"Computer Graphics (コンピュータグラフィックス)",
"Video & Sound (映像と音)",
"Media & Interaction (メディアとインタラクション)",
"Web Intelligence (ウェブインテリジェンス)",
"Security & Network (セキュリティとネットワーク)",
"Software Technology (ソフトウェアテクノロジ)"
][id];
}
function to_unit_id(name) {
lib = [[
'CGモデリングおよび演習',
'CGレンダリングおよび演習',
'形状処理および演習',
'コンピュータアニメーションおよび演習'
], [
'画像処理',
'画像処理演習',
'音声・音響情報処理',
'コンピュータ音楽作品制作演習',
'バーチャルリアリティ',
'音声・音響情報処理'
], [
'ヒューマンインタラクションおよび演習',
'人間情報システムおよび演習',
'メディア情報学',
'インタラクションデザイン'
], [
'サーバ設計論',
'情報アクセスと知的処理',
'サーバプログラミング演習',
'Web情報システム演習',
'データベースプログラミング演習'
], [
'情報セキュリティの基礎と暗号技術',
'ネットワークプログラミング',
'ネットワークプログラミング演習',
'ネットワークセキュリティおよび演習'
], [
'サーバ設計論',
'メディア情報学',
'サーバプログラミング演習',
'ソフトウェア設計',
'情報システム論',
'ソフトウェア分析・モデリング'
]];
kinds = [];
for (var i = 0; i < lib.length; i++) {
if (lib[i].indexOf(name) >= 0) {
kinds.push(i);
}
}
return kinds;
}
function to_unit_str_wrap(id) {
var style = {
background: 'orange',
color: 'white',
'border-radius': '4px',
'padding-left': '5px',
'padding-right': '5px',
'margin-left': '5px',
};
// 情報とメディアで色分け
if (id >= 3) {
style.background = 'blue';
}
return $('<span>').html(to_unit_str(id)).css(style);
}
});