<?xml version="1.0" encoding="UTF-8" ?>
<!-- created at 2025-12-17 14:00:57 -->
<UANodeSet xmlns="http://opcfoundation.org/UA/2011/03/UANodeSet.xsd" xmlns:uax="http://opcfoundation.org/UA/2008/02/Types.xsd">
	<Extensions>
		<atvise Version="3.13"/>
	</Extensions>
	<NamespaceUris>
		<Uri>http://www.atvise.com/atServer/UA/</Uri>
	</NamespaceUris>
	<Aliases>
		<!-- data types -->
		<Alias Alias="Boolean">i=1</Alias>
		<Alias Alias="SByte">i=2</Alias>
		<Alias Alias="Byte">i=3</Alias>
		<Alias Alias="Int16">i=4</Alias>
		<Alias Alias="UInt16">i=5</Alias>
		<Alias Alias="Int32">i=6</Alias>
		<Alias Alias="UInt32">i=7</Alias>
		<Alias Alias="Int64">i=8</Alias>
		<Alias Alias="UInt64">i=9</Alias>
		<Alias Alias="Float">i=10</Alias>
		<Alias Alias="Double">i=11</Alias>
		<Alias Alias="String">i=12</Alias>
		<Alias Alias="DateTime">i=13</Alias>
		<Alias Alias="ByteString">i=15</Alias>
		<Alias Alias="XmlElement">i=16</Alias>
		<Alias Alias="NodeId">i=17</Alias>
		<Alias Alias="LocalizedText">i=21</Alias>
		<!-- references -->
		<Alias Alias="Organizes">i=35</Alias>
		<Alias Alias="HasEventSource">i=36</Alias>
		<Alias Alias="HasModellingRule">i=37</Alias>
		<Alias Alias="HasTypeDefinition">i=40</Alias>
		<Alias Alias="HasSubtype">i=45</Alias>
		<Alias Alias="HasProperty">i=46</Alias>
		<Alias Alias="HasComponent">i=47</Alias>
		<Alias Alias="HasNotifier">i=48</Alias>
		<Alias Alias="HasCondition">i=9006</Alias>
		<Alias Alias="HasHistoricalConfiguration">i=56</Alias>
		<!-- types -->
		<Alias Alias="BaseDataType">i=24</Alias>
		<Alias Alias="BaseObjectType">i=58</Alias>
		<Alias Alias="FolderType">i=61</Alias>
		<Alias Alias="BaseVariableType">i=62</Alias>
		<Alias Alias="BaseDataVariableType">i=63</Alias>
		<Alias Alias="PropertyType">i=68</Alias>
		<Alias Alias="AlarmConditionStateType">ns=1;i=1001</Alias>
		<!-- modelling rules -->
		<Alias Alias="New">i=78</Alias>
		<Alias Alias="Shared">i=79</Alias>
		<Alias Alias="SharedExclusive">i=336</Alias>
		<!-- other -->
		<Alias Alias="Server">i=2253</Alias>
		<Alias Alias="Objects">i=85</Alias>
	</Aliases>
	<UAObject NodeId="ns=1;s=SYSTEM" BrowseName="1:SYSTEM">
		<DisplayName Locale="en">SYSTEM</DisplayName>
		<Description Locale="en">SYSTEM</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">Objects</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise ExportedNodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.UPLOAD" ExportedBrowseName="1:UPLOAD" Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY" BrowseName="1:LIBRARY">
		<DisplayName Locale="en">LIBRARY</DisplayName>
		<Description Locale="en">LIBRARY</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT" BrowseName="1:PROJECT">
		<DisplayName Locale="en">PROJECT</DisplayName>
		<Description Locale="en">PROJECT</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS" BrowseName="1:OBJECTDISPLAYS">
		<DisplayName Locale="en">OBJECTDISPLAYS</DisplayName>
		<Description Locale="en">OBJECTDISPLAYS</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.UPLOAD" BrowseName="1:UPLOAD">
		<DisplayName Locale="en">UPLOAD</DisplayName>
		<Description Locale="en">UPLOAD</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
	</UAObject>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.UPLOAD.Popup" BrowseName="1:Popup" DataType="XmlElement" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">Popup</DisplayName>
		<Description Locale="en">Popup</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.UPLOAD</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.Display</Reference>
		</References>
		<Value>
			<uax:XmlElement><![CDATA[<?xml version='1.0' encoding='UTF-8' standalone='no'?>
<svg xmlns:atv="http://webmi.atvise.com/2007/svgext" width="530" xmlns="http://www.w3.org/2000/svg" version="1.2" height="150" xmlns:xlink="http://www.w3.org/1999/xlink">
 <defs>
  <linearGradient gradientUnits="objectBoundingBox" id="linear_3" x1="1" y2="1" y1="-0.0183441" x2="1">
   <stop stop-opacity="0.2745098039215687" stop-color="#ffffff" offset="0"/>
   <stop stop-opacity="0" stop-color="#ffffff" offset="0.5515695067264574"/>
  </linearGradient>
  <linearGradient gradientUnits="objectBoundingBox" id="linear_0" x1="1" y2="1" y1="-0.0183441" x2="1">
   <stop stop-opacity="0.2745098039215687" stop-color="#ffffff" offset="0"/>
   <stop stop-opacity="0" stop-color="#ffffff" offset="0.5515695067264574"/>
  </linearGradient>
 </defs>
 <metadata>
  <atv:gridconfig gridstyle="lines" width="5" enabled="true" height="5"/>
  <atv:snapconfig width="5" enabled="true" height="5"/>
 </metadata>
 <foreignObject x="330" id="id_1" width="20" y="20" height="38">
  <body xmlns="http://www.w3.org/1999/xhtml">
   <form>
    <input style="visibility: hidden;" type="file" id="file"/>
   </form>
  </body>
 </foreignObject>
 <svg atv:refpy="43.504" x="3.911" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.button" id="select" width="80" transform="matrix(2.0455,0,0,1.2857,0,0)" atv:refpx="278.632" y="7.777" height="30">
  <atv:argument name="label" value="T{Select PDF}"/>
  <atv:argument name="focusStrokeColor" value="SYSTEM.GLOBALS.Colors.ButtonStroke"/>
  <atv:overwrite id="id_6" width="161.64" transform="matrix(0.4889,0,0,0.7778,0,0)" height="36.571"/>
  <atv:overwrite x="71.82" id="button_symbol" transform="matrix(0.4889,0,0,0.7778,0,0)" y="9.286"/>
  <atv:overwrite x="81.82" id="button_label" transform="matrix(0.4889,0,0,0.7778,0,0)" y="23.786"/>
  <atv:overwrite id="button_stroke" width="159.64" transform="matrix(0.4889,0,0,0.7778,0,0)" height="34.571"/>
  <atv:overwrite id="button_bg" width="161.64" transform="matrix(0.4889,0,0,0.7778,0,0)" height="36.571"/>
  <atv:overwrite id="outer_frame" width="163.64" transform="matrix(0.4889,0,0,0.7778,0,0)" height="38.571"/>
 </svg>
 <svg atv:refpy="108.927" x="3.911" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.button" id="write" width="80" transform="matrix(2.0455,0,0,1.2857,0,0)" atv:refpx="149.758" y="48.222" height="30">
  <atv:argument name="label" value="T{Save PDF to Server}"/>
  <atv:argument name="focusStrokeColor" value="SYSTEM.GLOBALS.Colors.ButtonStroke"/>
  <atv:overwrite id="id_6" width="161.64" transform="matrix(0.4889,0,0,0.7778,0,0)" height="36.571"/>
  <atv:overwrite x="71.82" id="button_symbol" transform="matrix(0.4889,0,0,0.7778,0,0)" y="9.286"/>
  <atv:overwrite x="81.82" id="button_label" transform="matrix(0.4889,0,0,0.7778,0,0)" y="23.786"/>
  <atv:overwrite id="button_stroke" width="159.64" transform="matrix(0.4889,0,0,0.7778,0,0)" height="34.571"/>
  <atv:overwrite id="button_bg" width="161.64" transform="matrix(0.4889,0,0,0.7778,0,0)" height="36.571"/>
  <atv:overwrite id="outer_frame" width="163.64" transform="matrix(0.4889,0,0,0.7778,0,0)" height="38.571"/>
 </svg>
 <text font-family="Arial" fill="#000000" atv:refpy="20" x="185" visibility="visible" id="selectMessage" font-size="16" atv:refpx="239.209" y="24.5">T{No File Selected}</text>
 <text font-family="Arial" fill="#000000" atv:refpy="81" x="185.5" visibility="hidden" id="saveMessage" font-size="16" atv:refpx="231.884" y="85.5">T{saveMessage}</text>
 <text font-family="Arial" fill="#000000" atv:refpy="40" x="184" visibility="visible" id="selectFileSize" font-size="16" atv:refpx="202.388" y="44.5">T{0kB}</text>
 <!-- <rect fill="url(#linear_3)" atv:bindbr="1,1" atv:refpy="1.909" stroke-width="2" stroke="$STROKENORMAL$" x="340" id="id_4" ry="$ROUND$" width="86" atv:refpx="387.778" y="-30" height="26" rx="$ROUND$" atv:bindtl="0,0"/> -->
 <rect fill="url(#linear_3)" atv:bindbr="1,1" atv:refpy="-3.091" stroke-width="2" stroke="$STROKENORMAL$" x="345" id="id_4" width="86" atv:refpx="392.778" y="-35" height="26" atv:bindtl="0,0"/>
 <rect fill="#f8f8f8" atv:refpy="130" stroke-width="2" stroke="#e8e8e8" x="20" id="progressBarBG" width="490" atv:refpx="265" y="120" height="20"/>
 <rect fill="#188600" atv:refpy="130" stroke-width="2" stroke="none" x="20.5" visibility="hidden" id="progress" width="489" atv:refpx="20" y="120.5" height="19"/>
 <script type="text/ecmascript"><![CDATA[//Global params
var dataString = "";
var dataArr = [];
var fileName = "";

function ProgressBar(chunkCount, atvId) {
	var min = 0;
	var max = chunkCount;
	var atvId = atvId;

	webMI.gfx.setScaleX(atvId, min);
	webMI.gfx.setVisible(atvId, null);

	this.set = function(value) {
		var factor = webMI.translate(value, min, max, 0, 1);
		webMI.gfx.setScaleX(atvId, factor);
	};
}

//Init
webMI.gfx.setText("selectMessage", "No PDF selected");

// select and read file
var fileInput = document.getElementById("file"),
	readFile = function() {
		if (fileInput.files.length != 0) {
			// extra check if there is a file selected
			var reader = new FileReader();
			reader.fileName = fileInput.files[0].name;
			reader.onload = function(fileLoadedEvent) {
				if (reader.fileName.indexOf(".pdf") != -1) {
					var pdfSize = fileLoadedEvent.target.result.length / 1000;
					if (pdfSize <= Infinity) {
						fileName = reader.fileName;
						dataString = fileLoadedEvent.target.result;
						webMI.gfx.setText("selectMessage", fileLoadedEvent.target.fileName);
						webMI.gfx.setText("selectFileSize", pdfSize + "kB");
					} else {
						alert("PDF Size is " + pdfSize + "kB, only files smaller than Infinity are allowed. Please try again");
						return;
					}
				} else {
					alert("Only PDF allowed, please try again");
					return;
				}
			};
			reader.readAsBinaryString(fileInput.files[0]); // start reading the file. When it is done, calls the onload event defined above.
		}
	};
fileInput.addEventListener("change", readFile);

webMI.addEvent("select", "click", function(e) {
	document.getElementById("file").click();
});

// Save Files to Server - Only works for files smaller than Infinity (maybe a bit less)
webMI.addEvent("write", "click", function(e) {
	var value = true;
	return (function(value) {
		if (dataString != "" && fileName != "") {
			// write file to server

			function getChunks(binaryString) {
				var fileSize = binaryString.length;
				var chunkSize = 128 * 1024; // 128 Kilobytes
				var offset = 0;
				var chunks = [];

				var chunkCount = Math.ceil(fileSize / chunkSize);

				for (offset = 0; offset <= chunkCount; offset++) {
					var byteOffset = offset * chunkSize;
					var chunk = binaryString.slice(byteOffset, byteOffset + chunkSize);

					if (chunk) {
						chunks.push(chunk);
					}
				}

				return chunks;
			}

			var dataChunks = getChunks(dataString);
			var uid = Number(new Date());
			var requestIndex = 0;
			makeRequest(dataChunks, uid);
			var progressBar = new ProgressBar(dataChunks.length, "progress");

			function makeRequest(dataChunks, uid) {
				// Check if we need to break out of recursion
				if (requestIndex === dataChunks.length) {
					return;
				}

				var httpRequest = new XMLHttpRequest();
				var data = dataChunks[requestIndex];
				var lastChunk = requestIndex === dataChunks.length - 1;

				if (!httpRequest) {
					alert("Cannot create an XMLHTTP instance");
					return false;
				}

				httpRequest.onreadystatechange = execFollowUpRequest;
				httpRequest.open("POST", "../../scripts/uploadfile");
				httpRequest.setRequestHeader("Content-Type", "multipart/form-data");		

				var requestParams =
					"data=" +
					encodeURIComponent(encodeURI(data)) +
					"&path=PDF\\" +
					fileName +
					"&uid=" +
					uid +
					"&index=" +
					requestIndex +
					"&lastchunk=" +
					lastChunk;
				httpRequest.send(requestParams);

				function execFollowUpRequest() {
					if (httpRequest.readyState === XMLHttpRequest.DONE) {
						if (httpRequest.status === 200) {
							requestIndex++;
							progressBar.set(requestIndex);
							if (requestIndex === dataChunks.length) {
								// I'm putting this into a timeout so the progress bar has
								// time to finish drawing before the alert is displayed.
								setTimeout(function() {
									alert(httpRequest.responseText);
								}, 300);
							}

							makeRequest(dataChunks, uid);
						} else {
							alert("There was a problem with the request.");
						}
					}
				}
			}

		} else {
			alert("Please Select a File first");
		}
	})(value);
});

webMI.addOnunload(function(e) {
	webMI.trigger.fire("refreshDocumentTable", true);
});

]]]]><![CDATA[></script>
</svg>
]]></uax:XmlElement>
		</Value>
	</UAVariable>
	<UAObject NodeId="ns=1;s=SYSTEM" BrowseName="1:SYSTEM">
		<DisplayName Locale="en">SYSTEM</DisplayName>
		<Description Locale="en">SYSTEM</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">Objects</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise ExportedNodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/scripts/uploadfile" ExportedBrowseName="1:uploadfile" Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY" BrowseName="1:LIBRARY">
		<DisplayName Locale="en">LIBRARY</DisplayName>
		<Description Locale="en">LIBRARY</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT" BrowseName="1:PROJECT">
		<DisplayName Locale="en">PROJECT</DisplayName>
		<Description Locale="en">PROJECT</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES" BrowseName="1:RESOURCES">
		<DisplayName Locale="en">RESOURCES</DisplayName>
		<Description Locale="en">RESOURCES</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/scripts" BrowseName="1:scripts">
		<DisplayName Locale="en">scripts</DisplayName>
		<Description Locale="en">scripts</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/scripts/uploadfile" BrowseName="1:uploadfile" DataType="XmlElement" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">uploadfile</DisplayName>
		<Description Locale="en">uploadfile</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/scripts</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.ScriptCode</Reference>
		</References>
		<Value>
			<uax:XmlElement><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
<script>
  <metadata>
    <priority>0</priority>
  </metadata>
  <parameter name="request" type="http.request" trigger="false" relative="false" value=""/>
  <parameter name="response" type="http.response" trigger="false" relative="false" value=""/>
  <code><![CDATA[var objToWrite = request.postvalues;
var fileData = decodeURI(objToWrite.data);

var uid = objToWrite.uid;
var originalFilePath = objToWrite.path;
var filePath = objToWrite.path;
var filePath = filePath + uid;
var isLastChunk = objToWrite.lastchunk === "true" ? true : false;
var arrFilePath = filePath.split("\\");

var fs = new FileSystem();

//Check if Path exists, if not create Path
var directoryPath = "";
for(var i=0; i<arrFilePath.length-1; i++){
	if(i==0)directoryPath = arrFilePath[i];
	if(i!=0)directoryPath = directoryPath + "\\" + arrFilePath[i];
	if(!fs.isDirectory(arrFilePath[i])){
		fs.createDirectory(directoryPath);//add directory if it doesn't exist
	}
}

//Check if Files exists, if not create File
if(!fs.isFile(filePath)) {
	console.log("create file path " + filePath);
	fs.createFile(filePath);
} else {
	console.log("file path " + filePath + " exists already");
}

var writeMode = "";

if (objToWrite.index === "0") {
	writeMode = "output";
} else {
	writeMode = "append";
}

// Write to File
var ofs = new OutputFileStream(filePath, 'binary', writeMode);
ofs.open();
ofs.write(fileData);
ofs.close();

if (isLastChunk) {
	response.write(originalFilePath + " Saved " + fileData.length + "kB");
	fs.move(filePath, originalFilePath); // Remove uid from filename
} else {
	response.write(filePath + " Chunk saved");
}]]]]><![CDATA[></code>
</script>
]]></uax:XmlElement>
		</Value>
	</UAVariable>
	<UAObject NodeId="ns=1;s=SYSTEM" BrowseName="1:SYSTEM">
		<DisplayName Locale="en">SYSTEM</DisplayName>
		<Description Locale="en">SYSTEM</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">Objects</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise ExportedNodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/scripts" ExportedBrowseName="1:scripts" Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY" BrowseName="1:LIBRARY">
		<DisplayName Locale="en">LIBRARY</DisplayName>
		<Description Locale="en">LIBRARY</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT" BrowseName="1:PROJECT">
		<DisplayName Locale="en">PROJECT</DisplayName>
		<Description Locale="en">PROJECT</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES" BrowseName="1:RESOURCES">
		<DisplayName Locale="en">RESOURCES</DisplayName>
		<Description Locale="en">RESOURCES</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/scripts" BrowseName="1:scripts">
		<DisplayName Locale="en">scripts</DisplayName>
		<Description Locale="en">scripts</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
	</UAObject>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/scripts/uploadfile" BrowseName="1:uploadfile" DataType="XmlElement" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">uploadfile</DisplayName>
		<Description Locale="en">uploadfile</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.RESOURCES/scripts</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.ScriptCode</Reference>
		</References>
		<Value>
			<uax:XmlElement><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
<script>
  <metadata>
    <priority>0</priority>
  </metadata>
  <parameter name="request" type="http.request" trigger="false" relative="false" value=""/>
  <parameter name="response" type="http.response" trigger="false" relative="false" value=""/>
  <code><![CDATA[var objToWrite = request.postvalues;
var fileData = decodeURI(objToWrite.data);

var uid = objToWrite.uid;
var originalFilePath = objToWrite.path;
var filePath = objToWrite.path;
var filePath = filePath + uid;
var isLastChunk = objToWrite.lastchunk === "true" ? true : false;
var arrFilePath = filePath.split("\\");

var fs = new FileSystem();

//Check if Path exists, if not create Path
var directoryPath = "";
for(var i=0; i<arrFilePath.length-1; i++){
	if(i==0)directoryPath = arrFilePath[i];
	if(i!=0)directoryPath = directoryPath + "\\" + arrFilePath[i];
	if(!fs.isDirectory(arrFilePath[i])){
		fs.createDirectory(directoryPath);//add directory if it doesn't exist
	}
}

//Check if Files exists, if not create File
if(!fs.isFile(filePath)) {
	console.log("create file path " + filePath);
	fs.createFile(filePath);
} else {
	console.log("file path " + filePath + " exists already");
}

var writeMode = "";

if (objToWrite.index === "0") {
	writeMode = "output";
} else {
	writeMode = "append";
}

// Write to File
var ofs = new OutputFileStream(filePath, 'binary', writeMode);
ofs.open();
ofs.write(fileData);
ofs.close();

if (isLastChunk) {
	response.write(originalFilePath + " Saved " + fileData.length + "kB");
	fs.move(filePath, originalFilePath); // Remove uid from filename
} else {
	response.write(filePath + " Chunk saved");
}]]]]><![CDATA[></code>
</script>
]]></uax:XmlElement>
		</Value>
	</UAVariable>
	<UAObject NodeId="ns=1;s=AGENT" BrowseName="1:AGENT">
		<DisplayName Locale="en">AGENT</DisplayName>
		<Description Locale="en">AGENT</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">Objects</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=ObjectTypes.ATVISE.Server.Local</Reference>
		</References>
		<Extensions>
			<atvise ExportedNodeId="ns=1;s=AGENT.DISPLAYS.MAIN.Upload" ExportedBrowseName="1:Upload" Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=AGENT.DISPLAYS" BrowseName="1:DISPLAYS">
		<DisplayName Locale="en">DISPLAYS</DisplayName>
		<Description Locale="en">DISPLAYS</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=AGENT</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=AGENT.DISPLAYS.MAIN" BrowseName="1:MAIN">
		<DisplayName Locale="en">MAIN</DisplayName>
		<Description Locale="en">MAIN</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=AGENT.DISPLAYS</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAVariable NodeId="ns=1;s=AGENT.DISPLAYS.MAIN.Upload" BrowseName="1:Upload" DataType="XmlElement" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">Upload</DisplayName>
		<Description Locale="en">Upload</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=AGENT.DISPLAYS.MAIN</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.Display</Reference>
		</References>
		<Value>
			<uax:XmlElement><![CDATA[<?xml version='1.0' encoding='UTF-8' standalone='no'?>
<svg xmlns:atv="http://webmi.atvise.com/2007/svgext" width="1280" xmlns="http://www.w3.org/2000/svg" version="1.2" height="680" xmlns:xlink="http://www.w3.org/1999/xlink">
 <defs/>
 <metadata>
  <atv:gridconfig gridstyle="lines" width="20" enabled="false" height="20"/>
  <atv:snapconfig width="10" enabled="false" height="10"/>
 </metadata>
 <svg atv:refpy="154.715" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.button" x="570.319" width="80" id="upload_btn" atv:refpx="652.103" y="138.673" height="30">
  <atv:argument name="label" value="T{Upload}"/>
 </svg>
 <text font-family="Arial" fill="#000088" atv:refpy="112.637" x="530.471" id="id_5" font-size="18" atv:refpx="617.125" y="118.937">PDF Upload to Server</text>
 <script type="text/ecmascript"><![CDATA[webMI.trigger.connect(
	"clicked",
	function(e) {
		webMI.display.openWindow({
			display: "SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.UPLOAD.Popup",
			extern: false,
			height: 240,
			width: 540,
			menubar: false,
			modal: false,
			movable: true,
			resizable: false,
			scrollbars: false,
			status: false,
			title: "PDF Upload",
			toolbar: false,
			query: webMI.query
		});
	},
	"upload_btn"
);
]]]]><![CDATA[></script>
</svg>
]]></uax:XmlElement>
		</Value>
	</UAVariable>
	<UAObject NodeId="ns=1;s=SYSTEM" BrowseName="1:SYSTEM">
		<DisplayName Locale="en">SYSTEM</DisplayName>
		<Description Locale="en">SYSTEM</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">Objects</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise ExportedNodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.UPLOAD.Popup" ExportedBrowseName="1:Popup" Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY" BrowseName="1:LIBRARY">
		<DisplayName Locale="en">LIBRARY</DisplayName>
		<Description Locale="en">LIBRARY</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT" BrowseName="1:PROJECT">
		<DisplayName Locale="en">PROJECT</DisplayName>
		<Description Locale="en">PROJECT</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS" BrowseName="1:OBJECTDISPLAYS">
		<DisplayName Locale="en">OBJECTDISPLAYS</DisplayName>
		<Description Locale="en">OBJECTDISPLAYS</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAObject NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.UPLOAD" BrowseName="1:UPLOAD">
		<DisplayName Locale="en">UPLOAD</DisplayName>
		<Description Locale="en">UPLOAD</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS</Reference>
			<Reference ReferenceType="HasTypeDefinition">FolderType</Reference>
		</References>
		<Extensions>
			<atvise Upstream="true"/>
		</Extensions>
	</UAObject>
	<UAVariable NodeId="ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.UPLOAD.Popup" BrowseName="1:Popup" DataType="XmlElement" AccessLevel="103" UserAccessLevel="103" Historizing="true">
		<DisplayName Locale="en">Popup</DisplayName>
		<Description Locale="en">Popup</Description>
		<References>
			<Reference ReferenceType="HasComponent" IsForward="false">ns=1;s=SYSTEM.LIBRARY.PROJECT.OBJECTDISPLAYS.UPLOAD</Reference>
			<Reference ReferenceType="HasTypeDefinition">ns=1;s=VariableTypes.ATVISE.Display</Reference>
		</References>
		<Value>
			<uax:XmlElement><![CDATA[<?xml version='1.0' encoding='UTF-8' standalone='no'?>
<svg xmlns:atv="http://webmi.atvise.com/2007/svgext" width="530" xmlns="http://www.w3.org/2000/svg" version="1.2" height="150" xmlns:xlink="http://www.w3.org/1999/xlink">
 <defs>
  <linearGradient gradientUnits="objectBoundingBox" id="linear_3" x1="1" y2="1" y1="-0.0183441" x2="1">
   <stop stop-opacity="0.2745098039215687" stop-color="#ffffff" offset="0"/>
   <stop stop-opacity="0" stop-color="#ffffff" offset="0.5515695067264574"/>
  </linearGradient>
  <linearGradient gradientUnits="objectBoundingBox" id="linear_0" x1="1" y2="1" y1="-0.0183441" x2="1">
   <stop stop-opacity="0.2745098039215687" stop-color="#ffffff" offset="0"/>
   <stop stop-opacity="0" stop-color="#ffffff" offset="0.5515695067264574"/>
  </linearGradient>
 </defs>
 <metadata>
  <atv:gridconfig gridstyle="lines" width="5" enabled="true" height="5"/>
  <atv:snapconfig width="5" enabled="true" height="5"/>
 </metadata>
 <foreignObject x="330" id="id_1" width="20" y="20" height="38">
  <body xmlns="http://www.w3.org/1999/xhtml">
   <form>
    <input style="visibility: hidden;" type="file" id="file"/>
   </form>
  </body>
 </foreignObject>
 <svg atv:refpy="43.504" x="3.911" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.button" id="select" width="80" transform="matrix(2.0455,0,0,1.2857,0,0)" atv:refpx="278.632" y="7.777" height="30">
  <atv:argument name="label" value="T{Select PDF}"/>
  <atv:argument name="focusStrokeColor" value="SYSTEM.GLOBALS.Colors.ButtonStroke"/>
  <atv:overwrite id="id_6" width="161.64" transform="matrix(0.4889,0,0,0.7778,0,0)" height="36.571"/>
  <atv:overwrite x="71.82" id="button_symbol" transform="matrix(0.4889,0,0,0.7778,0,0)" y="9.286"/>
  <atv:overwrite x="81.82" id="button_label" transform="matrix(0.4889,0,0,0.7778,0,0)" y="23.786"/>
  <atv:overwrite id="button_stroke" width="159.64" transform="matrix(0.4889,0,0,0.7778,0,0)" height="34.571"/>
  <atv:overwrite id="button_bg" width="161.64" transform="matrix(0.4889,0,0,0.7778,0,0)" height="36.571"/>
  <atv:overwrite id="outer_frame" width="163.64" transform="matrix(0.4889,0,0,0.7778,0,0)" height="38.571"/>
 </svg>
 <svg atv:refpy="108.927" x="3.911" xlink:href="SYSTEM.LIBRARY.ATVISE.OBJECTDISPLAYS.Advanced.button" id="write" width="80" transform="matrix(2.0455,0,0,1.2857,0,0)" atv:refpx="149.758" y="48.222" height="30">
  <atv:argument name="label" value="T{Save PDF to Server}"/>
  <atv:argument name="focusStrokeColor" value="SYSTEM.GLOBALS.Colors.ButtonStroke"/>
  <atv:overwrite id="id_6" width="161.64" transform="matrix(0.4889,0,0,0.7778,0,0)" height="36.571"/>
  <atv:overwrite x="71.82" id="button_symbol" transform="matrix(0.4889,0,0,0.7778,0,0)" y="9.286"/>
  <atv:overwrite x="81.82" id="button_label" transform="matrix(0.4889,0,0,0.7778,0,0)" y="23.786"/>
  <atv:overwrite id="button_stroke" width="159.64" transform="matrix(0.4889,0,0,0.7778,0,0)" height="34.571"/>
  <atv:overwrite id="button_bg" width="161.64" transform="matrix(0.4889,0,0,0.7778,0,0)" height="36.571"/>
  <atv:overwrite id="outer_frame" width="163.64" transform="matrix(0.4889,0,0,0.7778,0,0)" height="38.571"/>
 </svg>
 <text font-family="Arial" fill="#000000" atv:refpy="20" x="185" visibility="visible" id="selectMessage" font-size="16" atv:refpx="239.209" y="24.5">T{No File Selected}</text>
 <text font-family="Arial" fill="#000000" atv:refpy="81" x="185.5" visibility="hidden" id="saveMessage" font-size="16" atv:refpx="231.884" y="85.5">T{saveMessage}</text>
 <text font-family="Arial" fill="#000000" atv:refpy="40" x="184" visibility="visible" id="selectFileSize" font-size="16" atv:refpx="202.388" y="44.5">T{0kB}</text>
 <!-- <rect fill="url(#linear_3)" atv:bindbr="1,1" atv:refpy="1.909" stroke-width="2" stroke="$STROKENORMAL$" x="340" id="id_4" ry="$ROUND$" width="86" atv:refpx="387.778" y="-30" height="26" rx="$ROUND$" atv:bindtl="0,0"/> -->
 <rect fill="url(#linear_3)" atv:bindbr="1,1" atv:refpy="-3.091" stroke-width="2" stroke="$STROKENORMAL$" x="345" id="id_4" width="86" atv:refpx="392.778" y="-35" height="26" atv:bindtl="0,0"/>
 <rect fill="#f8f8f8" atv:refpy="130" stroke-width="2" stroke="#e8e8e8" x="20" id="progressBarBG" width="490" atv:refpx="265" y="120" height="20"/>
 <rect fill="#188600" atv:refpy="130" stroke-width="2" stroke="none" x="20.5" visibility="hidden" id="progress" width="489" atv:refpx="20" y="120.5" height="19"/>
 <script type="text/ecmascript"><![CDATA[//Global params
var dataString = "";
var dataArr = [];
var fileName = "";

function ProgressBar(chunkCount, atvId) {
	var min = 0;
	var max = chunkCount;
	var atvId = atvId;

	webMI.gfx.setScaleX(atvId, min);
	webMI.gfx.setVisible(atvId, null);

	this.set = function(value) {
		var factor = webMI.translate(value, min, max, 0, 1);
		webMI.gfx.setScaleX(atvId, factor);
	};
}

//Init
webMI.gfx.setText("selectMessage", "No PDF selected");

// select and read file
var fileInput = document.getElementById("file"),
	readFile = function() {
		if (fileInput.files.length != 0) {
			// extra check if there is a file selected
			var reader = new FileReader();
			reader.fileName = fileInput.files[0].name;
			reader.onload = function(fileLoadedEvent) {
				if (reader.fileName.indexOf(".pdf") != -1) {
					var pdfSize = fileLoadedEvent.target.result.length / 1000;
					if (pdfSize <= Infinity) {
						fileName = reader.fileName;
						dataString = fileLoadedEvent.target.result;
						webMI.gfx.setText("selectMessage", fileLoadedEvent.target.fileName);
						webMI.gfx.setText("selectFileSize", pdfSize + "kB");
					} else {
						alert("PDF Size is " + pdfSize + "kB, only files smaller than Infinity are allowed. Please try again");
						return;
					}
				} else {
					alert("Only PDF allowed, please try again");
					return;
				}
			};
			reader.readAsBinaryString(fileInput.files[0]); // start reading the file. When it is done, calls the onload event defined above.
		}
	};
fileInput.addEventListener("change", readFile);

webMI.addEvent("select", "click", function(e) {
	document.getElementById("file").click();
});

// Save Files to Server - Only works for files smaller than Infinity (maybe a bit less)
webMI.addEvent("write", "click", function(e) {
	var value = true;
	return (function(value) {
		if (dataString != "" && fileName != "") {
			// write file to server

			function getChunks(binaryString) {
				var fileSize = binaryString.length;
				var chunkSize = 128 * 1024; // 128 Kilobytes
				var offset = 0;
				var chunks = [];

				var chunkCount = Math.ceil(fileSize / chunkSize);

				for (offset = 0; offset <= chunkCount; offset++) {
					var byteOffset = offset * chunkSize;
					var chunk = binaryString.slice(byteOffset, byteOffset + chunkSize);

					if (chunk) {
						chunks.push(chunk);
					}
				}

				return chunks;
			}

			var dataChunks = getChunks(dataString);
			var uid = Number(new Date());
			var requestIndex = 0;
			makeRequest(dataChunks, uid);
			var progressBar = new ProgressBar(dataChunks.length, "progress");

			function makeRequest(dataChunks, uid) {
				// Check if we need to break out of recursion
				if (requestIndex === dataChunks.length) {
					return;
				}

				var httpRequest = new XMLHttpRequest();
				var data = dataChunks[requestIndex];
				var lastChunk = requestIndex === dataChunks.length - 1;

				if (!httpRequest) {
					alert("Cannot create an XMLHTTP instance");
					return false;
				}

				httpRequest.onreadystatechange = execFollowUpRequest;
				httpRequest.open("POST", "../../scripts/uploadfile");
				httpRequest.setRequestHeader("Content-Type", "multipart/form-data");		

				var requestParams =
					"data=" +
					encodeURIComponent(encodeURI(data)) +
					"&path=PDF\\" +
					fileName +
					"&uid=" +
					uid +
					"&index=" +
					requestIndex +
					"&lastchunk=" +
					lastChunk;
				httpRequest.send(requestParams);

				function execFollowUpRequest() {
					if (httpRequest.readyState === XMLHttpRequest.DONE) {
						if (httpRequest.status === 200) {
							requestIndex++;
							progressBar.set(requestIndex);
							if (requestIndex === dataChunks.length) {
								// I'm putting this into a timeout so the progress bar has
								// time to finish drawing before the alert is displayed.
								setTimeout(function() {
									alert(httpRequest.responseText);
								}, 300);
							}

							makeRequest(dataChunks, uid);
						} else {
							alert("There was a problem with the request.");
						}
					}
				}
			}

		} else {
			alert("Please Select a File first");
		}
	})(value);
});

webMI.addOnunload(function(e) {
	webMI.trigger.fire("refreshDocumentTable", true);
});

]]]]><![CDATA[></script>
</svg>
]]></uax:XmlElement>
		</Value>
	</UAVariable>
</UANodeSet>
