Merge branch 'tizen_4.0' into tizen_5.0
[platform/core/api/webapi-plugins.git] / src / contact / js / contact.js
index af317de..dcdd7de 100755 (executable)
  */
 
 var Contact = function(data) {
-  validator_.isConstructorCall(this, Contact);
-
-  var _forceEditMode = false;
-  if (type_.isString(data)) {
-    var result = native_.callSync('ContactManager_importFromVCard', {
-      'contact': data
-    });
-    _checkError(result);
-
-    data = native_.getResultObject(result);
-    // These need to be forced to null as a contact created from a vcard is not added
-    // to any address book
-    data.id = null;
-    data.personId = null;
-    data.addressBookId = null;
-    data.lastUpdate = null;
-
-    // Force edit mode so that anonymous objects can be promoted to their correct types.
-    _forceEditMode = true;
-  } else if (type_.isObject(data) || type_.isFunction(data)) {
-    // It's a dictionary
-  } else {
-    // null or invalid types.
-    data = {};
-  }
-
-  var _id = null;
-  var _personId = null;
-  var _addressBookId = null;
-  var _lastUpdate = null;
-  var _isFavorite = false;
-  var _name = null;
-  var _addresses = [];
-  var _photoURI = null;
-  var _phoneNumbers = [];
-  var _emails = [];
-  var _messengers = [];
-  var _relationships = [];
-  var _extensions = [];
-  var _birthday = null;
-  var _anniversaries = [];
-  var _organizations = [];
-  var _notes = [];
-  var _urls = [];
-  var _ringtoneURI = null;
-  var _messageAlertURI = null;
-  var _vibrationURI = null;
-  var _groupIds = [];
-
-  var _sanitizeArray = function(arr, type, previousValue) {
-    if (!type_.isArray(arr)) {
-      return previousValue;
-    }
-    for (var i = 0; i < arr.length; ++i) {
-      if (type_.isString(type)) {
-        arr[i] = converter_.toString(arr[i]);
-      } else if (_editGuard.isEditEnabled()) {
-        arr[i] = new type(arr[i]);
-      } else if (!(arr[i] instanceof type)) {
-        return previousValue;
-      }
+    validator_.isConstructorCall(this, Contact);
+
+    var _forceEditMode = false;
+    if (type_.isString(data)) {
+        var result = native_.callSync('ContactManager_importFromVCard', {
+            contact: data
+        });
+        _checkError(result);
+
+        data = native_.getResultObject(result);
+        // These need to be forced to null as a contact created from a vcard is not added
+        // to any address book
+        data.id = null;
+        data.personId = null;
+        data.addressBookId = null;
+        data.lastUpdate = null;
+
+        // Force edit mode so that anonymous objects can be promoted to their
+        // correct types.
+        _forceEditMode = true;
+    } else if (type_.isObject(data) || type_.isFunction(data)) {
+        // It's a dictionary
+    } else {
+        // null or invalid types.
+        data = {};
     }
-    return arr;
-  };
-
-  Object.defineProperties(this, {
-    id: {
-      get: function() {
-        return _id;
-      },
-      set: function(v) {
-        if (_editGuard.isEditEnabled()) {
-          _id = converter_.toString(v, false);
-        }
-      },
-      enumerable: true
-    },
-    personId: {
-      get: function() {
-        return _personId;
-      },
-      set: function(v) {
-        if (_editGuard.isEditEnabled()) {
-          _personId = converter_.toString(v, false);
-        }
-      },
-      enumerable: true
-    },
-    addressBookId: {
-      get: function() {
-        return _addressBookId;
-      },
-      set: function(v) {
-        if (_editGuard.isEditEnabled()) {
-          _addressBookId = converter_.toString(v, false);
-        }
-      },
-      enumerable: true
-    },
-    lastUpdated: {
-      get: function() {
-        return _lastUpdate;
-      },
-      set: function(v) {
-        if (_editGuard.isEditEnabled()) {
-          if (v instanceof Date || v === null) {
-            _lastUpdate = v;
-          } else if (type_.isString(v)) {
-            _lastUpdate = new Date(v);
-          } else {
-            _lastUpdate = _fromJsonDate(v);
-          }
-        }
-      },
-      enumerable: true
-    },
-    isFavorite: {
-      get: function() {
-        return _isFavorite;
-      },
-      set: function(v) {
-        if (_editGuard.isEditEnabled()) {
-          _isFavorite = converter_.toBoolean(v, false);
+
+    var _id = null;
+    var _personId = null;
+    var _addressBookId = null;
+    var _lastUpdate = null;
+    var _isFavorite = false;
+    var _name = null;
+    var _addresses = [];
+    var _photoURI = null;
+    var _phoneNumbers = [];
+    var _emails = [];
+    var _messengers = [];
+    var _relationships = [];
+    var _extensions = [];
+    var _birthday = null;
+    var _anniversaries = [];
+    var _organizations = [];
+    var _notes = [];
+    var _urls = [];
+    var _ringtoneURI = null;
+    var _messageAlertURI = null;
+    var _vibrationURI = null;
+    var _groupIds = [];
+
+    var _sanitizeArray = function(arr, type, previousValue) {
+        if (!type_.isArray(arr)) {
+            return previousValue;
         }
-      },
-      enumerable: true
-    },
-    name: {
-      get: function() {
-        return _name;
-      },
-      set: function(v) {
-        if (_editGuard.isEditEnabled()) {
-          _name = new ContactName(v);
-        } else {
-          _name = (v instanceof ContactName || v === null) ? v : _name;
+        for (var i = 0; i < arr.length; ++i) {
+            if (type_.isString(type)) {
+                arr[i] = converter_.toString(arr[i]);
+            } else if (_editGuard.isEditEnabled()) {
+                arr[i] = new type(arr[i]);
+            } else if (!(arr[i] instanceof type)) {
+                return previousValue;
+            }
         }
-      },
-      enumerable: true
-    },
-    addresses: {
-      get: function() {
-        return _addresses;
-      },
-      set: function(v) {
-        _addresses = _sanitizeArray(v, ContactAddress, _addresses);
-      },
-      enumerable: true
-    },
-    photoURI: {
-      get: function() {
-        return _photoURI;
-      },
-      set: function(v) {
-        _photoURI = converter_.toString(v, true);
-      },
-      enumerable: true
-    },
-    phoneNumbers: {
-      get: function() {
-        return _phoneNumbers;
-      },
-      set: function(v) {
-        _phoneNumbers = _sanitizeArray(v, ContactPhoneNumber, _phoneNumbers);
-      },
-      enumerable: true
-    },
-    emails: {
-      get: function() {
-        return _emails;
-      },
-      set: function(v) {
-        _emails = _sanitizeArray(v, ContactEmailAddress, _emails);
-      },
-      enumerable: true
-    },
-    messengers: {
-      get: function() {
-        return _messengers;
-      },
-      set: function(v) {
-        _messengers = _sanitizeArray(v, ContactInstantMessenger, _messengers);
-      },
-      enumerable: true
-    },
-    relationships: {
-      get: function() {
-        return _relationships;
-      },
-      set: function(v) {
-        _relationships = _sanitizeArray(v, ContactRelationship, _relationships);
-      },
-      enumerable: true
-    },
-    extensions: {
-      get: function() {
-        return _extensions;
-      },
-      set: function(v) {
-        _extensions = _sanitizeArray(v, ContactExtension, _extensions);
-      },
-      enumerable: true
-    },
-    birthday: {
-      get: function() {
-        return _birthday;
-      },
-      set: function(v) {
-        if (v instanceof Date || v === null) {
-          _birthday = v;
-        } else if (type_.isString(v)) {
-          _birthday = new Date(v);
-        } else if (_editGuard.isEditEnabled()) {
-          _birthday = _fromJsonDate(v);
+        return arr;
+    };
+
+    Object.defineProperties(this, {
+        id: {
+            get: function() {
+                return _id;
+            },
+            set: function(v) {
+                if (_editGuard.isEditEnabled()) {
+                    _id = converter_.toString(v, false);
+                }
+            },
+            enumerable: true
+        },
+        personId: {
+            get: function() {
+                return _personId;
+            },
+            set: function(v) {
+                if (_editGuard.isEditEnabled()) {
+                    _personId = converter_.toString(v, false);
+                }
+            },
+            enumerable: true
+        },
+        addressBookId: {
+            get: function() {
+                return _addressBookId;
+            },
+            set: function(v) {
+                if (_editGuard.isEditEnabled()) {
+                    _addressBookId = converter_.toString(v, false);
+                }
+            },
+            enumerable: true
+        },
+        lastUpdated: {
+            get: function() {
+                return _lastUpdate;
+            },
+            set: function(v) {
+                if (_editGuard.isEditEnabled()) {
+                    if (v instanceof Date || v === null) {
+                        _lastUpdate = v;
+                    } else if (type_.isString(v)) {
+                        _lastUpdate = new Date(v);
+                    } else {
+                        _lastUpdate = _fromJsonDate(v);
+                    }
+                }
+            },
+            enumerable: true
+        },
+        isFavorite: {
+            get: function() {
+                return _isFavorite;
+            },
+            set: function(v) {
+                if (_editGuard.isEditEnabled()) {
+                    _isFavorite = converter_.toBoolean(v, false);
+                }
+            },
+            enumerable: true
+        },
+        name: {
+            get: function() {
+                return _name;
+            },
+            set: function(v) {
+                if (_editGuard.isEditEnabled()) {
+                    _name = new ContactName(v);
+                } else {
+                    _name = v instanceof ContactName || v === null ? v : _name;
+                }
+            },
+            enumerable: true
+        },
+        addresses: {
+            get: function() {
+                return _addresses;
+            },
+            set: function(v) {
+                _addresses = _sanitizeArray(v, ContactAddress, _addresses);
+            },
+            enumerable: true
+        },
+        photoURI: {
+            get: function() {
+                return _photoURI;
+            },
+            set: function(v) {
+                _photoURI = converter_.toString(v, true);
+            },
+            enumerable: true
+        },
+        phoneNumbers: {
+            get: function() {
+                return _phoneNumbers;
+            },
+            set: function(v) {
+                _phoneNumbers = _sanitizeArray(v, ContactPhoneNumber, _phoneNumbers);
+            },
+            enumerable: true
+        },
+        emails: {
+            get: function() {
+                return _emails;
+            },
+            set: function(v) {
+                _emails = _sanitizeArray(v, ContactEmailAddress, _emails);
+            },
+            enumerable: true
+        },
+        messengers: {
+            get: function() {
+                return _messengers;
+            },
+            set: function(v) {
+                _messengers = _sanitizeArray(v, ContactInstantMessenger, _messengers);
+            },
+            enumerable: true
+        },
+        relationships: {
+            get: function() {
+                return _relationships;
+            },
+            set: function(v) {
+                _relationships = _sanitizeArray(v, ContactRelationship, _relationships);
+            },
+            enumerable: true
+        },
+        extensions: {
+            get: function() {
+                return _extensions;
+            },
+            set: function(v) {
+                _extensions = _sanitizeArray(v, ContactExtension, _extensions);
+            },
+            enumerable: true
+        },
+        birthday: {
+            get: function() {
+                return _birthday;
+            },
+            set: function(v) {
+                if (v instanceof Date || v === null) {
+                    _birthday = v;
+                } else if (type_.isString(v)) {
+                    _birthday = new Date(v);
+                } else if (_editGuard.isEditEnabled()) {
+                    _birthday = _fromJsonDate(v);
+                }
+            },
+            enumerable: true
+        },
+        anniversaries: {
+            get: function() {
+                return _anniversaries;
+            },
+            set: function(v) {
+                _anniversaries = _sanitizeArray(v, ContactAnniversary, _anniversaries);
+            },
+            enumerable: true
+        },
+        organizations: {
+            get: function() {
+                return _organizations;
+            },
+            set: function(v) {
+                _organizations = _sanitizeArray(v, ContactOrganization, _organizations);
+            },
+            enumerable: true
+        },
+        notes: {
+            get: function() {
+                return _notes;
+            },
+            set: function(v) {
+                _notes = _sanitizeArray(v, '', _notes);
+            },
+            enumerable: true
+        },
+        urls: {
+            get: function() {
+                return _urls;
+            },
+            set: function(v) {
+                _urls = _sanitizeArray(v, ContactWebSite, _urls);
+            },
+            enumerable: true
+        },
+        ringtoneURI: {
+            get: function() {
+                return _ringtoneURI;
+            },
+            set: function(v) {
+                _ringtoneURI = converter_.toString(v, true);
+            },
+            enumerable: true
+        },
+        messageAlertURI: {
+            get: function() {
+                return _messageAlertURI;
+            },
+            set: function(v) {
+                _messageAlertURI = converter_.toString(v, true);
+            },
+            enumerable: true
+        },
+        vibrationURI: {
+            get: function() {
+                return _vibrationURI;
+            },
+            set: function(v) {
+                _vibrationURI = converter_.toString(v, true);
+            },
+            enumerable: true
+        },
+        groupIds: {
+            get: function() {
+                return _groupIds;
+            },
+            set: function(v) {
+                _groupIds = _sanitizeArray(v, '', _groupIds);
+            },
+            enumerable: true
         }
-      },
-      enumerable: true
-    },
-    anniversaries: {
-      get: function() {
-        return _anniversaries;
-      },
-      set: function(v) {
-        _anniversaries = _sanitizeArray(v, ContactAnniversary, _anniversaries);
-      },
-      enumerable: true
-    },
-    organizations: {
-      get: function() {
-        return _organizations;
-      },
-      set: function(v) {
-        _organizations = _sanitizeArray(v, ContactOrganization, _organizations);
-      },
-      enumerable: true
-    },
-    notes: {
-      get: function() {
-        return _notes;
-      },
-      set: function(v) {
-        _notes = _sanitizeArray(v, '', _notes);
-      },
-      enumerable: true
-    },
-    urls: {
-      get: function() {
-        return _urls;
-      },
-      set: function(v) {
-        _urls = _sanitizeArray(v, ContactWebSite, _urls);
-      },
-      enumerable: true
-    },
-    ringtoneURI: {
-      get: function() {
-        return _ringtoneURI;
-      },
-      set: function(v) {
-        _ringtoneURI = converter_.toString(v, true);
-      },
-      enumerable: true
-    },
-    messageAlertURI: {
-      get: function() {
-        return _messageAlertURI;
-      },
-      set: function(v) {
-        _messageAlertURI = converter_.toString(v, true);
-      },
-      enumerable: true
-    },
-    vibrationURI: {
-      get: function() {
-        return _vibrationURI;
-      },
-      set: function(v) {
-        _vibrationURI = converter_.toString(v, true);
-      },
-      enumerable: true
-    },
-    groupIds: {
-      get: function() {
-        return _groupIds;
-      },
-      set: function(v) {
-        _groupIds = _sanitizeArray(v, '', _groupIds);
-      },
-      enumerable: true
-    }
-  });
-
-  var _this = this;
-  var _setProperties = function() {
-    for (var p in _this) {
-      if (data.hasOwnProperty(p)) {
-        _this[p] = data[p];
-      }
-    }
-  };
+    });
 
-  if (_forceEditMode) {
-    _editGuard.run(_setProperties);
-  } else {
-    _setProperties();
-  }
+    var _this = this;
+    var _setProperties = function() {
+        for (var p in _this) {
+            if (data.hasOwnProperty(p)) {
+                _this[p] = data[p];
+            }
+        }
+    };
 
+    if (_forceEditMode) {
+        _editGuard.run(_setProperties);
+    } else {
+        _setProperties();
+    }
 };
 
 // Auxiliary functions /////////////////////////////////////////////////////
 
 // Convert address from Contact object to string
 var _contactAddressToString = function(obj) {
-  var str = '';
-  if (obj.addresses.length === 0) {
-    return '';
-  }
-  // Sorry for so many if statements, but the IDE makes me do it
-  for (var it in obj.addresses) {
-    if (!it instanceof ContactAddress) {
-      continue;
-    }
-    str += 'ADR;';
-    for (var addType in it.types) {
-      if (type_.isString(addType)) {
-        str += addType + ',';
-      }
+    var str = '';
+    if (obj.addresses.length === 0) {
+        return '';
     }
-    if (str.charAt(str.length - 1) === ',') {
-      str[str.length - 1] = ':';
+    // Sorry for so many if statements, but the IDE makes me do it
+    for (var it in obj.addresses) {
+        if (!it instanceof ContactAddress) {
+            continue;
+        }
+        str += 'ADR;';
+        for (var addType in it.types) {
+            if (type_.isString(addType)) {
+                str += addType + ',';
+            }
+        }
+        if (str.charAt(str.length - 1) === ',') {
+            str[str.length - 1] = ':';
+        }
+        str += ';'; // because of we don't keep Post office addres
+        // which is part of vCard 3.0 standard
+        str += it.additionalInformation + ';';
+        str += it.streetAddress + ';';
+        str += it.city + ';';
+        str += it.region + ';';
+        str += it.postalCode + ';';
+        str += it.country + ';';
+        str += '\n';
     }
-    str += ';'; // because of we don't keep Post office addres
-    // which is part of vCard 3.0 standard
-    str += it.additionalInformation + ';';
-    str += it.streetAddress + ';';
-    str += it.city + ';';
-    str += it.region + ';';
-    str += it.postalCode + ';';
-    str += it.country + ';';
-    str += '\n';
-  }
-  return str;
+    return str;
 };
 
 // Convert email address from Contact object to string
 var _contactEmailToString = function(obj) {
-  if (!type_.isArray(obj.emails) || obj.emails.length === 0) {
-    utils_.log('Empty email list');
-    return '';
-  }
-  var str = '';
-  for (var mail in obj.emails) {
-    if (!mail instanceof ContactEmailAddress || !type_.isArray(mail.types) ||
-      mail.types.length === 0) {
-      utils_.log('Incorrect email type');
-      continue;
-    }
-    str += 'EMAIL;';
-    // set types
-    for (var type in mail.types) {
-      if (type_.isString(type)) {
-        str += type + ',';
-      }
+    if (!type_.isArray(obj.emails) || obj.emails.length === 0) {
+        utils_.log('Empty email list');
+        return '';
     }
-    if (str.charAt(str.length - 1) === ',') {
-      str[str.length - 1] = ':';
+    var str = '';
+    for (var mail in obj.emails) {
+        if (
+            !mail instanceof ContactEmailAddress ||
+            !type_.isArray(mail.types) ||
+            mail.types.length === 0
+        ) {
+            utils_.log('Incorrect email type');
+            continue;
+        }
+        str += 'EMAIL;';
+        // set types
+        for (var type in mail.types) {
+            if (type_.isString(type)) {
+                str += type + ',';
+            }
+        }
+        if (str.charAt(str.length - 1) === ',') {
+            str[str.length - 1] = ':';
+        }
+        str += '=' + converter_.toString(mail.email) + '\n';
     }
-    str += '=' + converter_.toString(mail.email) + '\n';
-  }
-  return str;
+    return str;
 };
 
 // Convert organizations info from Contact object to string
 var _contactOrganizationToString = function(obj) {
-  if (obj.organizations.length === 0 ||
-    !obj.organizations[0] instanceof ContactOrganization) {
-    return '';
-  }
-  var str = '';
-  for (var org in obj.organizations) {
-    if (!org instanceof ContactOrganization) {
-      continue;
+    if (
+        obj.organizations.length === 0 ||
+        !obj.organizations[0] instanceof ContactOrganization
+    ) {
+        return '';
+    }
+    var str = '';
+    for (var org in obj.organizations) {
+        if (!org instanceof ContactOrganization) {
+            continue;
+        }
+        str += 'ORG:';
+        str += org.name + ';' + org.department + ';' + org.title + '\n';
     }
-    str += 'ORG:';
-    str += org.name + ';' + org.department + ';' + org.title + '\n';
-  }
-  return str;
+    return str;
 };
 
 // Convert organizations roles from Contact object to string
 var _contactRoleToString = function(obj) {
-  if (obj.organizations.length === 0 ||
-    !obj.organizations[0] instanceof ContactOrganization) {
-    return '';
-  }
-  var str = '';
-  for (var org in obj.organizations) {
-    if (!org instanceof ContactOrganization) {
-      continue;
+    if (
+        obj.organizations.length === 0 ||
+        !obj.organizations[0] instanceof ContactOrganization
+    ) {
+        return '';
     }
-    str += 'ROLE:';
-    str += org.name + ';' + org.role + '\n';
-  }
-  return str;
+    var str = '';
+    for (var org in obj.organizations) {
+        if (!org instanceof ContactOrganization) {
+            continue;
+        }
+        str += 'ROLE:';
+        str += org.name + ';' + org.role + '\n';
+    }
+    return str;
 };
 
 // Convert phone numbers from Contact object to string
 var _contactPhoneNumbersToString = function(obj) {
-  if (obj.phoneNumbers.length === 0 || !obj.phoneNumbers[0] instanceof ContactPhoneNumber) {
-    return '';
-  }
-  var str = '';
-  for (var phone in obj.phoneNumbers) {
-    if (!phone instanceof ContactPhoneNumber) {
-      continue;
+    if (
+        obj.phoneNumbers.length === 0 ||
+        !obj.phoneNumbers[0] instanceof ContactPhoneNumber
+    ) {
+        return '';
     }
-    str += 'TEL';
-    for (var type in phone.types) {
-      if (type_.isString(type)) {
-        str += ';' + type;
-      }
+    var str = '';
+    for (var phone in obj.phoneNumbers) {
+        if (!phone instanceof ContactPhoneNumber) {
+            continue;
+        }
+        str += 'TEL';
+        for (var type in phone.types) {
+            if (type_.isString(type)) {
+                str += ';' + type;
+            }
+        }
+        str += ':';
+        str += phone.number + '\n';
     }
-    str += ':';
-    str += phone.number + '\n';
-  }
-  return str;
+    return str;
 };
 
 // Convert urls from Contact object to string
 var _contactURLToString = function(obj) {
-  if (obj.urls.length === 0 || !obj.urls[0] instanceof ContactWebSite) {
-    return '';
-  }
-  var str = '';
-  for (var url in obj.urls) {
-    if (url instanceof ContactWebSite) {
-      str += 'URL:' + url.url + '\n';
+    if (obj.urls.length === 0 || !obj.urls[0] instanceof ContactWebSite) {
+        return '';
+    }
+    var str = '';
+    for (var url in obj.urls) {
+        if (url instanceof ContactWebSite) {
+            str += 'URL:' + url.url + '\n';
+        }
     }
-  }
-  return str;
+    return str;
 };
 
 // Convert anniversaries to string
 var _contactAnniversaryToString = function(obj) {
-  if (obj.anniversaries.length === 0 || !obj.anniversaries[0] instanceof ContactAnniversary) {
-    return '';
-  }
-  var str = '';
-  for (var ann in obj.anniversaries) {
-    if (ann instanceof ContactAnniversary) {
-      str += 'X-ANNIVERSARY;' + ann.label + ':' + ann.date + ';' + '\n';
+    if (
+        obj.anniversaries.length === 0 ||
+        !obj.anniversaries[0] instanceof ContactAnniversary
+    ) {
+        return '';
     }
-  }
-  return str;
+    var str = '';
+    for (var ann in obj.anniversaries) {
+        if (ann instanceof ContactAnniversary) {
+            str += 'X-ANNIVERSARY;' + ann.label + ':' + ann.date + ';' + '\n';
+        }
+    }
+    return str;
 };
 
 // Convert relationships to string
 var _contactRelationshipsToString = function(obj) {
-  if (obj.relationships.length === 0 ||
-    !obj.relationships[0] instanceof ContactRelationship) {
-    return '';
-  }
-  var str = '';
-  for (var rel in obj.relationships) {
-    if (rel instanceof ContactRelationship) {
-      str += 'X-RELATIONSHIP;' + rel.relativeName + ':' + rel.type +
-      ':' + rel.label + ';\n';
+    if (
+        obj.relationships.length === 0 ||
+        !obj.relationships[0] instanceof ContactRelationship
+    ) {
+        return '';
+    }
+    var str = '';
+    for (var rel in obj.relationships) {
+        if (rel instanceof ContactRelationship) {
+            str +=
+                'X-RELATIONSHIP;' +
+                rel.relativeName +
+                ':' +
+                rel.type +
+                ':' +
+                rel.label +
+                ';\n';
+        }
     }
-  }
-  return str;
+    return str;
 };
 
 // Convert extension to string
 // Format:
 // X-EXTENSION:<data1>;<data2>;...;<data12>
 var _contactExtensionsToString = function(obj) {
-  var str = '';
-  var label = null;
-
-  if (obj.extensions === null || !type_.isArray(obj.extensions)) {
-    return '';
-  }
-  for (var i = 0; i < obj.extensions.length; i++) {
-    if (!obj.extensions[i] instanceof ContactExtension) {
-      return '';
-    }
-    str += 'X-EXTENSION:';
+    var str = '';
+    var label = null;
 
-    if (obj.extensions[i].data1 === null) {
-      str += '0';
-    } else {
-      str += String(obj.extensions[i].data1);
+    if (obj.extensions === null || !type_.isArray(obj.extensions)) {
+        return '';
     }
+    for (var i = 0; i < obj.extensions.length; i++) {
+        if (!obj.extensions[i] instanceof ContactExtension) {
+            return '';
+        }
+        str += 'X-EXTENSION:';
 
-    for (var j = 2; j <= 12; j++) {
-      str += ';';
-      label = 'data' + j;
-      if (obj.extensions[i][label] && obj.extensions[i][label].length > 0) {
-        str += obj.extensions[i][label];
-      }
-    }
+        if (obj.extensions[i].data1 === null) {
+            str += '0';
+        } else {
+            str += String(obj.extensions[i].data1);
+        }
+
+        for (var j = 2; j <= 12; j++) {
+            str += ';';
+            label = 'data' + j;
+            if (obj.extensions[i][label] && obj.extensions[i][label].length > 0) {
+                str += obj.extensions[i][label];
+            }
+        }
 
-    str += '\n';
-  }
-  return str;
+        str += '\n';
+    }
+    return str;
 };
 
 // Convert messengers to string
 var _contactInstantMessengeToString = function(obj) {
-  if (obj.messengers.length === 0 || !obj.messengers[0] instanceof ContactInstantMessenger) {
-    return '';
-  }
-  var str = '';
-  for (var messenger in obj.messengers) {
-    if (messenger instanceof ContactInstantMessenger) {
-      str += 'X-MESSANGER;' + messenger.imAddress + ':' + messenger.type +
-      ':' + messenger.label + ';\n';
+    if (
+        obj.messengers.length === 0 ||
+        !obj.messengers[0] instanceof ContactInstantMessenger
+    ) {
+        return '';
+    }
+    var str = '';
+    for (var messenger in obj.messengers) {
+        if (messenger instanceof ContactInstantMessenger) {
+            str +=
+                'X-MESSANGER;' +
+                messenger.imAddress +
+                ':' +
+                messenger.type +
+                ':' +
+                messenger.label +
+                ';\n';
+        }
     }
-  }
-  return str;
+    return str;
 };
 
 // Auxiliary function, allows to parse JSON to Contact
 var _JSONToContactType = function(type, obj) {
-  var contact = new type();
-
-  for (var prop in obj) {
-    if (contact.hasOwnProperty(prop)) {
-      if (contact[prop] instanceof Date && type_.isNumber(obj[prop])) {
-        contact[prop] = new Date(1000 * obj[prop]);
-      } else {
-        contact[prop] = obj[prop];
-      }
+    var contact = new type();
+
+    for (var prop in obj) {
+        if (contact.hasOwnProperty(prop)) {
+            if (contact[prop] instanceof Date && type_.isNumber(obj[prop])) {
+                contact[prop] = new Date(1000 * obj[prop]);
+            } else {
+                contact[prop] = obj[prop];
+            }
+        }
     }
-  }
 
-  return contact;
+    return contact;
 };
 
 // Converts the Contact item to a string format.
 Contact.prototype.convertToString = function(format) {
-  format = format || TypeEnum[0];
-
-  if (!type_.isString(format)) {
-    throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR, 'Invalid format');
-  }
-
-  if (TypeEnum.indexOf(format) < 0) {
-    throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR, 'Invalid format');
-  }
+    format = format || TypeEnum[0];
 
-  if (this.id === '') {
-    throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR,
-      'Contact ID is empty.');
-  }
-
-  var str = 'BEGIN:VCARD\nVERSION:3.0\n';
-
-  // set contact name
-  str += 'N:' + this.name.lastName + ';' + this.name.firstName + ';' +
-  this.name.middleName + ';' + this.name.prefix + ';' + this.name.suffix + '\n';
-  str += 'FN' + this.name.displayName + '\n';
+    if (!type_.isString(format)) {
+        throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR, 'Invalid format');
+    }
 
-  // set phonetic names
-  str += 'X-PHONETIC-FIRST-NAME' + this.name.phoneticFirstName + '\n' +
-  'X-PHONETIC-LAST-NAME' + this.name.phoneticLastName + '\n';
+    if (TypeEnum.indexOf(format) < 0) {
+        throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR, 'Invalid format');
+    }
 
-  // set contact address
-  str += _contactAddressToString(this);
+    if (this.id === '') {
+        throw new WebAPIException(
+            WebAPIException.TYPE_MISMATCH_ERR,
+            'Contact ID is empty.'
+        );
+    }
 
-  // set Birthday
-  if (this.birthday) {
-    str += 'BDAY:' + this.birthday.getYear() + '-' + this.birthday.getMonth() +
-    '-' + this.birthday.getDay() + '\n';
-  }
+    var str = 'BEGIN:VCARD\nVERSION:3.0\n';
+
+    // set contact name
+    str +=
+        'N:' +
+        this.name.lastName +
+        ';' +
+        this.name.firstName +
+        ';' +
+        this.name.middleName +
+        ';' +
+        this.name.prefix +
+        ';' +
+        this.name.suffix +
+        '\n';
+    str += 'FN' + this.name.displayName + '\n';
+
+    // set phonetic names
+    str +=
+        'X-PHONETIC-FIRST-NAME' +
+        this.name.phoneticFirstName +
+        '\n' +
+        'X-PHONETIC-LAST-NAME' +
+        this.name.phoneticLastName +
+        '\n';
+
+    // set contact address
+    str += _contactAddressToString(this);
+
+    // set Birthday
+    if (this.birthday) {
+        str +=
+            'BDAY:' +
+            this.birthday.getYear() +
+            '-' +
+            this.birthday.getMonth() +
+            '-' +
+            this.birthday.getDay() +
+            '\n';
+    }
 
-  // set anniversary
-  str += _contactAnniversaryToString(this);
+    // set anniversary
+    str += _contactAnniversaryToString(this);
 
-  // set relationship
-  str += _contactRelationshipsToString(this);
+    // set relationship
+    str += _contactRelationshipsToString(this);
 
-  // set extension
-  str += _contactExtensionsToString(this);
+    // set extension
+    str += _contactExtensionsToString(this);
 
-  // set emails
-  str += _contactEmailToString(this);
+    // set emails
+    str += _contactEmailToString(this);
 
-  // set organization data
-  str += _contactOrganizationToString(this);
+    // set organization data
+    str += _contactOrganizationToString(this);
 
-  // set role
-  str += _contactRoleToString(this);
+    // set role
+    str += _contactRoleToString(this);
 
-  // set phone numbers
-  str += _contactPhoneNumbersToString(this);
+    // set phone numbers
+    str += _contactPhoneNumbersToString(this);
 
-  // set user ID
-  str += 'UID:' + this.id + '\n';
+    // set user ID
+    str += 'UID:' + this.id + '\n';
 
-  // set isFavorite
-  str += 'X-IS-FAVORITE' + this.isFavorite + '\n';
+    // set isFavorite
+    str += 'X-IS-FAVORITE' + this.isFavorite + '\n';
 
-  // set URLs
-  str += _contactURLToString(this);
+    // set URLs
+    str += _contactURLToString(this);
 
-  // set messengers
-  str += _contactInstantMessengeToString(this);
+    // set messengers
+    str += _contactInstantMessengeToString(this);
 
-  // set last revision
-  if (this.lastUpdated) {
-    str += 'REV:' + this.lastUpdated.getYear() + '-' + this.lastUpdated.getMonth() +
-    '-' + this.lastUpdated.getDay() + 'T' + this.lastUpdated.getHours() + ':' +
-    this.lastUpdated.getMinutes() + ':' + this.lastUpdated.getSeconds() + 'Z\n';
-  }
+    // set last revision
+    if (this.lastUpdated) {
+        str +=
+            'REV:' +
+            this.lastUpdated.getYear() +
+            '-' +
+            this.lastUpdated.getMonth() +
+            '-' +
+            this.lastUpdated.getDay() +
+            'T' +
+            this.lastUpdated.getHours() +
+            ':' +
+            this.lastUpdated.getMinutes() +
+            ':' +
+            this.lastUpdated.getSeconds() +
+            'Z\n';
+    }
 
-  str += 'END:VCARD\n';
+    str += 'END:VCARD\n';
 
-  return str;
+    return str;
 };
 
 // Creates a clone of the Contact object, detached from any address book
 Contact.prototype.clone = function() {
-  return new Contact(this);
+    return new Contact(this);
 };
 
 // exports /////////////////////////////////////////////////////////////////