<?xml version="1.0" encoding="UTF-8"?>
<BarcodeData>
    <PaperFormsBarcode>
        <defaultvalues>
            <symbology name="pdf417">
                <eccs>
                    <minvalue>0</minvalue>
                    <maxvalue>8</maxvalue>
                    <increment>1</increment>
                </eccs>
                <modulewidths unit="mm">
                    <value>0.170</value>
                    <value>0.338</value>
                    <value>0.424</value>
                    <value>0.508</value>
                    <value>0.592</value>
                    <value>0.678</value>
                    <value>0.762</value>
                    <value>0.846</value>
                    <value>0.932</value>
                    <value>1.016</value>
                </modulewidths>
                <heightwidthratios>
                    <minvalue>1</minvalue>
                    <maxvalue>4</maxvalue>
                    <increment>1</increment>
                </heightwidthratios>
                <presets>
                    <decodeconditions>
                        <decodecondition name="documentscanner">
                            <ecc>5</ecc>
                            <heightwidthratio>2</heightwidthratio>
                            <modulewidth unit="mm">0.338</modulewidth>
                        </decodecondition>
                        <decodecondition name="faxserver">
                            <ecc>6</ecc>
                            <heightwidthratio>2</heightwidthratio>
                            <modulewidth unit="mm">0.338</modulewidth>
                        </decodecondition>
                        <decodecondition name="handheld">
                            <ecc>5</ecc>
                            <heightwidthratio>3</heightwidthratio>
                            <modulewidth unit="mm">0.338</modulewidth>
                        </decodecondition> 
                    </decodeconditions>
                </presets>
            </symbology>
            <symbology name="qrcode">
                <eccs>
                    <minvalue>0</minvalue>
                    <maxvalue>3</maxvalue>
                    <increment>1</increment>
                </eccs>
                <modulewidths unit="mm">
                    <value>0.170</value>
                    <value>0.338</value>
                    <value>0.424</value>
                    <value>0.508</value>
                    <value>0.592</value>
                    <value>0.678</value>
                    <value>0.762</value>
                    <value>0.846</value>
                    <value>0.932</value>
                    <value>1.016</value>
                </modulewidths>
                <heightwidthratios>
                    <minvalue>1</minvalue>
                    <maxvalue>1</maxvalue>
                    <increment>1</increment>
                </heightwidthratios>
                <presets>
                    <decodeconditions>
                        <decodecondition name="documentscanner">
                            <ecc>1</ecc>
                            <heightwidthratio>1</heightwidthratio>
                            <modulewidth unit="mm">0.424</modulewidth>
                        </decodecondition>
                        <decodecondition name="faxserver">
                            <ecc>1</ecc>
                            <heightwidthratio>1</heightwidthratio>
                            <modulewidth unit="mm">0.593</modulewidth>
                        </decodecondition>
                        <decodecondition name="handheld">
                            <ecc>1</ecc>
                            <heightwidthratio>1</heightwidthratio>
                            <modulewidth unit="mm">0.508</modulewidth>
                        </decodecondition>
                    </decodeconditions>
                </presets>
            </symbology>
            <symbology name="datamatrix">
                <eccs>
                    <minvalue>0</minvalue>
                    <maxvalue>0</maxvalue>
                    <increment>1</increment>
                </eccs>
                <modulewidths unit="mm">
                    <value>0.170</value>
                    <value>0.338</value>
                    <value>0.424</value>
                    <value>0.508</value>
                    <value>0.592</value>
                    <value>0.678</value>
                    <value>0.762</value>
                    <value>0.846</value>
                    <value>0.932</value>
                    <value>1.016</value>
                </modulewidths>
                <heightwidthratios>
                    <minvalue>1</minvalue>
                    <maxvalue>1</maxvalue>
                    <increment>1</increment>
                </heightwidthratios>
                <presets>
                    <decodeconditions>
                        <decodecondition name="documentscanner">
                            <ecc>0</ecc>
                            <heightwidthratio>1</heightwidthratio>
                            <modulewidth unit="mm">0.424</modulewidth>
                        </decodecondition>
                        <decodecondition name="faxserver">
                            <ecc>0</ecc>
                            <heightwidthratio>1</heightwidthratio>
                            <modulewidth unit="mm">0.593</modulewidth>
                        </decodecondition>
                        <decodecondition name="handheld">
                            <ecc>0</ecc>
                            <heightwidthratio>1</heightwidthratio>
                            <modulewidth unit="mm">0.508</modulewidth>
                        </decodecondition>
                    </decodeconditions>
                </presets>
            </symbology>
        </defaultvalues>
        <scripts>
            <script id="xmlEntireForm" lang="JavaScript">
                <latest_revision>3</latest_revision>
                <oldest_revision>0</oldest_revision>
                <revisions>
                    <revision>
                        <value>3</value>
                        <![CDATA[
//{{Start Generated Content//
/*{{<name>xmlEntireForm</name>}}*/
var is705ViewerRequired = false;
var useLegacyXMLFormat = true;
//End Generated Content}}//

// Fonctions d'utilitaire permettant de mettre à jour automatiquement
// le code à barres en cas d'actualisation de l'un de ses objets de codage.
function depends(node)
{
    if(node.className != "variables")
    {
        var stack = new Array();

        var currentNode = node;
        stack.push(currentNode);

        while (stack.length > 0)
        {
            currentNode = stack.pop();
            if(currentNode == null) continue;

            for(var i = 0; i < currentNode.nodes.length; ++i)
            {
                stack.push(currentNode.nodes.item(i));
            }
        }
    }
}

// Imposer la mise à jour de tous les champs du formulaire dans le jeu de données
depends(xfa.form); 

// Coder le nud des données au format XML
if(useLegacyXMLFormat == true)
{
    this.rawValue = xfa.datasets.saveXML();
}
else
{
   this.rawValue = xfa.record.saveXML();
}

// Le contrôle de validité final est effectué à partir d'ici, non pas par souci d'efficacité, mais pour des raisons de cohérence et d'exactitude
if (is705ViewerRequired && xfa.host.version < 7.05)
{
    this.rawValue = " ";
}
]]>
                    </revision>
                    <revision>
                        <value>2</value>
                        <![CDATA[
//{{Start Generated Content//
var is705ViewerRequired = false;
var useLegacyXMLFormat = true;
//End Generated Content}}//

// La mise à jour du code à barres n'est pas automatique en cas de modification des valeurs remplies.
// Pour contourner le problème, il suffit d'ajouter une fonction récursive qui vérifie tous les champs dans le noeud donné.
function depends(node)
{
    if(node.className != "variables")
    {
        var stack = new Array();

        var currentNode = node;
        stack.push(currentNode);

        while (stack.length > 0)
        {
            currentNode = stack.pop();
            if(currentNode == null) continue;

            for(var i = 0; i < currentNode.nodes.length; ++i)
            {
                stack.push(currentNode.nodes.item(i));
            }
        }
    }
}

// Imposer la mise à jour de tous les champs du formulaire dans le jeu de données
depends(xfa.form); 

// Coder le nud des données au format XML
if(useLegacyXMLFormat == true)
{
    this.rawValue = xfa.datasets.saveXML();
}
else
{
   this.rawValue = xfa.record.saveXML();
}
// Le contrôle de validité final est effectué à partir d'ici, non pas par souci d'efficacité, mais pour des raisons de cohérence et d'exactitude
if (is705ViewerRequired && xfa.host.version < 7.05)
{
    this.rawValue = " ";
}
]]>
                    </revision>
                    <revision>
                        <value>1</value>
                        <![CDATA[
//{{Start Generated Content//
var is705ViewerRequired = false;
var useLegacyXMLFormat = true;
//End Generated Content}}//

// La mise à jour du code à barres n'est pas automatique en cas de modification des valeurs remplies.
// Pour contourner le problème, il suffit d'ajouter une fonction récursive qui vérifie tous les champs dans le noeud donné.
function depends(node)
{
    if(node.className != "variables")
    {
        for (var i = 0; i < node.nodes.length; ++i)
        {
            var child = node.nodes.item(i);
            if (child.isContainer)
            {
                depends(child);
            }
        }
    }
}

// Imposer la mise à jour de tous les champs du formulaire dans le jeu de données
depends(xfa.form); 

// Coder le nud des données au format XML
if(useLegacyXMLFormat == true)
{
    this.rawValue = xfa.datasets.saveXML();
}
else
{
   this.rawValue = xfa.record.saveXML();
}
// Le contrôle de validité final est effectué à partir d'ici, non pas par souci d'efficacité, mais pour des raisons de cohérence et d'exactitude
if (is705ViewerRequired && xfa.host.version < 7.05)
{
    this.rawValue = " ";
}
]]>
                    </revision>
                    <revision>
                        <value>0</value>
                        <![CDATA[
// La mise à jour du code à barres n'est pas automatique en cas de modification des valeurs remplies.
// Pour contourner le problème, il suffit d'ajouter une fonction récursive qui vérifie tous les champs dans le noeud donné.
function depends(node)
{
	for (var i = 0; i < node.nodes.length; ++i)
	{
		var child = node.nodes.item(i);
		if (child.isContainer)
			depends(child);
	}
}

depends(xfa.form); // Imposer la mise à jour de tous les champs du formulaire dans le jeu de données

this.rawValue = xfa.datasets.saveXML();
]]>
                    </revision>
                </revisions>
            </script>
            <script id="xmlSubform" lang="JavaScript">
                <latest_revision>3</latest_revision>
                <oldest_revision>0</oldest_revision>
                <revisions>
                    <revision>
                        <value>3</value>
                        <![CDATA[
//{{Start Generated Content//
/*{{<name>xmlSubform</name>}}*/
var is705ViewerRequired = false;
//End Generated Content}}//

// Initialiser le contenu du code à barres
this.rawValue = " ";

function getDataNode(childNode)
{
    var dataNode = null;

    if(childNode != null)
    {
        var parentNode = childNode.parent;
        var isSubformFound = false;

        while(!isSubformFound && parentNode != null)
        {
            if(parentNode.className == "subform")
            {
                isSubformFound = true;
            }
            else
            {
                parentNode = parentNode.parent;
            }
        }

        if(parentNode != null)
        {
            if(parentNode.name.length > 0)
            {
                dataNode = parentNode.dataNode;
            }
            else
            {
                dataNode = parentNode.data;
            }
        }
    }

  return dataNode;
}

// Fonctions d'utilitaire permettant de mettre à jour automatiquement
// le code à barres en cas d'actualisation de l'un de ses objets de codage.
function depends(node)
{
    if(node.className != "variables")
    {
        var stack = new Array();

        var currentNode = node;
        stack.push(currentNode);

        while (stack.length > 0)
        {
            currentNode = stack.pop();
            if(currentNode == null) continue;

            for(var i = 0; i < currentNode.nodes.length; ++i)
            {
                stack.push(currentNode.nodes.item(i));
            }
        }
    }
}

// Imposer la mise à jour de tous les champs du sous-formulaire dans le jeu de données
depends(this.parent); 

var nodeData = getDataNode(this);
if(nodeData != null)
{
    this.rawValue = nodeData.saveXML();
}

// Le contrôle de validité final est effectué à partir d'ici, non pas par souci d'efficacité, mais pour des raisons de cohérence et d'exactitude
if (is705ViewerRequired && xfa.host.version < 7.05)
{
    this.rawValue = " ";
}
]]>
                    </revision>
                    <revision>
                        <value>2</value>
                        <![CDATA[
//{{Start Generated Content//
var is705ViewerRequired = false;
//End Generated Content}}//

// La mise à jour du code à barres n'est pas automatique en cas de modification des valeurs remplies.
// Pour contourner le problème, il suffit d'ajouter une fonction récursive qui vérifie tous les champs dans le noeud donné.
function depends(node)
{
    if(node.className != "variables")
    {
        var stack = new Array();

        var currentNode = node;
        stack.push(currentNode);

        while (stack.length > 0)
        {
            currentNode = stack.pop();
            if(currentNode == null) continue;

            for(var i = 0; i < currentNode.nodes.length; ++i)
            {
                stack.push(currentNode.nodes.item(i));
            }
        }
    }
}

// Le nud dont les données seront codées
var encoded = this.parent;
while (encoded != null)
{
    if (encoded.className == "subform")
    {
        // Le nud à coder a été trouvé
        break;
    }

    encoded = encoded.parent;
}

// Initialiser le contenu du code à barres
this.rawValue = " ";

// Imposer la mise à jour de tous les champs du sous-formulaire dans le jeu de données
depends(encoded); 

if (encoded != null)
{
    // Rechercher le nud de données correspondant au nud dont les données seront codées
    var encodedDataNode = encoded.dataNode; 
    if(encodedDataNode != null)
    {
        // Coder le nud des données au format XML
        this.rawValue = encodedDataNode.saveXML();
    }
}
// Le contrôle de validité final est effectué à partir d'ici, non pas par souci d'efficacité, mais pour des raisons de cohérence et d'exactitude
if (is705ViewerRequired && xfa.host.version < 7.05)
{
    this.rawValue = " ";
}
]]>
                    </revision>
                    <revision>
                        <value>1</value>
                        <![CDATA[
//{{Start Generated Content//
var is705ViewerRequired = false;
//End Generated Content}}//

// La mise à jour du code à barres n'est pas automatique en cas de modification des valeurs remplies.
// Pour contourner le problème, il suffit d'ajouter une fonction récursive qui vérifie tous les champs dans le noeud donné.
function depends(node)
{
    if(node.className != "variables")
    {
        for (var i = 0; i < node.nodes.length; ++i)
        {
            var child = node.nodes.item(i);
            if (child.isContainer)
            {
                depends(child);
            }
        }
    }
}

// Le nud dont les données seront codées
var encoded = this.parent;
while (encoded != null)
{
    if (encoded.className == "subform")
    {
        // Le nud à coder a été trouvé
        break;
    }

    encoded = encoded.parent;
}

// Initialiser le contenu du code à barres
this.rawValue = " ";

// Imposer la mise à jour de tous les champs du sous-formulaire dans le jeu de données
depends(encoded); 

if (encoded != null)
{
    // Rechercher le nud de données correspondant au nud dont les données seront codées
    var encodedDataNode = encoded.dataNode; 
    if(encodedDataNode != null)
    {
        // Coder le nud des données au format XML
        this.rawValue = encodedDataNode.saveXML();
    }
}
// Le contrôle de validité final est effectué à partir d'ici, non pas par souci d'efficacité, mais pour des raisons de cohérence et d'exactitude
if (is705ViewerRequired && xfa.host.version < 7.05)
{
    this.rawValue = " ";
}
]]>
                    </revision>
                    <revision>
                        <value>0</value>
                        <![CDATA[
// La mise à jour du code à barres n'est pas automatique en cas de modification des valeurs remplies.
// Pour contourner le problème, il suffit d'ajouter une fonction récursive qui vérifie tous les champs dans le noeud donné.
function depends(node)
{
	for (var i = 0; i < node.nodes.length; i++)
	{
		var child = node.nodes.item(i);
		if (child.isContainer)
			depends(child);
	}
}

var encoded = this.parent; // Le nud dont les données seront codées

while (encoded != null)
{
	if (encoded.className == "subform")
		// Le nud à coder a été trouvé
		break;

	encoded = encoded.parent;
}

if (encoded != null)
{
	var encodedDataNode = encoded.dataNode; // Rechercher le nud de données correspondant au nud dont les données seront codées
	if(encodedDataNode != null)
	{
		depends(encoded); // Imposer la mise à jour dans le jeu de données de tous les champs contenus dans le nud à coder
		
		this.rawValue = encodedDataNode.saveXML(); // Coder le fichier XML de nud de données
	}
}
]]>
                    </revision>
                </revisions>
            </script>
            <script id="delimEntireForm" lang="JavaScript">
                <latest_revision>3</latest_revision>
                <oldest_revision>0</oldest_revision>
                <revisions>
                    <revision>
                        <value>3</value>
                        <![CDATA[
//{{Start Generated Content//
/*{{<name>delimEntireForm</name>}}*/
var includeFieldNames = true;
var includeLabel = true;
var labelID = "Label";
var is705ViewerRequired = false;
var delimiter = '\t';
//End Generated Content}}//

// Initialiser le contenu du code à barres
this.rawValue = " ";

// Codage des données dans le code à barres

var fieldNames = new Array();
var fieldValues = new Array();

function encode(node)
{
    var barcodeLabel = this.caption.value.text.value;
    if (includeLabel == true && barcodeLabel.length > 0)
    {
        fieldNames.push(labelID);
        fieldValues.push(barcodeLabel);
    }

    // Créer un réseau de tous les nuds enfant dans le formulaire
    var entireFormNodes = new Array();
    collectChildNodes(node, entireFormNodes);

    // Si le formulaire possède deux champs au moins avec le même nom, les noms des 
    // parents sont combinés à des numéros d'indice de ces champs et de leurs
    // parents pour les différencier. Or, comme l'espace dans les
    // codes à barres est optimisé, ces données supplémentaires sont utilisées
    // dans les noms d'objet uniquement en cas de besoin.
    resolveDuplicates(entireFormNodes, entireFormNodes, fieldNames);

    // Passer en revue les objets de formulaire et cumuler la valeur de chaque objet de formulaire
    accumulateFieldValues(node);

    var encodedContent = new String();

    var values = fieldValues.join(delimiter);
    values += delimiter;

    if (includeFieldNames == true)
    {
        if(delimiter != '\n')
        {
            var fields = fieldNames.join(delimiter);
            fields += delimiter;

            encodedContent = fields + "\n" + values;
        }
        else if(delimiter == '\n')
        {
            for(var i = 0; i < fieldNames.length && i < fieldValues.length; ++i)
            {
                encodedContent += fieldNames[i] + delimiter + fieldValues[i] + delimiter;
            }
        }
    }
    else
    {
        encodedContent = values;
    }

    return encodedContent;
}


// Si deux noeuds au moins possèdent le même nom, différenciez-les
// en utilisant des numéros d'indice et/ou les noms des parents.
function resolveDuplicates(encodingNodes, entireFormNodes, fieldNameArray)
{
    for(var i = 0; i < encodingNodes.length; ++i)
    {
        fieldNameArray.push(makeUniqueName(encodingNodes[i],
            entireFormNodes, encodingNodes[i].name));
    }

    // Supprimer les 0 en indice si aucun champ ne possède le même nom
    // au même niveau
    compact(fieldNameArray);
}


// Rechercher des doublons dans tout le formulaire d'un nud donné et proposer un
// nom permettant de distinguer le nud actuel du reste, grâce à une combinaison
// de numéros d'indice et de nom(s) parent.
function makeUniqueName(node, formNodeArray, nodeName)
{
    for(var i = 0; i < formNodeArray.length; ++i)
    {
        var compNode = formNodeArray[i];

        var nodeSOM = node.somExpression;
        var compNodeSOM = compNode.somExpression;

        if((nodeSOM != compNodeSOM) && (nodeName == compNode.name))
        {
            if(nodeSOM.substring(0, nodeSOM.lastIndexOf(".")) == 
                compNodeSOM.substring(0, compNodeSOM.lastIndexOf(".")))
            {
                var diffLevelNodeFound = false;
                for(var ii = i; !diffLevelNodeFound  && ii < formNodeArray.length; ++ii)
                {
                    compNode = formNodeArray[ii];
                    compNodeSOM = compNode.somExpression;

                    if((nodeSOM != compNodeSOM) && (nodeName == compNode.name) &&
                        (nodeSOM.substring(0, nodeSOM.lastIndexOf(".")) != 
                        compNodeSOM.substring(0, compNodeSOM.lastIndexOf("."))))
                    {
                        diffLevelNodeFound = true;
                    }
                }

                if(!diffLevelNodeFound )
                {
                    // Les deux nuds sont au même niveau. Il est inutile d'ajouter les noms
                    // des parents des nuds actuels pour les différencier.
                    // Utilisez juste le suffixe.
                    nodeName += "[" + node.index + "]";
                }
            }
            else
            {
                if(node.parent != null)
                {
                    var parentArray = new Array();
                    for(var j = 0; j < formNodeArray.length; ++j)
                    {
                        var parentNode = formNodeArray[j].parent;
                        if(parentNode != null)
                        {
                            parentArray.push(parentNode);
                        }
                    }

                    nodeName = makeUniqueName(node.parent, parentArray, node.parent.name).concat(
                        ".", nodeName, "[", node.index, "]");
                }
            }
        }
    }

    return nodeName;
}


// Supprimer les 0 en indice si aucun champ ne possède le même nom
// au même niveau
function compact(nameArray)
{
    for(var i = 0; i < nameArray.length; ++i)
    {
        var fieldName = nameArray[i];
        if(fieldName.substring(fieldName.lastIndexOf("[") + 1, fieldName.lastIndexOf("]")) == "0")
        {
            var fieldNameNoSubscript = fieldName.substring(0, fieldName.lastIndexOf("["));
            var isFound = false;

            for(var j = 0; !isFound && j < nameArray.length; ++j)
            {
                if(nameArray[j] != nameArray[i])
                {
                    var comparedFieldName = nameArray[j];

                    if(fieldNameNoSubscript ==
                        comparedFieldName.substring(0, comparedFieldName.lastIndexOf("[")))
                    {
                        isFound = true;
                    }
                }
            }

            if(!isFound)
            {
                nameArray.splice(i, 1, fieldNameNoSubscript);
            }
        }
    }
}


// Ajouter des valeurs d'objet à un conteneur local
function accumulateFieldValues(node)
{
    if (node.className == "dataGroup")
    {
        var itemCount = node.nodes.length;
        for (var i = 0; i < itemCount; ++i)
        {
            accumulateFieldValues(node.nodes.item(i));
        }
    }
    else
    {
        if(node.value != null)
        {
            fieldValues.push(node.value);
        }
        else
        {
            fieldValues.push("");
        }
    }
}


// Convertir une liste de nuds XFA en réseau de noeuds JavaScript
function collectChildNodes(node, childNodeArray)
{
    if(node.className == "dataGroup")
    {
        var itemCount = node.nodes.length;
        for (var i = 0; i < itemCount; ++i)
        {
            collectChildNodes(node.nodes.item(i), childNodeArray);
        }
    }
    else
    {
        childNodeArray.push(node);
    }
}


// Fonctions d'utilitaire permettant de mettre à jour automatiquement
// le code à barres en cas d'actualisation de l'un de ses objets de codage.
function depends(node)
{
    if(node.className != "variables")
    {
        var stack = new Array();

        var currentNode = node;
        stack.push(currentNode);

        while (stack.length > 0)
        {
            currentNode = stack.pop();
            if(currentNode == null) continue;

            for(var i = 0; i < currentNode.nodes.length; ++i)
            {
                stack.push(currentNode.nodes.item(i));
            }
        }
    }
}

// Imposer la mise à jour de tous les champs du formulaire dans le jeu de données
depends(xfa.form);

// Coder le contenu du nud de données dans un format délimité par tabulation
this.rawValue = encode(xfa.datasets.data);

// Le contrôle de validité final est effectué à partir d'ici, non pas par souci d'efficacité, mais pour des raisons de cohérence et d'exactitude
if (is705ViewerRequired && xfa.host.version < 7.05)
{
    this.rawValue = " ";
}
]]>
                    </revision>
                    <revision>
                        <value>2</value>
                        <![CDATA[
//{{Start Generated Content//
var includeFieldNames = true;
var includeLabel = true;
var labelID = "Label";
var is705ViewerRequired = false;
//End Generated Content}}//

function isGroup(node)
{
    return (node.className == "dataGroup");
}

var fields = new String();
var values = new String();

var isLabelAdded = false;
function referenceValues(node)
{
    var barcodeLabel = this.caption.value.text.value;
    if (includeLabel == true && barcodeLabel.length > 0)
    {
        fields = labelID;
        values = barcodeLabel;
        
        isLabelAdded = true;
    }

    // Cumuler les noms des champs en fonction de la préférence
    // utilisateur et des valeurs de données des nuds enfant
    traverse(node);

    if (includeFieldNames == true)
    { 
        // Retourner les noms des champs si c'est la préférence de l'utilisateur
        return fields + "\n" + values;
    }
    else
    {
        // Sinon, retournez juste les valeurs
        return values;
    }
}

var isTabAdded = false;
function traverse(node)
{
    if (isGroup(node))
    {
        var itemCount = node.nodes.length;
        for (var j = 0; j < itemCount; ++j)
        {
            traverse(node.nodes.item(j));
        }
    }
    else
    {
        if(isLabelAdded == true)
        {
            fields += "\t";
            values += "\t";

            isLabelAdded = false;
        }

        fields += node.name + "\t";

        var nodeValue = node.value;
        if(nodeValue != null)
        {
            values += node.value + "\t";
        }
        else
        {
            values += "\t";
        }
    }
}

// La mise à jour du code à barres n'est pas automatique en cas de modification des valeurs remplies.
// Pour contourner le problème, il suffit d'ajouter une fonction récursive qui vérifie tous les champs dans le noeud donné.
function depends(node)
{
    if(node.className != "variables")
    {
        var stack = new Array();

        var currentNode = node;
        stack.push(currentNode);

        while (stack.length > 0)
        {
            currentNode = stack.pop();
            if(currentNode == null) continue;

            for(var i = 0; i < currentNode.nodes.length; ++i)
            {
                stack.push(currentNode.nodes.item(i));
            }
        }
    }
}

// Imposer la mise à jour de tous les champs du formulaire dans le jeu de données
depends(xfa.form);

// Coder le contenu du nud de données dans un format délimité par tabulation
this.rawValue = referenceValues(xfa.datasets.data);
// Le contrôle de validité final est effectué à partir d'ici, non pas par souci d'efficacité, mais pour des raisons de cohérence et d'exactitude
if (is705ViewerRequired && xfa.host.version < 7.05)
{
    this.rawValue = " ";
}
]]>
                    </revision>
                    <revision>
                        <value>1</value>
                        <![CDATA[
//{{Start Generated Content//
var includeFieldNames = true;
var includeLabel = true;
var labelID = "Label";
var is705ViewerRequired = false;
//End Generated Content}}//

function isGroup(node)
{
    return (node.className == "dataGroup");
}

var fields = new String();
var values = new String();

var isLabelAdded = false;
function referenceValues(node)
{
    var barcodeLabel = this.caption.value.text.value;
    if (includeLabel == true && barcodeLabel.length > 0)
    {
        fields = labelID;
        values = barcodeLabel;
        
        isLabelAdded = true;
    }

    // Cumuler les noms des champs en fonction de la préférence
    // utilisateur et des valeurs de données des nuds enfant
    traverse(node);

    if (includeFieldNames == true)
    { 
        // Retourner les noms des champs si c'est la préférence de l'utilisateur
        return fields + "\n" + values;
    }
    else
    {
        // Sinon, retournez juste les valeurs
        return values;
    }
}

var isTabAdded = false;
function traverse(node)
{
    if (isGroup(node))
    {
        var itemCount = node.nodes.length;
        for (var j = 0; j < itemCount; ++j)
        {
            traverse(node.nodes.item(j));
        }
    }
    else
    {
        if(isLabelAdded == true)
        {
            fields += "\t";
            values += "\t";

            isLabelAdded = false;
        }

        fields += node.name + "\t";

        var nodeValue = node.value;
        if(nodeValue != null)
        {
            values += node.value + "\t";
        }
        else
        {
            values += "\t";
        }
    }
}

// La mise à jour du code à barres n'est pas automatique en cas de modification des valeurs remplies.
// Pour contourner le problème, il suffit d'ajouter une fonction récursive qui vérifie tous les champs dans le noeud donné.
function depends(node)
{
    if(node.className != "variables")
    {
        for (var i = 0; i < node.nodes.length; ++i)
        {
            var child = node.nodes.item(i);
            if (child.isContainer)
            {
                depends(child);
            }
        }
    }
}

// Imposer la mise à jour de tous les champs du formulaire dans le jeu de données
depends(xfa.form);

// Coder le contenu du nud de données dans un format délimité par tabulation
this.rawValue = referenceValues(xfa.datasets.data);
// Le contrôle de validité final est effectué à partir d'ici, non pas par souci d'efficacité, mais pour des raisons de cohérence et d'exactitude
if (is705ViewerRequired && xfa.host.version < 7.05)
{
    this.rawValue = " ";
}
]]>
                    </revision>
                    <revision>
                        <value>0</value>
                        <![CDATA[
// Préférence utilisateur : configurez sur Faux si vous ne souhaitez pas inclure les noms des champs.
var includeFieldNames = true; 

var includeGUID = false;

function isGroup(node)
{
	return (node.className == "dataGroup");
}

var fields = new String();
var values = new String();

var isGUIDAdded = false;
function referenceValues(node)
{
	var pcCaption = this.caption.value.text.value;	
	if (includeGUID == true && pcCaption.length > 0)
	{
		fields = "GUID";
		values = pcCaption;
		
		isGUIDAdded = true;
	}
	
	traverse(node);

	if (includeFieldNames == true)
	{ 
		// Retourner les noms des champs si c'est la préférence de l'utilisateur
		return fields + "\n" + values;
	}
	else
	{
		// Sinon, retournez juste les valeurs
		return values;
	}
}

var isTabAdded = false;
function traverse(node)
{
	if (isGroup(node))
	{
		for (var i = 0; i < node.nodes.length; ++i)
		{	
			if(isGroup(node.nodes.item(i)) == false)
			{	
				if(i == 0 && isGUIDAdded == true)
				{
					fields += "\t";					
				}
				else if(i > 0)
				{
					fields += "\t";
					isTabAdded = true;
				}
				
				fields += node.nodes.item(i).name;				
			}
			
			traverse(node.nodes.item(i));
		}
	}
	else
	{
		if(isGUIDAdded == true)
		{
			values += "\t";
			isGUIDAdded = false;
		}		
		else if(isTabAdded == true)
		{
			values += "\t";
			isTabAdded = false;
		}
		
		values += node.value;
	}
}

// La mise à jour du code à barres n'est pas automatique en cas de modification des valeurs remplies.
// Pour contourner le problème, il suffit d'ajouter une fonction récursive qui vérifie tous les champs dans le noeud donné.
function depends(node)
{
	for (var i = 0; i < node.nodes.length; i++)
	{
		var child = node.nodes.item(i);
		if (child.isContainer)
			depends(child);
	}
}

depends(xfa.form); // Imposer la mise à jour de tous les champs du formulaire dans le jeu de données

this.rawValue = referenceValues(xfa.datasets.data); // Coder le contenu du nud de données dans un format délimité par tabulation
]]>
                    </revision>
                </revisions>
            </script>
            <script id="delimSubform" lang="JavaScript">
                <latest_revision>3</latest_revision>
                <oldest_revision>0</oldest_revision>
                <revisions>
                    <revision>
                        <value>3</value>
                        <![CDATA[
//{{Start Generated Content//
/*{{<name>delimSubform</name>}}*/
var includeFieldNames = true;
var includeLabel = true;
var labelID = "Label";
var is705ViewerRequired = false;
var delimiter = '\t';
//End Generated Content}}//

// Initialiser le contenu du code à barres
this.rawValue = " ";

// Coder les données dans le code à barres

var fieldNames = new Array();
var fieldValues = new Array();

function encode(node)
{
    var barcodeLabel = this.caption.value.text.value;
    if (includeLabel == true && barcodeLabel.length > 0)
    {
        fieldNames.push(labelID);
        fieldValues.push(barcodeLabel);
    }

    // Créer un réseau de tous les nuds enfant dans le formulaire
    var entireFormNodes = new Array();
    collectChildNodes(xfa.datasets.data, entireFormNodes);

    // Créer un réseau de tous les nuds enfant dans le sous-formulaire
    var subFormNodes = new Array();
    collectChildNodes(node, subFormNodes);

    // Si le formulaire possède deux champs au moins avec le même nom, les noms des 
    // parents sont combinés à des numéros d'indice de ces champs et de leurs
    // parents pour les différencier. Or, comme l'espace dans les
    // codes à barres est optimisé, ces données supplémentaires sont utilisées
    // dans les noms d'objet uniquement en cas de besoin.
    resolveDuplicates(subFormNodes, entireFormNodes, fieldNames);

    // Passer en revue les objets de formulaire et cumuler la valeur de chaque objet de formulaire
    accumulateFieldValues(node);

    var encodedContent = new String();

    var values = fieldValues.join(delimiter);
    values += delimiter;

    if (includeFieldNames == true)
    {
        if(delimiter != '\n')
        {
            var fields = fieldNames.join(delimiter);
            fields += delimiter;

            encodedContent = fields + "\n" + values;
        }
        else if(delimiter == '\n')
        {
            for(var i = 0; i < fieldNames.length && i < fieldValues.length; ++i)
            {
                encodedContent += fieldNames[i] + delimiter + fieldValues[i] + delimiter;
            }
        }
    }
    else
    {
        encodedContent = values;
    }

    return encodedContent;
}


// Si deux noeuds au moins possèdent le même nom, différenciez-les
// en utilisant des numéros d'indice et/ou les noms des parents.
function resolveDuplicates(encodingNodes, entireFormNodes, fieldNameArray)
{
    for(var i = 0; i < encodingNodes.length; ++i)
    {
        fieldNameArray.push(makeUniqueName(encodingNodes[i], 
            entireFormNodes, encodingNodes[i].name));
    }

    // Supprimer les 0 en indice si aucun champ ne possède le même nom
    // au même niveau
    compact(fieldNameArray);
}


// Rechercher des doublons dans tout le formulaire d'un nud donné et proposer un
// nom permettant de distinguer le nud actuel du reste, grâce à une combinaison
// de numéros d'indice et de nom(s) parent.
function makeUniqueName(node, formNodeArray, nodeName)
{
    for(var i = 0; i < formNodeArray.length; ++i)
    {
        var compNode = formNodeArray[i];

        var nodeSOM = node.somExpression;
        var compNodeSOM = compNode.somExpression;

        if((nodeSOM != compNodeSOM) && (nodeName == compNode.name))
        {
            if(nodeSOM.substring(0, nodeSOM.lastIndexOf(".")) == 
                compNodeSOM.substring(0, compNodeSOM.lastIndexOf(".")))
            {
                var diffLevelNodeFound = false;
                for(var ii = i; !diffLevelNodeFound  && ii < formNodeArray.length; ++ii)
                {
                    compNode = formNodeArray[ii];
                    compNodeSOM = compNode.somExpression;

                    if((nodeSOM != compNodeSOM) && (nodeName == compNode.name) &&
                        (nodeSOM.substring(0, nodeSOM.lastIndexOf(".")) != 
                        compNodeSOM.substring(0, compNodeSOM.lastIndexOf("."))))
                    {
                        diffLevelNodeFound = true;
                    }
                }

                if(!diffLevelNodeFound )
                {
                    // Les deux nuds sont au même niveau. Il est inutile d'ajouter les noms
                    // des parents des nuds actuels pour les différencier.
                    // Utilisez juste le suffixe.
                    nodeName += "[" + node.index + "]";
                }
            }
            else
            {
                if(node.parent != null)
                {
                    var parentArray = new Array();
                    for(var j = 0; j < formNodeArray.length; ++j)
                    {
                        var parentNode = formNodeArray[j].parent;
                        if(parentNode != null)
                        {
                            parentArray.push(parentNode);
                        }
                    }

                    nodeName = makeUniqueName(node.parent, parentArray, node.parent.name).concat(
                        ".", nodeName, "[", node.index, "]");
                }
            }
        }
    }

    return nodeName;
}


// Supprimer les 0 en indice si aucun champ ne possède le même nom
// au même niveau
function compact(nameArray)
{
    for(var i = 0; i < nameArray.length; ++i)
    {
        var fieldName = nameArray[i];
        if(fieldName.substring(fieldName.lastIndexOf("[") + 1, fieldName.lastIndexOf("]")) == "0")
        {
            var fieldNameNoSubscript = fieldName.substring(0, fieldName.lastIndexOf("["));
            var isFound = false;

            for(var j = 0; !isFound && j < nameArray.length; ++j)
            {
                if(nameArray[j] != nameArray[i])
                {
                    var comparedFieldName = nameArray[j];

                    if(fieldNameNoSubscript ==
                        comparedFieldName.substring(0, comparedFieldName.lastIndexOf("[")))
                    {
                        isFound = true;
                    }
                }
            }

            if(!isFound)
            {
                nameArray.splice(i, 1, fieldNameNoSubscript);
            }
        }
    }
}


// Ajouter des valeurs d'objet à un conteneur local
function accumulateFieldValues(node)
{
    if (node.className == "dataGroup")
    {
        var itemCount = node.nodes.length;
        for (var i = 0; i < itemCount; ++i)
        {
            accumulateFieldValues(node.nodes.item(i));
        }
    }
    else
    {
        if(node.value != null)
        {
            fieldValues.push(node.value);
        }
        else
        {
            fieldValues.push("");
        }
    }
}


// Convertir une liste de nuds XFA en réseau de noeuds JavaScript
function collectChildNodes(node, childNodeArray)
{
    if(node.className == "dataGroup")
    {
        var itemCount = node.nodes.length;
        for (var i = 0; i < itemCount; ++i)
        {
            collectChildNodes(node.nodes.item(i), childNodeArray);
        }
    }
    else
    {
        childNodeArray.push(node);
    }
}


// Rechercher le nud de données du sous-formulaire
function getDataNode(childNode)
{
    var dataNode = null;

    if(childNode != null)
    {
        var parentNode = childNode.parent;
        var isSubformFound = false;

        while(!isSubformFound && parentNode != null)
        {
            if(parentNode.className == "subform")
            {
                isSubformFound = true;
            }
            else
            {
                parentNode = parentNode.parent;
            }
        }

        if(parentNode != null)
        {
            if(parentNode.name.length > 0)
            {
                dataNode = parentNode.dataNode;
            }
            else
            {
                dataNode = parentNode.data;
            }
        }
    }

  return dataNode;
}

// Fonctions d'utilitaire permettant de mettre à jour automatiquement
// le code à barres en cas d'actualisation de l'un de ses objets de codage.
function depends(node)
{
    if(node.className != "variables")
    {
        var stack = new Array();

        var currentNode = node;
        stack.push(currentNode);

        while (stack.length > 0)
        {
            currentNode = stack.pop();
            if(currentNode == null) continue;

            for(var i = 0; i < currentNode.nodes.length; ++i)
            {
                stack.push(currentNode.nodes.item(i));
            }
        }
    }
}

// Imposer la mise à jour de tous les champs du sous-formulaire dans le jeu de données
depends(this.parent);

var nodeData = getDataNode(this);
if(nodeData != null)
{
    // Coder le contenu du nud de données dans un format délimité par tabulation
    this.rawValue = encode(nodeData);
}

// Le contrôle de validité final est effectué à partir d'ici, non pas par souci d'efficacité, mais pour des raisons de cohérence et d'exactitude
if (is705ViewerRequired && xfa.host.version < 7.05)
{
    this.rawValue = " ";
}
]]>
                    </revision>
                    <revision>
                        <value>2</value>
                        <![CDATA[
//{{Start Generated Content//
var includeFieldNames = true;
var includeLabel = true;
var labelID = "Label";
var is705ViewerRequired = false;
//End Generated Content}}//

function getDataNode(childNode)
{
    if (childNode == null)
    {
        return null;
    }

    // Le nud dont les données sont à coder
    var encoded = childNode.parent;
    while (encoded != null)
    {
        if (encoded.className == "subform")
        {
            // Le nud à coder a été trouvé
            break;
        }

        encoded = encoded.parent;
    }

    if (encoded != null)
    {
        // Rechercher le nud de données correspondant au nud dont les données sont à coder
        return encoded.dataNode;
    }

    return null;
}

function isGroup(node)
{
    if (node != null)
    {
        return (node.className == "dataGroup");
    }
    else
    {
        return false;
    }
}

var fields = new String();
var values = new String();

var isLabelAdded = false;
function referenceValues(node)
{
    var barcodeLabel = this.caption.value.text.value;
    if (includeLabel == true && barcodeLabel.length > 0)
    {
        fields = labelID;
        values = barcodeLabel;

        isLabelAdded = true;
    }

    // Cumuler les noms des champs en fonction de la préférence
    // utilisateur et des valeurs de données des nuds enfant
    traverse(node);

    if (includeFieldNames == true)
    {
        // Retourner les noms des champs si c'est la préférence de l'utilisateur
        return fields + "\n" + values;
    }
    else
    {
        // Sinon, retournez juste les valeurs
        return values;
    }
}

function traverse(node)
{
    if (isGroup(node))
    {
        var itemCount = node.nodes.length;
        for (var j = 0; j < itemCount; ++j)
        {
            traverse(node.nodes.item(j));
        }
    }
    else
    {
        if(isLabelAdded == true)
        {
            fields += "\t";
            values += "\t";

            isLabelAdded = false;
        }

        fields += node.name + "\t";

        var nodeValue = node.value;
        if(nodeValue != null)
        {
            values += node.value + "\t";
        }
        else
        {
            values += "\t";
        }
    }
}

/// La mise à jour du code à barres n'est pas automatique en cas de modification des valeurs remplies.
// Pour contourner le problème, il suffit d'ajouter une fonction récursive qui vérifie tous les champs dans le noeud donné.
function depends(node)
{
    if(node.className != "variables")
    {
        var stack = new Array();

        var currentNode = node;
        stack.push(currentNode);

        while (stack.length > 0)
        {
            currentNode = stack.pop();
            if(currentNode == null) continue;

            for(var i = 0; i < currentNode.nodes.length; ++i)
            {
                stack.push(currentNode.nodes.item(i));
            }
        }
    }
}

// Initialiser le contenu du code à barres
this.rawValue = " ";

// Imposer la mise à jour de tous les champs du sous-formulaire dans le jeu de données
depends(this.parent);

var nodeData = getDataNode(this);
if(nodeData != null)
{
    // Coder le contenu du nud de données dans un format délimité par tabulation
    this.rawValue = referenceValues(nodeData);
}
// Le contrôle de validité final est effectué à partir d'ici, non pas par souci d'efficacité, mais pour des raisons de cohérence et d'exactitude
if (is705ViewerRequired && xfa.host.version < 7.05)
{
    this.rawValue = " ";
}
]]>
                    </revision>
                    <revision>
                        <value>1</value>
                        <![CDATA[
//{{Start Generated Content//
var includeFieldNames = true;
var includeLabel = true;
var labelID = "Label";
var is705ViewerRequired = false;
//End Generated Content}}//

function getDataNode(childNode)
{
    if (childNode == null)
    {
        return null;
    }

    // Le nud dont les données sont à coder
    var encoded = childNode.parent;
    while (encoded != null)
    {
        if (encoded.className == "subform")
        {
            // Le nud à coder a été trouvé
            break;
        }

        encoded = encoded.parent;
    }

    if (encoded != null)
    {
        // Rechercher le nud de données correspondant au nud dont les données sont à coder
        return encoded.dataNode;
    }

    return null;
}

function isGroup(node)
{
    if (node != null)
    {
        return (node.className == "dataGroup");
    }
    else
    {
        return false;
    }
}

var fields = new String();
var values = new String();

var isLabelAdded = false;
function referenceValues(node)
{
    var barcodeLabel = this.caption.value.text.value;
    if (includeLabel == true && barcodeLabel.length > 0)
    {
        fields = labelID;
        values = barcodeLabel;

        isLabelAdded = true;
    }

    // Cumuler les noms des champs en fonction de la préférence
    // utilisateur et des valeurs de données des nuds enfant
    traverse(node);

    if (includeFieldNames == true)
    {
        // Retourner les noms des champs si c'est la préférence de l'utilisateur
        return fields + "\n" + values;
    }
    else
    {
        // Sinon, retournez juste les valeurs
        return values;
    }
}

function traverse(node)
{
    if (isGroup(node))
    {
        var itemCount = node.nodes.length;
        for (var j = 0; j < itemCount; ++j)
        {
            traverse(node.nodes.item(j));
        }
    }
    else
    {
        if(isLabelAdded == true)
        {
            fields += "\t";
            values += "\t";

            isLabelAdded = false;
        }

        fields += node.name + "\t";

        var nodeValue = node.value;
        if(nodeValue != null)
        {
            values += node.value + "\t";
        }
        else
        {
            values += "\t";
        }
    }
}

// La mise à jour du code à barres n'est pas automatique en cas de modification des valeurs remplies.
// Pour contourner le problème, il suffit d'ajouter une fonction récursive qui vérifie tous les champs dans le noeud donné.
function depends(node)
{
    if(node.className != "variables")
    {
        for (var i = 0; i < node.nodes.length; ++i)
        {
            var child = node.nodes.item(i);
            if (child.isContainer)
            {
                depends(child);
            }
        }
    }
}

// Initialiser le contenu du code à barres
this.rawValue = " ";

// Imposer la mise à jour de tous les champs du sous-formulaire dans le jeu de données
depends(this.parent);

var nodeData = getDataNode(this);
if(nodeData != null)
{
    // Coder le contenu du nud de données dans un format délimité par tabulation
    this.rawValue = referenceValues(nodeData);
}
// Le contrôle de validité final est effectué à partir d'ici, non pas par souci d'efficacité, mais pour des raisons de cohérence et d'exactitude
if (is705ViewerRequired && xfa.host.version < 7.05)
{
    this.rawValue = " ";
}
]]>
                    </revision>
                    <revision>
                        <value>0</value>
                        <![CDATA[
// Préférence utilisateur : configurez sur Faux si vous ne souhaitez pas inclure les noms des champs.
var includeFieldNames = true; 

var includeGUID = false;

function getDataNode(childNode)
{
	if (childNode == null)
		return null;

	var encoded = childNode.parent; // Le nud dont les données sont à coder
	while (encoded != null)
	{
		if (encoded.className == "subform")
			// Le nud à coder a été trouvé
			break;

		encoded = encoded.parent;
	}

	if (encoded != null)
		return encoded.dataNode; // Rechercher le nud de données correspondant au nud dont les données sont à coder

	return null;
}

function isGroup(node)
{
	if (node != null)
		return (node.className == "dataGroup");
	else
		return false;
}

var fields = new String();
var values = new String();

var isGUIDAdded = false;
function referenceValues(node)
{
	var pcCaption = this.caption.value.text.value;	
	if (includeGUID == true && pcCaption.length > 0)
	{
		fields = "GUID";
		values = pcCaption;
		
		isGUIDAdded = true;
	}

	traverse(node);

	if (includeFieldNames == true)
	{
		// Retourner les noms des champs si c'est la préférence de l'utilisateur
		return fields + "\n" + values;
	}
	else
	{
		// Sinon, retournez juste les valeurs
		return values;
	}
}

var isTabAdded = false;
function traverse(node)
{
	if (isGroup(node))
	{
		for (var i = 0; i < node.nodes.length; ++i)
		{	
			if(isGroup(node.nodes.item(i)) == false)
			{
				if(i == 0 && isGUIDAdded == true)
				{
					fields += "\t";					
				}
				else if(i > 0)
				{
					fields += "\t";
					isTabAdded = true;
				}
				
				fields += node.nodes.item(i).name;				
			}

			traverse(node.nodes.item(i));
		}
	}
	else
	{	
		if(isGUIDAdded == true)
		{
			values += "\t";
			isGUIDAdded = false;
		}		
		else if(isTabAdded == true)
		{
			values += "\t";
			isTabAdded = false;
		}
		
		values += node.value;
	}
}

// La mise à jour du code à barres n'est pas automatique en cas de modification des valeurs remplies.
// Pour contourner le problème, il suffit d'ajouter une fonction récursive qui vérifie tous les champs dans le noeud donné.
function depends(node)
{
	for (var i = 0; i < node.nodes.length; i++)
	{
		var child = node.nodes.item(i);
		if (child.isContainer)
			depends(child);
	}
}

depends(this.parent); // Imposer la mise à jour de tous les champs du sous-formulaire dans le jeu de données

this.rawValue = referenceValues(getDataNode(this)); // Coder le contenu du nud de données dans un format délimité par tabulation
]]>
                    </revision>
                </revisions>
            </script>
            <script id="xmlCollection" lang="JavaScript">
                <latest_revision>2</latest_revision>
                <oldest_revision>0</oldest_revision>
                    <revisions>
                        <revision>
                            <value>2</value>
                            <![CDATA[
//{{Start Generated Content//
/*{{<name>xmlCollection</name>}}*/
var is705ViewerRequired = false;
var useLegacyXMLFormat = true;
var collection;
//End Generated Content}}//

// Initialiser le contenu du code à barres
this.rawValue = " ";

// Fonction de dépendance. Seule la liste des nuds de modèles de formulaire résolus sera transmise,
// et non le modèle de formulaire entier (xfa.form).
function depends(node)
{
    if(node.className != "variables")
    {
        var stack = new Array();

        var currentNode = node;
        stack.push(currentNode);

        while (stack.length > 0)
        {
            currentNode = stack.pop();
            if(currentNode == null) continue;

            for(var i = 0; i < currentNode.nodes.length; ++i)
            {
                stack.push(currentNode.nodes.item(i));
            }
        }
    }
}

if(collection != null)
{
    // Créer une collection des objets de formulaire sélectionnés, mais dans le contexte du modèle de formulaire
    var formModelNodeList = new Array();

    var dataNodes = collection.evaluate();
    for(var i = 0; i < dataNodes.length; ++i)
    {
        formModelNodeList.push(xfa.form.formNodes(dataNodes.item(i)));
    }

    // Créez une dépendance obligatoire entre le code à barres et ses nuds de modèle
    // de formulaire dans sa collection
    while(formModelNodeList.length > 0)
    {
        var nodeList = formModelNodeList.pop();
        for(var i = 0; i < nodeList.length; ++i)
        {
            depends(nodeList.item(i));
        }
    }

    // Encode the collection data as barcode content
    if(useLegacyXMLFormat == true)
    {
        this.rawValue = xfa.datasets.data.saveFilteredXML(collection.evaluate());
    }
    else
    {
        this.rawValue = xfa.record.saveFilteredXML(collection.evaluate());
    }
}

// Le contrôle de validité final est effectué à partir d'ici, non pas par souci d'efficacité, mais pour des raisons de cohérence et d'exactitude
if (is705ViewerRequired && xfa.host.version < 7.05)
{
    this.rawValue = " ";
}
]]>
                        </revision>
                        <revision>
                            <value>1</value>
                            <![CDATA[
//{{Start Generated Content//
var is705ViewerRequired = false;
var useLegacyXMLFormat = true;
var collection;
//End Generated Content}}//

// La mise à jour du code à barres n'est pas automatique en cas de modification des valeurs remplies.
// Pour contourner le problème, il suffit d'ajouter une fonction récursive qui vérifie tous les champs dans le noeud donné.
function depends(node)
{
    if(node.className != "variables")
    {
        var stack = new Array();

        var currentNode = node;
        stack.push(currentNode);

        while (stack.length > 0)
        {
            currentNode = stack.pop();
            if(currentNode == null) continue;

            for(var i = 0; i < currentNode.nodes.length; ++i)
            {
                stack.push(currentNode.nodes.item(i));
            }
        }
    }
}

// Initialiser le contenu du code à barres
this.rawValue = " ";

// Imposer la mise à jour de tous les champs du formulaire dans le jeu de données
depends(xfa.form);

if(collection != null)
{
    if(useLegacyXMLFormat == true)
    {
        this.rawValue = xfa.datasets.data.saveFilteredXML(collection.evaluate());
    }
    else
    {
        this.rawValue = xfa.record.saveFilteredXML(collection.evaluate());
    }
}
// Le contrôle de validité final est effectué à partir d'ici, non pas par souci d'efficacité, mais pour des raisons de cohérence et d'exactitude
if (is705ViewerRequired && xfa.host.version < 7.05)
{
    this.rawValue = " ";
}
]]>
                        </revision>
                        <revision>
                           <value>0</value>
                            <![CDATA[
//{{Start Generated Content//
var is705ViewerRequired = false;
var useLegacyXMLFormat = true;
var collection;
//End Generated Content}}//

// La mise à jour du code à barres n'est pas automatique en cas de modification des valeurs remplies.
// Pour contourner le problème, il suffit d'ajouter une fonction récursive qui vérifie tous les champs dans le noeud donné.
function depends(node)
{
    if(node.className != "variables")
    {
        for (var i = 0; i < node.nodes.length; ++i)
        {
            var child = node.nodes.item(i);
            if (child.isContainer)
            {
                depends(child);
            }
        }
    }
}

// Initialiser le contenu du code à barres
this.rawValue = " ";

// Imposer la mise à jour de tous les champs du formulaire dans le jeu de données
depends(xfa.form);

if(collection != null)
{
    if(useLegacyXMLFormat == true)
    {
        this.rawValue = xfa.datasets.data.saveFilteredXML(collection.evaluate());
    }
    else
    {
        this.rawValue = xfa.record.saveFilteredXML(collection.evaluate());
    }
}
// Le contrôle de validité final est effectué à partir d'ici, non pas par souci d'efficacité, mais pour des raisons de cohérence et d'exactitude
if (is705ViewerRequired && xfa.host.version < 7.05)
{
    this.rawValue = " ";
}
]]>
                        </revision>
                    </revisions>
            </script>
            <script id="delimCollection" lang="JavaScript">
                <latest_revision>2</latest_revision>
                <oldest_revision>0</oldest_revision>
                <revisions>
                    <revision>
                        <value>2</value>
                            <![CDATA[
//{{Start Generated Content//
/*{{<name>delimCollection</name>}}*/
var includeFieldNames = true;
var includeLabel = true;
var labelID = "Label";
var is705ViewerRequired = false;
var collection;
var delimiter = '\t';
//End Generated Content}}//

// Initialiser le contenu du code à barres
this.rawValue = " ";

// Codage des données dans le code à barres

var fieldNames = new Array();
var fieldValues = new Array();

function encode(node)
{
    var barcodeLabel = this.caption.value.text.value;
    if (includeLabel == true && barcodeLabel.length > 0)
    {
        fieldNames.push(labelID);
        fieldValues.push(barcodeLabel);
    }

    if(collection != null)
    {
        // Créer un réseau de tous les nuds enfant dans le formulaire
        var entireFormNodes = new Array();
        collectChildNodes(xfa.datasets.data, entireFormNodes);

        // Créer un réseau de tous les nuds dans la collection
        var collectionNodes = new Array();

        var nodes = collection.evaluate();
        for(var i = 0; i < nodes.length; ++i)
        {
            collectionNodes.push(nodes.item(i));
        }

        // Si le formulaire possède deux champs au moins avec le même nom, les noms des 
        // parents sont combinés à des numéros d'indice de ces champs et de leurs
        // parents pour les différencier. Or, comme l'espace dans les
        // codes à barres est optimisé, ces données supplémentaires sont utilisées
        // dans les noms d'objet uniquement en cas de besoin.
        resolveDuplicates(collectionNodes, entireFormNodes, fieldNames);

        for(var j = 0; j < nodes.length; ++j)
        {
            // Passer en revue la collection et cumuler la valeur de chaque objet de formulaire
            accumulateFieldValues(nodes.item(j));
        }
    }

    var encodedContent = new String();

    var values = fieldValues.join(delimiter);
    values += delimiter;

    if (includeFieldNames == true)
    {
        if(delimiter != '\n')
        {
            var fields = fieldNames.join(delimiter);
            fields += delimiter;

            encodedContent = fields + "\n" + values;
        }
    }
    else
    {
        encodedContent = values;
    }

    return encodedContent;
}


// Si deux noeuds au moins possèdent le même nom, différenciez-les
// en utilisant des numéros d'indice et/ou les noms des parents.
function resolveDuplicates(encodingNodes, entireFormNodes, fieldNameArray)
{
    for(var i = 0; i < encodingNodes.length; ++i)
    {
        fieldNameArray.push(makeUniqueName(encodingNodes[i], 
            entireFormNodes, encodingNodes[i].name));
    }

    // Supprimer les 0 en indice si aucun champ ne possède le même nom
    // au même niveau
    compact(fieldNameArray);
}


// Rechercher des doublons dans tout le formulaire d'un nud donné et proposer un
// nom permettant de distinguer le nud actuel du reste, grâce à une combinaison
// de numéros d'indice et de nom(s) parent.
function makeUniqueName(node, formNodeArray, nodeName)
{
    for(var i = 0; i < formNodeArray.length; ++i)
    {
        var compNode = formNodeArray[i];

        var nodeSOM = node.somExpression;
        var compNodeSOM = compNode.somExpression;

        if((nodeSOM != compNodeSOM) && (nodeName == compNode.name))
        {
            if(nodeSOM.substring(0, nodeSOM.lastIndexOf(".")) == 
                compNodeSOM.substring(0, compNodeSOM.lastIndexOf(".")))
            {
                var diffLevelNodeFound = false;
                for(var ii = i; !diffLevelNodeFound  && ii < formNodeArray.length; ++ii)
                {
                    compNode = formNodeArray[ii];
                    compNodeSOM = compNode.somExpression;

                    if((nodeSOM != compNodeSOM) && (nodeName == compNode.name) &&
                        (nodeSOM.substring(0, nodeSOM.lastIndexOf(".")) != 
                        compNodeSOM.substring(0, compNodeSOM.lastIndexOf("."))))
                    {
                        diffLevelNodeFound = true;
                    }
                }

                if(!diffLevelNodeFound )
                {
                    // Les deux nuds sont au même niveau. Il est inutile d'ajouter les noms
                    // des parents des nuds actuels pour les différencier.
                    // Utilisez juste le suffixe.
                    nodeName += "[" + node.index + "]";
                }
            }
            else
            {
                if(node.parent != null)
                {
                    var parentArray = new Array();
                    for(var j = 0; j < formNodeArray.length; ++j)
                    {
                        var parentNode = formNodeArray[j].parent;
                        if(parentNode != null)
                        {
                            parentArray.push(parentNode);
                        }
                    }

                    nodeName = makeUniqueName(node.parent, parentArray, node.parent.name).concat(
                        ".", nodeName, "[", node.index, "]");
                }
            }
        }
    }

    return nodeName;
}


// Supprimer les 0 en indice si aucun champ ne possède le même nom
// au même niveau
function compact(nameArray)
{
    for(var i = 0; i < nameArray.length; ++i)
    {
        var fieldName = nameArray[i];
        if(fieldName.substring(fieldName.lastIndexOf("[") + 1, fieldName.lastIndexOf("]")) == "0")
        {
            var fieldNameNoSubscript = fieldName.substring(0, fieldName.lastIndexOf("["));
            var isFound = false;

            for(var j = 0; !isFound && j < nameArray.length; ++j)
            {
                if(nameArray[j] != nameArray[i])
                {
                    var comparedFieldName = nameArray[j];

                    if(fieldNameNoSubscript ==
                        comparedFieldName.substring(0, comparedFieldName.lastIndexOf("[")))
                    {
                        isFound = true;
                    }
                }
            }

            if(!isFound)
            {
                nameArray.splice(i, 1, fieldNameNoSubscript);
            }
        }
    }
}


// Ajouter des valeurs d'objet à un conteneur local
function accumulateFieldValues(node)
{
    if(node.value != null)
    {
        fieldValues.push(node.value);
    }
    else
    {
        fieldValues.push("");
    }
}


// Fonction de dépendance. Seule la liste des nuds de modèles de formulaire résolus sera transmise,
// et non le modèle de formulaire entier (xfa.form).
function depends(node)
{
    if(node.className != "variables")
    {
        var stack = new Array();

        var currentNode = node;
        stack.push(currentNode);

        while (stack.length > 0)
        {
            currentNode = stack.pop();
            if(currentNode == null) continue;

            for(var i = 0; i < currentNode.nodes.length; ++i)
            {
                stack.push(currentNode.nodes.item(i));
            }
        }
    }
}


// Convertir une liste de nuds XFA en réseau de noeuds JavaScript
function collectChildNodes(node, childNodeArray)
{
    if(node.className == "dataGroup")
    {
        var itemCount = node.nodes.length;
        for (var i = 0; i < itemCount; ++i)
        {
            collectChildNodes(node.nodes.item(i), childNodeArray);
        }
    }
    else
    {
        childNodeArray.push(node);
    }
}

if(collection != null)
{
    // Créer une collection des objets de formulaire sélectionnés, mais dans le contexte du modèle de formulaire
    var formModelNodeList = new Array();
    var dataNodes = collection.evaluate();

    for(var i = 0; i < dataNodes.length; ++i)
    {
        formModelNodeList.push(xfa.form.formNodes(dataNodes.item(i)));
    }

    // Créez une dépendance obligatoire entre le code à barres et ses nuds de modèle
    // de formulaire dans sa collection
    while(formModelNodeList.length > 0)
    {
        var nodeList = formModelNodeList.pop();
        for(var i = 0; i < nodeList.length; ++i)
        {
            depends(nodeList.item(i));
        }
    }

    // Encode the collection data as barcode content
    this.rawValue = encode(collection);
}

// Le contrôle de validité final est effectué à partir d'ici, non pas par souci d'efficacité, mais pour des raisons de cohérence et d'exactitude
if (is705ViewerRequired && xfa.host.version < 7.05)
{
    this.rawValue = " ";
}
]]>
                    </revision>
                    <revision>
                        <value>1</value>
                        <![CDATA[
//{{Start Generated Content//
var includeFieldNames = true;
var includeLabel = true;
var labelID = "Label";
var is705ViewerRequired = false;
var collection;
//End Generated Content}}//

/////////////////////////////////////////////////////////////////////////////////////////////
// The followings are utility functions to make the barcode update automatically once 
// one of its encoding objects is updated.
/////////////////////////////////////////////////////////////////////////////////////////////

var formModelNodeList = new Array();
var dataNodes = collection.evaluate();

for(var i = 0; i < dataNodes.length; ++i)
{
    formModelNodeList.push(xfa.form.formNodes(dataNodes.item(i)));
}

// Fonction de dépendance. Seule la liste des nuds de modèles de formulaire résolus sera transmise,
// et non le fichier xfa.form entier.
function depends(node)
{
    if(node.className != "variables")
    {
        for (var i = 0; i < node.nodes.length; ++i)
        {
            var child = node.nodes.item(i);
            if (child.isContainer)
            {
                depends(child);
            }
        }
    }
}

/////////////////////////////////////////////////////////////////////////////////////
// Encoding data into the barcode
/////////////////////////////////////////////////////////////////////////////////////

var fields = new String();
var values = new String();

var isLabelAdded = false;
function referenceValues(collection)
{
    var barcodeLabel = this.caption.value.text.value;
    if (includeLabel == true && barcodeLabel.length > 0)
    {
        fields = labelID;
        values = barcodeLabel;
        
        isLabelAdded = true;
    }

    var nodes = collection.evaluate();

    var itemCount = nodes.length;
    for(var j = 0; j < itemCount; ++j)
    {
        // Passer en revue la collection et cumuler
        // le nom de champ et la valeur de chaque objet de formulaire
        traverse(nodes.item(j));
    }

    if (includeFieldNames == true)
    {
        // Retourner les noms des champs si c'est la préférence de l'utilisateur
        return fields + "\n" + values;
    }
    else
    {
        // Sinon, retournez juste les valeurs
        return values;
    }
}

function traverse(node)
{
    if(isLabelAdded == true)
    {
        fields += "\t";
        values += "\t";

        isLabelAdded = false;
    }

    fields += node.name + "\t";

    var nodeValue = node.value;
    if(nodeValue != null)
    {
        values += node.value + "\t";
    }
    else
    {
        values += "\t";
    }
}

// Initialiser le contenu du code à barres
this.rawValue = " ";

// Créez une dépendance obligatoire entre le code à barres et ses nuds de modèle
// de formulaire dans sa collection
while(formModelNodeList.length > 0)
{
    var nodeList = formModelNodeList.pop();
    for(var i = 0; i < nodeList.length; ++i)
    {
        depends(nodeList.item(i));
    }
}

if(collection != null)
{
    // Coder le contenu du nud de données dans un format délimité par tabulation
    this.rawValue = referenceValues(collection);
}

// Le contrôle de validité final est effectué à partir d'ici, non pas par souci d'efficacité, mais pour des raisons de cohérence et d'exactitude
if (is705ViewerRequired && xfa.host.version < 7.05)
{
    this.rawValue = " ";
}
]]>
                    </revision>
                    <revision>
                        <value>0</value>
                        <![CDATA[
//{{Start Generated Content//
var includeFieldNames = true;
var includeLabel = true;
var labelID = "Label";
var is705ViewerRequired = false;
var collection;
//End Generated Content}}//

var fields = new String();
var values = new String();

var isLabelAdded = false;
function referenceValues(collection)
{
    var barcodeLabel = this.caption.value.text.value;
    if (includeLabel == true && barcodeLabel.length > 0)
    {
        fields = labelID;
        values = barcodeLabel;
        
        isLabelAdded = true;
    }

    var nodes = collection.evaluate();

    var itemCount = nodes.length;
    for(var j = 0; j < itemCount; ++j)
    {   
        // Passer en revue la collection et cumuler
        // le nom de champ et la valeur de chaque objet de formulaire
        traverse(nodes.item(j));
    }

    if (includeFieldNames == true)
    { 
        // Retourner les noms des champs si c'est la préférence de l'utilisateur
        return fields + "\n" + values;
    }
    else
    {
        // Sinon, retournez juste les valeurs
        return values;
    }
}

function traverse(node)
{
    if(isLabelAdded == true)
    {
        fields += "\t";
        values += "\t";

        isLabelAdded = false;
    }

    fields += node.name + "\t";
        
    var nodeValue = node.value;
    if(nodeValue != null)
    {
        values += node.value + "\t";
    }
    else
    {
        values += "\t";
    }
}

// La mise à jour du code à barres n'est pas automatique en cas de modification des valeurs remplies.
// Pour contourner le problème, il suffit d'ajouter une fonction récursive qui vérifie tous les champs dans le noeud donné.
function depends(node)
{
    if(node.className != "variables")
    {
        for (var i = 0; i < node.nodes.length; ++i)
        {
            var child = node.nodes.item(i);
            if (child.isContainer)
            {
                depends(child);
            }
        }
    }
}

// Initialiser le contenu du code à barres
this.rawValue = " ";

// Imposer la mise à jour de tous les champs du formulaire dans le jeu de données
depends(xfa.form);

if(collection != null)
{
    // Coder le contenu du nud de données dans un format délimité par tabulation
    this.rawValue = referenceValues(collection);
}
// Le contrôle de validité final est effectué à partir d'ici, non pas par souci d'efficacité, mais pour des raisons de cohérence et d'exactitude
if (is705ViewerRequired && xfa.host.version < 7.05)
{
    this.rawValue = " ";
}
]]>
                    </revision>
                </revisions>
            </script>
            <script id="custom" lang="JavaScript">
                <latest_revision>1</latest_revision>
                <oldest_revision>0</oldest_revision>
                <revisions>
                    <revision>
                        <value>1</value>
                        <![CDATA[
//{{Start Generated Content//
var is705ViewerRequired = false;
//End Generated Content}}//

function createBarcodeContent()
{
    // A FAIRE : codez le contenu de votre code à barres ici
    var barcodeContent = " ";
    return barcodeContent;
}

// Affecter le contenu au code à barres. 
// Remarque : n'attribuez pas une valeur nulle au code à barres. 
// Sinon, il sera vide.
if(createBarcodeContent() != null)
{
    this.rawValue = createBarcodeContent();
}
else
{
    this.rawValue = " ";
}
// Le contrôle de validité final est effectué à partir d'ici, non pas par souci d'efficacité, mais pour des raisons de cohérence et d'exactitude
if (is705ViewerRequired && xfa.host.version < 7.05)
{
    this.rawValue = " ";
}
]]>
                    </revision>
                    <revision>
                        <value>0</value>
                        <![CDATA[
//
// Insérez le script personnalisé à cet endroit.
//
]]>
                    </revision>
                </revisions>
            </script>
        </scripts>
    </PaperFormsBarcode>
</BarcodeData>
