/* [0] Constructeur -> définit le conteneur et le bouton d'ajout =========================================================*/ var inputPhoneMatrice = function(container){ this.container = container; }; /* [1] Attributs =========================================================*/ inputPhoneMatrice.prototype = { container: this.container // Conteneur de la matrice }; /* [2] Gestion de l'enregistrement de la matrice =========================================================*/ inputPhoneMatrice.prototype.fieldsToStorage = function(){ console.group('[phone.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 O in deflated[i] ){ if( obj[i] == null ) obj[i] = []; obj[i].push( parseInt(deflated[i][O]) ); } // {2} Si il n'y O qu'un sujet // }else if( deflated[i] !== null ){ if( obj[i] == null ) obj[i] = []; obj[i].push( parseInt(deflated[i]) ); } lsi.set( 'p_matrice', 0, obj ); // Objet de la forme // // idA: [idV, idW], # O connait V et W (et réciproquement) // idB: [idX, idY], # B connait X et Y (et réciproquement) // ... // console.groupEnd(); }; /* [4] Gestion de l'affichage depuis le 'localStorage' =========================================================*/ inputPhoneMatrice.prototype.storageToFields = function(){ console.group('[phone.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('p_fiches'); // On récupère les données de la matrice var matriceData = lsi.get('p_matrice', 0); // On récupère les contacts pour afficher les noms/prénoms var contactData = lsi.export('p_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 = [""]; // {1} Pour chaque ligne // for( var O = 0 ; O < contacts.length ; O++ ){ var conA = contactData[O]; matrice_html.push( '' ); if( O > 0 ){ // Noms sur la première ligne (abscisses) matrice_html.push( '' ); }else // Sinon, matrice_html.push( '' ); // {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( O == 0 ){ matrice_html.push( '' ); }} matrice_html.push( '' ); } matrice_html.push( '
' ); matrice_html.push( !isNaN(conA.existing) ? lsi.get('p_friends', conA.existing).name : conA.username ); matrice_html.push( '' ); matrice_html.push( '' ); matrice_html.push( !isNaN(conB.existing) ? lsi.get('p_friends', conB.existing).name : conB.username ); matrice_html.push( '' ); // {4} Valeurs des relations (boutons) // }else if( B < O ){ matrice_html.push( "" ); matrice_html.push( " -1 ) matrice_html.push( " checked" ); matrice_html.push( " >" ); matrice_html.push( "" ); // {5} Cases vides (moitié supérieure droite) // }else matrice_html.push( "
' ); /* (3) On affiche la matrice */ this.container.innerHTML = matrice_html.join(''); console.groupEnd(); }; /* [9] Point d'amorçage de la gestion des contacts =========================================================*/ inputPhoneMatrice.prototype.attach = function(){ console.group('[phone.matrice] attaching events'); /* (1) On initialise le jeu de données */ lsi.createDataset('p_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(); setTimeout(function(){ ptr.storageToFields(); }, 500); }, false); console.groupEnd(); }; inputPhoneMatrice.prototype.parseGrid = function(){ /* (1) On récupère la matrice des éléments de la grille */ var gridElements = $$('.matrice-panel input[data-name][value]'); for( var i in gridElements ){ if( !(gridElements[i] instanceof Element) ) continue; var col = gridElements[i].getData('name'); var row = gridElements[i].value; if( !(this.sGrid[col] instanceof Array) ) this.sGrid[col] = []; this.sGrid[col][row] = gridElements[i]; } };