/* [0] Constructeur -> définit le conteneur et le bouton d'ajout =========================================================*/ function inputPhoneFiche(container, navContainer){ this.container = container; this.nav_container = navContainer; } /* [1] Attributs =========================================================*/ inputPhoneFiche.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: [ {status:true}, {status:false}], age: '.', job: '.', famsit: [ {status:true}, {status:false}, {status:false} ], // Choix 1 à 3 studies: '.', reltype: [ {status:true}, {status:false}, {status:false}, {status:false}, {status:false}, {status:false}, {status:false}, {status:false}, {status:false}], // Choix 1 à 9 reltypeSpecial: '', city: '', loc: [ {status:true}, {status:false}, {status:false}, {status:false} ], duration: ['', ''], context: [ {status:true}, {status:false}, {status:false}, {status:false}, {status:false}, {status:false}, {status:false}, {status:false}, {status:false}, {status:false}, {status:false}, {status:false}, {status:false}, {status:false}], // Choix 1 à 14 contextSpecial: ['', '', ''], freq: [ [ {status:true}, {status:false}, {status:false}, {status:false} ], [ {status:true}, {status:false}, {status:false}, {status:false} ], [ {status:true}, {status:false}, {status:false}, {status:false} ], [ {status:true}, {status:false}, {status:false}, {status:false} ], [ {status:true}, {status:false}, {status:false}, {status:false} ]], connect: [ [ {status:false}, {status:true} ], [ {status:false}, {status:true} ], [ {status:false}, {status:true} ], [ {status:false}, {status:true} ], [ {status:false}, {status:true} ], [ {status:false}, {status:true} ]], connectSpecial: ['', ''], timestamp: 0, valid: false } }; /* [2] Gestion de l'enregistrement des formulaires fiche fiches relation =========================================================*/ inputPhoneFiche.prototype.fieldsToStorage = function(){ console.log('FICHE: FIELDS TO STORAGE'); // {1} Pour chaque formulaire de contact présent // var existingFiches = $$('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.value); // 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; console.warn('> FICHE UPDATE'); var obj = { contact: deflated.contact.value, uid: deflated.uid.value, sexe: deflated.sexe, // Choix 1 à 2 age: deflated.age.value, job: deflated.job.value, famsit: deflated.famsit, // Choix 1 à 3 studies: deflated.studies.value, reltype: deflated.reltype, // Choix 1 à 9 reltypeSpecial: deflated.reltypeSpecial.value, city: deflated.city.value, loc: deflated.loc, // Choix 1 à 3 duration: [ deflated.duration[0].value, // Durée de la relation en mois deflated.duration[1].value // Durée de la relation en années ], context: deflated.context, // Choix 1 à 14 contextSpecial: [ deflated.contextSpecial[0].value, // Valeur du contexte si context[11] deflated.contextSpecial[1].value, // Valeur du contexte si context[12] deflated.contextSpecial[2].value // Valeur du contexte si context[13] ], freq: [ deflated.freq0, // Choix 1 à 4 deflated.freq1, // Choix 1 à 4 deflated.freq2, // Choix 1 à 4 deflated.freq3, // Choix 1 à 4 deflated.freq4 // Choix 1 à 4 ], connect: [ deflated.connect0, // Choix 1 à 2 deflated.connect1, // Choix 1 à 2 deflated.connect2, // Choix 1 à 2 deflated.connect3, // Choix 1 à 2 deflated.connect4, // Choix 1 à 2 deflated.connect5 // Choix 1 à 2 ], connectSpecial: [ deflated.connectSpecial[0].value, deflated.connectSpecial[1].value ], 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); 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 Objet contenant les informations nécessaires à l'affichage * */ inputPhoneFiche.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 || objectData.contact == null ) return false; /* (0) Gestion du formattage des valeur */ // {1} Champs de texte // objectData.city = (objectData.city != null) ? objectData.city : this.defaultData.city; 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 // // 1. La ville a au moins 2 caractères if( ficheData.city.length < 2 ) return false; // 2. 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; // 3. 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; // 4. 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 pour la profession n'est pas indéfini if( ficheData.job == '.' ) return false; // 6. Le radio // // 7. L'AGE a un et un seul choix if( !checkRadioValue(ficheData.age) ) return false; // 8. Le SEXE a un et un seul choix if( !checkRadioValue(ficheData.sexe) ) return false; // 9. La SITUATION FAMILIALE a un et un seul choix if( !checkRadioValue(ficheData.famsit) ) return false; // 10. Le TYPE DE RELATION a un et un seul choix if( !checkRadioValue(ficheData.reltype) ) return false; // 11. La DISTANCE DE DOMICILE (location) a un et un seul choix if( !checkRadioValue(ficheData.loc) ) return false; // 12. Le CONTEXTE DE RENCONTRE a un et un seul choix if( !checkRadioValue(ficheData.context) ) return false; // 13. Les FRÉQUENCES ont un et un seul choix (par question de fréquence) for( var i = 0 ; i < ficheData.freq.length ; i++ ) if( !checkRadioValue( ficheData.freq[i] ) ) return false; // 14. Les CONNECTION ont un et un seul choix (par question de connection) for( var i = 0 ; i < ficheData.connect.length ; i++ ) if( !checkRadioValue( ficheData.connect[i] ) ) return false; // {4} dépendant d'un choix d'un radio // // 15. TYPE DE RELATION si autre est coché (indice 8), reltypeSpecial doit avoir au moins 2 caractère if( ficheData.reltype[8].status && ficheData.reltypeSpecial.length < 2 ) return false; // 16. CONTEXTE DE RELATION si est coché indice 11, contactSpecial[0] doit avoir au moins 2 caractères if( ficheData.context[11].status && ficheData.contextSpecial[0].length < 2 ) return false; // 17. CONTEXTE DE RELATION si est coché indice 12, contextSpecial[1] doit avoir au moins 2 caractères if( ficheData.context[12].status && ficheData.contextSpecial[1].length < 2 ) return false; // 18. CONTEXTE DE RELATION si est coché indice 13, contextSpecial[2] doit avoir au moins 2 caractères if( ficheData.context[13].status && ficheData.contextSpecial[2].length < 2 ) return false; // 19. Si tout s'est bien passé, on retourne TRUE return true; }; /* [9] Point d'amorçage de la gestion des contacts =========================================================*/ inputPhoneFiche.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); };