Adding Links to the SiteKiosk Online Server Sidebar Menu

As of June 2021 the new SiteKiosk Online product family is available for custom projects. Please contact PROVISIO for more information on how to use SiteKiosk Online for your own project.

Customers running their own SiteKiosk Online server can add custom links to the menu on the left hand side of the team view. This enables you to integrate other web applications.

To add links, open the file ..\PROVISIO\SiteKiosk Online Server\Web\Web.sitemap with an editor. Look for

<!-- Menu C -->

and add this code for your own link right above it

<!-- Your Link -->
<siteMapNode url="http://www.your-comp.com/" title="Your Link" icon="link.svg" singlelink="true" />

The siteMapNode uses url for the path to the linked content, title for the caption visible in the menu, icon for the icon image file name and singlelink set to true to identify this specific type of link. Note that the icon image file needs to be in the ..\PROVISIO\SiteKiosk Online Server\Web\pub\img\sidebar folder. Additionally note that you may need to create the folder if it does not exist.

You can add more than one custom link.

Using the RunHelper Tool to Start Applications

A few applications cannot be started directly if added to the list of external applications in the configuration of SiteKiosk. In most cases this is due to directory virtualization. One example is osk.exe which is the on-screen keyboard of Windows (Note: it is strongly recommended to use the onscreen keyboards included in SiteKiosk whenever possible, using the default Microsoft onscreen keyboard will decrease the security of SiteKiosk by bypassing the keyboard input filter).

The little RunHelper tool for 64-bit systems that can be downloaded here will help starting these kind of applications. It can also be used instead of a batch file to start programs, therefore eliminating the need to lift some security restrictions of SiteKiosk.

The RunHelper tool has two parameters, the first is a string for the path to the executable, the second is an optional string for all parameters that might be needed for the application. 

It is recommended the place the tool in the HTML subfolder of your SiteKiosk installation path.

If you want to start an application without parameters the command line field in the SiteKiosk configuration needs to look like this:

"C:\Program Files (x86)\SiteKiosk\Html\RunHelper.exe" "C:\windows\system32\osk.exe"

For an application with parameters the command line field needs to look like this:

"C:\Program Files (x86)\SiteKiosk\Html\RunHelper.exe" "C:\windows\system32\notepad.exe" "C:\Program Files (x86)\SiteKiosk\Html\test.txt"

Using SiteRemote to Install the Smart Kiosk Control Client

The Smart Kiosk Control client enables the remote control of kiosk terminals and displays with a mobile phone or tablet. The Smart Kiosk Control client can also be used for presentations or as an accessibility option. The client needs to be installed on the SiteKiosk Windows machine that a user should be able to control with a mobile device.

The installation can be done with the SiteRemote job system on existing SiteKiosk Windows machines. The SiteRemote job will consist of 3 steps.

Download the RemoteInput installer from your SiteRemote team account at Administration -> Downloads or directly here: https://www.siteremote.net/download/SmartKioskControlSetup.exe.

Next go to SiteKiosk -> Jobs in your SiteRemote team and click on the New Job button. Give the job a name, e.g. Install Smart Kiosk Control Client. You may also check the option to Save this job as a new template, if you want to reuse it in the future. Add a description if desired. 

Now choose File Upload from the available tasks to create the first job step. Upload the downloaded file and choose the destination path, e.g. %TEMP%\SmartKioskControlSetup.exe.

For the second step choose the task Run Executable. For the command line use

%TEMP%\SmartKioskControlSetup.exe /exenoui /qn

This will start a silent installation of the application. Make sure to choose invisible execution, so the installer runs with administrative rights.

The third and final step uses the Execute Operating System Command task. Use Restart from the available options. This will restart the operating system to finish the installation process.

Assuming the SiteKiosk machine is set to Autostart mode, a user will be able to remotely control SiteKiosk with a mobile device after the restart.

Using Different User Agents for Websites in SiteKiosk Windows Chrome Browser

For compatibility reasons or identification purposes it can be useful or even necessary to modify the user agent of the browser. You can do that for the browser as a whole in the configuration of SiteKiosk under Start Page & Browser -> Customize.

Replacing the whole default user agent string of SiteKiosk instead of just adding something to it is described here (Chrome) and here (IE).

But a modification that helps on one website can lead to problems on another website. So it can be useful to edit the user agent only for certain pages while on others the default user agent is used. You can do this with SiteKiosk Windows by editing the configuration file of SiteKiosk with an editor like Notepad. Look for urlSpecificUserAgents in the file and create entries for your URL(s). There are two options, you can either just add something to the default user agent of SiteKiosk or you can fully replace the user agent. 

This is how adding something to the default user agent for a specific URL looks like (as you can see, wildcards (*) are supported):

"url": "*whatsmyuseragent.org/*",
"userAgent": {
"add": "SiteKiosk Windows"
}

In this example SiteKiosk Windows is added to the default user agent for the specified page, while other pages receive the default user agent.

You can have as much different specific user agents as you need. This is how more than one looks like:

"urlSpecificUserAgents": [
{
  "url": "*.google.*",
  "userAgent": {
	"add": "Edg/$(ChromiumVersion)"
  },
  "url": "*whatsmyuseragent.org/*",
  "userAgent": {
	"add": "SiteKiosk Windows"
  }
}
],

The option to replace the full user agent string with a custom one looks like this:

"url": "*whatsmyuseragent.org/*",
"userAgent": {
"full": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36 Edg/89.0.774.76"
}

This example uses the user agent string of Edge (Chromium engine).

Note that using a user agent that mimmicks another browser can lead to display problems with a webpage. Always test the settings before using them in your production environment.

How to Trigger a Customizable Navigation Command in SiteKiosk Windows Chrome Browser from Another Application

We will create a little C# example to show how to trigger a navigation in the Chrome Browser of SiteKiosk Windows from an external application.

It makes use of the SendCustomCommand method from the ISiteKiosk9 object, that is part of the SiteKioskRuntime type library (..\SiteKiosk\Typelib\SiteKioskRuntime.tlb). Add the library to your C# project and access the ISiteKiosk9 object similar to what you find in this description (https://www.provisio.com/helpconsole/SiteKiosk%20Object%20Model%20Help/en-US/default.htm?codesamples_accessobject.htm).

The main part of the code for a small application with a button to call https://www.provisio.com/ looks like this:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using SiteKioskRuntimeLib;

namespace NavigateInSKWchrome
{
    public partial class Form1 : Form
    {
        [DllImport("ole32.dll", CallingConvention = CallingConvention.StdCall)]
        public static extern int CoGetClassObject(ref Guid rclsid, uint dwClsContext, IntPtr pServerInfo, ref Guid riid, out IntPtr ppv);

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            // initialize GUID's for classes and interfaces
            Guid lr_FactoryGuid = typeof(ISiteKioskFactory).GUID;
            Guid lr_FactoryClass = Guid.Parse("1CA0D073-4ABB-4D06-B318-BFFDE38E4903");
            Guid lr_SiteKioskGuid = typeof(ISiteKiosk9).GUID;

            ISiteKiosk9 mk_pSiteKiosk;

            // try to get the ISiteKioskFactory interface of the instance
            // of SiteKioskFactoryClass
            IntPtr lk_FactoryPtr = new IntPtr();
            CoGetClassObject(ref lr_FactoryClass, 4, new IntPtr(), ref lr_FactoryGuid, out lk_FactoryPtr);
            
            // convert the received IntPtr to the requested ISiteKioskFactory
            // interface
            ISiteKioskFactory lk_Factory = (ISiteKioskFactory)Marshal.GetObjectForIUnknown(lk_FactoryPtr);

            // call CreateSiteKiosk to get the ISiteKiosk interface of the
            // current instance of SiteKiosk
            IntPtr lk_SiteKioskPtr = new IntPtr();
            lk_Factory.CreateSiteKiosk(ref lr_SiteKioskGuid, out lk_SiteKioskPtr);

            // convert the received IntPtr to the requested
            // ISiteKioskFactory interface
            mk_pSiteKiosk = (ISiteKiosk9)Marshal.GetObjectForIUnknown(lk_SiteKioskPtr);

            mk_pSiteKiosk.SendCustomCommand("openBrowser", "https://www.provisio.com/");
        }
    }
}

When building the project, make sure to build it as an x86 project, so that it can communicate with SiteKiosk. Also make sure that you run the application within the same user context as SiteKiosk, otherwise the application will not be able to access SiteKiosk.

SendCustomCommand can also be used from an external script by simply calling this line in an external Javascript file:

SiteKiosk.SendCustomCommand("openBrowser", "https://www.provisio.com/");

Note that the SendCustomCommand method is handled in the file ..\SiteKioskNG\assets\rootApp\modules\browser.js. By default the onCustomCommand method, that is fired when a custom command is received, only includes the openBrowser command. It uses the navigateinMainBrowser method to open the requested page in a new tab, when the first parameter is false, or in the acitve tab, when the parameter is true. Feel free to add your own code to the browser.js file to enable your own custom commands to be used with the Chrome Browser of SiteKiosk Windows.

How to Force PDF Downloads in SiteKiosk Windows Chrome Browser

Most web servers do not deliver PDF files as direct downloads, instead they allow the browser to display them instantly if the browser has this capability. When using the Chrome browser of SiteKiosk Windows this means that most PDF files are shown in the integrated PDF viewer. You can allow downloads in the configuration of SiteKiosk (see below), then a user can click the little download icon in the upper right corner of the PDF viewer to actually download the file, just like in any other modern browser.

Depending on the intended use of the kiosk system, you might want to avoid having your users go through all these steps to download the file or you even want the PDF to automatically open in another application. This can be achieved by manually adding the Chrome command line switch disable-pdf-extension to your SiteKiosk configuration file (assuming it is not possible to change the server behaviour for PDF delivery itself). 

Open your SiteKiosk configuration with an editor like Notepad and look for the lines:

"browserEngine": {
      "commandLineArguments": {
        "set": [],
        "remove": []
      }
}

Change it to this:

"browserEngine": {
      "commandLineArguments": {
        "set": [
          "disable-pdf-extension"
        ],
        "remove": []
      }
}

Save the file and open the SiteKiosk configuration editor to use the GUI to make additional changes. Go to Start Page & Browser -> Chrome Browser -> Customize -> Downloads. Enable the download option. Select the PDF file type and click on Edit. Choose Open the following application (or one of the other methods to handle the file) and select the application you want PDF files to be opened with. Finally you might also want to check the Autostart checkbox to automatically start the PDF with the selected application after the download.

Note that SiteKiosk Windows will still show the file in the browser and do the above as additional actions on top of the default behaviour.

Also note that there are additonal command line arguments that can be used for other purposes. See https://devblog.provisio.com/post/2016/09/19/Starting-SiteKiosk-Windows-with-Chrome-Command-Line-Switches.aspx for further information.

Dynamically Change the Content of a Secondary Monitor

This script example will show you how you can change the content of a secondary monitor by actions on the primary monitor. Please note that we recommend using our Kiosk CMS SiteCaster to achieve this, here is described how to do it.

In this post we will use the SiteKiosk Object Model and the SiteKiosk Player on the secondary monitor instead of SiteCaster to change the monitor content. We will also make use of HTML, Javascript/JScript/WScript. The mehtod will require quite some scripting which is not necessary when using the SiteCaster approach.

We need three files, two HTML files and one Javascript file. 

The first HTML file is for the primary monitor.

<html>
	<script type="text/javascript">
		//method to initialize the SK Chrome Object Model
		(new Function(_siteKiosk.getSiteKioskObjectModelCode()))();
	</script>
	<body>
		<input id="id_togglesecondarymonitor" type="button" value="Toggle text on secondary monitor" />
	</body>
	 <script type="text/javascript">
        siteKiosk.ready(function (){
            document.getElementById("id_togglesecondarymonitor").onclick = function () {
                _siteKiosk.objectModel.callHostFunction("system.windows.skLegacy.executeScript", "SiteKiosk.ScriptDispatch.toggleTextOnSecondMonitor();");
            };
        }());
    </script>
</html>

It includes HTML code for a button that will toggle the content on the secondary monitor. It also uses the SiteKiosk Object Model each time the button is pressed to call the function toggleTextOnSecondMonitor in the external Javascript file we will have a closer look at below. This specific HTML page is for use in the Chrome browser engine of SiteKiosk (for an IE example please have a look here). It combines the classic SiteKiosk Object Model and the Object Model for Chrome as described here. The ScriptDispatch object can be used to access any member of the external script defined in the SiteKiosk configuration.

The Javascript file that will be added to the SiteKiosk configuration as an external script is next.

//Initialize WScript Shell
var WshShell = new ActiveXObject("WScript.Shell");

//Initialize default registry value on every start of SiteKiosk
regWriteValue(0);

//Get the OS type
var OsType = WshShell.RegRead("HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment\\PROCESSOR_ARCHITECTURE");

function regWriteValue(valuetowrite){
	if (OsType === "x86"){
		//32bit systems
		WshShell.RegWrite("HKEY_CURRENT_USER\\SOFTWARE\\PROVISIO\\SiteKiosk\\ToggleTextOnSecondaryMonitor", valuetowrite, "REG_DWORD");
	}
	else{
		//64bit systems
		WshShell.RegWrite("HKEY_CURRENT_USER\\SOFTWARE\\Wow6432Node\\PROVISIO\\SiteKiosk\\ToggleTextOnSecondaryMonitor", valuetowrite, "REG_DWORD");
	}
}

function regReadValue(){
	if (OsType === "x86"){
		//32bit systems
		return WshShell.RegRead("HKEY_CURRENT_USER\\SOFTWARE\\PROVISIO\\SiteKiosk\\ToggleTextOnSecondaryMonitor");
	}
	else{
		//64bit systems
		return WshShell.RegRead("HKEY_CURRENT_USER\\SOFTWARE\\Wow6432Node\\PROVISIO\\SiteKiosk\\ToggleTextOnSecondaryMonitor");
	}
}

function toggleTextOnSecondMonitor(){
	if(regReadValue()){
		regWriteValue(0);
	}
	else{
		regWriteValue(1);
	}
}

The external script file can include any sort of Javascript/JScript/WScript and of course the SiteKiosk Object Model. For our example script we will make heavy use of WScript as we are using the WScript shell to access the Windows registry to save the status flag for the content of the secondary monitor. Note that using the registry is only one possible option to communicate between the primary and the secondary monitor, you could for example also write to a file or use a web server instead. The above WScript code reads and writes from/to the Windows registry. Please see the WScript reference for more information on the methods used. It creates the REG_DWORD value ToggleTextOnSecondaryMonitor to save the toggle state of the button on the primary monitor. It uses 0 and 1 to toggle between the two states of the secondary monitor, you could of course also use higher counts for a greater variety of content.

The second HTML file is for the secondary monitor.

<html>
	<script type="text/javascript">
	//Initialize WScript Shell
	var WshShell = new ActiveXObject("WScript.Shell");
	
	//Get the OS type
	var OsType = WshShell.RegRead("HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment\\PROCESSOR_ARCHITECTURE");
	
	//Start checking for content changes
	window.setTimeout("CheckForContentChange()", 500);
	
	function CheckForContentChange(){
		if (OsType === "x86"){
			//32bit systems
			if(WshShell.RegRead("HKEY_CURRENT_USER\\SOFTWARE\\PROVISIO\\SiteKiosk\\ToggleTextOnSecondaryMonitor"))
				changeabletext.innerHTML = "The button to toggle the text has been clicked. <span style='color:red'>Click the button again to change to the original text.</span>";
			else
				changeabletext.innerHTML = "This text will change if the 'Toggle text on secondary monitor' button has been clicked on the primary monitor.";
		}
		else{
			//64bit systems
			if(WshShell.RegRead("HKEY_CURRENT_USER\\SOFTWARE\\Wow6432Node\\PROVISIO\\SiteKiosk\\ToggleTextOnSecondaryMonitor"))
				changeabletext.innerHTML = "The button to toggle the text has been clicked. <span style='color:red'>Click the button again to change to the original text.</span>";
			else
				changeabletext.innerHTML = "This text will change if the 'Toggle text on secondary monitor' button has been clicked on the primary monitor.";
		}
			
		window.setTimeout("CheckForContentChange()", 250);
	}
	</script>
	<body>
		<span id="changeabletext">This text will change if the 'Toggle text on secondary monitor' button has been clicked on the primary monitor.</span>
	</body>
</html>

It uses Javascript, WScript and HTML code to read the toggle state from the registry and display one of two strings on the monitor. Instead of the simple strings of this example script you can of course use images, videos, etc. (please note that the SiteKiosk Player is based on the IE WebBrowser Control and is therefore limited to its capabilities). The Javascript setTimeout method is used to to trigger frequent checks of the Windows registry for any changes to the ToggleTextOnSecondaryMonitor value.

To see the above example code work, please copy, paste and safe each code example to a different file using an editor like Notepad. Save the HTML code for the primary monitor as primarymonitor.html, the Javascript code for the external script as externalscript.js and the HTML code for the secondary monitor as secondarymonitor.html (of course the file names are examples). All files should be placed in the HTML subfolder of your SiteKiosk installation path, e.g. C:\Program Files (x86)\SiteKiosk\Html.

Open the SiteKiosk configuration editor and go to Start Page & Browser, choose the Crome Browser and select the primarymonitor.html file as the Start Page of the Primary Monitor.

 

Next click on the Customize button on the same configuration page, then go to Advanced and add the external script file externalscript.js there.

 

Click on the Secondary Monitor tab, activate the secondary monitor, select the SiteKiosk Player and under Settings add the secondarymonitor.html.

Start SiteKiosk to see the script work.

Trigger Actions at a Specific Time and Day

The configuration of SiteKiosk allows you to run a number of common tasks (e.g. computer shutdown, monitor on/off, etc.) at specific times and days of the week by using the scheduling options. You can find these settings under Maintenance -> System / Monitor Settings in the configuration tool.

Using the script capabilities of SiteKiosk you can perform nearly any action you can think of at any given time and day of the year. The example script mainly uses standard Javascript and adds just a little bit of the SiteKiosk Object Model to perform SiteKiosk specific actions.

// This scheduler script supports two modes:
// 1) Define scheduled events that will repeat every day (everydaymode = true)
// 2) Define different scheduled events for every single day of the year (everydaymode = false)
//
// Only modify the configuration part of this script (lines 35 - 450).
//
// To use the script, open the SiteKiosk configuration, go to  Start Page & Browser -> Advanced -> Execute scriptfile and add the script there.

// Current date
var mydate = new Date();
// Minute of the last time check
var lastminute = 0;

// Initialization of the weekdays array
var sWeekDays = new Array(32);
for (i = 0; i<=31; i++)
{
   sWeekDays[i] = new Array(13);
   for (i2 = 0; i2<=12; i2++)
   {
      sWeekDays[i][i2] = new Array(24);
      for (i3 = 0; i3<=23; i3++)
      {
         sWeekDays[i][i2][i3] = new Array(60);
      }
   }
}

// Initialization of the everyday array
var sEveryDay = new Array(24);
for (i = 0; i<=23; i++) sEveryDay[i] = new Array(60);



// ------------------------------------------------------------------------------------------
// Configuration part (beginning)
// ------------------------------------------------------------------------------------------

// true:  scheduled events will repeat every day, use sEveryDay[hour][minute] = "yourfunction();"
// false: different scheduled events for every single day of the year, use sWeekDays[day][month][hour][minute] = "yourfunction();"
var everydaymode = true;

// period of time between the time checks in milliseconds
var period = 5000;

// Scheduled event will repeat every day, active if everydaymode is true
// sEveryDay[hour][minute] = "yourfunction();";
sEveryDay[13][40] = "BrowserDialogOverlayExampleFunction()";

// Different scheduled events for every single day of the year, active if everydaymode is false
// sWeekDays[day][month][hour][minute] = "yourfunction();";
// January
sWeekDays[01][01][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[02][01][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[03][01][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[04][01][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[05][01][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[06][01][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[07][01][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[08][01][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[09][01][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[10][01][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[11][01][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[12][01][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[13][01][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[14][01][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[15][01][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[16][01][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[17][01][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[18][01][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[19][01][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[20][01][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[21][01][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[22][01][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[23][01][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[24][01][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[25][01][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[26][01][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[27][01][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[28][01][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[29][01][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[30][01][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[31][01][15][30] = "BrowserDialogOverlayExampleFunction()";

// February
sWeekDays[01][02][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[02][02][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[03][02][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[04][02][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[05][02][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[06][02][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[07][02][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[08][02][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[09][02][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[10][02][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[11][02][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[12][02][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[13][02][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[14][02][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[15][02][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[16][02][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[17][02][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[18][02][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[19][02][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[20][02][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[21][02][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[22][02][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[23][02][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[24][01][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[25][01][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[26][01][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[27][01][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[28][01][15][30] = "BrowserDialogOverlayExampleFunction()";

// March
sWeekDays[01][03][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[02][03][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[03][03][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[04][03][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[05][03][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[06][03][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[07][03][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[08][03][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[09][03][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[10][03][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[11][03][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[12][03][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[13][03][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[14][03][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[15][03][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[16][03][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[17][03][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[18][03][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[19][03][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[20][03][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[21][03][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[22][03][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[23][03][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[24][03][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[25][03][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[26][03][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[27][03][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[28][03][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[29][03][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[30][03][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[31][03][15][30] = "BrowserDialogOverlayExampleFunction()";

// April
sWeekDays[01][04][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[02][04][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[03][04][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[04][04][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[05][04][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[06][04][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[07][04][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[08][04][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[09][04][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[10][04][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[11][04][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[12][04][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[13][04][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[14][04][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[15][04][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[16][04][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[17][04][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[18][04][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[19][04][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[20][04][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[21][04][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[22][04][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[23][04][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[24][04][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[25][04][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[26][04][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[27][04][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[28][04][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[29][04][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[30][04][15][30] = "BrowserDialogOverlayExampleFunction()";

// May
sWeekDays[01][05][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[02][05][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[03][05][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[04][05][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[05][05][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[06][05][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[07][05][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[08][05][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[09][05][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[10][05][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[11][05][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[12][05][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[13][05][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[14][05][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[15][05][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[16][05][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[17][05][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[18][05][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[19][05][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[20][05][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[21][05][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[22][05][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[23][05][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[24][05][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[25][05][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[26][05][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[27][05][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[28][05][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[29][05][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[30][05][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[31][05][15][30] = "BrowserDialogOverlayExampleFunction()";

// June
sWeekDays[01][06][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[02][06][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[03][06][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[04][06][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[05][06][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[06][06][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[07][06][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[08][06][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[09][06][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[10][06][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[11][06][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[12][06][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[13][06][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[14][06][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[15][06][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[16][06][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[17][06][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[18][06][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[19][06][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[20][06][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[21][06][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[22][06][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[23][06][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[24][06][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[25][06][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[26][06][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[27][06][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[28][06][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[29][06][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[30][06][15][30] = "BrowserDialogOverlayExampleFunction()";

// July
sWeekDays[01][07][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[02][07][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[03][07][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[04][07][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[05][07][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[06][07][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[07][07][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[08][07][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[09][07][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[10][07][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[11][07][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[12][07][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[13][07][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[14][07][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[15][07][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[16][07][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[17][07][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[18][07][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[19][07][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[20][07][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[21][07][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[22][07][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[23][07][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[24][07][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[25][07][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[26][07][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[27][07][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[28][07][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[29][07][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[30][07][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[31][07][15][30] = "BrowserDialogOverlayExampleFunction()";

// August
sWeekDays[01][08][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[02][08][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[03][08][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[04][08][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[05][08][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[06][08][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[07][08][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[08][08][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[09][08][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[10][08][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[11][08][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[12][08][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[13][08][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[14][08][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[15][08][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[16][08][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[17][08][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[18][08][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[19][08][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[20][08][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[21][08][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[22][08][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[23][08][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[24][08][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[25][08][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[26][08][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[27][08][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[28][08][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[29][08][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[30][08][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[31][08][15][30] = "BrowserDialogOverlayExampleFunction()";

// September
sWeekDays[01][09][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[02][09][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[03][09][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[04][09][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[05][09][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[06][09][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[07][09][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[08][09][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[09][09][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[10][09][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[11][09][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[12][09][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[13][09][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[14][09][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[15][09][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[16][09][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[17][09][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[18][09][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[19][09][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[20][09][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[21][09][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[22][09][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[23][09][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[24][09][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[25][09][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[26][09][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[27][09][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[28][09][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[29][09][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[30][09][15][30] = "BrowserDialogOverlayExampleFunction()";

// October
sWeekDays[01][10][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[02][10][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[03][10][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[04][10][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[05][10][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[06][10][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[07][10][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[08][10][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[09][10][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[10][10][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[11][10][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[12][10][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[13][10][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[14][10][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[15][10][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[16][10][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[17][10][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[18][10][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[19][10][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[20][10][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[21][10][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[22][10][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[23][10][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[24][10][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[25][10][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[26][10][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[27][10][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[28][10][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[29][10][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[30][10][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[31][10][15][30] = "BrowserDialogOverlayExampleFunction()";

// November
sWeekDays[01][11][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[02][11][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[03][11][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[04][11][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[05][11][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[06][11][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[07][11][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[08][11][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[09][11][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[10][11][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[11][11][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[12][11][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[13][11][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[14][11][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[15][11][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[16][11][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[17][11][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[18][11][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[19][11][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[20][11][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[21][11][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[22][11][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[23][11][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[24][11][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[25][11][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[26][11][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[27][11][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[28][11][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[29][11][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[30][11][15][30] = "BrowserDialogOverlayExampleFunction()";

// December
sWeekDays[01][12][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[02][12][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[03][12][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[04][12][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[05][12][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[06][12][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[07][12][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[08][12][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[09][12][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[10][12][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[11][12][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[12][12][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[13][12][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[14][12][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[15][12][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[16][12][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[17][12][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[18][12][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[19][12][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[20][12][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[21][12][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[22][12][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[23][12][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[24][12][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[25][12][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[26][12][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[27][12][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[28][12][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[29][12][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[30][12][15][30] = "BrowserDialogOverlayExampleFunction()";
sWeekDays[31][12][15][30] = "BrowserDialogOverlayExampleFunction()";

// This example function overlays the browser with a dialog
function BrowserDialogOverlayExampleFunction()
{
	mydialog = SiteKiosk.SiteKioskUI.CreateHTMLDialog();
	mydialog.URL = "https://www.provisio.com/link/WindowsIdle";
	mydialog.Closable = false;
	mydialog.CloseOnInput = true;
	mydialog.ScrollBars = false;
	mydialog.Title = false;
	mydialog.Sysmenu = false;
	mydialog.Transparency = 235;
	mydialog.Width = 1000;
	mydialog.Height = 800;
	mydialog.ShowDialog();
}

// ------------------------------------------------------------------------------------------
// Configuration part (end)
// ------------------------------------------------------------------------------------------



// Calls the event defined for the current time
function mycaller(eventID)
{
   mydate = new Date();
   myday = parseInt(mydate.getDate());
   mymonth = parseInt(mydate.getMonth());
   myhours = parseInt(mydate.getHours());
   myminutes = parseInt(mydate.getMinutes());
   if (myminutes != lastminute)
   {
      if (everydaymode)
      {
         eval(sEveryDay[myhours][myminutes]);
      }
      else
      {
         eval(sWeekDays[myday][mymonth+1][myhours][myminutes]);
      }
      lastminute = myminutes;
   }
}

// Timer that calls the mycaller function periodically
evtid = SiteKiosk.Scheduler.AddPeriodicEvent(period, mycaller);

Use the configuration part of the script to make adjustments to the settings.

Set everydaymode to true, if you want the script to do the same task at the same time of each day, set it to false, if you want to use a different time every single day of the year and even a different task for each of those.

You can change period if you want to change how often the script checks whether the given time has been reached. The default is 5000 milliseconds which should be fine in most cases.

sEveryDay is the array used when everydaymode is true. You can set the hour (00-23) and the minute (00-59) as well as the function you want to be called when the defined time has been reached.

sWeekDays is the array used when everydaymode is false. It accepts values for the day (01-31), the month (01-12), the hour (00-23) and minute (00-59). Just as with sEverDay you assign the function you want to call at the given day and time. Note that this could be a different function or a function with different parameters for every day of the year.

In the example script both arrays use the same example function named BrowserDialogOverlayExampleFunction. The function name and what the function does is just an example to demonstrate the workings of this script, it can by nearly anything you can imagine for the kiosk project you use this script with. In the script CreateHTMLDialog is used to create an overlay, that shows a webpage over the SiteKiosk browser, e.g. for informational purposes. The method returns an SKHtmlDialog object, that allows you to configure the overlay to your needs.

Save the script as a .js file, e.g. scheduler.js, and put it in the folder ..\SiteKiosk\html. Open the SiteKiosk configuration, go to Start Page & Browser -> Advanced and add it as a script SiteKiosk should execute on startup.

Restrict Printing to Selected Websites

This time we want to look at a script that allows you to restrict printing to certain websites.

The script is using the SiteKiosk Object Model and runs as an external script. It can be used with the Chrome engine as well as the Internet Explorer engine.

To add the external script, open the SiteKiosk Configuration, go to Start Page & Browser and click on the Advanced button. In the dialog that will open, you can add an external script file. The following screenshot shows this for the Chrome engine of SiteKiosk.

 

To make the script work, you also need to enable printer monitoring on the Print page of the SiteKiosk Configuration.

 

Let's move onto the script now. Save the code below as a .js file in the HTML subfolder of your SiteKiosk installation, e.g. C:\Program Files (x86)\SiteKiosk\Html\restrictprinting.js.

//CONFIGURATION START

var gk_PrintingAllowed = new Array();

//Add URLs you want to allow printing for
gk_PrintingAllowed[0] = "https://www.provisio.com";
//Add additional URLs here
//gk_PrintingAllowed[1] = "https://www.google.com";
//gk_PrintingAllowed[2] = "http://www.bing.com";

//CONFIGURATION END

var gk_job;
SiteKiosk.Printer.OnNewJob = OnNewJob;

function OnNewJob(printer, job){
	gk_job = job;
	evtid = SiteKiosk.Scheduler.AddDelayedEvent(500, PrintOrNot);
}

function PrintOrNot(){
	var stopprinting = true;
	
	for(var i=0;i<gk_PrintingAllowed.length;i++){
		if(gk_job.Document.indexOf(gk_PrintingAllowed[i]) != -1){
			stopprinting = false;
		}
		
		if(!stopprinting)
			break;
	}

	if(stopprinting){
		SiteKiosk.Logfile.Notification("Deleting print job because URL is not allowed for printing."); //Debug
		gk_job.Delete();
	}
}

The script uses the array gk_PrintingAllowed for all the URLs you want to allow printing from. Add additional URLs by counting up the numbers, gk_PrintingAllowed[1] = "https://www.google.com"; then gk_PrintingAllowed[2] = "http://www.bing.com"; and so on.

The print jobs are monitored using the OnNewJob event. When this is fired, we receive a JobInfo object for the specific job. We then give the job a little time to be processed by using the AddDeleyedEvent method, before calling the PrintOrNot function, where we check if the URL of the print job is in the array of allowed URLs using a simple string comparison.

If the URL is not allowed, the script writes a short notification to the SiteKiosk logs using the Notification method and then uses the Delete method of the JobInfo object.

In case you want to inform the user about the deleted print job, you might use the CreateHTMLDialog method to display a dialog.

How to trigger content on one monitor with actions on a second monitor

In the following example you have two HD screens with a 1920 x 1080 resolution. On the first screen you will be able to present Videos which are activated by buttons presented on the second screen.

 

First you have to select SiteCaster in the Startpage & Browser section in the tab Primary Monitor the SiteKiosk configuration.

In the tab Secondary Monitor, you have to uncheck the option Restict the mouse pointer to the first monitor browser area. Note that you don’t have to activate the secondary monitor in the Secondary monitor tab.

Then you have to adjust the SiteKiosk configuration manually as described in the devblog entry https://devblog.provisio.com/post/2019/10/29/Extend-the-SiteCaster-workspace-to-multiple-screens-(Combine-several-screens-to-one-screen).aspx to extent the a SiteCaster workspace to a resolution to 3840 x 1080.

In the next step you generate a in the SiteCaster editor a project with a 3840 px x 1080 px resolution.

Go into the View setting and open the Resolution / Zoom dialogue.

Activate the radio button Custom Width and enter 3840 px width and 1080 px height.

Then add a swap container with 1920 px x 1080 px on the left side (Screen 1) of the project view.

Add an image and two videos into the Swap container.

On the right side (Screen 2) of the project view add two images which represent the buttons to trigger the videos.

Open the properties dialogue of the first image, activate the navigation option and select the first video in the dropdown menu.

Do the same with the second image and select the second video in the dropdown menu.

Finally start SiteKiosk with the generated configuration and publish the project.

As a result, the Image in the swap container will be displayed when the system is idle. With pressing on one of the generated buttons on the second screen the corresponding video is displayed on the first screen.