15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright (c) 2011 The Chromium Authors. All rights reserved. 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Use of this source code is governed by a BSD-style license that can be 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * found in the LICENSE file. 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)var DEFAULT_A1_TT = '09:30'; 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)var DEFAULT_A1_AMPM = 0; 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)var DEFAULT_A2_TT = '03:30'; 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)var DEFAULT_A2_AMPM = 1; 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)var DEFAULT_RATE = 1.0; 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)var DEFAULT_VOLUME = 1.0; 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)var DEFAULT_PHRASE = 'It\'s $TIME, so get up!'; 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)var DEFAULT_SOUND = 'ringing'; 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)var audio = null; 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)var isPlaying = false; 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)var isSpeaking = false; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)var isAnimating = false; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Overridden in popup.js but not in background.js. 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)window.displayAlarmAnimation = function() { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Overridden in popup.js but not in background.js. 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)window.stopAlarmAnimation = function() { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Overridden in background.js but not in popup.js. 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)window.flashIcon = function() { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Overridden in background.js but not in popup.js. 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)window.stopFlashingIcon = function() { 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function $(id) { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return document.getElementById(id); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function parseTime(timeString, ampm) { 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var time = timeString.match(/^(\d\d):(\d\d)$/); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!time) { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) throw 'Cannot parse: ' + timeString; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var hours = parseInt(time[1], 10); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (hours == 12 && ampm == 0) { 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hours = 0; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hours += (hours < 12 && ampm == 1)? 12 : 0; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var minutes = parseInt(time[2], 10) || 0; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return [hours, minutes]; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function stopAll() { 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (audio) { 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) audio.pause(); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) isPlaying = false; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) try { 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome.tts.stop(); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) isSpeaking = false; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } catch (e) { 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window.stopAlarmAnimation(); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window.stopFlashingIcon(); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function playSound(duckAudio) { 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (audio) { 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) audio.pause(); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) document.body.removeChild(audio); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) audio = null; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var currentSound = localStorage['sound'] || DEFAULT_SOUND; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (currentSound == 'none') { 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) audio = document.createElement('audio'); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) audio.addEventListener('ended', function(evt) { 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) isPlaying = false; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) document.body.appendChild(audio); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) audio.autoplay = true; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var src = 'audio/' + currentSound + '.ogg'; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var volume = parseFloat(localStorage['volume']) || DEFAULT_VOLUME; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) audio.volume = volume; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) audio.src = src; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) isPlaying = true; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (duckAudio) { 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (var i = 0; i < 10; i++) { 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (function(i) { 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window.setTimeout(function() { 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var duckedVolume = volume * (1.0 - 0.07 * (i + 1)); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) audio.volume = duckedVolume; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 1800 + 50 * i); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) })(i); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function getTimeString(hh, mm) { 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var ampm = hh >= 12 ? 'P M' : 'A M'; 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hh = (hh % 12); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (hh == 0) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hh = 12; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mm == 0) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mm = 'o\'clock'; 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (mm < 10) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mm = 'O ' + mm; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return hh + ' ' + mm + ' ' + ampm; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function speak(text) { 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var rate = parseFloat(localStorage['rate']) || DEFAULT_RATE; 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var pitch = 1.0; 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var volume = parseFloat(localStorage['volume']) || DEFAULT_VOLUME; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var voice = localStorage['voice']; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome.tts.speak( 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text, 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {voiceName: voice, 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rate: rate, 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pitch: pitch, 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volume: volume, 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) onEvent: function(evt) { 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (evt.type == 'end') { 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) isSpeaking = false; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function speakPhraseWithTimeString(timeString) { 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var phraseTemplate = localStorage['phrase'] || DEFAULT_PHRASE; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var utterance = phraseTemplate.replace(/\$TIME/g, timeString); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) speak(utterance); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function speakPhraseWithCurrentTime() { 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var d = new Date(); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) speakPhraseWithTimeString(getTimeString(d.getHours(), d.getMinutes())); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function ringAlarm(alarmHours, alarmMinutes) { 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window.displayAlarmAnimation(); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window.flashIcon(); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var phraseTemplate = localStorage['phrase'] || DEFAULT_PHRASE; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var currentSound = localStorage['sound'] || DEFAULT_SOUND; 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (phraseTemplate == '') { 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) playSound(false); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (currentSound == 'none') { 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) speakPhraseWithTimeString(getTimeString(alarmHours, alarmMinutes)); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome.tts.stop(); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) playSound(true); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) isSpeaking = true; 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window.setTimeout(function() { 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (isSpeaking) { 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) speakPhraseWithTimeString(getTimeString(alarmHours, alarmMinutes)); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 2000); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function ringAlarmWithCurrentTime() { 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var d = new Date(); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ringAlarm(d.getHours(), d.getMinutes()); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 180