+/*
+* Copyright 2013 Samsung Electronics Co., Ltd
+*
+* Licensed under the Flora License, Version 1.1 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://floralicense.org/license/
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
/*jslint devel: true*/
/*global tizen, document, $, jQuery, app, UiPanel, UiContact, TemplateManager, window, Helpers */
/**
- * @class Ui
- */
-
+* @class Ui
+*/
function Ui(contacts) {
- 'use strict';
- this.init();
+ 'use strict';
+ this.init();
}
(function () { // strict mode wrapper
- 'use strict';
- Ui.prototype = {
- /**
- * UI remove mode
- * @type {boolean}
- */
- removeMode: false,
-
- addressBook: tizen.contact.getDefaultAddressBook(),
-
- photoURIdefault: null,
-
- contactsLoaded: null,
-
- checkedLogs: [],
-
- /**
- * @type {TemplateManager}
- */
- templateManager: null,
-
- /**
- * UI Initializer
- */
- init: function Ui_init() {
- this.loadContacts();
- this.templateManager = new TemplateManager();
- this.helpers = new Helpers();
- $(document).ready(this.domInit.bind(this));
- $.mobile.tizen.disableSelection(document);
- },
-
- /**
- * When DOM is ready, initialise it (bind events)
- */
- domInit: function Ui_domInit() {
- this.templateManager.loadToCache(['callView',
- 'callerHistory',
- 'callItemRow',
- 'callerCallItemRow',
- 'messageWindow',
- 'errorWindow',
- 'dateRow'], this.initPages.bind(this));
- },
-
- /**
- * UI pages initializer
- */
- initPages: function Ui_initPages() {
- var pages = [], body = $('body');
-
- body
- .append(this.templateManager.get('messageWindow'))
- .append(this.templateManager.get('errorWindow'))
- .trigger('create');
- $('#callView')
- .append($(this.templateManager.get('callView'))
- .children())
- .trigger('pagecreate')
- .trigger('pageshow');
- pages.push(this.templateManager.get('callerHistory'));
- body.append(pages.join(''));
- this.removeSearchBarToHeader();
-
- this.addEvents();
- app.showCallHistory();
-
- this.photoURIdefault = $("#header .photo").css('background-image');
- },
-
- /**
- * Add UI events
- */
- addEvents: function Ui_addEvents() {
- var self = this;
-
- $(window).on('resize', function () {
- $.mobile.activePage.page('refresh');
- });
-
- $('#callView').on('pagebeforeshow', function () {
- app.showCallHistory();
- });
-
- //original code, do not remove until web-ui release; N_SE-48946
- //$(".ui-scrollview-view").listview();
-
- $('#historyForCallerView').on('pagebeforeshow', function () {
- self.hideCheckboxes();
- $('#historyForCallerView .ui-content.ui-scrollview-clip .ui-scrollview-view')
- .css('-webkit-transform', 'translate3d(0px, 0px, 0px)');
- $('#selectAllDetails').on('change', function () {
- self.selectAll();
- });
- });
-
- $('#historyForCallerView').on('pageshow', function () {
- $('#content').css('top', '160px');
- $('#header').css('height', '160px');
- $('#callerListContainer')
- .children('.ui-overflow-indicator-top', '.ui-overflow-indicator-bottom')
- .hide();
- });
-
- $('#callerListContainer').on('scrollstart', function () {
- $(this)
- .children('.ui-overflow-indicator-top', '.ui-overflow-indicator-bottom')
- .fadeIn(200);
- });
-
- $('#callerListContainer').on('scrollstop', function () {
- $(this)
- .children('.ui-overflow-indicator-top', '.ui-overflow-indicator-bottom')
- .fadeOut(200);
- });
-
- $('.selectAllBox').children().on('click', function () {
- $('.selectAllBox input[type=checkbox]').trigger('click');
- self.selectAll();
- self.selectAllDetailsEach();
- });
-
- $('#calllogList').on('click', '.date', function (event) {
- event.stopPropagation();
- });
-
- $('#calllogList').on('click', '.call', function onCalllogEntryClick(event) {
- var remoteParty = $(this)
- .data('entries')[0]
- .remoteParties[0]
- .remoteParty;
- app.showHistoryForCaller(remoteParty);
- $.mobile.changePage('#historyForCallerView');
- });
-
- $('#smsActionBtn').on('click', function (event) {
- event.stopPropagation();
- event.preventDefault();
- self.lockButtons('#smsActionBtn');
- self.hideCheckboxes();
- app.sendSms($('#forCallerList').data('remoteParty'));
- });
-
- $('#callActionBtn').on("click", function (event) {
- self.lockButtons('#callActionBtn');
- self.hideCheckboxes();
- app.makeCall($('#forCallerList').data('remoteParty'));
- });
-
- $('#deleteActionBtn').on('click', function () {
- self.changeDetailsToRemoveState();
- });
-
- $('.selectAllBox').on('click', 'li', function () {
- var checkbox = $(this).find(':checkbox');
- if (self.removeMode === true) {
- if (checkbox.attr('checked')) {
- checkbox.attr('checked', false)
- .data('checkboxradio')
- .refresh();
- } else {
- checkbox.attr('checked', true)
- .data('checkboxradio')
- .refresh();
- }
- self.setSelectAllDetails();
- }
- });
-
- $('#popup')
- .on('click', '#popupCancelActionBtn', this.closePopup.bind(this))
- .on('click', '#popupSubmitActionBtn', this.deleteCheckedLogs.bind(this));
-
- $('#errorPopup').on('click', '#errorPopupOkBtn', this.closeErrorPopup);
-
- $( "#errorPopup" ).bind({
- popupafterclose: function(){
- self.unlockButtons();
- }
- });
-
- $(window).keyup(function(e){
- if (e.which === 13) {
- $('input:focus').blur();
- }
- });
-
- window.addEventListener('tizenhwkey', function(e) {
- if (e.keyName == "back") {
- if ($.mobile.popup.active) {
- $.mobile.popup.active.close();
- } else if (self.removeMode === true) {
- app.ui.changeDetailsToRemoveState(undefined, true);
- } else if ($.mobile.activePage.attr('id') === 'callView') {
- tizen.application.getCurrentApplication().exit();
- } else {
- history.back();
- }
- }
- });
- self.onVisibilityChange();
- },
-
- addEventsForCallerListCheckboxes: function Ui_addEventsForCallerListCheckboxes() {
- var self = this;
- $('#forCallerList :checkbox').on('change', function (event) {
- if ($(this).attr('checked')) {
- $(this).attr('checked', true);
- } else {
- $(this).attr('checked', false);
- }
- self.setSelectAllDetails();
- });
- },
-
- selectAll: function () {
- if ($('#selectAllDetails').attr('checked')) {
- this.selectCheckbox($('#selectAllDetails'), true);
- } else {
- this.selectCheckbox($('#selectAllDetails'), false);
- }
- this.selectAllDetailsEach();
- },
-
- selectCheckbox: function (obj, state) {
- var deleteButton = $('#deleteActionBtn'), numChecked;
- obj.attr('checked', state)
- .data('checkboxradio')
- .refresh();
-
- numChecked = $('#forCallerList input:checked').length;
- if (this.removeMode && numChecked === 0 && !deleteButton.hasClass('ui-disabled')) {
- deleteButton.addClass('ui-disabled').attr('tabIndex', '-1').blur();
- } else if (deleteButton.hasClass('ui-disabled')) {
- deleteButton.removeClass('ui-disabled').attr('tabIndex', '0');
- }
- },
-
- /**
- * Returns number of selected call logs
- * @return {number} length
- */
- getCountSelectedLogEntries: function Ui_getCountSelectedLogEntries() {
- return $('#forCallerList li .toRemove label.ui-checkbox-on').length;
- },
-
- selectAllDetailsEach: function Ui_selectAllDetailsEach() {
- var self = this;
- $('#forCallerList').find('input').each(function () {
- if ($('#selectAllDetails').attr('checked')) {
- self.selectCheckbox($(this), true);
- } else {
- self.selectCheckbox($(this), false);
- }
- });
- },
-
- /**
- * Hides checkboxes
- */
- hideCheckboxes: function Ui_hideCheckboxes() {
- var self = this;
- this.selectCheckbox($('#selectAllDetails'), false);
-
- $('#forCallerList').find('input').each(function () {
- self.selectCheckbox($(this), false);
- });
- this.changeDetailsToRemoveState('hide');
- },
-
- /**
- * Returns css classes for specified entry
- *
- * @param {CallHistoryEntry} entry
- * @returns {string}
- */
- cssClassesForEntry: function Ui_cssClassesForEntry(entry) {
- return 'call dir_' + entry.direction.toLowerCase() + ' type_' + entry.type.replace('.', '-').toLowerCase();
- },
-
- setSelectAllDetails: function Ui_setSelectAllDetails() {
- if ($('#forCallerList input[type="checkbox"]').length ===
- $('#forCallerList input[checked="checked"]').length) {
- this.selectCheckbox($('#selectAllDetails'), true);
- } else {
- this.selectCheckbox($('#selectAllDetails'), false);
- }
- },
-
- /**
- * Shows popup with specified message
- * @param {string} message
- */
- showPopup: function Ui_showPopup(message) {
- $('#popupMessage').html(message);
- $('#popup').popup('open', {'positionTo': 'window'});
- },
-
- /**
- * Hides popup
- */
- closePopup: function Ui_closePopup() {
- $('#popup').popup('close');
- },
-
- showErrorPopup: function Ui_showErrorPopup(message) {
- $('#errorPopupMessage').html(message);
- $('#errorPopup').popup('open', {'positionTo': 'window'});
- },
-
- closeErrorPopup: function Ui_closeErrorPopup() {
- $('#errorPopup').popup('close');
- },
-
- /**
- * Deletes checked log entries
- */
- deleteCheckedLogs: function Ui_deleteCheckedLogs(e) {
- this.closePopup();
-
- this.selectCheckbox($('#selectAllDetails'), false);
-
- $('#forCallerList li.call').each(function () {
- if ($(this).find('form label').hasClass('ui-checkbox-on')) {
- app.deleteLog($(this).data('entries')[0]);
- $(this).remove();
- }
- });
-
- if ($('#forCallerList li.call').length > 0) {
- this.updateCallerHeaderNumberOfEntries($('#forCallerList li.call').length);
- } else {
- e.preventDefault();
- $('.ui-listview-filter .ui-input-text').val('');
- $('.ui-listview-filter .ui-input-text').trigger('change');
- $.mobile.changePage('#callView');
- }
-
- this.changeDetailsToRemoveState(true);
- this.scrollToBottom();
- },
-
- changeDetailsToRemoveState: function Ui_changeDetailsToRemoveState(set, clear) {
- var counter = this.getCountSelectedLogEntries(),
- numChecked = $('#forCallerList input:checked').length,
- matrix, pos;
- if (clear === true) {
- counter = 0;
- $('#forCallerList').find(':checkbox').attr('checked', false)
- .data('checkboxradio').refresh();
- $('.selectAllBox').find(':checkbox').attr('checked', false)
- .data('checkboxradio').refresh();
- }
- if (set !== undefined) {
- this.removeMode = false;
- } else if (counter === 0) {
- this.removeMode = !this.removeMode;
- }
-
- if (this.removeMode && numChecked === 0) {
- $('#deleteActionBtn').addClass('ui-disabled').attr('tabIndex', '-1').blur();
- } else if (!this.removeMode) {
- $('#deleteActionBtn').removeClass('ui-disabled').attr('tabIndex', '0');
- this.selectAllDetailsEach();
- }
-
- if (counter === 0) {
- if (this.removeMode) {
- $('#historyForCallerView .toRemove').removeClass('hidden');
- $('#historyForCallerView .selectAllBox')
- .removeClass('hidden');
- } else {
- $('#historyForCallerView .toRemove').addClass('hidden');
- $('#historyForCallerView .selectAllBox').addClass('hidden');
- }
- } else if (counter > 1) {
- this.showPopup('Are you sure you want to delete selected logs?');
- } else {
- this.showPopup('Are you sure you want to delete selected log?');
- }
-
- matrix = $('#historyForCallerView .ui-scrollview-view').css('transform');
- pos = matrix.substr(7, matrix.length -8).split(',')[5];
- if (pos !== undefined) {
- $('#callerListContainer').scrollview('scrollTo', 100, parseInt(pos), 10);
- } else {
- this.refreshScrollView();
- }
- },
-
- /**
- * Renders call history list
- *
- * @param {CallHistoryEntry[]} callEntries
- */
- showCallHistory: function Ui_showCallHistory(callEntries) {
- var self = this,
- pdate = null, // previous date
- date = '',
- elements = [], // list elements
- len = callEntries.length, // entries length
- tempLength = 0, // length of temporary table;
- i, // loop counter
- j, // loop counter
- current, // current entry object
- today = this.helpers.getShortDate(new Date()), // today short date
- entryShortDate,
- filterResult,
- groupsOfDays = [],
- dayLog,
- index = 0,
- calllogList = $('#calllogList'),
- calllogListContent = $('#calllogListContent'),
- calllogListContentPos;
-
- function filterForSameEntry(element) {
- return self.getNumber(current) === self.getNumber(element)
- && current.direction === element.direction;
- }
-
- $('.selectedCount').hide();
-
- for (i = 0; i < len; i = i + 1) {
- current = callEntries[i];
- date = this.helpers.toNativeDate(current.startTime);
-
- // if date is changed create new deyLog;
- if (date !== pdate) {
- dayLog = {};
- dayLog.date = date;
- dayLog.entries = [];
- dayLog.counters = [];
- groupsOfDays.push(dayLog);
- pdate = date;
- }
-
- // group entries by remote Party;
- filterResult = dayLog.entries.filter(filterForSameEntry);
- if (filterResult.length) {
- index = dayLog.entries.indexOf(filterResult[0]);
- dayLog.counters[index] += 1;
- } else {
- dayLog.entries.push(current);
- dayLog.counters[dayLog.entries.length - 1] = 1;
- }
- }
- // Create UL list with dividers;
- len = groupsOfDays.length;
- for (i = 0; i < len; i += 1) {
- dayLog = groupsOfDays[i];
- tempLength = dayLog.entries.length;
- entryShortDate = this.helpers.getShortDate(dayLog.entries[0].startTime);
- // add date header;
- //original code, do not remove until web-ui release; N_SE-48946
-// elements.push($(this.templateManager.get('dateRow', {
-// 'date': today === entryShortDate ? 'Today' : dayLog.date
-// })).get(0));
-
- for (j = 0; j < tempLength; j = j + 1) {
- elements.push(this.getCallItemRow(dayLog.entries[j], dayLog.counters[j]));
- }
- }
- calllogListContentPos = this.helpers.getScrollPosition(calllogListContent);
- calllogList.empty().append(elements);
-
- /* workaround solution for searching phrase remain*/
- if ($("[data-type='search']").val().length != "") {
- calllogList.listview('refresh');
- $("[data-type='search']").trigger("keyup");
- $(".ui-li-divider").removeClass("ui-li ui-li-divider ui-bar-s").addClass("date");
- } else {
- calllogList.listview({
- autodividers: true,
- //filter: true,
- autodividersSelector: function ( li ) {
- return $(li).find('.callDate').text() === app.ui.helpers.toNativeDate(new Date())
- ? "Today" : $(li).find('.callDate').text();
- }
- }).listview('refresh');
- $(".ui-li-divider").removeClass().addClass("date");
- }
-
- setTimeout(this.helpers.scrollTo.bind(this, calllogListContent, calllogListContentPos), 10);
- },
-
- /**
- * @param: {CallHistoryEntry} entry
- */
- getNumber: function (entry) {
- return entry.remoteParties[0].remoteParty;
- },
-
- /**
- * Returns HTML for single log entry
- *
- * @param {CallHistoryEntry} entry
- * @param {number} counter
- * @returns {HTMLPartial}
- */
- getCallItemRow: function Ui_getCallItemRow(entry, counter) {
- var party = entry.remoteParties[0],
- name = this.getNameByNumber(party.remoteParty),
- tpl;
-
- if (counter > 1) {
- name += ' (' + counter + ')';
- }
-
- tpl = this.templateManager.get('callItemRow', {
- 'name': name,
- 'callTime': this.helpers.toNativeTime(entry.startTime),
- 'callDate': this.helpers.toNativeDate(entry.startTime),
- 'cssClasses': this.cssClassesForEntry(entry),
- 'uid': entry.uid
- });
-
- return $(tpl)
- .data('remoteParty', entry.remoteParties[0].remoteParty)
- .data('entries', [entry])
- .get(0); // return clean DOM element so array of those could be appended at once*/
- },
-
- getNameByNumber: function (number) {
- var i, j, contact, name;
- for (i in this.contactsLoaded) {
- if (this.contactsLoaded.hasOwnProperty(i)) {
- contact = this.contactsLoaded[i];
- for (j in contact.phoneNumbers) {
- if (contact.phoneNumbers.hasOwnProperty(j)) {
- if (contact.phoneNumbers[j].number.substr(-9)
- === number.substr(-9)) {
- name = contact.name.displayName;
- break;
- }
- }
- }
- }
- }
- return name || number || 'Unknown';
- },
-
- /**
- * Returns HTML for single caller log entry
- *
- * @param {CallHistoryEntry} entry
- * @returns {HTMLElement}
- */
- getCallerCallLogRow: function Ui_getCallerCallLogRow(entry) {
- return $(this.templateManager.get('callerCallItemRow', {
- 'cssClass': this.cssClassesForEntry(entry),
- 'callTime': this.helpers.toNativeTime(entry.startTime),
- 'callDuration': this.helpers.secondsToHours(entry.duration),
- 'uid': entry.uid
- })).data('entries', [entry]).get(0);
- },
-
- /**
- * Renders call log list for specified caller
- *
- * @param {string} remoteParty
- * @param {CallHistoryEntry[]} entries
- */
- showHistoryForCaller: function Ui_showHistoryForCaller(remoteParty, entries) {
- var pdate = '',
- date = '',
- elements = [],
- len = entries.length,
- i,
- checkbox;
-
- if (len) {
- this.updateCallerHeader(entries[0], entries.length);
- } else {
- // if last call log has been removed
- this.removedLastLog();
- this.app.lastViewedCaller = 0;
- }
-
- $('#forCallerList')
- .data('remoteParty', remoteParty)
- .data('modified', false)
- .empty();
-
- // group caller log entries by date
- for (i = 0; i < len; i = i + 1) {
- date = this.helpers.toNativeDate(entries[i].startTime);
-
- // if date is changed render new header
- if (date !== pdate) {
- elements.push($(this.templateManager.get('dateRow', {'date': date})).get(0));
- pdate = date;
- }
- elements.push(this.getCallerCallLogRow(entries[i]));
- }
-
- $('#forCallerList')
- .empty()
- .append(elements);
-
- if (elements.length > 0) {
- $('li#delete > a').addClass('ui-btn-active');
- } else {
- $('li#delete > a').removeClass('ui-btn-active');
- }
-
- $('#forCallerList').trigger('create');
-
- // change to remove mode if it was active before registering call
- if (this.removeMode) {
- this.removeMode = !this.removeMode;
- this.changeDetailsToRemoveState();
- // check previous checked entries
- this.checkedLogs.forEach(function(logUid){
- checkbox = $('#forCallerList li.call[data-uid="' + logUid + '"]')
- .find(':checkbox');
-
- if (checkbox.length > 0) {
- checkbox.attr('checked', true)
- .data('checkboxradio')
- .refresh();
- $('#deleteActionBtn').removeClass('ui-disabled').attr('tabIndex', '0');
- }
- });
-
- this.setSelectAllDetails();
-
- // close popup if there are no checked checkboxes
- if (!$("#forCallerList input:checked").length) {
- if ($.mobile.popup.active) {
- $.mobile.popup.active.close();
- }
- }
- }
- this.addEventsForCallerListCheckboxes();
- // lock buttons if unknown caller
- if (remoteParty) {
- this.unlockButtons();
- } else {
- this.lockButtons('#callActionBtn, #smsActionBtn');
- }
- },
-
- /**
- * Update accoundId
- * @param {string} accountId
- */
- updateCallerHeaderAccountId: function Ui_updateCallerHeaderAccountId(accountId) {
- $('.infoContainer .accountId').html(accountId);
- },
-
- /**
- * Update number of entries
- * @param numberOfEntries
- */
- updateCallerHeaderNumberOfEntries: function Ui_updateCallerHeaderNumberOfEntries(numberOfEntries) {
- $('.infoContainer .numberOfEntries').html('' + numberOfEntries + ' ' + (numberOfEntries === 1 ? 'call' : 'calls'));
- },
-
- /**
- * Updates caller main info
- * @param {CallHistoryEntry} entry
- * @param {number} numberOfEntries
- */
- updateCallerHeader: function Ui_updateCallerHeader(entry, numberOfEntries) {
- var name = '', party, imgPath, personId;
-
- $('#header .photo').css('background-image', this.photoURIdefault);
-
- if (entry.remoteParties !== null) {
- party = entry.remoteParties[0];
- personId = parseInt(party.personId, 10);
- name = this.getNameByNumber(party.remoteParty);
- if (party.displayName) {
- this.updateCallerHeaderAccountId(party.remoteParty);
- }
- this.updateCallerHeaderNumberOfEntries(numberOfEntries);
- if (personId !== 0) {
- imgPath = app.getPhotoURIForContact(personId);
- if (imgPath !== false) {
- $('#header .photo').css('background-image', 'url(' + imgPath + ')');
- }
- }
- } else if (entry.contactId !== null) {
- name = entry.accountId;
- this.updateCallerHeaderAccountId(entry.accountId);
- this.updateCallerHeaderNumberOfEntries(numberOfEntries);
- } else {
- name = entry.accountId;
- this.updateCallerHeaderAccountId('');
- this.updateCallerHeaderNumberOfEntries(numberOfEntries);
- }
- $('.contact > .infoContainer > .name').html(this.templateManager.modifiers.escape(name));
-
- },
-
- loadContacts: function Model_loadContacts(callback) {
- var contactsFoundCB, errorCB;
-
- this.contactsLoaded = null;
-
- contactsFoundCB = function (contacts) {
- this.contactsLoaded = contacts;
- if (callback instanceof Function) {
- callback();
- }
- };
-
- errorCB = function (error) {
- console.error('Model_loadContacts, problem with find() method: ' + error.message);
- };
-
- this.addressBook.find(contactsFoundCB.bind(this), errorCB);
- },
-
- /**
- * Remove search filter from content and appends it to header
- */
- removeSearchBarToHeader: function () {
- $('#page-header').append($('#callView .ui-listview-filter'));
- $.mobile.activePage.page('refresh');
- $('.ui-input-cancel').remove(); // patch for WebUI bug
- $('#calllogListContent').trigger('resize'); // WebUi scrollview fix
- },
-
- scrollToBottom: function () {
- var scrollView = $(".ui-scrollview-view");
- scrollView.css("-webkit-transform", "translate3d(0px, -" +
- scrollView.height() + "px, 0px)");
- },
-
- onVisibilityChange: function () {
- var self = this;
- document.addEventListener('webkitvisibilitychange', function () {
- if (document.webkitVisibilityState === 'hidden') {
- self.checkedLogs = [];
- $('#forCallerList li.call').each(function () {
- if ($(this).find('form label')
- .hasClass('ui-checkbox-on')) {
- var checkedEntry = $(this).data('entries')[0];
- self.checkedLogs.push(checkedEntry.uid);
- }
- });
- } else {
- self.loadContacts(app.updateCallLists.bind(app));
- $('#callActionBtn, #smsActionBtn')
- .removeClass('ui-disabled');
- }
- });
- },
-
- lockButtons: function Ui_lockButtons(buttons) {
- $(buttons).addClass('ui-disabled').attr('tabIndex', '-1').blur();
- },
-
- unlockButtons: function Ui_unlockButtons(){
- $('#callActionBtn, #smsActionBtn').removeClass('ui-disabled').attr('tabIndex', '0');
- },
-
- /**
- * WORKAROUND;
- * Patch for UI, bad refresh scrollView
- */
- refreshScrollView: function () {
- var scrollView = $('.ui-scrollview-view'),
- show = function () {
- scrollView.show();
- };
- scrollView.hide();
- setTimeout(show, 0);
- },
-
- removedLastLog: function () {
- this.hideCheckboxes();
- $(".ui-popup").popup('close');
- $.mobile.changePage('#callView');
- }
- };
+ 'use strict';
+
+ Ui.prototype = {
+
+ /**
+ * UI remove mode
+ * @type {boolean}
+ */
+ removeMode: false,
+
+ /**
+ * Default tizen address book
+ * @type {AddressBook}
+ */
+ addressBook: tizen.contact.getDefaultAddressBook(),
+
+ /**
+ * Default photo uri
+ * @type {String}
+ */
+ photoURIdefault: null,
+
+ /**
+ * Cached contacts from address book
+ * @type {Array}
+ */
+ contactsLoaded: null,
+
+ /**
+ * identifiers of currently checked checkboxes
+ * @type {Array}
+ */
+ checkedLogs: [],
+
+ /**
+ * @type {TemplateManager}
+ */
+ templateManager: null,
+
+ /**
+ * UI Initializer
+ */
+ init: function Ui_init() {
+ this.loadContacts();
+ this.templateManager = new TemplateManager();
+ this.helpers = new Helpers();
+ $(document).ready(this.domInit.bind(this));
+ $.mobile.tizen.disableSelection(document);
+ },
+
+ /**
+ * When DOM is ready, initialise it (bind events)
+ */
+ domInit: function Ui_domInit() {
+ this.templateManager.loadToCache(['callView',
+ 'callerHistory',
+ 'callItemRow',
+ 'callerCallItemRow',
+ 'messageWindow',
+ 'errorWindow',
+ 'dateRow'], this.initPages.bind(this));
+ },
+
+ /**
+ * UI pages initializer
+ */
+ initPages: function Ui_initPages() {
+ var pages = [], body = $('body');
+
+ body
+ .append(this.templateManager.get('messageWindow'))
+ .append(this.templateManager.get('errorWindow'))
+ .trigger('create');
+ $('#callView')
+ .append(
+ $(this.templateManager.get('callView')).children()
+ )
+ .trigger('pagecreate')
+ .trigger('pageshow');
+ pages.push(this.templateManager.get('callerHistory'));
+ body.append(pages.join(''));
+ this.removeSearchBarToHeader();
+
+ this.addEvents();
+ app.showCallHistory();
+
+ this.photoURIdefault = $("#header .photo").css('background-image');
+ },
+
+ /**
+ * Add UI events
+ */
+ addEvents: function Ui_addEvents() {
+ var self = this;
+
+ // recalculating page size when window resize
+ // (eg. when soft keybord appear)
+ $(window).on('resize', function () {
+ $.mobile.activePage.page('refresh');
+ });
+
+ // creating call history view
+ $('#callView').on('pagebeforeshow', function () {
+ app.showCallHistory();
+ });
+
+ // creating single contact history view
+ $('#historyForCallerView').on('pagebeforeshow', function () {
+ self.hideCheckboxes();
+ // move scrollbar to top
+ $('#historyForCallerView')
+ .find('.ui-content.ui-scrollview-clip')
+ .find('.ui-scrollview-view')
+ .css('-webkit-transform', 'translate3d(0px, 0px, 0px)');
+ $('#selectAllDetails').on('change', function () {
+ self.selectAll();
+ });
+ });
+
+
+ // HACK not dissapearing scrollview indicator
+ $('#historyForCallerView').on('pageshow', function () {
+ $('#content').css('top', '160px');
+ $('#header').css('height', '160px');
+ $('#callerListContainer')
+ .children(
+ '.ui-overflow-indicator-top',
+ '.ui-overflow-indicator-bottom'
+ ).hide();
+ });
+
+ // HACK not dissapearing scrollview indicator
+ $('#callerListContainer').on('scrollstart', function () {
+ $(this)
+ .children(
+ '.ui-overflow-indicator-top',
+ '.ui-overflow-indicator-bottom'
+ ).fadeIn(200);
+ });
+
+ // HACK not dissapearing scrollview indicator
+ $('#callerListContainer').on('scrollstop', function () {
+ $(this)
+ .children(
+ '.ui-overflow-indicator-top',
+ '.ui-overflow-indicator-bottom'
+ ).fadeOut(200);
+ });
+
+ // selecting all checkboxes
+ $('.selectAllBox').children().on('click', function () {
+ $('.selectAllBox input[type=checkbox]').trigger('click');
+ self.selectAll();
+ self.selectAllDetailsEach();
+ });
+
+ $('#calllogList').on('click', '.date', function (event) {
+ event.stopPropagation();
+ });
+
+ // when clicked on a log display all history from that contact
+ $('#calllogList').on(
+ 'click keypress',
+ '.call',
+ function onCalllogEntryClick(event) {
+ if (event.type === 'keypress' && event.keyCode !== 13) {
+ return;
+ }
+ var remoteParty = $(this)
+ .data('entries')[0]
+ .remoteParties[0]
+ .remoteParty;
+ app.showHistoryForCaller(remoteParty);
+ $.mobile.changePage('#historyForCallerView');
+ }
+ );
+
+ // run sms service on click
+ $('#smsActionBtn').on('click', function (event) {
+ event.stopPropagation();
+ event.preventDefault();
+ self.lockButtons('#smsActionBtn, #callActionBtn');
+ self.hideCheckboxes();
+ self.lockButtons('#deleteActionBtn');
+ app.sendSms($('#forCallerList').data('remoteParty'));
+ });
+
+ // run call service on btn click
+ $('#callActionBtn').on("click", function (event) {
+ self.lockButtons('#callActionBtn, #smsActionBtn');
+ self.hideCheckboxes();
+ self.lockButtons('#deleteActionBtn');
+ app.makeCall($('#forCallerList').data('remoteParty'));
+ });
+
+ $('#deleteActionBtn').on('click', function () {
+ self.changeDetailsToRemoveState();
+ });
+
+ // selecting all checkboxes
+ $('.selectAllBox').on('click', 'li', function () {
+ var checkbox = $(this).find(':checkbox');
+ if (self.removeMode === true) {
+ if (checkbox.attr('checked')) {
+ checkbox.attr('checked', false)
+ .data('checkboxradio')
+ .refresh();
+ } else {
+ checkbox.attr('checked', true)
+ .data('checkboxradio')
+ .refresh();
+ }
+ self.setSelectAllDetails();
+ }
+ });
+
+ $('#popup')
+ .on(
+ 'click',
+ '#popupCancelActionBtn',
+ this.closePopup.bind(this)
+ ).on(
+ 'click',
+ '#popupSubmitActionBtn',
+ this.deleteCheckedLogs.bind(this)
+ );
+
+ $('#errorPopup').on(
+ 'click',
+ '#errorPopupOkBtn',
+ this.closeErrorPopup
+ );
+
+ $('#errorPopup').bind(
+ {
+ popupafterclose: function () {
+ self.unlockButtons();
+ }
+ }
+ );
+
+ $(window).keyup(function (e) {
+ if (e.which === 13) {
+ $('input:focus').blur();
+ }
+ });
+
+ // bind hardware back button
+ window.addEventListener('tizenhwkey', function (e) {
+ if (e.keyName === "back") {
+ // if there is any popup close it
+ if ($.mobile.popup.active) {
+ $.mobile.popup.active.close();
+ // if app is in remove mode close it
+ } else if (self.removeMode === true) {
+ app.ui.changeDetailsToRemoveState(undefined, true);
+ // if app is on calls page close app
+ } else if ($.mobile.activePage.attr('id') === 'callView') {
+ tizen.application.getCurrentApplication().exit();
+ // else back to calls page
+ } else {
+ history.back();
+ }
+ }
+ });
+ // bind callback to visbility change event
+ self.onVisibilityChange();
+ },
+
+ /**
+ * Bind change event
+ */
+ addEventsForCallerListCheckboxes:
+ function Ui_addEventsForCallerListCheckboxes() {
+ var self = this;
+ $('#forCallerList :checkbox').on('change', function (event) {
+ if ($(this).attr('checked')) {
+ $(this).attr('checked', true);
+ } else {
+ $(this).attr('checked', false);
+ }
+ self.setSelectAllDetails();
+ });
+ },
+
+ /**
+ * Callback function for click on select all element
+ */
+ selectAll: function () {
+ // if select all checkbox is checked
+ if ($('#selectAllDetails').attr('checked')) {
+ this.selectCheckbox($('#selectAllDetails'), true);
+ } else {
+ this.selectCheckbox($('#selectAllDetails'), false);
+ }
+ // select each checkbox separatly
+ this.selectAllDetailsEach();
+ },
+
+ /**
+ * Select single checkbox and enable delete button
+ */
+ selectCheckbox: function (obj, state) {
+ var deleteButton = $('#deleteActionBtn'), numChecked;
+ // check checkbox and refresh its view
+ obj.attr('checked', state)
+ .data('checkboxradio')
+ .refresh();
+
+ // check if there is any checked checkbox
+ // and toggle delete button availability
+ numChecked = $('#forCallerList input:checked').length;
+ if (this.removeMode && numChecked === 0) {
+ deleteButton
+ .addClass('ui-disabled')
+ .attr('tabIndex', '-1')
+ .blur();
+ } else if (deleteButton.hasClass('ui-disabled')) {
+ deleteButton
+ .removeClass('ui-disabled')
+ .attr('tabIndex', '0');
+ }
+ },
+
+ /**
+ * Returns number of selected call logs
+ * @return {number} length
+ */
+ getCountSelectedLogEntries: function Ui_getCountSelectedLogEntries() {
+ return $('#forCallerList li .toRemove label.ui-checkbox-on').length;
+ },
+
+ /**
+ * Select each checkbox separatly
+ */
+ selectAllDetailsEach: function Ui_selectAllDetailsEach() {
+ var self = this;
+ $('#forCallerList').find('input').each(function () {
+ if ($('#selectAllDetails').attr('checked')) {
+ self.selectCheckbox($(this), true);
+ } else {
+ self.selectCheckbox($(this), false);
+ }
+ });
+ },
+
+ /**
+ * Hides checkboxes
+ */
+ hideCheckboxes: function Ui_hideCheckboxes() {
+ var self = this;
+ this.selectCheckbox($('#selectAllDetails'), false);
+
+ $('#forCallerList').find('input').each(function () {
+ self.selectCheckbox($(this), false);
+ });
+ this.changeDetailsToRemoveState('hide');
+ },
+
+ /**
+ * Returns css classes for specified entry
+ *
+ * @param {CallHistoryEntry} entry
+ * @returns {string}
+ */
+ cssClassesForEntry: function Ui_cssClassesForEntry(entry) {
+ return 'call dir_' +
+ entry.direction.toLowerCase() +
+ ' type_' +
+ entry.type.replace('.', '-').toLowerCase();
+ },
+
+ /**
+ * Check if all details checkboxes are selected
+ * and if so check selectAll element
+ */
+ setSelectAllDetails: function Ui_setSelectAllDetails() {
+ if (
+ $('#forCallerList input[type="checkbox"]').length ===
+ $('#forCallerList input[checked="checked"]').length
+ ) {
+ this.selectCheckbox($('#selectAllDetails'), true);
+ } else {
+ this.selectCheckbox($('#selectAllDetails'), false);
+ }
+ },
+
+ /**
+ * Shows popup with specified message
+ * @param {string} message
+ */
+ showPopup: function Ui_showPopup(message) {
+ $('#popupMessage').html(message);
+ $('#popup').popup('open', {'positionTo': 'window'});
+ },
+
+ /**
+ * Hides popup
+ */
+ closePopup: function Ui_closePopup() {
+ $('#popup').popup('close');
+ },
+
+ /**
+ * Display error popup
+ */
+ showErrorPopup: function Ui_showErrorPopup(message) {
+ $('#errorPopupMessage').html(message);
+ $('#errorPopup').popup('open', {'positionTo': 'window'});
+ },
+
+ /**
+ * Hides error popup
+ */
+ closeErrorPopup: function Ui_closeErrorPopup() {
+ $('#errorPopup').popup('close');
+ },
+
+ /**
+ * Deletes checked log entries
+ */
+ deleteCheckedLogs: function Ui_deleteCheckedLogs(e) {
+ // if there is popup open close it
+ this.closePopup();
+
+ // uncheck SelectAll checkbox
+ this.selectCheckbox($('#selectAllDetails'), false);
+
+ // iterate through all entries
+ $('#forCallerList li.call').each(function () {
+ // if entry contains selected checkbox
+ if ($(this).find('form label').hasClass('ui-checkbox-on')) {
+ // remove that entry
+ app.deleteLog($(this).data('entries')[0]);
+ // and remove connected html element
+ $(this).remove();
+ }
+ });
+
+ // if there are still some entries
+ if ($('#forCallerList li.call').length > 0) {
+ // update header info
+ this.updateCallerHeaderNumberOfEntries(
+ $('#forCallerList li.call').length
+ );
+ } else {
+ // if no entries change page
+ e.preventDefault();
+ $('.ui-listview-filter .ui-input-text').val('');
+ $('.ui-listview-filter .ui-input-text').trigger('change');
+ $.mobile.changePage('#callView');
+ }
+
+ this.changeDetailsToRemoveState(true);
+ this.scrollToBottom();
+ },
+
+ /**
+ * TODO Dont really know what that method exacly doing
+ * and what should do
+ * TODO need refactor
+ */
+ changeDetailsToRemoveState: function Ui_changeDetailsToRemoveState(
+ set,
+ clear
+ ) {
+ var counter = this.getCountSelectedLogEntries(),
+ numChecked = $('#forCallerList input:checked').length,
+ matrix,
+ pos;
+ if (clear === true) {
+ counter = 0;
+ // uncheck all checkboxes
+ $('#forCallerList').find(':checkbox').attr('checked', false)
+ .data('checkboxradio').refresh();
+ $('.selectAllBox').find(':checkbox').attr('checked', false)
+ .data('checkboxradio').refresh();
+ }
+ // TODO it is hard ot understand this
+ if (set !== undefined) {
+ this.removeMode = false;
+ } else if (counter === 0) {
+ this.removeMode = !this.removeMode;
+ }
+
+ // if app is in remove mode and there are no selected checkboxes
+ if (this.removeMode && numChecked === 0) {
+ // disable delete button
+ $('#deleteActionBtn')
+ .addClass('ui-disabled')
+ .attr('tabIndex', '-1')
+ .blur();
+ // if app is not in removeMode
+ } else if (!this.removeMode) {
+ // set delete button to enabled
+ $('#deleteActionBtn')
+ .removeClass('ui-disabled')
+ .attr('tabIndex', '0');
+ this.selectAllDetailsEach();
+ }
+
+ // if there are no selected entries
+ if (counter === 0) {
+ // again checking removeMode
+ if (this.removeMode) {
+ // show buttons from remove mode
+ $('#historyForCallerView .toRemove').removeClass('hidden');
+ $('#historyForCallerView .selectAllBox')
+ .removeClass('hidden');
+ } else {
+ $('#historyForCallerView .toRemove').addClass('hidden');
+ $('#historyForCallerView .selectAllBox').addClass('hidden');
+ }
+ } else {
+ // TODO I dont understand
+ this.showPopup(
+ counter > 1 ?
+ 'Are you sure you want to delete selected logs?' :
+ 'Are you sure you want to delete selected log?'
+ );
+ }
+
+ // TODO need refactorin
+ // HACK probably scrollview hack
+ matrix =
+ $('#historyForCallerView .ui-scrollview-view')
+ .css('transform');
+ pos = matrix.substr(7, matrix.length - 8).split(',')[5];
+ if (pos !== undefined) {
+ $('#callerListContainer')
+ .scrollview('scrollTo', 100, parseInt(pos, 10), 10);
+ } else {
+ this.refreshScrollView();
+ }
+ },
+
+ /**
+ * Renders call history list
+ *
+ * @param {CallHistoryEntry[]} callEntries
+ */
+ showCallHistory: function Ui_showCallHistory(callEntries) {
+ var self = this,
+ pdate = null, // previous date
+ date = '',
+ elements = [], // list elements
+ len = callEntries.length, // entries length
+ tempLength = 0, // length of temporary table;
+ i, // loop counter
+ j, // loop counter
+ current, // current entry object
+ today = this.helpers.getShortDate(new Date()),
+ entryShortDate,
+ filterResult,
+ groupsOfDays = [],
+ dayLog,
+ index = 0,
+ calllogList = $('#calllogList'),
+ calllogListContent = $('#calllogListContent'),
+ calllogListContentPos;
+
+ // return duplicated entries
+ function filterForSameEntry(element) {
+ return self.getNumber(current) === self.getNumber(element)
+ && current.direction === element.direction;
+ }
+
+ $('.selectedCount').hide();
+
+ for (i = 0; i < len; i = i + 1) {
+ current = callEntries[i];
+ date = this.helpers.toNativeDate(current.startTime);
+
+ // if date is changed create new deyLog;
+ if (date !== pdate) {
+ dayLog = {};
+ dayLog.date = date;
+ dayLog.entries = [];
+ dayLog.counters = [];
+ groupsOfDays.push(dayLog);
+ pdate = date;
+ }
+
+ // group entries by remote Party;
+ filterResult = dayLog.entries.filter(filterForSameEntry);
+ if (filterResult.length) {
+ index = dayLog.entries.indexOf(filterResult[0]);
+ dayLog.counters[index] += 1;
+ } else {
+ dayLog.entries.push(current);
+ dayLog.counters[dayLog.entries.length - 1] = 1;
+ }
+ }
+ // Create UL list with dividers;
+ len = groupsOfDays.length;
+ for (i = 0; i < len; i += 1) {
+ dayLog = groupsOfDays[i];
+ tempLength = dayLog.entries.length;
+ entryShortDate = this.helpers.getShortDate(
+ dayLog.entries[0].startTime
+ );
+ for (j = 0; j < tempLength; j = j + 1) {
+ elements.push(
+ this.getCallItemRow(
+ dayLog.entries[j],
+ dayLog.counters[j]
+ )
+ );
+ }
+ }
+ calllogListContentPos = this.helpers.getScrollPosition(
+ calllogListContent
+ );
+ calllogList.empty().append(elements);
+
+ //workaround solution for searching phrase remain
+ // TODO FIXME
+ if ($("[data-type='search']").val().length !== "") {
+ calllogList.listview('refresh');
+ $("[data-type='search']").trigger("keyup");
+ $(".ui-li-divider")
+ .removeClass("ui-li ui-li-divider ui-bar-s")
+ .addClass("date");
+ } else {
+ calllogList.listview({
+ autodividers: true,
+ //filter: true,
+ autodividersSelector: function (li) {
+ return $(li).find('.callDate').text() ===
+ app.ui.helpers.toNativeDate(new Date()) ?
+ "Today" : $(li).find('.callDate').text();
+ }
+ }).listview('refresh');
+ $(".ui-li-divider").removeClass().addClass("date");
+ }
+
+ setTimeout(
+ this.helpers.scrollTo.bind(
+ this,
+ calllogListContent,
+ calllogListContentPos
+ ),
+ 10
+ );
+ },
+
+ /**
+ * @param: {CallHistoryEntry} entry
+ */
+ getNumber: function (entry) {
+ return entry.remoteParties[0].remoteParty;
+ },
+
+ /**
+ * Returns HTML for single log entry
+ *
+ * @param {CallHistoryEntry} entry
+ * @param {number} counter
+ * @returns {HTMLPartial}
+ */
+ getCallItemRow: function Ui_getCallItemRow(entry, counter) {
+ var party = entry.remoteParties[0],
+ name = this.getNameByNumber(party.remoteParty),
+ tpl;
+
+ if (counter > 1) {
+ name += ' (' + counter + ')';
+ }
+
+ // prepare html string
+ tpl = this.templateManager.get('callItemRow', {
+ 'name': name,
+ 'callTime': this.helpers.toNativeTime(entry.startTime),
+ 'callDate': this.helpers.toNativeDate(entry.startTime),
+ 'cssClasses': this.cssClassesForEntry(entry),
+ 'uid': entry.uid
+ });
+
+ // return clean DOM element so that array of those could be appended
+ // at once
+ return $(tpl)
+ .data('remoteParty', entry.remoteParties[0].remoteParty)
+ .data('entries', [entry])
+ .get(0);
+ },
+
+ /**
+ * Return readable number identifier
+ *
+ * @param {string} number
+ * @returns {string}
+ */
+ getNameByNumber: function (number) {
+ var i, j, contact, name;
+ // iterate through loaded contacts
+ for (i in this.contactsLoaded) {
+ if (this.contactsLoaded.hasOwnProperty(i)) {
+ contact = this.contactsLoaded[i];
+ // iterate through numbers of contact
+ for (j in contact.phoneNumbers) {
+ if (contact.phoneNumbers.hasOwnProperty(j)) {
+ // check if first 9 characters match number
+ if (contact.phoneNumbers[j].number.substr(-9)
+ === number.substr(-9)) {
+ // get display name
+ name = contact.name.displayName;
+ break;
+ }
+ }
+ }
+ }
+ }
+ return name || number || 'Unknown';
+ },
+
+ /**
+ * Returns HTML for single caller log entry
+ *
+ * @param {CallHistoryEntry} entry
+ * @returns {HTMLElement}
+ */
+ getCallerCallLogRow: function Ui_getCallerCallLogRow(entry) {
+ return $(this.templateManager.get('callerCallItemRow', {
+ 'cssClass': this.cssClassesForEntry(entry),
+ 'callTime': this.helpers.toNativeTime(entry.startTime),
+ 'callDuration': this.helpers.secondsToHours(entry.duration),
+ 'uid': entry.uid
+ })).data('entries', [entry]).get(0);
+ },
+
+ /**
+ * Renders call log list for specified caller
+ * TODO that methods is too long!
+ *
+ * @param {string} remoteParty
+ * @param {CallHistoryEntry[]} entries
+ */
+ showHistoryForCaller: function Ui_showHistoryForCaller(
+ remoteParty,
+ entries
+ ) {
+ var pdate = '', // previous data
+ date = '',
+ elements = [],
+ len = entries.length, // number of entries
+ i,
+ checkbox;
+
+ if (len) {
+ this.updateCallerHeader(entries[0], entries.length);
+ } else {
+ // if last call log has been removed
+ this.removedLastLog();
+ this.app.lastViewedCaller = 0;
+ }
+
+ // clean the list
+ $('#forCallerList')
+ .data('remoteParty', remoteParty)
+ .data('modified', false)
+ .empty();
+
+ // group caller log entries by date
+ for (i = 0; i < len; i = i + 1) {
+ date = this.helpers.toNativeDate(entries[i].startTime);
+
+ // if date is changed render new header
+ if (date !== pdate) {
+ elements.push(
+ $(this.templateManager.get(
+ 'dateRow',
+ {'date': date}
+ )).get(0)
+ );
+ pdate = date;
+ }
+ elements.push(this.getCallerCallLogRow(entries[i]));
+ }
+
+ $('#forCallerList')
+ .empty()
+ .append(elements);
+
+ // set state of delete button
+ if (elements.length > 0) {
+ $('li#delete > a').addClass('ui-btn-active');
+ } else {
+ $('li#delete > a').removeClass('ui-btn-active');
+ }
+
+ $('#forCallerList').trigger('create');
+
+ // change to remove mode if it was active before registering call
+ if (this.removeMode) {
+ this.removeMode = !this.removeMode;
+ this.changeDetailsToRemoveState();
+ // check previous checked entries
+ this.checkedLogs.forEach(function (logUid) {
+ checkbox =
+ $('#forCallerList li.call[data-uid="' + logUid + '"]')
+ .find(':checkbox');
+ if (checkbox.length > 0) {
+ checkbox.attr('checked', true)
+ .data('checkboxradio')
+ .refresh();
+ $('#deleteActionBtn')
+ .removeClass('ui-disabled')
+ .attr('tabIndex', '0');
+ }
+ });
+
+ this.setSelectAllDetails();
+
+ // close popup if there are no checked checkboxes
+ if (!$("#forCallerList input:checked").length) {
+ if ($.mobile.popup.active) {
+ $.mobile.popup.active.close();
+ }
+ }
+ }
+ this.addEventsForCallerListCheckboxes();
+ // lock buttons if unknown caller
+ if (remoteParty) {
+ this.unlockButtons();
+ } else {
+ this.lockButtons(
+ '#callActionBtn, #smsActionBtn, #deleteActionBtn'
+ );
+ }
+ },
+
+ /**
+ * Update accoundId
+ * @param {string} accountId
+ */
+ updateCallerHeaderAccountId: function Ui_updateCallerHeaderAccountId(
+ accountId
+ ) {
+ $('.infoContainer .accountId').html(accountId);
+ },
+
+ /**
+ * Update number of entries
+ * @param numberOfEntries
+ */
+ updateCallerHeaderNumberOfEntries:
+ function Ui_updateCallerHeaderNumberOfEntries(numberOfEntries) {
+ $('.infoContainer .numberOfEntries').html(
+ numberOfEntries +
+ ' ' +
+ (numberOfEntries === 1 ? 'call' : 'calls')
+ );
+ },
+
+ /**
+ * Updates caller main info
+ * @param {CallHistoryEntry} entry
+ * @param {number} numberOfEntries
+ */
+ updateCallerHeader: function Ui_updateCallerHeader(
+ entry,
+ numberOfEntries
+ ) {
+ // TODO need to refactor
+ // looks complicated
+ var name = '', party, imgPath, personId;
+
+ $('#header .photo').css('background-image', this.photoURIdefault);
+
+ if (entry.remoteParties !== null) {
+ party = entry.remoteParties[0];
+ personId = parseInt(party.personId, 10);
+ name = this.getNameByNumber(party.remoteParty);
+ if (party.displayName) {
+ this.updateCallerHeaderAccountId(party.remoteParty);
+ }
+ this.updateCallerHeaderNumberOfEntries(numberOfEntries);
+ if (personId !== 0) {
+ imgPath = app.getPhotoURIForContact(personId);
+ if (imgPath !== false) {
+ $('#header .photo')
+ .css('background-image', 'url(' + imgPath + ')');
+ }
+ }
+ } else if (entry.contactId !== null) {
+ name = entry.accountId;
+ this.updateCallerHeaderAccountId(entry.accountId);
+ this.updateCallerHeaderNumberOfEntries(numberOfEntries);
+ } else {
+ name = entry.accountId;
+ this.updateCallerHeaderAccountId('');
+ this.updateCallerHeaderNumberOfEntries(numberOfEntries);
+ }
+ $('.contact > .infoContainer > .name').html(
+ this.templateManager.modifiers.escape(name)
+ );
+ },
+
+ // TODO FIXME why that method is in the UI ?
+ loadContacts: function Model_loadContacts(callback) {
+ var contactsFoundCB, errorCB;
+
+ this.contactsLoaded = null;
+
+ contactsFoundCB = function (contacts) {
+ this.contactsLoaded = contacts;
+ if (callback instanceof Function) {
+ callback();
+ }
+ };
+
+ errorCB = function (error) {
+ console.error(
+ 'Model_loadContacts, problem with find() method: ' +
+ error.message
+ );
+ };
+
+ this.addressBook.find(contactsFoundCB.bind(this), errorCB);
+ },
+
+ /**
+ * Remove search filter from content and appends it to header
+ */
+ // TODO FIXME HACK it is one big hack for web-ui-fw
+ // title need to be changed
+ removeSearchBarToHeader: function () {
+ $('#page-header').append($('#callView .ui-listview-filter'));
+ $.mobile.activePage.page('refresh');
+ $('.ui-input-cancel').remove(); // patch for WebUI bug
+ $('#calllogListContent').trigger('resize'); // WebUi scrollview fix
+ },
+
+ /**
+ * Scroll to bottom
+ */
+ scrollToBottom: function () {
+ var scrollView = $(".ui-scrollview-view");
+ scrollView.css("-webkit-transform", "translate3d(0px, -" +
+ scrollView.height() + "px, 0px)");
+ },
+
+ /**
+ * Binding visibility state change event
+ */
+ onVisibilityChange: function () {
+ var self = this;
+ document.addEventListener('webkitvisibilitychange', function () {
+ if (document.webkitVisibilityState === 'hidden') {
+ self.updateCheckboxes();
+ } else {
+ self.loadContacts(app.updateCallLists.bind(app));
+ $('#callActionBtn, #smsActionBtn')
+ .removeClass('ui-disabled');
+ }
+ });
+ },
+
+ /**
+ * Store uid of checked entries in checkedLogs Array
+ */
+ updateCheckboxes: function Ui_updateCheckboxes() {
+ // empty checkedLogs logs array
+ var checkedLogs = this.checkedLogs = [];
+ // iterate through the entries
+ $('#forCallerList li.call').each(function () {
+ // if entry cotains checked checkbox
+ if ($(this).find('form label').hasClass('ui-checkbox-on')) {
+ var checkedEntry = $(this).data('entries')[0];
+ // push the entry uid to checkedLogs array
+ checkedLogs.push(checkedEntry.uid);
+ }
+ });
+ },
+
+ /**
+ * Disabling element
+ * @param {jQuery} element
+ */
+ lockButtons: function Ui_lockButtons(buttons) {
+ $(buttons).addClass('ui-disabled').attr('tabIndex', '-1').blur();
+ },
+
+ /**
+ * Enabling element
+ * @param {jQuery} element
+ */
+ unlockButtons: function Ui_unlockButtons() {
+ $('#callActionBtn, #smsActionBtn, #deleteActionBtn')
+ .removeClass('ui-disabled')
+ .attr('tabIndex', '0');
+ },
+
+ /**
+ * HACK TODO FIXME;
+ * Patch for UI, bad refresh scrollView
+ */
+ refreshScrollView: function () {
+ var scrollView = $('.ui-scrollview-view'),
+ show = function () {
+ scrollView.show();
+ };
+ scrollView.hide();
+ setTimeout(show, 0);
+ },
+
+ /**
+ * Handle event when last log is removed
+ */
+ removedLastLog: function () {
+ this.hideCheckboxes();
+ $(".ui-popup").popup('close');
+ $.mobile.changePage('#callView');
+ }
+ };
}());