function qp_search_buildRuwQuery(composite, isExpert) {
    // logical mode
    var mode = document.s.radio_search_modes[0].checked ? document.s.radio_search_modes[0].value : document.s.radio_search_modes[1].value;
    // user input
    var userinput = mode + "#|@";
    // output query
    var searchquery = "";

    if (document.s.querystring_1.value.lastIndexOf("Suchbegriff", 0) !== 0) {
        userinput += document.s.querystring_1.value;
        searchquery = composite + ":string(\"" + cleanQueryString(document.s.querystring_1.value) + "\",mode=\"" + mode + "\")";
    }

    if (!isExpert) {
        // get fields
        var fieldmap = {
            'title': document.s.title.value,
            'authornorm': document.s.author.value,
            'refno': document.s.refno.value,
            'courtnorm': document.s.court.value,
            'year': document.s.year.value,
            'page': document.s.page.value
        };

        // check for date filter
        var date_from = document.s.date_from.value;
        var date_to = document.s.date_to.value;

        if (date_from != "" || date_to != "") {
            if (searchquery != "") {
                searchquery += " and ";
            }
            searchquery += "filter(docdatetime:range(";
            if (date_from != "" && date_to != "") {
                searchquery += convertDate4Fast(date_from) + "T00:00:00Z," + convertDate4Fast(date_to) + "T23:59:59Z";
            } else if (date_from != "") {
                searchquery += convertDate4Fast(date_from) + "T00:00:00Z,max";
            } else {
                searchquery += "min," + convertDate4Fast(date_to) + "T23:59:59Z";
            }
            searchquery += "))"
        }

        // build query
        var hascontent = false;
        for (var k in fieldmap) {
            if (fieldmap[k] != "") {
                hascontent = true;
                break;
            }
        }

        if (hascontent) {
            userinput += "@|@";
            if (searchquery != "") {
                searchquery += " and ";
            }
            var index = 0;
            for (var key in fieldmap) {
                if (fieldmap[key] != "") {
                    if (index > 0) {
                        userinput += "@|@";
                        searchquery += " and ";
                    }
                    userinput += key + ":|:" + fieldmap[key];
                    searchquery += "filter(" + key + ":string(\"" + cleanQueryString(fieldmap[key]) + "\",mode=\"" + mode + "\"))";
                    index++;
                }
            }
        }

        if (date_from != "" || date_to != "") {
            if (date_from != "") {
                userinput += "@|@date_from:|:" + date_from;
            }
            if (date_to != "") {
                userinput += "@|@date_to:|:" + date_to;
            }
        }
    }

    document.s.userInput.value = userinput;
    document.s.querystring.value = searchquery;
    return true;
}


function qp_search_readRuwUserInput() {

    var elements = document.s.userInput.value.split("#|@");

    // set logical mode
    document.s.radio_search_modes[1].checked = elements[0] == "or";

    if (elements.length > 1) {
        elements = elements[1].split("@|@");
        document.s.querystring_1.value = elements.shift();

        if (elements.length > 0) {
            // get fields
            var fieldmap = {
                'title': document.s.title,
                'authornorm': document.s.author,
                'refno': document.s.refno,
                'courtnorm': document.s.court,
                'year': document.s.year,
                'page': document.s.page,
                'date_from': document.s.date_from,
                'date_to': document.s.date_to
            };

            for (var i = 0; i < elements.length; i++) {
                fieldmap[elements[i].split(":|:")[0]].value = elements[i].split(":|:")[1];
            }
        }
    }
}

function convertDate4Fast(date) {
    var nd = "";
    nd += date.substring(6, 10); // year
    nd += "-";
    nd += date.substring(3, 5); // month
    nd += "-";
    nd += date.substring(0, 2); // day
    return nd;
}

function cleanQueryString(query) {
    query = query.replace(/"/g, "");
    query = query.replace(/\\/g, "\\\\");
    query = query.replace(/'/g, "\\'");
    query = query.replace(/\?/g, "");
    query = query.replace(/\*/g, "");
    return query;
}
