blob: e1f7d67ace16811dbd53a1d551f1eb8145a57357 [file] [log] [blame]
/*
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
var self,
ContactFindOptions = require("./ContactFindOptions"),
ContactError = require("./ContactError"),
ContactName = require("./ContactName"),
ContactOrganization = require("./ContactOrganization"),
ContactAddress = require("./ContactAddress"),
ContactField = require("./ContactField"),
contactConsts = require("./contactConsts"),
ContactPhoto = require("./ContactPhoto"),
ContactNews = require("./ContactNews"),
ContactActivity = require("./ContactActivity");
function populateFieldArray(contactProps, field, ClassName) {
if (contactProps[field]) {
var list = [],
obj;
contactProps[field].forEach(function (args) {
if (ClassName === ContactField) {
list.push(new ClassName(args.type, args.value));
} else if (ClassName === ContactPhoto) {
obj = new ContactPhoto(args.originalFilePath, args.pref);
obj.largeFilePath = args.largeFilePath;
obj.smallFilePath = args.smallFilePath;
list.push(obj);
} else if (ClassName === ContactNews) {
obj = new ContactNews(args);
list.push(obj);
} else if (ClassName === ContactActivity) {
obj = new ContactActivity(args);
list.push(obj);
} else {
list.push(new ClassName(args));
}
});
contactProps[field] = list;
}
}
function populateDate(contactProps, field) {
if (contactProps[field]) {
contactProps[field] = new Date(contactProps[field]);
}
}
function validateFindArguments(findOptions) {
var error = false;
// findOptions is mandatory
if (!findOptions) {
error = true;
} else {
// findOptions.filter is optional
if (findOptions.filter) {
findOptions.filter.forEach(function (f) {
switch (f.fieldName) {
case ContactFindOptions.SEARCH_FIELD_GIVEN_NAME:
case ContactFindOptions.SEARCH_FIELD_FAMILY_NAME:
case ContactFindOptions.SEARCH_FIELD_ORGANIZATION_NAME:
case ContactFindOptions.SEARCH_FIELD_PHONE:
case ContactFindOptions.SEARCH_FIELD_EMAIL:
case ContactFindOptions.SEARCH_FIELD_BBMPIN:
case ContactFindOptions.SEARCH_FIELD_LINKEDIN:
case ContactFindOptions.SEARCH_FIELD_TWITTER:
case ContactFindOptions.SEARCH_FIELD_VIDEO_CHAT:
break;
default:
error = true;
}
if (!f.fieldValue) {
error = true;
}
});
}
//findOptions.limit is optional
if (findOptions.limit) {
if (typeof findOptions.limit !== "number") {
error = true;
}
}
//findOptions.favorite is optional
if (findOptions.favorite) {
if (typeof findOptions.favorite !== "boolean") {
error = true;
}
}
// findOptions.sort is optional
if (!error && findOptions.sort && Array.isArray(findOptions.sort)) {
findOptions.sort.forEach(function (s) {
switch (s.fieldName) {
case ContactFindOptions.SORT_FIELD_GIVEN_NAME:
case ContactFindOptions.SORT_FIELD_FAMILY_NAME:
case ContactFindOptions.SORT_FIELD_ORGANIZATION_NAME:
break;
default:
error = true;
}
if (s.desc === undefined || typeof s.desc !== "boolean") {
error = true;
}
});
}
if (!error && findOptions.includeAccounts) {
if (!Array.isArray(findOptions.includeAccounts)) {
error = true;
} else {
findOptions.includeAccounts.forEach(function (acct) {
if (!error && (!acct.id || window.isNaN(window.parseInt(acct.id, 10)))) {
error = true;
}
});
}
}
if (!error && findOptions.excludeAccounts) {
if (!Array.isArray(findOptions.excludeAccounts)) {
error = true;
} else {
findOptions.excludeAccounts.forEach(function (acct) {
if (!error && (!acct.id || window.isNaN(window.parseInt(acct.id, 10)))) {
error = true;
}
});
}
}
}
return !error;
}
function validateContactsPickerFilter(filter) {
var isValid = true,
availableFields = {};
if (typeof(filter) === "undefined") {
isValid = false;
} else {
if (filter && Array.isArray(filter)) {
availableFields = contactConsts.getKindAttributeMap();
filter.forEach(function (e) {
isValid = isValid && Object.getOwnPropertyNames(availableFields).reduce(
function (found, key) {
return found || availableFields[key] === e;
}, false);
});
}
}
return isValid;
}
function validateContactsPickerOptions(options) {
var isValid = false,
mode = options.mode;
if (typeof(options) === "undefined") {
isValid = false;
} else {
isValid = mode === ContactPickerOptions.MODE_SINGLE || mode === ContactPickerOptions.MODE_MULTIPLE || mode === ContactPickerOptions.MODE_ATTRIBUTE;
// if mode is attribute, fields must be defined
if (mode === ContactPickerOptions.MODE_ATTRIBUTE && !validateContactsPickerFilter(options.fields)) {
isValid = false;
}
}
return isValid;
}
self = module.exports = {
populateContact: function (contact) {
if (contact.name) {
contact.name = new ContactName(contact.name);
}
populateFieldArray(contact, "addresses", ContactAddress);
populateFieldArray(contact, "organizations", ContactOrganization);
populateFieldArray(contact, "emails", ContactField);
populateFieldArray(contact, "phoneNumbers", ContactField);
populateFieldArray(contact, "faxNumbers", ContactField);
populateFieldArray(contact, "pagerNumbers", ContactField);
populateFieldArray(contact, "ims", ContactField);
populateFieldArray(contact, "socialNetworks", ContactField);
populateFieldArray(contact, "urls", ContactField);
populateFieldArray(contact, "photos", ContactPhoto);
populateFieldArray(contact, "news", ContactNews);
populateFieldArray(contact, "activities", ContactActivity);
// TODO categories
populateDate(contact, "birthday");
populateDate(contact, "anniversary");
},
invokeErrorCallback: function (errorCallback, code) {
if (errorCallback) {
errorCallback(new ContactError(code));
}
},
validateFindArguments: validateFindArguments,
validateContactsPickerFilter: validateContactsPickerFilter,
validateContactsPickerOptions: validateContactsPickerOptions
};