|
|
- define(["sugar-web/activity/activity","sugar-web/env","sugar-web/graphics/radiobuttonsgroup","mustache","moment-with-locales.min","webL10n"], function (activity,env,radioButtonsGroup,mustache,moment) {
-
- // Manipulate the DOM only when it is ready.
- requirejs(['domReady!'], function (doc) {
-
- // Initialize the activity.
- activity.setup();
- setTranslatedStrings();
- var array=["simple","none","none"];
- env.getEnvironment(function(err, environment) {
- currentenv = environment;
-
- // Load from datastore
- if (!environment.objectId) {
- console.log("New instance");
- } else {
- activity.getDatastoreObject().loadAsText(function(error, metadata, data) {
- if (error==null && data!=null) {
- Clock.face=data[0];
- console.log(data);
- if(data[0]=="simple"){
- document.getElementById("simple-clock-button").classList.add("active");
- document.getElementById("nice-clock-button").classList.remove("active");
- clock.changeFace("simple");
- }else{
- document.getElementById("nice-clock-button").classList.add("active");
- document.getElementById("simple-clock-button").classList.remove("active");
- clock.changeFace("nice");
- }
- if(data[1]=="block"){
- document.getElementById("write-time-button").classList.add("active");
- clock.changeWriteTime(true);
- }else{
- document.getElementById("write-time-button").classList.remove("active");
- }
- if(data[2]=="block"){
- document.getElementById("write-date-button").classList.add("active");
- clock.changeWriteDate(true);
- }else{
- document.getElementById("write-date-button").classList.remove("active");
- }
- }
- });
- }
- });
-
- var requestAnimationFrame = window.requestAnimationFrame ||
- window.mozRequestAnimationFrame ||
- window.webkitRequestAnimationFrame ||
- window.msRequestAnimationFrame;
-
- function Clock() {
- this.face = "simple";
-
- this.handAngles = {
- 'hours': 0,
- 'minutes': 0,
- 'seconds': 0
- };
-
- this.colors = {
- 'black': "#000000",
- 'white': "#FFFFFF",
- 'hours': "#005FE4",
- 'minutes': "#00B20D",
- 'seconds': "#E6000A"
- };
-
- this.writeTime = false;
- this.writeDate = false;
-
- // These are calculated on each resize to fill the available space.
- this.size = undefined;
- this.margin = undefined;
- this.radius = undefined;
- this.centerX = undefined;
- this.centerY = undefined;
- this.lineWidthBase = undefined;
- this.handSizes = undefined;
- this.lineWidths = undefined;
-
- // DOM elements.
- this.textTimeElem = document.getElementById('text-time');
- this.textDateElem = document.getElementById('text-date');
- this.clockCanvasElem = document.getElementById("clock-canvas");
- this.clockContainerElem = this.clockCanvasElem.parentNode;
-
- this.bgCanvasElem = document.createElement('canvas');
- this.clockContainerElem.insertBefore(this.bgCanvasElem,
- this.clockCanvasElem);
-
- var that = this;
- window.onresize = function (event) {
- that.updateSizes();
- that.drawBackground();
- };
- }
-
- function setTranslatedStrings() {
- document.getElementById("simple-clock-button").title = l10n_s.get("SimpleClock");
- document.getElementById("nice-clock-button").title = l10n_s.get("NiceClock");
- document.getElementById("write-time-button").title = l10n_s.get("WriteTime");
- document.getElementById("write-date-button").title = l10n_s.get("WriteDate");
- document.getElementById("text-time").innerHTML = l10n_s.get("WhatTime");
- }
-
- Clock.prototype.start = function (face) {
- this.updateSizes();
- this.drawBackground();
- this.update();
- this.drawHands();
-
- this.previousTime = Date.now();
- this.tick();
- }
-
- Clock.prototype.tick = function () {
- var currentTime = Date.now();
-
- // Update each second (1000 miliseconds).
- if ((currentTime - this.previousTime) > 1000) {
- this.previousTime = currentTime;
- this.update();
- this.drawHands();
- if (/Android/i.test(navigator.userAgent) && document.location.protocol.substr(0,4) != "http") {
- // HACK: Force redraw on Android
- this.clockCanvasElem.style.display='none';
- this.clockCanvasElem.offsetHeight;
- this.clockCanvasElem.style.display='block';
- }
- }
- requestAnimationFrame(this.tick.bind(this));
- }
-
- Clock.prototype.changeFace = function (face) {
- this.face = face;
- this.drawBackground();
- array[0]=face;
- }
-
-
- Clock.prototype.changeWriteTime = function (writeTime) {
- this.writeTime = writeTime;
- if (writeTime) {
- this.textTimeElem.style.display = "block";
- } else {
- this.textTimeElem.style.display = "none";
- }
- array[1]=this.textTimeElem.style.display;
- this.updateSizes();
- this.update();
- this.drawBackground();
- }
-
- Clock.prototype.changeWriteDate = function (writeDate) {
- this.writeDate = writeDate;
- if (writeDate) {
- this.textDateElem.style.display = "block";
- } else {
- this.textDateElem.style.display = "none";
- }
- array[2]=this.textDateElem.style.display;
- this.updateSizes();
- this.update();
- this.drawBackground();
- }
-
- Clock.prototype.updateSizes = function () {
- var toolbarElem = document.getElementById("main-toolbar");
- var textContainerElem = document.getElementById("text-container");
-
- var height = window.innerHeight - (textContainerElem.offsetHeight +
- toolbarElem.offsetHeight) - 1;
-
- this.size = Math.min(window.innerWidth, height);
-
- this.clockCanvasElem.width = this.size;
- this.clockCanvasElem.height = this.size;
-
- this.bgCanvasElem.width = this.size;
- this.bgCanvasElem.height = this.size;
-
- this.clockContainerElem.style.width = this.size + "px";
- this.clockContainerElem.style.height = this.size + "px";
-
- this.clockCanvasElem.style.width = (this.size+4) + "px";
-
- this.margin = this.size * 0.02;
- this.radius = (this.size - (2 * this.margin)) / 2;
-
- this.centerX = this.radius + this.margin;
- this.centerY = this.radius + this.margin;
- this.lineWidthBase = this.radius / 150;
-
- this.handSizes = {
- 'hours': this.radius * 0.5,
- 'minutes': this.radius * 0.7,
- 'seconds': this.radius * 0.8
- };
-
- this.lineWidths = {
- 'hours': this.lineWidthBase * 9,
- 'minutes': this.lineWidthBase * 6,
- 'seconds': this.lineWidthBase * 4
- };
- }
-
- // Update text and hand angles using the current time.
- Clock.prototype.update = function () {
- var date = new Date();
- var hours = date.getHours();
- var minutes = date.getMinutes();
- var seconds = date.getSeconds();
-
- var zeroFill = function (number) {
- return ('00' + number).substr(-2);
- };
-
- var template =
- '<span style="color: {{ colors.hours }}">{{ hours }}' +
- '</span>' +
- ':<span style="color: {{ colors.minutes }}">{{ minutes }}' +
- '</span>' +
- ':<span style="color: {{ colors.seconds }}">{{ seconds }}' +
- '</span>';
-
- if (this.writeTime) {
- var templateData = {'colors': this.colors,
- 'hours': zeroFill(hours),
- 'minutes': zeroFill(minutes),
- 'seconds': zeroFill(seconds)
- }
-
- this.textTimeElem.innerHTML = mustache.render(template,
- templateData);
- }
-
- if (this.writeDate) {
- var momentDate = moment(date);
- this.textDateElem.innerHTML = momentDate.format('LLLL').replace(momentDate.format('LT'), '');
- }
-
- this.handAngles.hours = Math.PI - (Math.PI / 6 * hours +
- Math.PI / 360 * minutes);
-
- this.handAngles.minutes = Math.PI - Math.PI / 30 * minutes;
- this.handAngles.seconds = Math.PI - Math.PI / 30 * seconds;
- }
-
- Clock.prototype.drawBackground = function () {
- if (this.face == "simple") {
- this.drawSimpleBackground();
- this.drawNumbers();
- }
- else {
- this.drawNiceBackground();
- }
- this.drawHands();
- }
-
-
- // Draw the background of the simple clock.
- //
- // The simple clock background is a white disk, with hours and
- // minutes ticks, and the hour numbers.
- Clock.prototype.drawSimpleBackground = function () {
- var ctx = this.bgCanvasElem.getContext('2d');
-
- ctx.clearRect(0, 0, this.size, this.size);
-
- // Simple clock background
- var lineWidthBackground = this.lineWidthBase * 4;
- ctx.lineCap = 'round';
- ctx.lineWidth = lineWidthBackground;
- ctx.strokeStyle = this.colors.black;
- ctx.fillStyle = this.colors.white;
- ctx.beginPath();
- ctx.arc(this.centerX, this.centerY,
- this.radius - lineWidthBackground, 0, 2 * Math.PI);
- ctx.fill();
- ctx.stroke();
-
- // Clock ticks
- for (var i = 0; i < 60; i++) {
- var inset;
- if (i % 15 === 0) {
- inset = 0.15 * this.radius;
- ctx.lineWidth = this.lineWidthBase * 7;
- }
- else if (i % 5 === 0) {
- inset = 0.12 * this.radius;
- ctx.lineWidth = this.lineWidthBase * 5;
- }
- else {
- inset = 0.08 * this.radius;
- ctx.lineWidth = this.lineWidthBase * 4;
- }
-
- ctx.lineCap = 'round';
- ctx.beginPath();
-
- var cos = Math.cos(i * Math.PI / 30);
- var sin = Math.sin(i * Math.PI / 30);
- ctx.save();
- ctx.translate(this.margin, this.margin);
- ctx.moveTo(
- this.radius + (this.radius - inset) * cos,
- this.radius + (this.radius - inset) * sin);
- ctx.lineTo(
- this.radius + (this.radius - ctx.lineWidth) * cos,
- this.radius + (this.radius - ctx.lineWidth) * sin);
-
- ctx.stroke();
- ctx.restore();
- }
- }
-
- Clock.prototype.drawNiceBackground = function () {
- var ctx = this.bgCanvasElem.getContext('2d');
-
- var niceImageElem = document.createElement('img');
- var that = this;
- var onLoad = function () {
- ctx.clearRect(that.margin, that.margin,
- that.radius * 2, that.radius * 2);
- ctx.drawImage(niceImageElem, that.margin, that.margin,
- that.radius * 2, that.radius * 2);
- };
- niceImageElem.addEventListener('load', onLoad, false);
- niceImageElem.src = "clock.svg";
- }
-
- // Draw the numbers of the hours.
- Clock.prototype.drawNumbers = function () {
- var ctx = this.bgCanvasElem.getContext('2d');
-
- var fontSize = 30 * this.radius / 160;
-
- ctx.fillStyle = this.colors.hours;
- ctx.textBaseline = 'middle';
- ctx.font = "bold " + fontSize + "px sans-serif";
-
- for (var i = 0; i < 12; i++) {
- var cos = Math.cos((i - 2) * Math.PI / 6);
- var sin = Math.sin((i - 2) * Math.PI / 6);
- var text = i + 1;
- var textWidth = ctx.measureText(text).width;
-
- ctx.save();
- ctx.translate(this.centerX - textWidth / 2, this.centerY);
- ctx.translate(this.radius * 0.75 * cos,
- this.radius * 0.75 * sin);
- ctx.fillText(text, 0, 0);
- ctx.restore();
- }
- }
-
- // Draw the hands of the analog clocks.
- Clock.prototype.drawHands = function () {
- var ctx = this.clockCanvasElem.getContext("2d");
-
- // Clear canvas first.
- ctx.clearRect(this.margin, this.margin, this.radius * 2,
- this.radius * 2);
-
- var handNames = ['hours', 'minutes', 'seconds'];
- for (var i = 0; i < handNames.length; i++) {
- var name = handNames[i];
- ctx.lineCap = 'round';
- ctx.lineWidth = this.lineWidths[name];
- ctx.strokeStyle = this.colors[name];
- ctx.beginPath();
- ctx.arc(this.centerX, this.centerY, ctx.lineWidth * 0.6, 0,
- 2 * Math.PI);
- ctx.moveTo(this.centerX, this.centerY);
- ctx.lineTo(
- this.centerX + this.handSizes[name] *
- Math.sin(this.handAngles[name]),
- this.centerY + this.handSizes[name] *
- Math.cos(this.handAngles[name]));
- ctx.stroke();
- }
- }
-
- // Create the clock.
-
- var clock = new Clock();
- clock.start();
-
- // UI controls.
-
- var simpleClockButton = document.getElementById("simple-clock-button");
- simpleClockButton.onclick = function () {
- clock.changeFace("simple");
- };
-
- var niceClockButton = document.getElementById("nice-clock-button");
- niceClockButton.onclick = function () {
- clock.changeFace("nice");
- };
-
- var simpleNiceRadio = new radioButtonsGroup.RadioButtonsGroup(
- [simpleClockButton, niceClockButton]);
-
-
- var writeTimeButton = document.getElementById("write-time-button");
- writeTimeButton.onclick = function () {
- this.classList.toggle('active');
- var active = this.classList.contains('active');
- clock.changeWriteTime(active);
- };
-
- var writeDateButton = document.getElementById("write-date-button");
- writeDateButton.onclick = function () {
- this.classList.toggle('active');
- var active = this.classList.contains('active');
- clock.changeWriteDate(active);
- };
-
- document.getElementById("stop-button").addEventListener('click', function (event) {
- activity.getDatastoreObject().setDataAsText(array);
- activity.getDatastoreObject().save(function (error) {
- if (error === null) {
- console.log("write done.");
- } else {
- console.log("write failed.");
- }
- });
- });
- });
- });
|