define(['activity/data-model', 'activity/draw', 'webL10n', 'sugar-web/env', 'sugar-web/datastore', 'moment-with-locales.min'], function(DataModel, Draw, l10n, env, datastore, moment) {
|
|
|
|
'use strict';
|
|
|
|
var toggleGridBtn = document.querySelector('#toggle-grid-button'),
|
|
toggleHemisphereBtn = document.querySelector('#toggle-hemisphere-button');
|
|
|
|
var canvas = document.querySelector('canvas'),
|
|
ctx = canvas.getContext('2d');
|
|
|
|
var _ = l10n.get;
|
|
|
|
var first = true;
|
|
|
|
l10n.ready(function() {
|
|
if (first) {
|
|
first = false;
|
|
env.getEnvironment(function(err, environment) {
|
|
var defaultLanguage = (typeof chrome != 'undefined' && chrome.app && chrome.app.runtime) ? chrome.i18n.getUILanguage() : navigator.language;
|
|
var language = environment.user ? environment.user.language : defaultLanguage;
|
|
l10n.language.code = language;
|
|
moment.locale(language);
|
|
var refreshTime = setTimeout(function() {
|
|
clearTimeout(refreshTime);
|
|
updateView();
|
|
}, 50);
|
|
});
|
|
}
|
|
});
|
|
|
|
var IMAGE_SIZE, HALF_SIZE, updateTimeout;
|
|
var showGrid, showSouth;
|
|
|
|
|
|
|
|
function setup() {
|
|
/*
|
|
Exposed function - calls all other functions
|
|
*/
|
|
|
|
initEventListeners();
|
|
updateSizes();
|
|
}
|
|
|
|
|
|
function initPrefs(pref) {
|
|
/*
|
|
Read user preferences from datastore
|
|
*/
|
|
|
|
showGrid = pref.showGrid;
|
|
if (showGrid) {
|
|
showGrid = true;
|
|
toggleGridBtn.classList.add('active');
|
|
} else {
|
|
showGrid = false;
|
|
toggleGridBtn.classList.remove('active');
|
|
}
|
|
|
|
showSouth = pref.showSouth;
|
|
if (showSouth) {
|
|
showSouth = true;
|
|
toggleHemisphereBtn.classList.add('active');
|
|
} else {
|
|
showSouth = false;
|
|
toggleHemisphereBtn.classList.remove('active');
|
|
}
|
|
|
|
}
|
|
|
|
function getPrefs() {
|
|
return {
|
|
showGrid: showGrid,
|
|
showSouth: showSouth
|
|
};
|
|
}
|
|
|
|
|
|
function updateSizes() {
|
|
/*
|
|
Dynamically resize elements as and when the window resizes.
|
|
*/
|
|
|
|
var navbarOffset = document.querySelector('#main-toolbar').clientHeight;
|
|
document.querySelector('#panel-container').style.height = (window.innerHeight - navbarOffset) + 'px';
|
|
|
|
var canvasPanelHeight = document.querySelector('#panel-right').clientHeight;
|
|
var canvasPanelWidth = document.querySelector('#panel-right').clientWidth;
|
|
var paddingPercent = 0.05;
|
|
|
|
IMAGE_SIZE = (1 - paddingPercent) * Math.min(canvasPanelWidth, canvasPanelHeight);
|
|
HALF_SIZE = 0.5 * IMAGE_SIZE;
|
|
|
|
canvas.width = IMAGE_SIZE;
|
|
canvas.height = IMAGE_SIZE;
|
|
|
|
canvas.style.top = 0.5 * (canvasPanelHeight - canvas.height) + 'px';
|
|
canvas.style.left = 0.5 * (canvasPanelWidth - canvas.width) + 'px';
|
|
}
|
|
|
|
|
|
function updateView() {
|
|
/*
|
|
Update moon data and
|
|
draw moon, repeteadly, after a fixed interval.
|
|
|
|
Also, depending on user's preferences:
|
|
* Toggle hemisphere
|
|
* Draw grid
|
|
*/
|
|
|
|
clearTimeout(updateTimeout);
|
|
updateInfo();
|
|
Draw.setImageSize(IMAGE_SIZE);
|
|
Draw.moon();
|
|
if (showSouth) {
|
|
ctx.save();
|
|
ctx.rotate(Math.PI);
|
|
ctx.drawImage(canvas, -IMAGE_SIZE, -IMAGE_SIZE);
|
|
ctx.restore();
|
|
|
|
if (showGrid) {
|
|
Draw.grid(_('SNWE'));
|
|
}
|
|
} else if (showGrid) {
|
|
Draw.grid(_('NSEW'));
|
|
}
|
|
updateTimeout = setTimeout(updateView, 5000);
|
|
}
|
|
|
|
|
|
function updateInfo() {
|
|
/*
|
|
Update moon data and
|
|
render updated information as HTML
|
|
*/
|
|
|
|
DataModel.update_moon_calculations();
|
|
|
|
var infoParts = {};
|
|
var keys = [
|
|
'moonInfo',
|
|
'phase',
|
|
'julian',
|
|
'age',
|
|
'lunation',
|
|
'visibility',
|
|
'seleno',
|
|
'full',
|
|
'new',
|
|
'lunar',
|
|
'solar'
|
|
];
|
|
|
|
infoParts[_(keys[0])] = [
|
|
formatDate()
|
|
];
|
|
|
|
infoParts[_(keys[1])] = [
|
|
_(DataModel.moon_phase_name())
|
|
];
|
|
|
|
infoParts[_(keys[2])] = [
|
|
DataModel.julian_date.toFixed(2),
|
|
_('astro')
|
|
];
|
|
|
|
infoParts[_(keys[3])] = [DataModel.days_old,
|
|
_('days') + ',',
|
|
DataModel.hours_old,
|
|
_('hours') + ',',
|
|
DataModel.minutes_old,
|
|
_('minutes')
|
|
];
|
|
|
|
infoParts[_(keys[4])] = [
|
|
(100 * DataModel.phase_of_moon).toFixed(4) + '%',
|
|
_('thru'),
|
|
DataModel.lunation
|
|
];
|
|
|
|
infoParts[_(keys[5])] = [
|
|
(100 * DataModel.percent_of_full_moon).toFixed(4) + '%',
|
|
_('estimated')
|
|
];
|
|
|
|
infoParts[_(keys[6])] = [
|
|
DataModel.selenographic_deg.toFixed(2) + '\u00b0',
|
|
_(DataModel.west_or_east),
|
|
'(' + _(DataModel.rise_or_set) + ')'
|
|
];
|
|
|
|
infoParts[_(keys[7])] = [
|
|
formatDate(DataModel.next_full_moon_date),
|
|
_('in'),
|
|
DataModel.days_until_full_moon.toFixed(),
|
|
_('days')
|
|
];
|
|
|
|
infoParts[_(keys[8])] = [
|
|
formatDate(DataModel.next_new_moon_date),
|
|
_('in'),
|
|
DataModel.days_until_new_moon.toFixed(),
|
|
_('days')
|
|
];
|
|
|
|
infoParts[_(keys[9])] = [
|
|
formatDate(DataModel.next_lunar_eclipse_date),
|
|
_('in'),
|
|
DataModel.days_until_lunar_eclipse.toFixed(),
|
|
_('days')
|
|
];
|
|
|
|
infoParts[_(keys[10])] = [
|
|
formatDate(DataModel.next_solar_eclipse_date),
|
|
_('in'),
|
|
DataModel.days_until_solar_eclipse.toFixed(),
|
|
_('days')
|
|
];
|
|
|
|
|
|
var infoHTML = [];
|
|
for (var k in infoParts) {
|
|
var html = '<p>' + k + ':<br>' + infoParts[k].join(' ') + '</p>';
|
|
infoHTML.push(html);
|
|
}
|
|
|
|
infoHTML = infoHTML.join('');
|
|
document.querySelector('#panel-left').innerHTML = infoHTML;
|
|
|
|
document.getElementById("toggle-grid-button").title = _('ToggleGrid');
|
|
document.getElementById("toggle-hemisphere-button").title = _('ToggleHemisphere');
|
|
document.getElementById("save-image-button").title = _('SaveImage');
|
|
}
|
|
|
|
|
|
function initEventListeners() {
|
|
/*
|
|
Bind event-listeners.
|
|
*/
|
|
|
|
window.addEventListener('resize', function() {
|
|
updateSizes();
|
|
updateView();
|
|
});
|
|
|
|
toggleGridBtn.addEventListener('click', toggleGrid);
|
|
toggleHemisphereBtn.addEventListener('click', toggleHemisphere);
|
|
document.querySelector('#save-image-button').addEventListener('click', saveImage);
|
|
}
|
|
|
|
|
|
function toggleGrid() {
|
|
/*
|
|
Show/hide grid
|
|
*/
|
|
|
|
showGrid = !showGrid;
|
|
if (showGrid) {
|
|
toggleGridBtn.classList.add('active');
|
|
} else {
|
|
toggleGridBtn.classList.remove('active');
|
|
}
|
|
|
|
updateView();
|
|
}
|
|
|
|
|
|
function toggleHemisphere() {
|
|
/*
|
|
Rotate moon image to represent southern-hemisphere view.
|
|
*/
|
|
|
|
showSouth = !showSouth;
|
|
if (showSouth) {
|
|
toggleHemisphereBtn.classList.add('active');
|
|
} else {
|
|
toggleHemisphereBtn.classList.remove('active');
|
|
}
|
|
|
|
updateView();
|
|
}
|
|
|
|
|
|
function saveImage() {
|
|
/*
|
|
Read canvas data as base64 string and
|
|
store image in datastore
|
|
*/
|
|
|
|
var mimetype = 'image/jpeg';
|
|
var inputData = canvas.toDataURL(mimetype, 1);
|
|
var metadata = {
|
|
mimetype: mimetype,
|
|
title: "Image Moon",
|
|
activity: "org.olpcfrance.MediaViewerActivity",
|
|
timestamp: new Date().getTime(),
|
|
creation_time: new Date().getTime(),
|
|
file_size: 0
|
|
};
|
|
datastore.create(metadata, function() {
|
|
console.log("export done.")
|
|
}, inputData);
|
|
}
|
|
|
|
|
|
function formatDate(date) {
|
|
/*
|
|
Modify rendered dates to match Sugar Moon format
|
|
*/
|
|
|
|
if (!date) {
|
|
date = new Date();
|
|
} else {
|
|
|
|
date = new Date(1000 * date);
|
|
}
|
|
|
|
var momentDate = moment(date);
|
|
return momentDate.format('LLLL').replace(momentDate.format('LT'), momentDate.format('LTS'));
|
|
}
|
|
|
|
return {
|
|
setup: setup,
|
|
initPrefs: initPrefs,
|
|
getPrefs: getPrefs,
|
|
updateInfo: updateInfo
|
|
};
|
|
});
|