| /* |
| Licensed 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. |
| */ |
| |
| if (!Cordova.hasResource("contact")) { |
| Cordova.addResource("contact"); |
| |
| /** |
| * Contains information about a single contact. |
| * @constructor |
| * @param {DOMString} id unique identifier |
| * @param {DOMString} displayName |
| * @param {ContactName} name |
| * @param {DOMString} nickname |
| * @param {Array.<ContactField>} phoneNumbers array of phone numbers |
| * @param {Array.<ContactField>} emails array of email addresses |
| * @param {Array.<ContactAddress>} addresses array of addresses |
| * @param {Array.<ContactField>} ims instant messaging user ids |
| * @param {Array.<ContactOrganization>} organizations |
| * @param {DOMString} birthday contact's birthday |
| * @param {DOMString} note user notes about contact |
| * @param {Array.<ContactField>} photos |
| * @param {Array.<ContactField>} categories |
| * @param {Array.<ContactField>} urls contact's web sites |
| */ |
| var Contact = function (id, displayName, name, nickname, phoneNumbers, emails, addresses, |
| ims, organizations, birthday, note, photos, categories, urls) { |
| this.id = id || null; |
| this.rawId = null; |
| this.displayName = displayName || null; |
| this.name = name || null; // ContactName |
| this.nickname = nickname || null; |
| this.phoneNumbers = phoneNumbers || null; // ContactField[] |
| this.emails = emails || null; // ContactField[] |
| this.addresses = addresses || null; // ContactAddress[] |
| this.ims = ims || null; // ContactField[] |
| this.organizations = organizations || null; // ContactOrganization[] |
| this.birthday = birthday || null; |
| this.note = note || null; |
| this.photos = photos || null; // ContactField[] |
| this.categories = categories || null; // ContactField[] |
| this.urls = urls || null; // ContactField[] |
| }; |
| |
| /** |
| * ContactError. |
| * An error code assigned by an implementation when an error has occurreds |
| * @constructor |
| */ |
| var ContactError = function(errCode) { |
| this.code=errCode; |
| }; |
| |
| /** |
| * Error codes |
| */ |
| ContactError.UNKNOWN_ERROR = 0; |
| ContactError.INVALID_ARGUMENT_ERROR = 1; |
| ContactError.TIMEOUT_ERROR = 2; |
| ContactError.PENDING_OPERATION_ERROR = 3; |
| ContactError.IO_ERROR = 4; |
| ContactError.NOT_SUPPORTED_ERROR = 5; |
| ContactError.PERMISSION_DENIED_ERROR = 20; |
| |
| /** |
| * Removes contact from device storage. |
| * @param successCB success callback |
| * @param errorCB error callback |
| */ |
| Contact.prototype.remove = function(successCB, errorCB) |
| { |
| if (!this.id) |
| { |
| var errorObj = new ContactError(ContactError.UNKNOWN_ERROR); |
| setTimeout(function(){ |
| errorCB(errorObj); |
| },0); |
| return ContactError.UNKNOWN_ERROR; |
| } |
| else |
| { |
| Cordova.exec(successCB, errorCB, "Contacts", "remove",this.id); |
| } |
| }; |
| |
| /** |
| * Creates a deep copy of this Contact. |
| * With the contact ID set to null. |
| * @return copy of this Contact |
| */ |
| Contact.prototype.clone = function() { |
| var clonedContact = Cordova.safeClone(this); |
| var i; |
| clonedContact.id = null; |
| clonedContact.rawId = null; |
| // Loop through and clear out any id's in phones, emails, etc. |
| var myArrayProps = ["phoneNumbers","emails","addresses","ims","organizations","tags","photos","urls"]; |
| |
| for(var n=0, pLen=myArrayProps.length;n < pLen; n++) |
| { |
| var arr = clonedContact[myArrayProps[n]]; |
| if (arr && arr.length) |
| { |
| for(var i=0,len=arr.length; i<len;i++) |
| { |
| arr[i].id = null; |
| } |
| } |
| } |
| return clonedContact; |
| }; |
| |
| /** |
| * Persists contact to device storage. |
| * @param successCB success callback |
| * @param errorCB error callback |
| */ |
| Contact.prototype.save = function(successCB, errorCB) |
| { |
| var self = this; |
| function onSuccess(res) |
| { |
| setTimeout(function() |
| { |
| successCB(self); |
| },0); |
| } |
| Cordova.exec(onSuccess, errorCB, "Contacts", "save", this); |
| }; |
| |
| /** |
| * Contact name. |
| * @constructor |
| * @param formatted |
| * @param familyName |
| * @param givenName |
| * @param middle |
| * @param prefix |
| * @param suffix |
| */ |
| var ContactName = function(formatted, familyName, givenName, middle, prefix, suffix) { |
| this.formatted = formatted || null; |
| this.familyName = familyName || null; |
| this.givenName = givenName || null; |
| this.middleName = middle || null; |
| this.honorificPrefix = prefix || null; |
| this.honorificSuffix = suffix || null; |
| }; |
| |
| /** |
| * Generic contact field. |
| * @constructor |
| * @param {DOMString} id unique identifier, should only be set by native code |
| * @param type |
| * @param value |
| * @param pref |
| */ |
| var ContactField = function(type, value, pref) { |
| this.id = null; |
| this.type = type || null; |
| this.value = value || null; |
| this.pref = pref || null; |
| }; |
| |
| /** |
| * Contact address. |
| * @constructor |
| * @param {DOMString} id unique identifier, should only be set by native code |
| * @param formatted |
| * @param streetAddress |
| * @param locality |
| * @param region |
| * @param postalCode |
| * @param country |
| */ |
| var ContactAddress = function(pref, type, formatted, streetAddress, locality, region, postalCode, country) { |
| this.id = null; |
| this.pref = pref || null; |
| this.type = type || null; |
| this.formatted = formatted || null; |
| this.streetAddress = streetAddress || null; |
| this.locality = locality || null; |
| this.region = region || null; |
| this.postalCode = postalCode || null; |
| this.country = country || null; |
| }; |
| |
| /** |
| * Contact organization. |
| * @constructor |
| * @param {DOMString} id unique identifier, should only be set by native code |
| * @param name |
| * @param dept |
| * @param title |
| * @param startDate |
| * @param endDate |
| * @param location |
| * @param desc |
| */ |
| var ContactOrganization = function(pref, type, name, dept, title) { |
| this.id = null; |
| this.pref = pref || null; |
| this.type = type || null; |
| this.name = name || null; |
| this.department = dept || null; |
| this.title = title || null; |
| }; |
| |
| /** |
| * Represents a group of Contacts. |
| * @constructor |
| */ |
| var Contacts = function() { |
| this.inProgress = false; |
| this.records = []; |
| }; |
| /** |
| * Returns an array of Contacts matching the search criteria. |
| * @param fields that should be searched |
| * @param successCB success callback |
| * @param errorCB error callback |
| * @param {ContactFindOptions} options that can be applied to contact searching |
| * @return array of Contacts matching search criteria |
| */ |
| Contacts.prototype.find = function(fields, successCB, errorCB, options) { |
| if (successCB === null) { |
| throw new TypeError("You must specify a success callback for the find command."); |
| } |
| if (fields === null || fields === "undefined" || fields.length === "undefined" || fields.length <= 0) { |
| if (typeof errorCB === "function") |
| { |
| // escape this scope before we call the errorCB |
| setTimeout(function() { |
| errorCB({"code": ContactError.INVALID_ARGUMENT_ERROR}); |
| },0); |
| } |
| console.log("Contacts.find::ContactError::INVALID_ARGUMENT_ERROR"); |
| } |
| else |
| { |
| var onSuccess = function(res) |
| { |
| setTimeout(function() |
| { |
| successCB(res); |
| },0); |
| } |
| Cordova.exec(onSuccess, errorCB, "Contacts", "search", {"fields":fields,"options":options}); |
| } |
| }; |
| |
| /** |
| * This function creates a new contact, but it does not persist the contact |
| * to device storage. To persist the contact to device storage, invoke |
| * contact.save(). |
| * @param properties an object who's properties will be examined to create a new Contact |
| * @returns new Contact object |
| */ |
| Contacts.prototype.create = function(properties) { |
| var i; |
| var contact = new Contact(); |
| for (i in properties) { |
| if (contact[i] !== 'undefined') { |
| contact[i] = properties[i]; |
| } |
| } |
| return contact; |
| }; |
| |
| /** |
| * This function returns and array of contacts. It is required as we need to convert raw |
| * JSON objects into concrete Contact objects. Currently this method is called after |
| * navigator.contacts.find but before the find methods success call back. |
| * |
| * @param jsonArray an array of JSON Objects that need to be converted to Contact objects. |
| * @returns an array of Contact objects |
| */ |
| Contacts.prototype.cast = function(pluginResult) { |
| var contacts = []; |
| var i; |
| for (i=0; i<pluginResult.message.length; i++) { |
| contacts.push(navigator.contacts.create(pluginResult.message[i])); |
| } |
| pluginResult.message = contacts; |
| return pluginResult; |
| }; |
| |
| /** |
| * ContactFindOptions. |
| * @constructor |
| * @param filter used to match contacts against |
| * @param multiple boolean used to determine if more than one contact should be returned |
| */ |
| var ContactFindOptions = function(filter, multiple) { |
| this.filter = filter || ''; |
| this.multiple = multiple || false; |
| }; |
| |
| /** |
| * Add the contact interface into the browser. |
| */ |
| Cordova.onCordovaInit.subscribeOnce(function() { |
| if(typeof navigator.contacts === "undefined") { |
| navigator.contacts = new Contacts(); |
| } |
| }); |
| } |