From 05efdedd02173f03f571e12f9b8f42918b056e84 Mon Sep 17 00:00:00 2001 From: xdrm-brackets Date: Sat, 22 Oct 2016 13:31:21 +0200 Subject: [PATCH] Propagation de la gestion du clonage des `fiches` et des `mini-fiches` de `input.phone` vers `input.facebook` (`fieldsToStorage`, `storageToFields`, `sync`) --- .../js/includes/input-facebook-fiche.js | 371 ++++++++---------- .../js/includes/input-facebook-mini.js | 168 ++++---- public_html/js/includes/input-phone-mini.js | 2 +- .../js/includes/min/input-facebook-fiche.js | 40 +- .../js/includes/min/input-facebook-mini.js | 36 +- 5 files changed, 269 insertions(+), 348 deletions(-) diff --git a/public_html/js/includes/input-facebook-fiche.js b/public_html/js/includes/input-facebook-fiche.js index 3efa6b6..6584f89 100644 --- a/public_html/js/includes/input-facebook-fiche.js +++ b/public_html/js/includes/input-facebook-fiche.js @@ -6,6 +6,7 @@ function inputFacebookFiche(container, navContainer){ this.top_size = 10; } + /* [1] Attributs =========================================================*/ inputFacebookFiche.prototype = { @@ -42,39 +43,29 @@ inputFacebookFiche.prototype = { inputFacebookFiche.prototype.fieldsToStorage = function(){ console.group('[facebook.fiche] fields to storage'); - // {1} Pour chaque formulaire de contact présent // + var i, l, deflater, deflated, existingData, obj, hash; + + /* (1) Pour chaque formulaire de contact présent + ---------------------------------------------------------*/ var existingFiches = $$('[data-sublink="facebook"] article.relation-panel .fiche-relation'); - for( var i = 0 ; i < existingFiches.length ; i++ ){ + for( i = 0, l = existingFiches.length ; i < l ; i++ ){ - // {2} On initialise notre deflater pour récupérer les valeurs // - var deflater = new FormDeflater(existingFiches[i], ['input', 'select'], ['data-name']); + /* (1) On initialise notre deflater pour récupérer les valeurs */ + deflater = new FormDeflater(existingFiches[i], ['input', 'select'], ['data-name']); - // {3} On enregistre ce contact si le numéro n'est pas vide et soit pseudo/prénom/nom // - var deflated = deflater.deflate(); - // On crée le hash - var deflatedHash = crc32(JSON.stringify(deflated)); + /* (2) On récupère les données */ + deflated = deflater.deflate(); + /* (3) On récupère les données du LSI si elles existent */ + existingData = lsi.get('f_fiches', deflated.uid); - // console.log( deflated ); - - - // {4} On récupère les données du LSI si elles existent // - var existingData = lsi.get('f_fiches', deflated.uid); - - // Si n'existe pas, on passe au suivant + // Si erreur, on passe à la fiche suivante if( existingData === false ) continue; - // {5} On récupère et met en forme les valeurs du deflater // - // Si le hash est le même, on ne fait rien - if( existingData.hash != null && existingData.hash == deflatedHash ) - return; - - - var obj = { - contact: parseInt(deflated.contact), - uid: parseInt(deflated.uid), + /* (4) On récupère et met en forme les valeurs du deflater */ + obj = { sexe: deflated.sexe, age: deflated.age, job: deflated.job, @@ -92,22 +83,31 @@ inputFacebookFiche.prototype.fieldsToStorage = function(){ freq: deflated.freq, connect: deflated.connect, connectSpecial: deflated.connectSpecial, - hash: deflatedHash + uid: parseInt(deflated.uid), + contact: parseInt(deflated.contact) }; + /* (5) On calcule/compare le hash */ - /* (6) On vérifie la validité des données et on l'enregistre dans l'objet avec la date de modification */ + // {5.1} On calcule le hash // + hash = crc32( JSON.stringify(obj) ); + + // {5.2} Si le hash est identique, on ne fait rien // + if( existingData['hash'] != undefined && hash == existingData.hash ) + continue; + + // {5.3} On enregistre le hash // + obj.hash = hash; + + + /* (6) On calcule la validité des données */ obj.valid = this.check(obj); - // On met à jour la date de modification, si on a pas qu'@uid de différent - if( diff(existingData, obj, ['hash', 'valid', 'timestamp']).length > 0 ){ - console.log( diff(existingData, obj, ['hash', 'valid', 'timestamp']) ); - console.warn('> FICHE UPDATE'); - obj.timestamp = Date.now(); - }else if( existingData['timestamp'] == undefined ) - obj.timestamp = this.defaultData.timestamp; + /* (7) On met à jour le `timestamp` (car à ce point, on a une modification) */ + obj.timestamp = Date.now(); + console.warn('> FICHE UPDATE ('+(obj.timestamp-input_ts)+')'); - /* (7) On enregistre les données dans le 'localStorage' */ + /* (8) On enregistre les données dans le 'localStorage' */ lsi.set('f_fiches', obj.uid, obj); } @@ -115,13 +115,6 @@ inputFacebookFiche.prototype.fieldsToStorage = function(){ }; - - - - - - - /* [3] Gestion de l'ajout physique d'une nouvelle fiche =========================================================*/ /* @@ -308,46 +301,46 @@ inputFacebookFiche.prototype.add = function(objectData){ }; - - - - - - - - /* [4] Gestion de l'affichage depuis le 'localStorage' =========================================================*/ inputFacebookFiche.prototype.storageToFields = function(){ console.group('[facebook.fiche] storage to fields'); - // {1} Pour chaque contact du 'localStorage' // + var clone, hash; + + /* (1) On récupère les fiches du 'localStorage' */ var ficheData = lsi.export('f_fiches'); - // On réinitialise le HTML + /* (2) On réinitialise le HTML */ this.container.innerHTML = ''; - for( var key in ficheData ) + /* (3) Pour chaque fiche */ + for( var key in ficheData ){ + + // {3.1} On calcule/enregistre le hash (sans `timestamp`, `hash`, `valid`) // + clone = cloneObject( ficheData[key] ); + delete clone['hash']; + delete clone['timestamp']; + delete clone['valid']; + ficheData[key].hash = crc32( JSON.stringify(clone) ); + + // On enregistre dans le `localStorage` + lsi.set('f_fiches', ficheData[key].uid, ficheData[key]); + + // {3.2} Pour la fiche à rendre graphiquement // if( ficheData[key].uid == this.selected ) this.add(ficheData[key]); + } - // {4} On met à jour la navigation // + + /* (4) On met à jour la navigation */ this.updateNavBar(); console.groupEnd(); }; - - - - - - - - - /* [5] Synchronisation des CONTACT vers les MINI fiches =========================================================*/ inputFacebookFiche.prototype.sync = function(){ @@ -362,7 +355,7 @@ inputFacebookFiche.prototype.sync = function(){ /* (2) Contiendra les uids des fiches qui seront crées */ var addedFicheUids = []; - var ficheData, contactData, miniData; + var ficheData, contactData, miniData, i, ficheUid, uid, nbMaxFiche; } @@ -371,34 +364,22 @@ inputFacebookFiche.prototype.sync = function(){ ---------------------------------------------------------*/ // 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; + nbMaxFiche = lsi.keys('f_contacts').length < 2*this.top_size ? lsi.keys('f_contacts').length : 2*this.top_size; /* (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++; - - // On enregistre le nouvel UID dans les uid crées - addedFicheUids.push(ficheUid); + for( uid = 0 ; uid < nbMaxFiche ; uid++ ){ /* (2) On récupère les informations de la FICHE (si elle existe) */ - var ficheData = lsi.get('f_fiches', ficheUid); + ficheData = lsi.get('f_fiches', uid); // Si la fiche n'existe pas, on la crée avec les valeurs par défaut !ficheData && ( ficheData = this.defaultData ); /* (3) On met à jour la fiche ET on l'enregistre */ - ficheData.uid = ficheUid; - ficheData.contact = parseInt(uid); - lsi.set('f_fiches', ficheUid, ficheData); + ficheData.uid = uid; + ficheData.contact = uid; + lsi.set('f_fiches', uid, ficheData); - - /* (4) Si on a déja crée 20+20 fiches, on arrête */ - if( addedFicheUids.length >= nbMaxFiche ) - break; } } @@ -406,156 +387,143 @@ inputFacebookFiche.prototype.sync = function(){ { /* (3) Gestion des liens entre mini-fiches et fiches ---------------------------------------------------------*/ - var hasSameUsername, hasSameLink; + var originalContact, cloneContact, + hasSameUsername, hasSameLink, + copied; + + var alreadyProcessedUsername = {}, + alreadyProcessedExisting = {}; ficheData = lsi.export('f_fiches'); miniData = lsi.export('f_mini-fiches'); - // Pour chaque fiche + // Pour chaque mini-fiche for( var key in ficheData ){ /* (1) On récupère le contact associé */ - var associatedContact = lsi.get('f_contacts', ficheData[key].contact); + originalContact = lsi.get('f_contacts', ficheData[key].contact); - // Si erreur, on passe au suivant - if( !associatedContact ) + // {1.1} On vérifie que le contact n'a pas déja été traité // + if( originalContact.username.length > 0 && alreadyProcessedUsername[originalContact.username] != undefined + || originalContact.username.length == 0 && alreadyProcessedExisting[originalContact.existing] != undefined ) continue; - /* (3) On récupère la mini-fiche clone si existe */ - var clone = null; + // {1.2} On enregistre username || existing // + if( originalContact.username.length > 0 ) alreadyProcessedUsername[originalContact.username] = 0; + else alreadyProcessedExisting[originalContact.existing] = 0; - // Pour chaque mini-fiche - for( var i in miniData ){ + // Si erreur, on passe au suivant + if( !originalContact ) + continue; + + /* (3) On récupère la liste des fiches/mini-fiches de même contact*/ + var clone = [ + [ 'fiche', ficheData[key] ] + ]; + + // {3.1} On récupère les fiches de même contact // + for( i in ficheData ){ // on récupère le contact associé (si on est dans `call`, celui dans la tranche avec `sms` / et inversement) - contactData = lsi.get('f_contacts', miniData[i].contact); + cloneContact = lsi.get('f_contacts', ficheData[i].contact); - if( !contactData ) + if( i == key || !cloneContact ) continue; // meme pseudo - hasSameUsername = contactData.username.length > 0 && associatedContact.username === contactData.username; + hasSameUsername = cloneContact.username.length > 0 && originalContact.username === cloneContact.username; // meme lien de contact - hasSameLink = !isNaN(contactData.existing) && associatedContact.existing === contactData.existing; + hasSameLink = !isNaN(cloneContact.existing) && originalContact.existing === cloneContact.existing; // si ont le même contact, alors on enregistre le clone (sauf si la même fiche) - ( hasSameUsername || hasSameLink ) && ( clone = miniData[i] ); - - if( clone !== null ) - break; + ( hasSameUsername || hasSameLink ) && clone.push( ['fiche', ficheData[i]] ); } + // {3.2} On récupère les mini-fiches de même contact // + for( i in miniData ){ - /* (4) Si c'est le clone qui a été modifié en dernier, on ne fait rien */ - var fiche_ts = ( ficheData[key].hasOwnProperty('timestamp') ) ? ficheData[key].timestamp : 0; - var mini_ts = ( clone instanceof Object && clone.hasOwnProperty('timestamp') ) ? clone.timestamp : 0; - - if( clone === null ) - continue; - - - - /* (5.1) Si clone modifiée en dernier > On copie les données de la mini (CLONE) dans la FICHE */ - var copied; - if( mini_ts > fiche_ts ){ - - // console.warn('copying mini#'+clone.uid+' to fiche#'+ficheData[key].uid, mini_ts-global_start_timestamp, fiche_ts-global_start_timestamp); - copied = ficheData[key]; - copied.age = clone.age; - copied.sexe = clone.sexe; - copied.loc = clone.loc; - copied.reltype = clone.reltype; - copied.reltypeSpecial = clone.reltypeSpecial; - copied.timestamp = Date.now(); - lsi.set('f_fiches', copied.uid, copied); - - // clone.timestamp = copied.timestamp; - // lsi.set('f_mini-fiches', clone.uid, clone); - - /* (5.2) Si fiche modifiée en dernier > On copie les données de la FICHE dans la mini (CLONE) */ - }else if( fiche_ts > mini_ts ){ - - // console.warn('copying fiche#'+ficheData[key].uid+' to mini#'+clone.uid, fiche_ts-global_start_timestamp, mini_ts-global_start_timestamp); - copied = clone; - copied.age = ficheData[key].age; - copied.sexe = ficheData[key].sexe; - copied.loc = ficheData[key].loc; - copied.reltype = ficheData[key].reltype; - copied.reltypeSpecial = ficheData[key].reltypeSpecial; - copied.timestamp = Date.now(); - lsi.set('f_mini-fiches', copied.uid, copied); - - // ficheData[key].timestamp = copied.timestamp; - // lsi.set('f_fiches', ficheData[key].uid, ficheData[key]); - - } - - } - - } - - - { /* (4) 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 ) - continue; - - /* (3) On récupère la/les autre(s) fiche(s) (clone(s)) */ - var clone = null; - var inHistory = parseInt( ficheData[key].uid ) < this.top_size; // vrai si dans l'HISTORIQUE, sinon dans MESSENGER - - for( var i in ficheData ){ - - // si on est pas dans le bonne tranche, on passe au suivant - if( inHistory && i < this.top_size || !inHistory && i >= this.top_size ) - continue; - - // on récupère le contact associé (si on est dans `history`, celui dans la tranche avec `messenger` / et inversement) - contactData = lsi.get('f_contacts', ficheData[i].contact); - - if( i == key || !contactData ) - continue; + // on récupère le contact associé (si on est dans `call`, celui dans la tranche avec `sms` / et inversement) + cloneContact = lsi.get('f_contacts', miniData[i].contact); // meme pseudo - hasSameUsername = contactData.username.length > 0 && associatedContact.username === contactData.username; + hasSameUsername = cloneContact.username.length > 0 && originalContact.username === cloneContact.username; // meme lien de contact - hasSameLink = !isNaN(contactData.existing) && associatedContact.existing === contactData.existing; + hasSameLink = !isNaN(cloneContact.existing) && originalContact.existing === cloneContact.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; + ( hasSameUsername || hasSameLink ) && clone.push( ['mini', miniData[i]] ); } - - /* (4) Si c'est le clone qui a été modifié en dernier, on ne fait rien */ - var fiche_ts = ( ficheData[key].hasOwnProperty('timestamp') ) ? ficheData[key].timestamp : 0; - var clone_ts = ( clone instanceof Object && clone.hasOwnProperty('timestamp') ) ? clone.timestamp : 0; - if( clone === null || clone_ts > fiche_ts ) + // {3.3} si aucun clone, on quitte // + if( clone.length === 1 ) continue; - // console.warn('copying fiche#'+ficheData[key].uid+' to fiche#'+clone.uid, fiche_ts-global_start_timestamp, clone_ts-global_start_timestamp); + + /* (4) On récupère le modèle (dernier modifié) */ + var clones_ts = []; // contiendra les temps des clones + + for( i in clone ) + clones_ts[i] = clone[i][1].hasOwnProperty('timestamp') ? clone[i][1].timestamp : 0; + + var last_index = clones_ts.indexOf( Math.max.apply(Math, clones_ts) ); + + /* (5) On copie le dernier modifié dans les clones */ + for( i in clone ){ + + // excepté le dernier modifié + if( i == last_index ) + continue; - /* (5) On copie les données de la FICHE dans le CLONE */ - var copied = ficheData[key]; - copied.uid = clone.uid; - // copied.timestamp = Date.now(); - lsi.set('f_fiches', copied.uid, copied); + /* (5.1) fiche vers fiche */ + if( clone[i][0] == clone[last_index][0] ){ + + /*CLONING_DEBUG*///console.warn('copying fiche#'+clone[last_index][1].uid+' to fiche#'+clone[i][1].uid, clones_ts[last_index]-input_ts, clones_ts[i]-input_ts); + copied = cloneObject( clone[last_index][1] ); + copied.uid = clone[i][1].uid; + lsi.set('f_fiches', copied.uid, copied); + + /* (5.2) fiche vers mini OU mini vers fiche*/ + }else if( clone[last_index][0] == 'fiche' ){ + + /*CLONING_DEBUG*///console.warn('copying fiche#'+clone[last_index][1].uid+' to mini#'+clone[i][1].uid, clones_ts[last_index]-input_ts, clones_ts[i]-input_ts); + copied = cloneObject( clone[i][1] ); + copied.age = clone[last_index][1].age; + copied.sexe = clone[last_index][1].sexe; + copied.loc = clone[last_index][1].loc; + copied.reltype = clone[last_index][1].reltype; + copied.reltypeSpecial = clone[last_index][1].reltypeSpecial; + lsi.set('f_mini-fiches', copied.uid, copied); + + /* (5.3) mini vers fiche */ + }else{ + + /*CLONING_DEBUG*///console.warn('copying mini#'+clone[last_index][1].uid+' to fiche#'+clone[i][1].uid, clones_ts[last_index]-input_ts, clones_ts[i]-input_ts); + copied = cloneObject( clone[i][1] ); + copied.age = clone[last_index][1].age; + copied.sexe = clone[last_index][1].sexe; + copied.loc = clone[last_index][1].loc; + copied.reltype = clone[last_index][1].reltype; + copied.reltypeSpecial = clone[last_index][1].reltypeSpecial; + + // Particularité 1, `mini` peut prendre la valeur '.' en plus de celles de `fiche` + if( clone[last_index][1].loc == '.' ) copied.loc = '0'; + + // Particularité 2, `mini` peut prendre la valeur '9' (inconnu) en plus de celles de `fiche` + if( clone[last_index][1].reltype == '9' ){ + copied.reltype = '10'; + copied.reltypeSpecial = 'inconnu'; + } + + lsi.set('f_fiches', copied.uid, copied); + + } + + } + /*CLONING_DEBUG*///console.warn('cloning done'); - // ficheData[key].timestamp = copied.timestamp; - // lsi.set('f_fiches', ficheData[key].uid, ficheData[key]); } @@ -567,11 +535,6 @@ inputFacebookFiche.prototype.sync = function(){ }; - - - - - /* [6] Gestion de la navigation entre les fiches =========================================================*/ inputFacebookFiche.prototype.nav = function(element){ @@ -594,11 +557,6 @@ inputFacebookFiche.prototype.nav = function(element){ }; - - - - - /* [7] Mise à jour de la navigation =========================================================*/ inputFacebookFiche.prototype.updateNavBar = function(){ @@ -654,8 +612,6 @@ inputFacebookFiche.prototype.updateNavBar = function(){ }; - - /* [8] Vérification des données du formulaire =========================================================*/ inputFacebookFiche.prototype.check = function(ficheData){ @@ -733,9 +689,6 @@ inputFacebookFiche.prototype.check = function(ficheData){ }; - - - /* [9] Point d'amorçage de la gestion des contacts =========================================================*/ inputFacebookFiche.prototype.attach = function(handler){ diff --git a/public_html/js/includes/input-facebook-mini.js b/public_html/js/includes/input-facebook-mini.js index 89b5dee..be544fa 100644 --- a/public_html/js/includes/input-facebook-mini.js +++ b/public_html/js/includes/input-facebook-mini.js @@ -5,6 +5,7 @@ function inputFacebookMini(container, navContainer){ this.nav_container = navContainer; } + /* [1] Attributs =========================================================*/ inputFacebookMini.prototype = { @@ -32,63 +33,60 @@ inputFacebookMini.prototype = { inputFacebookMini.prototype.fieldsToStorage = function(){ console.group('[facebook.mini] fields to storage'); - // {1} Pour chaque formulaire de MINI fiche à l'écran // + var i, l, deflater, deflated, existingData, obj, hash; + + /* (1) Pour chaque formulaire de MINI fiche à l'écran + ---------------------------------------------------------*/ var existingMiniFiches = $$('[data-sublink="facebook"] article.mini-relation-panel .mini-fiche-relation'); - for( var i = 0 ; i < existingMiniFiches.length ; i++ ){ - // {2} On initialise notre deflater pour récupérer les valeurs // - var deflater = new FormDeflater(existingMiniFiches[i], ['input', 'select'], ['data-name']); + for( i = 0, l = existingMiniFiches.length ; i < l ; i++ ){ - // {3} On enregistre ce contact si le numéro n'est pas vide et soit pseudo/prénom/nom // - var deflated = deflater.deflate(); - // On crée le hash - var deflatedHash = crc32(JSON.stringify(deflated)); + /* (1) On initialise notre deflater pour récupérer les valeurs */ + deflater = new FormDeflater(existingMiniFiches[i], ['input', 'select'], ['data-name']); + /* (2) On récupère les données */ + deflated = deflater.deflate(); - // console.log(deflated); + /* (3) On récupère les données du LSI si elles existent */ + existingData = lsi.get('f_mini-fiches', deflated.uid); - - // {4} On récupère les données du LSI si elles existent // - var existingData = lsi.get('f_mini-fiches', deflated.uid); - - // Si n'existe pas, on passe à la suivante + // Si erreur, on passe à la fiche suivante if( existingData === false ) continue; - - // {5} On récupère et met en forme les valeurs du deflater // - // Si le hash est le même, on ne fait rien - if( existingData != null && existingData.hash != null && existingData.hash == deflatedHash ) - return; - - console.warn('> MINI UPDATE'); - - - var obj = { - uid: parseInt(deflated.uid), + /* (4) On récupère et met en forme les valeurs du deflater */ + obj = { contact: parseInt(deflated.uid), - sexe: deflated.sexe, // [0] Homme, [1] Femme, [2] Indéterminé + sexe: deflated.sexe, age: deflated.age, studies: deflated.studies, - reltype: deflated.reltype, // [0] ... + loc: deflated.loc, + reltype: deflated.reltype, reltypeSpecial: deflated.reltypeSpecial, - loc: deflated.loc, // [0] Choix 1 -> [3] Choix 4 unknown: deflated.unknown != null, - hash: deflatedHash + uid: parseInt(deflated.uid) }; - /* (8) On vérifie la validité des données et on l'enregistre dans l'objet avec la date de modification */ - obj.valid = this.check(obj); + /* (5) On calcule/compare le hash */ - // On met à jour la date de modification, si on a pas qu'@uid de différent - if( diff(existingData, obj, ['hash', 'valid', 'timestamp']).length > 0 ){ - console.log( diff(existingData, obj, ['hash', 'valid', 'timestamp']) ); - console.warn('> MINI UPDATE'); - obj.timestamp = Date.now(); - }else if( existingData['timestamp'] == undefined ) - obj.timestamp = this.defaultData.timestamp; + // {5.1} On calcule le hash // + hash = crc32( JSON.stringify(obj) ); + + // {5.2} Si le hash est identique, on ne fait rien // + if( existingData['hash'] != undefined && hash == existingData.hash ) + continue; + + // {5.3} On enregistre le hash // + obj.hash = hash; - /* (9) On enregistre les données dans le 'localStorage' */ + /* (6) On calcule la validité des données */ + obj.valid = this.check(obj); + + /* (7) On met à jour le `timestamp` (car à ce point, on a une modification) */ + obj.timestamp = Date.now(); + console.warn('> MINI UPDATE ('+(obj.timestamp-input_ts)+')'); + + /* (8) On enregistre les données dans le 'localStorage' */ lsi.set('f_mini-fiches', obj.uid, obj); } @@ -97,13 +95,6 @@ inputFacebookMini.prototype.fieldsToStorage = function(){ }; - - - - - - - /* [3] Gestion de l'ajout physique d'un nouveau contact =========================================================*/ /* @@ -207,14 +198,6 @@ inputFacebookMini.prototype.add = function(objectData){ }; - - - - - - - - /* [4] Gestion de l'affichage depuis le 'localStorage' =========================================================*/ inputFacebookMini.prototype.storageToFields = function(){ @@ -222,44 +205,63 @@ inputFacebookMini.prototype.storageToFields = function(){ /* (1) On charge le contact selectionné ---------------------------------------------------------*/ - var miniData = lsi.get('f_mini-fiches', this.selected); + var miniData = lsi.export('f_mini-fiches'); + var miniKeys = lsi.keys('f_mini-fiches'); + var selectedMini = miniData[this.selected] != undefined ? miniData[this.selected] : null; - /* (2.1) Si on ne trouve pas + /* (2) Si aucune mini sélectionnée, on prend la première ---------------------------------------------------------*/ - if( miniData === null ){ + if( selectedMini === null ){ - /* (2.1.1) Si `selected` est pas encore défini + /* (2.1) Si `selected` n'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 + /* (1) Si aucune mini, on quitte */ + if( miniKeys.length == 0 ) return false; + /* (2) Sinon, on prend la première */ + this.selected = miniKeys[0]; + return this.storageToFields(); - /* (2.1.2) S'il est déja défini, on met à jour la nav + /* (2.2) S'il est déja défini, on met à jour la nav ---------------------------------------------------------*/ }else{ this.updateNavBar(); return false; } + } - /* (2.2) Si on trouve + /* (3) Affichage de la fiche sélectionnée ---------------------------------------------------------*/ + var clone, hash; + /* (1) On réinitialise le HTML */ this.container.innerHTML = ''; - /* (2) On affiche la MINI fiche sélectionnée */ - this.add(miniData); + /* (2) Pour chaque mini */ + for( var key in miniData ){ + + // {3.1} On calcule/enregistre le hash (sans `timestamp`, `hash`, `valid`) // + clone = cloneObject( miniData[key] ); + delete clone['hash']; + delete clone['timestamp']; + delete clone['valid']; + miniData[key].hash = crc32( JSON.stringify(clone) ); + + // On enregistre dans le `localStorage` + lsi.set('f_mini-fiches', miniData[key].uid, miniData[key]); + + // {2.2} Pour la fiche à rendre graphiquement // + if( miniData[key].uid == this.selected ) + this.add(miniData[key]); + + + } + /* (3) On met à jour la navigation */ this.updateNavBar(); @@ -269,15 +271,6 @@ inputFacebookMini.prototype.storageToFields = function(){ }; - - - - - - - - - /* [5] Synchronisation des CONTACT vers les MINI fiches =========================================================*/ inputFacebookMini.prototype.sync = function(){ @@ -340,11 +333,6 @@ inputFacebookMini.prototype.sync = function(){ }; - - - - - /* [6] Gestion de la navigation entre les fiches =========================================================*/ inputFacebookMini.prototype.nav = function(element){ @@ -366,11 +354,6 @@ inputFacebookMini.prototype.nav = function(element){ }; - - - - - /* [7] Mise à jour de la navigation =========================================================*/ inputFacebookMini.prototype.updateNavBar = function(){ @@ -416,8 +399,6 @@ inputFacebookMini.prototype.updateNavBar = function(){ }; - - /* [8] Vérification des données du formulaire =========================================================*/ inputFacebookMini.prototype.check = function(miniData){ @@ -451,9 +432,6 @@ inputFacebookMini.prototype.check = function(miniData){ }; - - - /* [9] Point d'amorçage de la gestion des contacts =========================================================*/ inputFacebookMini.prototype.attach = function(handler){ diff --git a/public_html/js/includes/input-phone-mini.js b/public_html/js/includes/input-phone-mini.js index 58303af..337fc66 100644 --- a/public_html/js/includes/input-phone-mini.js +++ b/public_html/js/includes/input-phone-mini.js @@ -1,7 +1,7 @@ /* [0] Constructeur -> définit le conteneur et le bouton d'ajout =========================================================*/ function inputPhoneMini(container, navContainer){ - this.container = container; + this.container = container; this.nav_container = navContainer; } diff --git a/public_html/js/includes/min/input-facebook-fiche.js b/public_html/js/includes/min/input-facebook-fiche.js index 32ef721..444da5c 100644 --- a/public_html/js/includes/min/input-facebook-fiche.js +++ b/public_html/js/includes/min/input-facebook-fiche.js @@ -1,23 +1,23 @@ -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()):void 0==d.timestamp&&(b.timestamp=this.defaultData.timestamp);lsi.set("f_fiches",b.uid,b)}}console.groupEnd()}; +function inputFacebookFiche(a,b){this.container=a;this.nav_container=b;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");var a,b,c,e,d,h=$$('[data-sublink="facebook"] article.relation-panel .fiche-relation');a=0;for(b=h.length;a FICHE UPDATE ("+(e.timestamp-input_ts)+")"),lsi.set("f_fiches",e.uid,e);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 c=lsi.get("f_contacts",a.contact);if(!1===c)return!1;var b="";isNaN(c.existing)||(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,b="Contact import\u00e9: non modifiable!"):b="Contact import\u00e9 (incomplet): modifiable partiellement!");this.container.innerHTML+=fFicheBuilder.build({importedfiche:b,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=e)break}a=lsi["export"]("f_fiches");e= -lsi["export"]("f_mini-fiches");for(var f in a){var g=lsi.get("f_contacts",a[f].contact);if(g){var c=null,h;for(h in e)if(b=lsi.get("f_contacts",e[h].contact))if(d=0d?(d=a[f],d.age=c.age,d.sexe=c.sexe,d.loc=c.loc,d.reltype=c.reltype,d.reltypeSpecial= -c.reltypeSpecial,d.timestamp=Date.now(),lsi.set("f_fiches",d.uid,d)):d>g&&(d=c,d.age=a[f].age,d.sexe=a[f].sexe,d.loc=a[f].loc,d.reltype=a[f].reltype,d.reltypeSpecial=a[f].reltypeSpecial,d.timestamp=Date.now(),lsi.set("f_mini-fiches",d.uid,d)))}}a=lsi["export"]("f_fiches");for(f in a)if(g=lsi.get("f_contacts",a[f].contact)){c=null;e=parseInt(a[f].uid)=this.top_size)&&(b=lsi.get("f_contacts",a[h].contact),h!=f&&b&&(d=0d||(d=a[f],d.uid=c.uid,lsi.set("f_fiches",d.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>e&&b'+(e%20+1)+"  ":(20==e&&(this.nav_container.innerHTML+='
MESSENGER '),this.nav_container.innerHTML+=''+(e%20+1)+"")}for(var d in a)c=$('[data-sublink="facebook"] #f_nav-fiche [data-n="'+a[d].uid+'"]'),null!=c&&(!0===a[d].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()}; +this.defaultData.connect;var b=lsi.get("f_contacts",a.contact);if(!1===b)return!1;var c="";isNaN(b.existing)||(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,c="Contact import\u00e9: non modifiable!"):c="Contact import\u00e9 (incomplet): modifiable partiellement!");this.container.innerHTML+=fFicheBuilder.build({importedfiche:c,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;b span.active'),c=0;cHISTORIQUE");20>e&&c'+(e%20+1)+"  ":(20==e&&(this.nav_container.innerHTML+='
MESSENGER '),this.nav_container.innerHTML+=''+(e%20+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()}; diff --git a/public_html/js/includes/min/input-facebook-mini.js b/public_html/js/includes/min/input-facebook-mini.js index 31e16c1..bd48798 100644 --- a/public_html/js/includes/min/input-facebook-mini.js +++ b/public_html/js/includes/min/input-facebook-mini.js @@ -1,24 +1,14 @@ -<<<<<<< HEAD -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:{contact:null,sexe:"2",age:".",studies:"0",loc:".",reltype:"9",reltypeSpecial:"",unknown:!1,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),contact: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:e};b.valid=this.check(b);0 MINI UPDATE"),b.timestamp=Date.now()):void 0==d.timestamp&&(b.timestamp=this.defaultData.timestamp);lsi.set("f_mini-fiches",b.uid,b)}}console.groupEnd()}; -======= -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:e};b.valid=this.check(b);0 FICHE UPDATE"),b.timestamp=Date.now()):void 0==d.timestamp&&(b.timestamp=this.defaultData.timestamp);lsi.set("f_mini-fiches",b.uid,b)}}console.groupEnd()}; ->>>>>>> f8c0ef141fac6b47b8616172eba10575a9fb1273 -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", -a.uid);if(!1===c)return!1;if(!isNaN(c.existing)){var b=lsi.get("f_friends",c.existing);c.username=b.name;a.contact=b.contact;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.studies1&&(a.studies=b.studies1)}this.container.innerHTML+=fMiniFicheBuilder.build({name:c.username,uid:a.uid,reltypespecial:a.reltypeSpecial});c=$('[data-sublink="facebook"] article.mini-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.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){if(null===this.selected)return a=lsi.keys("f_mini-fiches"),0 span.active'),b=0;b span.active'),b=0;b>>>>>> f8c0ef141fac6b47b8616172eba10575a9fb1273 -inputFacebookMini.prototype.updateNavBar=function(){var a=lsi["export"]("f_mini-fiches");this.nav_container.innerHTML="";var c=0,b;for(b in a)isNaN(b)||(this.nav_container.innerHTML+=''+ ++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+'"]'))}; +function inputFacebookMini(a,b){this.container=a;this.nav_container=b}inputFacebookMini.prototype={container:this.container,nav_container:this.nav_container,selected:null,handler:null,defaultData:{contact:null,sexe:"2",age:".",studies:"0",loc:".",reltype:"9",reltypeSpecial:"",unknown:!1,timestamp:0,valid:!1}}; +inputFacebookMini.prototype.fieldsToStorage=function(){console.group("[facebook.mini] fields to storage");var a,b,c,d,e,f=$$('[data-sublink="facebook"] article.mini-relation-panel .mini-fiche-relation');a=0;for(b=f.length;a MINI UPDATE ("+(d.timestamp-input_ts)+")"),lsi.set("f_mini-fiches",d.uid,d);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 b=lsi.get("f_contacts", +a.uid);if(!1===b)return!1;if(!isNaN(b.existing)){var c=lsi.get("f_friends",b.existing);b.username=c.name;a.contact=c.contact;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.studies1&&(a.studies=c.studies1)}this.container.innerHTML+=fMiniFicheBuilder.build({name:b.username,uid:a.uid,reltypespecial:a.reltypeSpecial});b=$('[data-sublink="facebook"] article.mini-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.mini-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.mini-fiche-relation input[data-name="uid"][value="'+a.uid+'"] ~ h5>input[type="radio"][data-name="sexe"]');for(b=0;binput[type="radio"][data-name="reltype"]');for(b=0;binput[type="radio"][data-name="loc"]');for(b=0;binput[type="checkbox"][data-name="unknown"]');null!=b&&a.unknown&&b.setAttribute("checked","checked")}; +inputFacebookMini.prototype.storageToFields=function(){console.group("[facebook.mini] storage to fields");var a=lsi["export"]("f_mini-fiches"),b=lsi.keys("f_mini-fiches");if(null===(void 0!=a[this.selected]?a[this.selected]:null)){if(null===this.selected){if(0==b.length)return!1;this.selected=b[0];return this.storageToFields()}this.updateNavBar();return!1}this.container.innerHTML="";for(var c in a)b=cloneObject(a[c]),delete b.hash,delete b.timestamp,delete b.valid,a[c].hash=crc32(JSON.stringify(b)), +lsi.set("f_mini-fiches",a[c].uid,a[c]),a[c].uid==this.selected&&this.add(a[c]);this.updateNavBar();console.groupEnd()}; +inputFacebookMini.prototype.sync=function(){console.group("[facebook.mini] synchronisation");var a=lsi["export"]("f_contacts"),b;ficheIndexes=lsi.keys("f_fiches");for(b in ficheIndexes)delete a[ficheIndexes[b]];for(var c in a){var d=0==a[c].username.length?c.toString()+"-":c;b=lsi.get("f_mini-fiches",d);null==b&&(b=this.defaultData,b.contact=a[c].uid,b.valid=!1);b.uid=parseInt(c);lsi.set("f_mini-fiches",d,b)}b=lsi["export"]("f_mini-fiches");if(null==b[this.selected])for(c in b)if(!isNaN(c)){this.selected= +parseInt(c);break}console.groupEnd()};inputFacebookMini.prototype.nav=function(a){if(!(a instanceof Element&&a.getData("n"))||isNaN(a.getData("n"))||"f_nav-mini"!=a.parentNode.id)return!1;for(var b=$$('[data-sublink="facebook"] #f_nav-mini > span.active'),c=0;c'+ ++b+"");for(c in a)isNaN(c)||(b=$('[data-sublink="facebook"] #f_nav-mini [data-n="'+a[c].uid+'"]'),null!=b&&(!0===a[c].valid?b.addClass("done"):b.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;this.nav_container.addEventListener("click",function(a){this.nav(a.target);this.handler(a.target)}.bind(this),!1);console.groupEnd()};