2016-04-26 09:30:02 +00:00
|
|
|
/* [0] Constructeur -> définit le conteneur et le bouton d'ajout
|
|
|
|
=========================================================*/
|
2016-04-29 13:24:03 +00:00
|
|
|
function inputPhoneContact(container, navContainer){
|
|
|
|
this.container = container;
|
|
|
|
this.nav_container = navContainer;
|
2016-04-26 09:30:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* [1] Attributs
|
|
|
|
=========================================================*/
|
|
|
|
inputPhoneContact.prototype = {
|
2016-04-29 13:24:03 +00:00
|
|
|
container: this.container, // Conteneur des formulaires de contact
|
|
|
|
nav_container: this.nav_container, // Conteneur de la navigation entre les formulaires
|
2016-05-04 09:51:13 +00:00
|
|
|
selected: 0, // UID du permier des contacts sélectionnés (10 par 10)
|
2016-04-29 13:24:03 +00:00
|
|
|
handler: null // Fonction pour l'enregistrement et la synchronisation des données
|
2016-04-26 09:30:02 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
|
2016-05-10 14:51:09 +00:00
|
|
|
|
|
|
|
/* [2] Vérification des données d'un contact
|
|
|
|
=========================================================*/
|
|
|
|
inputPhoneContact.prototype.check = function(deflated){
|
|
|
|
/* (1) Le numéro n'est pas vide */
|
|
|
|
var validForm = deflated.number.length > 0;
|
|
|
|
/* (2) ET le pseudo et/ou le prénom et/ou le nom n'est pas vide */
|
|
|
|
validForm = validForm && deflated.username.length+deflated.firstname.length+deflated.lastname.length > 0;
|
|
|
|
|
|
|
|
/* (3) On retourne la validité du formulaire */
|
|
|
|
return validForm
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* [3] Gestion de l'enregistrement des formulaires de contact
|
2016-04-26 09:30:02 +00:00
|
|
|
=========================================================*/
|
|
|
|
inputPhoneContact.prototype.fieldsToStorage = function(){
|
|
|
|
console.log('CONTACTS: FIELDS TO STORAGE');
|
|
|
|
|
|
|
|
// {1} Pour chaque formulaire de contact présent //
|
2016-05-03 13:10:56 +00:00
|
|
|
var visibleContacts = $$('article.contact-panel .new-contact');
|
|
|
|
for( var i = 0 ; i < visibleContacts.length ; i++ ){
|
2016-04-26 09:30:02 +00:00
|
|
|
|
2016-05-03 13:10:56 +00:00
|
|
|
// {2} On initialise notre deflater pour récupérer les valeurs //
|
|
|
|
var deflater = new FormDeflater(visibleContacts[i], ['input'], ['data-name']);
|
2016-04-26 09:30:02 +00:00
|
|
|
|
2016-05-03 13:10:56 +00:00
|
|
|
// {3} On enregistre ce contact si le numéro n'est pas vide et soit pseudo/prénom/nom //
|
2016-04-26 09:30:02 +00:00
|
|
|
var deflated = deflater.deflate();
|
2016-05-03 14:29:12 +00:00
|
|
|
|
2016-04-26 09:30:02 +00:00
|
|
|
// Si le formulaire n'est pas valide, on ne l'enregistre pas
|
2016-05-10 14:51:09 +00:00
|
|
|
if( !this.check(deflated) ) continue;
|
2016-04-26 09:30:02 +00:00
|
|
|
|
2016-05-03 13:10:56 +00:00
|
|
|
// {4} On récupère et met en forme les valeurs du deflater //
|
2016-04-26 09:30:02 +00:00
|
|
|
var obj = {
|
2016-05-09 18:04:23 +00:00
|
|
|
uid: parseInt(deflated.uid),
|
|
|
|
number: deflated.number,
|
|
|
|
username: deflated.username,
|
|
|
|
firstname: deflated.firstname,
|
|
|
|
lastname: deflated.lastname,
|
2016-05-03 14:29:12 +00:00
|
|
|
|
2016-05-09 18:04:23 +00:00
|
|
|
call: parseInt(deflated.call),
|
|
|
|
sms: parseInt(deflated.sms),
|
2016-05-03 15:34:27 +00:00
|
|
|
|
2016-05-09 18:04:23 +00:00
|
|
|
countcall: parseInt(deflated.countcall),
|
|
|
|
countsms: parseInt(deflated.countsms)
|
2016-04-26 09:30:02 +00:00
|
|
|
};
|
|
|
|
|
2016-05-03 13:10:56 +00:00
|
|
|
/* (5) On calcule et ajoute le hash des données */
|
2016-04-28 16:49:49 +00:00
|
|
|
obj.hash = crc32( JSON.stringify(obj) );
|
|
|
|
|
2016-05-03 13:10:56 +00:00
|
|
|
// {6} On enregistre les données dans le 'localStorage' //
|
2016-05-09 18:04:23 +00:00
|
|
|
lsi.set('contacts', parseInt(deflated.uid), obj);
|
2016-04-26 09:30:02 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2016-05-10 14:51:09 +00:00
|
|
|
/* [4] Gestion de l'ajout physique d'un nouveau contact
|
2016-04-26 09:30:02 +00:00
|
|
|
=========================================================*/
|
|
|
|
/*
|
|
|
|
*
|
|
|
|
* @objectData<Object> Objet contenant les informations nécessaires à l'affichage
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
inputPhoneContact.prototype.add = function(objectData){
|
|
|
|
console.log('CONTACTS: ADD');
|
|
|
|
|
2016-05-03 13:10:56 +00:00
|
|
|
// Si pas d'uid, on quitte
|
2016-05-04 08:50:57 +00:00
|
|
|
if( objectData == null || objectData.uid == null || isNaN(objectData.uid) )
|
2016-05-03 13:10:56 +00:00
|
|
|
return false
|
|
|
|
|
2016-04-26 09:30:02 +00:00
|
|
|
// {0} On formatte l'object //
|
|
|
|
objectData.number = (objectData.number != null) ? objectData.number : '';
|
|
|
|
objectData.username = (objectData.username != null) ? objectData.username : '';
|
|
|
|
objectData.firstname = (objectData.firstname != null) ? objectData.firstname : '';
|
|
|
|
objectData.lastname = (objectData.lastname != null) ? objectData.lastname : '';
|
2016-05-03 14:29:12 +00:00
|
|
|
objectData.call = (objectData.call != null) ? objectData.call : -1;
|
|
|
|
objectData.sms = (objectData.sms != null) ? objectData.sms : -1;
|
2016-05-03 15:34:27 +00:00
|
|
|
objectData.countcall = (objectData.countcall != null) ? objectData.countcall : 0;
|
|
|
|
objectData.countsms = (objectData.countsms != null) ? objectData.countsms : 0;
|
2016-04-26 09:30:02 +00:00
|
|
|
|
|
|
|
|
|
|
|
// {1} On ajoute le HTML //
|
|
|
|
this.container.innerHTML += contactBuilder.build(objectData);
|
|
|
|
|
2016-04-28 14:00:49 +00:00
|
|
|
// {2} On attache les évènements sur les formulaires //
|
|
|
|
var contactForms = $$('article.contact-panel .new-contact');
|
2016-04-26 09:30:02 +00:00
|
|
|
|
|
|
|
// On met à jour les listener (remove, puis add)
|
|
|
|
var ptr = this;
|
2016-04-28 14:00:49 +00:00
|
|
|
for( var i = 0 ; i < contactForms.length ; i++ ){
|
2016-04-29 13:24:03 +00:00
|
|
|
contactForms[i].removeEventListener('click', function(e){ ptr.nav(e.target); ptr.handler(e.target); }, false);
|
|
|
|
contactForms[i].addEventListener('click', function(e){ ptr.nav(e.target); ptr.handler(e.target); }, false);
|
2016-04-26 09:30:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2016-05-10 14:51:09 +00:00
|
|
|
/* [5] Gestion de l'affichage depuis le 'localStorage'
|
2016-04-26 09:30:02 +00:00
|
|
|
=========================================================*/
|
|
|
|
inputPhoneContact.prototype.storageToFields = function(){
|
|
|
|
console.log('CONTACTS: STORAGE TO FIELDS');
|
|
|
|
|
|
|
|
// {1} Pour chaque contact du 'localStorage' //
|
2016-04-29 13:24:03 +00:00
|
|
|
var contactKeys = lsi.keys('contacts');
|
2016-04-26 09:30:02 +00:00
|
|
|
|
|
|
|
// On réinitialise le HTML
|
|
|
|
this.container.innerHTML = '';
|
|
|
|
|
2016-04-29 13:24:03 +00:00
|
|
|
// {2} On ajoute chaque contact (parmi les séléctionnés) à la liste //
|
2016-05-03 15:19:54 +00:00
|
|
|
var min = this.selected; // On affiche du contact sélectionné
|
|
|
|
var max = this.selected+10; // On s'arrête à 10 contacs
|
2016-05-03 13:10:56 +00:00
|
|
|
|
2016-04-29 13:24:03 +00:00
|
|
|
for( var i = min ; i < max && i < contactKeys.length ; i++ )
|
|
|
|
this.add( lsi.get('contacts', contactKeys[i]) );
|
2016-04-26 09:30:02 +00:00
|
|
|
|
|
|
|
|
2016-04-29 13:24:03 +00:00
|
|
|
// On ajoute un champ de plus à remplir si c'est la dernière page
|
|
|
|
if( max >= contactKeys.length )
|
2016-05-04 08:50:57 +00:00
|
|
|
this.add({uid: contactKeys.length});
|
2016-04-26 09:30:02 +00:00
|
|
|
|
2016-04-29 13:24:03 +00:00
|
|
|
/* (3) On met à jour la barre de navigation */
|
|
|
|
this.updateNavBar();
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* [6] Gestion de la navigation entre les formulaires (10 par 10)
|
|
|
|
=========================================================*/
|
|
|
|
inputPhoneContact.prototype.nav = function(element){
|
|
|
|
/* (1) On vérifie que l'élément contient un nombre et existe */
|
2016-05-04 09:51:13 +00:00
|
|
|
if( element == null )
|
2016-04-29 13:24:03 +00:00
|
|
|
return false;
|
|
|
|
|
2016-05-04 09:51:13 +00:00
|
|
|
if( element.getData('n') === false || isNaN(element.getData('n')) || element.parentNode.id != 'nav-contact' )
|
2016-04-29 13:24:03 +00:00
|
|
|
return false;
|
|
|
|
|
|
|
|
/* (2) On désactive tous les éléments actifs */
|
|
|
|
var activeElements = $$('#nav-contact > span.active');
|
|
|
|
for( var i = 0 ; i < activeElements.length ; i++ )
|
|
|
|
activeElements[i].remClass('active');
|
|
|
|
|
|
|
|
/* (3) On active l'élément courant */
|
|
|
|
element.addClass('active');
|
2016-05-03 15:19:54 +00:00
|
|
|
this.selected = parseInt(element.getData('n'));
|
2016-04-29 13:24:03 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* [7] Mise à jour de la navigation
|
|
|
|
=========================================================*/
|
|
|
|
inputPhoneContact.prototype.updateNavBar = function(){
|
|
|
|
var contactKeys = lsi.keys('contacts');
|
|
|
|
var len = contactKeys.length;
|
|
|
|
|
|
|
|
|
|
|
|
/* (1) On vérifie si la barre de navigation est à jour */
|
|
|
|
var navBarUpToDate = this.nav_container.children.length == len;
|
|
|
|
|
|
|
|
|
|
|
|
/* (2) On vide et remplit la barre de nav, si elle n'est pas à jour */
|
|
|
|
if( !navBarUpToDate ){
|
|
|
|
this.nav_container.innerHTML = '';
|
|
|
|
|
|
|
|
for( var i = 0 ; i < len ; i+=10 )
|
2016-05-03 15:19:54 +00:00
|
|
|
this.nav_container.innerHTML += '<span data-n="'+i+'">'+ (1+i/10) +'</span>';
|
2016-04-29 13:24:03 +00:00
|
|
|
}
|
|
|
|
|
2016-05-03 13:10:56 +00:00
|
|
|
|
2016-04-29 13:24:03 +00:00
|
|
|
/* (4) On séléctionne par défaut la dernière MINI fiche sélectionnée */
|
2016-05-04 09:51:13 +00:00
|
|
|
this.nav( $('#nav-contact [data-n="'+( this.selected )+'"]') );
|
2016-04-26 09:30:02 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
2016-04-29 13:24:03 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
2016-05-10 14:51:09 +00:00
|
|
|
/* [8] Point d'amorçage de la gestion des contacts
|
2016-04-26 09:30:02 +00:00
|
|
|
=========================================================*/
|
2016-04-26 14:16:43 +00:00
|
|
|
inputPhoneContact.prototype.attach = function(handler){
|
2016-04-26 09:30:02 +00:00
|
|
|
console.log('CONTACTS: ATTACH');
|
|
|
|
|
|
|
|
/* (1) On initialise le jeu de données */
|
|
|
|
lsi.createDataset('contacts');
|
|
|
|
|
2016-04-29 13:24:03 +00:00
|
|
|
/* (2) On charge les contacts depuis la mémoire ('localStorage') */
|
|
|
|
this.storageToFields();
|
|
|
|
|
|
|
|
/* (3) On enregistre le handler */
|
2016-04-26 14:16:43 +00:00
|
|
|
this.handler = handler;
|
|
|
|
|
2016-04-29 13:24:03 +00:00
|
|
|
/* (4) On attache l'évènement sur le conteneur de navigation */
|
|
|
|
var ptr = this;
|
|
|
|
this.nav_container.addEventListener('click', function(e){
|
|
|
|
// 1. On gère la navigation
|
|
|
|
ptr.nav(e.target);
|
2016-05-03 13:10:56 +00:00
|
|
|
|
2016-04-29 13:24:03 +00:00
|
|
|
// 2. On gere le chargement dynamique
|
|
|
|
ptr.handler(e.target);
|
|
|
|
}, false);
|
|
|
|
|
2016-04-26 09:30:02 +00:00
|
|
|
};
|