1
0
mirror of https://github.com/owncloudarchive/contacts.git synced 2024-11-29 11:24:11 +01:00
OwncloudContactsOfficial/js/app.js

1567 lines
48 KiB
JavaScript
Raw Normal View History

Modernizr.load({
2013-01-02 02:22:16 +01:00
test: Modernizr.input.placeholder,
nope: [
OC.filePath('contacts', 'css', 'placeholder_polyfill.min.css'),
OC.filePath('contacts', 'js', 'placeholder_polyfill.jquery.min.combo.js')
]
});
(function($) {
$.QueryString = (function(a) {
if (a == "") return {};
var b = {};
for (var i = 0; i < a.length; ++i)
{
var p=a[i].split('=');
if (p.length != 2) continue;
b[p[0]] = decodeURIComponent(p[1].replace(/\+/g, " "));
}
return b;
})(window.location.search.substr(1).split('&'))
})(jQuery);
var utils = {};
/**
* utils.isArray
*
* Best guess if object is an array.
*/
utils.isArray = function(obj) {
// do an instanceof check first
if (obj instanceof Array) {
return true;
}
// then check for obvious falses
if (typeof obj !== 'object') {
return false;
}
if (utils.type(obj) === 'array') {
return true;
}
return false;
2012-11-15 00:28:43 +01:00
};
utils.isInt = function(s) {
return typeof s === 'number' && (s.toString().search(/^-?[0-9]+$/) === 0);
};
2012-11-15 00:28:43 +01:00
utils.isUInt = function(s) {
return typeof s === 'number' && (s.toString().search(/^[0-9]+$/) === 0);
};
/**
* utils.type
*
* Attempt to ascertain actual object type.
*/
utils.type = function(obj) {
if (obj === null || typeof obj === 'undefined') {
return String (obj);
}
return Object.prototype.toString.call(obj)
.replace(/\[object ([a-zA-Z]+)\]/, '$1').toLowerCase();
};
utils.moveCursorToEnd = function(el) {
if (typeof el.selectionStart === 'number') {
el.selectionStart = el.selectionEnd = el.value.length;
} else if (typeof el.createTextRange !== 'undefined') {
el.focus();
var range = el.createTextRange();
range.collapse(false);
range.select();
}
};
Array.prototype.clone = function() {
return this.slice(0);
};
Array.prototype.clean = function(deleteValue) {
var arr = this.clone();
for (var i = 0; i < arr.length; i++) {
if (arr[i] == deleteValue) {
arr.splice(i, 1);
i--;
}
}
return arr;
};
2012-10-05 05:05:49 +02:00
// Keep it DRY ;)
var wrongKey = function(event) {
2012-12-17 21:03:10 +01:00
return ((event.type === 'keydown' || event.type === 'keypress')
&& (event.keyCode !== 32 && event.keyCode !== 13));
};
2012-10-05 05:05:49 +02:00
/**
* Simply notifier
* Arguments:
2013-09-03 14:04:18 +02:00
* @param string message - The text message to show.
* @param int timeout - The timeout in seconds before the notification disappears. Default 10.
* @param function timeouthandler - A function to run on timeout.
* @param function clickhandler - A function to run on click. If a timeouthandler is given it will be cancelled on click.
* @param object data - An object that will be passed as argument to the timeouthandler and clickhandler functions.
* @param bool cancel - If set cancel all ongoing timer events and hide the notification.
2012-10-05 05:05:49 +02:00
*/
OC.notify = function(params) {
var self = this;
if(!self.notifier) {
self.notifier = $('#notification');
2013-09-03 14:04:18 +02:00
self.notifier.on('click', function() { $(this).fadeOut();});
2012-10-05 05:05:49 +02:00
}
if(params.cancel) {
self.notifier.off('click');
for(var id in self.notifier.data()) {
if($.isNumeric(id)) {
clearTimeout(parseInt(id));
}
}
self.notifier.text('').fadeOut().removeData();
}
2013-09-03 14:04:18 +02:00
if(params.message) {
self.notifier.text(params.message).fadeIn().css('display', 'inline');
}
2012-10-05 05:05:49 +02:00
var timer = setTimeout(function() {
self.notifier.fadeOut();
if(params.timeouthandler && $.isFunction(params.timeouthandler)) {
params.timeouthandler(self.notifier.data(dataid));
self.notifier.off('click');
self.notifier.removeData(dataid);
}
}, params.timeout && $.isNumeric(params.timeout) ? parseInt(params.timeout)*1000 : 10000);
var dataid = timer.toString();
if(params.data) {
self.notifier.data(dataid, params.data);
}
if(params.clickhandler && $.isFunction(params.clickhandler)) {
self.notifier.on('click', function() {
clearTimeout(timer);
self.notifier.off('click');
params.clickhandler(self.notifier.data(dataid));
self.notifier.removeData(dataid);
});
}
};
2012-10-05 05:05:49 +02:00
OC.Contacts = OC.Contacts || {
init:function() {
if(oc_debug === true) {
$.error = console.error;
}
var self = this;
this.scrollTimeoutMiliSecs = 100;
this.isScrolling = false;
this.cacheElements();
this.storage = new OC.Contacts.Storage();
this.addressBooks = new OC.Contacts.AddressBookList(
this.storage,
$('#app-settings-content'),
2013-05-24 17:43:01 +02:00
$('#addressBookTemplate')
);
2012-12-13 02:30:20 +01:00
this.contacts = new OC.Contacts.ContactList(
this.storage,
this.addressBooks,
2012-10-22 15:35:33 +02:00
this.$contactList,
this.$contactListItemTemplate,
2013-03-12 00:28:41 +01:00
this.$contactDragItemTemplate,
this.$contactFullTemplate,
this.detailTemplates
);
this.groups = new OC.Contacts.GroupList(
this.storage,
this.$groupList,
this.$groupListItemTemplate
);
self.groups.loadGroups(function() {
2013-05-11 01:41:24 +02:00
self.loading(self.$navigation, false);
});
2013-06-01 00:42:46 +02:00
// Hide the list while populating it.
this.$contactList.hide();
$.when(this.addressBooks.loadAddressBooks()).then(function(addressBooks) {
var num = addressBooks.length;
var deferreds = $(addressBooks).map(function(i, elem) {
return self.contacts.loadContacts(this.getBackend(), this.getId());
});
// This little beauty is from http://stackoverflow.com/a/6162959/373007 ;)
$.when.apply(null, deferreds.get()).then(function(response) {
2013-05-22 21:44:39 +02:00
self.contacts.setSortOrder(contacts_sortby);
2013-06-01 00:42:46 +02:00
self.$contactList.show();
$(document).trigger('status.contacts.loaded', {
numcontacts: self.contacts.length
});
self.loading(self.$rightContent, false);
// TODO: Move this to event handler
self.groups.selectGroup({id:contacts_lastgroup});
var id = $.QueryString['id']; // Keep for backwards compatible links.
2013-05-09 21:18:32 +02:00
if(!id) {
id = window.location.hash.substr(1);
}
2013-05-09 21:18:32 +02:00
console.log('Groups loaded, id from url:', id);
if(id) {
self.openContact(id);
}
if(!contacts_properties_indexed) {
// Wait a couple of mins then check if contacts are indexed.
setTimeout(function() {
$.when($.post(OC.Router.generate('contacts_index_properties')))
.then(function(response) {
if(!response.isIndexed) {
OC.notify({message:t('contacts', 'Indexing contacts'), timeout:20});
}
});
}, 10000);
} else {
console.log('contacts are indexed.');
}
}).fail(function(response) {
console.warn(response);
2013-05-18 05:45:48 +02:00
self.$rightContent.removeClass('loading');
message = t('contacts', 'Unrecoverable error loading address books: {msg}', {msg:response.message});
OC.dialogs.alert(message, t('contacts', 'Error.'));
});
}).fail(function(response) {
console.log(response.message);
$(document).trigger('status.contacts.error', response);
});
2012-12-13 02:30:20 +01:00
OCCategories.changed = this.groups.categoriesChanged;
OCCategories.app = 'contacts';
OCCategories.type = 'contact';
this.bindEvents();
2012-10-05 05:05:49 +02:00
this.$toggleAll.show();
2013-04-30 20:00:33 +02:00
this.hideActions();
},
loading:function(obj, state) {
$(obj).toggleClass('loading', state);
},
2012-10-05 05:05:49 +02:00
/**
* Show/hide elements in the header
* @param act An array of actions to show based on class name e.g ['add', 'delete']
*/
2012-11-13 17:01:14 +01:00
hideActions:function() {
this.showActions(false);
},
2012-10-05 05:05:49 +02:00
showActions:function(act) {
2012-12-13 02:38:58 +01:00
console.log('showActions', act);
//console.trace();
2012-10-05 05:05:49 +02:00
this.$headeractions.children().hide();
2012-11-13 17:01:14 +01:00
if(act && act.length > 0) {
2013-04-30 20:00:33 +02:00
this.$contactList.addClass('multiselect');
2013-05-31 21:32:16 +02:00
this.$contactListHeader.find('.actions').show();
this.$contactListHeader.find('.info').hide();
2012-11-13 17:01:14 +01:00
this.$headeractions.children('.'+act.join(',.')).show();
2013-04-30 20:00:33 +02:00
} else {
2013-05-31 21:32:16 +02:00
this.$contactListHeader.find('.actions').hide();
this.$contactListHeader.find('.info').show();
2013-04-30 20:00:33 +02:00
this.$contactList.removeClass('multiselect');
2012-11-13 17:01:14 +01:00
}
2012-10-05 05:05:49 +02:00
},
showAction:function(act, show) {
this.$headeractions.find('.' + act).toggle(show);
2012-10-05 05:05:49 +02:00
},
cacheElements: function() {
var self = this;
this.detailTemplates = {};
// Load templates for contact details.
// The weird double loading is because jquery apparently doesn't
// create a searchable object from a script element.
$.each($($('#contactDetailsTemplate').html()), function(idx, node) {
2012-12-20 22:58:04 +01:00
var $node = $(node);
if($node.is('div')) {
var $tmpl = $(node.innerHTML);
2012-12-20 22:58:04 +01:00
self.detailTemplates[$tmpl.data('element')] = $node;
}
});
this.$groupListItemTemplate = $('#groupListItemTemplate');
this.$contactListItemTemplate = $('#contactListItemTemplate');
2013-03-12 00:28:41 +01:00
this.$contactDragItemTemplate = $('#contactDragItemTemplate');
this.$contactFullTemplate = $('#contactFullTemplate');
this.$contactDetailsTemplate = $('#contactDetailsTemplate');
2013-04-30 20:00:33 +02:00
this.$rightContent = $('#app-content');
this.$navigation = $('#app-navigation');
//this.$header = $('#contactsheader');
this.$groupList = $('#grouplist');
this.$contactList = $('#contactlist');
2013-04-30 20:00:33 +02:00
this.$contactListHeader = $('#contactsHeader');
2013-05-22 21:44:39 +02:00
this.$sortOrder = this.$contactListHeader.find('.action.sort');
this.$sortOrder.val(contacts_sortby||'fn');
2013-04-30 20:00:33 +02:00
this.$headeractions = this.$contactListHeader.find('.actions');
this.$toggleAll = this.$contactListHeader.find('.toggle');
2012-10-05 05:05:49 +02:00
this.$groups = this.$headeractions.find('.groups');
this.$ninjahelp = $('#ninjahelp');
2012-11-15 02:40:47 +01:00
this.$firstRun = $('#firstrun');
2013-04-30 20:00:33 +02:00
this.$settings = $('#app-settings');
2012-10-05 05:05:49 +02:00
},
// Build the select to add/remove from groups.
buildGroupSelect: function() {
// If a contact is open we know which categories it's in
2012-10-05 05:05:49 +02:00
if(this.currentid) {
2013-02-03 15:40:14 +01:00
var contact = this.contacts.findById(this.currentid);
if(contact === null) {
return false;
}
2012-10-05 05:05:49 +02:00
this.$groups.find('optgroup,option:not([value="-1"])').remove();
var addopts = '', rmopts = '';
2012-12-13 02:30:20 +01:00
$.each(this.groups.categories, function(i, category) {
2012-10-05 05:05:49 +02:00
if(contact.inGroup(category.name)) {
rmopts += '<option value="' + category.id + '">' + category.name + '</option>';
} else {
addopts += '<option value="' + category.id + '">' + category.name + '</option>';
}
});
if(addopts.length) {
$(addopts).appendTo(this.$groups)
.wrapAll('<optgroup data-action="add" label="' + t('contacts', 'Add to...') + '"/>');
}
if(rmopts.length) {
$(rmopts).appendTo(this.$groups)
.wrapAll('<optgroup data-action="remove" label="' + t('contacts', 'Remove from...') + '"/>');
}
2012-12-13 02:30:20 +01:00
} else if(this.contacts.getSelectedContacts().length > 0) { // Otherwise add all categories to both add and remove
2012-10-05 05:05:49 +02:00
this.$groups.find('optgroup,option:not([value="-1"])').remove();
var addopts = '', rmopts = '';
2012-12-13 02:30:20 +01:00
$.each(this.groups.categories, function(i, category) {
2012-10-05 05:05:49 +02:00
rmopts += '<option value="' + category.id + '">' + category.name + '</option>';
addopts += '<option value="' + category.id + '">' + category.name + '</option>';
});
$(addopts).appendTo(this.$groups)
.wrapAll('<optgroup data-action="add" label="' + t('contacts', 'Add to...') + '"/>');
$(rmopts).appendTo(this.$groups)
.wrapAll('<optgroup data-action="remove" label="' + t('contacts', 'Remove from...') + '"/>');
2012-11-05 12:39:49 +01:00
} else {
// 3rd option: No contact open, none checked, just show "Add group..."
this.$groups.find('optgroup,option:not([value="-1"])').remove();
2012-10-05 05:05:49 +02:00
}
$('<option value="add">' + t('contacts', 'Add group...') + '</option>').appendTo(this.$groups);
this.$groups.val(-1);
},
bindEvents: function() {
var self = this;
2012-10-22 15:35:33 +02:00
// Should fix Opera check for delayed delete.
$(window).unload(function (){
$(window).trigger('beforeunload');
});
this.hashChange = function() {
2013-05-09 21:18:32 +02:00
console.log('hashchange', window.location.hash)
2013-05-09 05:53:46 +02:00
var id = String(window.location.hash.substr(1));
2013-05-09 21:18:32 +02:00
if(id && id != self.currentid && self.contacts.findById(id) !== null) {
self.openContact(id);
2013-02-23 22:51:28 +01:00
} else if(!id && self.currentid) {
self.closeContact(self.currentid);
}
}
// This apparently get's called on some weird occasions.
$(window).bind('popstate', this.hashChange);
$(window).bind('hashchange', this.hashChange);
2012-10-05 05:05:49 +02:00
// App specific events
$(document).bind('status.contact.deleted', function(e, data) {
2013-05-09 21:18:32 +02:00
var id = String(data.id);
if(id == self.currentid) {
delete self.currentid;
}
console.log('contact', data.id, 'deleted');
2012-10-05 05:05:49 +02:00
// update counts on group lists
self.groups.removeFromAll(data.id, true);
2012-10-05 05:05:49 +02:00
});
2012-11-13 22:42:55 +01:00
$(document).bind('status.contact.added', function(e, data) {
2013-05-09 21:18:32 +02:00
self.currentid = String(data.id);
self.buildGroupSelect();
self.hideActions();
2012-11-13 22:42:55 +01:00
});
// Keep error messaging at one place to be able to replace it.
$(document).bind('status.contacts.error', function(e, data) {
2013-04-03 16:54:25 +02:00
console.warn(data.message);
//console.trace();
2012-10-05 05:05:49 +02:00
OC.notify({message:data.message});
});
2012-11-13 22:42:55 +01:00
$(document).bind('status.contact.enabled', function(e, enabled) {
console.log('status.contact.enabled', enabled);
/*if(enabled) {
2012-12-10 00:02:06 +01:00
self.showActions(['back', 'download', 'delete', 'groups']);
} else {
2012-10-05 05:05:49 +02:00
self.showActions(['back']);
}*/
});
2012-11-13 22:42:55 +01:00
2013-05-24 03:33:20 +02:00
$(document).bind('status.contacts.count', function(e, response) {
console.log('Num contacts:', response.count);
if(response.count > 0) {
self.$contactList.show();
self.$firstRun.hide();
}
});
$(document).bind('status.contacts.loaded status.contacts.deleted', function(e, response) {
console.log('status.contacts.loaded', response);
if(response.error) {
$(document).trigger('status.contacts.error', response);
console.log('Error loading contacts!');
2013-05-24 03:33:20 +02:00
} else {
if(response.numcontacts === 0) {
self.$contactListHeader.hide();
2013-05-24 03:33:20 +02:00
self.$contactList.hide();
self.$firstRun.show();
} else {
self.$contactListHeader.show();
2013-05-24 03:33:20 +02:00
self.$contactList.show();
self.$firstRun.hide();
}
}
2012-10-05 05:05:49 +02:00
});
2012-11-13 22:42:55 +01:00
2012-10-05 05:05:49 +02:00
$(document).bind('status.contact.currentlistitem', function(e, result) {
//console.log('status.contact.currentlistitem', result, self.$rightContent.height());
if(self.dontScroll !== true) {
if(result.pos > self.$rightContent.height()) {
self.$rightContent.scrollTop(result.pos - self.$rightContent.height() + result.height);
}
else if(result.pos < self.$rightContent.offset().top) {
self.$rightContent.scrollTop(result.pos);
}
} else {
setTimeout(function() {
self.dontScroll = false;
}, 100);
}
self.currentlistid = result.id;
2012-10-05 05:05:49 +02:00
});
2012-10-05 05:05:49 +02:00
$(document).bind('status.nomorecontacts', function(e, result) {
console.log('status.nomorecontacts', result);
2012-11-15 02:40:47 +01:00
self.$contactList.hide();
self.$firstRun.show();
2012-10-05 05:05:49 +02:00
});
2012-10-05 05:05:49 +02:00
$(document).bind('status.visiblecontacts', function(e, result) {
console.log('status.visiblecontacts', result);
// TODO: To be decided.
});
$(document).bind('request.openurl', function(e, data) {
switch(data.type) {
case 'url':
var regexp = /(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!-\/]))?/;
//if(new RegExp("[a-zA-Z0-9]+://([a-zA-Z0-9_]+:[a-zA-Z0-9_]+@)?([a-zA-Z0-9.-]+\\.[A-Za-z]{2,4})(:[0-9]+)?(/.*)?").test(data.url)) {
if(regexp.test(data.url)) {
var newWindow = window.open(data.url,'_blank');
newWindow.focus();
} else {
$(document).trigger('status.contacts.error', {
error: true,
message: t('contacts', 'Invalid URL: "{url}"', {url:data.url})
});
}
break;
case 'email':
var regexp = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
if(regexp.test(data.url)) {
console.log('success');
try {
window.location = 'mailto:' + data.url;
} catch(e) {
alert(t('contacts', 'There was an error opening a mail composer.'));
}
} else {
$(document).trigger('status.contacts.error', {
error: true,
message: t('contacts', 'Invalid email: "{url}"', {url:data.url})
});
}
break;
}
});
2012-10-05 05:05:49 +02:00
// A contact id was in the request
$(document).bind('request.loadcontact', function(e, result) {
console.log('request.loadcontact', result);
if(self.numcontacts) {
self.openContact(result.id);
} else {
// Contacts are not loaded yet, try again.
console.log('waiting for contacts to load');
setTimeout(function() {
$(document).trigger('request.loadcontact', {
id: result.id
2012-10-05 05:05:49 +02:00
});
}, 1000);
}
});
$(document).bind('request.contact.move', function(e, data) {
console.log('contact', data, 'request.contact.move');
var from = self.addressBooks.find(data.from);
var to = self.addressBooks.find(data.target);
self.addressBooks.moveContact(data.contact, data.from, data.target);
});
2012-12-10 00:02:06 +01:00
$(document).bind('request.contact.setasfavorite', function(e, data) {
console.log('contact', data.id, 'request.contact.setasfavorite');
2012-12-13 02:30:20 +01:00
self.groups.setAsFavorite(data.id, data.state);
2012-12-10 00:02:06 +01:00
});
$(document).bind('request.contact.addtogroup', function(e, data) {
self.groups.addTo(data.id, data.groupid, function(response) {
console.log('contact', data.id, 'request.contact.addtogroup', response);
});
});
$(document).bind('request.contact.removefromgroup', function(e, data) {
console.log('contact', data.id, 'request.contact.removefromgroup');
self.groups.removeFrom(data.id, data.groupid);
});
$(document).bind('request.contact.export', function(e, data) {
2013-05-24 20:35:23 +02:00
console.log('request.contact.export', data);
document.location.href = OC.Router.generate('contacts_contact_export', data);
});
2012-12-10 00:02:06 +01:00
$(document).bind('request.contact.close', function(e, data) {
2013-04-03 16:54:25 +02:00
var id = String(data.id);
2012-12-10 00:02:06 +01:00
console.log('contact', data.id, 'request.contact.close');
self.closeContact(id);
});
$(document).bind('request.contact.open', function(e, data) {
var id = String(data.id);
console.log('contact', data.id, 'request.contact.open');
self.openContact(id);
});
$(document).bind('request.contact.delete', function(e, data) {
2013-04-03 16:54:25 +02:00
var id = String(data.contactid);
console.log('contact', data, 'request.contact.delete');
self.closeContact(id);
self.contacts.delayedDelete(data);
self.$contactList.removeClass('dim');
2013-04-30 20:00:33 +02:00
self.hideActions();
});
2013-04-03 16:43:18 +02:00
$(document).bind('request.contact.merge', function(e, data) {
console.log('contact','request.contact.merge', data);
var merger = self.contacts.findById(data.merger);
var mergees = [];
if(!merger) {
$(document).trigger('status.contacts.error', {
2013-04-03 16:43:18 +02:00
message: t('contacts', 'Merge failed. Cannot find contact: {id}', {id:data.merger})
});
return;
}
$.each(data.mergees, function(idx, id) {
var contact = self.contacts.findById(id);
if(!contact) {
console.warn('cannot find', id, 'by id');
}
mergees.push(contact);
});
if(!merger.merge(mergees)) {
$(document).trigger('status.contacts.error', {
2013-04-03 16:43:18 +02:00
message: t('contacts', 'Merge failed.')
});
return;
}
merger.saveAll(function(response) {
if(response.error) {
$(document).trigger('status.contacts.error', {
2013-04-03 16:43:18 +02:00
message: t('contacts', 'Merge failed. Error saving contact.')
});
return;
} else {
if(data.deleteOther) {
self.contacts.delayedDelete(mergees);
}
self.openContact(merger.getId());
}
});
});
$(document).bind('request.select.contactphoto.fromlocal', function(e, metadata) {
console.log('request.select.contactphoto.fromlocal', metadata);
2013-04-08 22:35:28 +02:00
$('#contactphoto_fileupload').trigger('click', metadata);
});
$(document).bind('request.select.contactphoto.fromcloud', function(e, metadata) {
console.log('request.select.contactphoto.fromcloud', metadata);
OC.dialogs.filepicker(t('contacts', 'Select photo'), function(path) {
self.cloudPhotoSelected(metadata, path);
}, false, 'image', true);
});
$(document).bind('request.edit.contactphoto', function(e, metadata) {
console.log('request.edit.contactphoto', metadata);
self.editCurrentPhoto(metadata);
});
2012-10-05 05:05:49 +02:00
$(document).bind('request.addressbook.activate', function(e, result) {
console.log('request.addressbook.activate', result);
2012-12-13 02:30:20 +01:00
self.contacts.showFromAddressbook(result.id, result.activate);
});
2012-10-22 15:35:33 +02:00
$(document).bind('request.groups.reload', function(e, result) {
console.log('request.groups.reload', result);
self.groups.loadGroups(function() {
self.groups.triggerLastGroup();
});
});
$(document).bind('status.contact.removedfromgroup', function(e, result) {
console.log('status.contact.removedfromgroup', result);
if(self.currentgroup == result.groupid) {
2012-12-13 02:30:20 +01:00
self.contacts.hideContact(result.contactid);
self.closeContact(result.contactid);
}
});
$(document).bind('status.group.groupremoved', function(e, result) {
console.log('status.group.groupremoved', result);
if(parseInt(result.groupid) === parseInt(self.currentgroup)) {
2012-12-13 02:30:20 +01:00
self.contacts.showContacts([]);
self.currentgroup = 'all';
}
$.each(result.contacts, function(idx, contactid) {
2012-12-13 02:30:20 +01:00
var contact = self.contacts.findById(contactid);
2013-04-08 22:37:37 +02:00
contact.removeFromGroup(result.groupname);
});
2012-11-22 19:32:47 +01:00
});
2013-05-21 23:39:50 +02:00
$(document).bind('status.group.grouprenamed', function(e, result) {
console.log('status.group.grouprenamed', result);
$.each(result.contacts, function(idx, contactid) {
var contact = self.contacts.findById(contactid);
if(!contact) {
console.log('Couldn\'t find contact', contactid)
return true; // continue
}
contact.renameGroup(result.from, result.to);
});
});
$(document).bind('status.group.contactadded', function(e, result) {
console.log('status.group.contactadded', result);
var contact = self.contacts.findById(result.contactid);
if(!contact) {
2013-02-03 15:40:14 +01:00
return false;
}
contact.addToGroup(result.groupname);
});
2012-10-26 01:57:16 +02:00
// Group sorted, save the sort order
$(document).bind('status.groups.sorted', function(e, result) {
console.log('status.groups.sorted', result);
$.when(self.storage.setPreference('groupsort', result.sortorder)).then(function(response) {
if(response.error) {
$(document).trigger('status.contacts.error', {
message: response ? response.message : t('contacts', 'Network or server error. Please inform administrator.')
});
2012-10-26 01:57:16 +02:00
}
})
2013-05-24 02:57:12 +02:00
.fail(function(response) {
console.log(response.message);
$(document).trigger('status.contacts.error', response);
2013-05-24 02:57:12 +02:00
done = true;
2012-10-26 01:57:16 +02:00
});
});
// Group selected, only show contacts from that group
$(document).bind('status.group.selected', function(e, result) {
console.log('status.group.selected', result);
self.currentgroup = result.id;
// Close any open contact.
if(self.currentid) {
var id = self.currentid;
self.closeContact(id);
2012-12-07 15:08:25 +01:00
self.jumpToContact(id);
}
self.$contactList.show();
self.$toggleAll.show();
2013-04-30 20:00:33 +02:00
self.hideActions();
if(result.type === 'category' || result.type === 'fav') {
2012-12-13 02:30:20 +01:00
self.contacts.showContacts(result.contacts);
} else if(result.type === 'shared') {
2012-12-13 02:30:20 +01:00
self.contacts.showFromAddressbook(self.currentgroup, true, true);
2013-05-12 21:59:24 +02:00
} else if(result.type === 'uncategorized') {
self.contacts.showUncategorized();
} else {
2012-12-13 02:30:20 +01:00
self.contacts.showContacts(self.currentgroup);
}
$.when(self.storage.setPreference('lastgroup', self.currentgroup)).then(function(response) {
if(response.error) {
$(document).trigger('status.contacts.error', response);
}
})
2013-05-24 02:57:12 +02:00
.fail(function(response) {
console.log(response.message);
$(document).trigger('status.contacts.error', response);
2013-05-24 02:57:12 +02:00
done = true;
});
self.$rightContent.scrollTop(0);
});
// mark items whose title was hid under the top edge as read
/*this.$rightContent.scroll(function() {
// prevent too many scroll requests;
if(!self.isScrolling) {
self.isScrolling = true;
var num = self.$contactList.find('tr').length;
//console.log('num', num);
var offset = self.$contactList.find('tr:eq(' + (num-20) + ')').offset().top;
if(offset < self.$rightContent.height()) {
console.log('load more');
2012-12-13 02:30:20 +01:00
self.contacts.loadContacts(num, function() {
self.isScrolling = false;
});
} else {
setTimeout(function() {
self.isScrolling = false;
}, self.scrollTimeoutMiliSecs);
}
//console.log('scroll, unseen:', offset, self.$rightContent.height());
}
});*/
2013-04-08 22:35:28 +02:00
$('#contactphoto_fileupload').on('click', function(event, metadata) {
var form = $('#file_upload_form');
form.find('input[name="contactid"]').val(metadata.contactid);
form.find('input[name="addressbookid"]').val(metadata.addressbookid);
form.find('input[name="backend"]').val(metadata.backend);
2013-05-19 05:19:58 +02:00
}).on('change', function() {
console.log('#contactphoto_fileupload, change');
self.uploadPhoto(this.files);
2013-04-08 22:35:28 +02:00
});
2013-05-19 05:19:58 +02:00
var target = $('#file_upload_target');
target.load(function() {
var response = $.parseJSON(target.contents().text());
if(response && response.status == 'success') {
console.log('response', response);
self.editPhoto(
response.metadata,
response.data.tmp
);
//alert('File: ' + file.tmp + ' ' + file.name + ' ' + file.mime);
} else if(response) {
$(document).trigger('status.contacts.error', response);
2013-05-19 05:19:58 +02:00
}
2012-11-05 12:39:12 +01:00
});
2012-10-05 05:05:49 +02:00
this.$ninjahelp.find('.close').on('click keydown',function(event) {
if(wrongKey(event)) {
return;
}
self.$ninjahelp.hide();
});
2013-05-31 21:32:16 +02:00
this.$toggleAll.on('change', function(event) {
event.stopPropagation();
event.preventDefault();
2012-10-30 07:03:09 +01:00
var isChecked = $(this).is(':checked');
2012-11-15 02:41:52 +01:00
self.setAllChecked(isChecked);
2012-10-05 05:05:49 +02:00
if(self.$groups.find('option').length === 1) {
self.buildGroupSelect();
}
2012-11-13 17:01:14 +01:00
if(isChecked) {
2013-05-31 21:32:16 +02:00
self.showActions(['toggle', 'add', 'download', 'groups', 'delete', 'favorite', 'merge']);
2012-11-13 17:01:14 +01:00
} else {
2013-04-30 20:00:33 +02:00
self.hideActions();
2012-11-13 17:01:14 +01:00
}
2012-10-05 05:05:49 +02:00
});
2012-10-05 05:05:49 +02:00
this.$contactList.on('change', 'input:checkbox', function(event) {
2013-04-03 16:43:18 +02:00
var selected = self.contacts.getSelectedContacts();
console.log('selected', selected.length);
if(selected.length > 0 && self.$groups.find('option').length === 1) {
self.buildGroupSelect();
}
if(selected.length === 0) {
2013-04-30 20:00:33 +02:00
self.hideActions();
2013-04-03 16:43:18 +02:00
} else if(selected.length === 1) {
2013-05-31 21:32:16 +02:00
self.showActions(['toggle', 'add', 'download', 'groups', 'delete', 'favorite']);
2013-04-03 16:43:18 +02:00
} else {
2013-05-31 21:32:16 +02:00
self.showActions(['toggle', 'add', 'download', 'groups', 'delete', 'favorite', 'merge']);
2012-10-05 05:05:49 +02:00
}
});
2013-05-22 21:44:39 +02:00
this.$sortOrder.on('change', function() {
$(this).blur().addClass('loading');
contacts_sortby = $(this).val();
self.contacts.setSortOrder();
$(this).removeClass('loading');
self.storage.setPreference('sortby', contacts_sortby);
});
2012-12-13 02:38:58 +01:00
// Add to/remove from group multiple contacts.
2012-10-05 05:05:49 +02:00
this.$groups.on('change', function() {
var $opt = $(this).find('option:selected');
var action = $opt.parent().data('action');
var groupName, groupId, buildnow = false;
2012-10-22 15:35:33 +02:00
var contacts = self.contacts.getSelectedContacts();
var ids = $.map(contacts, function(c) {return c.getId();});
2012-11-14 15:27:38 +01:00
2012-11-15 02:41:52 +01:00
self.setAllChecked(false);
self.$toggleAll.prop('checked', false);
if(!self.currentid) {
2013-04-30 20:00:33 +02:00
self.hideActions();
}
2012-11-14 15:27:38 +01:00
if($opt.val() === 'add') { // Add new group
action = 'add';
2012-10-05 05:05:49 +02:00
console.log('add group...');
self.$groups.val(-1);
2012-11-14 15:27:38 +01:00
self.addGroup(function(response) {
if(!response.error) {
2012-11-14 15:27:38 +01:00
groupId = response.id;
groupName = response.name;
2012-12-13 02:30:20 +01:00
self.groups.addTo(ids, groupId, function(result) {
2013-05-03 00:23:56 +02:00
if(!result.error) {
2012-11-14 15:27:38 +01:00
$.each(ids, function(idx, id) {
// Delay each contact to not trigger too many ajax calls
// at a time.
setTimeout(function() {
2013-02-03 15:40:14 +01:00
var contact = self.contacts.findById(id);
if(contact === null) {
return true;
}
contact.addToGroup(groupName);
2012-11-14 15:27:38 +01:00
// I don't think this is used...
if(buildnow) {
self.buildGroupSelect();
}
2012-11-14 15:27:38 +01:00
$(document).trigger('status.contact.addedtogroup', {
contactid: id,
groupid: groupId,
groupname: groupName
2012-11-14 15:27:38 +01:00
});
}, 1000);
});
2012-11-14 15:27:38 +01:00
} else {
$(document).trigger('status.contacts.error', result);
2012-11-14 15:27:38 +01:00
}
});
2012-11-14 15:27:38 +01:00
} else {
$(document).trigger('status.contacts.error', response);
2012-11-14 15:27:38 +01:00
}
});
2012-10-05 05:05:49 +02:00
return;
}
2012-11-14 15:27:38 +01:00
groupName = $opt.text(), groupId = $opt.val();
2012-10-22 15:35:33 +02:00
2012-10-05 05:05:49 +02:00
if(action === 'add') {
2012-12-13 02:30:20 +01:00
self.groups.addTo(ids, $opt.val(), function(result) {
console.log('after add', result);
2013-05-03 00:23:56 +02:00
if(!result.error) {
$.each(result.ids, function(idx, id) {
// Delay each contact to not trigger too many ajax calls
// at a time.
setTimeout(function() {
2012-11-14 15:27:38 +01:00
console.log('adding', id, 'to', groupName);
2013-02-03 15:40:14 +01:00
var contact = self.contacts.findById(id);
if(contact === null) {
return true;
}
contact.addToGroup(groupName);
// I don't think this is used...
2012-11-05 12:39:49 +01:00
if(buildnow) {
self.buildGroupSelect();
}
$(document).trigger('status.contact.addedtogroup', {
contactid: id,
2012-11-14 15:27:38 +01:00
groupid: groupId,
groupname: groupName
});
}, 1000);
});
} else {
2012-11-14 15:27:38 +01:00
var msg = result.message ? result.message : t('contacts', 'Error adding to group.');
$(document).trigger('status.contacts.error', {message:msg});
}
2012-10-05 05:05:49 +02:00
});
if(!buildnow) {
self.$groups.val(-1).hide().find('optgroup,option:not([value="-1"])').remove();
}
} else if(action === 'remove') {
2012-12-13 02:30:20 +01:00
self.groups.removeFrom(ids, $opt.val(), function(result) {
console.log('after remove', result);
2013-05-03 00:23:56 +02:00
if(!result.error) {
var groupname = $opt.text(), groupid = $opt.val();
$.each(result.ids, function(idx, id) {
2013-02-03 15:40:14 +01:00
var contact = self.contacts.findById(id);
if(contact === null) {
return true;
}
contact.removeFromGroup(groupname);
2012-11-05 12:39:49 +01:00
if(buildnow) {
self.buildGroupSelect();
}
2012-10-05 05:05:49 +02:00
// If a group is selected the contact has to be removed from the list
$(document).trigger('status.contact.removedfromgroup', {
contactid: id,
2012-11-14 15:27:38 +01:00
groupid: groupId,
groupname: groupName
2012-10-05 05:05:49 +02:00
});
});
} else {
2012-11-14 15:27:38 +01:00
var msg = result.message ? result.message : t('contacts', 'Error removing from group.');
$(document).trigger('status.contacts.error', {message:msg});
}
2012-10-05 05:05:49 +02:00
});
if(!buildnow) {
self.$groups.val(-1).hide().find('optgroup,option:not([value="-1"])').remove();
}
} // else something's wrong ;)
2012-11-15 02:41:52 +01:00
self.setAllChecked(false);
2012-10-05 05:05:49 +02:00
});
2013-06-02 12:16:49 +02:00
this.$contactList.on('mouseenter', 'tr.contact', function(event) {
var $td = $(this).find('td').filter(':visible').last();
$('<a />').addClass('svg delete action').appendTo($td);
});
this.$contactList.on('mouseleave', 'tr.contact', function(event) {
$(this).find('a.delete').remove();
});
2012-10-05 05:05:49 +02:00
// Contact list. Either open a contact or perform an action (mailto etc.)
2013-05-31 21:32:16 +02:00
this.$contactList.on('click', 'tr.contact', function(event) {
if($(event.target).is('input')) {
return;
}
if(event.ctrlKey || event.metaKey) {
2012-10-05 05:05:49 +02:00
event.stopPropagation();
event.preventDefault();
self.dontScroll = true;
2012-12-13 02:30:20 +01:00
self.contacts.select($(this).data('id'), true);
2012-10-05 05:05:49 +02:00
return;
}
if($(event.target).is('a.mailto')) {
$(document).trigger('request.openurl', {
type: 'email',
url: $.trim($(this).find('.email').text())
});
return;
}
if($(event.target).is('a.delete')) {
$(document).trigger('request.contact.delete', {
2013-06-02 12:16:49 +02:00
contactid: $(this).data('id')
});
return;
}
2013-05-09 21:18:32 +02:00
self.openContact(String($(this).data('id')));
});
2013-05-01 01:47:45 +02:00
this.$settings.find('#app-settings-header').on('click keydown',function(event) {
if(wrongKey(event)) {
return;
}
var bodyListener = function(e) {
if(self.$settings.find($(e.target)).length == 0) {
self.$settings.switchClass('open', '');
}
};
if(self.$settings.hasClass('open')) {
self.$settings.switchClass('open', '');
$('body').unbind('click', bodyListener);
} else {
self.$settings.switchClass('', 'open');
$('body').bind('click', bodyListener);
}
});
var addContact = function() {
console.log('add');
self.$toggleAll.hide();
$(this).hide();
self.currentid = 'new';
// Properties that the contact doesn't know
console.log('addContact, groupid', self.currentgroup);
self.$contactList.addClass('dim');
var groupprops = {
favorite: false,
groups: self.groups.categories,
currentgroup: {id:self.currentgroup, name:self.groups.nameById(self.currentgroup)}
};
self.$firstRun.hide();
self.$contactList.show();
self.$contactList.addClass('dim');
self.tmpcontact = self.contacts.addContact(groupprops);
self.$rightContent.prepend(self.tmpcontact);
self.hideActions();
};
this.$firstRun.on('click keydown', '.import', function(event) {
event.preventDefault();
event.stopPropagation();
self.$settings.find('.settings').click();
});
2013-04-30 20:00:33 +02:00
this.$firstRun.on('click keydown', '.add-contact', function(event) {
if(wrongKey(event)) {
return;
}
addContact();
});
2013-04-30 20:00:33 +02:00
this.$groupList.on('click keydown', '.add-contact', function(event) {
if(wrongKey(event)) {
return;
}
addContact();
});
2013-04-30 20:00:33 +02:00
this.$contactListHeader.on('click keydown', '.delete', function(event) {
2012-10-05 05:05:49 +02:00
if(wrongKey(event)) {
return;
}
console.log('delete');
if(self.currentid) {
console.assert(typeof self.currentid === 'string', 'self.currentid is not a string');
contactInfo = self.contacts[self.currentid].metaData();
self.contacts.delayedDelete(contactInfo);
2012-10-05 05:05:49 +02:00
} else {
2012-12-13 02:30:20 +01:00
self.contacts.delayedDelete(self.contacts.getSelectedContacts());
2012-10-05 05:05:49 +02:00
}
2013-04-30 20:00:33 +02:00
self.hideActions();
2012-10-05 05:05:49 +02:00
});
2012-11-15 00:28:43 +01:00
2013-04-30 20:00:33 +02:00
this.$contactListHeader.on('click keydown', '.download', function(event) {
2012-10-05 05:05:49 +02:00
if(wrongKey(event)) {
return;
}
console.log('download');
var contacts = self.contacts.getSelectedContacts();
var ids = $.map(contacts, function(c) {return c.getId();});
document.location.href = OC.linkTo('contacts', 'export.php')
+ '?selectedids=' + ids.join(',');
});
2012-11-15 00:28:43 +01:00
2013-04-30 20:00:33 +02:00
this.$contactListHeader.on('click keydown', '.merge', function(event) {
2012-10-05 05:05:49 +02:00
if(wrongKey(event)) {
return;
}
2013-04-03 16:43:18 +02:00
console.log('merge');
self.mergeSelectedContacts();
});
2013-04-30 20:00:33 +02:00
this.$contactListHeader.on('click keydown', '.favorite', function(event) {
2012-10-05 05:05:49 +02:00
if(wrongKey(event)) {
return;
}
2013-03-30 20:13:52 +01:00
var contacts = self.contacts.getSelectedContacts();
self.setAllChecked(false);
self.$toggleAll.prop('checked', false);
if(!self.currentid) {
2013-04-30 20:00:33 +02:00
self.hideActions();
}
2013-03-30 20:13:52 +01:00
$.each(contacts, function(idx, contact) {
if(!self.groups.isFavorite(contact.getId())) {
self.groups.setAsFavorite(contact.getId(), true, function(result) {
if(result.status !== 'success') {
$(document).trigger('status.contacts.error', {message:
2013-03-30 20:13:52 +01:00
t('contacts',
'Error setting {name} as favorite.',
{name:contact.getDisplayName()})
});
}
});
}
});
2013-03-30 20:13:52 +01:00
2013-04-30 20:00:33 +02:00
self.hideActions();
});
2012-11-15 00:28:43 +01:00
this.$contactList.on('mouseenter', 'td.email', function(event) {
2013-02-12 11:56:09 +01:00
if($.trim($(this).text()).length > 3) {
$(this).find('.mailto').css('display', 'inline-block'); //.fadeIn(100);
}
});
this.$contactList.on('mouseleave', 'td.email', function(event) {
$(this).find('.mailto').fadeOut(100);
});
2012-10-05 05:05:49 +02:00
$('body').on('touchmove', function(event) {
event.preventDefault();
});
$(document).on('keyup', function(event) {
2013-04-03 16:54:25 +02:00
if(!$(event.target).is('body') || event.isPropagationStopped()) {
2012-10-05 05:05:49 +02:00
return;
}
var keyCode = Math.max(event.keyCode, event.which);
2012-10-30 07:03:09 +01:00
// TODO: This should go in separate method
console.log(event, keyCode + ' ' + event.target.nodeName);
2012-10-05 05:05:49 +02:00
/**
* To add:
* Shift-a: add addressbook
* u (85): hide/show leftcontent
* f (70): add field
*/
switch(keyCode) {
2012-10-05 05:05:49 +02:00
case 13: // Enter?
console.log('Enter?');
if(!self.currentid && self.currentlistid) {
self.openContact(self.currentlistid);
}
break;
case 27: // Esc
if(self.$ninjahelp.is(':visible')) {
self.$ninjahelp.hide();
} else if(self.currentid) {
self.closeContact(self.currentid);
}
break;
case 46: // Delete
if(event.shiftKey) {
2012-12-13 02:30:20 +01:00
self.contacts.delayedDelete(self.currentid);
2012-10-05 05:05:49 +02:00
}
break;
case 40: // down
case 74: // j
console.log('next');
if(!self.currentid && self.currentlistid) {
2012-12-13 02:30:20 +01:00
self.contacts.contacts[self.currentlistid].next();
2012-10-05 05:05:49 +02:00
}
break;
case 65: // a
if(event.shiftKey) {
console.log('add group?');
break;
}
self.addContact();
break;
case 38: // up
case 75: // k
console.log('previous');
if(!self.currentid && self.currentlistid) {
2012-12-13 02:30:20 +01:00
self.contacts.contacts[self.currentlistid].prev();
2012-10-05 05:05:49 +02:00
}
break;
case 34: // PageDown
case 78: // n
console.log('page down');
2012-10-05 05:05:49 +02:00
break;
case 79: // o
console.log('open contact?');
break;
case 33: // PageUp
case 80: // p
// prev addressbook
2012-12-13 02:30:20 +01:00
//OC.contacts.contacts.previousAddressbook();
2012-10-05 05:05:49 +02:00
break;
case 82: // r
console.log('refresh - what?');
break;
case 63: // ? German.
if(event.shiftKey) {
self.$ninjahelp.toggle('fast');
}
break;
case 171: // ? Danish
case 191: // ? Standard qwerty
2012-10-26 14:03:42 +02:00
self.$ninjahelp.toggle('fast').position({my: "center",at: "center",of: "#content"});
2012-10-05 05:05:49 +02:00
break;
}
});
2012-10-22 15:35:33 +02:00
// find all with a title attribute and tipsy them
2012-12-10 20:58:34 +01:00
$('.tooltipped.downwards:not(.onfocus)').tipsy({gravity: 'n'});
$('.tooltipped.upwards:not(.onfocus)').tipsy({gravity: 's'});
$('.tooltipped.rightwards:not(.onfocus)').tipsy({gravity: 'w'});
$('.tooltipped.leftwards:not(.onfocus)').tipsy({gravity: 'e'});
$('.tooltipped.downwards.onfocus').tipsy({trigger: 'focus', gravity: 'n'});
$('.tooltipped.rightwards.onfocus').tipsy({trigger: 'focus', gravity: 'w'});
},
2013-04-03 16:43:18 +02:00
mergeSelectedContacts: function() {
var contacts = this.contacts.getSelectedContacts();
var self = this;
this.$rightContent.append('<div id="merge_contacts_dialog"></div>');
if(!this.$mergeContactsTmpl) {
this.$mergeContactsTmpl = $('#mergeContactsTemplate');
}
var $dlg = this.$mergeContactsTmpl.octemplate();
var $liTmpl = $dlg.find('li').detach();
var $mergeList = $dlg.find('.mergelist');
2013-04-03 16:43:18 +02:00
$.each(contacts, function(idx, contact) {
var $li = $liTmpl
.octemplate({idx: idx, id: contact.getId(), displayname: contact.getDisplayName()});
if(!contact.data.thumbnail) {
$li.addClass('thumbnail');
} else {
$li.css('background-image', 'url(data:image/png;base64,' + contact.data.thumbnail + ')');
}
if(idx === 0) {
$li.find('input:radio').prop('checked', true);
}
$mergeList.append($li);
2013-04-03 16:43:18 +02:00
});
$('#merge_contacts_dialog').html($dlg).ocdialog({
modal: true,
2013-04-03 16:43:18 +02:00
closeOnEscape: true,
title: t('contacts', 'Merge contacts'),
height: 'auto', width: 'auto',
buttons: [
{
text: t('contacts', 'Merge contacts'),
2013-04-03 16:43:18 +02:00
click:function() {
// Do the merging, use $(this) to get dialog
var contactid = $(this).find('input:radio:checked').val();
var others = [];
var deleteOther = $(this).find('#delete_other').prop('checked');
console.log('Selected contact', contactid, 'Delete others', deleteOther);
$.each($(this).find('input:radio:not(:checked)'), function(idx, item) {
others.push($(item).val());
});
console.log('others', others);
$(document).trigger('request.contact.merge', {
merger: contactid,
mergees: others,
deleteOther: deleteOther
});
$(this).ocdialog('close');
},
defaultButton: true
},
{
text: t('contacts', 'Cancel'),
click:function(dlg) {
$(this).ocdialog('close');
return false;
}
}
],
close: function(event, ui) {
$(this).ocdialog('destroy').remove();
$('#add_group_dialog').remove();
},
open: function(event, ui) {
$dlg.find('input').focus();
}
});
},
2012-11-14 15:27:38 +01:00
addGroup: function(cb) {
var self = this;
2013-04-03 16:43:18 +02:00
this.$rightContent.append('<div id="add_group_dialog"></div>');
2012-11-14 15:27:38 +01:00
if(!this.$addGroupTmpl) {
this.$addGroupTmpl = $('#addGroupTemplate');
}
2013-04-03 16:43:18 +02:00
this.$contactList.addClass('dim');
2012-11-14 15:27:38 +01:00
var $dlg = this.$addGroupTmpl.octemplate();
2013-04-01 15:12:53 +02:00
$('#add_group_dialog').html($dlg).ocdialog({
2012-11-14 15:27:38 +01:00
modal: true,
closeOnEscape: true,
title: t('contacts', 'Add group'),
height: 'auto', width: 'auto',
2013-04-01 15:12:53 +02:00
buttons: [
{
text: t('contacts', 'OK'),
click:function() {
var name = $(this).find('input').val();
if(name.trim() === '') {
return false;
}
self.groups.addGroup(
{name:$dlg.find('input:text').val()},
function(response) {
if(typeof cb === 'function') {
cb(response);
} else {
if(response.error) {
$(document).trigger('status.contacts.error', response);
2013-04-01 15:12:53 +02:00
}
2012-11-14 15:27:38 +01:00
}
2013-04-01 15:12:53 +02:00
});
$(this).ocdialog('close');
2013-04-03 16:54:25 +02:00
},
defaultButton: true
2012-11-14 15:27:38 +01:00
},
2013-04-01 15:12:53 +02:00
{
text: t('contacts', 'Cancel'),
click:function(dlg) {
$(this).ocdialog('close');
return false;
}
2012-11-14 15:27:38 +01:00
}
2013-04-01 15:12:53 +02:00
],
2012-11-14 15:27:38 +01:00
close: function(event, ui) {
2013-04-01 15:12:53 +02:00
$(this).ocdialog('destroy').remove();
2012-11-14 15:27:38 +01:00
$('#add_group_dialog').remove();
2013-04-03 16:54:25 +02:00
self.$contactList.removeClass('dim');
2012-11-14 15:27:38 +01:00
},
open: function(event, ui) {
$dlg.find('input').focus();
}
2012-11-14 15:27:38 +01:00
});
},
2012-11-15 02:41:52 +01:00
setAllChecked: function(checked) {
var selector = checked ? 'input:checkbox:visible:not(checked)' : 'input:checkbox:visible:checked';
2012-12-20 22:58:46 +01:00
$.each(this.$contactList.find(selector), function() {
2012-11-15 02:41:52 +01:00
$(this).prop('checked', checked);
});
},
2012-10-05 05:05:49 +02:00
jumpToContact: function(id) {
2013-02-12 20:56:27 +01:00
this.$rightContent.scrollTop(this.contacts.contactPos(id)-30);
2012-10-05 05:05:49 +02:00
},
closeContact: function(id) {
$(window).unbind('hashchange', this.hashChange);
if(this.currentid === 'new') {
this.tmpcontact.remove();
this.$contactList.show();
} else {
2012-12-13 02:30:20 +01:00
var contact = this.contacts.findById(id);
if(contact && contact.close()) {
this.jumpToContact(id);
}
2012-10-05 05:05:49 +02:00
}
2012-12-10 00:02:06 +01:00
this.$contactList.removeClass('dim');
delete this.currentid;
2013-04-30 20:00:33 +02:00
this.hideActions();
2012-10-05 05:05:49 +02:00
this.$groups.find('optgroup,option:not([value="-1"])').remove();
if(this.contacts.length === 0) {
$(document).trigger('status.nomorecontacts');
}
//$('body').unbind('click', this.bodyListener);
window.location.hash = '';
$(window).bind('hashchange', this.hashChange);
2012-10-05 05:05:49 +02:00
},
openContact: function(id) {
2013-05-09 21:18:32 +02:00
if(typeof id == 'undefined' || id == 'undefined') {
console.warn('id is undefined!');
console.trace();
}
2013-03-30 20:57:12 +01:00
this.hideActions();
2013-05-09 21:18:32 +02:00
console.log('Contacts.openContact', id, typeof id);
if(this.currentid && this.currentid !== id) {
this.closeContact(this.currentid);
}
$(window).unbind('hashchange', this.hashChange);
this.currentid = id;
2012-12-13 02:30:20 +01:00
console.log('Contacts.openContact, Favorite', this.currentid, this.groups.isFavorite(this.currentid), this.groups);
2012-11-15 02:41:52 +01:00
this.setAllChecked(false);
2012-12-10 00:02:06 +01:00
//this.$contactList.hide();
this.$contactList.addClass('dim');
2013-05-09 21:18:32 +02:00
console.assert(typeof this.currentid === 'string', 'Current ID not string');
2012-12-10 00:02:06 +01:00
this.jumpToContact(this.currentid);
// Properties that the contact doesn't know
var groupprops = {
2012-12-13 02:30:20 +01:00
favorite: this.groups.isFavorite(this.currentid),
groups: this.groups.categories,
currentgroup: {id:this.currentgroup, name:this.groups.nameById(this.currentgroup)}
2012-12-10 00:02:06 +01:00
};
var $contactelem = this.contacts.showContact(this.currentid, groupprops);
if(!$contactelem) {
console.warn('Error opening', this.currentid);
this.$contactList.removeClass('dim');
$(document).trigger('status.contacts.error', {
message: t('contacts', 'Could not find contact: {id}', {id:this.currentid})
});
this.currentid = null;
return;
}
2012-12-10 00:02:06 +01:00
var self = this;
var adjustElems = function() {
var $contact = $contactelem.find('#contact');
2012-12-10 00:02:06 +01:00
var maxheight = document.documentElement.clientHeight - 200; // - ($contactelem.offset().top+70);
var $footer = $contactelem.find('footer');
var minWidth = 0;
$.each($footer.children(), function(idx, child) {
minWidth += $(child).outerWidth();
});
$contact.css({'min-width' : Math.round(minWidth), 'max-height': maxheight, 'overflow-y': 'auto', 'overflow-x': 'hidden'});
2012-12-10 00:02:06 +01:00
};
$(window).resize(adjustElems);
//$contact.resizable({ minWidth: 400, minHeight: 400, maxHeight: maxheight});
2012-10-05 05:05:49 +02:00
this.$rightContent.prepend($contactelem);
2012-12-10 00:02:06 +01:00
adjustElems();
/*this.bodyListener = function(e) {
if(!self.currentid) {
return;
}
var $contactelem = self.contacts.findById(self.currentid).$fullelem;
if($contactelem.find($(e.target)).length === 0) {
self.closeContact(self.currentid);
}
};*/
window.location.hash = this.currentid.toString();
setTimeout(function() {
//$('body').bind('click', self.bodyListener);
$(window).bind('hashchange', this.hashChange);
}, 500);
2012-10-05 05:05:49 +02:00
},
update: function() {
console.log('update');
},
2012-11-05 12:39:12 +01:00
uploadPhoto:function(filelist) {
2013-05-19 05:19:58 +02:00
console.log('uploadPhoto');
2012-11-05 12:39:12 +01:00
var self = this;
if(!filelist) {
$(document).trigger('status.contacts.error', {message:t('contacts','No files selected for upload.')});
2012-11-05 12:39:12 +01:00
return;
}
var file = filelist[0];
var form = $('#file_upload_form');
var totalSize=0;
if(file.size > $('#max_upload').val()) {
$(document).trigger('status.contacts.error', {
2012-11-05 12:39:12 +01:00
message:t(
'contacts',
'The file you are trying to upload exceed the maximum size for file uploads on this server.')
2012-11-05 12:39:12 +01:00
});
return;
} else {
form.submit();
}
},
cloudPhotoSelected:function(metadata, path) {
var self = this;
console.log('cloudPhotoSelected', metadata);
2012-10-22 15:35:33 +02:00
$.getJSON(OC.filePath('contacts', 'ajax', 'oc_photo.php'),
{path: path, contact: metadata},function(response) {
if(response.status == 'success') {
//alert(jsondata.data.page);
self.editPhoto(metadata, response.data.tmp);
2013-04-08 22:35:28 +02:00
//$('#edit_photo_dialog_img').html(jsondata.data.page);
}
else{
$(document).trigger('status.contacts.error', response);
}
});
},
editCurrentPhoto:function(metadata) {
var self = this;
$.getJSON(OC.filePath('contacts', 'ajax', 'currentphoto.php'), metadata,
function(response) {
if(response.status == 'success') {
//alert(jsondata.data.page);
self.editPhoto(metadata, response.data.tmp);
$('#edit_photo_dialog_img').html(response.data.page);
} else {
$(document).trigger('status.contacts.error', response);
}
});
},
editPhoto:function(metadata, tmpkey) {
console.log('editPhoto', metadata, tmpkey);
$('.tipsy').remove();
// Simple event handler, called from onChange and onSelect
// event handlers, as per the Jcrop invocation above
var showCoords = function(c) {
$('#x1').val(c.x);
$('#y1').val(c.y);
$('#x2').val(c.x2);
$('#y2').val(c.y2);
$('#w').val(c.w);
$('#h').val(c.h);
};
var clearCoords = function() {
$('#coords input').val('');
};
2012-10-22 15:35:33 +02:00
var self = this;
if(!this.$cropBoxTmpl) {
this.$cropBoxTmpl = $('#cropBoxTemplate');
}
2013-05-19 05:19:58 +02:00
//$('body').append('<div id="edit_photo_dialog"></div>');
var $container = $('<div />').appendTo($('body'));
var $dlg = this.$cropBoxTmpl.octemplate(
{
backend: metadata.backend,
2013-04-08 22:35:28 +02:00
addressbookid: metadata.addressbookid,
contactid: metadata.contactid,
tmpkey: tmpkey
});
var cropphoto = new Image();
$(cropphoto).load(function () {
var x = 5, y = 5, w = this.width-10, h = this.height-10;
$(this).attr('id', 'cropbox');
$(this).prependTo($dlg).fadeIn();
$(this).Jcrop({
onChange: showCoords,
onSelect: showCoords,
onRelease: clearCoords,
maxSize: [399, 399],
bgColor: 'black',
bgOpacity: .4,
boxWidth: 400,
boxHeight: 400,
setSelect: [ w, h, x, y ]//,
//aspectRatio: 0.8
});
2013-05-19 05:19:58 +02:00
$container.html($dlg).dialog({
modal: true,
closeOnEscape: true,
title: t('contacts', 'Edit profile picture'),
height: 'auto', width: 'auto',
buttons: {
'Ok':function() {
self.savePhoto($(this));
$(this).dialog('close');
},
'Cancel':function() { $(this).dialog('close'); }
},
close: function(event, ui) {
$(this).dialog('destroy').remove();
2013-05-19 05:19:58 +02:00
$container.remove();
},
open: function(event, ui) {
showCoords({x:x,y:y,w:w,h:h});
}
});
}).error(function () {
$(document).trigger('status.contacts.error', {message:t('contacts','Error loading profile picture.')});
2013-04-08 22:35:28 +02:00
}).attr('src', OC.linkTo('contacts', 'tmpphoto.php')+'?tmpkey='+tmpkey+'&refresh='+Math.random());
},
savePhoto:function($dlg) {
var form = $dlg.find('#cropform');
q = form.serialize();
console.log('savePhoto', q);
$.post(OC.filePath('contacts', 'ajax', 'savecrop.php'), q, function(response) {
2013-04-08 22:35:28 +02:00
//var jsondata = $.parseJSON(response);
console.log('savePhoto, response', typeof response);
if(response && response.status === 'success') {
// load cropped photo.
$(document).trigger('status.contact.photoupdated', {
2013-04-08 22:35:28 +02:00
id: response.data.id,
thumbnail: response.data.thumbnail
});
} else {
2013-04-08 22:35:28 +02:00
if(!response) {
$(document).trigger('status.contacts.error', {
message:t('contacts', 'Network or server error. Please inform administrator.')
});
} else {
$(document).trigger('status.contacts.error', response);
}
}
});
},
};
$(document).ready(function() {
OC.Router.registerLoadedCallback(function() {
$.getScript(OC.Router.generate('contacts_jsconfig'))
.done(function() {
2013-04-01 03:53:54 +02:00
OC.Contacts.init();
})
.fail(function(jqxhr, settings, exception) {
console.log('Failed loading settings.', jqxhr, settings, exception);
2013-04-01 03:53:54 +02:00
});
});
});