<%@language = "javascript" %>
<% /*
    $Revision$ $Id$

    File:           fac_edit_xsl_save.asp
    Description:    Opslaan na bewerken van een xsl
    Parameters:
        xmlnode     "reservering" o.i.d.
        xmltekst    de nieuwe tekst
        preview     Geen (fout)melding als probleemloos opgeslagen
        promote     Maak de concept versie definitief.
        revert      Draai alle wijzigingen terug (effectief: verwijder reservering_concept.xsl)
    Context:
    Note:           PRSSYS nodig
                    We slaan altijd op onder <xmlnode>_concept.

 */

var JSON_Result = true;
%>
<!-- #include file="../Shared/common.inc" -->
<!-- #include file="../Shared/xml_converter.inc" -->
<%

var autfunction = "WEB_PRSSYS"; // TODO: Misschien een aparte? Of WEB_LCLSYS?
var authparams = user.checkAutorisation(autfunction);

protectRequest.validateToken();
var xmlnode = getFParam("xmlnode");
var xmltekst = getFParam("xsldata");

var preview = getQParamInt("preview", 0) == 1;
var promote = getQParamInt("promote", 0) == 1;
var revert = getQParamInt("revert", 0) == 1;

if (xmlnode == customerId && user.has("WEB_FACTAB"))
{
    // ok
}
else
{
    var sql = "SELECT 1"
            + "  FROM fac_srtnotificatie"
            + " WHERE fac_srtnotificatie_xmlnode = " + safe.quoted_sql(xmlnode);
    var oRs = Oracle.Execute(sql);
    user.auth_required_or_abort(!oRs.Eof); // hij moet bestaan als srtnotificatie
    oRs.Close()
}

var conceptName = Server.MapPath(custpath + "\\xsl\\" + xmlnode + "_concept.xsl");
var actualName = Server.MapPath(custpath + "\\xsl\\" + xmlnode + ".xsl");
var fso = new ActiveXObject("Scripting.FileSystemObject");

if (revert)
{
    result = { success: true, message: "Done!" };
    try
    {
        fso.deleteFile(conceptName);
    }
    catch (e)
    {
        result = { success: false, message: e.description };
    }

    Response.Write(JSON.stringify(result));
    Response.End;
}

result = { success: true, message: preview?"":"Ok!" };
// Load the XML
var source = Server.CreateObject("MSXML2.DOMDocument.6.0");
source.async = false;
if( ! source.loadXML(xmltekst) )
{
    result = { success: false,
               message: "XML Error:\n" + source.parseError.reason +"\nLine "+source.parseError.line+" char "+source.parseError.linepos
             }
}

if (result.success)
{
    // Veiligheids controle. Als er een upgrade (door SGF) is geweest van de xsl
    // willen we voorkomen dat iemand een ouder concept promoveert waarmee de update
    // ongedaan zou zijn geworden.
    if (fso.FileExists(conceptName) && fso.GetFile(conceptName).DateLastModified < fso.GetFile(actualName).DateLastModified )
    {
        result = { success: false,
                   message: "Concept bestand is *ouder* dan actuele bestand.\nOpslaan niet mogelijk."
                 }
    }

    source.setProperty ("SelectionNamespaces", "xmlns:msxml='urn:schemas-microsoft-com:xslt'");
    if (source.selectNodes("//msxml:script").length)
    {
        result = { success: false,
                   message: "Script tag is niet toegestaan"
                 }
    }
}
if (result.success)
{
    var stage;
    try
    {
        var stage = "SaveToFile " + conceptName;
        var streamResult = new ActiveXObject("ADODB.Stream")
        streamResult.Type = 2; // Text
        streamResult.Open();
        //streamResult.CharSet = "Windows-1252";
        streamResult.CharSet = "utf-8"
        streamResult.WriteText(xmltekst);
        streamResult.SaveToFile(safe.UNC(conceptName), 2); // 2=overwrite
        streamResult.Close();

        // We zijn erg pessimisisch. Bij promoveren bewaren we een volledige historie
        // van vorige versies. Let wel: de gebruiker weet dat niet en kan ze ook
        // niet zelf terughalen. Dat moet SGF doen (net als af en toe opruimen)
        if (promote)
        {
            var jsDate = new Date;
            var backupTime = String(jsDate.getFullYear()) + padout(jsDate.getMonth() + 1) + padout(jsDate.getDate()) + "_"
                           + padout(jsDate.getHours()) + padout(jsDate.getMinutes())+ padout(jsDate.getSeconds());
            var backupName = Server.MapPath(custpath + "\\xsl\\" + xmlnode + "_" + backupTime + ".xsl");
            __DoLog("backupName: " + backupName);
            var stage = "MoveFile {0} --> {1}".format(actualName, backupName);
            fso.MoveFile(actualName, backupName);
            var stage = "MoveFile {0} --> {1}".format(conceptName, actualName);
            fso.MoveFile(conceptName, actualName);
            result.message = L("lcl_xsl_doorvoeren_done").format(xmlnode);
        }
    }
    catch (e)
    {
        __DoLog("{0} mislukt:\n{1}".format(stage, e.description), "#f00");
        result = { success: false, message: e.description };
    }

}

Response.Write(JSON.stringify(result));

ASPPAGE_END(); %>
