Recent Changes to NEO

Version -  08/06/2019
•		Fixed Report Style handling of Chart Trace, DashStyle.
•		Added pcode %p12. This is the ConvertStringToDateTime option which will convert the first column of a resultset
		from string to datetime. The main purpose is to support SQLite which can't natively handle datetime.
•		Added support for SQLite.
•		Fixed chart scaling of float option.
•		Fixed Gantt chart handling of changing colours.

Version -  12/09/2018 
•		Sample code showing how to change the chart type of a section:
		from IES.Visualisation import*
		def PostRun(report):
			data = report.DataObject
			section = data[0]
			col = section[1] 
			col.Name = "Neener"
			col.Properties["formatstring"] = "0,0.0"
			section.Properties["charttype"] = int(ChartType.Area)

•		Refactored Stacked Line Chart. It will now draw markers and can be combined with Stacked Area Chart.
•		All projects upgraded either to .NET Standard 2.0 or .NET Framework 4.7.1.
		Stored procedures are no longer supported! They can be added if there is demand.
•		Fixed script caching problem which didn't detect change script.
•		Added IES.Visualisation to assemblies available to scripting.
•		Sample Python code modifies all Variable objects in a specified folder to copy the "Query String" to the "Queries" section.
		from IES.Mercury import*
		def PostRun(report):
			mercury = MercurySystem.MercuryStatic
			workspace = mercury.References[Current.PrimaryWorkspace]
			AddEvent("Starting conversion for: " + workspace.Name)
			rootFolder = workspace.ParseRelative("Variable\IES\USERS\Rondo\TEST")
			# We will "convert" all Variables in the above nominated folder
			list = ParentHelper.CreateChildList(rootFolder, "Variable")
			for object in list:
				if not object.IsFolder:
					AddEvent("Converting: " + object.Name)
					query = object["General"]["Query String"][0] # Original Oracle query
					rows = object["Queries"].Rows
					row = rows[rows.Add()]    # Add one row to the Queries section
					row["Server Type"] = 0  # 0 is SQLServer
					row["Query String"] = query

		def AddEvent(msg):
			mercury = MercurySystem.MercuryStatic
			mercury.AddEvent(msg, "Converter", "Event")

Version -  NEO release (23-05-2018) 

•		Stacked bar chart tooltip now also has the total for positive and negative values in square brackets
		but only for the tooltip shown for positive values. Hence for a positive value it will
		have three numbers: the value of just the segment, the value of the sum up to and including
		that segment and the total of all values, e.g. 230MW (1200.45) [808.8].
•		Table view, Merged tab will now merge all sections if first column is a string. Note: normally it
		only merges sections where the first column is datetime but now it will look at the first data section
		and if its first column is string it will only merge string sections othewise it reverts to its normal behaviour
		of merging datetime sections.
•		In trees, the bookmark icon is now shown to the right of the object icon rather than overlayed.
		Fixed Collection view ticking bookmark.

Version -  NEO release (22-05-2018) 
•		Fixed Stacked Bar chart tooltip not showing total.
•		Code sample to convert the datetime column to a formatted string so they are shown as categories
		under each bar in a stacked bar chart:
		from IES.Mercury import*
		def PostRun(report):
			data = report.DataObject
			for index in range(0, 5):
				section = data[index]
				col = section[0] 
				labels = MercuryColString()
				labels.Name = "Week starting"
				for val in col:
				section[0] = labels
•		The following enums have been moved from the IES.Mercury.Charts namespace to 
•		IES.Visualisation: ChartType, DockLocation, StyleSource, InterbandLineStyleEnum, MarkerStyle.
•		Major refactor. Created IES.Visualisation.

Version -  NEO release (14-05-2018) 
•		Added macro handling to "Template file", "To Email Address" and "Subject".
•		In Design view fixed "green wave" showing for non-existant file when used with macros.

Version -  NEO release (07-05-2018) 
•		Fixed problem with "Number Format" being applied to datetimes.
•		Fixed problem with Report Template "Number Format" and "Date Format" not being applied to Table view. 

Version -  NEO release (20-04-2018) 
•		Created NeoScriptCache to cache Python scripts. This should reduce memory leakage.
•		Upgraded NEO from .NET 4.0 to 4.5. Upgraded IronPython from 2.7.5 to 2.7.8.

Version -  NEO release (11-04-2018)
•		Fixed TableProvider so double clicking on Table objects uses escaped field names when constructing the query for MySQL. 
•		Fixed Batch view scaling for high DPI.
•		To "Batch Run".General.Output added option "None".
•		When processing an Alert, a missing Alert Variable is now treated as a warning.
•		Added "Hide toast" parameter to Settings.General. If ticked the error popup window will not be shown when an error occurs. 
		Instead, the blue Info icon on the Eventlog tab will turn red. When the tab is clicked to view the Eventlog, it will return to blue.
•		Fixed range chart issue with aperiodic data.
•		Range chart can now handle unlimited numbers of pairs of traces. If range bands are likely to overlap, a later pair is likely
		to obscure a an earlier pair, therefore it is recommended that the "Background-Colour" bet set to a transparent colour.
		Note:	colour values are shown as eight digit hexadecimal values where the first two are the opacity and this is normally
				FF which is fully opaque. If you set the first two difits to 80 then it will be 50% opaque and 40 would be 25% opaque or 75% transparent.
•		Alert equation strings with escape sequences so it only applies to strings in single quotes.
Version -  NEO release (02-03-2018)
•		Alert equation error messages will now list the source as either Value or Instance.
•		Added a new chart type "Range". Currently it only supports exactly two traces. It renders the traces
		by filling in the region between the traces and then renders each trace as a line.
		The colour of the region between the traces can be set using Report Styles with Target="Chart Range[Index=0]"
		and Property="Background-Colour".
•		Alert equation strings, typically used in creating a message, can now contain escape sequences.
		Valid sequences are \r and \n.

Version -  NEO release (19-02-2018)
•		Further fixes to Stacked Bar Chart change from
•		Alert equation keywords like true, false, and, or, abs are now case insensitive so e.g. AND is the same as and.
•		Alert equation short circuiting is now prevented. This is to ensure that both sides of an AND or OR are evaluated and therefore displayed in the log.

Version -  NEO release (15-02-2018)
•		Monitors now have an extra section "Streams" with parameters, Name, "Latest DateTime Query" (LDQ), Query.
		Streams will run the  LDQ once on start up to get a latest datetime which is then put in place of the %f in the Query.
		The Query is assumed to return rows where the first column is datetime and each time it is run the latest datetime
		is used to update the %f parameter. In the sample below we are generating a stream of 4sec frequency data.
		The Stream functionality is used for web apps like NEOpoint and NEOmobile to allow clients to optionally subscribe to high frequency data.
			Sample LDQ:
			Sample Query:
				where TIMESTAMP > subtime(%f, '0 0:0:10')
				group by TIMESTAMP
				order by timestamp limit 0, 20;
•		Fixed Alerts email being sent unless the "Enable Email Alerts" parameter is ticked.
•		Fixed Alerts with Condition=Failed from triggering unless the Alert Variable throws an exception when running its query.
•		Changed Alert Summary view so for Condition failed it does not show Instance and also will not create multiple rows for each instance.
•		Created Alert Variable form. Shows all Alert Variables, name, query string, current and previous results.

Version -  NEO release (24-01-2018)
•		Fixed bug where the report period was not adjusted when auto-updated.

Version -  NEO release (16-01-2018)
•		Chart trace markers in line charts are now much larger and are now drawn so as to avoid them being too close together.			
•		Added option "StartingPeriodCode" to Options objects. If the "Select on Startup" has this option then that PeriodCode will be applied when it first runs.
•		Flat view will be edits disabled on start up and when ever the select item is changed.
		It now has a toolbar button "Edits Enabled" which must be clicked before editing is enabled.
•		Super Flat view has been removed.
•		Fixed problem with not starting in Table view when starting report is "Table View Only" and configured to start in Alert view.
•		The chart log scale has been changed to a "bi-log" scale which is able to handle negative numbers. In simple terms numbers in the range -e to +e are plotted linearly,
		values less than -e are the -Log10(-value) and values > +e are Log10(value).
		This is useful for handling NEM prices. which can range from -1000 to 14,000.
•		In TreeView object is now more likely to be vertically centered.
•		Modified TableSchemaImporter for SQLServer so it identifies the primary key fields.
•		Removed some irrelevant thread locks so Alerts can run less constrained, i.e. one Alert is less likely to affect another Alert.
•		Stacked bar chart processing has now been changed. X values do not need to be unique. Also if there is a 
		third column of type string called "category" then each data point is assigned to that category and the category is added to the legend.

Version -  NEO release (15-12-2017)
•		The Alert Summary view now has a "Log all events" button which functions the same way the "Log all events"
		parameter in Settings.Alerts works. It enables turning on detailed alert events without having to restart.
•		The Alert Variable (AV) Query parameter can now have %s0 in it and this will be replaced with the text from the last value returned by that query. 
		Initially the value is 0. This feature can be used to alternate an AVs value with a Query as follows:
			select 'System',  systimestamp, 
			case %s0
				when 0 then 1
				else  0 end
				, 'ReportingDB NEO Alarms is running at ' ||
				TO_CHAR(sys_extract_utc(systimestamp)+10/24, 'DD-MON-YYYY HH24:MI:SS')   from dual
•		Note: If a Monitor query is already running then it is considered "busy" and another query for that Monitor
		will not be run until the previous one is complete.
		Individual Monitors are run independently so that if one Monitor takes a lot of time it will not impact other Monitors.

Version -  NEO release (08-12-2017)
•		Fixed Alert error processing of Value parameter when Condition expects a range. The error message now identifies the error more clearly.
•		Fixed Alert "Quiet hours" processing so if there is an error with the parameters format
		is incorrect, the error message will identify the issue as being that parameter.
		Note: "Quiet hours" is not supported in NEO and if there is an error in the format then the entire Alert will not be loaded.
•		Fixed problem with changes to Alerts listed on the Settings object "Shared alerts" tab not being updated in Alerts and the Alert Summary view when modified.

Version -  NEO release (07-12-2017)
•		Option values can now be changed in scripting. Sample code shown below:
			import System
			from IES.Mercury import*
			from IES.Mercury.Reports import *
			import IES.Utility
			# This code sample demonstrates how to change an Option value.
			def PostRun(report):
				OptionsManager.SetOptionValue(report.ReportObject, "TradingDay", "-2d1d")
•		When using PeriodCodes (PC), if the PC starts with a letter then it is assumed to be the name of an Option
		and the value of the Option is then used as the PC. This means you can define an Option called TradingDay
		and have it set centrally in an Option and even give it different values for different folders.
•		Cursor chart type now allows for shading a defined time range. The style must be set to "center"
		and there must be an extra column called "end" of type datetime. Sample Variable Oracle query for such a Cursor is shown below:
		select max(SETTLEMENTDATE) as CaneTime
			, 'center' as style, '#44ee1111' as colour, max(SETTLEMENTDATE) + 2/24 as end from %o.dispatchcasesolution

Version -  NEO release (05-12-2017)
•		More debug mode messages in AlertsManager.
•		Note: When Favourites are loaded they are sorted alphabetically and the first entry is shown by default.
		Recently run reports has a name that starts with '#' so would normally be listed first and therefore displayed
		but the code skips any entry that starts with '#'. If you want a particualr Favourite to be the default
		start with some other character that comes before alpha characters in the normal collation, e.g. '*'.
•		Added Initialisation message listing all Favourites loaded.
•		Added exception handling to MainForm.OnMercuryEntityModified().
•		On the ReportProvider class, added GetReportItemFromHandle(handle). How and what this is used for is explained in the sample code below:
			import System
			from IES.Mercury import*
			from IES.Mercury.Reports import *
			import IES.Utility
			# This code sample demonstrates how to get a section generated by a specific Variable.
			# In this sample the report has two rows in the
			# Parameter section, one is region price and the other is region demand and both have the
			# same instance of NSW1 so the results sections cannot be distinguished by instance, e.g.
			# there will be two sections that could be returned by data["NSW1"].
			# The ReportProvider now provides a GetReportItemFromHandle(handle) method to get the ReportItem
			# which has details about that row in the Parameters sections. Every results section
			# has a handle property called "Parent" that can be used to get the handle for the above call.
				def PostRun(report):
					data = report.DataObject
					demand = None
					price = None
					for ms in data:
						handle = int(ms.Properties["Parent"])
						ri = report.GetReportItemFromHandle(handle)
						# Note: meta-data sections won't have a corresponding ReportItem
							if ri is not None and ri.Name == "Region Price 5min":
								price = ms
								demand = ms
							demand.Name = "My demand"
							price.Name = "My price"

Version -  NEO release (04-12-2017)
•		On the Settings.General section, added a 'Debug mode' checkbox parameter which when ticked will output additional eventlog messages of type Debug when an Alert message is processed.
•		If the Settings.General.Favourites is empty then NEO will use the Favourites specified on the Account object used for
		each object workspace specified on the Settings object. This also works for NX but only the latest GCP version of NeoServer3.
•		Added warning message if a local or remote object change or delete causes a background process, CompileModifiedObject or CompileDeletedObject, to take more than one second.

Version -  NEO release (29-11-2017)
•		Significant change to Alert code hence re-testing required. Equation alerts now implement the Retrigger After Resolved and AUto Cancel logic. Previously they did not.
•		Slight change to the way ChannelDataMonitor runs busy Monitors.

Version -  NEO release (27-11-2017)
•		Batch Run Builder now creates the Batch Run parameter "Save File Name" with just the file name NOT a fully qualified path.
		Note when the Batch Run is run the file name is combined the "File Results Folder" on the General tab.
•		Created a sample script to demonstrate that Options can be accessed. Also changed chart processing so it sets the default chart type to None thus avoiding an error message.
		import System
		from IES.Mercury import *
		from IES.Mercury.Reports import *
		import IES.Utility
			def PostRun(report):
				report.DataObject = MercuryObject()
				do = report.DataObject
				do.Name = "Options"
				so = MercurySection()
				so.Name = "Test"
				co = MercuryColString()
				co.Name = "Values"
				co.Add("Capacity Utilisation 1321330min")
				temp = OptionsManager.GetOptionValue(report.ReportObject, "XXXX", "")
•		Fixed problem with Alert traffic light error message showing connection string password in some cases.

Version -  NEO release (24-11-2017)
•		Batch Run Builder and Batch Run Compare file result folder parameters now handle Options.
		In Batch Run Compare, if there is a difference it will now output the file name.

Version -  NEO release (21-11-2017)
•		In Alerts with Equations the double quote used in Word and Outlook is now recognised.
•		In Alerts with Equations using a Delay the message now shows the Delay.
•		In Alerts with Equations if a Delay is used it will now be invalid on the first evaluation and will not cause a trigger.
•		Fixed setting permission on an object type.

Version -  NEO release (13-11-2017)
•		If report is in Table view it will remain in that view if executing the same report.
•		A new report tab now uses settings from current selected tab.
•		Fixed Alerts not appearing due to bug in last release for high DPI handling.

Version -  NEO release (01-11-2017)
•		Options object can now set PeriodCodes which is a comma separated list of period codes, e.g.
		"-2td1td,-12h+6h,-1d1d,-1w1d". These can be applied to diffrent targets hence its possible to set different lists of period codes based on which folder a report is in.
•		When a new report tab is added, it uses the settings of the current report tab.
•		MainForm had a five second timer that advanced the from date of all reports with a period code. If the from date was
		different then the report was executed. This had the unintended consequence of running reports while the period code
		was being edited. This no longer happens while the period code combobox has focus.
•		The Settings.Show empty traces" parameter can now be overriden in Options using Option="showemptytraces".
•		Messenger now correctly handles changing permissions and therefore can be used for remotely setting NeoServer permissions.
•		Changed GridCtrl row and column resize to just redraw rather than draw a resize line.

Version -  NEO release (23-10-2017)
•		Changed Alert "Retrigger after resolved" to default to false. Also corrected the tooltip.

Version -  NEO release (12-10-2017)
•		Fixed problem that would cause the following messages on start up:
		"MercuryObject with WID=XX had a SecurityWID=YY which couldn't be converted to a LID.".
•		Changed MercuryWorkspaceSQL.LoadObjects() so that LoadAllContent() is called within it and if
		the LoadAllContent property is not set then it loads all Account and Security objects. This greatly
		speeds up the CompileSecurity() method.				
•		Fixed issue in Batch Run where a macro is used in the "Save File Name" and the result is a fully qualified path
		and "File Results Folder" is specified. It was incorrectly applying the folder to the path.
•		When floating over the Design view grid, if a cell contains a macro then the exapnded version of the string is
		shown as a tooltip.
•		Possibly fixed problem setting permissions on an object which currently has no permissions.
•		Fixed problem with grid row height with larger fonts such as in Alert History.

Version -  NEO release (29-09-2017)
•		May have fixed issue with NEO displaying a dialog when closing and if the local workspace XML file is not writeable.			
•		Alert Equation changes. Added the abs() function which returns the absolute value of a floating point
		argument. Added an optional delay parameter to an identifier. Normally an identifier would like
		'Alert Variable name'.Instance or 'Alert Variable name'["Instance"] but it can optionally have
		a column name after that either as .ColumnName or .'Column Name' or ["Column Name"].
		Now it can have an optional "delay" number which is defaulted to 0 meaning the current value or
		can be 1 which is the previous value. To set the delay you would have to unfortunately also supply the
		column name. The example below shows an Equation to check if the 5min price difference between successive values exceeds 5.
		abs('Region Price 5min'.NSW1["Price 5min"] - 'Region Price 5min'.NSW1["Price 5min"].1) > 5

Version -  NEO release (08-09-2017)
•		Added trim to Workspace "Default Schema".
•		Changed ChannelDataMonitor so each Monitor is run on its own thread.
•		Can now use Options in Alert Variables.
•		Changed run Report error message when not all steps selected to include a list of Label=Instance.

Version -  NEO release (05-09-2017)
•		Fixed UI locking up bug in The problem was debug code that caused a 10second delay
		in the UI thread every time there was a monitor trigger.
•		The Options object when edited will automatically update Options.
•		Fixed problem when using CTRL+F5 when the NeoLocal.xml file is empty or non-existant. 
•		Event and Design views now show selected row highlighted. 

Version -  NEO release (25-08-2017)
•		Refactored ChannelDataMonitor. It will now report if any monitor query takes more than 10 seconds to run. 
•		Changed ObjectModified and ObjectDeleted messages so they include object path. 

Version -  NEO release (23-08-2017)
•		Settings, Alerts section has new parameter "Font" which sets the font used in the Alerts History view.
•		Options can now be used as macros, e.g. in Batch Run file paths etc. So if you had a Option object selected from your
		Settings object and it had a row with Option=TEST and Value=FRED then a file path like "C:\Temp5\%{TEST%}.png" would become
		Note: Options can be applied to all objects or specific folders. If no targets are supplied then the Options apply to all objects
			contained in the Workspace containing the Options object.
			This also means that you cannot use Option in one Workspace to apply to a different Workspace.
		Note: Options are all made available as Parameters which are passed in to Report execution. This means they are also available
			from scripting via the "report.Parameters" variable. In the sample code below we change an result object's name to one set
			in an Option object:
			import System
			import IES.Utility
			from datetime import *
			from MercuryUtilities import *
			from IES.Mercury import *
			def PostRun(report):
				data = report.DataObject
				data.Name = report.Parameters["test1"]
•		In the Settings object, Options section, it was only possible to set references to Options objects. You can now reference
		Options folders in which case all the Options objects in that folder or sub-folders will be loaded.

Version -  NEO release (21-08-2017)
•		Alert equation processing changed. The == and != operators previously cast left and right hand sides to double before comparing. 
		These have now been changed so that if either left or right hand sides is a string then both are cast to strings before doing a case-insensitive comparison.
•		Changed Compare view. It now always shows the path of both objects and always shows the full path.
		Also added a "Mirror" button which toggles Mirror mode. For this mode to work you must have exactly two persistant object workspaces. 
		When in Mirror mode the "Set fixed" button has no effect and when any object is selected it will display that object and its mirror in the alternate workspace.
•		In Flat view, fixed checkbox ticks not showing.
•		Changed "Traffic lights" behaviour. If there is a communication error the error message is updated. Previously A fails, B fails, A restores but still displays A failure.

Version -  NEO release (14-08-2017)
•		On Report object, General section, added parameter "Keep each parameter result". If ticked and the
		"Auto Update" option is also ticked, then if a Monitor trigger retriggers the report it will only execute
		those rows in the Parameters section that are affected. This reduces the load on the database server by avoiding needlessly rerunning rows.
•		Fixed Workspace, "Connection String" throwing an exception for an Oracle connection.
•		Added startup message for web workspaces that reports URL.
•		Changed way the Settings object "Mercury schema" and "Default" schema are handled.
		For SqlServer, previously you had to have a dot (.) at the end of the schema name. Now it is optional.
•		Fixed problem with grid control not redrawing some cells.

Version -  NEO release (02-08-2017)
•		Fixed problem with SqlServer workspace.

Version -  NEO release (26-07-2017)
•		Fixed problem where an incorrect login still gives complete access to a workspace.
•		Can pass name of Settings object that user wants NEO to start with as a command line argument.

Version -  NEO release (20-07-2017)
•		Changed MySQL connection dialog to provide option "Allow User Variables".
•		Changed grid views including Design form and Table form as follows: Shift+Arrow key now scrolls the grid
		Shift+Control+Arrow now moves to the furthest extent, e.g. Ctrl+Shft+Right will select all cells from the current position to the furthest right hand cell.
•		Changed Table view, Export CSV so it exports the current grid.

Version -  NEO release (13-07-2017)
•		Alert Variables now have a Queries section with fields: 'Server Type', 'Query String', 'Instances Query', 'Values Query'.
This allows setting a specific override for database server types, .e.g the queries on the General tab could be designed for
Oracle and a specific override for MySQL could be set on the Queries tab. Note that not all queries need to be overridden.
Only a non-empty string will override.

Version -  NEO release (03-07-2017)
•		Added an eventlog message to record if a report is triggered by the monitor.  It will list the channels that triggered it.
•		The Line chart can now also render labels if a string column called "label" is added. The colour of the label can be set
using the Report Styles 'Chart Trace', TextColour property and the font can be set using 'Chart Trace', Font.
•		Fixed chart scaling. Due to some recent code change the default wasn't set to autoscale.
•		The Report Style "ProjectLastPoint" has been modified to also handle periodic data with only one point.
•		Added main menu item "Neo Advanced User Guide".
•		Changed "Export to file". It now lists all the objects that will be exported based on the current settings.
•		Fixed 4th right hand axes not appearing.
•		In V4.9.1.1 we changed the way the Report.Axis Autoscale option worked so that even if that option was not selected
the user specified Min and Max would still be extended by the data. Some users objected to this so the
Autoscale parameter has now been changed from a checkbox to a droplist with choices: None, Partial, Full.
None now means that if a user specified either a Min or a Max then that is what would be set and it would not
be extended by the data. Full means that user limits are completely ignored and Partial means that
the user limits would be extended. If a Min or Max is left blank then it will always bet set by data limits regardless of the Autoscale setting.
•		Alerts logic changed for LimitsUp and LimitsDown. In the case of LimitsUp if the trigger value falls below
the upper limit then it will cancel if "Auto cancel" is true.
•		Period Code now supports "s" for seconds offsets.

Version -  NEO release (06-06-2017)
•		Alerts of type LimitsUp and LimitsDown have now been changed. Previously, on NEO startup, for a LimitsUp the value
had to fall below the lowwer limit before a value above the upper limit would cause a trigger. Now
on startup, the value only has to exceed the upper limit and does NOT need to fall below the lower limit first.
•		Alert History view status button now changes colour slightly every second to indicate that NEO/PC are not frozen. If an error occurs, the status button displays the error text.
•		Fixed Alert Summary view showing duplicate alerts if the Alert Variable has a blank instance and the Alert has a blank instance.
•		Fixed Alert History view row height not moving with a row when rows inserted or deleted.
•		Fixed Chart string scales not allowing for label size in layout.

Version -  NEO release (23-05-2017)
•		Fixed Alerts with an equation containing (N1 - N2).
•		Fixed Alert Summary view, "Trigger alert" not working for equations.

Version -  NEO release (05-05-2017)
•		Fixed bug with Batch Run for reports that include steps that are based on a date range selection.
•		Chart Report Styles now has "Chart Trace[Chart=]" so that a style can be applied to traces
of a specific chart type. Allowed values are: Line=1, Scatter=1, Area=2, BidBands=3, Bar=4, MeritOrder=5, LineSegment=6,
StackedBar=7, Gantt=8, SupplyCurve=9, StackedArea=10, Pie=11, Candlestick=12, Cursor=13, Notes=14, NoteTable=15, StyleSheet=16, Grid=17,
Scale=18, ReverseMeritOrder=19. Either the name or numerical value can be used.

Version -  NEO release (03-05-2017)
•		Fixed unhandled exception that occurs when a report is run from a folder for which duplicate Options apply.

Version -  NEO release (26-04-2017)
•		Issue with Equation alerts being duplicated in the Alerts Summary view has been fixed.

Version -  NEO release (05-04-2017)
•		For Alerts with Condition=Equation now have better error reporting. If an error is found it will also include all the equation text up to the faulty token.
•		For Alerts with Condition=Equation the Message was empty as it normally comes from the 4th column of the Alert Variable query
and Equations don't have, or will ignore, the Variable.
So for Equations the Message is now the Equation with actual values shown OR if the Instance parameter of the Alert is non-empty
it will be treated as an equation and parsed to return a Message, e.g.
"The price in NSW was " + Price5min.NSW1 + " at time " + Price5min.NSW1.1
A formatting option has also been added. Simply add a colon followed by the formatting string so using the above as an example:
"The price in NSW was " + Price5min.NSW1:"F2" + " at time " + Price5min.NSW1.1 : "D"
•		Alert equations previously had variables like 'Alert Variable path'["instance"]. These have now
been changed to also allow ones of the form 'Alert Variable path'.instance. If instance contains illegal characters
such as spaces it can be wrapped in single quotes. Also previously the Alert Variable had to be wrapped in single quotes but this is now optional.
In addition, because these variables may also be used to generate a Comment it becomes necessary to access
columns other than the value so the normal form can now be followed by the name of the column (case insensitive)
or the column index. This can be useful as other information can now be passed in the Alert Variable query result and used in the equation or comment.

Version -  NEO release (04-04-2017)
•		In Settings, Alert section, have added "Send auto-cancel message". When set, any auto-cancels will also be sent as an Alert message of type "AlertAutoCancelled".
•		In the Alert Summary view, the Disable column has been changed from a checkbox to a drop down list
with choices of "Disabled", "Not disabled", "Disabled for 5 mins" with additional steps for
5, 10, 15, 20, 25, 30, 45, 60, 120 mins. If the value is for N mins then the displayed value will count down until 0 when it will display "Not disabled".
•		In Batch Runs, Months and Quarters have been added as "Offset Type" options.
•		PeriodCodes now have a "Q" for quarter option.
•		"Specified cast is not available" from LoadContentFromCommand. This can be fixed by setting General.Type=Oracle on the Workspace object.

Version -  NEO release (22-03-2017)
•		Report Styles "Table Column[Section=0][Col=1]" now has an additional Property of NumberFormat and NumberFormat
now has two more options in the drop down list being "C" for currency which places a $ at the front and "P"
which multiplies the number 100 and displays it with a % at the end.
•		The Alert object Alerts section has a new parameter "Auto cancel after". The default value is "Never" in which case
it has no effect. Other values are "1 min, 5 mins, 10 mins, 15 mins, 20 mins, 30 mins". When these values are selected the
alert will be auto cancelled the selected period after the last time that the alert is triggered.
•		The Alert Condition "Limits" has now been changed to "Limits Up" and a new condition "Limits Down" has been added.
"Limits Up" works just as Limits previously did, in other words the Value must hit the lower limit before exceeding the upper limit causes a trigger.
"Limits Down" will trigger if the Value first exceeds the upper limit then is below the lower limit.
•		Fixed DataGrid incorrect calculation of row height.
•		Added a new Alert condition of "Equation". In this case the Variable field is ignored and the Value field
is an equation, e.g. 'Region Price30min'["NSW1"] > (3 * 'STTM Ex ante market price'["SYD"]).
The allowed operators are: +, -, *, /, ....=.
	The above operators have the usual meaning and precedence. Parentheses can also be used.
	Identifiers always refer to Alert Variables and are of the form 'name'["instance"], i.e.
	the Alert Variable name is enclosed in single quotes and it must be followed by left and right square brackets enclosing double quotes enclosing the instance name.
	Some examples of where this new feature can be useful are:
	-	Have an alert that is able to compare 2 values from separate workspaces, e.g. to compare gas prices with electricity prices based on a formula.
	-	Having one alert being dependant on a separate alert.
	This would be useful to have an FCAS alert being set only if the Vic price is over $300.
•		With Alert Values, these can now be normal floating point values or can now also be
	in time format as HH:MM, e.g. 14:35 would represent 2:35pm. The time format is converted
	to the number of minutes so in this case 14:35 is converted to 14 * 60 + 35 = 875 and then used for all the normal condition operations.
	The purpose for providing time format is to make alerts more readable where the Alert variable is returning time in minutes as its value.
•		New alerts now appear at the top of the Alert History view.
•		Added Chart Trace property TextColour. At this stage it can only be used to set the text colour of a Notes chart.
•		Changing Notes chart to use the "backcolour" meta-data column instead of colour so its consistent with the style property.
	Can now use Chart Trace.Colour to set the colour used for the Notes outline and ledger and Chart Trace.Background-Colour to set the Notes background colour.
•		On Report Styles added option: Target=Chart Trace, Property=HideZeroLineSegment, Value=true,
	which has the effect with linetraces of hiding segments of the line where both start and end points have zero value.
•		Changed charts to correctly place an axis specified as Right on the RHS.
•		Monitor now reports query errors. This was disabled in a previous version. Number of Monitor errors now limited to 20.
Version -  NEO release (20-02-2017)
•		In NEO, Alerts will now be triggered without having to have non empty text in the Email field and without ticking the "Enable email alerts".
•		Favourites can now have Document Run and Batch Run objects.
•		Changed Alert Variables to include the path to the "Alert Variables" folder specified in the Settings.Alert section.
	This means that you can now have duplicate Alert Variable names as long as they are in different sub-folders.
•		Changed Alert "Delay before retrigger" default from 30 to 0 mins.
•		In Design view, right click on a file path now offers option to "Open File" which will open that file in its associated application.
•		Removed the ‘Clear’, ‘Test’, ‘Disable Alerts’, ‘View Alerts object’ and ‘Trigger All’ buttons in Alert History Compact View.
•		Alert History view now resizes row height when column width is resized or if an Alert is acknowledged and subsequently removed.
•		Added to Settings.General tab, the parameter "EventLog time UTC+". If blank or a negative integer the EventLog will use wall clock
	time else the EventLog uses the number as hours offset from UTC datetime.
•		If Alerts are disabled the Alerts tab is not shown.
•		Fixed Alert History view not acknowledging select alerts if selected from the bottom up.
•		Created new event type CommunicationError. This is issued if NEO is unable to connect to a database.
	The Alert History view now has a communication status button which is normally green but changes to red
	if there has been a comms failure in the last 30 mins. It changes to orange if there was one within  60 mins then back to green if none within the last 60 mins.
•		Changed TOOLS-"Create SQL Server Compact  Database" to also create MERMESSAGE3.
•		Fixed a bug with bid reports if the start date was not a multiple of 5 minutes.
•		Fixed a bug with reports run with a Period of "User Defined" when the start and end dates differed by more than 0 minutes.
	It would result in the minutes and seconds being values not implied by the "Count Per Day" value on the Variables.
•		Fixed an exception that would sometimes occur with remote object modifications. The error message
	would be "Item with same key has already been added" and occurs when a remote instance of NEO
	duplicated an object in a folder. This would cause two remote messages to be sent in quick succession, one to create
	the object and a second to rename. Because NEO handles these remote object messages on pool threads
	they were being handled in overlappingorder.
•		Fixed number of items reported as searched and found on the Search tab.
•		Fixed MergeSameDateTimeColumns not updating Table view when disabled.
•		Fixed Batch Run problem saving Merit Order Bid Stacks to a CSV file when "All sections in one file" is false.
•		Added try/catch to LoadSettings background thread. Can throw if user restarts during a restart.
•		When a Variable is created, "Period Type" is now set to "Period Ending" by default.
Version - NEO release (03-02-2017)
•		Fixed StackedBarChart for situations where the X axis is time or double and the traces have different counts or the values are not identical and in the same order.
•		Changed running Reports so if Table view is selected it will remain in that view if clicking Refresh, Prev or Next buttons.
•		Changed it so when a Report is selected it stays on the current view rather than switching to Report view.
•		Fixed bug in Variable Channels parameter where spaces were not trimmed.
•		The Alert object now has on its General tab a Disable parameter. Its false by default but if true the Alert will not be loaded.
•		The object explorer (tree on the LHS) now has three additional context menu items:
		-	"Add to current Favourite" - the current Report will be added to the current Favourite. This can be useful
			if you are saying collecting reports as you mopve through Report folders.
		-  "Bookmark referenced objects" - this will bookmark every object directly referenced
			by the selected object or if a folder is selected, every object within that folder and its sub-folders.
		-	"Find bookmarked objects" - al child objects which are bookmarked will be added to the Search tab tree.
•		Queries can now include %{option name}. This would typically be used to set schema names.
	If there is no Option by that name then the Option name is substituted, e.g. %{HELLO} will be replaced with HELLO if HELLO is not a defined Option.
•		Modified behaviour of Options object so that if the Target is blank or there are no Targets then the options apply to the whole workspace.
•		Added "Retain connection" parameter to Workspace object. Provides a simplistic single connection pool for providers that don't implement pooling.
•		The "Find Replace"" dialog, accessed from the tree context menu, now has a "Replace All" button.
•		Added support for double clicking a MySQL table.
•		Now handles deletion of Alert and "Alert variable" objects by updating the AlertManager. Previously only modifications were handled.
Version - NEO release (18-10-2016)
•		Added "Enable Messaging" parameter to Settings object. It is true by default. If true then
	messaging will be enabled and it will look for the MERMESSAGE3 table in the primary workspace.
•		Added support for MySQL in the table schema importer.
•		Changed axes label so if Label is not blank then it is used as is without the units being added to the label text.
	This may require some users to modify their existing reports.
•		Fixed Candlestick chart not correctly drawing whisker.
•		NEO-168: Fixed "Save As-Workspace data" not saving.
•		NEO-188: Fixed exception in Corporation Supply Curve report run on current day.
•		Fixed problem where Messenger was not restarted when NEO restarted.
•		Removed call to RemoveUnusedSecurityObjects(). This deleted Security objects that were not referenced. At this stage it is problematic due to Messaging.
•		Fixed problem on the Alerts form where the row height is incorrect if "Clear after acknowledge" is ticked and an alert is acknowledged.
•		When exporting CSV, any cells containing CRLF are now enclosed in double quotes.
•		Removed "Analyst view" menu item.
Version - NEO release (07-09-2016)
•		Fixed exception in Permissions dialog when Account selected.

Version - NEO release (05-09-2016)

•		NEO-174: Fixed Table view, report style, column width not working for some columns.
•		NEO-175: Fixed Table view, report style, row background colour not correctly displayed for sections other than 0.
•		NEO-180: Fixed "Explore" context menu not working with folders.
•		Fixed problem wth displaying object types that have no sections still showing last selected objects content.
•		The global objects updates now supports the following changes: content modified, name changed,
	object deleted, object added. This means the only action not supported is moving an object.
•		Fixed recently introduced problem where you can't get a drop down list of instances for an Alert
	if the relevant Alert Variable is not in the Settings specified folder.

Version - NEO release (31-08-2016)

•		Added a pause button to the Event view.
•		Fixed global event log not working.
•		In Table styles, changed RowHeight to also work in the All tab.

Version - NEO release (26-08-2016)

•		Possibly fixed bug where the wrong remote alert is being acknowledged.

Version - NEO release (25-08-2016)

•		On Alerts Summary tab, added context menu "Trigger alert" which pos up a diloag that
	allows the user to enter an instance and value that will be used to trigger the alert.
	The datetime is fixed to now and the message is "Fake message #N" where N increments for each fake alert.
•		Fixed exception in Alert instances.
•		Fixed Alert Variables instances and values queries not using specified Workspace.

Version - NEO release (23-08-2016)

•		If a report is in Table view when refreshed via Auto-update, then it will remain in Table view.
•		Added code to check for Alert objects with an Alerts section that has non-unique rowids. This can be a problem with acknowledging alerts.
•		The Alert Summary tab Trigger column has been changed to "Status" and will show one of: "", "Triggered" or "Resolved".
•		The Alert Summary tab grid has a tooltip with detailed information about which conditions of the alert
	were met such as instance, after delay, not same message, non empty message etc. Note all conditionslisted must be true for an alert to be triggered.
•		For Alerts that have been triggered, if the condition no longer exists and the alert has not
	been acknowledged, it is marked as resolved. The Alerts tab, Acknowledged column now displays the
	following possible values: "No", "Resolved" and "Yes - User" (where User is either User meaning the
	local user or is the Windows login name of the user who remotely acknowledged that alert).
•		The Alerts tab Clear button now only clears out acknowledged alerts.
•		Fixed problem with Table view showing blank rows if previously sorted and a new report is run with fewer rows.
•		The Alert object, Alerts tab now has an extra parameter "Retrigger after resolved".
	This is true by default. If ticked it will retrigger if the condition is still true.
	If not ticked then, condition must become false before re-triggering will occur.
•		Fixed Alert Variable problem not using assigned Workspace.
•		Slight change to how the default theme is applied. Previously it was applied as a theme if none was assigned
	which means it would override any user styles. It is now applied as a Settings theme if none is applied.

Version - NEO release (22-08-2016)
•		Fixed Messenger code with SQLServer.
•		Alert Channels tab, now has a Monitor column that lists the path of the Monitor object that triggered that channel.
	Now also has a context menu item "Trigger channel" which will create a fake trigger for that channel and thus run
	any Alerts that use that channel. Incidentally it can also be used to text auto-update of reports.
•		Alert Channels tab, now has a Monitor column that lists the path of the Monitor object that triggered that channel.
•		Alert Summary tab, now has toolbar buttons for Sort Ascending, Sort Descending, No Sort, Filter substring, Filter greater than, Filter less than.
•		Alert Summary tab, Condition column now includes the value.
•		When executing Tables, NEO limits the number of rows returned and also limits the datetime to that on the current report tab.
	It would only apply the period limits if it found a datetime column but this is now changed to only apply
	the limits if the datetime column is in the primary key.
•		Fixed Table view problem with SQLServer. Tables are now shown correctly in their schema and double clicking now also works for non dbo schemas.
•		Alerts have a new condition - "Failed". No instance or value is required. It triggers if the Alert Variable query fails.
	The Alert message will be the exception message from the failed query. The reason for this Alert condition
	is to pickup network errors which prevent the Alert Variables from running and hence triggering the Alerts.

Version - NEO release (18-08-2016)
•		Global object updating is now implemented. If a user modifies an object in one NEO instance then it will be automatically updated
	in all running NEOs. A message will appear in the event log that details the full path of the object that was modified and the
	Windows login name of the user that made the change. If the current object view in Design view is remotely updated
	then the Design view will automatically update. Note that if a user is currently editing an object that is remotely updated,
	their changes will be lost.
•		Global Alert acknowledgement has now been implemented. The row in the Alert object Alerts section has an "Allow global acknowledge".
	If that is ticked and one user acknowledges that alert then it will be acknowledged on all running NEI instances.
	The Alert view wioll show the Alert as being acknowledged and will include the Windows login name of the user who acknowledged it.
	Note that the MERMESSAGE3 table must exist in the primary workspace for this feature to be enabled.
•		When an Alert is acknowledged then all identical alerts are also acknowledged. An Alert is uniquely identified by
	the RowId (i.e. the row in a Alert object) and the instance (particularly if no Instance is specified on the Alert).
	So if e.g. the user acknowledges Price 5min exceeds 300 for SA1 and their are multiple of those alerts unacknowledged then they will all be acknkowledged.

Version - NEO release (12-08-2016)
•	Some customers do not want all users to see the Table view for certain workspaces. So we have created a
	'Table Schema' object. If a Table Schema object exists in the primary object workspace with the same name as a workspace
	then the user must have permission to see it before they can see the relevant Table view. If there is not "Table Schema"
	object of the same name as a workspace then the user also has permission to see the Table view for that workspace.
•	The "Batch Run" object now has an "Email format" parameter with options 'Document as attachment', 'Link to document'	and 'Table as body text'.
	'Document as attachment' is the normal option where the generated file is attached.
	'Link to document' will just include the file paths in the body text of the email.
	'Table as body text' can only be used when the results are saved as an .html file. It will set the email body text format as HTML
	and insert all the relevant tables into the email body text.
•	The "Batch Run" can now optionally save results as an HTML file by setting the "Save File Name" with a .html extension.
•	The "Document Run" object now has an "Email format" parameter with options 'Document as attachment' and 'Link to document'.
'Document as attachment' is the normal option where the generated file is attached.
'Link to document' will just include the file paths in the body text of the email.
•	The Alert Summary view now has a Disable column. When ticked it will disable the Alert for that column.

Version - NEO release (09-08-2016)
•		The Design view now has a button on the toolbar "Local edit enabled". It will be displayed only if
	the user does not have permission to modify the selected object. If clicked it will be in its checked
	state (shown as a light blue background) and the object can then be modified. Note that any changes made will not be saved.
•		The Neo.exe.config now has and additional parameter: MemoryEventLog of type bool. If set false
	then the normal file based event log is used, if true then an in memory eventlog is used.
	It only stores the last 100 rows. As newer events are added they are displayed and older events are purged.
•		Fixed Design view, context menu "Explore" now works with "Document Run" object parameters that have file paths with macros.
•		Added a new alerts condition "Like". Its uses case insensitive pattern matching
	where % matches any number of characters, e.g. patterns are "%X", "%x%y%".
	"%x" will match "fredX" or "X" but not "fredXf".
	"%xyz%abc%def" will match "___XYZ__ABC___DEF" or "XYZABCDEF".
•		Limit type Alerts can now be negative. A limit alert has two numbers, Min and Max.
	If both numbers are positive then the alert is triggered when the value exceeeds Max and will not re-trigger until the value falls below Min.
	If both Min and Max are negative then the alert is triggered when the value falls below Min and will not re-trigger until it rises above Max.
•		Created a Channel view on the Alerts tab. Its displays all triggered channels with
	columns for channel name, when last updated and how many times triggered.
•		The Alert view has now been moved to its own top level tab.
•		Alert view grid now has variable row height to accomodate long messages.
•		In Alerts view, the "View Alert object" command now jumps to the relevant user's Alert object rather than the folder.
•		The parameter Settings.Alerts.'Auto cancel' has been moved to Alert.Alerts.'Auto cancel'.
	Hence its can be applied per alert rather than for all alerts.
•		Table view: removed duplicates from Descriptions tab.
•		Table view, now has an additional style: Allowed targets are:
	"Table Row[Section=0]" or "Table Row[Section=0][Col=0][Value>1000]". Where Col or Value is specified the other
	must also be specified. The style will be applied to the whole row of a section based on the valued in the specified column.
	Allowed properties for this target are: Colour, Background-Colour, RowHeight.
	The RowHeight only applies when an individual section is displayed, i.e. not in the All or Merged tabs.
	Background-Colour and Colour apply in individual, All and Merged sections.
	Note that row styles can be overriden by cell styles.
•		Fixed Table view, Properties tab not showing units.
•		NEO-126. Fixed exception when in Chart view, "Save as Workspace data" is selected and selected folder was just deleted.
•		In Report object, Axis section units can now be set to "string" and "time".
	"string" means that a string scale will be created; "time" or blank means a datetime scale will be created.
	Anything other than those choices is a floating point scale.
	Previously it wasn't possible to assign a label to a string or datetime scale.

Version - NEO release (26-07-2016)
•		Chart Copy Image command now retains all settings such as zoom, trace colour changes etc.
•		Added support for Sybase in Table importer.
	Note: when connecting to Sybase you must explicitly set "Force Server Type" on the Workspace object.
	because it cannot automatically detect the difference from SQLServer.
	Fixed up double click on a SQLServer table not issuing the correct row limited query.
•		Slight change to naming of Scatter chart traces. Will name the X, Y columns using instance names where different else
	parameter names. The charting code also changed so if parameter names are used then trace name will be instance.param1-param2,  e.g.
	"QLD1.Price30min-Demand 30min".
•		NEOexpress now displays Tables and double click executes them.
•		When double clicking Tables, the query now includes a full list of the columns rather than *.
•		The "Screen - Light" theme is now stored in NEO and is used as the default theme if no theme is selected by the user.
•		Table view Merged tab now much faster.
•		Table view Merged tab first column can now be resized.
•		Added "Smart Paste - Update Mode" and "Smart Paste - Replace Mode" to Super Flat view. The only difference between the two modes is that
	in Replace mode, every multi-instance section is cleared of all rows first.

Version - NEO release (28-06-2016)
•		Changed "Find all references" when applied to Table objects so it searches all Variables "Query String" field for a whole word matching the Table name.
•		Fixed exception in Find Replace when replacing with invalid text.
•		Added Super Flat view.
•		Changed Table schema importer to use distinct in all queries.

Version - NEO release (22-06-2016)
•		Changed Design view so it does not offer "Delete Row", "Insert Row" etc if the object is read only.
•		Non object workspaces now also have their table schemas loaded and displayed on the Tables tab.
•		Table schema importer now runs in parallel with object importer thus speeding up start up.
•		Fixed bug in Table schema importer when there is duplicate OWNER, TABLE_NAME, COLUMN_NAME returned
	from an Oracle management table query.

Version - NEO release (16-06-2016)
•		The Batch view now has a right click menu item "Copy" to copy the selected cells and
	"View object" which will jump to the Report or Variable.
•		The Design view now has a right click menu item "Execute row" which will run just that row of a Batch Run. This is useful for debugging.
•		The Batch Run object, Reports tab now has a Disable column.
•		Modified Batch Runs and Batch Run Builder so so they also run Variables.
•		Fixed Batch Runs so reports which don't load correctly do not run. This avoids some caught exceptions.
•		Added Table Schema Importer. Automatically loads the table schema for any SQL workspace in the active Settings.
•		Internal: Updated some classes to use automatic properties.

Version - NEO release (03-06-2016)

•		The following have been removed from the Settings object and placed in Report Styles:
	- "Chart empty traces" becomes Chart.ChartEmptyTraces
	- "Table View exclude meta data" becomes Table.ExcludeMetaData
	- "Table View merge same datetime columns" becomes Table.MergeSameDateTimeColumns
•		Chart view right click menu, "Copy chart image" now offers popup menu choices for "1600 x 1100" (original full height), "1600 x 1000"
	"1600 x 900", "1600 x 900", "1600 x 700" (original half height was 650 but this is closest) and  "1600 x 1200", "1600 x 1300".
•		QueryTool: fixed exception when editing. Fixed first event in the event log not being displayed correctly.
	Added event log message for the query used to update cells.
•		Possibly fixed exception error message related to Oracle paths. It will now be a normal error message.
•		NEO-150: Fixed Settings object, Batch Run tab, "Update Cycle" not correctly handling values "Three Days" and "Three Hours".
•		Fixed in Chart view: when selecting a constraint in the legend for interconnector flow plus limits with shaded constraints it highlighted the wrong segments.

Version - NEO release (24-05-2016)

•		Commented out NeoInstaller.cs.
•		When a Batch Run is run it now shows a popup message rather than a dialog. This is to allow non manual operation.
•		Changed Alerts so that for the Equals condition, which assumes the values are strings, the comparison has now been changed to case-insensitive.

Version - NEO release (24-05-2016)

•		NEO-125: Fixed Collection view not opening after Find Replace.
•		NEO-137: Fixed "Copy reporting command" not including the correct theme.
•		Fixed unhandled exception in Alerts RunVariables().
•		NEO-145: Fixed QueryTool not restarting if closed down and then using "Run query in QueryTool" command in Event view.
•		Document Run now has extra parameters on Documents tab: "To Email Address" and "Subject".
	The Subject can contain macros: ExecDate, ReferenceDateTime, FileName.
	If "To Email Address" is not empty it will email the finished Word document as an attachment.
	Note that the "Open result in Word" option is ignored if emailing.
•		Removed throwing exception "Result of Inner Query is empty." because stacked generation grouped by fuel type would throw on no wind in QLD1.
•		If an XML result file is dragged and dropped into NEO it will be loaded into the Data workspace and
	displayed on Object view. If a folder of such files is dropped then a Data folder of that name is created in the Data workspace and every XML file is loaded into that folder.
	The purpose of this feature is to allow easy manual comparison of results.
•		Batch tab, Details column now also lists the Row from which that Batch Run item comes.
	The Batch tab Status column now also shows two other possible statuses: ErrorLoading and ErrorRunning. This is to assist validation of reports via "Batch Run Builder".
	Order of fields changed on Batch tab. Batch tab will now also lists reports that did not load correctly and shows them as ErrorLoading.
	Previously these would not have been displayed in the Batch tab.
•		Created a "Batch Run Builder" (BRB) which basically creates one or more "Batch Run" objects
	from Report folders. It has a "General" multi-instance section in which each row specifies a "Report Folder", "File Results Folder" and a Batch Run folder.
	All Reports in the nominated "Report Folder" and sub-folders will be placed in a Batch Run object which will  be created in the nominated "Batch Run Folder"
	and will have a the same name as the Report folder. The "Save File Name" will include which row in the Batch Run and the file folder set by "File Results Folder".
	The BRB also has a "Values" multi-instance section with two columns "Object Type" and "Value".
	These are used to populate the Batch Run "Instances" field. Typical values would be ("Region", "NSW1"), ("Plant", "BW01"), ("FCAS", "LOWER5MIN").
	The purpose of this feature is to allow Batch Runs to be built that will allow automatic testing of large numbers of Reports and also allow comparison of results between versions.
•		The "Batch Run.General.Result folder" parameter has been renamed to "Workspace Result folder" because it is otherwise too easily confused with a file system result folder.
•		The "Batch Run.General.File Results folder" parameter has been added which will be used to resolve a file path if the "Save File Name" parameter is relative.

Version - NEO release (27-04-2016)

•		Added context menu command to Event view - "Run query in Query Tool".
	This allows user to run NEO query on the newly included Query Tool application.
•		Fixed QueryTool: now correctly sets Edit status if table schema is loading; error messages
	during editing are now routed to the correct Event view and now appear in the popup.
•		Changed error popup to black text on white background .

Version - NEO release (30-03-2016)
•		Fixed scripting not being able to set column formatting in Table view.
•		Fixed "Datetime to index" processing when report start time is not 00:00.
•		Fixed version number of main menu.
•		Changed the handling of the Report Axis section so that a time scale is only created if the Type is Horizontal
	and Units are blank and the Label is not blank. If the Label is also blank then it is ignored. This is to handle
	legacy reports which seemed to have a default row with Type Horizontal and Units and Label blank
•		Added "View Object" context menu command in Flat view.

Version - NEO release (22-03-2016)

•		Fixed: Exception in FoxOracleTnsnames() due to no Path environment variable.

Version - NEO test release (17-03-2016)

•		NEO-137: fixed theme being added to NEO Reporting command when no theme is selected.
•		Added Design view contextmenu item when viewing the General section of a Favourites object, "Execute row".
	This will execute that row of the Favourite as if it had been selected from a Favourite on the LHS.
•		NEO-144: Added "Two Hours" as an option for Report execution period.
•		NEO-143: Changed so when starting, the FromDate and ToDate default to today and today plus one day respectively.
•		NEO-11: Fixed when setting datetime in a blank field not being able to select Today.
•		NEO-111: Style Editor now closes if another report is executed..
•		NEO-128: Fixed "Chart Surround.Colour" style for Pie charts.
•		NEO-130: Fixed "Chart Trace.Order" style. There was a problem when the traces used different units.
•		"Find all references" now no longer searches the Data workspace.
•		NEO-131: Fixed Windows Authentication not recognising groups.
•		NEO-140: Fixed problem with Batch Run sending blank email if output type is not set to Email and "All results in one email" option is selected.
•		NEO-141: Fixed Slide Shows not executing from Favourite.
•		Added code to automatically set the TNS_ADMIN environment variable within the Neo process
					if it has not already been set. The value is inferred from the Path variable.
					If TNS_ADMIN is set then a message is added to the eventlog. Ideally if a user sees this message they
					will manually set this environment variable.
•		Added Compare view. Changed view selection buttons to show name rather than icon.
•		With connections strings on Workspace which have Type=Oracle, it now automatically
					removes "Unicode=" or "Integrated Security=" from connection strings.
•		NEO-76: When NEO starts it now checks if the NeoLocal.xml file exists, if not it then checks
					if it exists in the most recent releases and copies it.
					It will only do the above if:
					- the LocalLocation (as stored in the Neo.exe.config file) is not ProgramFiles; AND
					- the LocalName (as above) is a relative file path.
					Currently it will search the 4.9.2, 4.9.1, 4.9.0 etc. folders in that order.
•		Changed Oracle provider from System.Data.OracleClient to Oracle.ManagedDataAccess.Client.
	The connection strings are the same but must not include "Unicode=" or "Integrated Security=".
	Note: some customers who use Oracle may get errors with this new Oracle provider such as:
	"ORA-12154: TNS: could not resolve the connect identifier specified".
	This is caused by the Oracle provider not being able to find the tnsnames.ora file.
	This can be fixed by the customer setting the environment variable TNS_ADMIN to the folder containing the tnsnames.ora file.
	This can be done as follows:
		- from the Start menu click Settings and search for Environment then click on "Edit the system Environment Variable".
		- click on the "Environment variables..." button.
		- under "System variables" click the Path variable then "Edit..." then look for a path like "C:\Oracle\64\product\11.2.0\client_1\bin"
		- copy this then click on "New..." and set the "Variable name" to TNS_ADMIN and set the value to the path above
		but remove the "bin" at the end and add "\network\admin" so e.g. it would look like:
•		Changed error toast to be white text on an orange background.

Version - NEO release (18-02-2016)
•		Added Chart context menu item: "Copy Image - Half Height" which will render at 1600 x 650 instead of the usual 1600 x 100.
•		Fixed problem with a report being cancelled by the user causing Alerts to no longer return data
	when running Alert Variables.
•		Documentation: "Doc Run" does not work with versions of Word older than 2016 that use text boxes.
•		When "Doc Run" executed it will now output all reports run to the Eventlog using new Event type Batch.
•		Fixed single quotes in report names using "Copy reporting command".
•		Flat view changes as follows. Noticed it wasn't cancelling the potentially slow task list of building the object list.
	This only comes into play if the user clicks on one extremely large list then immediately clicks on a different one.
	Changed listing so objects are in alphabetic order of path. Created Monitor and Alert Variable on NEOMOBILE.NM_SCADAEVENTS to do testing.

Version - NEO release (15-02-2016)
•		Fixed Document Run RefDate macro update not being applied. Also added a RefTime macro "yyyy-MM-dd-HH-mm".

Version - NEO release (12-02-2016)
•		Table columns which have been styled for a particular width can now be resized by the user.
	Note that because once a column of a certain name has been resized by a user, then all columns with that name inherit that width thus disabling report styling of that column.
•		Fixed Document Run so the "Reference Date", if left blank, will be AEST at the time the Document Run is executed NOT when it was loaded.
•		Added "Alert" as an option on the Policy object.
	Added Alerts as a button in Event view so it shows the number of Alert events and can be used to toggle display of Alert events.

Version - NEO release (10-02-2016)
•		Alerts Variable: changed the "Conditions" parameters choice of "Equals only" to mean "Equals or None".
	Now Alerts Variables that were so marked can now have Alerts that use them also set to Condition=None.
•		Alerts when triggered or acknowledged are now written to the eventlog.
•		Many of the Alert messages in the Eventlog that were classified as Initialisation are now Debug.
	Alert view now indicates whether alert was manually or automatically acknowledged.
•		The Settings object "Alerts" tab now has an "Auto cancel" option. If selected then if an alert is unacknowledged
	and the condition for that alert no longer exists, then the alert is automatically cancelled.
	For example for a 5min price alert if it triggers on QLD in one period and then on the next period it is not triggered then that alert would be automatically acknowledged.
	The Alert view and the eventlog messages distinguish between an alert that has been acknowledged by the user or automatically cancelled.
	If the Alert dialog is being displayed it will be updated to show the latest unacknowledged alert or will be hidden if there are none.
•		Note: In terms of the Limits condition, it works slightly differently in conjunction with the auto cancel option.
	If Limits triggers by the upper limit being exceeded, then on the next period if it is still above that limit then
	it is deemed not to have triggered. Normally this would mean it would be auto cancelled BUT if its still above the upper limit it won't be until it falls below the upper limit.

Version - NEO release (03-02-2016)
•		The Settings object "Batch Runs" tab can now select "Batch Runs" and "Document Runs".
	The Batch view now shows progress on "Batch Runs" and "Document Runs". Some of the columns have changed.

Version - NEO release (29-01-2016)
•		Changed "Document Run" object so General tab has "Open result in Word" parameter.
•		Fixed Batch Run error.
•		Changed Alerts so a Condition=None will trigger and a Condition=Equal will also trigger if Value is empty.
•		Fixed Design view, right click Explore on a file path field.
•		Right click on chart now has extra context menu "Copy reporting command" with sub-menus for Chart, Table, AddToTable, Using, Value.
	The command places a NEOreporting command on the clipboard which can then be pasted into a Word document for subsequent processing through NEOreporting.
•		Fixed Table view, Merged tab not showing the Table Column ColumnWidth. Fixed Table Cell style applying to DateTime columns.
•		The "Document Run" object now has a General section with parameter "Reference Date".
	This sets tha date used by period codes. If left blank it will be interpreted as AEST, i.e. as used by AEMO.
	The "Output file" parameter in the Documents section can now contain an optional macro "%{RefData%}" which will be replaced by the "Reference Date" parameter.

Version - NEO release (26-01-2016)
•		B5928: Table cell style now has option for "like" function by using the ~ operator, e.g. in the
	report "Services\NeoPoint\NeoMobile for NeoPoint\Market Notices\Market Notices excluding non-conformance table"
	we can add this style: Table Cell[Value~coffs], Background-Colour, #FFE60448 to highlight market notices about Coffs Harbour.
	B5932: "Table Cell" target does need a Value argument. This allows setting the foreground and background colours of any column.
	B5933: "Table Column[Col=][Section=]" is now a valid target with available properties of Background-Colour, Colour and ColumnWidth.
	This is analternate way of setting a columns colours but it is overriden by Table Cell.

Version - NEO release (25-01-2016)
•		Created a "Document Run" object on the Config tab. It has a Documents multi-instance section with "Template file" and "Output file". Double clicking the object will run it.
•		NEO Reporting - added new command "addtotable". The "table" command creates a new table but "addtotable" fills in a following table. The advantage of this is that it will use the column and table widths and the cell styles like font size, width and colour.
	If the existing table has two rows then the first is assumed to be a header in which case the header from the data will not be written out.
	The "table" command now has an optional "style" parameter to set a Word style to a table.
•		Added condition "Sequence" to Alerts. Two values must be supplied which we call min and max. When NEO first starts
	the alert will only trigger if the value exceeds max. Once triggered it will only re-trigger if the value falls below min.
•		Changes to Alerts as follows:
		- Alert now has an "Alert colour" parameter for setting the background colour of th alert in Alert view.
		- Alert also has a "Repeat sound" parameter being the number of seconds to wait before replaying the alert sound if the alert is unacknowledged.
		- Alert also has a Priority parameter. If multiple alerts are triggered then the one with the highest priority will have its sound played.
•		NEOreporting is implemented. It will take an input Word document, extract "markup" or commands and copy it an output
		document with the same name but an _out added to the name, replacing the markup with the relevant charts, tables or values.
		All markup is enclosed in double arrows, e.g.  command. Any string arguments can be optionaly enclosed in single quotes.
		The available commands are: chart, table, addtotable, using, value. The format for each command is as follows:
		The chart, table, addtotable, using an value commands all support the following:
			report - this is the path of the report to execute without the workspace or object type.
			from - the from date, e.g. 2010-01-21
			period - the period of the report from one of: FiveMins,ThirtyMins, ThreeHours, OneHour, Daily, TwoDays, ThreeDays,
						FourDays, FiveDays,Weekly, Fortnightly, Monthly, Quarterly, HalfYearly, Yearly, TwoYears.
			pc - this is a period code. It can be supplied instead of from and period. If both are supplied, period takes precedence.
			instances - this is a semi-colon separated list of step instances.
		Additional chart commands:
						w - width in pixels for chart to be rendered.
						h - height in pixels for chart to be rendered.
						For both w and h divide the number of pixels by 300 to get the size in inches as it appears in the Word document.
						theme - path to a Report Style object for changing chart appearance.
						using - can be the name of a using that has been previously defined
					Additional table commands:
						using - can be the name of a using that has been previously defined
						style - the name of a Word style
					Additional addtotable commands:
						using - can be the name of a using that has been previously defined
					Additional value commands:
						using - can be the name of a using that has been previously defined
						s - section can be index or name of section
						c - column can be index or name of column
						r - row in column.
					Additional "using" commands:
						name - defines the name under which the report results can be stored. This name can then be used in any chart, table or value command
							to retrieve those results
					The following example lines print a chart, define a using print a table using that using, insert some values in a paragraph.

•		B5937: Data service now offers charts. To use get the "Copy Service URL" and modify "xml" to "chart". You can also set the width and height with parameters "w and "h" which have defaults 1280 and 1024.
	Another optional parameter is "theme" which if set must be the path to a "Report Style" object.
•		Batch Run nows has a "Report Style" parameter. This will set the them used for chart rendering.
•		Fixed Batch Run not consistently running when first started.
•		The Account object now has a "Last Used" and "Expires after days" parameters. If "Expires after days" is 0 then the Account does not expire otherwise if the Account has not been
	used within that number of days then the login will fail. To reinstate an account, an administrator can just clear the "Last Used" field.
•		Fixed Report Styles editing when Target starts with a !. The problem was the Property drop down was blank.
•		Changed Search dialog title to show full path.
•		Chart context menu "Save As-File Image" was saving to 1600 x 900 but now saves to 1600 x 1100 - same as "Copy Image".

NEOpoint Changes

Version 20190605 - Released to production 05/06/2019
05/06/2018		Reformatting of /Source/Index.
05/06/2018		Fixed selecting report in /Report/AllReports. Problem was undefined period.
04/06/2018		Changed /Report/Main so it allows setting the from date hour and minute (as a multiple of 5mins).
04/06/2018		Fixed Report Style handling of Chart Trace, DashStyle.
31/05/2018		Added pcode %p12. This is the ConvertStringToDateTime option which will convert the first column of a resultset
				from string to datetime. The main purpose is to support SQLite which can't natively handle datetime.
31/05/2018		Internal: Created Pcode class and refactored query code. This will require testing of all pcodes.
30/05/2018		Added support for SQLite.
30/05/2018		Fixed chart scaling of float option.
30/05/2018		Fixed Gantt chart handling of changing colours.
24/04/2019		Added nuget package for Oracle.ManagedDataAccess because one user could not get install to work
				because of no Oracle provider.
04/04/2019		Moved some javascript files from /Report to /Framework. This is done to assist transitioning
				NeoMobile to using more NeoPoint code, specifically the mobile view.
02/04/2019		Slight change to /Dashboard/RunTable so that the table header uses a space rather than a dot to separate
				the title parts thus allowing word break during table render.
				Also some changes to ReportView.css to allow table headers to break over two lines.

Version 20190402 - Released to production 02/04/2019
02/04/2019		Fixed "Save as HTML:" not working for tables. This was due to a change in the previous version.
02/04/2019		Fixed /Sources/Index so when a report is clicked it will run. It was missing the period.
02/04/2019		Changed /Sources/Index so it load the schema first, renders it then gets the favourites.
				This speeds up the first time the page is accessed from 35secs to 1 sec. The reason getting the favourites is slow
				is that it has to load every report referenced in the favourites so it can get the channel list
				and thereby list all reports that reference a selected table.
20/03/2019		Changed ActivityLog ctor so it is in a try/catch.
20/03/2019		Changed ActivityLog so it can handle non-MySQL databases.
11/03/2019		Refactored dashboard.js to remove all table rendering code to TableRender.js.
11/03/2019		Changed /Adminstration/SystemLog so table is opaque while paging.

Version 20190301 - Released to production 01/03/2019
01/03/2019		Timeout for QT queries changed from 60secs to 300secs.
01/03/2019		Changed /Data/Query so if there is an exception it will return the error message from the
						innermost exception.  This affects QueryTool.

Version 20190228 - Released to production 28/02/2019
28/02/2019		Fixed /Report/Mobile so it now renders tables.
27/02/2019		Changed menu icon colors. Now green for toolbar and blue for floating pane menu.

Version 20190226 - Released to production 26/02/2019
26/02/2019		Noticed reduced activity since last release and the ActivityLog was throwing exceptions on inserts. Have now changed
						SQL insert statement to use IGNORE. Also changed /Service/Xml, Csv, Json to only log activity if it was not cached,
						i.e. if it results in a query being run. Still don;t know why last release would have caused this.

Version 20190221 - Released to production 21/02/2019
21/02/2019		Changed MerChartLoader so all calls to AddEvent() include the report path. This will allow us to find which reports
				are creating some warnings.
19/02/2019		Changed SQLProviderPeriodic classes handling of DBNull for datetime so it ignores it rather than throwing an exception.
				This fixes this report: " Report\Services\NEOpoint2\PASA\PASA MT\0_New 3 hour updates\Compare latest and any 3 hour update PASA Availability" which was throwing.
20/02/2019		Fixed Rectangle.Union() in Rectangle.js which caused a problem in standalone dashboard resizing.
18/02/2019		When a mobile phone logs in it now redirects to /Report/Mobile.
18/02/2019		Fixed /Report/Mobile so it correctly sizes charts etc when rotated.

Version 20190213 - Released to production 14/02/2019
14/02/2019		Fixed bug in ReportPeriod where it used DateTime.Now instead of DateTime.UtcNow so periodcodes less than a day
				were shifted one hour.

Version 20190213 - Released to production 13/02/2019
13/02/2019		Added two Administered pricing reports under 101 Prices: Administered pricing - ENERGY,
				Administered pricing - FCAS.
				Added four SRA reports under "106 Flows and Constraints": "SRA Revenue 30min", "SRA Revenue 30min (Calculated)",
				"SRA Revenue 5min (Calculated)", "SRA Revenue 30min Bar".
13/02/2019		Changed RestartMonitor.js so it calls /Status/Alive instead of /Home/Alive. Because /Home/Alive was not being handled
					concurrently it was being blocked by a long running request which meant the browser kept restarting.
					The Status controller has [SessionState(SessionStateBehavior.Disabled)] which allows concurrent requests.
11/02/2019		Report step instances can now contain multiple values. The values must be split with a pipe (|)
				character. In the query they are accessed by adding an additional .N, so e.g. %s1.0 accesses part 0
				of the step 1 instance and %s1.1 access part 1 of the same instance. A sample instance would be
				RAISE6SEC|RAISE6. This code change is required to run the FACS Administered Price report.
31/01/2019		Fixed problem with /Service/Json returning Nan as a blank. It now returns null. This was required to get the service
				to work with Excel. Sample steps to load JSON into Office365 Excel.
				-	Open Excel, click on Data tab
				-	Click “From Web”, make sure “Basic” is selected
				-	paste in URL, e.g. http://localhost:24414/Service/Json?f=101+Prices%5CRegion+Prices+5min&from=2019-01-31&period=Daily&instances=NSW1§ion=-1&key=123Iesys
				-	Click OK
				-	Click Transform tab and click “To Table”, then click OK on the dialog
				-	You will see a table with one column with the header “Column1”, click on the icon just to the right of “Column1”.
				-	Click OK
				-	Click “Close & Load”

Version 20190124 - Released to production 24/01/2019
24/01/2019		Fixed problem in /Report/Main where if a table only report was run, the table was not automatically displayed.
24/01/2019		Fixed ParseCSV.Encode() which affects export of CSV. The problem is that while it detected
				'\r' and enclosed it in double quotes it didn't detect '\n'.

Version 20181213 - Released to production 16/01/2019
19/12/2018		Slight change to /Reports/Main. "Add Report" just adds a fixed size pane and no longer arranges all panes. 

Version 20181213 - Released to production 14/12/2018 
21/11/2018		URL used by Intercast: 
				Checked and still instanceable.
21/11/2018		Major refactoring of ReportModel. Created RunModel, VariableModel, TableModel, ReportPeriod classes. 
				Some testing required.
19/11/2018		Fixed RestartMonitor so it doesn't display "Unknown".
06/11/2018		Fixed /Administration/GetEventItems so it works with the password, i.e. without login.
05/11/2018		Changed StreamResultCsv class to not include type in the header row. This affects
				Add /Data/Csv which is equivalent to /Data/Query?format=csv.
				Worked out an Rlang script to read CSV results for a query:
				query <= "select `SETTLEMENTDATE`, `RUNNO`, `REGIONID`, `PERIODID`, `RRP`, `EEP`,
				`PRICE_STATUS` from mms.tradingprice where SETTLEMENTDATE between '2018-11-1' and '2018-11-2' limit 0, 10000"
                     requ < list(
					query = query,
					key = "abc123",
				res <= POST("", body = requ, encode = "form", verbose())
				tab <= content(res, "text")
				read.csv(text = tab, header = TRUE)
				Also discovered this can be a lot easier to use for an Rlang programmer by creating a function then reusing that:
				RunQuery < function(query) {
					requ < list(
						query = query,
						key = "abc123",
					res <= POST("", body = requ, encode = "form", verbose())
					tab <= content(res, "text")
					read.csv(text = tab, header = TRUE)
				# returns a data frame
				RunQuery("select * from mms.tradingprice where SETTLEMENTDATE between '2018-11-2' and '2018-11-3'")

				Did briefly look at implementing an ODBC data source and it is insanely complex. It does appear
				to be easier to implement the wire protocol for MySQL or Postgres.

22/10/2018		Changed AlertLog and ActivityLog from using DbProviderFactories.GetFactory() to using
				SiteHelper.Resolve().GetDbProviderFactory(). Reason is that it wasn't working
				on of our local PCs.
22/10/2018		Changed Alerts so an email is not required to trigger an alert.
22/10/2018		Added "User Defined" report period. This shows the ToDate.
				In "User Defined" and "PeriodCode" mode the Prev/Next buttons are hidden.
12/10/2018		Changed Report/Mobile icons and fixed chart so bottom isn't cutoff.
12/10/2018		Changed web.config ResultsRetainDays from 300 to 30 days because all available disc space was being
				used up on our GCP instance.

Version 20180920 - Released to production 20/09/2018
03/07/2018		Changed /Report/GetTableData so it doesn't use paneIndex and changed TableResult to not inlcude ReportIndex or PaneIndex.
29/06/2018		Modified IES.Mercury.Reports.Services.DataService.JsonResult regarding its handling of numbers
				so if the RawValue is null it renders null, if its not a number e.g. NaN then its enclosed in quotes.
				The aim is to always return something that is legal JSON.
25/06/2018		Found bug in IES.Utility.Deque where it wasn't releasing a reference when PopFront() or PopBack() were called.
				In the case of IES.Neo.Web.FileResultCache, it meant the last 256 results were kept in memory resulting in high
				memory usage.
20/06/2018		Changed ActivityLog so the table it uses neo.np_activitylog now has a composite primary key
				of the rundatetime and account. The event writer now also ensure there is at least 1 1 millisecond
				difference between events for the same account.
				The np_activitylog schema also changed by adding source field, changed period from 2048 to 255 and changed
				details from 255 to 2048.
20/06/2018		Increased log connection string timeout from the default 15 to 60 seconds.
05/06/2018		Created Neo6 solution and NeoPoint3.1 project using .NET Standard 2.0 and .NET Framework 4.7.1.
23/04/2018		Fixed Alert Instances not saving.
23/04/2018		/Administration/EventLog changed so clicking on an event type will toggle showing events of that type.
				Changed some events to use Module. Changed Object Importer per row message to include the 'Notes'.
11/04/2018		Removed Category from Eventlog.

Version 20180323 - Released to production 23/03/2018
23/03/2018		For IES hosted, Account objects must now has a row in the Options sections where first column
				contains "NeoPoint". It will need "QueryTool" to enable the QueryTool service.
06/03/2018		Fixed "Export CSV" so datetime is in "yyyy-MM-dd HH:mm:ss" format.
08/03/2018		Range chart can now handle unlimited numbers of pairs of traces. If range bands are likely to overlap, a later pair is likely
				to obscure a an earlier pair, therefore it is recommended that the "Background-Colour" bet set to a transparent colour.
				Note: colour values are shown as eight digit hexadecimal values where the first two are the opacity and this is normally
				FF which is fully opaque. If you set the first two digits to 80 then it will be 50% opaque and 40 would be 25% opaque
				or 75% transparent.

Version 20180306 - Released to production 06/03/2018
02/03/2018		Added a new chart type "Range". Currently it only supports exactly two traces. It renders the traces
				by filling in the region between the traces and then renders each trace as a line.
				The colour of the region between the traces can be set using Report Styles with Target="Chart Range[Index=0]"
				and Property="Background-Colour".

Version 20180227 - Released to production 27/02/2018
27/02/2018		Fixed table view not updating if no data.
27/02/2018		Float over table result heading will show up/down arrows which when
				clicked on will sort descending/ascending on that column.

Version 20180226 - Released to production 26/02/2018
23/02/2018		Click in table result heading will sort ascending on that column.
23/02/2018		Harmonised table styles between /Report/Main and standalone HTML.
23/02/2018		Fixed /Report/Main not restarting with a period code.

Version 20180221 - Released to production 21/02/2018
21/02/2018		The DataController (used by QueryTool) now includes the account name in the query comments.
21/02/2018		Fixed eventlog not appearing when blue I button pressed in /Report/Main.

Version 20180213 - Released to production 13/02/2018
13/02/2018		/Administration/Channels now lists # times each channel is triggered and # of 5min
				intervals since server start.
08/02/2018		Internal: Alert code heavily refactored. Testing required for NEO and NEOpoint, NEOmobile.

Version 20180202 - Released to production 02/02/2018
02/02/2018		Reports were not auto-updating. Problem was the browser was caching the chart images.
02/02/2018		Fixed problem in previous release where when the server restarted the first report
				would display "Object reference not set...".

Version 20180129 - Released to production 29/01/2018
25/01/2018		Fixed /Reports/Main automatically restarting when server fails and then recovers.
					Internal: Removed Favourites class to Favourites.js for reuse in AllReports.
25/01/2018		Internal: Refactored /Report/GetAllReports and ReportPane.js Favourites "class"
					so the JSON package is fully recursive so dashboards can have unlimited levels
					but due to backwards compatability reports must still have two level paths.
					Changed Report controller so it seemlessly logins if no session but the RememberMe cookie
					has account and correct hashed password.
					This makes it possible to refresh a dashboard or report page even after the NEOpoint
						server has restarted.
23/01/2018		Changed menu items that appear on the pane and on the toolbar.
15/01/2018		Chart trace markers in line charts are now much larger and are now drawn so as to
				avoid them being too close together.
12/01/2018		Fixed /Report/Main so it uses the "DefaultPeriod" set in the web.config.

Version 20171103 - Released to production 19/12/2017
20/12/2017		Changed NP_ACTIVITYLOG to have no primary key but have an index on RUNDATETIME as there
				were too many duplicates causing the activity log to shutdown.
18/12/2017		Removed some irrelevant thread locks so Alerts can run less constrained, i.e. one Alert is less likely
				to affect another Alert.
				Internal: HydroTas reported large variances on when an Alert was run. Nominally they should run at 10 second
				intervals but it actually ran to 100s of seconds. After this code change they report much smaller variances
				and definitely less than the production version they use.
15/12/2017		Stacked bar chart processing has now been changed. X values do not need to be unique. Also if there is a
				third column of type string called "category" then each data point is assigned to that category and the
				category is added to the legend.
				Internal: Will require re-testing of stacked bar charts and other reports that use a string x axis.
				Internal: This new processing was requested by AEMO.
12/12/2017		/Report/Main pane positioning and resizing is now snapped to a grid of 10 pixels.
08/12/2017		Changed the error message "The Favourite with path 'xxxx' has invalid report on row" to
				aggregate all the rows into one message.
06/12/2017		Service controller activity used to show that a report was executed and not retrieved from cache
				by appending a "(X)". Now its "($)".

Version 20171103 - Released to production 06/12/2017
06/12/2017		NP_ACTIVITYLOG previously had no primary keys. Changed to composite key RUNDATETIME, ACCOUNT.
				RUNDATETIME has been changed from Datetime to Datetime(6) to give it microsecond resolution.
20/11/2017		Changed /Administration/SystemActivity so it always displays date as dd/MM/yyyy.
03/11/2017		Web.config now has an option "ObjectImporterVerbose" which if true then the
				ObjectImporter will list the names of all imported objects.
03/11/2017		"Enable messaging" now ticked on GOOGLE local XML!
03/11/2017		Increased the timeouts so Timeout has been increased from 30 to 300 and "Read timeout" is
				increased from 180 to 600secs.

Version 20171101 - Released to production 01/11/2017
01/11/2017		Changed /SystemActivity to show each domains count grouped by Report, Dashboard, Service, Data with a legend.
01/11/2017		Changed /Data actions to report time in f2 not g2 format.
01/11/2017		Changed GlobalExceptionAttribute to include the RawURL.
01/11/2017		/Service/Xml, Csv, Json should now correctly show an (X) if it resulted in a database execution
				and nothing otherwise.
30/10/2017		Changed /Dashboard/Alive so it doesn't require an ApiKey. Reason is there are sites out there that are
				not supplying one and are causing exceptions.
27/10/2017		Messenger now correctly handles changing permissions and therefore can be used for remotely setting NeoServer permissions.
				Internal: Major refactor of messaging and security code.

Version 20171017 - Released to production 17/10/2017
17/10/2017		Changed dashboard.js and DashboardController to use title case on Channels and Guid.
16/10/2017		Changed dashboard.js so an AJAX error will have the error message added as a data-error attribute on the tag.
16/10/2017		Changed GlobalExceptionAttribute so it always returns JSON. It used to test IsAjaxRequest() but this was inconveniently returning
				false when called directly from the browser URL bar, and on other unknown occasions, hampering debugging.
09/10/2017		Changed MercuryWorkspaceSQL.LoadObjects() so that LoadAllContent() is called within it and if
				the LoadAllContent property is not set then it loads all Account and Security objects. This greatly
				speeds up the CompileSecurity() method.
				Internal: Prior to the change GCP was taking 18 secs and after the change it takes 1 sec.

Version 20171006 - Released to production 09/09/2017
09/10/2017		Changed /Home/ServiceLogin so instead of the global exception handler, it returns Success=false, Message=exception.
09/10/2017		Fixed Links dialog so it excludes "pc" if period not equal to "Period Code" and excludes "from" otherwise.
09/10/2017		Changed /Service so the activity logs identify if request resulted in an execute rather than cache by putting a (X) at the end.

Version 20171006 - Released to production 01/09/2017
06/10/2017		Changed /Service so the activity logs identify the user as Service@domainname rather than just "@".
06/10/2017		Changed /Service and DashboardReports so they recognise a report is cacheable if PeriodCode is not empty.
				Previously it was cacheable if From was empty.
				Internal: Intercast were including From as well as PeriodCode so it was interpreted as non-cacheable. Problem
				was it was being called every 10 seconds.
08/09/2017		Changed ChannelDataMonitor so each Monitor is run on its own thread.
05/09/2017		Changed /Report/Mobile to /Report/Pad and created a new /Report/Mobile which has four "screens". The top level
				is the list of Favourites, clicking on a Favourite brings up screen 2 which displays that Favourite, e.g. Price or
				Demand. Clicking on a Favourite item runs the report and displays it on screen 3. A gear icon represents screen 4
				which has the usual toolbar controls like setting from date.

Version 20170901 - Released to production 01/09/2017
01/09/2017		Made dashboard.js same as the one in NeoMobile.  Changed RestartAfterInactivity() to work like
				a state machine. Steps through Idle, FirstFail, SecondFail, FirstSuccess the restart.
24/08/2017		Note: NEOpoint only uses an in-memory event log. Also it only keeps the FIRST 1000 messages.
24/08/2017		Changed ObjectModified message so it includes object path.
17/08/2017		An emailed alert now has the subject inserted as the first line of the email body. This was done because SMS gateways
				don't include the subject.
17/08/2017		On Alerts page, added "Retrigger only after resolved" parameter.

Version 20170728 - Released to production 28/07/2017
28/07/2017		Modified /Administration/UserActivity to display Query Tool activity with number of rows returned and
				execution time.
27/07/2017		Added Data controller to suppoer Query Tool web interface.
27/07/2017		Removed Include Weekends option form Report Usage.
25/07/2017		Added Feedback button to /Report/Main that pops up a dialog to accept a message from the user.
				The message and users email is sent to May want it to be configurable for customer installs.

Version 20170718 - Released to production 18/07/2017
17/07/2017		Added busy spinner GIF to each pane so it displays and opacity is halved when a report is running.
14/07/2017		Changed AllReports to also show the comment icon.
13/07/2017		Comment icon only shows if comment longer than three characters.
13/07/2017		More changes to ensure eventlog displays when report fails.
12/07/2017		Added Comment field to Favourite objects. If non-empty an icon is displayed next to the Favourite item
				and floating over it shows the comment as a tooltip. This was done to aid in testing.
11/07/2017		Added Info button to /Report/Main that toggles display of the eventlog. Changed code so eventlog
				is displayed even if the report was in error.
30/06/2017		Added MySql.Data provider. Changed ActivityLog and AlertLog classes to be generic instead of Oracle.
				Added AlertLogConnectionString to web.log.
19/05/2017		Internal: Client was getting unhandled expection that was causing the web app to restart.
				From the Event Viewer it appeare3d to be related to websockets and I am assuming must be related to SignalR.
				Discovered that NEOpoint has been using websockets in its SignalR code whereas NEOmobile was chnaged to long polling
				years ago.
				I have now modified the SignalR code to use long polling and have also added an unobserved exception handler.
11/05/2017		Update dashboard.js to allow setting attributes on the tr tag.

Version 20170501B - Released to production 01/05/2017
01/05/2017		Fixed if a Table View Only report is selected, running another report will not stick in Table view.
01/05/2017		Fixed: if a Dashboard folder is created and then clicked on no reports will display.
01/05/2017		If the Folder is blank when "Save as dashboard" is selected, then the dashboard will be saved
				in a folder called Default.
01/05/2017		Fixed issue with a Dashboard folder being deleted and still appearing in the drop down list
				of folders in the "Save as dashboard" dialog

Version 20170426 - Released to production 26/04/2017
26/04/2017		In Alerts, changed Limits to "Limits Up" and added "Limits Down".
19/04/2017		Fixed /Report/Main so it correctly switches to "Table - All", if a TableOnly report is selected.
18/04/2017		In /Report/Main added a button with a Lock icon that will lock all panes in place. When clicked the icon changes
				to an Unlock icon and when this is clicked it reverts to normal. The reason for the change is so users can select
				text in the table view.
18/04/2017		In /Report/Main, moved the buttons for "Export CSV" and Help to the pane menu. Removed the Mobile button and replaced it
				with "Mobile Reports" in the main breadcrumb menu.
18/04/2017		Fixed /Alerts/Notifications. Problem was due to AlertDt saved as null due to parameterised query issues.
18/04/2017		Fixed up escaping of string in JSON generated via JsonDataResult(), e.g. /Mobile/Json.
10/04/2017		Modified the breadcrumb menu from "Sample1", "Sample2" in /Custom to "Custom dashboard samples" and linked
				it to the nine samples in /Samples. Modifed the samples to better showcase NEOpoint capabilities.
20/03/2017		Requests to the Service and Dashboard controllers previously returned unhelpful exception messages with a stack trace.
				This is now changed to report the RawUrl and IpAddress to the eventlog.
20/03/2017		When Alerts are first being processed on startup any errors are now reported to the eventlog.
20/03/2017		Added LogAllAlertEvents to web.config to allow debugging of Alerts. Warning it does
				generate a lot of eventlog messages.
20/03/2017		Previously an incorrect login was not logged to the EventLog. It is now record with
						account and password entered, IPAddress and EventLevel=Debug.

Version 20170308 - Released to production 08/03/2017
08/03/2017		Fixed problem where Dashboard non-folders where displayed at the root level.
08/03/2017		When browser window is resized it now automatically resizes the dashboard.
03/03/2017		Fixed Gantt charts.
27/02/2017		Increased Json serialiser limit to 4MB for /Report/GetTableData.
27/02/2017		Changed dashboard.js so that if the web server is down it reports this correctly
				rather than throwing an unhandled exception.
27/02/2017		Monitor now reports query errors. This was disabled in a previous version.
				Number of Monitor errors now limited to 20.
27/02/2017		Removed warning for emails sent with a "To" that doesn't contain an at sign.

Version 20170225 - Released to production 24/02/2017
24/02/2017		Added /Administration/Command page to show current logins which is interpreted
				as anyone that has run a report in the last 5mins.
24/02/2017		Fixed ReportUsage not displaying.
22/02/2017		No longer uses right click to bring up menus. The global menu is a button on the toolbar.
				In the pane currently being hovered over: a resize square appears in the bottom and
				a menu button appears in the top right.
22/02/2017		Link to Manual now opens in a separate window.
15/02/2017		Changed CompileModifiedObject() so when there are remote object changes to Account objects
				it checks to see if they are within the account folder otherwise ignoring them. Similarly
				for Favourites it checks if the Favourite is one already being used. Note it will ignore
				ones added.
15/02/2017		Fixed login page so links to NEOpoint dashboard designer and mobile app are
				easier to see.
15/02/2017		Fixed initial pane so its all green. Was a broken image link with one line of green.
20/01/2017		Internal: Fixed /Mobile/Json returning invalid Json when number returned was empty, it will return null now, change would affect /Service/Json as well
20/01/2017		Internal: /Mobile/RunReport now returns channels version information
12/12/2016		Added section = -2 for /Service/Xml for merged table data
06/12/2016		Added context menu item "Arrange" which lays out the panels.
05/12/2016		Fixed up activity log so reports on ExportCsv and reports correct username for APIkey access.
				Added MACHINE field to NP_ACTIVITYLOG table which records NEOpoint server's machine name.
				Web.config ActivityReportAllMachines can be true or false. If false SystemActivity and UserActivity
				will only show activity from that machine.
30/11/2016		Added search highlighting in /Administration/SystemActivity.
30/11/2016		Fixed bug in Variable Channels parameter where spaces were not trimmed.
17/11/2016		Changed /Main/Report to be RESTful. This allows for multiple independant windows.
				The following classes are now no longer used: ServerModel,
				ClientModel, RunReportResult, HelpResult, ServerPaneModel, ServerReportModel.
14/11/2016		Tab description in browser will display favourite name in Reports View Desktop mode only.
10/11/2016		Added /Home/Alive action return short message. This will be used by NeoServiceMonitor
				to check if the service is running.
10/11/2016		Fixed chart in /Report/Main not being rendered until resized. This happens if the
				ActivityLogConnectionString is empty in the web.config.
07/11/2016		Alerts that are not associated with a valid unexpired Account will not be loaded.
07/11/2016		Fixed exception when unsubscribing from an Alert that has already been deleted.
02/11/2016		The current username is available to any queries via %{username}.
02/11/2016		Added error messages to system event log for duplicate API keys.
27/10/2016		Style changes to table view.
27/10/2016		Fixed themes changes in /Report/History.

Version 20161026B
26/10/2016		Fixed themes changes so they take immediate effect and also effect history.
26/10/2016		Fixed remote object updates so changes to Favourites or Account objects take immediate effect.
				Note: a user will still need to use the browser refresh to any new reports added to a Favourite
				or any new Favourites.
26/10/2016		The /Alerts/Notification page now has a "Delete history" button to delete all notifications for this user
				on this machine. The page displays the number of records deleted.
26/10/2016		Changed recording of activity and getting history to use the "effective name", which includes the local and domain parts,
				rather than the username, e.g. the effective name would be ron@administrator whereas the username is administrator.
21/10/2016		Fixed problem in browser where right click "Copy Image" does not paste. The reason is that the URL used to paste does not have any session
				hence was disallowed by the Report controller. Have created an "IgnoreLogin" attribute and applied to the ChartImage action. Also had
				to modify the Chart image actionto also take a theme and modify the chart URL to include the theme - reason being that since the ChartImage
				action is now sessionless we can't obtain the theme from the session.
19/10/2016		Fixed report not running with an instance containing the hash (#) character.
11/10/2016		Moved OpenReport action to mobile controller, changed output from XML to JSON and fixed it.
07/10/2016		Noticed that if you select a region report then set instance as SA1, then run another region report the instance
				doesn't stick as SA1. The problem is that the Favourites were defined with a fixed instance. Manually removed the instances.
05/10/2016		On the Mobile controller, added actions: RunReport, Chart, Json. RunReport now returns a guid which can then be used
				to get a chart or Json formatted data for a specific section.
04/10/2016		NEO-188: Fixed exception in Corporation Supply Curve report run on current day.
04/10/2016		Fixed problem where Messenger was not restarted when NEO restarted.
04/10/2016		Removed call to RemoveUnusedSecurityObjects(). This deleted Security objects that were not referenced. At this stage it is problematic
				due to Messaging.
12/09/2016		Fixed XML dataservice not returning valid XML file name - it contained a comma which is not allowed by Chrome, though it works in Edge.

Version 20160919
19/09/2016		Fixed XML dataservice not returning valid XML for merit order stack reports, reason was datetime in column names had ':' which are encoded now.

Version 20160912
12/09/2016		Report table rendering now converts embedded CRLF to br tags.
				When exporting CSV, any cells containing CRLF are now enclosed in double quotes.
08/09/2016		Added /Administration/Channels page that lists all triggered channels and when last triggered.
08/09/2016		All paging controls such as in System Log are now changed so Next button comes before page buttons.
				This means the user can keep pressing the Next button without it moving.
06/09/2016		Fixed bug where if you run a /Service URL then the ApiKey becomes invalid.
31/08/2016		NEOpoint now implements two way global object updating.
19/08/2016		Internal: Changed dashboard.js to initialise the hub connection url when dashboard.Initialise is called. It used to only update hub url on load.
05/08/2016		Logins can now optionally be using an email address. If the account is then any account like will work. Note all accounts on that domain will have the same password.
				In the case of web.config parameter IESHosted==true, the user is expected to login with an email address, domain
				part of the email is the account which would be and the password will be the same for all users.
				The local part of the email, e.g.fred is used to access or create an Alert object of that name in an Alert
				folder "".
				In the case of on premise, the user would just login with a name or an email address.
				The main difference is that in hosted there is an extra level with a folder per domain part then an Alert object for the local part.
05/08/2016		Removed support for federated logins from NEOmobile.

Version 20160722
22/07/2016		Fixed Javascript Favourite rendering code. It was rendering items as headings if they were the first item.
				Added "204 Gas GSH" Favourite.
20/07/2016		Alerts controller now also accepts RESTful key as well as username, password.
				Mobile apps can use /Home/ServiceLogin?username=&password= and get an apiKey in return on successful login.
15/07/2016		Added logging to /Dashboard/Chart, RunChart, RunData, RunTable.
13/07/2016		When pasting in a typeable or pastable link, if RememberMe was not ticked it did not redirect
				to the pasted URL. This is now fixed.
07/07/2016		In Web.config, the NeoLocalFile variable now sets the full or relative path
				name of the NEOLocal.xml file. If relative then it is assumed to be
				in the App-Data folder. If left blank then the file name is assumed to be NeoLocalWeb.xml
07/07/2016		Fixed exception in dashboard designer if setting properties without first selecting a cell.
06/07/2016		Added print option on dashboards.
06/07/2016		In /Report/Main, the Table view now also has a Merged tab.
				Did some minor restyling of the table view so datetime column is a min width.

Version 20160615
15/06/2016		Added forward/backward/list history buttons to desktop and mobile report views.
15/06/2016		Fixed Report history view not showing history. Given history is now accessible in the report
						view it is doubtful we even need to retain the Report history view.

Version 20160608
08/06/2016		Added action /Service/OpenReport to facilitate NEOpoint mobile app.
25/05/2016		Activity log now shows data service calls in green.
25/05/2016		Added activity logging to all data service calls.
25/05/2016		Fixed History throwing an exception if no activity log configured.
08/04/2016		Fixed /Alerts/Index Value watermark.
08/04/2016		Updated Alerts, Events, Report Usage etc to use same table styling.
08/04/2016		Fixed /Report/History. Problem was Oracle LIKE is case sensitive.

Version 20160316
16/03/2016		INTERNAL: Removed Help page, merged NEOdashboard and NEOpoint tour guides
16/03/2016		Changed Help page to User guide which downloads it as a pdf document.
16/03/2016		INTERNAL: Moved no longer used items to Archive folder, which itself is moved to App_data folder
16/03/2016		NEOdashboard has been merged into NEOpoint pages and accessible as menu item 'Dashboards'.
15/03/2016		INTERNAL: Added new customer-neopoint web publish profile for installer for customers with specific web.config using configuration as Release-Unlicensed.
15/03/2016		INTERNAL: Moved NeoModel.xml file outside of App_data folder and moved Documents folder inside the folder, so
				that the folder can be excluded by web publish for customer
15/03/2016		INTERNAL: Added new web.config 'TestRelease' to be used by 'Dev_Neopoint' publish to WEB-PREPROD for testing
				Also, added another web.config 'Release-Unlicensed' to be used for clients publish to folder
21/12/2015		Updated Alert conditions to use the new types such as Between, Outside.
14/10/2015		Minor refactoring of AccountModel ctor so it takes the "AccountFolder" as an argument instead
				of directly accessing the ConfigurationManager.
				Added more documentation about Accounts, i.e. they must all be immediately in the designated folder.
				They must not be in a sub-folder. Also all groups are ignored.
13/10/2015		Fixed bug where dashboards using an Api Key would not work in Windows Authentication mode.
				In the Report view, Links dialog, if the Api Key is not defined for an account it displays an error message
				instead of a link.
13/10/2015		Removed code that rejected logins from Accounts that did not have the Favourite parameter set on the General tab.
				The code was ignoring the fact that you can also specify Favourites on the Favourites multi-instance section.
13/10/2015		Fixed uncaught exception when viewing Alerts or Notifications when AlertsEnabled=false.
				Changed so any .htm or .html files in the /Custom folder will be displayed on the drop down menu as links.
				The /Custom folder can contain any user developed web pages. Those pages can either rely on the user
				logging in as normal or can include a line of Javascript with NeoDashboard.Initialise('', 'apiKey');
				where apiKey is a valid key. The key is equivalent to account/password and there is exactly one
				ApiKey per Account object. This makes it flexible by either not requiring a login or requiring one
				to access a custom dashboard page.
09/10/2015		Add RowColIndex() function to dashboard.js to simplify some dashboards.
				Changed links in drop down list in main report view to use section=0 as it was -1
				but that was returning nothing.
08/10/2015		Alert email exceptions now being logged with InnerException as well.
				EmailHelper.SendEmail now using "using" on "new SmtpClient()" to properly send QUIT message
				to email server.
07/10/2015		The Alert history wasn't listing all alerts because users were sometimes logging in with
				differently cased account names. It has now been made case insensitive.
02/10/2015		Due to problems with duplicate alert emails and notifications, have added a PID column to
				the NP_ALERTLOG table to store the process id.
30/09/2015		Fixed Export CSV which wasn't exporting all the rows.
				Fixed password only access to /Administration/SystemLog.
29/09/2015		Changed dashboard.js so /RunData handler gets called with the raw data not just the values.
				This is required so that the handler can access the ColNames and the ErrorMessage.
28/09/2015		Changed /Dashboard/RunData so it also include ColNames.
				Changed /Dashboard/RunTable so Values are returned not as one large array but as an array of rows
				where each row is an array.
				This is to allow Fiddler to more easily see the values.
16/09/2015		Added /Dashboard/GetInstances.
				Removed some samples and fixed all the rest. There is now a single link to the sampled from the About page.
16/09/2015		NPTW-40: Fixed issue with Alert object list not getting refreshed when new user alert object is added.
16/09/2015		NPTW-39: Fixed issue with Alert object/folder getting duplicated as username passed was case-sensitive.
04/09/2015		Fixed problem with /Dashboard/RunTable?section=-2 as it was not merging datetime columns.
				Also added section=-3 which works like the new Merge section in Table view by merging all datetime
				columns even if they have different periodicity.
02/09/2015		Fixed AlertLog.GetPage() so it pages correctly.
02/09/2015		Added "ResultsFolder" to web.config to set where results are written instead of hard-wired
				to "App_Data/Results".
01/09/2015		Changed GlobalExceptionAttribute to return HTTP status=200 instead of 550 for AJAX
				requests that throw an exception. They now also populate the ErrorMessage and set Sucess=false.
01/09/2015		Alert emails now have a link to unsubscribe which does not require logging in.
31/08/2015		Alerts now have a "Send test alert" button.
				Added Sound as an option for the alerts. This parameter has a drop down field of available
				sounds which is populated from the *.wav and *.mp3 files in the /Content/Sounds folder.
04/08/2015		Added AreCookiesEnabled() to site.js and changed login page to detect if cookies are not enabled
				and display a message.
				The Javascript no cookie detection does not work on some browsers so we still redirect to
04/08/2015		Changed dashboard.js so that RenderTable() now sets the class of the table tag to the value of the
				"data-class" attribute of the containing div tag.
30/07/2015		Changed dashboard.js to use SignalR instead of polling every two seconds.
				Also encapsulated it inside an object so now some functions are hidden and any public function
				can only be accessed by prepending NeoDashboard, e.g. UpdateElement() is now called NeoDashboard.UpdateElement().
30/07/2015		Added web.config parameter ShowErrorsWarningsInAboutPage. Set this true temporarily to see errors and warnings in the About page.
22/07/2015		Converted System EventLog and Report views to use SignalR.
03/06/2015		Fixed DateTime.js and added CSS hacks to make NEOpoint compatible with IE8.
07/05/2015		Added a RESTful data service implemented as a Service controller with actions for Csv, Xml, Json, Chart.
24/04/2015		Created stubs for StylePropertyDropdownList etc to avoid confusing error messages.
				/Dashboard/Display now has a View button so if you click on a panel and click View
				it will jump to /Report/Main at the starting date but for a period of Daily.
				Fixed bug that incorrectly reported duplicate AlertVariables.
23/04/2015		Refactored Alerts to create UserAlert class which now collects Alerts and MobileAlerts.
				MobileAlerts are at this stage only implemented in NeoMobile3 but we were able to send our first mobile
				notification to an iPhone.
14/04/2015		Alert emails sent are now recorded in the Activity log. Some refactoring of Alerts.
				AlertVariables run the queries instead of the Alerts thus saving running the same query
				potentially many times for each Alert.
24/03/2015		Changed dashboard.js to stop multiple duplicate requests.
10/03/2015		About page changes. Removed dashboard samples and links to Neo versions etc. Added status of main modules
				and list of errors and warnings.
09/03/2015		Removed the IpAddress from the user name thats reported in the activity log. The IPAddress is changed
				from the ReverseDns() to just the address - reason is that it didn't add any value and its length was sometimes exceeding
				the NEOMOBILE.REPORTLOG IPADDRESS column length and causing the ActivityLog to shut down.
19/02/2015		The backdoor method of viewing the system eventlog was broken in that you can view the page but
				the event counts were wrong and clicking on any page would not display any events.
				The problem was that the event count and get event messages were separate requests that also had
				to have password set. This is now fixed.
13/02/2015		Changed typable and pastable links creation so they point to the view that created them. In other words
				if creating a typable link in mobile view, the link will be to mobile view and similarly for desktop view.
13/02/2015		Internal: /Report/Main had scrollbars on chart so set overflow:hidden.
13/02/2015		Internal: ClientModel.PrimaryReport is still serialised even though it has [ScriptIgnore] so changed it from public to internal
				and this does stop it being serialised.
13/02/2015		Chart reports now displayed as charts even if the display is currently set to table.
06/02/2015		Internal: Fixed dashboards and its functions. They were not working after change of mercury reference to long from int.
				Also, all lid are passed as string between javascript and backend as it cannot handle 64-bit long.
06/02/2015		Fixed issue with date changing by a day or more due to change in timezone.
				Internal: Changed json serializer to that allows to serialize date in NEO format, in client side, removed using javacsript object
				as it changes date to local timezone, instead using Ben's datetime.js to parse NEO date format for displaying in ReportView main page.
05/02/2015		Removed CDN links for bootstrap and jquery to local files.
11/11/2014		web.config now has ReportYearsAfter and ReportYearsBefore for setting year range in Report view
				date selector.
07/11/2014		Changed About page to clearly list current Windows account, list of groups and what
				NEO accounts those groups map to.
09/10/2014		Web.config now has "AlertsEnable" which can be set to false to stop alerts processing.
24/09/2014		User selected them now stored in cookie.
18/09/2014		Marked ClientModel.PrimaryReport with [ScriptIgnore] as it created extraneous JSON.
				Reports which are "Table View Only" will force the display to Table view.
15/09/2014		Changed so auto-updated reports are not recorded in the Activity log.
				User running a dashboard is now recorded in Activity log and when clicked on in System Activity
				view will jump to that dashboard.
21/08/2014		Modified ActiveDirectoryHelper to remove duplicate groups.
11/08/2014		DashboardDesigner home page now sorts based on Dashboard objects name in ascending order.
11/08/2014		Changed DashboardDesigner so various exceptions are not thrown when an undefined panel is selected
				"Report Properties" is clicked.
04/08/2014		Changed some Dashboard and Report controller actions which returned Content so they also
				return content type "application/json" as appropriate.
21/07/2014		Fixed RememberMe not remembering account.
12/03/2013		Added theme selection to title bar. Only Light or Dark currently offerred.
				Theming affects the HTML and the Chart.
				Reorganised About tab so it has links to all dashboard samples plus links to
				marketing pages for NeoPoint and NeoDashboard.