<?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}}//

// Funktionen, mit denen der Barcode automatisch aktualisiert
// wird, wenn eines seiner Kodierungsobjekte aktualisiert wird.
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));
            }
        }
    }
}

// Angeben, dass alle Felder des Formulars im Datensatz aktualisiert werden müssen
depends(xfa.form); 

// Daten-Node als XML kodieren
if(useLegacyXMLFormat == true)
{
    this.rawValue = xfa.datasets.saveXML();
}
else
{
   this.rawValue = xfa.record.saveXML();
}

// Letzte Überprüfung, findet hier nicht aus Effizienzgründen statt, sondern um Konsistenz und Richtigkeit zu gewährleisten
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}}//

// Der Barcode wird bei einer Änderung der ausgefüllten Werte nicht automatisch aktualisiert.
// In diesem Fall kann eine rekursive Funktion hinzugefügt werden, die alle Felder einer bestimmten Node durchläuft.
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));
            }
        }
    }
}

// Angeben, dass alle Felder des Formulars im Datensatz aktualisiert werden müssen
depends(xfa.form); 

// Daten-Node als XML kodieren
if(useLegacyXMLFormat == true)
{
    this.rawValue = xfa.datasets.saveXML();
}
else
{
   this.rawValue = xfa.record.saveXML();
}
// Letzte Überprüfung, findet hier nicht aus Effizienzgründen statt, sondern um Konsistenz und Richtigkeit zu gewährleisten
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}}//

// Der Barcode wird bei einer Änderung der ausgefüllten Werte nicht automatisch aktualisiert.
// In diesem Fall kann eine rekursive Funktion hinzugefügt werden, die alle Felder einer bestimmten Node durchläuft.
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);
            }
        }
    }
}

// Angeben, dass alle Felder des Formulars im Datensatz aktualisiert werden müssen
depends(xfa.form); 

// Daten-Node als XML kodieren
if(useLegacyXMLFormat == true)
{
    this.rawValue = xfa.datasets.saveXML();
}
else
{
   this.rawValue = xfa.record.saveXML();
}
// Letzte Überprüfung, findet hier nicht aus Effizienzgründen statt, sondern um Konsistenz und Richtigkeit zu gewährleisten
if (is705ViewerRequired && xfa.host.version < 7.05)
{
    this.rawValue = " ";
}
]]>
                    </revision>
                    <revision>
                        <value>0</value>
                        <![CDATA[
// Der Barcode wird bei einer Änderung der ausgefüllten Werte nicht automatisch aktualisiert.
// In diesem Fall kann eine rekursive Funktion hinzugefügt werden, die alle Felder einer bestimmten Node durchläuft.
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); // Angeben, dass alle Felder des Formulars im Datensatz aktualisiert werden müssen

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}}//

// Barcode-Inhalt initialisieren
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;
}

// Funktionen, mit denen der Barcode automatisch aktualisiert
// wird, wenn eines seiner Kodierungsobjekte aktualisiert wird.
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));
            }
        }
    }
}

// Angeben, dass alle Felder des Teilformulars im Datensatz aktualisiert werden müssen
depends(this.parent); 

var nodeData = getDataNode(this);
if(nodeData != null)
{
    this.rawValue = nodeData.saveXML();
}

// Letzte Überprüfung, findet hier nicht aus Effizienzgründen statt, sondern um Konsistenz und Richtigkeit zu gewährleisten
if (is705ViewerRequired && xfa.host.version < 7.05)
{
    this.rawValue = " ";
}
]]>
                    </revision>
                    <revision>
                        <value>2</value>
                        <![CDATA[
//{{Start Generated Content//
var is705ViewerRequired = false;
//End Generated Content}}//

// Der Barcode wird bei einer Änderung der ausgefüllten Werte nicht automatisch aktualisiert.
// In diesem Fall kann eine rekursive Funktion hinzugefügt werden, die alle Felder einer bestimmten Node durchläuft.
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));
            }
        }
    }
}

// Die Node, deren Daten kodiert werden
var encoded = this.parent;
while (encoded != null)
{
    if (encoded.className == "subform")
    {
        // Zu kodierende Node wurde gefunden
        break;
    }

    encoded = encoded.parent;
}

// Barcode-Inhalt initialisieren
this.rawValue = " ";

// Angeben, dass alle Felder des Teilformulars im Datensatz aktualisiert werden müssen
depends(encoded); 

if (encoded != null)
{
    // Daten-Node abrufen, die der Node entspricht, deren Daten kodiert werden
    var encodedDataNode = encoded.dataNode; 
    if(encodedDataNode != null)
    {
        // Daten-Node als XML kodieren
        this.rawValue = encodedDataNode.saveXML();
    }
}
// Letzte Überprüfung, findet hier nicht aus Effizienzgründen statt, sondern um Konsistenz und Richtigkeit zu gewährleisten
if (is705ViewerRequired && xfa.host.version < 7.05)
{
    this.rawValue = " ";
}
]]>
                    </revision>
                    <revision>
                        <value>1</value>
                        <![CDATA[
//{{Start Generated Content//
var is705ViewerRequired = false;
//End Generated Content}}//

// Der Barcode wird bei einer Änderung der ausgefüllten Werte nicht automatisch aktualisiert.
// In diesem Fall kann eine rekursive Funktion hinzugefügt werden, die alle Felder einer bestimmten Node durchläuft.
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);
            }
        }
    }
}

// Die Node, deren Daten kodiert werden
var encoded = this.parent;
while (encoded != null)
{
    if (encoded.className == "subform")
    {
        // Zu kodierende Node wurde gefunden
        break;
    }

    encoded = encoded.parent;
}

// Barcode-Inhalt initialisieren
this.rawValue = " ";

// Angeben, dass alle Felder des Teilformulars im Datensatz aktualisiert werden müssen
depends(encoded); 

if (encoded != null)
{
    // Daten-Node abrufen, die der Node entspricht, deren Daten kodiert werden
    var encodedDataNode = encoded.dataNode; 
    if(encodedDataNode != null)
    {
        // Daten-Node als XML kodieren
        this.rawValue = encodedDataNode.saveXML();
    }
}
// Letzte Überprüfung, findet hier nicht aus Effizienzgründen statt, sondern um Konsistenz und Richtigkeit zu gewährleisten
if (is705ViewerRequired && xfa.host.version < 7.05)
{
    this.rawValue = " ";
}
]]>
                    </revision>
                    <revision>
                        <value>0</value>
                        <![CDATA[
// Der Barcode wird bei einer Änderung der ausgefüllten Werte nicht automatisch aktualisiert.
// In diesem Fall kann eine rekursive Funktion hinzugefügt werden, die alle Felder einer bestimmten Node durchläuft.
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; // Die Node, deren Daten kodiert werden

while (encoded != null)
{
	if (encoded.className == "subform")
		// Zu kodierende Node wurde gefunden
		break;

	encoded = encoded.parent;
}

if (encoded != null)
{
	var encodedDataNode = encoded.dataNode; // Daten-Node abrufen, die der Node entspricht, deren Daten kodiert werden
	if(encodedDataNode != null)
	{
		depends(encoded); // Angeben, dass alle in der zu kodierenden Node enthaltenen Felder im Datensatz aktualisiert werden müssen
		
		this.rawValue = encodedDataNode.saveXML(); // XML der Daten-Node kodieren
	}
}
]]>
                    </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}}//

// Barcode-Inhalt initialisieren
this.rawValue = " ";

// Daten werden in Barcode kodiert

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);
    }

    // Ein Array aller Child-Nodes im Formular erstellen
    var entireFormNodes = new Array();
    collectChildNodes(node, entireFormNodes);

    // Wenn das Formular zwei oder mehr gleichnamige Felder hat, werden diese Felder anhand
    // der übergeordneten Felder sowie anhand der Indexnummern
    // der Felder und der übergeordneten Felder unterschieden. Um im Barcode
    // möglichst wenig Platz in Anspruch zu nehmen, werden solche
    // zusätzlichen Daten in den Objektnamen nur bei Bedarf verwendet.
    resolveDuplicates(entireFormNodes, entireFormNodes, fieldNames);

    // Die Formularobjekte durchlaufen und den Wert jedes Formularobjekts sammeln
    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;
}


// Wenn es zwei oder mehr gleichnamige Nodes gibt, lassen diese sich anhand
// der Indexnummern und/oder anhand der Namen der übergeordneten Nodes unterscheiden.
function resolveDuplicates(encodingNodes, entireFormNodes, fieldNameArray)
{
    for(var i = 0; i < encodingNodes.length; ++i)
    {
        fieldNameArray.push(makeUniqueName(encodingNodes[i],
            entireFormNodes, encodingNodes[i].name));
    }

    // Index-Nullen entfernen, wenn kein anderes Feld auf derselben Ebene
    // denselben Namen trägt
    compact(fieldNameArray);
}


// Bei einer bestimmten Node nach Duplikaten suchen (im ganzen 
// Formular) und einen Namen angeben, der die aktuelle Node von den anderen unterscheidet,
// z.B. mit einer Kombination aus Indexnummern und Namen übergeordneter Nodes.
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 )
                {
                    // Die beiden Nodes befinden sich auf derselben Ebene. Die Namen der übergeordneten Nodes müssen der aktuellen Node nicht
                    // zur besseren Unterscheidung hinzugefügt werden.
                    // Stattdessen genügt das Suffix.
                    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;
}


// Index-Nullen entfernen, wenn kein anderes Feld auf derselben Ebene
// denselben Namen trägt
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);
            }
        }
    }
}


// Objektwerte in lokalen Container einfügen
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("");
        }
    }
}


// XFA-Node-Liste in ein JavaScript-Node-Array konvertieren
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);
    }
}


// Funktionen, mit denen der Barcode automatisch aktualisiert
// wird, wenn eines seiner Kodierungsobjekte aktualisiert wird.
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));
            }
        }
    }
}

// Angeben, dass alle Felder des Formulars im Datensatz aktualisiert werden müssen
depends(xfa.form);

// Inhalt der Daten-Node im tabulatorgetrennten Format kodieren
this.rawValue = encode(xfa.datasets.data);

// Letzte Überprüfung, findet hier nicht aus Effizienzgründen statt, sondern um Konsistenz und Richtigkeit zu gewährleisten
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;
    }

    // Anhand der Benutzereinstellungen die Feldnamen
    // und die Datenwerte der Child-Nodes sammeln
    traverse(node);

    if (includeFieldNames == true)
    { 
        // Feldnamen zurückgeben, falls der Benutzer dies wünscht
        return fields + "\n" + values;
    }
    else
    {
        // Anderenfalls einfach die Werte zurückgeben
        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";
        }
    }
}

// Der Barcode wird bei einer Änderung der ausgefüllten Werte nicht automatisch aktualisiert.
// In diesem Fall kann eine rekursive Funktion hinzugefügt werden, die alle Felder einer bestimmten Node durchläuft.
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));
            }
        }
    }
}

// Angeben, dass alle Felder des Formulars im Datensatz aktualisiert werden müssen
depends(xfa.form);

// Inhalt der Daten-Node im tabulatorgetrennten Format kodieren
this.rawValue = referenceValues(xfa.datasets.data);
// Letzte Überprüfung, findet hier nicht aus Effizienzgründen statt, sondern um Konsistenz und Richtigkeit zu gewährleisten
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;
    }

    // Anhand der Benutzereinstellungen die Feldnamen
    // und die Datenwerte der Child-Nodes sammeln
    traverse(node);

    if (includeFieldNames == true)
    { 
        // Feldnamen zurückgeben, falls der Benutzer dies wünscht
        return fields + "\n" + values;
    }
    else
    {
        // Anderenfalls einfach die Werte zurückgeben
        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";
        }
    }
}

// Der Barcode wird bei einer Änderung der ausgefüllten Werte nicht automatisch aktualisiert.
// In diesem Fall kann eine rekursive Funktion hinzugefügt werden, die alle Felder einer bestimmten Node durchläuft.
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);
            }
        }
    }
}

// Angeben, dass alle Felder des Formulars im Datensatz aktualisiert werden müssen
depends(xfa.form);

// Inhalt der Daten-Node im tabulatorgetrennten Format kodieren
this.rawValue = referenceValues(xfa.datasets.data);
// Letzte Überprüfung, findet hier nicht aus Effizienzgründen statt, sondern um Konsistenz und Richtigkeit zu gewährleisten
if (is705ViewerRequired && xfa.host.version < 7.05)
{
    this.rawValue = " ";
}
]]>
                    </revision>
                    <revision>
                        <value>0</value>
                        <![CDATA[
// Benutzereinstellung: Auf FALSE einstellen, wenn keine Feldnamen eingeschlossen werden sollen.
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)
	{ 
		// Feldnamen zurückgeben, falls der Benutzer dies wünscht
		return fields + "\n" + values;
	}
	else
	{
		// Anderenfalls einfach die Werte zurückgeben
		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;
	}
}

// Der Barcode wird bei einer Änderung der ausgefüllten Werte nicht automatisch aktualisiert.
// In diesem Fall kann eine rekursive Funktion hinzugefügt werden, die alle Felder einer bestimmten Node durchläuft.
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); // Angeben, dass alle Felder des Formulars im Datensatz aktualisiert werden müssen

this.rawValue = referenceValues(xfa.datasets.data); // Inhalt der Daten-Node im tabulatorgetrennten Format kodieren
]]>
                    </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}}//

// Barcode-Inhalt initialisieren
this.rawValue = " ";

// Daten in Barcode kodieren

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);
    }

    // Ein Array aller Child-Nodes im Formular erstellen
    var entireFormNodes = new Array();
    collectChildNodes(xfa.datasets.data, entireFormNodes);

    // Ein Array aller Child-Nodes im Teilformular erstellen
    var subFormNodes = new Array();
    collectChildNodes(node, subFormNodes);

    // Wenn das Formular zwei oder mehr gleichnamige Felder hat, werden diese Felder anhand
    // der übergeordneten Felder sowie anhand der Indexnummern
    // der Felder und der übergeordneten Felder unterschieden. Um im Barcode
    // möglichst wenig Platz in Anspruch zu nehmen, werden solche
    // zusätzlichen Daten in den Objektnamen nur bei Bedarf verwendet.
    resolveDuplicates(subFormNodes, entireFormNodes, fieldNames);

    // Die Formularobjekte durchlaufen und den Wert jedes Formularobjekts sammeln
    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;
}


// Wenn es zwei oder mehr gleichnamige Nodes gibt, lassen diese sich anhand
// der Indexnummern und/oder anhand der Namen der übergeordneten Nodes unterscheiden.
function resolveDuplicates(encodingNodes, entireFormNodes, fieldNameArray)
{
    for(var i = 0; i < encodingNodes.length; ++i)
    {
        fieldNameArray.push(makeUniqueName(encodingNodes[i], 
            entireFormNodes, encodingNodes[i].name));
    }

    // Index-Nullen entfernen, wenn kein anderes Feld auf derselben Ebene
    // denselben Namen trägt
    compact(fieldNameArray);
}


// Bei einer bestimmten Node nach Duplikaten suchen (im ganzen 
// Formular) und einen Namen angeben, der die aktuelle Node von den anderen unterscheidet,
// z.B. mit einer Kombination aus Indexnummern und Namen übergeordneter Nodes.
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 )
                {
                    // Die beiden Nodes befinden sich auf derselben Ebene. Die Namen der übergeordneten Nodes müssen der aktuellen Node nicht
                    // zur besseren Unterscheidung hinzugefügt werden.
                    // Stattdessen genügt das Suffix.
                    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;
}


// Index-Nullen entfernen, wenn kein anderes Feld auf derselben Ebene
// denselben Namen trägt
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);
            }
        }
    }
}


// Objektwerte in lokalen Container einfügen
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("");
        }
    }
}


// XFA-Node-Liste in ein JavaScript-Node-Array konvertieren
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);
    }
}


// Daten-Node des Teilformulars abrufen
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;
}

// Funktionen, mit denen der Barcode automatisch aktualisiert
// wird, wenn eines seiner Kodierungsobjekte aktualisiert wird.
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));
            }
        }
    }
}

// Angeben, dass alle Felder des Teilformulars im Datensatz aktualisiert werden müssen
depends(this.parent);

var nodeData = getDataNode(this);
if(nodeData != null)
{
    // Inhalt der Daten-Node im tabulatorgetrennten Format kodieren
    this.rawValue = encode(nodeData);
}

// Letzte Überprüfung, findet hier nicht aus Effizienzgründen statt, sondern um Konsistenz und Richtigkeit zu gewährleisten
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;
    }

    // Die Node, deren Daten kodiert werden sollen
    var encoded = childNode.parent;
    while (encoded != null)
    {
        if (encoded.className == "subform")
        {
            // Zu kodierende Node wurde gefunden
            break;
        }

        encoded = encoded.parent;
    }

    if (encoded != null)
    {
        // Daten-Node abrufen, die der Node entspricht, deren Daten kodiert werden sollen
        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;
    }

    // Anhand der Benutzereinstellungen die Feldnamen
    // und die Datenwerte der Child-Nodes sammeln
    traverse(node);

    if (includeFieldNames == true)
    {
        // Feldnamen zurückgeben, falls der Benutzer dies wünscht
        return fields + "\n" + values;
    }
    else
    {
        // Anderenfalls einfach die Werte zurückgeben
        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";
        }
    }
}

/// Der Barcode wird bei einer Änderung der ausgefüllten Werte nicht automatisch aktualisiert.
// In diesem Fall kann eine rekursive Funktion hinzugefügt werden, die alle Felder einer bestimmten Node durchläuft.
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));
            }
        }
    }
}

// Barcode-Inhalt initialisieren
this.rawValue = " ";

// Angeben, dass alle Felder des Teilformulars im Datensatz aktualisiert werden müssen
depends(this.parent);

var nodeData = getDataNode(this);
if(nodeData != null)
{
    // Inhalt der Daten-Node im tabulatorgetrennten Format kodieren
    this.rawValue = referenceValues(nodeData);
}
// Letzte Überprüfung, findet hier nicht aus Effizienzgründen statt, sondern um Konsistenz und Richtigkeit zu gewährleisten
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;
    }

    // Die Node, deren Daten kodiert werden sollen
    var encoded = childNode.parent;
    while (encoded != null)
    {
        if (encoded.className == "subform")
        {
            // Zu kodierende Node wurde gefunden
            break;
        }

        encoded = encoded.parent;
    }

    if (encoded != null)
    {
        // Daten-Node abrufen, die der Node entspricht, deren Daten kodiert werden sollen
        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;
    }

    // Anhand der Benutzereinstellungen die Feldnamen
    // und die Datenwerte der Child-Nodes sammeln
    traverse(node);

    if (includeFieldNames == true)
    {
        // Feldnamen zurückgeben, falls der Benutzer dies wünscht
        return fields + "\n" + values;
    }
    else
    {
        // Anderenfalls einfach die Werte zurückgeben
        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";
        }
    }
}

// Der Barcode wird bei einer Änderung der ausgefüllten Werte nicht automatisch aktualisiert.
// In diesem Fall kann eine rekursive Funktion hinzugefügt werden, die alle Felder einer bestimmten Node durchläuft.
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);
            }
        }
    }
}

// Barcode-Inhalt initialisieren
this.rawValue = " ";

// Angeben, dass alle Felder des Teilformulars im Datensatz aktualisiert werden müssen
depends(this.parent);

var nodeData = getDataNode(this);
if(nodeData != null)
{
    // Inhalt der Daten-Node im tabulatorgetrennten Format kodieren
    this.rawValue = referenceValues(nodeData);
}
// Letzte Überprüfung, findet hier nicht aus Effizienzgründen statt, sondern um Konsistenz und Richtigkeit zu gewährleisten
if (is705ViewerRequired && xfa.host.version < 7.05)
{
    this.rawValue = " ";
}
]]>
                    </revision>
                    <revision>
                        <value>0</value>
                        <![CDATA[
// Benutzereinstellung: Auf FALSE einstellen, wenn keine Feldnamen eingeschlossen werden sollen.
var includeFieldNames = true; 

var includeGUID = false;

function getDataNode(childNode)
{
	if (childNode == null)
		return null;

	var encoded = childNode.parent; // Die Node, deren Daten kodiert werden sollen
	while (encoded != null)
	{
		if (encoded.className == "subform")
			// Zu kodierende Node wurde gefunden
			break;

		encoded = encoded.parent;
	}

	if (encoded != null)
		return encoded.dataNode; // Daten-Node abrufen, die der Node entspricht, deren Daten kodiert werden sollen

	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)
	{
		// Feldnamen zurückgeben, falls der Benutzer dies wünscht
		return fields + "\n" + values;
	}
	else
	{
		// Anderenfalls einfach die Werte zurückgeben
		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;
	}
}

// Der Barcode wird bei einer Änderung der ausgefüllten Werte nicht automatisch aktualisiert.
// In diesem Fall kann eine rekursive Funktion hinzugefügt werden, die alle Felder einer bestimmten Node durchläuft.
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); // Angeben, dass alle Felder des Teilformulars im Datensatz aktualisiert werden müssen

this.rawValue = referenceValues(getDataNode(this)); // Inhalt der Daten-Node im tabulatorgetrennten Format kodieren
]]>
                    </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}}//

// Barcode-Inhalt initialisieren
this.rawValue = " ";

// Abhängigkeitsfunktion. Nur die Node-Liste des aufgelösten Formularmodells wird übergeben
// und nicht das gesamte Formularmodell (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)
{
    // Eine Sammlung der ausgewählten Formularobjekte erstellen, aber im Formularmodellkontext
    var formModelNodeList = new Array();

    var dataNodes = collection.evaluate();
    for(var i = 0; i < dataNodes.length; ++i)
    {
        formModelNodeList.push(xfa.form.formNodes(dataNodes.item(i)));
    }

    // Jetzt eine Abhängigkeit zwischen dem Barcode und den Formularmodell-Nodes in seiner
    // Sammlung erzwingen
    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());
    }
}

// Letzte Überprüfung, findet hier nicht aus Effizienzgründen statt, sondern um Konsistenz und Richtigkeit zu gewährleisten
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}}//

// Der Barcode wird bei einer Änderung der ausgefüllten Werte nicht automatisch aktualisiert.
// In diesem Fall kann eine rekursive Funktion hinzugefügt werden, die alle Felder einer bestimmten Node durchläuft.
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));
            }
        }
    }
}

// Barcode-Inhalt initialisieren
this.rawValue = " ";

// Angeben, dass alle Felder des Formulars im Datensatz aktualisiert werden müssen
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());
    }
}
// Letzte Überprüfung, findet hier nicht aus Effizienzgründen statt, sondern um Konsistenz und Richtigkeit zu gewährleisten
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}}//

// Der Barcode wird bei einer Änderung der ausgefüllten Werte nicht automatisch aktualisiert.
// In diesem Fall kann eine rekursive Funktion hinzugefügt werden, die alle Felder einer bestimmten Node durchläuft.
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);
            }
        }
    }
}

// Barcode-Inhalt initialisieren
this.rawValue = " ";

// Angeben, dass alle Felder des Formulars im Datensatz aktualisiert werden müssen
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());
    }
}
// Letzte Überprüfung, findet hier nicht aus Effizienzgründen statt, sondern um Konsistenz und Richtigkeit zu gewährleisten
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}}//

// Barcode-Inhalt initialisieren
this.rawValue = " ";

// Daten werden in Barcode kodiert

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)
    {
        // Ein Array aller Child-Nodes im Formular erstellen
        var entireFormNodes = new Array();
        collectChildNodes(xfa.datasets.data, entireFormNodes);

        // Ein Array aller Nodes in der Sammlung erstellen
        var collectionNodes = new Array();

        var nodes = collection.evaluate();
        for(var i = 0; i < nodes.length; ++i)
        {
            collectionNodes.push(nodes.item(i));
        }

        // Wenn das Formular zwei oder mehr gleichnamige Felder hat, werden diese Felder anhand
        // der übergeordneten Felder sowie anhand der Indexnummern
        // der Felder und der übergeordneten Felder unterschieden. Um im Barcode
        // möglichst wenig Platz in Anspruch zu nehmen, werden solche
        // zusätzlichen Daten in den Objektnamen nur bei Bedarf verwendet.
        resolveDuplicates(collectionNodes, entireFormNodes, fieldNames);

        for(var j = 0; j < nodes.length; ++j)
        {
            // Die Sammlung durchlaufen und den Wert jedes Formularobjekts sammeln
            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;
}


// Wenn es zwei oder mehr gleichnamige Nodes gibt, lassen diese sich anhand
// der Indexnummern und/oder anhand der Namen der übergeordneten Nodes unterscheiden.
function resolveDuplicates(encodingNodes, entireFormNodes, fieldNameArray)
{
    for(var i = 0; i < encodingNodes.length; ++i)
    {
        fieldNameArray.push(makeUniqueName(encodingNodes[i], 
            entireFormNodes, encodingNodes[i].name));
    }

    // Index-Nullen entfernen, wenn kein anderes Feld auf derselben Ebene
    // denselben Namen trägt
    compact(fieldNameArray);
}


// Bei einer bestimmten Node nach Duplikaten suchen (im ganzen 
// Formular) und einen Namen angeben, der die aktuelle Node von den anderen unterscheidet,
// z.B. mit einer Kombination aus Indexnummern und Namen übergeordneter Nodes.
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 )
                {
                    // Die beiden Nodes befinden sich auf derselben Ebene. Die Namen der übergeordneten Nodes müssen der aktuellen Node nicht
                    // zur besseren Unterscheidung hinzugefügt werden.
                    // Stattdessen genügt das Suffix.
                    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;
}


// Index-Nullen entfernen, wenn kein anderes Feld auf derselben Ebene
// denselben Namen trägt
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);
            }
        }
    }
}


// Objektwerte in lokalen Container einfügen
function accumulateFieldValues(node)
{
    if(node.value != null)
    {
        fieldValues.push(node.value);
    }
    else
    {
        fieldValues.push("");
    }
}


// Abhängigkeitsfunktion. Nur die Node-Liste des aufgelösten Formularmodells wird übergeben
// und nicht das gesamte Formularmodell (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));
            }
        }
    }
}


// XFA-Node-Liste in ein JavaScript-Node-Array konvertieren
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)
{
    // Eine Sammlung der ausgewählten Formularobjekte erstellen, aber im Formularmodellkontext
    var formModelNodeList = new Array();
    var dataNodes = collection.evaluate();

    for(var i = 0; i < dataNodes.length; ++i)
    {
        formModelNodeList.push(xfa.form.formNodes(dataNodes.item(i)));
    }

    // Jetzt eine Abhängigkeit zwischen dem Barcode und den Formularmodell-Nodes in seiner
    // Sammlung erzwingen
    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);
}

// Letzte Überprüfung, findet hier nicht aus Effizienzgründen statt, sondern um Konsistenz und Richtigkeit zu gewährleisten
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)));
}

// Abhängigkeitsfunktion. Nur die Node-Liste des aufgelösten Formularmodells wird übergeben
// und nicht das gesamte xfa.form.
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)
    {
        // Die Sammlung durchlaufen und den Feldnamen
        // und Wert jedes Formularobjekts sammeln
        traverse(nodes.item(j));
    }

    if (includeFieldNames == true)
    {
        // Feldnamen zurückgeben, falls der Benutzer dies wünscht
        return fields + "\n" + values;
    }
    else
    {
        // Anderenfalls einfach die Werte zurückgeben
        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";
    }
}

// Barcode-Inhalt initialisieren
this.rawValue = " ";

// Jetzt eine Abhängigkeit zwischen dem Barcode und den Formularmodell-Nodes in seiner
// Sammlung erzwingen
while(formModelNodeList.length > 0)
{
    var nodeList = formModelNodeList.pop();
    for(var i = 0; i < nodeList.length; ++i)
    {
        depends(nodeList.item(i));
    }
}

if(collection != null)
{
    // Inhalt der Daten-Node im tabulatorgetrennten Format kodieren
    this.rawValue = referenceValues(collection);
}

// Letzte Überprüfung, findet hier nicht aus Effizienzgründen statt, sondern um Konsistenz und Richtigkeit zu gewährleisten
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)
    {   
        // Die Sammlung durchlaufen und den Feldnamen
        // und Wert jedes Formularobjekts sammeln
        traverse(nodes.item(j));
    }

    if (includeFieldNames == true)
    { 
        // Feldnamen zurückgeben, falls der Benutzer dies wünscht
        return fields + "\n" + values;
    }
    else
    {
        // Anderenfalls einfach die Werte zurückgeben
        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";
    }
}

// Der Barcode wird bei einer Änderung der ausgefüllten Werte nicht automatisch aktualisiert.
// In diesem Fall kann eine rekursive Funktion hinzugefügt werden, die alle Felder einer bestimmten Node durchläuft.
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);
            }
        }
    }
}

// Barcode-Inhalt initialisieren
this.rawValue = " ";

// Angeben, dass alle Felder des Formulars im Datensatz aktualisiert werden müssen
depends(xfa.form);

if(collection != null)
{
    // Inhalt der Daten-Node im tabulatorgetrennten Format kodieren
    this.rawValue = referenceValues(collection);
}
// Letzte Überprüfung, findet hier nicht aus Effizienzgründen statt, sondern um Konsistenz und Richtigkeit zu gewährleisten
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()
{
    // ZU ERLEDIGEN: Barcode-Inhalt hier kodieren
    var barcodeContent = " ";
    return barcodeContent;
}

// Dem Barcode einen Inhalt zuweisen. 
// Hinweis: Weisen Sie dem Barcode keinen Nullwert zu. 
// Andernfalls wird der Barcode leer angezeigt.
if(createBarcodeContent() != null)
{
    this.rawValue = createBarcodeContent();
}
else
{
    this.rawValue = " ";
}
// Letzte Überprüfung, findet hier nicht aus Effizienzgründen statt, sondern um Konsistenz und Richtigkeit zu gewährleisten
if (is705ViewerRequired && xfa.host.version < 7.05)
{
    this.rawValue = " ";
}
]]>
                    </revision>
                    <revision>
                        <value>0</value>
                        <![CDATA[
//
// Benutzerdefiniertes Skript hier einfügen
//
]]>
                    </revision>
                </revisions>
            </script>
        </scripts>
    </PaperFormsBarcode>
</BarcodeData>
