// ******************************************
// * $Id$
// *
// *   submitDOMXSLSOAP()
// *
// * Verstuur gegevens via HTTP naar een asp-bestand
// * die de gegevens verder kan verwerken en een resultaat terug geeft.
// * Dit resultaat wordt hier nog weer gecontroleerd.
// *
// ******************************************
function submitDOMXSLSOAP( p_connect
                         , p_textstream
                         , p_xsldoc
                         , p_bedrijfadres
                         )
{
    Log2File(2, "*> submitSOAP");
    // De p_xsldoc Style moet het template SOAPEnvelope definieren!
    var XMLenvelope   = new ActiveXObject("Msxml2.DOMDocument.6.0");
    var XMLpayloadDoc = new ActiveXObject("Msxml2.DOMDocument.6.0");
    var XMLresult     = new ActiveXObject("Msxml2.DOMDocument.6.0");
    var XMLhttp       = new ActiveXObject("Msxml2.ServerXMLHTTP.6.0");
    var Base64        = new Base64Cls();
    // contanten in msxml2
    var SXH_PROXY_SET_PROXY = 2;
    var SXH_OPTION_SELECT_CLIENT_SSL_CERT = 3;
    //
    // Omvat onze payload met de SOAPEnvelope uit de p_xsldoc stylesheet
    // p_bedrijfadres.ordermode
    //              bit 0 [0=xml, 1 soap]
    //              bit 1 [alleen voor mail attachment encryptie]
    //              bit 2 [0=2*base64 encoding, 1=plain]
    //              bit 3 [0=xml tag encoding, 1=plain]
    //
    var XMLpayloadNode = XMLenvelope.createElement("SOAPEnvelope");

    if (p_bedrijfadres.ordermode & 4)
    {
        if (p_bedrijfadres.ordermode & 8)
        {
            XMLpayloadDoc.load(p_textstream);
            TestAndRaiseAnXMLError("Error loading XMLpayloadDoc", XMLpayloadDoc);
            Log2File(3, "XMLpayloadDoc.documentElement = " + XMLpayloadDoc.documentElement.xml);
            XMLpayloadNode.appendChild(XMLpayloadDoc.documentElement);
        }
        else
        {
            XMLpayloadNode.text = stream2text(p_textstream);
        }
    }
    else
    {
        XMLpayloadNode.text = Base64.encode(Base64.encode(stream2text(p_textstream)));
    }

    XMLenvelope.appendChild(XMLpayloadNode);
    Log2File(3, "Envelope = " + XMLenvelope.xml);
    XMLenvelope.transformNodeToObject(p_xsldoc, XMLresult);
    Log2File(2, "SOAP request = " + XMLresult.xml);

    //
    // Verstuur de SOAP aanvraag
    if (S("puo_useproxy"))
    {
        var proxy_ip = S("puo_proxyserveripaddress");
        Log2File(1, "Opening proxy " + proxy_ip);
        XMLhttp.setProxy(SXH_PROXY_SET_PROXY, proxy_ip);
    }

    var endpoint = p_connect.CurrentAddress;
    if (p_bedrijfadres.certificateName != "")
    {
        Log2File(1, "Client certificateName= " + p_bedrijfadres.certificateName);
        XMLhttp.setOption(SXH_OPTION_SELECT_CLIENT_SSL_CERT, p_bedrijfadres.certificateName);
    }
    XMLhttp.open("POST", endpoint, false, p_bedrijfadres.username, p_bedrijfadres.password); // async=false dus synchroon
    Log2File(2, "connect.CurrentAddress: " + endpoint);

    // De volgende regels zijn alleen nodig als het certificaat (nog) niet vertrouwd wordt.
    // Op te lossen door cacert.der van csnet te installeren
    //    secu = XMLhttp.getOption(SXH_OPTION_IGNORE_SERVER_SSL_CERT_ERROR_FLAGS)
    //    secu = secu Or SXH_SERVER_CERT_IGNORE_UNKNOWN_CA
    //    Call XMLhttp.setOption(SXH_OPTION_IGNORE_SERVER_SSL_CERT_ERROR_FLAGS, secu)
    XMLhttp.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
    XMLhttp.send(XMLresult.xml);
    // UWVA#19897: we rekenen de hele 2xx maar goed
    Log2File(1, "XMLhttp.status: " + XMLhttp.status);
    if (XMLhttp.status < 200 || XMLhttp.status > 299)
    {
        Log2File(2, "SOAP response = " + XMLhttp.responseText); // Level 2 omdat het soms dagen doorloopt en te groot is
        Log2File(2, "response Status = " + XMLhttp.status + ": " + XMLhttp.statusText);
        Log2File(3, "response Headers = " + XMLhttp.getAllResponseHeaders);
        RaiseAnError(XMLhttp.status, "XMLhttp error " + XMLhttp.status + ": (" + XMLhttp.statusText + ")");
    }
    else
    {
        Log2File(3, "SOAP response = " + XMLhttp.responseText);
    }

    //
    // Open de envelope
    XMLenvelope.loadXML(XMLhttp.responseText);
    TestAndRaiseAnXMLError("Error loading SOAP response as XML", XMLenvelope);
    XMLenvelope.transformNodeToObject(p_xsldoc, XMLresult);
    Log2File(3, "Response payload = " + XMLresult.xml);
    TestAndRaiseAnXMLError("Error finding xml tag in SOAP response", XMLresult);

    if (p_bedrijfadres.ordermode & 4)
    {
        SOAPresult = XMLresult.xml;
    }
    else
    {
        SOAPresult = Base64.decode(Base64.decode(XMLresult.text));
    }
    Log2File(2, "*< submitSOAP");

    return SOAPresult;
}
