/** * Created by Roland on 2021/07/01. */ // SUBJECTS // Show blank screen to add new Subject function newSubjectShow() { var b = document.getElementById("newSubjectSave"); b.style.display='inline'; var c = document.getElementById("newSubjectDismiss"); c.style.display='inline'; document.getElementById("SubjectModifySave").style.display = 'none' document.getElementById("new_term").disabled = false; document.getElementById("new_type").disabled = false; document.getElementById("new_detailtype").disabled = false; document.getElementById("new_classification").disabled = false; document.getElementById("new_scopenote").disabled = false; // Relationen-Bereich verstecken bei neuem Schlagwort document.getElementById("new_relation_label").style.display = 'none'; document.getElementById("newRelationSubjectDismiss").style.display = 'none'; // Synonyme-Bereich verstecken bei neuem Schlagwort var synSection = document.getElementById("synonyms_section"); if (synSection) { synSection.style.display = 'none'; var tbody = document.getElementById("synonyms_body"); if (tbody) tbody.innerHTML = ''; } showRelations(0,0,0); var a = document.getElementById("relation_table"); if (a != undefined) { document.getElementById("relation_table").style.display = 'none'; } var e = document.getElementById("errorNewSubject"); e.style.display = 'none'; $("#new_term").val(""); $("#new_classification").val(""); $("#new_scopenote").val(""); $("#NewSubjectModal").modal("show"); } // Insert new subject record function CreateNewEntry(type) { // get values var term = $("#new_term").val(); term = term.trim(); var type = $("#new_type").val(); type = type.trim(); var detailtype = $("#new_detailtype").val(); detailtype = detailtype.trim(); var classification = $("#new_classification").val(); classification = classification.trim(); var scopenote = $("#new_scopenote").val(); scopenote = scopenote.trim(); if (term.length == 0) { var a = document.getElementById("errorNewSubject"); a.classList.add('alert-danger'); a.textContent = 'Bitte Schlagwort eingeben!'; a.style.display = 'block'; return; } var a = document.getElementById("errorNewSubject"); a.classList.remove('alert-danger'); a.textContent = ''; a.style.display = 'none'; $.post("ajax/newSubject.php", { term : term, type : type, detailtype : detailtype, classification: classification, scopenote : scopenote }, function (data, status) { var dt = (typeof data === 'string') ? JSON.parse(data) : data; var e = document.getElementById("errorNewSubject"); if (dt['status'] == 200) { var AnchorID = dt["Anchor"]; var EntryID = dt["Entry"]; var LinkingID = dt["Linking"]; // alert ("ANCHOR: " +AnchorID); var b = document.getElementById("newSubjectSave"); b.style.display='none'; var c = document.getElementById("newSubjectDismiss"); c.style.display='none'; document.getElementById("new_term").disabled = true; document.getElementById("new_type").disabled = true; document.getElementById("new_detailtype").disabled = true; document.getElementById("new_classification").disabled = true; document.getElementById("new_scopenote").disabled = true; $table.bootstrapTable('refresh'); e.classList.remove('alert-danger'); e.classList.add('alert-success'); e.textContent = 'Neues Schlagwort aufgenommen'; e.style.display = 'block'; // ID setzen für Relationen $('#ID').val(AnchorID); // Relationen-Bereich anzeigen nach Speichern document.getElementById("new_relation_label").style.display = 'block'; document.getElementById("newRelationSubjectDismiss").style.display = 'inline'; showRelations(AnchorID,EntryID,LinkingID); } else { e.classList.remove('alert-success'); e.classList.add('alert-danger'); e.textContent = dt['message']; e.style.display = 'block'; return; } }); } // Show relations of a subect record function showRelations(Anchor,Entry,Linking) { // alert ("showRelations AnchorID : " + Anchor); $.get("ajax/getRelations.php", { anchorID:Anchor, authType: "Subject" }, function (data, status) { if (status=="success") { $(".new_modal_content").html(data); // Tabelle nur anzeigen wenn Relationen vorhanden var relationTable = document.getElementById("relation_table"); if (relationTable) { if (data && data.trim().length > 0) { relationTable.style.display = 'block'; } else { relationTable.style.display = 'none'; } } $("#NewSubjectModal").modal("show"); } } ); } // create new relation for a subject record function CreateNewRelation(AnchorID, relationID, event) { if (event) { event.preventDefault(); event.stopPropagation(); } console.log('🚀 CreateNewRelation:', { AnchorID, relationID }); try { // Validierung if (!AnchorID || !relationID) { showError('Fehlende Parameter: AnchorID oder relationID'); return false; } var relationTypeElement = document.getElementById("new_relationtype"); if (!relationTypeElement) { showError('Relationstyp-Element nicht gefunden'); return false; } var relationType = relationTypeElement.value; if (!relationType || relationType.trim() === '') { showError('Bitte wählen Sie einen Relationstyp aus'); return false; } // Loading anzeigen showLoading(); $.ajax({ url: "ajax/writeNewRelation.php", type: "POST", data: { AnchorID: AnchorID, relationType: relationType, relationID: relationID }, dataType: "text", timeout: 10000, success: function(response) { console.log("✅ Success! Response:", response); try { var data = JSON.parse(response); if (data.error) { showError('Serverfehler:
' + data.error); return; } if (data.success === true) { showSuccess('Neue Relation erfolgreich aufgenommen!'); // Relations neu laden nach kurzer Verzögerung if (typeof showRelations === 'function') { setTimeout(function() { showRelations(AnchorID, 0, 0); }, 500); } resetForm(); } else { showError('Unerwartete Antwort vom Server'); } } catch (parseError) { console.log("⚠️ Keine JSON-Antwort, prüfe Plain-Text"); // Fallback für alte API (nur ID zurück) if (response && response.length > 0 && !isNaN(response.trim())) { showSuccess('Neue Relation erfolgreich aufgenommen! (ID: ' + response.trim() + ')'); if (typeof showRelations === 'function') { setTimeout(function() { showRelations(AnchorID, 0, 0); }, 500); } resetForm(); } else { showError('Unerwartete Antwort:
' + '' + response.substring(0, 200) + ''); } } }, error: function(xhr, status, error) { console.error("❌ AJAX Error:", { status, error, xhr }); var errorMessage = 'Fehler beim Speichern der Relation

'; if (xhr.status === 0) { errorMessage += '❌ Keine Verbindung zum Server möglich
'; errorMessage += 'Prüfen Sie Ihre Internetverbindung'; } else if (xhr.status === 404) { errorMessage += '❌ Datei nicht gefunden (404)
'; errorMessage += 'ajax/writeNewRelation.php existiert nicht'; } else if (xhr.status === 500) { errorMessage += '❌ Interner Serverfehler (500)
'; if (xhr.responseText) { errorMessage += '
Details anzeigen
' +
                                      xhr.responseText.substring(0, 500) + '
'; } } else if (status === 'timeout') { errorMessage += '❌ Zeitüberschreitung
'; errorMessage += 'Der Server hat nicht rechtzeitig geantwortet'; } else if (status === 'parsererror') { errorMessage += '❌ Fehler beim Verarbeiten der Server-Antwort
'; errorMessage += 'Die Server-Antwort war ungültig'; } else { errorMessage += '❌ ' + status + ' (' + xhr.status + ')'; if (error) { errorMessage += '
' + error + ''; } } showError(errorMessage); }, complete: function(xhr, status) { console.log("🏁 Request abgeschlossen:", status); // Loading nur ausblenden wenn kein Erfolg (Success zeigt eigene Meldung) if (status !== 'success') { hideLoading(); } } }); return false; } catch (e) { hideLoading(); console.error("💥 Exception:", e); showError('JavaScript-Fehler:
' + e.message); return false; } } // Neue Funktion für Synonyme function CreateNewSynonym(text1, text2, anchorID, event) { if (event) { event.preventDefault(); event.stopPropagation(); } console.log('🔗 CreateNewSynonym:', { text1, text2 }); try { // Validierung if (!text1 || !text2) { showError('Fehlende Parameter: text1 oder text2'); return false; } if (text1.trim() === text2.trim()) { showError('Ein Begriff kann nicht sein eigenes Synonym sein'); return false; } // Loading anzeigen showLoading(); $.ajax({ url: "/Thesaurus/ajax/saveSynonym.php", type: "POST", data: { text1: text1, text2: text2, action: 'add' }, dataType: "json", timeout: 10000, success: function(response) { console.log("✅ Synonym Success! Response:", response); if (response.error) { showError('Fehler:
' + response.error); return; } if (response.success === true) { showSuccess('Synonym erfolgreich hinzugefügt!'); // Synonyme neu laden var termText = $('#new_term').val(); if (termText) { loadSynonyms(termText); } // Relations neu laden nach kurzer Verzögerung if (typeof showRelations === 'function' && anchorID) { setTimeout(function() { showRelations(anchorID, 0, 0); }, 500); } resetForm(); } else { showError('Unerwartete Antwort vom Server'); } }, error: function(xhr, status, error) { console.error("❌ AJAX Error:", { status, error, xhr }); var errorMessage = 'Fehler beim Speichern des Synonyms

'; if (xhr.status === 0) { errorMessage += '❌ Keine Verbindung zum Server möglich'; } else if (xhr.status === 404) { errorMessage += '❌ Datei nicht gefunden (404)
'; errorMessage += 'ajax/saveSynonym.php existiert nicht'; } else if (xhr.status === 500) { errorMessage += '❌ Interner Serverfehler (500)'; } else { errorMessage += '❌ ' + status + ' (' + xhr.status + ')'; } showError(errorMessage); }, complete: function() { hideLoading(); } }); return false; } catch (e) { hideLoading(); console.error("💥 Exception:", e); showError('JavaScript-Fehler:
' + e.message); return false; } } // Synonyme für einen Begriff laden function loadSynonyms(text) { if (!text) return; console.log('📋 Lade Synonyme für:', text); $.ajax({ url: "/Thesaurus/ajax/getSynonyms.php", type: "GET", data: { text: text }, dataType: "json", success: function(response) { console.log('✅ Synonyme geladen:', response); var section = document.getElementById('synonyms_section'); var tbody = document.getElementById('synonyms_body'); var noSyn = document.getElementById('no_synonyms'); if (response.success && response.count > 0) { // Synonyme vorhanden - Bereich anzeigen if (section) section.style.display = 'block'; if (tbody) tbody.innerHTML = response.html; if (noSyn) noSyn.style.display = 'none'; } else { // Keine Synonyme - Bereich komplett ausblenden if (section) section.style.display = 'none'; if (tbody) tbody.innerHTML = ''; } }, error: function(xhr, status, error) { console.error('❌ Fehler beim Laden der Synonyme:', error); } }); } // Synonym löschen function DeleteSynonym(text1, text2) { if (!confirm('Möchten Sie das Synonym "' + text2 + '" wirklich entfernen?')) { return; } console.log('🗑️ Lösche Synonym:', { text1, text2 }); $.ajax({ url: "/Thesaurus/ajax/saveSynonym.php", type: "POST", data: { text1: text1, text2: text2, action: 'remove' }, dataType: "json", success: function(response) { console.log('✅ Synonym gelöscht:', response); if (response.success) { showSuccess('Synonym entfernt!'); // Synonyme neu laden loadSynonyms(text1); } else { showError(response.error || 'Fehler beim Löschen'); } }, error: function(xhr, status, error) { console.error('❌ Fehler beim Löschen:', error); showError('Fehler beim Löschen des Synonyms'); } }); } function showError(message) { var errorElement = document.getElementById("errorNewSubject"); if (errorElement) { errorElement.className = 'alert alert-danger'; errorElement.innerHTML = '' + message.replace(/\n/g, '
'); errorElement.style.display = 'block'; // Scroll zum Alert errorElement.scrollIntoView({ behavior: 'smooth', block: 'nearest' }); // Optional: Auto-Hide nach 8 Sekunden setTimeout(function() { fadeOutAlert(); }, 8000); } } function showSuccess(message) { var errorElement = document.getElementById("errorNewSubject"); if (errorElement) { errorElement.className = 'alert alert-success'; errorElement.innerHTML = '' + message; errorElement.style.display = 'block'; // Scroll zum Alert errorElement.scrollIntoView({ behavior: 'smooth', block: 'nearest' }); // Auto-Hide nach 3 Sekunden setTimeout(function() { fadeOutAlert(); }, 3000); } } function showWarning(message) { var errorElement = document.getElementById("errorNewSubject"); if (errorElement) { errorElement.className = 'alert alert-warning'; errorElement.innerHTML = '' + message; errorElement.style.display = 'block'; // Scroll zum Alert errorElement.scrollIntoView({ behavior: 'smooth', block: 'nearest' }); // Auto-Hide nach 5 Sekunden setTimeout(function() { fadeOutAlert(); }, 5000); } } function showLoading() { var errorElement = document.getElementById("errorNewSubject"); if (errorElement) { errorElement.className = 'alert alert-info'; errorElement.innerHTML = '
Laden...
Speichere Relation...
'; errorElement.style.display = 'block'; // Scroll zum Alert errorElement.scrollIntoView({ behavior: 'smooth', block: 'nearest' }); } } function hideLoading() { var errorElement = document.getElementById("errorNewSubject"); if (errorElement) { errorElement.style.display = 'none'; } } function hideAlert() { var errorElement = document.getElementById("errorNewSubject"); if (errorElement) { errorElement.style.display = 'none'; } } function fadeOutAlert() { var errorElement = document.getElementById("errorNewSubject"); if (errorElement && errorElement.style.display !== 'none') { $(errorElement).fadeOut(500, function() { errorElement.style.display = 'none'; }); } } function resetForm() { var relationTextElement = document.getElementById("search_relation"); if (relationTextElement) { relationTextElement.value = ''; } // Data-Attribute zurücksetzen $('#subject-anlegen').removeData('record-id'); $('#subject-anlegen').removeData('record-text'); $('#subject-anlegen').removeData('relation-id'); $('#subject-anlegen').removeData('relation-text'); hideAlert(); } // Delete relation for a subjects function DeleteRelation(AnchorID, LinkingID) { if (!confirm('Möchten Sie diese Relation wirklich löschen?')) { return; } $.post("ajax/deleteRelation.php", { AnchorID : AnchorID, LinkingID : LinkingID }, function (data, status) { if (status=="success") { var e = document.getElementById("errorNewSubject"); e.classList.add('alert-success'); e.textContent = ' Relation gelöscht'; e.style.display = 'block'; showRelations(AnchorID,0,0) } } ); } // delete the whole subject entry function DeleteTerm(AnchorID) { if (!confirm('Möchten Sie diesen Eintrag wirklich löschen?')) { return; } $.post("ajax/deleteTerm.php", { AnchorID: AnchorID[0] }, function (data, status) { var metadata = (typeof data === 'string') ? JSON.parse(data) : data; if (status === "success" && metadata.success === true) { // Tabelle neu laden – Zeile ist serverseitig wirklich gelöscht $table.bootstrapTable('refresh'); } else { // Serverseitiger Fehler: Zeile wieder einblenden und Meldung anzeigen $table.bootstrapTable('refresh'); alert('Fehler beim Löschen: ' + (metadata.error || 'Unbekannter Fehler')); } } ); } // Modify subject and its relations function ModifyTerm(AnchorID) { // Schlagwort-Feld deaktivieren (darf nicht geändert werden) document.getElementById("new_term").disabled = true; // Andere Felder aktivieren document.getElementById("new_type").disabled = false; document.getElementById("new_detailtype").disabled = false; document.getElementById("new_classification").disabled = false; document.getElementById("new_scopenote").disabled = false; $("#ID").val(AnchorID[0]); // Relationen-Bereich sofort sichtbar machen bei Bearbeitung! document.getElementById("new_relation_label").style.display = 'block'; document.getElementById("relation_table").style.display = 'block'; // Synonyme-Bereich sichtbar machen var synSection = document.getElementById("synonyms_section"); if (synSection) synSection.style.display = 'block'; // Buttons konfigurieren document.getElementById("newSubjectSave").style.display = 'none'; document.getElementById("newSubjectDismiss").style.display = 'inline'; document.getElementById("SubjectModifySave").style.display = 'inline'; document.getElementById("newRelationSubjectDismiss").style.display = 'none'; // Alert verstecken document.getElementById("errorNewSubject").style.display = 'none'; $("#NewSubjectModalHeadline").text("Schlagwort ändern"); $.get("/Thesaurus/ajax/getAuthorityDataRaw.php", { id : AnchorID[0] }, function (data, status) { console.log('📥 getAuthorityDataRaw status:', status); console.log('📥 getAuthorityDataRaw data:', data); if (status == "success") { var metadata = (typeof data === 'string') ? JSON.parse(data) : data; console.log('📥 metadata:', metadata); dt = (metadata['rows'][0]); console.log('📥 dt:', dt); if (dt) { $("#new_term").val(dt.Text); $("#new_id").val(dt.ID); $("#new_detailtype").val(dt.DetailType); $("#new_classification").val(dt.Classification); $("#new_descriptor").val(dt.Descriptor); $("#new_type").val(dt.Type); $("#new_scopenote").val(dt.Scopenote); console.log('✅ Felder befüllt mit:', dt.Text); // Synonyme laden if (typeof loadSynonyms === 'function') { loadSynonyms(dt.Text); } } else { console.error('❌ Keine Daten in rows[0]'); } } } ).fail(function(xhr, status, error) { console.error('❌ AJAX Fehler:', status, error); }); $.get("ajax/getRelations.php", { anchorID:AnchorID[0], authType: "Subject" }, function (data, status) { if (status=="success") { $(".new_modal_content").html(data); $("#NewSubjectModal").modal("show"); // Autocomplete neu initialisieren nach Modal-Öffnung setTimeout(function() { if (typeof searchRelation === 'function') { console.log('🔄 Autocomplete wird neu initialisiert...'); searchRelation(); } }, 300); } } ); } // rewrite records after updating a subject entry function UpdateEntry(authType) { var AnchorID = $("#ID").val(); var term = $("#new_term").val(); term = term.trim(); var type = $("#new_type").val(); type = type.trim(); var detailtype = $("#new_detailtype").val(); detailtype = detailtype.trim(); var classification = $("#new_classification").val(); classification = classification.trim(); var scopenote = $("#new_scopenote").val(); scopenote = scopenote.trim(); if (term.length == 0) { var a = document.getElementById("errorNewSubject"); a.classList.add('alert-danger'); a.textContent = 'Bitte Schlagwort eingeben!'; a.style.display = 'block'; return; } var a = document.getElementById("errorNewSubject"); a.classList.remove('alert-danger'); a.textContent = ''; a.style.display = 'none'; $.post("ajax/UpdateTerm.php", { AnchorID: AnchorID, authType: authType, term: term, type: type, detailtype: detailtype, classification: classification, scopenote: scopenote }, function (data, status) { if (status=="success") { document.getElementById("relation_table").style.display = 'block' document.getElementById("newSubjectSave").style.display = 'none' document.getElementById("newSubjectDismiss").style.display = 'inline' document.getElementById("SubjectModifySave").style.display = 'none' document.getElementById("newRelationSubjectDismiss").style.display = 'none' var e = document.getElementById("errorNewSubject"); e.classList.add('alert-success'); e.textContent = ' Schlagwort geändert '; e.style.display = 'block'; $("#NewSubjectModalHeadline").text("Schlagwort ändern"); $("#NewSubjectModal").modal("show"); } } ); $table.bootstrapTable('refresh') } function ShowModalDetails(id) { $.get("/Thesaurus/ajax/getDetailAuthorityData.php", { authType : 'Subject', offset : 0, id : id, sort : 'Anchor.Text', limit : 1 }, function(data, status) { if (status == "success") { var metadata = (typeof data === 'string') ? JSON.parse(data) : data; var row = metadata['rows']; if (!row || row.length === 0) { console.error('❌ Keine Daten gefunden für ID:', id); return; } //Assign existing values to the modal popup fields $("#display_term").val(row[0].Text); $("#display_id").val(row[0].ID); $("#display_id_show").val(row[0].ID); $("#display_detailtype").val(row[0].Detailtype); $("#display_classification").val(row[0].Classification); $("#display_descriptor").val(row[0].Descriptor); $("#display_type").val(row[0].Type); $("#display_scopenote").val(row[0].Scopenote); $("#display_synonyms").val(row[0].Synonyms || ''); // Alte tabellarische Darstellung (versteckt) var html = [] var txt = '' $.each(row[0].Relations, function (key, value) { txt = txt +'
'; txt = txt +'
'; txt = txt + '
'; txt = txt + '
'; txt = txt + '
'; txt = txt +'
'; }) $(".modal_content").html(txt); $.each(row[0].Relations, function (key, value) { $("#display_relationtype_" +key).val(value['Relationtype']); $("#display_textrelation_" +key).val(value['TextRelation']); $("#display_IDRelation_" +key).val(value['IDRelation']); }) $("#display_relations").val(txt); // Modal anzeigen $("#DetailsModal").modal("show"); // Semantisches Netz erstellen (nach Modal sichtbar) setTimeout(function() { if (typeof createSemanticNetwork === 'function') { var synonyms = row[0].Synonyms || ''; // Falls keine Synonyme im Response, versuche sie separat zu laden if (!synonyms || synonyms.trim() === '') { console.log('📝 Keine Synonyme im Response, lade separat...'); $.ajax({ url: "/Thesaurus/ajax/getSynonyms.php", type: "GET", data: { text: row[0].Text }, dataType: "json", async: false, // Synchron um auf Ergebnis zu warten success: function(synResponse) { if (synResponse.success && synResponse.synonyms && synResponse.synonyms.length > 0) { synonyms = synResponse.synonyms.map(function(s) { return s.text; }).join(', '); console.log('✅ Synonyme separat geladen:', synonyms); // Auch das Textfeld aktualisieren $("#display_synonyms").val(synonyms); } } }); } createSemanticNetwork(row[0].Text, row[0].ID, row[0].Relations, synonyms); } else { console.warn('⚠️ createSemanticNetwork Funktion nicht gefunden'); } }, 300); } } ); } function CopyLink(value) { var tempInput = document.createElement("input"); tempInput.value = value; document.body.appendChild(tempInput); tempInput.select(); document.execCommand("copy"); document.body.removeChild(tempInput); } function refreshPage() { location.reload(); }