function cmpSearchController() { // letzte Query this.lastQuery = ""; // Query-Parameter: this.lastQueryText = ""; this.maxHits = 999; this.currentPage = 0; this.hitsPerPage = 20; this.excerptLength = "0"; this.domain = ""; this.lastAnchor = ""; // Query-Text // this.formInit = cmpSearchController_FormInit; // this.formSave = cmpSearchController_FormSave; this.formInitData = cmpSearchController_FormInitData; this.buildQueryAdv = cmpSearchController_BuildQueryAdv; this.buildQueryBoolean = cmpSearchController_BuildQueryBoolean; this.getLastQuery = cmpSearchController_GetLastQuery; this.saveQueryParameters = cmpSearchController_SaveQueryParameters; this.saveQuickSearch = cmpSearchController_SaveQuickSearch; this.buildQueryParameters = cmpSearchController_BuildQueryParameters; // Die Laenge des anzuzeigenden Textauszugs zurueckgeben this.getExtractLength = cmpSearchController_GetExtractLength; this.saveAnchorQuery = cmpSearchController_SetAnchorQuery; this.getAnchorQuery = cmpSearchController_GetAnchorQuery; this.formInitData(); } function cmpSearchController_FormInitData() { // Standard-Werte (wieder-) herstellen this.maxHits = 999; this.currentPage = 0; this.hitsPerPage = 20; this.excerptLength = "0"; this.domain = ""; this.lastAnchor = ""; } function cmpSearchController_BuildQueryAdv(doc) { // Query aus den Formular-Inhalten bauen var ui = doc.ui_form; var query =''; var textparts = new Array(); if(ui.and.value != "") { var query_and = ui.and.value; // Normalisieren => Funktion query_and = query_and.toLowerCase(); query_and = query_and.replace(/[\+\-\:\~\^]+/g, ""); if (query_and.indexOf(" ") >= 0) { query_and = query_and.replace(/ /g, " "); query_and = "(" + query_and.replace(/ /g, " AND ") + ")"; } query = query_and; textparts.push("Alle: " + ui.and.value); } if(ui.or.value != "") { var query_or = ui.or.value; // Normalisieren => Funktion query_or = query_or.toLowerCase(); query_or = query_or.replace(/[\+\-\:\~\^]+/g, ""); if (query_or.indexOf(" ") >= 0) { query_or = query_or.replace(/ /g, " "); query_or = "(" + query_or.replace(/ /g, " OR ") + ")"; } query = query_or; textparts.push("Mindestens eins: " + ui.or.value); } if(ui.phrase.value != "") { var query_phrase = ui.phrase.value; // Normalisieren => Funktion query_phrase = query_phrase.toLowerCase(); query_phrase = query_phrase.replace(/[\+\-\:\~\^]+/g, ""); query_phrase = query_phrase.replace(/^ /, ""); query_phrase = query_phrase.replace(/ /, '%20'); // query = query + "\""+ query_phrase + "\"" ; query = query + "%22"+ query_phrase + "%22" ; textparts.push("Genaue Wortfolge: " + ui.phrase.value); } if(ui.not.value != "") { var query_not = ui.not.value; // Normalisieren => Funktion query_not = query_not.toLowerCase(); query_not = query_not.replace(/[\+\-\:\~\^]+/g, ""); query_not = query_not.replace(/^ /, ""); if (query_not.indexOf(" ") >= 0) { query_not = query_not.replace(/ /g, " "); query_not = "(" + query_not.replace(/ /g, " AND NOT ") + ")"; } query_not = " AND NOT " + query_not; query = query + query_not; textparts.push("Keines von: " + ui.not.value); } this.lastQuery = query; this.lastQueryText = textparts.join(", "); return query; } function cmpSearchController_BuildQueryBoolean(doc) { // Komfortsuche, 2 Eingabefelder (Volltext, Titel) // - mindestens eines der Felder mu� einen Text enthalten // - in keinem der Texte darf ein Suchwort mit "*" beginnen var form = doc.input_form; var volltext = new st_textField(form.volltextq, "Textsuche", null); // var titel = new st_textField(form.titelq, "Titelsuche", "Titel"); // if ((volltext.value+titel.value).length == 0) { if (volltext.value.length == 0) { alert("Bitte geben Sie einen Suchbegriff an."); form.volltextq.focus(); return ""; } // if (!(volltext.validate() && titel.validate() )) { if (!(volltext.validate())) { return ""; } var fieldNames = st_checkBoxValueList(form, "gr"); var parts = new Array(); var partTexts = new Array(); var sPart; sPart = volltext.toQueryWithExtraFields(true, "", fieldNames) if (sPart.length > 0) {parts.push("(" + sPart + ")");partTexts.push(volltext.toQueryText());} // sPart = titel.toQueryWithExtraFields(true, "", fieldNames) // if (sPart.length > 0) {parts.push("(" + sPart + ")");partTexts.push(titel.toQueryText());} var sQuery = parts.join(" AND "); sQuery = sQuery.replace(/\"/, "%22"); //?? this.lastQuery = sQuery; this.lastQueryText = partTexts.join(", "); return sQuery; } function cmpSearchController_GetLastQuery(nMode) { if (nMode == 0) { return this.lastQuery;} if (nMode == 1) { return this.lastQueryText;} if (nMode == 2) { return encodeUml(this.lastQuery); } if (nMode == 3) { return encodeUml(this.lastQueryText); } } function cmpSearchController_SaveQueryParameters(cur, cnt, el, d, mh) { this.currentPage = cur; this.hitsPerPage = cnt; this.excerptLength = el; this.domain = d; if (this.domain == null) {this.domain = "";} this.maxHits = mh; if (this.maxHits == null) {this.maxHits = "999";} } function cmpSearchController_SaveQuickSearch(q, qt) { this.formInitData(); this.type1 = 0; this.qry1 = q; this.lastQuery = q; this.lastQueryText = qt; } function cmpSearchController_BuildQueryParameters() { var params = ""; if (this.lastQuery != "") { params = "&q=" + encodeUml(this.lastQuery) + "&qt=" + encodeUml(this.lastQueryText) + "&cur=" + this.currentPage + "&el=" + this.excerptLength + "&d=" + this.domain + "&mh=" + this.maxHits; } return params; } function cmpSearchController_GetExtractLength() { return this.excerptLength; } function encodeUml(s) { s = s.replace(/[äÄ]{1}/g, "xyayx"); s = s.replace(/[öÖ]{1}/g, "xyoyx"); s = s.replace(/[üÜ]{1}/g, "xyuyx"); s = s.replace(/[ß]{1}/g, "xysyx"); return s; } function cmpSearchController_FormInit(doc, form) { // gespeicherte Werte auf Formular anwenden } function cmpSearchController_FormSave(form) { // aktuelle Werte aus User-Interface-Formular sichern } function cmpSearchController_SetAnchorQuery(sAnchor) { this.lastAnchor = sAnchor; } function cmpSearchController_GetAnchorQuery(nMode) { if (nMode == 1) {return this.lastAnchor;} else if (nMode == 2) {return st_encodeForAnchor(this.lastAnchor);} return ""; } // Hilfsfunktionen f�r Queries //äÄ öÖ üÜ ß //� � � � � � � // Liste der Suchterme als Array // 'test "y" "kein Sonderfall" kann wald "" "einzeln" "Gesetz""Bund"' // => test, "Y", "kein Sonderfall", kann, wald, "einzeln" "Gesetz", "Bund" // bAllowOperators: "(" und ")" als Operatoren separat stellen function st_buildTermList(s, bAllowOperators) { var list = new Array(); var inQuote = false; var current = ""; for (var i = 0; i < s.length; i++) { var c = s.charAt(i); if (c == " ") { if (inQuote) { current += c; } else { pushCurr(); } } else if (c == '"') { if (inQuote) { pushCurr(); inQuote = false; } else { pushCurr(); inQuote = true; } } else if (c == '(' || c == ')') { if (bAllowOperators && !inQuote) { pushCurr(); current=c;pushCurr(); } } else { current += c; } } pushCurr(); return list; function pushCurr() { while(current.charAt(0) == " ") {current = current.substr(1);} while(current.charAt(current.length-1) == " ") {current = current.substr(0, current.length-1);} if (current.length > 0) { if (inQuote) {current = '"' + current + '"';} list.push(current); } current = ''; } } // value aller Checkboxen mit sName abfragen, liefert ein Array function st_checkBoxValueList(form, sName) { var controls = form.elements[sName]; var checkedList = new Array(); for (var i = 0; i < controls.length; i++) { var control = controls[i]; if (control.checked) {checkedList.push(control.value);} } return checkedList; } // Suche nach Anker: %codierten Ankername aufbauen function st_encodeForAnchor(sName) { var sAnchor = encodeURI(sName); sAnchor = sAnchor.replace(/!/g,"%21").replace(/\*/,"%2A").replace(/\'/,"%27"); sAnchor = sAnchor.replace(/\(/g,"%28").replace(/\)/,"%29").replace(/;/,"%3B"); sAnchor = sAnchor.replace(/\:/g,"%3A").replace(/@/,"%40").replace(/&/,"%26"); sAnchor = sAnchor.replace(/=/g,"%3D").replace(/\+/,"%2B").replace(/\$/,"%24"); sAnchor = sAnchor.replace(/,/g,"%2C").replace(/\//,"%2F").replace(/\?/,"%3F"); sAnchor = sAnchor.replace(/#/g,"%23"); return sAnchor; } function st_textField(control, controlName, indexField) { this.control = control; this.controlName = controlName; this.indexField = indexField; this.value = ""; this.read = st_textField_Read; this.validate = st_textField_Validate; this.toQuery = st_textField_toQuery; this.toQueryWithExtraFields = st_textField_toQueryWithExtraFields; this.toQueryText = st_textField_toQueryText; this.read(); } function st_textField_Read() { var query = this.control.value; if (query.replace(/ /g,"").length == 0) {query = '';} this.value = query; return this.value; } function st_textField_Validate() { if (this.value.length == 0) {return true;} var parts = this.value.replace(/\"/, " ").split(" "); for (var i = 0; i < parts.length; i++) { if (parts[i].charAt(0) == "*") { this.control.focus(); alert('Der Suchbegriff im Feld"' + this.controlName + '" enthält mindestens ein Suchwort, das mit "*" beginnt. Diese Suche ist nicht zulässig.'); return false; } } return true; } // Query bauen // bOnlyTerms: true => nur die Terme verkn�pfen, fieldName ignorieren; false: Feldquery // bAllowOperators: true => Operatoren AND,OR,NOT,"(",")" erlauben, sOperator wird ignoriert // false => Operatoren rausfischen, alles mit sOperator verkn�pfen function st_textField_toQuery(bOnlyTerms, bAllowOperators, sOperator) { var rawTerms = st_buildTermList(this.value, bAllowOperators); if (rawTerms.length == 0) {return "";} var sQuery = ''; if (bAllowOperators) { sQuery = rawTerms.join(' '); } else { var terms = new Array(); for (var i = 0; i < rawTerms.length; i++) { var part = rawTerms[i]; if (part != "AND" && part != "OR" && part != "NOT") { terms.push(part); } } if (terms.length == 0) {return "";} sQuery = terms.join(" " + sOperator + " "); } if (!bOnlyTerms) { if (this.indexField == null || this.indexField.length == 0) { sQuery = "(" + sQuery + ")"; } else { sQuery = this.indexField+":(" + sQuery + ")"; } } return sQuery; } function st_textField_toQueryWithExtraFields(bAllowOperators, sOperator, fields) { if (fields == null || fields.length == 0) {return this.toQuery(false, bAllowOperators, sOperator);} var sBaseQuery = this.toQuery(true, bAllowOperators, sOperator); if (sBaseQuery.length == 0) {return "";} var sQuery; // Inhalt mu� im Basisfeld und in einem der Felder aus fields enthalten sein var fieldParts = new Array(); for (var i = 0; i < fields.length; i++) { var qp = fields[i]+":(" + sBaseQuery + ")"; fieldParts.push(qp); } var sFieldQuery = "(" + fieldParts.join(" OR ") + ")"; sQuery = this.toQuery(false, bAllowOperators, sOperator) + " AND " + sFieldQuery; return sQuery; } function st_textField_toQueryText() { if (this.value.length == 0) {return "";} return this.controlName + ":'" + this.value + "'"; }