<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.trainzsimulator.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Shalliwell</id>
	<title>TrainzOnline - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.trainzsimulator.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Shalliwell"/>
	<link rel="alternate" type="text/html" href="https://wiki.trainzsimulator.com/wiki/Special:Contributions/Shalliwell"/>
	<updated>2026-11-05T07:03:10Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.46.2</generator>
	<entry>
		<id>https://wiki.trainzsimulator.com/index.php?title=Class_Library&amp;diff=249</id>
		<title>Class Library</title>
		<link rel="alternate" type="text/html" href="https://wiki.trainzsimulator.com/index.php?title=Class_Library&amp;diff=249"/>
		<updated>2009-09-16T01:16:52Z</updated>

		<summary type="html">&lt;p&gt;Shalliwell: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;*[[TrainzScript Langage Reference|API Hierarchy]]&lt;br /&gt;
**[[Class GSObject|GSObject]]&lt;br /&gt;
***[[Class GameObject|GameObject]]&lt;br /&gt;
****[[Class TrainzGameObject|TrainzGameObject]]&lt;br /&gt;
*****Library&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* A class that provides the interface for a script Library asset. &lt;br /&gt;
* A library is a self-contained code module that can be accessed by the script of any other asset.&lt;br /&gt;
* Library assets allow content creators to create reusable code repositories that any script can access without having to include a duplicate source file into the asset folder.&lt;br /&gt;
* A Library class is the only way you can get an OnlineAccess object to access Planet Auran services from a Trainz script. &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Methods==&lt;br /&gt;
&lt;br /&gt;
===GetOnlineAccess===&lt;br /&gt;
{{MethodHeader|native OnlineAccess GetOnlineAccess(void)}}&lt;br /&gt;
;Parameters&lt;br /&gt;
*None&lt;br /&gt;
;Returned Value&lt;br /&gt;
*An OnlineAccess reference allowing access to Planet Auran services when online.&lt;br /&gt;
;Syntax&lt;br /&gt;
 OnlineAccess channel = GetOnlineAccess();&lt;br /&gt;
;Notes&lt;br /&gt;
*This method is the mechanism used to access Planet Auran via an OnlineAccess object from a script. &lt;br /&gt;
*Script programmers should be careful not to allow other classes access to the OnlineAccess structure, either directly or indirectly, in order to prevent asset spoofing. &lt;br /&gt;
*It is only through this private method that you can obtain an OnlineAccess object.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===GetProperties===&lt;br /&gt;
{{MethodHeader|public Soup GetProperties(void)}}&lt;br /&gt;
;Parameters&lt;br /&gt;
*None&lt;br /&gt;
;Returned Value&lt;br /&gt;
*The properties of this Library object in [[Class Soup|Soup]] format.&lt;br /&gt;
;Notes&lt;br /&gt;
*See [[Class PropertyObject#GetProperties|PropertyObject.GetProperties()]] for further details.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===LibraryCall===&lt;br /&gt;
{{MethodHeader|public string LibraryCall(string function, string[ ] Strings, GSObject[ ] Objects)}}&lt;br /&gt;
;Parameters&lt;br /&gt;
*&#039;&#039;&#039;function&#039;&#039;&#039; = A string identifier defining the Library function to be called.&lt;br /&gt;
*&#039;&#039;&#039;Strings&#039;&#039;&#039; = An array of strings to be used as determined by the script programmer.&lt;br /&gt;
*&#039;&#039;&#039;Objects&#039;&#039;&#039; = An array of [[Class GSObject|GSObjects]] to be used as determined by the script programmer. &lt;br /&gt;
;Returned Value&lt;br /&gt;
*A string to be interpreted as determined by the script programmer.&lt;br /&gt;
;Syntax&lt;br /&gt;
 string result = Codelib.LibraryCall(&amp;quot;AFunction&amp;quot;,Strings,Objects);&lt;br /&gt;
;Notes&lt;br /&gt;
*This method provides a virtual function call.&lt;br /&gt;
*It is through this method that all library calls are processed and it must be overridden if you want your library to do anything. &lt;br /&gt;
*How the arguments are used and processed is left to the library author to decide. &lt;br /&gt;
*This means that any external code using your library would need to use the function arguments as your implementation requires. &lt;br /&gt;
*If your library is going to be available for use by others, then you would need to specify and document the parameters and how to interpret any returned values.&lt;br /&gt;
*The name of the library call is specified in the function argument while parameters for the library calls are provided for through the string and GSObject arrays.&lt;br /&gt;
*Some guidelines to follow if you want your library to be robust and bullet proof:&lt;br /&gt;
**Never assume the arguments are valid. &lt;br /&gt;
**When processing the arguments, make sure they are not null before using them, there is no need to check an argument you don&#039;t use.&lt;br /&gt;
**Make sure the elements in the parameter arrays exist before trying to use them. This can be done by verifying the size of array and making sure the element that you are about to process is not null.&lt;br /&gt;
**If using the GSObject array, cast the array member to the type you are expecting and verify the cast, there are no guarantees of what the object might be. &lt;br /&gt;
**A cast will be needed to access the objects in any event as GSObject has no methods or data members. &lt;br /&gt;
**If the cast fails, the object the cast was assigned to will be null.&lt;br /&gt;
*LibraryCall() may not be the most efficient way to handle a library function call and may seem rather crude, but this is a temporary measure that will be replaced with a more elegant direct-call interface in a future version of Trainz.&lt;br /&gt;
*The current library call mechanism will still remain supported so existing library assets are not broken.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===SetProperties===&lt;br /&gt;
{{MethodHeader|public void SetProperties(Soup soup)}}&lt;br /&gt;
;Parameters&lt;br /&gt;
*[[Class Soup|Soup]] database to initialise the Library&#039;s properties.&lt;br /&gt;
;Returned Value&lt;br /&gt;
*None&lt;br /&gt;
;Notes&lt;br /&gt;
*See [[Class PropertyObject#SetProperties|PropertyObject.SetProperties()]] for further details.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Configuration &amp;amp; Examples==&lt;br /&gt;
===Library Configuration===&lt;br /&gt;
*A Library asset is defined by creating a new asset folder with a &#039;&#039;config.txt&#039;&#039; file containing these tags:&lt;br /&gt;
 kind          &amp;quot;Library&amp;quot;&lt;br /&gt;
 script        ScriptFile    // the name of the *.gs file containing the library class declaration&lt;br /&gt;
 class         ScriptClass   // the name of the library class itself&lt;br /&gt;
*Other than the standard asset tags such as kuid and username, these are the only tags required.&lt;br /&gt;
*The library script and &#039;&#039;config.txt&#039;&#039; are the only files necessary but the asset can contain other files and folders&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Client Configuration===&lt;br /&gt;
----&lt;br /&gt;
*To make use of a Library asset the calling asset must have a script of its own.&lt;br /&gt;
*The asset script will need a kuid-table reference to the Library script asset. These tags will therefore be required:&lt;br /&gt;
 script        assetScriptFile&lt;br /&gt;
 class         assetScriptClass&lt;br /&gt;
 kuid-table {&lt;br /&gt;
    codelib    &amp;lt;kuid:1234:5678&amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
*The asset script will need a variable to hold its reference to the Library and it will need to make a call to [[Class World#GetLibrary|World.GetLibrary()]] to initialise this variable.&lt;br /&gt;
*In summary these are the calls required in the calling asset script to initiate Library access:&lt;br /&gt;
 class assetScriptClass isclass whatever {&lt;br /&gt;
 &lt;br /&gt;
    // a variable for the library reference&lt;br /&gt;
    Library Codelib;        &lt;br /&gt;
 &lt;br /&gt;
    // initialise library access&lt;br /&gt;
    public void Init(Asset) {&lt;br /&gt;
       Codelib = World.GetLibrary(GetAsset().LookupKUIDTable(&amp;quot;codelib&amp;quot;));  &lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
 };&lt;br /&gt;
*The Library is loaded into Trainz and initialised when the first asset calls [[Class World#GetLibrary|World.GetLibrary()]]&lt;br /&gt;
*Subsequent calls return a reference to the Library but only one instance is ever created.&lt;br /&gt;
*This makes it possible for a Library to provide access to global data which can be shared between multiple objects.&lt;br /&gt;
*There is only one function available to access the script in a Library, LibraryCall(), any use of which returns a string result.&lt;br /&gt;
*An assignment to the GSObject[] or string[] remains valid until a new assignment is made, either by the Library or by the caller.&lt;br /&gt;
*An assignment made in the calling script becomes available to the Library on the next Library Call.&lt;br /&gt;
*An assigment made by the Library script becomes available to the Caller when the current LibraryCall returns.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Library Script Capabilities===&lt;br /&gt;
----&lt;br /&gt;
*Reference to the included methods and Library class inheritance will show that:&lt;br /&gt;
**Libraries have an Init() function which can contain code to be executed on initialisation.&lt;br /&gt;
**Libraries can create their own variables and can save them to the Session.&lt;br /&gt;
**Libraries can send and receive messages and run their own threads.&lt;br /&gt;
**Libraries can act as repositories for sound and html resources, including text via a [[Class StringTable|StringTable]] in the Library asset config.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Library Script Example===&lt;br /&gt;
----&lt;br /&gt;
*Although this code will compile it is not guaranteed to work, the intention is to demonstrate the format of a simple library script and some of the techniques that can be used.&lt;br /&gt;
*The code shows a Library script which maintains a list of all the client assets which make calls to it.&lt;br /&gt;
*The list is checked by the Library itself every ten seconds, any objects which no longer exist are removed.&lt;br /&gt;
*Calling scripts use the LibraryCall mechanism to obtain information, based both on the data supplied in the LibraryCall parameters, and on the GameObject list maintained by the Library code.&lt;br /&gt;
 include &amp;quot;Library.gs&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 class Clients isclass Library {&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color=#808080&amp;gt;// member &amp;amp; forward method declarations, global scope&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=#808080&amp;gt;// &#039;Clients&#039; holds a list of gameobjects which have made calls to this library&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=#808080&amp;gt;// if client assets make such a call in their Init() method the list will hold all client objects.&amp;lt;/font&amp;gt;&lt;br /&gt;
    GameObject[] Clients = new GameObject[0];&lt;br /&gt;
    int CountClients(void);&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color=#808080&amp;gt;// Init sets up a message handler and posts a &#039;reminder&#039; message&amp;lt;/font&amp;gt;&lt;br /&gt;
    public void Init(void) {&lt;br /&gt;
       inherited();&lt;br /&gt;
       AddHandler(me,&amp;quot;CheckClients&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;ClientHandler&amp;quot;);&lt;br /&gt;
       PostMessage(me,&amp;quot;CheckClients&amp;quot;,&amp;quot;&amp;quot;,10.0);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color=#808080&amp;gt;// ClientHandler reacts to messages by calling CountClients to check the membership &amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=#808080&amp;gt;// of the Clients list and posting a further &#039;reminder&#039; to repeat the process in 10 seconds time&amp;lt;/font&amp;gt;&lt;br /&gt;
    void ClientHandler(Message msg) {&lt;br /&gt;
       if (msg.major == &amp;quot;CheckClients&amp;quot;) CountClients();&lt;br /&gt;
       PostMessage(me,&amp;quot;CheckClients&amp;quot;,&amp;quot;&amp;quot;,10.0);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color=#808080&amp;gt;// CountClients checks that all of the members of the Clients array still exist, if&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=#808080&amp;gt;// they have been deleted from the map they are removed from the array&amp;lt;/font&amp;gt;&lt;br /&gt;
    int CountClients(void) {&lt;br /&gt;
       GameObject[] NewClientList = new GameObject[0];&lt;br /&gt;
       int n;&lt;br /&gt;
       for (n = 0; n &amp;lt; Clients.size(); n++) {&lt;br /&gt;
          if (Router.GetGameObject(Clients[n].GetId())) {&lt;br /&gt;
             NewClientList[NewClientList.size()] = Clients[n];&lt;br /&gt;
          }&lt;br /&gt;
       }&lt;br /&gt;
       int result = NewClientList.size();&lt;br /&gt;
       if (result &amp;lt; Clients.size()) {&lt;br /&gt;
          Interface.Print((Clients.size() - result) + &amp;quot; of our Clients have left&amp;quot;);&lt;br /&gt;
       }&lt;br /&gt;
       Clients = NewClientList;&lt;br /&gt;
       return result;&lt;br /&gt;
    }&lt;br /&gt;
 	&lt;br /&gt;
 &amp;lt;font color=#808080&amp;gt;// Utility method to check whether or not an object is a member of an array&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=#808080&amp;gt;// This method is available throughout the class&amp;lt;/font&amp;gt;&lt;br /&gt;
    public bool Member(GameObject[] goArray, GameObject go) {&lt;br /&gt;
       int n;&lt;br /&gt;
       bool result = false;&lt;br /&gt;
       if (goArray.size() == 0) {return result;}&lt;br /&gt;
       for (n = 0; n &amp;lt; goArray.size(); n++) {&lt;br /&gt;
          if (go == goArray[n]) {&lt;br /&gt;
             result = true;&lt;br /&gt;
             break;&lt;br /&gt;
          }&lt;br /&gt;
       }&lt;br /&gt;
       return result;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color=#808080&amp;gt;// Utility method to remove a member from an array, available throughout the class&amp;lt;/font&amp;gt;&lt;br /&gt;
    public void Remove(GameObject[] goArray, GameObject go) {&lt;br /&gt;
       int n;&lt;br /&gt;
       if (goArray.size() == 0) {return;}&lt;br /&gt;
       for (n = 0; n &amp;lt; goArray.size(); n++) {&lt;br /&gt;
          if (go == goArray[n]) {goArray[n,n+1] = null;}&lt;br /&gt;
       }&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color=#808080&amp;gt;// This is the LibraryCall method, through which client scripts issue instructions&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=#808080&amp;gt;// and receive information.&amp;lt;/font&amp;gt;&lt;br /&gt;
    public string LibraryCall(string function, string[] Strings, GSObject[] Objects) {&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color=#808080&amp;gt;    // declarations local to LibraryCall&amp;lt;/font&amp;gt;&lt;br /&gt;
       GameObject client;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color=#808080&amp;gt;    // code to execute on all calls, irrespective of function&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=#808080&amp;gt;    // This adds the Calling object to our &#039;membership&#039; list&amp;lt;/font&amp;gt;&lt;br /&gt;
       client = cast&amp;lt;GameObject&amp;gt;Objects[0];&lt;br /&gt;
       if (client and !Member(Clients,client)) Clients[Clients.size()] = client;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color=#808080&amp;gt;    // specified library call function methods&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=#808080&amp;gt;    // Return count of members&amp;lt;/font&amp;gt;&lt;br /&gt;
       if (function == &amp;quot;CountMembers&amp;quot;) {&lt;br /&gt;
          int count = CountClients();&lt;br /&gt;
          return &amp;quot;There are currently &amp;quot; + (string)count + &amp;quot; members&amp;quot;;&lt;br /&gt;
       }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color=#808080&amp;gt;   // Return &#039;membership&#039; number of Caller&amp;lt;/font&amp;gt;&lt;br /&gt;
       if (function == &amp;quot;MembershipNumber&amp;quot;) {&lt;br /&gt;
          if (client) return &amp;quot;Your membership number is &amp;quot; + (string)client.GetId();&lt;br /&gt;
          return &amp;quot;You are not a member&amp;quot;;&lt;br /&gt;
       }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color=#808080&amp;gt;    // Remove Caller from the list of members, the Caller will &#039;rejoin&#039; if any&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color=#808080&amp;gt;    // further LibraryCalls are made.&amp;lt;/font&amp;gt;&lt;br /&gt;
       if (function == &amp;quot;Resign&amp;quot;) {&lt;br /&gt;
          if (client) {&lt;br /&gt;
             Remove(Clients,client);&lt;br /&gt;
 &amp;lt;font color=#808080&amp;gt;         // Instruct the library to update its list, just in case something went wrong&amp;lt;/font&amp;gt;&lt;br /&gt;
             PostMessage(me,&amp;quot;CheckClients&amp;quot;,&amp;quot;&amp;quot;,0.0);&lt;br /&gt;
             return &amp;quot;Resignation accepted, Please rejoin soon&amp;quot;;&lt;br /&gt;
          }&lt;br /&gt;
          return &amp;quot;Non members cannot resign&amp;quot;;&lt;br /&gt;
       }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color=#808080&amp;gt;    // code to execute if &#039;function&#039; doesn&#039;t match any definition.&amp;lt;/font&amp;gt;&lt;br /&gt;
       Interface.Exception(&amp;quot;Unknown LibraryCall function: &amp;quot; + function);&lt;br /&gt;
       return &amp;quot;&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
 };&lt;br /&gt;
*To use the Library the calling object&#039;s script must include this setup. &lt;br /&gt;
*We are not using the Strings array so it won&#039;t need any members, but it must be declared nonetheless&lt;br /&gt;
*You would need several placed instances of the asset to see a meaningful result&lt;br /&gt;
 class client isclass MapObject {&lt;br /&gt;
 &lt;br /&gt;
    Library Codelib;&lt;br /&gt;
    string[] Strings = new string[0];&lt;br /&gt;
    GSObject[] Objects = new GSObject[1];&lt;br /&gt;
 &lt;br /&gt;
    public void Init(void) {&lt;br /&gt;
       inherited();&lt;br /&gt;
    &amp;lt;font color=#808080&amp;gt;// Initialise our reference to the Library&amp;lt;/font&amp;gt;&lt;br /&gt;
       Codelib = World.GetLibrary(GetAsset().LookupKUIDTable(&amp;quot;codelib&amp;quot;));&lt;br /&gt;
    &amp;lt;font color=#808080&amp;gt;// assign a reference to ourself to the Objects array&amp;lt;/font&amp;gt;&lt;br /&gt;
       Objects[0] = me;&lt;br /&gt;
    &amp;lt;font color=#808080&amp;gt;// Call all of the defined methods, printing out the result&amp;lt;/font&amp;gt;&lt;br /&gt;
       Interface.Print(Codelib.LibraryCall(&amp;quot;CountMembers&amp;quot;,Strings,Objects));&lt;br /&gt;
       Interface.Print(Codelib.LibraryCall(&amp;quot;MembershipNumber&amp;quot;,Strings,Objects));&lt;br /&gt;
       Interface.Print(Codelib.LibraryCall(&amp;quot;Resign&amp;quot;,Strings,Objects));&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
 };&lt;br /&gt;
*Remember that, once assigned, a member of either of the array parameters will persist until changed.&lt;br /&gt;
*Since there is no practical limit on the size of either array there should be little need to continuously reassign array members prior to making calls.&lt;br /&gt;
*You will need to keep a careful track of the significance of each member of the arrays.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Related Methods==&lt;br /&gt;
*[[Class World#GetLibrary|World.GetLibrary()]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Categories==&lt;br /&gt;
[[Category:Script Class]][[Category:Asset KIND]]&lt;/div&gt;</summary>
		<author><name>Shalliwell</name></author>
	</entry>
	<entry>
		<id>https://wiki.trainzsimulator.com/index.php?title=MiniBrowser&amp;diff=605</id>
		<title>MiniBrowser</title>
		<link rel="alternate" type="text/html" href="https://wiki.trainzsimulator.com/index.php?title=MiniBrowser&amp;diff=605"/>
		<updated>2009-09-15T23:58:51Z</updated>

		<summary type="html">&lt;p&gt;Shalliwell: /* Embedded Objects */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The MiniBrowser is a trivial HTML renderer used for simple layout control within the Trainz game environment. It is specifically not a replacement for a real browser (see [[Trainz Online]] instead), is not remotely standards compliant, and does not support a full range of HTML tags, if the tag isn&#039;t mentioned here then it is NOT supported. There is no javascript support ([[Scripting|TrainzScript]] is used instead.) It is used exclusively by the Trainz [[class Browser|Browser]] script object.&lt;br /&gt;
&lt;br /&gt;
Feature requests relating primarily to the MiniBrowser should be placed on the [[MiniBrowser Feature Requests]] page.&lt;br /&gt;
&lt;br /&gt;
Trainz HTML is NOT standards compliant and is best thought of as an HTML-alike chosen so users and developers are familiar with the style of syntax being used.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Supported Tags=&lt;br /&gt;
The MiniBrowser supports the following HTML tags:&lt;br /&gt;
&lt;br /&gt;
==HTML==&lt;br /&gt;
This tag wraps the entire HTML document. No parameters are supported. This tag should be at the top level of the document and should contain a single &#039;[[#BODY |BODY]]&#039; tag.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
:&amp;amp;lt;html&amp;gt;&lt;br /&gt;
::...&lt;br /&gt;
:&amp;amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==BODY==&lt;br /&gt;
This tag wraps the entire body of the HTML document. The &#039;scale&#039; parameter is provided to force the document to be rescaled to a specified number of pixels wide, but its usage is strongly discouraged. This tag should exist within the &#039;[[#HTML |HTML]]&#039; tag and may contain any number of other elements.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
:&amp;amp;lt;body scale=?&amp;gt;&lt;br /&gt;
::...&lt;br /&gt;
:&amp;amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==P (paragraph)==&lt;br /&gt;
This tag causes the contained elements to be formatted as a separate paragraph. This is similar to prefixing and suffixing the elements with a linebreak. Paragraph tag has no parameters.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
:&amp;amp;lt;p&amp;gt;...&amp;amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==BR (linebreak)==&lt;br /&gt;
A forced linebreak. BR has no parameters.&lt;br /&gt;
&lt;br /&gt;
BR is an unclosed tag, unlike XHTML there is no &amp;amp;lt;br /&amp;gt; or &amp;amp;lt;/br&amp;gt;. In fact using such a thing will most likely be interpreted as an error by the Trainz HTML parser.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
:...&amp;amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==TABLE==&lt;br /&gt;
This tag forms a table element. Any number of &amp;amp;lt;[[#TR |TR]]&amp;gt; (table row) elements may be present within the &#039;TABLE&#039; tag and that is all it should contain directly. Table height cannot be specified, this can be controlled by setting each &amp;amp;lt;[[#TR |TR]]&amp;gt; element within the table to add up to the desired table height.&lt;br /&gt;
&lt;br /&gt;
Table does NOT support the following parameters; rules, summary, align. Nor does it support the &amp;amp;lt;TH&amp;gt; element (the same effect can be achieved by making the contents of a &amp;amp;lt;[[#TD |TD]]&amp;gt; [[#B |BOLD]] or even more so by the use of [[#FONT |FONT]]). Table is best thought of as a grid, like that of a spreadsheet or a table inserted into a document. Tables are described by &amp;amp;lt;[[#TR |TR]]&amp;gt;; a row in a table and &amp;amp;lt;[[#TD |TD]]&amp;gt;; a cell in a row. &lt;br /&gt;
&lt;br /&gt;
Tables are not askew, meaning if 1 row has 3 cells then all rows will have at least 3 cells, this does not mean the coder must put at least 3 &amp;amp;lt;[[#TD |TD]]&amp;gt;s in each &amp;amp;lt;[[#TR |TR]]&amp;gt; it means when formatted for display on screen the html render will organise the table as such (as it is uniform). Furthermore, cells conform to the dimensions of their siblings; meaning a cell has the same width as the widest cell in its column (controllable by width in &amp;amp;lt;[[#TD |TD]]&amp;gt;) and the same height as the tallest cell in its row (controllable by height in &amp;amp;lt;[[#TR |TR]]&amp;gt;). This is very important to keep in mind when using tables for formatting/layout purposes.&lt;br /&gt;
&lt;br /&gt;
The documentation on &amp;amp;lt;[[#TR |TR]]&amp;gt; and &amp;amp;lt;[[#TD |TD]]&amp;gt; have more information about the use of tables in Trainz HTML. For more info and a place to try out some of these properties of tables try the [http://www.w3schools.com/tags/tag_table.asp w3schools table tag page], but remember Trainz HTML is not the same as HTML proper.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
All parameters are optional.&lt;br /&gt;
*cellpadding - specifies the minimum pixel space between the cell wall and its content. Default is 0.&lt;br /&gt;
*cellspacing - specifies the pixels between cells. Default is 0.&lt;br /&gt;
*width - specifies the pixel width of the table. If none is given the table will grow to fit its content. If width is given cell content will be wrapped if it would force table width beyond that.&lt;br /&gt;
*border - specifies the pixel width between the table and content around it. Default is 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
:&amp;amp;lt;table cellpadding=? cellspacing=? border=? width=? inherit-font&amp;gt;...&amp;amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==TR==&lt;br /&gt;
TR is Table Row. This tag forms a single horizontal row of a table. Any number of &#039;[[#TD |TD]]&#039; (table data) elements may be present within the &#039;TR&#039; tag and that is all it should directly contain. &amp;amp;lt;TR&amp;gt; does NOT support the following parameters; align, valign, char, charoff.&lt;br /&gt;
&lt;br /&gt;
All parameters are optional. Height, if specified, will limit how many pixels high this row can be, causing cells to expand in width if they were to approach this height.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
When using tables for formatting it is important to remember that cell size is dependent upon both column and row (see &amp;amp;lt;[[#TD |TD]]&amp;gt; and/or &amp;amp;lt;[[#TABLE |TABLE]]&amp;gt; for more info) thus it may be useful to consider creating a &amp;amp;lt;TR&amp;gt; with no data that exists only to set up the size of the columns ie.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;amp;lt;tr&amp;gt; &amp;amp;lt;td width=&#039;20&#039;&amp;gt;&amp;amp;lt;/td&amp;gt; &amp;amp;lt;td width=&#039;50&#039;&amp;gt;&amp;amp;lt;/td&amp;gt; &amp;amp;lt;td width=&#039;200&#039;&amp;gt;&amp;amp;lt;/td&amp;gt; &amp;amp;lt;td width=&#039;20&#039;&amp;gt;&amp;amp;lt;/td&amp;gt;  &amp;amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
now unless a &amp;amp;lt;TR&amp;gt; with more than 4 &amp;amp;lt;[[#TD |TD]]&amp;gt;s is created, the formatting for all columns is already done and as this &amp;amp;lt;TR&amp;gt; has no height specified and no data in its &amp;amp;lt;[[#TD |TD]]&amp;gt; cells it will take up only the space specified by the &amp;amp;lt;[[#TABLE |TABLE]]&amp;gt;&#039;s border, cellspacing and cellpadding (default 0).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
:&amp;amp;lt;tr height=? bgcolor=?&amp;gt;...&amp;amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==TD==&lt;br /&gt;
TD is Table Data. This tag forms a single cell within a table row. &amp;amp;lt;TD&amp;gt; does NOT support for following parameters; abbr, align, axis, char, charoff, headers, height, scope, valign.&lt;br /&gt;
&lt;br /&gt;
Height of a cell is controlled by the tallest cell in the row or by the &amp;amp;lt;[[#TR |TR]]&amp;gt; height parameter if it is specified.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;lt;TD&amp;gt; is the work horse of tables, as the name implies all contents of a table are contained within a &amp;amp;lt;TD&amp;gt; tag. Anything can be placed within a cell, even a table eg.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt; &amp;lt;body&amp;gt;&lt;br /&gt;
  &amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt; &lt;br /&gt;
      &amp;lt;td&amp;gt;Some text &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;Some text &amp;lt;/td&amp;gt; &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt; &lt;br /&gt;
      &amp;lt;td&amp;gt;Some text &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;Some text &amp;lt;/td&amp;gt; &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt; &lt;br /&gt;
      &amp;lt;td&amp;gt; &lt;br /&gt;
        &amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;Some text in a sub table &amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;Some other text in a sub table &amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
        &amp;lt;/table&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&amp;lt;---Wow thats a sub table over there &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt; &amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
coping and pasting the above into the left pane of [http://www.w3schools.com/HTML/tryit.asp?filename=tryhtml_basic this Tryit window](open it in a new tab or window) and clicking &amp;quot;Edit and Click me &amp;gt;&amp;gt;&amp;quot; button will show you a table with a table in it on the right hand side.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
All parameters are optional.&lt;br /&gt;
*rowspan and colspan allows this cell to consume the space that would normally be allocated to neighboring cells on the right and bottom sides. Default values are 1, meaning the &amp;amp;lt;TD&amp;gt; spans its own cell and nothing more. [http://www.w3schools.com/tags/tryit.asp?filename=tryhtml_table_span Visual example of spanning], but remember Trainz HTML is not the same as HTML proper.&lt;br /&gt;
*width - specifies the pixel width of this cell, useful for formatting.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
:&amp;amp;lt;td rowspawn=? colspan=? width=? bgcolor=?&amp;gt;...&amp;amp;lt;/td&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==A==&lt;br /&gt;
A is the Anchor tag. This tag marks all contained elements as a hyperlink with the specified attributes. Hyperlinked text will be underlined.&lt;br /&gt;
&lt;br /&gt;
Tooltip text will be displayed when the mouse hovers over the hyperlinked elements.&lt;br /&gt;
&lt;br /&gt;
The href is the minor message in a [[Browser Messages |Browser-URL message]] sent by the [[class Browser |Browser]] to whomever is listening to it. ie. the major=&amp;quot;Browser-URL&amp;quot; minor=&amp;quot;live://button/horn&amp;quot; message is produced by a hyperlinked button (horn) in the driver user interface.&lt;br /&gt;
&lt;br /&gt;
A hyperlink is considered clicked when the user has pressed and released mouse button 1 while over it.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
:&amp;amp;lt;a href=? target=? help-label=? mousedown=? disabled-href=? tooltip=?&amp;gt;...&amp;amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==IMG==&lt;br /&gt;
IMG is the IMaGe tag. This tag displays an image with the specified attributes. Does NOT support the alt or title tags. &lt;br /&gt;
&lt;br /&gt;
All parameters are optional however, the src or the kuid parameter needs to be filled out for anything to show up apart from a fill.&lt;br /&gt;
&lt;br /&gt;
The width and height parameters define the pixel size the image will occupy on screen, these can be made larger or smaller than the image&#039;s actual size to zoom, stretch or squash the image as needed. Keep in mind that users don&#039;t all use the same resolution, so it is usually best to make pictures either fixed size in a screen position via the use of tables or calculating a pixel size relative to the current resolution.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
:&amp;amp;lt;img src=? mouseover=? kuid=? width=? height=? srcwidth=? srcheight=? color=? hflip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==TRAINZ-TEXT==&lt;br /&gt;
A section of text that can be changed without having to recalculate or reset the entire HTML string in a [[class Browser |browser]]. &lt;br /&gt;
&lt;br /&gt;
In the Driver interface the speed panel shows the selected train&#039;s current speed, the current speed limit on its segment of track and the current world time. Below is the speed HTML, which is retrieved via the localisation method described in &amp;amp;lt;[[#FONT |FONT]]&amp;gt;;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;font color=#00FF00 locale=&#039;english&#039;&amp;gt;&amp;lt;b&amp;gt;&amp;lt;trainz-text id=&#039;speed&#039; text=&#039;0 KM/H&#039;&amp;gt;&amp;lt;/trainz-text&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
This specifies green bold text that is bound to an id of &amp;quot;speed&amp;quot;. Now in every heartbeat in DriverModule.gs, the currently selected train&#039;s speed is calculated and applied to this trainz-text by calling SetTrainzText(&amp;quot;speed&amp;quot;, &amp;quot;10 kph&amp;quot;) [10 kph used only for illustrative purposes] on the [[class Browser |browser]] that contains the speed html.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The id parameter is required to be able to update this section of text via the SetTrainzText [[class Browser |browser]] call. The text parameter does not need to be filled out int HTML can be specified using the SetTrainzText method at a later time.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
:&amp;amp;lt;trainz-text id=? text=?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==B==&lt;br /&gt;
B is Boldface. Causes any text in contained elements to be rendered as boldface. The bold tag has no parameters.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
:&amp;amp;lt;b&amp;gt;...&amp;amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==NOWRAP==&lt;br /&gt;
Suppresses automatic word wrap in the contained elements. The nowrap tag has no parameters.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
:&amp;amp;lt;nowrap&amp;gt;...&amp;amp;lt;/nowrap&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==I==&lt;br /&gt;
I is the Italics tag. Causes any text in the contained elements to be rendered as italic. The italic tag has no parameters.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
:&amp;amp;lt;i&amp;gt;...&amp;amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==FONT==&lt;br /&gt;
Causes the specified text attributes to be applied to any text in the contained elements. Text in Trainz HTML does not have to be enclosed in font tags, if none are found around any given text it will receive the default font settings.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Localisation note; the follow statement has special meaning to the Trains HTML parser;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;font locale=generic&amp;gt;A_TAG&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
When a tag such as this is parsed, Trainz will look in the current users selected language [[class StringTable | string table]] of the current asset for a string with the name found between the &amp;amp;lt;font&amp;gt; &amp;amp;lt;/font&amp;gt; tags, in this case A_TAG. It will replace the entire statement from here &amp;quot;&amp;amp;lt;font... &amp;amp;lt;/font&amp;gt;&amp;quot; to here with what is found in the [[class StringTable | string table]]. An example of this at work is in the Driver interface where the camera types are defined in the string tables of the Driver asset [[config.txt file | config.txt]] in all available languages so that each camera button has the selected language tooltip for each camera mode.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
:&amp;amp;lt;font size=? color=? locale=? face=?&amp;gt;...&amp;amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==TRAINZ-OBJECT==&lt;br /&gt;
Documented below under [[#Embedded Objects |embedded objects]]. Embedded objects fill the style parameter. The width and height parameters specify the pixel size of the given object, eg. how big a button is.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
:&amp;amp;lt;trainz-object width=? height=? style=?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Supported Characters=&lt;br /&gt;
The MiniBrowser parses its input from UTF-8 encoded HTML. The full range of unicode characters may be included without special escape sequences. The following escape sequences are permitted and may be necessary to prevent the characters from being parsed as HTML markup.&lt;br /&gt;
* &amp;amp;amp;nbsp; - the HTML non-breaking space character.&lt;br /&gt;
* &amp;amp;amp;gt; - the &amp;quot;greater than&amp;quot; character (&#039; &amp;amp;gt; &#039;) &lt;br /&gt;
* &amp;amp;amp;lt; - the &amp;quot;less than&amp;quot; character (&#039; &amp;amp;lt; &#039;)&lt;br /&gt;
* &amp;amp;amp;amp; - the &amp;quot;ampersand&amp;quot; character (&#039; &amp;amp;amp; &#039;)&lt;br /&gt;
* &amp;amp;amp;quot; - the &amp;quot;quote&amp;quot; character (&#039; &amp;amp;quot; &#039;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Embedded Objects=&lt;br /&gt;
The following embedded objects are supported by the trainz-object tag:&lt;br /&gt;
&lt;br /&gt;
==dial==&lt;br /&gt;
Works like an analogue volume knob. A dial is used in the driver interface, in the dcc panel to control the speed/power of the train. These are its settings;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;trainz-object style=dial width=95 height=95 id=&#039;dcc&#039; &lt;br /&gt;
texture=&#039;newdriver/dcc/dcc_controller.tga&#039; min=0.1 max=0.9 &lt;br /&gt;
valmin=-1.0 valmax=1.0 step=0 clickstep=1 value=0.5&amp;gt;&amp;lt;/trainz-object&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Driver wraps the dial in an &amp;amp;lt;[[#A |A]]&amp;gt; as to receive messages from user interactions with it, it then uses the GetElementProperty(&amp;quot;dcc&amp;quot;, &amp;quot;value&amp;quot;) on the [[class Browser |Browser]] the dial resides in to extract its current value.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Parameters explained;&lt;br /&gt;
*The style, width, height and id parameters belong to the [[#TRAINZ-OBJECT |TRAINZ-OBJECT]].&lt;br /&gt;
*The min and max parameters specify the rotation (as a percent between 0 and 1) the dial can have in the interface. For the driver speed knob its 0.1 to 0.9; imagining this as a clock face this means the dial is allowed to rotate between approximately 7 clockwise around to approximately 5 and vice versa anticlockwise anywhere between 5 and 7. The dial&#039;s rotation can never be clockwise between 5 and 7.&lt;br /&gt;
*valmin and valmax specify the values returned by the dial, that is how its values map to its rotation. Using the clockface analogy again, at approximately 7 the dial will return the value of -1, at approximately 5 it will return the value 1 and at 12 it will return 0.&lt;br /&gt;
*step specifies the minimum change that can occur in the dial, 0 means it can move completely freely, if step were 0.1 and the user had rotated it by 0.04 no rotation would be registered and the dial would snap back to its previous position.&lt;br /&gt;
*clickstep TBD&lt;br /&gt;
*value sets the initial starting position (as a percentage 0 to 1) of its range. 0.5 being half between max and min.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:style=dial texture=? min=? max=? valmin=? valmax=? step=? clickstep=? value=?&lt;br /&gt;
&lt;br /&gt;
==button==&lt;br /&gt;
A Button is essentially 8 [[#IMG |image]]s; where only 1 is shown at a time determined by the button&#039;s on or off-ness and the user&#039;s cursor location.&lt;br /&gt;
&lt;br /&gt;
Buttons can be set either &#039;off&#039; or &#039;on&#039; by calling SetElementProperty(&amp;quot;button name&amp;quot;, &amp;quot;value&amp;quot;, &amp;quot;1&amp;quot;) [for on or &amp;quot;0&amp;quot; for off] on the [[class Browser |browser]] that contains the button. All buttons start in the off state.&lt;br /&gt;
&lt;br /&gt;
Both &#039;on&#039; and &#039;off&#039; states have 4 states within them for showing interaction with the cursor. Off is explained below, on is the same replacing &amp;quot;off&amp;quot; with &amp;quot;on&amp;quot;;&lt;br /&gt;
* &amp;quot;off&amp;quot; - button is in the off state and has no cursor interaction.&lt;br /&gt;
* &amp;quot;off-over&amp;quot; - button is in the off state and the cursor is hovering over the button.&lt;br /&gt;
* &amp;quot;off-down&amp;quot; - button is in the off state and the cursor has been clicked on the button, is held down (mouse button 1 is down) but the cursor is not (is no longer) hovering over the button meaning the user has dragged the cursor off the button after clicking it.&lt;br /&gt;
* &amp;quot;off-down-over&amp;quot; - button is in the off state and the cursor is hovering over the button and the cursor has been clicked on it and is being held down (mouse button 1 is down).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The size of a button is determined by the width and height parameters of its containing [[#TRAINZ-OBJECT |TRAINZ-OBJECT]] tag.&lt;br /&gt;
&lt;br /&gt;
Typically a button trainz-object will be contained within an &amp;amp;lt;[[#A |A]]&amp;gt; tag giving the appearance that buttons send messages. As buttons do not send clicked messages themselves, they do not directly know when they have been clicked on or off, this must be done manually by listening to the message that will be sent by the anchor tag and changing the buttons state using the SetElementProperty(&amp;quot;button name&amp;quot;, &amp;quot;value&amp;quot;, &amp;quot;1&amp;quot;) command on its containing browser.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
? represent image files within the asset.&lt;br /&gt;
:style=button id=&amp;amp;lt;button name&amp;gt; off=? off-over=? off-down=? off-down-over=? on=? on-over=? on-down=? on-down-over=?&lt;br /&gt;
&lt;br /&gt;
==video==&lt;br /&gt;
The curiously named MN Session Manager, uses the video trainz object to play some short clips.&lt;br /&gt;
&lt;br /&gt;
*The play-on-load tag should be either &#039;1&#039; or &#039;0&#039; being yes or no respectively and it means exactly what it sounds like, should the video start playing once it has loaded.&lt;br /&gt;
*The is-video-looping is likewise a &#039;1&#039; or &#039;0&#039; value indicating the video should or shouldn&#039;t repeat once finished.&lt;br /&gt;
&lt;br /&gt;
:style=video play-on-load=? video-filename=? is-video-looping=?&lt;br /&gt;
&lt;br /&gt;
==slider==&lt;br /&gt;
Slider is a horizontal bar similar to a horizontal scroll bar with a linear range of values mapped to it, similar to the [[#dial |dial]]. &lt;br /&gt;
&lt;br /&gt;
There are several in the video settings menu/asset and those will be used as an example here. The most important attributes are;&lt;br /&gt;
*min the minimum value the slider represents (far left).&lt;br /&gt;
*max the maximum value the slider represents (far right).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:style=slider min=? max=? page-size=? draw-lines=? draw-marks=? thumb=? thumb-over=? less=? less-over=? more=? more-over=? thumb-width=? thumb-height=?&lt;br /&gt;
&lt;br /&gt;
==browser==&lt;br /&gt;
[[class Browser |browser]] is updated through call to SetElementProperty(&amp;quot;component-name&amp;quot;,&amp;quot;html&amp;quot;,sub-browser html  string) from the parent browser level. An example of this at work can be found in the waybillmanager.gs&lt;br /&gt;
&lt;br /&gt;
:style=browser id=&#039;component-name&#039;  width=? height=?&lt;br /&gt;
&lt;br /&gt;
==driver-menu-button==&lt;br /&gt;
:style=driver-menu-button name=?&lt;br /&gt;
&lt;br /&gt;
==graphic-button==&lt;br /&gt;
:style=graphic-button name=? texture_off=? texture_on=?&lt;br /&gt;
&lt;br /&gt;
==minimap==&lt;br /&gt;
:style=minimap&lt;br /&gt;
&lt;br /&gt;
==text-line==&lt;br /&gt;
:style=text-line background=? align=?&lt;br /&gt;
&lt;br /&gt;
==driver-order-bar==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Incorrect&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Is a very specific case. As the name implies it is the list of driver commands that appears at the bottom of the screen next to the current driver image in Driver. This is already created and managed for you, users probably don&#039;t want to make these in any useful way, just to mess around or break things.&lt;br /&gt;
&lt;br /&gt;
:style=driver-order-bar&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;this isn&#039;t really accurate. i think you&#039;ll find this is already used elsewhere in the game (for example, in the driver command rule?) and in fact possibly isn&#039;t used by the main driver interface - it&#039;s likely that is not HTML although it&#039;s the same underlying control. this is a general-purpose control: the functionality is specific to assigning orders, but it should be fairly flexible what the calling script does with the orders.&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==clock==&lt;br /&gt;
:style=clock face-texture=? seconds-texture=? minutes-texture=? hours-texture=? seconds-visible=? minutes-visible=? hours-visible=? seconds=? minutes=? hours=?&lt;/div&gt;</summary>
		<author><name>Shalliwell</name></author>
	</entry>
</feed>