Skip to content

Instantly share code, notes, and snippets.

@tarekis
Last active August 15, 2016 15:36
Show Gist options
  • Save tarekis/df2aecf14f3f31d3693ac9b6db18305c to your computer and use it in GitHub Desktop.
Save tarekis/df2aecf14f3f31d3693ac9b6db18305c to your computer and use it in GitHub Desktop.
// ==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