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("<\/img>
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 = "" + n._cultureInfo[i + "Text"] + "") + } + + 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 = '
= 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