diff --git a/.gitignore b/.gitignore
index 159ef61d2..5a6192030 100644
--- a/.gitignore
+++ b/.gitignore
@@ -236,5 +236,4 @@ launchSettings.json
/Plugins/ScriptPlugins/VpnDetectionPrivate.js
**/Master/env_master
/GameLogServer/log_env
-/WebfrontCore/wwwroot/css/main.min.css
-/WebfrontCore/wwwroot/css/main.css
+**/*.css
diff --git a/Application/Application.csproj b/Application/Application.csproj
index 8f0cba878..8c38f9900 100644
--- a/Application/Application.csproj
+++ b/Application/Application.csproj
@@ -28,6 +28,7 @@
all
runtime; build; native; contentfiles; analyzers; buildtransitive
+
@@ -39,7 +40,7 @@
2.3.1.0
2.3.1.0
7.1
-
+
@@ -52,10 +53,7 @@
true
-
- true
- true
-
+
@@ -65,17 +63,17 @@
-
+
-
+
-
+
diff --git a/Application/BuildScripts/PostPublish.bat b/Application/BuildScripts/PostPublish.bat
index 31839a449..7931b04e4 100644
--- a/Application/BuildScripts/PostPublish.bat
+++ b/Application/BuildScripts/PostPublish.bat
@@ -1,129 +1,42 @@
-set SolutionDir=%1
-set ProjectDir=%2
-set TargetDir=%3
-set CurrentConfiguration=%4
+set PublishDir=%1
+set SourceDir=%2
SET COPYCMD=/Y
-echo Deleting extra language files
+echo deleting extra runtime files
+if exist "%PublishDir%\runtimes\linux-arm" powershell Remove-Item -Force -Recurse '%PublishDir%\runtimes\linux-arm'
+if exist "%PublishDir%\runtimes\linux-arm64" powershell Remove-Item -Force -Recurse '%PublishDir%\runtimes\linux-arm64'
+if exist "%PublishDir%\runtimes\linux-armel" powershell Remove-Item -Force -Recurse '%PublishDir%\runtimes\linux-armel'
+if exist "%PublishDir%\runtimes\osx" powershell Remove-Item -Force -Recurse '%PublishDir%\runtimes\osx'
+if exist "%PublishDir%\runtimes\osx-x64" powershell Remove-Item -Force -Recurse '%PublishDir%\runtimes\osx-x64'
+if exist "%PublishDir%\runtimes\win-arm" powershell Remove-Item -Force -Recurse '%PublishDir%\runtimes\win-arm'
+if exist "%PublishDir%\runtimes\win-arm64" powershell Remove-Item -Force -Recurse '%PublishDir%\runtimes\win-arm64'
+if exist "%PublishDir%\runtimes\alpine-x64" powershell Remove-Item -Force -Recurse '%PublishDir%\runtimes\alpine-x64'
+if exist "%PublishDir%\runtimes\linux-musl-x64" powershell Remove-Item -Force -Recurse '%PublishDir%\runtimes\linux-musl-x64'
-if exist "%SolutionDir%Publish\Windows\en-US\" powershell Remove-Item -Force -Recurse '%SolutionDir%Publish\Windows\en-US'
-if exist "%SolutionDir%Publish\Windows\de\" powershell Remove-Item -Force -Recurse '%SolutionDir%Publish\Windows\de'
-if exist "%SolutionDir%Publish\Windows\es\" powershell Remove-Item -Force -Recurse '%SolutionDir%Publish\Windows\es'
-if exist "%SolutionDir%Publish\Windows\fr\" powershell Remove-Item -Force -Recurse '%SolutionDir%Publish\Windows\fr'
-if exist "%SolutionDir%Publish\Windows\it\" powershell Remove-Item -Force -Recurse '%SolutionDir%Publish\Windows\it'
-if exist "%SolutionDir%Publish\Windows\ja\" powershell Remove-Item -Force -Recurse '%SolutionDir%Publish\Windows\ja'
-if exist "%SolutionDir%Publish\Windows\ko\" powershell Remove-Item -Force -Recurse '%SolutionDir%Publish\Windows\ko'
-if exist "%SolutionDir%Publish\Windows\ru\" powershell Remove-Item -Force -Recurse '%SolutionDir%Publish\Windows\ru'
-if exist "%SolutionDir%Publish\Windows\zh-Hans\" powershell Remove-Item -Force -Recurse '%SolutionDir%Publish\Windows\zh-Hans'
-if exist "%SolutionDir%Publish\Windows\zh-Hant\" powershell Remove-Item -Force -Recurse '%SolutionDir%Publish\Windows\zh-Hant'
-if exist "%SolutionDir%Publish\Windows\cs\" powershell Remove-Item -Force -Recurse '%SolutionDir%Publish\Windows\cs'
-if exist "%SolutionDir%Publish\Windows\pl\" powershell Remove-Item -Force -Recurse '%SolutionDir%Publish\Windows\pl'
-if exist "%SolutionDir%Publish\Windows\tr\" powershell Remove-Item -Force -Recurse '%SolutionDir%Publish\Windows\tr'
-if exist "%SolutionDir%Publish\Windows\pt-BR\" powershell Remove-Item -Force -Recurse '%SolutionDir%Publish\Windows\pt-BR'
+echo deleting misc files
+if exist "%PublishDir%\web.config" del "%PublishDir%\web.config"
+if exist "%PublishDir%\libman.json" del "%PublishDir%\libman.json"
+del "%PublishDir%\*.exe"
+del "%PublishDir%\*.pdb"
-if exist "%SolutionDir%Publish\WindowsPrerelease\en-US\" powershell Remove-Item -Force -Recurse '%SolutionDir%Publish\WindowsPrerelease\en-US'
-if exist "%SolutionDir%Publish\WindowsPrerelease\de\" powershell Remove-Item -Force -Recurse '%SolutionDir%Publish\WindowsPrerelease\de'
-if exist "%SolutionDir%Publish\WindowsPrerelease\es\" powershell Remove-Item -Force -Recurse '%SolutionDir%Publish\WindowsPrerelease\es'
-if exist "%SolutionDir%Publish\WindowsPrerelease\fr\" powershell Remove-Item -Force -Recurse '%SolutionDir%Publish\WindowsPrerelease\fr'
-if exist "%SolutionDir%Publish\WindowsPrerelease\it\" powershell Remove-Item -Force -Recurse '%SolutionDir%Publish\WindowsPrerelease\it'
-if exist "%SolutionDir%Publish\WindowsPrerelease\ja\" powershell Remove-Item -Force -Recurse '%SolutionDir%Publish\WindowsPrerelease\ja'
-if exist "%SolutionDir%Publish\WindowsPrerelease\ko\" powershell Remove-Item -Force -Recurse '%SolutionDir%Publish\WindowsPrerelease\ko'
-if exist "%SolutionDir%Publish\WindowsPrerelease\ru\" powershell Remove-Item -Force -Recurse '%SolutionDir%Publish\WindowsPrerelease\ru'
-if exist "%SolutionDir%Publish\WindowsPrerelease\zh-Hans\" powershell Remove-Item -Force -Recurse '%SolutionDir%Publish\WindowsPrerelease\zh-Hans'
-if exist "%SolutionDir%Publish\WindowsPrerelease\zh-Hant\" powershell Remove-Item -Force -Recurse '%SolutionDir%Publish\WindowsPrerelease\zh-Hant'
-if exist "%SolutionDir%Publish\WindowsPrerelease\cs\" powershell Remove-Item -Force -Recurse '%SolutionDir%Publish\WindowsPrerelease\cs'
-if exist "%SolutionDir%Publish\WindowsPrerelease\pl\" powershell Remove-Item -Force -Recurse '%SolutionDir%Publish\WindowsPrerelease\pl'
-if exist "%SolutionDir%Publish\WindowsPrerelease\tr\" powershell Remove-Item -Force -Recurse '%SolutionDir%Publish\WindowsPrerelease\tr'
-if exist "%SolutionDir%Publish\WindowsPrerelease\pt-BR\" powershell Remove-Item -Force -Recurse '%SolutionDir%Publish\WindowsPrerelease\pt-BR'
-
-echo Deleting extra runtime files
-if exist "%SolutionDir%Publish\Windows\runtimes\linux-arm" powershell Remove-Item -Force -Recurse '%SolutionDir%Publish\Windows\runtimes\linux-arm'
-if exist "%SolutionDir%Publish\Windows\runtimes\linux-arm64" powershell Remove-Item -Force -Recurse '%SolutionDir%Publish\Windows\runtimes\linux-arm64'
-if exist "%SolutionDir%Publish\Windows\runtimes\linux-armel" powershell Remove-Item -Force -Recurse '%SolutionDir%Publish\Windows\runtimes\linux-armel'
-
-if exist "%SolutionDir%Publish\Windows\runtimes\osx" powershell Remove-Item -Force -Recurse '%SolutionDir%Publish\Windows\runtimes\osx'
-if exist "%SolutionDir%Publish\Windows\runtimes\osx-x64" powershell Remove-Item -Force -Recurse '%SolutionDir%Publish\Windows\runtimes\osx-x64'
-
-if exist "%SolutionDir%Publish\Windows\runtimes\win-arm" powershell Remove-Item -Force -Recurse '%SolutionDir%Publish\Windows\runtimes\win-arm'
-if exist "%SolutionDir%Publish\Windows\runtimes\win-arm64" powershell Remove-Item -Force -Recurse '%SolutionDir%Publish\Windows\runtimes\win-arm64'
-
-if exist "%SolutionDir%Publish\WindowsPrerelease\runtimes\linux-arm" powershell Remove-Item -Force -Recurse '%SolutionDir%Publish\WindowsPrerelease\runtimes\linux-arm'
-if exist "%SolutionDir%Publish\WindowsPrerelease\runtimes\linux-arm64" powershell Remove-Item -Force -Recurse '%SolutionDir%Publish\WindowsPrerelease\runtimes\linux-arm64'
-if exist "%SolutionDir%Publish\WindowsPrerelease\runtimes\linux-armel" powershell Remove-Item -Force -Recurse '%SolutionDir%Publish\WindowsPrerelease\runtimes\linux-armel'
-
-if exist "%SolutionDir%Publish\WindowsPrerelease\runtimes\osx" powershell Remove-Item -Force -Recurse '%SolutionDir%Publish\WindowsPrerelease\runtimes\osx'
-if exist "%SolutionDir%Publish\WindowsPrerelease\runtimes\osx-x64" powershell Remove-Item -Force -Recurse '%SolutionDir%Publish\WindowsPrerelease\runtimes\osx-x64'
-
-if exist "%SolutionDir%Publish\WindowsPrerelease\runtimes\win-arm" powershell Remove-Item -Force -Recurse '%SolutionDir%Publish\WindowsPrerelease\runtimes\win-arm'
-if exist "%SolutionDir%Publish\WindowsPrerelease\runtimes\win-arm64" powershell Remove-Item -Force -Recurse '%SolutionDir%Publish\WindowsPrerelease\runtimes\win-arm64'
-
-echo Deleting misc files
-if exist "%SolutionDir%Publish\Windows\web.config" del "%SolutionDir%Publish\Windows\web.config"
-del "%SolutionDir%Publish\Windows\*pdb"
-
-if exist "%SolutionDir%Publish\WindowsPrerelease\web.config" del "%SolutionDir%Publish\WindowsPrerelease\web.config"
-del "%SolutionDir%Publish\WindowsPrerelease\*pdb"
-
-echo setting up library folders
-
-if "%CurrentConfiguration%" == "Prerelease" (
- echo PR-Config
- if not exist "%SolutionDir%Publish\WindowsPrerelease\Configuration" md "%SolutionDir%Publish\WindowsPrerelease\Configuration"
- move "%SolutionDir%Publish\WindowsPrerelease\DefaultSettings.json" "%SolutionDir%Publish\WindowsPrerelease\Configuration\"
-)
-
-if "%CurrentConfiguration%" == "Release" (
- echo R-Config
- if not exist "%SolutionDir%Publish\Windows\Configuration" md "%SolutionDir%Publish\Windows\Configuration"
- if exist "%SolutionDir%Publish\Windows\DefaultSettings.json" move "%SolutionDir%Publish\Windows\DefaultSettings.json" "%SolutionDir%Publish\Windows\Configuration\DefaultSettings.json"
-)
-
-if "%CurrentConfiguration%" == "Prerelease" (
- echo PR-LIB
- if not exist "%SolutionDir%Publish\WindowsPrerelease\Lib\" md "%SolutionDir%Publish\WindowsPrerelease\Lib\"
- move "%SolutionDir%Publish\WindowsPrerelease\*.dll" "%SolutionDir%Publish\WindowsPrerelease\Lib\"
- move "%SolutionDir%Publish\WindowsPrerelease\*.json" "%SolutionDir%Publish\WindowsPrerelease\Lib\"
-)
-
-if "%CurrentConfiguration%" == "Release" (
- echo R-LIB
- if not exist "%SolutionDir%Publish\Windows\Lib\" md "%SolutionDir%Publish\Windows\Lib\"
- move "%SolutionDir%Publish\Windows\*.dll" "%SolutionDir%Publish\Windows\Lib\"
- move "%SolutionDir%Publish\Windows\*.json" "%SolutionDir%Publish\Windows\Lib\"
-)
-
-if "%CurrentConfiguration%" == "Prerelease" (
- echo PR-RT
- move "%SolutionDir%Publish\WindowsPrerelease\runtimes" "%SolutionDir%Publish\WindowsPrerelease\Lib\runtimes"
- if exist "%SolutionDir%Publish\WindowsPrerelease\refs" move "%SolutionDir%Publish\WindowsPrerelease\refs" "%SolutionDir%Publish\WindowsPrerelease\Lib\refs"
-)
-
-
-if "%CurrentConfiguration%" == "Release" (
- echo R-RT
- move "%SolutionDir%Publish\Windows\runtimes" "%SolutionDir%Publish\Windows\Lib\runtimes"
- if exist "%SolutionDir%Publish\Windows\refs" move "%SolutionDir%Publish\Windows\refs" "%SolutionDir%Publish\Windows\Lib\refs"
-)
-
-if "%CurrentConfiguration%" == "Prerelease" (
- echo PR-LOC
- if not exist "%SolutionDir%Publish\WindowsPrerelease\Localization" md "%SolutionDir%Publish\WindowsPrerelease\Localization"
-)
-
-if "%CurrentConfiguration%" == "Release" (
- echo R-LOC
- if not exist "%SolutionDir%Publish\Windows\Localization" md "%SolutionDir%Publish\Windows\Localization"
-)
+echo setting up default folders
+if not exist "%PublishDir%\Configuration" md "%PublishDir%\Configuration"
+move "%PublishDir%\DefaultSettings.json" "%PublishDir%\Configuration\"
+if not exist "%PublishDir%\Lib\" md "%PublishDir%\Lib\"
+move "%PublishDir%\*.dll" "%PublishDir%\Lib\"
+move "%PublishDir%\*.json" "%PublishDir%\Lib\"
+move "%PublishDir%\runtimes" "%PublishDir%\Lib\runtimes"
+if exist "%PublishDir%\refs" move "%PublishDir%\refs" "%PublishDir%\Lib\refs"
+if not exist "%PublishDir%\Localization" md "%PublishDir%\Localization"
echo making start scripts
-@(echo @echo off && echo @title IW4MAdmin && echo set DOTNET_CLI_TELEMETRY_OPTOUT=1 && echo dotnet Lib\IW4MAdmin.dll && echo pause) > "%SolutionDir%Publish\WindowsPrerelease\StartIW4MAdmin.cmd"
-@(echo @echo off && echo @title IW4MAdmin && echo set DOTNET_CLI_TELEMETRY_OPTOUT=1 && echo dotnet Lib\IW4MAdmin.dll && echo pause) > "%SolutionDir%Publish\Windows\StartIW4MAdmin.cmd"
+@(echo @echo off && echo @title IW4MAdmin && echo set DOTNET_CLI_TELEMETRY_OPTOUT=1 && echo dotnet Lib\IW4MAdmin.dll && echo pause) > "%PublishDir%\StartIW4MAdmin.cmd"
+@(echo #!/bin/bash&& echo export DOTNET_CLI_TELEMETRY_OPTOUT=1&& echo dotnet Lib/IW4MAdmin.dll) > "%PublishDir%\StartIW4MAdmin.sh"
-@(echo #!/bin/bash&& echo export DOTNET_CLI_TELEMETRY_OPTOUT=1&& echo dotnet Lib/IW4MAdmin.dll) > "%SolutionDir%Publish\WindowsPrerelease\StartIW4MAdmin.sh"
-dos2unix "%SolutionDir%Publish\WindowsPrerelease\StartIW4MAdmin.sh"
-@(echo #!/bin/bash&& echo export DOTNET_CLI_TELEMETRY_OPTOUT=1&& echo dotnet Lib/IW4MAdmin.dll) > "%SolutionDir%Publish\Windows\StartIW4MAdmin.sh"
-dos2unix "%SolutionDir%Publish\Windows\StartIW4MAdmin.sh"
+echo moving front-end library dependencies
+if not exist "%PublishDir%\wwwroot\font" mkdir "%PublishDir%\wwwroot\font"
+move "WebfrontCore\wwwroot\lib\open-iconic\font\fonts\*.*" "%PublishDir%\wwwroot\font\"
+if exist "%PublishDir%\wwwroot\lib" rd /s /q "%PublishDir%\wwwroot\lib"
echo setting permissions...
-cacls "%SolutionDir%Publish\WindowsPrerelease" /t /e /p Everyone:F
-cacls "%SolutionDir%Publish\Windows" /t /e /p Everyone:F
\ No newline at end of file
+cacls "%PublishDir%" /t /e /p Everyone:F
\ No newline at end of file
diff --git a/Application/Main.cs b/Application/Main.cs
index a3f9839a4..57123d703 100644
--- a/Application/Main.cs
+++ b/Application/Main.cs
@@ -1,5 +1,7 @@
using IW4MAdmin.Application.Migration;
+using Microsoft.Extensions.DependencyInjection;
using SharedLibraryCore;
+using SharedLibraryCore.Interfaces;
using System;
using System.Text;
using System.Threading;
@@ -66,6 +68,7 @@ namespace IW4MAdmin.Application
ServerManager.Logger.WriteInfo(Utilities.CurrentLocalization.LocalizationIndex["MANAGER_VERSION"].FormatExt(Version));
+ ConfigureServices();
await CheckVersion();
await ServerManager.Init();
}
@@ -230,5 +233,12 @@ namespace IW4MAdmin.Application
catch (OperationCanceledException)
{ }
}
+
+ private static void ConfigureServices()
+ {
+ //var serviceProvider = new ServiceCollection();
+ //serviceProvider.AddSingleton(ServerManager);
+ //serviceProvider.BuildServiceProvider();
+ }
}
}
diff --git a/IW4MAdmin.sln b/IW4MAdmin.sln
index 541d851e4..0447d709f 100644
--- a/IW4MAdmin.sln
+++ b/IW4MAdmin.sln
@@ -8,6 +8,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution
ProjectSection(SolutionItems) = preProject
_commands.gsc = _commands.gsc
_customcallbacks.gsc = _customcallbacks.gsc
+ azure-pipelines.yml = azure-pipelines.yml
+ PostPublish.ps1 = PostPublish.ps1
README.md = README.md
RunPublishPre.cmd = RunPublishPre.cmd
RunPublishRelease.cmd = RunPublishRelease.cmd
@@ -286,7 +288,6 @@ Global
{B72DEBFB-9D48-4076-8FF5-1FD72A830845}.Release|x86.ActiveCfg = Release|Any CPU
{B72DEBFB-9D48-4076-8FF5-1FD72A830845}.Release|x86.Build.0 = Release|Any CPU
{6C706CE5-A206-4E46-8712-F8C48D526091}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {6C706CE5-A206-4E46-8712-F8C48D526091}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6C706CE5-A206-4E46-8712-F8C48D526091}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{6C706CE5-A206-4E46-8712-F8C48D526091}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{6C706CE5-A206-4E46-8712-F8C48D526091}.Debug|x64.ActiveCfg = Debug|Any CPU
@@ -294,7 +295,6 @@ Global
{6C706CE5-A206-4E46-8712-F8C48D526091}.Debug|x86.ActiveCfg = Debug|Any CPU
{6C706CE5-A206-4E46-8712-F8C48D526091}.Debug|x86.Build.0 = Debug|Any CPU
{6C706CE5-A206-4E46-8712-F8C48D526091}.Prerelease|Any CPU.ActiveCfg = Prerelease|Any CPU
- {6C706CE5-A206-4E46-8712-F8C48D526091}.Prerelease|Any CPU.Build.0 = Prerelease|Any CPU
{6C706CE5-A206-4E46-8712-F8C48D526091}.Prerelease|Mixed Platforms.ActiveCfg = Debug|Any CPU
{6C706CE5-A206-4E46-8712-F8C48D526091}.Prerelease|Mixed Platforms.Build.0 = Debug|Any CPU
{6C706CE5-A206-4E46-8712-F8C48D526091}.Prerelease|x64.ActiveCfg = Debug|Any CPU
@@ -302,7 +302,6 @@ Global
{6C706CE5-A206-4E46-8712-F8C48D526091}.Prerelease|x86.ActiveCfg = Debug|Any CPU
{6C706CE5-A206-4E46-8712-F8C48D526091}.Prerelease|x86.Build.0 = Debug|Any CPU
{6C706CE5-A206-4E46-8712-F8C48D526091}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {6C706CE5-A206-4E46-8712-F8C48D526091}.Release|Any CPU.Build.0 = Release|Any CPU
{6C706CE5-A206-4E46-8712-F8C48D526091}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{6C706CE5-A206-4E46-8712-F8C48D526091}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{6C706CE5-A206-4E46-8712-F8C48D526091}.Release|x64.ActiveCfg = Release|Any CPU
diff --git a/Plugins/AutomessageFeed/AutomessageFeed.csproj b/Plugins/AutomessageFeed/AutomessageFeed.csproj
index 86211ef43..9740f7606 100644
--- a/Plugins/AutomessageFeed/AutomessageFeed.csproj
+++ b/Plugins/AutomessageFeed/AutomessageFeed.csproj
@@ -2,25 +2,19 @@
netcoreapp3.0
- true
- true
+ true
7.1
Debug;Release;Prerelease
+ false
-
-
-
-
- false
-
+
-
-
+
diff --git a/Plugins/IW4ScriptCommands/Commands/Balance.cs b/Plugins/IW4ScriptCommands/Commands/Balance.cs
index eef799227..9931d34bc 100644
--- a/Plugins/IW4ScriptCommands/Commands/Balance.cs
+++ b/Plugins/IW4ScriptCommands/Commands/Balance.cs
@@ -1,4 +1,5 @@
-using SharedLibraryCore;
+/*
+using SharedLibraryCore;
using SharedLibraryCore.Database.Models;
using System;
using System.Collections.Generic;
@@ -197,3 +198,4 @@ namespace IW4ScriptCommands.Commands
}
}
}
+*/
\ No newline at end of file
diff --git a/Plugins/IW4ScriptCommands/GscApiController.cs b/Plugins/IW4ScriptCommands/GscApiController.cs
index 2aa081c89..f5b3a4312 100644
--- a/Plugins/IW4ScriptCommands/GscApiController.cs
+++ b/Plugins/IW4ScriptCommands/GscApiController.cs
@@ -1,4 +1,4 @@
-using IW4ScriptCommands.Commands;
+/*using IW4ScriptCommands.Commands;
using Microsoft.AspNetCore.Mvc;
using SharedLibraryCore;
using System;
@@ -51,3 +51,4 @@ namespace WebfrontCore.Controllers.API
}
}
}
+*/
\ No newline at end of file
diff --git a/Plugins/IW4ScriptCommands/IW4ScriptCommands.csproj b/Plugins/IW4ScriptCommands/IW4ScriptCommands.csproj
index 2d5ccc905..d46d972e3 100644
--- a/Plugins/IW4ScriptCommands/IW4ScriptCommands.csproj
+++ b/Plugins/IW4ScriptCommands/IW4ScriptCommands.csproj
@@ -9,10 +9,6 @@
7.1
-
-
-
-
false
diff --git a/Plugins/IW4ScriptCommands/Plugin.cs b/Plugins/IW4ScriptCommands/Plugin.cs
index f1964fba5..c21313d60 100644
--- a/Plugins/IW4ScriptCommands/Plugin.cs
+++ b/Plugins/IW4ScriptCommands/Plugin.cs
@@ -1,4 +1,4 @@
-using SharedLibraryCore;
+/*using SharedLibraryCore;
using SharedLibraryCore.Interfaces;
using System;
using System.Collections.Generic;
@@ -47,3 +47,4 @@ namespace IW4ScriptCommands
public Task OnUnloadAsync() => Task.CompletedTask;
}
}
+*/
\ No newline at end of file
diff --git a/Plugins/LiveRadar/Controllers/RadarController.cs b/Plugins/LiveRadar/Controllers/RadarController.cs
index d10701e22..ed3b789d2 100644
--- a/Plugins/LiveRadar/Controllers/RadarController.cs
+++ b/Plugins/LiveRadar/Controllers/RadarController.cs
@@ -2,8 +2,8 @@
using Newtonsoft.Json;
using SharedLibraryCore;
using SharedLibraryCore.Dtos;
+using SharedLibraryCore.Interfaces;
using System.Linq;
-using WebfrontCore.Controllers;
namespace LiveRadar.Web.Controllers
{
@@ -15,14 +15,21 @@ namespace LiveRadar.Web.Controllers
ContractResolver = new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver()
};
+ private readonly IManager _manager;
+
+ public RadarController(IManager manager) : base(manager)
+ {
+ _manager = manager;
+ }
+
[HttpGet]
[Route("Radar/{serverId}")]
public IActionResult Index(long? serverId = null)
{
ViewBag.IsFluid = true;
ViewBag.Title = Utilities.CurrentLocalization.LocalizationIndex["WEBFRONT_RADAR_TITLE"];
- ViewBag.ActiveServerId = serverId ?? Manager.GetServers().FirstOrDefault()?.EndPoint;
- ViewBag.Servers = Manager.GetServers()
+ ViewBag.ActiveServerId = serverId ?? _manager.GetServers().FirstOrDefault()?.EndPoint;
+ ViewBag.Servers = _manager.GetServers()
.Where(_server => _server.GameName == Server.Game.IW4)
.Select(_server => new ServerInfo()
{
@@ -37,7 +44,7 @@ namespace LiveRadar.Web.Controllers
[Route("Radar/{serverId}/Map")]
public IActionResult Map(long? serverId = null)
{
- var server = serverId == null ? Manager.GetServers().FirstOrDefault() : Manager.GetServers().FirstOrDefault(_server => _server.EndPoint == serverId);
+ var server = serverId == null ? _manager.GetServers().FirstOrDefault() : _manager.GetServers().FirstOrDefault(_server => _server.EndPoint == serverId);
var map = Plugin.Config.Configuration().Maps.FirstOrDefault(_map => _map.Name == server.CurrentMap.Name);
if (map != null)
@@ -55,7 +62,7 @@ namespace LiveRadar.Web.Controllers
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
public IActionResult Data(long? serverId = null)
{
- var server = serverId == null ? Manager.GetServers()[0] : Manager.GetServers().First(_server => _server.EndPoint == serverId);
+ var server = serverId == null ? _manager.GetServers()[0] : _manager.GetServers().First(_server => _server.EndPoint == serverId);
var radarInfo = server.GetClientsAsList().Select(_client => _client.GetAdditionalProperty("LiveRadar")).ToList();
return Json(radarInfo);
}
@@ -65,7 +72,7 @@ namespace LiveRadar.Web.Controllers
public IActionResult Update(string payload)
{
var radarUpdate = RadarEvent.Parse(payload);
- var client = Manager.GetActiveClients().FirstOrDefault(_client => _client.NetworkId == radarUpdate.Guid);
+ var client = _manager.GetActiveClients().FirstOrDefault(_client => _client.NetworkId == radarUpdate.Guid);
if (client != null)
{
diff --git a/Plugins/LiveRadar/LiveRadar.csproj b/Plugins/LiveRadar/LiveRadar.csproj
index 64d85f54c..8258bce69 100644
--- a/Plugins/LiveRadar/LiveRadar.csproj
+++ b/Plugins/LiveRadar/LiveRadar.csproj
@@ -1,20 +1,22 @@
-
+
netcoreapp3.0
true
true
+ false
+ false
true
0.1.0.0
Debug;Release;Prerelease
7.1
+
+ Library
+
-
- false
-
-
+
@@ -24,11 +26,7 @@
-
-
-
-
-
+
diff --git a/Plugins/Login/Login.csproj b/Plugins/Login/Login.csproj
index bd1e08fb1..006f229c2 100644
--- a/Plugins/Login/Login.csproj
+++ b/Plugins/Login/Login.csproj
@@ -5,6 +5,7 @@
netcoreapp3.0
+ false
RaidMax.IW4MAdmin.Plugins.Login
RaidMax
Forever None
@@ -17,14 +18,12 @@
TRACE;DEBUG;NETCOREAPP2_0
-
-
- false
-
-
-
-
+
+
+
+
+
diff --git a/Plugins/ProfanityDeterment/ProfanityDeterment.csproj b/Plugins/ProfanityDeterment/ProfanityDeterment.csproj
index f0c943f3c..9d34ad10d 100644
--- a/Plugins/ProfanityDeterment/ProfanityDeterment.csproj
+++ b/Plugins/ProfanityDeterment/ProfanityDeterment.csproj
@@ -16,13 +16,11 @@
-
- false
-
+
-
+
diff --git a/Plugins/Stats/Helpers/StatManager.cs b/Plugins/Stats/Helpers/StatManager.cs
index 0943ea460..b2924e047 100644
--- a/Plugins/Stats/Helpers/StatManager.cs
+++ b/Plugins/Stats/Helpers/StatManager.cs
@@ -98,9 +98,7 @@ namespace IW4MAdmin.Plugins.Stats.Helpers
.OrderByDescending(c => c.Performance)
.Skip(start)
.Take(count);
-#if DEBUG == true
- var clientRatingsSql = iqClientRatings.ToSql();
-#endif
+
// materialized list
var clientRatings = await iqClientRatings.ToListAsync();
@@ -121,10 +119,6 @@ namespace IW4MAdmin.Plugins.Stats.Helpers
rating.When
};
-#if DEBUG == true
- var ratingQuery = iqRatingInfo.ToSql();
-#endif
-
var ratingInfo = (await iqRatingInfo.ToListAsync())
.GroupBy(r => r.ClientId)
.Select(grp => new
diff --git a/Plugins/Stats/Stats.csproj b/Plugins/Stats/Stats.csproj
index bbe579a49..82b01b39b 100644
--- a/Plugins/Stats/Stats.csproj
+++ b/Plugins/Stats/Stats.csproj
@@ -16,15 +16,10 @@
-
- false
-
-
- false
-
+
-
+
diff --git a/Plugins/Tests/TestRconParser.cs b/Plugins/Tests/TestRconParser.cs
index b1c6d8aba..e8becb30b 100644
--- a/Plugins/Tests/TestRconParser.cs
+++ b/Plugins/Tests/TestRconParser.cs
@@ -14,7 +14,7 @@ namespace Tests
public override string Version => "test";
- public override async Task> GetStatusAsync(Connection connection)
+ public override async Task<(List, string)> GetStatusAsync(Connection connection)
{
var clientList = new List();
@@ -32,7 +32,7 @@ namespace Tests
});
}
- return clientList.Count > 0 ? clientList : FakeClients;
+ return clientList.Count > 0 ? (clientList, "mp_rust") : (FakeClients, "mp_rust");
}
}
}
diff --git a/Plugins/Stats/Controllers/StatsController.cs b/Plugins/Web/StatsWeb/Controllers/StatsController.cs
similarity index 85%
rename from Plugins/Stats/Controllers/StatsController.cs
rename to Plugins/Web/StatsWeb/Controllers/StatsController.cs
index f195a40eb..18869ea1a 100644
--- a/Plugins/Stats/Controllers/StatsController.cs
+++ b/Plugins/Web/StatsWeb/Controllers/StatsController.cs
@@ -1,24 +1,32 @@
-using IW4MAdmin.Plugins.Stats.Helpers;
+using IW4MAdmin.Plugins.Stats;
+using IW4MAdmin.Plugins.Stats.Helpers;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using SharedLibraryCore;
using SharedLibraryCore.Dtos;
+using SharedLibraryCore.Interfaces;
using System;
using System.Linq;
using System.Threading.Tasks;
-using WebfrontCore.Controllers;
-namespace IW4MAdmin.Plugins.Stats.Web.Controllers
+namespace IW4MAdmin.Plugins.Web.StatsWeb.Controllers
{
public class StatsController : BaseController
{
+ private readonly IManager _manager;
+
+ public StatsController(IManager manager) : base(manager)
+ {
+ _manager = manager;
+ }
+
[HttpGet]
public IActionResult TopPlayersAsync()
{
ViewBag.Title = Utilities.CurrentLocalization.LocalizationIndex["WEBFRONT_STATS_INDEX_TITLE"];
ViewBag.Description = Utilities.CurrentLocalization.LocalizationIndex["WEBFRONT_STATS_INDEX_DESC"];
- ViewBag.Servers = Manager.GetServers().Select(_server => new ServerInfo() { Name = _server.Hostname, ID = _server.EndPoint });
+ ViewBag.Servers = _manager.GetServers().Select(_server => new ServerInfo() { Name = _server.Hostname, ID = _server.EndPoint });
return View("Index");
}
@@ -32,7 +40,7 @@ namespace IW4MAdmin.Plugins.Stats.Web.Controllers
serverId = null;
}
- var server = Manager.GetServers().FirstOrDefault(_server => _server.EndPoint == serverId);
+ var server = _manager.GetServers().FirstOrDefault(_server => _server.EndPoint == serverId);
if (server != null)
{
@@ -62,7 +70,7 @@ namespace IW4MAdmin.Plugins.Stats.Web.Controllers
using (var ctx = new SharedLibraryCore.Database.DatabaseContext(true))
{
- var iqMessages = from message in ctx.Set()
+ var iqMessages = from message in ctx.Set()
where message.ServerId == serverId
where message.TimeSent >= whenLower
where message.TimeSent <= whenUpper
@@ -75,9 +83,6 @@ namespace IW4MAdmin.Plugins.Stats.Web.Controllers
ServerGame = message.Server.GameName ?? Server.Game.IW4
};
-#if DEBUG == true
- var messagesSql = iqMessages.ToSql();
-#endif
var messages = await iqMessages.ToListAsync();
foreach (var message in messages)
@@ -86,7 +91,7 @@ namespace IW4MAdmin.Plugins.Stats.Web.Controllers
{
try
{
- var quickMessages = Manager.GetApplicationSettings().Configuration()
+ var quickMessages = _manager.GetApplicationSettings().Configuration()
.QuickMessages
.First(_qm => _qm.Game == message.ServerGame);
message.Message = quickMessages.Messages[message.Message.Substring(1)];
@@ -110,7 +115,7 @@ namespace IW4MAdmin.Plugins.Stats.Web.Controllers
.Select(_penalty => new { _penalty.OffenderId, _penalty.PenaltyId, _penalty.When, _penalty.AutomatedOffense })
.FirstOrDefaultAsync(_penalty => _penalty.PenaltyId == penaltyId);
- var iqSnapshotInfo = ctx.Set()
+ var iqSnapshotInfo = ctx.Set()
.Where(s => s.ClientId == penalty.OffenderId)
.Include(s => s.LastStrainAngle)
.Include(s => s.HitOrigin)
@@ -121,9 +126,6 @@ namespace IW4MAdmin.Plugins.Stats.Web.Controllers
.OrderBy(s => s.When)
.ThenBy(s => s.Hits);
-#if DEBUG == true
- var sql = iqSnapshotInfo.ToSql();
-#endif
var penaltyInfo = await iqSnapshotInfo.ToListAsync();
if (penaltyInfo.Count > 0)
diff --git a/Plugins/Web/StatsWeb/StatsWeb.csproj b/Plugins/Web/StatsWeb/StatsWeb.csproj
index 6c7ddefbf..38adc979f 100644
--- a/Plugins/Web/StatsWeb/StatsWeb.csproj
+++ b/Plugins/Web/StatsWeb/StatsWeb.csproj
@@ -1,12 +1,21 @@
-
+
netcoreapp3.0
true
true
+ false
+ false
true
Debug;Release;Prerelease
7.1
+
+ Library
+
+ Always
+
+
+
@@ -20,12 +29,7 @@
-
-
-
-
-
-
+
diff --git a/Plugins/Stats/ViewComponents/TopPlayersViewComponent.cs b/Plugins/Web/StatsWeb/ViewComponents/TopPlayersViewComponent.cs
similarity index 93%
rename from Plugins/Stats/ViewComponents/TopPlayersViewComponent.cs
rename to Plugins/Web/StatsWeb/ViewComponents/TopPlayersViewComponent.cs
index ad00b0fb9..d6951bc0a 100644
--- a/Plugins/Stats/ViewComponents/TopPlayersViewComponent.cs
+++ b/Plugins/Web/StatsWeb/ViewComponents/TopPlayersViewComponent.cs
@@ -4,7 +4,7 @@ using Microsoft.AspNetCore.Mvc;
using System.Linq;
using System.Threading.Tasks;
-namespace Stats.ViewComponents
+namespace IW4MAdmin.Plugins.Web.StatsWeb.Controllers
{
public class TopPlayersViewComponent : ViewComponent
{
diff --git a/Plugins/Web/StatsWeb/wwwroot/images/icons/0_no-place/menu_div_no_place_64.png b/Plugins/Web/StatsWeb/wwwroot/images/icons/0_no-place/menu_div_no_place_64.png
deleted file mode 100644
index 64b6dfe6e..000000000
Binary files a/Plugins/Web/StatsWeb/wwwroot/images/icons/0_no-place/menu_div_no_place_64.png and /dev/null differ
diff --git a/Plugins/Web/StatsWeb/wwwroot/images/icons/1_iron/menu_div_iron.png b/Plugins/Web/StatsWeb/wwwroot/images/icons/1_iron/menu_div_iron.png
deleted file mode 100644
index 0e3fb3c07..000000000
Binary files a/Plugins/Web/StatsWeb/wwwroot/images/icons/1_iron/menu_div_iron.png and /dev/null differ
diff --git a/Plugins/Web/StatsWeb/wwwroot/images/icons/1_iron/menu_div_iron_64.png b/Plugins/Web/StatsWeb/wwwroot/images/icons/1_iron/menu_div_iron_64.png
deleted file mode 100644
index 4fd07dd07..000000000
Binary files a/Plugins/Web/StatsWeb/wwwroot/images/icons/1_iron/menu_div_iron_64.png and /dev/null differ
diff --git a/Plugins/Web/StatsWeb/wwwroot/images/icons/1_iron/menu_div_iron_sub01.png b/Plugins/Web/StatsWeb/wwwroot/images/icons/1_iron/menu_div_iron_sub01.png
deleted file mode 100644
index c440d4542..000000000
Binary files a/Plugins/Web/StatsWeb/wwwroot/images/icons/1_iron/menu_div_iron_sub01.png and /dev/null differ
diff --git a/Plugins/Web/StatsWeb/wwwroot/images/icons/1_iron/menu_div_iron_sub01_64.png b/Plugins/Web/StatsWeb/wwwroot/images/icons/1_iron/menu_div_iron_sub01_64.png
deleted file mode 100644
index 77a60574a..000000000
Binary files a/Plugins/Web/StatsWeb/wwwroot/images/icons/1_iron/menu_div_iron_sub01_64.png and /dev/null differ
diff --git a/Plugins/Web/StatsWeb/wwwroot/images/icons/1_iron/menu_div_iron_sub02.png b/Plugins/Web/StatsWeb/wwwroot/images/icons/1_iron/menu_div_iron_sub02.png
deleted file mode 100644
index 01f36607d..000000000
Binary files a/Plugins/Web/StatsWeb/wwwroot/images/icons/1_iron/menu_div_iron_sub02.png and /dev/null differ
diff --git a/Plugins/Web/StatsWeb/wwwroot/images/icons/1_iron/menu_div_iron_sub02_64.png b/Plugins/Web/StatsWeb/wwwroot/images/icons/1_iron/menu_div_iron_sub02_64.png
deleted file mode 100644
index 52e9f6043..000000000
Binary files a/Plugins/Web/StatsWeb/wwwroot/images/icons/1_iron/menu_div_iron_sub02_64.png and /dev/null differ
diff --git a/Plugins/Web/StatsWeb/wwwroot/images/icons/1_iron/menu_div_iron_sub03_64.png b/Plugins/Web/StatsWeb/wwwroot/images/icons/1_iron/menu_div_iron_sub03_64.png
deleted file mode 100644
index e04bd5228..000000000
Binary files a/Plugins/Web/StatsWeb/wwwroot/images/icons/1_iron/menu_div_iron_sub03_64.png and /dev/null differ
diff --git a/Plugins/Web/StatsWeb/wwwroot/images/icons/2_bronze/menu_div_bronze.png b/Plugins/Web/StatsWeb/wwwroot/images/icons/2_bronze/menu_div_bronze.png
deleted file mode 100644
index daa65c029..000000000
Binary files a/Plugins/Web/StatsWeb/wwwroot/images/icons/2_bronze/menu_div_bronze.png and /dev/null differ
diff --git a/Plugins/Web/StatsWeb/wwwroot/images/icons/2_bronze/menu_div_bronze_64.png b/Plugins/Web/StatsWeb/wwwroot/images/icons/2_bronze/menu_div_bronze_64.png
deleted file mode 100644
index 374beb5a6..000000000
Binary files a/Plugins/Web/StatsWeb/wwwroot/images/icons/2_bronze/menu_div_bronze_64.png and /dev/null differ
diff --git a/Plugins/Web/StatsWeb/wwwroot/images/icons/2_bronze/menu_div_bronze_sub01.png b/Plugins/Web/StatsWeb/wwwroot/images/icons/2_bronze/menu_div_bronze_sub01.png
deleted file mode 100644
index 801d23853..000000000
Binary files a/Plugins/Web/StatsWeb/wwwroot/images/icons/2_bronze/menu_div_bronze_sub01.png and /dev/null differ
diff --git a/Plugins/Web/StatsWeb/wwwroot/images/icons/2_bronze/menu_div_bronze_sub01_64.png b/Plugins/Web/StatsWeb/wwwroot/images/icons/2_bronze/menu_div_bronze_sub01_64.png
deleted file mode 100644
index b647d0e77..000000000
Binary files a/Plugins/Web/StatsWeb/wwwroot/images/icons/2_bronze/menu_div_bronze_sub01_64.png and /dev/null differ
diff --git a/Plugins/Web/StatsWeb/wwwroot/images/icons/2_bronze/menu_div_bronze_sub02.png b/Plugins/Web/StatsWeb/wwwroot/images/icons/2_bronze/menu_div_bronze_sub02.png
deleted file mode 100644
index d3c10819b..000000000
Binary files a/Plugins/Web/StatsWeb/wwwroot/images/icons/2_bronze/menu_div_bronze_sub02.png and /dev/null differ
diff --git a/Plugins/Web/StatsWeb/wwwroot/images/icons/2_bronze/menu_div_bronze_sub02_64.png b/Plugins/Web/StatsWeb/wwwroot/images/icons/2_bronze/menu_div_bronze_sub02_64.png
deleted file mode 100644
index eb270fb44..000000000
Binary files a/Plugins/Web/StatsWeb/wwwroot/images/icons/2_bronze/menu_div_bronze_sub02_64.png and /dev/null differ
diff --git a/Plugins/Web/StatsWeb/wwwroot/images/icons/2_bronze/menu_div_bronze_sub03_64.png b/Plugins/Web/StatsWeb/wwwroot/images/icons/2_bronze/menu_div_bronze_sub03_64.png
deleted file mode 100644
index 06cd5e2f1..000000000
Binary files a/Plugins/Web/StatsWeb/wwwroot/images/icons/2_bronze/menu_div_bronze_sub03_64.png and /dev/null differ
diff --git a/Plugins/Web/StatsWeb/wwwroot/images/icons/3_silver/menu_div_silver.png b/Plugins/Web/StatsWeb/wwwroot/images/icons/3_silver/menu_div_silver.png
deleted file mode 100644
index 87683e195..000000000
Binary files a/Plugins/Web/StatsWeb/wwwroot/images/icons/3_silver/menu_div_silver.png and /dev/null differ
diff --git a/Plugins/Web/StatsWeb/wwwroot/images/icons/3_silver/menu_div_silver_64.png b/Plugins/Web/StatsWeb/wwwroot/images/icons/3_silver/menu_div_silver_64.png
deleted file mode 100644
index 19b996d8f..000000000
Binary files a/Plugins/Web/StatsWeb/wwwroot/images/icons/3_silver/menu_div_silver_64.png and /dev/null differ
diff --git a/Plugins/Web/StatsWeb/wwwroot/images/icons/3_silver/menu_div_silver_sub01.png b/Plugins/Web/StatsWeb/wwwroot/images/icons/3_silver/menu_div_silver_sub01.png
deleted file mode 100644
index 1b7123b59..000000000
Binary files a/Plugins/Web/StatsWeb/wwwroot/images/icons/3_silver/menu_div_silver_sub01.png and /dev/null differ
diff --git a/Plugins/Web/StatsWeb/wwwroot/images/icons/3_silver/menu_div_silver_sub01_64.png b/Plugins/Web/StatsWeb/wwwroot/images/icons/3_silver/menu_div_silver_sub01_64.png
deleted file mode 100644
index e6b9b29b4..000000000
Binary files a/Plugins/Web/StatsWeb/wwwroot/images/icons/3_silver/menu_div_silver_sub01_64.png and /dev/null differ
diff --git a/Plugins/Web/StatsWeb/wwwroot/images/icons/3_silver/menu_div_silver_sub02.png b/Plugins/Web/StatsWeb/wwwroot/images/icons/3_silver/menu_div_silver_sub02.png
deleted file mode 100644
index 77b66efcf..000000000
Binary files a/Plugins/Web/StatsWeb/wwwroot/images/icons/3_silver/menu_div_silver_sub02.png and /dev/null differ
diff --git a/Plugins/Web/StatsWeb/wwwroot/images/icons/3_silver/menu_div_silver_sub02_64.png b/Plugins/Web/StatsWeb/wwwroot/images/icons/3_silver/menu_div_silver_sub02_64.png
deleted file mode 100644
index ac03e9c14..000000000
Binary files a/Plugins/Web/StatsWeb/wwwroot/images/icons/3_silver/menu_div_silver_sub02_64.png and /dev/null differ
diff --git a/Plugins/Web/StatsWeb/wwwroot/images/icons/3_silver/menu_div_silver_sub03_64.png b/Plugins/Web/StatsWeb/wwwroot/images/icons/3_silver/menu_div_silver_sub03_64.png
deleted file mode 100644
index 4b88f6052..000000000
Binary files a/Plugins/Web/StatsWeb/wwwroot/images/icons/3_silver/menu_div_silver_sub03_64.png and /dev/null differ
diff --git a/Plugins/Web/StatsWeb/wwwroot/images/icons/4_gold/menu_div_gold.png b/Plugins/Web/StatsWeb/wwwroot/images/icons/4_gold/menu_div_gold.png
deleted file mode 100644
index 9b572f6dd..000000000
Binary files a/Plugins/Web/StatsWeb/wwwroot/images/icons/4_gold/menu_div_gold.png and /dev/null differ
diff --git a/Plugins/Web/StatsWeb/wwwroot/images/icons/4_gold/menu_div_gold_64.png b/Plugins/Web/StatsWeb/wwwroot/images/icons/4_gold/menu_div_gold_64.png
deleted file mode 100644
index 2cfd7a535..000000000
Binary files a/Plugins/Web/StatsWeb/wwwroot/images/icons/4_gold/menu_div_gold_64.png and /dev/null differ
diff --git a/Plugins/Web/StatsWeb/wwwroot/images/icons/4_gold/menu_div_gold_sub01.png b/Plugins/Web/StatsWeb/wwwroot/images/icons/4_gold/menu_div_gold_sub01.png
deleted file mode 100644
index a4ed5d3f7..000000000
Binary files a/Plugins/Web/StatsWeb/wwwroot/images/icons/4_gold/menu_div_gold_sub01.png and /dev/null differ
diff --git a/Plugins/Web/StatsWeb/wwwroot/images/icons/4_gold/menu_div_gold_sub01_64.png b/Plugins/Web/StatsWeb/wwwroot/images/icons/4_gold/menu_div_gold_sub01_64.png
deleted file mode 100644
index a9c6b90ef..000000000
Binary files a/Plugins/Web/StatsWeb/wwwroot/images/icons/4_gold/menu_div_gold_sub01_64.png and /dev/null differ
diff --git a/Plugins/Web/StatsWeb/wwwroot/images/icons/4_gold/menu_div_gold_sub02.png b/Plugins/Web/StatsWeb/wwwroot/images/icons/4_gold/menu_div_gold_sub02.png
deleted file mode 100644
index 198ce4c51..000000000
Binary files a/Plugins/Web/StatsWeb/wwwroot/images/icons/4_gold/menu_div_gold_sub02.png and /dev/null differ
diff --git a/Plugins/Web/StatsWeb/wwwroot/images/icons/4_gold/menu_div_gold_sub02_64.png b/Plugins/Web/StatsWeb/wwwroot/images/icons/4_gold/menu_div_gold_sub02_64.png
deleted file mode 100644
index d9e2b862e..000000000
Binary files a/Plugins/Web/StatsWeb/wwwroot/images/icons/4_gold/menu_div_gold_sub02_64.png and /dev/null differ
diff --git a/Plugins/Web/StatsWeb/wwwroot/images/icons/4_gold/menu_div_gold_sub03_64.png b/Plugins/Web/StatsWeb/wwwroot/images/icons/4_gold/menu_div_gold_sub03_64.png
deleted file mode 100644
index 2b858d041..000000000
Binary files a/Plugins/Web/StatsWeb/wwwroot/images/icons/4_gold/menu_div_gold_sub03_64.png and /dev/null differ
diff --git a/Plugins/Web/StatsWeb/wwwroot/images/icons/5_platinum/menu_div_platinum.png b/Plugins/Web/StatsWeb/wwwroot/images/icons/5_platinum/menu_div_platinum.png
deleted file mode 100644
index 58ad2ada1..000000000
Binary files a/Plugins/Web/StatsWeb/wwwroot/images/icons/5_platinum/menu_div_platinum.png and /dev/null differ
diff --git a/Plugins/Web/StatsWeb/wwwroot/images/icons/5_platinum/menu_div_platinum_64.png b/Plugins/Web/StatsWeb/wwwroot/images/icons/5_platinum/menu_div_platinum_64.png
deleted file mode 100644
index de94aa263..000000000
Binary files a/Plugins/Web/StatsWeb/wwwroot/images/icons/5_platinum/menu_div_platinum_64.png and /dev/null differ
diff --git a/Plugins/Web/StatsWeb/wwwroot/images/icons/5_platinum/menu_div_platinum_sub01.png b/Plugins/Web/StatsWeb/wwwroot/images/icons/5_platinum/menu_div_platinum_sub01.png
deleted file mode 100644
index b726af865..000000000
Binary files a/Plugins/Web/StatsWeb/wwwroot/images/icons/5_platinum/menu_div_platinum_sub01.png and /dev/null differ
diff --git a/Plugins/Web/StatsWeb/wwwroot/images/icons/5_platinum/menu_div_platinum_sub01_64.png b/Plugins/Web/StatsWeb/wwwroot/images/icons/5_platinum/menu_div_platinum_sub01_64.png
deleted file mode 100644
index 321166e8d..000000000
Binary files a/Plugins/Web/StatsWeb/wwwroot/images/icons/5_platinum/menu_div_platinum_sub01_64.png and /dev/null differ
diff --git a/Plugins/Web/StatsWeb/wwwroot/images/icons/5_platinum/menu_div_platinum_sub02.png b/Plugins/Web/StatsWeb/wwwroot/images/icons/5_platinum/menu_div_platinum_sub02.png
deleted file mode 100644
index 36cfc5e2c..000000000
Binary files a/Plugins/Web/StatsWeb/wwwroot/images/icons/5_platinum/menu_div_platinum_sub02.png and /dev/null differ
diff --git a/Plugins/Web/StatsWeb/wwwroot/images/icons/5_platinum/menu_div_platinum_sub02_64.png b/Plugins/Web/StatsWeb/wwwroot/images/icons/5_platinum/menu_div_platinum_sub02_64.png
deleted file mode 100644
index 9de5cd27c..000000000
Binary files a/Plugins/Web/StatsWeb/wwwroot/images/icons/5_platinum/menu_div_platinum_sub02_64.png and /dev/null differ
diff --git a/Plugins/Web/StatsWeb/wwwroot/images/icons/5_platinum/menu_div_platinum_sub03_64.png b/Plugins/Web/StatsWeb/wwwroot/images/icons/5_platinum/menu_div_platinum_sub03_64.png
deleted file mode 100644
index e2ef3b7da..000000000
Binary files a/Plugins/Web/StatsWeb/wwwroot/images/icons/5_platinum/menu_div_platinum_sub03_64.png and /dev/null differ
diff --git a/Plugins/Web/StatsWeb/wwwroot/images/icons/6_semipro/menu_div_semipro.png b/Plugins/Web/StatsWeb/wwwroot/images/icons/6_semipro/menu_div_semipro.png
deleted file mode 100644
index d9a01691e..000000000
Binary files a/Plugins/Web/StatsWeb/wwwroot/images/icons/6_semipro/menu_div_semipro.png and /dev/null differ
diff --git a/Plugins/Web/StatsWeb/wwwroot/images/icons/6_semipro/menu_div_semipro_64.png b/Plugins/Web/StatsWeb/wwwroot/images/icons/6_semipro/menu_div_semipro_64.png
deleted file mode 100644
index e5cc66ec9..000000000
Binary files a/Plugins/Web/StatsWeb/wwwroot/images/icons/6_semipro/menu_div_semipro_64.png and /dev/null differ
diff --git a/Plugins/Web/StatsWeb/wwwroot/images/icons/6_semipro/menu_div_semipro_sub01.png b/Plugins/Web/StatsWeb/wwwroot/images/icons/6_semipro/menu_div_semipro_sub01.png
deleted file mode 100644
index e2ccae019..000000000
Binary files a/Plugins/Web/StatsWeb/wwwroot/images/icons/6_semipro/menu_div_semipro_sub01.png and /dev/null differ
diff --git a/Plugins/Web/StatsWeb/wwwroot/images/icons/6_semipro/menu_div_semipro_sub01_64.png b/Plugins/Web/StatsWeb/wwwroot/images/icons/6_semipro/menu_div_semipro_sub01_64.png
deleted file mode 100644
index ba95f3017..000000000
Binary files a/Plugins/Web/StatsWeb/wwwroot/images/icons/6_semipro/menu_div_semipro_sub01_64.png and /dev/null differ
diff --git a/Plugins/Web/StatsWeb/wwwroot/images/icons/6_semipro/menu_div_semipro_sub02.png b/Plugins/Web/StatsWeb/wwwroot/images/icons/6_semipro/menu_div_semipro_sub02.png
deleted file mode 100644
index fb6dff40f..000000000
Binary files a/Plugins/Web/StatsWeb/wwwroot/images/icons/6_semipro/menu_div_semipro_sub02.png and /dev/null differ
diff --git a/Plugins/Web/StatsWeb/wwwroot/images/icons/6_semipro/menu_div_semipro_sub02_64.png b/Plugins/Web/StatsWeb/wwwroot/images/icons/6_semipro/menu_div_semipro_sub02_64.png
deleted file mode 100644
index 7c57bef09..000000000
Binary files a/Plugins/Web/StatsWeb/wwwroot/images/icons/6_semipro/menu_div_semipro_sub02_64.png and /dev/null differ
diff --git a/Plugins/Web/StatsWeb/wwwroot/images/icons/6_semipro/menu_div_semipro_sub03_64.png b/Plugins/Web/StatsWeb/wwwroot/images/icons/6_semipro/menu_div_semipro_sub03_64.png
deleted file mode 100644
index ea241cafd..000000000
Binary files a/Plugins/Web/StatsWeb/wwwroot/images/icons/6_semipro/menu_div_semipro_sub03_64.png and /dev/null differ
diff --git a/Plugins/Web/StatsWeb/wwwroot/images/icons/7_pro/menu_div_pro.png b/Plugins/Web/StatsWeb/wwwroot/images/icons/7_pro/menu_div_pro.png
deleted file mode 100644
index 26e69611b..000000000
Binary files a/Plugins/Web/StatsWeb/wwwroot/images/icons/7_pro/menu_div_pro.png and /dev/null differ
diff --git a/Plugins/Web/StatsWeb/wwwroot/images/icons/7_pro/menu_div_pro_64.png b/Plugins/Web/StatsWeb/wwwroot/images/icons/7_pro/menu_div_pro_64.png
deleted file mode 100644
index b62438203..000000000
Binary files a/Plugins/Web/StatsWeb/wwwroot/images/icons/7_pro/menu_div_pro_64.png and /dev/null differ
diff --git a/Plugins/Web/StatsWeb/wwwroot/images/icons/7_pro/menu_div_pro_sub01.png b/Plugins/Web/StatsWeb/wwwroot/images/icons/7_pro/menu_div_pro_sub01.png
deleted file mode 100644
index f70b3638c..000000000
Binary files a/Plugins/Web/StatsWeb/wwwroot/images/icons/7_pro/menu_div_pro_sub01.png and /dev/null differ
diff --git a/Plugins/Web/StatsWeb/wwwroot/images/icons/7_pro/menu_div_pro_sub01_64.png b/Plugins/Web/StatsWeb/wwwroot/images/icons/7_pro/menu_div_pro_sub01_64.png
deleted file mode 100644
index 2bac95213..000000000
Binary files a/Plugins/Web/StatsWeb/wwwroot/images/icons/7_pro/menu_div_pro_sub01_64.png and /dev/null differ
diff --git a/Plugins/Web/StatsWeb/wwwroot/images/icons/7_pro/menu_div_pro_sub02.png b/Plugins/Web/StatsWeb/wwwroot/images/icons/7_pro/menu_div_pro_sub02.png
deleted file mode 100644
index 4af262875..000000000
Binary files a/Plugins/Web/StatsWeb/wwwroot/images/icons/7_pro/menu_div_pro_sub02.png and /dev/null differ
diff --git a/Plugins/Web/StatsWeb/wwwroot/images/icons/7_pro/menu_div_pro_sub02_64.png b/Plugins/Web/StatsWeb/wwwroot/images/icons/7_pro/menu_div_pro_sub02_64.png
deleted file mode 100644
index baabc426c..000000000
Binary files a/Plugins/Web/StatsWeb/wwwroot/images/icons/7_pro/menu_div_pro_sub02_64.png and /dev/null differ
diff --git a/Plugins/Web/StatsWeb/wwwroot/images/icons/7_pro/menu_div_pro_sub03_64.png b/Plugins/Web/StatsWeb/wwwroot/images/icons/7_pro/menu_div_pro_sub03_64.png
deleted file mode 100644
index 3ac6ffb90..000000000
Binary files a/Plugins/Web/StatsWeb/wwwroot/images/icons/7_pro/menu_div_pro_sub03_64.png and /dev/null differ
diff --git a/Plugins/Welcome/Welcome.csproj b/Plugins/Welcome/Welcome.csproj
index 50e72401e..7c0aa9a0c 100644
--- a/Plugins/Welcome/Welcome.csproj
+++ b/Plugins/Welcome/Welcome.csproj
@@ -16,13 +16,11 @@
-
- false
-
+
-
+
diff --git a/PostPublish.ps1 b/PostPublish.ps1
new file mode 100644
index 000000000..d1087e02f
--- /dev/null
+++ b/PostPublish.ps1
@@ -0,0 +1,12 @@
+param (
+ [string]$PublishDir = $(throw "-PublishDir is required.")
+)
+
+$localizations = @("en-US", "ru-RU", "es-EC", "pt-BR", "de-DE")
+foreach($localization in $localizations)
+{
+ $url = "http://api.raidmax.org:5000/localization/{0}" -f $localization
+ $filePath = "{0}\Localization\IW4MAdmin.{1}.json" -f $PublishDir, $localization
+ $response = Invoke-WebRequest $url
+ Out-File -FilePath $filePath -InputObject $response.Content -Encoding utf8
+}
\ No newline at end of file
diff --git a/WebfrontCore/Controllers/BaseController.cs b/SharedLibraryCore/BaseController.cs
similarity index 95%
rename from WebfrontCore/Controllers/BaseController.cs
rename to SharedLibraryCore/BaseController.cs
index 7bdc68d82..e057a19e8 100644
--- a/WebfrontCore/Controllers/BaseController.cs
+++ b/SharedLibraryCore/BaseController.cs
@@ -3,18 +3,17 @@ using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
-using SharedLibraryCore;
using SharedLibraryCore.Database;
using SharedLibraryCore.Database.Models;
+using SharedLibraryCore.Dtos;
using SharedLibraryCore.Interfaces;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Claims;
using System.Threading.Tasks;
-using WebfrontCore.ViewModels;
-namespace WebfrontCore.Controllers
+namespace SharedLibraryCore
{
public class BaseController : Controller
{
@@ -23,7 +22,7 @@ namespace WebfrontCore.Controllers
///
private const int COOKIE_LIFESPAN = 3;
- protected IManager Manager;
+ public IManager Manager { get; private set; }
protected readonly DatabaseContext Context;
protected bool Authorized { get; set; }
protected SharedLibraryCore.Localization.Index Localization { get; private set; }
@@ -33,12 +32,9 @@ namespace WebfrontCore.Controllers
private static string SocialTitle;
protected List Pages;
- public BaseController()
+ public BaseController(IManager manager)
{
- if (Manager == null)
- {
- Manager = Program.Manager;
- }
+ Manager = manager;
if (Localization == null)
{
diff --git a/SharedLibraryCore/Dtos/Page.cs b/SharedLibraryCore/Dtos/Page.cs
new file mode 100644
index 000000000..e24cbc576
--- /dev/null
+++ b/SharedLibraryCore/Dtos/Page.cs
@@ -0,0 +1,8 @@
+namespace SharedLibraryCore.Dtos
+{
+ public class Page
+ {
+ public string Name { get; set; }
+ public string Location { get; set; }
+ }
+}
diff --git a/SharedLibraryCore/SharedLibraryCore.csproj b/SharedLibraryCore/SharedLibraryCore.csproj
index ded7da951..eff627fe4 100644
--- a/SharedLibraryCore/SharedLibraryCore.csproj
+++ b/SharedLibraryCore/SharedLibraryCore.csproj
@@ -6,7 +6,7 @@
RaidMax.IW4MAdmin.SharedLibraryCore
- 2.2.0
+ 2.2.3
RaidMax
Forever None
Debug;Release;Prerelease
@@ -19,6 +19,7 @@
true
true
MIT
+ Shared Library for IW4MAdmin
@@ -38,27 +39,29 @@
-
-
-
+
+
+
+
+
all
- runtime; build; native; contentfiles; analyzers
+ runtime; build; native; contentfiles
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
+
-
+
diff --git a/WebfrontCore/.bowerrc b/WebfrontCore/.bowerrc
deleted file mode 100644
index 46ac6f557..000000000
--- a/WebfrontCore/.bowerrc
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "directory": "wwwroot/lib",
- "registry": "https://registry.bower.io"
-}
diff --git a/WebfrontCore/Controllers/API/APIController.cs b/WebfrontCore/Controllers/API/APIController.cs
index 9f08fad09..4c47d5ecb 100644
--- a/WebfrontCore/Controllers/API/APIController.cs
+++ b/WebfrontCore/Controllers/API/APIController.cs
@@ -1,12 +1,17 @@
using Microsoft.AspNetCore.Mvc;
using SharedLibraryCore;
using SharedLibraryCore.Events;
+using SharedLibraryCore.Interfaces;
using System.Linq;
namespace WebfrontCore.Controllers.API
{
public class ApiController : BaseController
{
+ public ApiController(IManager manager) : base(manager)
+ {
+
+ }
public IActionResult Index()
{
return Ok($"IW4MAdmin API");
diff --git a/WebfrontCore/Controllers/AccountController.cs b/WebfrontCore/Controllers/AccountController.cs
index 003d60033..798ab98bc 100644
--- a/WebfrontCore/Controllers/AccountController.cs
+++ b/WebfrontCore/Controllers/AccountController.cs
@@ -3,6 +3,7 @@ using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using SharedLibraryCore;
+using SharedLibraryCore.Interfaces;
using System;
using System.Security.Claims;
using System.Threading.Tasks;
@@ -11,6 +12,10 @@ namespace WebfrontCore.Controllers
{
public class AccountController : BaseController
{
+ public AccountController(IManager manager) : base(manager)
+ {
+
+ }
[HttpGet]
public async Task LoginAsync(int clientId, string password)
diff --git a/WebfrontCore/Controllers/ActionController.cs b/WebfrontCore/Controllers/ActionController.cs
index 7ad029131..533473b33 100644
--- a/WebfrontCore/Controllers/ActionController.cs
+++ b/WebfrontCore/Controllers/ActionController.cs
@@ -5,6 +5,7 @@ using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using SharedLibraryCore;
+using SharedLibraryCore.Interfaces;
using WebfrontCore.ViewModels;
using static SharedLibraryCore.Database.Models.EFClient;
@@ -12,6 +13,11 @@ namespace WebfrontCore.Controllers
{
public class ActionController : BaseController
{
+ public ActionController(IManager manager) : base(manager)
+ {
+
+ }
+
public IActionResult BanForm()
{
var info = new ActionInfo()
diff --git a/WebfrontCore/Controllers/ClientController.cs b/WebfrontCore/Controllers/ClientController.cs
index f580acc01..8864153a0 100644
--- a/WebfrontCore/Controllers/ClientController.cs
+++ b/WebfrontCore/Controllers/ClientController.cs
@@ -2,6 +2,7 @@
using SharedLibraryCore;
using SharedLibraryCore.Database.Models;
using SharedLibraryCore.Dtos;
+using SharedLibraryCore.Interfaces;
using SharedLibraryCore.Services;
using System;
using System.Collections.Generic;
@@ -14,6 +15,11 @@ namespace WebfrontCore.Controllers
{
public class ClientController : BaseController
{
+ public ClientController(IManager manager) : base(manager)
+ {
+
+ }
+
public async Task ProfileAsync(int id)
{
var client = await Manager.GetClientService().Get(id);
diff --git a/WebfrontCore/Controllers/ConfigurationController.cs b/WebfrontCore/Controllers/ConfigurationController.cs
index d0acc6f5e..301b02bbe 100644
--- a/WebfrontCore/Controllers/ConfigurationController.cs
+++ b/WebfrontCore/Controllers/ConfigurationController.cs
@@ -1,6 +1,8 @@
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
+using SharedLibraryCore;
using SharedLibraryCore.Configuration;
+using SharedLibraryCore.Interfaces;
using System.Linq;
using System.Threading.Tasks;
using WebfrontCore.ViewModels;
@@ -10,6 +12,11 @@ namespace WebfrontCore.Controllers
[Authorize]
public class ConfigurationController : BaseController
{
+ public ConfigurationController(IManager manager) : base (manager)
+ {
+
+ }
+
public IActionResult Edit()
{
if (Client.Level < SharedLibraryCore.Database.Models.EFClient.Permission.Owner)
diff --git a/WebfrontCore/Controllers/ConsoleController.cs b/WebfrontCore/Controllers/ConsoleController.cs
index 23a6d4a96..59ff81926 100644
--- a/WebfrontCore/Controllers/ConsoleController.cs
+++ b/WebfrontCore/Controllers/ConsoleController.cs
@@ -2,6 +2,7 @@
using SharedLibraryCore;
using SharedLibraryCore.Database.Models;
using SharedLibraryCore.Dtos;
+using SharedLibraryCore.Interfaces;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
@@ -10,6 +11,11 @@ namespace WebfrontCore.Controllers
{
public class ConsoleController : BaseController
{
+ public ConsoleController(IManager manager) : base(manager)
+ {
+
+ }
+
public IActionResult Index()
{
var activeServers = Manager.GetServers().Select(s => new ServerInfo()
diff --git a/WebfrontCore/Controllers/DynamicFileController.cs b/WebfrontCore/Controllers/DynamicFileController.cs
index 50f65bd22..73aaaf717 100644
--- a/WebfrontCore/Controllers/DynamicFileController.cs
+++ b/WebfrontCore/Controllers/DynamicFileController.cs
@@ -1,4 +1,6 @@
using Microsoft.AspNetCore.Mvc;
+using SharedLibraryCore;
+using SharedLibraryCore.Interfaces;
using System;
using System.Collections.Generic;
using System.IO;
@@ -12,6 +14,11 @@ namespace WebfrontCore.Controllers
{
private static readonly IDictionary _fileCache = new Dictionary();
+ public DynamicFileController(IManager manager) : base(manager)
+ {
+
+ }
+
[Route("css/{fileName}")]
public async Task Css(string fileName)
{
diff --git a/WebfrontCore/Controllers/HomeController.cs b/WebfrontCore/Controllers/HomeController.cs
index b56cb2fdb..621a7a06d 100644
--- a/WebfrontCore/Controllers/HomeController.cs
+++ b/WebfrontCore/Controllers/HomeController.cs
@@ -1,6 +1,8 @@
using Microsoft.AspNetCore.Diagnostics;
using Microsoft.AspNetCore.Mvc;
+using SharedLibraryCore;
using SharedLibraryCore.Dtos;
+using SharedLibraryCore.Interfaces;
using System.Linq;
using System.Threading.Tasks;
@@ -8,6 +10,11 @@ namespace WebfrontCore.Controllers
{
public class HomeController : BaseController
{
+ public HomeController(IManager manager) : base(manager)
+ {
+
+ }
+
public async Task Index()
{
ViewBag.Description = "IW4MAdmin is a complete server administration tool for IW4x.";
diff --git a/WebfrontCore/Controllers/PenaltyController.cs b/WebfrontCore/Controllers/PenaltyController.cs
index b3551a4da..97f3e1da3 100644
--- a/WebfrontCore/Controllers/PenaltyController.cs
+++ b/WebfrontCore/Controllers/PenaltyController.cs
@@ -2,20 +2,22 @@
using Microsoft.EntityFrameworkCore;
using SharedLibraryCore;
using SharedLibraryCore.Database;
-using SharedLibraryCore.Database.Models;
using SharedLibraryCore.Dtos;
-using SharedLibraryCore.Services;
-using System;
+using SharedLibraryCore.Interfaces;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
-using WebfrontCore.ViewComponents;
using static SharedLibraryCore.Database.Models.EFPenalty;
namespace WebfrontCore.Controllers
{
public class PenaltyController : BaseController
{
+ public PenaltyController(IManager manager) : base(manager)
+ {
+
+ }
+
public IActionResult List(PenaltyType showOnly = PenaltyType.Any)
{
ViewBag.Description = "List of all the recent penalties (bans, kicks, warnings) on IW4MAdmin";
diff --git a/WebfrontCore/Controllers/ServerController.cs b/WebfrontCore/Controllers/ServerController.cs
index 0b7749b75..f73506c67 100644
--- a/WebfrontCore/Controllers/ServerController.cs
+++ b/WebfrontCore/Controllers/ServerController.cs
@@ -1,12 +1,18 @@
using Microsoft.AspNetCore.Mvc;
using SharedLibraryCore;
using SharedLibraryCore.Dtos;
+using SharedLibraryCore.Interfaces;
using System.Linq;
namespace WebfrontCore.Controllers
{
public class ServerController : BaseController
{
+ public ServerController(IManager manager) : base(manager)
+ {
+
+ }
+
[HttpGet]
[ResponseCache(NoStore = true, Duration = 0)]
public IActionResult ClientActivity(long id)
diff --git a/WebfrontCore/Startup.cs b/WebfrontCore/Startup.cs
index 304ed0c64..46f681bca 100644
--- a/WebfrontCore/Startup.cs
+++ b/WebfrontCore/Startup.cs
@@ -7,6 +7,7 @@ using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using SharedLibraryCore.Database;
+using SharedLibraryCore.Interfaces;
using WebfrontCore.Middleware;
namespace WebfrontCore
@@ -57,7 +58,7 @@ namespace WebfrontCore
});
#if DEBUG
- mvcBuilder = mvcBuilder.AddRazorRuntimeCompilation();
+ //mvcBuilder = mvcBuilder.AddRazorRuntimeCompilation();
services.Configure(_options =>
{
_options.ViewLocationFormats.Add(@"/Views/Plugins/{1}/{0}" + RazorViewEngine.ViewExtension);
@@ -87,6 +88,8 @@ namespace WebfrontCore
_builder.AddDebug();
});
#endif
+
+ services.AddSingleton(Program.Manager);
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
diff --git a/WebfrontCore/ViewModels/Page.cs b/WebfrontCore/ViewModels/Page.cs
deleted file mode 100644
index b39347f38..000000000
--- a/WebfrontCore/ViewModels/Page.cs
+++ /dev/null
@@ -1,13 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Threading.Tasks;
-
-namespace WebfrontCore.ViewModels
-{
- public class Page
- {
- public string Name { get; set; }
- public string Location { get; set; }
- }
-}
diff --git a/WebfrontCore/Views/Shared/_Layout.cshtml b/WebfrontCore/Views/Shared/_Layout.cshtml
index 72e6f8d5a..99e57dfad 100644
--- a/WebfrontCore/Views/Shared/_Layout.cshtml
+++ b/WebfrontCore/Views/Shared/_Layout.cshtml
@@ -18,8 +18,7 @@
-
-
+
@@ -145,9 +144,10 @@
-
+
+
-
+
diff --git a/WebfrontCore/WebfrontCore.csproj b/WebfrontCore/WebfrontCore.csproj
index 20f5ec30d..35032b454 100644
--- a/WebfrontCore/WebfrontCore.csproj
+++ b/WebfrontCore/WebfrontCore.csproj
@@ -5,7 +5,7 @@
true
true
true
- true
+ false
2.6
RaidMax.IW4MAdmin.WebfrontCore
2.0.0
@@ -19,7 +19,7 @@
https://github.com/RaidMax/IW4M-Admin
https://raidmax.org/IW4MAdmin/img/iw4adminicon-3.png
- Exe
+ Library
Debug;Release;Prerelease
@@ -43,7 +43,6 @@
-
@@ -51,32 +50,50 @@
+
+
+
-
-
-
-
- <_ContentIncludedByDefault Remove="wwwroot\css\main.min.css" />
-
-
-
+
+
+
-
-
+
+
+
+
+
+
-
+
-
-
-
+
+
+
+
+
-
+
+
+ Never
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/WebfrontCore/bower.json b/WebfrontCore/bower.json
deleted file mode 100644
index f36f001c8..000000000
--- a/WebfrontCore/bower.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
- "name": "asp.net",
- "private": true,
- "dependencies": {
- "bootstrap": "v4.1.1",
- "jquery": "3.3.1",
- "popper.js": "v1.12.9",
- "open-iconic": "1.1.1",
- "moment-timezone": "0.5.14"
- },
- "resolutions": {
- "bootstrap": "v4.1.1",
- "jquery": "3.3.1"
- }
-}
diff --git a/WebfrontCore/bundleconfig.json b/WebfrontCore/bundleconfig.json
index 996c2e9ed..58e161fae 100644
--- a/WebfrontCore/bundleconfig.json
+++ b/WebfrontCore/bundleconfig.json
@@ -5,18 +5,18 @@
"outputFileName": "wwwroot/css/global.min.css",
// An array of relative input file paths. Globbing patterns supported
"inputFiles": [
- "wwwroot/css/main.css",
- "wwwroot/lib/open-iconic/font/css/open-iconic-bootstrap.css"
+ "wwwroot/css/global.css"
]
},
{
"outputFileName": "wwwroot/js/global.min.js",
"inputFiles": [
- "wwwroot/lib/jQuery/dist/jquery.min.js",
- "wwwroot/lib/bootstrap/dist/js/bootstrap.min.js",
- "wwwroot/lib/moment/min/moment.min.js",
- "wwwroot/lib/moment-timezone/builds/moment-timezone.min.js",
- "wwwroot/lib/canvasjs/canvasjs.js",
+ "wwwroot/lib/jquery/jquery.min.js",
+ "wwwroot/lib/popper.js/umd/popper.js",
+ "wwwroot/lib/moment.js/moment.min.js",
+ "wwwroot/lib/moment-timezone/moment-timezone.min.js",
+ "wwwroot/lib/bootstrap/dist/js/bootstrap.bundle.min.js",
+ "wwwroot/lib/canvas.js/canvasjs.js",
"wwwroot/js/action.js",
"wwwroot/js/console.js",
"wwwroot/js/penalty.js",
diff --git a/WebfrontCore/compilerconfig.json b/WebfrontCore/compilerconfig.json
index f3489eacd..9750bdd28 100644
--- a/WebfrontCore/compilerconfig.json
+++ b/WebfrontCore/compilerconfig.json
@@ -1,14 +1,7 @@
-[
+[
{
- "outputFile": "wwwroot/css/bootstrap-custom.css",
- "inputFile": "wwwroot/css/bootstrap-custom.scss"
- },
- {
- "outputFile": "wwwroot/js/server.es5.js",
- "inputFile": "wwwroot/js/server.js"
- },
- {
- "outputFile": "wwwroot/css/main.css",
- "inputFile": "wwwroot/css/main.scss"
+ "outputFile": "wwwroot/css/global.css",
+ "inputFile": "wwwroot/css/src/main.scss",
+ "sourceMap": false
}
]
\ No newline at end of file
diff --git a/WebfrontCore/libman.json b/WebfrontCore/libman.json
new file mode 100644
index 000000000..c62cb2e46
--- /dev/null
+++ b/WebfrontCore/libman.json
@@ -0,0 +1,31 @@
+{
+ "version": "1.0",
+ "defaultProvider": "cdnjs",
+ "libraries": [
+ {
+ "library": "jquery@3.3.1",
+ "destination": "wwwroot/lib/jquery/"
+ },
+ {
+ "library": "popper.js@1.14.7",
+ "destination": "wwwroot/lib/popper.js/"
+ },
+ {
+ "library": "moment-timezone@0.5.26",
+ "destination": "wwwroot/lib/moment-timezone/"
+ },
+ {
+ "library": "open-iconic@1.1.1",
+ "destination": "wwwroot/lib/open-iconic/"
+ },
+ {
+ "provider": "jsdelivr",
+ "library": "bootstrap@4.3.1",
+ "destination": "wwwroot/lib/bootstrap/"
+ },
+ {
+ "library": "moment.js@2.24.0",
+ "destination": "wwwroot/lib/moment.js/"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/WebfrontCore/wwwroot/css/bootstrap-custom.scss b/WebfrontCore/wwwroot/css/src/bootstrap-custom.scss
similarity index 95%
rename from WebfrontCore/wwwroot/css/bootstrap-custom.scss
rename to WebfrontCore/wwwroot/css/src/bootstrap-custom.scss
index 2ce4d80d4..300bc754e 100644
--- a/WebfrontCore/wwwroot/css/bootstrap-custom.scss
+++ b/WebfrontCore/wwwroot/css/src/bootstrap-custom.scss
@@ -23,7 +23,6 @@ $h5-font-size: $font-size-base * 1.25 !default;
$h1-font-size: $font-size-base * 2.5 !default;
$navbar-brand-font-size: $h1-font-size !default;
$navbar-toggler-font-size: $h5-font-size !default;
-
$navbar-dark-hover-color: $primary !default;
-@import '../lib/bootstrap/scss/bootstrap.scss';
\ No newline at end of file
+@import '../../lib/bootstrap/scss/bootstrap.scss';
\ No newline at end of file
diff --git a/WebfrontCore/wwwroot/css/main.scss b/WebfrontCore/wwwroot/css/src/main.scss
similarity index 98%
rename from WebfrontCore/wwwroot/css/main.scss
rename to WebfrontCore/wwwroot/css/src/main.scss
index 519be9437..f044f4834 100644
--- a/WebfrontCore/wwwroot/css/main.scss
+++ b/WebfrontCore/wwwroot/css/src/main.scss
@@ -1,6 +1,9 @@
@import 'bootstrap-custom.scss';
@import 'profile.scss';
+$icon-font-path: '/font/' !default;
+@import '../../lib/open-iconic/font/css/open-iconic-bootstrap.scss';
+
.navbar-nav .nav-link:hover {
background-color: $body-bg;
}
diff --git a/WebfrontCore/wwwroot/css/profile.scss b/WebfrontCore/wwwroot/css/src/profile.scss
similarity index 100%
rename from WebfrontCore/wwwroot/css/profile.scss
rename to WebfrontCore/wwwroot/css/src/profile.scss
diff --git a/WebfrontCore/wwwroot/images/icons/0_no-place/menu_div_no_place_64.png b/WebfrontCore/wwwroot/images/icons/0_no-place/menu_div_no_place_64.png
deleted file mode 100644
index 64b6dfe6e..000000000
Binary files a/WebfrontCore/wwwroot/images/icons/0_no-place/menu_div_no_place_64.png and /dev/null differ
diff --git a/WebfrontCore/wwwroot/images/icons/1_iron/menu_div_iron.png b/WebfrontCore/wwwroot/images/icons/1_iron/menu_div_iron.png
deleted file mode 100644
index 0e3fb3c07..000000000
Binary files a/WebfrontCore/wwwroot/images/icons/1_iron/menu_div_iron.png and /dev/null differ
diff --git a/WebfrontCore/wwwroot/images/icons/1_iron/menu_div_iron_64.png b/WebfrontCore/wwwroot/images/icons/1_iron/menu_div_iron_64.png
deleted file mode 100644
index 4fd07dd07..000000000
Binary files a/WebfrontCore/wwwroot/images/icons/1_iron/menu_div_iron_64.png and /dev/null differ
diff --git a/WebfrontCore/wwwroot/images/icons/1_iron/menu_div_iron_sub01.png b/WebfrontCore/wwwroot/images/icons/1_iron/menu_div_iron_sub01.png
deleted file mode 100644
index c440d4542..000000000
Binary files a/WebfrontCore/wwwroot/images/icons/1_iron/menu_div_iron_sub01.png and /dev/null differ
diff --git a/WebfrontCore/wwwroot/images/icons/1_iron/menu_div_iron_sub01_64.png b/WebfrontCore/wwwroot/images/icons/1_iron/menu_div_iron_sub01_64.png
deleted file mode 100644
index 77a60574a..000000000
Binary files a/WebfrontCore/wwwroot/images/icons/1_iron/menu_div_iron_sub01_64.png and /dev/null differ
diff --git a/WebfrontCore/wwwroot/images/icons/1_iron/menu_div_iron_sub02.png b/WebfrontCore/wwwroot/images/icons/1_iron/menu_div_iron_sub02.png
deleted file mode 100644
index 01f36607d..000000000
Binary files a/WebfrontCore/wwwroot/images/icons/1_iron/menu_div_iron_sub02.png and /dev/null differ
diff --git a/WebfrontCore/wwwroot/images/icons/1_iron/menu_div_iron_sub02_64.png b/WebfrontCore/wwwroot/images/icons/1_iron/menu_div_iron_sub02_64.png
deleted file mode 100644
index 52e9f6043..000000000
Binary files a/WebfrontCore/wwwroot/images/icons/1_iron/menu_div_iron_sub02_64.png and /dev/null differ
diff --git a/WebfrontCore/wwwroot/images/icons/1_iron/menu_div_iron_sub03_64.png b/WebfrontCore/wwwroot/images/icons/1_iron/menu_div_iron_sub03_64.png
deleted file mode 100644
index e04bd5228..000000000
Binary files a/WebfrontCore/wwwroot/images/icons/1_iron/menu_div_iron_sub03_64.png and /dev/null differ
diff --git a/WebfrontCore/wwwroot/images/icons/2_bronze/menu_div_bronze.png b/WebfrontCore/wwwroot/images/icons/2_bronze/menu_div_bronze.png
deleted file mode 100644
index daa65c029..000000000
Binary files a/WebfrontCore/wwwroot/images/icons/2_bronze/menu_div_bronze.png and /dev/null differ
diff --git a/WebfrontCore/wwwroot/images/icons/2_bronze/menu_div_bronze_64.png b/WebfrontCore/wwwroot/images/icons/2_bronze/menu_div_bronze_64.png
deleted file mode 100644
index 374beb5a6..000000000
Binary files a/WebfrontCore/wwwroot/images/icons/2_bronze/menu_div_bronze_64.png and /dev/null differ
diff --git a/WebfrontCore/wwwroot/images/icons/2_bronze/menu_div_bronze_sub01.png b/WebfrontCore/wwwroot/images/icons/2_bronze/menu_div_bronze_sub01.png
deleted file mode 100644
index 801d23853..000000000
Binary files a/WebfrontCore/wwwroot/images/icons/2_bronze/menu_div_bronze_sub01.png and /dev/null differ
diff --git a/WebfrontCore/wwwroot/images/icons/2_bronze/menu_div_bronze_sub01_64.png b/WebfrontCore/wwwroot/images/icons/2_bronze/menu_div_bronze_sub01_64.png
deleted file mode 100644
index b647d0e77..000000000
Binary files a/WebfrontCore/wwwroot/images/icons/2_bronze/menu_div_bronze_sub01_64.png and /dev/null differ
diff --git a/WebfrontCore/wwwroot/images/icons/2_bronze/menu_div_bronze_sub02.png b/WebfrontCore/wwwroot/images/icons/2_bronze/menu_div_bronze_sub02.png
deleted file mode 100644
index d3c10819b..000000000
Binary files a/WebfrontCore/wwwroot/images/icons/2_bronze/menu_div_bronze_sub02.png and /dev/null differ
diff --git a/WebfrontCore/wwwroot/images/icons/2_bronze/menu_div_bronze_sub02_64.png b/WebfrontCore/wwwroot/images/icons/2_bronze/menu_div_bronze_sub02_64.png
deleted file mode 100644
index eb270fb44..000000000
Binary files a/WebfrontCore/wwwroot/images/icons/2_bronze/menu_div_bronze_sub02_64.png and /dev/null differ
diff --git a/WebfrontCore/wwwroot/images/icons/2_bronze/menu_div_bronze_sub03_64.png b/WebfrontCore/wwwroot/images/icons/2_bronze/menu_div_bronze_sub03_64.png
deleted file mode 100644
index 06cd5e2f1..000000000
Binary files a/WebfrontCore/wwwroot/images/icons/2_bronze/menu_div_bronze_sub03_64.png and /dev/null differ
diff --git a/WebfrontCore/wwwroot/images/icons/3_silver/menu_div_silver.png b/WebfrontCore/wwwroot/images/icons/3_silver/menu_div_silver.png
deleted file mode 100644
index 87683e195..000000000
Binary files a/WebfrontCore/wwwroot/images/icons/3_silver/menu_div_silver.png and /dev/null differ
diff --git a/WebfrontCore/wwwroot/images/icons/3_silver/menu_div_silver_64.png b/WebfrontCore/wwwroot/images/icons/3_silver/menu_div_silver_64.png
deleted file mode 100644
index 19b996d8f..000000000
Binary files a/WebfrontCore/wwwroot/images/icons/3_silver/menu_div_silver_64.png and /dev/null differ
diff --git a/WebfrontCore/wwwroot/images/icons/3_silver/menu_div_silver_sub01.png b/WebfrontCore/wwwroot/images/icons/3_silver/menu_div_silver_sub01.png
deleted file mode 100644
index 1b7123b59..000000000
Binary files a/WebfrontCore/wwwroot/images/icons/3_silver/menu_div_silver_sub01.png and /dev/null differ
diff --git a/WebfrontCore/wwwroot/images/icons/3_silver/menu_div_silver_sub01_64.png b/WebfrontCore/wwwroot/images/icons/3_silver/menu_div_silver_sub01_64.png
deleted file mode 100644
index e6b9b29b4..000000000
Binary files a/WebfrontCore/wwwroot/images/icons/3_silver/menu_div_silver_sub01_64.png and /dev/null differ
diff --git a/WebfrontCore/wwwroot/images/icons/3_silver/menu_div_silver_sub02.png b/WebfrontCore/wwwroot/images/icons/3_silver/menu_div_silver_sub02.png
deleted file mode 100644
index 77b66efcf..000000000
Binary files a/WebfrontCore/wwwroot/images/icons/3_silver/menu_div_silver_sub02.png and /dev/null differ
diff --git a/WebfrontCore/wwwroot/images/icons/3_silver/menu_div_silver_sub02_64.png b/WebfrontCore/wwwroot/images/icons/3_silver/menu_div_silver_sub02_64.png
deleted file mode 100644
index ac03e9c14..000000000
Binary files a/WebfrontCore/wwwroot/images/icons/3_silver/menu_div_silver_sub02_64.png and /dev/null differ
diff --git a/WebfrontCore/wwwroot/images/icons/3_silver/menu_div_silver_sub03_64.png b/WebfrontCore/wwwroot/images/icons/3_silver/menu_div_silver_sub03_64.png
deleted file mode 100644
index 4b88f6052..000000000
Binary files a/WebfrontCore/wwwroot/images/icons/3_silver/menu_div_silver_sub03_64.png and /dev/null differ
diff --git a/WebfrontCore/wwwroot/images/icons/4_gold/menu_div_gold.png b/WebfrontCore/wwwroot/images/icons/4_gold/menu_div_gold.png
deleted file mode 100644
index 9b572f6dd..000000000
Binary files a/WebfrontCore/wwwroot/images/icons/4_gold/menu_div_gold.png and /dev/null differ
diff --git a/WebfrontCore/wwwroot/images/icons/4_gold/menu_div_gold_64.png b/WebfrontCore/wwwroot/images/icons/4_gold/menu_div_gold_64.png
deleted file mode 100644
index 2cfd7a535..000000000
Binary files a/WebfrontCore/wwwroot/images/icons/4_gold/menu_div_gold_64.png and /dev/null differ
diff --git a/WebfrontCore/wwwroot/images/icons/4_gold/menu_div_gold_sub01.png b/WebfrontCore/wwwroot/images/icons/4_gold/menu_div_gold_sub01.png
deleted file mode 100644
index a4ed5d3f7..000000000
Binary files a/WebfrontCore/wwwroot/images/icons/4_gold/menu_div_gold_sub01.png and /dev/null differ
diff --git a/WebfrontCore/wwwroot/images/icons/4_gold/menu_div_gold_sub01_64.png b/WebfrontCore/wwwroot/images/icons/4_gold/menu_div_gold_sub01_64.png
deleted file mode 100644
index a9c6b90ef..000000000
Binary files a/WebfrontCore/wwwroot/images/icons/4_gold/menu_div_gold_sub01_64.png and /dev/null differ
diff --git a/WebfrontCore/wwwroot/images/icons/4_gold/menu_div_gold_sub02.png b/WebfrontCore/wwwroot/images/icons/4_gold/menu_div_gold_sub02.png
deleted file mode 100644
index 198ce4c51..000000000
Binary files a/WebfrontCore/wwwroot/images/icons/4_gold/menu_div_gold_sub02.png and /dev/null differ
diff --git a/WebfrontCore/wwwroot/images/icons/4_gold/menu_div_gold_sub02_64.png b/WebfrontCore/wwwroot/images/icons/4_gold/menu_div_gold_sub02_64.png
deleted file mode 100644
index d9e2b862e..000000000
Binary files a/WebfrontCore/wwwroot/images/icons/4_gold/menu_div_gold_sub02_64.png and /dev/null differ
diff --git a/WebfrontCore/wwwroot/images/icons/4_gold/menu_div_gold_sub03_64.png b/WebfrontCore/wwwroot/images/icons/4_gold/menu_div_gold_sub03_64.png
deleted file mode 100644
index 2b858d041..000000000
Binary files a/WebfrontCore/wwwroot/images/icons/4_gold/menu_div_gold_sub03_64.png and /dev/null differ
diff --git a/WebfrontCore/wwwroot/images/icons/5_platinum/menu_div_platinum.png b/WebfrontCore/wwwroot/images/icons/5_platinum/menu_div_platinum.png
deleted file mode 100644
index 58ad2ada1..000000000
Binary files a/WebfrontCore/wwwroot/images/icons/5_platinum/menu_div_platinum.png and /dev/null differ
diff --git a/WebfrontCore/wwwroot/images/icons/5_platinum/menu_div_platinum_64.png b/WebfrontCore/wwwroot/images/icons/5_platinum/menu_div_platinum_64.png
deleted file mode 100644
index de94aa263..000000000
Binary files a/WebfrontCore/wwwroot/images/icons/5_platinum/menu_div_platinum_64.png and /dev/null differ
diff --git a/WebfrontCore/wwwroot/images/icons/5_platinum/menu_div_platinum_sub01.png b/WebfrontCore/wwwroot/images/icons/5_platinum/menu_div_platinum_sub01.png
deleted file mode 100644
index b726af865..000000000
Binary files a/WebfrontCore/wwwroot/images/icons/5_platinum/menu_div_platinum_sub01.png and /dev/null differ
diff --git a/WebfrontCore/wwwroot/images/icons/5_platinum/menu_div_platinum_sub01_64.png b/WebfrontCore/wwwroot/images/icons/5_platinum/menu_div_platinum_sub01_64.png
deleted file mode 100644
index 321166e8d..000000000
Binary files a/WebfrontCore/wwwroot/images/icons/5_platinum/menu_div_platinum_sub01_64.png and /dev/null differ
diff --git a/WebfrontCore/wwwroot/images/icons/5_platinum/menu_div_platinum_sub02.png b/WebfrontCore/wwwroot/images/icons/5_platinum/menu_div_platinum_sub02.png
deleted file mode 100644
index 36cfc5e2c..000000000
Binary files a/WebfrontCore/wwwroot/images/icons/5_platinum/menu_div_platinum_sub02.png and /dev/null differ
diff --git a/WebfrontCore/wwwroot/images/icons/5_platinum/menu_div_platinum_sub02_64.png b/WebfrontCore/wwwroot/images/icons/5_platinum/menu_div_platinum_sub02_64.png
deleted file mode 100644
index 9de5cd27c..000000000
Binary files a/WebfrontCore/wwwroot/images/icons/5_platinum/menu_div_platinum_sub02_64.png and /dev/null differ
diff --git a/WebfrontCore/wwwroot/images/icons/5_platinum/menu_div_platinum_sub03_64.png b/WebfrontCore/wwwroot/images/icons/5_platinum/menu_div_platinum_sub03_64.png
deleted file mode 100644
index e2ef3b7da..000000000
Binary files a/WebfrontCore/wwwroot/images/icons/5_platinum/menu_div_platinum_sub03_64.png and /dev/null differ
diff --git a/WebfrontCore/wwwroot/images/icons/6_semipro/menu_div_semipro.png b/WebfrontCore/wwwroot/images/icons/6_semipro/menu_div_semipro.png
deleted file mode 100644
index d9a01691e..000000000
Binary files a/WebfrontCore/wwwroot/images/icons/6_semipro/menu_div_semipro.png and /dev/null differ
diff --git a/WebfrontCore/wwwroot/images/icons/6_semipro/menu_div_semipro_64.png b/WebfrontCore/wwwroot/images/icons/6_semipro/menu_div_semipro_64.png
deleted file mode 100644
index e5cc66ec9..000000000
Binary files a/WebfrontCore/wwwroot/images/icons/6_semipro/menu_div_semipro_64.png and /dev/null differ
diff --git a/WebfrontCore/wwwroot/images/icons/6_semipro/menu_div_semipro_sub01.png b/WebfrontCore/wwwroot/images/icons/6_semipro/menu_div_semipro_sub01.png
deleted file mode 100644
index e2ccae019..000000000
Binary files a/WebfrontCore/wwwroot/images/icons/6_semipro/menu_div_semipro_sub01.png and /dev/null differ
diff --git a/WebfrontCore/wwwroot/images/icons/6_semipro/menu_div_semipro_sub01_64.png b/WebfrontCore/wwwroot/images/icons/6_semipro/menu_div_semipro_sub01_64.png
deleted file mode 100644
index ba95f3017..000000000
Binary files a/WebfrontCore/wwwroot/images/icons/6_semipro/menu_div_semipro_sub01_64.png and /dev/null differ
diff --git a/WebfrontCore/wwwroot/images/icons/6_semipro/menu_div_semipro_sub02.png b/WebfrontCore/wwwroot/images/icons/6_semipro/menu_div_semipro_sub02.png
deleted file mode 100644
index fb6dff40f..000000000
Binary files a/WebfrontCore/wwwroot/images/icons/6_semipro/menu_div_semipro_sub02.png and /dev/null differ
diff --git a/WebfrontCore/wwwroot/images/icons/6_semipro/menu_div_semipro_sub02_64.png b/WebfrontCore/wwwroot/images/icons/6_semipro/menu_div_semipro_sub02_64.png
deleted file mode 100644
index 7c57bef09..000000000
Binary files a/WebfrontCore/wwwroot/images/icons/6_semipro/menu_div_semipro_sub02_64.png and /dev/null differ
diff --git a/WebfrontCore/wwwroot/images/icons/6_semipro/menu_div_semipro_sub03_64.png b/WebfrontCore/wwwroot/images/icons/6_semipro/menu_div_semipro_sub03_64.png
deleted file mode 100644
index ea241cafd..000000000
Binary files a/WebfrontCore/wwwroot/images/icons/6_semipro/menu_div_semipro_sub03_64.png and /dev/null differ
diff --git a/WebfrontCore/wwwroot/images/icons/7_pro/menu_div_pro.png b/WebfrontCore/wwwroot/images/icons/7_pro/menu_div_pro.png
deleted file mode 100644
index 26e69611b..000000000
Binary files a/WebfrontCore/wwwroot/images/icons/7_pro/menu_div_pro.png and /dev/null differ
diff --git a/WebfrontCore/wwwroot/images/icons/7_pro/menu_div_pro_64.png b/WebfrontCore/wwwroot/images/icons/7_pro/menu_div_pro_64.png
deleted file mode 100644
index b62438203..000000000
Binary files a/WebfrontCore/wwwroot/images/icons/7_pro/menu_div_pro_64.png and /dev/null differ
diff --git a/WebfrontCore/wwwroot/images/icons/7_pro/menu_div_pro_sub01.png b/WebfrontCore/wwwroot/images/icons/7_pro/menu_div_pro_sub01.png
deleted file mode 100644
index f70b3638c..000000000
Binary files a/WebfrontCore/wwwroot/images/icons/7_pro/menu_div_pro_sub01.png and /dev/null differ
diff --git a/WebfrontCore/wwwroot/images/icons/7_pro/menu_div_pro_sub01_64.png b/WebfrontCore/wwwroot/images/icons/7_pro/menu_div_pro_sub01_64.png
deleted file mode 100644
index 2bac95213..000000000
Binary files a/WebfrontCore/wwwroot/images/icons/7_pro/menu_div_pro_sub01_64.png and /dev/null differ
diff --git a/WebfrontCore/wwwroot/images/icons/7_pro/menu_div_pro_sub02.png b/WebfrontCore/wwwroot/images/icons/7_pro/menu_div_pro_sub02.png
deleted file mode 100644
index 4af262875..000000000
Binary files a/WebfrontCore/wwwroot/images/icons/7_pro/menu_div_pro_sub02.png and /dev/null differ
diff --git a/WebfrontCore/wwwroot/images/icons/7_pro/menu_div_pro_sub02_64.png b/WebfrontCore/wwwroot/images/icons/7_pro/menu_div_pro_sub02_64.png
deleted file mode 100644
index baabc426c..000000000
Binary files a/WebfrontCore/wwwroot/images/icons/7_pro/menu_div_pro_sub02_64.png and /dev/null differ
diff --git a/WebfrontCore/wwwroot/images/icons/7_pro/menu_div_pro_sub03_64.png b/WebfrontCore/wwwroot/images/icons/7_pro/menu_div_pro_sub03_64.png
deleted file mode 100644
index 3ac6ffb90..000000000
Binary files a/WebfrontCore/wwwroot/images/icons/7_pro/menu_div_pro_sub03_64.png and /dev/null differ
diff --git a/WebfrontCore/wwwroot/lib/bootstrap/scss/_variables.scss b/WebfrontCore/wwwroot/lib/bootstrap/scss/_variables.scss
deleted file mode 100644
index 73451a090..000000000
--- a/WebfrontCore/wwwroot/lib/bootstrap/scss/_variables.scss
+++ /dev/null
@@ -1,929 +0,0 @@
-// Variables
-//
-// Variables should follow the `$component-state-property-size` formula for
-// consistent naming. Ex: $nav-link-disabled-color and $modal-content-box-shadow-xs.
-
-
-//
-// Color system
-//
-
-// stylelint-disable
-$white: #fff !default;
-$gray-100: #f8f9fa !default;
-$gray-200: #e9ecef !default;
-$gray-300: #dee2e6 !default;
-$gray-400: #ced4da !default;
-$gray-500: #adb5bd !default;
-$gray-600: #6c757d !default;
-$gray-700: #495057 !default;
-$gray-800: #343a40 !default;
-$gray-900: #212529 !default;
-$black: #000 !default;
-
-$grays: () !default;
-$grays: map-merge((
- "100": $gray-100,
- "200": $gray-200,
- "300": $gray-300,
- "400": $gray-400,
- "500": $gray-500,
- "600": $gray-600,
- "700": $gray-700,
- "800": $gray-800,
- "900": $gray-900
-), $grays);
-
-$blue: #007bff !default;
-$indigo: #6610f2 !default;
-$purple: #6f42c1 !default;
-$pink: #e83e8c !default;
-$red: #dc3545 !default;
-$orange: #fd7e14 !default;
-$yellow: #ffc107 !default;
-$green: #28a745 !default;
-$teal: #20c997 !default;
-$cyan: #17a2b8 !default;
-
-$colors: () !default;
-$colors: map-merge((
- "blue": $blue,
- "indigo": $indigo,
- "purple": $purple,
- "pink": $pink,
- "red": $red,
- "orange": $orange,
- "yellow": $yellow,
- "green": $green,
- "teal": $teal,
- "cyan": $cyan,
- "white": $white,
- "gray": $gray-600,
- "gray-dark": $gray-800
-), $colors);
-
-$primary: $blue !default;
-$secondary: $gray-600 !default;
-$success: $green !default;
-$info: $cyan !default;
-$warning: $yellow !default;
-$danger: $red !default;
-$light: $gray-100 !default;
-$dark: $gray-800 !default;
-
-$theme-colors: () !default;
-$theme-colors: map-merge((
- "primary": $primary,
- "secondary": $secondary,
- "success": $success,
- "info": $info,
- "warning": $warning,
- "danger": $danger,
- "light": $light,
- "dark": $dark
-), $theme-colors);
-// stylelint-enable
-
-// Set a specific jump point for requesting color jumps
-$theme-color-interval: 8% !default;
-
-// The yiq lightness value that determines when the lightness of color changes from "dark" to "light". Acceptable values are between 0 and 255.
-$yiq-contrasted-threshold: 150 !default;
-
-// Customize the light and dark text colors for use in our YIQ color contrast function.
-$yiq-text-dark: $gray-900 !default;
-$yiq-text-light: $white !default;
-
-// Options
-//
-// Quickly modify global styling by enabling or disabling optional features.
-
-$enable-caret: true !default;
-$enable-rounded: true !default;
-$enable-shadows: false !default;
-$enable-gradients: false !default;
-$enable-transitions: true !default;
-$enable-hover-media-query: false !default; // Deprecated, no longer affects any compiled CSS
-$enable-grid-classes: true !default;
-$enable-print-styles: true !default;
-
-
-// Spacing
-//
-// Control the default styling of most Bootstrap elements by modifying these
-// variables. Mostly focused on spacing.
-// You can add more entries to the $spacers map, should you need more variation.
-
-// stylelint-disable
-$spacer: 1rem !default;
-$spacers: () !default;
-$spacers: map-merge((
- 0: 0,
- 1: ($spacer * .25),
- 2: ($spacer * .5),
- 3: $spacer,
- 4: ($spacer * 1.5),
- 5: ($spacer * 3)
-), $spacers);
-
-// This variable affects the `.h-*` and `.w-*` classes.
-$sizes: () !default;
-$sizes: map-merge((
- 25: 25%,
- 50: 50%,
- 75: 75%,
- 100: 100%,
- auto: auto
-), $sizes);
-// stylelint-enable
-
-// Body
-//
-// Settings for the `
` element.
-
-$body-bg: $white !default;
-$body-color: $gray-900 !default;
-
-// Links
-//
-// Style anchor elements.
-
-$link-color: theme-color("primary") !default;
-$link-decoration: none !default;
-$link-hover-color: darken($link-color, 15%) !default;
-$link-hover-decoration: underline !default;
-
-// Paragraphs
-//
-// Style p element.
-
-$paragraph-margin-bottom: 1rem !default;
-
-
-// Grid breakpoints
-//
-// Define the minimum dimensions at which your layout will change,
-// adapting to different screen sizes, for use in media queries.
-
-$grid-breakpoints: (
- xs: 0,
- sm: 576px,
- md: 768px,
- lg: 992px,
- xl: 1200px
-) !default;
-
-@include _assert-ascending($grid-breakpoints, "$grid-breakpoints");
-@include _assert-starts-at-zero($grid-breakpoints);
-
-
-// Grid containers
-//
-// Define the maximum width of `.container` for different screen sizes.
-
-$container-max-widths: (
- sm: 540px,
- md: 720px,
- lg: 960px,
- xl: 1140px
-) !default;
-
-@include _assert-ascending($container-max-widths, "$container-max-widths");
-
-
-// Grid columns
-//
-// Set the number of columns and specify the width of the gutters.
-
-$grid-columns: 12 !default;
-$grid-gutter-width: 30px !default;
-
-// Components
-//
-// Define common padding and border radius sizes and more.
-
-$line-height-lg: 1.5 !default;
-$line-height-sm: 1.5 !default;
-
-$border-width: 1px !default;
-$border-color: $gray-300 !default;
-
-$border-radius: .25rem !default;
-$border-radius-lg: .3rem !default;
-$border-radius-sm: .2rem !default;
-
-$box-shadow-sm: 0 .125rem .25rem rgba($black, .075) !default;
-$box-shadow: 0 .5rem 1rem rgba($black, .15) !default;
-$box-shadow-lg: 0 1rem 3rem rgba($black, .175) !default;
-
-$component-active-color: $white !default;
-$component-active-bg: theme-color("primary") !default;
-
-$caret-width: .3em !default;
-
-$transition-base: all .2s ease-in-out !default;
-$transition-fade: opacity .15s linear !default;
-$transition-collapse: height .35s ease !default;
-
-
-// Fonts
-//
-// Font, line-height, and color for body text, headings, and more.
-
-// stylelint-disable value-keyword-case
-$font-family-sans-serif: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol" !default;
-$font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !default;
-$font-family-base: $font-family-sans-serif !default;
-// stylelint-enable value-keyword-case
-
-$font-size-base: 1rem !default; // Assumes the browser default, typically `16px`
-$font-size-lg: ($font-size-base * 1.25) !default;
-$font-size-sm: ($font-size-base * .875) !default;
-
-$font-weight-light: 300 !default;
-$font-weight-normal: 400 !default;
-$font-weight-bold: 700 !default;
-
-$font-weight-base: $font-weight-normal !default;
-$line-height-base: 1.5 !default;
-
-$h1-font-size: $font-size-base * 2.5 !default;
-$h2-font-size: $font-size-base * 2 !default;
-$h3-font-size: $font-size-base * 1.75 !default;
-$h4-font-size: $font-size-base * 1.5 !default;
-$h5-font-size: $font-size-base * 1.25 !default;
-$h6-font-size: $font-size-base !default;
-
-$headings-margin-bottom: ($spacer / 2) !default;
-$headings-font-family: inherit !default;
-$headings-font-weight: 500 !default;
-$headings-line-height: 1.2 !default;
-$headings-color: inherit !default;
-
-$display1-size: 6rem !default;
-$display2-size: 5.5rem !default;
-$display3-size: 4.5rem !default;
-$display4-size: 3.5rem !default;
-
-$display1-weight: 300 !default;
-$display2-weight: 300 !default;
-$display3-weight: 300 !default;
-$display4-weight: 300 !default;
-$display-line-height: $headings-line-height !default;
-
-$lead-font-size: ($font-size-base * 1.25) !default;
-$lead-font-weight: 300 !default;
-
-$small-font-size: 80% !default;
-
-$text-muted: $gray-600 !default;
-
-$blockquote-small-color: $gray-600 !default;
-$blockquote-font-size: ($font-size-base * 1.25) !default;
-
-$hr-border-color: rgba($black, .1) !default;
-$hr-border-width: $border-width !default;
-
-$mark-padding: .2em !default;
-
-$dt-font-weight: $font-weight-bold !default;
-
-$kbd-box-shadow: inset 0 -.1rem 0 rgba($black, .25) !default;
-$nested-kbd-font-weight: $font-weight-bold !default;
-
-$list-inline-padding: .5rem !default;
-
-$mark-bg: #fcf8e3 !default;
-
-$hr-margin-y: $spacer !default;
-
-
-// Tables
-//
-// Customizes the `.table` component with basic values, each used across all table variations.
-
-$table-cell-padding: .75rem !default;
-$table-cell-padding-sm: .3rem !default;
-
-$table-bg: transparent !default;
-$table-accent-bg: rgba($black, .05) !default;
-$table-hover-bg: rgba($black, .075) !default;
-$table-active-bg: $table-hover-bg !default;
-
-$table-border-width: $border-width !default;
-$table-border-color: $gray-300 !default;
-
-$table-head-bg: $gray-200 !default;
-$table-head-color: $gray-700 !default;
-
-$table-dark-bg: $gray-900 !default;
-$table-dark-accent-bg: rgba($white, .05) !default;
-$table-dark-hover-bg: rgba($white, .075) !default;
-$table-dark-border-color: lighten($gray-900, 7.5%) !default;
-$table-dark-color: $body-bg !default;
-
-$table-striped-order: odd !default;
-
-$table-caption-color: $text-muted !default;
-
-// Buttons + Forms
-//
-// Shared variables that are reassigned to `$input-` and `$btn-` specific variables.
-
-$input-btn-padding-y: .375rem !default;
-$input-btn-padding-x: .75rem !default;
-$input-btn-line-height: $line-height-base !default;
-
-$input-btn-focus-width: .2rem !default;
-$input-btn-focus-color: rgba($component-active-bg, .25) !default;
-$input-btn-focus-box-shadow: 0 0 0 $input-btn-focus-width $input-btn-focus-color !default;
-
-$input-btn-padding-y-sm: .25rem !default;
-$input-btn-padding-x-sm: .5rem !default;
-$input-btn-line-height-sm: $line-height-sm !default;
-
-$input-btn-padding-y-lg: .5rem !default;
-$input-btn-padding-x-lg: 1rem !default;
-$input-btn-line-height-lg: $line-height-lg !default;
-
-$input-btn-border-width: $border-width !default;
-
-
-// Buttons
-//
-// For each of Bootstrap's buttons, define text, background, and border color.
-
-$btn-padding-y: $input-btn-padding-y !default;
-$btn-padding-x: $input-btn-padding-x !default;
-$btn-line-height: $input-btn-line-height !default;
-
-$btn-padding-y-sm: $input-btn-padding-y-sm !default;
-$btn-padding-x-sm: $input-btn-padding-x-sm !default;
-$btn-line-height-sm: $input-btn-line-height-sm !default;
-
-$btn-padding-y-lg: $input-btn-padding-y-lg !default;
-$btn-padding-x-lg: $input-btn-padding-x-lg !default;
-$btn-line-height-lg: $input-btn-line-height-lg !default;
-
-$btn-border-width: $input-btn-border-width !default;
-
-$btn-font-weight: $font-weight-normal !default;
-$btn-box-shadow: inset 0 1px 0 rgba($white, .15), 0 1px 1px rgba($black, .075) !default;
-$btn-focus-width: $input-btn-focus-width !default;
-$btn-focus-box-shadow: $input-btn-focus-box-shadow !default;
-$btn-disabled-opacity: .65 !default;
-$btn-active-box-shadow: inset 0 3px 5px rgba($black, .125) !default;
-
-$btn-link-disabled-color: $gray-600 !default;
-
-$btn-block-spacing-y: .5rem !default;
-
-// Allows for customizing button radius independently from global border radius
-$btn-border-radius: $border-radius !default;
-$btn-border-radius-lg: $border-radius-lg !default;
-$btn-border-radius-sm: $border-radius-sm !default;
-
-$btn-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;
-
-
-// Forms
-
-$label-margin-bottom: .5rem !default;
-
-$input-padding-y: $input-btn-padding-y !default;
-$input-padding-x: $input-btn-padding-x !default;
-$input-line-height: $input-btn-line-height !default;
-
-$input-padding-y-sm: $input-btn-padding-y-sm !default;
-$input-padding-x-sm: $input-btn-padding-x-sm !default;
-$input-line-height-sm: $input-btn-line-height-sm !default;
-
-$input-padding-y-lg: $input-btn-padding-y-lg !default;
-$input-padding-x-lg: $input-btn-padding-x-lg !default;
-$input-line-height-lg: $input-btn-line-height-lg !default;
-
-$input-bg: $white !default;
-$input-disabled-bg: $gray-200 !default;
-
-$input-color: $gray-700 !default;
-$input-border-color: $gray-400 !default;
-$input-border-width: $input-btn-border-width !default;
-$input-box-shadow: inset 0 1px 1px rgba($black, .075) !default;
-
-$input-border-radius: $border-radius !default;
-$input-border-radius-lg: $border-radius-lg !default;
-$input-border-radius-sm: $border-radius-sm !default;
-
-$input-focus-bg: $input-bg !default;
-$input-focus-border-color: lighten($component-active-bg, 25%) !default;
-$input-focus-color: $input-color !default;
-$input-focus-width: $input-btn-focus-width !default;
-$input-focus-box-shadow: $input-btn-focus-box-shadow !default;
-
-$input-placeholder-color: $gray-600 !default;
-$input-plaintext-color: $body-color !default;
-
-$input-height-border: $input-border-width * 2 !default;
-
-$input-height-inner: ($font-size-base * $input-btn-line-height) + ($input-btn-padding-y * 2) !default;
-$input-height: calc(#{$input-height-inner} + #{$input-height-border}) !default;
-
-$input-height-inner-sm: ($font-size-sm * $input-btn-line-height-sm) + ($input-btn-padding-y-sm * 2) !default;
-$input-height-sm: calc(#{$input-height-inner-sm} + #{$input-height-border}) !default;
-
-$input-height-inner-lg: ($font-size-lg * $input-btn-line-height-lg) + ($input-btn-padding-y-lg * 2) !default;
-$input-height-lg: calc(#{$input-height-inner-lg} + #{$input-height-border}) !default;
-
-$input-transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;
-
-$form-text-margin-top: .25rem !default;
-
-$form-check-input-gutter: 1.25rem !default;
-$form-check-input-margin-y: .3rem !default;
-$form-check-input-margin-x: .25rem !default;
-
-$form-check-inline-margin-x: .75rem !default;
-$form-check-inline-input-margin-x: .3125rem !default;
-
-$form-group-margin-bottom: 1rem !default;
-
-$input-group-addon-color: $input-color !default;
-$input-group-addon-bg: $gray-200 !default;
-$input-group-addon-border-color: $input-border-color !default;
-
-$custom-control-gutter: 1.5rem !default;
-$custom-control-spacer-x: 1rem !default;
-
-$custom-control-indicator-size: 1rem !default;
-$custom-control-indicator-bg: $gray-300 !default;
-$custom-control-indicator-bg-size: 50% 50% !default;
-$custom-control-indicator-box-shadow: inset 0 .25rem .25rem rgba($black, .1) !default;
-
-$custom-control-indicator-disabled-bg: $gray-200 !default;
-$custom-control-label-disabled-color: $gray-600 !default;
-
-$custom-control-indicator-checked-color: $component-active-color !default;
-$custom-control-indicator-checked-bg: $component-active-bg !default;
-$custom-control-indicator-checked-disabled-bg: rgba(theme-color("primary"), .5) !default;
-$custom-control-indicator-checked-box-shadow: none !default;
-
-$custom-control-indicator-focus-box-shadow: 0 0 0 1px $body-bg, $input-btn-focus-box-shadow !default;
-
-$custom-control-indicator-active-color: $component-active-color !default;
-$custom-control-indicator-active-bg: lighten($component-active-bg, 35%) !default;
-$custom-control-indicator-active-box-shadow: none !default;
-
-$custom-checkbox-indicator-border-radius: $border-radius !default;
-$custom-checkbox-indicator-icon-checked: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='#{$custom-control-indicator-checked-color}' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E"), "#", "%23") !default;
-
-$custom-checkbox-indicator-indeterminate-bg: $component-active-bg !default;
-$custom-checkbox-indicator-indeterminate-color: $custom-control-indicator-checked-color !default;
-$custom-checkbox-indicator-icon-indeterminate: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='#{$custom-checkbox-indicator-indeterminate-color}' d='M0 2h4'/%3E%3C/svg%3E"), "#", "%23") !default;
-$custom-checkbox-indicator-indeterminate-box-shadow: none !default;
-
-$custom-radio-indicator-border-radius: 50% !default;
-$custom-radio-indicator-icon-checked: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='#{$custom-control-indicator-checked-color}'/%3E%3C/svg%3E"), "#", "%23") !default;
-
-$custom-select-padding-y: .375rem !default;
-$custom-select-padding-x: .75rem !default;
-$custom-select-height: $input-height !default;
-$custom-select-indicator-padding: 1rem !default; // Extra padding to account for the presence of the background-image based indicator
-$custom-select-line-height: $input-btn-line-height !default;
-$custom-select-color: $input-color !default;
-$custom-select-disabled-color: $gray-600 !default;
-$custom-select-bg: $input-bg !default;
-$custom-select-disabled-bg: $gray-200 !default;
-$custom-select-bg-size: 8px 10px !default; // In pixels because image dimensions
-$custom-select-indicator-color: $gray-800 !default;
-$custom-select-indicator: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='#{$custom-select-indicator-color}' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E"), "#", "%23") !default;
-$custom-select-border-width: $input-btn-border-width !default;
-$custom-select-border-color: $input-border-color !default;
-$custom-select-border-radius: $border-radius !default;
-
-$custom-select-focus-border-color: $input-focus-border-color !default;
-$custom-select-focus-box-shadow: inset 0 1px 2px rgba($black, .075), 0 0 5px rgba($custom-select-focus-border-color, .5) !default;
-
-$custom-select-font-size-sm: 75% !default;
-$custom-select-height-sm: $input-height-sm !default;
-
-$custom-select-font-size-lg: 125% !default;
-$custom-select-height-lg: $input-height-lg !default;
-
-$custom-range-track-width: 100% !default;
-$custom-range-track-height: .5rem !default;
-$custom-range-track-cursor: pointer !default;
-$custom-range-track-bg: $gray-300 !default;
-$custom-range-track-border-radius: 1rem !default;
-$custom-range-track-box-shadow: inset 0 .25rem .25rem rgba($black, .1) !default;
-
-$custom-range-thumb-width: 1rem !default;
-$custom-range-thumb-height: $custom-range-thumb-width !default;
-$custom-range-thumb-bg: $component-active-bg !default;
-$custom-range-thumb-border: 0 !default;
-$custom-range-thumb-border-radius: 1rem !default;
-$custom-range-thumb-box-shadow: 0 .1rem .25rem rgba($black, .1) !default;
-$custom-range-thumb-focus-box-shadow: 0 0 0 1px $body-bg, $input-btn-focus-box-shadow !default;
-$custom-range-thumb-active-bg: lighten($component-active-bg, 35%) !default;
-
-$custom-file-height: $input-height !default;
-$custom-file-height-inner: $input-height-inner !default;
-$custom-file-focus-border-color: $input-focus-border-color !default;
-$custom-file-focus-box-shadow: $input-btn-focus-box-shadow !default;
-
-$custom-file-padding-y: $input-btn-padding-y !default;
-$custom-file-padding-x: $input-btn-padding-x !default;
-$custom-file-line-height: $input-btn-line-height !default;
-$custom-file-color: $input-color !default;
-$custom-file-bg: $input-bg !default;
-$custom-file-border-width: $input-btn-border-width !default;
-$custom-file-border-color: $input-border-color !default;
-$custom-file-border-radius: $input-border-radius !default;
-$custom-file-box-shadow: $input-box-shadow !default;
-$custom-file-button-color: $custom-file-color !default;
-$custom-file-button-bg: $input-group-addon-bg !default;
-$custom-file-text: (
- en: "Browse"
-) !default;
-
-
-// Form validation
-$form-feedback-margin-top: $form-text-margin-top !default;
-$form-feedback-font-size: $small-font-size !default;
-$form-feedback-valid-color: theme-color("success") !default;
-$form-feedback-invalid-color: theme-color("danger") !default;
-
-
-// Dropdowns
-//
-// Dropdown menu container and contents.
-
-$dropdown-min-width: 10rem !default;
-$dropdown-padding-y: .5rem !default;
-$dropdown-spacer: .125rem !default;
-$dropdown-bg: $white !default;
-$dropdown-border-color: rgba($black, .15) !default;
-$dropdown-border-radius: $border-radius !default;
-$dropdown-border-width: $border-width !default;
-$dropdown-divider-bg: $gray-200 !default;
-$dropdown-box-shadow: 0 .5rem 1rem rgba($black, .175) !default;
-
-$dropdown-link-color: $gray-900 !default;
-$dropdown-link-hover-color: darken($gray-900, 5%) !default;
-$dropdown-link-hover-bg: $gray-100 !default;
-
-$dropdown-link-active-color: $component-active-color !default;
-$dropdown-link-active-bg: $component-active-bg !default;
-
-$dropdown-link-disabled-color: $gray-600 !default;
-
-$dropdown-item-padding-y: .25rem !default;
-$dropdown-item-padding-x: 1.5rem !default;
-
-$dropdown-header-color: $gray-600 !default;
-
-
-// Z-index master list
-//
-// Warning: Avoid customizing these values. They're used for a bird's eye view
-// of components dependent on the z-axis and are designed to all work together.
-
-$zindex-dropdown: 1000 !default;
-$zindex-sticky: 1020 !default;
-$zindex-fixed: 1030 !default;
-$zindex-modal-backdrop: 1040 !default;
-$zindex-modal: 1050 !default;
-$zindex-popover: 1060 !default;
-$zindex-tooltip: 1070 !default;
-
-// Navs
-
-$nav-link-padding-y: .5rem !default;
-$nav-link-padding-x: 1rem !default;
-$nav-link-disabled-color: $gray-600 !default;
-
-$nav-tabs-border-color: $gray-300 !default;
-$nav-tabs-border-width: $border-width !default;
-$nav-tabs-border-radius: $border-radius !default;
-$nav-tabs-link-hover-border-color: $gray-200 $gray-200 $nav-tabs-border-color !default;
-$nav-tabs-link-active-color: $gray-700 !default;
-$nav-tabs-link-active-bg: $body-bg !default;
-$nav-tabs-link-active-border-color: $gray-300 $gray-300 $nav-tabs-link-active-bg !default;
-
-$nav-pills-border-radius: $border-radius !default;
-$nav-pills-link-active-color: $component-active-color !default;
-$nav-pills-link-active-bg: $component-active-bg !default;
-
-$nav-divider-color: $gray-200 !default;
-$nav-divider-margin-y: ($spacer / 2) !default;
-
-// Navbar
-
-$navbar-padding-y: ($spacer / 2) !default;
-$navbar-padding-x: $spacer !default;
-
-$navbar-nav-link-padding-x: .5rem !default;
-
-$navbar-brand-font-size: $font-size-lg !default;
-// Compute the navbar-brand padding-y so the navbar-brand will have the same height as navbar-text and nav-link
-$nav-link-height: ($font-size-base * $line-height-base + $nav-link-padding-y * 2) !default;
-$navbar-brand-height: $navbar-brand-font-size * $line-height-base !default;
-$navbar-brand-padding-y: ($nav-link-height - $navbar-brand-height) / 2 !default;
-
-$navbar-toggler-padding-y: .25rem !default;
-$navbar-toggler-padding-x: .75rem !default;
-$navbar-toggler-font-size: $font-size-lg !default;
-$navbar-toggler-border-radius: $btn-border-radius !default;
-
-$navbar-dark-color: rgba($white, .5) !default;
-$navbar-dark-hover-color: rgba($white, .75) !default;
-$navbar-dark-active-color: $white !default;
-$navbar-dark-disabled-color: rgba($white, .25) !default;
-$navbar-dark-toggler-icon-bg: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='#{$navbar-dark-color}' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E"), "#", "%23") !default;
-$navbar-dark-toggler-border-color: rgba($white, .1) !default;
-
-$navbar-light-color: rgba($black, .5) !default;
-$navbar-light-hover-color: rgba($black, .7) !default;
-$navbar-light-active-color: rgba($black, .9) !default;
-$navbar-light-disabled-color: rgba($black, .3) !default;
-$navbar-light-toggler-icon-bg: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='#{$navbar-light-color}' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E"), "#", "%23") !default;
-$navbar-light-toggler-border-color: rgba($black, .1) !default;
-
-// Pagination
-
-$pagination-padding-y: .5rem !default;
-$pagination-padding-x: .75rem !default;
-$pagination-padding-y-sm: .25rem !default;
-$pagination-padding-x-sm: .5rem !default;
-$pagination-padding-y-lg: .75rem !default;
-$pagination-padding-x-lg: 1.5rem !default;
-$pagination-line-height: 1.25 !default;
-
-$pagination-color: $link-color !default;
-$pagination-bg: $white !default;
-$pagination-border-width: $border-width !default;
-$pagination-border-color: $gray-300 !default;
-
-$pagination-focus-box-shadow: $input-btn-focus-box-shadow !default;
-$pagination-focus-outline: 0 !default;
-
-$pagination-hover-color: $link-hover-color !default;
-$pagination-hover-bg: $gray-200 !default;
-$pagination-hover-border-color: $gray-300 !default;
-
-$pagination-active-color: $component-active-color !default;
-$pagination-active-bg: $component-active-bg !default;
-$pagination-active-border-color: $pagination-active-bg !default;
-
-$pagination-disabled-color: $gray-600 !default;
-$pagination-disabled-bg: $white !default;
-$pagination-disabled-border-color: $gray-300 !default;
-
-
-// Jumbotron
-
-$jumbotron-padding: 2rem !default;
-$jumbotron-bg: $gray-200 !default;
-
-
-// Cards
-
-$card-spacer-y: .75rem !default;
-$card-spacer-x: 1.25rem !default;
-$card-border-width: $border-width !default;
-$card-border-radius: $border-radius !default;
-$card-border-color: rgba($black, .125) !default;
-$card-inner-border-radius: calc(#{$card-border-radius} - #{$card-border-width}) !default;
-$card-cap-bg: rgba($black, .03) !default;
-$card-bg: $white !default;
-
-$card-img-overlay-padding: 1.25rem !default;
-
-$card-group-margin: ($grid-gutter-width / 2) !default;
-$card-deck-margin: $card-group-margin !default;
-
-$card-columns-count: 3 !default;
-$card-columns-gap: 1.25rem !default;
-$card-columns-margin: $card-spacer-y !default;
-
-
-// Tooltips
-
-$tooltip-font-size: $font-size-sm !default;
-$tooltip-max-width: 200px !default;
-$tooltip-color: $white !default;
-$tooltip-bg: $black !default;
-$tooltip-border-radius: $border-radius !default;
-$tooltip-opacity: .9 !default;
-$tooltip-padding-y: .25rem !default;
-$tooltip-padding-x: .5rem !default;
-$tooltip-margin: 0 !default;
-
-$tooltip-arrow-width: .8rem !default;
-$tooltip-arrow-height: .4rem !default;
-$tooltip-arrow-color: $tooltip-bg !default;
-
-
-// Popovers
-
-$popover-font-size: $font-size-sm !default;
-$popover-bg: $white !default;
-$popover-max-width: 276px !default;
-$popover-border-width: $border-width !default;
-$popover-border-color: rgba($black, .2) !default;
-$popover-border-radius: $border-radius-lg !default;
-$popover-box-shadow: 0 .25rem .5rem rgba($black, .2) !default;
-
-$popover-header-bg: darken($popover-bg, 3%) !default;
-$popover-header-color: $headings-color !default;
-$popover-header-padding-y: .5rem !default;
-$popover-header-padding-x: .75rem !default;
-
-$popover-body-color: $body-color !default;
-$popover-body-padding-y: $popover-header-padding-y !default;
-$popover-body-padding-x: $popover-header-padding-x !default;
-
-$popover-arrow-width: 1rem !default;
-$popover-arrow-height: .5rem !default;
-$popover-arrow-color: $popover-bg !default;
-
-$popover-arrow-outer-color: fade-in($popover-border-color, .05) !default;
-
-
-// Badges
-
-$badge-font-size: 75% !default;
-$badge-font-weight: $font-weight-bold !default;
-$badge-padding-y: .25em !default;
-$badge-padding-x: .4em !default;
-$badge-border-radius: $border-radius !default;
-
-$badge-pill-padding-x: .6em !default;
-// Use a higher than normal value to ensure completely rounded edges when
-// customizing padding or font-size on labels.
-$badge-pill-border-radius: 10rem !default;
-
-
-// Modals
-
-// Padding applied to the modal body
-$modal-inner-padding: 1rem !default;
-
-$modal-dialog-margin: .5rem !default;
-$modal-dialog-margin-y-sm-up: 1.75rem !default;
-
-$modal-title-line-height: $line-height-base !default;
-
-$modal-content-bg: $white !default;
-$modal-content-border-color: rgba($black, .2) !default;
-$modal-content-border-width: $border-width !default;
-$modal-content-border-radius: $border-radius-lg !default;
-$modal-content-box-shadow-xs: 0 .25rem .5rem rgba($black, .5) !default;
-$modal-content-box-shadow-sm-up: 0 .5rem 1rem rgba($black, .5) !default;
-
-$modal-backdrop-bg: $black !default;
-$modal-backdrop-opacity: .5 !default;
-$modal-header-border-color: $gray-200 !default;
-$modal-footer-border-color: $modal-header-border-color !default;
-$modal-header-border-width: $modal-content-border-width !default;
-$modal-footer-border-width: $modal-header-border-width !default;
-$modal-header-padding: 1rem !default;
-
-$modal-lg: 800px !default;
-$modal-md: 500px !default;
-$modal-sm: 300px !default;
-
-$modal-transition: transform .3s ease-out !default;
-
-
-// Alerts
-//
-// Define alert colors, border radius, and padding.
-
-$alert-padding-y: .75rem !default;
-$alert-padding-x: 1.25rem !default;
-$alert-margin-bottom: 1rem !default;
-$alert-border-radius: $border-radius !default;
-$alert-link-font-weight: $font-weight-bold !default;
-$alert-border-width: $border-width !default;
-
-$alert-bg-level: -10 !default;
-$alert-border-level: -9 !default;
-$alert-color-level: 6 !default;
-
-
-// Progress bars
-
-$progress-height: 1rem !default;
-$progress-font-size: ($font-size-base * .75) !default;
-$progress-bg: $gray-200 !default;
-$progress-border-radius: $border-radius !default;
-$progress-box-shadow: inset 0 .1rem .1rem rgba($black, .1) !default;
-$progress-bar-color: $white !default;
-$progress-bar-bg: theme-color("primary") !default;
-$progress-bar-animation-timing: 1s linear infinite !default;
-$progress-bar-transition: width .6s ease !default;
-
-// List group
-
-$list-group-bg: $white !default;
-$list-group-border-color: rgba($black, .125) !default;
-$list-group-border-width: $border-width !default;
-$list-group-border-radius: $border-radius !default;
-
-$list-group-item-padding-y: .75rem !default;
-$list-group-item-padding-x: 1.25rem !default;
-
-$list-group-hover-bg: $gray-100 !default;
-$list-group-active-color: $component-active-color !default;
-$list-group-active-bg: $component-active-bg !default;
-$list-group-active-border-color: $list-group-active-bg !default;
-
-$list-group-disabled-color: $gray-600 !default;
-$list-group-disabled-bg: $list-group-bg !default;
-
-$list-group-action-color: $gray-700 !default;
-$list-group-action-hover-color: $list-group-action-color !default;
-
-$list-group-action-active-color: $body-color !default;
-$list-group-action-active-bg: $gray-200 !default;
-
-
-// Image thumbnails
-
-$thumbnail-padding: .25rem !default;
-$thumbnail-bg: $body-bg !default;
-$thumbnail-border-width: $border-width !default;
-$thumbnail-border-color: $gray-300 !default;
-$thumbnail-border-radius: $border-radius !default;
-$thumbnail-box-shadow: 0 1px 2px rgba($black, .075) !default;
-
-
-// Figures
-
-$figure-caption-font-size: 90% !default;
-$figure-caption-color: $gray-600 !default;
-
-
-// Breadcrumbs
-
-$breadcrumb-padding-y: .75rem !default;
-$breadcrumb-padding-x: 1rem !default;
-$breadcrumb-item-padding: .5rem !default;
-
-$breadcrumb-margin-bottom: 1rem !default;
-
-$breadcrumb-bg: $gray-200 !default;
-$breadcrumb-divider-color: $gray-600 !default;
-$breadcrumb-active-color: $gray-600 !default;
-$breadcrumb-divider: quote("/") !default;
-
-$breadcrumb-border-radius: $border-radius !default;
-
-
-// Carousel
-
-$carousel-control-color: $white !default;
-$carousel-control-width: 15% !default;
-$carousel-control-opacity: .5 !default;
-
-$carousel-indicator-width: 30px !default;
-$carousel-indicator-height: 3px !default;
-$carousel-indicator-spacer: 3px !default;
-$carousel-indicator-active-bg: $white !default;
-
-$carousel-caption-width: 70% !default;
-$carousel-caption-color: $white !default;
-
-$carousel-control-icon-width: 20px !default;
-
-$carousel-control-prev-icon-bg: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' viewBox='0 0 8 8'%3E%3Cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E"), "#", "%23") !default;
-$carousel-control-next-icon-bg: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' viewBox='0 0 8 8'%3E%3Cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E"), "#", "%23") !default;
-
-$carousel-transition: transform .6s ease !default; // Define transform transition first if using multiple transitions (e.g., `transform 2s ease, opacity .5s ease-out`)
-
-
-// Close
-
-$close-font-size: $font-size-base * 1.5 !default;
-$close-font-weight: $font-weight-bold !default;
-$close-color: $black !default;
-$close-text-shadow: 0 1px 0 $white !default;
-
-// Code
-
-$code-font-size: 87.5% !default;
-$code-color: $pink !default;
-
-$kbd-padding-y: .2rem !default;
-$kbd-padding-x: .4rem !default;
-$kbd-font-size: $code-font-size !default;
-$kbd-color: $white !default;
-$kbd-bg: $gray-900 !default;
-
-$pre-color: $gray-900 !default;
-$pre-scrollable-max-height: 340px !default;
-
-
-// Printing
-$print-page-size: a3 !default;
-$print-body-min-width: map-get($grid-breakpoints, "lg") !default;
diff --git a/WebfrontCore/wwwroot/lib/canvas.js/canvasjs.js b/WebfrontCore/wwwroot/lib/canvas.js/canvasjs.js
new file mode 100644
index 000000000..9ff452808
--- /dev/null
+++ b/WebfrontCore/wwwroot/lib/canvas.js/canvasjs.js
@@ -0,0 +1,5041 @@
+/**
+ * @preserve CanvasJS HTML5 & JavaScript Charts - v1.7.0 GA - http://canvasjs.com/
+ * Copyright 2013 fenopix
+ */
+(function() {
+ function w(n, t) {
+ n.prototype = yi(t.prototype);
+ n.prototype.constructor = n;
+ n.base = t.prototype
+ }
+
+ function yi(n) {
+ function t() {}
+ return t.prototype = n, new t
+ }
+
+ function oi(n, t, i) {
+ return i === "millisecond" ? n.setMilliseconds(n.getMilliseconds() + 1 * t) : i === "second" ? n.setSeconds(n.getSeconds() + 1 * t) : i === "minute" ? n.setMinutes(n.getMinutes() + 1 * t) : i === "hour" ? n.setHours(n.getHours() + 1 * t) : i === "day" ? n.setDate(n.getDate() + 1 * t) : i === "week" ? n.setDate(n.getDate() + 7 * t) : i === "month" ? n.setMonth(n.getMonth() + 1 * t) : i === "year" && n.setFullYear(n.getFullYear() + 1 * t), n
+ }
+
+ function st(n, t) {
+ return f[t + "Duration"] * n
+ }
+
+ function v(n, t) {
+ var i = !1;
+ for (n < 0 && (i = !0, n *= -1), n = "" + n, t = t ? t : 1; n.length < t;) n = "0" + n;
+ return i ? "-" + n : n
+ }
+
+ function ht(n) {
+ if (!n) return n;
+ n = n.replace(/^\s\s*/, "");
+ for (var t = n.length;
+ /\s/.test(n.charAt(--t)););
+ return n.slice(0, t + 1)
+ }
+
+ function pi(n) {
+ n.roundRect = function(n, t, i, r, u, f, e, o) {
+ e && (this.fillStyle = e);
+ o && (this.strokeStyle = o);
+ typeof u == "undefined" && (u = 5);
+ this.lineWidth = f;
+ this.beginPath();
+ this.moveTo(n + u, t);
+ this.lineTo(n + i - u, t);
+ this.quadraticCurveTo(n + i, t, n + i, t + u);
+ this.lineTo(n + i, t + r - u);
+ this.quadraticCurveTo(n + i, t + r, n + i - u, t + r);
+ this.lineTo(n + u, t + r);
+ this.quadraticCurveTo(n, t + r, n, t + r - u);
+ this.lineTo(n, t + u);
+ this.quadraticCurveTo(n, t, n + u, t);
+ this.closePath();
+ e && this.fill();
+ o && f > 0 && this.stroke()
+ }
+ }
+
+ function si(n, t) {
+ return n - t
+ }
+
+ function wi(n, t) {
+ return n.x - t.x
+ }
+
+ function u(n) {
+ var t = ((n & 16711680) >> 16).toString(16),
+ i = ((n & 65280) >> 8).toString(16),
+ r = ((n & 255) >> 0).toString(16);
+ return t = t.length < 2 ? "0" + t : t, i = i.length < 2 ? "0" + i : i, r = r.length < 2 ? "0" + r : r, "#" + t + i + r
+ }
+
+ function bi(n, t, i) {
+ return n << 16 | t << 8 | i
+ }
+
+ function ki(n) {
+ var i = this.length >>> 0,
+ t = Number(arguments[1]) || 0;
+ for (t = t < 0 ? Math.ceil(t) : Math.floor(t), t < 0 && (t += i); t < i; t++)
+ if (t in this && this[t] === n) return t;
+ return -1
+ }
+
+ function di(n) {
+ return n.indexOf || (n.indexOf = ki), n
+ }
+
+ function pt(n, t, i) {
+ var u, r, f, e, o;
+ if (i = i || "normal", u = n + "_" + t + "_" + i, r = hi[u], isNaN(r)) {
+ try {
+ f = "position:absolute; left:0px; top:-20000px; padding:0px;margin:0px;border:none;white-space:pre;line-height:normal;font-family:" + n + "; font-size:" + t + "px; font-weight:" + i + ";";
+ g || (e = document.body, g = document.createElement("span"), g.innerHTML = "", o = document.createTextNode("Mpgyi"), g.appendChild(o), e.appendChild(g));
+ g.style.display = "";
+ g.setAttribute("style", f);
+ r = Math.round(g.offsetHeight);
+ g.style.display = "none"
+ } catch (s) {
+ r = Math.ceil(t * 1.1)
+ }
+ r = Math.max(r, t);
+ hi[u] = r
+ }
+ return r
+ }
+
+ function y(n, t) {
+ var i = [],
+ r;
+ if (n = n || "solid", lineDashTypeMap = {
+ solid: [],
+ shortDash: [3, 1],
+ shortDot: [1, 1],
+ shortDashDot: [3, 1, 1, 1],
+ shortDashDotDot: [3, 1, 1, 1, 1, 1],
+ dot: [1, 2],
+ dash: [4, 2],
+ dashDot: [4, 2, 1, 2],
+ longDash: [8, 2],
+ longDashDot: [8, 2, 1, 2],
+ longDashDotDot: [8, 2, 1, 2, 1, 2]
+ }, i = lineDashTypeMap[n], i)
+ for (r = 0; r < i.length; r++) i[r] *= t;
+ else i = [];
+ return i
+ }
+
+ function s(n, t, i, r) {
+ if (n.addEventListener) n.addEventListener(t, i, r || !1);
+ else if (n.attachEvent) n.attachEvent("on" + t, function(t) {
+ t = t || window.event;
+ t.preventDefault = t.preventDefault || function() {
+ t.returnValue = !1
+ };
+ t.stopPropagation = t.stopPropagation || function() {
+ t.cancelBubble = !0
+ };
+ i.call(n, t)
+ });
+ else return !1
+ }
+
+ function ci(n, t, i) {
+ var r, f, u;
+ for (n *= l, t *= l, r = i.getImageData(n, t, 2, 2).data, f = !0, u = 0; u < 4; u++)
+ if (r[u] !== r[u + 4] | r[u] !== r[u + 8] | r[u] !== r[u + 12]) {
+ f = !1;
+ break
+ } return f ? bi(r[0], r[1], r[2]) : 0
+ }
+
+ function gi(t, i, r) {
+ var u = "",
+ e = t ? t + "FontStyle" : "fontStyle",
+ o = t ? t + "FontWeight" : "fontWeight",
+ s = t ? t + "FontSize" : "fontSize",
+ h = t ? t + "FontFamily" : "fontFamily",
+ c, f;
+ return u += i[e] ? i[e] + " " : r && r[e] ? r[e] + " " : "", u += i[o] ? i[o] + " " : r && r[o] ? r[o] + " " : "", u += i[s] ? i[s] + "px " : r && r[s] ? r[s] + "px " : "", c = i[h] ? i[h] + "" : r && r[h] ? r[h] + "" : "", !n && c ? (f = c.split(",")[0], f[0] !== "'" && f[0] !== '"' && (f = "'" + f + "'"), u += f) : u += c, u
+ }
+
+ function p(n, t, i) {
+ return n in t ? t[n] : i[n]
+ }
+
+ function ct(t, i, r) {
+ if (n && !!li) {
+ var u = t.getContext("2d");
+ bt = u.webkitBackingStorePixelRatio || u.mozBackingStorePixelRatio || u.msBackingStorePixelRatio || u.oBackingStorePixelRatio || u.backingStorePixelRatio || 1;
+ l = ri / bt;
+ t.width = i * l;
+ t.height = r * l;
+ ri !== bt && (t.style.width = i + "px", t.style.height = r + "px", u.scale(l, l))
+ } else t.width = i, t.height = r
+ }
+
+ function rt(t, i) {
+ var r = document.createElement("canvas");
+ return r.setAttribute("class", "canvasjs-chart-canvas"), ct(r, t, i), n || typeof G_vmlCanvasManager == "undefined" || G_vmlCanvasManager.initElement(r), r
+ }
+
+ function ai(n, t, i) {
+ var u, o, s;
+ if (n && t && i) {
+ var h = i + "." + (t === "jpeg" ? "jpg" : t),
+ c = "image/" + t,
+ f = n.toDataURL(c),
+ l = !1,
+ r = document.createElement("a");
+ if (r.download = h, r.href = f, r.target = "_blank", typeof Blob != "undefined" && !!new Blob) {
+ var v = f.replace(/^data:[a-z/]*;base64,/, ""),
+ e = atob(v),
+ a = new ArrayBuffer(e.length),
+ y = new Uint8Array(a);
+ for (u = 0; u < e.length; u++) y[u] = e.charCodeAt(u);
+ o = new Blob([a], {
+ type: "image/" + t
+ });
+ try {
+ window.navigator.msSaveBlob(o, h);
+ l = !0
+ } catch (p) {
+ r.dataset.downloadurl = [c, r.download, r.href].join(":");
+ r.href = window.URL.createObjectURL(o)
+ }
+ }
+ if (!l) try {
+ event = document.createEvent("MouseEvents");
+ event.initMouseEvent("click", !0, !1, window, 0, 0, 0, 0, 0, !1, !1, !1, !1, 0, null);
+ r.dispatchEvent ? r.dispatchEvent(event) : r.fireEvent && r.fireEvent("onclick")
+ } catch (p) {
+ s = window.open();
+ s.document.write("Please right click on the image and save it to your device<\/div>");
+ s.document.close()
+ }
+ }
+ }
+
+ function b(n, t, i) {
+ t.getAttribute("state") !== i && (t.setAttribute("state", i), t.setAttribute("type", "button"), t.style.position = "relative", t.style.margin = "0px 0px 0px 0px", t.style.padding = "3px 4px 0px 4px", t.style.cssFloat = "left", t.setAttribute("title", n._cultureInfo[i + "Text"]), t.innerHTML = "
")
+ }
+
+ function ui() {
+ for (var n = null, t = 0; t < arguments.length; t++) n = arguments[t], n.style && (n.style.display = "inline")
+ }
+
+ function nt() {
+ for (var n = null, t = 0; t < arguments.length; t++) n = arguments[t], n && n.style && (n.style.display = "none")
+ }
+
+ function h(n, t, i, r) {
+ this._defaultsKey = n;
+ this.parent = r;
+ this._eventListeners = [];
+ var u = {};
+ i && ut[i] && ut[i][n] && (u = ut[i][n]);
+ this._options = t ? t : {};
+ this.setOptions(this._options, u)
+ }
+
+ function t(i, r, u) {
+ var f, e, o;
+ if (this._publicChartReference = u, r = r || {}, t.base.constructor.call(this, "Chart", r, r.theme ? r.theme : "theme1"), f = this, this._containerId = i, this._objectsInitialized = !1, this.ctx = null, this.overlaidCanvasCtx = null, this._indexLabels = [], this._panTimerId = 0, this._lastTouchEventType = "", this._lastTouchData = null, this.isAnimating = !1, this.renderCount = 0, this.animatedRender = !1, this.disableToolTip = !1, this.panEnabled = !1, this._defaultCursor = "default", this.plotArea = {
+ canvas: null,
+ ctx: null,
+ x1: 0,
+ y1: 0,
+ x2: 0,
+ y2: 0,
+ width: 0,
+ height: 0
+ }, this._dataInRenderedOrder = [], this._container = typeof this._containerId == "string" ? document.getElementById(this._containerId) : this._containerId, !this._container) {
+ window.console && window.console.log('CanvasJS Error: Chart Container with id "' + this._containerId + '" was not found');
+ return
+ }
+ if (this._container.innerHTML = "", e = 0, o = 0, e = this._options.width ? this.width : this._container.clientWidth > 0 ? this._container.clientWidth : this.width, o = this._options.height ? this.height : this._container.clientHeight > 0 ? this._container.clientHeight : this.height, this.width = e, this.height = o, this.x1 = this.y1 = 0, this.x2 = this.width, this.y2 = this.height, this._selectedColorSet = typeof tt[this.colorSet] != "undefined" ? tt[this.colorSet] : tt.colorSet1, this._canvasJSContainer = document.createElement("div"), this._canvasJSContainer.setAttribute("class", "canvasjs-chart-container"), this._canvasJSContainer.style.position = "relative", this._canvasJSContainer.style.textAlign = "left", this._canvasJSContainer.style.cursor = "auto", n || (this._canvasJSContainer.style.height = "0px"), this._container.appendChild(this._canvasJSContainer), this.canvas = rt(e, o), this.canvas.style.position = "absolute", this.canvas.getContext) this._canvasJSContainer.appendChild(this.canvas), this.ctx = this.canvas.getContext("2d"), this.ctx.textBaseline = "top", pi(this.ctx);
+ else return;
+ n ? this.plotArea.ctx = this.ctx : (this.plotArea.canvas = rt(e, o), this.plotArea.canvas.style.position = "absolute", this.plotArea.canvas.setAttribute("class", "plotAreaCanvas"), this._canvasJSContainer.appendChild(this.plotArea.canvas), this.plotArea.ctx = this.plotArea.canvas.getContext("2d"));
+ this.overlaidCanvas = rt(e, o);
+ this.overlaidCanvas.style.position = "absolute";
+ this._canvasJSContainer.appendChild(this.overlaidCanvas);
+ this.overlaidCanvasCtx = this.overlaidCanvas.getContext("2d");
+ this.overlaidCanvasCtx.textBaseline = "top";
+ this._eventManager = new at(this);
+ s(window, "resize", function() {
+ f._updateSize() && f.render()
+ });
+ this._toolBar = document.createElement("div");
+ this._toolBar.setAttribute("class", "canvasjs-chart-toolbar");
+ this._toolBar.style.cssText = "position: absolute; right: 1px; top: 1px;";
+ this._canvasJSContainer.appendChild(this._toolBar);
+ this.bounds = {
+ x1: 0,
+ y1: 0,
+ x2: this.width,
+ y2: this.height
+ };
+ s(this.overlaidCanvas, "click", function(n) {
+ f._mouseEventHandler(n)
+ });
+ s(this.overlaidCanvas, "mousemove", function(n) {
+ f._mouseEventHandler(n)
+ });
+ s(this.overlaidCanvas, "mouseup", function(n) {
+ f._mouseEventHandler(n)
+ });
+ s(this.overlaidCanvas, "mousedown", function(n) {
+ f._mouseEventHandler(n);
+ nt(f._dropdownMenu)
+ });
+ s(this.overlaidCanvas, "mouseout", function(n) {
+ f._mouseEventHandler(n)
+ });
+ s(this.overlaidCanvas, window.navigator.msPointerEnabled ? "MSPointerDown" : "touchstart", function(n) {
+ f._touchEventHandler(n)
+ });
+ s(this.overlaidCanvas, window.navigator.msPointerEnabled ? "MSPointerMove" : "touchmove", function(n) {
+ f._touchEventHandler(n)
+ });
+ s(this.overlaidCanvas, window.navigator.msPointerEnabled ? "MSPointerUp" : "touchend", function(n) {
+ f._touchEventHandler(n)
+ });
+ s(this.overlaidCanvas, window.navigator.msPointerEnabled ? "MSPointerCancel" : "touchcancel", function(n) {
+ f._touchEventHandler(n)
+ });
+ this._creditLink || (this._creditLink = document.createElement("a"), this._creditLink.setAttribute("class", "canvasjs-chart-credit"), this._creditLink.setAttribute("style", "outline:none;margin:0px;position:absolute;right:3px;top:" + (this.height - 14) + "px;color:dimgrey;text-decoration:none;font-size:10px;font-family:Lucida Grande, Lucida Sans Unicode, Arial, sans-serif"), this._creditLink.setAttribute("tabIndex", -1), this._creditLink.setAttribute("target", "_blank"));
+ this._toolTip = new k(this, this._options.toolTip, this.theme);
+ this.data = null;
+ this.axisX = null;
+ this.axisY = null;
+ this.axisY2 = null;
+ this.sessionVariables = {
+ axisX: {
+ internalMinimum: null,
+ internalMaximum: null
+ },
+ axisY: {
+ internalMinimum: null,
+ internalMaximum: null
+ },
+ axisY2: {
+ internalMinimum: null,
+ internalMaximum: null
+ }
+ }
+ }
+
+ function kt(n, t) {
+ for (var f, e, i, o, h, s, c, r = [], u = 0; u < n.length; u++) {
+ if (u == 0) {
+ r.push(n[0]);
+ continue
+ }
+ i = u - 1;
+ f = i === 0 ? 0 : i - 1;
+ e = i === n.length - 1 ? i : i + 1;
+ o = {
+ x: (n[e].x - n[f].x) / t,
+ y: (n[e].y - n[f].y) / t
+ };
+ h = {
+ x: n[i].x + o.x / 3,
+ y: n[i].y + o.y / 3
+ };
+ r[r.length] = h;
+ i = u;
+ f = i === 0 ? 0 : i - 1;
+ e = i === n.length - 1 ? i : i + 1;
+ s = {
+ x: (n[e].x - n[f].x) / t,
+ y: (n[e].y - n[f].y) / t
+ };
+ c = {
+ x: n[i].x - s.x / 3,
+ y: n[i].y - s.y / 3
+ };
+ r[r.length] = c;
+ r[r.length] = n[u]
+ }
+ return r
+ }
+
+ function ft(n, t, i, r, u) {
+ typeof u == "undefined" && (u = 0);
+ this._padding = u;
+ this._x1 = n;
+ this._y1 = t;
+ this._x2 = i;
+ this._y2 = r;
+ this._topOccupied = this._padding;
+ this._bottomOccupied = this._padding;
+ this._leftOccupied = this._padding;
+ this._rightOccupied = this._padding
+ }
+
+ function c(n, t) {
+ c.base.constructor.call(this, "TextBlock", t);
+ this.ctx = n;
+ this._isDirty = !0;
+ this._wrappedText = null;
+ this._lineHeight = pt(this.fontFamily, this.fontSize, this.fontWeight)
+ }
+
+ function lt(n, t) {
+ lt.base.constructor.call(this, "Title", t, n.theme);
+ this.chart = n;
+ this.canvas = n.canvas;
+ this.ctx = this.chart.ctx;
+ typeof this._options.fontSize == "undefined" && (this.fontSize = this.chart.getAutoFontSize(this.fontSize));
+ this.width = null;
+ this.height = null;
+ this.bounds = {
+ x1: null,
+ y1: null,
+ x2: null,
+ y2: null
+ }
+ }
+
+ function gt(n, t) {
+ gt.base.constructor.call(this, "Subtitle", t, n.theme);
+ this.chart = n;
+ this.canvas = n.canvas;
+ this.ctx = this.chart.ctx;
+ typeof this._options.fontSize == "undefined" && (this.fontSize = this.chart.getAutoFontSize(this.fontSize));
+ this.width = null;
+ this.height = null;
+ this.bounds = {
+ x1: null,
+ y1: null,
+ x2: null,
+ y2: null
+ }
+ }
+
+ function ni(n, t, i) {
+ ni.base.constructor.call(this, "Legend", t, i);
+ this.chart = n;
+ this.canvas = n.canvas;
+ this.ctx = this.chart.ctx;
+ this.ghostCtx = this.chart._eventManager.ghostCtx;
+ this.items = [];
+ this.width = 0;
+ this.height = 0;
+ this.orientation = null;
+ this.dataSeries = [];
+ this.bounds = {
+ x1: null,
+ y1: null,
+ x2: null,
+ y2: null
+ };
+ typeof this._options.fontSize == "undefined" && (this.fontSize = this.chart.getAutoFontSize(this.fontSize));
+ this.lineHeight = pt(this.fontFamily, this.fontSize, this.fontWeight);
+ this.horizontalSpacing = this.fontSize
+ }
+
+ function fi(n, t) {
+ fi.base.constructor.call(this, t);
+ this.chart = n;
+ this.canvas = n.canvas;
+ this.ctx = this.chart.ctx
+ }
+
+ function d(n, t, i, r, u) {
+ d.base.constructor.call(this, "DataSeries", t, i);
+ this.chart = n;
+ this.canvas = n.canvas;
+ this._ctx = n.canvas.ctx;
+ this.index = r;
+ this.noDataPointsInPlotArea = 0;
+ this.id = u;
+ this.chart._eventManager.objectMap[u] = {
+ id: u,
+ objectType: "dataSeries",
+ dataSeriesIndex: r
+ };
+ this.dataPointIds = [];
+ this.plotUnit = [];
+ this.axisX = null;
+ this.axisY = null;
+ this.fillOpacity === null && (this.fillOpacity = this.type.match(/area/i) ? .7 : 1);
+ this.axisPlacement = this.getDefaultAxisPlacement();
+ typeof this._options.indexLabelFontSize == "undefined" && (this.indexLabelFontSize = this.chart.getAutoFontSize(this.indexLabelFontSize))
+ }
+
+ function e(n, t, i, r) {
+ if (e.base.constructor.call(this, "Axis", t, n.theme), this.chart = n, this.canvas = n.canvas, this.ctx = n.ctx, this.maxWidth = 0, this.maxHeight = 0, this.intervalstartTimePercent = 0, this.labels = [], this._labels = null, this.dataInfo = {
+ min: Infinity,
+ max: -Infinity,
+ viewPortMin: Infinity,
+ viewPortMax: -Infinity,
+ minDiff: Infinity
+ }, i === "axisX" ? (this.sessionVariables = this.chart.sessionVariables[i], this._options.interval || (this.intervalType = null)) : this.sessionVariables = r === "left" || r === "top" ? this.chart.sessionVariables.axisY : this.chart.sessionVariables.axisY2, typeof this._options.titleFontSize == "undefined" && (this.titleFontSize = this.chart.getAutoFontSize(this.titleFontSize)), typeof this._options.labelFontSize == "undefined" && (this.labelFontSize = this.chart.getAutoFontSize(this.labelFontSize)), this.type = i, i !== "axisX" || t && typeof t.gridThickness != "undefined" || (this.gridThickness = 0), this._position = r, this.lineCoordinates = {
+ x1: null,
+ y1: null,
+ x2: null,
+ y2: null,
+ width: null
+ }, this.labelAngle = (this.labelAngle % 360 + 360) % 360, this.labelAngle > 90 && this.labelAngle <= 270 ? this.labelAngle -= 180 : this.labelAngle > 180 && this.labelAngle <= 270 ? this.labelAngle -= 180 : this.labelAngle > 270 && this.labelAngle <= 360 && (this.labelAngle -= 360), this._options.stripLines && this._options.stripLines.length > 0) {
+ this.stripLines = [];
+ for (var u = 0; u < this._options.stripLines.length; u++) this.stripLines.push(new ti(this.chart, this._options.stripLines[u], n.theme, ++this.chart._eventManager.lastObjectId, this))
+ }
+ this._titleTextBlock = null;
+ this._absoluteMinimum = null;
+ this._absoluteMaximum = null;
+ this.hasOptionChanged("minimum") && (this.sessionVariables.internalMinimum = this.minimum);
+ this.hasOptionChanged("maximum") && (this.sessionVariables.internalMaximum = this.maximum);
+ this.trackChanges("minimum");
+ this.trackChanges("maximum")
+ }
+
+ function ti(n, t, i, r, u) {
+ ti.base.constructor.call(this, "StripLine", t, i, u);
+ this.id = r;
+ this.chart = n;
+ this.ctx = this.chart.ctx;
+ this.label = this.label;
+ this._thicknessType = "pixel";
+ this.startValue !== null && this.endValue !== null && (this.value = ((this.startValue.getTime ? this.startValue.getTime() : this.startValue) + (this.endValue.getTime ? this.endValue.getTime() : this.endValue)) / 2, this.thickness = Math.max(this.endValue - this.startValue), this._thicknessType = "value")
+ }
+
+ function k(n, t, i) {
+ k.base.constructor.call(this, "ToolTip", t, i);
+ this.chart = n;
+ this.canvas = n.canvas;
+ this.ctx = this.chart.ctx;
+ this.currentSeriesIndex = -1;
+ this.currentDataPointIndex = -1;
+ this._timerId = 0;
+ this._prevX = NaN;
+ this._prevY = NaN;
+ this._initialize()
+ }
+
+ function at(n) {
+ var t, i;
+ this.chart = n;
+ this.lastObjectId = 0;
+ t = this;
+ this.objectMap = [];
+ this.rectangularRegionEventSubscriptions = [];
+ this.previousDataPointEventObject = null;
+ this.ghostCanvas = rt(this.chart.width, this.chart.height);
+ this.ghostCtx = this.ghostCanvas.getContext("2d");
+ i = function(n) {
+ t.mouseEventHandler.call(t, n)
+ };
+ this.mouseoveredObjectMaps = []
+ }
+
+ function vt(n) {
+ var t;
+ n && ot[n] && (t = ot[n]);
+ vt.base.constructor.call(this, "CultureInfo", t)
+ }
+
+ function ei(n) {
+ this.chart = n;
+ this.ctx = this.chart.plotArea.ctx;
+ this.animations = [];
+ this.animationRequestId = null
+ }
+ var yt = !1,
+ n = !!document.createElement("canvas").getContext,
+ et = {
+ Chart: {
+ width: 500,
+ height: 400,
+ zoomEnabled: !1,
+ backgroundColor: "white",
+ theme: "theme1",
+ animationEnabled: !1,
+ animationDuration: 1200,
+ dataPointMaxWidth: null,
+ colorSet: "colorSet1",
+ culture: "en",
+ creditText: "CanvasJS.com",
+ interactivityEnabled: !0,
+ exportEnabled: !1,
+ exportFileName: "Chart"
+ },
+ Title: {
+ padding: 0,
+ text: null,
+ verticalAlign: "top",
+ horizontalAlign: "center",
+ fontSize: 20,
+ fontFamily: "Calibri",
+ fontWeight: "normal",
+ fontColor: "black",
+ fontStyle: "normal",
+ borderThickness: 0,
+ borderColor: "black",
+ cornerRadius: 0,
+ backgroundColor: null,
+ margin: 5,
+ wrap: !0,
+ maxWidth: null,
+ dockInsidePlotArea: !1
+ },
+ Subtitle: {
+ padding: 0,
+ text: null,
+ verticalAlign: "top",
+ horizontalAlign: "center",
+ fontSize: 14,
+ fontFamily: "Calibri",
+ fontWeight: "normal",
+ fontColor: "black",
+ fontStyle: "normal",
+ borderThickness: 0,
+ borderColor: "black",
+ cornerRadius: 0,
+ backgroundColor: null,
+ margin: 2,
+ wrap: !0,
+ maxWidth: null,
+ dockInsidePlotArea: !1
+ },
+ Legend: {
+ name: null,
+ verticalAlign: "center",
+ horizontalAlign: "right",
+ fontSize: 14,
+ fontFamily: "calibri",
+ fontWeight: "normal",
+ fontColor: "black",
+ fontStyle: "normal",
+ cursor: null,
+ itemmouseover: null,
+ itemmouseout: null,
+ itemmousemove: null,
+ itemclick: null,
+ dockInsidePlotArea: !1,
+ reversed: !1,
+ maxWidth: null,
+ maxHeight: null,
+ itemMaxWidth: null,
+ itemWidth: null,
+ itemWrap: !0,
+ itemTextFormatter: null
+ },
+ ToolTip: {
+ enabled: !0,
+ shared: !1,
+ animationEnabled: !0,
+ content: null,
+ contentFormatter: null,
+ reversed: !1,
+ backgroundColor: null,
+ borderColor: null,
+ borderThickness: 2,
+ cornerRadius: 5,
+ fontSize: 14,
+ fontColor: "#000000",
+ fontFamily: "Calibri, Arial, Georgia, serif;",
+ fontWeight: "normal",
+ fontStyle: "italic"
+ },
+ Axis: {
+ minimum: null,
+ maximum: null,
+ interval: null,
+ intervalType: null,
+ title: null,
+ titleFontColor: "black",
+ titleFontSize: 20,
+ titleFontFamily: "arial",
+ titleFontWeight: "normal",
+ titleFontStyle: "normal",
+ labelAngle: 0,
+ labelFontFamily: "arial",
+ labelFontColor: "black",
+ labelFontSize: 12,
+ labelFontWeight: "normal",
+ labelFontStyle: "normal",
+ labelAutoFit: !1,
+ labelWrap: !0,
+ labelMaxWidth: null,
+ labelFormatter: null,
+ prefix: "",
+ suffix: "",
+ includeZero: !0,
+ tickLength: 5,
+ tickColor: "black",
+ tickThickness: 1,
+ lineColor: "black",
+ lineThickness: 1,
+ lineDashType: "solid",
+ gridColor: "A0A0A0",
+ gridThickness: 0,
+ gridDashType: "solid",
+ interlacedColor: null,
+ valueFormatString: null,
+ margin: 2,
+ stripLines: []
+ },
+ StripLine: {
+ value: null,
+ startValue: null,
+ endValue: null,
+ color: "orange",
+ opacity: null,
+ thickness: 2,
+ lineDashType: "solid",
+ label: "",
+ labelBackgroundColor: "#EEEEEE",
+ labelFontFamily: "arial",
+ labelFontColor: "orange",
+ labelFontSize: 12,
+ labelFontWeight: "normal",
+ labelFontStyle: "normal",
+ labelFormatter: null,
+ showOnTop: !1
+ },
+ DataSeries: {
+ name: null,
+ dataPoints: null,
+ label: "",
+ bevelEnabled: !1,
+ highlightEnabled: !0,
+ cursor: null,
+ indexLabel: "",
+ indexLabelPlacement: "auto",
+ indexLabelOrientation: "horizontal",
+ indexLabelFontColor: "black",
+ indexLabelFontSize: 12,
+ indexLabelFontStyle: "normal",
+ indexLabelFontFamily: "Arial",
+ indexLabelFontWeight: "normal",
+ indexLabelBackgroundColor: null,
+ indexLabelLineColor: null,
+ indexLabelLineThickness: 1,
+ indexLabelLineDashType: "solid",
+ indexLabelMaxWidth: null,
+ indexLabelWrap: !0,
+ indexLabelFormatter: null,
+ lineThickness: 2,
+ lineDashType: "solid",
+ color: null,
+ risingColor: "white",
+ fillOpacity: null,
+ startAngle: 0,
+ type: "column",
+ xValueType: "number",
+ axisYType: "primary",
+ xValueFormatString: null,
+ yValueFormatString: null,
+ zValueFormatString: null,
+ percentFormatString: null,
+ showInLegend: null,
+ legendMarkerType: null,
+ legendMarkerColor: null,
+ legendText: null,
+ legendMarkerBorderColor: null,
+ legendMarkerBorderThickness: null,
+ markerType: "circle",
+ markerColor: null,
+ markerSize: null,
+ markerBorderColor: null,
+ markerBorderThickness: null,
+ mouseover: null,
+ mouseout: null,
+ mousemove: null,
+ click: null,
+ toolTipContent: null,
+ visible: !0
+ },
+ TextBlock: {
+ x: 0,
+ y: 0,
+ width: null,
+ height: null,
+ maxWidth: null,
+ maxHeight: null,
+ padding: 0,
+ angle: 0,
+ text: "",
+ horizontalAlign: "center",
+ fontSize: 12,
+ fontFamily: "calibri",
+ fontWeight: "normal",
+ fontColor: "black",
+ fontStyle: "normal",
+ borderThickness: 0,
+ borderColor: "black",
+ cornerRadius: 0,
+ backgroundColor: null,
+ textBaseline: "top"
+ },
+ CultureInfo: {
+ decimalSeparator: ".",
+ digitGroupSeparator: ",",
+ zoomText: "Zoom",
+ panText: "Pan",
+ resetText: "Reset",
+ menuText: "More Options",
+ saveJPGText: "Save as JPG",
+ savePNGText: "Save as PNG",
+ days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
+ shortDays: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
+ months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
+ shortMonths: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
+ }
+ },
+ ot = {
+ en: {}
+ },
+ tt = {
+ colorSet1: ["#369EAD", "#C24642", "#7F6084", "#86B402", "#A2D1CF", "#C8B631", "#6DBCEB", "#52514E", "#4F81BC", "#A064A1", "#F79647"],
+ colorSet2: ["#4F81BC", "#C0504E", "#9BBB58", "#23BFAA", "#8064A1", "#4AACC5", "#F79647", "#33558B"],
+ colorSet3: ["#8CA1BC", "#36845C", "#017E82", "#8CB9D0", "#708C98", "#94838D", "#F08891", "#0366A7", "#008276", "#EE7757", "#E5BA3A", "#F2990B", "#03557B", "#782970"]
+ },
+ ut = {
+ theme1: {
+ Chart: {
+ colorSet: "colorSet1"
+ },
+ Title: {
+ fontFamily: n ? "Calibri, Optima, Candara, Verdana, Geneva, sans-serif" : "calibri",
+ fontSize: 33,
+ fontColor: "#3A3A3A",
+ fontWeight: "bold",
+ verticalAlign: "top",
+ margin: 5
+ },
+ Subtitle: {
+ fontFamily: n ? "Calibri, Optima, Candara, Verdana, Geneva, sans-serif" : "calibri",
+ fontSize: 16,
+ fontColor: "#3A3A3A",
+ fontWeight: "bold",
+ verticalAlign: "top",
+ margin: 5
+ },
+ Axis: {
+ titleFontSize: 26,
+ titleFontColor: "#666666",
+ titleFontFamily: n ? "Calibri, Optima, Candara, Verdana, Geneva, sans-serif" : "calibri",
+ labelFontFamily: n ? "Calibri, Optima, Candara, Verdana, Geneva, sans-serif" : "calibri",
+ labelFontSize: 18,
+ labelFontColor: "grey",
+ tickColor: "#BBBBBB",
+ tickThickness: 2,
+ gridThickness: 2,
+ gridColor: "#BBBBBB",
+ lineThickness: 2,
+ lineColor: "#BBBBBB"
+ },
+ Legend: {
+ verticalAlign: "bottom",
+ horizontalAlign: "center",
+ fontFamily: n ? "monospace, sans-serif,arial black" : "calibri"
+ },
+ DataSeries: {
+ indexLabelFontColor: "grey",
+ indexLabelFontFamily: n ? "Calibri, Optima, Candara, Verdana, Geneva, sans-serif" : "calibri",
+ indexLabelFontSize: 18,
+ indexLabelLineThickness: 1
+ }
+ },
+ theme2: {
+ Chart: {
+ colorSet: "colorSet2"
+ },
+ Title: {
+ fontFamily: "impact, charcoal, arial black, sans-serif",
+ fontSize: 32,
+ fontColor: "#333333",
+ verticalAlign: "top",
+ margin: 5
+ },
+ Subtitle: {
+ fontFamily: "impact, charcoal, arial black, sans-serif",
+ fontSize: 14,
+ fontColor: "#333333",
+ verticalAlign: "top",
+ margin: 5
+ },
+ Axis: {
+ titleFontSize: 22,
+ titleFontColor: "rgb(98,98,98)",
+ titleFontFamily: n ? "monospace, sans-serif,arial black" : "arial",
+ titleFontWeight: "bold",
+ labelFontFamily: n ? "monospace, Courier New, Courier" : "arial",
+ labelFontSize: 16,
+ labelFontColor: "grey",
+ labelFontWeight: "bold",
+ tickColor: "grey",
+ tickThickness: 2,
+ gridThickness: 2,
+ gridColor: "grey",
+ lineColor: "grey",
+ lineThickness: 0
+ },
+ Legend: {
+ verticalAlign: "bottom",
+ horizontalAlign: "center",
+ fontFamily: n ? "monospace, sans-serif,arial black" : "arial"
+ },
+ DataSeries: {
+ indexLabelFontColor: "grey",
+ indexLabelFontFamily: n ? "Courier New, Courier, monospace" : "arial",
+ indexLabelFontWeight: "bold",
+ indexLabelFontSize: 18,
+ indexLabelLineThickness: 1
+ }
+ },
+ theme3: {
+ Chart: {
+ colorSet: "colorSet1"
+ },
+ Title: {
+ fontFamily: n ? "Candara, Optima, Trebuchet MS, Helvetica Neue, Helvetica, Trebuchet MS, serif" : "calibri",
+ fontSize: 32,
+ fontColor: "#3A3A3A",
+ fontWeight: "bold",
+ verticalAlign: "top",
+ margin: 5
+ },
+ Subtitle: {
+ fontFamily: n ? "Candara, Optima, Trebuchet MS, Helvetica Neue, Helvetica, Trebuchet MS, serif" : "calibri",
+ fontSize: 16,
+ fontColor: "#3A3A3A",
+ fontWeight: "bold",
+ verticalAlign: "top",
+ margin: 5
+ },
+ Axis: {
+ titleFontSize: 22,
+ titleFontColor: "rgb(98,98,98)",
+ titleFontFamily: n ? "Verdana, Geneva, Calibri, sans-serif" : "calibri",
+ labelFontFamily: n ? "Calibri, Optima, Candara, Verdana, Geneva, sans-serif" : "calibri",
+ labelFontSize: 18,
+ labelFontColor: "grey",
+ tickColor: "grey",
+ tickThickness: 2,
+ gridThickness: 2,
+ gridColor: "grey",
+ lineThickness: 2,
+ lineColor: "grey"
+ },
+ Legend: {
+ verticalAlign: "bottom",
+ horizontalAlign: "center",
+ fontFamily: n ? "monospace, sans-serif,arial black" : "calibri"
+ },
+ DataSeries: {
+ bevelEnabled: !0,
+ indexLabelFontColor: "grey",
+ indexLabelFontFamily: n ? "Candara, Optima, Calibri, Verdana, Geneva, sans-serif" : "calibri",
+ indexLabelFontSize: 18,
+ indexLabelLineColor: "lightgrey",
+ indexLabelLineThickness: 2
+ }
+ }
+ },
+ f = {
+ numberDuration: 1,
+ yearDuration: 314496e5,
+ monthDuration: 2592e6,
+ weekDuration: 6048e5,
+ dayDuration: 864e5,
+ hourDuration: 36e5,
+ minuteDuration: 6e4,
+ secondDuration: 1e3,
+ millisecondDuration: 1,
+ dayOfWeekFromInt: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]
+ },
+ hi = {},
+ g = null,
+ ii = function() {
+ var n = /D{1,4}|M{1,4}|Y{1,4}|h{1,2}|H{1,2}|m{1,2}|s{1,2}|f{1,3}|t{1,2}|T{1,2}|K|z{1,3}|"[^"]*"|'[^']*'/g,
+ t = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
+ i = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
+ r = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
+ u = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
+ f = /\b(?:[PMCEA][SDP]T|(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time|(?:GMT|UTC)(?:[-+]\d{4})?)\b/g,
+ e = /[^-+\dA-Z]/g;
+ return function(o, s, h) {
+ var tt = h ? h.days : t,
+ it = h ? h.months : r,
+ rt = h ? h.shortDays : i,
+ ut = h ? h.shortMonths : u,
+ y = !1;
+ if (o = o && o.getTime ? o : o ? new Date(o) : new Date, isNaN(o)) throw SyntaxError("invalid date");
+ s.slice(0, 4) === "UTC:" && (s = s.slice(4), y = !0);
+ var c = y ? "getUTC" : "get",
+ k = o[c + "Date"](),
+ d = o[c + "Day"](),
+ p = o[c + "Month"](),
+ w = o[c + "FullYear"](),
+ l = o[c + "Hours"](),
+ g = o[c + "Minutes"](),
+ nt = o[c + "Seconds"](),
+ b = o[c + "Milliseconds"](),
+ a = y ? 0 : o.getTimezoneOffset();
+ return s.replace(n, function(n) {
+ switch (n) {
+ case "D":
+ return k;
+ case "DD":
+ return v(k, 2);
+ case "DDD":
+ return rt[d];
+ case "DDDD":
+ return tt[d];
+ case "M":
+ return p + 1;
+ case "MM":
+ return v(p + 1, 2);
+ case "MMM":
+ return ut[p];
+ case "MMMM":
+ return it[p];
+ case "Y":
+ return parseInt(String(w).slice(-2));
+ case "YY":
+ return v(String(w).slice(-2), 2);
+ case "YYY":
+ return v(String(w).slice(-3), 3);
+ case "YYYY":
+ return v(w, 4);
+ case "h":
+ return l % 12 || 12;
+ case "hh":
+ return v(l % 12 || 12, 2);
+ case "H":
+ return l;
+ case "HH":
+ return v(l, 2);
+ case "m":
+ return g;
+ case "mm":
+ return v(g, 2);
+ case "s":
+ return nt;
+ case "ss":
+ return v(nt, 2);
+ case "f":
+ return String(b).slice(0, 1);
+ case "ff":
+ return v(String(b).slice(0, 2), 2);
+ case "fff":
+ return v(String(b).slice(0, 3), 3);
+ case "t":
+ return l < 12 ? "a" : "p";
+ case "tt":
+ return l < 12 ? "am" : "pm";
+ case "T":
+ return l < 12 ? "A" : "P";
+ case "TT":
+ return l < 12 ? "AM" : "PM";
+ case "K":
+ return y ? "UTC" : (String(o).match(f) || [""]).pop().replace(e, "");
+ case "z":
+ return (a > 0 ? "-" : "+") + Math.floor(Math.abs(a) / 60);
+ case "zz":
+ return (a > 0 ? "-" : "+") + v(Math.floor(Math.abs(a) / 60), 2);
+ case "zzz":
+ return (a > 0 ? "-" : "+") + v(Math.floor(Math.abs(a) / 60), 2) + v(Math.abs(a) % 60, 2);
+ default:
+ return n.slice(1, n.length - 1)
+ }
+ })
+ }
+ }(),
+ it = function(n, t, i) {
+ var w, r, e, nt, s, ft;
+ if (n === null) return "";
+ n = Number(n);
+ w = n < 0 ? !0 : !1;
+ w && (n *= -1);
+ var at = i ? i.decimalSeparator : ".",
+ b = i ? i.digitGroupSeparator : ",",
+ ot = "";
+ t = String(t);
+ var a = 1,
+ u = "",
+ y = "",
+ h = -1,
+ k = [],
+ d = [],
+ p = 0,
+ st = 0,
+ g = 0,
+ ht = !1,
+ c = 0;
+ for (y = t.match(/"[^"]*"|'[^']*'|[eE][+-]*[0]+|[,]+[.]|‰|./g), r = null, e = 0; y && e < y.length; e++) {
+ if (r = y[e], r === "." && h < 0) {
+ h = e;
+ continue
+ } else if (r === "%") a *= 100;
+ else if (r === "‰") {
+ a *= 1e3;
+ continue
+ } else if (r[0] === "," && r[r.length - 1] === ".") {
+ a /= Math.pow(1e3, r.length - 1);
+ h = e + r.length - 1;
+ continue
+ } else(r[0] === "E" || r[0] === "e") && r[r.length - 1] === "0" && (ht = !0);
+ h < 0 ? (k.push(r), r === "#" || r === "0" ? p++ : r === "," && g++) : (d.push(r), (r === "#" || r === "0") && st++)
+ }
+ ht && (nt = Math.floor(n), c = (nt === 0 ? "" : String(nt)).length - p, a /= Math.pow(10, c));
+ n *= a;
+ h < 0 && (h = e);
+ ot = n.toFixed(st);
+ var ct = ot.split("."),
+ f = (ct[0] + "").split(""),
+ tt = (ct[1] + "").split("");
+ f && f[0] === "0" && f.shift();
+ for (var lt = 0, it = 0, rt = 0, ut = 0, o = 0; k.length > 0;)
+ if (r = k.pop(), r === "#" || r === "0")
+ if (lt++, lt === p) {
+ if (s = f, f = [], r === "0")
+ for (ft = p - it - (s ? s.length : 0); ft > 0;) s.unshift("0"), ft--;
+ while (s.length > 0) u = s.pop() + u, o++, o % ut == 0 && rt === g && s.length > 0 && (u = b + u);
+ w && (u = "-" + u)
+ } else f.length > 0 ? (u = f.pop() + u, it++, o++) : r === "0" && (u = "0" + u, it++, o++), o % ut == 0 && rt === g && f.length > 0 && (u = b + u);
+ else(r[0] === "E" || r[0] === "e") && r[r.length - 1] === "0" && /[eE][+-]*[0]+/.test(r) ? (r = c < 0 ? r.replace("+", "").replace("-", "") : r.replace("-", ""), u += r.replace(/[0]+/, function(n) {
+ return v(c, n.length)
+ })) : r === "," ? (rt++, ut = o, o = 0, f.length > 0 && (u = b + u)) : u = r.length > 1 && (r[0] === '"' && r[r.length - 1] === '"' || r[0] === "'" && r[r.length - 1] === "'") ? r.slice(1, r.length - 1) + u : r + u;
+ for (var l = "", et = !1; d.length > 0;) r = d.shift(), r === "#" || r === "0" ? tt.length > 0 && Number(tt.join("")) !== 0 ? (l += tt.shift(), et = !0) : r === "0" && (l += "0", et = !0) : r.length > 1 && (r[0] === '"' && r[r.length - 1] === '"' || r[0] === "'" && r[r.length - 1] === "'") ? l += r.slice(1, r.length - 1) : (r[0] === "E" || r[0] === "e") && r[r.length - 1] === "0" && /[eE][+-]*[0]+/.test(r) ? (r = c < 0 ? r.replace("+", "").replace("-", "") : r.replace("-", ""), l += r.replace(/[0]+/, function(n) {
+ return v(c, n.length)
+ })) : l += r;
+ return u + ((et ? at : "") + l)
+ },
+ wt = function(n) {
+ var t = 0,
+ i = 0;
+ return n = n || window.event, n.offsetX || n.offsetX === 0 ? (t = n.offsetX, i = n.offsetY) : n.layerX || n.layerX == 0 ? (t = n.layerX, i = n.layerY) : (t = n.pageX - n.target.offsetLeft, i = n.pageY - n.target.offsetTop), {
+ x: t,
+ y: i
+ }
+ },
+ li = !0,
+ ri = window.devicePixelRatio || 1,
+ bt = 1,
+ l = li ? ri / bt : 1,
+ nr = {
+ reset: {
+ image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAcCAYAAAAAwr0iAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAKRSURBVEiJrdY/iF1FFMfxzwnZrGISUSR/JLGIhoh/QiRNBLWxMLIWEkwbgiAoFgoW2mhlY6dgpY2IlRBRxBSKhSAKIklWJRYuMZKAhiyopAiaTY7FvRtmZ+/ed9/zHRjezLw5v/O9d86cuZGZpmURAfdn5o9DfdZNLXpjz+LziPgyIl6MiG0jPTJzZBuyDrP4BVm0P/AKbljTb4ToY/gGewYA7KyCl+1b3DUYANvwbiHw0gCAGRzBOzjTAXEOu0cC4Ch+r5x/HrpdrcZmvIDFSucMtnYCYC++6HmNDw8FKDT34ETrf639/azOr5vwRk/g5fbeuABtgC04XWk9VQLciMP4EH/3AFzErRNC7MXlQmsesSoHsGPE23hmEoBW+61K66HMXFmIMvN8myilXS36R01ub+KfYvw43ZXwYDX+AHP4BAci4pFJomfmr/ihmNofESsBImJGk7mlncrM45n5JPbhz0kAWpsv+juxaX21YIPmVJS2uNzJMS6ZNexC0d+I7fUWXLFyz2kSZlpWPvASlmqAf/FXNXf3FAF2F/1LuFifAlionB6dRuSI2IwHi6lzmXmp6xR8XY0fiIh7psAwh+3FuDkRHQVjl+a8lkXjo0kLUKH7XaV5oO86PmZ1FTzyP4K/XGl9v/zwfbW7BriiuETGCP5ch9bc9f97HF/vcFzCa5gdEPgWq+t/4v0V63oE1uF4h0DiFJ7HnSWMppDdh1dxtsPvJ2wcBNAKbsJXa0Ck5opdaBPsRNu/usba09i1KsaAVzmLt3sghrRjuK1Tf4xkegInxwy8gKf7dKMVH2QRsV5zXR/Cftyu+aKaKbbkQrsdH+PTzLzcqzkOQAVzM+7FHdiqqe2/YT4zF/t8S/sPmawyvC974vcAAAAASUVORK5CYII="
+ },
+ pan: {
+ image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAJVSURBVFiFvZe7a1RBGMV/x2hWI4JpfKCIiSBKOoOCkID/wP4BFqIIFkE02ChIiC8QDKlSiI3YqRBsBVGwUNAUdiIEUgjiAzQIIsuKJsfizsXr5t7d+8jmwLDfzHz3nLOzc7+ZxTZlGyDgZiWOCuJ9wH2gCUyuqQFgF/AGcKJNrYkBYBj40CIet+muGQi/96kM4WS7C/Tm5VUg7whJg8BkEGkCR4BDYfodsADUgP6wErO5iCtswsuJb32hdbXy8qzL5TIdmzJinHdZoZIBZcSFkGlAKs1Z3YCketZcBtouuaQNkrblMiBpBrhme7mAgU4wMCvpcFsDkq4C54DFVRTH9h+i6vlE0r5UA5ImgCuh28jB28iIs7BIVCOeStoZD64P4uPAjUTygKSx2FsK2TIwkugfk9Qkfd/E+yMWHQCeSRqx/R3gOp3LazfaS2C4B5gHDgD7U9x3E3uAH7KNpC3AHHAwTL4FHgM9GQ8vAaPA0dB/Abxqk2/gBLA9MXba9r1k/d4LfA3JtwueBeM58ucS+edXnAW23wP10N3advEi9CXizTnyN4bPS7Zn4sH/dq3t18AY4e1YLYSy3g/csj2VnFshZPuOpOeSKHCodUINuGj7YetE6je1PV9QoNPJ9StNHKodx7nRbiWrGHBGXAi5DUiqtQwtpcWK0Jubt8CltA5MEV1IfwO7+VffPwGfia5m34CT4bXujIIX0Qna1/cGMNqV/wUJE2czxD8CQ4X5Sl7Jz7SILwCDpbjKPBRMHAd+EtX4HWV5Spdc2w8kDQGPbH8py/MXMygM69/FKz4AAAAASUVORK5CYII="
+ },
+ zoom: {
+ image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAK6wAACusBgosNWgAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAMqSURBVFiFvdfbj91TFMDxz57U6GUEMS1aYzyMtCSSDhWjCZMInpAI3khE/QHtgzdRkXgSCS8SES9epKLi0oRKNETjRahREq2KS1stdRujtDPtbA97n5zdn9+5zJxTK9k5v3POXmt991p7r71+IcaoGwkhTOIebMRqzOBTvIG3Y4zTXRmqSoyx5cAKbMJOHMFJnMZ8/jyFaXyMR7G6nb1aH22cP4BvcBxziG3GKfyTIR9D6BYg1KUghPBCDveFlb/24Av8iuUYw41YVsz5G7uxKcZ4aMEpwGt5NY3V/YbHsQ6rcAHOw/kYxigewr5CZw4fYGxBKcCLOFEYehXrMdRhr5yLETxVScsOLOkKAPfn1TYMPIvLFrShUlS2FDZm8XRHACzFAWl3R2xbqPMCYhmeLCAOYEMngAczbcTvuHYxzguIy/FesR9e6gSwU/OoPYHBHgHgviIKX2Flq7k34KhmcVnbi/PC8JX4MgMcxb118wZwdz5aISscqx7VRcox7MrPQ7i+btIAJrAkf9+bI9EPmZY2IAxiTSuAldLq4Y9+AcSUh78KP0tbAcwU35cXMD1JCIFUoGiehlqAz6TNB1f1C0DK+0h+nsNPrQC2a4bqGmlD9kOGcWt+Po6pVgDvSxfJaSkFd4UQBvoAsBYbCoB3a2flM7slA0R8iyt6rAFDeDPbm8eOTpVwGD9qVq7nLbIaZnmksPU1JtsCZMXNmpdRxFasWITzh6Xj3LCzra1OxcD2QjHiGVzdpfORnMqZio2PcF23ABdJF1Np4BPptlyPi6WzPYBzpJZtHe7A6xW9cnyP8TqA//SEIYRL8Bxul7rihvwgtVn78WcGGZXa9HGd5TDujDHuOePXNiHdKjWgZX/YbsxLx/ktqbjVzTlcjUSnvI5JrdlUVp6WesZZ6R1hRrpq9+EVTGS9jTjYAuKIouGpbcurEkIYxC051KNSamazsc+xK8b4S0VnEi/j0hqTP+M27O258egQwZuzs7pI7Mf4WQXIEDc5s9sux+5+1Py2EmP8UOq6GvWhIScxfdYjUERiAt9Jd84J6a16zf8JEKT3yCm8g1UxRv8CC4pyRhzR1uUAAAAASUVORK5CYII="
+ },
+ menu: {
+ image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAgCAYAAAAbifjMAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAK6wAACusBgosNWgAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAAWdEVYdENyZWF0aW9uIFRpbWUAMDcvMTUvMTTPsvU0AAAAP0lEQVRIie2SMQoAIBDDUvH/X667g8sJJ9KOhYYOkW0qGaU1MPdC0vGSbV19EACo3YMPAFH5BUBUjsqfAPpVXtNgGDfxEDCtAAAAAElFTkSuQmCC"
+ }
+ },
+ o, dt;
+ h.prototype.setOptions = function(n, t) {
+ var r, i;
+ if (et[this._defaultsKey]) {
+ r = et[this._defaultsKey];
+ for (i in r) this[i] = n && i in n ? n[i] : t && i in t ? t[i] : r[i]
+ } else yt && window.console && console.log("defaults not set")
+ };
+ h.prototype.updateOption = function(n) {
+ !et[this._defaultsKey] && yt && window.console && console.log("defaults not set");
+ var u = et[this._defaultsKey],
+ t = this._options.theme ? this._options.theme : this.chart && this.chart._options.theme ? this.chart._options.theme : "theme1",
+ i = {},
+ r = this[n];
+ return (t && ut[t] && ut[t][this._defaultsKey] && (i = ut[t][this._defaultsKey]), n in u && (r = n in this._options ? this._options[n] : i && n in i ? i[n] : u[n]), r === this[n]) ? !1 : (this[n] = r, !0)
+ };
+ h.prototype.trackChanges = function(n) {
+ this._options._oldOptions || (this._options._oldOptions = {});
+ this._options._oldOptions[n] = this._options[n]
+ };
+ h.prototype.isBeingTracked = function(n) {
+ return this._options._oldOptions || (this._options._oldOptions = {}), this._options._oldOptions[n] ? !0 : !1
+ };
+ h.prototype.hasOptionChanged = function(n) {
+ this._options._oldOptions || (this._options._oldOptions = {});
+ return !(this._options._oldOptions[n] === this._options[n])
+ };
+ h.prototype.addEventListener = function(n, t, i) {
+ n && t && (i = i || this, this._eventListeners[n] = this._eventListeners[n] || [], this._eventListeners[n].push({
+ context: i,
+ eventHandler: t
+ }))
+ };
+ h.prototype.removeEventListener = function(n, t) {
+ var r, i;
+ if (n && t && this._eventListeners[n])
+ for (r = this._eventListeners[n], i = 0; i < r.length; i++)
+ if (r[i].eventHandler === t) {
+ r[i].splice(i, 1);
+ break
+ }
+ };
+ h.prototype.removeAllEventListeners = function() {
+ this._eventListeners = []
+ };
+ h.prototype.dispatchEvent = function(n, t) {
+ var r, i;
+ if (n && this._eventListeners[n])
+ for (t = t || {}, r = this._eventListeners[n], i = 0; i < r.length; i++) r[i].eventHandler.call(r[i].context, t)
+ };
+ w(t, h);
+ t.prototype._updateOptions = function() {
+ var t = this,
+ i, u, f, r;
+ this.updateOption("width");
+ this.updateOption("height");
+ this.updateOption("theme");
+ this.updateOption("colorSet") && (this._selectedColorSet = typeof tt[this.colorSet] != "undefined" ? tt[this.colorSet] : tt.colorSet1);
+ this.updateOption("backgroundColor");
+ this.backgroundColor || (this.backgroundColor = "rgba(0,0,0,0)");
+ this.updateOption("culture");
+ this._cultureInfo = new vt(this._options.culture);
+ this.updateOption("animationEnabled");
+ this.animationEnabled = this.animationEnabled && n;
+ this._options.zoomEnabled ? (this._zoomButton || (nt(this._zoomButton = document.createElement("button")), b(this, this._zoomButton, "pan"), this._toolBar.appendChild(this._zoomButton), s(this._zoomButton, "click", function() {
+ t.zoomEnabled ? (t.zoomEnabled = !1, t.panEnabled = !0, b(t, t._zoomButton, "zoom")) : (t.zoomEnabled = !0, t.panEnabled = !1, b(t, t._zoomButton, "pan"));
+ t.render()
+ })), this._resetButton || (nt(this._resetButton = document.createElement("button")), b(this, this._resetButton, "reset"), this._toolBar.appendChild(this._resetButton), s(this._resetButton, "click", function() {
+ t._toolTip.hide();
+ t.zoomEnabled || t.panEnabled ? (t.zoomEnabled = !0, t.panEnabled = !1, b(t, t._zoomButton, "pan"), t._defaultCursor = "default", t.overlaidCanvas.style.cursor = t._defaultCursor) : (t.zoomEnabled = !1, t.panEnabled = !1);
+ t.sessionVariables.axisX.internalMinimum = t._options.axisX && t._options.axisX.minimum ? t._options.axisX.minimum : null;
+ t.sessionVariables.axisX.internalMaximum = t._options.axisX && t._options.axisX.maximum ? t._options.axisX.maximum : null;
+ t.resetOverlayedCanvas();
+ nt(t._zoomButton, t._resetButton);
+ t.render()
+ }), this.overlaidCanvas.style.cursor = t._defaultCursor), this.zoomEnabled || this.panEnabled || (this._zoomButton ? (t._zoomButton.getAttribute("state") === t._cultureInfo.zoomText ? (this.panEnabled = !0, this.zoomEnabled = !1) : (this.zoomEnabled = !0, this.panEnabled = !1), ui(t._zoomButton, t._resetButton)) : (this.zoomEnabled = !0, this.panEnabled = !1))) : (this.zoomEnabled = !1, this.panEnabled = !1);
+ typeof this._options.exportFileName != "undefined" && (this.exportFileName = this._options.exportFileName);
+ typeof this._options.exportEnabled != "undefined" && (this.exportEnabled = this._options.exportEnabled);
+ this._menuButton ? this.exportEnabled ? ui(this._menuButton) : nt(this._menuButton) : this.exportEnabled && n && (this._menuButton = document.createElement("button"), b(this, this._menuButton, "menu"), this._toolBar.appendChild(this._menuButton), s(this._menuButton, "click", function() {
+ if (t._dropdownMenu.style.display === "none") {
+ if (t._dropDownCloseTime && (new Date).getTime() - t._dropDownCloseTime.getTime() <= 500) return;
+ t._dropdownMenu.style.display = "block";
+ t._menuButton.blur();
+ t._dropdownMenu.focus()
+ }
+ }, !0));
+ !this._dropdownMenu && this.exportEnabled && n && (this._dropdownMenu = document.createElement("div"), this._dropdownMenu.setAttribute("tabindex", -1), this._dropdownMenu.style.cssText = "position: absolute; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; cursor: pointer;right: 1px;top: 25px;min-width: 120px;outline: 0;border: 1px solid silver;font-size: 14px;font-family: Calibri, Verdana, sans-serif;padding: 5px 0px 5px 0px;text-align: left;background-color: #fff;line-height: 20px;box-shadow: 2px 2px 10px #888888;", t._dropdownMenu.style.display = "none", this._toolBar.appendChild(this._dropdownMenu), s(this._dropdownMenu, "blur", function() {
+ nt(t._dropdownMenu);
+ t._dropDownCloseTime = new Date
+ }, !0), i = document.createElement("div"), i.style.cssText = "padding: 2px 15px 2px 10px", i.innerHTML = this._cultureInfo.saveJPGText, this._dropdownMenu.appendChild(i), s(i, "mouseover", function() {
+ this.style.backgroundColor = "#EEEEEE"
+ }, !0), s(i, "mouseout", function() {
+ this.style.backgroundColor = "transparent"
+ }, !0), s(i, "click", function() {
+ ai(t.canvas, "jpg", t.exportFileName);
+ nt(t._dropdownMenu)
+ }, !0), i = document.createElement("div"), i.style.cssText = "padding: 2px 15px 2px 10px", i.innerHTML = this._cultureInfo.savePNGText, this._dropdownMenu.appendChild(i), s(i, "mouseover", function() {
+ this.style.backgroundColor = "#EEEEEE"
+ }, !0), s(i, "mouseout", function() {
+ this.style.backgroundColor = "transparent"
+ }, !0), s(i, "click", function() {
+ ai(t.canvas, "png", t.exportFileName);
+ nt(t._dropdownMenu)
+ }, !0));
+ this._toolBar.style.display !== "none" && this._zoomButton && (this.panEnabled ? b(t, t._zoomButton, "zoom") : b(t, t._zoomButton, "pan"), t._resetButton.getAttribute("state") !== t._cultureInfo.resetText && b(t, t._resetButton, "reset"));
+ typeof et.Chart.creditHref == "undefined" ? (this.creditHref = "http://canvasjs.com/", this.creditText = "CanvasJS.com") : (u = this.updateOption("creditText"), f = this.updateOption("creditHref"));
+ (this.renderCount === 0 || u || f) && (this._creditLink.setAttribute("href", this.creditHref), this._creditLink.innerHTML = this.creditText);
+ this.creditHref && this.creditText ? this._creditLink.parentElement || this._canvasJSContainer.appendChild(this._creditLink) : this._creditLink.parentElement && this._canvasJSContainer.removeChild(this._creditLink);
+ this._options.toolTip && this._toolTip._options !== this._options.toolTip && (this._toolTip._options = this._options.toolTip);
+ for (r in this._toolTip._options) this._toolTip._options.hasOwnProperty(r) && this._toolTip.updateOption(r)
+ };
+ t.prototype._updateSize = function() {
+ var n = 0,
+ t = 0;
+ return (this._options.width ? n = this.width : this.width = n = this._container.clientWidth > 0 ? this._container.clientWidth : this.width, this._options.height ? t = this.height : this.height = t = this._container.clientHeight > 0 ? this._container.clientHeight : this.height, this.canvas.width !== n * l || this.canvas.height !== t * l) ? (ct(this.canvas, n, t), ct(this.overlaidCanvas, n, t), ct(this._eventManager.ghostCanvas, n, t), !0) : !1
+ };
+ t.prototype._initialize = function() {
+ var f, u, i, e, r;
+ for (this._animator ? this._animator.cancelAllAnimations() : this._animator = new ei(this), this.removeAllEventListeners(), this.disableToolTip = !1, this.pieDoughnutClickHandler = null, this.animationRequestId && this.cancelRequestAnimFrame.call(window, this.animationRequestId), this._updateOptions(), this.animatedRender = n && this.animationEnabled && this.renderCount === 0, this._updateSize(), this.clearCanvas(), this.ctx.beginPath(), this.axisX = null, this.axisY = null, this.axisY2 = null, this._indexLabels = [], this._dataInRenderedOrder = [], this._events = [], this._eventManager && this._eventManager.reset(), this.plotInfo = {
+ axisPlacement: null,
+ axisXValueType: null,
+ plotTypes: []
+ }, this.layoutManager = new ft(0, 0, this.width, this.height, 2), this.plotArea.layoutManager && this.plotArea.layoutManager.reset(), this.data = [], f = 0, u = 0; u < this._options.data.length; u++)
+ if ((f++, !this._options.data[u].type || t._supportedChartTypes.indexOf(this._options.data[u].type) >= 0) && (i = new d(this, this._options.data[u], this.theme, f - 1, ++this._eventManager.lastObjectId), i.name === null && (i.name = "DataSeries " + f), i.color === null ? this._options.data.length > 1 ? (i._colorSet = [this._selectedColorSet[i.index % this._selectedColorSet.length]], i.color = this._selectedColorSet[i.index % this._selectedColorSet.length]) : i._colorSet = i.type === "line" || i.type === "stepLine" || i.type === "spline" || i.type === "area" || i.type === "stepArea" || i.type === "splineArea" || i.type === "stackedArea" || i.type === "stackedArea100" || i.type === "rangeArea" || i.type === "rangeSplineArea" || i.type === "candlestick" || i.type === "ohlc" ? [this._selectedColorSet[0]] : this._selectedColorSet : i._colorSet = [i.color], i.markerSize === null && ((i.type === "line" || i.type === "stepLine" || i.type === "spline") && i.dataPoints && i.dataPoints.length < this.width / 16 || i.type === "scatter") && (i.markerSize = 8), (i.type === "bubble" || i.type === "scatter") && i.dataPoints && i.dataPoints.sort(wi), this.data.push(i), e = i.axisPlacement, e === "normal" ? this.plotInfo.axisPlacement === "xySwapped" ? r = 'You cannot combine "' + i.type + '" with bar chart' : this.plotInfo.axisPlacement === "none" ? r = 'You cannot combine "' + i.type + '" with pie chart' : this.plotInfo.axisPlacement === null && (this.plotInfo.axisPlacement = "normal") : e === "xySwapped" ? this.plotInfo.axisPlacement === "normal" ? r = 'You cannot combine "' + i.type + '" with line, area, column or pie chart' : this.plotInfo.axisPlacement === "none" ? r = 'You cannot combine "' + i.type + '" with pie chart' : this.plotInfo.axisPlacement === null && (this.plotInfo.axisPlacement = "xySwapped") : e == "none" && (this.plotInfo.axisPlacement === "normal" ? r = 'You cannot combine "' + i.type + '" with line, area, column or bar chart' : this.plotInfo.axisPlacement === "xySwapped" ? r = 'You cannot combine "' + i.type + '" with bar chart' : this.plotInfo.axisPlacement === null && (this.plotInfo.axisPlacement = "none")), r && window.console)) {
+ window.console.log(r);
+ return
+ } this._objectsInitialized = !0
+ };
+ t._supportedChartTypes = di(["line", "stepLine", "spline", "column", "area", "stepArea", "splineArea", "bar", "bubble", "scatter", "stackedColumn", "stackedColumn100", "stackedBar", "stackedBar100", "stackedArea", "stackedArea100", "candlestick", "ohlc", "rangeColumn", "rangeBar", "rangeArea", "rangeSplineArea", "pie", "doughnut", "funnel"]);
+ t.prototype.render = function(n) {
+ var o, s, v, f, h, p, u, y, c, t, i, a, w, b, r;
+ for (n && (this._options = n), this._initialize(), o = [], u = 0; u < this.data.length; u++)(this.plotInfo.axisPlacement === "normal" || this.plotInfo.axisPlacement === "xySwapped") && (this.data[u].axisYType && this.data[u].axisYType !== "primary" ? this.data[u].axisYType === "secondary" && (this.axisY2 || (this.plotInfo.axisPlacement === "normal" ? this.axisY2 = new e(this, this._options.axisY2, "axisY", "right") : this.plotInfo.axisPlacement === "xySwapped" && (this.axisY2 = new e(this, this._options.axisY2, "axisY", "top"))), this.data[u].axisY = this.axisY2) : (this.axisY || (this.plotInfo.axisPlacement === "normal" ? this.axisY = new e(this, this._options.axisY, "axisY", "left") : this.plotInfo.axisPlacement === "xySwapped" && (this.axisY = new e(this, this._options.axisY, "axisY", "bottom"))), this.data[u].axisY = this.axisY), this.axisX || (this.plotInfo.axisPlacement === "normal" ? this.axisX = new e(this, this._options.axisX, "axisX", "bottom") : this.plotInfo.axisPlacement === "xySwapped" && (this.axisX = new e(this, this._options.axisX, "axisX", "left"))), this.data[u].axisX = this.axisX);
+ if (this._processData(), this._options.title && (this._title = new lt(this, this._options.title), this._title.dockInsidePlotArea ? o.push(this._title) : this._title.render()), this._options.subtitles)
+ for (u = 0; u < this._options.subtitles.length; u++) this.subtitles = [], s = new gt(this, this._options.subtitles[u]), this.subtitles.push(s), s.dockInsidePlotArea ? o.push(s) : s.render();
+ for (this.legend = new ni(this, this._options.legend, this.theme), u = 0; u < this.data.length; u++)(this.data[u].showInLegend || this.data[u].type === "pie" || this.data[u].type === "doughnut") && this.legend.dataSeries.push(this.data[u]);
+ if (this.legend.dockInsidePlotArea ? o.push(this.legend) : this.legend.render(), this.plotInfo.axisPlacement === "normal" || this.plotInfo.axisPlacement === "xySwapped") e.setLayoutAndRender(this.axisX, this.axisY, this.axisY2, this.plotInfo.axisPlacement, this.layoutManager.getFreeSpace());
+ else if (this.plotInfo.axisPlacement === "none") this.preparePlotArea();
+ else return;
+ v = 0;
+ for (v in o) o[v].render();
+ for (f = [], this.animatedRender && (h = rt(this.width, this.height), p = h.getContext("2d"), p.drawImage(this.canvas, 0, 0, this.width, this.height)), u = 0; u < this.plotInfo.plotTypes.length; u++)
+ for (y = this.plotInfo.plotTypes[u], c = 0; c < y.plotUnits.length; c++) {
+ for (t = y.plotUnits[c], i = null, t.targetCanvas = null, this.animatedRender && (t.targetCanvas = rt(this.width, this.height), t.targetCanvasCtx = t.targetCanvas.getContext("2d")), t.type === "line" ? i = this.renderLine(t) : t.type === "stepLine" ? i = this.renderStepLine(t) : t.type === "spline" ? i = this.renderSpline(t) : t.type === "column" ? i = this.renderColumn(t) : t.type === "bar" ? i = this.renderBar(t) : t.type === "area" ? i = this.renderArea(t) : t.type === "stepArea" ? i = this.renderStepArea(t) : t.type === "splineArea" ? i = this.renderSplineArea(t) : t.type === "stackedColumn" ? i = this.renderStackedColumn(t) : t.type === "stackedColumn100" ? i = this.renderStackedColumn100(t) : t.type === "stackedBar" ? i = this.renderStackedBar(t) : t.type === "stackedBar100" ? i = this.renderStackedBar100(t) : t.type === "stackedArea" ? i = this.renderStackedArea(t) : t.type === "stackedArea100" ? i = this.renderStackedArea100(t) : t.type === "bubble" ? i = i = this.renderBubble(t) : t.type === "scatter" ? i = this.renderScatter(t) : t.type === "pie" ? this.renderPie(t) : t.type === "doughnut" ? this.renderPie(t) : t.type === "candlestick" ? i = this.renderCandlestick(t) : t.type === "ohlc" ? i = this.renderCandlestick(t) : t.type === "rangeColumn" ? i = this.renderRangeColumn(t) : t.type === "rangeBar" ? i = this.renderRangeBar(t) : t.type === "rangeArea" ? i = this.renderRangeArea(t) : t.type === "rangeSplineArea" && (i = this.renderRangeSplineArea(t)), a = 0; a < t.dataSeriesIndexes.length; a++) this._dataInRenderedOrder.push(this.data[t.dataSeriesIndexes[a]]);
+ this.animatedRender && i && f.push(i)
+ }
+ this.animatedRender && this._indexLabels.length > 0 && (w = rt(this.width, this.height), b = w.getContext("2d"), f.push(this.renderIndexLabels(b)));
+ r = this;
+ f.length > 0 ? (r.disableToolTip = !0, r._animator.animate(200, r.animationDuration, function(n) {
+ r.ctx.clearRect(0, 0, r.width, r.height);
+ r.ctx.drawImage(h, 0, 0, Math.floor(r.width * l), Math.floor(r.height * l), 0, 0, r.width, r.height);
+ for (var t = 0; t < f.length; t++) i = f[t], n < 1 && typeof i.startTimePercent != "undefined" ? n >= i.startTimePercent && i.animationCallback(i.easingFunction(n - i.startTimePercent, 0, 1, 1 - i.startTimePercent), i) : i.animationCallback(i.easingFunction(n, 0, 1, 1), i);
+ r.dispatchEvent("dataAnimationIterationEnd", {
+ chart: r
+ })
+ }, function() {
+ var e, n, i, t, u;
+ for (f = [], e = 0, n = 0; n < r.plotInfo.plotTypes.length; n++)
+ for (i = r.plotInfo.plotTypes[n], t = 0; t < i.plotUnits.length; t++) u = i.plotUnits[t], u.targetCanvas = null;
+ h = null;
+ r.disableToolTip = !1
+ })) : (r._indexLabels.length > 0 && r.renderIndexLabels(), r.dispatchEvent("dataAnimationIterationEnd", {
+ chart: r
+ }));
+ this.attachPlotAreaEventHandlers();
+ this.zoomEnabled || this.panEnabled || !this._zoomButton || this._zoomButton.style.display === "none" || nt(this._zoomButton, this._resetButton);
+ this._toolTip._updateToolTip();
+ this.renderCount++;
+ yt && (r = this, setTimeout(function() {
+ var n = document.getElementById("ghostCanvasCopy"),
+ t;
+ n && (ct(n, r.width, r.height), t = n.getContext("2d"), t.drawImage(r._eventManager.ghostCanvas, 0, 0))
+ }, 2e3))
+ };
+ t.prototype.attachPlotAreaEventHandlers = function() {
+ this.attachEvent({
+ context: this,
+ chart: this,
+ mousedown: this._plotAreaMouseDown,
+ mouseup: this._plotAreaMouseUp,
+ mousemove: this._plotAreaMouseMove,
+ cursor: this.zoomEnabled ? "col-resize" : "move",
+ cursor: this.panEnabled ? "move" : "default",
+ capture: !0,
+ bounds: this.plotArea
+ })
+ };
+ t.prototype.categoriseDataSeries = function() {
+ for (var f, i, e, n, r = "", u = 0; u < this.data.length; u++)
+ if ((r = this.data[u], r.dataPoints && r.dataPoints.length !== 0 && r.visible) && t._supportedChartTypes.indexOf(r.type) >= 0) {
+ var i = null,
+ o = !1,
+ f = null,
+ s = !1;
+ for (n = 0; n < this.plotInfo.plotTypes.length; n++)
+ if (this.plotInfo.plotTypes[n].type === r.type) {
+ o = !0;
+ i = this.plotInfo.plotTypes[n];
+ break
+ } for (o || (i = {
+ type: r.type,
+ totalDataSeries: 0,
+ plotUnits: []
+ }, this.plotInfo.plotTypes.push(i)), n = 0; n < i.plotUnits.length; n++)
+ if (i.plotUnits[n].axisYType === r.axisYType) {
+ s = !0;
+ f = i.plotUnits[n];
+ break
+ } s || (f = {
+ type: r.type,
+ previousDataSeriesCount: 0,
+ index: i.plotUnits.length,
+ plotType: i,
+ axisYType: r.axisYType,
+ axisY: r.axisYType === "primary" ? this.axisY : this.axisY2,
+ axisX: this.axisX,
+ dataSeriesIndexes: [],
+ yTotals: []
+ }, i.plotUnits.push(f));
+ i.totalDataSeries++;
+ f.dataSeriesIndexes.push(u);
+ r.plotUnit = f
+ } for (u = 0; u < this.plotInfo.plotTypes.length; u++)
+ for (i = this.plotInfo.plotTypes[u], e = 0, n = 0; n < i.plotUnits.length; n++) i.plotUnits[n].previousDataSeriesCount = e, e += i.plotUnits[n].dataSeriesIndexes.length
+ };
+ t.prototype.assignIdToDataPoints = function() {
+ for (var t, r, i, n = 0; n < this.data.length; n++)
+ if (t = this.data[n], t.dataPoints)
+ for (r = t.dataPoints.length, i = 0; i < r; i++) t.dataPointIds[i] = ++this._eventManager.lastObjectId
+ };
+ t.prototype._processData = function() {
+ var t, r, i, n;
+ for (this.assignIdToDataPoints(), this.categoriseDataSeries(), t = 0; t < this.plotInfo.plotTypes.length; t++)
+ for (r = this.plotInfo.plotTypes[t], i = 0; i < r.plotUnits.length; i++) n = r.plotUnits[i], n.type === "line" || n.type === "stepLine" || n.type === "spline" || n.type === "column" || n.type === "area" || n.type === "stepArea" || n.type === "splineArea" || n.type === "bar" || n.type === "bubble" || n.type === "scatter" ? this._processMultiseriesPlotUnit(n) : n.type === "stackedColumn" || n.type === "stackedBar" || n.type === "stackedArea" ? this._processStackedPlotUnit(n) : n.type === "stackedColumn100" || n.type === "stackedBar100" || n.type === "stackedArea100" ? this._processStacked100PlotUnit(n) : (n.type === "candlestick" || n.type === "ohlc" || n.type === "rangeColumn" || n.type === "rangeBar" || n.type === "rangeArea" || n.type === "rangeSplineArea") && this._processMultiYPlotUnit(n)
+ };
+ t.prototype._processMultiseriesPlotUnit = function(n) {
+ var s, v, a, o;
+ if (n.dataSeriesIndexes && !(n.dataSeriesIndexes.length < 1)) {
+ var e = n.axisY.dataInfo,
+ u = n.axisX.dataInfo,
+ r, f, h = !1;
+ for (s = 0; s < n.dataSeriesIndexes.length; s++) {
+ var i = this.data[n.dataSeriesIndexes[s]],
+ t = 0,
+ c = !1,
+ l = !1;
+ for ((i.axisPlacement === "normal" || i.axisPlacement === "xySwapped") && (v = this.sessionVariables.axisX.internalMinimum ? this.sessionVariables.axisX.internalMinimum : this._options.axisX && this._options.axisX.minimum ? this._options.axisX.minimum : -Infinity, a = this.sessionVariables.axisX.internalMaximum ? this.sessionVariables.axisX.internalMaximum : this._options.axisX && this._options.axisX.maximum ? this._options.axisX.maximum : Infinity), (i.dataPoints[t].x && i.dataPoints[t].x.getTime || i.xValueType === "dateTime") && (h = !0), t = 0; t < i.dataPoints.length; t++) {
+ if (typeof i.dataPoints[t].x == "undefined" && (i.dataPoints[t].x = t), i.dataPoints[t].x.getTime ? (h = !0, r = i.dataPoints[t].x.getTime()) : r = i.dataPoints[t].x, f = i.dataPoints[t].y, r < u.min && (u.min = r), r > u.max && (u.max = r), f < e.min && (e.min = f), f > e.max && (e.max = f), t > 0 && (o = r - i.dataPoints[t - 1].x, o < 0 && (o = o * -1), u.minDiff > o && o !== 0 && (u.minDiff = o)), r < v && !c) continue;
+ else if (!c && (c = !0, t > 0)) {
+ t -= 2;
+ continue
+ }
+ if (r > a && !l) l = !0;
+ else if (r > a && l) continue;
+ (i.dataPoints[t].label && (n.axisX.labels[r] = i.dataPoints[t].label), r < u.viewPortMin && (u.viewPortMin = r), r > u.viewPortMax && (u.viewPortMax = r), f !== null) && (f < e.viewPortMin && (e.viewPortMin = f), f > e.viewPortMax && (e.viewPortMax = f))
+ }
+ this.plotInfo.axisXValueType = i.xValueType = h ? "dateTime" : "number"
+ }
+ }
+ };
+ t.prototype._processStackedPlotUnit = function(n) {
+ var l, w, p, s, r;
+ if (n.dataSeriesIndexes && !(n.dataSeriesIndexes.length < 1)) {
+ var u = n.axisY.dataInfo,
+ e = n.axisX.dataInfo,
+ i, o, a = !1,
+ h = [],
+ c = [];
+ for (l = 0; l < n.dataSeriesIndexes.length; l++) {
+ var f = this.data[n.dataSeriesIndexes[l]],
+ t = 0,
+ v = !1,
+ y = !1;
+ for ((f.axisPlacement === "normal" || f.axisPlacement === "xySwapped") && (w = this.sessionVariables.axisX.internalMinimum ? this.sessionVariables.axisX.internalMinimum : this._options.axisX && this._options.axisX.minimum ? this._options.axisX.minimum : -Infinity, p = this.sessionVariables.axisX.internalMaximum ? this.sessionVariables.axisX.internalMaximum : this._options.axisX && this._options.axisX.maximum ? this._options.axisX.maximum : Infinity), (f.dataPoints[t].x && f.dataPoints[t].x.getTime || f.xValueType === "dateTime") && (a = !0), t = 0; t < f.dataPoints.length; t++) {
+ if (typeof f.dataPoints[t].x == "undefined" && (f.dataPoints[t].x = t), f.dataPoints[t].x.getTime ? (a = !0, i = f.dataPoints[t].x.getTime()) : i = f.dataPoints[t].x, o = f.dataPoints[t].y, i < e.min && (e.min = i), i > e.max && (e.max = i), t > 0 && (s = i - f.dataPoints[t - 1].x, s < 0 && (s = s * -1), e.minDiff > s && s !== 0 && (e.minDiff = s)), i < w && !v) continue;
+ else if (!v && (v = !0, t > 0)) {
+ t -= 2;
+ continue
+ }
+ if (i > p && !y) y = !0;
+ else if (i > p && y) continue;
+ (f.dataPoints[t].label && (n.axisX.labels[i] = f.dataPoints[t].label), i < e.viewPortMin && (e.viewPortMin = i), i > e.viewPortMax && (e.viewPortMax = i), o !== null) && (n.yTotals[i] = (n.yTotals[i] ? n.yTotals[i] : 0) + Math.abs(o), o >= 0 ? h[i] ? h[i] += o : h[i] = o : c[i] ? c[i] += o : c[i] = o)
+ }
+ this.plotInfo.axisXValueType = f.xValueType = a ? "dateTime" : "number"
+ }
+ for (t in h) isNaN(t) || (r = h[t], r < u.min && (u.min = r), r > u.max && (u.max = r), t < e.viewPortMin || t > e.viewPortMax) || (r < u.viewPortMin && (u.viewPortMin = r), r > u.viewPortMax && (u.viewPortMax = r));
+ for (t in c) isNaN(t) || (r = c[t], r < u.min && (u.min = r), r > u.max && (u.max = r), t < e.viewPortMin || t > e.viewPortMax) || (r < u.viewPortMin && (u.viewPortMin = r), r > u.viewPortMax && (u.viewPortMax = r))
+ }
+ };
+ t.prototype._processStacked100PlotUnit = function(n) {
+ var l, w, p, e;
+ if (n.dataSeriesIndexes && !(n.dataSeriesIndexes.length < 1)) {
+ var u = n.axisY.dataInfo,
+ f = n.axisX.dataInfo,
+ t, o, a = !1,
+ s = !1,
+ h = !1,
+ c = [];
+ for (l = 0; l < n.dataSeriesIndexes.length; l++) {
+ var r = this.data[n.dataSeriesIndexes[l]],
+ i = 0,
+ v = !1,
+ y = !1;
+ for ((r.axisPlacement === "normal" || r.axisPlacement === "xySwapped") && (w = this.sessionVariables.axisX.internalMinimum ? this.sessionVariables.axisX.internalMinimum : this._options.axisX && this._options.axisX.minimum ? this._options.axisX.minimum : -Infinity, p = this.sessionVariables.axisX.internalMaximum ? this.sessionVariables.axisX.internalMaximum : this._options.axisX && this._options.axisX.maximum ? this._options.axisX.maximum : Infinity), (r.dataPoints[i].x && r.dataPoints[i].x.getTime || r.xValueType === "dateTime") && (a = !0), i = 0; i < r.dataPoints.length; i++) {
+ if (typeof r.dataPoints[i].x == "undefined" && (r.dataPoints[i].x = i), r.dataPoints[i].x.getTime ? (a = !0, t = r.dataPoints[i].x.getTime()) : t = r.dataPoints[i].x, o = r.dataPoints[i].y, t < f.min && (f.min = t), t > f.max && (f.max = t), i > 0 && (e = t - r.dataPoints[i - 1].x, e < 0 && (e = e * -1), f.minDiff > e && e !== 0 && (f.minDiff = e)), t < w && !v) continue;
+ else if (!v && (v = !0, i > 0)) {
+ i -= 2;
+ continue
+ }
+ if (t > p && !y) y = !0;
+ else if (t > p && y) continue;
+ (r.dataPoints[i].label && (n.axisX.labels[t] = r.dataPoints[i].label), t < f.viewPortMin && (f.viewPortMin = t), t > f.viewPortMax && (f.viewPortMax = t), o !== null) && (n.yTotals[t] = (n.yTotals[t] ? n.yTotals[t] : 0) + Math.abs(o), o >= 0 ? s = !0 : h = !0, c[t] ? c[t] += Math.abs(o) : c[t] = Math.abs(o))
+ }
+ this.plotInfo.axisXValueType = r.xValueType = a ? "dateTime" : "number"
+ }
+ s && !h ? (u.max = 99, u.min = 1) : s && h ? (u.max = 99, u.min = -99) : !s && h && (u.max = -1, u.min = -99);
+ u.viewPortMin = u.min;
+ u.viewPortMax = u.max;
+ n.dataPointYSums = c
+ }
+ };
+ t.prototype._processMultiYPlotUnit = function(n) {
+ var c, p, y, e;
+ if (n.dataSeriesIndexes && !(n.dataSeriesIndexes.length < 1)) {
+ var f = n.axisY.dataInfo,
+ u = n.axisX.dataInfo,
+ r, o, s, h, l = !1;
+ for (c = 0; c < n.dataSeriesIndexes.length; c++) {
+ var i = this.data[n.dataSeriesIndexes[c]],
+ t = 0,
+ a = !1,
+ v = !1;
+ for ((i.axisPlacement === "normal" || i.axisPlacement === "xySwapped") && (p = this.sessionVariables.axisX.internalMinimum ? this.sessionVariables.axisX.internalMinimum : this._options.axisX && this._options.axisX.minimum ? this._options.axisX.minimum : -Infinity, y = this.sessionVariables.axisX.internalMaximum ? this.sessionVariables.axisX.internalMaximum : this._options.axisX && this._options.axisX.maximum ? this._options.axisX.maximum : Infinity), (i.dataPoints[t].x && i.dataPoints[t].x.getTime || i.xValueType === "dateTime") && (l = !0), t = 0; t < i.dataPoints.length; t++) {
+ if (typeof i.dataPoints[t].x == "undefined" && (i.dataPoints[t].x = t), i.dataPoints[t].x.getTime ? (l = !0, r = i.dataPoints[t].x.getTime()) : r = i.dataPoints[t].x, o = i.dataPoints[t].y, o && o.length && (s = Math.min.apply(null, o), h = Math.max.apply(null, o)), r < u.min && (u.min = r), r > u.max && (u.max = r), s < f.min && (f.min = s), h > f.max && (f.max = h), t > 0 && (e = r - i.dataPoints[t - 1].x, e < 0 && (e = e * -1), u.minDiff > e && e !== 0 && (u.minDiff = e)), r < p && !a) continue;
+ else if (!a && (a = !0, t > 0)) {
+ t -= 2;
+ continue
+ }
+ if (r > y && !v) v = !0;
+ else if (r > y && v) continue;
+ (i.dataPoints[t].label && (n.axisX.labels[r] = i.dataPoints[t].label), r < u.viewPortMin && (u.viewPortMin = r), r > u.viewPortMax && (u.viewPortMax = r), o !== null) && (s < f.viewPortMin && (f.viewPortMin = s), h > f.viewPortMax && (f.viewPortMax = h))
+ }
+ this.plotInfo.axisXValueType = i.xValueType = l ? "dateTime" : "number"
+ }
+ }
+ };
+ t.prototype.getDataPointAtXY = function(n, t, i) {
+ var u, e, h, o, f, s, r, c;
+ for (i = i || !1, u = [], e = this._dataInRenderedOrder.length - 1; e >= 0; e--) h = this._dataInRenderedOrder[e], o = null, o = h.getDataPointAtXY(n, t, i), o && u.push(o);
+ for (f = null, s = !1, r = 0; r < u.length; r++)
+ if ((u[r].dataSeries.type === "line" || u[r].dataSeries.type === "stepLine" || u[r].dataSeries.type === "area" || u[r].dataSeries.type === "stepArea") && (c = p("markerSize", u[r].dataPoint, u[r].dataSeries) || 8, u[r].distance <= c / 2)) {
+ s = !0;
+ break
+ } for (r = 0; r < u.length; r++) s && u[r].dataSeries.type !== "line" && u[r].dataSeries.type !== "stepLine" && u[r].dataSeries.type !== "area" && u[r].dataSeries.type !== "stepArea" || (f ? u[r].distance <= f.distance && (f = u[r]) : f = u[r]);
+ return f
+ };
+ t.prototype.getObjectAtXY = function(t, i, r) {
+ var f, e, o, u;
+ if (r = r || !1, f = null, e = this.getDataPointAtXY(t, i, r), e) f = e.dataSeries.dataPointIds[e.dataPointIndex];
+ else if (n) f = ci(t, i, this._eventManager.ghostCtx);
+ else
+ for (o = 0; o < this.legend.items.length; o++) u = this.legend.items[o], t >= u.x1 && t <= u.x2 && i >= u.y1 && i <= u.y2 && (f = u.id);
+ return f
+ };
+ t.prototype.getAutoFontSize = function(n, t, i) {
+ t = t || this.width;
+ i = i || this.height;
+ var r = n / 400;
+ return Math.round(Math.min(this.width, this.height) * r)
+ };
+ t.prototype.resetOverlayedCanvas = function() {
+ this.overlaidCanvasCtx.clearRect(0, 0, this.width, this.height)
+ };
+ t.prototype.clearCanvas = function() {
+ this.ctx.clearRect(0, 0, this.width, this.height);
+ this.backgroundColor && (this.ctx.fillStyle = this.backgroundColor, this.ctx.fillRect(0, 0, this.width, this.height))
+ };
+ t.prototype.attachEvent = function(n) {
+ this._events.push(n)
+ };
+ t.prototype._touchEventHandler = function(n) {
+ var f, e, h, o;
+ if (n.changedTouches && this.interactivityEnabled) {
+ var i = [],
+ u = n.changedTouches,
+ t = u ? u[0] : n,
+ r = null;
+ switch (n.type) {
+ case "touchstart":
+ case "MSPointerDown":
+ i = ["mousemove", "mousedown"];
+ this._lastTouchData = wt(t);
+ this._lastTouchData.time = new Date;
+ break;
+ case "touchmove":
+ case "MSPointerMove":
+ i = ["mousemove"];
+ break;
+ case "touchend":
+ case "MSPointerUp":
+ i = this._lastTouchEventType === "touchstart" || this._lastTouchEventType === "MSPointerDown" ? ["mouseup", "click"] : ["mouseup"];
+ break;
+ default:
+ return
+ }
+ if (!u || !(u.length > 1)) {
+ r = wt(t);
+ r.time = new Date;
+ try {
+ var s = r.y - this._lastTouchData.y,
+ l = r.x - this._lastTouchData.x,
+ c = r.time - this._lastTouchData.time;
+ Math.abs(s) > 15 && (!!this._lastTouchData.scroll || c < 200) && (this._lastTouchData.scroll = !0, f = window.parent || window, f && f.scrollBy && f.scrollBy(0, -s))
+ } catch (a) {}
+ if (this._lastTouchEventType = n.type, !!this._lastTouchData.scroll && this.zoomEnabled) {
+ this.isDrag && this.resetOverlayedCanvas();
+ this.isDrag = !1;
+ return
+ }
+ for (e = 0; e < i.length; e++) h = i[e], o = document.createEvent("MouseEvent"), o.initMouseEvent(h, !0, !0, window, 1, t.screenX, t.screenY, t.clientX, t.clientY, !1, !1, !1, !1, 0, null), t.target.dispatchEvent(o), n.preventManipulation && n.preventManipulation(), n.preventDefault && n.preventDefault()
+ }
+ }
+ };
+ t.prototype._mouseEventHandler = function(n) {
+ var r, u, i, s, h, f, e, o;
+ if (this.interactivityEnabled) {
+ if (this._ignoreNextEvent) {
+ this._ignoreNextEvent = !1;
+ return
+ }
+ if (n.preventManipulation && n.preventManipulation(), n.preventDefault && n.preventDefault(), typeof n.target == "undefined" && n.srcElement && (n.target = n.srcElement), r = wt(n), u = n.type, n || (h = window.event), n.which ? s = n.which == 3 : n.button && (s = n.button == 2), yt && window.console && (window.console.log(u + " --> x: " + r.x + "; y:" + r.y), s && window.console.log(n.which), u === "mouseup" && window.console.log("mouseup")), !s) {
+ if (t.capturedEventParam) i = t.capturedEventParam, u === "mouseup" && (t.capturedEventParam = null, i.chart.overlaidCanvas.releaseCapture ? i.chart.overlaidCanvas.releaseCapture() : document.body.removeEventListener("mouseup", i.chart._mouseEventHandler, !1)), i.hasOwnProperty(u) && i[u].call(i.context, r.x, r.y);
+ else if (this._events) {
+ for (f = 0; f < this._events.length; f++)
+ if (this._events[f].hasOwnProperty(u))
+ if (i = this._events[f], e = i.bounds, r.x >= e.x1 && r.x <= e.x2 && r.y >= e.y1 && r.y <= e.y2) {
+ i[u].call(i.context, r.x, r.y);
+ u === "mousedown" && i.capture === !0 ? (t.capturedEventParam = i, this.overlaidCanvas.setCapture ? this.overlaidCanvas.setCapture() : document.body.addEventListener("mouseup", this._mouseEventHandler, !1)) : u === "mouseup" && (i.chart.overlaidCanvas.releaseCapture ? i.chart.overlaidCanvas.releaseCapture() : document.body.removeEventListener("mouseup", this._mouseEventHandler, !1));
+ break
+ } else i = null;
+ n.target.style.cursor = i && i.cursor ? i.cursor : this._defaultCursor
+ }
+ this._toolTip && this._toolTip.enabled && (o = this.plotArea, (r.x < o.x1 || r.x > o.x2 || r.y < o.y1 || r.y > o.y2) && this._toolTip.hide());
+ this.isDrag && this.zoomEnabled || !this._eventManager || this._eventManager.mouseEventHandler(n)
+ }
+ }
+ };
+ t.prototype._plotAreaMouseDown = function(n, t) {
+ this.isDrag = !0;
+ this.dragStartPoint = this.plotInfo.axisPlacement !== "none" ? {
+ x: n,
+ y: t,
+ xMinimum: this.axisX.minimum,
+ xMaximum: this.axisX.maximum
+ } : {
+ x: n,
+ y: t
+ }
+ };
+ t.prototype._plotAreaMouseUp = function(n, t) {
+ var s, e, r;
+ if ((this.plotInfo.axisPlacement === "normal" || this.plotInfo.axisPlacement === "xySwapped") && this.isDrag) {
+ var o = 0,
+ h = 0,
+ i = this.axisX.lineCoordinates;
+ if (this.plotInfo.axisPlacement === "xySwapped" ? (o = t - this.dragStartPoint.y, h = Math.abs(this.axisX.maximum - this.axisX.minimum) / i.height * o) : (o = this.dragStartPoint.x - n, h = Math.abs(this.axisX.maximum - this.axisX.minimum) / i.width * o), Math.abs(o) > 2) {
+ if (this.panEnabled) s = !1, e = 0, this.axisX.sessionVariables.internalMinimum < this.axisX._absoluteMinimum ? (e = this.axisX._absoluteMinimum - this.axisX.sessionVariables.internalMinimum, this.axisX.sessionVariables.internalMinimum += e, this.axisX.sessionVariables.internalMaximum += e, s = !0) : this.axisX.sessionVariables.internalMaximum > this.axisX._absoluteMaximum && (e = this.axisX.sessionVariables.internalMaximum - this.axisX._absoluteMaximum, this.axisX.sessionVariables.internalMaximum -= e, this.axisX.sessionVariables.internalMinimum -= e, s = !0), s && this.render();
+ else if (this.zoomEnabled) {
+ if (this.resetOverlayedCanvas(), !this.dragStartPoint) return;
+ if (this.plotInfo.axisPlacement === "xySwapped") {
+ if (r = {
+ y1: Math.min(this.dragStartPoint.y, t),
+ y2: Math.max(this.dragStartPoint.y, t)
+ }, Math.abs(r.y1 - r.y2) > 1) {
+ var i = this.axisX.lineCoordinates,
+ u = this.axisX.maximum - (this.axisX.maximum - this.axisX.minimum) / i.height * (r.y2 - i.y1),
+ f = this.axisX.maximum - (this.axisX.maximum - this.axisX.minimum) / i.height * (r.y1 - i.y1);
+ u = Math.max(u, this.axisX.dataInfo.min);
+ f = Math.min(f, this.axisX.dataInfo.max);
+ Math.abs(f - u) > 2 * Math.abs(this.axisX.dataInfo.minDiff) && (this.axisX.sessionVariables.internalMinimum = u, this.axisX.sessionVariables.internalMaximum = f, this.render())
+ }
+ } else if (this.plotInfo.axisPlacement === "normal" && (r = {
+ x1: Math.min(this.dragStartPoint.x, n),
+ x2: Math.max(this.dragStartPoint.x, n)
+ }, Math.abs(r.x1 - r.x2) > 1)) {
+ var i = this.axisX.lineCoordinates,
+ u = (this.axisX.maximum - this.axisX.minimum) / i.width * (r.x1 - i.x1) + this.axisX.minimum,
+ f = (this.axisX.maximum - this.axisX.minimum) / i.width * (r.x2 - i.x1) + this.axisX.minimum;
+ u = Math.max(u, this.axisX.dataInfo.min);
+ f = Math.min(f, this.axisX.dataInfo.max);
+ Math.abs(f - u) > 2 * Math.abs(this.axisX.dataInfo.minDiff) && (this.axisX.sessionVariables.internalMinimum = u, this.axisX.sessionVariables.internalMaximum = f, this.render())
+ }
+ }
+ this._ignoreNextEvent = !0;
+ this.zoomEnabled && this._zoomButton.style.display === "none" && (ui(this._zoomButton, this._resetButton), b(this, this._zoomButton, "pan"), b(this, this._resetButton, "reset"))
+ }
+ }
+ this.isDrag = !1
+ };
+ t.prototype._plotAreaMouseMove = function(n, t) {
+ var r, o, u, s;
+ if (this.isDrag && this.plotInfo.axisPlacement !== "none") {
+ var i = 0,
+ f = 0,
+ e = this.axisX.lineCoordinates;
+ this.plotInfo.axisPlacement === "xySwapped" ? (i = t - this.dragStartPoint.y, f = Math.abs(this.axisX.maximum - this.axisX.minimum) / e.height * i) : (i = this.dragStartPoint.x - n, f = Math.abs(this.axisX.maximum - this.axisX.minimum) / e.width * i);
+ Math.abs(i) > 2 && Math.abs(i) < 8 && (this.panEnabled || this.zoomEnabled) ? this._toolTip.hide() : this.panEnabled || this.zoomEnabled || this._toolTip.mouseMoveHandler(n, t);
+ Math.abs(i) > 2 && (this.panEnabled || this.zoomEnabled) && (this.panEnabled ? (this.axisX.sessionVariables.internalMinimum = this.dragStartPoint.xMinimum + f, this.axisX.sessionVariables.internalMaximum = this.dragStartPoint.xMaximum + f, r = 0, this.axisX.sessionVariables.internalMinimum < this.axisX._absoluteMinimum - st(this.axisX.interval, this.axisX.intervalType) ? (r = this.axisX._absoluteMinimum - st(this.axisX.interval, this.axisX.intervalType) - this.axisX.sessionVariables.internalMinimum, this.axisX.sessionVariables.internalMinimum += r, this.axisX.sessionVariables.internalMaximum += r) : this.axisX.sessionVariables.internalMaximum > this.axisX._absoluteMaximum + st(this.axisX.interval, this.axisX.intervalType) && (r = this.axisX.sessionVariables.internalMaximum - (this.axisX._absoluteMaximum + st(this.axisX.interval, this.axisX.intervalType)), this.axisX.sessionVariables.internalMaximum -= r, this.axisX.sessionVariables.internalMinimum -= r), o = this, clearTimeout(this._panTimerId), this._panTimerId = setTimeout(function() {
+ o.render()
+ }, 0)) : this.zoomEnabled && (u = this.plotArea, this.resetOverlayedCanvas(), s = this.overlaidCanvasCtx.globalAlpha, this.overlaidCanvasCtx.globalAlpha = .7, this.overlaidCanvasCtx.fillStyle = "#A0ABB8", this.plotInfo.axisPlacement === "xySwapped" ? this.overlaidCanvasCtx.fillRect(u.x1, this.dragStartPoint.y, u.x2 - u.x1, t - this.dragStartPoint.y) : this.plotInfo.axisPlacement === "normal" && this.overlaidCanvasCtx.fillRect(this.dragStartPoint.x, u.y1, n - this.dragStartPoint.x, u.y2 - u.y1), this.overlaidCanvasCtx.globalAlpha = s))
+ } else this._toolTip.mouseMoveHandler(n, t)
+ };
+ t.prototype.preparePlotArea = function() {
+ var t = this.plotArea,
+ i = this.axisY ? this.axisY : this.axisY2,
+ r;
+ !n && (t.x1 > 0 || t.y1 > 0) && t.ctx.translate(t.x1, t.y1);
+ this.axisX && i ? (t.x1 = this.axisX.lineCoordinates.x1 < this.axisX.lineCoordinates.x2 ? this.axisX.lineCoordinates.x1 : i.lineCoordinates.x1, t.y1 = this.axisX.lineCoordinates.y1 < i.lineCoordinates.y1 ? this.axisX.lineCoordinates.y1 : i.lineCoordinates.y1, t.x2 = this.axisX.lineCoordinates.x2 > i.lineCoordinates.x2 ? this.axisX.lineCoordinates.x2 : i.lineCoordinates.x2, t.y2 = this.axisX.lineCoordinates.y2 > this.axisX.lineCoordinates.y1 ? this.axisX.lineCoordinates.y2 : i.lineCoordinates.y2, t.width = t.x2 - t.x1, t.height = t.y2 - t.y1) : (r = this.layoutManager.getFreeSpace(), t.x1 = r.x1, t.x2 = r.x2, t.y1 = r.y1, t.y2 = r.y2, t.width = r.width, t.height = r.height);
+ n || (t.canvas.width = t.width, t.canvas.height = t.height, t.canvas.style.left = t.x1 + "px", t.canvas.style.top = t.y1 + "px", (t.x1 > 0 || t.y1 > 0) && t.ctx.translate(-t.x1, -t.y1));
+ t.layoutManager = new ft(t.x1, t.y1, t.x2, t.y2, 2)
+ };
+ t.prototype.getPixelCoordinatesOnPlotArea = function(n, t) {
+ return {
+ x: this.axisX.getPixelCoordinatesOnAxis(n).x,
+ y: this.axisY.getPixelCoordinatesOnAxis(t).y
+ }
+ };
+ t.prototype.renderIndexLabels = function(n) {
+ for (var nt, ot = n || this.plotArea.ctx, u = this.plotArea, y = 0, w = 0, b = 0, d = 0, g = 0, h = 0, f = 0, l = 0, e = 0, it = 0; it < this._indexLabels.length; it++) {
+ var t = this._indexLabels[it],
+ i = t.chartType.toLowerCase(),
+ a, o, wt, ct = p("indexLabelFontColor", t.dataPoint, t.dataSeries),
+ rt = p("indexLabelFontSize", t.dataPoint, t.dataSeries),
+ lt = p("indexLabelFontFamily", t.dataPoint, t.dataSeries),
+ at = p("indexLabelFontStyle", t.dataPoint, t.dataSeries),
+ vt = p("indexLabelFontWeight", t.dataPoint, t.dataSeries),
+ yt = p("indexLabelBackgroundColor", t.dataPoint, t.dataSeries),
+ st = p("indexLabelMaxWidth", t.dataPoint, t.dataSeries),
+ pt = p("indexLabelWrap", t.dataPoint, t.dataSeries),
+ ut = {
+ percent: null,
+ total: null
+ },
+ ft = null;
+ if ((t.dataSeries.type.indexOf("stacked") >= 0 || t.dataSeries.type === "pie" || t.dataSeries.type === "doughnut") && (ut = this.getPercentAndTotal(t.dataSeries, t.dataPoint)), (t.dataSeries.indexLabelFormatter || t.dataPoint.indexLabelFormatter) && (ft = {
+ chart: this._options,
+ dataSeries: t.dataSeries,
+ dataPoint: t.dataPoint,
+ index: t.indexKeyword,
+ total: ut.total,
+ percent: ut.percent
+ }), nt = t.dataPoint.indexLabelFormatter ? t.dataPoint.indexLabelFormatter(ft) : t.dataPoint.indexLabel ? this.replaceKeywordsWithValue(t.dataPoint.indexLabel, t.dataPoint, t.dataSeries, null, t.indexKeyword) : t.dataSeries.indexLabelFormatter ? t.dataSeries.indexLabelFormatter(ft) : t.dataSeries.indexLabel ? this.replaceKeywordsWithValue(t.dataSeries.indexLabel, t.dataPoint, t.dataSeries, null, t.indexKeyword) : null, nt !== null && nt !== "") {
+ var s = p("indexLabelPlacement", t.dataPoint, t.dataSeries),
+ et = p("indexLabelOrientation", t.dataPoint, t.dataSeries),
+ wt = 0,
+ k = t.direction,
+ tt = t.dataSeries.axisX,
+ ht = t.dataSeries.axisY,
+ v = new c(ot, {
+ x: 0,
+ y: 0,
+ maxWidth: st ? st : this.width * .5,
+ maxHeight: pt ? rt * 5 : rt * 1.5,
+ angle: et === "horizontal" ? 0 : -90,
+ text: nt,
+ padding: 0,
+ backgroundColor: yt,
+ horizontalAlign: "left",
+ fontSize: rt,
+ fontFamily: lt,
+ fontWeight: vt,
+ fontColor: ct,
+ fontStyle: at,
+ textBaseline: "top"
+ }),
+ bt = v.measureText();
+ if (i.indexOf("line") >= 0 || i.indexOf("area") >= 0 || i.indexOf("bubble") >= 0 || i.indexOf("scatter") >= 0) {
+ if (t.dataPoint.x < tt.minimum || t.dataPoint.x > tt.maximum || t.dataPoint.y < ht.minimum || t.dataPoint.y > ht.maximum) continue
+ } else if (t.dataPoint.x < tt.minimum || t.dataPoint.x > tt.maximum) continue;
+ f = 2;
+ h = 2;
+ et === "horizontal" ? (l = v.width, e = v.height) : (e = v.width, l = v.height);
+ this.plotInfo.axisPlacement === "normal" ? (i.indexOf("line") >= 0 || i.indexOf("area") >= 0 ? (s = "auto", f = 4) : i.indexOf("stacked") >= 0 ? s === "auto" && (s = "inside") : (i === "bubble" || i === "scatter") && (s = "inside"), a = t.point.x - l / 2, s !== "inside" ? (w = u.y1, b = u.y2, k > 0 ? (o = t.point.y - e - f, o < w && (o = s === "auto" ? Math.max(t.point.y, w) + f : w + f)) : (o = t.point.y + f, o > b - e - f && (o = s === "auto" ? Math.min(t.point.y, b) - e - f : b - e - f))) : (w = Math.max(t.bounds.y1, u.y1), b = Math.min(t.bounds.y2, u.y2), y = i.indexOf("range") >= 0 ? k > 0 ? Math.max(t.bounds.y1, u.y1) + e / 2 + f : Math.min(t.bounds.y2, u.y2) - e / 2 - f : (Math.max(t.bounds.y1, u.y1) + Math.min(t.bounds.y2, u.y2)) / 2, k > 0 ? (o = Math.max(t.point.y, y) - e / 2, o < w && (i === "bubble" || i === "scatter") && (o = Math.max(t.point.y - e - f, u.y1 + f))) : (o = Math.min(t.point.y, y) - e / 2, o > b - e - f && (i === "bubble" || i === "scatter") && (o = Math.min(t.point.y + f, u.y2 - e - f))))) : (i.indexOf("line") >= 0 || i.indexOf("area") >= 0 || i.indexOf("scatter") >= 0 ? (s = "auto", h = 4) : i.indexOf("stacked") >= 0 ? s === "auto" && (s = "inside") : i === "bubble" && (s = "inside"), o = t.point.y - e / 2, s !== "inside" ? (d = u.x1, g = u.x2, k < 0 ? (a = t.point.x - l - h, a < d && (a = s === "auto" ? Math.max(t.point.x, d) + h : d + h)) : (a = t.point.x + h, a > g - l - h && (a = s === "auto" ? Math.min(t.point.x, g) - l - h : g - l - h))) : (d = Math.max(t.bounds.x1, u.x1), g = Math.min(t.bounds.x2, u.x2), y = i.indexOf("range") >= 0 ? k < 0 ? Math.max(t.bounds.x1, u.x1) + l / 2 + h : Math.min(t.bounds.x2, u.x2) - l / 2 - h : (Math.max(t.bounds.x1, u.x1) + Math.min(t.bounds.x2, u.x2)) / 2, a = k < 0 ? Math.max(t.point.x, y) - l / 2 : Math.min(t.point.x, y) - l / 2));
+ et === "vertical" && (o += e);
+ v.x = a;
+ v.y = o;
+ v.render(!0)
+ }
+ }
+ return {
+ source: ot,
+ dest: this.plotArea.ctx,
+ animationCallback: r.fadeInAnimation,
+ easingFunction: r.easing.easeInQuad,
+ animationBase: 0,
+ startTimePercent: .7
+ }
+ };
+ t.prototype.renderLine = function(t) {
+ var i = t.targetCanvasCtx || this.plotArea.ctx,
+ et = t.dataSeriesIndexes.length,
+ o, l, p, w, b, e, s, nt, ut, ft, tt, it, f, h, c, k, d, g, v, rt;
+ if (!(et <= 0)) {
+ for (o = this._eventManager.ghostCtx, i.save(), l = this.plotArea, i.beginPath(), i.rect(l.x1, l.y1, l.width, l.height), i.clip(), p = [], w = 0; w < t.dataSeriesIndexes.length; w++)
+ if (b = t.dataSeriesIndexes[w], e = this.data[b], i.lineWidth = e.lineThickness, s = e.dataPoints, i.setLineDash && i.setLineDash(y(e.lineDashType, e.lineThickness)), nt = e.id, this._eventManager.objectMap[nt] = {
+ objectType: "dataSeries",
+ dataSeriesIndex: b
+ }, ut = u(nt), o.strokeStyle = ut, o.lineWidth = e.lineThickness > 0 ? Math.max(e.lineThickness, 4) : 0, ft = e._colorSet, tt = ft[0], i.strokeStyle = tt, it = !0, f = 0, i.beginPath(), s.length > 0) {
+ for (d = !1, f = 0; f < s.length; f++)
+ if (k = s[f].x.getTime ? s[f].x.getTime() : s[f].x, !(k < t.axisX.dataInfo.viewPortMin) && !(k > t.axisX.dataInfo.viewPortMax)) {
+ if (typeof s[f].y != "number") {
+ f > 0 && (i.stroke(), n && o.stroke());
+ d = !0;
+ continue
+ }
+ h = t.axisX.conversionParameters.reference + t.axisX.conversionParameters.pixelPerUnit * (k - t.axisX.conversionParameters.minimum) + .5 << 0;
+ c = t.axisY.conversionParameters.reference + t.axisY.conversionParameters.pixelPerUnit * (s[f].y - t.axisY.conversionParameters.minimum) + .5 << 0;
+ g = e.dataPointIds[f];
+ this._eventManager.objectMap[g] = {
+ id: g,
+ objectType: "dataPoint",
+ dataSeriesIndex: b,
+ dataPointIndex: f,
+ x1: h,
+ y1: c
+ };
+ it || d ? (i.beginPath(), i.moveTo(h, c), n && (o.beginPath(), o.moveTo(h, c)), it = !1, d = !1) : (i.lineTo(h, c), n && o.lineTo(h, c), f % 500 == 0 && (i.stroke(), i.beginPath(), i.moveTo(h, c), n && (o.stroke(), o.beginPath(), o.moveTo(h, c))));
+ (s[f].markerSize > 0 || e.markerSize > 0) && (v = e.getMarkerProperties(f, h, c, i), p.push(v), rt = u(g), n && p.push({
+ x: h,
+ y: c,
+ ctx: o,
+ type: v.type,
+ size: v.size,
+ color: rt,
+ borderColor: rt,
+ borderThickness: v.borderThickness
+ }));
+ (s[f].indexLabel || e.indexLabel || s[f].indexLabelFormatter || e.indexLabelFormatter) && this._indexLabels.push({
+ chartType: "line",
+ dataPoint: s[f],
+ dataSeries: e,
+ point: {
+ x: h,
+ y: c
+ },
+ direction: s[f].y >= 0 ? 1 : -1,
+ color: tt
+ })
+ } i.stroke();
+ n && o.stroke()
+ } return a.drawMarkers(p), i.restore(), i.beginPath(), n && o.beginPath(), {
+ source: i,
+ dest: this.plotArea.ctx,
+ animationCallback: r.xClipAnimation,
+ easingFunction: r.easing.linear,
+ animationBase: 0
+ }
+ }
+ };
+ t.prototype.renderStepLine = function(t) {
+ var i = t.targetCanvasCtx || this.plotArea.ctx,
+ ot = t.dataSeriesIndexes.length,
+ o, l, p, w, b, e, s, nt, ft, et, tt, it, f, h, c, k, d, rt, g, v, ut;
+ if (!(ot <= 0)) {
+ for (o = this._eventManager.ghostCtx, i.save(), l = this.plotArea, i.beginPath(), i.rect(l.x1, l.y1, l.width, l.height), i.clip(), p = [], w = 0; w < t.dataSeriesIndexes.length; w++)
+ if (b = t.dataSeriesIndexes[w], e = this.data[b], i.lineWidth = e.lineThickness, s = e.dataPoints, i.setLineDash && i.setLineDash(y(e.lineDashType, e.lineThickness)), nt = e.id, this._eventManager.objectMap[nt] = {
+ objectType: "dataSeries",
+ dataSeriesIndex: b
+ }, ft = u(nt), o.strokeStyle = ft, o.lineWidth = e.lineThickness > 0 ? Math.max(e.lineThickness, 4) : 0, et = e._colorSet, tt = et[0], i.strokeStyle = tt, it = !0, f = 0, i.beginPath(), s.length > 0) {
+ for (d = !1, f = 0; f < s.length; f++)
+ if (k = s[f].getTime ? s[f].x.getTime() : s[f].x, !(k < t.axisX.dataInfo.viewPortMin) && !(k > t.axisX.dataInfo.viewPortMax)) {
+ if (typeof s[f].y != "number") {
+ f > 0 && (i.stroke(), n && o.stroke());
+ d = !0;
+ continue
+ }
+ rt = c;
+ h = t.axisX.conversionParameters.reference + t.axisX.conversionParameters.pixelPerUnit * (k - t.axisX.conversionParameters.minimum) + .5 << 0;
+ c = t.axisY.conversionParameters.reference + t.axisY.conversionParameters.pixelPerUnit * (s[f].y - t.axisY.conversionParameters.minimum) + .5 << 0;
+ g = e.dataPointIds[f];
+ this._eventManager.objectMap[g] = {
+ id: g,
+ objectType: "dataPoint",
+ dataSeriesIndex: b,
+ dataPointIndex: f,
+ x1: h,
+ y1: c
+ };
+ it || d ? (i.beginPath(), i.moveTo(h, c), n && (o.beginPath(), o.moveTo(h, c)), it = !1, d = !1) : (i.lineTo(h, rt), n && o.lineTo(h, rt), i.lineTo(h, c), n && o.lineTo(h, c), f % 500 == 0 && (i.stroke(), i.beginPath(), i.moveTo(h, c), n && (o.stroke(), o.beginPath(), o.moveTo(h, c))));
+ (s[f].markerSize > 0 || e.markerSize > 0) && (v = e.getMarkerProperties(f, h, c, i), p.push(v), ut = u(g), n && p.push({
+ x: h,
+ y: c,
+ ctx: o,
+ type: v.type,
+ size: v.size,
+ color: ut,
+ borderColor: ut,
+ borderThickness: v.borderThickness
+ }));
+ (s[f].indexLabel || e.indexLabel || s[f].indexLabelFormatter || e.indexLabelFormatter) && this._indexLabels.push({
+ chartType: "stepLine",
+ dataPoint: s[f],
+ dataSeries: e,
+ point: {
+ x: h,
+ y: c
+ },
+ direction: s[f].y >= 0 ? 1 : -1,
+ color: tt
+ })
+ } i.stroke();
+ n && o.stroke()
+ } return a.drawMarkers(p), i.restore(), i.beginPath(), n && o.beginPath(), {
+ source: i,
+ dest: this.plotArea.ctx,
+ animationCallback: r.xClipAnimation,
+ easingFunction: r.easing.linear,
+ animationBase: 0
+ }
+ }
+ };
+ t.prototype.renderSpline = function(t) {
+ function ft(t) {
+ var r = kt(t, 2),
+ u;
+ if (r.length > 0) {
+ for (i.beginPath(), n && s.beginPath(), i.moveTo(r[0].x, r[0].y), n && s.moveTo(r[0].x, r[0].y), u = 0; u < r.length - 3; u += 3) i.bezierCurveTo(r[u + 1].x, r[u + 1].y, r[u + 2].x, r[u + 2].y, r[u + 3].x, r[u + 3].y), n && s.bezierCurveTo(r[u + 1].x, r[u + 1].y, r[u + 2].x, r[u + 2].y, r[u + 3].x, r[u + 3].y), u > 0 && u % 3e3 == 0 && (i.stroke(), i.beginPath(), i.moveTo(r[u + 3].x, r[u + 3].y), n && (s.stroke(), s.beginPath(), s.moveTo(r[u + 3].x, r[u + 3].y)));
+ i.stroke();
+ n && s.stroke()
+ }
+ }
+ var i = t.targetCanvasCtx || this.plotArea.ctx,
+ et = t.dataSeriesIndexes.length,
+ s, l, w, b, k, e, o, nt, rt, ut, tt, g, p, it;
+ if (!(et <= 0)) {
+ for (s = this._eventManager.ghostCtx, i.save(), l = this.plotArea, i.beginPath(), i.rect(l.x1, l.y1, l.width, l.height), i.clip(), w = [], b = 0; b < t.dataSeriesIndexes.length; b++) {
+ k = t.dataSeriesIndexes[b];
+ e = this.data[k];
+ i.lineWidth = e.lineThickness;
+ o = e.dataPoints;
+ i.setLineDash && i.setLineDash(y(e.lineDashType, e.lineThickness));
+ nt = e.id;
+ this._eventManager.objectMap[nt] = {
+ objectType: "dataSeries",
+ dataSeriesIndex: k
+ };
+ rt = u(nt);
+ s.strokeStyle = rt;
+ s.lineWidth = e.lineThickness > 0 ? Math.max(e.lineThickness, 4) : 0;
+ ut = e._colorSet;
+ tt = ut[0];
+ i.strokeStyle = tt;
+ var f = 0,
+ h, c, d, v = [];
+ if (i.beginPath(), o.length > 0)
+ for (f = 0; f < o.length; f++)
+ if (d = o[f].getTime ? o[f].x.getTime() : o[f].x, !(d < t.axisX.dataInfo.viewPortMin) && !(d > t.axisX.dataInfo.viewPortMax)) {
+ if (typeof o[f].y != "number") {
+ f > 0 && (ft(v), v = []);
+ continue
+ }
+ h = t.axisX.conversionParameters.reference + t.axisX.conversionParameters.pixelPerUnit * (d - t.axisX.conversionParameters.minimum) + .5 << 0;
+ c = t.axisY.conversionParameters.reference + t.axisY.conversionParameters.pixelPerUnit * (o[f].y - t.axisY.conversionParameters.minimum) + .5 << 0;
+ g = e.dataPointIds[f];
+ this._eventManager.objectMap[g] = {
+ id: g,
+ objectType: "dataPoint",
+ dataSeriesIndex: k,
+ dataPointIndex: f,
+ x1: h,
+ y1: c
+ };
+ v[v.length] = {
+ x: h,
+ y: c
+ };
+ (o[f].markerSize > 0 || e.markerSize > 0) && (p = e.getMarkerProperties(f, h, c, i), w.push(p), it = u(g), n && w.push({
+ x: h,
+ y: c,
+ ctx: s,
+ type: p.type,
+ size: p.size,
+ color: it,
+ borderColor: it,
+ borderThickness: p.borderThickness
+ }));
+ (o[f].indexLabel || e.indexLabel || o[f].indexLabelFormatter || e.indexLabelFormatter) && this._indexLabels.push({
+ chartType: "spline",
+ dataPoint: o[f],
+ dataSeries: e,
+ point: {
+ x: h,
+ y: c
+ },
+ direction: o[f].y >= 0 ? 1 : -1,
+ color: tt
+ })
+ } ft(v)
+ }
+ return a.drawMarkers(w), i.restore(), i.beginPath(), n && s.beginPath(), {
+ source: i,
+ dest: this.plotArea.ctx,
+ animationCallback: r.xClipAnimation,
+ easingFunction: r.easing.linear,
+ animationBase: 0
+ }
+ }
+ };
+ o = function(n, t, i, r, u, f, e, o, s, h, c, l, a) {
+ var v, w, y;
+ typeof a == "undefined" && (a = 1);
+ e = e || 0;
+ o = o || "black";
+ var k = t,
+ d = r,
+ g = i,
+ nt = u;
+ v = r - t > 15 && u - i > 15 ? 8 : .35 * Math.min(r - t, u - i);
+ var tt = "rgba(255, 255, 255, .4)",
+ b = "rgba(255, 255, 255, 0.1)",
+ p = f;
+ n.beginPath();
+ n.moveTo(t, i);
+ n.save();
+ n.fillStyle = p;
+ n.globalAlpha = a;
+ n.fillRect(t, i, r - t, u - i);
+ n.globalAlpha = 1;
+ e > 0 && (w = e % 2 == 0 ? 0 : .5, n.beginPath(), n.lineWidth = e, n.strokeStyle = o, n.moveTo(t, i), n.rect(t - w, i - w, r - t + 2 * w, u - i + 2 * w), n.stroke());
+ n.restore();
+ s === !0 && (n.save(), n.beginPath(), n.moveTo(t, i), n.lineTo(t + v, i + v), n.lineTo(r - v, i + v), n.lineTo(r, i), n.closePath(), y = n.createLinearGradient((r + t) / 2, g + v, (r + t) / 2, g), y.addColorStop(0, p), y.addColorStop(1, tt), n.fillStyle = y, n.fill(), n.restore());
+ h === !0 && (n.save(), n.beginPath(), n.moveTo(t, u), n.lineTo(t + v, u - v), n.lineTo(r - v, u - v), n.lineTo(r, u), n.closePath(), y = n.createLinearGradient((r + t) / 2, nt - v, (r + t) / 2, nt), y.addColorStop(0, p), y.addColorStop(1, tt), n.fillStyle = y, n.fill(), n.restore());
+ c === !0 && (n.save(), n.beginPath(), n.moveTo(t, i), n.lineTo(t + v, i + v), n.lineTo(t + v, u - v), n.lineTo(t, u), n.closePath(), y = n.createLinearGradient(k + v, (u + i) / 2, k, (u + i) / 2), y.addColorStop(0, p), y.addColorStop(1, b), n.fillStyle = y, n.fill(), n.restore());
+ l === !0 && (n.save(), n.beginPath(), n.moveTo(r, i), n.lineTo(r - v, i + v), n.lineTo(r - v, u - v), n.lineTo(r, u), y = n.createLinearGradient(d - v, (u + i) / 2, d, (u + i) / 2), y.addColorStop(0, p), y.addColorStop(1, b), n.fillStyle = y, y.addColorStop(0, p), y.addColorStop(1, b), n.fillStyle = y, n.fill(), n.closePath(), n.restore())
+ };
+ t.prototype.renderColumn = function(t) {
+ var v = t.targetCanvasCtx || this.plotArea.ctx,
+ st = t.dataSeriesIndexes.length,
+ w, tt, a, y, e, s, ft, k, et, ot;
+ if (!(st <= 0)) {
+ var p = null,
+ h = this.plotArea,
+ i = 0,
+ it, d, b, g = t.axisY.conversionParameters.reference + t.axisY.conversionParameters.pixelPerUnit * (0 - t.axisY.conversionParameters.minimum) << 0,
+ nt = this.dataPointMaxWidth ? this.dataPointMaxWidth : Math.min(this.width * .15, this.plotArea.width / t.plotType.totalDataSeries * .9) << 0,
+ rt = t.axisX.dataInfo.minDiff,
+ c = h.width / Math.abs(t.axisX.maximum - t.axisX.minimum) * Math.abs(rt) / t.plotType.totalDataSeries * .9 << 0;
+ for (c > nt ? c = nt : rt === Infinity ? c = nt / t.plotType.totalDataSeries * .9 : c < 1 && (c = 1), v.save(), n && this._eventManager.ghostCtx.save(), v.beginPath(), v.rect(h.x1, h.y1, h.width, h.height), v.clip(), n && (this._eventManager.ghostCtx.rect(h.x1, h.y1, h.width, h.height), this._eventManager.ghostCtx.clip()), w = 0; w < t.dataSeriesIndexes.length; w++) {
+ var ut = t.dataSeriesIndexes[w],
+ l = this.data[ut],
+ f = l.dataPoints;
+ if (f.length > 0)
+ for (tt = c > 5 && l.bevelEnabled ? !0 : !1, i = 0; i < f.length; i++)(b = f[i].getTime ? f[i].x.getTime() : f[i].x, b < t.axisX.dataInfo.viewPortMin || b > t.axisX.dataInfo.viewPortMax) || typeof f[i].y == "number" && (it = t.axisX.conversionParameters.reference + t.axisX.conversionParameters.pixelPerUnit * (b - t.axisX.conversionParameters.minimum) + .5 << 0, d = t.axisY.conversionParameters.reference + t.axisY.conversionParameters.pixelPerUnit * (f[i].y - t.axisY.conversionParameters.minimum) + .5 << 0, a = it - t.plotType.totalDataSeries * c / 2 + (t.previousDataSeriesCount + w) * c << 0, y = a + c << 0, f[i].y >= 0 ? (e = d, s = g, e > s && (ft = e, e = s, s = e)) : (s = d, e = g, e > s && (ft = e, e = s, s = e)), p = f[i].color ? f[i].color : l._colorSet[i % l._colorSet.length], o(v, a, e, y, s, p, 0, null, tt && f[i].y >= 0, f[i].y < 0 && tt, !1, !1, l.fillOpacity), k = l.dataPointIds[i], this._eventManager.objectMap[k] = {
+ id: k,
+ objectType: "dataPoint",
+ dataSeriesIndex: ut,
+ dataPointIndex: i,
+ x1: a,
+ y1: e,
+ x2: y,
+ y2: s
+ }, p = u(k), n && o(this._eventManager.ghostCtx, a, e, y, s, p, 0, null, !1, !1, !1, !1), (f[i].indexLabel || l.indexLabel || f[i].indexLabelFormatter || l.indexLabelFormatter) && this._indexLabels.push({
+ chartType: "column",
+ dataPoint: f[i],
+ dataSeries: l,
+ point: {
+ x: a + (y - a) / 2,
+ y: f[i].y >= 0 ? e : s
+ },
+ direction: f[i].y >= 0 ? 1 : -1,
+ bounds: {
+ x1: a,
+ y1: Math.min(e, s),
+ x2: y,
+ y2: Math.max(e, s)
+ },
+ color: p
+ }))
+ }
+ return v.restore(), n && this._eventManager.ghostCtx.restore(), et = Math.min(g, t.axisY.boundingRect.y2), ot = {
+ source: v,
+ dest: this.plotArea.ctx,
+ animationCallback: r.yScaleAnimation,
+ easingFunction: r.easing.easeOutQuart,
+ animationBase: et
+ }, ot
+ }
+ };
+ t.prototype.renderStackedColumn = function(t) {
+ var v = t.targetCanvasCtx || this.plotArea.ctx,
+ ct = t.dataSeriesIndexes.length,
+ k, ft, p, b, s, h, y, d, st, ht;
+ if (!(ct <= 0)) {
+ var w = null,
+ c = this.plotArea,
+ g = [],
+ nt = [],
+ i = 0,
+ tt, it, e, rt = t.axisY.conversionParameters.reference + t.axisY.conversionParameters.pixelPerUnit * (0 - t.axisY.conversionParameters.minimum) << 0,
+ ut = this.dataPointMaxWidth ? this.dataPointMaxWidth : this.width * .15 << 0,
+ et = t.axisX.dataInfo.minDiff,
+ l = c.width / Math.abs(t.axisX.maximum - t.axisX.minimum) * Math.abs(et) / t.plotType.plotUnits.length * .9 << 0;
+ for (l > ut ? l = ut : et === Infinity ? l = ut : l < 1 && (l = 1), v.save(), n && this._eventManager.ghostCtx.save(), v.beginPath(), v.rect(c.x1, c.y1, c.width, c.height), v.clip(), n && (this._eventManager.ghostCtx.rect(c.x1, c.y1, c.width, c.height), this._eventManager.ghostCtx.clip()), k = 0; k < t.dataSeriesIndexes.length; k++) {
+ var ot = t.dataSeriesIndexes[k],
+ a = this.data[ot],
+ f = a.dataPoints;
+ if (f.length > 0)
+ for (ft = l > 5 && a.bevelEnabled ? !0 : !1, v.strokeStyle = "#4572A7 ", i = 0; i < f.length; i++)(e = f[i].x.getTime ? f[i].x.getTime() : f[i].x, e < t.axisX.dataInfo.viewPortMin || e > t.axisX.dataInfo.viewPortMax) || typeof f[i].y == "number" && (tt = t.axisX.conversionParameters.reference + t.axisX.conversionParameters.pixelPerUnit * (e - t.axisX.conversionParameters.minimum) + .5 << 0, it = t.axisY.conversionParameters.reference + t.axisY.conversionParameters.pixelPerUnit * (f[i].y - t.axisY.conversionParameters.minimum), p = tt - t.plotType.plotUnits.length * l / 2 + t.index * l << 0, b = p + l << 0, f[i].y >= 0 ? (y = g[e] ? g[e] : 0, s = it - y, h = rt - y, g[e] = y + (h - s)) : (y = nt[e] ? nt[e] : 0, h = it + y, s = rt + y, nt[e] = y + (h - s)), w = f[i].color ? f[i].color : a._colorSet[i % a._colorSet.length], o(v, p, s, b, h, w, 0, null, ft && f[i].y >= 0, f[i].y < 0 && ft, !1, !1, a.fillOpacity), d = a.dataPointIds[i], this._eventManager.objectMap[d] = {
+ id: d,
+ objectType: "dataPoint",
+ dataSeriesIndex: ot,
+ dataPointIndex: i,
+ x1: p,
+ y1: s,
+ x2: b,
+ y2: h
+ }, w = u(d), n && o(this._eventManager.ghostCtx, p, s, b, h, w, 0, null, !1, !1, !1, !1), (f[i].indexLabel || a.indexLabel || f[i].indexLabelFormatter || a.indexLabelFormatter) && this._indexLabels.push({
+ chartType: "stackedColumn",
+ dataPoint: f[i],
+ dataSeries: a,
+ point: {
+ x: tt,
+ y: f[i].y >= 0 ? s : h
+ },
+ direction: f[i].y >= 0 ? 1 : -1,
+ bounds: {
+ x1: p,
+ y1: Math.min(s, h),
+ x2: b,
+ y2: Math.max(s, h)
+ },
+ color: w
+ }))
+ }
+ return v.restore(), n && this._eventManager.ghostCtx.restore(), st = Math.min(rt, t.axisY.boundingRect.y2), ht = {
+ source: v,
+ dest: this.plotArea.ctx,
+ animationCallback: r.yScaleAnimation,
+ easingFunction: r.easing.easeOutQuart,
+ animationBase: st
+ }, ht
+ }
+ };
+ t.prototype.renderStackedColumn100 = function(t) {
+ var y = t.targetCanvasCtx || this.plotArea.ctx,
+ lt = t.dataSeriesIndexes.length,
+ k, ft, st, p, b, s, h, v, d, ht, ct;
+ if (!(lt <= 0)) {
+ var w = null,
+ c = this.plotArea,
+ g = [],
+ nt = [],
+ i = 0,
+ tt, it, e, rt = t.axisY.conversionParameters.reference + t.axisY.conversionParameters.pixelPerUnit * (0 - t.axisY.conversionParameters.minimum) << 0,
+ ut = this.dataPointMaxWidth ? this.dataPointMaxWidth : this.width * .15 << 0,
+ et = t.axisX.dataInfo.minDiff,
+ l = c.width / Math.abs(t.axisX.maximum - t.axisX.minimum) * Math.abs(et) / t.plotType.plotUnits.length * .9 << 0;
+ for (l > ut ? l = ut : et === Infinity ? l = ut : l < 1 && (l = 1), y.save(), n && this._eventManager.ghostCtx.save(), y.beginPath(), y.rect(c.x1, c.y1, c.width, c.height), y.clip(), n && (this._eventManager.ghostCtx.rect(c.x1, c.y1, c.width, c.height), this._eventManager.ghostCtx.clip()), k = 0; k < t.dataSeriesIndexes.length; k++) {
+ var ot = t.dataSeriesIndexes[k],
+ a = this.data[ot],
+ f = a.dataPoints;
+ if (f.length > 0)
+ for (ft = l > 5 && a.bevelEnabled ? !0 : !1, i = 0; i < f.length; i++)(e = f[i].x.getTime ? f[i].x.getTime() : f[i].x, e < t.axisX.dataInfo.viewPortMin || e > t.axisX.dataInfo.viewPortMax) || typeof f[i].y == "number" && (tt = t.axisX.conversionParameters.reference + t.axisX.conversionParameters.pixelPerUnit * (e - t.axisX.conversionParameters.minimum) + .5 << 0, st = t.dataPointYSums[e] !== 0 ? f[i].y / t.dataPointYSums[e] * 100 : 0, it = t.axisY.conversionParameters.reference + t.axisY.conversionParameters.pixelPerUnit * (st - t.axisY.conversionParameters.minimum), p = tt - t.plotType.plotUnits.length * l / 2 + t.index * l << 0, b = p + l << 0, f[i].y >= 0 ? (v = g[e] ? g[e] : 0, s = it - v, h = rt - v, g[e] = v + (h - s)) : (v = nt[e] ? nt[e] : 0, h = it + v, s = rt + v, nt[e] = v + (h - s)), w = f[i].color ? f[i].color : a._colorSet[i % a._colorSet.length], o(y, p, s, b, h, w, 0, null, ft && f[i].y >= 0, f[i].y < 0 && ft, !1, !1, a.fillOpacity), d = a.dataPointIds[i], this._eventManager.objectMap[d] = {
+ id: d,
+ objectType: "dataPoint",
+ dataSeriesIndex: ot,
+ dataPointIndex: i,
+ x1: p,
+ y1: s,
+ x2: b,
+ y2: h
+ }, w = u(d), n && o(this._eventManager.ghostCtx, p, s, b, h, w, 0, null, !1, !1, !1, !1), (f[i].indexLabel || a.indexLabel || f[i].indexLabelFormatter || a.indexLabelFormatter) && this._indexLabels.push({
+ chartType: "stackedColumn100",
+ dataPoint: f[i],
+ dataSeries: a,
+ point: {
+ x: tt,
+ y: f[i].y >= 0 ? s : h
+ },
+ direction: f[i].y >= 0 ? 1 : -1,
+ bounds: {
+ x1: p,
+ y1: Math.min(s, h),
+ x2: b,
+ y2: Math.max(s, h)
+ },
+ color: w
+ }))
+ }
+ return y.restore(), n && this._eventManager.ghostCtx.restore(), ht = Math.min(rt, t.axisY.boundingRect.y2), ct = {
+ source: y,
+ dest: this.plotArea.ctx,
+ animationCallback: r.yScaleAnimation,
+ easingFunction: r.easing.easeOutQuart,
+ animationBase: ht
+ }, ct
+ }
+ };
+ t.prototype.renderBar = function(t) {
+ var c = t.targetCanvasCtx || this.plotArea.ctx,
+ ot = t.dataSeriesIndexes.length,
+ w, ut, l, y, a, v, k, ft, et;
+ if (!(ot <= 0)) {
+ var p = null,
+ e = this.plotArea,
+ i = 0,
+ d, tt, b, g = t.axisY.conversionParameters.reference + t.axisY.conversionParameters.pixelPerUnit * (0 - t.axisY.conversionParameters.minimum) << 0,
+ nt = this.dataPointMaxWidth ? this.dataPointMaxWidth : Math.min(this.height * .15, this.plotArea.height / t.plotType.totalDataSeries * .9) << 0,
+ it = t.axisX.dataInfo.minDiff,
+ s = e.height / Math.abs(t.axisX.maximum - t.axisX.minimum) * Math.abs(it) / t.plotType.totalDataSeries * .9 << 0;
+ for (s > nt ? s = nt : it === Infinity ? s = nt / t.plotType.totalDataSeries * .9 : s < 1 && (s = 1), c.save(), n && this._eventManager.ghostCtx.save(), c.beginPath(), c.rect(e.x1, e.y1, e.width, e.height), c.clip(), n && (this._eventManager.ghostCtx.rect(e.x1, e.y1, e.width, e.height), this._eventManager.ghostCtx.clip()), w = 0; w < t.dataSeriesIndexes.length; w++) {
+ var rt = t.dataSeriesIndexes[w],
+ h = this.data[rt],
+ f = h.dataPoints;
+ if (f.length > 0)
+ for (ut = s > 5 && h.bevelEnabled ? !0 : !1, c.strokeStyle = "#4572A7 ", i = 0; i < f.length; i++)(b = f[i].getTime ? f[i].x.getTime() : f[i].x, b < t.axisX.dataInfo.viewPortMin || b > t.axisX.dataInfo.viewPortMax) || typeof f[i].y == "number" && (tt = t.axisX.conversionParameters.reference + t.axisX.conversionParameters.pixelPerUnit * (b - t.axisX.conversionParameters.minimum) + .5 << 0, d = t.axisY.conversionParameters.reference + t.axisY.conversionParameters.pixelPerUnit * (f[i].y - t.axisY.conversionParameters.minimum) + .5 << 0, l = tt - t.plotType.totalDataSeries * s / 2 + (t.previousDataSeriesCount + w) * s << 0, y = l + s << 0, f[i].y >= 0 ? (a = g, v = d) : (a = d, v = g), p = f[i].color ? f[i].color : h._colorSet[i % h._colorSet.length], o(c, a, l, v, y, p, 0, null, ut, !1, !1, !1, h.fillOpacity), k = h.dataPointIds[i], this._eventManager.objectMap[k] = {
+ id: k,
+ objectType: "dataPoint",
+ dataSeriesIndex: rt,
+ dataPointIndex: i,
+ x1: a,
+ y1: l,
+ x2: v,
+ y2: y
+ }, p = u(k), n && o(this._eventManager.ghostCtx, a, l, v, y, p, 0, null, !1, !1, !1, !1), (f[i].indexLabel || h.indexLabel || f[i].indexLabelFormatter || h.indexLabelFormatter) && this._indexLabels.push({
+ chartType: "bar",
+ dataPoint: f[i],
+ dataSeries: h,
+ point: {
+ x: f[i].y >= 0 ? v : a,
+ y: l + (y - l) / 2
+ },
+ direction: f[i].y >= 0 ? 1 : -1,
+ bounds: {
+ x1: Math.min(a, v),
+ y1: l,
+ x2: Math.max(a, v),
+ y2: y
+ },
+ color: p
+ }))
+ }
+ return c.restore(), n && this._eventManager.ghostCtx.restore(), ft = Math.max(g, t.axisX.boundingRect.x2), et = {
+ source: c,
+ dest: this.plotArea.ctx,
+ animationCallback: r.xScaleAnimation,
+ easingFunction: r.easing.easeOutQuart,
+ animationBase: ft
+ }, et
+ }
+ };
+ t.prototype.renderStackedBar = function(t) {
+ var v = t.targetCanvasCtx || this.plotArea.ctx,
+ ct = t.dataSeriesIndexes.length,
+ k, ot, p, b, s, h, y, d, st, ht;
+ if (!(ct <= 0)) {
+ var w = null,
+ c = this.plotArea,
+ g = [],
+ nt = [],
+ i = 0,
+ tt, it, e, rt = t.axisY.conversionParameters.reference + t.axisY.conversionParameters.pixelPerUnit * (0 - t.axisY.conversionParameters.minimum) << 0,
+ ut = this.dataPointMaxWidth ? this.dataPointMaxWidth : this.height * .15 << 0,
+ ft = t.axisX.dataInfo.minDiff,
+ l = c.height / Math.abs(t.axisX.maximum - t.axisX.minimum) * Math.abs(ft) / t.plotType.plotUnits.length * .9 << 0;
+ for (l > ut ? l = ut : ft === Infinity ? l = ut : l < 1 && (l = 1), v.save(), n && this._eventManager.ghostCtx.save(), v.beginPath(), v.rect(c.x1, c.y1, c.width, c.height), v.clip(), n && (this._eventManager.ghostCtx.rect(c.x1, c.y1, c.width, c.height), this._eventManager.ghostCtx.clip()), k = 0; k < t.dataSeriesIndexes.length; k++) {
+ var et = t.dataSeriesIndexes[k],
+ a = this.data[et],
+ f = a.dataPoints;
+ if (f.length > 0)
+ for (ot = l > 5 && a.bevelEnabled ? !0 : !1, v.strokeStyle = "#4572A7 ", i = 0; i < f.length; i++)(e = f[i].x.getTime ? f[i].x.getTime() : f[i].x, e < t.axisX.dataInfo.viewPortMin || e > t.axisX.dataInfo.viewPortMax) || typeof f[i].y == "number" && (it = t.axisX.conversionParameters.reference + t.axisX.conversionParameters.pixelPerUnit * (e - t.axisX.conversionParameters.minimum) + .5 << 0, tt = t.axisY.conversionParameters.reference + t.axisY.conversionParameters.pixelPerUnit * (f[i].y - t.axisY.conversionParameters.minimum), p = it - t.plotType.plotUnits.length * l / 2 + t.index * l << 0, b = p + l << 0, f[i].y >= 0 ? (y = g[e] ? g[e] : 0, s = rt + y, h = tt + y, g[e] = y + (h - s)) : (y = nt[e] ? nt[e] : 0, s = tt - y, h = rt - y, nt[e] = y + (h - s)), w = f[i].color ? f[i].color : a._colorSet[i % a._colorSet.length], o(v, s, p, h, b, w, 0, null, ot, !1, !1, !1, a.fillOpacity), d = a.dataPointIds[i], this._eventManager.objectMap[d] = {
+ id: d,
+ objectType: "dataPoint",
+ dataSeriesIndex: et,
+ dataPointIndex: i,
+ x1: s,
+ y1: p,
+ x2: h,
+ y2: b
+ }, w = u(d), n && o(this._eventManager.ghostCtx, s, p, h, b, w, 0, null, !1, !1, !1, !1), (f[i].indexLabel || a.indexLabel || f[i].indexLabelFormatter || a.indexLabelFormatter) && this._indexLabels.push({
+ chartType: "stackedBar",
+ dataPoint: f[i],
+ dataSeries: a,
+ point: {
+ x: f[i].y >= 0 ? h : s,
+ y: it
+ },
+ direction: f[i].y >= 0 ? 1 : -1,
+ bounds: {
+ x1: Math.min(s, h),
+ y1: p,
+ x2: Math.max(s, h),
+ y2: b
+ },
+ color: w
+ }))
+ }
+ return v.restore(), n && this._eventManager.ghostCtx.restore(), st = Math.max(rt, t.axisX.boundingRect.x2), ht = {
+ source: v,
+ dest: this.plotArea.ctx,
+ animationCallback: r.xScaleAnimation,
+ easingFunction: r.easing.easeOutQuart,
+ animationBase: st
+ }, ht
+ }
+ };
+ t.prototype.renderStackedBar100 = function(t) {
+ var v = t.targetCanvasCtx || this.plotArea.ctx,
+ lt = t.dataSeriesIndexes.length,
+ k, ot, st, p, b, s, h, y, d, ht, ct;
+ if (!(lt <= 0)) {
+ var w = null,
+ c = this.plotArea,
+ g = [],
+ nt = [],
+ i = 0,
+ tt, it, e, rt = t.axisY.conversionParameters.reference + t.axisY.conversionParameters.pixelPerUnit * (0 - t.axisY.conversionParameters.minimum) << 0,
+ ut = this.dataPointMaxWidth ? this.dataPointMaxWidth : this.height * .15 << 0,
+ ft = t.axisX.dataInfo.minDiff,
+ l = c.height / Math.abs(t.axisX.maximum - t.axisX.minimum) * Math.abs(ft) / t.plotType.plotUnits.length * .9 << 0;
+ for (l > ut ? l = ut : ft === Infinity ? l = ut : l < 1 && (l = 1), v.save(), n && this._eventManager.ghostCtx.save(), v.beginPath(), v.rect(c.x1, c.y1, c.width, c.height), v.clip(), n && (this._eventManager.ghostCtx.rect(c.x1, c.y1, c.width, c.height), this._eventManager.ghostCtx.clip()), k = 0; k < t.dataSeriesIndexes.length; k++) {
+ var et = t.dataSeriesIndexes[k],
+ a = this.data[et],
+ f = a.dataPoints;
+ if (f.length > 0)
+ for (ot = l > 5 && a.bevelEnabled ? !0 : !1, v.strokeStyle = "#4572A7 ", i = 0; i < f.length; i++)(e = f[i].x.getTime ? f[i].x.getTime() : f[i].x, e < t.axisX.dataInfo.viewPortMin || e > t.axisX.dataInfo.viewPortMax) || typeof f[i].y == "number" && (it = t.axisX.conversionParameters.reference + t.axisX.conversionParameters.pixelPerUnit * (e - t.axisX.conversionParameters.minimum) + .5 << 0, st = t.dataPointYSums[e] !== 0 ? f[i].y / t.dataPointYSums[e] * 100 : 0, tt = t.axisY.conversionParameters.reference + t.axisY.conversionParameters.pixelPerUnit * (st - t.axisY.conversionParameters.minimum), p = it - t.plotType.plotUnits.length * l / 2 + t.index * l << 0, b = p + l << 0, f[i].y >= 0 ? (y = g[e] ? g[e] : 0, s = rt + y, h = tt + y, g[e] = y + (h - s)) : (y = nt[e] ? nt[e] : 0, s = tt - y, h = rt - y, nt[e] = y + (h - s)), w = f[i].color ? f[i].color : a._colorSet[i % a._colorSet.length], o(v, s, p, h, b, w, 0, null, ot, !1, !1, !1, a.fillOpacity), d = a.dataPointIds[i], this._eventManager.objectMap[d] = {
+ id: d,
+ objectType: "dataPoint",
+ dataSeriesIndex: et,
+ dataPointIndex: i,
+ x1: s,
+ y1: p,
+ x2: h,
+ y2: b
+ }, w = u(d), n && o(this._eventManager.ghostCtx, s, p, h, b, w, 0, null, !1, !1, !1, !1), (f[i].indexLabel || a.indexLabel || f[i].indexLabelFormatter || a.indexLabelFormatter) && this._indexLabels.push({
+ chartType: "stackedBar100",
+ dataPoint: f[i],
+ dataSeries: a,
+ point: {
+ x: f[i].y >= 0 ? h : s,
+ y: it
+ },
+ direction: f[i].y >= 0 ? 1 : -1,
+ bounds: {
+ x1: Math.min(s, h),
+ y1: p,
+ x2: Math.max(s, h),
+ y2: b
+ },
+ color: w
+ }))
+ }
+ return v.restore(), n && this._eventManager.ghostCtx.restore(), ht = Math.max(rt, t.axisX.boundingRect.x2), ct = {
+ source: v,
+ dest: this.plotArea.ctx,
+ animationCallback: r.xScaleAnimation,
+ easingFunction: r.easing.easeOutQuart,
+ animationBase: ht
+ }, ct
+ }
+ };
+ t.prototype.renderArea = function(t) {
+ function ut() {
+ p && (o.lineThickness > 0 && i.stroke(), t.axisY.minimum <= 0 && t.axisY.maximum >= 0 ? v = lt : t.axisY.maximum < 0 ? v = ct.y1 : t.axisY.minimum > 0 && (v = ht.y2), i.lineTo(s, v), i.lineTo(p.x, v), i.closePath(), i.globalAlpha = o.fillOpacity, i.fill(), i.globalAlpha = 1, n && (e.lineTo(s, v), e.lineTo(p.x, v), e.closePath(), e.fill()), i.beginPath(), i.moveTo(s, c), e.beginPath(), e.moveTo(s, c), p = {
+ x: s,
+ y: c
+ })
+ }
+ var i = t.targetCanvasCtx || this.plotArea.ctx,
+ st = t.dataSeriesIndexes.length,
+ k, et, g, nt, tt, w, rt;
+ if (!(st <= 0)) {
+ var e = this._eventManager.ghostCtx,
+ ht = t.axisX.lineCoordinates,
+ ct = t.axisY.lineCoordinates,
+ b = [],
+ l = this.plotArea;
+ for (i.save(), n && e.save(), i.beginPath(), i.rect(l.x1, l.y1, l.width, l.height), i.clip(), n && (e.beginPath(), e.rect(l.x1, l.y1, l.width, l.height), e.clip()), k = 0; k < t.dataSeriesIndexes.length; k++) {
+ var it = t.dataSeriesIndexes[k],
+ o = this.data[it],
+ h = o.dataPoints,
+ ft = o.id;
+ this._eventManager.objectMap[ft] = {
+ objectType: "dataSeries",
+ dataSeriesIndex: it
+ };
+ et = u(ft);
+ e.fillStyle = et;
+ b = [];
+ var ot = !0,
+ f = 0,
+ s, c, d, lt = t.axisY.conversionParameters.reference + t.axisY.conversionParameters.pixelPerUnit * (0 - t.axisY.conversionParameters.minimum) + .5 << 0,
+ v, p = null;
+ if (h.length > 0) {
+ for (g = o._colorSet[f % o._colorSet.length], i.fillStyle = g, i.strokeStyle = g, i.lineWidth = o.lineThickness, i.setLineDash && i.setLineDash(y(o.lineDashType, o.lineThickness)), nt = !0; f < h.length; f++)
+ if (d = h[f].x.getTime ? h[f].x.getTime() : h[f].x, !(d < t.axisX.dataInfo.viewPortMin) && !(d > t.axisX.dataInfo.viewPortMax)) {
+ if (typeof h[f].y != "number") {
+ ut();
+ nt = !0;
+ continue
+ }
+ s = t.axisX.conversionParameters.reference + t.axisX.conversionParameters.pixelPerUnit * (d - t.axisX.conversionParameters.minimum) + .5 << 0;
+ c = t.axisY.conversionParameters.reference + t.axisY.conversionParameters.pixelPerUnit * (h[f].y - t.axisY.conversionParameters.minimum) + .5 << 0;
+ ot || nt ? (i.beginPath(), i.moveTo(s, c), p = {
+ x: s,
+ y: c
+ }, n && (e.beginPath(), e.moveTo(s, c)), ot = !1, nt = !1) : (i.lineTo(s, c), n && e.lineTo(s, c), f % 250 == 0 && ut());
+ tt = o.dataPointIds[f];
+ this._eventManager.objectMap[tt] = {
+ id: tt,
+ objectType: "dataPoint",
+ dataSeriesIndex: it,
+ dataPointIndex: f,
+ x1: s,
+ y1: c
+ };
+ h[f].markerSize !== 0 && (h[f].markerSize > 0 || o.markerSize > 0) && (w = o.getMarkerProperties(f, s, c, i), b.push(w), rt = u(tt), n && b.push({
+ x: s,
+ y: c,
+ ctx: e,
+ type: w.type,
+ size: w.size,
+ color: rt,
+ borderColor: rt,
+ borderThickness: w.borderThickness
+ }));
+ (h[f].indexLabel || o.indexLabel || h[f].indexLabelFormatter || o.indexLabelFormatter) && this._indexLabels.push({
+ chartType: "area",
+ dataPoint: h[f],
+ dataSeries: o,
+ point: {
+ x: s,
+ y: c
+ },
+ direction: h[f].y >= 0 ? 1 : -1,
+ color: g
+ })
+ } ut();
+ a.drawMarkers(b)
+ }
+ }
+ return i.restore(), n && this._eventManager.ghostCtx.restore(), {
+ source: i,
+ dest: this.plotArea.ctx,
+ animationCallback: r.xClipAnimation,
+ easingFunction: r.easing.linear,
+ animationBase: 0
+ }
+ }
+ };
+ t.prototype.renderSplineArea = function(t) {
+ function ft() {
+ var r = kt(d, 2),
+ u;
+ if (r.length > 0) {
+ for (i.beginPath(), i.moveTo(r[0].x, r[0].y), n && (o.beginPath(), o.moveTo(r[0].x, r[0].y)), u = 0; u < r.length - 3; u += 3) i.bezierCurveTo(r[u + 1].x, r[u + 1].y, r[u + 2].x, r[u + 2].y, r[u + 3].x, r[u + 3].y), n && o.bezierCurveTo(r[u + 1].x, r[u + 1].y, r[u + 2].x, r[u + 2].y, r[u + 3].x, r[u + 3].y);
+ e.lineThickness > 0 && i.stroke();
+ t.axisY.minimum <= 0 && t.axisY.maximum >= 0 ? c = ht : t.axisY.maximum < 0 ? c = st.y1 : t.axisY.minimum > 0 && (c = ot.y2);
+ tt = {
+ x: r[0].x,
+ y: r[0].y
+ };
+ i.lineTo(r[r.length - 1].x, c);
+ i.lineTo(tt.x, c);
+ i.closePath();
+ i.globalAlpha = e.fillOpacity;
+ i.fill();
+ i.globalAlpha = 1;
+ n && (o.lineTo(r[r.length - 1].x, c), o.lineTo(tt.x, c), o.closePath(), o.fill())
+ }
+ }
+ var i = t.targetCanvasCtx || this.plotArea.ctx,
+ et = t.dataSeriesIndexes.length,
+ b, ut, g, p, it;
+ if (!(et <= 0)) {
+ var o = this._eventManager.ghostCtx,
+ ot = t.axisX.lineCoordinates,
+ st = t.axisY.lineCoordinates,
+ w = [],
+ h = this.plotArea;
+ for (i.save(), n && o.save(), i.beginPath(), i.rect(h.x1, h.y1, h.width, h.height), i.clip(), n && (o.beginPath(), o.rect(h.x1, h.y1, h.width, h.height), o.clip()), b = 0; b < t.dataSeriesIndexes.length; b++) {
+ var nt = t.dataSeriesIndexes[b],
+ e = this.data[nt],
+ s = e.dataPoints,
+ rt = e.id;
+ this._eventManager.objectMap[rt] = {
+ objectType: "dataSeries",
+ dataSeriesIndex: nt
+ };
+ ut = u(rt);
+ o.fillStyle = ut;
+ w = [];
+ var f = 0,
+ l, v, k, ht = t.axisY.conversionParameters.reference + t.axisY.conversionParameters.pixelPerUnit * (0 - t.axisY.conversionParameters.minimum) + .5 << 0,
+ c, tt = null,
+ d = [];
+ if (s.length > 0) {
+ for (color = e._colorSet[f % e._colorSet.length], i.fillStyle = color, i.strokeStyle = color, i.lineWidth = e.lineThickness, i.setLineDash && i.setLineDash(y(e.lineDashType, e.lineThickness)); f < s.length; f++)
+ if (k = s[f].x.getTime ? s[f].x.getTime() : s[f].x, !(k < t.axisX.dataInfo.viewPortMin) && !(k > t.axisX.dataInfo.viewPortMax)) {
+ if (typeof s[f].y != "number") {
+ f > 0 && (ft(), d = []);
+ continue
+ }
+ l = t.axisX.conversionParameters.reference + t.axisX.conversionParameters.pixelPerUnit * (k - t.axisX.conversionParameters.minimum) + .5 << 0;
+ v = t.axisY.conversionParameters.reference + t.axisY.conversionParameters.pixelPerUnit * (s[f].y - t.axisY.conversionParameters.minimum) + .5 << 0;
+ g = e.dataPointIds[f];
+ this._eventManager.objectMap[g] = {
+ id: g,
+ objectType: "dataPoint",
+ dataSeriesIndex: nt,
+ dataPointIndex: f,
+ x1: l,
+ y1: v
+ };
+ d[d.length] = {
+ x: l,
+ y: v
+ };
+ s[f].markerSize !== 0 && (s[f].markerSize > 0 || e.markerSize > 0) && (p = e.getMarkerProperties(f, l, v, i), w.push(p), it = u(g), n && w.push({
+ x: l,
+ y: v,
+ ctx: o,
+ type: p.type,
+ size: p.size,
+ color: it,
+ borderColor: it,
+ borderThickness: p.borderThickness
+ }));
+ (s[f].indexLabel || e.indexLabel || s[f].indexLabelFormatter || e.indexLabelFormatter) && this._indexLabels.push({
+ chartType: "splineArea",
+ dataPoint: s[f],
+ dataSeries: e,
+ point: {
+ x: l,
+ y: v
+ },
+ direction: s[f].y >= 0 ? 1 : -1,
+ color: color
+ })
+ } ft();
+ a.drawMarkers(w)
+ }
+ }
+ return i.restore(), n && this._eventManager.ghostCtx.restore(), {
+ source: i,
+ dest: this.plotArea.ctx,
+ animationCallback: r.xClipAnimation,
+ easingFunction: r.easing.linear,
+ animationBase: 0
+ }
+ }
+ };
+ t.prototype.renderStepArea = function(t) {
+ function ft() {
+ p && (s.lineThickness > 0 && i.stroke(), t.axisY.minimum <= 0 && t.axisY.maximum >= 0 ? v = at : t.axisY.maximum < 0 ? v = lt.y1 : t.axisY.minimum > 0 && (v = ct.y2), i.lineTo(e, v), i.lineTo(p.x, v), i.closePath(), i.globalAlpha = s.fillOpacity, i.fill(), i.globalAlpha = 1, n && (o.lineTo(e, v), o.lineTo(p.x, v), o.closePath(), o.fill()), i.beginPath(), i.moveTo(e, h), o.beginPath(), o.moveTo(e, h), p = {
+ x: e,
+ y: h
+ })
+ }
+ var i = t.targetCanvasCtx || this.plotArea.ctx,
+ ht = t.dataSeriesIndexes.length,
+ k, ot, g, rt, nt, w, ut;
+ if (!(ht <= 0)) {
+ var o = this._eventManager.ghostCtx,
+ ct = t.axisX.lineCoordinates,
+ lt = t.axisY.lineCoordinates,
+ b = [],
+ l = this.plotArea;
+ for (i.save(), n && o.save(), i.beginPath(), i.rect(l.x1, l.y1, l.width, l.height), i.clip(), n && (o.beginPath(), o.rect(l.x1, l.y1, l.width, l.height), o.clip()), k = 0; k < t.dataSeriesIndexes.length; k++) {
+ var tt = t.dataSeriesIndexes[k],
+ s = this.data[tt],
+ c = s.dataPoints,
+ et = s.id;
+ this._eventManager.objectMap[et] = {
+ objectType: "dataSeries",
+ dataSeriesIndex: tt
+ };
+ ot = u(et);
+ o.fillStyle = ot;
+ b = [];
+ var st = !0,
+ f = 0,
+ e, h, d, at = t.axisY.conversionParameters.reference + t.axisY.conversionParameters.pixelPerUnit * (0 - t.axisY.conversionParameters.minimum) + .5 << 0,
+ v, p = null,
+ it = !1;
+ if (c.length > 0) {
+ for (g = s._colorSet[f % s._colorSet.length], i.fillStyle = g, i.strokeStyle = g, i.lineWidth = s.lineThickness, i.setLineDash && i.setLineDash(y(s.lineDashType, s.lineThickness)); f < c.length; f++)
+ if (d = c[f].x.getTime ? c[f].x.getTime() : c[f].x, !(d < t.axisX.dataInfo.viewPortMin) && !(d > t.axisX.dataInfo.viewPortMax)) {
+ if (rt = h, typeof c[f].y != "number") {
+ ft();
+ it = !0;
+ continue
+ }
+ e = t.axisX.conversionParameters.reference + t.axisX.conversionParameters.pixelPerUnit * (d - t.axisX.conversionParameters.minimum) + .5 << 0;
+ h = t.axisY.conversionParameters.reference + t.axisY.conversionParameters.pixelPerUnit * (c[f].y - t.axisY.conversionParameters.minimum) + .5 << 0;
+ st || it ? (i.beginPath(), i.moveTo(e, h), p = {
+ x: e,
+ y: h
+ }, n && (o.beginPath(), o.moveTo(e, h)), st = !1, it = !1) : (i.lineTo(e, rt), n && o.lineTo(e, rt), i.lineTo(e, h), n && o.lineTo(e, h), f % 250 == 0 && ft());
+ nt = s.dataPointIds[f];
+ this._eventManager.objectMap[nt] = {
+ id: nt,
+ objectType: "dataPoint",
+ dataSeriesIndex: tt,
+ dataPointIndex: f,
+ x1: e,
+ y1: h
+ };
+ c[f].markerSize !== 0 && (c[f].markerSize > 0 || s.markerSize > 0) && (w = s.getMarkerProperties(f, e, h, i), b.push(w), ut = u(nt), n && b.push({
+ x: e,
+ y: h,
+ ctx: o,
+ type: w.type,
+ size: w.size,
+ color: ut,
+ borderColor: ut,
+ borderThickness: w.borderThickness
+ }));
+ (c[f].indexLabel || s.indexLabel || c[f].indexLabelFormatter || s.indexLabelFormatter) && this._indexLabels.push({
+ chartType: "stepArea",
+ dataPoint: c[f],
+ dataSeries: s,
+ point: {
+ x: e,
+ y: h
+ },
+ direction: c[f].y >= 0 ? 1 : -1,
+ color: g
+ })
+ } ft();
+ a.drawMarkers(b)
+ }
+ }
+ return i.restore(), n && this._eventManager.ghostCtx.restore(), {
+ source: i,
+ dest: this.plotArea.ctx,
+ animationCallback: r.xClipAnimation,
+ easingFunction: r.easing.linear,
+ animationBase: 0
+ }
+ }
+ };
+ t.prototype.renderStackedArea = function(t) {
+ var i = t.targetCanvasCtx || this.plotArea.ctx,
+ lt = t.dataSeriesIndexes.length,
+ w, ct, v, rt, nt, l;
+ if (!(lt <= 0)) {
+ var tt = null,
+ ut = [],
+ p = this.plotArea,
+ ft = [],
+ d = [],
+ s = 0,
+ h, o, c, et = t.axisY.conversionParameters.reference + t.axisY.conversionParameters.pixelPerUnit * (0 - t.axisY.conversionParameters.minimum) << 0,
+ at = t.axisX.dataInfo.minDiff,
+ e = this._eventManager.ghostCtx;
+ for (n && e.beginPath(), i.save(), n && e.save(), i.beginPath(), i.rect(p.x1, p.y1, p.width, p.height), i.clip(), n && (e.beginPath(), e.rect(p.x1, p.y1, p.width, p.height), e.clip()), xValuePresent = [], w = 0; w < t.dataSeriesIndexes.length; w++) {
+ var it = t.dataSeriesIndexes[w],
+ f = this.data[it],
+ b = f.dataPoints,
+ g;
+ for (f.dataPointIndexes = [], s = 0; s < b.length; s++) g = b[s].x.getTime ? b[s].x.getTime() : b[s].x, f.dataPointIndexes[g] = s, xValuePresent[g] || (d.push(g), xValuePresent[g] = !0);
+ d.sort(si)
+ }
+ for (w = 0; w < t.dataSeriesIndexes.length; w++) {
+ var it = t.dataSeriesIndexes[w],
+ f = this.data[it],
+ b = f.dataPoints,
+ st = !0,
+ k = [],
+ ht = f.id;
+ if (this._eventManager.objectMap[ht] = {
+ objectType: "dataSeries",
+ dataSeriesIndex: it
+ }, ct = u(ht), e.fillStyle = ct, d.length > 0) {
+ for (tt = f._colorSet[0], i.fillStyle = tt, i.strokeStyle = tt, i.lineWidth = f.lineThickness, i.setLineDash && i.setLineDash(y(f.lineDashType, f.lineThickness)), s = 0; s < d.length; s++)
+ if ((c = d[s], v = null, v = f.dataPointIndexes[c] >= 0 ? b[f.dataPointIndexes[c]] : {
+ x: c,
+ y: 0
+ }, !(c < t.axisX.dataInfo.viewPortMin) && !(c > t.axisX.dataInfo.viewPortMax)) && typeof v.y == "number") {
+ var h = t.axisX.conversionParameters.reference + t.axisX.conversionParameters.pixelPerUnit * (c - t.axisX.conversionParameters.minimum) + .5 << 0,
+ o = t.axisY.conversionParameters.reference + t.axisY.conversionParameters.pixelPerUnit * (v.y - t.axisY.conversionParameters.minimum),
+ ot = ft[c] ? ft[c] : 0;
+ if (o = o - ot, k.push({
+ x: h,
+ y: et - ot
+ }), ft[c] = et - o, st) i.beginPath(), i.moveTo(h, o), n && (e.beginPath(), e.moveTo(h, o)), st = !1;
+ else if (i.lineTo(h, o), n && e.lineTo(h, o), s % 250 == 0) {
+ for (f.lineThickness > 0 && i.stroke(); k.length > 0;) l = k.pop(), i.lineTo(l.x, l.y), n && e.lineTo(l.x, l.y);
+ i.closePath();
+ i.globalAlpha = f.fillOpacity;
+ i.fill();
+ i.globalAlpha = 1;
+ i.beginPath();
+ i.moveTo(h, o);
+ n && (e.closePath(), e.fill(), e.beginPath(), e.moveTo(h, o));
+ k.push({
+ x: h,
+ y: et - ot
+ })
+ }
+ f.dataPointIndexes[c] >= 0 && (rt = f.dataPointIds[f.dataPointIndexes[c]], this._eventManager.objectMap[rt] = {
+ id: rt,
+ objectType: "dataPoint",
+ dataSeriesIndex: it,
+ dataPointIndex: f.dataPointIndexes[c],
+ x1: h,
+ y1: o
+ });
+ f.dataPointIndexes[c] >= 0 && v.markerSize !== 0 && (v.markerSize > 0 || f.markerSize > 0) && (nt = f.getMarkerProperties(s, h, o, i), ut.push(nt), markerColor = u(rt), n && ut.push({
+ x: h,
+ y: o,
+ ctx: e,
+ type: nt.type,
+ size: nt.size,
+ color: markerColor,
+ borderColor: markerColor,
+ borderThickness: nt.borderThickness
+ }));
+ (v.indexLabel || f.indexLabel || v.indexLabelFormatter || f.indexLabelFormatter) && this._indexLabels.push({
+ chartType: "stackedArea",
+ dataPoint: v,
+ dataSeries: f,
+ point: {
+ x: h,
+ y: o
+ },
+ direction: b[s].y >= 0 ? 1 : -1,
+ color: tt
+ })
+ } for (f.lineThickness > 0 && i.stroke(); k.length > 0;) l = k.pop(), i.lineTo(l.x, l.y), n && e.lineTo(l.x, l.y);
+ i.closePath();
+ i.globalAlpha = f.fillOpacity;
+ i.fill();
+ i.globalAlpha = 1;
+ i.beginPath();
+ i.moveTo(h, o);
+ n && (e.closePath(), e.fill(), e.beginPath(), e.moveTo(h, o))
+ }
+ delete f.dataPointIndexes
+ }
+ return a.drawMarkers(ut), i.restore(), n && e.restore(), {
+ source: i,
+ dest: this.plotArea.ctx,
+ animationCallback: r.xClipAnimation,
+ easingFunction: r.easing.linear,
+ animationBase: 0
+ }
+ }
+ };
+ t.prototype.renderStackedArea100 = function(t) {
+ var i = t.targetCanvasCtx || this.plotArea.ctx,
+ yt = t.dataSeriesIndexes.length,
+ w, at, k, wt, p, vt, ut, tt, l;
+ if (!(yt <= 0)) {
+ var it = null,
+ v = this.plotArea,
+ ft = [],
+ et = [],
+ g = [],
+ s = 0,
+ c, h, o, ot = t.axisY.conversionParameters.reference + t.axisY.conversionParameters.pixelPerUnit * (0 - t.axisY.conversionParameters.minimum) << 0,
+ st = this.dataPointMaxWidth ? this.dataPointMaxWidth : this.width * .15 << 0,
+ pt = t.axisX.dataInfo.minDiff,
+ d = v.width / Math.abs(t.axisX.maximum - t.axisX.minimum) * Math.abs(pt) * .9 << 0,
+ e = this._eventManager.ghostCtx;
+ for (i.save(), n && e.save(), i.beginPath(), i.rect(v.x1, v.y1, v.width, v.height), i.clip(), n && (e.beginPath(), e.rect(v.x1, v.y1, v.width, v.height), e.clip()), xValuePresent = [], w = 0; w < t.dataSeriesIndexes.length; w++) {
+ var rt = t.dataSeriesIndexes[w],
+ f = this.data[rt],
+ b = f.dataPoints,
+ nt;
+ for (f.dataPointIndexes = [], s = 0; s < b.length; s++) nt = b[s].x.getTime ? b[s].x.getTime() : b[s].x, f.dataPointIndexes[nt] = s, xValuePresent[nt] || (g.push(nt), xValuePresent[nt] = !0);
+ g.sort(si)
+ }
+ for (w = 0; w < t.dataSeriesIndexes.length; w++) {
+ var rt = t.dataSeriesIndexes[w],
+ f = this.data[rt],
+ b = f.dataPoints,
+ ct = !0,
+ lt = f.id;
+ if (this._eventManager.objectMap[lt] = {
+ objectType: "dataSeries",
+ dataSeriesIndex: rt
+ }, at = u(lt), e.fillStyle = at, b.length == 1 && (d = st), d < 1 ? d = 1 : d > st && (d = st), k = [], g.length > 0) {
+ for (it = f._colorSet[s % f._colorSet.length], i.fillStyle = it, i.strokeStyle = it, i.lineWidth = f.lineThickness, i.setLineDash && i.setLineDash(y(f.lineDashType, f.lineThickness)), wt = d > 5 ? !1 : !1, s = 0; s < g.length; s++)
+ if ((o = g[s], p = null, p = f.dataPointIndexes[o] >= 0 ? b[f.dataPointIndexes[o]] : {
+ x: o,
+ y: 0
+ }, !(o < t.axisX.dataInfo.viewPortMin) && !(o > t.axisX.dataInfo.viewPortMax)) && typeof p.y == "number") {
+ vt = t.dataPointYSums[o] !== 0 ? p.y / t.dataPointYSums[o] * 100 : 0;
+ var c = t.axisX.conversionParameters.reference + t.axisX.conversionParameters.pixelPerUnit * (o - t.axisX.conversionParameters.minimum) + .5 << 0,
+ h = t.axisY.conversionParameters.reference + t.axisY.conversionParameters.pixelPerUnit * (vt - t.axisY.conversionParameters.minimum),
+ ht = et[o] ? et[o] : 0;
+ if (h = h - ht, k.push({
+ x: c,
+ y: ot - ht
+ }), et[o] = ot - h, ct) i.beginPath(), i.moveTo(c, h), n && (e.beginPath(), e.moveTo(c, h)), ct = !1;
+ else if (i.lineTo(c, h), n && e.lineTo(c, h), s % 250 == 0) {
+ for (f.lineThickness > 0 && i.stroke(); k.length > 0;) l = k.pop(), i.lineTo(l.x, l.y), n && e.lineTo(l.x, l.y);
+ i.closePath();
+ i.globalAlpha = f.fillOpacity;
+ i.fill();
+ i.globalAlpha = 1;
+ i.beginPath();
+ i.moveTo(c, h);
+ n && (e.closePath(), e.fill(), e.beginPath(), e.moveTo(c, h));
+ k.push({
+ x: c,
+ y: ot - ht
+ })
+ }
+ f.dataPointIndexes[o] >= 0 && (ut = f.dataPointIds[f.dataPointIndexes[o]], this._eventManager.objectMap[ut] = {
+ id: ut,
+ objectType: "dataPoint",
+ dataSeriesIndex: rt,
+ dataPointIndex: f.dataPointIndexes[o],
+ x1: c,
+ y1: h
+ });
+ f.dataPointIndexes[o] >= 0 && p.markerSize !== 0 && (p.markerSize > 0 || f.markerSize > 0) && (tt = f.getMarkerProperties(s, c, h, i), ft.push(tt), markerColor = u(ut), n && ft.push({
+ x: c,
+ y: h,
+ ctx: e,
+ type: tt.type,
+ size: tt.size,
+ color: markerColor,
+ borderColor: markerColor,
+ borderThickness: tt.borderThickness
+ }));
+ (p.indexLabel || f.indexLabel || p.indexLabelFormatter || f.indexLabelFormatter) && this._indexLabels.push({
+ chartType: "stackedArea100",
+ dataPoint: p,
+ dataSeries: f,
+ point: {
+ x: c,
+ y: h
+ },
+ direction: b[s].y >= 0 ? 1 : -1,
+ color: it
+ })
+ } for (f.lineThickness > 0 && i.stroke(); k.length > 0;) l = k.pop(), i.lineTo(l.x, l.y), n && e.lineTo(l.x, l.y);
+ i.closePath();
+ i.globalAlpha = f.fillOpacity;
+ i.fill();
+ i.globalAlpha = 1;
+ i.beginPath();
+ i.moveTo(c, h);
+ n && (e.closePath(), e.fill(), e.beginPath(), e.moveTo(c, h))
+ }
+ delete f.dataPointIndexes
+ }
+ return a.drawMarkers(ft), i.restore(), n && e.restore(), {
+ source: i,
+ dest: this.plotArea.ctx,
+ animationCallback: r.xClipAnimation,
+ easingFunction: r.easing.linear,
+ animationBase: 0
+ }
+ }
+ };
+ t.prototype.renderBubble = function(t) {
+ var o = t.targetCanvasCtx || this.plotArea.ctx,
+ ut = t.dataSeriesIndexes.length,
+ k, p, d, it, c, i, g, rt;
+ if (!(ut <= 0)) {
+ var s = this.plotArea,
+ i = 0,
+ v, y, h, ht = t.axisY.conversionParameters.reference + t.axisY.conversionParameters.pixelPerUnit * (0 - t.axisY.conversionParameters.minimum) << 0,
+ nt = this.dataPointMaxWidth ? this.dataPointMaxWidth : this.width * .15 << 0,
+ et = t.axisX.dataInfo.minDiff,
+ b = s.width / Math.abs(t.axisX.maximum - t.axisX.minimum) * Math.abs(et) / ut * .9 << 0;
+ for (o.save(), n && this._eventManager.ghostCtx.save(), o.beginPath(), o.rect(s.x1, s.y1, s.width, s.height), o.clip(), n && (this._eventManager.ghostCtx.rect(s.x1, s.y1, s.width, s.height), this._eventManager.ghostCtx.clip()), k = -Infinity, p = Infinity, c = 0; c < t.dataSeriesIndexes.length; c++) {
+ var tt = t.dataSeriesIndexes[c],
+ l = this.data[tt],
+ f = l.dataPoints,
+ w = 0;
+ for (i = 0; i < f.length; i++)(h = h = f[i].getTime ? f[i].x.getTime() : f[i].x, h < t.axisX.dataInfo.viewPortMin || h > t.axisX.dataInfo.viewPortMax) || typeof f[i].z != "undefined" && (w = f[i].z, w > k && (k = w), w < p && (p = w))
+ }
+ for (d = Math.PI * 25, it = Math.max(Math.pow(Math.min(s.height, s.width) * .25 / 2, 2) * Math.PI, d), c = 0; c < t.dataSeriesIndexes.length; c++) {
+ var tt = t.dataSeriesIndexes[c],
+ l = this.data[tt],
+ f = l.dataPoints;
+ if (f.length == 1 && (b = nt), b < 1 ? b = 1 : b > nt && (b = nt), f.length > 0)
+ for (o.strokeStyle = "#4572A7 ", i = 0; i < f.length; i++)
+ if ((h = h = f[i].getTime ? f[i].x.getTime() : f[i].x, !(h < t.axisX.dataInfo.viewPortMin) && !(h > t.axisX.dataInfo.viewPortMax)) && typeof f[i].y == "number") {
+ v = t.axisX.conversionParameters.reference + t.axisX.conversionParameters.pixelPerUnit * (h - t.axisX.conversionParameters.minimum) + .5 << 0;
+ y = t.axisY.conversionParameters.reference + t.axisY.conversionParameters.pixelPerUnit * (f[i].y - t.axisY.conversionParameters.minimum) + .5 << 0;
+ var w = f[i].z,
+ ot = k === p ? it / 2 : d + (it - d) / (k - p) * (w - p),
+ st = Math.max(Math.sqrt(ot / Math.PI) << 0, 1),
+ ft = st * 2,
+ e = l.getMarkerProperties(i, o);
+ e.size = ft;
+ o.globalAlpha = l.fillOpacity;
+ a.drawMarker(v, y, o, e.type, e.size, e.color, e.borderColor, e.borderThickness);
+ o.globalAlpha = 1;
+ g = l.dataPointIds[i];
+ this._eventManager.objectMap[g] = {
+ id: g,
+ objectType: "dataPoint",
+ dataSeriesIndex: tt,
+ dataPointIndex: i,
+ x1: v,
+ y1: y,
+ size: ft
+ };
+ rt = u(g);
+ n && a.drawMarker(v, y, this._eventManager.ghostCtx, e.type, e.size, rt, rt, e.borderThickness);
+ (f[i].indexLabel || l.indexLabel || f[i].indexLabelFormatter || l.indexLabelFormatter) && this._indexLabels.push({
+ chartType: "bubble",
+ dataPoint: f[i],
+ dataSeries: l,
+ point: {
+ x: v,
+ y: y
+ },
+ direction: 1,
+ bounds: {
+ x1: v - e.size / 2,
+ y1: y - e.size / 2,
+ x2: v + e.size / 2,
+ y2: y + e.size / 2
+ },
+ color: null
+ })
+ }
+ }
+ return o.restore(), n && this._eventManager.ghostCtx.restore(), {
+ source: o,
+ dest: this.plotArea.ctx,
+ animationCallback: r.fadeInAnimation,
+ easingFunction: r.easing.easeInQuad,
+ animationBase: 0
+ }
+ }
+ };
+ t.prototype.renderScatter = function(t) {
+ var s = t.targetCanvasCtx || this.plotArea.ctx,
+ nt = t.dataSeriesIndexes.length,
+ p, f, i, w, g;
+ if (!(nt <= 0)) {
+ var o = this.plotArea,
+ f = 0,
+ h, c, v, rt = t.axisY.conversionParameters.reference + t.axisY.conversionParameters.pixelPerUnit * (0 - t.axisY.conversionParameters.minimum) << 0,
+ b = this.dataPointMaxWidth ? this.dataPointMaxWidth : this.width * .15 << 0,
+ it = t.axisX.dataInfo.minDiff,
+ y = o.width / Math.abs(t.axisX.maximum - t.axisX.minimum) * Math.abs(it) / nt * .9 << 0;
+ for (s.save(), n && this._eventManager.ghostCtx.save(), s.beginPath(), s.rect(o.x1, o.y1, o.width, o.height), s.clip(), n && (this._eventManager.ghostCtx.rect(o.x1, o.y1, o.width, o.height), this._eventManager.ghostCtx.clip()), p = 0; p < t.dataSeriesIndexes.length; p++) {
+ var tt = t.dataSeriesIndexes[p],
+ l = this.data[tt],
+ e = l.dataPoints;
+ if (e.length == 1 && (y = b), y < 1 ? y = 1 : y > b && (y = b), e.length > 0) {
+ s.strokeStyle = "#4572A7 ";
+ var ut = Math.pow(Math.min(o.height, o.width) * .3 / 2, 2) * Math.PI,
+ k = 0,
+ d = 0;
+ for (f = 0; f < e.length; f++)(v = v = e[f].getTime ? e[f].x.getTime() : e[f].x, v < t.axisX.dataInfo.viewPortMin || v > t.axisX.dataInfo.viewPortMax) || typeof e[f].y == "number" && ((h = t.axisX.conversionParameters.reference + t.axisX.conversionParameters.pixelPerUnit * (v - t.axisX.conversionParameters.minimum) + .5 << 0, c = t.axisY.conversionParameters.reference + t.axisY.conversionParameters.pixelPerUnit * (e[f].y - t.axisY.conversionParameters.minimum) + .5 << 0, i = l.getMarkerProperties(f, h, c, s), s.globalAlpha = l.fillOpacity, a.drawMarker(i.x, i.y, i.ctx, i.type, i.size, i.color, i.borderColor, i.borderThickness), s.globalAlpha = 1, Math.sqrt((k - h) * (k - h) + (d - c) * (d - c)) < Math.min(i.size, 5) && e.length > Math.min(this.plotArea.width, this.plotArea.height)) || (w = l.dataPointIds[f], this._eventManager.objectMap[w] = {
+ id: w,
+ objectType: "dataPoint",
+ dataSeriesIndex: tt,
+ dataPointIndex: f,
+ x1: h,
+ y1: c
+ }, g = u(w), n && a.drawMarker(i.x, i.y, this._eventManager.ghostCtx, i.type, i.size, g, g, i.borderThickness), (e[f].indexLabel || l.indexLabel || e[f].indexLabelFormatter || l.indexLabelFormatter) && this._indexLabels.push({
+ chartType: "scatter",
+ dataPoint: e[f],
+ dataSeries: l,
+ point: {
+ x: h,
+ y: c
+ },
+ direction: 1,
+ bounds: {
+ x1: h - i.size / 2,
+ y1: c - i.size / 2,
+ x2: h + i.size / 2,
+ y2: c + i.size / 2
+ },
+ color: null
+ }), k = h, d = c))
+ }
+ }
+ return s.restore(), n && this._eventManager.ghostCtx.restore(), {
+ source: s,
+ dest: this.plotArea.ctx,
+ animationCallback: r.fadeInAnimation,
+ easingFunction: r.easing.easeInQuad,
+ animationBase: 0
+ }
+ }
+ };
+ t.prototype.renderCandlestick = function(t) {
+ var i = t.targetCanvasCtx || this.plotArea.ctx,
+ f = this._eventManager.ghostCtx,
+ st = t.dataSeriesIndexes.length,
+ it, ft, p, g;
+ if (!(st <= 0)) {
+ var y = null,
+ w = this.plotArea,
+ e = 0,
+ h, c, b, d, l, tt, ht = t.axisY.conversionParameters.reference + t.axisY.conversionParameters.pixelPerUnit * (0 - t.axisY.conversionParameters.minimum) << 0,
+ ut = this.dataPointMaxWidth ? this.dataPointMaxWidth : this.width * .015,
+ et = t.axisX.dataInfo.minDiff,
+ k = w.width / Math.abs(t.axisX.maximum - t.axisX.minimum) * Math.abs(et) * .7 << 0;
+ for (k > ut ? k = ut : et === Infinity ? k = ut : k < 1 && (k = 1), i.save(), n && f.save(), i.beginPath(), i.rect(w.x1, w.y1, w.width, w.height), i.clip(), n && (f.rect(w.x1, w.y1, w.width, w.height), f.clip()), it = 0; it < t.dataSeriesIndexes.length; it++) {
+ var ot = t.dataSeriesIndexes[it],
+ a = this.data[ot],
+ s = a.dataPoints;
+ if (s.length > 0)
+ for (ft = k > 5 && a.bevelEnabled ? !0 : !1, e = 0; e < s.length; e++)
+ if ((tt = s[e].getTime ? s[e].x.getTime() : s[e].x, !(tt < t.axisX.dataInfo.viewPortMin) && !(tt > t.axisX.dataInfo.viewPortMax)) && s[e].y !== null && s[e].y.length && typeof s[e].y[0] == "number" && typeof s[e].y[1] == "number" && typeof s[e].y[2] == "number" && typeof s[e].y[3] == "number") {
+ h = t.axisX.conversionParameters.reference + t.axisX.conversionParameters.pixelPerUnit * (tt - t.axisX.conversionParameters.minimum) + .5 << 0;
+ c = t.axisY.conversionParameters.reference + t.axisY.conversionParameters.pixelPerUnit * (s[e].y[0] - t.axisY.conversionParameters.minimum) + .5 << 0;
+ b = t.axisY.conversionParameters.reference + t.axisY.conversionParameters.pixelPerUnit * (s[e].y[1] - t.axisY.conversionParameters.minimum) + .5 << 0;
+ d = t.axisY.conversionParameters.reference + t.axisY.conversionParameters.pixelPerUnit * (s[e].y[2] - t.axisY.conversionParameters.minimum) + .5 << 0;
+ l = t.axisY.conversionParameters.reference + t.axisY.conversionParameters.pixelPerUnit * (s[e].y[3] - t.axisY.conversionParameters.minimum) + .5 << 0;
+ p = h - k / 2 << 0;
+ g = p + k << 0;
+ y = s[e].color ? s[e].color : a._colorSet[0];
+ var nt = Math.round(Math.max(1, k * .15)),
+ v = nt % 2 == 0 ? 0 : .5,
+ rt = a.dataPointIds[e];
+ this._eventManager.objectMap[rt] = {
+ id: rt,
+ objectType: "dataPoint",
+ dataSeriesIndex: ot,
+ dataPointIndex: e,
+ x1: p,
+ y1: c,
+ x2: g,
+ y2: b,
+ x3: h,
+ y3: d,
+ x4: h,
+ y4: l,
+ borderThickness: nt,
+ color: y
+ };
+ i.strokeStyle = y;
+ i.beginPath();
+ i.lineWidth = nt;
+ f.lineWidth = Math.max(nt, 4);
+ a.type === "candlestick" ? (i.moveTo(h - v, b), i.lineTo(h - v, Math.min(c, l)), i.stroke(), i.moveTo(h - v, Math.max(c, l)), i.lineTo(h - v, d), i.stroke(), o(i, p, Math.min(c, l), g, Math.max(c, l), s[e].y[0] <= s[e].y[3] ? a.risingColor : y, nt, y, ft, ft, !1, !1, a.fillOpacity), n && (y = u(rt), f.strokeStyle = y, f.moveTo(h - v, b), f.lineTo(h - v, Math.min(c, l)), f.stroke(), f.moveTo(h - v, Math.max(c, l)), f.lineTo(h - v, d), f.stroke(), o(f, p, Math.min(c, l), g, Math.max(c, l), y, 0, null, !1, !1, !1, !1))) : a.type === "ohlc" && (i.moveTo(h - v, b), i.lineTo(h - v, d), i.stroke(), i.beginPath(), i.moveTo(h, c), i.lineTo(p, c), i.stroke(), i.beginPath(), i.moveTo(h, l), i.lineTo(g, l), i.stroke(), n && (y = u(rt), f.strokeStyle = y, f.moveTo(h - v, b), f.lineTo(h - v, d), f.stroke(), f.beginPath(), f.moveTo(h, c), f.lineTo(p, c), f.stroke(), f.beginPath(), f.moveTo(h, l), f.lineTo(g, l), f.stroke()));
+ (s[e].indexLabel || a.indexLabel || s[e].indexLabelFormatter || a.indexLabelFormatter) && this._indexLabels.push({
+ chartType: a.type,
+ dataPoint: s[e],
+ dataSeries: a,
+ point: {
+ x: p + (g - p) / 2,
+ y: b
+ },
+ direction: 1,
+ bounds: {
+ x1: p,
+ y1: Math.min(b, d),
+ x2: g,
+ y2: Math.max(b, d)
+ },
+ color: y
+ })
+ }
+ }
+ return i.restore(), n && f.restore(), {
+ source: i,
+ dest: this.plotArea.ctx,
+ animationCallback: r.fadeInAnimation,
+ easingFunction: r.easing.easeInQuad,
+ animationBase: 0
+ }
+ }
+ };
+ t.prototype.renderRangeColumn = function(t) {
+ var y = t.targetCanvasCtx || this.plotArea.ctx,
+ ft = t.dataSeriesIndexes.length,
+ w, g, h, v, e, s, rt, k, ut;
+ if (!(ft <= 0)) {
+ var p = null,
+ l = this.plotArea,
+ i = 0,
+ nt, e, s, b, et = t.axisY.conversionParameters.reference + t.axisY.conversionParameters.pixelPerUnit * (0 - t.axisY.conversionParameters.minimum) << 0,
+ d = this.dataPointMaxWidth ? this.dataPointMaxWidth : this.width * .03,
+ tt = t.axisX.dataInfo.minDiff,
+ a = l.width / Math.abs(t.axisX.maximum - t.axisX.minimum) * Math.abs(tt) / t.plotType.totalDataSeries * .9 << 0;
+ for (a > d ? a = d : tt === Infinity ? a = d / t.plotType.totalDataSeries * .9 : a < 1 && (a = 1), y.save(), n && this._eventManager.ghostCtx.save(), y.beginPath(), y.rect(l.x1, l.y1, l.width, l.height), y.clip(), n && (this._eventManager.ghostCtx.rect(l.x1, l.y1, l.width, l.height), this._eventManager.ghostCtx.clip()), w = 0; w < t.dataSeriesIndexes.length; w++) {
+ var it = t.dataSeriesIndexes[w],
+ c = this.data[it],
+ f = c.dataPoints;
+ if (f.length > 0)
+ for (g = a > 5 && c.bevelEnabled ? !0 : !1, i = 0; i < f.length; i++)(b = f[i].getTime ? f[i].x.getTime() : f[i].x, b < t.axisX.dataInfo.viewPortMin || b > t.axisX.dataInfo.viewPortMax) || f[i].y !== null && f[i].y.length && typeof f[i].y[0] == "number" && typeof f[i].y[1] == "number" && (nt = t.axisX.conversionParameters.reference + t.axisX.conversionParameters.pixelPerUnit * (b - t.axisX.conversionParameters.minimum) + .5 << 0, e = t.axisY.conversionParameters.reference + t.axisY.conversionParameters.pixelPerUnit * (f[i].y[0] - t.axisY.conversionParameters.minimum) + .5 << 0, s = t.axisY.conversionParameters.reference + t.axisY.conversionParameters.pixelPerUnit * (f[i].y[1] - t.axisY.conversionParameters.minimum) + .5 << 0, h = nt - t.plotType.totalDataSeries * a / 2 + (t.previousDataSeriesCount + w) * a << 0, v = h + a << 0, p = f[i].color ? f[i].color : c._colorSet[i % c._colorSet.length], e > s && (rt = e, e = s, s = rt), k = c.dataPointIds[i], this._eventManager.objectMap[k] = {
+ id: k,
+ objectType: "dataPoint",
+ dataSeriesIndex: it,
+ dataPointIndex: i,
+ x1: h,
+ y1: e,
+ x2: v,
+ y2: s
+ }, ut = 0, o(y, h, e, v, s, p, ut, p, g, g, !1, !1, c.fillOpacity), p = u(k), n && o(this._eventManager.ghostCtx, h, e, v, s, p, 0, null, !1, !1, !1, !1), (f[i].indexLabel || c.indexLabel || f[i].indexLabelFormatter || c.indexLabelFormatter) && (this._indexLabels.push({
+ chartType: "rangeColumn",
+ dataPoint: f[i],
+ dataSeries: c,
+ indexKeyword: 0,
+ point: {
+ x: h + (v - h) / 2,
+ y: f[i].y[1] >= f[i].y[0] ? s : e
+ },
+ direction: f[i].y[1] >= f[i].y[0] ? -1 : 1,
+ bounds: {
+ x1: h,
+ y1: Math.min(e, s),
+ x2: v,
+ y2: Math.max(e, s)
+ },
+ color: p
+ }), this._indexLabels.push({
+ chartType: "rangeColumn",
+ dataPoint: f[i],
+ dataSeries: c,
+ indexKeyword: 1,
+ point: {
+ x: h + (v - h) / 2,
+ y: f[i].y[1] >= f[i].y[0] ? e : s
+ },
+ direction: f[i].y[1] >= f[i].y[0] ? 1 : -1,
+ bounds: {
+ x1: h,
+ y1: Math.min(e, s),
+ x2: v,
+ y2: Math.max(e, s)
+ },
+ color: p
+ })))
+ }
+ return y.restore(), n && this._eventManager.ghostCtx.restore(), {
+ source: y,
+ dest: this.plotArea.ctx,
+ animationCallback: r.fadeInAnimation,
+ easingFunction: r.easing.easeInQuad,
+ animationBase: 0
+ }
+ }
+ };
+ t.prototype.renderRangeBar = function(t) {
+ var v = t.targetCanvasCtx || this.plotArea.ctx,
+ ut = t.dataSeriesIndexes.length,
+ w, it, h, y, rt, k;
+ if (!(ut <= 0)) {
+ var p = null,
+ l = this.plotArea,
+ i = 0,
+ e, s, g, b, ft = t.axisY.conversionParameters.reference + t.axisY.conversionParameters.pixelPerUnit * (0 - t.axisY.conversionParameters.minimum) << 0,
+ d = this.dataPointMaxWidth ? this.dataPointMaxWidth : Math.min(this.height * .15, this.plotArea.height / t.plotType.totalDataSeries * .9) << 0,
+ nt = t.axisX.dataInfo.minDiff,
+ a = l.height / Math.abs(t.axisX.maximum - t.axisX.minimum) * Math.abs(nt) / t.plotType.totalDataSeries * .9 << 0;
+ for (a > d ? a = d : nt === Infinity ? a = d / t.plotType.totalDataSeries * .9 : a < 1 && (a = 1), v.save(), n && this._eventManager.ghostCtx.save(), v.beginPath(), v.rect(l.x1, l.y1, l.width, l.height), v.clip(), n && (this._eventManager.ghostCtx.rect(l.x1, l.y1, l.width, l.height), this._eventManager.ghostCtx.clip()), w = 0; w < t.dataSeriesIndexes.length; w++) {
+ var tt = t.dataSeriesIndexes[w],
+ c = this.data[tt],
+ f = c.dataPoints;
+ if (f.length > 0)
+ for (it = a > 5 && c.bevelEnabled ? !0 : !1, v.strokeStyle = "#4572A7 ", i = 0; i < f.length; i++)(b = f[i].getTime ? f[i].x.getTime() : f[i].x, b < t.axisX.dataInfo.viewPortMin || b > t.axisX.dataInfo.viewPortMax) || f[i].y !== null && f[i].y.length && typeof f[i].y[0] == "number" && typeof f[i].y[1] == "number" && (e = t.axisY.conversionParameters.reference + t.axisY.conversionParameters.pixelPerUnit * (f[i].y[0] - t.axisY.conversionParameters.minimum) + .5 << 0, s = t.axisY.conversionParameters.reference + t.axisY.conversionParameters.pixelPerUnit * (f[i].y[1] - t.axisY.conversionParameters.minimum) + .5 << 0, g = t.axisX.conversionParameters.reference + t.axisX.conversionParameters.pixelPerUnit * (b - t.axisX.conversionParameters.minimum) + .5 << 0, h = g - t.plotType.totalDataSeries * a / 2 + (t.previousDataSeriesCount + w) * a << 0, y = h + a << 0, e > s && (rt = e, e = s, s = rt), p = f[i].color ? f[i].color : c._colorSet[i % c._colorSet.length], o(v, e, h, s, y, p, 0, null, it, !1, !1, !1, c.fillOpacity), k = c.dataPointIds[i], this._eventManager.objectMap[k] = {
+ id: k,
+ objectType: "dataPoint",
+ dataSeriesIndex: tt,
+ dataPointIndex: i,
+ x1: e,
+ y1: h,
+ x2: s,
+ y2: y
+ }, p = u(k), n && o(this._eventManager.ghostCtx, e, h, s, y, p, 0, null, !1, !1, !1, !1), (f[i].indexLabel || c.indexLabel || f[i].indexLabelFormatter || c.indexLabelFormatter) && (this._indexLabels.push({
+ chartType: "rangeBar",
+ dataPoint: f[i],
+ dataSeries: c,
+ indexKeyword: 0,
+ point: {
+ x: f[i].y[1] >= f[i].y[0] ? e : s,
+ y: h + (y - h) / 2
+ },
+ direction: f[i].y[1] >= f[i].y[0] ? -1 : 1,
+ bounds: {
+ x1: Math.min(e, s),
+ y1: h,
+ x2: Math.max(e, s),
+ y2: y
+ },
+ color: p
+ }), this._indexLabels.push({
+ chartType: "rangeBar",
+ dataPoint: f[i],
+ dataSeries: c,
+ indexKeyword: 1,
+ point: {
+ x: f[i].y[1] >= f[i].y[0] ? s : e,
+ y: h + (y - h) / 2
+ },
+ direction: f[i].y[1] >= f[i].y[0] ? 1 : -1,
+ bounds: {
+ x1: Math.min(e, s),
+ y1: h,
+ x2: Math.max(e, s),
+ y2: y
+ },
+ color: p
+ })))
+ }
+ return v.restore(), n && this._eventManager.ghostCtx.restore(), {
+ source: v,
+ dest: this.plotArea.ctx,
+ animationCallback: r.fadeInAnimation,
+ easingFunction: r.easing.easeInQuad,
+ animationBase: 0
+ }
+ }
+ };
+ t.prototype.renderRangeArea = function(t) {
+ function ft() {
+ var n, t;
+ if (ut) {
+ for (n = null, s.lineThickness > 0 && i.stroke(), t = v.length - 1; t >= 0; t--) n = v[t], i.lineTo(n.x, n.y), h.lineTo(n.x, n.y);
+ if (i.closePath(), i.globalAlpha = s.fillOpacity, i.fill(), i.globalAlpha = 1, h.fill(), s.lineThickness > 0) {
+ for (i.beginPath(), i.moveTo(n.x, n.y), t = 0; t < v.length; t++) n = v[t], i.lineTo(n.x, n.y);
+ i.stroke()
+ }
+ i.beginPath();
+ i.moveTo(o, c);
+ h.beginPath();
+ h.moveTo(o, c);
+ ut = {
+ x: o,
+ y: c
+ };
+ v = [];
+ v.push({
+ x: o,
+ y: w
+ })
+ }
+ }
+ var i = t.targetCanvasCtx || this.plotArea.ctx,
+ ht = t.dataSeriesIndexes.length,
+ nt, ot, d, it, g, l, k;
+ if (!(ht <= 0)) {
+ var h = this._eventManager.ghostCtx,
+ ct = t.axisX.lineCoordinates,
+ lt = t.axisY.lineCoordinates,
+ b = [],
+ p = this.plotArea;
+ for (i.save(), n && h.save(), i.beginPath(), i.rect(p.x1, p.y1, p.width, p.height), i.clip(), n && (h.beginPath(), h.rect(p.x1, p.y1, p.width, p.height), h.clip()), nt = 0; nt < t.dataSeriesIndexes.length; nt++) {
+ var v = [],
+ rt = t.dataSeriesIndexes[nt],
+ s = this.data[rt],
+ e = s.dataPoints,
+ et = s.id;
+ this._eventManager.objectMap[et] = {
+ objectType: "dataSeries",
+ dataSeriesIndex: rt
+ };
+ ot = u(et);
+ h.fillStyle = ot;
+ b = [];
+ var st = !0,
+ f = 0,
+ o, c, w, tt, at = t.axisY.conversionParameters.reference + t.axisY.conversionParameters.pixelPerUnit * (0 - t.axisY.conversionParameters.minimum) + .5 << 0,
+ ut = null;
+ if (e.length > 0) {
+ for (d = s._colorSet[f % s._colorSet.length], i.fillStyle = d, i.strokeStyle = d, i.lineWidth = s.lineThickness, i.setLineDash && i.setLineDash(y(s.lineDashType, s.lineThickness)), it = !0; f < e.length; f++)
+ if (tt = e[f].x.getTime ? e[f].x.getTime() : e[f].x, !(tt < t.axisX.dataInfo.viewPortMin) && !(tt > t.axisX.dataInfo.viewPortMax)) {
+ if (e[f].y === null || !e[f].y.length || typeof e[f].y[0] != "number" || typeof e[f].y[1] != "number") {
+ ft();
+ it = !0;
+ continue
+ }
+ o = t.axisX.conversionParameters.reference + t.axisX.conversionParameters.pixelPerUnit * (tt - t.axisX.conversionParameters.minimum) + .5 << 0;
+ c = t.axisY.conversionParameters.reference + t.axisY.conversionParameters.pixelPerUnit * (e[f].y[0] - t.axisY.conversionParameters.minimum) + .5 << 0;
+ w = t.axisY.conversionParameters.reference + t.axisY.conversionParameters.pixelPerUnit * (e[f].y[1] - t.axisY.conversionParameters.minimum) + .5 << 0;
+ st || it ? (i.beginPath(), i.moveTo(o, c), ut = {
+ x: o,
+ y: c
+ }, v = [], v.push({
+ x: o,
+ y: w
+ }), n && (h.beginPath(), h.moveTo(o, c)), st = !1, it = !1) : (i.lineTo(o, c), v.push({
+ x: o,
+ y: w
+ }), n && h.lineTo(o, c), f % 250 == 0 && ft());
+ g = s.dataPointIds[f];
+ this._eventManager.objectMap[g] = {
+ id: g,
+ objectType: "dataPoint",
+ dataSeriesIndex: rt,
+ dataPointIndex: f,
+ x1: o,
+ y1: c,
+ y2: w
+ };
+ e[f].markerSize !== 0 && (e[f].markerSize > 0 || s.markerSize > 0) && (l = s.getMarkerProperties(f, o, w, i), b.push(l), k = u(g), n && b.push({
+ x: o,
+ y: w,
+ ctx: h,
+ type: l.type,
+ size: l.size,
+ color: k,
+ borderColor: k,
+ borderThickness: l.borderThickness
+ }), l = s.getMarkerProperties(f, o, c, i), b.push(l), k = u(g), n && b.push({
+ x: o,
+ y: c,
+ ctx: h,
+ type: l.type,
+ size: l.size,
+ color: k,
+ borderColor: k,
+ borderThickness: l.borderThickness
+ }));
+ (e[f].indexLabel || s.indexLabel || e[f].indexLabelFormatter || s.indexLabelFormatter) && (this._indexLabels.push({
+ chartType: "rangeArea",
+ dataPoint: e[f],
+ dataSeries: s,
+ indexKeyword: 0,
+ point: {
+ x: o,
+ y: c
+ },
+ direction: e[f].y[0] <= e[f].y[1] ? -1 : 1,
+ color: d
+ }), this._indexLabels.push({
+ chartType: "rangeArea",
+ dataPoint: e[f],
+ dataSeries: s,
+ indexKeyword: 1,
+ point: {
+ x: o,
+ y: w
+ },
+ direction: e[f].y[0] <= e[f].y[1] ? 1 : -1,
+ color: d
+ }))
+ } ft();
+ a.drawMarkers(b)
+ }
+ }
+ return i.restore(), n && this._eventManager.ghostCtx.restore(), {
+ source: i,
+ dest: this.plotArea.ctx,
+ animationCallback: r.xClipAnimation,
+ easingFunction: r.easing.linear,
+ animationBase: 0
+ }
+ }
+ };
+ t.prototype.renderRangeSplineArea = function(t) {
+ function ft() {
+ var t = kt(tt, 2),
+ r;
+ if (t.length > 0) {
+ for (i.beginPath(), i.moveTo(t[0].x, t[0].y), n && (s.beginPath(), s.moveTo(t[0].x, t[0].y)), r = 0; r < t.length - 3; r += 3) i.bezierCurveTo(t[r + 1].x, t[r + 1].y, t[r + 2].x, t[r + 2].y, t[r + 3].x, t[r + 3].y), n && s.bezierCurveTo(t[r + 1].x, t[r + 1].y, t[r + 2].x, t[r + 2].y, t[r + 3].x, t[r + 3].y);
+ for (o.lineThickness > 0 && i.stroke(), t = kt(h, 2), i.lineTo(h[h.length - 1].x, h[h.length - 1].y), r = t.length - 1; r > 2; r -= 3) i.bezierCurveTo(t[r - 1].x, t[r - 1].y, t[r - 2].x, t[r - 2].y, t[r - 3].x, t[r - 3].y), n && s.bezierCurveTo(t[r - 1].x, t[r - 1].y, t[r - 2].x, t[r - 2].y, t[r - 3].x, t[r - 3].y);
+ if (i.closePath(), i.globalAlpha = o.fillOpacity, i.fill(), i.globalAlpha = 1, o.lineThickness > 0) {
+ for (i.beginPath(), i.moveTo(h[h.length - 1].x, h[h.length - 1].y), r = t.length - 1; r > 2; r -= 3) i.bezierCurveTo(t[r - 1].x, t[r - 1].y, t[r - 2].x, t[r - 2].y, t[r - 3].x, t[r - 3].y), n && s.bezierCurveTo(t[r - 1].x, t[r - 1].y, t[r - 2].x, t[r - 2].y, t[r - 3].x, t[r - 3].y);
+ i.stroke()
+ }
+ i.beginPath();
+ n && (s.closePath(), s.fill())
+ }
+ }
+ var i = t.targetCanvasCtx || this.plotArea.ctx,
+ et = t.dataSeriesIndexes.length,
+ g, ut, d, l, k;
+ if (!(et <= 0)) {
+ var s = this._eventManager.ghostCtx,
+ ot = t.axisX.lineCoordinates,
+ st = t.axisY.lineCoordinates,
+ p = [],
+ v = this.plotArea;
+ for (i.save(), n && s.save(), i.beginPath(), i.rect(v.x1, v.y1, v.width, v.height), i.clip(), n && (s.beginPath(), s.rect(v.x1, v.y1, v.width, v.height), s.clip()), g = 0; g < t.dataSeriesIndexes.length; g++) {
+ var it = t.dataSeriesIndexes[g],
+ o = this.data[it],
+ e = o.dataPoints,
+ rt = o.id;
+ this._eventManager.objectMap[rt] = {
+ objectType: "dataSeries",
+ dataSeriesIndex: it
+ };
+ ut = u(rt);
+ s.fillStyle = ut;
+ p = [];
+ var f = 0,
+ c, w, b, nt, ht = t.axisY.conversionParameters.reference + t.axisY.conversionParameters.pixelPerUnit * (0 - t.axisY.conversionParameters.minimum) + .5 << 0,
+ tt = [],
+ h = [];
+ if (e.length > 0) {
+ for (color = o._colorSet[f % o._colorSet.length], i.fillStyle = color, i.strokeStyle = color, i.lineWidth = o.lineThickness, i.setLineDash && i.setLineDash(y(o.lineDashType, o.lineThickness)); f < e.length; f++)
+ if (nt = e[f].x.getTime ? e[f].x.getTime() : e[f].x, !(nt < t.axisX.dataInfo.viewPortMin) && !(nt > t.axisX.dataInfo.viewPortMax)) {
+ if (e[f].y === null || !e[f].y.length || typeof e[f].y[0] != "number" || typeof e[f].y[1] != "number") {
+ f > 0 && (ft(), tt = [], h = []);
+ continue
+ }
+ c = t.axisX.conversionParameters.reference + t.axisX.conversionParameters.pixelPerUnit * (nt - t.axisX.conversionParameters.minimum) + .5 << 0;
+ w = t.axisY.conversionParameters.reference + t.axisY.conversionParameters.pixelPerUnit * (e[f].y[0] - t.axisY.conversionParameters.minimum) + .5 << 0;
+ b = t.axisY.conversionParameters.reference + t.axisY.conversionParameters.pixelPerUnit * (e[f].y[1] - t.axisY.conversionParameters.minimum) + .5 << 0;
+ d = o.dataPointIds[f];
+ this._eventManager.objectMap[d] = {
+ id: d,
+ objectType: "dataPoint",
+ dataSeriesIndex: it,
+ dataPointIndex: f,
+ x1: c,
+ y1: w,
+ y2: b
+ };
+ tt[tt.length] = {
+ x: c,
+ y: w
+ };
+ h[h.length] = {
+ x: c,
+ y: b
+ };
+ e[f].markerSize !== 0 && (e[f].markerSize > 0 || o.markerSize > 0) && (l = o.getMarkerProperties(f, c, w, i), p.push(l), k = u(d), n && p.push({
+ x: c,
+ y: w,
+ ctx: s,
+ type: l.type,
+ size: l.size,
+ color: k,
+ borderColor: k,
+ borderThickness: l.borderThickness
+ }), l = o.getMarkerProperties(f, c, b, i), p.push(l), k = u(d), n && p.push({
+ x: c,
+ y: b,
+ ctx: s,
+ type: l.type,
+ size: l.size,
+ color: k,
+ borderColor: k,
+ borderThickness: l.borderThickness
+ }));
+ (e[f].indexLabel || o.indexLabel || e[f].indexLabelFormatter || o.indexLabelFormatter) && (this._indexLabels.push({
+ chartType: "splineArea",
+ dataPoint: e[f],
+ dataSeries: o,
+ indexKeyword: 0,
+ point: {
+ x: c,
+ y: w
+ },
+ direction: e[f].y[0] <= e[f].y[1] ? -1 : 1,
+ color: color
+ }), this._indexLabels.push({
+ chartType: "splineArea",
+ dataPoint: e[f],
+ dataSeries: o,
+ indexKeyword: 1,
+ point: {
+ x: c,
+ y: b
+ },
+ direction: e[f].y[0] <= e[f].y[1] ? 1 : -1,
+ color: color
+ }))
+ } ft();
+ a.drawMarkers(p)
+ }
+ }
+ return i.restore(), n && this._eventManager.ghostCtx.restore(), {
+ source: i,
+ dest: this.plotArea.ctx,
+ animationCallback: r.xClipAnimation,
+ easingFunction: r.easing.linear,
+ animationBase: 0
+ }
+ }
+ };
+ dt = function(t, i, r, u, f, e, o, s) {
+ var h, c, l;
+ typeof s == "undefined" && (s = 1);
+ n || (h = Number((o % (2 * Math.PI)).toFixed(8)), c = Number((e % (2 * Math.PI)).toFixed(8)), c === h && (o -= .0001));
+ t.save();
+ t.globalAlpha = s;
+ f === "pie" ? (t.beginPath(), t.moveTo(i.x, i.y), t.arc(i.x, i.y, r, e, o, !1), t.fillStyle = u, t.strokeStyle = "white", t.lineWidth = 2, t.closePath(), t.fill()) : f === "doughnut" && (l = .6, t.beginPath(), t.arc(i.x, i.y, r, e, o, !1), t.arc(i.x, i.y, l * r, o, e, !0), t.closePath(), t.fillStyle = u, t.strokeStyle = "white", t.lineWidth = 2, t.fill());
+ t.globalAlpha = 1;
+ t.restore()
+ };
+ t.prototype.renderPie = function(n) {
+ function et() {
+ var w, b, tt, a, n;
+ if (i && e) {
+ var y = 0,
+ p = 0,
+ d = 0,
+ g = 0;
+ for (o = 0; o < e.length; o++) {
+ var h = e[o],
+ nt = i.dataPointIds[o],
+ n = {
+ id: nt,
+ objectType: "dataPoint",
+ dataPointIndex: o,
+ dataSeriesIndex: 0
+ };
+ t.push(n);
+ w = {
+ percent: null,
+ total: null
+ };
+ b = null;
+ w = r.getPercentAndTotal(i, h);
+ (i.indexLabelFormatter || h.indexLabelFormatter) && (b = {
+ chart: r._options,
+ dataSeries: i,
+ dataPoint: h,
+ total: w.total,
+ percent: w.percent
+ });
+ tt = h.indexLabelFormatter ? h.indexLabelFormatter(b) : h.indexLabel ? r.replaceKeywordsWithValue(h.indexLabel, h, i, o) : i.indexLabelFormatter ? i.indexLabelFormatter(b) : i.indexLabel ? r.replaceKeywordsWithValue(i.indexLabel, h, i, o) : h.label ? h.label : "";
+ r._eventManager.objectMap[nt] = n;
+ n.center = {
+ x: u.x,
+ y: u.y
+ };
+ n.y = h.y;
+ n.radius = s;
+ n.indexLabelText = tt;
+ n.indexLabelPlacement = i.indexLabelPlacement;
+ n.indexLabelLineColor = h.indexLabelLineColor ? h.indexLabelLineColor : i.indexLabelLineColor ? i.indexLabelLineColor : h.color ? h.color : i._colorSet[o % i._colorSet.length];
+ n.indexLabelLineThickness = h.indexLabelLineThickness ? h.indexLabelLineThickness : i.indexLabelLineThickness;
+ n.indexLabelLineDashType = h.indexLabelLineDashType ? h.indexLabelLineDashType : i.indexLabelLineDashType;
+ n.indexLabelFontColor = h.indexLabelFontColor ? h.indexLabelFontColor : i.indexLabelFontColor;
+ n.indexLabelFontStyle = h.indexLabelFontStyle ? h.indexLabelFontStyle : i.indexLabelFontStyle;
+ n.indexLabelFontWeight = h.indexLabelFontWeight ? h.indexLabelFontWeight : i.indexLabelFontWeight;
+ n.indexLabelFontSize = h.indexLabelFontSize ? h.indexLabelFontSize : i.indexLabelFontSize;
+ n.indexLabelFontFamily = h.indexLabelFontFamily ? h.indexLabelFontFamily : i.indexLabelFontFamily;
+ n.indexLabelBackgroundColor = h.indexLabelBackgroundColor ? h.indexLabelBackgroundColor : i.indexLabelBackgroundColor ? i.indexLabelBackgroundColor : null;
+ n.indexLabelMaxWidth = h.indexLabelMaxWidth ? h.indexLabelMaxWidth : i.indexLabelMaxWidth ? i.indexLabelMaxWidth : f.width * .33;
+ n.indexLabelWrap = typeof h.indexLabelWrap != "undefined" ? h.indexLabelWrap : i.indexLabelWrap;
+ n.startAngle = o === 0 ? i.startAngle ? i.startAngle / 180 * Math.PI : 0 : t[o - 1].endAngle;
+ n.startAngle = (n.startAngle + 2 * Math.PI) % (2 * Math.PI);
+ n.endAngle = n.startAngle + 2 * Math.PI / k * Math.abs(h.y);
+ a = (n.endAngle + n.startAngle) / 2;
+ a = (a + 2 * Math.PI) % (2 * Math.PI);
+ n.midAngle = a;
+ n.midAngle > Math.PI / 2 - l && n.midAngle < Math.PI / 2 + l ? ((y === 0 || t[d].midAngle > n.midAngle) && (d = o), y++) : n.midAngle > 3 * Math.PI / 2 - l && n.midAngle < 3 * Math.PI / 2 + l && ((p === 0 || t[g].midAngle > n.midAngle) && (g = o), p++);
+ n.hemisphere = a > Math.PI / 2 && a <= 3 * Math.PI / 2 ? "left" : "right";
+ n.indexLabelTextBlock = new c(r.plotArea.ctx, {
+ fontSize: n.indexLabelFontSize,
+ fontFamily: n.indexLabelFontFamily,
+ fontColor: n.indexLabelFontColor,
+ fontStyle: n.indexLabelFontStyle,
+ fontWeight: n.indexLabelFontWeight,
+ horizontalAlign: "left",
+ backgroundColor: n.indexLabelBackgroundColor,
+ maxWidth: n.indexLabelMaxWidth,
+ maxHeight: n.indexLabelWrap ? n.indexLabelFontSize * 5 : n.indexLabelFontSize * 1.5,
+ text: n.indexLabelText,
+ padding: 0,
+ textBaseline: "top"
+ });
+ n.indexLabelTextBlock.measureText()
+ }
+ var it = 0,
+ rt = 0,
+ v = !1;
+ for (o = 0; o < e.length; o++) n = t[(d + o) % e.length], y > 1 && n.midAngle > Math.PI / 2 - l && n.midAngle < Math.PI / 2 + l && (it <= y / 2 && !v ? (n.hemisphere = "right", it++) : (n.hemisphere = "left", v = !0));
+ for (v = !1, o = 0; o < e.length; o++) n = t[(g + o) % e.length], p > 1 && n.midAngle > 3 * Math.PI / 2 - l && n.midAngle < 3 * Math.PI / 2 + l && (rt <= p / 2 && !v ? (n.hemisphere = "left", rt++) : (n.hemisphere = "right", v = !0))
+ }
+ }
+
+ function ot() {
+ var u = r.plotArea.ctx,
+ l, f, a, n, o, h, c;
+ for (u.fillStyle = "black", u.strokeStyle = "grey", l = 16, u.textBaseline = "middle", u.lineJoin = "round", f = 0, a = 0, f = 0; f < e.length; f++)(n = t[f], n.indexLabelText) && (n.indexLabelTextBlock.y -= n.indexLabelTextBlock.height / 2, o = 0, o = n.hemisphere === "left" ? i.indexLabelPlacement !== "inside" ? -(n.indexLabelTextBlock.width + v) : -n.indexLabelTextBlock.width / 2 : i.indexLabelPlacement !== "inside" ? v : -n.indexLabelTextBlock.width / 2, n.indexLabelTextBlock.x += o, n.indexLabelTextBlock.render(!0), n.indexLabelTextBlock.x -= o, n.indexLabelTextBlock.y += n.indexLabelTextBlock.height / 2, n.indexLabelPlacement !== "inside" && (h = n.center.x + s * Math.cos(n.midAngle), c = n.center.y + s * Math.sin(n.midAngle), u.strokeStyle = n.indexLabelLineColor, u.lineWidth = n.indexLabelLineThickness, u.setLineDash && u.setLineDash(y(n.indexLabelLineDashType, n.indexLabelLineThickness)), u.beginPath(), u.moveTo(h, c), u.lineTo(n.indexLabelTextBlock.x, n.indexLabelTextBlock.y), u.lineTo(n.indexLabelTextBlock.x + (n.hemisphere === "left" ? -v : v), n.indexLabelTextBlock.y), u.stroke()), u.lineJoin = "miter")
+ }
+
+ function st(n) {
+ var s = r.plotArea.ctx,
+ h, u, a;
+ for (s.clearRect(f.x1, f.y1, f.width, f.height), s.fillStyle = r.backgroundColor, s.fillRect(f.x1, f.y1, f.width, f.height), h = t[0].startAngle + 2 * Math.PI * n, u = 0; u < e.length; u++) {
+ var c = u === 0 ? t[u].startAngle : o,
+ o = c + (t[u].endAngle - t[u].startAngle),
+ l = !1;
+ if (o > h && (o = h, l = !0), a = e[u].color ? e[u].color : i._colorSet[u % i._colorSet.length], o > c && dt(r.plotArea.ctx, t[u].center, t[u].radius, a, i.type, c, o, i.fillOpacity), l) break
+ }
+ }
+
+ function rt(n) {
+ var c = r.plotArea.ctx,
+ o, l, a, h, w;
+ for (c.clearRect(f.x1, f.y1, f.width, f.height), c.fillStyle = r.backgroundColor, c.fillRect(f.x1, f.y1, f.width, f.height), o = 0; o < e.length; o++)
+ if (l = t[o].startAngle, a = t[o].endAngle, a > l) {
+ var v = s * .07 * Math.cos(t[o].midAngle),
+ y = s * .07 * Math.sin(t[o].midAngle),
+ p = !1;
+ e[o].exploded ? (Math.abs(t[o].center.x - (u.x + v)) > 1e-9 || Math.abs(t[o].center.y - (u.y + y)) > 1e-9) && (t[o].center.x = u.x + v * n, t[o].center.y = u.y + y * n, p = !0) : (Math.abs(t[o].center.x - u.x) > 0 || Math.abs(t[o].center.y - u.y) > 0) && (t[o].center.x = u.x + v * (1 - n), t[o].center.y = u.y + y * (1 - n), p = !0);
+ p && (h = {}, h.dataSeries = i, h.dataPoint = i.dataPoints[o], h.index = o, r._toolTip.highlightObjects([h]));
+ w = e[o].color ? e[o].color : i._colorSet[o % i._colorSet.length];
+ dt(r.plotArea.ctx, t[o].center, t[o].radius, w, i.type, l, a, i.fillOpacity)
+ } ot()
+ }
+
+ function ht(n, t) {
+ var i = {
+ x1: n.indexLabelTextBlock.x,
+ y1: n.indexLabelTextBlock.y - n.indexLabelTextBlock.height / 2,
+ x2: n.indexLabelTextBlock.x + n.indexLabelTextBlock.width,
+ y2: n.indexLabelTextBlock.y + n.indexLabelTextBlock.height / 2
+ },
+ r = {
+ x1: t.indexLabelTextBlock.x,
+ y1: t.indexLabelTextBlock.y - t.indexLabelTextBlock.height / 2,
+ x2: t.indexLabelTextBlock.x + t.indexLabelTextBlock.width,
+ y2: t.indexLabelTextBlock.y + t.indexLabelTextBlock.height / 2
+ };
+ return i.x2 < r.x1 - v || i.x1 > r.x2 + v || i.y1 > r.y2 + v || i.y2 < r.y1 - v ? !1 : !0
+ }
+
+ function b(n, t) {
+ var i = {
+ y: n.indexLabelTextBlock.y,
+ y1: n.indexLabelTextBlock.y - n.indexLabelTextBlock.height / 2,
+ y2: n.indexLabelTextBlock.y + n.indexLabelTextBlock.height / 2
+ },
+ r = {
+ y: t.indexLabelTextBlock.y,
+ y1: t.indexLabelTextBlock.y - t.indexLabelTextBlock.height / 2,
+ y2: t.indexLabelTextBlock.y + t.indexLabelTextBlock.height / 2
+ };
+ return r.y > i.y ? r.y1 - i.y2 : i.y1 - r.y2
+ }
+
+ function d(n) {
+ for (var i = null, r = 1; r < e.length; r++)
+ if (i = (n + r + t.length) % t.length, t[i].hemisphere !== t[n].hemisphere) {
+ i = null;
+ break
+ } else if (t[i].indexLabelText && i !== n && (b(t[i], t[n]) < 0 || (t[n].hemisphere === "right" ? t[i].indexLabelTextBlock.y >= t[n].indexLabelTextBlock.y : t[i].indexLabelTextBlock.y <= t[n].indexLabelTextBlock.y))) break;
+ else i = null;
+ return i
+ }
+
+ function ct(n) {
+ for (var i = null, r = 1; r < e.length; r++)
+ if (i = (n - r + t.length) % t.length, t[i].hemisphere !== t[n].hemisphere) {
+ i = null;
+ break
+ } else if (t[i].indexLabelText && t[i].hemisphere === t[n].hemisphere && i !== n && (b(t[i], t[n]) < 0 || (t[n].hemisphere === "right" ? t[i].indexLabelTextBlock.y <= t[n].indexLabelTextBlock.y : t[i].indexLabelTextBlock.y >= t[n].indexLabelTextBlock.y))) break;
+ else i = null;
+ return i
+ }
+
+ function p(n, i) {
+ var r, ut, st, b, v, ft, o;
+ i = i || 0;
+ var k = 0,
+ rt = u.y - h * 1,
+ et = u.y + h * 1;
+ if (n >= 0 && n < e.length) {
+ if (r = t[n], i < 0 && r.indexLabelTextBlock.y < rt || i > 0 && r.indexLabelTextBlock.y > et) return 0;
+ var f = i,
+ ot = 0,
+ ht = 0,
+ lt = 0,
+ at = 0,
+ vt = 0;
+ f < 0 ? r.indexLabelTextBlock.y - r.indexLabelTextBlock.height / 2 > rt && r.indexLabelTextBlock.y - r.indexLabelTextBlock.height / 2 + f < rt && (f = -(rt - (r.indexLabelTextBlock.y - r.indexLabelTextBlock.height / 2 + f))) : r.indexLabelTextBlock.y + r.indexLabelTextBlock.height / 2 < rt && r.indexLabelTextBlock.y + r.indexLabelTextBlock.height / 2 + f > et && (f = r.indexLabelTextBlock.y + r.indexLabelTextBlock.height / 2 + f - et);
+ ut = r.indexLabelTextBlock.y + f;
+ st = 0;
+ st = r.hemisphere === "right" ? u.x + Math.sqrt(Math.pow(h, 2) - Math.pow(ut - u.y, 2)) : u.x - Math.sqrt(Math.pow(h, 2) - Math.pow(ut - u.y, 2));
+ ht = u.x + s * Math.cos(r.midAngle);
+ lt = u.y + s * Math.sin(r.midAngle);
+ ot = Math.sqrt(Math.pow(st - ht, 2) + Math.pow(ut - lt, 2));
+ vt = Math.acos(s / h);
+ at = Math.acos((h * h + s * s - ot * ot) / (2 * s * h));
+ f = at < vt ? ut - r.indexLabelTextBlock.y : 0;
+ var yt = ct(n),
+ pt = d(n),
+ c, v, y = 0,
+ g = 0;
+ if (f < 0 ? (c = r.hemisphere === "right" ? yt : pt, k = f, c !== null && (b = -f, v = r.indexLabelTextBlock.y - r.indexLabelTextBlock.height / 2 - (t[c].indexLabelTextBlock.y + t[c].indexLabelTextBlock.height / 2), v - b < w && (y = -b, tt++, g = p(c, y), +g.toFixed(a) > +y.toFixed(a) && (k = v > w ? -(v - w) : -(b - (g - y)))))) : f > 0 && (c = r.hemisphere === "right" ? pt : yt, k = f, c !== null && (b = f, v = t[c].indexLabelTextBlock.y - t[c].indexLabelTextBlock.height / 2 - (r.indexLabelTextBlock.y + r.indexLabelTextBlock.height / 2), v - b < w && (y = b, tt++, g = p(c, y), +g.toFixed(a) < +y.toFixed(a) && (k = v > w ? v - w : b - (y - g))))), k) {
+ if (ft = r.indexLabelTextBlock.y + k, o = 0, o = r.hemisphere === "right" ? u.x + Math.sqrt(Math.pow(h, 2) - Math.pow(ft - u.y, 2)) : u.x - Math.sqrt(Math.pow(h, 2) - Math.pow(ft - u.y, 2)), r.midAngle > Math.PI / 2 - l && r.midAngle < Math.PI / 2 + l) {
+ var wt = (n - 1 + t.length) % t.length,
+ nt = t[wt],
+ it = t[(n + 1 + t.length) % t.length];
+ r.hemisphere === "left" && nt.hemisphere === "right" && o > nt.indexLabelTextBlock.x ? o = nt.indexLabelTextBlock.x - 15 : r.hemisphere === "right" && it.hemisphere === "left" && o < it.indexLabelTextBlock.x && (o = it.indexLabelTextBlock.x + 15)
+ } else if (r.midAngle > 3 * Math.PI / 2 - l && r.midAngle < 3 * Math.PI / 2 + l) {
+ var wt = (n - 1 + t.length) % t.length,
+ nt = t[wt],
+ it = t[(n + 1 + t.length) % t.length];
+ r.hemisphere === "right" && nt.hemisphere === "left" && o < nt.indexLabelTextBlock.x ? o = nt.indexLabelTextBlock.x + 15 : r.hemisphere === "left" && it.hemisphere === "right" && o > it.indexLabelTextBlock.x && (o = it.indexLabelTextBlock.x - 15)
+ }
+ r.indexLabelTextBlock.y = ft;
+ r.indexLabelTextBlock.x = o;
+ r.indexLabelAngle = Math.atan2(r.indexLabelTextBlock.y - u.y, r.indexLabelTextBlock.x - u.x)
+ }
+ }
+ return k
+ }
+
+ function lt() {
+ var yt = r.plotArea.ctx,
+ gt, tt, rt, l, kt, wt, n, ni, ti, dt, et, g, ot, nt, c, vt, lt;
+ yt.fillStyle = "grey";
+ yt.strokeStyle = "grey";
+ gt = 16;
+ yt.font = gt + "px Arial";
+ yt.textBaseline = "middle";
+ for (var o = 0, pt = 0, k = 0, pt = 0; pt < 10 && (pt < 1 || k > 0); pt++) {
+ if (s -= k, k = 0, i.indexLabelPlacement !== "inside") {
+ for (h = s * it, o = 0; o < e.length; o++) n = t[o], n.indexLabelTextBlock.x = u.x + h * Math.cos(n.midAngle), n.indexLabelTextBlock.y = u.y + h * Math.sin(n.midAngle), n.indexLabelAngle = n.midAngle, n.radius = s;
+ for (o = 0; o < e.length; o++)
+ if ((n = t[o], rt = d(o), rt !== null) && (tt = t[o], lt = t[rt], l = 0, l = b(tt, lt) - w, l < 0)) {
+ for (kt = 0, wt = 0, c = 0; c < e.length; c++) c !== o && t[c].hemisphere === n.hemisphere && (t[c].indexLabelTextBlock.y < n.indexLabelTextBlock.y ? kt++ : wt++);
+ var at = l / (kt + wt || 1) * wt,
+ y = -1 * (l - at),
+ ut = 0,
+ ft = 0;
+ n.hemisphere === "right" ? (ut = p(o, at), y = -1 * (l - ut), ft = p(rt, y), +ft.toFixed(a) < +y.toFixed(a) && +ut.toFixed(a) <= +at.toFixed(a) && p(o, -(y - ft))) : (ut = p(rt, at), y = -1 * (l - ut), ft = p(o, y), +ft.toFixed(a) < +y.toFixed(a) && +ut.toFixed(a) <= +at.toFixed(a) && p(rt, -(y - ft)))
+ }
+ } else
+ for (o = 0; o < e.length; o++) n = t[o], h = i.type === "pie" ? s * .7 : s * .8, ni = u.x + h * Math.cos(n.midAngle), ti = u.y + h * Math.sin(n.midAngle), n.indexLabelTextBlock.x = ni, n.indexLabelTextBlock.y = ti;
+ for (o = 0; o < e.length; o++)(n = t[o], dt = n.indexLabelTextBlock.measureText(), dt.height !== 0 && dt.width !== 0) && (et = 0, g = 0, et = n.hemisphere === "right" ? (f.x2 - (n.indexLabelTextBlock.x + n.indexLabelTextBlock.width + v)) * -1 : f.x1 - (n.indexLabelTextBlock.x - n.indexLabelTextBlock.width - v), et > 0 && (Math.abs(n.indexLabelTextBlock.y - n.indexLabelTextBlock.height / 2 - u.y) < s || Math.abs(n.indexLabelTextBlock.y + n.indexLabelTextBlock.height / 2 - u.y) < s) && (g = et / Math.abs(Math.cos(n.indexLabelAngle)), g > 9 && (g = g * .3), g > k && (k = g)), ot = 0, nt = 0, ot = n.indexLabelAngle > 0 && n.indexLabelAngle < Math.PI ? (f.y2 - (n.indexLabelTextBlock.y + n.indexLabelTextBlock.height / 2 + 5)) * -1 : f.y1 - (n.indexLabelTextBlock.y - n.indexLabelTextBlock.height / 2 - 5), ot > 0 && Math.abs(n.indexLabelTextBlock.x - u.x) < s && (nt = ot / Math.abs(Math.sin(n.indexLabelAngle)), nt > 9 && (nt = nt * .3), nt > k && (k = nt)));
+
+ function r(n, i, r) {
+ for (var f, o = [], s = 0, u = i;; u = (u + 1 + e.length) % e.length)
+ if (o.push(t[u]), u === r) break;
+ for (o.sort(function(n, t) {
+ return n.y - t.y
+ }), u = 0; u < o.length; u++)
+ if (f = o[u], s < n) s += f.indexLabelTextBlock.height, f.indexLabelTextBlock.text = "", f.indexLabelText = "", f.indexLabelTextBlock.measureText();
+ else break
+ }
+ var st = -1,
+ bt = -1,
+ ct = 0;
+ for (c = 0; c < e.length; c++)(tt = t[c], tt.indexLabelText) && (vt = d(c), vt !== null) && (lt = t[vt], l = 0, l = b(tt, lt), l < 0 && ht(tt, lt) ? (st < 0 && (st = c), vt !== st && (bt = vt), ct += -l) : ct > 0 && (r(ct, st, bt), st = -1, bt = -1, ct = 0));
+ ct > 0 && r(ct, st, bt)
+ }
+ }
+
+ function g() {
+ var t, n;
+ if (r.plotArea.layoutManager.reset(), r._title && (r._title.dockInsidePlotArea || r._title.horizontalAlign === "center" && r._title.verticalAlign === "center") && r._title.render(), r.subtitles)
+ for (t = 0; t < r.subtitles.length; t++) n = r.subtitles[t], (n.dockInsidePlotArea || n.horizontalAlign === "center" && n.verticalAlign === "center") && n.render();
+ r.legend && (r.legend.dockInsidePlotArea || r.legend.horizontalAlign === "center" && r.legend.verticalAlign === "center") && r.legend.render()
+ }
+ var r = this,
+ ut = n.dataSeriesIndexes.length,
+ o;
+ if (!(ut <= 0)) {
+ var ft = n.dataSeriesIndexes[0],
+ i = this.data[ft],
+ e = i.dataPoints,
+ v = 10,
+ nt = 500,
+ f = this.plotArea,
+ tt = 0,
+ t = [],
+ w = 2,
+ it = 1.3,
+ l = 20 / 180 * Math.PI,
+ a = 6,
+ u = {
+ x: (f.x2 + f.x1) / 2,
+ y: (f.y2 + f.y1) / 2
+ },
+ s = i.indexLabelPlacement === "inside" ? Math.min(f.width, f.height) * .92 / 2 : Math.min(f.width, f.height) * .8 / 2,
+ at = s * .6,
+ h = s * it,
+ vt = s,
+ k = 0;
+ for (o = 0; o < e.length; o++) k += Math.abs(e[o].y);
+ k !== 0 && (this.pieDoughnutClickHandler = function(n) {
+ if (!r.isAnimating) {
+ var u = n.dataPointIndex,
+ t = n.dataPoint,
+ i = this,
+ f = i.dataPointIds[u];
+ t.exploded = t.exploded ? !1 : !0;
+ i.dataPoints.length > 1 && r._animator.animate(0, nt, function(n) {
+ rt(n);
+ g()
+ });
+ return
+ }
+ }, et(), lt(), this.disableToolTip = !0, this._animator.animate(0, this.animatedRender ? this.animationDuration : 0, function(n) {
+ st(n);
+ g()
+ }, function() {
+ r.disableToolTip = !1;
+ r._animator.animate(0, r.animatedRender ? nt : 0, function(n) {
+ rt(n);
+ g()
+ })
+ }))
+ }
+ };
+ t.prototype.animationRequestId = null;
+ t.prototype.requestAnimFrame = function() {
+ return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function(n) {
+ window.setTimeout(n, 1e3 / 60)
+ }
+ }();
+ t.prototype.cancelRequestAnimFrame = function() {
+ return window.cancelAnimationFrame || window.webkitCancelRequestAnimationFrame || window.mozCancelRequestAnimationFrame || window.oCancelRequestAnimationFrame || window.msCancelRequestAnimationFrame || clearTimeout
+ }();
+ ft.prototype.registerSpace = function(n, t) {
+ n === "top" ? this._topOccupied += t.height : n === "bottom" ? this._bottomOccupied += t.height : n === "left" ? this._leftOccupied += t.width : n === "right" && (this._rightOccupied += t.width)
+ };
+ ft.prototype.unRegisterSpace = function(n, t) {
+ n === "top" ? this._topOccupied -= t.height : n === "bottom" ? this._bottomOccupied -= t.height : n === "left" ? this._leftOccupied -= t.width : n === "right" && (this._rightOccupied -= t.width)
+ };
+ ft.prototype.getFreeSpace = function() {
+ return {
+ x1: this._x1 + this._leftOccupied,
+ y1: this._y1 + this._topOccupied,
+ x2: this._x2 - this._rightOccupied,
+ y2: this._y2 - this._bottomOccupied,
+ width: this._x2 - this._x1 - this._rightOccupied - this._leftOccupied,
+ height: this._y2 - this._y1 - this._bottomOccupied - this._topOccupied
+ }
+ };
+ ft.prototype.reset = function() {
+ this._topOccupied = this._padding;
+ this._bottomOccupied = this._padding;
+ this._leftOccupied = this._padding;
+ this._rightOccupied = this._padding
+ };
+ w(c, h);
+ c.prototype.render = function(n) {
+ var f, i, u;
+ n && this.ctx.save();
+ f = this.ctx.font;
+ this.ctx.textBaseline = this.textBaseline;
+ i = 0;
+ this._isDirty && this.measureText(this.ctx);
+ this.ctx.translate(this.x, this.y + i);
+ this.textBaseline === "middle" && (i = -this._lineHeight / 2);
+ this.ctx.font = this._getFontString();
+ this.ctx.rotate(Math.PI / 180 * this.angle);
+ var r = 0,
+ e = this.padding,
+ t = null;
+ for ((this.borderThickness > 0 && this.borderColor || this.backgroundColor) && this.ctx.roundRect(0, i, this.width, this.height, this.cornerRadius, this.borderThickness, this.backgroundColor, this.borderColor), this.ctx.fillStyle = this.fontColor, u = 0; u < this._wrappedText.lines.length; u++) t = this._wrappedText.lines[u], this.horizontalAlign === "right" ? r = this.width - t.width - this.padding : this.horizontalAlign === "left" ? r = this.padding : this.horizontalAlign === "center" && (r = (this.width - this.padding * 2) / 2 - t.width / 2 + this.padding), this.ctx.fillText(t.text, r, e), e += t.height;
+ this.ctx.font = f;
+ n && this.ctx.restore()
+ };
+ c.prototype.setText = function(n) {
+ this.text = n;
+ this._isDirty = !0;
+ this._wrappedText = null
+ };
+ c.prototype.measureText = function() {
+ if (this.maxWidth === null) throw "Please set maxWidth and height for TextBlock";
+ return this._wrapText(this.ctx), this._isDirty = !1, {
+ width: this.width,
+ height: this.height
+ }
+ };
+ c.prototype._getLineWithWidth = function(n, t, i) {
+ var r, h, e;
+ if (n = String(n), i = i || !1, !n) return {
+ text: "",
+ width: 0
+ };
+ var u = 0,
+ o = 0,
+ s = n.length - 1,
+ f = Infinity;
+ for (this.ctx.font = this._getFontString(); o <= s;)
+ if (f = Math.floor((o + s) / 2), r = n.substr(0, f + 1), u = this.ctx.measureText(r).width, u < t) o = f + 1;
+ else if (u > t) s = f - 1;
+ else break;
+ return u > t && r.length > 1 && (r = r.substr(0, r.length - 1), u = this.ctx.measureText(r).width), h = !0, (r.length === n.length || n[r.length] === " ") && (h = !1), h && (e = r.split(" "), e.length > 1 && e.pop(), r = e.join(" "), u = this.ctx.measureText(r).width), {
+ text: r,
+ width: u
+ }
+ };
+ c.prototype._wrapText = function() {
+ var t = new String(ht(String(this.text))),
+ u = [],
+ e = this.ctx.font,
+ i = 0,
+ r = 0,
+ n;
+ for (this.ctx.font = this._getFontString(); t.length > 0;) {
+ var o = this.maxWidth - this.padding * 2,
+ f = this.maxHeight - this.padding * 2,
+ n = this._getLineWithWidth(t, o, !1);
+ n.height = this._lineHeight;
+ u.push(n);
+ r = Math.max(r, n.width);
+ i += n.height;
+ t = ht(t.slice(n.text.length, t.length));
+ f && i > f && (n = u.pop(), i -= n.height)
+ }
+ this._wrappedText = {
+ lines: u,
+ width: r,
+ height: i
+ };
+ this.width = r + this.padding * 2;
+ this.height = i + this.padding * 2;
+ this.ctx.font = e
+ };
+ c.prototype._getFontString = function() {
+ return gi("", this, null)
+ };
+ w(lt, h);
+ lt.prototype.render = function() {
+ var e, i;
+ if (this.text) {
+ var o = this.dockInsidePlotArea ? this.chart.plotArea : this.chart,
+ n = o.layoutManager.getFreeSpace(),
+ u = n.x1,
+ f = n.y1,
+ h = 0,
+ s = 0,
+ t = 2,
+ a = this.chart._menuButton && this.chart.exportEnabled && this.verticalAlign === "top" ? 22 : 0,
+ l, r;
+ this.verticalAlign === "top" || this.verticalAlign === "bottom" ? (this.maxWidth === null && (this.maxWidth = n.width - t * 2 - a * (this.horizontalAlign === "center" ? 2 : 1)), s = n.height * .5 - this.margin - t, h = 0) : this.verticalAlign === "center" && (this.horizontalAlign === "left" || this.horizontalAlign === "right" ? (this.maxWidth === null && (this.maxWidth = n.height - t * 2), s = n.width * .5 - this.margin - t) : this.horizontalAlign === "center" && (this.maxWidth === null && (this.maxWidth = n.width - t * 2), s = n.height * .5 - t * 2));
+ this.wrap || (s = Math.min(s, Math.max(this.fontSize * 1.5, this.fontSize + this.padding * 2.5)));
+ e = new c(this.ctx, {
+ fontSize: this.fontSize,
+ fontFamily: this.fontFamily,
+ fontColor: this.fontColor,
+ fontStyle: this.fontStyle,
+ fontWeight: this.fontWeight,
+ horizontalAlign: this.horizontalAlign,
+ verticalAlign: this.verticalAlign,
+ borderColor: this.borderColor,
+ borderThickness: this.borderThickness,
+ backgroundColor: this.backgroundColor,
+ maxWidth: this.maxWidth,
+ maxHeight: s,
+ cornerRadius: this.cornerRadius,
+ text: this.text,
+ padding: this.padding,
+ textBaseline: "top"
+ });
+ i = e.measureText();
+ this.verticalAlign === "top" || this.verticalAlign === "bottom" ? (this.verticalAlign === "top" ? (f = n.y1 + t, r = "top") : this.verticalAlign === "bottom" && (f = n.y2 - t - i.height, r = "bottom"), this.horizontalAlign === "left" ? u = n.x1 + t : this.horizontalAlign === "center" ? u = n.x1 + n.width / 2 - i.width / 2 : this.horizontalAlign === "right" && (u = n.x2 - t - i.width - a), l = this.horizontalAlign, this.width = i.width, this.height = i.height) : this.verticalAlign === "center" && (this.horizontalAlign === "left" ? (u = n.x1 + t, f = n.y2 - t - (this.maxWidth / 2 - i.width / 2), h = -90, r = "left", this.width = i.height, this.height = i.width) : this.horizontalAlign === "right" ? (u = n.x2 - t, f = n.y1 + t + (this.maxWidth / 2 - i.width / 2), h = 90, r = "right", this.width = i.height, this.height = i.width) : this.horizontalAlign === "center" && (f = o.y1 + (o.height / 2 - i.height / 2), u = o.x1 + (o.width / 2 - i.width / 2), r = "center", this.width = i.width, this.height = i.height), l = "center");
+ e.x = u;
+ e.y = f;
+ e.angle = h;
+ e.horizontalAlign = l;
+ e.render(!0);
+ o.layoutManager.registerSpace(r, {
+ width: this.width + (r === "left" || r === "right" ? this.margin + t : 0),
+ height: this.height + (r === "top" || r === "bottom" ? this.margin + t : 0)
+ });
+ this.bounds = {
+ x1: u,
+ y1: f,
+ x2: u + this.width,
+ y2: f + this.height
+ };
+ this.ctx.textBaseline = "top"
+ }
+ };
+ w(gt, h);
+ gt.prototype.render = lt.prototype.render;
+ w(ni, h);
+ ni.prototype.render = function() {
+ var ot = this.dockInsidePlotArea ? this.chart.plotArea : this.chart,
+ f = ot.layoutManager.getFreeSpace(),
+ ft = null,
+ w = 0,
+ b = 0,
+ s = 0,
+ h = 0,
+ y = [],
+ k = [],
+ t, p, n, it, e, r, v, nt, at;
+ for (this.verticalAlign === "top" || this.verticalAlign === "bottom" ? (this.orientation = "horizontal", ft = this.verticalAlign, s = this.maxWidth !== null ? this.maxWidth : f.width * .7, h = this.maxHeight !== null ? this.maxHeight : f.height * .5) : this.verticalAlign === "center" && (this.orientation = "vertical", ft = this.horizontalAlign, s = this.maxWidth !== null ? this.maxWidth : f.width * .5, h = this.maxHeight !== null ? this.maxHeight : f.height * .7), e = 0; e < this.dataSeries.length; e++) {
+ if (t = this.dataSeries[e], t.type !== "pie" && t.type !== "doughnut" && t.type !== "funnel") {
+ var st = t.legendMarkerType ? t.legendMarkerType : (t.type === "line" || t.type === "stepLine" || t.type === "spline" || t.type === "scatter" || t.type === "bubble") && t.markerType ? t.markerType : d.getDefaultLegendMarker(t.type),
+ g = t.legendText ? t.legendText : this.itemTextFormatter ? this.itemTextFormatter({
+ chart: this.chart,
+ legend: this._options,
+ dataSeries: t,
+ dataPoint: null
+ }) : t.name,
+ ht = t.legendMarkerColor ? t.legendMarkerColor : t.markerColor ? t.markerColor : t._colorSet[0],
+ o = !t.markerSize && (t.type === "line" || t.type === "stepLine" || t.type === "spline") ? 0 : this.lineHeight * .6,
+ ct = t.legendMarkerBorderColor ? t.legendMarkerBorderColor : t.markerBorderColor,
+ lt = t.legendMarkerBorderThickness ? t.legendMarkerBorderThickness : t.markerBorderThickness ? Math.max(1, Math.round(o * .2)) : 0,
+ vt = t._colorSet[0];
+ g = this.chart.replaceKeywordsWithValue(g, t.dataPoints[0], t, e);
+ n = {
+ markerType: st,
+ markerColor: ht,
+ text: g,
+ textBlock: null,
+ chartType: t.type,
+ markerSize: o,
+ lineColor: t._colorSet[0],
+ dataSeriesIndex: t.index,
+ dataPointIndex: null,
+ markerBorderColor: ct,
+ markerBorderThickness: lt
+ };
+ y.push(n)
+ } else
+ for (p = 0; p < t.dataPoints.length; p++) {
+ var i = t.dataPoints[p],
+ st = i.legendMarkerType ? i.legendMarkerType : t.legendMarkerType ? t.legendMarkerType : d.getDefaultLegendMarker(t.type),
+ g = i.legendText ? i.legendText : t.legendText ? t.legendText : this.itemTextFormatter ? this.itemTextFormatter({
+ chart: this.chart,
+ legend: this._options,
+ dataSeries: t,
+ dataPoint: i
+ }) : i.name ? i.name : "DataPoint: " + (p + 1),
+ ht = i.legendMarkerColor ? i.legendMarkerColor : t.legendMarkerColor ? t.legendMarkerColor : i.color ? i.color : t.color ? t.color : t._colorSet[p % t._colorSet.length],
+ o = this.lineHeight * .6,
+ ct = i.legendMarkerBorderColor ? i.legendMarkerBorderColor : t.legendMarkerBorderColor ? t.legendMarkerBorderColor : i.markerBorderColor ? i.markerBorderColor : t.markerBorderColor,
+ lt = i.legendMarkerBorderThickness ? i.legendMarkerBorderThickness : t.legendMarkerBorderThickness ? t.legendMarkerBorderThickness : i.markerBorderThickness || t.markerBorderThickness ? Math.max(1, Math.round(o * .2)) : 0;
+ g = this.chart.replaceKeywordsWithValue(g, i, t, p);
+ n = {
+ markerType: st,
+ markerColor: ht,
+ text: g,
+ textBlock: null,
+ chartType: t.type,
+ markerSize: o,
+ dataSeriesIndex: e,
+ dataPointIndex: p,
+ markerBorderColor: ct,
+ markerBorderThickness: lt
+ };
+ (i.showInLegend || t.showInLegend && i.showInLegend !== !1) && y.push(n)
+ }
+ n = null
+ }
+ if (this.reversed === !0 && y.reverse(), y.length > 0) {
+ var r = null,
+ et = 0,
+ l = 0,
+ v = 0;
+ for (l = this.itemWidth !== null ? this.itemMaxWidth !== null ? Math.min(this.itemWidth, this.itemMaxWidth, s) : Math.min(this.itemWidth, s) : this.itemMaxWidth !== null ? Math.min(this.itemMaxWidth, s) : s, o = o === 0 ? this.lineHeight * .6 : o, l = l - (o + this.horizontalSpacing * .1), e = 0; e < y.length; e++)(n = y[e], (n.chartType === "line" || n.chartType === "spline" || n.chartType === "stepLine") && (l = l - 2 * this.lineHeight * .1), h <= 0 || typeof h == "undefined" || l <= 0 || typeof l == "undefined") || (this.orientation === "horizontal" ? (n.textBlock = new c(this.ctx, {
+ x: 0,
+ y: 0,
+ maxWidth: l,
+ maxHeight: this.itemWrap ? h : this.lineHeight,
+ angle: 0,
+ text: n.text,
+ horizontalAlign: "left",
+ fontSize: this.fontSize,
+ fontFamily: this.fontFamily,
+ fontWeight: this.fontWeight,
+ fontColor: this.fontColor,
+ fontStyle: this.fontStyle,
+ textBaseline: "top"
+ }), n.textBlock.measureText(), this.itemWidth !== null && (n.textBlock.width = this.itemWidth - (o + this.horizontalSpacing * .1 + (n.chartType === "line" || n.chartType === "spline" || n.chartType === "stepLine" ? 2 * this.lineHeight * .1 : 0))), (!r || r.width + Math.round(n.textBlock.width + this.horizontalSpacing * .1 + o + (r.width === 0 ? 0 : this.horizontalSpacing) + (n.chartType === "line" || n.chartType === "spline" || n.chartType === "stepLine" ? 2 * this.lineHeight * .1 : 0)) > s) && (r = {
+ items: [],
+ width: 0
+ }, k.push(r), this.height += v, v = 0), v = Math.max(v, n.textBlock.height), n.textBlock.x = r.width, n.textBlock.y = 0, r.width += Math.round(n.textBlock.width + this.horizontalSpacing * .1 + o + (r.width === 0 ? 0 : this.horizontalSpacing) + (n.chartType === "line" || n.chartType === "spline" || n.chartType === "stepLine" ? 2 * this.lineHeight * .1 : 0)), r.items.push(n), this.width = Math.max(r.width, this.width)) : (n.textBlock = new c(this.ctx, {
+ x: 0,
+ y: 0,
+ maxWidth: l,
+ maxHeight: this.itemWrap === !0 ? h : this.fontSize * 1.5,
+ angle: 0,
+ text: n.text,
+ horizontalAlign: "left",
+ fontSize: this.fontSize,
+ fontFamily: this.fontFamily,
+ fontWeight: this.fontWeight,
+ fontColor: this.fontColor,
+ fontStyle: this.fontStyle,
+ textBaseline: "top"
+ }), n.textBlock.measureText(), this.itemWidth !== null && (n.textBlock.width = this.itemWidth - (o + this.horizontalSpacing * .1 + (n.chartType === "line" || n.chartType === "spline" || n.chartType === "stepLine" ? 2 * this.lineHeight * .1 : 0))), this.height <= h ? (r = {
+ items: [],
+ width: 0
+ }, k.push(r)) : (r = k[et], et = (et + 1) % k.length), this.height += n.textBlock.height, n.textBlock.x = r.width, n.textBlock.y = 0, r.width += Math.round(n.textBlock.width + this.horizontalSpacing * .1 + o + (r.width === 0 ? 0 : this.horizontalSpacing) + (n.chartType === "line" || n.chartType === "spline" || n.chartType === "stepLine" ? 2 * this.lineHeight * .1 : 0)), r.items.push(n), this.width = Math.max(r.width, this.width)));
+ this.itemWrap === !1 ? this.height = k.length * this.lineHeight : this.height += v;
+ this.height = Math.min(h, this.height);
+ this.width = Math.min(s, this.width)
+ }
+ for (this.verticalAlign === "top" ? (b = this.horizontalAlign === "left" ? f.x1 : this.horizontalAlign === "right" ? f.x2 - this.width : f.x1 + f.width / 2 - this.width / 2, w = f.y1) : this.verticalAlign === "center" ? (b = this.horizontalAlign === "left" ? f.x1 : this.horizontalAlign === "right" ? f.x2 - this.width : f.x1 + f.width / 2 - this.width / 2, w = f.y1 + f.height / 2 - this.height / 2) : this.verticalAlign === "bottom" && (b = this.horizontalAlign === "left" ? f.x1 : this.horizontalAlign === "right" ? f.x2 - this.width : f.x1 + f.width / 2 - this.width / 2, w = f.y2 - this.height), this.items = y, e = 0; e < this.items.length; e++) n = y[e], n.id = ++this.chart._eventManager.lastObjectId, this.chart._eventManager.objectMap[n.id] = {
+ id: n.id,
+ objectType: "legendItem",
+ legendItemIndex: e,
+ dataSeriesIndex: n.dataSeriesIndex,
+ dataPointIndex: n.dataPointIndex
+ };
+ for (it = 0, e = 0; e < k.length; e++) {
+ for (r = k[e], v = 0, nt = 0; nt < r.items.length; nt++) {
+ var n = r.items[nt],
+ tt = n.textBlock.x + b + (nt === 0 ? o * .2 : this.horizontalSpacing),
+ rt = w + it,
+ ut = tt;
+ this.chart.data[n.dataSeriesIndex].visible || (this.ctx.globalAlpha = .5);
+ this.ctx.save();
+ this.ctx.rect(b, w, s, h);
+ this.ctx.clip();
+ (n.chartType === "line" || n.chartType === "stepLine" || n.chartType === "spline") && (this.ctx.strokeStyle = n.lineColor, this.ctx.lineWidth = Math.ceil(this.lineHeight / 8), this.ctx.beginPath(), this.ctx.moveTo(tt - this.lineHeight * .1, rt + this.lineHeight / 2), this.ctx.lineTo(tt + this.lineHeight * .7, rt + this.lineHeight / 2), this.ctx.stroke(), ut -= this.lineHeight * .1);
+ a.drawMarker(tt + o / 2, rt + this.lineHeight / 2, this.ctx, n.markerType, n.markerSize, n.markerColor, n.markerBorderColor, n.markerBorderThickness);
+ n.textBlock.x = tt + this.horizontalSpacing * .1 + o;
+ (n.chartType === "line" || n.chartType === "stepLine" || n.chartType === "spline") && (n.textBlock.x = n.textBlock.x + this.lineHeight * .1);
+ n.textBlock.y = rt;
+ n.textBlock.render(!0);
+ this.ctx.restore();
+ v = nt > 0 ? Math.max(v, n.textBlock.height) : n.textBlock.height;
+ this.chart.data[n.dataSeriesIndex].visible || (this.ctx.globalAlpha = 1);
+ at = u(n.id);
+ this.ghostCtx.fillStyle = at;
+ this.ghostCtx.beginPath();
+ this.ghostCtx.fillRect(ut, n.textBlock.y, n.textBlock.x + n.textBlock.width - ut, n.textBlock.height);
+ n.x1 = this.chart._eventManager.objectMap[n.id].x1 = ut;
+ n.y1 = this.chart._eventManager.objectMap[n.id].y1 = n.textBlock.y;
+ n.x2 = this.chart._eventManager.objectMap[n.id].x2 = n.textBlock.x + n.textBlock.width;
+ n.y2 = this.chart._eventManager.objectMap[n.id].y2 = n.textBlock.y + n.textBlock.height
+ }
+ it = it + v
+ }
+ ot.layoutManager.registerSpace(ft, {
+ width: this.width + 2 + 2,
+ height: this.height + 5 + 5
+ });
+ this.bounds = {
+ x1: b,
+ y1: w,
+ x2: b + this.width,
+ y2: w + this.height
+ }
+ };
+ w(fi, h);
+ fi.prototype.render = function() {
+ var n = this.chart.layoutManager.getFreeSpace();
+ this.ctx.fillStyle = "red";
+ this.ctx.fillRect(n.x1, n.y1, n.x2, n.y2)
+ };
+ w(d, h);
+ d.prototype.getDefaultAxisPlacement = function() {
+ var n = this.type;
+ return n === "column" || n === "line" || n === "stepLine" || n === "spline" || n === "area" || n === "stepArea" || n === "splineArea" || n === "stackedColumn" || n === "stackedLine" || n === "bubble" || n === "scatter" || n === "stackedArea" || n === "stackedColumn100" || n === "stackedLine100" || n === "stackedArea100" || n === "candlestick" || n === "ohlc" || n === "rangeColumn" || n === "rangeArea" || n === "rangeSplineArea" ? "normal" : n === "bar" || n === "stackedBar" || n === "stackedBar100" || n === "rangeBar" ? "xySwapped" : n === "pie" || n === "doughnut" || n === "funnel" ? "none" : (window.console.log("Unknown Chart Type: " + n), null)
+ };
+ d.getDefaultLegendMarker = function(n) {
+ return n === "column" || n === "stackedColumn" || n === "stackedLine" || n === "bar" || n === "stackedBar" || n === "stackedBar100" || n === "bubble" || n === "scatter" || n === "stackedColumn100" || n === "stackedLine100" || n === "stepArea" || n === "candlestick" || n === "ohlc" || n === "rangeColumn" || n === "rangeBar" || n === "rangeArea" || n === "rangeSplineArea" ? "square" : n === "line" || n === "stepLine" || n === "spline" || n === "pie" || n === "doughnut" || n === "funnel" ? "circle" : n === "area" || n === "splineArea" || n === "stackedArea" || n === "stackedArea100" ? "triangle" : (window.console.log("Unknown Chart Type: " + n), null)
+ };
+ d.prototype.getDataPointAtX = function(n, t) {
+ var s, h, c;
+ if (!this.dataPoints || this.dataPoints.length === 0) return null;
+ var i = {
+ dataPoint: null,
+ distance: Infinity,
+ index: NaN
+ },
+ o = null,
+ r = 0,
+ u = 0,
+ f = 1,
+ l = Infinity,
+ a = 0,
+ v = 0,
+ y = 1e3,
+ e = 0;
+ for (this.chart.plotInfo.axisPlacement !== "none" && (s = this.dataPoints[this.dataPoints.length - 1].x - this.dataPoints[0].x, e = s > 0 ? Math.min(Math.max((this.dataPoints.length - 1) / s * (n - this.dataPoints[0].x) >> 0, 0), this.dataPoints.length) : 0);;) {
+ if (u = f > 0 ? e + r : e - r, u >= 0 && u < this.dataPoints.length) {
+ if (o = this.dataPoints[u], h = Math.abs(o.x - n), h < i.distance && (i.dataPoint = o, i.distance = h, i.index = u), c = Math.abs(o.x - n), c <= l ? l = c : f > 0 ? a++ : v++, a > y && v > y) break
+ } else if (e - r < 0 && e + r >= this.dataPoints.length) break;
+ f === -1 ? (r++, f = 1) : f = -1
+ }
+ return t || i.dataPoint.x !== n ? t && i.dataPoint !== null ? i : null : i
+ };
+ d.prototype.getDataPointAtXY = function(n, t, i) {
+ var et, ut, nt, a, h, d, ot, tt, v, y, w;
+ if (!this.dataPoints || this.dataPoints.length === 0) return null;
+ i = i || !1;
+ var e = [],
+ b = 0,
+ f = 0,
+ l = 1,
+ s = !1,
+ g = Infinity,
+ it = 0,
+ rt = 0,
+ ft = 1e3,
+ k = 0;
+ for (this.chart.plotInfo.axisPlacement !== "none" && (et = this.chart.axisX.getXValueAt({
+ x: n,
+ y: t
+ }), ut = this.dataPoints[this.dataPoints.length - 1].x - this.dataPoints[0].x, k = ut > 0 ? Math.min(Math.max((this.dataPoints.length - 1) / ut * (et - this.dataPoints[0].x) >> 0, 0), this.dataPoints.length) : 0);;) {
+ if (f = l > 0 ? k + b : k - b, f >= 0 && f < this.dataPoints.length) {
+ var st = this.dataPointIds[f],
+ r = this.chart._eventManager.objectMap[st],
+ o = this.dataPoints[f],
+ u = null;
+ if (r) {
+ switch (this.type) {
+ case "column":
+ case "stackedColumn":
+ case "stackedColumn100":
+ case "bar":
+ case "stackedBar":
+ case "stackedBar100":
+ case "rangeColumn":
+ case "rangeBar":
+ n >= r.x1 && n <= r.x2 && t >= r.y1 && t <= r.y2 && (e.push({
+ dataPoint: o,
+ dataPointIndex: f,
+ dataSeries: this,
+ distance: Math.min(Math.abs(r.x1 - n), Math.abs(r.x2 - n), Math.abs(r.y1 - t), Math.abs(r.y2 - t))
+ }), s = !0);
+ break;
+ case "line":
+ case "stepLine":
+ case "spline":
+ case "area":
+ case "stepArea":
+ case "stackedArea":
+ case "stackedArea100":
+ case "splineArea":
+ case "scatter":
+ h = p("markerSize", o, this) || 4;
+ nt = i ? 20 : h;
+ u = Math.sqrt(Math.pow(r.x1 - n, 2) + Math.pow(r.y1 - t, 2));
+ u <= nt && e.push({
+ dataPoint: o,
+ dataPointIndex: f,
+ dataSeries: this,
+ distance: u
+ });
+ a = Math.abs(r.x1 - n);
+ a <= g ? g = a : l > 0 ? it++ : rt++;
+ u <= h / 2 && (s = !0);
+ break;
+ case "rangeArea":
+ case "rangeSplineArea":
+ h = p("markerSize", o, this) || 4;
+ nt = i ? 20 : h;
+ u = Math.min(Math.sqrt(Math.pow(r.x1 - n, 2) + Math.pow(r.y1 - t, 2)), Math.sqrt(Math.pow(r.x1 - n, 2) + Math.pow(r.y2 - t, 2)));
+ u <= nt && e.push({
+ dataPoint: o,
+ dataPointIndex: f,
+ dataSeries: this,
+ distance: u
+ });
+ a = Math.abs(r.x1 - n);
+ a <= g ? g = a : l > 0 ? it++ : rt++;
+ u <= h / 2 && (s = !0);
+ break;
+ case "bubble":
+ h = r.size;
+ u = Math.sqrt(Math.pow(r.x1 - n, 2) + Math.pow(r.y1 - t, 2));
+ u <= h / 2 && (e.push({
+ dataPoint: o,
+ dataPointIndex: f,
+ dataSeries: this,
+ distance: u
+ }), s = !0);
+ break;
+ case "pie":
+ case "doughnut":
+ if (d = r.center, ot = this.type === "doughnut" ? .6 * r.radius : 0, u = Math.sqrt(Math.pow(d.x - n, 2) + Math.pow(d.y - t, 2)), u < r.radius && u > ot) {
+ var ht = t - d.y,
+ ct = n - d.x,
+ c = Math.atan2(ht, ct);
+ c < 0 && (c += Math.PI * 2);
+ c = Number(((c / Math.PI * 180 % 360 + 360) % 360).toFixed(12));
+ tt = Number(((r.startAngle / Math.PI * 180 % 360 + 360) % 360).toFixed(12));
+ v = Number(((r.endAngle / Math.PI * 180 % 360 + 360) % 360).toFixed(12));
+ v === 0 && r.endAngle > 1 && (v = 360);
+ tt >= v && o.y !== 0 && (v += 360, c < tt && (c += 360));
+ c > tt && c < v && (e.push({
+ dataPoint: o,
+ dataPointIndex: f,
+ dataSeries: this,
+ distance: 0
+ }), s = !0)
+ }
+ break;
+ case "candlestick":
+ (n >= r.x1 - r.borderThickness / 2 && n <= r.x2 + r.borderThickness / 2 && t >= r.y2 - r.borderThickness / 2 && t <= r.y3 + r.borderThickness / 2 || Math.abs(r.x2 - n + r.x1 - n) < r.borderThickness && t >= r.y1 && t <= r.y4) && (e.push({
+ dataPoint: o,
+ dataPointIndex: f,
+ dataSeries: this,
+ distance: Math.min(Math.abs(r.x1 - n), Math.abs(r.x2 - n), Math.abs(r.y2 - t), Math.abs(r.y3 - t))
+ }), s = !0);
+ break;
+ case "ohlc":
+ (Math.abs(r.x2 - n + r.x1 - n) < r.borderThickness && t >= r.y2 && t <= r.y3 || n >= r.x1 && n <= (r.x2 + r.x1) / 2 && t >= r.y1 - r.borderThickness / 2 && t <= r.y1 + r.borderThickness / 2 || n >= (r.x1 + r.x2) / 2 && n <= r.x2 && t >= r.y4 - r.borderThickness / 2 && t <= r.y4 + r.borderThickness / 2) && (e.push({
+ dataPoint: o,
+ dataPointIndex: f,
+ dataSeries: this,
+ distance: Math.min(Math.abs(r.x1 - n), Math.abs(r.x2 - n), Math.abs(r.y2 - t), Math.abs(r.y3 - t))
+ }), s = !0)
+ }
+ if (s || it > ft && rt > ft) break
+ }
+ } else if (k - b < 0 && k + b >= this.dataPoints.length) break;
+ l === -1 ? (b++, l = 1) : l = -1
+ }
+ for (y = null, w = 0; w < e.length; w++) y ? e[w].distance <= y.distance && (y = e[w]) : y = e[w];
+ return y
+ };
+ d.prototype.getMarkerProperties = function(n, t, i, r) {
+ var u = this.dataPoints,
+ f = this,
+ e = u[n].markerColor ? u[n].markerColor : f.markerColor ? f.markerColor : u[n].color ? u[n].color : f.color ? f.color : f._colorSet[n % f._colorSet.length],
+ o = u[n].markerBorderColor ? u[n].markerBorderColor : f.markerBorderColor ? f.markerBorderColor : null,
+ s = u[n].markerBorderThickness ? u[n].markerBorderThickness : f.markerBorderThickness ? f.markerBorderThickness : null,
+ h = u[n].markerType ? u[n].markerType : f.markerType,
+ c = u[n].markerSize ? u[n].markerSize : f.markerSize;
+ return {
+ x: t,
+ y: i,
+ ctx: r,
+ type: h,
+ size: c,
+ color: e,
+ borderColor: o,
+ borderThickness: s
+ }
+ };
+ w(e, h);
+ e.prototype.createLabels = function() {
+ var i, n = 0,
+ f, r = 0,
+ u = 0,
+ e = 0,
+ s, o, t;
+ if (this._position === "bottom" || this._position === "top" ? (e = this.lineCoordinates.width / Math.abs(this.maximum - this.minimum) * this.interval, r = this.labelAutoFit ? typeof this._options.labelMaxWidth == "undefined" ? e * .9 >> 0 : this.labelMaxWidth : typeof this._options.labelMaxWidth == "undefined" ? this.chart.width * .7 >> 0 : this.labelMaxWidth, u = typeof this._options.labelWrap == "undefined" || this.labelWrap ? this.chart.height * .5 >> 0 : this.labelFontSize * 1.5) : (this._position === "left" || this._position === "right") && (e = this.lineCoordinates.height / Math.abs(this.maximum - this.minimum) * this.interval, r = this.labelAutoFit ? typeof this._options.labelMaxWidth == "undefined" ? this.chart.width * .3 >> 0 : this.labelMaxWidth : typeof this._options.labelMaxWidth == "undefined" ? this.chart.width * .5 >> 0 : this.labelMaxWidth, u = typeof this._options.labelWrap == "undefined" || this.labelWrap ? e * 2 >> 0 : this.labelFontSize * 1.5), this.type === "axisX" && this.chart.plotInfo.axisXValueType === "dateTime")
+ for (f = oi(new Date(this.maximum), this.interval, this.intervalType), n = this.intervalstartTimePercent; n < f; oi(n, this.interval, this.intervalType)) s = n.getTime(), o = this.labelFormatter ? this.labelFormatter({
+ chart: this.chart,
+ axis: this._options,
+ value: n,
+ label: this.labels[n] ? this.labels[n] : null
+ }) : this.type === "axisX" && this.labels[s] ? this.labels[s] : ii(n, this.valueFormatString, this.chart._cultureInfo), i = new c(this.ctx, {
+ x: 0,
+ y: 0,
+ maxWidth: r,
+ maxHeight: u,
+ angle: this.labelAngle,
+ text: this.prefix + o + this.suffix,
+ horizontalAlign: "left",
+ fontSize: this.labelFontSize,
+ fontFamily: this.labelFontFamily,
+ fontWeight: this.labelFontWeight,
+ fontColor: this.labelFontColor,
+ fontStyle: this.labelFontStyle,
+ textBaseline: "middle"
+ }), this._labels.push({
+ position: n.getTime(),
+ textBlock: i,
+ effectiveHeight: null
+ });
+ else {
+ if (f = this.maximum, this.labels && this.labels.length) {
+ var l = Math.ceil(this.interval),
+ a = Math.ceil(this.intervalstartTimePercent),
+ h = !1;
+ for (n = a; n < this.maximum; n += l)
+ if (this.labels[n]) h = !0;
+ else {
+ h = !1;
+ break
+ } h && (this.interval = l, this.intervalstartTimePercent = a)
+ }
+ for (n = this.intervalstartTimePercent; n <= f; n = parseFloat((n + this.interval).toFixed(14))) o = this.labelFormatter ? this.labelFormatter({
+ chart: this.chart,
+ axis: this._options,
+ value: n,
+ label: this.labels[n] ? this.labels[n] : null
+ }) : this.type === "axisX" && this.labels[n] ? this.labels[n] : it(n, this.valueFormatString, this.chart._cultureInfo), i = new c(this.ctx, {
+ x: 0,
+ y: 0,
+ maxWidth: r,
+ maxHeight: u,
+ angle: this.labelAngle,
+ text: this.prefix + o + this.suffix,
+ horizontalAlign: "left",
+ fontSize: this.labelFontSize,
+ fontFamily: this.labelFontFamily,
+ fontWeight: this.labelFontWeight,
+ fontColor: this.labelFontColor,
+ fontStyle: this.labelFontStyle,
+ textBaseline: "middle",
+ borderThickness: 0
+ }), this._labels.push({
+ position: n,
+ textBlock: i,
+ effectiveHeight: null
+ })
+ }
+ for (n = 0; n < this.stripLines.length; n++) t = this.stripLines[n], i = new c(this.ctx, {
+ x: 0,
+ y: 0,
+ backgroundColor: t.labelBackgroundColor,
+ maxWidth: r,
+ maxHeight: u,
+ angle: this.labelAngle,
+ text: t.labelFormatter ? t.labelFormatter({
+ chart: this.chart,
+ axis: this,
+ stripLine: t
+ }) : t.label,
+ horizontalAlign: "left",
+ fontSize: t.labelFontSize,
+ fontFamily: t.labelFontFamily,
+ fontWeight: t.labelFontWeight,
+ fontColor: t._options.labelFontColor || t.color,
+ fontStyle: t.labelFontStyle,
+ textBaseline: "middle",
+ borderThickness: 0
+ }), this._labels.push({
+ position: t.value,
+ textBlock: i,
+ effectiveHeight: null,
+ stripLine: t
+ })
+ };
+ e.prototype.createLabelsAndCalculateWidth = function() {
+ var t = 0,
+ u, f;
+ if (this._labels = [], this._position === "left" || this._position === "right")
+ for (this.createLabels(), i = 0; i < this._labels.length; i++) {
+ var e = this._labels[i].textBlock,
+ r = e.measureText(),
+ n = 0;
+ n = this.labelAngle === 0 ? r.width : r.width * Math.cos(Math.PI / 180 * Math.abs(this.labelAngle)) + r.height / 2 * Math.sin(Math.PI / 180 * Math.abs(this.labelAngle));
+ t < n && (t = n);
+ this._labels[i].effectiveWidth = n
+ }
+ return u = this.title ? pt(this.titleFontFamily, this.titleFontSize, this.titleFontWeight) + 2 : 0, f = u + t + this.tickLength + 5, f
+ };
+ e.prototype.createLabelsAndCalculateHeight = function() {
+ var r = 0,
+ u, n, i, t, f;
+ if (this._labels = [], n = 0, this.createLabels(), this._position === "bottom" || this._position === "top")
+ for (n = 0; n < this._labels.length; n++) u = this._labels[n].textBlock, i = u.measureText(), t = 0, t = this.labelAngle === 0 ? i.height : i.width * Math.sin(Math.PI / 180 * Math.abs(this.labelAngle)) + i.height / 2 * Math.cos(Math.PI / 180 * Math.abs(this.labelAngle)), r < t && (r = t), this._labels[n].effectiveHeight = t;
+ return f = this.title ? pt(this.titleFontFamily, this.titleFontSize, this.titleFontWeight) + 2 : 0, f + r + this.tickLength + 5
+ };
+ e.setLayoutAndRender = function(n, t, i, r, u) {
+ var e, o, f, s, b = n.chart,
+ c = b.ctx,
+ a, v, k, y, p, w, d, g, h;
+ n.calculateAxisParameters();
+ t && t.calculateAxisParameters();
+ i && i.calculateAxisParameters();
+ t && i && typeof t._options.maximum == "undefined" && typeof t._options.minimum == "undefined" && typeof t._options.interval == "undefined" && typeof i._options.maximum == "undefined" && typeof i._options.minimum == "undefined" && typeof i._options.interval == "undefined" && (a = (t.maximum - t.minimum) / t.interval, v = (i.maximum - i.minimum) / i.interval, a > v ? i.maximum = i.interval * a + i.minimum : v > a && (t.maximum = t.interval * v + t.minimum));
+ var nt = t ? t.lineThickness ? t.lineThickness : 0 : 0,
+ tt = i ? i.lineThickness ? i.lineThickness : 0 : 0,
+ it = t ? t.gridThickness ? t.gridThickness : 0 : 0,
+ rt = i ? i.gridThickness ? i.gridThickness : 0 : 0,
+ l = t ? t.margin : 0,
+ ut = t ? t.margin : 0;
+ r === "normal" ? (n.lineCoordinates = {}, k = Math.ceil(t ? t.createLabelsAndCalculateWidth() : 0), e = Math.round(u.x1 + k + l), n.lineCoordinates.x1 = e, y = Math.ceil(i ? i.createLabelsAndCalculateWidth() : 0), f = Math.round(u.x2 - y > n.chart.width - 10 ? n.chart.width - 10 : u.x2 - y), n.lineCoordinates.x2 = f, n.lineCoordinates.width = Math.abs(f - e), p = Math.ceil(n.createLabelsAndCalculateHeight()), o = Math.round(u.y2 - p - n.margin), s = Math.round(u.y2 - n.margin), n.lineCoordinates.y1 = o, n.lineCoordinates.y2 = o, n.boundingRect = {
+ x1: e,
+ y1: o,
+ x2: f,
+ y2: s,
+ width: f - e,
+ height: s - o
+ }, t && (e = Math.round(u.x1 + t.margin), o = Math.round(u.y1 < 10 ? 10 : u.y1), f = Math.round(u.x1 + k + t.margin), s = Math.round(u.y2 - p - n.margin), t.lineCoordinates = {
+ x1: f,
+ y1: o,
+ x2: f,
+ y2: s,
+ height: Math.abs(s - o)
+ }, t.boundingRect = {
+ x1: e,
+ y1: o,
+ x2: f,
+ y2: s,
+ width: f - e,
+ height: s - o
+ }), i && (e = Math.round(n.lineCoordinates.x2), o = Math.round(u.y1 < 10 ? 10 : u.y1), f = Math.round(e + y + i.margin), s = Math.round(u.y2 - p - n.margin), i.lineCoordinates = {
+ x1: e,
+ y1: o,
+ x2: e,
+ y2: s,
+ height: Math.abs(s - o)
+ }, i.boundingRect = {
+ x1: e,
+ y1: o,
+ x2: f,
+ y2: s,
+ width: f - e,
+ height: s - o
+ }), n.calculateValueToPixelconversionParameters(), t && t.calculateValueToPixelconversionParameters(), i && i.calculateValueToPixelconversionParameters(), c.save(), c.rect(5, n.boundingRect.y1, n.chart.width - 10, n.boundingRect.height), c.clip(), n.renderLabelsTicksAndTitle(), c.restore(), t && t.renderLabelsTicksAndTitle(), i && i.renderLabelsTicksAndTitle(), b.preparePlotArea(), h = n.chart.plotArea, c.save(), c.rect(h.x1, h.y1, Math.abs(h.x2 - h.x1), Math.abs(h.y2 - h.y1)), c.clip(), n.renderStripLinesOfThicknessType("value"), t && t.renderStripLinesOfThicknessType("value"), i && i.renderStripLinesOfThicknessType("value"), n.renderInterlacedColors(), t && t.renderInterlacedColors(), i && i.renderInterlacedColors(), c.restore(), n.renderGrid(), t && t.renderGrid(), i && i.renderGrid(), n.renderAxisLine(), t && t.renderAxisLine(), i && i.renderAxisLine(), n.renderStripLinesOfThicknessType("pixel"), t && t.renderStripLinesOfThicknessType("pixel"), i && i.renderStripLinesOfThicknessType("pixel")) : (w = Math.ceil(n.createLabelsAndCalculateWidth()), t && (t.lineCoordinates = {}, e = Math.round(u.x1 + w + n.margin), f = Math.round(u.x2 > t.chart.width - 10 ? t.chart.width - 10 : u.x2), t.lineCoordinates.x1 = e, t.lineCoordinates.x2 = f, t.lineCoordinates.width = Math.abs(f - e)), i && (i.lineCoordinates = {}, e = Math.round(u.x1 + w + n.margin), f = Math.round(u.x2 > i.chart.width - 10 ? i.chart.width - 10 : u.x2), i.lineCoordinates.x1 = e, i.lineCoordinates.x2 = f, i.lineCoordinates.width = Math.abs(f - e)), d = Math.ceil(t ? t.createLabelsAndCalculateHeight() : 0), g = Math.ceil(i ? i.createLabelsAndCalculateHeight() : 0), t && (o = Math.round(u.y2 - d - t.margin), s = Math.round(u.y2 - l > t.chart.height - 10 ? t.chart.height - 10 : u.y2 - l), t.lineCoordinates.y1 = o, t.lineCoordinates.y2 = o, t.boundingRect = {
+ x1: e,
+ y1: o,
+ x2: f,
+ y2: s,
+ width: f - e,
+ height: d
+ }), i && (o = Math.round(u.y1 + i.margin), s = u.y1 + i.margin + g, i.lineCoordinates.y1 = s, i.lineCoordinates.y2 = s, i.boundingRect = {
+ x1: e,
+ y1: o,
+ x2: f,
+ y2: s,
+ width: f - e,
+ height: g
+ }), e = Math.round(u.x1 + n.margin), o = Math.round(i ? i.lineCoordinates.y2 : u.y1 < 10 ? 10 : u.y1), f = Math.round(u.x1 + w + n.margin), s = Math.round(t ? t.lineCoordinates.y1 : u.y2 - l > n.chart.height - 10 ? n.chart.height - 10 : u.y2 - l), n.lineCoordinates = {
+ x1: f,
+ y1: o,
+ x2: f,
+ y2: s,
+ height: Math.abs(s - o)
+ }, n.boundingRect = {
+ x1: e,
+ y1: o,
+ x2: f,
+ y2: s,
+ width: f - e,
+ height: s - o
+ }, n.calculateValueToPixelconversionParameters(), t && t.calculateValueToPixelconversionParameters(), i && i.calculateValueToPixelconversionParameters(), t && t.renderLabelsTicksAndTitle(), i && i.renderLabelsTicksAndTitle(), n.renderLabelsTicksAndTitle(), b.preparePlotArea(), h = n.chart.plotArea, c.save(), c.rect(h.x1, h.y1, Math.abs(h.x2 - h.x1), Math.abs(h.y2 - h.y1)), c.clip(), n.renderStripLinesOfThicknessType("value"), t && t.renderStripLinesOfThicknessType("value"), i && i.renderStripLinesOfThicknessType("value"), n.renderInterlacedColors(), t && t.renderInterlacedColors(), i && i.renderInterlacedColors(), c.restore(), n.renderGrid(), t && t.renderGrid(), i && i.renderGrid(), n.renderAxisLine(), t && t.renderAxisLine(), i && i.renderAxisLine(), n.renderStripLinesOfThicknessType("pixel"), t && t.renderStripLinesOfThicknessType("pixel"), i && i.renderStripLinesOfThicknessType("pixel"))
+ };
+ e.prototype.renderLabelsTicksAndTitle = function() {
+ var u = !1,
+ o = 0,
+ l = 1,
+ s = 0,
+ v = this.conversionParameters.pixelPerUnit * this.interval,
+ h, r, f, a, t, i, n, e;
+ if (this.labelAngle !== 0 && this.labelAngle !== 360 && (l = 1.2), typeof this._options.interval == "undefined") {
+ if (this._position === "bottom" || this._position === "top") {
+ for (n = 0; n < this._labels.length; n++)(t = this._labels[n], t.position < this.minimum || t.stripLine) || (h = t.textBlock.width * Math.cos(Math.PI / 180 * this.labelAngle) + t.textBlock.height * Math.sin(Math.PI / 180 * this.labelAngle), o += h);
+ o > this.lineCoordinates.width * l && (u = !0)
+ }
+ if (this._position === "left" || this._position === "right") {
+ for (n = 0; n < this._labels.length; n++)(t = this._labels[n], t.position < this.minimum || t.stripLine) || (h = t.textBlock.height * Math.cos(Math.PI / 180 * this.labelAngle) + t.textBlock.width * Math.sin(Math.PI / 180 * this.labelAngle), o += h);
+ o > this.lineCoordinates.height * l && (u = !0)
+ }
+ }
+ if (this._position === "bottom") {
+ for (n = 0, n = 0; n < this._labels.length; n++)(t = this._labels[n], t.position < this.minimum || t.position > this.maximum) || (i = this.getPixelCoordinatesOnAxis(t.position), (this.tickThickness && !this._labels[n].stripLine || this._labels[n].stripLine && this._labels[n].stripLine._thicknessType === "pixel") && (this._labels[n].stripLine ? (r = this._labels[n].stripLine, this.ctx.lineWidth = r.thickness, this.ctx.strokeStyle = r.color) : (this.ctx.lineWidth = this.tickThickness, this.ctx.strokeStyle = this.tickColor), f = this.ctx.lineWidth % 2 == 1 ? (i.x << 0) + .5 : i.x << 0, this.ctx.beginPath(), this.ctx.moveTo(f, i.y << 0), this.ctx.lineTo(f, i.y + this.tickLength << 0), this.ctx.stroke()), !u || s++ % 2 == 0 || this._labels[n].stripLine) && (t.textBlock.angle === 0 ? (i.x -= t.textBlock.width / 2, i.y += this.tickLength + t.textBlock.fontSize / 2) : (i.x -= this.labelAngle < 0 ? t.textBlock.width * Math.cos(Math.PI / 180 * this.labelAngle) : 0, i.y += this.tickLength + Math.abs(this.labelAngle < 0 ? t.textBlock.width * Math.sin(Math.PI / 180 * this.labelAngle) - 5 : 5)), t.textBlock.x = i.x, t.textBlock.y = i.y, t.textBlock.render(!0));
+ this.title && (this._titleTextBlock = new c(this.ctx, {
+ x: this.lineCoordinates.x1,
+ y: this.boundingRect.y2 - this.titleFontSize - 5,
+ maxWidth: this.lineCoordinates.width,
+ maxHeight: this.titleFontSize * 1.5,
+ angle: 0,
+ text: this.title,
+ horizontalAlign: "center",
+ fontSize: this.titleFontSize,
+ fontFamily: this.titleFontFamily,
+ fontWeight: this.titleFontWeight,
+ fontColor: this.titleFontColor,
+ fontStyle: this.titleFontStyle,
+ textBaseline: "top"
+ }), this._titleTextBlock.measureText(), this._titleTextBlock.x = this.lineCoordinates.x1 + this.lineCoordinates.width / 2 - this._titleTextBlock.width / 2, this._titleTextBlock.y = this.boundingRect.y2 - this._titleTextBlock.height - 3, this._titleTextBlock.render(!0))
+ } else if (this._position === "top") {
+ for (n = 0, n = 0; n < this._labels.length; n++)(t = this._labels[n], t.position < this.minimum || t.position > this.maximum) || (i = this.getPixelCoordinatesOnAxis(t.position), (this.tickThickness && !this._labels[n].stripLine || this._labels[n].stripLine && this._labels[n].stripLine._thicknessType === "pixel") && (this._labels[n].stripLine ? (r = this._labels[n].stripLine, this.ctx.lineWidth = r.thickness, this.ctx.strokeStyle = r.color) : (this.ctx.lineWidth = this.tickThickness, this.ctx.strokeStyle = this.tickColor), f = this.ctx.lineWidth % 2 == 1 ? (i.x << 0) + .5 : i.x << 0, this.ctx.beginPath(), this.ctx.moveTo(f, i.y << 0), this.ctx.lineTo(f, i.y - this.tickLength << 0), this.ctx.stroke()), !u || s++ % 2 == 0 || this._labels[n].stripLine) && (t.textBlock.angle === 0 ? (i.x -= t.textBlock.width / 2, i.y -= this.tickLength + t.textBlock.height / 2) : (i.x -= this.labelAngle > 0 ? t.textBlock.width * Math.cos(Math.PI / 180 * this.labelAngle) : 0, i.y -= this.tickLength + Math.abs(this.labelAngle > 0 ? t.textBlock.width * Math.sin(Math.PI / 180 * this.labelAngle) + 5 : 5)), t.textBlock.x = i.x, t.textBlock.y = i.y, t.textBlock.render(!0));
+ this.title && (this._titleTextBlock = new c(this.ctx, {
+ x: this.lineCoordinates.x1,
+ y: this.boundingRect.y1 + 1,
+ maxWidth: this.lineCoordinates.width,
+ maxHeight: this.titleFontSize * 1.5,
+ angle: 0,
+ text: this.title,
+ horizontalAlign: "center",
+ fontSize: this.titleFontSize,
+ fontFamily: this.titleFontFamily,
+ fontWeight: this.titleFontWeight,
+ fontColor: this.titleFontColor,
+ fontStyle: this.titleFontStyle,
+ textBaseline: "top"
+ }), this._titleTextBlock.measureText(), this._titleTextBlock.x = this.lineCoordinates.x1 + this.lineCoordinates.width / 2 - this._titleTextBlock.width / 2, this._titleTextBlock.render(!0))
+ } else if (this._position === "left") {
+ for (n = 0; n < this._labels.length; n++)(t = this._labels[n], t.position < this.minimum || t.position > this.maximum) || (i = this.getPixelCoordinatesOnAxis(t.position), (this.tickThickness && !this._labels[n].stripLine || this._labels[n].stripLine && this._labels[n].stripLine._thicknessType === "pixel") && (this._labels[n].stripLine ? (r = this._labels[n].stripLine, this.ctx.lineWidth = r.thickness, this.ctx.strokeStyle = r.color) : (this.ctx.lineWidth = this.tickThickness, this.ctx.strokeStyle = this.tickColor), e = this.ctx.lineWidth % 2 == 1 ? (i.y << 0) + .5 : i.y << 0, this.ctx.beginPath(), this.ctx.moveTo(i.x << 0, e), this.ctx.lineTo(i.x - this.tickLength << 0, e), this.ctx.stroke()), !u || s++ % 2 == 0 || this._labels[n].stripLine) && (t.textBlock.x = i.x - t.textBlock.width * Math.cos(Math.PI / 180 * this.labelAngle) - this.tickLength - 5, t.textBlock.y = this.labelAngle === 0 ? i.y : i.y - t.textBlock.width * Math.sin(Math.PI / 180 * this.labelAngle), t.textBlock.render(!0));
+ this.title && (this._titleTextBlock = new c(this.ctx, {
+ x: this.boundingRect.x1 + 1,
+ y: this.lineCoordinates.y2,
+ maxWidth: this.lineCoordinates.height,
+ maxHeight: this.titleFontSize * 1.5,
+ angle: -90,
+ text: this.title,
+ horizontalAlign: "center",
+ fontSize: this.titleFontSize,
+ fontFamily: this.titleFontFamily,
+ fontWeight: this.titleFontWeight,
+ fontColor: this.titleFontColor,
+ fontStyle: this.titleFontStyle,
+ textBaseline: "top"
+ }), a = this._titleTextBlock.measureText(), this._titleTextBlock.y = this.lineCoordinates.height / 2 + this._titleTextBlock.width / 2 + this.lineCoordinates.y1, this._titleTextBlock.render(!0))
+ } else if (this._position === "right") {
+ for (n = 0; n < this._labels.length; n++)(t = this._labels[n], t.position < this.minimum || t.position > this.maximum) || (i = this.getPixelCoordinatesOnAxis(t.position), (this.tickThickness && !this._labels[n].stripLine || this._labels[n].stripLine && this._labels[n].stripLine._thicknessType === "pixel") && (this._labels[n].stripLine ? (r = this._labels[n].stripLine, this.ctx.lineWidth = r.thickness, this.ctx.strokeStyle = r.color) : (this.ctx.lineWidth = this.tickThickness, this.ctx.strokeStyle = this.tickColor), e = this.ctx.lineWidth % 2 == 1 ? (i.y << 0) + .5 : i.y << 0, this.ctx.beginPath(), this.ctx.moveTo(i.x << 0, e), this.ctx.lineTo(i.x + this.tickLength << 0, e), this.ctx.stroke()), !u || s++ % 2 == 0 || this._labels[n].stripLine) && (t.textBlock.x = i.x + this.tickLength + 5, t.textBlock.y = this.labelAngle === 0 ? i.y : i.y, t.textBlock.render(!0));
+ this.title && (this._titleTextBlock = new c(this.ctx, {
+ x: this.boundingRect.x2 - 1,
+ y: this.lineCoordinates.y2,
+ maxWidth: this.lineCoordinates.height,
+ maxHeight: this.titleFontSize * 1.5,
+ angle: 90,
+ text: this.title,
+ horizontalAlign: "center",
+ fontSize: this.titleFontSize,
+ fontFamily: this.titleFontFamily,
+ fontWeight: this.titleFontWeight,
+ fontColor: this.titleFontColor,
+ fontStyle: this.titleFontStyle,
+ textBaseline: "top"
+ }), this._titleTextBlock.measureText(), this._titleTextBlock.y = this.lineCoordinates.height / 2 - this._titleTextBlock.width / 2 + this.lineCoordinates.y1, this._titleTextBlock.render(!0))
+ }
+ };
+ e.prototype.renderInterlacedColors = function() {
+ var u = this.chart.plotArea.ctx,
+ t, f, i = this.chart.plotArea,
+ n = 0,
+ r = !0;
+ if ((this._position === "bottom" || this._position === "top") && this.interlacedColor)
+ for (u.fillStyle = this.interlacedColor, n = 0; n < this._labels.length; n++) this._labels[n].stripLine || (r ? (t = this.getPixelCoordinatesOnAxis(this._labels[n].position), f = n + 1 >= this._labels.length - 1 ? this.getPixelCoordinatesOnAxis(this.maximum) : this.getPixelCoordinatesOnAxis(this._labels[n + 1].position), u.fillRect(t.x, i.y1, Math.abs(f.x - t.x), Math.abs(i.y1 - i.y2)), r = !1) : r = !0);
+ else if ((this._position === "left" || this._position === "right") && this.interlacedColor)
+ for (u.fillStyle = this.interlacedColor, n = 0; n < this._labels.length; n++) this._labels[n].stripLine || (r ? (f = this.getPixelCoordinatesOnAxis(this._labels[n].position), t = n + 1 >= this._labels.length - 1 ? this.getPixelCoordinatesOnAxis(this.maximum) : this.getPixelCoordinatesOnAxis(this._labels[n + 1].position), u.fillRect(i.x1, t.y, Math.abs(i.x1 - i.x2), Math.abs(t.y - f.y)), r = !1) : r = !0);
+ u.beginPath()
+ };
+ e.prototype.renderStripLinesOfThicknessType = function(n) {
+ var r, i, t;
+ if (this.stripLines && this.stripLines.length > 0 && n)
+ for (r = this, i = 0, i = 0; i < this.stripLines.length; i++)(t = this.stripLines[i], t._thicknessType === n) && (n === "pixel" && (t.value < this.minimum || t.value > this.maximum) || (t.showOnTop ? this.chart.addEventListener("dataAnimationIterationEnd", t.render, t) : t.render()))
+ };
+ e.prototype.renderGrid = function() {
+ var n, i, r, u, t, f;
+ if (this.gridThickness && this.gridThickness > 0)
+ if (n = this.chart.ctx, r = this.chart.plotArea, n.lineWidth = this.gridThickness, n.strokeStyle = this.gridColor, n.setLineDash && n.setLineDash(y(this.gridDashType, this.gridThickness)), this._position === "bottom" || this._position === "top")
+ for (t = 0; t < this._labels.length && !this._labels[t].stripLine; t++) this._labels[t].position < this.minimum || this._labels[t].position > this.maximum || (n.beginPath(), i = this.getPixelCoordinatesOnAxis(this._labels[t].position), u = n.lineWidth % 2 == 1 ? (i.x << 0) + .5 : i.x << 0, n.moveTo(u, r.y1 << 0), n.lineTo(u, r.y2 << 0), n.stroke());
+ else if (this._position === "left" || this._position === "right")
+ for (t = 0; t < this._labels.length && !this._labels[t].stripLine; t++) t === 0 && this.type === "axisY" && this.chart.axisX && this.chart.axisX.lineThickness || this._labels[t].position < this.minimum || this._labels[t].position > this.maximum || (n.beginPath(), i = this.getPixelCoordinatesOnAxis(this._labels[t].position), f = n.lineWidth % 2 == 1 ? (i.y << 0) + .5 : i.y << 0, n.moveTo(r.x1 << 0, f), n.lineTo(r.x2 << 0, f), n.stroke())
+ };
+ e.prototype.renderAxisLine = function() {
+ var n = this.chart.ctx,
+ t, i;
+ this._position === "bottom" || this._position === "top" ? this.lineThickness && (n.lineWidth = this.lineThickness, n.strokeStyle = this.lineColor ? this.lineColor : "black", n.setLineDash && n.setLineDash(y(this.lineDashType, this.lineThickness)), t = this.lineThickness % 2 == 1 ? (this.lineCoordinates.y1 << 0) + .5 : this.lineCoordinates.y1 << 0, n.beginPath(), n.moveTo(this.lineCoordinates.x1, t), n.lineTo(this.lineCoordinates.x2, t), n.stroke()) : (this._position === "left" || this._position === "right") && this.lineThickness && (n.lineWidth = this.lineThickness, n.strokeStyle = this.lineColor, n.setLineDash && n.setLineDash(y(this.lineDashType, this.lineThickness)), i = this.lineThickness % 2 == 1 ? (this.lineCoordinates.x1 << 0) + .5 : this.lineCoordinates.x1 << 0, n.beginPath(), n.moveTo(i, this.lineCoordinates.y1), n.lineTo(i, this.lineCoordinates.y2), n.stroke())
+ };
+ e.prototype.getPixelCoordinatesOnAxis = function(n) {
+ var t = {},
+ r = this.lineCoordinates.width,
+ u = this.lineCoordinates.height,
+ i;
+ return (this._position === "bottom" || this._position === "top") && (i = r / Math.abs(this.maximum - this.minimum), t.x = this.lineCoordinates.x1 + i * (n - this.minimum), t.y = this.lineCoordinates.y1), (this._position === "left" || this._position === "right") && (i = u / Math.abs(this.maximum - this.minimum), t.y = this.lineCoordinates.y2 - i * (n - this.minimum), t.x = this.lineCoordinates.x2), t
+ };
+ e.prototype.getXValueAt = function(n) {
+ if (!n) return null;
+ var t = null;
+ return this._position === "left" ? t = (this.chart.axisX.maximum - this.chart.axisX.minimum) / this.chart.axisX.lineCoordinates.height * (this.chart.axisX.lineCoordinates.y2 - n.y) + this.chart.axisX.minimum : this._position === "bottom" && (t = (this.chart.axisX.maximum - this.chart.axisX.minimum) / this.chart.axisX.lineCoordinates.width * (n.x - this.chart.axisX.lineCoordinates.x1) + this.chart.axisX.minimum), t
+ };
+ e.prototype.calculateValueToPixelconversionParameters = function() {
+ var n = {
+ pixelPerUnit: null,
+ minimum: null,
+ reference: null
+ },
+ t = this.lineCoordinates.width,
+ i = this.lineCoordinates.height;
+ n.minimum = this.minimum;
+ (this._position === "bottom" || this._position === "top") && (n.pixelPerUnit = t / Math.abs(this.maximum - this.minimum), n.reference = this.lineCoordinates.x1);
+ (this._position === "left" || this._position === "right") && (n.pixelPerUnit = -1 * i / Math.abs(this.maximum - this.minimum), n.reference = this.lineCoordinates.y2);
+ this.conversionParameters = n
+ };
+ e.prototype.calculateAxisParameters = function() {
+ var h = this.chart.layoutManager.getFreeSpace(),
+ l = !1,
+ t, r, i, o, n, u, s, c;
+ if (this._position === "bottom" || this._position === "top" ? (this.maxWidth = h.width, this.maxHeight = h.height) : (this.maxWidth = h.height, this.maxHeight = h.width), t = this.type === "axisX" ? this.maxWidth < 500 ? 8 : Math.max(6, Math.floor(this.maxWidth / 62)) : Math.max(Math.floor(this.maxWidth / 40), 2), u = 0, this.type === "axisX" ? (r = this.sessionVariables.internalMinimum !== null ? this.sessionVariables.internalMinimum : this.dataInfo.viewPortMin, i = this.sessionVariables.internalMaximum !== null ? this.sessionVariables.internalMaximum : this.dataInfo.viewPortMax, i - r == 0 && (u = typeof this._options.interval == "undefined" ? .4 : this._options.interval, i += u, r -= u), this.dataInfo.minDiff !== Infinity ? o = this.dataInfo.minDiff : i - r > 1 ? o = Math.abs(i - r) * .5 : (o = 1, this.chart.plotInfo.axisXValueType === "dateTime" && (l = !0))) : this.type === "axisY" && (r = typeof this._options.minimum == "undefined" || this._options.minimum === null ? this.dataInfo.viewPortMin : this._options.minimum, i = typeof this._options.maximum == "undefined" || this._options.maximum === null ? this.dataInfo.viewPortMax : this._options.maximum, isFinite(r) || isFinite(i) ? r === 0 && i === 0 ? (i += 9, r = 0) : i - r == 0 ? (u = Math.min(Math.abs(Math.abs(i) * .01), 5), i += u, r -= u) : r > i ? (u = Math.min(Math.abs(Math.abs(i - r) * .01), 5), i >= 0 ? r = i - u : i = r + u) : (u = Math.min(Math.abs(Math.abs(i - r) * .01), .05), i !== 0 && (i += u), r !== 0 && (r -= u)) : (i = typeof this._options.interval == "undefined" ? -Infinity : this._options.interval, r = 0), this.includeZero && (typeof this._options.minimum == "undefined" || this._options.minimum === null) && r > 0 && (r = 0), this.includeZero && (typeof this._options.maximum == "undefined" || this._options.maximum === null) && i < 0 && (i = 0)), this.type === "axisX" && this.chart.plotInfo.axisXValueType === "dateTime" ? (n = i - r, this.intervalType || (n / 1 <= t ? (this.interval = 1, this.intervalType = "millisecond") : n / 2 <= t ? (this.interval = 2, this.intervalType = "millisecond") : n / 5 <= t ? (this.interval = 5, this.intervalType = "millisecond") : n / 10 <= t ? (this.interval = 10, this.intervalType = "millisecond") : n / 20 <= t ? (this.interval = 20, this.intervalType = "millisecond") : n / 50 <= t ? (this.interval = 50, this.intervalType = "millisecond") : n / 100 <= t ? (this.interval = 100, this.intervalType = "millisecond") : n / 200 <= t ? (this.interval = 200, this.intervalType = "millisecond") : n / 250 <= t ? (this.interval = 250, this.intervalType = "millisecond") : n / 300 <= t ? (this.interval = 300, this.intervalType = "millisecond") : n / 400 <= t ? (this.interval = 400, this.intervalType = "millisecond") : n / 500 <= t ? (this.interval = 500, this.intervalType = "millisecond") : n / (f.secondDuration * 1) <= t ? (this.interval = 1, this.intervalType = "second") : n / (f.secondDuration * 2) <= t ? (this.interval = 2, this.intervalType = "second") : n / (f.secondDuration * 5) <= t ? (this.interval = 5, this.intervalType = "second") : n / (f.secondDuration * 10) <= t ? (this.interval = 10, this.intervalType = "second") : n / (f.secondDuration * 15) <= t ? (this.interval = 15, this.intervalType = "second") : n / (f.secondDuration * 20) <= t ? (this.interval = 20, this.intervalType = "second") : n / (f.secondDuration * 30) <= t ? (this.interval = 30, this.intervalType = "second") : n / (f.minuteDuration * 1) <= t ? (this.interval = 1, this.intervalType = "minute") : n / (f.minuteDuration * 2) <= t ? (this.interval = 2, this.intervalType = "minute") : n / (f.minuteDuration * 5) <= t ? (this.interval = 5, this.intervalType = "minute") : n / (f.minuteDuration * 10) <= t ? (this.interval = 10, this.intervalType = "minute") : n / (f.minuteDuration * 15) <= t ? (this.interval = 15, this.intervalType = "minute") : n / (f.minuteDuration * 20) <= t ? (this.interval = 20, this.intervalType = "minute") : n / (f.minuteDuration * 30) <= t ? (this.interval = 30, this.intervalType = "minute") : n / (f.hourDuration * 1) <= t ? (this.interval = 1, this.intervalType = "hour") : n / (f.hourDuration * 2) <= t ? (this.interval = 2, this.intervalType = "hour") : n / (f.hourDuration * 3) <= t ? (this.interval = 3, this.intervalType = "hour") : n / (f.hourDuration * 6) <= t ? (this.interval = 6, this.intervalType = "hour") : n / (f.dayDuration * 1) <= t ? (this.interval = 1, this.intervalType = "day") : n / (f.dayDuration * 2) <= t ? (this.interval = 2, this.intervalType = "day") : n / (f.dayDuration * 4) <= t ? (this.interval = 4, this.intervalType = "day") : n / (f.weekDuration * 1) <= t ? (this.interval = 1, this.intervalType = "week") : n / (f.weekDuration * 2) <= t ? (this.interval = 2, this.intervalType = "week") : n / (f.weekDuration * 3) <= t ? (this.interval = 3, this.intervalType = "week") : n / (f.monthDuration * 1) <= t ? (this.interval = 1, this.intervalType = "month") : n / (f.monthDuration * 2) <= t ? (this.interval = 2, this.intervalType = "month") : n / (f.monthDuration * 3) <= t ? (this.interval = 3, this.intervalType = "month") : n / (f.monthDuration * 6) <= t ? (this.interval = 6, this.intervalType = "month") : n / (f.yearDuration * 1) <= t ? (this.interval = 1, this.intervalType = "year") : n / (f.yearDuration * 2) <= t ? (this.interval = 2, this.intervalType = "year") : n / (f.yearDuration * 4) <= t ? (this.interval = 4, this.intervalType = "year") : (this.interval = Math.floor(e.getNiceNumber(n / (t - 1), !0) / f.yearDuration), this.intervalType = "year")), this.minimum = this.sessionVariables.internalMinimum !== null ? this.sessionVariables.internalMinimum : r - o / 2, this.maximum = this.sessionVariables.internalMaximum !== null ? this.sessionVariables.internalMaximum : i + o / 2, this.valueFormatString || (l ? this.valueFormatString = "MMM DD YYYY HH:mm" : this.intervalType === "year" ? this.valueFormatString = "YYYY" : this.intervalType === "month" ? this.valueFormatString = "MMM YYYY" : this.intervalType === "week" ? this.valueFormatString = "MMM DD YYYY" : this.intervalType === "day" ? this.valueFormatString = "MMM DD YYYY" : this.intervalType === "hour" ? this.valueFormatString = "hh:mm TT" : this.intervalType === "minute" ? this.valueFormatString = "hh:mm TT" : this.intervalType === "second" ? this.valueFormatString = "hh:mm:ss TT" : this.intervalType === "millisecond" && (this.valueFormatString = "fff'ms'")), this.intervalstartTimePercent = this.getLabelStartPoint(new Date(this.minimum), this.intervalType, this.interval)) : (this.intervalType = "number", n = e.getNiceNumber(i - r, !1), this.interval = this._options && this._options.interval ? this._options.interval : e.getNiceNumber(n / (t - 1), !0), this.minimum = this.sessionVariables.internalMinimum !== null ? this.sessionVariables.internalMinimum : Math.floor(r / this.interval) * this.interval, this.maximum = this.sessionVariables.internalMaximum !== null ? this.sessionVariables.internalMaximum : Math.ceil(i / this.interval) * this.interval, this.maximum === 0 && this.minimum === 0 && (this._options.minimum === 0 ? this.maximum += 10 : this._options.maximum === 0 && (this.minimum -= 10), this._options && typeof this._options.interval == "undefined" && (this.interval = e.getNiceNumber((this.maximum - this.minimum) / (t - 1), !0))), this.type === "axisX" ? (this.sessionVariables.internalMinimum !== null || (this.minimum = r - o / 2), this.sessionVariables.internalMaximum !== null || (this.maximum = i + o / 2), this.intervalstartTimePercent = Math.floor((this.minimum + this.interval * .2) / this.interval) * this.interval) : this.type === "axisY" && (this.intervalstartTimePercent = this.minimum)), this.type === "axisX" && (this._absoluteMinimum = this._options && typeof this._options.minimum != "undefined" ? this._options.minimum : this.dataInfo.min - o / 2, this._absoluteMaximum = this._options && typeof this._options.maximum != "undefined" ? this._options.maximum : this.dataInfo.max + o / 2), !this.valueFormatString && (this.valueFormatString = "#,##0.##", n = Math.abs(this.maximum - this.minimum), n < 1 && (s = Math.floor(Math.abs(Math.log(n) / Math.LN10)) + 2, (isNaN(s) || !isFinite(s)) && (s = 2), s > 2)))
+ for (c = 0; c < s - 2; c++) this.valueFormatString += "#"
+ };
+ e.getNiceNumber = function(n, t) {
+ var r = Math.floor(Math.log(n) / Math.LN10),
+ i = n / Math.pow(10, r),
+ u;
+ return u = t ? i < 1.5 ? 1 : i < 3 ? 2 : i < 7 ? 5 : 10 : i <= 1 ? 1 : i <= 2 ? 2 : i <= 5 ? 5 : 10, Number((u * Math.pow(10, r)).toFixed(20))
+ };
+ e.prototype.getLabelStartPoint = function() {
+ var t = st(this.interval, this.intervalType),
+ i = Math.floor(this.minimum / t) * t,
+ n = new Date(i);
+ return this.intervalType === "millisecond" || (this.intervalType === "second" ? n.getMilliseconds() > 0 && (n.setSeconds(n.getSeconds() + 1), n.setMilliseconds(0)) : this.intervalType === "minute" ? (n.getSeconds() > 0 || n.getMilliseconds() > 0) && (n.setMinutes(n.getMinutes() + 1), n.setSeconds(0), n.setMilliseconds(0)) : this.intervalType === "hour" ? (n.getMinutes() > 0 || n.getSeconds() > 0 || n.getMilliseconds() > 0) && (n.setHours(n.getHours() + 1), n.setMinutes(0), n.setSeconds(0), n.setMilliseconds(0)) : this.intervalType === "day" ? (n.getHours() > 0 || n.getMinutes() > 0 || n.getSeconds() > 0 || n.getMilliseconds() > 0) && (n.setDate(n.getDate() + 1), n.setHours(0), n.setMinutes(0), n.setSeconds(0), n.setMilliseconds(0)) : this.intervalType === "week" ? (n.getDay() > 0 || n.getHours() > 0 || n.getMinutes() > 0 || n.getSeconds() > 0 || n.getMilliseconds() > 0) && (n.setDate(n.getDate() + (7 - n.getDay())), n.setHours(0), n.setMinutes(0), n.setSeconds(0), n.setMilliseconds(0)) : this.intervalType === "month" ? (n.getDate() > 1 || n.getHours() > 0 || n.getMinutes() > 0 || n.getSeconds() > 0 || n.getMilliseconds() > 0) && (n.setMonth(n.getMonth() + 1), n.setDate(1), n.setHours(0), n.setMinutes(0), n.setSeconds(0), n.setMilliseconds(0)) : this.intervalType === "year" && (n.getMonth() > 0 || n.getDate() > 1 || n.getHours() > 0 || n.getMinutes() > 0 || n.getSeconds() > 0 || n.getMilliseconds() > 0) && (n.setFullYear(n.getFullYear() + 1), n.setMonth(0), n.setDate(1), n.setHours(0), n.setMinutes(0), n.setSeconds(0), n.setMilliseconds(0))), n
+ };
+ w(ti, h);
+ ti.prototype.render = function() {
+ var n = this.parent.getPixelCoordinatesOnAxis(this.value),
+ t = Math.abs(this._thicknessType === "pixel" ? this.thickness : this.parent.conversionParameters.pixelPerUnit * this.thickness),
+ o, s, l, i, r, f, e, h, c;
+ t > 0 && (o = this.opacity === null ? 1 : this.opacity, this.ctx.strokeStyle = this.color, this.ctx.beginPath(), s = this.ctx.globalAlpha, this.ctx.globalAlpha = o, l = u(this.id), this.ctx.lineWidth = t, this.ctx.setLineDash && this.ctx.setLineDash(y(this.lineDashType, t)), this.parent._position === "bottom" || this.parent._position === "top" ? (h = this.ctx.lineWidth % 2 == 1 ? (n.x << 0) + .5 : n.x << 0, i = r = h, f = this.chart.plotArea.y1, e = this.chart.plotArea.y2) : (this.parent._position === "left" || this.parent._position === "right") && (c = this.ctx.lineWidth % 2 == 1 ? (n.y << 0) + .5 : n.y << 0, f = e = c, i = this.chart.plotArea.x1, r = this.chart.plotArea.x2), this.ctx.moveTo(i, f), this.ctx.lineTo(r, e), this.ctx.stroke(), this.ctx.globalAlpha = s)
+ };
+ w(k, h);
+ k.prototype._initialize = function() {
+ if (this.enabled) {
+ this.container = document.createElement("div");
+ this.container.setAttribute("class", "canvasjs-chart-tooltip");
+ this.container.style.position = "absolute";
+ this.container.style.height = "auto";
+ this.container.style.boxShadow = "1px 1px 2px 2px rgba(0,0,0,0.1)";
+ this.container.style.zIndex = "1000";
+ this.container.style.display = "none";
+ var t = '
Sample Tooltip<\/div>';
+ this.container.innerHTML = t;
+ this.contentDiv = this.container.firstChild;
+ this.container.style.borderRadius = this.contentDiv.style.borderRadius;
+ this.chart._canvasJSContainer.appendChild(this.container)
+ }
+ };
+ k.prototype.mouseMoveHandler = function(n, t) {
+ this._lastUpdated && (new Date).getTime() - this._lastUpdated < 40 || (this._lastUpdated = (new Date).getTime(), this._updateToolTip(n, t))
+ };
+ k.prototype._updateToolTip = function(t, i) {
+ var o, e, p, a, v, f, h, c, y;
+ if (!this.chart.disableToolTip) {
+ if (typeof t == "undefined" || typeof i == "undefined") {
+ if (isNaN(this._prevX) || isNaN(this._prevY)) return;
+ t = this._prevX;
+ i = this._prevY
+ } else this._prevX = t, this._prevY = i;
+ var l = null,
+ u = null,
+ r = [],
+ s, h = 0;
+ if (this.shared && this.enabled && this.chart.plotInfo.axisPlacement !== "none") {
+ for (h = this.chart.plotInfo.axisPlacement === "xySwapped" ? (this.chart.axisX.maximum - this.chart.axisX.minimum) / this.chart.axisX.lineCoordinates.height * (this.chart.axisX.lineCoordinates.y2 - i) + this.chart.axisX.minimum : (this.chart.axisX.maximum - this.chart.axisX.minimum) / this.chart.axisX.lineCoordinates.width * (t - this.chart.axisX.lineCoordinates.x1) + this.chart.axisX.minimum, o = [], e = 0; e < this.chart.data.length; e++) f = this.chart.data[e].getDataPointAtX(h, !0), f && f.index >= 0 && (f.dataSeries = this.chart.data[e], f.dataPoint.y !== null && o.push(f));
+ if (o.length === 0) return;
+ for (o.sort(function(n, t) {
+ return n.distance - t.distance
+ }), p = o[0], e = 0; e < o.length; e++) o[e].dataPoint.x.valueOf() === p.dataPoint.x.valueOf() && r.push(o[e]);
+ o = null
+ } else {
+ if (a = this.chart.getDataPointAtXY(t, i, !0), a) this.currentDataPointIndex = a.dataPointIndex, this.currentSeriesIndex = a.dataSeries.index;
+ else if (n)
+ if (v = ci(t, i, this.chart._eventManager.ghostCtx), v > 0 && typeof this.chart._eventManager.objectMap[v] != "undefined") {
+ if (eventObject = this.chart._eventManager.objectMap[v], eventObject.objectType === "legendItem") return;
+ this.currentSeriesIndex = eventObject.dataSeriesIndex;
+ this.currentDataPointIndex = eventObject.dataPointIndex >= 0 ? eventObject.dataPointIndex : -1
+ } else this.currentDataPointIndex = -1;
+ else this.currentDataPointIndex = -1;
+ if (this.currentSeriesIndex >= 0) {
+ if (u = this.chart.data[this.currentSeriesIndex], f = {}, this.currentDataPointIndex >= 0) l = u.dataPoints[this.currentDataPointIndex], f.dataSeries = u, f.dataPoint = l, f.index = this.currentDataPointIndex, f.distance = Math.abs(l.x - h);
+ else if (this.enabled && (u.type === "line" || u.type === "stepLine" || u.type === "spline" || u.type === "area" || u.type === "stepArea" || u.type === "splineArea" || u.type === "stackedArea" || u.type === "stackedArea100" || u.type === "rangeArea" || u.type === "rangeSplineArea" || u.type === "candlestick" || u.type === "ohlc")) h = (this.chart.axisX.maximum - this.chart.axisX.minimum) / this.chart.axisX.lineCoordinates.width * (t - this.chart.axisX.lineCoordinates.x1) + this.chart.axisX.minimum.valueOf(), f = u.getDataPointAtX(h, !0), f.dataSeries = u, this.currentDataPointIndex = f.index, l = f.dataPoint;
+ else return;
+ f.dataPoint.y !== null && r.push(f)
+ }
+ }
+ if (r.length > 0 && (this.highlightObjects(r), this.enabled))
+ if (c = "", c = this.getToolTipInnerHTML({
+ entries: r
+ }), c !== null) {
+ this.contentDiv.innerHTML = c;
+ this.contentDiv.innerHTML = c;
+ y = !1;
+ this.container.style.display === "none" && (y = !0, this.container.style.display = "block");
+ try {
+ this.contentDiv.style.background = this.backgroundColor ? this.backgroundColor : n ? "rgba(255,255,255,.9)" : "rgb(255,255,255)";
+ this.contentDiv.style.borderRightColor = this.contentDiv.style.borderLeftColor = this.contentDiv.style.borderColor = this.borderColor ? this.borderColor : r[0].dataPoint.color ? r[0].dataPoint.color : r[0].dataSeries.color ? r[0].dataSeries.color : r[0].dataSeries._colorSet[r[0].index % r[0].dataSeries._colorSet.length];
+ this.contentDiv.style.borderWidth = this.borderThickness || this.borderThickness === 0 ? this.borderThickness + "px" : "2px";
+ this.contentDiv.style.borderRadius = this.cornerRadius || this.cornerRadius === 0 ? this.cornerRadius + "px" : "5px";
+ this.container.style.borderRadius = this.contentDiv.style.borderRadius;
+ this.contentDiv.style.fontSize = this.fontSize || this.fontSize === 0 ? this.fontSize + "px" : "14px";
+ this.contentDiv.style.color = this.fontColor ? this.fontColor : "#000000";
+ this.contentDiv.style.fontFamily = this.fontFamily ? this.fontFamily : "Calibri, Arial, Georgia, serif;";
+ this.contentDiv.style.fontWeight = this.fontWeight ? this.fontWeight : "normal";
+ this.contentDiv.style.fontStyle = this.fontStyle ? this.fontStyle : n ? "italic" : "normal"
+ } catch (w) {}
+ toolTipLeft = r[0].dataSeries.type === "pie" || r[0].dataSeries.type === "doughnut" || r[0].dataSeries.type === "funnel" || r[0].dataSeries.type === "bar" || r[0].dataSeries.type === "rangeBar" || r[0].dataSeries.type === "stackedBar" || r[0].dataSeries.type === "stackedBar100" ? t - 10 - this.container.clientWidth : (this.chart.axisX.lineCoordinates.width / Math.abs(this.chart.axisX.maximum - this.chart.axisX.minimum) * Math.abs(r[0].dataPoint.x - this.chart.axisX.minimum) + this.chart.axisX.lineCoordinates.x1 + .5 - this.container.clientWidth << 0) - 10;
+ toolTipLeft < 0 && (toolTipLeft += this.container.clientWidth + 20);
+ toolTipLeft + this.container.clientWidth > this.chart._container.clientWidth && (toolTipLeft = Math.max(0, this.chart._container.clientWidth - this.container.clientWidth));
+ toolTipLeft += "px";
+ s = r.length !== 1 || this.shared || r[0].dataSeries.type !== "line" && r[0].dataSeries.type !== "stepLine" && r[0].dataSeries.type !== "spline" && r[0].dataSeries.type !== "area" && r[0].dataSeries.type !== "stepArea" && r[0].dataSeries.type !== "splineArea" && r[0].dataSeries.type !== "stackedArea" && r[0].dataSeries.type !== "stackedArea100" ? r[0].dataSeries.type === "bar" || r[0].dataSeries.type === "rangeBar" || r[0].dataSeries.type === "stackedBar" || r[0].dataSeries.type === "stackedBar100" ? r[0].dataSeries.axisX.lineCoordinates.y2 - r[0].dataSeries.axisX.lineCoordinates.height / Math.abs(r[0].dataSeries.axisX.maximum - r[0].dataSeries.axisX.minimum) * Math.abs(r[0].dataPoint.x - r[0].dataSeries.axisX.minimum) + .5 << 0 : i : r[0].dataSeries.axisY.lineCoordinates.y2 - r[0].dataSeries.axisY.lineCoordinates.height / Math.abs(r[0].dataSeries.axisY.maximum - r[0].dataSeries.axisY.minimum) * Math.abs(r[0].dataPoint.y - r[0].dataSeries.axisY.minimum) + .5 << 0;
+ s = -s + 10;
+ s + this.container.clientHeight + 5 > 0 && (s -= s + this.container.clientHeight + 5 - 0);
+ s += "px";
+ this.container.style.left = toolTipLeft;
+ this.container.style.bottom = s;
+ !this.animationEnabled || y ? this.disableAnimation() : this.enableAnimation()
+ } else this.hide(!1)
+ }
+ };
+ k.prototype.highlightObjects = function(n) {
+ var i = this.chart.overlaidCanvasCtx,
+ l, f, e, s, t, u;
+ for (this.chart.resetOverlayedCanvas(), i.save(), l = this.chart.plotArea, f = 0, e = 0; e < n.length; e++)
+ if (s = n[e], t = this.chart._eventManager.objectMap[s.dataSeries.dataPointIds[s.index]], t && t.objectType && t.objectType === "dataPoint") {
+ var r = this.chart.data[t.dataSeriesIndex],
+ c = r.dataPoints[t.dataPointIndex],
+ h = t.dataPointIndex;
+ c.highlightEnabled !== !1 && (r.highlightEnabled === !0 || c.highlightEnabled === !0) && (r.type === "line" || r.type === "stepLine" || r.type === "spline" || r.type === "scatter" || r.type === "area" || r.type === "stepArea" || r.type === "splineArea" || r.type === "stackedArea" || r.type === "stackedArea100" || r.type === "rangeArea" || r.type === "rangeSplineArea" ? (u = r.getMarkerProperties(h, t.x1, t.y1, this.chart.overlaidCanvasCtx), u.size = Math.max(u.size * 1.5 << 0, 10), u.borderColor = u.borderColor || "#FFFFFF", u.borderThickness = u.borderThickness || Math.ceil(u.size * .1), a.drawMarkers([u]), typeof t.y2 != "undefined" && (u = r.getMarkerProperties(h, t.x1, t.y2, this.chart.overlaidCanvasCtx), u.size = Math.max(u.size * 1.5 << 0, 10), u.borderColor = u.borderColor || "#FFFFFF", u.borderThickness = u.borderThickness || Math.ceil(u.size * .1), a.drawMarkers([u]))) : r.type === "bubble" ? (u = r.getMarkerProperties(h, t.x1, t.y1, this.chart.overlaidCanvasCtx), u.size = t.size, u.color = "white", u.borderColor = "white", i.globalAlpha = .3, a.drawMarkers([u]), i.globalAlpha = 1) : r.type === "column" || r.type === "stackedColumn" || r.type === "stackedColumn100" || r.type === "bar" || r.type === "rangeBar" || r.type === "stackedBar" || r.type === "stackedBar100" || r.type === "rangeColumn" ? o(i, t.x1, t.y1, t.x2, t.y2, "white", 0, null, !1, !1, !1, !1, .3) : r.type === "pie" || r.type === "doughnut" ? dt(i, t.center, t.radius, "white", r.type, t.startAngle, t.endAngle, .3) : r.type === "candlestick" ? (i.globalAlpha = 1, i.strokeStyle = t.color, i.lineWidth = t.borderThickness * 2, f = i.lineWidth % 2 == 0 ? 0 : .5, i.beginPath(), i.moveTo(t.x3 - f, t.y2), i.lineTo(t.x3 - f, Math.min(t.y1, t.y4)), i.stroke(), i.beginPath(), i.moveTo(t.x3 - f, Math.max(t.y1, t.y4)), i.lineTo(t.x3 - f, t.y3), i.stroke(), o(i, t.x1, Math.min(t.y1, t.y4), t.x2, Math.max(t.y1, t.y4), "transparent", t.borderThickness * 2, t.color, !1, !1, !1, !1), i.globalAlpha = 1) : r.type === "ohlc" && (i.globalAlpha = 1, i.strokeStyle = t.color, i.lineWidth = t.borderThickness * 2, f = i.lineWidth % 2 == 0 ? 0 : .5, i.beginPath(), i.moveTo(t.x3 - f, t.y2), i.lineTo(t.x3 - f, t.y3), i.stroke(), i.beginPath(), i.moveTo(t.x3, t.y1), i.lineTo(t.x1, t.y1), i.stroke(), i.beginPath(), i.moveTo(t.x3, t.y4), i.lineTo(t.x2, t.y4), i.stroke(), i.globalAlpha = 1))
+ } i.globalAlpha = 1;
+ i.beginPath();
+ return
+ };
+ k.prototype.getToolTipInnerHTML = function(n) {
+ for (var c, s, f = n.entries, r = null, t = null, i = null, o = 0, u = "", h = !0, e = 0; e < f.length; e++)
+ if (f[e].dataSeries.toolTipContent || f[e].dataPoint.toolTipContent) {
+ h = !1;
+ break
+ } if (h && (this.content && typeof this.content == "function" || this.contentFormatter)) c = {
+ chart: this.chart,
+ toolTip: this._options,
+ entries: f
+ }, r = this.contentFormatter ? this.contentFormatter(c) : this.content(c);
+ else if (this.shared && this.chart.plotInfo.axisPlacement !== "none") {
+ for (s = "", e = 0; e < f.length; e++)(t = f[e].dataSeries, i = f[e].dataPoint, o = f[e].index, u = "", e === 0 && h && !this.content && (s += typeof this.chart.axisX.labels[i.x] != "undefined" ? this.chart.axisX.labels[i.x] : "{x}", s += "<\/br>", s = this.chart.replaceKeywordsWithValue(s, i, t, o)), i.toolTipContent !== null && (typeof i.toolTipContent != "undefined" || t._options.toolTipContent !== null)) && (t.type === "line" || t.type === "stepLine" || t.type === "spline" || t.type === "area" || t.type === "stepArea" || t.type === "splineArea" || t.type === "column" || t.type === "bar" || t.type === "scatter" || t.type === "stackedColumn" || t.type === "stackedColumn100" || t.type === "stackedBar" || t.type === "stackedBar100" || t.type === "stackedArea" || t.type === "stackedArea100" ? u += i.toolTipContent ? i.toolTipContent : t.toolTipContent ? t.toolTipContent : this.content && typeof this.content != "function" ? this.content : "{name}:<\/span> {y}" : t.type === "bubble" ? u += i.toolTipContent ? i.toolTipContent : t.toolTipContent ? t.toolTipContent : this.content && typeof this.content != "function" ? this.content : "{name}:<\/span> {y}, {z}" : t.type === "pie" || t.type === "doughnut" || t.type === "funnel" ? u += i.toolTipContent ? i.toolTipContent : t.toolTipContent ? t.toolTipContent : this.content && typeof this.content != "function" ? this.content : " {y}" : t.type === "rangeColumn" || t.type === "rangeBar" || t.type === "rangeArea" || t.type === "rangeSplineArea" ? u += i.toolTipContent ? i.toolTipContent : t.toolTipContent ? t.toolTipContent : this.content && typeof this.content != "function" ? this.content : "{name}:<\/span> {y[0]}, {y[1]}" : (t.type === "candlestick" || t.type === "ohlc") && (u += i.toolTipContent ? i.toolTipContent : t.toolTipContent ? t.toolTipContent : this.content && typeof this.content != "function" ? this.content : "{name}:<\/span>
Open: {y[0]}
High: {y[1]}
Low: {y[2]}
Close: {y[3]}"), r === null && (r = ""), this.reversed === !0 ? (r = this.chart.replaceKeywordsWithValue(u, i, t, o) + r, e < f.length - 1 && (r = "<\/br>" + r)) : (r += this.chart.replaceKeywordsWithValue(u, i, t, o), e < f.length - 1 && (r += "<\/br>")));
+ r !== null && (r = s + r)
+ } else {
+ if (t = f[0].dataSeries, i = f[0].dataPoint, o = f[0].index, i.toolTipContent === null || typeof i.toolTipContent == "undefined" && t._options.toolTipContent === null) return null;
+ t.type === "line" || t.type === "stepLine" || t.type === "spline" || t.type === "area" || t.type === "stepArea" || t.type === "splineArea" || t.type === "column" || t.type === "bar" || t.type === "scatter" || t.type === "stackedColumn" || t.type === "stackedColumn100" || t.type === "stackedBar" || t.type === "stackedBar100" || t.type === "stackedArea" || t.type === "stackedArea100" ? u = i.toolTipContent ? i.toolTipContent : t.toolTipContent ? t.toolTipContent : this.content && typeof this.content != "function" ? this.content : "" + (i.label ? "{label}" : "{x}") + " :<\/span> {y}" : t.type === "bubble" ? u = i.toolTipContent ? i.toolTipContent : t.toolTipContent ? t.toolTipContent : this.content && typeof this.content != "function" ? this.content : "" + (i.label ? "{label}" : "{x}") + ":<\/span> {y}, {z}" : t.type === "pie" || t.type === "doughnut" || t.type === "funnel" ? u = i.toolTipContent ? i.toolTipContent : t.toolTipContent ? t.toolTipContent : this.content && typeof this.content != "function" ? this.content : (i.name ? "{name}: " : i.label ? "{label}: " : "") + "{y}" : t.type === "rangeColumn" || t.type === "rangeBar" || t.type === "rangeArea" || t.type === "rangeSplineArea" ? u = i.toolTipContent ? i.toolTipContent : t.toolTipContent ? t.toolTipContent : this.content && typeof this.content != "function" ? this.content : "" + (i.label ? "{label}" : "{x}") + " :<\/span> {y[0]}, {y[1]}" : (t.type === "candlestick" || t.type === "ohlc") && (u = i.toolTipContent ? i.toolTipContent : t.toolTipContent ? t.toolTipContent : this.content && typeof this.content != "function" ? this.content : "" + (i.label ? "{label}" : "{x}") + "<\/span>
Open: {y[0]}
High: {y[1]}
Low: {y[2]}
Close: {y[3]}");
+ r === null && (r = "");
+ r += this.chart.replaceKeywordsWithValue(u, i, t, o)
+ }
+ return r
+ };
+ k.prototype.enableAnimation = function() {
+ this.container.style.WebkitTransition || (this.container.style.WebkitTransition = "left .2s ease-out, bottom .2s ease-out", this.container.style.MozTransition = "left .2s ease-out, bottom .2s ease-out", this.container.style.MsTransition = "left .2s ease-out, bottom .2s ease-out", this.container.style.transition = "left .2s ease-out, bottom .2s ease-out")
+ };
+ k.prototype.disableAnimation = function() {
+ this.container.style.WebkitTransition && (this.container.style.WebkitTransition = "", this.container.style.MozTransition = "", this.container.style.MsTransition = "", this.container.style.transition = "")
+ };
+ k.prototype.hide = function(n) {
+ this.enabled && (n = typeof n == "undefined" ? !0 : n, this.container.style.display = "none", this.currentSeriesIndex = -1, this._prevX = NaN, this._prevY = NaN, n && this.chart.resetOverlayedCanvas())
+ };
+ t.prototype.getPercentAndTotal = function(n, t) {
+ var u = null,
+ r = null,
+ f = null;
+ if (n.type.indexOf("stacked") >= 0) r = 0, u = t.x.getTime ? t.x.getTime() : t.x, u in n.plotUnit.yTotals && (r = n.plotUnit.yTotals[u], f = isNaN(t.y) ? 0 : r === 0 ? 0 : t.y / r * 100);
+ else if (n.type === "pie" || n.type === "doughnut") {
+ for (r = 0, i = 0; i < n.dataPoints.length; i++) isNaN(n.dataPoints[i].y) || (r += n.dataPoints[i].y);
+ f = isNaN(t.y) ? 0 : t.y / r * 100
+ }
+ return {
+ percent: f,
+ total: r
+ }
+ };
+ t.prototype.replaceKeywordsWithValue = function(n, t, i, r, u) {
+ var f = this,
+ e, o, l, a;
+ if (u = typeof u == "undefined" ? 0 : u, (i.type.indexOf("stacked") >= 0 || i.type === "pie" || i.type === "doughnut") && (n.indexOf("#percent") >= 0 || n.indexOf("#total") >= 0)) {
+ var s = "#percent",
+ c = "#total",
+ h = this.getPercentAndTotal(i, t);
+ c = h.total ? h.total : c;
+ s = isNaN(h.percent) ? s : h.percent;
+ do {
+ if (e = "", i.percentFormatString) e = i.percentFormatString;
+ else
+ for (e = "#,##0.", o = Math.max(Math.ceil(Math.log(1 / Math.abs(s)) / Math.LN10), 2), (isNaN(o) || !isFinite(o)) && (o = 2), l = 0; l < o; l++) e += "#";
+ n = n.replace("#percent", it(s, e, f._cultureInfo));
+ n = n.replace("#total", it(c, i.yValueFormatString ? i.yValueFormatString : "#,##0.########"))
+ } while (n.indexOf("#percent") >= 0 || n.indexOf("#total") >= 0)
+ }
+ return a = function(n) {
+ var e, h, s, c, o;
+ if (n[0] === '"' && n[n.length - 1] === '"' || n[0] === "'" && n[n.length - 1] === "'") return n.slice(1, n.length - 1);
+ e = ht(n.slice(1, n.length - 1));
+ e = e.replace("#index", u);
+ h = null;
+ try {
+ s = e.match(/(.*?)\s*\[\s*(.*?)\s*\]/);
+ s && s.length > 0 && (h = ht(s[2]), e = ht(s[1]))
+ } catch (l) {}
+ if (c = null, e === "color") return t.color ? t.color : i.color ? i.color : i._colorSet[r % i._colorSet.length];
+ if (t.hasOwnProperty(e)) c = t;
+ else if (i.hasOwnProperty(e)) c = i;
+ else return "";
+ return o = c[e], h !== null && (o = o[h]), e === "x" ? f.axisX && f.plotInfo.axisXValueType === "dateTime" ? ii(o, t.xValueFormatString ? t.xValueFormatString : i.xValueFormatString ? i.xValueFormatString : f.axisX && f.axisX.valueFormatString ? f.axisX.valueFormatString : "DD MMM YY", f._cultureInfo) : it(o, t.xValueFormatString ? t.xValueFormatString : i.xValueFormatString ? i.xValueFormatString : "#,##0.########", f._cultureInfo) : e === "y" ? it(o, t.yValueFormatString ? t.yValueFormatString : i.yValueFormatString ? i.yValueFormatString : "#,##0.########", f._cultureInfo) : e === "z" ? it(o, t.zValueFormatString ? t.zValueFormatString : i.zValueFormatString ? i.zValueFormatString : "#,##0.########", f._cultureInfo) : o
+ }, n.replace(/\{.*?\}|"[^"]*"|'[^']*'/g, a)
+ };
+ at.prototype.reset = function() {
+ this.lastObjectId = 0;
+ this.objectMap = [];
+ this.rectangularRegionEventSubscriptions = [];
+ this.previousDataPointEventObject = null;
+ this.eventObjects = [];
+ n && (this.ghostCtx.clearRect(0, 0, this.chart.width, this.chart.height), this.ghostCtx.beginPath())
+ };
+ at.prototype.getNewObjectTrackingId = function() {
+ return ++this.lastObjectId
+ };
+ at.prototype.mouseEventHandler = function(n) {
+ var t, r, o, h, c, i, l, e;
+ if (n.type === "mousemove" || n.type === "click") {
+ var u = [],
+ f = wt(n),
+ s = null;
+ if (s = this.chart.getObjectAtXY(f.x, f.y, !1), s && typeof this.objectMap[s] != "undefined")
+ if (t = this.objectMap[s], t.objectType === "dataPoint") {
+ var r = this.chart.data[t.dataSeriesIndex],
+ o = r.dataPoints[t.dataPointIndex],
+ a = t.dataPointIndex;
+ t.eventParameter = {
+ x: f.x,
+ y: f.y,
+ dataPoint: o,
+ dataSeries: r._options,
+ dataPointIndex: a,
+ dataSeriesIndex: r.index,
+ chart: this.chart._publicChartReference
+ };
+ t.eventContext = {
+ context: o,
+ userContext: o,
+ mouseover: "mouseover",
+ mousemove: "mousemove",
+ mouseout: "mouseout",
+ click: "click"
+ };
+ u.push(t);
+ t = this.objectMap[r.id];
+ t.eventParameter = {
+ x: f.x,
+ y: f.y,
+ dataPoint: o,
+ dataSeries: r._options,
+ dataPointIndex: a,
+ dataSeriesIndex: r.index,
+ chart: this.chart._publicChartReference
+ };
+ t.eventContext = {
+ context: r,
+ userContext: r._options,
+ mouseover: "mouseover",
+ mousemove: "mousemove",
+ mouseout: "mouseout",
+ click: "click"
+ };
+ u.push(this.objectMap[r.id])
+ } else t.objectType === "legendItem" && (r = this.chart.data[t.dataSeriesIndex], o = t.dataPointIndex !== null ? r.dataPoints[t.dataPointIndex] : null, t.eventParameter = {
+ x: f.x,
+ y: f.y,
+ dataSeries: r._options,
+ dataPoint: o,
+ dataPointIndex: t.dataPointIndex,
+ dataSeriesIndex: t.dataSeriesIndex,
+ chart: this.chart._publicChartReference
+ }, t.eventContext = {
+ context: this.chart.legend,
+ userContext: this.chart.legend._options,
+ mouseover: "itemmouseover",
+ mousemove: "itemmousemove",
+ mouseout: "itemmouseout",
+ click: "itemclick"
+ }, u.push(t));
+ for (h = [], i = 0; i < this.mouseoveredObjectMaps.length; i++) {
+ for (c = !0, e = 0; e < u.length; e++)
+ if (u[e].id === this.mouseoveredObjectMaps[i].id) {
+ c = !1;
+ break
+ } c ? this.fireEvent(this.mouseoveredObjectMaps[i], "mouseout", n) : h.push(this.mouseoveredObjectMaps[i])
+ }
+ for (this.mouseoveredObjectMaps = h, i = 0; i < u.length; i++) {
+ for (l = !1, e = 0; e < this.mouseoveredObjectMaps.length; e++)
+ if (u[i].id === this.mouseoveredObjectMaps[e].id) {
+ l = !0;
+ break
+ } l || (this.fireEvent(u[i], "mouseover", n), this.mouseoveredObjectMaps.push(u[i]));
+ n.type === "click" ? this.fireEvent(u[i], "click", n) : n.type === "mousemove" && this.fireEvent(u[i], "mousemove", n)
+ }
+ }
+ };
+ at.prototype.fireEvent = function(n, t, i) {
+ if (n && t) {
+ var f = n.eventParameter,
+ u = n.eventContext,
+ r = n.eventContext.userContext;
+ r && u && r[u[t]] && r[u[t]].call(r, f);
+ t !== "mouseout" ? r.cursor && r.cursor !== i.target.style.cursor && (i.target.style.cursor = r.cursor) : (i.target.style.cursor = this.chart._defaultCursor, delete n.eventParameter, delete n.eventContext);
+ t === "click" && n.objectType === "dataPoint" && this.chart.pieDoughnutClickHandler && this.chart.pieDoughnutClickHandler.call(this.chart.data[n.dataSeriesIndex], f)
+ }
+ };
+ w(vt, h);
+ ei.prototype.animate = function(n, t, i, u, f) {
+ var h = this,
+ s;
+ for (this.chart.isAnimating = !0, f = f || r.easing.linear, i && this.animations.push({
+ startTime: (new Date).getTime() + (n ? n : 0),
+ duration: t,
+ animationCallback: i,
+ onComplete: u
+ }), s = []; this.animations.length > 0;) {
+ var o = this.animations.shift(),
+ c = (new Date).getTime(),
+ e = 0;
+ o.startTime <= c && (e = f(Math.min(c - o.startTime, o.duration), 0, 1, o.duration), e = Math.min(e, 1), (isNaN(e) || !isFinite(e)) && (e = 1));
+ e < 1 && s.push(o);
+ o.animationCallback(e);
+ e >= 1 && o.onComplete && o.onComplete()
+ }
+ this.animations = s;
+ this.animations.length > 0 ? this.animationRequestId = this.chart.requestAnimFrame.call(window, function() {
+ h.animate.call(h)
+ }) : this.chart.isAnimating = !1
+ };
+ ei.prototype.cancelAllAnimations = function() {
+ this.animations = [];
+ this.animationRequestId && this.chart.cancelRequestAnimFrame.call(window, this.animationRequestId);
+ this.animationRequestId = null;
+ this.chart.isAnimating = !1
+ };
+ var r = {
+ yScaleAnimation: function(n, t) {
+ if (n !== 0) {
+ var i = t.dest,
+ r = t.source.canvas,
+ u = t.animationBase,
+ f = u - u * n;
+ i.drawImage(r, 0, 0, r.width, r.height, 0, f, i.canvas.width / l, n * i.canvas.height / l)
+ }
+ },
+ xScaleAnimation: function(n, t) {
+ if (n !== 0) {
+ var i = t.dest,
+ r = t.source.canvas,
+ u = t.animationBase,
+ f = u - u * n;
+ i.drawImage(r, 0, 0, r.width, r.height, f, 0, n * i.canvas.width / l, i.canvas.height / l)
+ }
+ },
+ xClipAnimation: function(n, t) {
+ if (n !== 0) {
+ var r = t.dest,
+ i = t.source.canvas;
+ r.save();
+ n > 0 && r.drawImage(i, 0, 0, i.width * n, i.height, 0, 0, i.width * n / l, i.height / l);
+ r.restore()
+ }
+ },
+ fadeInAnimation: function(n, t) {
+ if (n !== 0) {
+ var i = t.dest,
+ r = t.source.canvas;
+ i.save();
+ i.globalAlpha = n;
+ i.drawImage(r, 0, 0, r.width, r.height, 0, 0, i.canvas.width / l, i.canvas.height / l);
+ i.restore()
+ }
+ },
+ easing: {
+ linear: function(n, t, i, r) {
+ return i * n / r + t
+ },
+ easeOutQuad: function(n, t, i, r) {
+ return -i * (n /= r) * (n - 2) + t
+ },
+ easeOutQuart: function(n, t, i, r) {
+ return -i * ((n = n / r - 1) * n * n * n - 1) + t
+ },
+ easeInQuad: function(n, t, i, r) {
+ return i * (n /= r) * n + t
+ },
+ easeInQuart: function(n, t, i, r) {
+ return i * (n /= r) * n * n * n + t
+ }
+ }
+ },
+ a = {
+ drawMarker: function(n, t, i, r, u, f, e, o) {
+ if (i) {
+ var s = 1;
+ i.fillStyle = f ? f : "#000000";
+ i.strokeStyle = e ? e : "#000000";
+ i.lineWidth = o ? o : 0;
+ r === "circle" ? (i.moveTo(n, t), i.beginPath(), i.arc(n, t, u / 2, 0, Math.PI * 2, !1), f && i.fill(), o && (e ? i.stroke() : (s = i.globalAlpha, i.globalAlpha = .15, i.strokeStyle = "black", i.stroke(), i.globalAlpha = s))) : r === "square" ? (i.beginPath(), i.rect(n - u / 2, t - u / 2, u, u), f && i.fill(), o && (e ? i.stroke() : (s = i.globalAlpha, i.globalAlpha = .15, i.strokeStyle = "black", i.stroke(), i.globalAlpha = s))) : r === "triangle" ? (i.beginPath(), i.moveTo(n - u / 2, t + u / 2), i.lineTo(n + u / 2, t + u / 2), i.lineTo(n, t - u / 2), i.closePath(), f && i.fill(), o && (e ? i.stroke() : (s = i.globalAlpha, i.globalAlpha = .15, i.strokeStyle = "black", i.stroke(), i.globalAlpha = s)), i.beginPath()) : r === "cross" && (i.strokeStyle = f, o = u / 4, i.lineWidth = o, i.beginPath(), i.moveTo(n - u / 2, t - u / 2), i.lineTo(n + u / 2, t + u / 2), i.stroke(), i.moveTo(n + u / 2, t - u / 2), i.lineTo(n - u / 2, t + u / 2), i.stroke())
+ }
+ },
+ drawMarkers: function(n) {
+ for (var t, i = 0; i < n.length; i++) t = n[i], a.drawMarker(t.x, t.y, t.ctx, t.type, t.size, t.color, t.borderColor, t.borderThickness)
+ }
+ },
+ vi = {
+ Chart: function(n, i) {
+ var r = new t(n, i, this);
+ this.render = function() {
+ r.render(this.options)
+ };
+ this.options = r._options
+ },
+ addColorSet: function(n, t) {
+ tt[n] = t
+ },
+ addCultureInfo: function(n, t) {
+ ot[n] = t
+ },
+ formatNumber: function(n, t, i) {
+ if (i = i || "en", t = t || "#,##0.##", ot[i]) return it(n, t, new vt(i));
+ throw "Unknown Culture Name";
+ },
+ formatDate: function(n, t, i) {
+ if (i = i || "en", t = t || "DD MMM YYYY", ot[i]) return ii(n, t, new vt(i));
+ throw "Unknown Culture Name";
+ }
+ };
+ vi.Chart.version = "v1.7.0 GA";
+ window.CanvasJS = vi
+})();
\ No newline at end of file
diff --git a/azure-pipelines.yml b/azure-pipelines.yml
new file mode 100644
index 000000000..9813aa5ff
--- /dev/null
+++ b/azure-pipelines.yml
@@ -0,0 +1,121 @@
+# ASP.NET
+# Build and test ASP.NET projects.
+# Add steps that publish symbols, save build artifacts, deploy, and more:
+# https://docs.microsoft.com/azure/devops/pipelines/apps/aspnet/build-aspnet-4
+
+trigger:
+- deploy/azure-devops-setup
+
+pool:
+ vmImage: 'windows-latest'
+
+variables:
+ solution: 'IW4MAdmin.sln'
+ buildPlatform: 'Any CPU'
+ buildConfiguration: 'Prerelease'
+ outputFolder: '$(Build.ArtifactStagingDirectory)\Publish\$(buildConfiguration)'
+ outputFilename: '$(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip'
+
+steps:
+- task: NuGetToolInstaller@1
+
+- task: NuGetCommand@2
+ inputs:
+ restoreSolution: '$(solution)'
+
+- task: DotNetCoreCLI@2
+ inputs:
+ command: 'build'
+ projects: '**/*.csproj'
+
+- task: PowerShell@2
+ inputs:
+ targetType: 'inline'
+ script: 'wget https://raw.githubusercontent.com/iconic/open-iconic/master/font/css/open-iconic-bootstrap.scss -o lib\open-iconic\font\css\open-iconic-bootstrap.scss'
+ failOnStderr: true
+ workingDirectory: '$(Build.Repository.LocalPath)\WebfrontCore\wwwroot'
+
+- task: DotNetCoreCLI@2
+ inputs:
+ command: 'publish'
+ publishWebProjects: false
+ projects: |
+ **/WebfrontCore.csproj
+ **/Application.csproj
+ arguments: '-c $(buildConfiguration) -o $(outputFolder)'
+ zipAfterPublish: false
+ modifyOutputPath: false
+
+- task: PowerShell@2
+ inputs:
+ targetType: 'inline'
+ script: 'wget https://raidmax.org/downloads/dos2unix.exe'
+ failOnStderr: true
+ workingDirectory: '$(Build.Repository.LocalPath)\Application\BuildScripts'
+
+- task: BatchScript@1
+ inputs:
+ filename: 'Application\BuildScripts\PostPublish.bat'
+ workingFolder: '$(Build.Repository.LocalPath)'
+ arguments: '$(outputFolder)'
+ failOnStandardError: true
+
+- task: PowerShell@2
+ inputs:
+ filePath: 'PostPublish.ps1'
+ arguments: '$(outputFolder)'
+ failOnStderr: true
+ workingDirectory: '$(Build.Repository.LocalPath)'
+
+- task: CmdLine@2
+ inputs:
+ script: |
+ echo changing to encoding for linux start script
+ dos2unix $(outputFolder)\StartIW4MAdmin.sh
+ workingDirectory: '$(Build.Repository.LocalPath)\Application\BuildScripts'
+
+- task: CopyFiles@2
+ inputs:
+ SourceFolder: '$(Build.Repository.LocalPath)\Plugins\ScriptPlugins'
+ Contents: '*.js'
+ TargetFolder: '$(outputFolder)\Plugins'
+
+- task: CopyFiles@2
+ inputs:
+ SourceFolder: '$(Build.Repository.LocalPath)\BUILD\Plugins\'
+ Contents: '*.dll'
+ TargetFolder: '$(outputFolder)\Plugins'
+
+- task: CmdLine@2
+ inputs:
+ script: 'xcopy /s /y /f wwwroot $(outputFolder)\wwwroot'
+ workingDirectory: '$(Build.Repository.LocalPath)\BUILD\Plugins'
+ failOnStderr: true
+
+- task: ArchiveFiles@2
+ inputs:
+ rootFolderOrFile: '$(outputFolder)'
+ includeRootFolder: false
+ archiveType: 'zip'
+ archiveFile: '$(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip'
+ replaceExistingArchive: true
+
+- task: FtpUpload@2
+ inputs:
+ credentialsOption: 'inputs'
+ serverUrl: '$(FTPUrl)'
+ username: '$(FTPUsername)'
+ password: '$(FTPPassword)'
+ rootDirectory: '$(Build.ArtifactStagingDirectory)'
+ filePatterns: '*.zip'
+ remoteDirectory: 'IW4MAdmin/Download'
+ clean: false
+ cleanContents: false
+ preservePaths: false
+ trustSSL: false
+
+- task: PublishPipelineArtifact@1
+ inputs:
+ targetPath: '$(outputFolder)'
+ artifact: 'IW4MAdmin.$(buildConfiguration)'
+ publishLocation: 'pipeline'
\ No newline at end of file