ff17175182c4b8160f4008646ceb3a93d9494f70
[profile/ivi/SettingsApp.git] / js / panel-datetime.js
1 /*
2  * Copyright (c) 2013, Intel Corporation.
3  *
4  * This program is licensed under the terms and conditions of the
5  * Apache License, version 2.0.  The full text of the Apache License is at
6  * http://www.apache.org/licenses/LICENSE-2.0
7  *
8  */
9
10 var clockTimer = null;
11 var timeChanged = false;
12 var dateChanged = false;
13 var timezoneChanged = false;
14 var automaticTime = false;
15 var automaticTimezone = false;
16
17 function datetimePanelInit() {
18
19     /* Display Settings Panel */
20     $('#page_datetime').on('pageshow', function() {
21         datetimePageReload();
22     });
23
24     $('#toggle_timeupdates').change(function() {
25         if ($('#toggle_timeupdates').val() === 'auto') {
26             settings.datetime.setTimeUpdates("auto", function() {
27                 datetimePageReload();
28             }, function(e) {
29                 timeUpdatesToggle('manual');
30                 datetimePageReload();
31                 showMsg('Error', 'Cannot set time updates to automatic: ' + e);
32             });
33         } else {
34             settings.datetime.setTimeUpdates("manual", function() {
35                 datetimePageReload();
36             }, function(e) {
37                 timeUpdatesToggle('auto');
38                 datetimePageReload();
39                 showMsg('Error', 'Cannot set time updates to manual: ' + e);
40             });
41         }
42     });
43
44     $('#input_time').on('change', function(event, data) {
45         console.log('input_time changed');
46         if (automaticTime) return;
47
48         var re = /^([01]?[0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$/;
49         if (this.value === '' || !this.value.match(re)) {
50             datetimeHideOption();
51             showMsg('Error', 'Invalid time format (hh:mm:ss): ' + this.value);
52             return;
53         }
54
55         timeChanged = true;
56         datetimeShowOption();
57     });
58
59     $('#input_date').on('change', function(event, data) {
60         console.log('input_date changed');
61         if (automaticTime) return;
62
63         var re = /^\d{4}-(0?[1-9]|1[012])-(0?[1-9]|[12][0-9]|3[01])$/;
64         if (this.value === '' || !this.value.match(re)) {
65             datetimeHideOption();
66             showMsg('Error', 'Invalid date format (yyyy-mm-dd): ' + this.value);
67             return;
68         }
69
70         dateChanged = true;
71         datetimeShowOption();
72     });
73
74     $('#toggle_timezoneupdates').change(function() {
75         if ($('#toggle_timezoneupdates').val() === 'auto') {
76             settings.datetime.setTimezoneUpdates("auto", function() {
77                 datetimePageReload();
78                 automaticTimezone = true;
79             }, function(e) {
80                 timezoneUpdatesToggle('manual');
81                 datetimePageReload();
82                 showMsg('Error', 'Cannot set timezone updates to automatic: ' + e);
83             });
84         } else {
85             settings.datetime.setTimezoneUpdates("manual", function() {
86                 datetimePageReload();
87                 automaticTimezone = false;
88             }, function(e) {
89                 timezoneUpdatesToggle('auto');
90                 datetimePageReload();
91                 showMsg('Error', 'Cannot set time zone updates to manual: ' + e);
92             });
93         }
94     });
95
96     $('#select_timezone').on('change', function(event, data) {
97         console.log('select_timezone changed');
98         if (automaticTimezone) return;
99
100         /* ignore change due to getLocalTimezone() */
101         if (data === false) return;
102
103         timezoneChanged = true;
104         var timezone = this.value;
105         console.log('time zone show option');
106         datetimeShowOption();
107     });
108
109     $('#button_datetime_apply').on('click', function(event, data) {
110         if (timeChanged || dateChanged) {
111             timeChanged = false;
112             dateChanged = false;
113             updateSystemTime();
114         }
115
116         if (timezoneChanged) {
117             timezoneChanged = false;
118             updateSystemTimezone();
119         }
120
121         datetimeHideOption();
122     });
123
124     $('#button_datetime_cancel').on('click', function(event, data) {
125         datetimePageReload();
126     });
127
128     $('#page_datetime_button_back').on('click', function() {
129         datetimeStopTimer();
130     });
131 }
132
133 function datetimePageReload() {
134     var current = null;
135     timeChanged = false;
136     dateChanged = false;
137     timezoneChanged = false;
138
139     datetimeHideOption();
140
141     settings.datetime.isTimeAuto(function(isAuto) {
142         automaticTime = isAuto;
143         if (isAuto) {
144             timeUpdatesToggle('auto');
145         } else {
146             timeUpdatesToggle('manual');
147         }
148     }, function(e) {
149         showMsg('Error', e);
150     });
151
152     settings.datetime.isTimezoneAuto(function(isAuto) {
153         automaticTimezone = isAuto;
154         if (isAuto) {
155             timezoneUpdatesToggle('auto');
156         } else {
157             timezoneUpdatesToggle('manual');
158         }
159     }, function(e) {
160         showMsg('Error', e);
161     });
162
163     current = new Date();
164     console.log('Local datetime is ' + current.toISOString());
165
166     timeStr = datetimeGetStr(current.getHours()) + ':';
167     timeStr += datetimeGetStr(current.getMinutes()) + ':';
168     timeStr += datetimeGetStr(current.getSeconds());
169     $('#input_time').val(timeStr);
170
171     dateStr = datetimeGetStr(current.getFullYear()) + '-';
172     dateStr += datetimeGetStr(current.getMonth()) + '-';
173     dateStr += datetimeGetStr(current.getDate());
174     $('#input_date').val(dateStr);
175
176     datetimeStartTimer();
177
178     if (tizen.time) {
179         var alltimezones = tizen.time.getAvailableTimezones();
180         console.log('Local timezone: ' + tizen.time.getLocalTimezone());
181         if (alltimezones.length > 0) {
182             $('#select_timezone').empty();
183             for (var i = 0; i < alltimezones.length; i++) {
184                 $('#select_timezone').append(new Option(alltimezones[i], alltimezones[i]));
185             }
186         }
187         $('#select_timezone').val(tizen.time.getLocalTimezone()).trigger('change', false);
188     }
189 }
190
191 function datetimeShowOption() {
192     $('#button_datetime_apply').show();
193     $('#button_datetime_cancel').show();
194 }
195
196 function datetimeHideOption() {
197     $('#button_datetime_apply').hide();
198     $('#button_datetime_cancel').hide();
199 }
200
201 function datetimeStartTimer() {
202     datetimeStopTimer();
203     clockTimer = setInterval(dateTimeUpdateClock, 1000);
204 }
205
206 function datetimeStopTimer() {
207     if (clockTimer) {
208         clearInterval(clockTimer);
209     }
210 }
211
212 function dateTimeUpdateClock() {
213     var current = new Date();
214
215     var timeStr = datetimeGetStr(current.getHours()) + ':';
216     timeStr += datetimeGetStr(current.getMinutes()) + ':';
217     timeStr += datetimeGetStr(current.getSeconds());
218
219     var dateStr = datetimeGetStr(current.getFullYear()) + '-';
220     dateStr += datetimeGetStr(current.getMonth() + 1) + '-';
221     dateStr += datetimeGetStr(current.getDate());
222
223     if (!timeChanged && !$("#input_time").is(":focus")) {
224         $('#input_time').val(timeStr);
225     }
226
227     if (!dateChanged && !$("#input_date").is(":focus")) {
228         $('#input_date').val(dateStr);
229     }
230 }
231
232 function updateSystemTime() {
233     var time = $('#input_date').val() + ' ' + $('#input_time').val();
234
235     if (time.split(":").length - 1 == 1) {
236         /* this is a bug where seconds are not set after date picker is launched */
237         time += ':00';
238     }
239
240     /* settings daemon expects number of seconds since midnight Jan 1, 1970 */
241     var year = Number(time.split(" ")[0].split('-')[0]);
242     var month = Number(time.split(" ")[0].split('-')[1]) - 1;
243     var day = time.split(" ")[0].split('-')[2];
244     var hour = Number(time.split(" ")[1].split(':')[0]);
245     var minute = Number(time.split(" ")[1].split(':')[1]);
246     var second = Number(time.split(" ")[1].split(':')[2]);
247     var date = new Date(year, month, day, hour, minute, second, 0);
248     var epoch_time = date.getTime() / 1000;
249
250     settings.datetime.setTime(epoch_time, function() {
251         console.log('System time is set to: ' + date + ' or ' + epoch_time + ' seconds since 1/1/1970');
252         datetimePageReload();
253     }, function(e) {
254         showMsg('Error', 'Cannot set system time: ' + e);
255         datetimePageReload();
256     });
257 }
258
259 function updateSystemTimezone() {
260     var value = $('#select_timezone').val();
261     settings.datetime.setTimezone(value, function() {
262         console.log('System timezone is set to: ' + value);
263     }, function(e) {
264         showMsg('Error', 'Cannot set system timezone: ' + e);
265     });
266 }
267
268 function datetimeGetStr(value) {
269     if (0 < value && value < 10) {
270         return '0' + value;
271     } else {
272         return '' + value;
273     }
274 }
275
276 function timeUpdatesToggle(value) {
277     if (value !== 'auto' && value !== 'manual') return;
278
279     if (value === 'auto') {
280         $('#input_time').attr('readonly', true);
281         $('#input_date').attr('readonly', true);
282     } else {
283         $('#input_time').attr('readonly', false);
284         $('#input_date').attr('readonly', false);
285     }
286     setTimeout(function() {
287         $('#toggle_timeupdates').val(value).slider('refresh');
288     }, 100);
289 }
290
291 function timezoneUpdatesToggle(value) {
292     if (value !== 'auto' && value !== 'manual') return;
293
294     if (value === 'auto') {
295         $('#select_timezone').selectmenu('disable');
296     } else {
297         $('#select_timezone').selectmenu('enable');
298     }
299     setTimeout(function() {
300         $('#toggle_timezoneupdates').val(value).slider('refresh');
301     }, 100);
302 }