define(["sugar-web/activity/activity","mustache", "sugar-web/env"], function (activity,mustache,env) { // Manipulate the DOM only when it is ready. requirejs(['domReady!'], function (doc) { // Initialize the activity. activity.setup(); var requestAnimationFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || window.msRequestAnimationFrame; // Utility to fill a string number with zeros. function pad(n, width, z) { z = z || '0'; width = width || 2; n = n + ''; if (n.length >= width) { return n; } else { return new Array(width - n.length + 1).join(z) + n; } } function Stopwatch(counter, marks) { this.elem = document.createElement('li'); var stopwatchList = document.getElementById('stopwatch-list'); stopwatchList.appendChild(this.elem); this.template = '
' + '
' + '
' + '
00:00:00
' + '
' + '
' + '
' + '' + '' + '' + '' + '
' + '
' + '
' + '
' + '' + '
' + '
' + ''; this.elem.innerHTML = mustache.render(this.template, {}); this.counterElem = this.elem.querySelector('.counter'); this.marksElem = this.elem.querySelector('.marks'); this.running = false; this.previousTime = Date.now(); this.tenthsOfSecond = 0; this.seconds = 0; this.minutes = 0; if(marks) { this.marks = marks; this.updateMarks(); } else { this.marks = []; } if(counter) { this.minutes = parseInt(counter.split(":")[0]); this.seconds = parseInt(counter.split(":")[1]); this.tenthsOfSecond = parseInt(counter.split(":")[2]); this.updateView(); } var that = this; this.startStopButton = this.elem.querySelector('.start-stop-button'); this.startStopButton.onclick = function () { that.onStartStopClicked(); }; this.resetButton = this.elem.querySelector('.reset-button'); this.resetButton.onclick = function () { that.onResetClicked(); }; this.markButton = this.elem.querySelector('.mark-button'); this.markButton.onclick = function () { that.onMarkClicked(); }; this.clearButton = this.elem.querySelector('.clear-marks-button'); this.clearButton.onclick = function () { that.onClearMarksClicked(); }; this.removeButton = this.elem.querySelector('.remove'); this.removeButton.onclick = function () { that.onRemoveClicked(); }; } Stopwatch.prototype.onStartStopClicked = function () { if (!this.running) { this.running = true; this.tick(); } else { this.running = false; } this.updateButtons(); }; Stopwatch.prototype.onResetClicked = function () { this.tenthsOfSecond = 0; this.seconds = 0; this.minutes = 0; if(this.running){ this.onStartStopClicked(); } else{ this.running = false; } this.updateView(); }; Stopwatch.prototype.onMarkClicked = function () { if (this.marks.length >= 10) { this.marks.shift(); } this.marks.push(pad(this.minutes) + ':' + pad(this.seconds) + ':' + pad(this.tenthsOfSecond)); this.updateMarks(); }; Stopwatch.prototype.onClearMarksClicked = function () { this.marks = []; this.updateMarks(); }; Stopwatch.prototype.onRemoveClicked = function () { var stopwatchList = document.getElementById('stopwatch-list'); stopwatchList.removeChild(this.elem); }; Stopwatch.prototype.tick = function () { if (!this.running) { return; } var currentTime = Date.now(); if ((currentTime - this.previousTime) > 100) { this.previousTime = currentTime; this.update(); this.updateView(); } requestAnimationFrame(this.tick.bind(this)); }; Stopwatch.prototype.update = function () { this.tenthsOfSecond += 1; if (this.tenthsOfSecond == 10) { this.tenthsOfSecond = 0; this.seconds += 1; } if (this.seconds == 60) { this.seconds = 0; this.minutes += 1; } }; Stopwatch.prototype.updateView = function () { this.counterElem.innerHTML = pad(this.minutes) + ':' + pad(this.seconds) + ':' + pad(this.tenthsOfSecond); }; Stopwatch.prototype.updateMarks = function () { this.marksElem.innerHTML = ''; for (var i = 0; i < this.marks.length; i++) { this.marksElem.innerHTML += this.marks[i]; if (i !== (this.marks.length -1)) { this.marksElem.innerHTML += ' - '; } } }; Stopwatch.prototype.updateButtons = function () { if (this.running) { this.startStopButton.classList.add("stop"); this.startStopButton.classList.remove("start"); } else { this.startStopButton.classList.add("start"); this.startStopButton.classList.remove("stop"); } }; // Button to add more stopwatches. var addButton = document.getElementById('add-stopwatch'); addButton.onclick = function () { new Stopwatch(); }; env.getEnvironment(function(err, environment) { currentenv = environment; if (!environment.objectId) { // Start with five stopwatches. for (var i = 0; i < 5; i++) { new Stopwatch(); } } else { activity.getDatastoreObject().loadAsText(function(error, metadata, data) { if (error==null && data!=null) { stopwatchData = JSON.parse(data); var i; for (i = 0; i < Object.keys(stopwatchData).length; i++) { // Generate saved stopwatches counter = stopwatchData[i]["counter"]; marks = stopwatchData[i]["marks"]; new Stopwatch(counter, marks); } } }); } }); }); // Saving stopwatch data on stop. document.getElementById("stop-button").addEventListener('click', function (event) { var stopwatchData = document.getElementById("stopwatch-list").getElementsByTagName("li"); stopwatchDict = {}; var i; for (i = 0; i < stopwatchData.length; i++) { stopwatchDict[i] = {}; (stopwatchDict[i])["counter"] = stopwatchData[i].getElementsByClassName("counter")[0].innerHTML; (stopwatchDict[i])["marks"] = stopwatchData[i].getElementsByClassName("marks")[0].innerHTML.split(" - "); } stopwatchJSON = JSON.stringify(stopwatchDict); activity.getDatastoreObject().setDataAsText(stopwatchJSON); activity.getDatastoreObject().save(); }); });