// ==UserScript==
// @name classroom tsinghua
// @namespace wutj.info
// @description Exchange classroom infomation in Tsinghua University
// @include http://portal.tsinghua.edu.cn/*render.userLayoutRootNode.uP*
// @include http://info.tsinghua.edu.cn/*render.userLayoutRootNode.uP*
// @version 1.4
// @grant GM_xmlhttpRequest
// ==/UserScript==
////////////////////////////////////////////////////////////
//
// 欢迎你阅读和使用这些代码.
// 这是一个只在清华校内使用的插件,意义在于方便大家共享信息
// 因此,我们相信清华的同学不会故意攻击、修改、获取数据。
//
////////////////////////////////////////////////////////////
var uid = '';
var myclass = '';
var baseurl = 'http://infobot.innovation-china.org/courseinfo/';
var hwnd_Move;
var fail_one = 0;
String.prototype.indexOfR = function(needle, start) {
var p = this.indexOf(needle, start);
return (p<0)?p:p+needle.length;
};
function main()
{
var uid = document.getElementsByClassName('uportal-navi-user');
if (uid.length) {
uid = uid[3].innerHTML;
if (uid != parseInt(uid)) return;
} else {
uid = document.getElementsByClassName('hot_nav_cont');
if (!uid.length) return;
var txt = uid[0].innerHTML;
var p = txt.indexOfR('证件号:');
var p1 = txt.indexOf('</span>', p);
uid = txt.substr(p, p1-p);
if (uid != parseInt(uid)) return;
}
var get_head_body = function() {
var a = document.getElementsByTagName('head');
return a.length < 1 ? document.body : a[0];
};
var add_script_head = function(src){
var s = document.createElement("script");
s.type = "text/javascript";
s.src = src;
get_head_body().appendChild(s);
};
var parsestudylist = function(res) {
var txt = res.responseText;
var p = 0, p1 = 0;
var myclass_obj = [];
while(1) {
var prof, course, room, t;
p = txt.indexOfR('strHTML1 = "";', p);
if (p < 0) break;
p = txt.indexOfR('strHTML1 += "', p);
p1 = txt.indexOf('";', p);
prof = txt.substr(p+1, p1-p-1);
p = txt.indexOfR('strHTML1 += "', p1);
p = txt.indexOfR('strHTML1 += "', p);
p = txt.indexOfR('strHTML1 +="', p);
p1 = txt.indexOf('"', p);
room = txt.substr(p+1, p1-p-1);
p = txt.indexOfR('onmouseout=\\"return nd();\\">', p1);
p1 = txt.indexOf('</span>', p);
course = txt.substr(p, p1-p);
p = txt.indexOfR('getElementById(\'a', p);
p1 = txt.indexOf('\')', p);
t = txt.substr(p, p1-p);
t = t.substr(2,1) + "-" + t.substr(0,1);
myclass_obj.push({'prof':prof, 'course':course, 'room':room, 'schedule': t});
}
if (myclass_obj.length) {
myclass = JSON.stringify(myclass_obj);
GM_xmlhttpRequest({
method: "GET",
url: baseurl+"status.php?uid=" + uid,
onload: getusercontrib
});
} else if (fail_one){
var htm = '无法获得您当前的课表信息<br/>如果没有选课,则不能使用';
document.getElementById('course_info_win_cont').innerHTML = htm;
} else {
fail_one = 1;
}
},
getusercontrib = function(res) {
var obj = JSON.parse(res.responseText);
if (obj.r) {
var htm = '<strong>出错啦</strong><br/>';
htm += obj.reason;
document.getElementById('course_info_win_cont').innerHTML = htm;
return;
}
if (obj.contrib < 1) {
var htm = '<strong>请你支持</strong><br/>';
htm += '我们的数据都来自大家的贡献,请同意将您的课程上课地点加入数据库。我们不会收集也不关心您的个人信息。<br/>';
htm += '<button id="agree_contrib">同意贡献数据</button>';
document.getElementById('course_info_win_cont').innerHTML = htm;
document.getElementById('agree_contrib').addEventListener("click", upload_mydata, false);
} else {
upload_mydata();
}
}, upload_mydata = function() {
GM_xmlhttpRequest({
method: "POST",
url: baseurl+"update.php?uid=" + uid,
data: "data=" + encodeURIComponent(myclass),
headers: {"Content-Type": "application/x-www-form-urlencoded"},
onload: updatemainui
});
}, updatemainui = function(res) {
var obj = JSON.parse(res.responseText);
var htm = '';
if (obj.r == -101) {
htm ='<strong style="color:red">验证码错误!</strong><br/>';
} else if (obj.r) {
var htm ='<strong>出错啦</strong><br/>' + obj.reason;
document.getElementById('course_info_win_cont').innerHTML = htm;
return;
}
htm += '<strong>课程查询</strong><br/>';
htm += '课程名称:*<input type="text" id="courseinfo_name" size="10"/><br/>';
htm += '任课教师: <input type="text" id="courseinfo_prof" size="10"/><br/>';
htm += '验证码:*<span id="yzmstore_wrapper_c1"></span><br/>';
htm += '<button id="courseinfo_query">查询</button><br/>';
if (obj.course) {
htm += '<strong>查询结果</strong><span style="color:grey">(灰色可能为旧数据)</span><br/>';
if (obj.course.length) {
htm += '<table cellspacing="4px"><col width="150"><col width="40"><col width="40"><col width="40">';
htm += '<tr><td>课名</td><td>教师</td><td>时间</td><td>教室</td></tr>';
for (var i=0; i<obj.course.length; i++) {
var old = (obj.course[i].utime == null) || (parseInt(obj.course[i].utime) + 60 * 86400 < (new Date()).getTime()/1000);
if (old) {
htm += '<tr style="color:grey"><td>'+obj.course[i].name+'</td><td>'+obj.course[i].prof+'</td><td>'+obj.course[i].schedule+'</td><td>'+obj.course[i].room+'</td></tr>';
} else {
htm += '<tr><td>'+obj.course[i].name+'</td><td>'+obj.course[i].prof+'</td><td>'+obj.course[i].schedule+'</td><td>'+obj.course[i].room+'</td></tr>';
}
}
htm += '</table>';
if (i == 16) {
htm += '有些结果可能没有显示,请缩小查询范围.<br/>';
}
} else {
htm += '没有找到。请明天再试试,当更多的人使用后,数据会更丰富。<br/>';
}
}
document.getElementById('course_info_win_cont').innerHTML = htm;
document.getElementById('courseinfo_query').addEventListener("click", do_search, false);
add_script_head("http://apithu.yzmstore.com/api/yzmstore-js.php?publickey=TkjmRgi5A1gHhCpOTb4Anz8UeBJwjZyqfe_faRVI&name=c1&wrapper_id=yzmstore_wrapper_c1&theme=floating");
}, do_search = function() {
var name = encodeURIComponent(document.getElementById('courseinfo_name').value);
var prof = encodeURIComponent(document.getElementById('courseinfo_prof').value);
var cu = encodeURIComponent(document.getElementById('yzmstore_user_input_c1').value);
var cid = document.getElementById('yzmstore_cha_id_c1').value
if (!name) {
alert("请填写课程名");
return;
}
GM_xmlhttpRequest({
method: "POST",
url: baseurl+"query.php?uid=" + uid,
data: "course=" + name + "&prof=" + prof + "&yzmstore_user_input_c1=" + cu + "&yzmstore_cha_id_c1=" + cid,
headers: {"Content-Type": "application/x-www-form-urlencoded"},
onload: updatemainui
});
};
GM_xmlhttpRequest({
method: "GET",
url: "http://zhjw.cic.tsinghua.edu.cn/jxmh.do?url=/jxmh.do&m=yjs_kbSearch",
onload: parsestudylist
});
GM_xmlhttpRequest({
method: "GET",
url: "http://zhjw.cic.tsinghua.edu.cn/jxmh.do?url=/jxmh.do&m=bks_yjkbSearch",
onload: parsestudylist
});
openEx("course_info_win");
setTimeout(function () {opacityEx("course_info_win")}, 50);
}
function openEx(name)
{
var newwin = document.createElement("div");
newwin.setAttribute("id", name);
newwin.style.position = "absolute";
newwin.style.top = "140px";
newwin.style.right = "10px";
newwin.style.width = "350px";
newwin.style.textAlign = "left";
// newwin.style.height = "100px";
newwin.style.opacity = 2;
window.addEventListener("scroll", function() {
var newpos = document.body.scrollTop + 80;
newwin.setAttribute("tarpos", newpos);
setTimeout(function () {if (!hwnd_Move) moveEx(name)}, 50);
},false);
var newpos = document.body.scrollTop + 80;
newwin.setAttribute("tarpos", newpos);
setTimeout(function () {if (!hwnd_Move) moveEx(name)}, 50);
var htm="";
document.body.appendChild(newwin);
newwin.setAttribute("taropc", 0.1)
newwin.addEventListener("mouseover", function() {
this.style.opacity = 2;
newwin.setAttribute("taropc", 2)
}, false);
newwin.addEventListener("mouseout", function() {
this.style.opacity = 2;
newwin.setAttribute("taropc", 0.1)
}, false);
var htm = '';
htm += '<table cellspacing="10px" style="border:dashed 1px grey; background-color:#F8F8F8; width: 100%;"><tr><td>';
htm += '<div style="float:right"><a href="#" id="'+name+'_close">X</a></div><div id="'+name+'_cont"></div>';
htm += '</td></tr></table>'
newwin.innerHTML = htm;
document.getElementById(name+'_close').addEventListener("click", function() {
newwin.style.display = "none";
}, false);
}
function moveEx(name)
{
var target = document.getElementById(name);
var newpos = target.getAttribute("tarpos");
var curr_pos = parseInt(target.style.top);
if (curr_pos < newpos) {
if (curr_pos-newpos<-8)
curr_pos -= (curr_pos-newpos)/4;
else
curr_pos +=1;
target.style.top = curr_pos;
hwnd_Move = setTimeout(function () {moveEx(name)}, 50);
}else if (curr_pos > newpos) {
if (curr_pos-newpos>8)
curr_pos -= (curr_pos-newpos)/4;
else
curr_pos -=1;
target.style.top = curr_pos;
hwnd_Move = setTimeout(function () {moveEx(name)}, 50);
}else
hwnd_Move = 0;
}
function opacityEx(name)
{
var target = document.getElementById(name);
var newpos = target.getAttribute("taropc");
var curr_pos = parseFloat(target.style.opacity);
if (curr_pos < newpos) {
if (curr_pos-newpos<-0.2)
curr_pos += 0.2;
else
curr_pos = newpos;
target.style.opacity = curr_pos;
}else if (curr_pos > newpos) {
if (curr_pos-newpos>0.02)
curr_pos -= 0.02;
else
curr_pos = newpos;
target.style.opacity = curr_pos;
}
hwnd_Opacity = setTimeout(function () {opacityEx(name)}, 50);
}
main();