2 /*global $, TemplateManager */
11 (function () { // strict mode wrapper
15 templateManager: null,
18 * UI module initialisation
20 init: function UI_init(app) {
21 console.log('Ui.init');
23 this.templateManager = new TemplateManager();
24 $(document).ready(this.domInit.bind(this));
27 this.home.context = this;
28 this.alarm.context = this;
29 this.new_event.context = this;
33 * When DOM is ready, initialise it
35 domInit: function UI_domInit() {
36 console.log("domInit()", this);
38 this.templateManager.loadToCache(['home', 'alarm', 'new_event', 'event'], this.initPages.bind(this));
40 // immediately load events for today
41 //self.app.loadEvents(new Date());
46 * Append pages to body and initialise them
48 initPages: function UI_initPages() {
49 console.log('initPages');
52 pages.push(this.templateManager.get('home'));
53 pages.push(this.templateManager.get('alarm'));
54 pages.push(this.templateManager.get('new_event'));
56 $('body').append(pages.join(''));
60 this.new_event.init();
62 console.log('changePage');
63 $.mobile.changePage('#home', 'pop', false, true);
68 * Contains methods related to the #home page
72 init: function UI_home_init() {
73 var app = this.context.app;
75 $('#exit_btn').on('tap', app.exit.bind(app));
77 // $('#date_search').bind("date-changed", this.loadEvents.bind(this));
79 // buttons in the events list
80 $('#events_list').on('tap', '.remove_event_btn', function () {
81 var eventId = $(this).parents('.event').data('eventid');
82 app.model.deleteEvent(eventId);
85 $('#newEventBtn').on('tap', function () {
92 * Get start date value from the form (#demo-date-1 field)
96 getStartDate: function UI_home_getStartDate() {
97 var startDate = $('#demo-date-1').attr('data-date');
98 console.log('UI_home_getStartDate: ', startDate);
102 * Get end date value from the form (#demo-date-2 field)
106 getEndDate: function UI_home_getEndDate() {
107 var endDate = $('#demo-date-2').attr('data-date');
108 console.log('UI_home_getEndDate: ', endDate);
112 * Get the title from the form (#title field)
116 getTitle: function UI_home_getTitle() {
117 return $('#title').val();
120 * Get the description from the form (#des field)
124 getDescription: function UI_home_getDescription() {
125 return $('#des').val();
128 * Get the location from the form (#location field)
132 getLocation: function UI_home_getLocation() {
133 return $('#location').val();
136 * Wrapper for app.loadEvents
137 * @param {Object} e event
138 * @param {Date} date selected date
140 loadEvents: function UI_home_loadEvents(e, date) {
141 // date = $(':jqmData(role="datetimepicker")').data('datetimepicker').options.date;
142 console.log('Ui.loadEvents', this);
143 this.context.app.loadEvents(date);
147 * Returns text for separating list items with events
148 * Skips repeated values
150 * @param {Object} event
153 getSeparatorText: function UI_home_getSeparatorText(event) {
157 this.getSeparatorText = function (event) {
158 if (event === undefined) {
163 var startDate = event.startDate,
164 str = this.formatDate(startDate);
166 if (previous === str) {
167 return ''; // skip it - already returned
169 previous = str; // store in the closure for future comparison
174 return this.getSeparatorText(event);
177 formatDate: function UI_home_formatDate(date) {
179 "January", "February", "March", "April", "May", "June",
180 "July", "August", "September", "October", "November", "December" ];
182 this.formatDate = function UI_home_formatDate(date) {
183 return date.getDate() + ". " + monthNames[date.getMonth()] + " " + date.getFullYear();
185 return this.formatDate(date);
190 * @param {TZDate} date
193 formatHour: function UI_home_formatHour(date) {
194 return date.getHours() + ':' + this.pad(date.getMinutes());
198 * Zero-pads a positive number to 2 digits
200 pad: function UI_home_pad(number) {
201 return number < 10 ? '0' + number : number;
205 * Creates HTML representing the given array of alarms
207 * @param {Alarm[]} alarms
210 getAlarmsHtml: function UI_home_getAlarmsHtml(alarms) {
211 var alarm = '', j, len;
216 alarm += '<p class="ui-li-aside ui-li-desc"><img src="img/clock.png"/>';
218 for (j = 0; j < len; j += 1) {
219 alarm += alarms[j].before.length;
220 alarm += ' ' + alarms[j].before.unit;
227 * Load the events into the #event_popup.
229 * Callback function for app.loadEvents.
230 * @param {Array} events
232 onEventSearchSuccess: function UI_home_onEventSearchSuccess(events) {
238 templateParameters = {},
242 console.log('Ui.home.onEventSearchSuccess()', events);
247 for (i = 0; i < events.length; i += 1) {
250 dividerText = this.getSeparatorText(event);
253 str += '<li data-role="list-divider">' + dividerText + '</li>';
256 alarm = this.getAlarmsHtml(event.alarms);
258 endDate = event.startDate.addDuration(event.duration);
260 console.log('[Event Loaded] Start Date:' + event.startDate);
262 templateParameters = {
264 startDate: this.formatHour(event.startDate),
265 endDate: this.formatHour(endDate),
266 summary: event.summary || '[No title]',
267 location: event.location,
268 description: event.description,
272 str += this.context.templateManager.get('event', templateParameters);
276 this.getSeparatorText(); // clear the separator state
278 $('#events_list ul').html(str);
279 $('#events_list ul').listview();
280 $('#events_list ul').data('listview').refresh();
281 $('#events_list ul input.remove_event_btn').button();
285 * Error handler for event search
287 onEventSearchError: function UI_home_onEventSearchError() {
288 console.error("event search error");
293 * Contains methods related to the #alarm page
297 init: function UI_alarm_init() {
300 * Read alarm duration from the UI
302 * @returns {int} Alarm duration in minutes
304 getDuration: function UI_alarm_getDuration() {
308 radiobutton = $('#new_alarm :jqmData(role=controlgroup) input:radio[checked]');
310 radioValue = parseInt(radiobutton.val(), 10);
312 switch (radioValue) {
315 case 2: // 5 minutes before
317 case 3: // 30 minutes before
319 case 4: // 1 hour before
322 console.warn('Unexpected value');
329 * Contains methods related to the new event page
333 init: function UI_newEvent_init() {
334 var app = this.context.app;
336 $("#demo-date-1").bind("date-changed", function UI_newEvent_onDateChanged(e, newStartDate) {
337 var startOptions = $("#demo-date-1").data('datetimepicker').options,
338 endData = $("#demo-date-2").data('datetimepicker'),
339 endOptions = typeof endData === 'object' ? endData.options : null,
344 oldStartDate = startOptions.oldDate;
345 startOptions.oldDate = newStartDate;
348 console.warn('date-changed handler: old date empty');
352 // calculate time difference in minutes
353 diff = (newStartDate.getTime() - oldStartDate.getTime()) / 1000 / 60;
355 endDate = endOptions.date;
357 // move the end date by 'diff'
358 endDate.setMinutes(endDate.getMinutes() + diff);
360 $("#demo-date-2").datetimepicker('value', endDate);
363 $('#new_event').on('pageshow', function UI_newEvent_onPageShow(event) {
364 var options = $("#demo-date-1").data('datetimepicker').options,
366 // get the start date
367 tmpDate = new Date(options.date.getTime());
369 // store it for future use
370 options.oldDate = new Date(options.date.getTime());
373 tmpDate.setHours(tmpDate.getHours() + 1);
375 if (typeof $("#demo-date-2").datetimepicker === 'function') {
377 console.log('pageinit: set default end time' + tmpDate);
378 $("#demo-date-2").datetimepicker('value', tmpDate);
380 console.log('pageinit: cant set end time');
384 $('#switch-1').bind('changed', app.switchFullDay.bind(app));
386 $('#add-event-btn').bind('tap', app.addEvent.bind(app));
388 $('#add-alarm').bind('tap', app.switchAlarm.bind(app));