Files
Oliver Dunk 5bf419b385 Reorganize directory structure (#825)
* Remove docs folder.

This was a redirect from a GitHub pages site that does not appear
to be in use.

* Rename api folder to api-samples.

* Move examples to functional-samples folder.

* Move cookbook sample to functional-samples.

* Move tutorials to functional-samples folder.

* Move mv2 and apps folders to _archive.

* Rename tools folder to .repo.

* Move reference folder to functional-samples.

* Update README.

Update README with new relative links for reorg.

* Update README.md

Co-authored-by: amysteamdev <37001393+AmySteam@users.noreply.github.com>

---------

Co-authored-by: amysteamdev <37001393+AmySteam@users.noreply.github.com>
2023-02-03 10:58:04 -06:00

404 lines
10 KiB
JavaScript

// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
var blankClockImage;
var blankClockAnim1Image;
var blankClockAnim2Image;
var animationTimer;
var currentClockImage;
var port;
function updateEnabledStatus(alarm) {
var enabled = $('a' + alarm + '_on').checked;
$('a' + alarm + '_tt').disabled = !enabled;
$('a' + alarm + '_ampm').disabled = !enabled;
var valid = true;
try {
var tt = $('a' + alarm + '_tt').value;
var ampm = $('a' + alarm + '_ampm').selectedIndex;
parseTime(tt, ampm);
} catch (x) {
valid = false;
}
if (valid) {
$('a' + alarm + '_wrap').removeAttribute('aria-invalid');
} else {
$('a' + alarm + '_wrap').setAttribute('aria-invalid', 'true');
}
if (enabled) {
$('a' + alarm + '_wrap').classList.remove('disabled');
} else {
$('a' + alarm + '_wrap').classList.add('disabled');
}
}
function loadAllImages() {
var loadCount = 0;
var img = new Image();
img.onload = function() {
blankClockImage = img;
currentClockImage = blankClockImage;
drawClock();
};
img.src = 'blank-clock-150.png';
// These will finish loading before they're needed, no need
// for an onload handler.
blankClockAnim1Image = new Image();
blankClockAnim1Image.src = 'blank-clock-ring1-150.png';
blankClockAnim2Image = new Image();
blankClockAnim2Image.src = 'blank-clock-ring2-150.png';
}
function drawClock(hh, mm, ss) {
if (hh == undefined || mm == undefined) {
var d = new Date();
hh = d.getHours();
mm = d.getMinutes();
ss = d.getSeconds() + 0.001 * d.getMilliseconds();
}
if (!currentClockImage) {
loadAllImages();
return;
}
var ctx = $('clock').getContext('2d');
ctx.drawImage(currentClockImage, 0, 0);
// Move the hour by the fraction of the minute
hh = (hh % 12) + (mm / 60);
// Move the minute by the fraction of the second
mm += (ss / 60);
var hourAngle = Math.PI * hh / 6;
var hourX = Math.sin(hourAngle);
var hourY = -Math.cos(hourAngle);
var minAngle = Math.PI * mm / 30;
var minX = Math.sin(minAngle);
var minY = -Math.cos(minAngle);
var secAngle = Math.PI * ss / 30;
var secX = Math.sin(secAngle);
var secY = -Math.cos(secAngle);
var cx = 75;
var cy = 77;
ctx.lineWidth = 5;
ctx.strokeStyle = '#ffffff';
ctx.globalAlpha = 0.5;
ctx.beginPath();
ctx.moveTo(cx - 4 * hourX, cy - 4 * hourY);
ctx.lineTo(cx + 20 * hourX, cy + 20 * hourY);
ctx.stroke();
ctx.beginPath();
ctx.moveTo(cx - 8 * minX, cy - 8 * minY);
ctx.lineTo(cx + 35 * minX, cy + 33 * minY);
ctx.stroke();
ctx.lineWidth = 3;
ctx.strokeStyle = '#696969';
ctx.globalAlpha = 1.0;
ctx.beginPath();
ctx.moveTo(cx - 4 * hourX, cy - 4 * hourY);
ctx.lineTo(cx + 20 * hourX, cy + 20 * hourY);
ctx.stroke();
ctx.beginPath();
ctx.moveTo(cx - 8 * minX, cy - 8 * minY);
ctx.lineTo(cx + 35 * minX, cy + 33 * minY);
ctx.stroke();
ctx.lineWidth = 1;
ctx.strokeStyle = '#990000';
ctx.globalAlpha = 1.0;
ctx.beginPath();
ctx.moveTo(cx - 4 * secX, cy - 4 * secY);
ctx.lineTo(cx + 40 * secX, cy + 40 * secY);
ctx.stroke();
}
function updateCurrentTime() {
var now = new Date();
var hh = now.getHours();
var mm = now.getMinutes();
var ss = now.getSeconds();
var str = '';
if (hh % 12 == 0) {
str += '12';
} else {
str += (hh % 12);
}
str += ':';
if (mm >= 10) {
str += mm;
} else {
str += '0' + mm;
}
str += ':';
if (ss >= 10) {
str += ss;
} else {
str += '0' + ss;
}
if (hh >= 12) {
str += " PM";
} else {
str += " AM";
}
$('current_time').innerText = str;
}
// Override from common.js
window.stopAlarmAnimation = function() {
window.clearTimeout(animationTimer);
currentClockImage = blankClockImage;
drawClock();
isAnimating = false;
};
// Override from common.js
window.displayAlarmAnimation = function() {
isAnimating = true;
var rings = 100;
function ring() {
if (rings == 0) {
stopAlarmAnimation();
return;
}
currentClockImage = (rings % 2 == 0)?
blankClockAnim1Image:
blankClockAnim2Image;
drawClock();
rings--;
animationTimer = window.setTimeout(ring, 50);
}
ring();
};
function addOutlineStyleListeners() {
document.addEventListener('click', function(evt) {
document.body.classList.add('nooutline');
return true;
}, true);
document.addEventListener('keydown', function(evt) {
document.body.classList.remove('nooutline');
return true;
}, true);
}
function load() {
try {
port = chrome.runtime.connect();
port.onMessage.addListener(function(msg) {
if (msg.cmd == 'anim') {
displayAlarmAnimation();
}
});
} catch (e) {
}
addOutlineStyleListeners();
stopAll();
drawClock();
setInterval(drawClock, 100);
updateCurrentTime();
setInterval(updateCurrentTime, 250);
function updateTime(timeElement) {
if (!parseTime(timeElement.value)) {
return false;
}
timeElement.valueAsNumber =
timeElement.valueAsNumber % (12 * 60 * 60 * 1000);
if (timeElement.valueAsNumber < (1 * 60 * 60 * 1000))
timeElement.valueAsNumber += (12 * 60 * 60 * 1000);
return true;
}
$('clock').addEventListener('click', function(evt) {
if (isPlaying || isSpeaking || isAnimating) {
stopAll();
} else {
ringAlarmWithCurrentTime();
}
}, false);
$('clock').addEventListener('keydown', function(evt) {
if (evt.keyCode == 13 || evt.keyCode == 32) {
if (isPlaying || isSpeaking || isAnimating) {
stopAll();
} else {
ringAlarmWithCurrentTime();
}
}
}, false);
// Alarm 1
var a1_tt = localStorage['a1_tt'] || DEFAULT_A1_TT;
$('a1_tt').value = a1_tt;
$('a1_tt').addEventListener('input', function(evt) {
updateEnabledStatus(1);
if (!updateTime($('a1_tt'))) {
evt.stopPropagation();
return false;
}
localStorage['a1_tt'] = $('a1_tt').value;
updateEnabledStatus(1);
return true;
}, false);
$('a1_tt').addEventListener('change', function(evt) {
if ($('a1_tt').value.length == 4 &&
parseTime('0' + $('a1_tt').value)) {
$('a1_tt').value = '0' + $('a1_tt').value;
}
if (!updateTime($('a1_tt'))) {
evt.stopPropagation();
return false;
}
localStorage['a1_tt'] = $('a1_tt').value;
updateEnabledStatus(1);
return true;
}, false);
var a1_on = (localStorage['a1_on'] == 'true');
$('a1_on').checked = a1_on;
$('a1_on').addEventListener('change', function(evt) {
window.setTimeout(function() {
localStorage['a1_on'] = $('a1_on').checked;
updateEnabledStatus(1);
}, 0);
}, false);
var a1_ampm = localStorage['a1_ampm'] || DEFAULT_A1_AMPM;
$('a1_ampm').selectedIndex = a1_ampm;
$('a1_ampm').addEventListener('change', function(evt) {
localStorage['a1_ampm'] = $('a1_ampm').selectedIndex;
}, false);
updateEnabledStatus(1);
// Alarm 2
var a2_tt = localStorage['a2_tt'] || DEFAULT_A2_TT;
$('a2_tt').value = a2_tt;
$('a2_tt').addEventListener('input', function(evt) {
updateEnabledStatus(2);
if (!updateTime($('a2_tt'))) {
evt.stopPropagation();
return false;
}
localStorage['a2_tt'] = $('a2_tt').value;
updateEnabledStatus(2);
return true;
}, false);
$('a2_tt').addEventListener('change', function(evt) {
if ($('a2_tt').value.length == 4 &&
parseTime('0' + $('a2_tt').value)) {
$('a2_tt').value = '0' + $('a2_tt').value;
}
if (!updateTime($('a2_tt'))) {
evt.stopPropagation();
return false;
}
localStorage['a2_tt'] = $('a2_tt').value;
updateEnabledStatus(2);
return true;
}, false);
var a2_on = (localStorage['a2_on'] == 'true');
$('a2_on').checked = a2_on;
$('a2_on').addEventListener('change', function(evt) {
window.setTimeout(function() {
localStorage['a2_on'] = $('a2_on').checked;
updateEnabledStatus(2);
}, 0);
}, false);
var a2_ampm = localStorage['a2_ampm'] || DEFAULT_A2_AMPM;
$('a2_ampm').selectedIndex = a2_ampm;
$('a2_ampm').addEventListener('change', function(evt) {
localStorage['a2_ampm'] = $('a2_ampm').selectedIndex;
}, false);
updateEnabledStatus(2);
// Phrase
var phrase = localStorage['phrase'] || DEFAULT_PHRASE;
$('phrase').value = phrase;
$('phrase').addEventListener('change', function(evt) {
localStorage['phrase'] = $('phrase').value;
}, false);
// Speech parameters
var rateElement = $('rate');
var volumeElement = $('volume');
var rate = localStorage['rate'] || DEFAULT_RATE;
var volume = localStorage['volume'] || DEFAULT_VOLUME;
rateElement.value = rate;
volumeElement.value = volume;
function listener(evt) {
rate = rateElement.value;
localStorage['rate'] = rate;
volume = volumeElement.value;
localStorage['volume'] = volume;
}
rateElement.addEventListener('keyup', listener, false);
volumeElement.addEventListener('keyup', listener, false);
rateElement.addEventListener('mouseup', listener, false);
volumeElement.addEventListener('mouseup', listener, false);
var sound = $('sound');
var currentSound = localStorage['sound'] || DEFAULT_SOUND;
for (var i = 0; i < sound.options.length; i++) {
if (sound.options[i].value == currentSound) {
sound.selectedIndex = i;
break;
}
}
localStorage['sound'] = sound.options[sound.selectedIndex].value;
sound.addEventListener('change', function() {
localStorage['sound'] = sound.options[sound.selectedIndex].value;
}, false);
var playSoundButton = $('playsound');
playSoundButton.addEventListener('click', function(evt) {
playSound(false);
});
var playSpeechButton = $('playspeech');
playSpeechButton.addEventListener('click', function(evt) {
speakPhraseWithCurrentTime();
});
var voice = $('voice');
var voiceArray = [];
if (chrome && chrome.tts) {
chrome.tts.getVoices(function(va) {
voiceArray = va;
for (var i = 0; i < voiceArray.length; i++) {
var opt = document.createElement('option');
var name = voiceArray[i].voiceName;
if (name == localStorage['voice']) {
opt.setAttribute('selected', '');
}
opt.setAttribute('value', name);
opt.innerText = voiceArray[i].voiceName;
voice.appendChild(opt);
}
});
}
voice.addEventListener('change', function() {
var i = voice.selectedIndex;
localStorage['voice'] = voiceArray[i].voiceName;
}, false);
}
document.addEventListener('DOMContentLoaded', load);