Last active
August 15, 2016 15:36
-
-
Save tarekis/df2aecf14f3f31d3693ac9b6db18305c to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// ==UserScript== | |
// @name WebGemini Time Addon | |
// @namespace https://gist.github.com/tarekis | |
// @version 0.1 | |
// @description Get da time! | |
// @author Clemens Himmer | |
// @match http://srv0056/* | |
// ==/UserScript== | |
(function() { | |
// Utility Methods | |
function insertAfter(newNode, referenceNode) { | |
referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling); | |
} | |
function floatZero(inputInt){ | |
if(inputInt < 10){ | |
return "0"+inputInt; | |
} | |
else{ | |
return inputInt; | |
} | |
} | |
function timeDifference(inputDateA,inputDateB){ | |
var resultDate = new Date(inputDateA - inputDateB); | |
// If the results don't overlap | |
if(resultDate.getHours()*60 + resultDate.getMinutes() + resultDate.getTimezoneOffset() > 0){ | |
resultDate.setMinutes(resultDate.getMinutes() + resultDate.getTimezoneOffset()); | |
return resultDate; | |
} | |
else{ | |
return new Date(0,0,0,0); | |
} | |
} | |
Element.prototype.remove = function() { | |
this.parentElement.removeChild(this); | |
}; | |
var domArray = document.getElementById("ctl00_ContentPlaceHolder1_DataGridBuchungen").childNodes[1].childNodes; | |
var timeNodes = []; | |
// Read time nodes | |
for(var i = 1, len = domArray.length -1; i < len; i++) | |
{ | |
timeNodes.push(domArray[i]); | |
} | |
var currentDate = new Date(); | |
// Convert to dates | |
for(i = 0, len0 = timeNodes.length; i < len0; i++) | |
{ | |
var rawValue = timeNodes[i].childNodes[2].innerHTML; | |
var splitRawValue = rawValue.split(":"); | |
timeNodes[i] = new Date(currentDate.getFullYear(),currentDate.getMonth(),currentDate.getDate(),splitRawValue[0],splitRawValue[1],0); | |
} | |
// Check if lunch was made yet | |
var noLunch = false; | |
if(timeNodes.length === 1){ | |
noLunch = true; | |
} | |
// If not currently in a pause or finished, add the current Date for calculation purposes | |
var lastTimeNodeIsCurrent = false; | |
if(timeNodes.length % 2 === 1) | |
{ | |
timeNodes.push(currentDate); | |
lastTimeNodeIsCurrent = true; | |
} | |
// Calculate the time user has worked today | |
var overallTime = 0; | |
for(var j = 0, len1 = timeNodes.length; j < len1; j+=2) | |
{ | |
overallTime += timeNodes[j+1] - timeNodes[j]; | |
} | |
var currentTotalTime = new Date(0,0,0,0,0,0,overallTime); | |
var averageTotalTimeNeeded = new Date(0,0,0,8,30,0); | |
var maximumTotalTime = new Date(0,0,0,9,0,0); | |
var lunchBreak = 0; | |
var lunchBreakTime = 0; | |
// If no lunch break was made yet, assume half an hour | |
if(noLunch){ | |
lunchBreak = 1.8e6; // Half an hour in ms | |
} | |
else{ | |
lunchBreakTime = timeDifference(timeNodes[2] - timeNodes[1]); | |
} | |
// Clear and (re)show all values for the current time | |
function showCurrentValues(){ | |
// Clear old values | |
currentDate = new Date(); | |
if(lastTimeNodeIsCurrent){ | |
timeNodes.pop(); | |
timeNodes.push(currentDate); | |
overallTime = 0; | |
for(var j = 0, len1 = timeNodes.length; j < len1; j+=2) | |
{ | |
overallTime += timeNodes[j+1] - timeNodes[j]; | |
} | |
currentTotalTime = new Date(0,0,0,0,0,0,overallTime); | |
} | |
var currentTotalTimeElement = document.getElementById("currentTotalTime"); | |
var averageTotalTimeElement = document.getElementById("averageTotalTime"); | |
var maximumTotalTimeElement = document.getElementById("maximumTotalTime"); | |
if(currentTotalTimeElement && averageTotalTimeElement && maximumTotalTimeElement){ | |
currentTotalTimeElement.remove(); | |
averageTotalTimeElement.remove(); | |
maximumTotalTimeElement.remove(); | |
} | |
// Calculate Dates | |
var timeLeftToAverageTotalTimeNeeded = new Date(averageTotalTimeNeeded - currentTotalTime + lunchBreak); | |
var averageTotalTime = new Date(new Date().setMilliseconds(currentDate.getMilliseconds() + timeLeftToAverageTotalTimeNeeded.getTime())); | |
var timeLeftToMaximumTotalTime = new Date(maximumTotalTime - currentTotalTime + lunchBreak); | |
var maximumTotalTimeLeavingTime = new Date(new Date().setMilliseconds(currentDate.getMilliseconds() + timeLeftToMaximumTotalTime.getTime())); | |
// Add display Elements to Document | |
// Create current Time Element | |
var currentTotalTimeDiv = document.createElement("div"); | |
currentTotalTimeDiv.setAttribute("style", "left: 750px; position: absolute; top: 32px;width:500px;font-family: Arial;font-size: small;"); | |
currentTotalTimeDiv.setAttribute("id", "currentTotalTime"); | |
currentTotalTimeDiv.innerHTML = "Total Time if leaving now:</br><b>"+floatZero(currentTotalTime.getHours()) +":"+ floatZero(currentTotalTime.getMinutes())+"</b>"; | |
// Create time to average Element | |
var averageTotalTimeDiv = document.createElement("div"); | |
// If lunch was shorter than 60 minutes, add a 9 hour maximum worktime reminder | |
averageTotalTimeDiv.setAttribute("style", "left: 750px; position: absolute; top: 67px;width:500px;font-family: Arial;font-size: small;"); | |
averageTotalTimeDiv.setAttribute("id", "averageTotalTime"); | |
var averageTotalTimeReadable = floatZero(averageTotalTime.getHours()) +":"+ floatZero(averageTotalTime.getMinutes()); | |
var averageTotalTimeLeft = timeDifference(averageTotalTime,currentDate); | |
var averageTotalTimeLeftReadable = floatZero(averageTotalTimeLeft.getHours()) +":"+ floatZero(averageTotalTimeLeft.getMinutes()); | |
averageTotalTimeDiv.innerHTML = "Leaving time for average working hours" + (noLunch ? " with a 30 minute lunch time" : "") + ":</br><b>"+averageTotalTimeReadable+"</b>"+ (averageTotalTimeLeft.getFullYear() >= 1970 ? ", " + averageTotalTimeLeftReadable+" left": ""); | |
// Create time to maximum Element | |
var maximumTotalTimeDiv = document.createElement("div"); | |
if(lunchBreakTime < 3.6e6){ | |
maximumTotalTimeDiv.setAttribute("style", "left: 750px; position: absolute; top: 102px;width:500px;font-family: Arial;font-size: small;"); | |
maximumTotalTimeDiv.setAttribute("id", "maximumTotalTime"); | |
var maximumTotalTimeReadable = floatZero(maximumTotalTimeLeavingTime.getHours()) +":"+ floatZero(maximumTotalTimeLeavingTime.getMinutes()); | |
var maximumTotalTimeLeft = timeDifference(maximumTotalTimeLeavingTime,currentDate); | |
var maximumTotalTimeLeftReadable = floatZero(maximumTotalTimeLeft.getHours()) +":"+ floatZero(maximumTotalTimeLeft.getMinutes()); | |
maximumTotalTimeDiv.innerHTML = "Leaving time for <b>maximum</b> working hours" + (noLunch ? " with a 30 minute lunch time" : " ") + ":</br><b>"+maximumTotalTimeReadable+"</b>"+ (maximumTotalTimeLeft.getFullYear() >= 1970 ? ", " + maximumTotalTimeLeftReadable+" left": ""); | |
} | |
// Append Elements | |
insertAfter(currentTotalTimeDiv,document.getElementById("ctl00_ContentPlaceHolder1_DataGridBuchungen")); | |
insertAfter(averageTotalTimeDiv,document.getElementById("ctl00_ContentPlaceHolder1_DataGridBuchungen")); | |
insertAfter(maximumTotalTimeDiv,document.getElementById("ctl00_ContentPlaceHolder1_DataGridBuchungen")); | |
} | |
// Initiate minutly refresh interval | |
showCurrentValues(); | |
setInterval(showCurrentValues, 60000); | |
})(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment