aboutsummaryrefslogblamecommitdiffstats
path: root/importAddrBook.js
blob: 97f44669c1ad5e95d3dc25b9455c0bc904dadc6a (plain) (tree)
1
2
3
4
5
6
7
8
9
10



                                                                      
                            

                                              


               















                                                                          









































                                                                   







                                                                   
                                 



                                                                      
                                                      























                                                                           



                                                             


                                      

                                                                



          

   


                                                               
 

                                                               
 


                                                                      
 





                                      
 



                                    
 


                                               
 

       
 



                                               
 




                          
 




                                                          
 

                                            


     
/*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);
  };

}());