Portage phone->facebook : 1) Modifications des scripts javascript + 2) Modification du HTML des 'html-data'

This commit is contained in:
xdrm-brackets 2016-05-18 15:08:45 +02:00
parent a158970eeb
commit 1b2f3f4284
23 changed files with 1747 additions and 64 deletions

View File

@ -1,8 +1,7 @@
function inputFacebookContact(a,b){this.container=a;this.nav_container=b}inputFacebookContact.prototype={container:this.container,nav_container:this.nav_container,selected:0,handler:null};inputFacebookContact.prototype.check=function(a){var b=0<a.number.length;return b=b&&0<a.username.length+a.firstname.length+a.lastname.length};
inputFacebookContact.prototype.fieldsToStorage=function(){console.log("CONTACTS: FIELDS TO STORAGE");for(var a=$$('[data-sublink="facebook"] article.contact-panel .new-contact'),b=0;b<a.length;b++){var c=(new FormDeflater(a[b],["input"],["data-name"])).deflate();if(this.check(c)){var d={uid:parseInt(c.uid),number:c.number,username:c.username,firstname:c.firstname,lastname:c.lastname,call:parseInt(c.call),sms:parseInt(c.sms),countcall:parseInt(c.countcall),countsms:parseInt(c.countsms)};d.hash=crc32(JSON.stringify(d));
lsi.set("contacts",parseInt(c.uid),d)}}};
inputFacebookContact.prototype.add=function(a){console.log("CONTACTS: ADD");if(null==a||null==a.uid||isNaN(a.uid))return!1;a.number=null!=a.number?a.number:"";a.username=null!=a.username?a.username:"";a.firstname=null!=a.firstname?a.firstname:"";a.lastname=null!=a.lastname?a.lastname:"";a.call=null!=a.call?a.call:-1;a.sms=null!=a.sms?a.sms:-1;a.countcall=null!=a.countcall?a.countcall:0;a.countsms=null!=a.countsms?a.countsms:0;this.container.innerHTML+=contactBuilder.build(a);a=$$('[data-sublink="facebook"] article.contact-panel .new-contact');
function inputFacebookContact(a,b){this.container=a;this.nav_container=b}inputFacebookContact.prototype={container:this.container,nav_container:this.nav_container,selected:0,handler:null};inputFacebookContact.prototype.check=function(a){return 0<a.username.length+a.firstname.length+a.lastname.length};
inputFacebookContact.prototype.fieldsToStorage=function(){console.log("CONTACTS: FIELDS TO STORAGE");for(var a=$$('[data-sublink="facebook"] article.contact-panel .new-contact'),b=0;b<a.length;b++){var c=(new FormDeflater(a[b],["input"],["data-name"])).deflate();if(this.check(c)){var d={uid:parseInt(c.uid),username:c.username,firstname:c.firstname,lastname:c.lastname};d.hash=crc32(JSON.stringify(d));lsi.set("contacts",parseInt(c.uid),d)}}};
inputFacebookContact.prototype.add=function(a){console.log("CONTACTS: ADD");if(null==a||null==a.uid||isNaN(a.uid))return!1;a.username=null!=a.username?a.username:"";a.firstname=null!=a.firstname?a.firstname:"";a.lastname=null!=a.lastname?a.lastname:"";a.call=null!=a.call?a.call:-1;a.sms=null!=a.sms?a.sms:-1;a.countcall=null!=a.countcall?a.countcall:0;a.countsms=null!=a.countsms?a.countsms:0;this.container.innerHTML+=fContactBuilder.build(a);a=$$('[data-sublink="facebook"] article.contact-panel .new-contact');
for(var b=this,c=0;c<a.length;c++)a[c].removeEventListener("click",function(a){b.nav(a.target);b.handler(a.target)},!1),a[c].addEventListener("click",function(a){b.nav(a.target);b.handler(a.target)},!1)};inputFacebookContact.prototype.storageToFields=function(){console.log("CONTACTS: STORAGE TO FIELDS");var a=lsi.keys("contacts");this.container.innerHTML="";for(var b=this.selected+10,c=this.selected;c<b&&c<a.length;c++)this.add(lsi.get("contacts",a[c]));b>=a.length&&this.add({uid:a.length});this.updateNavBar()};
inputFacebookContact.prototype.nav=function(a){if(null==a||!1===a.getData("n")||isNaN(a.getData("n"))||"nav-contact"!=a.parentNode.id)return!1;for(var b=$$('[data-sublink="facebook"] #f_nav-contact > span.active'),c=0;c<b.length;c++)b[c].remClass("active");a.addClass("active");this.selected=parseInt(a.getData("n"))};
inputFacebookContact.prototype.nav=function(a){if(null==a||!1===a.getData("n")||isNaN(a.getData("n"))||"f_nav-contact"!=a.parentNode.id)return!1;for(var b=$$('[data-sublink="facebook"] #f_nav-contact > span.active'),c=0;c<b.length;c++)b[c].remClass("active");a.addClass("active");this.selected=parseInt(a.getData("n"))};
inputFacebookContact.prototype.updateNavBar=function(){var a=lsi.keys("contacts").length;if(this.nav_container.children.length!=a){this.nav_container.innerHTML="";for(var b=0;b<a;b+=10)this.nav_container.innerHTML+='<span data-n="'+b+'">'+(1+b/10)+"</span>"}this.nav($('[data-sublink="facebook"] #f_nav-contact [data-n="'+this.selected+'"]'))};
inputFacebookContact.prototype.attach=function(a){console.log("CONTACTS: ATTACH");lsi.createDataset("contacts");this.storageToFields();this.handler=a;var b=this;this.nav_container.addEventListener("click",function(a){b.nav(a.target);b.handler(a.target)},!1)};

View File

@ -19,13 +19,8 @@ inputFacebookContact.prototype = {
/* [2] Vérification des données d'un contact
=========================================================*/
inputFacebookContact.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
/* On retourne la validité du formulaire */
return deflated.username.length+deflated.firstname.length+deflated.lastname.length > 0;
}
@ -50,16 +45,9 @@ inputFacebookContact.prototype.fieldsToStorage = function(){
// {4} On récupère et met en forme les valeurs du deflater //
var obj = {
uid: parseInt(deflated.uid),
number: deflated.number,
username: deflated.username,
firstname: deflated.firstname,
lastname: deflated.lastname,
call: parseInt(deflated.call),
sms: parseInt(deflated.sms),
countcall: parseInt(deflated.countcall),
countsms: parseInt(deflated.countsms)
lastname: deflated.lastname
};
/* (5) On calcule et ajoute le hash des données */
@ -95,7 +83,6 @@ inputFacebookContact.prototype.add = function(objectData){
return false
// {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 : '';
@ -106,7 +93,7 @@ inputFacebookContact.prototype.add = function(objectData){
// {1} On ajoute le HTML //
this.container.innerHTML += contactBuilder.build(objectData);
this.container.innerHTML += fContactBuilder.build(objectData);
// {2} On attache les évènements sur les formulaires //
var contactForms = $$('[data-sublink="facebook"] article.contact-panel .new-contact');
@ -169,7 +156,7 @@ inputFacebookContact.prototype.nav = function(element){
if( element == null )
return false;
if( element.getData('n') === false || isNaN(element.getData('n')) || element.parentNode.id != 'nav-contact' )
if( element.getData('n') === false || isNaN(element.getData('n')) || element.parentNode.id != 'f_nav-contact' )
return false;
/* (2) On désactive tous les éléments actifs */

20
js/includes/input-facebook-fiche-min.js vendored Normal file
View File

@ -0,0 +1,20 @@
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:"0",age:".",job:".",famsit:"0",studies:".",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.log("FICHE: FIELDS TO STORAGE");for(var a=$$('[data-sublink="facebook"] article.relation-panel .fiche-relation'),b=0;b<a.length;b++){var c=(new FormDeflater(a[b],["input","select"],["data-name"])).deflate(),e=crc32(JSON.stringify(c)),d=lsi.get("fiches",c.uid);if(!1!==d){if(null!=d.hash&&d.hash==e)break;c={contact:parseInt(c.contact),uid:parseInt(c.uid),sexe:c.sexe,age:c.age,job:c.job,famsit:c.famsit,studies:c.studies,reltype:c.reltype,
reltypeSpecial:c.reltypeSpecial,city:c.city,quartier:c.quartier,cp:c.cp,loc:c.loc,duration:c.duration,context:c.context,contextSpecial:c.contextSpecial,freq:c.freq,connect:c.connect,connectSpecial:c.connectSpecial,hash:e};c.valid=this.check(c);0<diff(d,c,["hash","valid","timestamp"]).length&&(console.log(diff(d,c,["hash","valid","timestamp"])),console.warn("> FICHE UPDATE"),c.timestamp=Date.now());lsi.set("fiches",c.uid,c)}}};
inputFacebookFiche.prototype.add=function(a){console.log("FICHE: ADD");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("contacts",a.contact);if(!1===b)return!1;this.container.innerHTML+=fFicheBuilder.build({name:readableName(b.username,b.firstname,b.lastname),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");for(var c=$$('[data-sublink="facebook"] article.fiche-relation input[data-name="uid"][value="'+a.uid+'"] ~ h5>input[type="radio"][data-name="sexe"]'),b=0;b<c.length;b++)c[b].value==a.sexe?c[b].setAttribute("checked","checked"):c[b].removeAttribute("checked");c=$$('[data-sublink="facebook"] article.fiche-relation input[data-name="uid"][value="'+a.uid+'"] ~ h5>input[type="radio"][data-name="famsit"]');
for(b=0;b<c.length;b++)c[b].value==a.famsit?c[b].setAttribute("checked","checked"):c[b].removeAttribute("checked");c=$$('[data-sublink="facebook"] article.fiche-relation input[data-name="uid"][value="'+a.uid+'"] ~ h5>input[type="radio"][data-name="reltype"]');for(b=0;b<c.length;b++)c[b].value==a.reltype?c[b].setAttribute("checked","checked"):c[b].removeAttribute("checked");c=$$('[data-sublink="facebook"] article.fiche-relation input[data-name="uid"][value="'+a.uid+'"] ~ h5>input[type="radio"][data-name="loc"]');
for(b=0;b<c.length;b++)c[b].value==a.loc?c[b].setAttribute("checked","checked"):c[b].removeAttribute("checked");c=$$('[data-sublink="facebook"] article.fiche-relation input[data-name="uid"][value="'+a.uid+'"] ~ h5>input[type="radio"][data-name="context"]');for(b=0;b<c.length;b++)c[b].value==a.context?c[b].setAttribute("checked","checked"):c[b].removeAttribute("checked");c=$$('[data-sublink="facebook"] article.fiche-relation input[data-name="uid"][value="'+a.uid+'"] ~ h5>input[type="radio"][data-name="freq"]');
for(b=0;b<c.length;b++)-1<a.freq.indexOf(c[b].value)?c[b].setAttribute("checked","checked"):c[b].removeAttribute("checked");c=$$('[data-sublink="facebook"] article.fiche-relation input[data-name="uid"][value="'+a.uid+'"] ~ h5>input[type="radio"][data-name="connect"]');for(b=0;b<c.length;b++)-1<a.connect.indexOf(c[b].value)?c[b].setAttribute("checked","checked"):c[b].removeAttribute("checked")};
inputFacebookFiche.prototype.storageToFields=function(){console.log("FICHE: STORAGE TO FIELDS");var a=lsi["export"]("fiches");this.container.innerHTML="";for(var b in a)a[b].uid==this.selected&&this.add(a[b]);this.updateNavBar()};
inputFacebookFiche.prototype.sync=function(){console.log("FICHE: SYNC");var a=lsi["export"]("contacts"),b=[],c;for(c in a){if(-1<a[c].call){var e=a[c].call;b.push(e);var d=lsi.get("fiches",e);null==d&&(d=this.defaultData);d.uid=e;d.contact=parseInt(c);lsi.set("fiches",e,d)}-1<a[c].sms&&(e=10+a[c].sms,b.push(e),d=lsi.get("fiches",e),null==d&&(d=this.defaultData),d.uid=e,d.contact=parseInt(c),lsi.set("fiches",e,d))}e=20>lsi.keys("contacts").length?lsi.keys("contacts").length:20;if(b.length<e)for(c in a){for(a=
0;-1<b.indexOf(a)&&a<e;)a++;b.push(a);d=lsi.get("fiches",a);null==d&&(d=this.defaultData);d.uid=a;d.contact=parseInt(c);lsi.set("fiches",a,d);if(b.length>=e)break}for(var f in d)b=lsi.get("contacts",d[f].contact),null!=b&&-1!=b.sms&&-1!=b.call&&(b=10>parseInt(f)?10+b.sms:b.call,b=d[b],b.timestamp>=d[f].timestamp||(c=d[f],c.uid=b.uid,lsi.set("fiches",b.uid,c)))};
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;c<b.length;c++)b[c].remClass("active");a.addClass("active");this.selected=parseInt(a.getData("n"))};
inputFacebookFiche.prototype.updateNavBar=function(){var a=lsi["export"]("fiches");this.nav_container.innerHTML="";for(var b=Object.keys(a),c=0;c<b.length;c++){var e=parseInt(b[c]);0==e&&(this.nav_container.innerHTML+="<span>HISTORIQUE</span>");10>e&&c<b.length-1&&10<=b[c+1]?this.nav_container.innerHTML+='<span data-n="'+e+'" class="lc">'+(e%10+1)+"</span>&nbsp;&nbsp;":(10==e&&(this.nav_container.innerHTML+='<span class="fc">MESSENGER</span>'),this.nav_container.innerHTML+='<span data-n="'+e+'">'+
(e%10+1)+"</span>")}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]))&&0<a.duration[0].length||isNaN(parseInt(a.duration[1]))&&0<a.duration[1].length||0==a.duration[0].length+a.duration[1].length||"."==a.job||"."==a.studies||"."==a.age||""==a.sexe||""==a.famsit||""==a.reltype||""==a.loc||""==a.context)return!1;for(var b=0;b<a.freq.length;b++)if(""==a.freq[b])return!1;for(b=0;b<a.connect.length;b++)if(""==a.connect[b])return!1;return"10"==a.reltype&&2>a.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.log("FICHE: ATTACH");lsi.createDataset("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)};

View File

@ -0,0 +1,633 @@
/* [0] Constructeur -> définit le conteneur et le bouton d'ajout
=========================================================*/
function inputFacebookFiche(container, navContainer){
this.container = container;
this.nav_container = navContainer;
}
/* [1] Attributs
=========================================================*/
inputFacebookFiche.prototype = {
container: this.container, // Conteneur des fiche fiches relation
nav_container: this.nav_container, // Conteneur de la navigation entre les fiches
selected: 0, // UID de la FICHE sélectionnée
handler: null, // Fonction pour l'enregistrement et la synchronisation des données
defaultData: { // Valeurs par défaut
sexe: '0',
age: '.',
job: '.',
famsit: '0', // Choix 1 à 3
studies: '.',
reltype: '0', // Choix 1 à 9
reltypeSpecial: '',
city: '',
quartier: '',
cp: '',
loc: '0',
duration: ['', ''],
context: '0', // Choix 1 à 14
contextSpecial: ['', '', ''],
freq: ['4', '9', '14', '19', '24'], // 1er choix des 4 pour chaque question
connect: ['1', '3', '5', '7', '9', '11'], // Le deuxième choix (Oui/Non) donc 'Non' par défaut pour chaque question
connectSpecial: ['', ''],
timestamp: 0,
valid: false
}
};
/* [2] Gestion de l'enregistrement des formulaires fiche fiches relation
=========================================================*/
inputFacebookFiche.prototype.fieldsToStorage = function(){
console.log('FICHE: FIELDS TO STORAGE');
// {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++ ){
// {2} On initialise notre deflater pour récupérer les valeurs //
var 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));
// console.log( deflated );
// {4} On récupère les données du LSI si elles existent //
var existingData = lsi.get('fiches', deflated.uid);
// Si n'existe pas, on passe au suivant
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),
sexe: deflated.sexe,
age: deflated.age,
job: deflated.job,
famsit: deflated.famsit,
studies: deflated.studies,
reltype: deflated.reltype,
reltypeSpecial: deflated.reltypeSpecial,
city: deflated.city,
quartier: deflated.quartier,
cp: deflated.cp,
loc: deflated.loc,
duration: deflated.duration,
context: deflated.context,
contextSpecial: deflated.contextSpecial,
freq: deflated.freq,
connect: deflated.connect,
connectSpecial: deflated.connectSpecial,
hash: deflatedHash
};
/* (6) 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);
// 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();
}
/* (7) On enregistre les données dans le 'localStorage' */
lsi.set('fiches', obj.uid, obj);
}
};
/* [3] Gestion de l'ajout physique d'une nouvelle fiche
=========================================================*/
/*
*
* @objectData<Object> Objet contenant les informations nécessaires à l'affichage
*
*/
inputFacebookFiche.prototype.add = function(objectData){
console.log('FICHE: ADD');
// Si pas d'UID ou d'UID de contact, on retourne une erreur
if( objectData.uid == null || isNaN(objectData.uid) || objectData.contact == null || isNaN(objectData.contact) )
return false;
/* (0) Gestion du formattage des valeur */
// {1} Champs de texte //
objectData.city = (objectData.city != null) ? objectData.city : this.defaultData.city;
objectData.quartier = (objectData.quartier != null) ? objectData.quartier : this.defaultData.quartier;
objectData.cp = (objectData.cp != null) ? objectData.cp : this.defaultData.cp;
objectData.duration[0] = (objectData.duration[0] != null) ? objectData.duration[0] : this.defaultData.duration[0];
objectData.duration[1] = (objectData.duration[1] != null) ? objectData.duration[1] : this.defaultData.duration[1];
objectData.reltypeSpecial = (objectData.reltypeSpecial != null) ? objectData.reltypeSpecial : this.defaultData.reltypeSpecial;
objectData.contextSpecial[0] = (objectData.contextSpecial[0] != null) ? objectData.contextSpecial[0] : this.defaultData.contextSpecial[0];
objectData.contextSpecial[1] = (objectData.contextSpecial[1] != null) ? objectData.contextSpecial[1] : this.defaultData.contextSpecial[1];
objectData.contextSpecial[2] = (objectData.contextSpecial[2] != null) ? objectData.contextSpecial[2] : this.defaultData.contextSpecial[2];
objectData.connectSpecial[0] = (objectData.connectSpecial[0] != null) ? objectData.connectSpecial[0] : this.defaultData.connectSpecial[0];
objectData.connectSpecial[1] = (objectData.connectSpecial[1] != null) ? objectData.connectSpecial[1] : this.defaultData.connectSpecial[1];
// {2} Champs <select> //
objectData.job = (objectData.job != null) ? objectData.job : this.defaultData.job;
objectData.studies = (objectData.studies != null) ? objectData.studies : this.defaultData.studies;
objectData.age = (objectData.age != null) ? objectData.age : this.defaultData.age;
// {3} Champs <radio> //
objectData.sexe = (objectData.sexe != null) ? objectData.sexe : this.defaultData.sexe;
objectData.famsit = (objectData.famsit != null) ? objectData.famsit : this.defaultData.famsit;
objectData.reltype = (objectData.reltype != null) ? objectData.reltype : this.defaultData.reltype;
objectData.loc = (objectData.loc != null) ? objectData.loc : this.defaultData.loc;
objectData.context = (objectData.context != null) ? objectData.context : this.defaultData.context;
objectData.freq = (objectData.freq != null) ? objectData.freq : this.defaultData.freq;
objectData.connect = (objectData.connect != null) ? objectData.connect : this.defaultData.connect;
// {4} On récupère username/firstname/lastname du contact associé //
var associatedContact = lsi.get('contacts', objectData.contact);
// Si on ne trouve pas le contact, on ne fais rien
if( associatedContact === false )
return false;
// {5} Création physique //
this.container.innerHTML += fFicheBuilder.build({
name: readableName(associatedContact.username, associatedContact.firstname, associatedContact.lastname),
countcall: associatedContact.countcall,
countsms: associatedContact.countsms,
uid: objectData.uid,
contact: objectData.contact, // uid du contact associé
city: objectData.city,
quartier: objectData.quartier,
cp: objectData.cp,
duration0: objectData.duration[0],
duration1: objectData.duration[1],
reltypespecial: objectData.reltypeSpecial,
contextspecial0: objectData.contextSpecial[0],
contextspecial1: objectData.contextSpecial[1],
contextspecial2: objectData.contextSpecial[2],
connectspecial0: objectData.connectSpecial[0],
connectspecial1: objectData.connectSpecial[1]
});
/* {6} On sélectionne la valeur dans le select (manuellement) de la PROFESSION */
var selectedOption = $('[data-sublink="facebook"] article.fiche-relation input[data-name="uid"][value="'+objectData.uid+'"] ~ h5>span>select[data-name="job"]>option[value="'+objectData.job+'"]');
if( selectedOption != null )
selectedOption.setAttribute('selected', 'selected');
/* {7} On sélectionne la valeur dans le select (manuellement) des ETUDES */
selectedOption = $('[data-sublink="facebook"] article.fiche-relation input[data-name="uid"][value="'+objectData.uid+'"] ~ h5>span>select[data-name="studies"]>option[value="'+objectData.studies+'"]');
if( selectedOption != null )
selectedOption.setAttribute('selected', 'selected');
/* {8} On sélectionne la valeur dans le select (manuellement) de l'AGE */
selectedOption = $('[data-sublink="facebook"] article.fiche-relation input[data-name="uid"][value="'+objectData.uid+'"] ~ h5>span>select[data-name="age"]>option[value="'+objectData.age+'"]');
if( selectedOption != null )
selectedOption.setAttribute('selected', 'selected');
/* {9} On sélectionna la valeur des boutons <radio> pour le SEXE */
var sexeCreated = $$('[data-sublink="facebook"] article.fiche-relation input[data-name="uid"][value="'+objectData.uid+'"] ~ h5>input[type="radio"][data-name="sexe"]');
for( var i = 0 ; i < sexeCreated.length ; i++ )
if( sexeCreated[i].value == objectData.sexe ) sexeCreated[i].setAttribute('checked', 'checked');
else sexeCreated[i].removeAttribute('checked');
/* {10} On sélectionna la valeur des boutons <radio> pour la SITUATION FAMILIALE */
var famsitCreated = $$('[data-sublink="facebook"] article.fiche-relation input[data-name="uid"][value="'+objectData.uid+'"] ~ h5>input[type="radio"][data-name="famsit"]');
for( var i = 0 ; i < famsitCreated.length ; i++ )
if( famsitCreated[i].value == objectData.famsit ) famsitCreated[i].setAttribute('checked', 'checked');
else famsitCreated[i].removeAttribute('checked');
/* {11} On sélectionna la valeur des boutons <radio> pour le TYPE DE RELATION */
var reltypeCreated = $$('[data-sublink="facebook"] article.fiche-relation input[data-name="uid"][value="'+objectData.uid+'"] ~ h5>input[type="radio"][data-name="reltype"]');
for( var i = 0 ; i < reltypeCreated.length ; i++ )
if( reltypeCreated[i].value == objectData.reltype ) reltypeCreated[i].setAttribute('checked', 'checked');
else reltypeCreated[i].removeAttribute('checked');
/* {12} On sélectionna la valeur des boutons <radio> pour la LOCATION */
var locCreated = $$('[data-sublink="facebook"] article.fiche-relation input[data-name="uid"][value="'+objectData.uid+'"] ~ h5>input[type="radio"][data-name="loc"]');
for( var i = 0 ; i < locCreated.length ; i++ )
if( locCreated[i].value == objectData.loc ) locCreated[i].setAttribute('checked', 'checked');
else locCreated[i].removeAttribute('checked');
/* {13} On sélectionna la valeur des boutons <radio> pour le CONTEXTE DE RENCONTRE */
var contextCreated = $$('[data-sublink="facebook"] article.fiche-relation input[data-name="uid"][value="'+objectData.uid+'"] ~ h5>input[type="radio"][data-name="context"]');
for( var i = 0 ; i < contextCreated.length ; i++ )
if( contextCreated[i].value == objectData.context ) contextCreated[i].setAttribute('checked', 'checked');
else contextCreated[i].removeAttribute('checked');
/* {14} On sélectionna la valeur des boutons <radio> pour les FREQUENCES */
var freqCreated = $$('[data-sublink="facebook"] article.fiche-relation input[data-name="uid"][value="'+objectData.uid+'"] ~ h5>input[type="radio"][data-name="freq"]');
for( var i = 0 ; i < freqCreated.length ; i++ )
if( objectData.freq.indexOf(freqCreated[i].value) > -1 ) freqCreated[i].setAttribute('checked', 'checked');
else freqCreated[i].removeAttribute('checked');
/* {15} On sélectionna la valeur des boutons <radio> pour les CONNECTIONS */
var connectCreated = $$('[data-sublink="facebook"] article.fiche-relation input[data-name="uid"][value="'+objectData.uid+'"] ~ h5>input[type="radio"][data-name="connect"]');
for( var i = 0 ; i < connectCreated.length ; i++ )
if( objectData.connect.indexOf(connectCreated[i].value) > -1 ) connectCreated[i].setAttribute('checked', 'checked');
else connectCreated[i].removeAttribute('checked');
};
/* [4] Gestion de l'affichage depuis le 'localStorage'
=========================================================*/
inputFacebookFiche.prototype.storageToFields = function(){
console.log('FICHE: STORAGE TO FIELDS');
// {1} Pour chaque contact du 'localStorage' //
var ficheData = lsi.export('fiches');
// On réinitialise le HTML
this.container.innerHTML = '';
for( var key in ficheData )
if( ficheData[key].uid == this.selected )
this.add(ficheData[key]);
// {4} On met à jour la navigation //
this.updateNavBar();
};
/* [5] Synchronisation des CONTACT vers les MINI fiches
=========================================================*/
inputFacebookFiche.prototype.sync = function(){
console.log('FICHE: SYNC');
/* (1) Mise à jour en fonction des contacts APRÈS IMPORT
---------------------------------------------------------*/
/* (1) On récupère tous les CONTACTS */
var contacts = lsi.export('contacts');
var addedFicheUids = []; // Contiendra les uids des fiches qui seront crées
/* (2) Pour chaque CONTACT, on met à jour/crée la FICHE associée, si dans le TOP 10 des APPELS ou des SMS */
for( var uid in contacts ){
var inCallTop10 = false;
/* (3) Indice de 0 à 9 si dans le TOP 10 des APPELS */
if( contacts[uid].call > -1 ){
// On calcule le rang de la fiche en fonction du classement
var ficheIndex = contacts[uid].call;
addedFicheUids.push(ficheIndex);
// On récupère les informations de la FICHE (si elle existe) */
var ficheData = lsi.get('fiches', ficheIndex);
// Si la fiche n'existe pas, on la crée avec les valeurs par défaut
if( ficheData == null )
ficheData = this.defaultData;
// On met à jour la fiche ET on l'enregistre
ficheData.uid = ficheIndex;
ficheData.contact = parseInt(uid);
lsi.set('fiches', ficheIndex, ficheData);
}
/* (4) Indice de 10 à 19 si dans le TOP 10 des SMS */
if( contacts[uid].sms > -1 ){
// On calcule le rang de la fiche en fonction du classement
var ficheIndex = 10+contacts[uid].sms;
addedFicheUids.push(ficheIndex);
// On récupère les informations de la FICHE (si elle existe) */
var ficheData = lsi.get('fiches', ficheIndex);
// Si la fiche n'existe pas, on la crée avec les valeurs par défaut
if( ficheData == null )
ficheData = this.defaultData;
// On met à jour la fiche ET on l'enregistre
ficheData.uid = ficheIndex;
ficheData.contact = parseInt(uid);
lsi.set('fiches', ficheIndex, ficheData);
}
}
/* (2) Mise à jour en fonction des contacts APRÈS SAISIE MANUELLE
---------------------------------------------------------*/
// Nombre maximum de fiches (20, sauf si moins de 20 contacts, dans ce cas, le nombre de contacts);
var nbMaxFiche = lsi.keys('contacts').length < 20 ? lsi.keys('contacts').length : 20;
// Si moins de 10+10 contacts crées, on les complètes en fonction des contacts séquentiellement
if( addedFicheUids.length < nbMaxFiche ){
/* (1) Pour chaque CONTACT, on met à jour/crée la FICHE associée*/
for( var uid in contacts ){
/* (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);
/* (3) On récupère les informations de la FICHE (si elle existe) */
var ficheData = lsi.get('fiches', ficheUid);
// 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('fiches', ficheUid, ficheData);
/* (5) Si on a déja crée 10+10 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
---------------------------------------------------------*/
for( var key in ficheData ){
/* (1) On récupère le contact associé */
var associatedContact = lsi.get('contacts', ficheData[key].contact);
// Si erreur, on passe au suivant
if( associatedContact == null )
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 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)
var clone = ficheData[cloneIndex];
/* (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) */
var obj = ficheData[key];
obj.uid = clone.uid;
lsi.set('fiches', clone.uid, obj);
}
};
/* [6] Gestion de la navigation entre les fiches
=========================================================*/
inputFacebookFiche.prototype.nav = function(element){
/* (1) On vérifie que l'élément contient un nombre et existe */
if( element == null )
return false;
if( element.getData('n') === false || isNaN(element.getData('n')) || element.parentNode.id != 'f_nav-fiche' )
return false;
/* (2) On désactive tous les éléments actifs */
var activeElements = $$('[data-sublink="facebook"] #f_nav-fiche > span.active');
for( var i = 0 ; i < activeElements.length ; i++ )
activeElements[i].remClass('active');
/* (3) On active l'élément courant */
element.addClass('active');
this.selected = parseInt(element.getData('n'));
};
/* [7] Mise à jour de la navigation
=========================================================*/
inputFacebookFiche.prototype.updateNavBar = function(){
var ficheData = lsi.export('fiches');
/* (2) On vide et remplit la barre de nav, si elle n'est pas à jour */
this.nav_container.innerHTML = '';
var keys = Object.keys(ficheData);
for( var k = 0 ; k < keys.length ; k++ ){
var i = parseInt( keys[k] );
// Si 1ère valeur du top 10 des APPELS, on ajoute le bandeau "APPELS"
if( i == 0 )
this.nav_container.innerHTML += '<span>HISTORIQUE</span>';
// 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 += '<span data-n="'+i+'" class="lc">'+(i%10 + 1)+'</span>&nbsp;&nbsp;';
// 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 += '<span class="fc">MESSENGER</span>';
this.nav_container.innerHTML += '<span data-n="'+i+'">'+(i%10 + 1)+'</span>';
// Sinon, on ajoute juste le bouton
}else
this.nav_container.innerHTML += '<span data-n="'+i+'">'+(i%10 + 1)+'</span>';
}
/* (3) On montre les FICHES qui sont correctes */
for( var key in ficheData ){
var currentElement = $('[data-sublink="facebook"] #f_nav-fiche [data-n="'+ficheData[key].uid+'"]');
if( currentElement == null )
continue;
// Si on ne trouve pas le bouton
// Si la FICHE est valide
if( ficheData[key].valid === true ) currentElement.addClass('done');
// Si elle est invalide
else currentElement.remClass('done');
}
/* (4) On séléctionne par défaut le dernier sélectionné */
this.nav( $('[data-sublink="facebook"] #f_nav-fiche [data-n="'+this.selected+'"]') );
};
/* [8] Vérification des données du formulaire
=========================================================*/
inputFacebookFiche.prototype.check = function(ficheData){
// {1} Vérification des <input> //
// 1. La ville a au moins 2 caractères
if( ficheData.city.length < 2 )
return false;
// 3. La durée de la relation en mois est vide ou un nombre
if( isNaN(parseInt(ficheData.duration[0])) && ficheData.duration[0].length > 0 )
return false;
// 4. La durée de la relation en année est vide ou un nombre
if( isNaN(parseInt(ficheData.duration[1])) && ficheData.duration[1].length > 0 )
return false;
// 5. Pour la durée de la relation, au moins un des 2 n'est pas vide
if( ficheData.duration[0].length+ficheData.duration[1].length == 0 )
return false;
// {2} Vérification des <select> //
// 6. Le <select> pour la profession n'est pas indéfini
if( ficheData.job == '.' )
return false;
// 7. Le <select> pour les études n'est pas indéfini
if( ficheData.studies == '.' )
return false;
// 8. Le <select> pour l'AGE n'est pas indéfini
if( ficheData.age == '.' )
return false;
// {3} Vérification des <input> radio //
// 9. Le SEXE a un et un seul choix
if( ficheData.sexe == '' )
return false;
// 10. La SITUATION FAMILIALE a un et un seul choix
if( ficheData.famsit == '' )
return false;
// 11. Le TYPE DE RELATION a un et un seul choix
if( ficheData.reltype == '' )
return false;
// 12. La DISTANCE DE DOMICILE (location) a un et un seul choix
if( ficheData.loc == '' )
return false;
// 13. Le CONTEXTE DE RENCONTRE a un et un seul choix
if( ficheData.context == '' )
return false;
// 14. Les FRÉQUENCES ont un et un seul choix (par question de fréquence)
for( var i = 0 ; i < ficheData.freq.length ; i++ )
if( ficheData.freq[i] == '' )
return false;
// 15. Les CONNECTION ont un et un seul choix (par question de connection)
for( var i = 0 ; i < ficheData.connect.length ; i++ )
if( ficheData.connect[i] == '' )
return false;
// {4} <input> dépendant d'un choix d'un <input> radio //
// 16. TYPE DE RELATION si autre est coché (indice 8), reltypeSpecial doit avoir au moins 2 caractère
if( ficheData.reltype == '10' && ficheData.reltypeSpecial.length < 2 )
return false;
// 17. CONTEXTE DE RELATION si est coché indice 11, contactSpecial[0] doit avoir au moins 2 caractères
if( ficheData.context == '11' && ficheData.contextSpecial[0].length < 2 )
return false;
// 18. CONTEXTE DE RELATION si est coché indice 12, contextSpecial[1] doit avoir au moins 2 caractères
if( ficheData.context == '12' && ficheData.contextSpecial[1].length < 2 )
return false;
// 19. CONTEXTE DE RELATION si est coché indice 13, contextSpecial[2] doit avoir au moins 2 caractères
if( ficheData.context == '13' && ficheData.contextSpecial[2].length < 2 )
return false;
// 20. Si tout s'est bien passé, on retourne TRUE
return true;
};
/* [9] Point d'amorçage de la gestion des contacts
=========================================================*/
inputFacebookFiche.prototype.attach = function(handler){
console.log('FICHE: ATTACH');
/* (1) On initialise le jeu de données */
lsi.createDataset('fiches');
/* (2) On charge les fiche fiches depuis la mémoire ('localStorage') */
this.storageToFields();
/* (3) On attache la barre de navigation à une fonction */
// On enregistre le handler
this.handler = handler;
var ptr = this;
/* (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);
// 2. On gere le chargement dynamique
ptr.handler(e.target);
}, false);
};

View File

@ -0,0 +1,5 @@
function inputFacebookMatrice(a){this.container=a}inputFacebookMatrice.prototype={container:this.container};
inputFacebookMatrice.prototype.fieldsToStorage=function(){console.log("MATRICE: FIELDS TO STORAGE");var a=(new FormDeflater(this.container,["input"],["data-name"])).deflate();crc32(JSON.stringify(a));var d={},b;for(b in a)if(a[b]instanceof Array)for(var e in a[b])null==d[b]&&(d[b]=[]),d[b].push(parseInt(a[b][e]));else null!==a[b]&&(null==d[b]&&(d[b]=[]),d[b].push(parseInt(a[b])));lsi.set("matrice",0,d)};
inputFacebookMatrice.prototype.storageToFields=function(){console.log("MATRICE: STORAGE TO FIELDS");var a=lsi["export"]("fiches"),d=lsi.get("matrice",0),b=lsi["export"]("contacts"),e=[],c;for(c in a)-1==e.indexOf(a[c].contact)&&e.push(a[c].contact);a="<table class='line'>";for(c=0;c<e.length;c++){var f=b[c],a=a+"<tr>";0<c?(a+='<td style="text-align: right;">',a+=readableName(f.username,f.firstname,f.lastname),a+="</td>"):a+="<td></td>";for(var h=0;h<e.length;h++)if(h<e.length-1){var g=b[h];0==c?(a+=
"<td>",a+='<span style="writing-mode: vertical-lr; text-align: right;">',a+=readableName(g.username,g.firstname,g.lastname),a+="</span>"):h<c?(a+="<td>",a+="<input type='checkbox' name='matrice_"+f.uid+"_"+g.uid+"' data-name='"+f.uid+"' value='"+g.uid+"' id='matrice_"+f.uid+"_"+g.uid+"'",null!=d[c]&&-1<d[c].indexOf(h)&&(a+=" checked"),a+=" >",a+="<label for='matrice_"+f.uid+"_"+g.uid+"'></label>"):a+="<td class='hidden'>";a+="</td>"}a+="</tr>"}this.container.innerHTML=a+"</table>"};
inputFacebookMatrice.prototype.attach=function(){console.log("MATRICE: ATTACH");lsi.createDataset("matrice");this.storageToFields();var a=this;this.container.addEventListener("click",function(d){a.fieldsToStorage();a.storageToFields()},!1)};

View File

@ -0,0 +1,173 @@
/* [0] Constructeur -> définit le conteneur et le bouton d'ajout
=========================================================*/
function inputFacebookMatrice(container){
this.container = container;
}
/* [1] Attributs
=========================================================*/
inputFacebookMatrice.prototype = {
container: this.container // Conteneur de la matrice
};
/* [2] Gestion de l'enregistrement de la matrice
=========================================================*/
inputFacebookMatrice.prototype.fieldsToStorage = function(){
console.log('MATRICE: FIELDS TO STORAGE');
// {1} On initialise notre deflater pour récupérer les valeurs //
var deflater = new FormDeflater(this.container, ['input'], ['data-name']);
// {2} On extrait les données //
var deflated = deflater.deflate();
// On crée le hash
var deflatedHash = crc32(JSON.stringify(deflated));
// console.log(deflated);
/* (3) On crée l'objet et on le remplit avec les relations */
var obj = {};
for( var i in deflated )
// {1} Si c'est un tableau de sujets //
if( deflated[i] instanceof Array ){
// Pour chacune des différentes relations, on ajoute si TRUE
for( var a in deflated[i] ){
if( obj[i] == null )
obj[i] = [];
obj[i].push( parseInt(deflated[i][a]) );
}
// {2} Si il n'y a qu'un sujet //
}else if( deflated[i] !== null ){
if( obj[i] == null )
obj[i] = [];
obj[i].push( parseInt(deflated[i]) );
}
lsi.set( 'matrice', 0, obj );
// Objet de la forme
//
// idA: [idV, idW], # A connait V et W (et réciproquement)
// idB: [idX, idY], # B connait X et Y (et réciproquement)
// ...
//
};
/* [4] Gestion de l'affichage depuis le 'localStorage'
=========================================================*/
inputFacebookMatrice.prototype.storageToFields = function(){
console.log('MATRICE: STORAGE TO FIELDS');
/* (1) On récupère la liste des contacts à mettre dans la matrice */
// On récupère les fiches
var ficheData = lsi.export('fiches');
// On récupère les données de la matrice
var matriceData = lsi.get('matrice', 0);
// On récupère les contacts pour afficher les noms/prénoms
var contactData = lsi.export('contacts');
// Contiendra les UID des contacts à mettre dans la matrice
var contacts = [];
// Pour chaque fiche, on ajoute l'uid du contact s'il n'est pas déja ajouté
for( var f in ficheData )
if( contacts.indexOf( ficheData[f].contact ) == -1 )
contacts.push( ficheData[f].contact );
/* (2) On construit le HTML de la matrice */
// Contiendra le HTML
var matrice_html = "<table class='line'>";
// {1} Pour chaque ligne //
for( var A = 0 ; A < contacts.length ; A++ ){
var conA = contactData[A];
matrice_html += '<tr>';
if( A > 0 ){ // Noms sur la première ligne (abscisses)
matrice_html += '<td style="text-align: right;">';
matrice_html += readableName(conA.username, conA.firstname, conA.lastname);
matrice_html += '</td>';
}else // Sinon,
matrice_html += '<td></td>';
// {2} Pour chaque case //
for( var B = 0 ; B < contacts.length ; B++ ){ if( B < contacts.length-1 ){
var conB = contactData[B];
// {3} Première colonne -> Intitulé des ordonnées //
if( A == 0 ){
matrice_html += '<td>';
matrice_html += '<span style="writing-mode: vertical-lr; text-align: right;">';
matrice_html += readableName(conB.username, conB.firstname, conB.lastname),
matrice_html += '</span>';
// {4} Valeurs des relations (boutons) //
}else if( B < A ){
matrice_html += "<td>";
matrice_html += "<input type='checkbox' name='matrice_"+conA.uid+"_"+conB.uid+"' data-name='"+conA.uid+"' value='"+conB.uid+"' id='matrice_"+conA.uid+"_"+conB.uid+"'";
// Si la relation existe, on active le bouton
if( matriceData[A] != null && matriceData[A].indexOf(B) > -1 )
matrice_html += " checked";
matrice_html += " >";
matrice_html += "<label for='matrice_"+conA.uid+"_"+conB.uid+"'></label>";
// {5} Cases vides (moitié supérieure droite) //
}else
matrice_html += "<td class='hidden'>";
matrice_html += '</td>';
}}
matrice_html += '</tr>';
}
matrice_html += '</table>';
/* (3) On affiche la matrice */
this.container.innerHTML = matrice_html;
};
/* [9] Point d'amorçage de la gestion des contacts
=========================================================*/
inputFacebookMatrice.prototype.attach = function(){
console.log('MATRICE: ATTACH');
/* (1) On initialise le jeu de données */
lsi.createDataset('matrice');
/* (2) On charge les mini fiches depuis la mémoire ('localStorage') */
this.storageToFields();
/* (3) On enregistre la matrice à chaque modification */
var ptr = this;
this.container.addEventListener('click', function(e){
ptr.fieldsToStorage();
ptr.storageToFields();
}, false);
};

12
js/includes/input-facebook-mini-min.js vendored Normal file
View File

@ -0,0 +1,12 @@
function inputFacebookMini(a,b){this.container=a;this.nav_container=b}inputFacebookMini.prototype={container:this.container,nav_container:this.nav_container,selected:0,handler:null,defaultData:{sexe:"0",age:".",studies:".",loc:"0",reltype:"0",reltypeSpecial:"",timestamp:0,valid:!1}};
inputFacebookMini.prototype.fieldsToStorage=function(){console.log("MINI FICHE: FIELDS TO STORAGE");for(var a=$$('[data-sublink="facebook"] article.mini-relation-panel .mini-fiche-relation'),b=0;b<a.length;b++){var c=(new FormDeflater(a[b],["input","select"],["data-name"])).deflate(),e=crc32(JSON.stringify(c)),d=lsi.get("mini-fiches",c.uid);if(!1!==d){if(null!=d&&null!=d.hash&&d.hash==e)break;console.warn("> MINI UPDATE");c={uid:parseInt(c.uid),sexe:c.sexe,age:c.age,studies:c.studies,reltype:c.reltype,
reltypeSpecial:c.reltypeSpecial,loc:c.loc,hash:e};c.valid=this.check(c);0<diff(d,c,["hash","valid","timestamp"]).length&&(console.log(diff(d,c,["hash","valid","timestamp"])),console.warn("> FICHE UPDATE"),c.timestamp=Date.now());lsi.set("mini-fiches",c.uid,c)}}};
inputFacebookMini.prototype.add=function(a){console.log("MINI FICHE: ADD");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;var b=lsi.get("contacts",a.uid);if(!1===b)return!1;
this.container.innerHTML+=fMiniFicheBuilder.build({name:readableName(b.username,b.firstname,b.lastname),countcall:b.countcall,countsms:b.countsms,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");for(var c=$$('[data-sublink="facebook"] article.mini-fiche-relation input[data-name="uid"][value="'+a.uid+'"] ~ h5>input[type="radio"][data-name="sexe"]'),b=0;b<c.length;b++)c[b].value==a.sexe?c[b].setAttribute("checked","checked"):c[b].removeAttribute("checked");c=$$('[data-sublink="facebook"] article.mini-fiche-relation input[data-name="uid"][value="'+a.uid+'"] ~ h5>input[type="radio"][data-name="reltype"]');
for(b=0;b<c.length;b++)c[b].value==a.reltype?c[b].setAttribute("checked","checked"):c[b].removeAttribute("checked");c=$$('[data-sublink="facebook"] article.mini-fiche-relation input[data-name="uid"][value="'+a.uid+'"] ~ h5>input[type="radio"][data-name="loc"]');for(b=0;b<c.length;b++)c[b].value==a.loc?c[b].setAttribute("checked","checked"):c[b].removeAttribute("checked")};
inputFacebookMini.prototype.storageToFields=function(){console.log("MINI FICHE: STORAGE TO FIELDS");var a=lsi.get("mini-fiches",this.selected);if(null==a)return this.updateNavBar(),!1;this.container.innerHTML="";this.add(a);this.updateNavBar()};
inputFacebookMini.prototype.sync=function(){console.log("MINI FICHE: SYNC");var a=lsi["export"]("contacts"),b=lsi["export"]("fiches"),c=[],e;for(e in b)-1==c.indexOf(b[e].contact)&&c.push(b[e].contact);for(var d in a)-1<c.indexOf(parseInt(d))?lsi.del("mini-fiches",d):(b=0==a[d].username.length+a[d].firstname.length+a[d].lastname.length?d.toString()+"-":d,e=lsi.get("mini-fiches",b),null==e&&(e=this.defaultData,e.valid=!1,isNaN(b)&&(e.reltype="9")),e.uid=parseInt(d),lsi.set("mini-fiches",b,e));e=lsi["export"]("mini-fiches");
if(null==e[this.selected])for(d in e)if(!isNaN(d)){this.selected=parseInt(d);break}};inputFacebookMini.prototype.nav=function(a){if(null==a||!1===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.length;c++)b[c].remClass("active");a.addClass("active");this.selected=parseInt(a.getData("n"))};
inputFacebookMini.prototype.updateNavBar=function(){var a=lsi["export"]("mini-fiches");this.nav_container.innerHTML="";var b=0,c;for(c in a)isNaN(c)||(this.nav_container.innerHTML+='<span data-n="'+c+'">'+ ++b+"</span>");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.sexe||"."==a.studies||"."==a.age||""==a.loc||""==a.reltype||"10"==a.reltype&&2>a.reltypeSpecial.length?!1:!0};inputFacebookMini.prototype.attach=function(a){console.log("MINI FICHE: ATTACH");lsi.createDataset("mini-fiches");this.storageToFields();this.handler=a;var b=this;this.nav_container.addEventListener("click",function(a){b.nav(a.target);b.handler(a.target)},!1)};

View File

@ -0,0 +1,423 @@
/* [0] Constructeur -> définit le conteneur et le bouton d'ajout
=========================================================*/
function inputFacebookMini(container, navContainer){
this.container = container;
this.nav_container = navContainer;
}
/* [1] Attributs
=========================================================*/
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
handler: null, // Fonction pour l'enregistrement et la synchronisation des données
defaultData: { // Valeur par défaut
sexe: '0',
age: '.',
studies: '.',
loc: '0',
reltype: '0',
reltypeSpecial: '',
timestamp: 0,
valid: false
}
};
/* [2] Gestion de l'enregistrement des formulaires mini fiches relation
=========================================================*/
inputFacebookMini.prototype.fieldsToStorage = function(){
console.log('MINI FICHE: FIELDS TO STORAGE');
// {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']);
// {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));
// console.log(deflated);
// {4} On récupère les données du LSI si elles existent //
var existingData = lsi.get('mini-fiches', deflated.uid);
// Si n'existe pas, on passe à la 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),
sexe: deflated.sexe, // [0] Homme, [1] Femme
age: deflated.age,
studies: deflated.studies,
reltype: deflated.reltype, // [0] ...
reltypeSpecial: deflated.reltypeSpecial,
loc: deflated.loc, // [0] Choix 1 -> [3] Choix 4
hash: deflatedHash
};
/* (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);
// 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();
}
/* (9) On enregistre les données dans le 'localStorage' */
lsi.set('mini-fiches', obj.uid, obj);
}
};
/* [3] Gestion de l'ajout physique d'un nouveau contact
=========================================================*/
/*
*
* @objectData<Object> Objet contenant les informations nécessaires à l'affichage
*
*/
inputFacebookMini.prototype.add = function(objectData){
console.log('MINI FICHE: ADD');
// Si pas d'UID, on retourne une erreur
if( objectData == null || objectData.uid == null )
return false;
/* (0) Gestion du formattage des valeur */
objectData.age = (objectData.age != null) ? objectData.age : this.defaultData.age;
objectData.sexe = (objectData.sexe != null) ? objectData.sexe : this.defaultData.sexe;
objectData.studies = (objectData.studies != null) ? objectData.studies : this.defaultData.studies;
objectData.reltype = (objectData.reltype != null) ? objectData.reltype : this.defaultData.reltype;
objectData.reltypeSpecial = (objectData.reltypeSpecial != null) ? objectData.reltypeSpecial : this.defaultData.reltypeSpecial;
objectData.loc = (objectData.loc != null) ? objectData.loc : this.defaultData.loc;
// {1} On récupère username/firstname/lastname du contact associé //
var associatedContact = lsi.get('contacts', objectData.uid);
// Si on ne trouve pas le contact, on ne fais rien
if( associatedContact === false )
return false;
// {2} Création physique //
this.container.innerHTML += fMiniFicheBuilder.build({
name: readableName(associatedContact.username, associatedContact.firstname, associatedContact.lastname),
countcall: associatedContact.countcall,
countsms: associatedContact.countsms,
uid: objectData.uid,
reltypespecial: objectData.reltypeSpecial
});
/* {3} On sélectionne la valeur dans le select (manuellement) de la PROFESSION */
var selectedOption = $('[data-sublink="facebook"] article.mini-fiche-relation input[data-name="uid"][value="'+objectData.uid+'"] ~ h5>span>select[data-name="studies"]>option[value="'+objectData.studies+'"]');
if( selectedOption != null )
selectedOption.setAttribute('selected', 'selected');
/* {4} On sélectionne la valeur dans le select (manuellement) de l'AGE */
selectedOption = $('[data-sublink="facebook"] article.mini-fiche-relation input[data-name="uid"][value="'+objectData.uid+'"] ~ h5>span>select[data-name="age"]>option[value="'+objectData.age+'"]');
if( selectedOption != null )
selectedOption.setAttribute('selected', 'selected');
/* {5} On sélectionna la valeur des boutons <radio> pour le SEXE */
var sexeCreated = $$('[data-sublink="facebook"] article.mini-fiche-relation input[data-name="uid"][value="'+objectData.uid+'"] ~ h5>input[type="radio"][data-name="sexe"]');
for( var i = 0 ; i < sexeCreated.length ; i++ )
if( sexeCreated[i].value == objectData.sexe ) sexeCreated[i].setAttribute('checked', 'checked');
else sexeCreated[i].removeAttribute('checked');
/* {6} On sélectionna la valeur des boutons <radio> pour le TYPE DE RELATION */
var reltypeCreated = $$('[data-sublink="facebook"] article.mini-fiche-relation input[data-name="uid"][value="'+objectData.uid+'"] ~ h5>input[type="radio"][data-name="reltype"]');
for( var i = 0 ; i < reltypeCreated.length ; i++ )
if( reltypeCreated[i].value == objectData.reltype ) reltypeCreated[i].setAttribute('checked', 'checked');
else reltypeCreated[i].removeAttribute('checked');
/* {7} On sélectionna la valeur des boutons <radio> pour la LOCATION */
var locCreated = $$('[data-sublink="facebook"] article.mini-fiche-relation input[data-name="uid"][value="'+objectData.uid+'"] ~ h5>input[type="radio"][data-name="loc"]');
for( var i = 0 ; i < locCreated.length ; i++ )
if( locCreated[i].value == objectData.loc ) locCreated[i].setAttribute('checked', 'checked');
else locCreated[i].removeAttribute('checked');
};
/* [4] Gestion de l'affichage depuis le 'localStorage'
=========================================================*/
inputFacebookMini.prototype.storageToFields = function(){
console.log('MINI FICHE: STORAGE TO FIELDS');
// {1} Pour chaque contact du 'localStorage' //
var miniData = lsi.get('mini-fiches', this.selected);
// Si on a rien trouvé, on ne fait rien
if( miniData == null ){
this.updateNavBar();
return false;
}
// On réinitialise le HTML
this.container.innerHTML = '';
// {2} On affiche la MINI fiche sélectionnée //
this.add(miniData);
// {3} On met à jour la navigation //
this.updateNavBar();
};
/* [5] Synchronisation des CONTACT vers les MINI fiches
=========================================================*/
inputFacebookMini.prototype.sync = function(){
console.log('MINI FICHE: SYNC');
/* (1) On récupère les clés de tous les CONTACTS */
var contactData = lsi.export('contacts');
/* (2) On enregistre les contacts qui sont déja dans les FICHES */
var fiches = lsi.export('fiches');
var ignoredContacts = [];
for( var id in fiches )
if( ignoredContacts.indexOf( fiches[id].contact ) == -1 )
ignoredContacts.push( fiches[id].contact );
/* (3) Pour chaque CONTACT, on met à jour/crée la MINI fiche associée */
for( var key in contactData ){
/* (4) Si le contact est déja dans une fiche, on le retire */
if( ignoredContacts.indexOf(parseInt(key)) > -1 ){
// On supprime au cas ou
lsi.del('mini-fiches', key);
continue;
}
/* (5) Si le contact n'a aucun nominatif, on met inconnu par défaut, mais on ne l'affiche pas */
var noName = contactData[key].username.length+contactData[key].firstname.length+contactData[key].lastname.length == 0;
// On rajoute un '.' après pour dire qu'on affichera pas
var uid = noName ? key.toString()+'-' : key;
/* (5) On récupère les informations de la MINI (si elle existe) */
var miniData = lsi.get('mini-fiches', uid);
/* (6) Si la MINI fiche n'exise pas, on la crée avec les valeurs par défaut */
if( miniData == null ){
miniData = this.defaultData;
miniData.valid = false;
// Si aucun nom, on met 'inconnu' par défaut pour la fiche de relation
if( isNaN(uid) )
miniData.reltype = '9';
}
/* (7) On met à jour la MINI fiche */
miniData.uid = parseInt(key);
/* (8) On enregistre les modification */
lsi.set('mini-fiches', uid, miniData);
}
/* (9) On met à jour la mini-fiche en cours */
var miniData = lsi.export('mini-fiches');
// Si la clé n'existe plus
if( miniData[this.selected] == null ){
// On cherche la première clé numérique
for( var key in miniData )
if( !isNaN(key) ){ // La première qu'on trouve, on la définit
this.selected = parseInt(key);
break;
}
}
};
/* [6] Gestion de la navigation entre les fiches
=========================================================*/
inputFacebookMini.prototype.nav = function(element){
/* (1) On vérifie que l'élément contient un nombre et existe */
if( element == null )
return false;
if( element.getData('n') === false || isNaN(element.getData('n')) || element.parentNode.id != 'f_nav-mini' )
return false;
/* (2) On désactive tous les éléments actifs */
var activeElements = $$('[data-sublink="facebook"] #f_nav-mini > span.active');
for( var i = 0 ; i < activeElements.length ; i++ )
activeElements[i].remClass('active');
/* (3) On active l'élément courant */
element.addClass('active');
this.selected = parseInt(element.getData('n'));
};
/* [7] Mise à jour de la navigation
=========================================================*/
inputFacebookMini.prototype.updateNavBar = function(){
var miniData = lsi.export('mini-fiches');
/* (1) On vide et remplit la barre de nav, si elle n'est pas à jour */
this.nav_container.innerHTML = '';
var i = 0;
for( var key in miniData )
if( !isNaN(key) ) // On affiche que les clés numériques
this.nav_container.innerHTML += '<span data-n="'+key+'">'+(++i)+'</span>';
/* (2) On montre les MINI fiches qui sont correctes dans la navbar */
for( var key in miniData ){
// Si la clé n'est pas numérique, on ne gère pas
if( isNaN(key) )
continue;
var currentElement = $('[data-sublink="facebook"] #f_nav-mini [data-n="'+miniData[key].uid+'"]');
if( currentElement == null )
continue;
// On remplit avec le numéro de la MINI fiche
// currentElement.setAttribute('data-n', miniData[key].uid);
// currentElement.innerHTML = miniData[key].uid + 1;
// Si la MINI fiche est valide
if( miniData[key].valid === true ) currentElement.addClass('done');
// Si elle est invalide
else currentElement.remClass('done');
}
/* (3) On séléctionne par défaut la dernière MINI fiche sélectionnée */
this.nav( $('[data-sublink="facebook"] #f_nav-mini [data-n="'+this.selected+'"]') );
};
/* [8] Vérification des données du formulaire
=========================================================*/
inputFacebookMini.prototype.check = function(miniData){
// 1. Le sexe est défini
if( miniData.sexe == '' )
return false;
// 2. Le métier est défini
if( miniData.studies == '.' )
return false;
// 3. L'age est définie
if( miniData.age == '.' )
return false;
// 4. La distance de localisation est définie
if( miniData.loc == '' )
return false;
// 5. Le TYPE DE RELATION a un et un seul choix
if( miniData.reltype == '' )
return false;
// 6. TYPE DE RELATION si autre est coché (indice 10), reltypeSpecial doit avoir au moins 2 caractère
if( miniData.reltype == '10' && miniData.reltypeSpecial.length < 2 )
return false;
// Si aucune erreur, tout est ok
return true;
};
/* [9] Point d'amorçage de la gestion des contacts
=========================================================*/
inputFacebookMini.prototype.attach = function(handler){
console.log('MINI FICHE: ATTACH');
/* (1) On initialise le jeu de données */
lsi.createDataset('mini-fiches');
/* (2) On charge les mini fiches depuis la mémoire ('localStorage') */
this.storageToFields();
/* (3) On attache la barre de navigation à une fonction */
// On enregistre le 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);
// 2. On gere le chargement dynamique
ptr.handler(e.target);
}, false);
};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,439 @@
/* [0] Gestion des constructeurs HTML
=========================================================*/
/* (1) Constructeur de formulaire de contact */
var fContactBuilder = new HTMLBuilder();
fContactBuilder.setLayout(
"<h4 data-icon='o' class='new-contact color2'> \n"+
"\t<input type='hidden' data-name='uid' value='@uid'>\n"+
"\t<input type='text' data-name='username' placeholder='Pseudo' value='@username' > \n"+
"\t<span class='switch-left'></span> \n"+
"\t<input type='text' data-name='firstname' placeholder='Prénom' value='@firstname' > \n"+
"\t<span class='switch-both'></span> \n"+
"\t<input type='text' data-name='lastname' placeholder='Nom' value='@lastname' > \n"+
"\t<input type='submit' class='primary sub-number' value='Enregistrer'>\n"+
"</h4>\n\n");
/* (2) Constructeur de MINI fiche de relation */
var fMiniFicheBuilder = new HTMLBuilder();
fMiniFicheBuilder.setLayout(
"<article class='mini-fiche-relation'>\n"+
"\t<input type='hidden' data-name='uid' value='@uid'>\n"+
"\t<span data-space></span>\n"+
"\t<h4 data-icon='a' class='color2'>@name</h4>\n"+
"\t<h5 class='nobold color0'>\n"+
"\t\t<input type='radio' name='sexe_min_@uid' data-name='sexe' id='sexeH_min_@uid' value='0'><label for='sexeH_min_@uid'>Homme</label>\n"+
"\t\t&nbsp&nbsp&nbsp<input type='radio' name='sexe_min_@uid' data-name='sexe' id='sexeF_min_@uid' value='1'><label for='sexeF_min_@uid'>Femme</label>\n"+
"\t</h5>\n"+
"\t<h5 class='nobold color0'>\n"+
"\t\t<span class='select-container'><select data-name='age'>\n"+
"\t\t\t<option value='.' disabled selected>Age:</option>\n"+
"\t\t\t<option value='1' >5 à 10 ans</option>\n"+
"\t\t\t<option value='2' >10 à 15 ans</option>\n"+
"\t\t\t<option value='3' >15 à 20 ans</option>\n"+
"\t\t\t<option value='4' >20 à 25 ans</option>\n"+
"\t\t\t<option value='5' >25 à 30 ans</option>\n"+
"\t\t\t<option value='6' >30 à 35 ans</option>\n"+
"\t\t\t<option value='7' >35 à 40 ans</option>\n"+
"\t\t\t<option value='8' >40 à 45 ans</option>\n"+
"\t\t\t<option value='9' >45 à 50 ans</option>\n"+
"\t\t\t<option value='10'>50 à 55 ans</option>\n"+
"\t\t\t<option value='11'>55 à 60 ans</option>\n"+
"\t\t\t<option value='12'>60 à 65 ans</option>\n"+
"\t\t\t<option value='13'>65 à 70 ans</option>\n"+
"\t\t\t<option value='14'>70 à 75 ans</option>\n"+
"\t\t\t<option value='15'>75 à 80 ans</option>\n"+
"\t\t\t<option value='16'>80 à 85 ans</option>\n"+
"\t\t\t<option value='17'>85 à 90 ans</option>\n"+
"\t\t\t<option value='18'>90 à 95 ans</option>\n"+
"\t\t\t<option value='19'>95 à 100 ans</option>\n"+
"\t\t</select></span>\n"+
"\t</h5>\n"+
"\t<h5 class='nobold color0'>\n"+
"\t\t<span class='select-container'><select data-name='studies'>\n"+
"\t\t\t<option value='.' disabled selected>Niveau d'études maximal:</option>\n"+
"\t\t\t<option value='0'>Inconnu</option>\n"+
"\t\t\t<option value='1'>< BAC</option>\n"+
"\t\t\t<option value='2'>BAC</option>\n"+
"\t\t\t<option value='3'>BAC+2</option>\n"+
"\t\t\t<option value='4'>BAC+3</option>\n"+
"\t\t\t<option value='5'>BAC+5 et plus</option>\n"+
"\t\t\t<option value='6'>Diplôme d'ingénieur, d'une grande école, etc.</option>\n"+
"\t\t</select></span>\n"+
"\t</h5>\n"+
"\t<h4 data-icon='a'>Type de relation</h4>\n"+
"\t<h5 class='nobold color0'>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='reltype_mini_@uid' data-name='reltype' id='reltype0_mini_@uid' value='0'><label for='reltype0_mini_@uid'>Père, mère ou équivalent</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='reltype_mini_@uid' data-name='reltype' id='reltype1_mini_@uid' value='1'><label for='reltype1_mini_@uid'>Frère ou soeur</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='reltype_mini_@uid' data-name='reltype' id='reltype2_mini_@uid' value='2'><label for='reltype2_mini_@uid'>Autre membre de la famille</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='reltype_mini_@uid' data-name='reltype' id='reltype3_mini_@uid' value='3'><label for='reltype3_mini_@uid'>Relation amoureuse</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='reltype_mini_@uid' data-name='reltype' id='reltype4_mini_@uid' value='4'><label for='reltype4_mini_@uid'>Collègue</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='reltype_mini_@uid' data-name='reltype' id='reltype5_mini_@uid' value='5'><label for='reltype5_mini_@uid'>Voisin</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='reltype_mini_@uid' data-name='reltype' id='reltype6_mini_@uid' value='6'><label for='reltype6_mini_@uid'>Ami proche</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='reltype_mini_@uid' data-name='reltype' id='reltype7_mini_@uid' value='7'><label for='reltype7_mini_@uid'>Ami</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='reltype_mini_@uid' data-name='reltype' id='reltype8_mini_@uid' value='8'><label for='reltype8_mini_@uid'>Relation de service (médecin, ...)</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='reltype_mini_@uid' data-name='reltype' id='reltype9_mini_@uid' value='9'><label for='reltype9_mini_@uid'>Inconnu</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='reltype_mini_@uid' data-name='reltype' id='reltype10_mini_@uid' value='10'><label for='reltype10_mini_@uid'>Autre : <input type='text' data-name='reltypeSpecial' placeholder='coéquipier de tennis, ..' value='@reltypespecial'></label><br>\n"+
"\t</h5>\n"+
"\t<h4 data-icon='m'>Où habite t-elle/il ?</h4>\n"+
"\t<h5 class='nobold color0'>\n"+
"\t\tÀ combien de temps est-ce de chez vous ?<br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='loc_min_@uid' data-name='loc' id='locA_min_@uid' value='0'><label for='locA_min_@uid'>- de 5 minutes</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='loc_min_@uid' data-name='loc' id='locB_min_@uid' value='1'><label for='locB_min_@uid'>de 5 à 15 minutes</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='loc_min_@uid' data-name='loc' id='locC_min_@uid' value='2'><label for='locC_min_@uid'>de 15 à 60 minutes</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='loc_min_@uid' data-name='loc' id='locD_min_@uid' value='3'><label for='locD_min_@uid'>+ d'une heure</label><br>\n"+
"\t</h5>\n"+
"</article>");
/* (3) Constructeur de formulaire fiche relation */
var fFicheBuilder = new HTMLBuilder();
fFicheBuilder.setLayout(
"<article class='fiche-relation'>\n"+
"\t<input type='hidden' data-name='contact' value='@contact'>\n"+
"\t<input type='hidden' data-name='uid' value='@uid'>\n"+
"\t<h4 data-icon='a' class='color2'>@name</h4>\n"+
"\t<h5 class='nobold color0'>\n"+
"\t\t<input type='radio' name='sexe_@uid' data-name='sexe' id='sexeH_@uid' value='0'><label for='sexeH_@uid'>Homme</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='sexe_@uid' data-name='sexe' id='sexeF_@uid' value='1'><label for='sexeF_@uid'>Femme</label>\n"+
"\t</h5>\n"+
"\t<h5 class='nobold color0'>\n"+
"\t\t<span class='select-container'><select data-name='age'>\n"+
"\t\t\t<option value='.' disabled selected>Age:</option>\n"+
"\t\t\t<option value='1' >5 à 10 ans</option>\n"+
"\t\t\t<option value='2' >10 à 15 ans</option>\n"+
"\t\t\t<option value='3' >15 à 20 ans</option>\n"+
"\t\t\t<option value='4' >20 à 25 ans</option>\n"+
"\t\t\t<option value='5' >25 à 30 ans</option>\n"+
"\t\t\t<option value='6' >30 à 35 ans</option>\n"+
"\t\t\t<option value='7' >35 à 40 ans</option>\n"+
"\t\t\t<option value='8' >40 à 45 ans</option>\n"+
"\t\t\t<option value='9' >45 à 50 ans</option>\n"+
"\t\t\t<option value='10'>50 à 55 ans</option>\n"+
"\t\t\t<option value='11'>55 à 60 ans</option>\n"+
"\t\t\t<option value='12'>60 à 65 ans</option>\n"+
"\t\t\t<option value='13'>65 à 70 ans</option>\n"+
"\t\t\t<option value='14'>70 à 75 ans</option>\n"+
"\t\t\t<option value='15'>75 à 80 ans</option>\n"+
"\t\t\t<option value='16'>80 à 85 ans</option>\n"+
"\t\t\t<option value='17'>85 à 90 ans</option>\n"+
"\t\t\t<option value='18'>90 à 95 ans</option>\n"+
"\t\t\t<option value='19'>95 à 100 ans</option>\n"+
"\t\t</select></span>\n"+
"\t</h5>\n"+
"\t<h5 class='nobold color0'>\n"+
"\t\t<span class='select-container'><select data-name='job'>\n"+
"\t\t\t<option value='.' disabled selected>Dernière profession exercée:</option>\n"+
"\t\t\t<option value='0'>Inconnue</option>\n"+
"\t\t\t<option value='.' disabled>Agriculateur exploitants</option>\n"+
"\t\t\t\t<option value='10'>Agriculteurs exploitants (Agriculteurs, maraîchers, viticulteurs…)</option>\n"+
"\t\t\t<option value='.' disabled>Artisans, commerçants et chefs d'entreprises</option>\n"+
"\t\t\t\t<option value='21'>Artisans (Maçons, électriciens, couturiers, boulangers, garagistes, coiffeurs…)</option>\n"+
"\t\t\t\t<option value='22'>Commerçants et assimilés (Commerçants en détail ou en gros, buralistes, cafetiers, agents immobiliers…)</option>\n"+
"\t\t\t\t<option value='23'>Chefs d'entreprise de 10 salariés ou plus</option>\n"+
"\t\t\t<option value='.' disabled>Cadres et professions intellectuelles supérieures</option>\n"+
"\t\t\t\t<option value='31'>Professions libérales et assimilés (Médecins, avocats, notaires, architectes libéraux…)</option>\n"+
"\t\t\t\t<option value='32'>Cadres de la fonction publique, professions intellectuelles et artistiques (Personnels administratifs</option>\n"+
"\t\t\t\t\t<option class='pad' value='32'>de catégorie A, professeurs de lenseignement secondaire ou supérieur, médecins hospitaliers, artistes…)</option>\n"+
"\t\t\t\t<option value='36'>Cadres d'entreprise (Cadres administratifs, cadres commerciaux, ingénieurs…)</option>\n"+
"\t\t\t<option value='.' disabled>Professions Intermédiaires</option>\n"+
"\t\t\t\t<option value='41'>Professions intermédiaires de l'enseignement, de la santé, de la fonction publique et assimilés </option>\n"+
"\t\t\t\t\t<option class='pad' value='41'>(Personnels administratifs de catégorie B, instituteurs, infirmiers, travailleurs sociaux…)</option>\n"+
"\t\t\t\t<option value='46'>Professions intermédiaires administratives et commerciales des entreprises (Comptables, chargés de clientèles…)</option>\n"+
"\t\t\t\t<option value='47'>Techniciens (Techniciens détudes, techniciens de contrôle, dessinateurs en bâtiment, géomètres…)</option>\n"+
"\t\t\t\t<option value='48'>Contremaîtres, agents de maîtrise (Conducteurs de travaux, chefs déquipe…)</option>\n"+
"\t\t\t<option value='.' disabled>Employés</option>\n"+
"\t\t\t\t<option value='51'>Employés de la fonction publique (Personnels de catégorie C, agents administratifs, agents de service…)</option>\n"+
"\t\t\t\t<option value='54'>Employés administratifs d'entreprise (Secrétaires, agents daccueil…)</option>\n"+
"\t\t\t\t<option value='55'>Employés de commerce (Vendeurs, caissiers…)</option>\n"+
"\t\t\t\t<option value='56'>Personnels des services directs aux particuliers (Serveurs, coiffeurs, assistantes maternelles…)</option>\n"+
"\t\t\t<option value='.' disabled>Ouvriers</option>\n"+
"\t\t\t\t<option value='61'>Ouvriers qualifiés de type industriel ou artisanal (Mécaniciens, chauffeurs, cuisiniers…)</option>\n"+
"\t\t\t\t<option value='66'>Ouvriers non qualifiés de type industriel ou artisanal (Ouvrier de production, manœuvres…)</option>\n"+
"\t\t\t\t<option value='69'>Ouvriers agricoles (Bergers, ouvriers de la viticulture, bûcherons, ouvrier forestiers…)</option>\n"+
"\t\t\t<option value='.' disabled>Retraités</option>\n"+
"\t\t\t\t<option value='71'>Anciens agriculteurs exploitants</option>\n"+
"\t\t\t\t<option value='72'>Anciens artisans, commerçants, chefs d'entreprise</option>\n"+
"\t\t\t\t<option value='73'>Anciens cadres</option>\n"+
"\t\t\t\t<option value='74'>Anciennes professions intermédiaires</option>\n"+
"\t\t\t\t<option value='75'>Anciens employés</option>\n"+
"\t\t\t\t<option value='76'>Anciens ouvriers</option>\n"+
"\t\t\t<option value='.' disabled>Sans activité professionnelle</option>\n"+
"\t\t\t\t<option value='81'>Chômeurs n'ayant jamais travaillé</option>\n"+
"\t\t\t\t<option value='82'>Inactifs divers (autres que retraités)</option>\n"+
"\t\t</select></span>\n"+
"\t</h5>\n"+
"\t<h5 class='nobold color0'>\n"+
"\t\tSituation familiale:<br>\n"+
"\t\t<h5 class='nobold color0'>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='famsit_@uid' data-name='famsit' id='famsitA_@uid' value='0'><label for='famsitA_@uid'>Seul</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='famsit_@uid' data-name='famsit' id='famsitB_@uid' value='1'><label for='famsitB_@uid'>Seul avec enfant(s)</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='famsit_@uid' data-name='famsit' id='famsitC_@uid' value='2'><label for='famsitC_@uid'>En couple sans enfants</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='famsit_@uid' data-name='famsit' id='famsitD_@uid' value='3'><label for='famsitD_@uid'>En couple avec enfants</label>\n"+
"\t</h5>\n"+
"\t<h5 class='nobold color0'>\n"+
"\t\t<span class='select-container'><select data-name='studies'>\n"+
"\t\t\t<option value='.' disabled selected>Niveau d'études maximal:</option>\n"+
"\t\t\t<option value='0'>Inconnue</option>\n"+
"\t\t\t<option value='01'>Pas de scolarité</option>\n"+
"\t\t\t<option value='02'>Aucun diplôme mais scolarité jusqu'en école primaire ou au collège</option>\n"+
"\t\t\t<option value='03'>Aucun diplôme mais scolarité au-delà du collège</option>\n"+
"\t\t\t<option value='04'>Certificat d'études primaires (CEP)</option>\n"+
"\t\t\t<option value='05'>BEPC, brevet élémentaire, brevet des collèges</option>\n"+
"\t\t\t<option value='06'>Certificat d'aptitudes professionnelles (CAP), brevet de compagnon, y compris CAPA</option>\n"+
"\t\t\t<option value='07'>Brevet d'études professionnelles (BEP), y compris BEPA et diplômes agricoles (BAA, BPA)</option>\n"+
"\t\t\t\t<option value='07' class='pad'>Diplômes sociaux (aide-soignante, auxiliaire de puériculture, travailleuse familiale)</option>\n"+
"\t\t\t<option value='08'>Baccalauréat général, brevet supérieur</option>\n"+
"\t\t\t\t<option class='pad' value='08'>BAC ( L, ES, S ou A, B , C, D, D, E )</option>\n"+
"\t\t\t<option value='09'>Bac technologique ou professionnel, brevet professionnel ou de technicien</option>\n"+
"\t\t\t\t<option class='pad' value='09'>BAC (STI, STL, SMS, STT ou F, G, H)</option>\n"+
"\t\t\t\t<option class='pad' value='09'>BEC, BEI, BEH, capacité en droit</option>\n"+
"\t\t\t\t<option class='pad' value='09'>Brevet de technicien agricole (BTA)</option>\n"+
"\t\t\t<option value='10'>Diplôme universitaire de 1er cycle</option>\n"+
"\t\t\t\t<option class='pad' value='10'>BTS, DUT, DEUG</option>\n"+
"\t\t\t\t<option class='pad' value='10'>Diplôme des professions sociales ou de santé, d'infirmier(ère)</option>\n"+
"\t\t\t\t<option class='pad' value='10'>Diplôme universitaire propédeutique, DUEL, DUES, DEUG, PCEM</option>\n"+
"\t\t\t<option value='11'>Diplôme universitaire de 2ème ou 3ème cycle</option>\n"+
"\t\t\t\t<option class='pad' value='11'>MASTER, DOCTORAT (y compris médecine, pharmacie, dentaire),</option>\n"+
"\t\t\t\t<option class='pad' value='11'>Maîtrise, DEA, DESS,</option>\n"+
"\t\t\t\t<option class='pad' value='11'>CAPES, CAPET, agrégation</option>\n"+
"\t\t\t\t<option class='pad' value='11'>Diplôme d'ingénieur, d'une grande école, etc.</option>\n"+
"\t\t</select></span>\n"+
"\t</h5>\n"+
"\t<h4 data-icon='a'>Type de relation</h4>\n"+
"\t<h5 class='nobold color0'>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='reltype_@uid' data-name='reltype' id='reltype0_@uid' value='0'><label for='reltype0_@uid'>Père, mère ou équivalent</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='reltype_@uid' data-name='reltype' id='reltype1_@uid' value='1'><label for='reltype1_@uid'>Frère ou soeur</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='reltype_@uid' data-name='reltype' id='reltype2_@uid' value='2'><label for='reltype2_@uid'>Autre membre de la famille</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='reltype_@uid' data-name='reltype' id='reltype3_@uid' value='3'><label for='reltype3_@uid'>Relation amoureuse</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='reltype_@uid' data-name='reltype' id='reltype4_@uid' value='4'><label for='reltype4_@uid'>Collègue</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='reltype_@uid' data-name='reltype' id='reltype5_@uid' value='5'><label for='reltype5_@uid'>Voisin</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='reltype_@uid' data-name='reltype' id='reltype6_@uid' value='6'><label for='reltype6_@uid'>Ami proche</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='reltype_@uid' data-name='reltype' id='reltype7_@uid' value='7'><label for='reltype7_@uid'>Ami</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='reltype_@uid' data-name='reltype' id='reltype10_@uid' value='10'><label for='reltype10_@uid'>Autre : <input type='text' data-name='reltypeSpecial' placeholder='coéquipier de tennis, ..' value='@reltypespecial'></label><br>\n"+
"\t</h5>\n"+
"\t<h4 data-icon='m'>Où habite t-elle/il ?</h4>\n"+
"\t<h5 class='nobold color0'>\n"+
"\t\t<input type='text' data-name='city' placeholder='Ville' value='@city'>\n"+
"\t\t<input type='text' data-name='cp' placeholder='Code postal' value='@cp'><br>\n"+
"\t</h5>\n"+
"\t<h5 class='nobold color0'>\n"+
"\t\tSi Toulouse : <input type='text' data-name='quartier' placeholder='quartier' value='@quartier'>\n"+
"\t</h5>\n"+
"\t<h5 class='nobold color0'>\n"+
"\t\tÀ combien de temps est-ce de chez vous ?<br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='loc_@uid' data-name='loc' id='locA_@uid' value='0'><label for='locA_@uid'>- de 5 minutes</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='loc_@uid' data-name='loc' id='locB_@uid' value='1'><label for='locB_@uid'>de 5 à 15 minutes</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='loc_@uid' data-name='loc' id='locC_@uid' value='2'><label for='locC_@uid'>de 15 à 60 minutes</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='loc_@uid' data-name='loc' id='locD_@uid' value='3'><label for='locD_@uid'>+ d'une heure</label><br>\n"+
"\t</h5>\n"+
"\t<h5 class='nobold color0'>\n"+
"\t\tDepuis quand connaissez-vous cette personne ?<br><br>\n"+
"\t\t<input type='number' style='width: 5em;' data-name='duration' min='0' max='11' step='1' placeholder='mois' value='@duration0'>mois\n"+
"\t\tet &nbsp;&nbsp;&nbsp;<input type='number' style='width: 5em;' data-name='duration' min='0' max='100' step='1' placeholder='années' value='@duration1'>ans.\n"+
"\t</h5>\n"+
"\t<h4 data-icon='d'>Contexte de rencontre</h4>\n"+
"\t<h5 class='nobold color0'>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='contexte_@uid' data-name='context' id='contexte0_@uid' value='0'><label for='contexte0_@uid'>De la même famille</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='contexte_@uid' data-name='context' id='contexte1_@uid' value='1'><label for='contexte1_@uid'>Grandi ensemble</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='contexte_@uid' data-name='context' id='contexte2_@uid' value='2'><label for='contexte2_@uid'>Par mon mari/ma femme/relation amoureuse</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='contexte_@uid' data-name='context' id='contexte3_@uid' value='3'><label for='contexte3_@uid'>Par mes parents</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='contexte_@uid' data-name='context' id='contexte4_@uid' value='4'><label for='contexte4_@uid'>Par mes enfants</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='contexte_@uid' data-name='context' id='contexte5_@uid' value='5'><label for='contexte5_@uid'>Par un ami</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='contexte_@uid' data-name='context' id='contexte6_@uid' value='6'><label for='contexte6_@uid'>Comme voisin</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='contexte_@uid' data-name='context' id='contexte7_@uid' value='7'><label for='contexte7_@uid'>Par dautres membres de la famille</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='contexte_@uid' data-name='context' id='contexte8_@uid' value='8'><label for='contexte8_@uid'>Etudes</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='contexte_@uid' data-name='context' id='contexte9_@uid' value='9'><label for='contexte9_@uid'>Etudes supérieures</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='contexte_@uid' data-name='context' id='contexte10_@uid' value='10'><label for='contexte10_@uid'>Au travail</label><br>\n"+
"\t</h5>\n"+
"\t<h5 class='nobold color0'>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='contexte_@uid' data-name='context' id='contexte11_@uid' value='11'><label for='contexte11_@uid'>Internet (quel contexte ? préciser <input type='text' data-name='contextSpecial' placeholder='facebook, youtube, twitter, ..' value='@contextspecial0'>)</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='contexte_@uid' data-name='context' id='contexte12_@uid' value='12'><label for='contexte12_@uid'>Par une association (quel type : <input type='text' data-name='contextSpecial' placeholder='aide à la personne, sport, ..' value='@contextspecial1'>)</label><br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='contexte_@uid' data-name='context' id='contexte13_@uid' value='13'><label for='contexte13_@uid'>Autre : <input type='text' data-name='contextSpecial' placeholder='vacances, ..' value='@contextspecial2'></label><br>\n"+
"\t</h5>\n"+
"\t<h4 data-icon='b'>Avec quelle fréquence discutez-vous avec cette personne ?</h4>\n"+
"\t<h5 class='nobold color0'>\n"+
"\t\tFace à face<br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='freq0_@uid' data-name='freq' id='freq01_@uid' value='0'><label for='freq01_@uid'>plusieurs fois par semaine</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='freq0_@uid' data-name='freq' id='freq02_@uid' value='1'><label for='freq02_@uid'>1 fois par semaine</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='freq0_@uid' data-name='freq' id='freq03_@uid' value='2'><label for='freq03_@uid'>1 fois par mois</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='freq0_@uid' data-name='freq' id='freq04_@uid' value='3'><label for='freq04_@uid'>1 fois par an ou moins</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='freq0_@uid' data-name='freq' id='freq05_@uid' value='4'><label for='freq05_@uid'>Jamais</label>\n"+
"\t</h5>\n"+
"\t<h5 class='nobold color0'>\n"+
"\t\tTéléphone ou skype et équivalent<br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='freq1_@uid' data-name='freq' id='freq06_@uid' value='5'><label for='freq06_@uid'>plusieurs fois par semaine</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='freq1_@uid' data-name='freq' id='freq07_@uid' value='6'><label for='freq07_@uid'>1 fois par semaine</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='freq1_@uid' data-name='freq' id='freq08_@uid' value='7'><label for='freq08_@uid'>1 fois par mois</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='freq1_@uid' data-name='freq' id='freq09_@uid' value='8'><label for='freq09_@uid'>1 fois par an ou moins</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='freq1_@uid' data-name='freq' id='freq10_@uid' value='9'><label for='freq10_@uid'>Jamais</label>\n"+
"\t</h5>\n"+
"\t<h5 class='nobold color0'>\n"+
"\t\tSMS, et équivalents<br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='freq2_@uid' data-name='freq' id='freq11_@uid' value='10'><label for='freq11_@uid'>plusieurs fois par semaine</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='freq2_@uid' data-name='freq' id='freq12_@uid' value='11'><label for='freq12_@uid'>1 fois par semaine</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='freq2_@uid' data-name='freq' id='freq13_@uid' value='12'><label for='freq13_@uid'>1 fois par mois</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='freq2_@uid' data-name='freq' id='freq14_@uid' value='13'><label for='freq14_@uid'>1 fois par an ou moins</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='freq2_@uid' data-name='freq' id='freq15_@uid' value='14'><label for='freq15_@uid'>Jamais</label>\n"+
"\t</h5>\n"+
"\t<h5 class='nobold color0'>\n"+
"\t\tCourrier électronique<br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='freq3_@uid' data-name='freq' id='freq16_@uid' value='15'><label for='freq16_@uid'>plusieurs fois par semaine</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='freq3_@uid' data-name='freq' id='freq17_@uid' value='16'><label for='freq17_@uid'>1 fois par semaine</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='freq3_@uid' data-name='freq' id='freq18_@uid' value='17'><label for='freq18_@uid'>1 fois par mois</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='freq3_@uid' data-name='freq' id='freq19_@uid' value='18'><label for='freq19_@uid'>1 fois par an ou moins</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='freq3_@uid' data-name='freq' id='freq20_@uid' value='19'><label for='freq20_@uid'>Jamais</label>\n"+
"\t</h5>\n"+
"\t<h5 class='nobold color0'>\n"+
"\t\tFacebook ou autre réseau social<br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='freq4_@uid' data-name='freq' id='freq21_@uid' value='20'><label for='freq21_@uid'>plusieurs fois par semaine</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='freq4_@uid' data-name='freq' id='freq22_@uid' value='21'><label for='freq22_@uid'>1 fois par semaine</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='freq4_@uid' data-name='freq' id='freq23_@uid' value='22'><label for='freq23_@uid'>1 fois par mois</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='freq4_@uid' data-name='freq' id='freq24_@uid' value='23'><label for='freq24_@uid'>1 fois par an ou moins</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='freq4_@uid' data-name='freq' id='freq25_@uid' value='24'><label for='freq25_@uid'>Jamais</label>\n"+
"\t</h5>\n"+
"\t<h4 data-icon='r'>Comment êtes-vous « connecté » à cette personne ?</h4>\n"+
"\t<h5 class='nobold color0'>\n"+
"\t\tSes coordonnées sont dans votre carnet dadresse<br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='connect1_@uid' data-name='connect' id='connect11_@uid' value='0'><label for='connect11_@uid'>Oui</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='connect1_@uid' data-name='connect' id='connect12_@uid' value='1'><label for='connect12_@uid'>Non</label>\n"+
"\t</h5>\n"+
"\t<h5 class='nobold color0'>\n"+
"\t\tSon numéro de mobile est enregistré sur votre mobile (ou vous-mêmes êtes sur le sien)<br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='connect2_@uid' data-name='connect' id='connect21_@uid' value='2'><label for='connect21_@uid'>Oui</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='connect2_@uid' data-name='connect' id='connect22_@uid' value='3'><label for='connect22_@uid'>Non</label>\n"+
"\t</h5>\n"+
"\t<h5 class='nobold color0'>\n"+
"\t\tElle figure parmi vos amis facebook<br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='connect3_@uid' data-name='connect' id='connect31_@uid' value='4'><label for='connect31_@uid'>Oui</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='connect3_@uid' data-name='connect' id='connect32_@uid' value='5'><label for='connect32_@uid'>Non</label>\n"+
"\t</h5>\n"+
"\t<h5 class='nobold color0'>\n"+
"\t\tElle figure parmi vos amis facebook et vous interagissez avec elle sur ce dispositif régulièrement<br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='connect4_@uid' data-name='connect' id='connect41_@uid' value='6'><label for='connect41_@uid'>Oui</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='connect4_@uid' data-name='connect' id='connect42_@uid' value='7'><label for='connect42_@uid'>Non</label>\n"+
"\t</h5>\n"+
"\t<h5 class='nobold color0'>\n"+
"\t\tVous le suivez sur Twitter<br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='connect5_@uid' data-name='connect' id='connect51_@uid' value='8'><label for='connect51_@uid'>Oui</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='connect5_@uid' data-name='connect' id='connect52_@uid' value='9'><label for='connect52_@uid'>Non</label>\n"+
"\t</h5>\n"+
"\t<h5 class='nobold color0'>\n"+
"\t\tVous communiquez avec cette personne sur Twitter<br>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='connect6_@uid' data-name='connect' id='connect61_@uid' value='10'><label for='connect61_@uid'>Oui</label>\n"+
"\t\t&nbsp;&nbsp;&nbsp;<input type='radio' name='connect6_@uid' data-name='connect' id='connect62_@uid' value='11'><label for='connect62_@uid'>Non</label>\n"+
"\t</h5>\n"+
"\t<h5 class='nobold color0'>\n"+
"\t\tVous communiquez dans autre réseau social : <input type='text' data-name='connectSpecial' value='@connectspecial0'>\n"+
"\t</h5>\n"+
"\t<h5 class='nobold color0'>\n"+
"\t\tVous communiquez dans un autre dispositif (blogs, jeu vidéo ou autre) : <input type='text' data-name='connectSpecial' value='@connectspecial1'>\n"+
"\t</h5>\n"+
"</article>\n");

File diff suppressed because one or more lines are too long

View File

@ -1,8 +1,8 @@
/* [0] Gestion des constructeurs HTML
=========================================================*/
/* (1) Constructeur de formulaire de contact */
var contactBuilder = new HTMLBuilder();
contactBuilder.setLayout(
var pContactBuilder = new HTMLBuilder();
pContactBuilder.setLayout(
"<h4 data-icon='o' class='new-contact color2'> \n"+
"\t<input type='hidden' data-name='uid' value='@uid'>\n"+
@ -41,8 +41,8 @@ contactBuilder.setLayout(
/* (2) Constructeur de MINI fiche de relation */
var miniFicheBuilder = new HTMLBuilder();
miniFicheBuilder.setLayout(
var pMiniFicheBuilder = new HTMLBuilder();
pMiniFicheBuilder.setLayout(
"<article class='mini-fiche-relation'>\n"+
"\t<input type='hidden' data-name='uid' value='@uid'>\n"+
@ -174,8 +174,8 @@ miniFicheBuilder.setLayout(
/* (3) Constructeur de formulaire fiche relation */
var ficheBuilder = new HTMLBuilder();
ficheBuilder.setLayout(
var pFicheBuilder = new HTMLBuilder();
pFicheBuilder.setLayout(
"<article class='fiche-relation'>\n"+
"\t<input type='hidden' data-name='contact' value='@contact'>\n"+

View File

@ -1,8 +1,8 @@
function inputPhoneContact(a,b){this.container=a;this.nav_container=b}inputPhoneContact.prototype={container:this.container,nav_container:this.nav_container,selected:0,handler:null};inputPhoneContact.prototype.check=function(a){var b=0<a.number.length;return b=b&&0<a.username.length+a.firstname.length+a.lastname.length};
inputPhoneContact.prototype.fieldsToStorage=function(){console.log("CONTACTS: FIELDS TO STORAGE");for(var a=$$('[data-sublink="phone"] article.contact-panel .new-contact'),b=0;b<a.length;b++){var c=(new FormDeflater(a[b],["input"],["data-name"])).deflate();if(this.check(c)){var d={uid:parseInt(c.uid),number:c.number,username:c.username,firstname:c.firstname,lastname:c.lastname,call:parseInt(c.call),sms:parseInt(c.sms),countcall:parseInt(c.countcall),countsms:parseInt(c.countsms)};d.hash=crc32(JSON.stringify(d));
lsi.set("contacts",parseInt(c.uid),d)}}};
inputPhoneContact.prototype.add=function(a){console.log("CONTACTS: ADD");if(null==a||null==a.uid||isNaN(a.uid))return!1;a.number=null!=a.number?a.number:"";a.username=null!=a.username?a.username:"";a.firstname=null!=a.firstname?a.firstname:"";a.lastname=null!=a.lastname?a.lastname:"";a.call=null!=a.call?a.call:-1;a.sms=null!=a.sms?a.sms:-1;a.countcall=null!=a.countcall?a.countcall:0;a.countsms=null!=a.countsms?a.countsms:0;this.container.innerHTML+=contactBuilder.build(a);a=$$('[data-sublink="phone"] article.contact-panel .new-contact');
inputPhoneContact.prototype.add=function(a){console.log("CONTACTS: ADD");if(null==a||null==a.uid||isNaN(a.uid))return!1;a.number=null!=a.number?a.number:"";a.username=null!=a.username?a.username:"";a.firstname=null!=a.firstname?a.firstname:"";a.lastname=null!=a.lastname?a.lastname:"";a.call=null!=a.call?a.call:-1;a.sms=null!=a.sms?a.sms:-1;a.countcall=null!=a.countcall?a.countcall:0;a.countsms=null!=a.countsms?a.countsms:0;this.container.innerHTML+=pContactBuilder.build(a);a=$$('[data-sublink="phone"] article.contact-panel .new-contact');
for(var b=this,c=0;c<a.length;c++)a[c].removeEventListener("click",function(a){b.nav(a.target);b.handler(a.target)},!1),a[c].addEventListener("click",function(a){b.nav(a.target);b.handler(a.target)},!1)};inputPhoneContact.prototype.storageToFields=function(){console.log("CONTACTS: STORAGE TO FIELDS");var a=lsi.keys("contacts");this.container.innerHTML="";for(var b=this.selected+10,c=this.selected;c<b&&c<a.length;c++)this.add(lsi.get("contacts",a[c]));b>=a.length&&this.add({uid:a.length});this.updateNavBar()};
inputPhoneContact.prototype.nav=function(a){if(null==a||!1===a.getData("n")||isNaN(a.getData("n"))||"nav-contact"!=a.parentNode.id)return!1;for(var b=$$('[data-sublink="phone"] #p_nav-contact > span.active'),c=0;c<b.length;c++)b[c].remClass("active");a.addClass("active");this.selected=parseInt(a.getData("n"))};
inputPhoneContact.prototype.nav=function(a){if(null==a||!1===a.getData("n")||isNaN(a.getData("n"))||"p_nav-contact"!=a.parentNode.id)return!1;for(var b=$$('[data-sublink="phone"] #p_nav-contact > span.active'),c=0;c<b.length;c++)b[c].remClass("active");a.addClass("active");this.selected=parseInt(a.getData("n"))};
inputPhoneContact.prototype.updateNavBar=function(){var a=lsi.keys("contacts").length;if(this.nav_container.children.length!=a){this.nav_container.innerHTML="";for(var b=0;b<a;b+=10)this.nav_container.innerHTML+='<span data-n="'+b+'">'+(1+b/10)+"</span>"}this.nav($('[data-sublink="phone"] #p_nav-contact [data-n="'+this.selected+'"]'))};
inputPhoneContact.prototype.attach=function(a){console.log("CONTACTS: ATTACH");lsi.createDataset("contacts");this.storageToFields();this.handler=a;var b=this;this.nav_container.addEventListener("click",function(a){b.nav(a.target);b.handler(a.target)},!1)};

View File

@ -25,7 +25,7 @@ inputPhoneContact.prototype.check = function(deflated){
validForm = validForm && deflated.username.length+deflated.firstname.length+deflated.lastname.length > 0;
/* (3) On retourne la validité du formulaire */
return validForm
return validForm;
}
@ -106,7 +106,7 @@ inputPhoneContact.prototype.add = function(objectData){
// {1} On ajoute le HTML //
this.container.innerHTML += contactBuilder.build(objectData);
this.container.innerHTML += pContactBuilder.build(objectData);
// {2} On attache les évènements sur les formulaires //
var contactForms = $$('[data-sublink="phone"] article.contact-panel .new-contact');
@ -169,7 +169,7 @@ inputPhoneContact.prototype.nav = function(element){
if( element == null )
return false;
if( element.getData('n') === false || isNaN(element.getData('n')) || element.parentNode.id != 'nav-contact' )
if( element.getData('n') === false || isNaN(element.getData('n')) || element.parentNode.id != 'p_nav-contact' )
return false;
/* (2) On désactive tous les éléments actifs */

View File

@ -4,7 +4,7 @@ city:c.city,quartier:c.quartier,cp:c.cp,loc:c.loc,duration:c.duration,context:c.
inputPhoneFiche.prototype.add=function(a){console.log("FICHE: ADD");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("contacts",a.contact);if(!1===b)return!1;this.container.innerHTML+=ficheBuilder.build({name:readableName(b.username,b.firstname,b.lastname),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],
a.connect=null!=a.connect?a.connect:this.defaultData.connect;var b=lsi.get("contacts",a.contact);if(!1===b)return!1;this.container.innerHTML+=pFicheBuilder.build({name:readableName(b.username,b.firstname,b.lastname),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="phone"] 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="phone"] 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="phone"] 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");for(var c=$$('[data-sublink="phone"] article.fiche-relation input[data-name="uid"][value="'+a.uid+'"] ~ h5>input[type="radio"][data-name="sexe"]'),b=0;b<c.length;b++)c[b].value==a.sexe?c[b].setAttribute("checked","checked"):c[b].removeAttribute("checked");c=$$('[data-sublink="phone"] article.fiche-relation input[data-name="uid"][value="'+a.uid+'"] ~ h5>input[type="radio"][data-name="famsit"]');
for(b=0;b<c.length;b++)c[b].value==a.famsit?c[b].setAttribute("checked","checked"):c[b].removeAttribute("checked");c=$$('[data-sublink="phone"] article.fiche-relation input[data-name="uid"][value="'+a.uid+'"] ~ h5>input[type="radio"][data-name="reltype"]');for(b=0;b<c.length;b++)c[b].value==a.reltype?c[b].setAttribute("checked","checked"):c[b].removeAttribute("checked");c=$$('[data-sublink="phone"] article.fiche-relation input[data-name="uid"][value="'+a.uid+'"] ~ h5>input[type="radio"][data-name="loc"]');
@ -13,7 +13,7 @@ for(b=0;b<c.length;b++)-1<a.freq.indexOf(c[b].value)?c[b].setAttribute("checked"
inputPhoneFiche.prototype.storageToFields=function(){console.log("FICHE: STORAGE TO FIELDS");var a=lsi["export"]("fiches");this.container.innerHTML="";for(var b in a)a[b].uid==this.selected&&this.add(a[b]);this.updateNavBar()};
inputPhoneFiche.prototype.sync=function(){console.log("FICHE: SYNC");var a=lsi["export"]("contacts"),b=[],c;for(c in a){if(-1<a[c].call){var e=a[c].call;b.push(e);var d=lsi.get("fiches",e);null==d&&(d=this.defaultData);d.uid=e;d.contact=parseInt(c);lsi.set("fiches",e,d)}-1<a[c].sms&&(e=10+a[c].sms,b.push(e),d=lsi.get("fiches",e),null==d&&(d=this.defaultData),d.uid=e,d.contact=parseInt(c),lsi.set("fiches",e,d))}e=20>lsi.keys("contacts").length?lsi.keys("contacts").length:20;if(b.length<e)for(c in a){for(a=
0;-1<b.indexOf(a)&&a<e;)a++;b.push(a);d=lsi.get("fiches",a);null==d&&(d=this.defaultData);d.uid=a;d.contact=parseInt(c);lsi.set("fiches",a,d);if(b.length>=e)break}for(var f in d)b=lsi.get("contacts",d[f].contact),null!=b&&-1!=b.sms&&-1!=b.call&&(b=10>parseInt(f)?10+b.sms:b.call,b=d[b],b.timestamp>=d[f].timestamp||(c=d[f],c.uid=b.uid,lsi.set("fiches",b.uid,c)))};
inputPhoneFiche.prototype.nav=function(a){if(null==a||!1===a.getData("n")||isNaN(a.getData("n"))||"nav-fiche"!=a.parentNode.id)return!1;for(var b=$$('[data-sublink="phone"] #p_nav-fiche > span.active'),c=0;c<b.length;c++)b[c].remClass("active");a.addClass("active");this.selected=parseInt(a.getData("n"))};
inputPhoneFiche.prototype.nav=function(a){if(null==a||!1===a.getData("n")||isNaN(a.getData("n"))||"p_nav-fiche"!=a.parentNode.id)return!1;for(var b=$$('[data-sublink="phone"] #p_nav-fiche > span.active'),c=0;c<b.length;c++)b[c].remClass("active");a.addClass("active");this.selected=parseInt(a.getData("n"))};
inputPhoneFiche.prototype.updateNavBar=function(){var a=lsi["export"]("fiches");this.nav_container.innerHTML="";for(var b=Object.keys(a),c=0;c<b.length;c++){var e=parseInt(b[c]);0==e&&(this.nav_container.innerHTML+="<span>APPELS</span>");10>e&&c<b.length-1&&10<=b[c+1]?this.nav_container.innerHTML+='<span data-n="'+e+'" class="lc">'+(e%10+1)+"</span>&nbsp;&nbsp;":(10==e&&(this.nav_container.innerHTML+='<span class="fc">SMS</span>'),this.nav_container.innerHTML+='<span data-n="'+e+'">'+(e%10+1)+"</span>")}for(var d in a)b=
$('[data-sublink="phone"] #p_nav-fiche [data-n="'+a[d].uid+'"]'),null!=b&&(!0===a[d].valid?b.addClass("done"):b.remClass("done"));this.nav($('[data-sublink="phone"] #p_nav-fiche [data-n="'+this.selected+'"]'))};
inputPhoneFiche.prototype.check=function(a){if(2>a.city.length||isNaN(parseInt(a.duration[0]))&&0<a.duration[0].length||isNaN(parseInt(a.duration[1]))&&0<a.duration[1].length||0==a.duration[0].length+a.duration[1].length||"."==a.job||"."==a.studies||"."==a.age||""==a.sexe||""==a.famsit||""==a.reltype||""==a.loc||""==a.context)return!1;for(var b=0;b<a.freq.length;b++)if(""==a.freq[b])return!1;for(b=0;b<a.connect.length;b++)if(""==a.connect[b])return!1;return"10"==a.reltype&&2>a.reltypeSpecial.length||

View File

@ -170,7 +170,7 @@ inputPhoneFiche.prototype.add = function(objectData){
// {5} Création physique //
this.container.innerHTML += ficheBuilder.build({
this.container.innerHTML += pFicheBuilder.build({
name: readableName(associatedContact.username, associatedContact.firstname, associatedContact.lastname),
countcall: associatedContact.countcall,
countsms: associatedContact.countsms,
@ -448,7 +448,7 @@ inputPhoneFiche.prototype.nav = function(element){
if( element == null )
return false;
if( element.getData('n') === false || isNaN(element.getData('n')) || element.parentNode.id != 'nav-fiche' )
if( element.getData('n') === false || isNaN(element.getData('n')) || element.parentNode.id != 'p_nav-fiche' )
return false;
/* (2) On désactive tous les éléments actifs */

View File

@ -2,11 +2,11 @@ function inputPhoneMini(a,b){this.container=a;this.nav_container=b}inputPhoneMin
inputPhoneMini.prototype.fieldsToStorage=function(){console.log("MINI FICHE: FIELDS TO STORAGE");for(var a=$$('[data-sublink="phone"] article.mini-relation-panel .mini-fiche-relation'),b=0;b<a.length;b++){var c=(new FormDeflater(a[b],["input","select"],["data-name"])).deflate(),e=crc32(JSON.stringify(c)),d=lsi.get("mini-fiches",c.uid);if(!1!==d){if(null!=d&&null!=d.hash&&d.hash==e)break;console.warn("> MINI UPDATE");c={uid:parseInt(c.uid),sexe:c.sexe,age:c.age,studies:c.studies,reltype:c.reltype,
reltypeSpecial:c.reltypeSpecial,loc:c.loc,hash:e};c.valid=this.check(c);0<diff(d,c,["hash","valid","timestamp"]).length&&(console.log(diff(d,c,["hash","valid","timestamp"])),console.warn("> FICHE UPDATE"),c.timestamp=Date.now());lsi.set("mini-fiches",c.uid,c)}}};
inputPhoneMini.prototype.add=function(a){console.log("MINI FICHE: ADD");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;var b=lsi.get("contacts",a.uid);if(!1===b)return!1;
this.container.innerHTML+=miniFicheBuilder.build({name:readableName(b.username,b.firstname,b.lastname),countcall:b.countcall,countsms:b.countsms,uid:a.uid,reltypespecial:a.reltypeSpecial});b=$('[data-sublink="phone"] 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="phone"] article.mini-fiche-relation input[data-name="uid"][value="'+a.uid+'"] ~ h5>span>select[data-name="age"]>option[value="'+
this.container.innerHTML+=pMiniFicheBuilder.build({name:readableName(b.username,b.firstname,b.lastname),countcall:b.countcall,countsms:b.countsms,uid:a.uid,reltypespecial:a.reltypeSpecial});b=$('[data-sublink="phone"] 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="phone"] 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");for(var c=$$('[data-sublink="phone"] article.mini-fiche-relation input[data-name="uid"][value="'+a.uid+'"] ~ h5>input[type="radio"][data-name="sexe"]'),b=0;b<c.length;b++)c[b].value==a.sexe?c[b].setAttribute("checked","checked"):c[b].removeAttribute("checked");c=$$('[data-sublink="phone"] article.mini-fiche-relation input[data-name="uid"][value="'+a.uid+'"] ~ h5>input[type="radio"][data-name="reltype"]');for(b=0;b<c.length;b++)c[b].value==
a.reltype?c[b].setAttribute("checked","checked"):c[b].removeAttribute("checked");c=$$('[data-sublink="phone"] article.mini-fiche-relation input[data-name="uid"][value="'+a.uid+'"] ~ h5>input[type="radio"][data-name="loc"]');for(b=0;b<c.length;b++)c[b].value==a.loc?c[b].setAttribute("checked","checked"):c[b].removeAttribute("checked")};
inputPhoneMini.prototype.storageToFields=function(){console.log("MINI FICHE: STORAGE TO FIELDS");var a=lsi.get("mini-fiches",this.selected);if(null==a)return this.updateNavBar(),!1;this.container.innerHTML="";this.add(a);this.updateNavBar()};
inputPhoneMini.prototype.sync=function(){console.log("MINI FICHE: SYNC");var a=lsi["export"]("contacts"),b=lsi["export"]("fiches"),c=[],e;for(e in b)-1==c.indexOf(b[e].contact)&&c.push(b[e].contact);for(var d in a)-1<c.indexOf(parseInt(d))?lsi.del("mini-fiches",d):(b=0==a[d].username.length+a[d].firstname.length+a[d].lastname.length?d.toString()+"-":d,e=lsi.get("mini-fiches",b),null==e&&(e=this.defaultData,e.valid=!1,isNaN(b)&&(e.reltype="9")),e.uid=parseInt(d),lsi.set("mini-fiches",b,e));e=lsi["export"]("mini-fiches");
if(null==e[this.selected])for(d in e)if(!isNaN(d)){this.selected=parseInt(d);break}};inputPhoneMini.prototype.nav=function(a){if(null==a||!1===a.getData("n")||isNaN(a.getData("n"))||"nav-mini"!=a.parentNode.id)return!1;for(var b=$$('[data-sublink="phone"] #p_nav-mini > span.active'),c=0;c<b.length;c++)b[c].remClass("active");a.addClass("active");this.selected=parseInt(a.getData("n"))};
if(null==e[this.selected])for(d in e)if(!isNaN(d)){this.selected=parseInt(d);break}};inputPhoneMini.prototype.nav=function(a){if(null==a||!1===a.getData("n")||isNaN(a.getData("n"))||"p_nav-mini"!=a.parentNode.id)return!1;for(var b=$$('[data-sublink="phone"] #p_nav-mini > span.active'),c=0;c<b.length;c++)b[c].remClass("active");a.addClass("active");this.selected=parseInt(a.getData("n"))};
inputPhoneMini.prototype.updateNavBar=function(){var a=lsi["export"]("mini-fiches");this.nav_container.innerHTML="";var b=0,c;for(c in a)isNaN(c)||(this.nav_container.innerHTML+='<span data-n="'+c+'">'+ ++b+"</span>");for(c in a)isNaN(c)||(b=$('[data-sublink="phone"] #p_nav-mini [data-n="'+a[c].uid+'"]'),null!=b&&(!0===a[c].valid?b.addClass("done"):b.remClass("done")));this.nav($('[data-sublink="phone"] #p_nav-mini [data-n="'+this.selected+'"]'))};
inputPhoneMini.prototype.check=function(a){return""==a.sexe||"."==a.studies||"."==a.age||""==a.loc||""==a.reltype||"10"==a.reltype&&2>a.reltypeSpecial.length?!1:!0};inputPhoneMini.prototype.attach=function(a){console.log("MINI FICHE: ATTACH");lsi.createDataset("mini-fiches");this.storageToFields();this.handler=a;var b=this;this.nav_container.addEventListener("click",function(a){b.nav(a.target);b.handler(a.target)},!1)};

View File

@ -129,7 +129,7 @@ inputPhoneMini.prototype.add = function(objectData){
// {2} Création physique //
this.container.innerHTML += miniFicheBuilder.build({
this.container.innerHTML += pMiniFicheBuilder.build({
name: readableName(associatedContact.username, associatedContact.firstname, associatedContact.lastname),
countcall: associatedContact.countcall,
countsms: associatedContact.countsms,
@ -298,7 +298,7 @@ inputPhoneMini.prototype.nav = function(element){
if( element == null )
return false;
if( element.getData('n') === false || isNaN(element.getData('n')) || element.parentNode.id != 'nav-mini' )
if( element.getData('n') === false || isNaN(element.getData('n')) || element.parentNode.id != 'p_nav-mini' )
return false;
/* (2) On désactive tous les éléments actifs */

View File

@ -37,7 +37,8 @@
<script type='text/javascript' src='/f/js/notif-min/js/lib' ></script> <!-- Gestion des notifications -->
<!-- Dépendences Spéficiques pré-chargeables -->
<script type='text/javascript' src='/f/js/input-html-data-min/js/includes' ></script> <!-- Gestion du constructeur HTML pour la page d'acquisition -->
<script type='text/javascript' src='/f/js/input-html-phone-data-min/js/includes' ></script> <!-- Gestion du constructeur HTML pour la page d'acquisition -->
<script type='text/javascript' src='/f/js/input-html-facebook-data-min/js/includes' ></script> <!-- Gestion du constructeur HTML pour la page d'acquisition -->
<!-- Librairies Externes Javascript -->
<script type='text/javascript' src='/f/js/sigma-min/sigma' ></script> <!-- Gestion du graphique de type réseau -->

View File

@ -18,18 +18,6 @@
<?php /* [2] ADMIN -> Donnees de Facebook
=========================================================*/
?><section data-sublink='facebook'>
Facebook
</section>
<?php /* [3] ADMIN -> Donnees du Telephone
=========================================================*/
?><section data-sublink='phone'> <!-- IMPORT ou SAISIE -->

View File

@ -14,7 +14,7 @@ var c=$('[data-sublink="phone"] #p_download-target');c.download="local-phone-dat
cDynamicUpdate(!0)})},!1);$('[data-sublink="phone"] #p_submit-all').addEventListener("click",function(a){console.log("> GATHERING ALL DATA");cSubjectManager.fieldsToStorage();cContactManager.fieldsToStorage();cMiniManager.fieldsToStorage();cFicheManager.fieldsToStorage();if(!cSubjectManager.check())return Notification.warning("Attention","Vous devez saisir les informations du <i>sujet</i>"),!1;a=lsi["export"]("mini-fiches");var c=0,b;for(b in a)if(!isNaN(b)&&(c++,!a[b].valid))return Notification.warning("Attention",
"La <i>fiche rapide</i> <b>"+c+"</b> est incompl\u00e8te et/ou incorrecte"),!1;b={path:"input/phone",subject:lsi["export"]("subject")[0],contacts:lsi["export"]("contacts"),mini:lsi["export"]("mini-fiches"),fiches:lsi["export"]("fiches"),matrice:lsi["export"]("matrice")[0]};api.send(b,function(a){console.log(a);if(0!=a.ModuleError)return Notification.error("ERREUR",a.ModuleError),!1;console.log(a)},!1)},!1)})})})})})}var fSubjectManager,fContactManager,fMiniManager,fFicheManager,fMatriceManager;
if(null!=pageManager.vars[0]&&"facebook"==pageManager.vars[0]){var fDynamicUpdate=function(a){var c=a instanceof Element,b=c&&"SPAN"==a.tagName&&"switch-left"==a.className,e=c&&"SPAN"==a.tagName&&"switch-both"==a.className,d=c&&"INPUT"==a.tagName&&"submit"==a.type,f=c&&"SPAN"==a.tagName&&("f_nav-mini"==a.parentNode.id||"f_nav-fiche"==a.parentNode.id),c=c&&"SPAN"==a.tagName&&"f_nav-contact"==a.parentNode.id;if(!(e||b||d||f||c)&&!0!==a)return!1;if(e)console.log("> switch firstname <-> lastname"),b=
a.parentNode,a=b.children[8],b=b.children[10],e=a.value,a.value=b.value,b.value=e;else if(b){console.log("> switch firstname+lastname -> username");b=a.parentNode;e=b.children[6];a=b.children[8];b=b.children[10];if(0<e.value.length||0==a.value.length&&0==b.value.length)return!1;e.value=a.value+" "+b.value;a.value="";b.value=""}else console.log("> dynamic update"),fMiniManager.fieldsToStorage(),fFicheManager.fieldsToStorage(),fContactManager.fieldsToStorage(),fMatriceManager.fieldsToStorage(),fFicheManager.sync(),
a.parentNode,a=b.children[2],b=b.children[3],e=a.value,a.value=b.value,b.value=e;else if(b){console.log("> switch firstname+lastname -> username");b=a.parentNode;e=b.children[1];a=b.children[2];b=b.children[3];if(0<e.value.length||0==a.value.length&&0==b.value.length)return!1;e.value=a.value+" "+b.value;a.value="";b.value=""}else console.log("> dynamic update"),fMiniManager.fieldsToStorage(),fFicheManager.fieldsToStorage(),fContactManager.fieldsToStorage(),fMatriceManager.fieldsToStorage(),fFicheManager.sync(),
fMiniManager.sync(),fMiniManager.storageToFields(),fFicheManager.storageToFields(),fMatriceManager.storageToFields(),(d||c)&&fContactManager.storageToFields()};include("/js/includes/input-facebook-subject.js",function(){include("/js/includes/input-facebook-contact.js",function(){include("/js/includes/input-facebook-mini.js",function(){include("/js/includes/input-facebook-fiche.js",function(){include("/js/includes/input-facebook-matrice.js",function(){fSubjectManager=new inputFacebookSubject($('[data-sublink="facebook"] article.subject-panel [data-name="username"]'),
$('[data-sublink="facebook"] article.subject-panel [data-name="firstname"]'),$('[data-sublink="facebook"] article.subject-panel [data-name="lastname"]'),$('[data-sublink="facebook"] article.subject-panel [data-name="submit"]'));fSubjectManager.attach();fContactManager=new inputFacebookContact($('[data-sublink="facebook"] article.contact-panel'),$('[data-sublink="facebook"] #f_nav-contact'));fContactManager.attach(fDynamicUpdate);fMiniManager=new inputFacebookMini($('[data-sublink="facebook"] article.mini-relation-panel'),
$('[data-sublink="facebook"] #f_nav-mini'));fMiniManager.attach(fDynamicUpdate);fFicheManager=new inputFacebookFiche($('[data-sublink="facebook"] article.relation-panel'),$('[data-sublink="facebook"] #f_nav-fiche'));fFicheManager.attach(fDynamicUpdate);fMatriceManager=new inputFacebookMatrice($('[data-sublink="facebook"] article.matrice-panel'));fMatriceManager.attach(fDynamicUpdate);$('[data-sublink="facebook"] #f_clear-all').addEventListener("click",function(a){lsi.clear("subject");lsi.clear("contacts");

View File

@ -692,8 +692,8 @@ if( pageManager.vars[0] != null && pageManager.vars[0] == 'facebook' ){
var currentForm = target.parentNode;
/* (2) On récupère Nom et Prénom */
var firstname = currentForm.children[8];
var lastname = currentForm.children[10];
var firstname = currentForm.children[2];
var lastname = currentForm.children[3];
/* (3) On échange leurs valeurs */
var tmp = firstname.value;
@ -709,9 +709,9 @@ if( pageManager.vars[0] != null && pageManager.vars[0] == 'facebook' ){
var currentForm = target.parentNode;
/* (2) On récupère Pseudo, Nom et Prénom */
var username = currentForm.children[6];
var firstname = currentForm.children[8];
var lastname = currentForm.children[10];
var username = currentForm.children[1];
var firstname = currentForm.children[2];
var lastname = currentForm.children[3];
/* (3) Vérification de la validité */
// Si pseudo pas vide, ou nom et prenom vide -> on ne fais rien