Class Dojo Plus

Useful hacks to the already excellent Class Dojo

Tính đến 03-02-2015. Xem phiên bản mới nhất.

// ==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);