/*jshint forin:true, noarg:true, noempty:true, eqeqeq:true,
bitwise:true, strict:true, undef:true, curly:true, browser:true,
devel:true, indent:2, maxerr:50, moz:true, newcap:false, moz:true */
/* global mozContact: false,
ContactTelField: false, parseLDIF: false */
(function () {
"use strict";
// Shim for the intersection of two Arrays.
if (!Array.prototype.intersection) {
Array.prototype.intersection = function (anotherArr) {
return this.filter(function(n) {
if (anotherArr.indexOf(n) === -1) { return false; }
return true;
});
};
}
const phoneFields = [
"mobile", "facsimiletelephonenumber", "homePhone", "telephoneNumber"
];
const emailFields = [ "mail" ];
/**
* Not used presently and not debugged.
*/
function whenContactAlreadyPresent(rec, cb_not_found, cb_found) {
var rec_keys = Object.keys(rec);
// Finding whether the contact has email or telephone
var email_fields = rec_keys.intersection(emailFields);
var phone_fields = rec_keys.intersection(phoneFields);
var search_keys = [];
if (email_fields.length > 0) {
search_keys = email_fields;
}
else if (phone_fields.length > 0) {
search_keys = phone_fields;
}
if (search_keys.length > 0) {
var search_opts = {
filterValue : rec(search_keys[0]),
filterBy : search_keys,
filterOp : "contains",
filterLimit : 1
};
var search = navigator.mozContacts.find(search_opts);
// Possible duplicate found ... bail out, rather do nothing!
search.onsuccess = function() {
// search.result is found record (Array of length 1)
cb_found(rec, search.result);
};
// No duplicates, go ahead and create new record
search.onerror = function() {
cb_not_found(rec);
};
}
}
function restoreURLForm(url) {
document.getElementById("progress-div").style.display = "none";
document.getElementById("URL-form").style.display = "block";
if (url !== undefined) {
document.getElementsByName("URL")[0].value = url;
}
}
function insertData(ldifText) {
var progressEl = document.querySelector("#progress-div progress");
var records = parseLDIF(ldifText.split("\n"));
console.log("records.length = " + records.length);
if (records.length > 0) {
if (!window.confirm("THIS WILL ERASE ALL CONTACTS ON YOUR PHONE!\n" +
"Are you cool with that?")) {
return false;
}
}
var cl_req = navigator.mozContacts.clear();
cl_req.onerror = function() {
throw new Error("Cannot clear whole Contacts database?");
};
cl_req.onsuccess = function() {
progressEl.max = records.length;
progressEl.value = 0;
records.forEach(function (rec) {
var add_contact = translateObjectToContact(rec);
var sav_req = navigator.mozContacts.save(add_contact);
sav_req.onsuccess = function() {
progressEl.value += 1;
if (progressEl.value >= records.length) {
window.alert("All contacts have been imported!");
restoreURLForm();
}
};
sav_req.onerror = function() {
console.error("Cannot save record " + add_contact.id +
"\n" + rec.toSource());
};
});
};
}
function submitHandler (evt) {
var URL = document.getElementsByName("URL")[0].value;
var progressForm = document.getElementById("progress-div");
document.getElementById("URL-form").style.display = "none";
progressForm.style.display = "block";
var req = new XMLHttpRequest();
req.open("GET", URL, true);
var progressEl = progressForm.getElementsByTagName("progress")[0];
req.onprogress = function(evt) {
if (evt.lengthComputable) {
progressEl.max = evt.total;
progressEl.value = evt.loaded;
}
};
req.onload = function() {
var inText = req.responseText;
if (inText.length > 0) {
insertData(inText);
if (localStorage) {
localStorage.setItem("lastURL", URL);
}
}
};
req.onerror = function() {
window.alert("Cannot load " + URL + "!");
restoreURLForm(URL);
};
req.send();
evt.stopPropagation();
evt.preventDefault();
}
window.onload = function() {
if (localStorage && localStorage.lastURL) {
var oldURL = localStorage.getItem('lastURL');
document.getElementsByName("URL")[0].value = oldURL;
}
document.body.addEventListener("submit",
submitHandler, false);
};
}());