5
5
/*jslint browser: true, white: true, onevar: true, undef: true, nomen: false, eqeqeq: true, plusplus: true,
6
6
bitwise: true, regexp: true, strict: true, newcap: true, immed: true, maxlen: 120, sub: true */
7
/*global document, window, $, UIController, ImageSelectTool, MovieBuilder,
7
/*global document, window, $, Class, ImageSelectTool, MovieBuilder,
8
8
TooltipHelper, ViewportController, ScreenshotBuilder, ScreenshotHistory,
9
MovieHistory, addIconHoverEventListener, UserVideoGallery, assignTouchHandlers */
9
MovieHistory, addIconHoverEventListener, UserVideoGallery, MessageConsole,
10
KeyboardManager, SettingsLoader, TimeControls, FullscreenControl,
11
ZoomControls, ScreenshotManagerUI, MovieManagerUI, assignTouchHandlers */
11
var Helioviewer = UIController.extend(
13
var Helioviewer = Class.extend(
12
14
/** @lends Helioviewer.prototype */
15
17
* Creates a new Helioviewer instance.
18
* @param {Object} urlSettings Client-specified settings to load. Includes imageLayers,
19
* date, and imageScale. May be empty.
20
* @param {Object} urlSettings Client-specified settings to load.
21
* Includes imageLayers, date, and imageScale. May be empty.
20
22
* @param {Object} serverSettings Server settings loaded from Config.ini
22
24
init: function (urlSettings, serverSettings) {
23
// Calling super will load settings, init viewport, and call _loadExtensions()
24
this._super(urlSettings, serverSettings);
26
// User settings should be globally accessible
27
Helioviewer.userSettings = this.userSettings;
30
this._initEventHandlers();
31
this._displayGreeting();
35
* Loads the message console, keyboard shortcut manager, tooltips, zoom controls, and
36
* full screen controls. the movie builder, screenshot builder, and image select tool.
38
_loadExtensions: function () {
39
this._super(); // Call super method in UIController to load a few extensions
25
this._checkBrowser(); // Determines browser support
27
this.serverSettings = serverSettings;
28
this.api = "api/index.php";
30
// User settings are globally accessible
31
Helioviewer.userSettings = SettingsLoader.loadSettings(urlSettings,
34
this._initLoadingIndicator();
41
35
this._initTooltips();
37
this.timeControls = new TimeControls('#date', '#time',
38
'#timestep-select', '#timeBackBtn', '#timeForwardBtn');
40
// Get available data sources and initialize viewport
43
this.messageConsole = new MessageConsole();
44
this.keyboard = new KeyboardManager();
46
// User Interface components
47
this.zoomControls = new ZoomControls('#zoomControls', Helioviewer.userSettings.get('state.imageScale'),
48
this.serverSettings.minImageScale, this.serverSettings.maxImageScale);
50
this.fullScreenMode = new FullscreenControl("#fullscreen-btn", 500);
43
52
this.displayBlogFeed("api/?action=getNewsFeed", 3, false);
45
54
this._userVideos = new UserVideoGallery();
47
var screenshotHistory = new ScreenshotHistory(this.userSettings.get('screenshot-history')),
48
movieHistory = new MovieHistory(this.userSettings.get('movie-history'));
50
56
this.imageSelectTool = new ImageSelectTool();
52
this.movieBuilder = new MovieBuilder(this.viewport, movieHistory);
53
this.screenshotBuilder = new ScreenshotBuilder(this.viewport, this.serverSettings.servers, screenshotHistory);
57
* Initializes tooltip manager and adds custom tooltips for basic navigation elements
58
this._screenshotManagerUI = new ScreenshotManagerUI();
59
this._movieManagerUI = new MovieManagerUI();
62
this._initEventHandlers();
63
this._displayGreeting();
68
* @description Checks browser support for various features used in Helioviewer
70
_checkBrowser: function () {
73
"localStorage" : ('localStorage' in window) && window['localStorage'] !== null,
74
"nativeJSON" : typeof (JSON) !== "undefined",
75
"video" : !!document.createElement('video').canPlayType,
81
// HTML5 Video Support
82
if ($.support.video) {
83
var v = document.createElement("video");
86
if (v.canPlayType('video/webm; codecs="vp8"')) {
91
if (v.canPlayType('video/ogg; codecs="theora"')) {
96
if (v.canPlayType('video/mp4; codecs="avc1.42E01E, mp4a.40.2"')) {
97
$.support.h264 = true;
104
* @description Sets up a simple AJAX-request loading indicator
106
_initLoadingIndicator: function () {
107
$(document).ajaxStart(function () {
108
$('#loading').show();
110
.ajaxStop(function () {
111
$('#loading').hide();
116
* Add tooltips to static HTML buttons and elements
59
118
_initTooltips: function () {
60
this.tooltips = new TooltipHelper(true);
61
$(document).trigger('create-tooltip', ["#timeBackBtn, #timeForwardBtn, #center-button"])
62
.trigger('create-tooltip', ["#fullscreen-btn", "topRight"]);
119
// Overide qTip defaults
120
$.fn.qtip.defaults = $.extend(true, {}, $.fn.qtip.defaults, {
125
classes: 'ui-tooltip-light ui-tooltip-shadow ui-tooltip-rounded'
129
$("*[title]:not(#fullscreen-btn,.text-btn)").qtip();
132
$("#fullscreen-btn, .text-btn").qtip({
66
141
* Initializes Helioviewer's viewport
97
//Keyboard shortcuts dialog
172
// Keyboard shortcuts dialog
98
173
this._setupDialog("#helioviewer-usage", "#usage-dialog", {
99
174
"title": "Helioviewer - Usage Tips"
103
$("#settings-button").click(function (e) {
104
$("#settings-dialog").dialog({
107
$(this).dialog("close");
110
"title": "Helioviewer - Settings",
113
"create": function (e) {
114
var currentValue = self.userSettings.get("movieLength"),
115
select = $(this).find("#settings-movie-length");
178
this._setupDialog("#settings-button", "#settings-dialog", {
181
$(this).dialog("close");
184
"title": "Helioviewer - Settings",
188
"create": function (e) {
189
var currentValue = Helioviewer.userSettings.get(
190
"defaults.movies.duration"),
191
select = $(this).find("#settings-movie-length");
117
// Select default value and bind event listener
118
select.find("[value = " + currentValue + "]").attr("selected", "selected");
119
select.bind('change', function (e) {
120
self.userSettings.set("movieLength", parseInt(this.value, 10));
193
// Select default value and bind event listener
194
select.find("[value = " + currentValue + "]").attr("selected", "selected");
195
select.bind('change', function (e) {
196
Helioviewer.userSettings.set("defaults.movies.duration",
197
parseInt(this.value, 10));
304
371
* Displays welcome message on user's first visit
306
373
_displayGreeting: function () {
307
if (!this.userSettings.get('showWelcomeMsg')) {
374
if (!Helioviewer.userSettings.get("notifications.welcome")) {
311
378
$(document).trigger("message-console-info",
312
379
["<b>Welcome to Helioviewer.org</b>, a solar data browser. First time here? Be sure to check out our " +
313
"<a href=\"http://helioviewer.org/wiki/index.php?title=Helioviewer.org_User_Guide\" " +
380
"<a href=\"http://wiki.helioviewer.org/wiki/index.php?title=Helioviewer.org_User_Guide\" " +
314
381
"class=\"message-console-link\" target=\"_blank\"> User Guide</a>.", {life: 20000}]
315
).trigger("save-setting", ["showWelcomeMsg", false]);
384
Helioviewer.userSettings.set("notifications.welcome", false);
388
* Returns the current observation date
390
* @return {Date} observation date
392
getDate: function () {
393
return this.timeControls.getDate();
397
* Returns the currently loaded layers
399
* @return {String} Serialized layer string
401
getLayers: function () {
402
return this.viewport.serialize();
406
* Returns the currently displayed image scale
408
* @return {Float} image scale in arc-seconds/pixel
410
getImageScale: function () {
411
return this.viewport.getImageScale();
415
* Returns an array of the Helioviewer servers that should be used for requests
417
* @return {Array} Helioviewer servers to use
419
getServers: function () {
420
return this.serverSettings.servers;
424
* Returns the top-left and bottom-right coordinates for the viewport region of interest
426
* @return {Object} Current ROI
428
getViewportRegionOfInterest: function () {
429
return this.viewport.getRegionOfInterest();
319
433
* Builds a URL for the current view
321
435
* @TODO: Add support for viewport offset, event layers, opacity
322
* @TODO: Make into a static method for use by Jetpack, etc? http://www.ruby-forum.com/topic/154386
324
437
* @returns {String} A URL representing the current state of Helioviewer.org.