2 /*global $, tizen, App, app, localStorage: true, TemplateManager, document, window, setTimeout */
6 (function () { // strict mode wrapper
9 App.Ui = function App_Ui(app) {
11 this.templateManager = new TemplateManager(app.config);
17 prepareCallerName: function ui_prepareCallerName(contact) {
18 var callerName, firstName, lastName;
21 firstName = contact.name.firstName;
22 lastName = contact.name.lastName;
24 if (firstName !== '' && firstName !== null) {
25 callerName = firstName;
27 if (lastName !== '' && lastName !== null) {
28 if (callerName !== '') {
31 callerName += lastName;
33 if (callerName === '') {
34 callerName = 'No Name';
41 * @param {string} message
42 * @param {string} onclick
45 getPopupHtml: function ui_getPopupHtml(message, onclick) {
46 var html = '<div id="popup" data-role="popupwindow"'
47 + ' data-style="center_basic_1btn">'
48 + '<p data-role="text">' + message + '</p>'
49 + '<div data-role="button-bg">'
50 + '<a href="#" data-role="button" data-inline="true"'
51 + ' onclick="' + onclick + '">OK</a>'
59 * @param {string} message
60 * @param {jQuery} page
62 showPopup: function ui_showPopup(message, page) {
63 this.popup = $(this.getPopupHtml(message, "app.ui.closePopup();"));
64 page.append(this.popup);
65 page.trigger('create');
66 this.popup.data('page', page);
67 this.popup.popupwindow('open');
70 closePopup: function ui_closePopup() {
71 var page = this.popup.data('page');
72 page.data('monit', '');
73 this.popup.popupwindow('close');
78 createListRecord: function ui_createListRecord() {
79 $.mobile.changePage('#choose');
84 * @param {string} text
87 getWaitingContentHtml: function getWaitingContentHtml(text) {
89 html += '<p class="defaultVeryBigText">';
93 html += '<p class="defaultCounterText" id="counter"></p>';
100 * @param {string} title
101 * @param {string} text
103 prepareWaitingPage: function ui_prepareWaitingPage(title, text) {
104 var waitingBox, waitingContent,
105 contentTransfer = $('#content-transfer');
106 waitingBox = $('<div class="box" id="waitingBox"></div>');
107 waitingContent = $(this.getWaitingContentHtml(text));
108 $('#header-transfer H1').text(title);
109 contentTransfer.empty();
110 waitingBox.append(waitingContent);
111 contentTransfer.append(waitingBox);
112 $('#content-start').trigger('create');
113 this.app.countDown(10, $('#counter'));
114 this.verticalCenter($('#waitingBox'));
120 getTemporaryBoxHtml: function ui_getTemporaryBoxHtml() {
121 return '<div class="box" id="temporaryBox"></div>';
127 showPopupWarning: function ui_showPopupWarning(){
128 setTimeout(function(){
129 $("#contact-nfc-error").popup("open",{"positionTo":"window"});
133 getTemporaryBoxContentHtml: function ui_getTemporaryBoxContentHtml() {
134 return '<p class="defaultText">'
135 + 'Default card is not defined yet!<br/>'
136 + 'Do you want to define it now?'
140 loadTemporaryContent: function ui_loadTemporaryContent() {
141 var temporaryBox, temporaryContent, temporaryButton;
143 temporaryBox = $(this.getTemporaryBoxHtml());
144 temporaryContent = $(this.getTemporaryBoxContentHtml());
145 temporaryButton = $(this.getButtonHtml('Create default card'));
147 temporaryButton.on('tap', function (event) {
148 event.preventDefault();
149 $.mobile.changePage('#choose');
152 temporaryBox.append(temporaryContent).append(temporaryButton);
154 $('#content-start').empty().append(temporaryBox).trigger('create');
158 * @param {string} text button text
161 getButtonHtml: function ui_getButtonHtml(text) {
162 return '<div data-role="button" class="ui-btn-create">'
169 * @param {string} firstName
170 * @param {string} lastName
173 getCommentHtml: function ui_getCommentHtml(data) {
174 return '<div id="comment">'
175 + '<p class="comment">Your default contact</p>'
176 + '<p class="comment" id="comment-name">'
177 + data.caller + '</p>'
178 + '<p class="comment" id="comment-phone">'
179 + data.phoneNumber + '</p>'
184 * Change Contact button action
186 * @param {Event} event
188 changeContact: function ui_changeContact(event) {
189 event.preventDefault();
190 $.mobile.changePage('#choose');
196 getChangeContactButton: function ui_getChangeContactButton() {
197 var changeContactButton;
198 changeContactButton = $(this.getButtonHtml('Change your default contact'));
199 changeContactButton.on('tap', this.changeContact);
200 return changeContactButton;
204 * Read From Card button action
206 * @param {Event} event
208 readFromCard: function ui_readFromCard(event) {
209 event.preventDefault();
210 if (tizen.nfc.getDefaultAdapter().powered) {
212 $('#transfer').data('option', 'read');
213 $.mobile.changePage('#transfer');
215 console.error(e.message);
218 $.mobile.changePage('#start');
219 alert('Please turn on NFC adapter');
226 getReadFromCardButton: function ui_getReadFromCardButton() {
227 var readFromCardButton;
228 readFromCardButton = $(this.getButtonHtml('Read from card'));
229 readFromCardButton.on('tap', this.readFromCard);
230 return readFromCardButton;
234 * Write To Card button action
235 * @param {Event} event
237 writeToCard: function ui_writeToCard(event) {
238 event.preventDefault();
239 if (tizen.nfc.getDefaultAdapter().powered) {
241 $('#transfer').data('option', 'write');
242 $.mobile.changePage('#transfer');
244 console.error(e.message);
247 alert('Please turn on NFC adapter');
254 getWriteToCardButton: function ui_getWriteToCardButton() {
255 var writeToCardButton;
256 writeToCardButton = $(this.getButtonHtml('Write to card'));
257 writeToCardButton.on('tap', this.writeToCard);
258 return writeToCardButton;
262 * Communicate With Other Device button action
263 * @param {type} event
265 communicateWithOtherDevice: function ui_communicateWithOtherDevice(event) {
266 event.preventDefault();
267 if (tizen.nfc.getDefaultAdapter().powered) {
269 $('#transfer').data('option', 'communicate');
270 $.mobile.changePage('#transfer');
272 console.error(e.message);
275 alert('Please turn on NFC adapter');
282 getCommunicateWithOtherDeviceButton: function ui_getCommunicateWithOtherDeviceButton() {
283 var communicateWithOtherDeviceButton;
284 communicateWithOtherDeviceButton = $(this.getButtonHtml('Communicate with another device'));
285 communicateWithOtherDeviceButton.on('tap', this.communicateWithOtherDevice);
286 return communicateWithOtherDeviceButton;
289 loadStartContent: function ui_loadStartContent() {
290 var startBox, contentStart, gap, comment;
291 contentStart = $('#content-start');
292 startBox = $('<div class="box" id="startBox"></div>');
293 gap = $('<div class="gap"></div>');
294 comment = $(this.getCommentHtml(localStorage));
296 contentStart.empty();
298 .append(this.getChangeContactButton())
300 .append(this.getReadFromCardButton())
302 .append(this.getWriteToCardButton())
304 .append(this.getCommunicateWithOtherDeviceButton())
307 contentStart.append(startBox);
308 contentStart.trigger('create');
311 loadStartPage: function ui_loadStartPage() {
312 if (localStorage.started === undefined) {
313 this.loadTemporaryContent();
315 this.loadStartContent();
317 $.mobile.activePage.page('refresh');
318 $('#start, #content-start').css("min-height", 0);
323 * @param {string} value
324 * @param {string} label
327 getLiHtml: function ui_getLiHtml(value, label) {
329 html = '<li class="ui-li-multiline">'
331 + ((value === '' || value === 'null') ? '...' : value)
332 + '<span class="ui-li-text-sub">' + label + '</span>'
340 * @param {string} phone
341 * @param {string} first
342 * @param {string} last
345 getContactsUlHtml: function ui_getContactsUlHtml(phone, first, last) {
347 html = '<ul data-role="listview" id="contacts-data">';
348 html += this.getLiHtml(first, 'First Name');
349 html += this.getLiHtml(last, 'Last Name');
350 html += this.getLiHtml(phone, 'Phone');
356 * @param {object} contact
359 getContactsListElement: function ui_getContactsListElement(contact) {
361 '<li class="ui-li-multiline">'
362 + '<a href="#">' + contact.caller
363 + '<span class="ui-li-text-sub">' +
371 prepareContactsTemplate: function ui_prepareContactsTemplate(phone, first, last) {
372 $('#content-contact > .ui-scrollview-view')
374 .append(this.getContactsUlHtml(phone, first, last));
375 $('#content-contact').trigger('create');
378 contactsCompare: function ui_contactsCompare(a, b) {
379 if (a.caller < b.caller) {
382 if (a.caller > b.caller) {
388 createSortedContactArray: function ui_createSortedContactArray(contacts) {
389 var i, len, sortedContactList = [], contact, phoneNumber;
391 for (i = 0, len = contacts.length; i < len; i += 1) {
392 contact = contacts[i];
393 if (contact.phoneNumbers.length === 0) {
396 phoneNumber = contact.phoneNumbers[0].number;
398 sortedContactList.push({
399 caller: this.prepareCallerName(contact),
400 firstName: contact.name.firstName || '',
401 lastName: contact.name.lastName || '',
402 phoneNumber: phoneNumber,
404 vCard: contact.convertToString('VCARD_30'),
408 sortedContactList.sort(this.contactsSort);
410 return sortedContactList;
413 createSortedContactList: function ui_createSortedContactList(contacts) {
414 var sortedContactList = this.createSortedContactArray(contacts),
415 ul = $('<ul data-role="listview" id="list-choose"></ul>'),
423 listElementTap = function (event) {
424 event.preventDefault();
425 $(this).addClass('selected').siblings().removeClass('selected');
426 self.app.saveDefaultCard();
429 for (i = 0, len = sortedContactList.length; i < len; i += 1) {
430 contact = sortedContactList[i];
431 if (contact.phoneNumber !== '') {
432 listElement = $(this.getContactsListElement(contact));
434 .data('caller', contact.caller)
435 .data('firstName', contact.firstName)
436 .data('lastName', contact.lastName)
437 .data('phoneNumber', contact.phoneNumber)
438 .data('id', contact.id)
439 .data('vCard', contact.vCard);
440 if (localStorage.id === listElement.data('id')) {
441 listElement.addClass('selected');
443 ul.append(listElement);
446 ul.on('tap taphold', 'li', listElementTap);
450 showContactsList: function ui_showContactsList(contacts) {
451 var ul = this.createSortedContactList(contacts);
452 $('#content-choose > .ui-scrollview-view').empty().append(ul);
453 $('#content-choose').trigger('create');
456 moveToStartPage: function ui_moveToStartPage(monit) {
457 $('#start').data('monit', monit || '');
458 $.mobile.changePage('#start');
461 isActivePage: function ui_isActivePage(id) {
462 return (id === $.mobile.activePage.attr("id"));
465 refreshIfActivePage: function ui_refreshIfActivePage(id) {
466 if (this.isActivePage(id)) {
467 $.mobile.activePage.trigger("pageshow");
471 moveToContactPage: function ui_moveToContactPage(obj) {
472 $('#start').data('monit', '');
473 $('#contact').data('contactsData', obj);
474 $.mobile.changePage('#contact');
477 disableSelections: function ui_disableSelections() {
478 $.mobile.tizen.disableSelection(document);
481 verticalCenter: function (obj) {
482 var marginTop = ($(window).height()
483 - $('[data-role=header]:visible').height()
484 - $('[data-role=footer]:visible').height()
485 - obj.outerHeight())/2;
486 if (parseInt(obj.css('margin-top'), 10) !== marginTop) {
487 obj.hide().css('margin-top', marginTop).show();
491 defineEvents: function ui_defineEvents() {
494 $('#header-start .ui-btn-back').on('tap', function (event) {
495 event.preventDefault();
496 self.app.nfc.stopNFC();
499 $('#header-start').on('click', '.ui-btn-back.ui-focus', function () {
503 $('#footer-contact').on('tap', '.ui-btn-back', function (event) {
504 event.preventDefault();
505 $.mobile.changePage('#start');
508 $('#footer-choose').on('tap', '.ui-btn-back', function (event) {
509 event.preventDefault();
510 $.mobile.changePage('#start');
513 $('#choose').on('pageshow', function (event) {
514 self.app.loadContacts(self.showContactsList.bind(self), function (e) {
515 alert('Cannot load the contacts list: ' + e.message);
516 console.error(e.message, e);
520 $('#contact').on('pageshow', function (event) {
521 var data = $(this).data('contactsData');
522 self.prepareContactsTemplate(data.phone, data.first, data.last);
525 $('#save-contact').on('tap', function (event) {
526 event.preventDefault();
527 self.app.saveContact();
530 $('#start').on('pagebeforeshow', function () {
531 if (self.app.started) {
532 self.loadStartPage();
534 self.verticalCenter($('#startBox'));
537 $('#start').on('pageshow', function () {
538 var obj = $(this), monit = obj.data('monit');
539 if (monit !== '' && monit !== undefined) {
540 self.showPopup(obj.data('monit'), obj);
544 $('#start').one('pageshow', function () {
545 setTimeout(function () {
546 self.verticalCenter($('#startBox'));
549 $( "#contact-nfc-error" ).bind({
550 popupafterclose: function(){
551 tizen.application.getCurrentApplication().exit();
555 document.addEventListener('tizenhwkey', function(e) {
556 if (e.keyName == "back") {
557 if ($.mobile.activePage.attr('id') === 'start') {
558 tizen.application.getCurrentApplication().exit();
560 self.app.nfc.timeExpired();
565 document.addEventListener('webkitvisibilitychange', function () {
566 if(document.webkitVisibilityState === "visible") {
567 if ($.mobile.activePage.attr('id') === "choose") {
568 $.mobile.activePage.trigger('pageshow');
573 $('#transfer').on('pageshow', function () {
574 if (tizen.nfc.getDefaultAdapter().powered) {
576 var option = $(this).data('option');
577 if (option === 'read') {
578 self.prepareWaitingPage('Card to device', 'PUT WIRELESS TAG<br>CLOSE TO<br>YOUR DEVICE');
579 self.app.nfc.card.setTagDetectRead();
580 } else if (option === 'write') {
581 self.prepareWaitingPage('Device to card', 'PUT WIRELESS TAG<br>CLOSE TO<br>YOUR DEVICE');
582 self.app.nfc.card.setTagDetectWrite();
584 self.prepareWaitingPage('Device to device', 'PUT YOUR DEVICE<br>CLOSE TO<br>OTHER DEVICE');
585 self.app.nfc.peer.setTargetDetect();
588 console.error(e.message);
591 $.mobile.changePage('#start');
592 alert('Please turn on NFC adapter');