diff --git a/js/includes/input-facebook-fiche.js b/js/includes/input-facebook-fiche.js
index ca8ed68..43e8f6c 100644
--- a/js/includes/input-facebook-fiche.js
+++ b/js/includes/input-facebook-fiche.js
@@ -3,6 +3,7 @@
function inputFacebookFiche(container, navContainer){
this.container = container;
this.nav_container = navContainer;
+ this.top_size = 10;
}
/* [1] Attributs
@@ -345,90 +346,105 @@ inputFacebookFiche.prototype.storageToFields = function(){
inputFacebookFiche.prototype.sync = function(){
console.group('[facebook.fiche] synchronisation');
- /* (1) Mise à jour en fonction des contacts Top 20
+ /* (1) Initialisation
---------------------------------------------------------*/
/* (1) On récupère tous les CONTACTS */
var contacts = lsi.export('f_contacts');
- var addedFicheUids = []; // Contiendra les uids des fiches qui seront crées
+
+ /* (2) Contiendra les uids des fiches qui seront crées */
+ var addedFicheUids = [];
+ var ficheData, contactData;
- /* (2) Mise à jour en fonction des contacts
+
+ /* (2) Mise à jour en fonction des contacts APRÈS SAISIE
---------------------------------------------------------*/
- // Nombre maximum de fiches (20, sauf si moins de 20 contacts, dans ce cas, le nombre de contacts);
- var nbMaxFiche = lsi.keys('f_contacts').length < 20 ? lsi.keys('f_contacts').length : 20;
+ // Nombre maximum de fiches (40, sauf si moins de 40 contacts, dans ce cas, le nombre de contacts);
+ var nbMaxFiche = lsi.keys('f_contacts').length < 2*this.top_size ? lsi.keys('f_contacts').length : 2*this.top_size;
- // On complète en fonction des contacts séquentiellement HISTORIQUE, puis MESSENGER
- if( addedFicheUids.length < nbMaxFiche ){
+ /* (1) Pour chaque CONTACT, on met à jour/crée la FICHE associée */
+ for( var uid in contacts ){
- /* (1) Pour chaque CONTACT, on met à jour/crée la FICHE associée*/
- for( var uid in contacts ){
+ /* (1) On cherche un uid de fiche non existant dans l'intervalle [0;40[ */
+ ficheUid = 0;
+ while( addedFicheUids.indexOf(ficheUid) > -1 && ficheUid < nbMaxFiche )
+ ficheUid++;
- /* (2) On cherche un uid de fiche non existant dans l'intervalle 0-19 */
- var ficheUid = 0;
- while( addedFicheUids.indexOf(ficheUid) > -1 && ficheUid < nbMaxFiche )
- ficheUid++;
+ // On enregistre le nouvel UID dans les uid crées
+ addedFicheUids.push(ficheUid);
- // On enregistre le nouvel UID dans les uid crées
- addedFicheUids.push(ficheUid);
+ /* (2) On récupère les informations de la FICHE (si elle existe) */
+ var ficheData = lsi.get('f_fiches', ficheUid);
- /* (3) On récupère les informations de la FICHE (si elle existe) */
- var ficheData = lsi.get('f_fiches', ficheUid);
+ // Si la fiche n'existe pas, on la crée avec les valeurs par défaut
+ !ficheData && ( ficheData = this.defaultData );
- // Si la fiche n'existe pas, on la crée avec les valeurs par défaut
- if( ficheData == null )
- ficheData = this.defaultData;
-
- /* (4) On met à jour la fiche ET on l'enregistre */
- ficheData.uid = ficheUid;
- ficheData.contact = parseInt(uid);
- lsi.set('f_fiches', ficheUid, ficheData);
+ /* (3) On met à jour la fiche ET on l'enregistre */
+ ficheData.uid = ficheUid;
+ ficheData.contact = parseInt(uid);
+ lsi.set('f_fiches', ficheUid, ficheData);
- /* (5) Si on a déja crée 10+10 fiches, on arrête */
- if( addedFicheUids.length >= nbMaxFiche )
- break;
- }
-
+ /* (4) Si on a déja crée 20+20 fiches, on arrête */
+ if( addedFicheUids.length >= nbMaxFiche )
+ break;
}
- /* (3) Mise à jour des fiches dupliquées entre le top 10 des APPELS et celui des SMS
+
+ /* (3) Gestion des fiches dupliquées
---------------------------------------------------------*/
ficheData = lsi.export('f_fiches');
for( var key in ficheData ){
+
/* (1) On récupère le contact associé */
var associatedContact = lsi.get('f_contacts', ficheData[key].contact);
// Si erreur, on passe au suivant
- if( associatedContact == null )
+ if( !associatedContact )
continue;
- /* (2) Si la fiche n'est pas dans les 2 top 10 (APPELS et SMS) */
- if( associatedContact.sms == -1 || associatedContact.call == -1 )
- continue; // On passe au suivant
+ /* (3) On récupère la/les autre(s) fiche(s) (clone(s)) */
+ var clone = null;
+ var inCall = parseInt( ficheData[key].uid ) < this.top_size; // vrai si dans les APPELS, sinon dans les SMS
+ for( var i in ficheData ){
- /* (3) On récupère l'autre fiche (clone) */
- var inCall = parseInt(key) < 10; // Si on est dans le top 10 des APPELS, sinon dans celui des SMS
- var cloneIndex = inCall ? 10+associatedContact.sms : associatedContact.call; // Contient l'index du clone dans l'autre top (APPELS ou SMS)
+ // si on est pas dans le bonne tranche, on passe au suivant
+ if( inCall && i < this.top_size || !inCall && i >= this.top_size )
+ continue;
- var clone = ficheData[cloneIndex];
+ // on récupère le contact associé
+ contactData = lsi.get('f_contacts', ficheData[i].contact);
+ if( i == key || !contactData )
+ continue;
- if( clone == null || ficheData[key] == null || clone.timestamp == null || ficheData[key].timestamp == null )
+ // meme pseudo
+ var hasSameUsername = contactData.username.length > 0 && associatedContact.username === contactData.username;
+ // meme lien de contact
+ var hasSameLink = !isNaN(contactData.existing) && associatedContact.existing === contactData.existing;
+
+ // si ont le même contact, alors on enregistre le clone (sauf si la même fiche)
+ ( hasSameUsername || hasSameLink ) && ( clone = ficheData[i] );
+
+ if( clone !== null )
+ break;
+
+ }
+
+ /* (4) Si c'est le clone qui a été modifié en dernier, on ne fait rien */
+ if( clone === null || clone.timestamp > ficheData[key].timestamp )
continue;
- /* (4) Si le clone a été modifié en dernier, on ne fait rien */
- if( clone.timestamp >= ficheData[key].timestamp )
- continue;
-
- /* (5) On copie les données de la FICHE dans le clone (cas ou la fiche est modifiée en dernier) */
+ /* (5) On copie les données de la FICHE dans le CLONE */
var obj = ficheData[key];
obj.uid = clone.uid;
lsi.set('f_fiches', clone.uid, obj);
}
+
console.groupEnd();
};
@@ -442,10 +458,10 @@ inputFacebookFiche.prototype.sync = function(){
=========================================================*/
inputFacebookFiche.prototype.nav = function(element){
/* (1) On vérifie que l'élément contient un nombre et existe */
- if( element == null )
+ if( !(element instanceof Element) )
return false;
- if( element.getData('n') === false || isNaN(element.getData('n')) || element.parentNode.id != 'f_nav-fiche' )
+ if( !element.getData('n') || isNaN(element.getData('n')) || element.parentNode.id != 'f_nav-fiche' )
return false;
/* (2) On désactive tous les éléments actifs */
@@ -480,22 +496,22 @@ inputFacebookFiche.prototype.updateNavBar = function(){
- // Si 1ère valeur du top 10 des APPELS, on ajoute le bandeau "APPELS"
+ // Si 1ère valeur du top 20 des APPELS, on ajoute le bandeau "APPELS"
if( i == 0 )
this.nav_container.innerHTML += 'HISTORIQUE';
- // Si fin du top 10 des APPELS, on met un espace et un border-right
- if( i < 10 && k < keys.length-1 && keys[k+1] >= 10 )
- this.nav_container.innerHTML += ''+(i%10 + 1)+' ';
+ // Si fin du top 20 des APPELS, on met un espace et un border-right
+ if( i < 20 && k < keys.length-1 && keys[k+1] >= 20 )
+ this.nav_container.innerHTML += ''+(i%20 + 1)+' ';
- // Si début du top 10 des SMS, on met le label 'SMS' et un border-left
- else if( i == 10 ){
- this.nav_container.innerHTML += 'MESSENGER';
- this.nav_container.innerHTML += ''+(i%10 + 1)+'';
+ // Si début du top 20 des SMS, on met le label 'SMS' et un border-left
+ else if( i == 20 ){
+ this.nav_container.innerHTML += ' MESSENGER ';
+ this.nav_container.innerHTML += ''+(i%20 + 1)+'';
// Sinon, on ajoute juste le bouton
}else
- this.nav_container.innerHTML += ''+(i%10 + 1)+'';
+ this.nav_container.innerHTML += ''+(i%20 + 1)+'';
}
/* (3) On montre les FICHES qui sont correctes */
diff --git a/js/includes/input-facebook-mini.js b/js/includes/input-facebook-mini.js
index cd05dec..040c2a1 100644
--- a/js/includes/input-facebook-mini.js
+++ b/js/includes/input-facebook-mini.js
@@ -10,7 +10,7 @@ function inputFacebookMini(container, navContainer){
inputFacebookMini.prototype = {
container: this.container, // Conteneur des mini fiches relation
nav_container: this.nav_container, // Conteneur de la navigation entre les MINI fiches
- selected: 0, // UID de la MINI fiche sélectionnée
+ selected: null, // UID de la MINI fiche sélectionnée
handler: null, // Fonction pour l'enregistrement et la synchronisation des données
defaultData: { // Valeur par défaut
sexe: '2',
@@ -216,24 +216,51 @@ inputFacebookMini.prototype.add = function(objectData){
inputFacebookMini.prototype.storageToFields = function(){
console.group('[facebook.mini] storage to fields');
- // {1} Pour chaque contact du 'localStorage' //
+ /* (1) On charge le contact selectionné
+ ---------------------------------------------------------*/
var miniData = lsi.get('f_mini-fiches', this.selected);
- // Si on a rien trouvé, on ne fait rien
- if( miniData == null ){
- this.updateNavBar();
- return false;
+ /* (2.1) Si on ne trouve pas
+ ---------------------------------------------------------*/
+ if( miniData === null ){
+
+ /* (2.1.1) Si `selected` est pas encore défini
+ ---------------------------------------------------------*/
+ if( this.selected === null ){
+
+ var k = lsi.keys('f_mini-fiches');
+
+ /* (1) S'il y a au moins 1 contact -> on le prend */
+ if( k.length > 0 ){
+ this.selected = k[0];
+ return this.storageToFields();
+
+ /* (2) Sinon, on quitte */
+ }else
+ return false;
+
+
+ /* (2.1.2) S'il est déja défini, on met à jour la nav
+ ---------------------------------------------------------*/
+ }else{
+ this.updateNavBar();
+ return false;
+ }
}
- // On réinitialise le HTML
+
+ /* (2.2) Si on trouve
+ ---------------------------------------------------------*/
+ /* (1) On réinitialise le HTML */
this.container.innerHTML = '';
- // {2} On affiche la MINI fiche sélectionnée //
+ /* (2) On affiche la MINI fiche sélectionnée */
this.add(miniData);
- // {3} On met à jour la navigation //
+ /* (3) On met à jour la navigation */
this.updateNavBar();
+
console.groupEnd();
};
@@ -331,10 +358,10 @@ inputFacebookMini.prototype.sync = function(){
=========================================================*/
inputFacebookMini.prototype.nav = function(element){
/* (1) On vérifie que l'élément contient un nombre et existe */
- if( element == null )
+ if( !(element instanceof Element) )
return false;
- if( element.getData('n') === false || isNaN(element.getData('n')) || element.parentNode.id != 'f_nav-mini' )
+ if( !element.getData('n') || isNaN(element.getData('n')) || element.parentNode.id != 'f_nav-mini' )
return false;
/* (2) On désactive tous les éléments actifs */
@@ -452,13 +479,12 @@ inputFacebookMini.prototype.attach = function(handler){
this.handler = handler;
/* (2) 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);
+ this.nav(e.target);
// 2. On gere le chargement dynamique
- ptr.handler(e.target);
- }, false);
+ this.handler(e.target);
+ }.bind(this), false);
console.groupEnd();
};
diff --git a/js/includes/input-html-facebook-data.js b/js/includes/input-html-facebook-data.js
index e8750a4..7c2f921 100644
--- a/js/includes/input-html-facebook-data.js
+++ b/js/includes/input-html-facebook-data.js
@@ -8,7 +8,7 @@ fContactBuilder.setLayout(
"\t\n"+
"\t\n"+
diff --git a/js/includes/input-html-phone-data.js b/js/includes/input-html-phone-data.js
index 0b35ae8..295a42c 100644
--- a/js/includes/input-html-phone-data.js
+++ b/js/includes/input-html-phone-data.js
@@ -15,7 +15,7 @@ pContactBuilder.setLayout(
// "\t \n"+
"\t\n"+
diff --git a/js/includes/input-phone-fiche.js b/js/includes/input-phone-fiche.js
index c94015e..843d103 100644
--- a/js/includes/input-phone-fiche.js
+++ b/js/includes/input-phone-fiche.js
@@ -1,8 +1,9 @@
/* [0] Constructeur -> définit le conteneur et le bouton d'ajout
=========================================================*/
function inputPhoneFiche(container, navContainer){
- this.container = container;
+ this.container = container;
this.nav_container = navContainer;
+ this.top_size = 10;
}
/* [1] Attributs
@@ -369,7 +370,7 @@ inputPhoneFiche.prototype.sync = function(){
/* (2) Mise à jour en fonction des contacts APRÈS SAISIE
---------------------------------------------------------*/
// Nombre maximum de fiches (40, sauf si moins de 40 contacts, dans ce cas, le nombre de contacts);
- var nbMaxFiche = lsi.keys('p_contacts').length < 40 ? lsi.keys('p_contacts').length : 40;
+ var nbMaxFiche = lsi.keys('p_contacts').length < 2*this.top_size ? lsi.keys('p_contacts').length : 2*this.top_size;
/* (1) Pour chaque CONTACT, on met à jour/crée la FICHE associée */
for( var uid in contacts ){
@@ -415,12 +416,12 @@ inputPhoneFiche.prototype.sync = function(){
/* (3) On récupère la/les autre(s) fiche(s) (clone(s)) */
var clone = null;
- var inCall = parseInt( ficheData[key].uid ) < 20; // vrai si dans les APPELS, sinon dans les SMS
+ var inCall = parseInt( ficheData[key].uid ) < this.top_size; // vrai si dans les APPELS, sinon dans les SMS
for( var i in ficheData ){
// si on est pas dans le bonne tranche, on passe au suivant
- if( inCall && i < 20 || !inCall && i >= 20 )
+ if( inCall && i < this.top_size || !inCall && i >= this.top_size )
continue;
// on récupère le contact associé
@@ -643,13 +644,12 @@ inputPhoneFiche.prototype.attach = function(handler){
this.handler = handler;
/* (2) On attache l'évènement sur le bouton d'ajout de contact */
- var ptr = this;
this.nav_container.addEventListener('click', function(e){
// 1. On gère la navigation
- ptr.nav(e.target);
+ this.nav(e.target);
// 2. On gere le chargement dynamique
- ptr.handler(e.target);
- }, false);
+ this.handler(e.target);
+ }.bind(this), false);
console.groupEnd();
diff --git a/js/includes/input-phone-mini.js b/js/includes/input-phone-mini.js
index d454998..a783dee 100644
--- a/js/includes/input-phone-mini.js
+++ b/js/includes/input-phone-mini.js
@@ -10,7 +10,7 @@ function inputPhoneMini(container, navContainer){
inputPhoneMini.prototype = {
container: this.container, // Conteneur des mini fiches relation
nav_container: this.nav_container, // Conteneur de la navigation entre les MINI fiches
- selected: 0, // UID de la MINI fiche sélectionnée
+ selected: null, // UID de la MINI fiche sélectionnée
handler: null, // Fonction pour l'enregistrement et la synchronisation des données
defaultData: { // Valeur par défaut
contact: null,
@@ -225,22 +225,48 @@ inputPhoneMini.prototype.add = function(objectData){
inputPhoneMini.prototype.storageToFields = function(){
console.group('[phone.mini] storage to fields');
- // {1} Pour chaque contact du 'localStorage' //
+ /* (1) On charge le contact selectionné
+ ---------------------------------------------------------*/
var miniData = lsi.get('p_mini-fiches', this.selected);
- // Si on a rien trouvé, on ne fait rien
- if( miniData == null ){
- this.updateNavBar();
- return false;
+ /* (2.1) Si on ne trouve pas
+ ---------------------------------------------------------*/
+ if( miniData === null ){
+
+ /* (2.1.1) Si `selected` est pas encore défini
+ ---------------------------------------------------------*/
+ if( this.selected === null ){
+
+ var k = lsi.keys('p_mini-fiches');
+
+ /* (1) S'il y a au moins 1 contact -> on le prend */
+ if( k.length > 0 ){
+ this.selected = k[0];
+ return this.storageToFields();
+
+ /* (2) Sinon, on quitte */
+ }else
+ return false;
+
+
+ /* (2.1.2) S'il est déja défini, on met à jour la nav
+ ---------------------------------------------------------*/
+ }else{
+ this.updateNavBar();
+ return false;
+ }
}
- // On réinitialise le HTML
+
+ /* (2.2) Si on trouve
+ ---------------------------------------------------------*/
+ /* (1) On réinitialise le HTML */
this.container.innerHTML = '';
- // {2} On affiche la MINI fiche sélectionnée //
+ /* (2) On affiche la MINI fiche sélectionnée */
this.add(miniData);
- // {3} On met à jour la navigation //
+ /* (3) On met à jour la navigation */
this.updateNavBar();
@@ -331,10 +357,10 @@ inputPhoneMini.prototype.sync = function(){
=========================================================*/
inputPhoneMini.prototype.nav = function(element){
/* (1) On vérifie que l'élément contient un nombre et existe */
- if( element == null )
+ if( !(element instanceof Element) )
return false;
- if( element.getData('n') === false || isNaN(element.getData('n')) || element.parentNode.id != 'p_nav-mini' )
+ if( !element.getData('n') || isNaN(element.getData('n')) || element.parentNode.id != 'p_nav-mini' )
return false;
/* (2) On désactive tous les éléments actifs */
@@ -375,7 +401,7 @@ inputPhoneMini.prototype.updateNavBar = function(){
if( isNaN(key) )
continue;
- var currentElement = $('[data-sublink="phone"] #p_nav-mini span[data-n="'+miniData[key].uid+'"]');
+ var currentElement = $('[data-sublink="phone"] #p_nav-mini [data-n="'+miniData[key].uid+'"]');
if( currentElement == null )
continue;
@@ -394,7 +420,7 @@ inputPhoneMini.prototype.updateNavBar = function(){
/* (3) On séléctionne par défaut la dernière MINI fiche sélectionnée */
- this.nav( $('[data-sublink="phone"] #p_nav-mini span[data-n="'+this.selected+'"]') );
+ this.nav( $('[data-sublink="phone"] #p_nav-mini [data-n="'+this.selected+'"]') );
};
@@ -452,13 +478,12 @@ inputPhoneMini.prototype.attach = function(handler){
this.handler = handler;
/* (2) 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);
+ this.nav(e.target);
// 2. On gere le chargement dynamique
- ptr.handler(e.target);
- }, false);
+ this.handler(e.target);
+ }.bind(this), false);
console.groupEnd();
diff --git a/js/includes/min/input-facebook-fiche.js b/js/includes/min/input-facebook-fiche.js
index d82216e..19cf95d 100644
--- a/js/includes/min/input-facebook-fiche.js
+++ b/js/includes/min/input-facebook-fiche.js
@@ -1,21 +1,21 @@
-function inputFacebookFiche(a,b){this.container=a;this.nav_container=b}inputFacebookFiche.prototype={container:this.container,nav_container:this.nav_container,selected:0,handler:null,defaultData:{sexe:"2",age:".",job:".",famsit:"0",studies:"0",reltype:"0",reltypeSpecial:"",city:"",quartier:"",cp:"",loc:"0",duration:["",""],context:"0",contextSpecial:["","",""],freq:["4","9","14","19","24"],connect:"1 3 5 7 9 11".split(" "),connectSpecial:["",""],timestamp:0,valid:!1}};
-inputFacebookFiche.prototype.fieldsToStorage=function(){console.group("[facebook.fiche] fields to storage");for(var a=$$('[data-sublink="facebook"] article.relation-panel .fiche-relation'),b=0;b FICHE UPDATE"),c.timestamp=Date.now());lsi.set("f_fiches",c.uid,c)}}console.groupEnd()};
+function inputFacebookFiche(a,c){this.container=a;this.nav_container=c;this.top_size=10}inputFacebookFiche.prototype={container:this.container,nav_container:this.nav_container,selected:0,handler:null,defaultData:{sexe:"2",age:".",job:".",famsit:"0",studies:"0",reltype:"0",reltypeSpecial:"",city:"",quartier:"",cp:"",loc:"0",duration:["",""],context:"0",contextSpecial:["","",""],freq:["4","9","14","19","24"],connect:"1 3 5 7 9 11".split(" "),connectSpecial:["",""],timestamp:0,valid:!1}};
+inputFacebookFiche.prototype.fieldsToStorage=function(){console.group("[facebook.fiche] fields to storage");for(var a=$$('[data-sublink="facebook"] article.relation-panel .fiche-relation'),c=0;c FICHE UPDATE"),b.timestamp=Date.now());lsi.set("f_fiches",b.uid,b)}}console.groupEnd()};
inputFacebookFiche.prototype.add=function(a){if(null==a.uid||isNaN(a.uid)||null==a.contact||isNaN(a.contact))return!1;a.city=null!=a.city?a.city:this.defaultData.city;a.quartier=null!=a.quartier?a.quartier:this.defaultData.quartier;a.cp=null!=a.cp?a.cp:this.defaultData.cp;a.duration[0]=null!=a.duration[0]?a.duration[0]:this.defaultData.duration[0];a.duration[1]=null!=a.duration[1]?a.duration[1]:this.defaultData.duration[1];a.reltypeSpecial=null!=a.reltypeSpecial?a.reltypeSpecial:this.defaultData.reltypeSpecial;
a.contextSpecial[0]=null!=a.contextSpecial[0]?a.contextSpecial[0]:this.defaultData.contextSpecial[0];a.contextSpecial[1]=null!=a.contextSpecial[1]?a.contextSpecial[1]:this.defaultData.contextSpecial[1];a.contextSpecial[2]=null!=a.contextSpecial[2]?a.contextSpecial[2]:this.defaultData.contextSpecial[2];a.connectSpecial[0]=null!=a.connectSpecial[0]?a.connectSpecial[0]:this.defaultData.connectSpecial[0];a.connectSpecial[1]=null!=a.connectSpecial[1]?a.connectSpecial[1]:this.defaultData.connectSpecial[1];
a.job=null!=a.job?a.job:this.defaultData.job;a.studies=null!=a.studies?a.studies:this.defaultData.studies;a.age=null!=a.age?a.age:this.defaultData.age;a.sexe=null!=a.sexe?a.sexe:this.defaultData.sexe;a.famsit=null!=a.famsit?a.famsit:this.defaultData.famsit;a.reltype=null!=a.reltype?a.reltype:this.defaultData.reltype;a.loc=null!=a.loc?a.loc:this.defaultData.loc;a.context=null!=a.context?a.context:this.defaultData.context;a.freq=null!=a.freq?a.freq:this.defaultData.freq;a.connect=null!=a.connect?a.connect:
-this.defaultData.connect;var b=lsi.get("f_contacts",a.contact);if(!1===b)return!1;if(!isNaN(b.existing)){var c=lsi.get("f_friends",b.existing);b.username=c.name;a.age=c.age;a.sexe=c.sexe;a.loc=c.dist;isNaN(c.reltype)?(a.reltype=10,a.reltypeSpecial=c.reltype):(a.reltype=c.reltype,a.reltypeSpecial="");null!=c.studies2&&(a.studies=c.studies2,a.job=c.job,a.famsit=c.famsit,a.city=c.city,a.cp=c.cp,a.quartier=c.quartier,a.duration[0]=c.duration[0],a.duration[1]=c.duration[1],a.context=c.context,a.contextSpecial=
-c.contextExtra,a.connect=c.connect,a.connectSpecial=c.connectExtra,a.freq=c.freq)}this.container.innerHTML+=fFicheBuilder.build({name:b.username,countcall:b.countcall,countsms:b.countsms,uid:a.uid,contact:a.contact,city:a.city,quartier:a.quartier,cp:a.cp,duration0:a.duration[0],duration1:a.duration[1],reltypespecial:a.reltypeSpecial,contextspecial0:a.contextSpecial[0],contextspecial1:a.contextSpecial[1],contextspecial2:a.contextSpecial[2],connectspecial0:a.connectSpecial[0],connectspecial1:a.connectSpecial[1]});
-b=$('[data-sublink="facebook"] article.fiche-relation input[data-name="uid"][value="'+a.uid+'"] ~ h5>span>select[data-name="job"]>option[value="'+a.job+'"]');null!=b&&b.setAttribute("selected","selected");b=$('[data-sublink="facebook"] article.fiche-relation input[data-name="uid"][value="'+a.uid+'"] ~ h5>span>select[data-name="studies"]>option[value="'+a.studies+'"]');null!=b&&b.setAttribute("selected","selected");b=$('[data-sublink="facebook"] article.fiche-relation input[data-name="uid"][value="'+
-a.uid+'"] ~ h5>span>select[data-name="age"]>option[value="'+a.age+'"]');null!=b&&b.setAttribute("selected","selected");c=$$('[data-sublink="facebook"] article.fiche-relation input[data-name="uid"][value="'+a.uid+'"] ~ h5>input[type="radio"][data-name="sexe"]');for(b=0;binput[type="radio"][data-name="famsit"]');
-for(b=0;binput[type="radio"][data-name="reltype"]');for(b=0;binput[type="radio"][data-name="loc"]');
-for(b=0;binput[type="radio"][data-name="context"]');for(b=0;binput[type="radio"][data-name="freq"]');
-for(b=0;binput[type="radio"][data-name="connect"]');for(b=0;blsi.keys("f_contacts").length?lsi.keys("f_contacts").length:20;if(b.length=c)break}var a=lsi["export"]("f_fiches"),f;for(f in a)b=lsi.get("f_contacts",a[f].contact),null!=b&&-1!=
-b.sms&&-1!=b.call&&(b=10>parseInt(f)?10+b.sms:b.call,b=a[b],null==b||null==a[f]||null==b.timestamp||null==a[f].timestamp||b.timestamp>=a[f].timestamp||(c=a[f],c.uid=b.uid,lsi.set("f_fiches",b.uid,c)));console.groupEnd()};
-inputFacebookFiche.prototype.nav=function(a){if(null==a||!1===a.getData("n")||isNaN(a.getData("n"))||"f_nav-fiche"!=a.parentNode.id)return!1;for(var b=$$('[data-sublink="facebook"] #f_nav-fiche > span.active'),c=0;cHISTORIQUE");10>e&&c'+(e%10+1)+" ":(10==e&&(this.nav_container.innerHTML+='MESSENGER'),this.nav_container.innerHTML+=''+
-(e%10+1)+"")}for(var d in a)b=$('[data-sublink="facebook"] #f_nav-fiche [data-n="'+a[d].uid+'"]'),null!=b&&(!0===a[d].valid?b.addClass("done"):b.remClass("done"));this.nav($('[data-sublink="facebook"] #f_nav-fiche [data-n="'+this.selected+'"]'))};
-inputFacebookFiche.prototype.check=function(a){if(2>a.city.length||isNaN(parseInt(a.duration[0]))&&0a.reltypeSpecial.length||
-"11"==a.context&&2>a.contextSpecial[0].length||"12"==a.context&&2>a.contextSpecial[1].length||"13"==a.context&&2>a.contextSpecial[2].length?!1:!0};inputFacebookFiche.prototype.attach=function(a){console.group("[facebook.fiche] attaching events");lsi.createDataset("f_fiches");this.storageToFields();this.handler=a;var b=this,b=this;this.nav_container.addEventListener("click",function(a){b.nav(a.target);b.handler(a.target)},!1);console.groupEnd()};
+this.defaultData.connect;var c=lsi.get("f_contacts",a.contact);if(!1===c)return!1;if(!isNaN(c.existing)){var b=lsi.get("f_friends",c.existing);c.username=b.name;a.age=b.age;a.sexe=b.sexe;a.loc=b.dist;isNaN(b.reltype)?(a.reltype=10,a.reltypeSpecial=b.reltype):(a.reltype=b.reltype,a.reltypeSpecial="");null!=b.studies2&&(a.studies=b.studies2,a.job=b.job,a.famsit=b.famsit,a.city=b.city,a.cp=b.cp,a.quartier=b.quartier,a.duration[0]=b.duration[0],a.duration[1]=b.duration[1],a.context=b.context,a.contextSpecial=
+b.contextExtra,a.connect=b.connect,a.connectSpecial=b.connectExtra,a.freq=b.freq)}this.container.innerHTML+=fFicheBuilder.build({name:c.username,countcall:c.countcall,countsms:c.countsms,uid:a.uid,contact:a.contact,city:a.city,quartier:a.quartier,cp:a.cp,duration0:a.duration[0],duration1:a.duration[1],reltypespecial:a.reltypeSpecial,contextspecial0:a.contextSpecial[0],contextspecial1:a.contextSpecial[1],contextspecial2:a.contextSpecial[2],connectspecial0:a.connectSpecial[0],connectspecial1:a.connectSpecial[1]});
+c=$('[data-sublink="facebook"] article.fiche-relation input[data-name="uid"][value="'+a.uid+'"] ~ h5>span>select[data-name="job"]>option[value="'+a.job+'"]');null!=c&&c.setAttribute("selected","selected");c=$('[data-sublink="facebook"] article.fiche-relation input[data-name="uid"][value="'+a.uid+'"] ~ h5>span>select[data-name="studies"]>option[value="'+a.studies+'"]');null!=c&&c.setAttribute("selected","selected");c=$('[data-sublink="facebook"] article.fiche-relation input[data-name="uid"][value="'+
+a.uid+'"] ~ h5>span>select[data-name="age"]>option[value="'+a.age+'"]');null!=c&&c.setAttribute("selected","selected");b=$$('[data-sublink="facebook"] article.fiche-relation input[data-name="uid"][value="'+a.uid+'"] ~ h5>input[type="radio"][data-name="sexe"]');for(c=0;cinput[type="radio"][data-name="famsit"]');
+for(c=0;cinput[type="radio"][data-name="reltype"]');for(c=0;cinput[type="radio"][data-name="loc"]');
+for(c=0;cinput[type="radio"][data-name="context"]');for(c=0;cinput[type="radio"][data-name="freq"]');
+for(c=0;cinput[type="radio"][data-name="connect"]');for(c=0;c=d)break}var a=lsi["export"]("f_fiches"),f;
+for(f in a)if(d=lsi.get("f_contacts",a[f].contact)){c=null;e=parseInt(a[f].uid)=this.top_size)&&(b=lsi.get("f_contacts",a[g].contact),g!=f&&b)){var h=0a[f].timestamp||(d=a[f],d.uid=c.uid,lsi.set("f_fiches",c.uid,d))}console.groupEnd()};
+inputFacebookFiche.prototype.nav=function(a){if(!(a instanceof Element&&a.getData("n"))||isNaN(a.getData("n"))||"f_nav-fiche"!=a.parentNode.id)return!1;for(var c=$$('[data-sublink="facebook"] #f_nav-fiche > span.active'),b=0;bHISTORIQUE");20>d&&b'+(d%20+1)+" ":(20==d&&(this.nav_container.innerHTML+=' MESSENGER '),this.nav_container.innerHTML+=''+(d%20+1)+"")}for(var e in a)c=$('[data-sublink="facebook"] #f_nav-fiche [data-n="'+a[e].uid+'"]'),null!=c&&(!0===a[e].valid?c.addClass("done"):c.remClass("done"));this.nav($('[data-sublink="facebook"] #f_nav-fiche [data-n="'+this.selected+'"]'))};
+inputFacebookFiche.prototype.check=function(a){if(2>a.city.length||isNaN(parseInt(a.duration[0]))&&0a.reltypeSpecial.length||
+"11"==a.context&&2>a.contextSpecial[0].length||"12"==a.context&&2>a.contextSpecial[1].length||"13"==a.context&&2>a.contextSpecial[2].length?!1:!0};inputFacebookFiche.prototype.attach=function(a){console.group("[facebook.fiche] attaching events");lsi.createDataset("f_fiches");this.storageToFields();this.handler=a;var c=this,c=this;this.nav_container.addEventListener("click",function(a){c.nav(a.target);c.handler(a.target)},!1);console.groupEnd()};
diff --git a/js/includes/min/input-facebook-mini.js b/js/includes/min/input-facebook-mini.js
index afbcca9..c6a565d 100644
--- a/js/includes/min/input-facebook-mini.js
+++ b/js/includes/min/input-facebook-mini.js
@@ -1,4 +1,4 @@
-function inputFacebookMini(a,c){this.container=a;this.nav_container=c}inputFacebookMini.prototype={container:this.container,nav_container:this.nav_container,selected:0,handler:null,defaultData:{sexe:"2",age:".",studies:"0",loc:".",reltype:"9",unknown:!1,reltypeSpecial:"",timestamp:0,valid:!1}};
+function inputFacebookMini(a,c){this.container=a;this.nav_container=c}inputFacebookMini.prototype={container:this.container,nav_container:this.nav_container,selected:null,handler:null,defaultData:{sexe:"2",age:".",studies:"0",loc:".",reltype:"9",unknown:!1,reltypeSpecial:"",timestamp:0,valid:!1}};
inputFacebookMini.prototype.fieldsToStorage=function(){console.group("[facebook.mini] fields to storage");for(var a=$$('[data-sublink="facebook"] article.mini-relation-panel .mini-fiche-relation'),c=0;c MINI UPDATE");b={uid:parseInt(b.uid),sexe:b.sexe,age:b.age,studies:b.studies,reltype:b.reltype,
reltypeSpecial:b.reltypeSpecial,loc:b.loc,unknown:null!=b.unknown,hash:d};b.valid=this.check(b);0 FICHE UPDATE"),b.timestamp=Date.now());lsi.set("f_mini-fiches",b.uid,b)}}console.groupEnd()};
inputFacebookMini.prototype.add=function(a){if(null==a||null==a.uid)return!1;a.age=null!=a.age?a.age:this.defaultData.age;a.sexe=null!=a.sexe?a.sexe:this.defaultData.sexe;a.studies=null!=a.studies?a.studies:this.defaultData.studies;a.reltype=null!=a.reltype?a.reltype:this.defaultData.reltype;a.reltypeSpecial=null!=a.reltypeSpecial?a.reltypeSpecial:this.defaultData.reltypeSpecial;a.loc=null!=a.loc?a.loc:this.defaultData.loc;a.unknown=null!=a.unknown?a.unknown:this.defaultData.unknown;var c=lsi.get("f_contacts",
@@ -6,8 +6,8 @@ a.uid);if(!1===c)return!1;if(!isNaN(c.existing)){var b=lsi.get("f_friends",c.exi
a.studies+'"]');null!=c&&c.setAttribute("selected","selected");c=$('[data-sublink="facebook"] article.mini-fiche-relation input[data-name="uid"][value="'+a.uid+'"] ~ h5>span>select[data-name="age"]>option[value="'+a.age+'"]');null!=c&&c.setAttribute("selected","selected");b=$$('[data-sublink="facebook"] article.mini-fiche-relation input[data-name="uid"][value="'+a.uid+'"] ~ h5>input[type="radio"][data-name="sexe"]');for(c=0;cinput[type="radio"][data-name="reltype"]');for(c=0;cinput[type="radio"][data-name="loc"]');for(c=0;cinput[type="checkbox"][data-name="unknown"]');null!=c&&a.unknown&&c.setAttribute("checked","checked")};
-inputFacebookMini.prototype.storageToFields=function(){console.group("[facebook.mini] storage to fields");var a=lsi.get("f_mini-fiches",this.selected);if(null==a)return this.updateNavBar(),!1;this.container.innerHTML="";this.add(a);this.updateNavBar();console.groupEnd()};
+inputFacebookMini.prototype.storageToFields=function(){console.group("[facebook.mini] storage to fields");var a=lsi.get("f_mini-fiches",this.selected);if(null===a){if(null===this.selected)return a=lsi.keys("f_mini-fiches"),0 span.active'),b=0;b span.active'),b=0;b'+ ++c+"");for(b in a)isNaN(b)||(c=$('[data-sublink="facebook"] #f_nav-mini [data-n="'+a[b].uid+'"]'),null!=c&&(!0===a[b].valid?c.addClass("done"):c.remClass("done")));this.nav($('[data-sublink="facebook"] #f_nav-mini [data-n="'+this.selected+'"]'))};
-inputFacebookMini.prototype.check=function(a){return a.unknown?!0:""==a.sexe||"."==a.studies||"."==a.age||""==a.loc||""==a.reltype||"10"==a.reltype&&2>a.reltypeSpecial.length?!1:!0};inputFacebookMini.prototype.attach=function(a){console.group("[facebook.mini] attaching events");lsi.createDataset("f_mini-fiches");this.storageToFields();this.handler=a;var c=this;this.nav_container.addEventListener("click",function(a){c.nav(a.target);c.handler(a.target)},!1);console.groupEnd()};
+inputFacebookMini.prototype.check=function(a){return a.unknown?!0:""==a.sexe||"."==a.studies||"."==a.age||""==a.loc||""==a.reltype||"10"==a.reltype&&2>a.reltypeSpecial.length?!1:!0};inputFacebookMini.prototype.attach=function(a){console.group("[facebook.mini] attaching events");lsi.createDataset("f_mini-fiches");this.storageToFields();this.handler=a;this.nav_container.addEventListener("click",function(a){this.nav(a.target);this.handler(a.target)}.bind(this),!1);console.groupEnd()};
diff --git a/js/includes/min/input-html-facebook-data.js b/js/includes/min/input-html-facebook-data.js
index 5ac4879..fc8e5ad 100644
--- a/js/includes/min/input-html-facebook-data.js
+++ b/js/includes/min/input-html-facebook-data.js
@@ -1,3 +1,3 @@
-var fContactBuilder=new HTMLBuilder;fContactBuilder.setLayout("