var local; var local_class; var clocks = {}; var alarms = {}; var alarm_clocks = {}; var base_url = 'http://api.worldweatheronline.com/free/v1/tz.ashx?key=vfc3k7q22tjedr2rxse7xzke&format=json&q='; var view = 'world'; var stopwatch; var timer; $(document).ready(function() { $('.close').click(function() { window.close(); }); $('.menu-item.world').tipTip({ edgeOffset: -5, defaultPosition: 'top' }); $('.menu-item.alarm').tipTip({ edgeOffset: -5, defaultPosition: 'top' }); $('.menu-item.timer').tipTip({ edgeOffset: -5, defaultPosition: 'top' }); $('.menu-item.stopwatch').tipTip({ edgeOffset: -5, defaultPosition: 'top' }); setInterval(function() { if (view == 'world' && !navigator.onLine) $('.menu-item.new-world').addClass('hidden'); else if (view == 'world') $('.menu-item.new-world').removeClass('hidden'); }) $('.menu-item.world').click(function() { $('.menu-item.button').addClass('hidden'); $('#container > div').addClass('hidden'); $('#container .world').removeClass('hidden'); $('.menu-item').removeClass('selected'); $('.menu-item.world').addClass('selected'); view = 'world'; if (sizeOf(clocks) == 0) $('.menu-item.new-world').click(); $('.new-world').removeClass('hidden'); }); $('.menu-item.alarm').click(function() { $('.menu-item.button').addClass('hidden'); $('#container > div').addClass('hidden'); $('#container .alarm').removeClass('hidden'); $('.menu-item').removeClass('selected'); $('.menu-item.alarm').addClass('selected'); view = 'alarm'; if (sizeOf(alarms) == 0) $('.menu-item.new-alarm').click(); $('.new-alarm').removeClass('hidden'); }); $('.menu-item.timer').click(function() { $('.menu-item.button').addClass('hidden'); $('#container > div').addClass('hidden'); $('#container .timer').removeClass('hidden'); $('.menu-item').removeClass('selected'); $('.menu-item.timer').addClass('selected'); view = 'timer'; }); $('.menu-item.stopwatch').click(function() { $('.menu-item.button').addClass('hidden'); $('#container > div').addClass('hidden'); $('#container .stopwatch').removeClass('hidden'); $('.menu-item').removeClass('selected'); $('.menu-item.stopwatch').addClass('selected'); view = 'stopwatch'; }); $('.menu-item.new-world').click(function() { openNewClock(); }); $('.menu-item.new-alarm').click(function() { openNewAlarm(); }); $('.world .new .add').click(function() { addWorldClock(); }); $('.alarm .new .add').click(function() { addAlarmClock(); }); $('#new-city').keyup(function(event) { if (event.which == 13) $('.world .new .add').click(); }); $('.world .new .cancel').click(function() { $('.world .new #new-city').val(''); $('.world .new #new-city').removeClass('form-error'); $('.new .error-message').addClass('hidden'); $('.new .error-message').html(''); $('.world .new').addClass('hidden'); resize(); }); $('.alarm .new .cancel').click(function() { $('.alarm .new #new-alarm-name').val(''); $('#new-alarm-hour').val(''); $('#new-alarm-minute').val(''); $('#new-alarm-noon').val(''); $('.alarm .new').addClass('hidden'); resize(); }); $('.alarm .edit .cancel').live('click', function() { var id = $(this).parent().attr('class').split(' ')[0]; $('.edit.' + id).addClass('hidden'); $('.info.' + id).removeClass('hidden'); $(this).parent().parent().removeClass('editing'); }); $('.alarm .edit .save').live('click', function() { var id = $(this).parent().attr('class').split(' ')[0]; editAlarmClock(id); $('.edit.' + id).addClass('hidden'); $('.info.' + id).removeClass('hidden'); $(this).parent().parent().removeClass('editing'); }); createDefaultText('00', $('#timer-minute')); createDefaultText('00', $('#timer-second')); $('#timer-minute').keyup(function() { if ($('#timer-minute').val() != '00') { $('.timer .button.start').removeClass('disabled'); } }); $('#timer-second').keyup(function() { if ($('#timer-second').val() != '00') { $('.timer .button.start').removeClass('disabled'); } }); $('.timer .button.start').click(function() { if (!$(this).hasClass('disabled')) { var minute = parseInt($('#timer-minute').val()) % 60; var second = parseInt($('#timer-second').val()) % 60; if (isNaN(minute)) { minute = 0; $('#timer-minute').val('00'); } if (isNaN(second)) { second = 0; $('#timer-second').val('00'); } timer.setWatch(minute, second); timer.startTiming(); $('.timer #timer-minute').addClass('disabled'); $('.timer #timer-second').addClass('disabled'); $('.timer .button.start').addClass('hidden'); $('.timer .button.stop').removeClass('disabled'); $('.timer .button.stop').removeClass('hidden'); $('.timer .button.reset').removeClass('disabled'); } }); $('.timer .button.stop').click(function() { timer.stopTiming(); $('.timer .button.start').removeClass('hidden'); $('.timer .button.stop').addClass('hidden'); }); $('.timer .button.reset').click(function() { $('.timer .button.start').removeClass('hidden'); $('.timer .button.stop').addClass('hidden'); $('.timer .button.start').addClass('disabled'); $('.timer .button.reset').addClass('disabled'); timer.resetWatch(); $('.timer #timer-minute').val('00'); $('.timer #timer-second').val('00'); $('.timer #timer-minute').removeClass('disabled'); $('.timer #timer-second').removeClass('disabled'); }); $('.stopwatch .button.start').click(function() { stopwatch.startTiming(); $('.stopwatch .button.start').addClass('hidden'); $('.stopwatch .button.stop').removeClass('hidden'); }); $('.stopwatch .button.stop').click(function() { stopwatch.stopTiming(); $('.stopwatch .button.start').removeClass('hidden'); $('.stopwatch .button.stop').addClass('hidden'); }); $('.stopwatch .button.reset').click(function() { stopwatch.resetWatch(); $('.stopwatch .button.start').removeClass('hidden'); $('.stopwatch .button.stop').addClass('hidden'); }); $('.delete').live('click', function() { var class_name = $(this).parent().attr('class').split(' ')[1]; $('.' + class_name).remove(); if (view == 'alarm') { var num = parseInt(class_name.slice(1)); var cur_num = sizeOf(alarms); if (cur_num === 1) { delete alarms[class_name]; delete alarm_clocks[class_name]; } else { while (cur_num > num) { var id = 'a' + cur_num; var alarm = alarms[id]; var alarm_clock = alarm_clocks[id]; delete alarms[id]; delete alarm_clocks[id]; cur_num -= 1; alarms['a' + cur_num] = alarm; alarm_clocks['a' + cur_num] = alarm_clock; $('.' + id).removeClass(id).addClass('a' + cur_num); } } } delete clocks[class_name]; chrome.storage.sync.set({ 'clocks': clocks, 'alarms': alarms }); if (sizeOf(clocks) == 0) $('.menu-item.new-world').click(); if (sizeOf(alarms) == 0) $('.menu-item.new-alarm').click(); resize(); }); $('.info').live('click', function() { $(this).parent().addClass('editing'); var id = $(this).attr('class').split(' ')[0]; var hour = parseInt(alarms[id]['hour']); var minute = parseInt(alarms[id]['minute']); var noon = 'AM'; if (hour == 12) { noon = 'PM'; } if (hour > 12) { noon = 'PM'; hour -= 12; } if (hour == 0) { hour = 12; } if (hour < 10) { hour = '0' + hour; } if (minute < 10) { minute = '0' + minute; } $('.' + id + ' .edit-alarm-name').val(alarms[id]['name']); $('.' + id + ' .edit-alarm-hour').val(hour); $('.' + id + ' .edit-alarm-minute').val(minute); $('.' + id + ' .edit-alarm-noon').val(noon); $(this).addClass('hidden'); $('.' + id + '.edit').removeClass('hidden'); }); $(window).resize(function() { resize(); }); setup(); }); function createDefaultText(default_text, $input) { $input.css('color', '#666'); $input.val(default_text); $input.focus(function() { var actual_text = $input.val(); if (actual_text == default_text) { $input.val(''); $input.css('color', '#333'); } }); $input.blur(function() { var actual_text = $input.val(); if (!actual_text) { $input.val(default_text); $input.css('color', '#666'); } }); } function openNewClock() { $('.world .new').removeClass('hidden'); $('#new-city').focus(); resize(); } function openNewAlarm() { var default_text = 'Alarm ' + (sizeOf(alarms) + 1); var $input = $('#new-alarm-name'); createDefaultText(default_text, $input); createDefaultText('00', $('#new-alarm-hour')); createDefaultText('00', $('#new-alarm-minute')); createDefaultText('AM', $('#new-alarm-noon')); $('.alarm .new').removeClass('hidden'); resize(); } function setup() { chrome.storage.sync.get(function(items) { for (var clock_class in items['clocks']) { clocks[clock_class] = items['clocks'][clock_class]; } for (var alarm_class in items['alarms']) { alarms[alarm_class] = items['alarms'][alarm_class]; } local = items['local']; navigator.geolocation.getCurrentPosition(getCurrentPosSuccessFunction, getCurrentPosErrorFunction); }); } function setupClocks() { var clock = new Clock('new', 0); clock.create(); var found_local = false; for (var city_class in clocks) { if (city_class == local_class) found_local = true; addClock(city_class); } if (local_class && !found_local) addClock(local_class); if (sizeOf(clocks) == 0) { $('.menu-item.new-world').click(); } } function setupAlarms() { var alarm = new Alarm('new', 'new', 0, 0, 0); alarm.create(); for (var id in alarms) { addAlarm(id); } if (sizeOf(alarms) == 0) $('.menu-item.new-alarm').click(); } function setupTimer() { timer = new Timer(); timer.create(); } function setupStopwatch() { stopwatch = new Stopwatch(); stopwatch.create(); } function getCurrentPosSuccessFunction(position) { var lat = position.coords.latitude; var lng = position.coords.longitude; var url = encodeURI(base_url + lat + ',' + lng); $.get(url, function(data) { if (!data['data']['error']) { local = parseInt(data['data']['time_zone'][0]['utcOffset']); chrome.storage.sync.set({ 'local' : local }); } }, 'json' ); setupClocks(); setupAlarms(); setupTimer(); setupStopwatch(); } function getCurrentPosErrorFunction(error) { console.log("Geocoder failed"); local = -new Date().getTimezoneOffset()/60; setupClocks(); setupAlarms(); setupTimer(); setupStopwatch(); } // Function adds a canvas element and initializes a new clock for that canvas function addClock(city_class) { var city = clocks[city_class][0]; var offset = clocks[city_class][1] - local; $('#container .world .new').before('
'); $('.' + city_class).append(''); $('.' + city_class).append(''); $('.' + city_class).append('