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