/* [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 firstname: '', lastname: '', username: '', 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: ['', ''] } }; /* [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(); console.log(deflated); // {4} On récupère les données du LSI si elles existent // var existingData = lsi.get('fiches', 'form'+deflated.uid.value); // Si n'existe pas, on initialise if( existingData === false ){ existingData.username = 'inconnu'; existingData.firstname = 'inconnu'; existingData.lastname = 'inconnu'; } // {5} On récupère et met en forme les valeurs du deflater // var obj = { uid: deflated.uid.value, firstname: existingData.firstname, lastname: existingData.lastname, username: existingData.username, 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 ] }; // {6} On enregistre les données dans le 'localStorage' // lsi.set('fiches', 'form'+obj.uid, obj); } // {7} On met à jour le rendu // // this.storageToFields(); }; /* [3] Gestion de l'ajout physique d'un nouveau contact =========================================================*/ /* * * @objectData Objet contenant les informations nécessaires à l'affichage * */ inputPhoneFiche.prototype.add = function(objectData){ console.log('FICHE: ADD'); // Si pas d'UID, on retourne une erreur if( objectData.uid == null ) return false; /* (0) Gestion du formattage des valeur */ // {1} Champs de texte // objectData.firstname = (objectData.firstname != null) ? objectData.firstname : this.defaultData.firstname; objectData.lastname = (objectData.lastname != null) ? objectData.lastname : this.defaultData.lastname; objectData.username = (objectData.username != null) ? objectData.username : this.defaultData.username; objectData.age = (objectData.age != null) ? objectData.age : this.defaultData.age; 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. L'age est un nombre validForm = validForm && !isNaN(parseInt(ficheData.age)); // 2. La ville a au moins 2 caractères validForm = validForm && ficheData.city.length >= 2; // 3. La durée de la relation en mois est vide ou un nombre validForm = validForm && (!isNaN(parseInt(ficheData.duration[0])) || ficheData.duration[0].length == ''); // 4. La durée de la relation en année est vide ou un nombre validForm = validForm && (!isNaN(parseInt(ficheData.duration[1])) || ficheData.duration[1].length == ''); // 5. Pour la durée de la relation, au moins un des 2 n'est pas vide validForm = validForm && ficheData.duration[0].length+ficheData.duration[1].length > 0; // {2} Vérification des pour la profession n'est pas indéfini validForm = validForm && ficheData.job != '.'; // 7. Le radio // // 8. Le SEXE a un et un seul choix validForm = validForm && checkRadioValue(ficheData.sexe); // 9. La SITUATION FAMILIALE a un et un seul choix validForm = validForm && checkRadioValue(ficheData.famsit); // 10. Le TYPE DE RELATION a un et un seul choix validForm = validForm && checkRadioValue(ficheData.reltype); // 11. La DISTANCE DE DOMICILE (location) a un et un seul choix validForm = validForm && checkRadioValue(ficheData.loc); // 12. Le CONTEXTE DE RENCONTRE a un et un seul choix validForm = validForm && checkRadioValue(ficheData.context); // 13. Les FRÉQUENCES ont un et un seul choix (par question de fréquence) for( var i = 0 ; i < ficheData.freq.length ; i++ ) validForm = validForm && checkRadioValue( ficheData.freq[i] ); // 14. Les CONNECTION ont un et un seul choix (par question de connection) for( var i = 0 ; i < ficheData.connect.length ; i++ ) validForm = validForm && checkRadioValue( ficheData.connect[i] ); // {4} dépendant d'un choix d'un radio // // 15. TYPE DE RELATION si autre est coché (indice 8) validForm = validForm && (!ficheData.reltype[8].status || ficheData.reltype[8].status && ficheData.reltypeSpecial.length >= 2); // 16. CONTEXTE DE RELATION si est coché indice 11 validForm = validForm && (!ficheData.context[11].status || ficheData.context[11].status && ficheData.contextSpecial[0].length >= 2); // 17. CONTEXTE DE RELATION si est coché indice 12 validForm = validForm && (!ficheData.context[12].status || ficheData.context[12].status && ficheData.contextSpecial[1].length >= 2); // 18. CONTEXTE DE RELATION si est coché indice 13 validForm = validForm && (!ficheData.context[13].status || ficheData.context[13].status && ficheData.contextSpecial[2].length >= 2); /* (3) Si le formulaire est valide, on le met en valeur dans la barre de navigation (pages) */ if( validForm ) this.nav_container.children[ficheData.uid].addClass('done'); else // sinon, on lui enlève la classe s'il l'a this.nav_container.children[ficheData.uid].remClass('done'); } }; /* [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(); }, false); };