2012-10-05 05:05:49 +02:00
|
|
|
OC.Contacts = OC.Contacts || {};
|
2012-02-06 07:32:57 +01:00
|
|
|
|
|
|
|
|
2012-10-15 21:35:34 +02:00
|
|
|
(function($) {
|
2012-10-05 05:05:49 +02:00
|
|
|
|
2012-08-02 01:14:50 +02:00
|
|
|
/**
|
2012-10-05 05:05:49 +02:00
|
|
|
* An item which binds the appropriate html and event handlers
|
|
|
|
* @param parent the parent ContactList
|
|
|
|
* @param id The integer contact id.
|
|
|
|
* @param access An access object containing and 'owner' string variable and an integer 'permissions' variable.
|
|
|
|
* @param data the data used to populate the contact
|
|
|
|
* @param listtemplate the jquery object used to render the contact list item
|
|
|
|
* @param fulltemplate the jquery object used to render the entire contact
|
|
|
|
* @param detailtemplates A map of jquery objects used to render the contact parts e.g. EMAIL, TEL etc.
|
|
|
|
*/
|
|
|
|
var Contact = function(parent, id, access, data, listtemplate, fulltemplate, detailtemplates) {
|
|
|
|
//console.log('contact:', id, access); //parent, id, data, listtemplate, fulltemplate);
|
|
|
|
this.parent = parent,
|
|
|
|
this.id = id,
|
|
|
|
this.access = access,
|
|
|
|
this.data = data,
|
|
|
|
this.$listTemplate = listtemplate,
|
|
|
|
this.$fullTemplate = fulltemplate;
|
|
|
|
this.detailTemplates = detailtemplates;
|
2012-08-02 01:14:50 +02:00
|
|
|
var self = this;
|
2012-10-05 05:05:49 +02:00
|
|
|
this.multi_properties = ['EMAIL', 'TEL', 'IMPP', 'ADR', 'URL'];
|
|
|
|
}
|
|
|
|
|
|
|
|
Contact.prototype.setAsSaving = function(obj, state) {
|
|
|
|
if(!obj) {
|
2012-08-02 01:14:50 +02:00
|
|
|
return;
|
|
|
|
}
|
2012-10-05 05:05:49 +02:00
|
|
|
$(obj).prop('disabled', state);
|
2012-08-02 01:14:50 +02:00
|
|
|
if(state) {
|
|
|
|
$(obj).addClass('loading');
|
|
|
|
} else {
|
|
|
|
$(obj).removeClass('loading');
|
|
|
|
}
|
2012-10-05 05:05:49 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
Contact.prototype.removeProperty = function(obj) {
|
|
|
|
console.log('Contact.removeProperty', name)
|
|
|
|
}
|
|
|
|
|
|
|
|
Contact.prototype.addProperty = function($option, name) {
|
|
|
|
console.log('Contact.addProperty', name)
|
|
|
|
switch(name) {
|
|
|
|
case 'NICKNAME':
|
|
|
|
case 'TITLE':
|
|
|
|
case 'ORG':
|
|
|
|
case 'BDAY':
|
|
|
|
this.$fullelem.find('[data-element="' + name.toLowerCase() + '"]').show();
|
|
|
|
$option.prop('disabled', true);
|
|
|
|
break;
|
|
|
|
case 'TEL':
|
|
|
|
case 'URL':
|
|
|
|
case 'EMAIL':
|
|
|
|
$elem = this.renderStandardProperty(name.toLowerCase());
|
|
|
|
var $list = this.$fullelem.find('ul.' + name.toLowerCase());
|
|
|
|
$list.show();
|
|
|
|
$list.append($elem);
|
|
|
|
break;
|
|
|
|
case 'ADR':
|
|
|
|
$elem = this.renderAddressProperty();
|
|
|
|
var $list = this.$fullelem.find('ul.' + name.toLowerCase());
|
|
|
|
$list.show();
|
|
|
|
$list.append($elem);
|
|
|
|
break;
|
|
|
|
case 'IMPP':
|
|
|
|
$elem = this.renderIMProperty();
|
|
|
|
var $list = this.$fullelem.find('ul.' + name.toLowerCase());
|
|
|
|
$list.show();
|
|
|
|
$list.append($elem);
|
|
|
|
break;
|
2012-08-02 01:14:50 +02:00
|
|
|
}
|
2012-10-05 05:05:49 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Act on change of a property.
|
|
|
|
* If this is a new contact it will first be saved to the datastore and a
|
|
|
|
* new datastructure will be added to the object.
|
|
|
|
* If the obj argument is not provided 'name' and 'value' MUST be provided
|
|
|
|
* and this is only allowed for single elements like N, FN, CATEGORIES.
|
|
|
|
* @param obj. The form form field that has changed.
|
|
|
|
* @param name. The optional name of the element.
|
|
|
|
* @param value. The optional value.
|
|
|
|
*/
|
|
|
|
Contact.prototype.saveProperty = function(params) {
|
|
|
|
console.log('Contact.saveProperty', params);
|
|
|
|
var obj = null;
|
|
|
|
var element = null;
|
|
|
|
var q = 'id=' + this.id + '&';
|
|
|
|
if(params.obj) {
|
|
|
|
obj = params.obj;
|
|
|
|
q = this.queryStringFor(obj);
|
|
|
|
} else {
|
|
|
|
element = params.name;
|
|
|
|
q += 'value=' + encodeURIComponent(params.value) + '&name=' + element;
|
2012-08-02 01:14:50 +02:00
|
|
|
}
|
2012-10-05 05:05:49 +02:00
|
|
|
console.log('q', q);
|
|
|
|
var self = this;
|
|
|
|
this.setAsSaving(obj, true);
|
|
|
|
$.post(OC.filePath('contacts', 'ajax', 'contact/saveproperty.php'), q, function(jsondata){
|
|
|
|
if(!jsondata) {
|
|
|
|
$(document).trigger('status.contact.error', {
|
|
|
|
status: 'error',
|
|
|
|
message: t('contacts', 'Network or server error. Please inform administrator.'),
|
|
|
|
});
|
|
|
|
self.setAsSaving(obj, false);
|
|
|
|
return false;
|
2012-08-02 01:14:50 +02:00
|
|
|
}
|
2012-10-05 05:05:49 +02:00
|
|
|
if(jsondata.status == 'success') {
|
|
|
|
if(self.multi_properties.indexOf(element) !== -1) {
|
|
|
|
$container.data('checksum', jsondata.data.checksum);
|
|
|
|
}
|
|
|
|
self.setAsSaving(obj, false);
|
|
|
|
return true;
|
|
|
|
} else {
|
|
|
|
$(document).trigger('status.contact.error', {
|
|
|
|
status: 'error',
|
|
|
|
message: jsondata.data.message,
|
|
|
|
});
|
|
|
|
self.setAsSaving(obj, false);
|
|
|
|
return false;
|
2012-08-02 01:14:50 +02:00
|
|
|
}
|
2012-10-05 05:05:49 +02:00
|
|
|
},'json');
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Remove any open contact from the DOM.
|
|
|
|
*/
|
|
|
|
Contact.prototype.close = function() {
|
|
|
|
console.log('Closing', this);
|
|
|
|
if(this.$fullelem) {
|
|
|
|
this.$fullelem.remove();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Remove any open contact from the DOM and detach it's list
|
|
|
|
* element from the DOM.
|
|
|
|
* @returns The list item jquery object.
|
|
|
|
*/
|
|
|
|
Contact.prototype.detach = function() {
|
|
|
|
if(this.$fullelem) {
|
|
|
|
this.$fullelem.remove();
|
|
|
|
}
|
|
|
|
if(this.$listelem) {
|
|
|
|
return this.$listelem.detach();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Set a contact to en/disabled depending on its permissions.
|
|
|
|
* @param boolean enabled
|
|
|
|
*/
|
|
|
|
Contact.prototype.setEnabled = function(enabled) {
|
|
|
|
console.log('setEnabled', enabled);
|
|
|
|
if(enabled) {
|
|
|
|
this.$fullelem.find('#addproperty').show();
|
|
|
|
} else {
|
|
|
|
this.$fullelem.find('#addproperty').hide();
|
|
|
|
}
|
|
|
|
this.enabled = enabled;
|
|
|
|
this.$fullelem.find('.value,.action').each(function () {
|
|
|
|
$(this).prop('disabled', !enabled);
|
2012-08-02 01:14:50 +02:00
|
|
|
});
|
2012-10-05 05:05:49 +02:00
|
|
|
$(document).trigger('status.contact.enabled', enabled);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Delete contact from data store and remove it from the DOM
|
|
|
|
* @param cb Optional callback function which
|
|
|
|
* @returns An object with a variable 'status' of either success
|
|
|
|
* or 'error'
|
|
|
|
*/
|
|
|
|
Contact.prototype.destroy = function(cb) {
|
|
|
|
var self = this;
|
|
|
|
$.post(OC.filePath('contacts', 'ajax', 'contact/delete.php'),
|
|
|
|
{id: this.id}, function(jsondata) {
|
|
|
|
if(jsondata && jsondata.status === 'success') {
|
|
|
|
if(self.$listelem) {
|
|
|
|
self.$listelem.remove();
|
|
|
|
}
|
|
|
|
if(self.$fullelem) {
|
|
|
|
self.$fullelem.remove();
|
2012-07-21 16:02:12 +02:00
|
|
|
}
|
2012-07-21 14:24:26 +02:00
|
|
|
}
|
2012-10-05 05:05:49 +02:00
|
|
|
if(typeof cb == 'function') {
|
|
|
|
var retval = {status: jsondata ? jsondata.status : 'error'};
|
|
|
|
if(jsondata) {
|
|
|
|
if(jsondata.status === 'success') {
|
|
|
|
retval['id'] = jsondata.id;
|
|
|
|
} else {
|
|
|
|
retval['message'] = jsondata.message;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
retval['message'] = t('contacts', 'There was an unknown error when trying to delete this contact');
|
|
|
|
retval['id'] = self.id;
|
|
|
|
}
|
|
|
|
cb(retval);
|
2012-02-06 07:32:57 +01:00
|
|
|
}
|
2012-08-02 01:14:50 +02:00
|
|
|
});
|
2012-10-05 05:05:49 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
Contact.prototype.queryStringFor = function(obj) {
|
|
|
|
var q = 'id=' + this.id;
|
|
|
|
var ptype = this.propertyTypeFor(obj);
|
|
|
|
q += '&name=' + ptype;
|
|
|
|
|
|
|
|
if(this.multi_properties.indexOf(ptype) !== -1) {
|
|
|
|
q += '&checksum=' + this.checksumFor(obj);
|
|
|
|
}
|
|
|
|
|
|
|
|
if($(obj).hasClass('propertycontainer')) {
|
|
|
|
q += '&value=' + encodeURIComponent($(obj).val());
|
|
|
|
} else {
|
|
|
|
q += '&' + this.propertyContainerFor(obj)
|
|
|
|
.find('input.value,select.value,textarea.value').serialize();
|
|
|
|
}
|
|
|
|
return q;
|
|
|
|
}
|
|
|
|
|
|
|
|
Contact.prototype.propertyContainerFor = function(obj) {
|
|
|
|
return $(obj).hasClass('.propertycontainer')
|
|
|
|
? $(obj)
|
|
|
|
: $(obj).parents('.propertycontainer').first();
|
|
|
|
}
|
2012-08-02 01:14:50 +02:00
|
|
|
|
2012-10-05 05:05:49 +02:00
|
|
|
Contact.prototype.checksumFor = function(obj) {
|
|
|
|
return this.propertyContainerFor(obj).data('checksum');
|
|
|
|
}
|
|
|
|
|
|
|
|
Contact.prototype.propertyTypeFor = function(obj) {
|
|
|
|
var ptype = this.propertyContainerFor(obj).data('element');
|
|
|
|
return ptype ? ptype.toUpperCase() : null;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Render the list item
|
|
|
|
* @return A jquery object to be inserted in the DOM
|
|
|
|
*/
|
|
|
|
Contact.prototype.renderListItem = function() {
|
|
|
|
this.$listelem = this.$listTemplate.octemplate({
|
|
|
|
id: this.id,
|
|
|
|
name: this.getPreferredValue('FN', ''),
|
|
|
|
email: this.getPreferredValue('EMAIL', ''),
|
|
|
|
tel: this.getPreferredValue('TEL', ''),
|
|
|
|
adr: this.getPreferredValue('ADR', []).clean('').join(', '),
|
|
|
|
categories: this.getPreferredValue('CATEGORIES', [])
|
|
|
|
.clean('').join(' / '),
|
2012-08-02 01:14:50 +02:00
|
|
|
});
|
2012-10-05 05:05:49 +02:00
|
|
|
if(this.access.owner !== OC.currentUser
|
|
|
|
&& !(this.access.permissions & OC.PERMISSION_UPDATE
|
|
|
|
|| this.access.permissions & OC.PERMISSION_DELETE)) {
|
|
|
|
this.$listelem.find('input:checkbox').prop('disabled', true).css('opacity', '0');
|
|
|
|
}
|
|
|
|
return this.$listelem;
|
|
|
|
}
|
2012-08-02 01:14:50 +02:00
|
|
|
|
2012-10-05 05:05:49 +02:00
|
|
|
/**
|
|
|
|
* Render the full contact
|
|
|
|
* @return A jquery object to be inserted in the DOM
|
|
|
|
*/
|
|
|
|
Contact.prototype.renderContact = function() {
|
|
|
|
var self = this;
|
|
|
|
console.log('renderContact', this.data);
|
|
|
|
var values = this.data
|
|
|
|
? {
|
|
|
|
id: this.id,
|
|
|
|
name: this.getPreferredValue('FN', ''),
|
|
|
|
nickname: this.getPreferredValue('NICKNAME', ''),
|
|
|
|
title: this.getPreferredValue('TITLE', ''),
|
|
|
|
org: this.getPreferredValue('ORG', []).clean('').join(', '), // TODO Add parts if more than one.
|
|
|
|
bday: this.getPreferredValue('BDAY', '').length >= 10
|
|
|
|
? $.datepicker.formatDate('dd-mm-yy',
|
|
|
|
$.datepicker.parseDate('yy-mm-dd',
|
|
|
|
this.getPreferredValue('BDAY', '').substring(0, 10)))
|
|
|
|
: '',
|
|
|
|
}
|
|
|
|
: {id: '', name: '', nickname: '', title: '', org: '', bday: ''};
|
|
|
|
this.$fullelem = this.$fullTemplate.octemplate(values).data('contactobject', this);
|
|
|
|
this.$addMenu = this.$fullelem.find('#addproperty');
|
|
|
|
this.$addMenu.on('change', function(event) {
|
|
|
|
console.log('add', $(this).val());
|
|
|
|
var $opt = $(this).find('option:selected');
|
|
|
|
self.addProperty($opt, $(this).val());
|
|
|
|
$(this).val('');
|
2012-08-02 01:14:50 +02:00
|
|
|
});
|
2012-10-05 05:05:49 +02:00
|
|
|
this.$fullelem.on('change', '.value', function(event) {
|
|
|
|
console.log('change', event);
|
|
|
|
self.saveProperty({obj:event.target});
|
2012-08-02 01:14:50 +02:00
|
|
|
});
|
2012-10-05 05:05:49 +02:00
|
|
|
this.$fullelem.find('form').on('submit', function(event) {
|
|
|
|
console.log('submit', this, event);
|
|
|
|
return false;
|
2012-08-02 01:14:50 +02:00
|
|
|
});
|
2012-10-05 05:05:49 +02:00
|
|
|
this.$fullelem.find('[data-element="bday"]')
|
|
|
|
.find('input').datepicker({
|
|
|
|
dateFormat : 'dd-mm-yy'
|
2012-08-02 01:14:50 +02:00
|
|
|
});
|
2012-10-15 21:35:34 +02:00
|
|
|
this.loadPhoto();
|
2012-10-05 05:05:49 +02:00
|
|
|
if(!this.data) {
|
|
|
|
// A new contact
|
|
|
|
this.setEnabled(true);
|
|
|
|
return this.$fullelem;
|
2012-08-02 01:14:50 +02:00
|
|
|
}
|
2012-10-05 05:05:49 +02:00
|
|
|
// Loop thru all single occurrence values. If not set hide the
|
|
|
|
// element, if set disable the add menu entry.
|
|
|
|
for(var value in values) {
|
|
|
|
if(this.multi_properties.indexOf(value.toUpperCase()) === -1) {
|
|
|
|
if(!values[value].length) {
|
|
|
|
console.log('hiding', value);
|
|
|
|
this.$fullelem.find('[data-element="' + value + '"]').hide();
|
|
|
|
} else {
|
|
|
|
this.$addMenu.find('option[value="' + value.toUpperCase() + '"]').prop('disabled', true);
|
2012-08-02 01:14:50 +02:00
|
|
|
}
|
2012-02-06 07:32:57 +01:00
|
|
|
}
|
2012-10-05 05:05:49 +02:00
|
|
|
}
|
|
|
|
$.each(this.multi_properties, function(idx, name) {
|
|
|
|
if(self.data[name]) {
|
|
|
|
var $list = self.$fullelem.find('ul.' + name.toLowerCase());
|
|
|
|
$list.show();
|
|
|
|
for(var p in self.data[name]) {
|
|
|
|
if(typeof self.data[name][p] === 'object') {
|
|
|
|
var property = self.data[name][p];
|
|
|
|
//console.log(name, p, property);
|
|
|
|
$property = null;
|
|
|
|
switch(name) {
|
|
|
|
case 'TEL':
|
|
|
|
case 'URL':
|
|
|
|
case 'EMAIL':
|
|
|
|
$property = self.renderStandardProperty(name.toLowerCase(), property);
|
|
|
|
break;
|
|
|
|
case 'ADR':
|
|
|
|
$property = self.renderAddressProperty(property);
|
|
|
|
break;
|
|
|
|
case 'IMPP':
|
|
|
|
$property = self.renderIMProperty(property);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
if(!$property) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
//console.log('$property', $property);
|
|
|
|
if(property.label) {
|
|
|
|
if(!property.parameters['TYPE']) {
|
|
|
|
property.parameters['TYPE'] = [];
|
2012-08-02 01:14:50 +02:00
|
|
|
}
|
2012-10-05 05:05:49 +02:00
|
|
|
property.parameters['TYPE'].push(property.label);
|
2012-08-02 01:14:50 +02:00
|
|
|
}
|
2012-10-05 05:05:49 +02:00
|
|
|
for(var param in property.parameters) {
|
|
|
|
//console.log('param', param);
|
|
|
|
if(param.toUpperCase() == 'PREF') {
|
|
|
|
$property.find('input[type="checkbox"]').attr('checked', 'checked')
|
|
|
|
}
|
|
|
|
else if(param.toUpperCase() == 'TYPE') {
|
|
|
|
for(etype in property.parameters[param]) {
|
|
|
|
var found = false;
|
|
|
|
var et = property.parameters[param][etype];
|
|
|
|
if(typeof et !== 'string') {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
//console.log('et', et);
|
|
|
|
if(et.toUpperCase() === 'INTERNET') {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
$property.find('select.type option').each(function() {
|
|
|
|
if($(this).val().toUpperCase() === et.toUpperCase()) {
|
|
|
|
$(this).attr('selected', 'selected');
|
|
|
|
found = true;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
if(!found) {
|
|
|
|
$property.find('select.type option:last-child').after('<option value="'+et+'" selected="selected">'+et+'</option>');
|
|
|
|
}
|
2012-08-02 01:14:50 +02:00
|
|
|
}
|
|
|
|
}
|
2012-10-05 05:05:49 +02:00
|
|
|
else if(param.toUpperCase() == 'X-SERVICE-TYPE') {
|
|
|
|
//console.log('setting', $property.find('select.impp'), 'to', property.parameters[param].toLowerCase());
|
|
|
|
$property.find('select.impp').val(property.parameters[param].toLowerCase());
|
2012-08-02 01:14:50 +02:00
|
|
|
}
|
2012-10-05 05:05:49 +02:00
|
|
|
}
|
2012-10-15 21:35:34 +02:00
|
|
|
if(self.access.owner === OC.currentUser
|
|
|
|
|| self.access.permissions & OC.PERMISSION_UPDATE
|
|
|
|
|| self.access.permissions & OC.PERMISSION_DELETE) {
|
|
|
|
$property.find('select.type[name="parameters[TYPE][]"]')
|
|
|
|
.combobox({
|
|
|
|
singleclick: true,
|
|
|
|
classes: ['propertytype', 'float', 'label'],
|
|
|
|
});
|
|
|
|
$property.on('mouseenter', function() {
|
|
|
|
$(this).find('.listactions').css('opacity', '1');
|
|
|
|
}).on('mouseleave', function() {
|
|
|
|
$(this).find('.listactions').css('opacity', '0');
|
2012-10-05 05:05:49 +02:00
|
|
|
});
|
2012-10-15 21:35:34 +02:00
|
|
|
}
|
2012-10-05 05:05:49 +02:00
|
|
|
$list.append($property);
|
2012-08-02 01:14:50 +02:00
|
|
|
}
|
2012-10-05 05:05:49 +02:00
|
|
|
}
|
2012-05-02 12:10:44 +02:00
|
|
|
}
|
2012-10-05 05:05:49 +02:00
|
|
|
});
|
|
|
|
if(this.access.owner !== OC.currentUser
|
|
|
|
&& !(this.access.permissions & OC.PERMISSION_UPDATE
|
|
|
|
|| this.access.permissions & OC.PERMISSION_DELETE)) {
|
|
|
|
this.setEnabled(false);
|
|
|
|
} else {
|
|
|
|
this.setEnabled(true);
|
|
|
|
}
|
|
|
|
return this.$fullelem;
|
|
|
|
}
|
2012-07-21 14:26:26 +02:00
|
|
|
|
2012-10-15 21:35:34 +02:00
|
|
|
Contact.prototype.isEditable = function() {
|
|
|
|
return ((this.access.owner === OC.currentUser)
|
|
|
|
|| (this.access.permissions & OC.PERMISSION_UPDATE
|
|
|
|
|| this.access.permissions & OC.PERMISSION_DELETE));
|
|
|
|
}
|
|
|
|
|
2012-10-05 05:05:49 +02:00
|
|
|
/**
|
|
|
|
* Render a simple property. Used for EMAIL and TEL.
|
|
|
|
* @return A jquery object to be injected in the DOM
|
|
|
|
*/
|
|
|
|
Contact.prototype.renderStandardProperty = function(name, property) {
|
|
|
|
if(!this.detailTemplates[name]) {
|
|
|
|
console.log('No template for', name);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
var values = property
|
|
|
|
? { value: property.value, checksum: property.checksum }
|
|
|
|
: { value: '', checksum: 'new' };
|
|
|
|
$elem = this.detailTemplates[name].octemplate(values);
|
|
|
|
return $elem;
|
|
|
|
}
|
2012-07-21 14:26:26 +02:00
|
|
|
|
2012-10-05 05:05:49 +02:00
|
|
|
/**
|
|
|
|
* Render an ADR (address) property.
|
|
|
|
* @return A jquery object to be injected in the DOM
|
|
|
|
*/
|
|
|
|
Contact.prototype.renderAddressProperty = function(property) {
|
|
|
|
if(!this.detailTemplates['adr']) {
|
|
|
|
console.log('No template for adr', this.detailTemplates);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
var values = property ? {
|
|
|
|
value: property.value.clean('').join(', '),
|
|
|
|
checksum: property.checksum,
|
|
|
|
adr0: property.value[0] || '',
|
|
|
|
adr1: property.value[1] || '',
|
|
|
|
adr2: property.value[2] || '',
|
|
|
|
adr3: property.value[3] || '',
|
|
|
|
adr4: property.value[4] || '',
|
|
|
|
adr5: property.value[5] || '',
|
|
|
|
}
|
|
|
|
: {value: '', checksum: 'new', adr0: '', adr1: '', adr2: '', adr3: '', adr4: '', adr5: ''};
|
|
|
|
$elem = this.detailTemplates['adr'].octemplate(values);
|
|
|
|
return $elem;
|
|
|
|
}
|
2012-07-21 14:26:26 +02:00
|
|
|
|
2012-10-05 05:05:49 +02:00
|
|
|
/**
|
|
|
|
* Render an IMPP (Instant Messaging) property.
|
|
|
|
* @return A jquery object to be injected in the DOM
|
|
|
|
*/
|
|
|
|
Contact.prototype.renderIMProperty = function(property) {
|
|
|
|
if(!this.detailTemplates['impp']) {
|
|
|
|
console.log('No template for impp', this.detailTemplates);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
var values = property ? {
|
|
|
|
value: property.value,
|
|
|
|
checksum: property.checksum,
|
|
|
|
} : {value: '', checksum: 'new'};
|
|
|
|
$elem = this.detailTemplates['impp'].octemplate(values);
|
|
|
|
return $elem;
|
|
|
|
}
|
2012-10-15 21:35:34 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Render the PHOTO property.
|
|
|
|
*/
|
|
|
|
Contact.prototype.loadPhoto = function(dontloadhandlers) {
|
|
|
|
var self = this;
|
|
|
|
var refreshstr = '&refresh='+Math.random();
|
|
|
|
this.$photowrapper = this.$fullelem.find('#photowrapper');
|
|
|
|
this.$photowrapper.addClass('loading').addClass('wait');
|
|
|
|
var $phototools = this.$fullelem.find('#phototools');
|
|
|
|
console.log('photowrapper', this.$photowrapper.length);
|
|
|
|
delete this.photo;
|
2012-10-19 22:19:05 +02:00
|
|
|
$('img.contactphoto').remove()
|
2012-10-15 21:35:34 +02:00
|
|
|
this.photo = new Image();
|
|
|
|
$(this.photo).load(function () {
|
|
|
|
$(this).addClass('contactphoto');
|
|
|
|
self.$photowrapper.css('width', $(this).get(0).width + 10);
|
|
|
|
self.$photowrapper.removeClass('loading').removeClass('wait');
|
|
|
|
$(this).insertAfter($phototools).fadeIn();
|
|
|
|
}).error(function () {
|
|
|
|
OC.notify({message:t('contacts','Error loading profile picture.')});
|
|
|
|
}).attr('src', OC.linkTo('contacts', 'photo.php')+'?id='+self.id+refreshstr);
|
|
|
|
|
|
|
|
if(!dontloadhandlers && this.isEditable()) {
|
|
|
|
this.$photowrapper.on('mouseenter', function() {
|
|
|
|
$phototools.slideDown(200);
|
|
|
|
}).on('mouseleave', function() {
|
|
|
|
$phototools.slideUp(200);
|
|
|
|
});
|
|
|
|
$phototools.hover( function () {
|
|
|
|
$(this).removeClass('transparent');
|
|
|
|
}, function () {
|
|
|
|
$(this).addClass('transparent');
|
|
|
|
});
|
|
|
|
$phototools.find('li a').tipsy();
|
|
|
|
|
|
|
|
$phototools.find('.edit').on('click', function() {
|
|
|
|
console.log('TODO: edit photo');
|
|
|
|
$(document).trigger('request.edit.contactphoto', {
|
|
|
|
id: self.id,
|
|
|
|
});
|
|
|
|
});
|
|
|
|
$phototools.find('.cloud').on('click', function() {
|
|
|
|
console.log('select photo from cloud');
|
|
|
|
$(document).trigger('request.select.contactphoto.fromcloud', {
|
|
|
|
id: self.id,
|
|
|
|
});
|
|
|
|
});
|
|
|
|
$phototools.find('.upload').on('click', function() {
|
|
|
|
console.log('select photo from local');
|
|
|
|
$(document).trigger('request.select.contactphoto.fromlocal', {
|
|
|
|
id: self.id,
|
|
|
|
});
|
|
|
|
});
|
|
|
|
if(this.data.PHOTO) {
|
|
|
|
$phototools.find('.delete').show();
|
|
|
|
$phototools.find('.edit').show();
|
|
|
|
} else {
|
|
|
|
$phototools.find('.delete').hide();
|
|
|
|
$phototools.find('.edit').hide();
|
|
|
|
}
|
|
|
|
$(document).bind('status.contact.photoupdated', function(e, result) {
|
|
|
|
console.log('Contact - photoupdated')
|
|
|
|
self.loadPhoto(true);
|
|
|
|
var refreshstr = '&refresh='+Math.random();
|
|
|
|
self.getListItemElement().find('td.name')
|
|
|
|
.css('background', 'url(' + OC.linkTo('contacts', 'thumbnail.php')+'?id='+self.id+refreshstr + ')');
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-10-05 05:05:49 +02:00
|
|
|
/**
|
|
|
|
* Get the jquery element associated with this object
|
|
|
|
*/
|
|
|
|
Contact.prototype.getListItemElement = function() {
|
|
|
|
if(!this.$listelem) {
|
|
|
|
this.renderListItem();
|
|
|
|
}
|
|
|
|
return this.$listelem;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get the preferred value for a property.
|
|
|
|
* If a preferred value is not found the first one will be returned.
|
|
|
|
* @param string name The name of the property like EMAIL, TEL or ADR.
|
|
|
|
* @param def A default value to return if nothing is found.
|
|
|
|
*/
|
|
|
|
Contact.prototype.getPreferredValue = function(name, def) {
|
|
|
|
var pref = def, found = false;
|
|
|
|
if(this.data[name]) {
|
|
|
|
var props = this.data[name];
|
|
|
|
//console.log('props', props);
|
|
|
|
$.each(props, function( i, prop ) {
|
|
|
|
//console.log('prop:', i, prop);
|
|
|
|
if(i === 0) { // Choose first to start with
|
|
|
|
pref = prop.value;
|
|
|
|
}
|
|
|
|
for(var param in prop.parameters) {
|
|
|
|
if(param.toUpperCase() == 'PREF') {
|
|
|
|
found = true; //
|
|
|
|
break;
|
|
|
|
}
|
2012-08-23 16:39:25 +02:00
|
|
|
}
|
2012-10-05 05:05:49 +02:00
|
|
|
if(found) {
|
|
|
|
return false; // break out of loop
|
2012-08-23 16:39:25 +02:00
|
|
|
}
|
2012-10-05 05:05:49 +02:00
|
|
|
});
|
|
|
|
}
|
|
|
|
return pref;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns true/false depending on the contact being in the
|
|
|
|
* specified group.
|
|
|
|
* @param String name The group name (not case-sensitive)
|
|
|
|
* @returns Boolean
|
|
|
|
*/
|
|
|
|
Contact.prototype.inGroup = function(name) {
|
|
|
|
if(!this.data.CATEGORIES) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
categories = this.data.CATEGORIES[0].value;
|
|
|
|
for(var i in categories) {
|
|
|
|
if(typeof categories[i] === 'string' && (name.toLowerCase() === categories[i].toLowerCase())) {
|
|
|
|
return true;
|
2012-08-23 16:39:25 +02:00
|
|
|
}
|
2012-10-05 05:05:49 +02:00
|
|
|
};
|
|
|
|
return false;
|
|
|
|
}
|
2012-08-23 16:39:25 +02:00
|
|
|
|
2012-10-05 05:05:49 +02:00
|
|
|
/**
|
|
|
|
* Add this contact to a group
|
|
|
|
* @param String name The group name
|
|
|
|
*/
|
|
|
|
Contact.prototype.addToGroup = function(name) {
|
|
|
|
console.log('addToGroup', name);
|
|
|
|
if(!this.data.CATEGORIES) {
|
|
|
|
this.data.CATEGORIES = [{value:[name]},];
|
|
|
|
} else {
|
|
|
|
this.data.CATEGORIES[0].value.push(name);
|
|
|
|
console.log('listelem categories', this.getPreferredValue('CATEGORIES', []).clean('').join(' / '));
|
|
|
|
if(this.$listelem) {
|
|
|
|
this.$listelem.find('td.categories')
|
|
|
|
.text(this.getPreferredValue('CATEGORIES', []).clean('').join(' / '));
|
2012-08-23 22:02:38 +02:00
|
|
|
}
|
2012-10-05 05:05:49 +02:00
|
|
|
}
|
|
|
|
this.saveProperty({name:'CATEGORIES', value:this.data.CATEGORIES[0].value.join(',') });
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Remove this contact to a group
|
|
|
|
* @param String name The group name
|
|
|
|
*/
|
|
|
|
Contact.prototype.removeFromGroup = function(name) {
|
|
|
|
console.log('removeFromGroup', name);
|
|
|
|
if(!this.data.CATEGORIES) {
|
|
|
|
return;
|
|
|
|
} else {
|
|
|
|
this.data.CATEGORIES[0].value.splice(this.data.CATEGORIES[0].value.indexOf(name), 1);
|
|
|
|
if(this.$listelem) {
|
|
|
|
this.$listelem.find('td.categories')
|
|
|
|
.text(this.getPreferredValue('CATEGORIES', []).clean('').join(' / '));
|
2012-08-02 01:14:50 +02:00
|
|
|
}
|
2012-10-05 05:05:49 +02:00
|
|
|
}
|
|
|
|
this.saveProperty({name:'CATEGORIES', value:this.data.CATEGORIES[0].value.join(',') });
|
|
|
|
}
|
|
|
|
|
|
|
|
Contact.prototype.setCurrent = function(on) {
|
|
|
|
if(on) {
|
|
|
|
this.$listelem.addClass('active');
|
|
|
|
} else {
|
|
|
|
this.$listelem.removeClass('active');
|
|
|
|
}
|
|
|
|
$(document).trigger('status.contact.currentlistitem', {
|
|
|
|
id: this.id,
|
|
|
|
pos: Math.round(this.$listelem.position().top),
|
|
|
|
height: Math.round(this.$listelem.height()),
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
Contact.prototype.next = function() {
|
|
|
|
var $next = this.$listelem.next('tr');
|
|
|
|
if($next.length > 0) {
|
|
|
|
this.$listelem.removeClass('active');
|
|
|
|
$next.addClass('active');
|
|
|
|
$(document).trigger('status.contact.currentlistitem', {
|
|
|
|
id: parseInt($next.data('id')),
|
|
|
|
pos: Math.round($next.position().top),
|
|
|
|
height: Math.round($next.height()),
|
2012-05-10 20:43:40 +02:00
|
|
|
});
|
2012-10-05 05:05:49 +02:00
|
|
|
}
|
|
|
|
}
|
2012-05-10 20:43:40 +02:00
|
|
|
|
2012-10-05 05:05:49 +02:00
|
|
|
Contact.prototype.prev = function() {
|
|
|
|
var $prev = this.$listelem.prev('tr');
|
|
|
|
if($prev.length > 0) {
|
|
|
|
this.$listelem.removeClass('active');
|
|
|
|
$prev.addClass('active');
|
|
|
|
$(document).trigger('status.contact.currentlistitem', {
|
|
|
|
id: parseInt($prev.data('id')),
|
|
|
|
pos: Math.round($prev.position().top),
|
|
|
|
height: Math.round($prev.height()),
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
var ContactList = function(contactlist, contactlistitemtemplate, contactfulltemplate, contactdetailtemplates) {
|
|
|
|
//console.log('ContactList', contactlist, contactlistitemtemplate, contactfulltemplate, contactdetailtemplates);
|
|
|
|
var self = this;
|
|
|
|
this.length = 0;
|
|
|
|
this.contacts = {};
|
|
|
|
this.deletionQueue = [];
|
|
|
|
this.$contactList = contactlist;
|
|
|
|
this.$contactListItemTemplate = contactlistitemtemplate;
|
|
|
|
this.$contactFullTemplate = contactfulltemplate;
|
|
|
|
this.contactDetailTemplates = contactdetailtemplates;
|
|
|
|
this.$contactList.scrollTop(0);
|
|
|
|
this.loadContacts(0);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Show/hide contacts belonging to an addressbook.
|
|
|
|
* @param int aid. Addressbook id.
|
|
|
|
* @param boolean show. Whether to show or hide.
|
|
|
|
*/
|
|
|
|
ContactList.prototype.showFromAddressbook = function(aid, show) {
|
|
|
|
console.log('ContactList.showFromAddressbook', aid, show);
|
|
|
|
aid = parseInt(aid);
|
|
|
|
for(var contact in this.contacts) {
|
|
|
|
if(this.contacts[contact].access.aid === aid) {
|
|
|
|
if(show) {
|
|
|
|
this.contacts[contact].getListItemElement().show();
|
2012-08-02 01:14:50 +02:00
|
|
|
} else {
|
2012-10-05 05:05:49 +02:00
|
|
|
this.contacts[contact].getListItemElement().hide();
|
2012-08-02 01:14:50 +02:00
|
|
|
}
|
|
|
|
}
|
2012-10-05 05:05:49 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Show contacts in list
|
|
|
|
* @param Array contacts. A list of contact ids.
|
|
|
|
*/
|
|
|
|
ContactList.prototype.showContacts = function(contacts) {
|
|
|
|
for(var contact in this.contacts) {
|
|
|
|
if(contacts === 'all') {
|
|
|
|
this.contacts[contact].getListItemElement().show();
|
|
|
|
} else {
|
|
|
|
contact = parseInt(contact);
|
2012-10-19 22:09:59 +02:00
|
|
|
if(contacts.indexOf(contact) === -1) {
|
2012-10-05 05:05:49 +02:00
|
|
|
this.contacts[contact].getListItemElement().hide();
|
|
|
|
} else {
|
|
|
|
this.contacts[contact].getListItemElement().show();
|
2012-08-02 01:14:50 +02:00
|
|
|
}
|
|
|
|
}
|
2012-10-05 05:05:49 +02:00
|
|
|
}
|
|
|
|
}
|
2012-06-27 02:10:50 +02:00
|
|
|
|
2012-10-05 05:05:49 +02:00
|
|
|
ContactList.prototype.contactPos = function(id) {
|
|
|
|
if(!id) {
|
|
|
|
console.log('id missing');
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
var $elem = this.contacts[parseInt(id)].getListItemElement();
|
|
|
|
var pos = $elem.offset().top - this.$contactList.offset().top + this.$contactList.scrollTop();
|
|
|
|
console.log('pos', pos);
|
|
|
|
return pos;
|
|
|
|
}
|
|
|
|
|
|
|
|
ContactList.prototype.closeContact = function(id) {
|
|
|
|
this.contacts[parseInt(id)].close();
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Jumps to an element in the contact list
|
|
|
|
* @param number the number of the item starting with 0
|
|
|
|
*/
|
|
|
|
ContactList.prototype.jumpToContact = function(id) {
|
|
|
|
var pos = this.contactPos(id);
|
|
|
|
console.log('scrollTop', pos);
|
|
|
|
this.$contactList.scrollTop(pos);
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns a Contact object by searching for its id
|
|
|
|
* @param id the id of the node
|
|
|
|
* @return the Contact object or undefined if not found.
|
|
|
|
* FIXME: If continious loading is reintroduced this will have
|
|
|
|
* to load the requested contact.
|
|
|
|
*/
|
|
|
|
ContactList.prototype.findById = function(id) {
|
|
|
|
return this.contacts[parseInt(id)];
|
|
|
|
};
|
|
|
|
|
|
|
|
ContactList.prototype.warnNotDeleted = function(e) {
|
|
|
|
e = e || window.event;
|
|
|
|
var warn = t('contacts', 'Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted.');
|
|
|
|
if (e) {
|
|
|
|
e.returnValue = String(warn);
|
|
|
|
}
|
|
|
|
if(OC.Contacts.Contacts.deletionQueue.length > 0) {
|
|
|
|
// This is run almost instantly. It's just to allow us to
|
|
|
|
// show the warning. Only shows in Chrome afaik...
|
|
|
|
setTimeout(OC.Contacts.Contacts.deleteFilesInQueue, 1);
|
|
|
|
}
|
|
|
|
return warn;
|
|
|
|
}
|
|
|
|
|
|
|
|
ContactList.prototype.delayedDeleteContact = function(id) {
|
|
|
|
var self = this;
|
|
|
|
this.currentContact = null;
|
|
|
|
var listelem = this.contacts[parseInt(id)].detach();
|
|
|
|
self.$contactList.show();
|
|
|
|
this.deletionQueue.push(parseInt(id));
|
|
|
|
console.log('deletionQueue', this.deletionQueue, listelem);
|
|
|
|
if(!window.onbeforeunload) {
|
|
|
|
window.onbeforeunload = this.warnNotDeleted;
|
|
|
|
}
|
|
|
|
if(this.$contactList.find('tr:visible').length === 0) {
|
|
|
|
$(document).trigger('status.visiblecontacts');
|
|
|
|
}
|
|
|
|
OC.notify({
|
|
|
|
data:listelem,
|
|
|
|
message:t('contacts','Click to undo deletion of "') + listelem.find('td.name').text() + '"',
|
|
|
|
//timeout:5,
|
|
|
|
timeouthandler:function(listelem) {
|
|
|
|
console.log('timeout', listelem);
|
|
|
|
self.deleteContact(listelem.data('id'), true);
|
|
|
|
},
|
|
|
|
clickhandler:function(listelem) {
|
|
|
|
console.log('clickhandler', listelem);
|
|
|
|
self.insertContact(listelem);
|
|
|
|
OC.notify({message:t('contacts', 'Cancelled deletion of: "') + listelem.find('td.name').text() + '"'});
|
|
|
|
window.onbeforeunload = null;
|
2012-06-27 02:10:50 +02:00
|
|
|
}
|
2012-10-05 05:05:49 +02:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Delete a contact with this id
|
|
|
|
* @param id the id of the contact
|
|
|
|
*/
|
|
|
|
ContactList.prototype.deleteContact = function(id, removeFromQueue) {
|
|
|
|
var self = this;
|
|
|
|
var id = parseInt(id);
|
|
|
|
console.log('deletionQueue', this.deletionQueue);
|
|
|
|
// Local function to update queue.
|
|
|
|
var updateQueue = function(id, remove) {
|
|
|
|
if(remove) {
|
|
|
|
console.log('Removing', id, 'from deletionQueue');
|
|
|
|
OC.Contacts.Contacts.deletionQueue.splice(OC.Contacts.Contacts.deletionQueue.indexOf(parseInt(id)), 1);
|
|
|
|
}
|
|
|
|
if(OC.Contacts.Contacts.deletionQueue.length == 0) {
|
|
|
|
console.log('deletionQueue is empty');
|
|
|
|
window.onbeforeunload = null;
|
2012-08-02 01:14:50 +02:00
|
|
|
}
|
2012-10-05 05:05:49 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
if(OC.Contacts.Contacts.deletionQueue.indexOf(parseInt(id)) == -1 && removeFromQueue) {
|
|
|
|
console.log('Already deleted, returning');
|
|
|
|
updateQueue(id, removeFromQueue);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Let contact remove itself.
|
|
|
|
this.contacts[id].destroy(function(response) {
|
|
|
|
console.log('deleteContact', response);
|
|
|
|
if(response.status === 'success') {
|
|
|
|
delete self.contacts[parseInt(id)];
|
|
|
|
updateQueue(id, removeFromQueue);
|
|
|
|
self.$contactList.show();
|
|
|
|
$(document).trigger('status.contact.deleted', {
|
|
|
|
id: id,
|
|
|
|
});
|
|
|
|
self.length -= 1;
|
|
|
|
if(self.length === 0) {
|
|
|
|
$(document).trigger('status.nomorecontacts');
|
|
|
|
}
|
2012-08-02 01:14:50 +02:00
|
|
|
} else {
|
2012-10-05 05:05:49 +02:00
|
|
|
OC.notify({message:response.message});
|
2012-08-02 01:14:50 +02:00
|
|
|
}
|
2012-10-05 05:05:49 +02:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Opens the contact with this id in edit mode
|
|
|
|
* @param id the id of the contact
|
|
|
|
*/
|
|
|
|
ContactList.prototype.showContact = function(id) {
|
|
|
|
this.currentContact = parseInt(id);
|
|
|
|
console.log('Contacts.showContact', id, this.contacts[this.currentContact], this.contacts)
|
|
|
|
return this.contacts[this.currentContact].renderContact();
|
|
|
|
};
|
2012-07-22 14:58:57 +02:00
|
|
|
|
2012-10-05 05:05:49 +02:00
|
|
|
/**
|
|
|
|
* Toggle all checkboxes
|
|
|
|
*/
|
|
|
|
ContactList.prototype.toggleAll = function(toggler, togglees) {
|
|
|
|
var isChecked = $(toggler).is(':checked');
|
|
|
|
console.log('toggleAll', isChecked, self);
|
|
|
|
$.each(togglees, function( i, item ) {
|
|
|
|
item.checked = isChecked;
|
|
|
|
});
|
|
|
|
return isChecked;
|
|
|
|
};
|
2012-08-02 01:14:50 +02:00
|
|
|
|
2012-10-05 05:05:49 +02:00
|
|
|
/**
|
|
|
|
* Insert a rendered contact list item into the list
|
|
|
|
* @param contact jQuery object.
|
|
|
|
*/
|
|
|
|
ContactList.prototype.insertContact = function(contact) {
|
|
|
|
//console.log('insertContact', contact);
|
|
|
|
var name = contact.find('td.name').text().toLowerCase();
|
|
|
|
var added = false
|
|
|
|
this.$contactList.find('tr').each(function() {
|
|
|
|
if ($(this).find('td.name').text().toLowerCase().localeCompare(name) > 0) {
|
|
|
|
$(this).before(contact);
|
|
|
|
added = true;
|
2012-08-16 00:24:38 +02:00
|
|
|
return false;
|
|
|
|
}
|
2012-10-05 05:05:49 +02:00
|
|
|
});
|
|
|
|
if(!added) {
|
|
|
|
this.$contactList.append(contact);
|
2012-02-06 07:32:57 +01:00
|
|
|
}
|
2012-10-05 05:05:49 +02:00
|
|
|
return contact;
|
2012-02-06 07:32:57 +01:00
|
|
|
}
|
2012-10-05 05:05:49 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Add contact
|
|
|
|
* @param int offset
|
|
|
|
*/
|
|
|
|
ContactList.prototype.addContact = function() {
|
|
|
|
var contact = new Contact(
|
|
|
|
this,
|
|
|
|
null,
|
|
|
|
null,
|
|
|
|
null,
|
|
|
|
this.$contactListItemTemplate,
|
|
|
|
this.$contactFullTemplate,
|
|
|
|
this.contactDetailTemplates
|
|
|
|
);
|
|
|
|
if(this.currentContact) {
|
|
|
|
this.contacts[this.currentContact].close();
|
2012-05-03 11:11:26 +02:00
|
|
|
}
|
2012-10-05 05:05:49 +02:00
|
|
|
return contact.renderContact();
|
|
|
|
}
|
|
|
|
|
|
|
|
ContactList.prototype.getSelectedContacts = function() {
|
|
|
|
var contacts = [];
|
|
|
|
|
|
|
|
$.each(this.$contactList.find('tr > td > input:checkbox:visible:checked'), function(a, b) {
|
|
|
|
contacts.push(parseInt($(b).parents('tr').first().data('id')));
|
|
|
|
});
|
|
|
|
return contacts;
|
|
|
|
}
|
|
|
|
|
|
|
|
ContactList.prototype.setCurrent = function(id, deselect_other) {
|
|
|
|
self = this;
|
|
|
|
if(deselect_other === true) {
|
|
|
|
$.each(this.contacts, function(contact) {
|
|
|
|
self.contacts[contact].setCurrent(false);
|
2012-05-10 20:43:40 +02:00
|
|
|
});
|
|
|
|
}
|
2012-10-05 05:05:49 +02:00
|
|
|
this.contacts[parseInt(id)].setCurrent(true);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Should only be neccesary with progressive loading, but it's damn fast, so... ;)
|
|
|
|
ContactList.prototype.doSort = function() {
|
|
|
|
var self = this;
|
|
|
|
var rows = this.$contactList.find('tr').get();
|
2012-02-06 07:32:57 +01:00
|
|
|
|
2012-10-05 05:05:49 +02:00
|
|
|
rows.sort(function(a, b) {
|
|
|
|
return keyA = $(a).find('td.name').text().toUpperCase().localeCompare($(b).find('td.name').text().toUpperCase());
|
|
|
|
});
|
|
|
|
|
|
|
|
$.each(rows, function(index, row) {
|
|
|
|
self.$contactList.append(row);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Load contacts
|
|
|
|
* @param int offset
|
|
|
|
*/
|
|
|
|
ContactList.prototype.loadContacts = function(offset, cb) {
|
|
|
|
var self = this;
|
|
|
|
// Should the actual ajax call be in the controller?
|
|
|
|
$.getJSON(OC.filePath('contacts', 'ajax', 'contact/list.php'), {offset: offset}, function(jsondata) {
|
|
|
|
if (jsondata && jsondata.status == 'success') {
|
|
|
|
console.log('addressbooks', jsondata.data.addressbooks);
|
|
|
|
self.addressbooks = {};
|
|
|
|
$.each(jsondata.data.addressbooks, function(i, book) {
|
|
|
|
self.addressbooks[parseInt(book.id)] = {
|
|
|
|
owner: book.userid,
|
|
|
|
permissions: parseInt(book.permissions),
|
|
|
|
aid: parseInt(book.id),
|
|
|
|
};
|
|
|
|
});
|
|
|
|
$.each(jsondata.data.contacts, function(c, contact) {
|
|
|
|
self.contacts[parseInt(contact.id)]
|
|
|
|
= new Contact(
|
|
|
|
self,
|
|
|
|
contact.id,
|
|
|
|
self.addressbooks[parseInt(contact.aid)],
|
|
|
|
contact.data,
|
|
|
|
self.$contactListItemTemplate,
|
|
|
|
self.$contactFullTemplate,
|
|
|
|
self.contactDetailTemplates
|
|
|
|
);
|
|
|
|
self.length +=1;
|
|
|
|
var item = self.contacts[parseInt(contact.id)].renderListItem()
|
|
|
|
self.$contactList.append(item);
|
|
|
|
//self.insertContact(item);
|
|
|
|
});
|
|
|
|
self.doSort();
|
|
|
|
$(document).trigger('status.contacts.loaded', {
|
|
|
|
status: true,
|
|
|
|
numcontacts: jsondata.data.contacts.length
|
|
|
|
});
|
|
|
|
self.setCurrent(self.$contactList.find('tr:first-child').data('id'), false);
|
2012-07-15 20:45:54 +02:00
|
|
|
}
|
2012-10-05 05:05:49 +02:00
|
|
|
if(typeof cb === 'function') {
|
|
|
|
cb();
|
2012-07-15 20:45:54 +02:00
|
|
|
}
|
2012-10-05 05:05:49 +02:00
|
|
|
});
|
2012-07-15 04:15:57 +02:00
|
|
|
}
|
2012-10-05 05:05:49 +02:00
|
|
|
OC.Contacts.ContactList = ContactList;
|
2012-07-21 14:26:26 +02:00
|
|
|
|
2012-10-05 05:05:49 +02:00
|
|
|
})( jQuery );
|