// Make sure that photo_mem titles displays right version let version = '1.6.1'; version_spans = document.getElementsByClassName('version'); title = document.getElementsByTagName('title')[0]; title.innerHTML = title.innerHTML.replace('1.0.0', version) for (span of version_spans) { span.innerHTML = version } // Photo_mem script: var personnes = [], nom = [], nomjf = [], prenom = [], posx = [], posy = [], etx = [], ety = [], can_etiq = []; var ibac = 0, tit = {}, titre = ""; var image = document.getElementById('ima_fond'); var cercle = document.getElementById("cirsvg"); var menu = document.getElementById("menu_modif"); var cant = document.createElement("canvas"); document.body.appendChild(cant); function lecfic(fichier) { i_xml = 0; if (fichier.length == 2) { for (var i = 0; i < fichier.length; i++) { var ext = fichier[i].name.split('.').pop(); if (ext == "xml") { i_xml = i }; }; } else { alert("Choisissez deux fichiers : un .xml et un fichier image"); return; } i_img = ((i_xml - 1) < 0 ? 1 : 0); var fichier_xml = fichier[i_xml]; fond = fichier[i_img]; var src = fichier[i_img].name.substring(0, fichier[i_img].name.indexOf(".")); enreg_xml = src + ".xml" enreg_noms = src + "_noms.png" var reader = new FileReader(); reader.onload = function(evt) { lecture(evt.target.result); }; reader.readAsText(fichier_xml); function lecture(text) { var parser = new DOMParser(); data_xml = parser.parseFromString(text, "text/xml"); affiche_fond(); lecture_xml(); }; } function lecture_xml() { personnes = data_xml.documentElement.getElementsByTagName("personne"); tit = data_xml.documentElement.getElementsByTagName("titre")[0]; titre = tit.textContent nb_pers = personnes.length for (var i = 0; i < nb_pers; i++) { nom[i] = personnes[i].getElementsByTagName("nom")[0].textContent; if (personnes[i].getElementsByTagName("nom_jeune_fille")[0]) { nomjf[i] = personnes[i].getElementsByTagName("nom_jeune_fille")[0].textContent }; prenom[i] = personnes[i].getElementsByTagName("prenom")[0].textContent; posx[i] = parseFloat(personnes[i].getElementsByTagName("position")[0].attributes['posx'].value); posy[i] = parseFloat(personnes[i].getElementsByTagName("position")[0].attributes['posy'].value); etx[i] = parseFloat(personnes[i].getElementsByTagName("position")[0].attributes['etx'].value); ety[i] = parseFloat(personnes[i].getElementsByTagName("position")[0].attributes['ety'].value); } if (titre !== '') { affiche_titre() } else { affiche_etiquette() }; }; // Chargement et dessin de l'image background function affiche_fond() { var read_fond = new FileReader(); read_fond.addEventListener("load", function(evt) { image.src = evt.target.result; }, false); read_fond.readAsDataURL(fond); } function affiche_titre() { cant.className = "tit"; cant.height = 23; var taille = titre.length; cant.width = taille * 12; tx = parseFloat(tit.attributes['titx'].value); ty = parseFloat(tit.attributes['tity'].value); cant.style.left = tx + "px"; cant.style.top = ty + "px"; titre_ctx = cant.getContext("2d"); titre_ctx.font = '21px Arial'; titre_ctx.fillStyle = 'Maroon'; titre_ctx.fillText(titre, 20, 18); affiche_etiquette(); } function affiche_etiquette() { // affichage du texte nom/prénom dans des canvas etiquette rayon = 28 for (var i = 0; i < nb_pers; i++) { var id = "can" + i; if (document.getElementById(id)) continue; var canv = document.createElement("canvas"); canv.id = id; document.body.appendChild(canv); can_etiq[i] = document.getElementById(canv.id); can_etiq[i].className = "etiq"; can_etiq[i].height = 30; etiq_ctx = can_etiq[i].getContext("2d"); var taille = Math.max(nom[i].length, prenom[i].length, nomjf[i].length + 5); can_etiq[i].width = taille * 7 + 10 if (nomjf[i].length > 1) { can_etiq[i].height = 45 }; etiq_ctx.font = '13px Arial'; etiq_ctx.fillStyle = 'chocolate'; can_etiq[i].style.left = etx[i] + "px"; can_etiq[i].style.top = ety[i] + "px"; etiq_ctx.fillText(nom[i], 7, 12); etiq_ctx.fillText(prenom[i], 7, 25); if (nomjf[i].length > 1) { etiq_ctx.fillText("née : " + nomjf[i], 7, 38) }; }; gestion_souris(); // enregistre la position de l'étiquette }; function gestion_souris() { if (titre !== '') { // pour déplacer le titre cant.addEventListener("mousedown", function(e) { this.addEventListener("mousemove", deplace_etiquette); }); cant.addEventListener("mouseup", function(e) { this.removeEventListener("mousemove", deplace_etiquette); }); } for (var i = 0; i < nb_pers; i++) { // pour déplacer les étiquettes nom,prénom ... can_etiq[i].addEventListener("mousedown", function(e) { this.addEventListener("mousemove", deplace_etiquette); }); can_etiq[i].addEventListener("mouseup", function(e) { this.removeEventListener("mousemove", deplace_etiquette); }); }; ima_fond.addEventListener('mousedown', afficher_formulaire); // pour afficher le formulaire de saisie personne ima_fond.addEventListener('mousemove', tracer_cercle); // pour afficher cercle personne cercle.addEventListener('contextmenu', function(e) { menu_modif(e); e.preventDefault(); }, false); // menu modif personne }; function deplace_etiquette(e) { e.target.style.top = e.pageY - 15 + "px"; e.target.style.left = e.pageX - 30 + "px"; }; function menu_modif() { menu.style.left = parseFloat(cercle.getAttribute("cx")) + 10 + "px"; menu.style.top = parseFloat(cercle.getAttribute("cy")) + 40 + "px"; menu.style.visibility = "visible"; } function supprimer_personne() { misajour_xml(); x = data_xml.getElementsByTagName("personne")[ibac]; x.parentNode.removeChild(x); for (var i = 0; i < nb_pers; i++) { x = can_etiq[i]; x.parentNode.removeChild(x); }; cercle.style.visibility = "hidden"; lecture_xml(); } function position_souris(canvas, evt) { var rect = canvas.getBoundingClientRect(); return { x: evt.clientX - rect.left, y: evt.clientY - rect.top }; }; function tracer_cercle(e) { document.getElementsByTagName("svg")[0].setAttribute('height', image.naturalHeight); document.getElementsByTagName("svg")[0].setAttribute('width', image.naturalWidth); var pos_x = position_souris(ima_fond, e).x; var pos_y = position_souris(ima_fond, e).y; for (var i = 0; i < nb_pers; i++) { var dx = posx[i] - pos_x; var dy = posy[i] - pos_y; var dist2 = dx * dx + dy * dy; var rayon2 = rayon * rayon; if (dist2 < rayon2) { ibac = i bac = can_etiq[i].style.backgroundColor; can_etiq[i].style.background = "palegreen" cercle.setAttribute("cx", posx[i]); cercle.setAttribute("cy", posy[i]); cercle.setAttribute("r", rayon); cercle.style.visibility = "visible"; // grossir ou diminuer la taille du cercle // cercle.addEventListener("wheel", function(e) { // rayon=rayon + (e.deltaY>0 ? -1 : +1); // cercle.setAttribute("r",rayon ); // } , false); return } }; cercle.style.visibility = "hidden"; can_etiq[ibac].style.backgroundColor = "oldlace"; }; function afficher_formulaire(e) { souris_x = position_souris(ima_fond, e).x; souris_y = position_souris(ima_fond, e).y; if (souris_y - document.getElementById('ajout').height < 0) sourisy = 50; document.getElementById('ajout').style.top = souris_y + 40 + "px"; document.getElementById('ajout').style.left = souris_x - 80 + "px"; setTimeout(function() { document.getElementById("nom").focus(); }, 10); document.getElementById('ajout').className = 'visible'; }; function ajouter_personne_xml() { // création d'un nouvel élément dans data_xml var nomform = document.getElementById("nom").value var nomjfform = document.getElementById("nom_jeune_fille").value var prenomform = document.getElementById("prenom").value var surnomform = "" var anneeform = document.getElementById("annee").value var noteform = document.getElementById("note").value document.getElementById('ajout').className = 'invisible'; console.log(nomform + " " + prenomform + " " + anneeform) var personne_ = data_xml.createElement("personne"); var nom_ = data_xml.createElement("nom"); nom_.appendChild(data_xml.createTextNode(nomform)); var nom_jf_ = data_xml.createElement("nom_jeune_fille"); nom_jf_.appendChild(data_xml.createTextNode(nomjfform)); var prenom_ = data_xml.createElement("prenom"); prenom_.appendChild(data_xml.createTextNode(prenomform)); var surnom_ = data_xml.createElement("surnom"); surnom_.appendChild(data_xml.createTextNode(surnomform)); var annee_ = data_xml.createElement("annee_naiss"); annee_.appendChild(data_xml.createTextNode(anneeform)); var note_ = data_xml.createElement("note"); note_.appendChild(data_xml.createTextNode(noteform)); var position_ = data_xml.createElement("position"); position_.setAttribute("posx", souris_x); position_.setAttribute("posy", souris_y); position_.setAttribute("etx", souris_x - 30); position_.setAttribute("ety", souris_y + 60); personne_.appendChild(nom_); personne_.appendChild(nom_jf_); personne_.appendChild(prenom_); personne_.appendChild(surnom_); personne_.appendChild(annee_); personne_.appendChild(note_); personne_.appendChild(position_); data_xml.getElementsByTagName("photo")[0].appendChild(personne_) lecture_xml(); }; function misajour_xml() { tit.setAttribute("titx", cant.style.left); tit.setAttribute("tity", cant.style.top); for (var i = 0; i < nb_pers; i++) { position = data_xml.getElementsByTagName("position")[i]; position.setAttribute("etx", can_etiq[i].style.left); position.setAttribute("ety", can_etiq[i].style.top); }; lecture_xml(); }; function enregistrer_fichier(fichier) { misajour_xml() var texte_xml = (new XMLSerializer()).serializeToString(data_xml) var reg = /(>)\s*(<)(\/*)/g; // règle pour enlever id="etiqnn" dans les versions précédentes du fichier xml var rex = //g; texte_xml = texte_xml.replace(rex, ''); texte_xml = texte_xml.replace(/\r|\n/g, ''); texte_xml = texte_xml.replace(reg, '$1\r\n$2$3'); var blob = new Blob([texte_xml], { type: "text/plain;charset=utf-8" }); if (navigator.msSaveBlob) { navigator.msSaveBlob(blob, fichier); } else { var a = document.createElement('a'); if (a.download === ''); a.setAttribute('download', fichier); a.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(texte_xml)); a.style.display = 'none'; document.body.appendChild(a); a.click(); document.body.removeChild(a); } } function image_finale() { misajour_xml() var decalx = 5; var decaly = 29; var can_imf = document.createElement("canvas"); document.body.appendChild(can_imf); imf_ctx = can_imf.getContext("2d"); can_imf.width = ima_fond.width; can_imf.height = ima_fond.height; imf_ctx.drawImage(ima_fond, 0, 0) if (titre !== '') { var taille = titre.length; hauteur = 25 roundedRect(imf_ctx, tx - decalx, ty - decaly, taille * 11, hauteur, 5, 'lightyellow', 'yellow'); imf_ctx.drawImage(cant, tx - decalx, ty - decaly) }; for (var i = 0; i < nb_pers; i++) { var taille = Math.max(nom[i].length, prenom[i].length, nomjf[i].length + 5); hauteur = 30 if (nomjf[i].length > 1) { hauteur = 45 }; roundedRect(imf_ctx, etx[i] - decalx, ety[i] - decaly, taille * 7 + 10, hauteur, 15, 'oldlace', 'blue'); imf_ctx.drawImage(can_etiq[i], etx[i] - decalx, ety[i] - decaly) } var a = document.createElement('a'); if (a.download === ''); a.setAttribute('download', enreg_noms); a.setAttribute('href', can_imf.toDataURL("image/png").replace("image/png", "image/octet-stream")); a.style.display = 'none'; document.body.appendChild(a); a.click(); document.body.removeChild(a); document.body.removeChild(can_imf); function roundedRect(ctx, x, y, width, height, radius, couleur_fond, couleur_trait) { ctx.beginPath(); ctx.strokeStyle = couleur_trait; ctx.moveTo(x, y + radius); ctx.lineTo(x, y + height - radius); ctx.quadraticCurveTo(x, y + height, x + radius, y + height); ctx.lineTo(x + width - radius, y + height); ctx.quadraticCurveTo(x + width, y + height, x + width, y + height - radius); ctx.lineTo(x + width, y + radius); ctx.quadraticCurveTo(x + width, y, x + width - radius, y); ctx.lineTo(x + radius, y); ctx.quadraticCurveTo(x, y, x, y + radius); ctx.closePath(); ctx.fillStyle = couleur_fond; ctx.fill(); ctx.stroke(); } }