<% /*
    $Revision$
    $Id$

    File:           model_custom_fields.inc

    Description:    Flexkenmerken model
    Parameters:
    Context:

    Notes:
*/

%>
<!-- #include file="../Shared/kenmerk_common.inc" -->
<!-- #include file="../Shared/resultset_flex.inc"-->
<%

function model_custom_fields(formodel, flexModule, flexParams)
{
    flexParams = flexParams || {};
    this.module =       flexModule;
    this.table =        "flex";
    this.primary =      "kenmerk_key";
    this.records_name = "custom_fields";
    this.record_name =  "custom_field";
//    this.records_title = L("lcl_orders");
//    this.record_title =  L("lcl_opdr_info");

    // getSqlFlex heeft bij multi-language 'user' al nodig voor de lcl's
    // daarom hieronder een indirecte/ delayed fntablesql
    this.fntablesql = function _fntablesql()
        {
            var theSqlFlex = getSqlFlex(flexModule, formodel.primary, flexParams);
            return "(" + theSqlFlex + ") flex";
        }

    this.fields =
             { "id":            { dbs: "kenmerk_key",   typ: "key" }, // TODO: dit klopt niet helemaal. De echte unieke waarde is bez_kenmerkwaarde_key
               "value":         { dbs: "waarde",        typ: "varchar" },
               "type":          { dbs: "kenmerktype",   typ: "varchar" },
               "sequence":      { dbs: "volgnummer",    typ: "number" },
               "label":         { dbs: "omschrijving",  typ: "varchar" },
               "flexparentkey": { dbs: "flexparentkey", typ: "key" },
               // TODO: record.flexparentid wordt er uitgestript vanwege niet teruglinken naar de parent
               //       we hebben hem echter wel nodig. Dit moet beter....
               "xflexparentkey": { dbs: "xflexparentkey", typ: "key", sql: "flexparentkey" }
             };
    // Deze functie wordt na de GET aangeroepen. De bijlagen zijn zo afwijkend
    // dat ik dat niet fatsoenlijk in 'fields' verwerkt kreeg
    this.post_get = function (record)
        {
            if (record.type == 'F' || record.type == 'M')
            {
                var flexparam = flexProps(flexModule, record.xflexparentkey, String(record.id), flexParams.pNiveau,
                                                { getFiles: true, api2name: formodel.records_name });
                record.attachments = [];
                for (var f in flexparam.files)
                {
                    var file = flexparam.files[f];
                    record.attachments.push({ name: file.name,
                                              date: file.date,
                                              size: file.size,
                                              content_url: file.deepurl,
                                              digest: file.digest })
                };
            }
            delete record["xflexparentkey"]; // nu niet meer nodig
        }
    this.streamattachment = function(filter, flexfields)
    {
        for (var fid in flexfields)
        {
            if (flexfields[fid].id == filter.subfolder && flexfields[fid].attachments)
            {
                for (var i = 0; i < flexfields[fid].attachments.length; i++)
                {
                    var att = flexfields[fid].attachments[i];
                    if (att.name.toLowerCase() == filter.filename.toLowerCase()) // Gevonden!!!!
                    {
                        params = flexProps(this.module, filter.id, filter.subfolder, flexParams.pNiveau);
                        // In de praktijk (b)lijkt IE de ETag niet te sturen voor downloads
                        // maar wij ondersteunen het in ieder geval wel.
                        var eTag = '"' + att.digest + '"';
                        Response.AddHeader("ETag", eTag);
                        if (Request.ServerVariables("HTTP_IF_NONE_MATCH") == eTag)
                        {   // We hebben een match!
                            Response.Clear();
                            Response.Status = "304 Not modified";
                            Response.End;
                        }
                        StreamFile(params.AttachPath, att.name, "application/octet-stream");
                    }
                }

            }
        }
        __Log(filter);
        Response.Status = "404 Not Found";
    }

    this.list = { columns: ["id", "label", "value"] }

    // Merk op: géén eigen REST_GET
    // We kunnen alleen via een include van een parent die dan ook
    // vooral alle autorisatiecontrole voor ons kan verzorgen
    //    this.REST_GET = generic_REST_GET(this, {});

}

function set_custom_field(jsondata, kenmerk_key, val, typ)
{
    for (var i=0; i< jsondata.custom_fields.length; i++)
    {
        if (jsondata.custom_fields[i].id == kenmerk_key)
        {
            jsondata.custom_fields[i].value = val;
            return; // direct klaar
        }
    }
    if (!typ)
        abort_with_warning("Cannot set_custom_field key '{0}' without type".format(kenmerk_key));

    jsondata.custom_fields.push({ id: kenmerk_key, value: val, type: typ });
}

function get_custom_field(jsondata, kenmerk_key)
{
    for (var i=0; i< jsondata.custom_fields.length; i++)
    {
        if (jsondata.custom_fields[i].id == kenmerk_key)
        {
            return jsondata.custom_fields[i].value; // direct klaar
        }
    }
    return null;
}
%>