timers3000
Version:
Provides a graphical interface in your browser to create and manage incremental timers for your daily tasks.
245 lines (216 loc) • 6.49 kB
JavaScript
var sessionsArr = [];
var dataArray = [];
var locked = true;
var socket = io.connect(window.location.hostname);
xcol = ['x'];
sess = ['Timer'];
avgs = ['Average'];
scale = 1;
interval = 34146000
/**
* Gets called when the statistics page is loaded
* Starts the chart-creating chain of doom
*/
function c3Chart(){
constructDataArrays(interval);
scale = getScale(sessionsArr);
chart = c3.generate({
bindto: '#chart_div',
data: {
x: 'x',
columns: [xcol,sess, avgs],
types: {
Timer: 'area',
Average: 'line'
},
},
axis : {
x : {
label : 'Sessiondate',
type : 'timeseries',
tick : { format: function (d) { return (d.getDate() + "." + (d.getMonth()+1)); }}
},
y : {
label : generateTitle(scale)
}
},
grid: {
x: {
show: true
},
y: {
show: true
}
}
});
}
function constructDataArrays(interval){
var limit = moment().subtract('days', interval);
console.log(limit._d);
scale = getScale(sessionsArr);
for (var i = sessionsArr.length - 1; i >= 0; i--) {
var d = new Date(parseInt(sessionsArr[i].date))
if(d > limit._d){
xcol.push(d);
time = (Math.round((sessionsArr[i].time / scale )* 100)) / 100;
sess.push(time);
}
};
for (var i = 1; i < sess.length; i++) {
if(d > limit._d){
var arr = sess.slice(1,i+1);
var avg = calcAverage(arr);
avgs.push(avg);
}
};
}
function getScale(array){
var max = 0;
var result = 1;
for (var i = 0; i < array.length; i++) {
max = Math.max(parseInt(array[i].time),max);
};
if(max > 120) result = 60;
if(max > 7200) result = 3600;
generateTitle(result);
return result;
}
function sumTimes(array){
var result = 0;
for (var i = 0; i < array.length; i++) {
result += array[i];
};
return result;
}
/**
* Artefact from googlechart
*/
function handleOverEvent(id){
//var i = getIndexOfSession(id)
//if(chart) chart.setSelection([{'row' : (sessionsArr.length-1-i)}]);
}
function getIndexOfSession(id){
for (var i = 0; i < sessionsArr.length; i++) {
if(sessionsArr[i].id === id)
return i;
}
}
function generateTitle(_scale){
var result = '';
if(_scale === 3600) result += 'Hours';
if(_scale === 60) result += 'Minutes';
return result;
}
function calcAverage(arr){
var result = Math.round(sumTimes(arr) * 100 / arr.length)/100;
return result;
}
function updateValueLabel(newValue, sessionId){
document.getElementById(sessionId).innerHTML = convertSeconds(newValue);
}
function changeValue(newValue, sessionId){
if(locked){
updateValueLocally(newValue, sessionId);
}else{
showSpinner();
socket.emit("updateSessionTime", sessionId, newValue, function(){
updateValueLocally(newValue, sessionId)
hideSpinner();
});
}
}
function updateValueLocally(newValue, sessionId){
document.getElementById(sessionId).innerHTML = convertSeconds(newValue);
var i = getIndexOfSession(sessionId);
console.log(i);
//Change value
sess[sessionsArr.length-i] = parseInt(newValue)/scale;
//assign new average
for (var j = sessionsArr.length-i; j < avgs.length; j++) {
avgs[j] = calcAverage(sess.slice(1,j+1));
};
sessionsArr[i].time = newValue;
chart.load({ columns: [xcol,sess, avgs]});
}
function deleteSession(id){
if(locked){
deleteSessionLocal(id)
}else{
showSpinner();
socket.emit("deleteSession",id,function(){
deleteSessionLocal(id);
hideSpinner();
});
}
}
function deleteSessionLocal(id){
var i = getIndexOfSession(id);
sess.splice(sessionsArr.length-i, 1);
avgs.splice(sessionsArr.length-i, 1);
xcol.splice(sessionsArr.length-i, 1);
sessionsArr.splice(i, 1);
chart.load({ columns: [xcol,sess, avgs]});
var row = document.getElementById(id+"_row");
row.parentNode.removeChild(row);
}
function limitSessions(_interval){
//Reset buttons
var b1 = document.getElementById("intervalbutton_all");
b1.className = "btn btn-info intervalbutton pull-right";
var b2 = document.getElementById("intervalbutton_7");
b2.className = "btn btn-info intervalbutton pull-right";
var b3 = document.getElementById("intervalbutton_30");
b3.className = "btn btn-info intervalbutton pull-right";
interval = _interval;
switch(interval){
case 7: b2.className = "btn btn-warning intervalbutton pull-right";break;
case 30: b3.className = "btn btn-warning intervalbutton pull-right";break;
case 34146000: b1.className = "btn btn-warning intervalbutton pull-right";break;
}
xlen = xcol.length
//Clear arrays
xcol = ['x'];
sess = ['Timer'];
avgs = ['Average'];
//Construct new data
constructDataArrays(interval);
diff = xlen - xcol.length;
//Reload data
chart.load({ columns: [xcol, sess, avgs]});
//delete first (diff-1) sessions from view
list = document.getElementById("sessionscontainer");
blist = document.getElementById("mergebuttonscontainer");
for (var i = 0; i < diff; i++) {
list.removeChild(list.lastChild);
if(i % 2 == 1) blist.removeChild(blist.lastChild);
};
}
function mergeSessions(btn){
//Calc new time and assign it to the graph
var id = parseInt(btn.getAttribute("value"));
var newtime = parseInt(sessionsArr[id].time) + parseInt(sessionsArr[id+1].time);
sessionsArr[id+1].time = newtime;
changeValue(newtime, sessionsArr[id+1].id);
deleteSession(sessionsArr[id].id);
//Update value in sessionslist
document.getElementById(sessionsArr[id].id).innerHTML = convertSeconds(newtime);
//Remove extra merge buttons
var sessionscontainer = document.getElementById("sessionscontainer");
if(sessionscontainer.children.length % 2 == 1){
var buttonscontainer = document.getElementById("mergebuttonscontainer");
buttonscontainer.removeChild(buttonscontainer.lastChild);
}
}
function lockUnlockStatistics(btn){
console.log();
locknote = document.getElementById("locknote");
if(locked){
locked = false;
locknote.parentNode.className = "btn btn-danger pull-right"
locknote.innerHTML = "Unlocked";
}else{
locked = true;
locknote.parentNode.className = "btn btn-success pull-right"
locknote.innerHTML = "Locked";
}
}