// ==UserScript==
// @name Class Dojo Plus
// @namespace https://greasyfork.org/en/scripts/7873-class-dojo-plus
// @version 0.13
// @description Useful hacks to the already excellent Class Dojo
// @author Ryan Meyers
// @match http://teach.classdojo.com/*
// @match https://teach.classdojo.com/*
// @grant none
// ==/UserScript==
/*!
* Class Dojo Plus
* https://github.com/
*
* Allows for class arrangements (saved per computer), hotkeys for students/behaviors,
* quick points via mouse wheel, and more!
*
*
* Copyright 2015, Ryan Meyers
* Dual licensed under the MIT or GPL Version 2 licenses.
*
*/
var names = [];
var draggables = [];
var dragging = false;
var behaviors_visible = false;
var clickPositive = false;
var clickNegative = false;
var numStudents = 9999;
keyCodeToChar = {8:"Backspace",9:"Tab",13:"Enter",16:"Shift",17:"Ctrl",18:"Alt",19:"Pause/Break",20:"Caps Lock",27:"Esc",32:"Space",33:"Page Up",34:"Page Down",35:"End",36:"Home",37:"Left",38:"Up",39:"Right",40:"Down",45:"Insert",46:"Delete",48:"0",49:"1",50:"2",51:"3",52:"4",53:"5",54:"6",55:"7",56:"8",57:"9",65:"A",66:"B",67:"C",68:"D",69:"E",70:"F",71:"G",72:"H",73:"I",74:"J",75:"K",76:"L",77:"M",78:"N",79:"O",80:"P",81:"Q",82:"R",83:"S",84:"T",85:"U",86:"V",87:"W",88:"X",89:"Y",90:"Z",91:"Windows",93:"Right Click",96:"Numpad 0",97:"Numpad 1",98:"Numpad 2",99:"Numpad 3",100:"Numpad 4",101:"Numpad 5",102:"Numpad 6",103:"Numpad 7",104:"Numpad 8",105:"Numpad 9",106:"Numpad *",107:"Numpad +",109:"Numpad -",110:"Numpad .",111:"Numpad /",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"Num Lock",145:"Scroll Lock",182:"My Computer",183:"My Calculator",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'"};
function addGlobalStyle(css) {
var head, style;
head = document.getElementsByTagName('head')[0];
if (!head) { return; }
style = document.createElement('style');
style.type = 'text/css';
style.innerHTML = css;
head.appendChild(style);
}
addGlobalStyle('div.navbar.navbar-static-top.mojette-navbar { display: none;} div.help-container { display: none;} .hotKey { opacity: 0.05;} .hotKey:hover { opacity: 1.0;} .positive-behaviors-list, .negative-behaviors-list { display: visible; } .leaderboardStudentTile:hover { background-color: rgba(20,210,40,0.2);} ');
(function() {
var XHR = XMLHttpRequest.prototype;
// Remember references to original methods
var open = XHR.open;
var send = XHR.send;
// Overwrite native methods
// Collect data:
XHR.open = function(method, url) {
this._method = method;
this._url = url;
return open.apply(this, arguments);
};
// Implement "ajaxSuccess" functionality
XHR.send = function(postData) {
this.addEventListener('load', function() {
/* Method */
//console.log(this._method);
/* URL */
console.log(this._url);
/* Response body */
//console.log(this.responseText);
// if(this._method != 'POST') console.log(JSON.parse(this.responseText));
// else console.log(this.responseText);
//https://teach.classdojo.com/api/dojoClass/53ffe4bd2b100d272c668de3/student?_u=54c7aa2e1445f26b5a2e6264
if(this._url.match(/^https:\/\/teach\.classdojo\.com\/api\/dojoClass\/.+\/student\?.+$/))
{
var jsonData = JSON.parse(this.responseText);
console.log(jsonData['_items'].length);
numStudents = jsonData['_items'].length
}
// /* Request body */ console.log(postData);
});
return send.apply(this, arguments);
};
})();
function getOffsetRect(elem) {
// (1)
var box = elem.getBoundingClientRect()
var body = document.body
var docElem = document.documentElement
// (2)
var scrollTop = window.pageYOffset || docElem.scrollTop || body.scrollTop
var scrollLeft = window.pageXOffset || docElem.scrollLeft || body.scrollLeft
// (3)
var clientTop = docElem.clientTop || body.clientTop || 0
var clientLeft = docElem.clientLeft || body.clientLeft || 0
// (4)
var top = box.top + scrollTop - clientTop
var left = box.left + scrollLeft - clientLeft
return { top: Math.round(top), left: Math.round(left) }
}
var script = document.createElement("script");
script.setAttribute("src", "https://cdnjs.cloudflare.com/ajax/libs/gsap/1.15.0/TweenMax.min.js");
script.addEventListener('load',function() {
var script2 = document.createElement("script");
script2.setAttribute("src", "https://cdnjs.cloudflare.com/ajax/libs/gsap/1.15.0/utils/Draggable.min.js");
script2.addEventListener('load',function() {
var checkExist = setInterval(function() {
if ($('.leaderboard-student-tile').length === numStudents) {
clearInterval(checkExist);
$( ".leaderboard-student-tile" ).wrap('<div class="leaderboardStudentTile" style="display:inline-block; position:absolute; border-radius:5px;"></div>');
// $('.first').hisResText();
// $('.last').hisResText();
var tiles = document.getElementsByClassName("leaderboard-student-tile");
// var tiles = document.getElementsByClassName("leaderboardStudentTile");
for(i=0; i<tiles.length; i++)
{
names[i] = tiles[i].children[1].textContent;
// names[i] = tiles[i].children[0][1].textContent;
}
for(i=0; i<tiles.length; i++)
{
var span = document.createElement("div");
if(i<=11){
span.innerHTML="F"+(i+1)+"";
}
else if(i===12)
{
span.innerHTML="PS";
}
else if(i===13)
{
span.innerHTML="SL";
}
else if(i===14)
{
span.innerHTML="PB";
}
span.style.bottom="15px";
span.style.right="15px";
span.style.position="absolute";
span.style.border="2px solid #333";
span.style.borderRadius="5px";
span.style.background="#ffe";
span.style.fontFamily="monospace";
span.style.textAlign="center";
span.style.lineHeight="2.5";
span.style.height="30px";
span.style.width="30px";
span.style.fontSize="80%";
span.className="hotKey";
span.addEventListener('load',function() {
});
tiles[i].parentNode.appendChild(span);
// tiles[i].style.position="absolute";
// draggables[i] = Draggable.create(tiles[i], {type:"top,left", force3D:false, trigger:tiles[i].children[4],
draggables[i] = Draggable.create(tiles[i].parentNode, {type:"top,left", force3D:false,
//trigger:tiles[i].parentNode.children[1],
onDragEnd:function(e) {
e.preventDefault();
e.stopPropagation();
$('body').css('background-image','');
var name = this.target.children[0].children[1].textContent;
console.log(name);
var vX = name+"X";
var vY = name+"Y";
// var rect = getOffsetRect(this.target);
// var rect2 = document.getBoundingClientRect();
localStorage.setItem(vX, this.endX);
// localStorage.setItem(vX, this.target.style.left);
localStorage.setItem(vY, this.endY);
// localStorage.setItem(vY, this.target.style.top);
},
onClick:function(e) {
e.preventDefault();
e.stopPropagation;
// this.target.children[0].click();
return false;
},
onDragStart:function(e){
$('body').css('background-image','url(http://upload.wikimedia.org/wikipedia/commons/7/7c/Lightblue_empty_grid.svg)');
}
});
}
console.log(tiles);
for(i=0; i<tiles.length; i++)
{
tiles[i].addEventListener("mousewheel", function(e){
e.preventDefault();
e.stopPropagation;
var delta = Math.max(-1, Math.min(1, (e.wheelDelta || -e.detail)));
if(delta>0)
{
clickPositive = true;
}
else
{
clickNegative = true;
}
this.click();
}, false);
}
for(i=0; i<names.length; i++)
{
var vX = names[i]+"X";
var vY = names[i]+"Y";
if(localStorage.getItem(vX) !== null && localStorage.getItem(vY) !== null){
// TweenMax.to(tiles[i],5,{left:localStorage.getItem(vX), top:localStorage.getItem(vY)});
TweenMax.to(tiles[i].parentNode,5,{left:localStorage.getItem(vX), top:localStorage.getItem(vY)});
console.log("values");
}
}
/* $('.leaderboard-student-tile').bind('contextmenu', function (e) {
e.preventDefault();
});*/
$(document).keyup(function (e) {
if(!$('input[type=text]').length)
{
if($('.behavior-tile').length){
var tiles = document.getElementsByClassName("behavior-tile");
if(e.which >= 49 && e.which <=57){
tiles.item(e.which-49).click(); e.preventDefault();
}
else if(e.which === 48){
tiles.item(9).click(); e.preventDefault();
}
}
else if($('.leaderboard-student-tile').length){
var tiles = document.getElementsByClassName("leaderboard-student-tile");
if(e.which >= 112 && e.which <=123){
tiles.item(e.which-112).click(); e.preventDefault();
}
else if(e.which === 44)
{
tiles.item(12).click(); e.preventDefault();
}
else if(e.which === 145)
{
tiles.item(13).click(); e.preventDefault();
}
else if(e.which === 19)
{
tiles.item(14).click(); e.preventDefault();
}
else if(e.which === 65)
{
document.getElementById('award_multiple_trigger').click();
var checkExist2 = setInterval(function() {
if ($('#select_all').length) {
clearInterval(checkExist2);
document.getElementById('select_all').click();
var checkExist3 = setInterval(function() {
if ($('#give-multiple-awards-button').is(":disabled")) {
return false;
}
else
{
clearInterval(checkExist3);
document.getElementById('give-multiple-awards-button').click();
}
}, 200);
}
}, 200);
}
}
}
});
$(document).keydown(function (e) {
if(!$('input[type=text]').length)
e.preventDefault();
});
var checkForBehaviors = setInterval(function() {
if ($('.behavior-tile').length) {
if(!behaviorsVisible)
{
if(clickPositive)
{
document.getElementsByClassName('positive-behaviors-list').item(0).getElementsByClassName('behavior-tile').item(1).click();
clickPositive = false;
}
else if(clickNegative)
{
document.getElementsByClassName('negative-behaviors-list').item(0).getElementsByClassName('behavior-tile').item(4).click();
clickNegative = false;
}
else
{
$('.behavior-tile').css('width', '10%');
$('.behavior-tile h4').css('font-size','80%');
$('.positive-behaviors-list').show();
$('.positive-behaviors-list').prev().hide();
$('.negative-behaviors-list').show();
}
}
behaviorsVisible = true;
//clearInterval(checkforBehaviors);
}
else
{
behaviorsVisible = false;
}
}, 500);
}
}, 1000);
}, false);
document.body.appendChild(script2);
}, false);
document.body.appendChild(script);