diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..145c44c --- /dev/null +++ b/.gitignore @@ -0,0 +1,356 @@ +# PTMagic specific +_[Dd]oc +_[Ss]ource +_[Ll]ogfiles +_[Ll]og +_[Ll]ogs +_[Dd]ata +_backups +LocalProfitTrailer +PTMagic/settings.*.json +Monitor/appsettings.json +/.vscode/tasks.json + + + +# Created by https://www.gitignore.io/api/visualstudio,visualstudiocode,phpstorm + +### VisualStudioCode ### +.vscode/* +!.vscode/settings.json +!.vscode/launch.json +!.vscode/extensions.json + + +### PhpStorm ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff: +.idea/workspace.xml +.idea/tasks.xml + +# Sensitive or high-churn files: +.idea/dataSources/ +.idea/dataSources.ids +.idea/dataSources.xml +.idea/dataSources.local.xml +.idea/sqlDataSources.xml +.idea/dynamic.xml +.idea/uiDesigner.xml + +# Gradle: +.idea/gradle.xml +.idea/libraries + +# Mongo Explorer plugin: +.idea/mongoSettings.xml + +## File-based project format: +*.iws + +## Plugin-specific files: + +# IntelliJ +/out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +### PhpStorm Patch ### +# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 + +# *.iml +# modules.xml +# .idea/misc.xml +# *.ipr + + +### VisualStudio ### +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates +*.vcxproj.filters + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ + +# Visual Studio 2015 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ +**/Properties/launchSettings.json + +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# TODO: Comment the next line if you want to checkin your web deploy settings +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/packages/* +# except build/, which is used as an MSBuild target. +!**/packages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/packages/repositories.config +# NuGet v3's project.json files produces more ignoreable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +node_modules/ +orleans.codegen.cs + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +*.mdf +*.ldf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# JetBrains Rider +.idea/ +*.sln.iml + +# CodeRush +.cr/ + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/ + +### VisualStudio Patch ### +build/ \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..4865d38 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,64 @@ +{ + // Use IntelliSense to find out which attributes exist for C# debugging + // Use hover for the description of the existing attributes + // For further information visit https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md + "version": "0.2.0", + "configurations": [ + { + "name": "debug PTMagic", + "type": "coreclr", + "request": "launch", + "preLaunchTask": "VS build PTMagic", + // If you have changed target frameworks, make sure to update the program path. + "program": "${workspaceFolder}/PTMagic/bin/Debug/netcoreapp2.0/PTMagic.dll", + "args": [], + "cwd": "${workspaceFolder}/PTMagic", + "stopAtEntry": false, + "internalConsoleOptions": "openOnSessionStart", + "env": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "sourceFileMap": { + "/Views": "${workspaceFolder}/Views" + } + }, + { + "name": "debug Monitor", + "type": "coreclr", + "request": "launch", + "preLaunchTask": "VS build Monitor", + // If you have changed target frameworks, make sure to update the program path. + "program": "${workspaceFolder}/Monitor/bin/Debug/netcoreapp2.0/Monitor.dll", + "args": [], + "cwd": "${workspaceFolder}/Monitor", + "stopAtEntry": false, + "internalConsoleOptions": "openOnSessionStart", + "launchBrowser": { + "enabled": true, + "args": "${auto-detect-url}", + "windows": { + "command": "cmd.exe", + "args": "/C start ${auto-detect-url}" + }, + "osx": { + "command": "open" + }, + "linux": { + "command": "xdg-open" + } + }, + "env": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "sourceFileMap": { + "/Views": "${workspaceFolder}/Views" + } + }, + { + "name": ".NET Core Attach", + "type": "coreclr", + "request": "attach", + "processId": "${command:pickProcess}" + } + ,] +} \ No newline at end of file diff --git a/Core/Core.csproj b/Core/Core.csproj new file mode 100644 index 0000000..48a800b --- /dev/null +++ b/Core/Core.csproj @@ -0,0 +1,23 @@ + + + + netcoreapp2.0 + + + + + + + + + + + + + + + + + + + diff --git a/Core/DataObjects/PTMagicData.cs b/Core/DataObjects/PTMagicData.cs new file mode 100644 index 0000000..5f540ff --- /dev/null +++ b/Core/DataObjects/PTMagicData.cs @@ -0,0 +1,528 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Text; + +namespace Core.Main.DataObjects.PTMagicData { + #region Settings Objects + public class GeneralSettingsWrapper { + public GeneralSettings GeneralSettings { get; set; } + } + + public class AnalyzerSettingsWrapper { + public AnalyzerSettings AnalyzerSettings { get; set; } + } + + public class SecureSettingsWrapper { + public SecureSettings SecureSettings { get; set; } + } + + #region GeneralSettings + public class GeneralSettings { + public Application Application { get; set; } + public Monitor Monitor { get; set; } + public Backup Backup { get; set; } + public Telegram Telegram { get; set; } + } + + public class Application { + public bool IsEnabled { get; set; } = true; + public bool TestMode { get; set; } = true; + public bool EnableBetaFeatures { get; set; } = false; + public int ProfitTrailerMajorVersion { get; set; } = 1; + public string ProfitTrailerPath { get; set; } + public string ProfitTrailerLicense { get; set; } = ""; + public string ProfitTrailerMonitorURL { get; set; } = "http://localhost:8081/"; + public string ProfitTrailerDefaultSettingName { get; set; } = "default"; + public bool AlwaysLoadDefaultBeforeSwitch { get; set; } = true; + public int FloodProtectionMinutes { get; set; } = 15; + public string Exchange { get; set; } + public double StartBalance { get; set; } = 0; + public string InstanceName { get; set; } = "PT Magic"; + public string TimezoneOffset { get; set; } = "+0:00"; + public string MainFiatCurrency { get; set; } = "USD"; + } + + public class Monitor { + private string _rootUrl = "/"; + + public bool IsPasswordProtected { get; set; } = true; + public bool OpenBrowserOnStart { get; set; } = false; + public int Port { get; set; } = 5000; + public int GraphIntervalMinutes { get; set; } = 60; + public int GraphMaxTimeframeHours { get; set; } = 24; + public int RefreshSeconds { get; set; } = 30; + public int BagAnalyzerRefreshSeconds { get; set; } = 5; + public int BuyAnalyzerRefreshSeconds { get; set; } = 5; + public int MaxTopMarkets { get; set; } = 20; + public int MaxDailySummaries { get; set; } = 10; + public int MaxMonthlySummaries { get; set; } = 10; + public int MaxDashboardBuyEntries { get; set; } = 10; + public int MaxDashboardBagEntries { get; set; } = 10; + public int MaxDCAPairs { get; set; } = 24; + public int MaxSettingsLogEntries { get; set; } = 20; + public string LinkPlatform { get; set; } = "TradingView"; + public string DefaultDCAMode { get; set; } = "Simple"; + + public string RootUrl { + get { + if (!_rootUrl.EndsWith("/")) _rootUrl += "/"; + return _rootUrl; + } + set { + _rootUrl = value; + } + } + } + + public class Backup { + public bool IsEnabled { get; set; } = true; + public int MaxHours { get; set; } = 48; + } + + public class Telegram { + public bool IsEnabled { get; set; } = false; + public string BotToken { get; set; } + public Int64 ChatId { get; set; } + public bool SilentMode { get; set; } = false; + } + #endregion + + #region AnalyzerSettings + public class AnalyzerSettings { + public MarketAnalyzer MarketAnalyzer { get; set; } + public List GlobalSettings { get; set; } + public List SingleMarketSettings { get; set; } + } + + public class MarketAnalyzer { + public int StoreDataMaxHours { get; set; } + public int IntervalMinutes { get; set; } = 5; + public bool ExcludeMainCurrency { get; set; } = true; + public List MarketTrends { get; set; } + } + + public class MarketTrend { + public string Name { get; set; } + public string Platform { get; set; } = "Exchange"; + + [DefaultValue("Market")] + public string TrendCurrency { get; set; } = "Market"; + + [DefaultValue(0)] + public int MaxMarkets { get; set; } = 0; + public int TrendMinutes { get; set; } = 0; + + [DefaultValue(true)] + public bool DisplayGraph { get; set; } = true; + + [DefaultValue(true)] + public bool DisplayOnMarketAnalyzerList { get; set; } = true; + + [DefaultValue("")] + public string IgnoredMarkets { get; set; } = ""; + + [DefaultValue("")] + public string AllowedMarkets { get; set; } = ""; + + [DefaultValue(true)] + public bool ExcludeMainCurrency { get; set; } = true; + } + + public class GlobalSetting { + public string SettingName { get; set; } + public string TriggerConnection { get; set; } = "AND"; + public List Triggers { get; set; } = new List(); + public Dictionary PairsProperties { get; set; } = new Dictionary(); + public Dictionary DCAProperties { get; set; } = new Dictionary(); + public Dictionary IndicatorsProperties { get; set; } = new Dictionary(); + } + + public class SingleMarketSetting { + public string SettingName { get; set; } + public string TriggerConnection { get; set; } = "AND"; + + [DefaultValue("AND")] + public string OffTriggerConnection { get; set; } = "AND"; + + [DefaultValue(true)] + public bool RefreshOffTriggers { get; set; } = true; + + [DefaultValue("")] + public string IgnoredMarkets { get; set; } = ""; + + [DefaultValue("")] + public string AllowedMarkets { get; set; } = ""; + + [DefaultValue("")] + public string IgnoredGlobalSettings { get; set; } = ""; + + [DefaultValue("")] + public string AllowedGlobalSettings { get; set; } = ""; + + [DefaultValue(false)] + public bool StopProcessWhenTriggered { get; set; } = false; + public List Triggers { get; set; } = new List(); + public List OffTriggers { get; set; } = new List(); + public Dictionary PairsProperties { get; set; } = new Dictionary(); + public Dictionary DCAProperties { get; set; } = new Dictionary(); + public Dictionary IndicatorsProperties { get; set; } = new Dictionary(); + } + + public class Trigger { + [DefaultValue("")] + public string MarketTrendName { get; set; } = ""; + + [DefaultValue("Relative")] + public string MarketTrendRelation { get; set; } = "Relative"; + + [DefaultValue(Constants.MaxTrendChange)] + public double MaxChange { get; set; } = Constants.MaxTrendChange; + + [DefaultValue(Constants.MinTrendChange)] + public double MinChange { get; set; } = Constants.MinTrendChange; + + [DefaultValue(Constants.Max24hVolume)] + public double Max24hVolume { get; set; } = Constants.Max24hVolume; + + [DefaultValue(0.0)] + public double Min24hVolume { get; set; } = 0.0; + + [DefaultValue(0)] + public int AgeDaysLowerThan { get; set; } = 0; + } + + public class OffTrigger { + [DefaultValue("")] + public string MarketTrendName { get; set; } = ""; + + [DefaultValue("Relative")] + public string MarketTrendRelation { get; set; } = "Relative"; + + [DefaultValue(Constants.MaxTrendChange)] + public double MaxChange { get; set; } = Constants.MaxTrendChange; + + [DefaultValue(Constants.MinTrendChange)] + public double MinChange { get; set; } = Constants.MinTrendChange; + + [DefaultValue(Constants.Max24hVolume)] + public double Max24hVolume { get; set; } = Constants.Max24hVolume; + + [DefaultValue(0.0)] + public double Min24hVolume { get; set; } = 0.0; + + [DefaultValue(0)] + public int HoursSinceTriggered { get; set; } = 0; + } + #endregion + + #region SecureSettings + public class SecureSettings { + public string MonitorPassword { get; set; } = ""; + } + #endregion + + #endregion + + #region Market Analyzer Objects + public class Market { + public int Position; + public string Name = ""; + public string Symbol = ""; + public double Volume24h = 0.0; + public double Price = 0.0; + public double TrendChange24h = 0.0; + public double MainCurrencyPriceUSD = 0.0; + } + + public class MarketTick { + public double Volume24h = 0.0; + public double Price = 0.0; + public DateTime Time = Constants.confMinDate; + } + + public class MarketTrendChange { + public string MarketTrendName = ""; + public string Market = ""; + public double LastPrice = 0.0; + public double Volume24h = 0.0; + public double TrendMinutes = 0.0; + public double TrendChange = 0.0; + public DateTime TrendDateTime = Constants.confMinDate; + } + + public class MarketInfo { + public string Name = ""; + public DateTime FirstSeen = Constants.confMinDate; + public DateTime LastSeen = Constants.confMaxDate; + } + #endregion + + #region Summary Objects + public class Summary { + public string Version { get; set; } = ""; + public DateTime LastRuntime { get; set; } = Constants.confMinDate; + public int LastRuntimeSeconds { get; set; } = 0; + public DateTime LastGlobalSettingSwitch { get; set; } = Constants.confMinDate; + public GlobalSetting CurrentGlobalSetting { get; set; } = null; + public GlobalSetting FloodProtectedSetting { get; set; } = null; + public bool IsSOMActive { get; set; } = false; + public Dictionary MarketSummary { get; set; } = new Dictionary(); + public Dictionary> MarketTrendChanges { get; set; } = new Dictionary>(); + public List GlobalSettingSummary { get; set; } = new List(); + public double BuyValue { get; set; } = 0; + public double TrailingBuy { get; set; } = 0; + public double SellValue { get; set; } = 0; + public double TrailingProfit { get; set; } = 0; + public double MaxTradingPairs { get; set; } = 0; + public double MaxCost { get; set; } = 0; + public double MaxCostPercentage { get; set; } = 0; + public double MinBuyVolume { get; set; } = 0; + public double DCALevels { get; set; } = 0; + public double DCATrigger { get; set; } = 0; + public Dictionary DCATriggers { get; set; } = new Dictionary(); + public double DCAPercentage { get; set; } = 0; + public Dictionary DCAPercentages { get; set; } = new Dictionary(); + public string DCABuyStrategy { get; set; } = ""; + public string BuyStrategy { get; set; } = ""; + public string SellStrategy { get; set; } = ""; + public string MainMarket { get; set; } = ""; + public double MainMarketPrice { get; set; } = 0; + public string MainFiatCurrency { get; set; } = "USD"; + public double MainFiatCurrencyExchangeRate { get; set; } = 1; + public int ProfitTrailerMajorVersion { get; set; } = 1; + public List BuyStrategies { get; set; } = new List(); + public List SellStrategies { get; set; } = new List(); + public List DCABuyStrategies { get; set; } = new List(); + public List DCASellStrategies { get; set; } = new List(); + } + + public class StrategySummary { + public string Name { get; set; } = ""; + public double Value { get; set; } = 0; + } + + public class GlobalSettingSummary { + public string SettingName { get; set; } + public DateTime SwitchDateTime { get; set; } + public int ActiveSeconds { get; set; } = 0; + public Dictionary MarketTrendChanges { get; set; } = new Dictionary(); + } + + public class MarketPairSummary { + public bool IsTradingEnabled { get; set; } = false; + public bool IsSOMActive { get; set; } = false; + public bool IsDCAEnabled { get; set; } = false; + public List ActiveSingleSettings { get; set; } = null; + public double CurrentBuyValue { get; set; } = 0; + public double CurrentTrailingBuy { get; set; } = 0; + public double CurrentSellValue { get; set; } = 0; + public double CurrentTrailingProfit { get; set; } = 0; + public double LatestPrice { get; set; } = 0; + public double Latest24hVolume { get; set; } = 0; + public Dictionary MarketTrendChanges { get; set; } = new Dictionary(); + public List BuyStrategies { get; set; } = new List(); + public List SellStrategies { get; set; } = new List(); + public List DCABuyStrategies { get; set; } = new List(); + public List DCASellStrategies { get; set; } = new List(); + } + #endregion + + #region Transaction Objects + public class Transaction { + public string GUID { get; set; } = ""; + public DateTime UTCDateTime { get; set; } = Constants.confMinDate; + public double Amount { get; set; } = 0.0; + + public DateTime GetLocalDateTime(string offset) { + DateTimeOffset result = this.UTCDateTime; + + // Convert UTC sales time to local offset time + TimeSpan offsetTimeSpan = TimeSpan.Parse(offset.Replace("+", "")); + result = result.ToOffset(offsetTimeSpan); + + return result.DateTime; + } + } + #endregion + + #region SingleMarketSettingSummary Objects + public class SingleMarketSettingSummary { + public string Market { get; set; } = ""; + public DateTime ActivationDateTimeUTC { get; set; } = Constants.confMinDate; + public SingleMarketSetting SingleMarketSetting { get; set; } = null; + public TriggerSnapshot TriggerSnapshot { get; set; } = null; + } + + public class TriggerSnapshot { + public Dictionary RelevantTriggers { get; set; } = new Dictionary(); + public List MatchedTriggersContent { get; set; } = new List(); + public double LastPrice { get; set; } = 0; + public double Last24hVolume { get; set; } = 0; + } + #endregion + + #region Profit Trailer JSON Objects + + public class PTData { + public List SellLogData { get; set; } = new List(); + public List DCALogData { get; set; } = new List(); + public List GainLogData { get; set; } = new List(); + public List bbBuyLogData { get; set; } = new List(); + } + + public class sellLogData { + public double soldAmount { get; set; } + public SoldDate soldDate { get; set; } + public int boughtTimes { get; set; } + public string market { get; set; } + public double profit { get; set; } + public AverageCalculator averageCalculator { get; set; } + public double currentPrice { get; set; } + } + + public class SellLogData { + public double SoldAmount { get; set; } + public DateTime SoldDate { get; set; } + public int BoughtTimes { get; set; } + public string Market { get; set; } + public double ProfitPercent { get; set; } + public double Profit { get; set; } + public double AverageBuyPrice { get; set; } + public double TotalCost { get; set; } + public double SoldPrice { get; set; } + public double SoldValue { get; set; } + } + + public class SoldDate { + public Date date { get; set; } + public Time time { get; set; } + } + + public class FirstBoughtDate { + public Date date { get; set; } + public Time time { get; set; } + } + + public class Date { + public int year { get; set; } + public int month { get; set; } + public int day { get; set; } + } + + public class Time { + public int hour { get; set; } + public int minute { get; set; } + public int second { get; set; } + public int nano { get; set; } + } + + public class AverageCalculator { + public double totalCost { get; set; } + public double totalAmount { get; set; } + public double totalAmountWithSold { get; set; } + public double avgPrice { get; set; } + public double avgCost { get; set; } + public FirstBoughtDate firstBoughtDate { get; set; } + public double totalWeightedPrice { get; set; } + public double orderNumber { get; set; } + public double fee { get; set; } + } + + public class PTStrategy { + public string type { get; set; } + public string name { get; set; } + public double entryValue { get; set; } + public double entryValueLimit { get; set; } + public double triggerValue { get; set; } + public double currentValue { get; set; } + public double currentValuePercentage { get; set; } + public int decimals { get; set; } + public string positive { get; set; } + } + + public class dcaLogData { + public int boughtTimes { get; set; } = 0; + public string market { get; set; } + public string positive { get; set; } + public double buyProfit { get; set; } + public double BBLow { get; set; } + public double BBTrigger { get; set; } + public double highbb { get; set; } + public double profit { get; set; } + public AverageCalculator averageCalculator { get; set; } + public double currentPrice { get; set; } + public string sellStrategy { get; set; } + public string buyStrategy { get; set; } + public double triggerValue { get; set; } + public double percChange { get; set; } + public List buyStrategies { get; set; } + public List sellStrategies { get; set; } + } + + public class Strategy { + public string Type { get; set; } + public string Name { get; set; } + public double EntryValue { get; set; } + public double EntryValueLimit { get; set; } + public double TriggerValue { get; set; } + public double CurrentValue { get; set; } + public double CurrentValuePercentage { get; set; } + public int Decimals { get; set; } + public bool IsTrailing { get; set; } + } + + public class DCALogData { + public int BoughtTimes { get; set; } + public double CurrentLowBBValue { get; set; } + public double CurrentHighBBValue { get; set; } + public double BBTrigger { get; set; } + public double BuyTriggerPercent { get; set; } + public bool IsTrailing { get; set; } + public string Market { get; set; } + public double ProfitPercent { get; set; } + public double AverageBuyPrice { get; set; } + public double TotalCost { get; set; } + public double Amount { get; set; } + public double CurrentPrice { get; set; } + public double SellTrigger { get; set; } + public double PercChange { get; set; } + public DateTime FirstBoughtDate { get; set; } + public string SellStrategy { get; set; } + public string BuyStrategy { get; set; } + public List BuyStrategies { get; set; } = new List(); + public List SellStrategies { get; set; } = new List(); + } + + public class buyLogData { + public string market { get; set; } + public string positive { get; set; } + public double BBLow { get; set; } + public double BBHigh { get; set; } + public double BBTrigger { get; set; } + public double profit { get; set; } + public double currentPrice { get; set; } + public double currentValue { get; set; } + public string buyStrategy { get; set; } + public double triggerValue { get; set; } + public double percChange { get; set; } + public List buyStrategies { get; set; } + } + + public class BuyLogData { + public double CurrentLowBBValue { get; set; } + public double CurrentHighBBValue { get; set; } + public double BBTrigger { get; set; } + public bool IsTrailing { get; set; } + public string Market { get; set; } + public double ProfitPercent { get; set; } + public double CurrentPrice { get; set; } + public double CurrentValue { get; set; } + public double TriggerValue { get; set; } + public double PercChange { get; set; } + public string BuyStrategy { get; set; } + public List BuyStrategies { get; set; } = new List(); + } + + #endregion +} diff --git a/Core/DataObjects/ProfitTrailerData.cs b/Core/DataObjects/ProfitTrailerData.cs new file mode 100644 index 0000000..0f8710e --- /dev/null +++ b/Core/DataObjects/ProfitTrailerData.cs @@ -0,0 +1,298 @@ +using System; +using System.IO; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Newtonsoft.Json; +using Core.Main.DataObjects.PTMagicData; + +namespace Core.Main.DataObjects { + + public class ProfitTrailerData { + private List _sellLog = new List(); + private List _dcaLog = new List(); + private List _buyLog = new List(); + private string _ptmBasePath = ""; + private PTMagicConfiguration _systemConfiguration = null; + private TransactionData _transactionData = null; + private DateTimeOffset _dateTimeNow = Constants.confMinDate; + + public ProfitTrailerData(string ptmBasePath, PTMagicConfiguration systemConfiguration) { + _ptmBasePath = ptmBasePath; + _systemConfiguration = systemConfiguration; + + PTData rawPTData = JsonConvert.DeserializeObject(File.ReadAllText(systemConfiguration.GeneralSettings.Application.ProfitTrailerPath + "ProfitTrailerData.json")); + if (rawPTData.SellLogData != null) { + this.BuildSellLogData(rawPTData.SellLogData, _systemConfiguration); + } + + if (rawPTData.bbBuyLogData != null) { + this.BuildBuyLogData(rawPTData.bbBuyLogData, _systemConfiguration); + } + + if (rawPTData.DCALogData != null) { + this.BuildDCALogData(rawPTData.DCALogData, rawPTData.GainLogData, _systemConfiguration); + } + + // Convert local offset time to UTC + TimeSpan offsetTimeSpan = TimeSpan.Parse(systemConfiguration.GeneralSettings.Application.TimezoneOffset.Replace("+", "")); + _dateTimeNow = DateTimeOffset.UtcNow.ToOffset(offsetTimeSpan); + } + + public List SellLog { + get { + return _sellLog; + } + } + + public List SellLogToday { + get { + return _sellLog.FindAll(sl => sl.SoldDate.Date == _dateTimeNow.DateTime.Date); + } + } + + public List SellLogYesterday { + get { + return _sellLog.FindAll(sl => sl.SoldDate.Date == _dateTimeNow.DateTime.AddDays(-1).Date); + } + } + + public List SellLogLast7Days { + get { + return _sellLog.FindAll(sl => sl.SoldDate.Date >= _dateTimeNow.DateTime.AddDays(-7).Date); + } + } + + public List DCALog { + get { + return _dcaLog; + } + } + + public List BuyLog { + get { + return _buyLog; + } + } + + public TransactionData TransactionData { + get { + if (_transactionData == null) _transactionData = new TransactionData(_ptmBasePath); + return _transactionData; + } + } + + public double GetCurrentBalance() { + return this.GetSnapshotBalance(DateTime.Now.ToUniversalTime()); + } + + public double GetSnapshotBalance(DateTime snapshotDateTime) { + double result = _systemConfiguration.GeneralSettings.Application.StartBalance; + + result += this.SellLog.FindAll(sl => sl.SoldDate.Date < snapshotDateTime.Date).Sum(sl => sl.Profit); + result += this.TransactionData.Transactions.FindAll(t => t.GetLocalDateTime(_systemConfiguration.GeneralSettings.Application.TimezoneOffset) < snapshotDateTime).Sum(t => t.Amount); + + return result; + } + + private void BuildSellLogData(List rawSellLogData, PTMagicConfiguration systemConfiguration) { + foreach (sellLogData rsld in rawSellLogData) { + SellLogData sellLogData = new SellLogData(); + sellLogData.SoldAmount = rsld.soldAmount; + sellLogData.BoughtTimes = rsld.boughtTimes; + sellLogData.Market = rsld.market; + sellLogData.ProfitPercent = rsld.profit; + sellLogData.SoldPrice = rsld.currentPrice; + sellLogData.AverageBuyPrice = rsld.averageCalculator.avgPrice; + sellLogData.TotalCost = sellLogData.SoldAmount * sellLogData.AverageBuyPrice; + + double soldValueRaw = (sellLogData.SoldAmount * sellLogData.SoldPrice); + double soldValueAfterFees = soldValueRaw - (soldValueRaw * (rsld.averageCalculator.fee / 100)); + sellLogData.SoldValue = soldValueAfterFees; + sellLogData.Profit = Math.Round(sellLogData.SoldValue - sellLogData.TotalCost, 8); + + // Profit Trailer sales are saved in UTC + DateTimeOffset ptSoldDate = DateTimeOffset.Parse(rsld.soldDate.date.year.ToString() + "-" + rsld.soldDate.date.month.ToString("00") + "-" + rsld.soldDate.date.day.ToString("00") + "T" + rsld.soldDate.time.hour.ToString("00") + ":" + rsld.soldDate.time.minute.ToString("00") + ":" + rsld.soldDate.time.second.ToString("00"), CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal); + + // Convert UTC sales time to local offset time + TimeSpan offsetTimeSpan = TimeSpan.Parse(systemConfiguration.GeneralSettings.Application.TimezoneOffset.Replace("+", "")); + ptSoldDate = ptSoldDate.ToOffset(offsetTimeSpan); + + sellLogData.SoldDate = ptSoldDate.DateTime; + + _sellLog.Add(sellLogData); + } + } + + private void BuildDCALogData(List rawDCALogData, List rawPairsLogData, PTMagicConfiguration systemConfiguration) { + foreach (dcaLogData rdld in rawDCALogData) { + DCALogData dcaLogData = new DCALogData(); + dcaLogData.Amount = rdld.averageCalculator.totalAmount; + dcaLogData.BoughtTimes = rdld.boughtTimes; + dcaLogData.Market = rdld.market; + dcaLogData.ProfitPercent = rdld.profit; + dcaLogData.AverageBuyPrice = rdld.averageCalculator.avgPrice; + dcaLogData.TotalCost = rdld.averageCalculator.totalCost; + dcaLogData.BuyTriggerPercent = rdld.buyProfit; + dcaLogData.CurrentLowBBValue = rdld.BBLow; + dcaLogData.CurrentHighBBValue = rdld.highbb; + dcaLogData.BBTrigger = rdld.BBTrigger; + dcaLogData.CurrentPrice = rdld.currentPrice; + dcaLogData.SellTrigger = rdld.triggerValue; + dcaLogData.PercChange = rdld.percChange; + dcaLogData.BuyStrategy = rdld.buyStrategy; + if (dcaLogData.BuyStrategy == null) dcaLogData.BuyStrategy = ""; + dcaLogData.SellStrategy = rdld.sellStrategy; + if (dcaLogData.SellStrategy == null) dcaLogData.SellStrategy = ""; + + if (rdld.positive != null) { + dcaLogData.IsTrailing = rdld.positive.IndexOf("true", StringComparison.InvariantCultureIgnoreCase) > -1; + } else { + if (rdld.buyStrategies != null) { + foreach (PTStrategy bs in rdld.buyStrategies) { + Strategy buyStrategy = new Strategy(); + buyStrategy.Type = bs.type; + buyStrategy.Name = bs.name; + buyStrategy.EntryValue = bs.entryValue; + buyStrategy.EntryValueLimit = bs.entryValueLimit; + buyStrategy.TriggerValue = bs.triggerValue; + buyStrategy.CurrentValue = bs.currentValue; + buyStrategy.CurrentValuePercentage = bs.currentValuePercentage; + buyStrategy.Decimals = bs.decimals; + buyStrategy.IsTrailing = bs.positive.IndexOf("true", StringComparison.InvariantCultureIgnoreCase) > -1; + + dcaLogData.BuyStrategies.Add(buyStrategy); + } + } + + if (rdld.sellStrategies != null) { + foreach (PTStrategy ss in rdld.sellStrategies) { + Strategy sellStrategy = new Strategy(); + sellStrategy.Type = ss.type; + sellStrategy.Name = ss.name; + sellStrategy.EntryValue = ss.entryValue; + sellStrategy.EntryValueLimit = ss.entryValueLimit; + sellStrategy.TriggerValue = ss.triggerValue; + sellStrategy.CurrentValue = ss.currentValue; + sellStrategy.CurrentValuePercentage = ss.currentValuePercentage; + sellStrategy.Decimals = ss.decimals; + sellStrategy.IsTrailing = ss.positive.IndexOf("true", StringComparison.InvariantCultureIgnoreCase) > -1; + + dcaLogData.SellStrategies.Add(sellStrategy); + } + } + } + + + // Profit Trailer bought times are saved in UTC + if (rdld.averageCalculator.firstBoughtDate != null) { + DateTimeOffset ptFirstBoughtDate = DateTimeOffset.Parse(rdld.averageCalculator.firstBoughtDate.date.year.ToString() + "-" + rdld.averageCalculator.firstBoughtDate.date.month.ToString("00") + "-" + rdld.averageCalculator.firstBoughtDate.date.day.ToString("00") + "T" + rdld.averageCalculator.firstBoughtDate.time.hour.ToString("00") + ":" + rdld.averageCalculator.firstBoughtDate.time.minute.ToString("00") + ":" + rdld.averageCalculator.firstBoughtDate.time.second.ToString("00"), CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal); + + // Convert UTC bought time to local offset time + TimeSpan offsetTimeSpan = TimeSpan.Parse(systemConfiguration.GeneralSettings.Application.TimezoneOffset.Replace("+", "")); + ptFirstBoughtDate = ptFirstBoughtDate.ToOffset(offsetTimeSpan); + + dcaLogData.FirstBoughtDate = ptFirstBoughtDate.DateTime; + } else { + dcaLogData.FirstBoughtDate = Constants.confMinDate; + } + + _dcaLog.Add(dcaLogData); + } + + foreach (dcaLogData rpld in rawPairsLogData) { + DCALogData dcaLogData = new DCALogData(); + dcaLogData.Amount = rpld.averageCalculator.totalAmount; + dcaLogData.BoughtTimes = 0; + dcaLogData.Market = rpld.market; + dcaLogData.ProfitPercent = rpld.profit; + dcaLogData.AverageBuyPrice = rpld.averageCalculator.avgPrice; + dcaLogData.TotalCost = rpld.averageCalculator.totalCost; + dcaLogData.BuyTriggerPercent = rpld.buyProfit; + dcaLogData.CurrentPrice = rpld.currentPrice; + dcaLogData.SellTrigger = rpld.triggerValue; + dcaLogData.PercChange = rpld.percChange; + dcaLogData.BuyStrategy = rpld.buyStrategy; + if (dcaLogData.BuyStrategy == null) dcaLogData.BuyStrategy = ""; + dcaLogData.SellStrategy = rpld.sellStrategy; + if (dcaLogData.SellStrategy == null) dcaLogData.SellStrategy = ""; + dcaLogData.IsTrailing = false; + + if (rpld.sellStrategies != null) { + foreach (PTStrategy ss in rpld.sellStrategies) { + Strategy sellStrategy = new Strategy(); + sellStrategy.Type = ss.type; + sellStrategy.Name = ss.name; + sellStrategy.EntryValue = ss.entryValue; + sellStrategy.EntryValueLimit = ss.entryValueLimit; + sellStrategy.TriggerValue = ss.triggerValue; + sellStrategy.CurrentValue = ss.currentValue; + sellStrategy.CurrentValuePercentage = ss.currentValuePercentage; + sellStrategy.Decimals = ss.decimals; + sellStrategy.IsTrailing = ss.positive.IndexOf("true", StringComparison.InvariantCultureIgnoreCase) > -1; + + dcaLogData.SellStrategies.Add(sellStrategy); + } + } + + // Profit Trailer bought times are saved in UTC + if (rpld.averageCalculator.firstBoughtDate != null) { + DateTimeOffset ptFirstBoughtDate = DateTimeOffset.Parse(rpld.averageCalculator.firstBoughtDate.date.year.ToString() + "-" + rpld.averageCalculator.firstBoughtDate.date.month.ToString("00") + "-" + rpld.averageCalculator.firstBoughtDate.date.day.ToString("00") + "T" + rpld.averageCalculator.firstBoughtDate.time.hour.ToString("00") + ":" + rpld.averageCalculator.firstBoughtDate.time.minute.ToString("00") + ":" + rpld.averageCalculator.firstBoughtDate.time.second.ToString("00"), CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal); + + // Convert UTC bought time to local offset time + TimeSpan offsetTimeSpan = TimeSpan.Parse(systemConfiguration.GeneralSettings.Application.TimezoneOffset.Replace("+", "")); + ptFirstBoughtDate = ptFirstBoughtDate.ToOffset(offsetTimeSpan); + + dcaLogData.FirstBoughtDate = ptFirstBoughtDate.DateTime; + } else { + dcaLogData.FirstBoughtDate = Constants.confMinDate; + } + + _dcaLog.Add(dcaLogData); + } + } + + private void BuildBuyLogData(List rawBuyLogData, PTMagicConfiguration systemConfiguration) { + foreach (buyLogData rbld in rawBuyLogData) { + BuyLogData buyLogData = new BuyLogData(); + buyLogData.Market = rbld.market; + buyLogData.ProfitPercent = rbld.profit; + buyLogData.TriggerValue = rbld.triggerValue; + buyLogData.CurrentValue = rbld.currentValue; + buyLogData.CurrentPrice = rbld.currentPrice; + buyLogData.PercChange = rbld.percChange; + buyLogData.BuyStrategy = rbld.buyStrategy; + buyLogData.CurrentLowBBValue = rbld.BBLow; + buyLogData.CurrentHighBBValue = rbld.BBHigh; + buyLogData.BBTrigger = rbld.BBTrigger; + + if (buyLogData.BuyStrategy == null) buyLogData.BuyStrategy = ""; + + if (rbld.positive != null) { + buyLogData.IsTrailing = rbld.positive.IndexOf("true", StringComparison.InvariantCultureIgnoreCase) > -1; + } else { + if (rbld.buyStrategies != null) { + foreach (PTStrategy bs in rbld.buyStrategies) { + Strategy buyStrategy = new Strategy(); + buyStrategy.Type = bs.type; + buyStrategy.Name = bs.name; + buyStrategy.EntryValue = bs.entryValue; + buyStrategy.EntryValueLimit = bs.entryValueLimit; + buyStrategy.TriggerValue = bs.triggerValue; + buyStrategy.CurrentValue = bs.currentValue; + buyStrategy.CurrentValuePercentage = bs.currentValuePercentage; + buyStrategy.Decimals = bs.decimals; + buyStrategy.IsTrailing = bs.positive.IndexOf("true", StringComparison.InvariantCultureIgnoreCase) > -1; + + buyLogData.BuyStrategies.Add(buyStrategy); + } + } + } + + _buyLog.Add(buyLogData); + } + } + } +} diff --git a/Core/DataObjects/TransactionData.cs b/Core/DataObjects/TransactionData.cs new file mode 100644 index 0000000..7332355 --- /dev/null +++ b/Core/DataObjects/TransactionData.cs @@ -0,0 +1,33 @@ +using System; +using System.IO; +using System.Collections.Generic; +using System.Globalization; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Newtonsoft.Json; +using Core.Main.DataObjects.PTMagicData; +using Core.Helper; + +namespace Core.Main.DataObjects { + + public class TransactionData { + private List _transactions = new List(); + + public TransactionData(string basePath) { + string transactionsFilePath = basePath + Constants.PTMagicPathData + Path.DirectorySeparatorChar + "Transactions.json"; + if (File.Exists(transactionsFilePath)) { + this._transactions = JsonConvert.DeserializeObject>(File.ReadAllText(transactionsFilePath)); + } + } + + public List Transactions { + get { + return _transactions; + } + } + + public void SaveTransactions(string basePath) { + FileHelper.WriteTextToFile(basePath + Constants.PTMagicPathData + Path.DirectorySeparatorChar, "Transactions.json", JsonConvert.SerializeObject(this.Transactions)); + } + } +} diff --git a/Core/Helper/CertificateHelper.cs b/Core/Helper/CertificateHelper.cs new file mode 100644 index 0000000..636b78c --- /dev/null +++ b/Core/Helper/CertificateHelper.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.IO; +using System.Net; +using System.Net.Security; +using System.Security.Cryptography.X509Certificates; +using System.Net.Http; +using System.Text; +using System.Threading.Tasks; + +namespace Core.Helper { + public static class CertificateHelper { + + public static bool AllwaysGoodCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors policyErrors) { + return true; + } + } +} \ No newline at end of file diff --git a/Core/Helper/EncryptionHelper.cs b/Core/Helper/EncryptionHelper.cs new file mode 100644 index 0000000..99a8368 --- /dev/null +++ b/Core/Helper/EncryptionHelper.cs @@ -0,0 +1,303 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.IO; +using System.Text; +using System.Security.Cryptography; +using System.Collections.Specialized; +using System.Configuration; + +namespace Core.Helper { + public class EncryptionHelper { + + #region Properties + + public static string CryptoMainSaltValue { + get { + return "b3+Pz.~L2EK>((/xnTbWdTo:/5_$hq8ja8yOq% j}M6zTM"; + } + } + + #endregion + + #region Methoden + + #region Passwortverschlüsselung + public static string CreateHash(string password, string randomSalt) { + // Generate a random salt + byte[] salt = Encoding.UTF8.GetBytes(EncryptionHelper.CryptoMainSaltValue + randomSalt); + byte[] hash = PBKDF2(password, salt, 64000, 24); + + return Convert.ToBase64String(hash); + } + + public static bool SlowEquals(string aHash, string bHash) { + byte[] a = Encoding.UTF8.GetBytes(aHash); + byte[] b = Encoding.UTF8.GetBytes(bHash); + + uint diff = (uint)a.Length ^ (uint)b.Length; + for (int i = 0; i < a.Length && i < b.Length; i++) { + diff |= (uint)(a[i] ^ b[i]); + } + return diff == 0; + } + + private static byte[] PBKDF2(string password, byte[] salt, int iterations, int outputBytes) { + using (Rfc2898DeriveBytes pbkdf2 = new Rfc2898DeriveBytes(password, salt)) { + pbkdf2.IterationCount = iterations; + return pbkdf2.GetBytes(outputBytes); + } + } + + + #endregion + + #region Standardverschlüsselung + public static string Encrypt(string plainText) { + return Encrypt(plainText, EncryptionHelper.CryptoPassPhrase, EncryptionHelper.CryptoSaltValue, "SHA512", 2, EncryptionHelper.CryptoInitVector, 256); + } + + public static string Decrypt(string cipherText) { + return Decrypt(cipherText, EncryptionHelper.CryptoPassPhrase, EncryptionHelper.CryptoSaltValue, "SHA512", 2, EncryptionHelper.CryptoInitVector, 256, true); + } + + public static string Encrypt(string plainText, string passPhrase) { + return Encrypt(plainText, passPhrase, EncryptionHelper.CryptoSaltValue, "SHA512", 2, EncryptionHelper.CryptoInitVector, 256); + } + + public static string Decrypt(string cipherText, string passPhrase) { + return Decrypt(cipherText, passPhrase, EncryptionHelper.CryptoSaltValue, "SHA512", 2, EncryptionHelper.CryptoInitVector, 256, true); + } + + + /// + /// Encrypts specified plaintext using Rijndael symmetric key algorithm + /// and returns a base64-encoded result. + /// + /// + /// Plaintext value to be encrypted. + /// + /// + /// Passphrase from which a pseudo-random password will be derived. The + /// derived password will be used to generate the encryption key. + /// Passphrase can be any string. In this example we assume that this + /// passphrase is an ASCII string. + /// + /// + /// Salt value used along with passphrase to generate password. Salt can + /// be any string. In this example we assume that salt is an ASCII string. + /// + /// + /// Hash algorithm used to generate password. Allowed values are: "MD5" and + /// "SHA1". SHA1 hashes are a bit slower, but more secure than MD5 hashes. + /// + /// + /// Number of iterations used to generate password. One or two iterations + /// should be enough. + /// + /// + /// Initialization vector (or IV). This value is required to encrypt the + /// first block of plaintext data. For RijndaelManaged class IV must be + /// exactly 16 ASCII characters long. + /// + /// + /// Size of encryption key in bits. Allowed values are: 128, 192, and 256. + /// Longer keys are more secure than shorter keys. + /// + /// + /// Encrypted value formatted as a base64-encoded string. + /// + public static string Encrypt(string plainText, + string passPhrase, + string saltValue, + string hashAlgorithm, + int passwordIterations, + string initVector, + int keySize) { + // Convert strings into byte arrays. + byte[] initVectorBytes = Encoding.UTF8.GetBytes(initVector); + byte[] saltValueBytes = Encoding.UTF8.GetBytes(saltValue); + + // Convert our plaintext into a byte array. + // Let us assume that plaintext contains UTF8-encoded characters. + byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText); + + // First, we must create a password, from which the key will be derived. + // This password will be generated from the specified passphrase and + // salt value. The password will be created using the specified hash + // algorithm. Password creation can be done in several iterations. + PasswordDeriveBytes password = new PasswordDeriveBytes(passPhrase, saltValueBytes, hashAlgorithm, passwordIterations); + + // Use the password to generate pseudo-random bytes for the encryption + // key. Specify the size of the key in bytes (instead of bits). + byte[] keyBytes = password.GetBytes(keySize / 8); + + // Create uninitialized Rijndael encryption object. + RijndaelManaged symmetricKey = new RijndaelManaged(); + + // It is reasonable to set encryption mode to Cipher Block Chaining + // (CBC). Use default options for other symmetric key parameters. + symmetricKey.Mode = CipherMode.CBC; + + // Generate encryptor from the existing key bytes and initialization + // vector. Key size will be defined based on the number of the key + // bytes. + ICryptoTransform encryptor = symmetricKey.CreateEncryptor(keyBytes, initVectorBytes); + + // Define memory stream which will be used to hold encrypted data. + MemoryStream memoryStream = new MemoryStream(); + + // Define cryptographic stream (always use Write mode for encryption). + CryptoStream cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write); + // Start encrypting. + cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length); + + // Finish encrypting. + cryptoStream.FlushFinalBlock(); + + // Convert our encrypted data from a memory stream into a byte array. + byte[] cipherTextBytes = memoryStream.ToArray(); + + // Close both streams. + memoryStream.Close(); + cryptoStream.Close(); + + // Convert encrypted data into a base64-encoded string. + string cipherText = Convert.ToBase64String(cipherTextBytes); + + // Return encrypted string. + return cipherText; + } + + /// + /// Decrypts specified ciphertext using Rijndael symmetric key algorithm. + /// + /// + /// Base64-formatted ciphertext value. + /// + /// + /// Passphrase from which a pseudo-random password will be derived. The + /// derived password will be used to generate the encryption key. + /// Passphrase can be any string. In this example we assume that this + /// passphrase is an ASCII string. + /// + /// + /// Salt value used along with passphrase to generate password. Salt can + /// be any string. In this example we assume that salt is an ASCII string. + /// + /// + /// Hash algorithm used to generate password. Allowed values are: "MD5" and + /// "SHA1". SHA1 hashes are a bit slower, but more secure than MD5 hashes. + /// + /// + /// Number of iterations used to generate password. One or two iterations + /// should be enough. + /// + /// + /// Initialization vector (or IV). This value is required to encrypt the + /// first block of plaintext data. For RijndaelManaged class IV must be + /// exactly 16 ASCII characters long. + /// + /// + /// Size of encryption key in bits. Allowed values are: 128, 192, and 256. + /// Longer keys are more secure than shorter keys. + /// + /// + /// Decrypted string value. + /// + /// + /// Most of the logic in this function is similar to the Encrypt + /// logic. In order for decryption to work, all parameters of this function + /// - except cipherText value - must match the corresponding parameters of + /// the Encrypt function which was called to generate the + /// ciphertext. + /// + public static string Decrypt(string cipherText, + string passPhrase, + string saltValue, + string hashAlgorithm, + int passwordIterations, + string initVector, + int keySize, + bool doDecrypt) { + if (doDecrypt) { + // Convert strings defining encryption key characteristics into byte + // arrays. + byte[] initVectorBytes = Encoding.UTF8.GetBytes(initVector); + byte[] saltValueBytes = Encoding.UTF8.GetBytes(saltValue); + + // Convert our ciphertext into a byte array. + byte[] cipherTextBytes = Convert.FromBase64String(cipherText); + + // First, we must create a password, from which the key will be + // derived. This password will be generated from the specified + // passphrase and salt value. The password will be created using + // the specified hash algorithm. Password creation can be done in + // several iterations. + PasswordDeriveBytes password = new PasswordDeriveBytes(passPhrase, saltValueBytes, hashAlgorithm, passwordIterations); + + // Use the password to generate pseudo-random bytes for the encryption + // key. Specify the size of the key in bytes (instead of bits). + byte[] keyBytes = password.GetBytes(keySize / 8); + + // Create uninitialized Rijndael encryption object. + RijndaelManaged symmetricKey = new RijndaelManaged(); + + // It is reasonable to set encryption mode to Cipher Block Chaining + // (CBC). Use default options for other symmetric key parameters. + symmetricKey.Mode = CipherMode.CBC; + + // Generate decryptor from the existing key bytes and initialization + // vector. Key size will be defined based on the number of the key + // bytes. + ICryptoTransform decryptor = symmetricKey.CreateDecryptor(keyBytes, initVectorBytes); + + // Define memory stream which will be used to hold encrypted data. + MemoryStream memoryStream = new MemoryStream(cipherTextBytes); + + // Define cryptographic stream (always use Read mode for encryption). + CryptoStream cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read); + + // Since at this point we don't know what the size of decrypted data + // will be, allocate the buffer long enough to hold ciphertext; + // plaintext is never longer than ciphertext. + byte[] plainTextBytes = new byte[cipherTextBytes.Length]; + + // Start decrypting. + int decryptedByteCount = cryptoStream.Read(plainTextBytes, 0, plainTextBytes.Length); + + // Close both streams. + memoryStream.Close(); + cryptoStream.Close(); + + // Convert decrypted data into a string. + // Let us assume that the original plaintext string was UTF8-encoded. + string plainText = Encoding.UTF8.GetString(plainTextBytes, 0, decryptedByteCount); + + // Return decrypted string. + return plainText; + } else { + return ""; + } + } + #endregion + #endregion + + } +} diff --git a/Core/Helper/FileHelper.cs b/Core/Helper/FileHelper.cs new file mode 100644 index 0000000..b3abf53 --- /dev/null +++ b/Core/Helper/FileHelper.cs @@ -0,0 +1,76 @@ +using System; +using System.IO; +using Core.Main; + +namespace Core.Helper { + public static class FileHelper { + public static void WriteTextToFile(string folderPath, string fileName, string text) { + FileHelper.WriteTextToFile(folderPath, fileName, text, Constants.confMinDate, Constants.confMinDate); + } + + public static void WriteTextToFile(string folderPath, string fileName, string text, DateTime creationTime, DateTime lastWriteTime) { + if (!Directory.Exists(folderPath)) { + Directory.CreateDirectory(folderPath); + } + + File.WriteAllText(folderPath + fileName, text); + + if (creationTime != Constants.confMinDate) { + File.SetCreationTimeUtc(folderPath + fileName, creationTime); + } + + if (lastWriteTime != Constants.confMinDate) { + File.SetLastWriteTimeUtc(folderPath + fileName, lastWriteTime); + } + } + + public static void CreateBackup(string filePath, string backupFolder) { + FileHelper.CreateBackup(filePath, backupFolder, ""); + } + + public static void CreateBackup(string filePath, string backupFolder, string backupFileName) { + if (!Directory.Exists(backupFolder)) { + Directory.CreateDirectory(backupFolder); + } + + FileInfo file = new FileInfo(filePath); + + string backupFilePath = backupFolder + DateTime.Now.ToString("yyyy-MM-dd_HH.mm.ss") + "_" + file.Name; + if (!backupFileName.Equals("")) { + backupFilePath = backupFolder + backupFileName; + } + + File.Copy(file.FullName, backupFilePath, true); + } + + public static void CleanupFilesMinutes(string folderPath, int maxMinutes) { + if (!Directory.Exists(folderPath)) { + Directory.CreateDirectory(folderPath); + } + + DirectoryInfo folder = new DirectoryInfo(folderPath); + foreach (FileInfo file in folder.GetFiles()) { + DateTime maxAge = DateTime.Now.AddMinutes(-maxMinutes); + + if (file.LastWriteTime < maxAge) { + File.Delete(file.FullName); + } + } + } + + public static void CleanupFiles(string folderPath, int maxHours) { + if (!Directory.Exists(folderPath)) { + Directory.CreateDirectory(folderPath); + } + + DirectoryInfo folder = new DirectoryInfo(folderPath); + foreach (FileInfo file in folder.GetFiles()) { + DateTime maxAge = DateTime.Now.AddHours(-(maxHours + 1)); + + if (file.LastWriteTime < maxAge) { + File.Delete(file.FullName); + } + } + } + } +} diff --git a/Core/Helper/LogHelper.cs b/Core/Helper/LogHelper.cs new file mode 100644 index 0000000..6750ef9 --- /dev/null +++ b/Core/Helper/LogHelper.cs @@ -0,0 +1,34 @@ +using System; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using NLog.Extensions.Logging; + +namespace Core.Helper { + public class LogHelper { + private readonly ILogger log; + + public LogHelper(ILogger logger) { + log = logger; + } + + public void DoLogInfo(string message) { + if (log.IsEnabled(LogLevel.Information)) log.LogInformation(message); + } + + public void DoLogWarn(string message) { + if (log.IsEnabled(LogLevel.Warning)) log.LogWarning(message); + } + + public void DoLogError(string message) { + if (log.IsEnabled(LogLevel.Error)) log.LogError(message); + } + + public void DoLogCritical(string message, System.Exception ex) { + if (log.IsEnabled(LogLevel.Critical)) log.LogCritical(ex, message); + } + + public void DoLogDebug(string message) { + if (log.IsEnabled(LogLevel.Debug)) log.LogDebug(message); + } + } +} diff --git a/Core/Helper/ServiceHelper.cs b/Core/Helper/ServiceHelper.cs new file mode 100644 index 0000000..3050547 --- /dev/null +++ b/Core/Helper/ServiceHelper.cs @@ -0,0 +1,33 @@ +using System; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using NLog.Extensions.Logging; + +namespace Core.Helper { + public static class ServiceHelper { + + public static IServiceProvider BuildLoggerService() { + return ServiceHelper.BuildLoggerService(""); + } + + public static IServiceProvider BuildLoggerService(string basePath) { + ServiceCollection services = new ServiceCollection(); + + services.AddTransient(); + + services.AddSingleton(); + services.AddSingleton(typeof(ILogger<>), typeof(Logger<>)); + services.AddLogging((builder) => builder.SetMinimumLevel(LogLevel.Trace)); + + ServiceProvider serviceProvider = services.BuildServiceProvider(); + + ILoggerFactory loggerFactory = serviceProvider.GetRequiredService(); + + //configure NLog + loggerFactory.AddNLog(new NLogProviderOptions { CaptureMessageTemplates = true, CaptureMessageProperties = true }); + loggerFactory.ConfigureNLog(basePath + "nlog.config"); + + return serviceProvider; + } + } +} diff --git a/Core/Helper/SystemHelper.cs b/Core/Helper/SystemHelper.cs new file mode 100644 index 0000000..b3c968e --- /dev/null +++ b/Core/Helper/SystemHelper.cs @@ -0,0 +1,549 @@ +using System; +using System.Text.RegularExpressions; +using System.IO; +using System.Collections; +using System.Collections.Generic; +using System.Net; +using System.Net.Security; +using System.Security.Cryptography.X509Certificates; +using System.Linq; +using System.Text; +using System.Globalization; +using Core.Main; + +namespace Core.Helper { + + public class SystemHelper { + private static bool AllwaysGoodCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors policyErrors) { + return true; + } + + /// + /// Checks, if a string is numeric. + /// + /// The string to check. + /// True, if the string is numeric. + public static bool IsNumeric(string s) { + try { + Int32.Parse(s); + } catch { + return false; + } + return true; + } + + public static bool IsInteger(double d) { + return d % 1 == 0; + } + + public static bool IsBoolean(string s) { + try { + Boolean.Parse(s); + } catch { + return false; + } + return true; + } + + /// + /// Checks, if a string is a double value. + /// + /// The string to check. + /// True, if the string is a double value. + public static bool IsDouble(string s) { + try { + Double.Parse(s); + } catch { + return false; + } + return true; + } + + public static bool IsDouble(string s, string culture) { + try { + Double.Parse(s, new CultureInfo(culture)); + } catch { + return false; + } + return true; + } + + /// + /// Checks, if a string is a DateTime value. + /// + /// The string to check. + /// True, if the string is a DateTime value. + public static bool IsDateTime(string s) { + try { + DateTime.Parse(s); + } catch { + return false; + } + return true; + } + + /// + /// Konvertiert einen Text zu einem Integer-Wert mit Fehlerbehandlung. + /// + /// Zu konvertierender Text. + /// Der Vorgabewert für den Fall, dass keine gültige Zahl eingegeben wurde. + /// Den Text als Integer. Wenn die Konvertierung fehlschlägt, dann wird der Defaultwert zurückgegeben. + public static int TextToInteger(string text, int defaultValue) { + int result = defaultValue; + try { + string localText = text.Replace(".", ""); + result = Convert.ToInt32(localText.Trim()); + } catch { } + + return result; + } + + /// + /// Konvertiert einen Text zu einem Integer64-Wert mit Fehlerbehandlung. + /// + /// Zu konvertierender Text. + /// Der Vorgabewert für den Fall, dass keine gültige Zahl eingegeben wurde. + /// Den Text als Integer64. Wenn die Konvertierung fehlschlägt, dann wird der Defaultwert zurückgegeben. + public static Int64 TextToInteger64(string text, Int64 defaultValue) { + Int64 result = defaultValue; + try { + string localText = text.Replace(".", ""); + result = Convert.ToInt64(localText.Trim()); + } catch { } + + return result; + } + + public static double TextToDouble(string text, double defaultValue, string culture) { + double result = defaultValue; + try { + if (!string.IsNullOrEmpty(text)) { + double.TryParse(text, NumberStyles.Any, new System.Globalization.CultureInfo(culture), out result); + } + } catch { } + + return result; + } + + /// + /// Konvertiert einen Text zu einem DateTime-Wert mit Fehlerbehandlung. + /// + /// Zu konvertierender Text. + /// Der Vorgabewert für den Fall, dass keine gültige DateTime eingegeben wurde. + /// Den Text als DateTime. Wenn die Konvertierung fehlschlägt, dann wird der Defaultwert zurückgegeben. + public static DateTime TextToDateTime(string text, DateTime defaultValue) { + DateTime result = defaultValue; + try { + result = Convert.ToDateTime(text.Trim()); + } catch { } + + return result; + } + + public static DateTime TextToDateTime(string text, DateTime defaultValue, string culture) { + DateTime result = defaultValue; + try { + result = Convert.ToDateTime(text.Trim(), new System.Globalization.CultureInfo(culture)); + } catch { } + + return result; + } + + /// + /// Konvertiert einen Text zu einem Boolean-Wert mit Fehlerbehandlung. + /// + /// Zu konvertierender Text. + /// Der Vorgabewert für den Fall, dass keine gültige Boolean eingegeben wurde. + /// Den Text als Boolean. Wenn die Konvertierung fehlschlägt, dann wird der Defaultwert zurückgegeben. + public static bool TextToBoolean(string text, bool defaultValue) { + bool result = defaultValue; + try { + result = Convert.ToBoolean(text.Trim()); + } catch { + try { + int intValue = Convert.ToInt32(text.Trim()); + result = intValue == 0 ? false : true; + } catch { } + } + + return result; + } + + public static string SplitCamelCase(string s) { + string result = ""; + + string whiteList = "ABCDEFGHIJKLMNOPQRSTUVWXYZÄÜÖßabcdefghijklmnopqrstuvwxyzäüö0123456789_- "; + + if (!string.IsNullOrEmpty(s)) { + for (int i = 0; i < s.Length; i++) { + if (char.IsUpper(s[i]) || char.IsNumber(s[i])) { + if (i > 0 && whiteList.Contains(s[i - 1].ToString())) { + if (char.IsUpper(s[i])) { + if (!char.IsUpper(s[i - 1]) && !char.IsNumber(s[i - 1])) result += " "; + } else if (char.IsNumber(s[i])) { + if (!char.IsNumber(s[i - 1])) result += " "; + } + } + } + result += s[i].ToString(); + } + } + + return result; + } + + /// + /// Clears a string using a whitelist. + /// + /// Text to clear. + /// Allowed characters. + /// The cleared text. + public static string StripBadCode(string text, string allowedCharacters) { + StringBuilder sb = new StringBuilder(); + if (text != null) { + for (int i = 0; i < text.Length; i++) { + if (allowedCharacters.Contains(text[i].ToString())) sb.Append(text[i]); + } + } + + return sb.ToString(); + } + + public static bool CheckForBadCode(string text, string allowedCharacters) { + bool result = false; + for (int i = 0; i < text.Length; i++) { + if (!allowedCharacters.Contains(text[i].ToString())) { + result = true; + break; + } + } + + return result; + } + + /// + /// Schneidet einen Text nach x Zeichen ab + /// + /// Der Text, der gekürzt werden soll. + /// Die maximale Länge, auf die der Text gekürzt werden soll. + /// Der gekürzte Text. + public static string CutText(string text, int maxLength, bool addDots) { + string result = text; + + if (result.Length > maxLength) { + result = result.Substring(0, maxLength); + + if (addDots) result += "..."; + } + + return result; + } + + /// + /// Ermittelt den Teilstring eines Zeitstring, der die Stunden darstellt. + /// + public static string GetHourFromString(string timeString) { + string result = ""; + + if (timeString.Contains(":")) { + string[] arrTime = timeString.Split(":".ToCharArray()); + result = arrTime[0]; + } + + return result; + } + + /// + /// Ermittelt den Teilstring eines Zeitstring, der die Minuten darstellt. + /// + public static string GetMinutesFromString(string timeString) { + string result = ""; + + if (timeString.Contains(":")) { + string[] arrTime = timeString.Split(":".ToCharArray()); + result = arrTime[1]; + } + + return result; + } + + public static List ConvertTokenStringToList(string tokenizedString, string separator) { + List result = new List(); + + if (!String.IsNullOrEmpty(tokenizedString) && !String.IsNullOrEmpty(separator)) { + string[] arrTokens = tokenizedString.Split(separator.ToCharArray(), StringSplitOptions.RemoveEmptyEntries); + for (int i = 0; i < arrTokens.Length; i++) { + result.Add(arrTokens[i].Trim()); + } + } + + return result; + } + + public static List ConvertTokenStringToListInt(string tokenizedString, string separator) { + List result = new List(); + + if (!String.IsNullOrEmpty(tokenizedString) && !String.IsNullOrEmpty(separator)) { + string[] arrTokens = tokenizedString.Split(separator.ToCharArray(), StringSplitOptions.RemoveEmptyEntries); + for (int i = 0; i < arrTokens.Length; i++) { + result.Add(Convert.ToInt32(arrTokens[i])); + } + } + + return result; + } + + public static string ConvertListToTokenString(List tokenList, string separator, bool cropDoubleSeparators) { + string result = ""; + + if (tokenList.Count > 0) { + for (int i = 0; i < tokenList.Count; i++) { + result += tokenList[i].Trim() + separator; + } + + if (cropDoubleSeparators)result = result.Replace(separator + separator, ""); + } + + return result; + } + + public static string ConvertListToTokenString(List tokenList, string separator) { + string result = ""; + + if (tokenList.Count > 0) { + for (int i = 0; i < tokenList.Count; i++) { + result += tokenList[i].ToString() + separator; + } + + result += separator; + result = result.Replace(separator + separator, ""); + } + + return result; + } + + public static List ConvertToObjectList(List inputList) { + List result = new List(); + + foreach (T item in inputList) { + result.Add(item); + } + + return result; + } + + public static Hashtable ConvertTokenStringToHashtable(string tokenizedString, string pairSeparator, string fieldSeperator) { + Hashtable result = new Hashtable(); + + if (!String.IsNullOrEmpty(tokenizedString) && !String.IsNullOrEmpty(pairSeparator) && !String.IsNullOrEmpty(fieldSeperator)) { + string[] arrTokens = tokenizedString.Split(pairSeparator.ToCharArray(), StringSplitOptions.RemoveEmptyEntries); + for (int i = 0; i < arrTokens.Length; i++) { + string[] arrKeyValuePair = arrTokens[i].Split(fieldSeperator.ToCharArray()); + + result.Add(arrKeyValuePair[0], arrKeyValuePair[1]); + } + } + + return result; + } + + public static string ConvertHashtableToTokenString(Hashtable tokenHashtable, string pairSeparator, string fieldSeperator) { + string result = ""; + + if (tokenHashtable.Keys.Count > 0) { + foreach (string key in tokenHashtable.Keys) { + result += key + fieldSeperator + tokenHashtable[key] + pairSeparator; + } + + result += pairSeparator; + result = result.Replace(pairSeparator + pairSeparator, ""); + } + + return result; + } + + public static string GetProperDurationTime(int durationSeconds, bool includeDays = true) { + string result = ""; + + int days = (int)Math.Floor((double)durationSeconds / (60.0 * 60.0 * 24.0)); + if (!includeDays) days = 0; + + int hours = (int)Math.Floor((double)durationSeconds / (60.0 * 60.0)) - days * 24; + int minutes = (int)Math.Floor((double)durationSeconds / 60.0) - (hours * 60) - (days * 24 * 60); + int seconds = durationSeconds - (minutes * 60) - (hours * 60 * 60) - (days * 24 * 60 * 60); + + if (days > 0) { + result += days.ToString() + "d"; + } + + if (hours > 0) { + if (days > 0) result += " "; + result += hours.ToString() + "h"; + } + + if (minutes > 0) { + if (hours > 0 || days > 0) result += " "; + result += minutes.ToString() + "m"; + } + + if (seconds > 0) { + if (minutes > 0 || hours > 0 || days > 0) result += " "; + result += seconds.ToString() + "s"; + } + + return result; + } + + public static void AddValueToStringBuilder(StringBuilder sb, string value, int length, bool fillField, string delimiter) { + if (!string.IsNullOrEmpty(value)) { + if (value.Length > length) + sb.Append(value.Substring(0, length)); // Beschneiden + else { + if (fillField) + sb.Append(value.PadRight(length)); + else + sb.Append(value); + } + } else { + if (fillField) + sb.Append(string.Empty.PadRight(length)); + } + sb.Append(delimiter); + } + + public static bool UrlIsReachable(string url) { + ServicePointManager.Expect100Continue = true; + ServicePointManager.DefaultConnectionLimit = 9999; + ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; + ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(AllwaysGoodCertificate); + + HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest; + request.Timeout = 10000; + request.Method = "GET"; + + try { + using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) { + return response.StatusCode == HttpStatusCode.OK; + } + } catch (WebException) { + return false; + } + } + + public static string GetMarketLink(string platform, string exchange, string market, string mainMarket) { + string result = "#"; + if (platform.Equals("TradingView")) { + result = "https://www.tradingview.com/chart/?symbol=" + exchange.ToUpper() + ":"; + + string pairName = SystemHelper.StripBadCode(market, Constants.WhiteListMinimal); + + if (pairName.StartsWith(mainMarket)) { + pairName = pairName.Replace(mainMarket, "") + mainMarket; + } + + result += pairName; + } else { + switch (exchange) { + case "Bittrex": + result = "https://bittrex.com/Market/Index?MarketName=" + market; + break; + case "Binance": + result = "https://www.binance.com/trade.html?symbol=" + market; + break; + case "Poloniex": + result = "https://poloniex.com/exchange#" + market.ToLower(); + break; + } + } + + return result; + } + + public static string GetFullMarketName(string mainMarket, string market, string exchange) { + string result = market; + + switch (exchange) { + case "Bittrex": + result = mainMarket + "-" + market; + break; + case "Binance": + result = market + mainMarket; + break; + case "Poloniex": + result = mainMarket + "_" + market; + break; + } + + + return result; + } + + public static string GetTradingViewSymbol(string exchange, string market, string mainMarket) { + string result = exchange.ToUpper() + ":"; + + string pairName = SystemHelper.StripBadCode(market, Constants.WhiteListMinimal); + + if (pairName.StartsWith(mainMarket)) { + pairName = pairName.Replace(mainMarket, "") + mainMarket; + } + + result += pairName; + + + return result; + } + + public static string GetCurrencySymbol(string code) { + string result = code; + try { + System.Globalization.RegionInfo regionInfo = (from culture in System.Globalization.CultureInfo.GetCultures(System.Globalization.CultureTypes.AllCultures) + where culture.Name.Length > 0 && !culture.IsNeutralCulture + let region = new System.Globalization.RegionInfo(culture.LCID) + where String.Equals(region.ISOCurrencySymbol, code, StringComparison.InvariantCultureIgnoreCase) + select region).First(); + result = regionInfo.CurrencySymbol; + } catch { + + } + + return result; + } + + public static string PropertyToString(object property) { + string result = property.ToString(); + + if (!property.ToString().Equals("true", StringComparison.InvariantCultureIgnoreCase) && !property.ToString().Equals("false", StringComparison.InvariantCultureIgnoreCase)) { + try { + double resultDouble = Convert.ToDouble(property); + result = resultDouble.ToString(new System.Globalization.CultureInfo("en-US")); + } catch { + } + } else { + result = property.ToString().ToLower(); + } + + return result; + } + + public static bool IsRecentVersion(string currentVersion, string latestVersion) { + bool result = true; + + List currentVersionInfo = SystemHelper.ConvertTokenStringToListInt(currentVersion, "."); + List latestVersionInfo = SystemHelper.ConvertTokenStringToListInt(latestVersion, "."); + + if (currentVersionInfo[0] < latestVersionInfo[0]) { + result = false; + } + + if (currentVersionInfo[0] == latestVersionInfo[0] && currentVersionInfo[1] < latestVersionInfo[1]) { + result = false; + } + + if (currentVersionInfo[0] == latestVersionInfo[0] && currentVersionInfo[1] == latestVersionInfo[1] && currentVersionInfo[2] < latestVersionInfo[2]) { + result = false; + } + + return result; + } + } +} diff --git a/Core/Helper/TelegramHelper.cs b/Core/Helper/TelegramHelper.cs new file mode 100644 index 0000000..d2d5ed0 --- /dev/null +++ b/Core/Helper/TelegramHelper.cs @@ -0,0 +1,24 @@ +using System; +using System.IO; +using Telegram.Bot; +using Telegram.Bot.Types.Enums; +using Telegram.Bot.Types; + +namespace Core.Helper { + public static class TelegramHelper { + public static void SendMessage(string botToken, Int64 chatId, string message, bool useSilentMode, LogHelper log) { + if (!botToken.Equals("") && chatId != 0) { + try { + TelegramBotClient botClient = new TelegramBotClient(botToken); + System.Threading.Tasks.Task sentMessage = botClient.SendTextMessageAsync(chatId, message, ParseMode.Markdown, false, useSilentMode); + + if (sentMessage.IsCompleted) { + log.DoLogDebug("Telegram message sent to ChatId " + chatId.ToString() + " on Bot Token '" + botToken + "'"); + } + } catch (Exception ex) { + log.DoLogCritical("Exception sending telegram message to ChatId " + chatId.ToString() + " on Bot Token '" + botToken + "'", ex); + } + } + } + } +} diff --git a/Core/Helper/ZIPHelper.cs b/Core/Helper/ZIPHelper.cs new file mode 100644 index 0000000..47f4d8f --- /dev/null +++ b/Core/Helper/ZIPHelper.cs @@ -0,0 +1,84 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.IO; +using System.Text; +using ICSharpCode.SharpZipLib.Zip; + +namespace Core.Helper { + + public class ZIPHelper { + + public static bool CreateZipFile(ArrayList filePaths, string outputPath) { + bool result = true; + + ZipOutputStream pack = new ZipOutputStream(File.Create(outputPath)); + try { + + // set compression level + pack.SetLevel(5); + + foreach (string filePath in filePaths) { + FileStream fs = File.OpenRead(filePath); + + // allocate buffer + byte[] buffer = new byte[fs.Length]; + fs.Read(buffer, 0, buffer.Length); + + // write the zip entry and its data + ZipEntry entry = new ZipEntry(filePath.Substring(filePath.LastIndexOf(Path.DirectorySeparatorChar) + 1)); + pack.PutNextEntry(entry); + pack.Write(buffer, 0, buffer.Length); + } + + } catch { + result = false; + } finally { + pack.Finish(); + pack.Close(); + } + + return result; + } + + public static ArrayList ExtractFileFromZipFile(string filePath, string destinationPath, bool isInvoicePackage) { + ArrayList result = new ArrayList(); + + ZipFile zip = new ZipFile(File.OpenRead(filePath)); + try { + foreach (ZipEntry entry in zip) { + if (entry.IsFile) { + string fileName = entry.Name; + if (isInvoicePackage) { + fileName = fileName.Replace("unsigned", "signed"); + } + + result.Add(fileName); + + Stream inputStream = zip.GetInputStream(entry); + FileStream fileStream = new FileStream(destinationPath + fileName, FileMode.Create); + try { + CopyStream(inputStream, fileStream); + } finally { + fileStream.Close(); + inputStream.Close(); + } + } + } + } finally { + zip.Close(); + } + + return result; + } + + private static void CopyStream(Stream input, Stream output) { + byte[] buffer = new byte[0x1000]; + int read; + while ((read = input.Read(buffer, 0, buffer.Length)) > 0) { + output.Write(buffer, 0, read); + } + } + } +} diff --git a/Core/Main/Constants.cs b/Core/Main/Constants.cs new file mode 100644 index 0000000..b2eeebc --- /dev/null +++ b/Core/Main/Constants.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Core.Main { + public static class Constants { + // Minimales Datum (für NULL) + public static DateTime confMinDate = (DateTime)System.Data.SqlTypes.SqlDateTime.MinValue; + public static DateTime confMaxDate = (DateTime)System.Data.SqlTypes.SqlDateTime.MaxValue; + + public static readonly DateTime Epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); + + public const string WhiteListMinimal = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + public const string WhiteListNames = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_"; + public const string WhiteListProperties = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-.,_ "; + + public const string PTPathTrading = "trading"; + + public const string PTMagicPathData = "_data"; + public const string PTMagicPathPresets = "_presets"; + public const string PTMagicPathCoinMarketCap = "CoinMarketCap"; + public const string PTMagicPathExchange = "Exchange"; + public const string PTMagicPathLogs = "_logs"; + + public const int PTMagicBotState_Idle = 0; + public const int PTMagicBotState_Running = 1; + + public const double MaxTrendChange = 10000.0; + public const double MinTrendChange = -100.0; + + public const double Max24hVolume = Double.MaxValue; + + public const int ValueModeDefault = 0; + public const int ValueModeOffset = 1; + public const int ValueModeOffsetPercent = 2; + + public const string MarketTrendRelationRelative = "Relative"; + public const string MarketTrendRelationAbsolute = "Absolute"; + public const string MarketTrendRelationRelativeTrigger = "RelativeTrigger"; + + public static readonly string[] ChartLineColors = new string[] { "#e67e22", "#5d9cec", "#fb6d9d", "#ffffff", "#81c868", "#f05050", "#34d3eb", "#ffbd4a", "#dcdcdc", "#ef1442", "#d73d76", "#9b31c9", "#52e9f1", "#c9b56e", "#b49ec1", "#9885f3", "#85748a", "#85748a", "#85748a", "#b57a4b" }; + } +} diff --git a/Core/Main/PTMagic.cs b/Core/Main/PTMagic.cs new file mode 100644 index 0000000..f833113 --- /dev/null +++ b/Core/Main/PTMagic.cs @@ -0,0 +1,2077 @@ +using System; +using System.Collections.Generic; +using System.Threading; +using System.IO; +using System.Linq; +using System.Reflection; +using Core.Main; +using Core.Helper; +using Core.Main.DataObjects.PTMagicData; +using Core.MarketAnalyzer; +using Core.ProfitTrailer; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Newtonsoft.Json; + +namespace Core.Main { + public class PTMagic { + + public PTMagic(LogHelper log) { + this.Log = log; + } + + #region Properties + private LogHelper _log; + private PTMagicConfiguration _systemConfiguration; + private System.Timers.Timer _timer; + private Summary _lastRuntimeSummary = null; + private int _state = 0; + private int _runCount = 0; + private int _totalElapsedSeconds = 0; + private int _profitTrailerMajorVersion = 0; + private bool _globalSettingWritten = false; + private bool _singleMarketSettingWritten = false; + private bool _enforceSettingsReapply = false; + private DateTime _lastRuntime = Constants.confMinDate; + private DateTime _lastSettingsChange = Constants.confMinDate; + private DateTime _lastSettingFileCheck = Constants.confMinDate; + private DateTime _lastVersionCheck = Constants.confMinDate; + private DateTime _lastFiatCurrencyCheck = Constants.confMinDate; + private string _lastSetting = ""; + private string _activeSetting = ""; + private string _defaultSettingName = ""; + private string _pairsFileName = "PAIRS.PROPERTIES"; + private string _dcaFileName = "DCA.PROPERTIES"; + private string _indicatorsFileName = "INDICATORS.PROPERTIES"; + private Version _currentVersion = null; + private string _latestVersion = ""; + private string _lastMainFiatCurrency = "USD"; + private double _lastMainFiatCurrencyExchangeRate = 1; + private List _singleMarketSettingSummaries = new List(); + private List _pairsLines = null; + private List _dcaLines = null; + private List _indicatorsLines = null; + private List _exchangeMarketList = null; + private List _marketList = new List(); + private Dictionary _marketInfos = new Dictionary(); + private Dictionary _averageMarketTrendChanges = new Dictionary(); + private Dictionary> _singleMarketTrendChanges = new Dictionary>(); + private Dictionary> _globalMarketTrendChanges = new Dictionary>(); + private Dictionary _singleMarketSettingsCount = new Dictionary(); + Dictionary> _triggeredSingleMarketSettings = new Dictionary>(); + + public LogHelper Log { + get { + return _log; + } + set { + _log = value; + } + } + + public PTMagicConfiguration PTMagicConfiguration { + get { + return _systemConfiguration; + } + set { + _systemConfiguration = value; + } + } + + public System.Timers.Timer Timer { + get { + return _timer; + } + set { + _timer = value; + } + } + + public Summary LastRuntimeSummary { + get { + return _lastRuntimeSummary; + } + set { + _lastRuntimeSummary = value; + } + } + + public int State { + get { + return _state; + } + set { + _state = value; + } + } + + public int RunCount { + get { + return _runCount; + } + set { + _runCount = value; + } + } + + public int TotalElapsedSeconds { + get { + return _totalElapsedSeconds; + } + set { + _totalElapsedSeconds = value; + } + } + + public int ProfitTrailerMajorVersion { + get { + return _profitTrailerMajorVersion; + } + set { + _profitTrailerMajorVersion = value; + } + } + + public bool GlobalSettingWritten { + get { + return _globalSettingWritten; + } + set { + _globalSettingWritten = value; + } + } + + public bool SingleMarketSettingWritten { + get { + return _singleMarketSettingWritten; + } + set { + _singleMarketSettingWritten = value; + } + } + + public bool EnforceSettingsReapply { + get { + return _enforceSettingsReapply; + } + set { + _enforceSettingsReapply = value; + } + } + + public DateTime LastSettingsChange { + get { + return _lastSettingsChange; + } + set { + _lastSettingsChange = value; + } + } + + public DateTime LastVersionCheck { + get { + return _lastVersionCheck; + } + set { + _lastVersionCheck = value; + } + } + + public DateTime LastFiatCurrencyCheck { + get { + return _lastFiatCurrencyCheck; + } + set { + _lastFiatCurrencyCheck = value; + } + } + + public DateTime LastSettingFileCheck { + get { + return _lastSettingFileCheck; + } + set { + _lastSettingFileCheck = value; + } + } + + public DateTime LastRuntime { + get { + return _lastRuntime; + } + set { + _lastRuntime = value; + } + } + + public string DefaultSettingName { + get { + return _defaultSettingName; + } + set { + _defaultSettingName = value; + } + } + + public string LastSetting { + get { + return _lastSetting; + } + set { + _lastSetting = value; + } + } + + public string ActiveSetting { + get { + return _activeSetting; + } + set { + _activeSetting = value; + } + } + + public string PairsFileName { + get { + return _pairsFileName; + } + set { + _pairsFileName = value; + } + } + + public string DCAFileName { + get { + return _dcaFileName; + } + set { + _dcaFileName = value; + } + } + + public string IndicatorsFileName { + get { + return _indicatorsFileName; + } + set { + _indicatorsFileName = value; + } + } + + public Version CurrentVersion { + get { + return _currentVersion; + } + set { + _currentVersion = value; + } + } + + public string LatestVersion { + get { + return _latestVersion; + } + set { + _latestVersion = value; + } + } + + public string LastMainFiatCurrency { + get { + return _lastMainFiatCurrency; + } + set { + _lastMainFiatCurrency = value; + } + } + + public double LastMainFiatCurrencyExchangeRate { + get { + return _lastMainFiatCurrencyExchangeRate; + } + set { + _lastMainFiatCurrencyExchangeRate = value; + } + } + + public List SingleMarketSettingSummaries { + get { + return _singleMarketSettingSummaries; + } + set { + _singleMarketSettingSummaries = value; + } + } + + public List PairsLines { + get { + return _pairsLines; + } + set { + _pairsLines = value; + } + } + + public List DCALines { + get { + return _dcaLines; + } + set { + _dcaLines = value; + } + } + + public List IndicatorsLines { + get { + return _indicatorsLines; + } + set { + _indicatorsLines = value; + } + } + + public List ExchangeMarketList { + get { + return _exchangeMarketList; + } + set { + _exchangeMarketList = value; + } + } + + public List MarketList { + get { + return _marketList; + } + set { + _marketList = value; + } + } + + public Dictionary MarketInfos { + get { + return _marketInfos; + } + set { + _marketInfos = value; + } + } + + public Dictionary> SingleMarketTrendChanges { + get { + return _singleMarketTrendChanges; + } + set { + _singleMarketTrendChanges = value; + } + } + + public Dictionary> GlobalMarketTrendChanges { + get { + return _globalMarketTrendChanges; + } + set { + _globalMarketTrendChanges = value; + } + } + + public Dictionary AverageMarketTrendChanges { + get { + return _averageMarketTrendChanges; + } + set { + _averageMarketTrendChanges = value; + } + } + + public Dictionary SingleMarketSettingsCount { + get { + return _singleMarketSettingsCount; + } + set { + _singleMarketSettingsCount = value; + } + } + + public Dictionary> TriggeredSingleMarketSettings { + get { + return _triggeredSingleMarketSettings; + } + set { + _triggeredSingleMarketSettings = value; + } + } + #endregion + + #region PTMagic Startup Methods + public bool StartProcess() { + bool result = true; + + this.Log.DoLogInfo(""); + this.Log.DoLogInfo(" ██████╗ ████████╗ ███╗ ███╗ █████╗ ██████╗ ██╗ ██████╗"); + this.Log.DoLogInfo(" ██╔══██╗╚══██╔══╝ ████╗ ████║██╔══██╗██╔════╝ ██║██╔════╝"); + this.Log.DoLogInfo(" ██████╔╝ ██║ ██╔████╔██║███████║██║ ███╗██║██║ "); + this.Log.DoLogInfo(" ██╔═══╝ ██║ ██║╚██╔╝██║██╔══██║██║ ██║██║██║ "); + this.Log.DoLogInfo(" ██║ ██║ ██║ ╚═╝ ██║██║ ██║╚██████╔╝██║╚██████╗"); + this.Log.DoLogInfo(" ╚═╝ ╚═╝ ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═════╝"); + this.Log.DoLogInfo(" Version " + this.CurrentVersion.Major + "." + this.CurrentVersion.Minor + "." + this.CurrentVersion.Build); + this.Log.DoLogInfo(""); + this.Log.DoLogInfo("Starting PTMagic in " + Directory.GetCurrentDirectory()); + + if (!this.RunStartupChecks()) { + return false; + } + if (!this.InitializeConfiguration()) { + return false; + } + if (!this.RunConfigurationChecks()) { + return false; + } + + this.LastSettingFileCheck = DateTime.Now; + + SettingsFiles.CheckPresets(this.PTMagicConfiguration, this.Log, true); + + this.StartPTMagicIntervalTimer(); + + return result; + } + + public bool RunStartupChecks() { + bool result = true; + + // Startup checks + if (!File.Exists(Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar + "settings.general.json")) { + this.Log.DoLogError("File 'settings.general.json' not found! Please review the setup steps on the wiki and double check every step that involves copying files!"); + result = false; + } + + if (!File.Exists(Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar + "settings.analyzer.json")) { + this.Log.DoLogError("File 'settings.analyzer.json' not found! Please review the setup steps on the wiki and double check every step that involves copying files!"); + result = false; + } + + return result; + } + + public bool InitializeConfiguration() { + bool result = true; + + try { + this.PTMagicConfiguration = new PTMagicConfiguration(); + + this.Log.DoLogInfo("Configuration loaded. Found " + this.PTMagicConfiguration.AnalyzerSettings.MarketAnalyzer.MarketTrends.Count.ToString() + " Market Trends, " + this.PTMagicConfiguration.AnalyzerSettings.GlobalSettings.Count.ToString() + " Global Settings and " + this.PTMagicConfiguration.AnalyzerSettings.SingleMarketSettings.Count.ToString() + " Single Market Settings."); + + } catch (Exception ex) { + result = false; + this.Log.DoLogCritical("Error loading configuration!", ex); + throw (ex); + } + + return result; + } + + public bool RunConfigurationChecks() { + bool result = true; + + // Check for valid default setting + GlobalSetting defaultSetting = this.PTMagicConfiguration.AnalyzerSettings.GlobalSettings.Find(s => s.SettingName.Equals("default", StringComparison.InvariantCultureIgnoreCase)); + if (defaultSetting == null) { + defaultSetting = this.PTMagicConfiguration.AnalyzerSettings.GlobalSettings.Find(s => s.SettingName.IndexOf("default", StringComparison.InvariantCultureIgnoreCase) > -1); + if (defaultSetting != null) { + this.Log.DoLogDebug("No setting named 'default' found, taking '" + defaultSetting.SettingName + "' as default."); + this.DefaultSettingName = defaultSetting.SettingName; + } else { + this.Log.DoLogError("No 'default' setting found! Terminating process..."); + result = false; + } + } else { + this.DefaultSettingName = defaultSetting.SettingName; + } + + // Check if exchange is valid + if (!this.PTMagicConfiguration.GeneralSettings.Application.Exchange.Equals("Binance", StringComparison.InvariantCultureIgnoreCase) + && !this.PTMagicConfiguration.GeneralSettings.Application.Exchange.Equals("Bittrex", StringComparison.InvariantCultureIgnoreCase) + && !this.PTMagicConfiguration.GeneralSettings.Application.Exchange.Equals("Poloniex", StringComparison.InvariantCultureIgnoreCase)) { + this.Log.DoLogError("Exchange '" + this.PTMagicConfiguration.GeneralSettings.Application.Exchange + "' specified in settings.general.json is invalid! Terminating process..."); + result = false; + } + + // Check if the program is enabled + if (this.PTMagicConfiguration.GeneralSettings.Application.IsEnabled) { + if (this.PTMagicConfiguration.GeneralSettings.Application.TestMode) this.Log.DoLogInfo("TESTMODE ENABLED - No files will be changed!"); + + // Check for PT Directory + DirectoryInfo ptRoot = new DirectoryInfo(this.PTMagicConfiguration.GeneralSettings.Application.ProfitTrailerPath); + if (ptRoot.Exists) { + this.Log.DoLogInfo("Profit Trailer directory found"); + + // Run checks dependant on PT version + this.ProfitTrailerMajorVersion = this.PTMagicConfiguration.GeneralSettings.Application.ProfitTrailerMajorVersion; + if (this.PTMagicConfiguration.GeneralSettings.Application.ProfitTrailerMajorVersion < 2) { + result = RunProfitTrailerTradingFilesChecks(); + } else { + result = RunProfitTrailerSettingsAPIChecks(); + } + } else { + this.Log.DoLogError("Profit Trailer directory not found (" + this.PTMagicConfiguration.GeneralSettings.Application.ProfitTrailerPath + ")"); + result = false; + } + } else { + this.Log.DoLogWarn("PTMagic disabled, shutting down..."); + result = false; + } + + return result; + } + + private bool RunProfitTrailerTradingFilesChecks() { + bool result = true; + + this.Log.DoLogInfo("========== STARTING CHECKS FOR Profit Trailer 1.x =========="); + + // Check for settings directory "trading" + string ptTradingPath = this.PTMagicConfiguration.GeneralSettings.Application.ProfitTrailerPath + Constants.PTPathTrading + Path.DirectorySeparatorChar; + DirectoryInfo ptTrading = new DirectoryInfo(ptTradingPath); + if (ptTrading.Exists) { + this.Log.DoLogInfo("Profit Trailer 1.x check: Trading directory found"); + + #region File Checks + this.Log.DoLogInfo("Profit Trailer 1.x check: Checking for Pairs Properties file"); + if (File.Exists(this.PTMagicConfiguration.GeneralSettings.Application.ProfitTrailerPath + Constants.PTPathTrading + Path.DirectorySeparatorChar + this.PairsFileName)) { + this.Log.DoLogInfo("Profit Trailer 1.x check: PAIRS.PROPERTIES found!"); + } else { + this.PairsFileName = "PAIRS.properties"; + if (File.Exists(this.PTMagicConfiguration.GeneralSettings.Application.ProfitTrailerPath + Constants.PTPathTrading + Path.DirectorySeparatorChar + this.PairsFileName)) { + this.Log.DoLogInfo("Profit Trailer 1.x check: PAIRS.properties found!"); + } else { + this.Log.DoLogError("Profit Trailer 1.x check: No 'PAIRS.properties' found in " + this.PTMagicConfiguration.GeneralSettings.Application.ProfitTrailerPath + Constants.PTPathTrading + Path.DirectorySeparatorChar); + result = false; + } + } + + this.Log.DoLogInfo("Profit Trailer 1.x check: Checking for DCA Properties file"); + if (File.Exists(this.PTMagicConfiguration.GeneralSettings.Application.ProfitTrailerPath + Constants.PTPathTrading + Path.DirectorySeparatorChar + this.DCAFileName)) { + this.Log.DoLogInfo("Profit Trailer 1.x check: DCA.PROPERTIES found!"); + } else { + this.DCAFileName = "DCA.properties"; + if (File.Exists(this.PTMagicConfiguration.GeneralSettings.Application.ProfitTrailerPath + Constants.PTPathTrading + Path.DirectorySeparatorChar + this.DCAFileName)) { + this.Log.DoLogInfo("Profit Trailer 1.x check: DCA.properties found!"); + } else { + this.Log.DoLogError("Profit Trailer 1.x check: No 'DCA.properties' found in " + this.PTMagicConfiguration.GeneralSettings.Application.ProfitTrailerPath + Constants.PTPathTrading + Path.DirectorySeparatorChar); + result = false; + } + } + + this.Log.DoLogInfo("Profit Trailer 1.x check: Checking for Indicators Properties file"); + if (File.Exists(this.PTMagicConfiguration.GeneralSettings.Application.ProfitTrailerPath + Constants.PTPathTrading + Path.DirectorySeparatorChar + this.IndicatorsFileName)) { + this.Log.DoLogInfo("Profit Trailer 1.x check: INDICATORS.PROPERTIES found!"); + } else { + this.IndicatorsFileName = "INDICATORS.properties"; + if (File.Exists(this.PTMagicConfiguration.GeneralSettings.Application.ProfitTrailerPath + Constants.PTPathTrading + Path.DirectorySeparatorChar + this.IndicatorsFileName)) { + this.Log.DoLogInfo("Profit Trailer 1.x check: INDICATORS.properties found!"); + } else { + this.Log.DoLogError("Profit Trailer 1.x check: No 'INDICATORS.properties' found in " + this.PTMagicConfiguration.GeneralSettings.Application.ProfitTrailerPath + Constants.PTPathTrading + Path.DirectorySeparatorChar); + result = false; + } + } + #endregion + } else { + this.Log.DoLogError("Profit Trailer 1.x check: Trading settings directory not found (" + ptTradingPath + ")"); + result = false; + } + this.Log.DoLogInfo("========== CHECKS FOR Profit Trailer 1.x COMPLETED! =========="); + + return result; + } + + private bool RunProfitTrailerSettingsAPIChecks() { + bool result = true; + + this.Log.DoLogInfo("========== STARTING CHECKS FOR Profit Trailer 2.x =========="); + + // Check for PT license key + if (!this.PTMagicConfiguration.GeneralSettings.Application.ProfitTrailerLicense.Equals("")) { + this.Log.DoLogInfo("Profit Trailer 2.x check: Profit Trailer license found"); + } else { + this.Log.DoLogError("Profit Trailer 2.x check: No Profit Trailer license key specified! The license key is necessary to adjust your Profit Trailer settings since 2.0"); + result = false; + } + + // Check for PT default setting key + if (!this.PTMagicConfiguration.GeneralSettings.Application.ProfitTrailerDefaultSettingName.Equals("")) { + this.Log.DoLogInfo("Profit Trailer 2.x check: Profit Trailer default setting name specified"); + } else { + this.Log.DoLogError("Profit Trailer 2.x check: No Profit Trailer default setting name specified! The default setting name is necessary to adjust your Profit Trailer settings since 2.0"); + result = false; + } + + // Check for PT monitor + if (!this.PTMagicConfiguration.GeneralSettings.Application.ProfitTrailerMonitorURL.Equals("")) { + this.Log.DoLogInfo("Profit Trailer 2.x check: Profit Trailer monitor URL found"); + } else { + this.Log.DoLogError("Profit Trailer 2.x check: No Profit Trailer monitor URL specified! The monitor URL is necessary to adjust your Profit Trailer settings since 2.0"); + result = false; + } + + // Check if PT monitor is reachable + if (SystemHelper.UrlIsReachable(this.PTMagicConfiguration.GeneralSettings.Application.ProfitTrailerMonitorURL)) { + this.Log.DoLogInfo("Profit Trailer 2.x check: Profit Trailer monitor connection test succeeded"); + } else { + this.Log.DoLogError("Profit Trailer 2.x check: Your Profit Trailer monitor (" + this.PTMagicConfiguration.GeneralSettings.Application.ProfitTrailerMonitorURL + ") is not available! Make sure your Profit Trailer bot is up and running and your monitor is accessible."); + result = false; + } + this.Log.DoLogInfo("========== CHECKS FOR Profit Trailer 2.x COMPLETED! =========="); + + return result; + } + + public void StartPTMagicIntervalTimer() { + this.Timer = new System.Timers.Timer(this.PTMagicConfiguration.AnalyzerSettings.MarketAnalyzer.IntervalMinutes * 60 * 1000); + this.Timer.Enabled = true; + this.Timer.Elapsed += new System.Timers.ElapsedEventHandler(this.PTMagicIntervalTimer_Elapsed); + + this.Log.DoLogInfo("Checking market trends every " + this.PTMagicConfiguration.AnalyzerSettings.MarketAnalyzer.IntervalMinutes.ToString() + " minutes..."); + + // Fire the first start immediately + this.PTMagicIntervalTimer_Elapsed(null, null); + } + #endregion + + #region PTMagic Interval Methods + public void PTMagicIntervalTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { + // Check if the bot is idle + if (this.State == Constants.PTMagicBotState_Idle) { + this.RunCount++; + + bool headerLinesAdded = false; + this.EnforceSettingsReapply = this.HaveSettingsChanged(); + + if (PTMagicConfiguration.GeneralSettings.Application.IsEnabled) { + + // Validate settings + this.ValidateSettings(); + + // Start the process + this.Log.DoLogInfo(""); + this.Log.DoLogInfo("##########################################################"); + this.Log.DoLogInfo("#********************************************************#"); + this.Log.DoLogInfo("Starting market trend check with Version " + this.CurrentVersion.Major + "." + this.CurrentVersion.Minor + "." + this.CurrentVersion.Build); + + // Change state to "Running" + this.State = Constants.PTMagicBotState_Running; + + this.LastRuntime = DateTime.Now; + + this.LastRuntimeSummary = new Summary(); + this.LastRuntimeSummary.LastRuntime = this.LastRuntime; + this.LastRuntimeSummary.Version = this.CurrentVersion.Major.ToString() + "." + this.CurrentVersion.Minor.ToString() + "." + this.CurrentVersion.Build.ToString(); + + // Check for latest GitHub version + this.CheckLatestGitHubVersion(this.LastRuntimeSummary.Version); + + // Get latest main fiat currency exchange rate + this.GetMainFiatCurrencyDetails(); + + // Get current PT properties + string pairsPropertiesPath = this.PTMagicConfiguration.GeneralSettings.Application.ProfitTrailerPath + Constants.PTPathTrading + Path.DirectorySeparatorChar + this.PairsFileName; + string dcaPropertiesPath = this.PTMagicConfiguration.GeneralSettings.Application.ProfitTrailerPath + Constants.PTPathTrading + Path.DirectorySeparatorChar + this.DCAFileName; + string indicatorsPropertiesPath = this.PTMagicConfiguration.GeneralSettings.Application.ProfitTrailerPath + Constants.PTPathTrading + Path.DirectorySeparatorChar + this.IndicatorsFileName; + + this.LoadCurrentProfitTrailerProperties(pairsPropertiesPath, dcaPropertiesPath, indicatorsPropertiesPath); + + // Loading SMS Summaries + this.LoadSMSSummaries(); + + // Get saved market info + this.MarketInfos = BaseAnalyzer.GetMarketInfosFromFile(this.PTMagicConfiguration, this.Log); + + // Build exchange market data + this.BuildMarketData(); + + // Get markets from PT properties + this.BuildMarketList(); + this.ValidateMarketList(); + + // Build global market trends configured in settings + this.BuildGlobalMarketTrends(); + + // Check for global settings triggers + GlobalSetting triggeredSetting = this.PTMagicConfiguration.AnalyzerSettings.GlobalSettings.Find(s => s.SettingName.Equals(this.DefaultSettingName, StringComparison.InvariantCultureIgnoreCase)); + List matchedTriggers = new List(); + this.CheckGlobalSettingsTriggers(ref triggeredSetting, ref matchedTriggers); + + // Activate global setting + this.ActivateSetting(ref headerLinesAdded, ref triggeredSetting, ref matchedTriggers); + + // Check for single market trend triggers + this.ApplySingleMarketSettings(); + + // Save new properties to Profit Trailer + this.SaveProfitTrailerProperties(headerLinesAdded, pairsPropertiesPath, dcaPropertiesPath, indicatorsPropertiesPath); + + // Save Single Market Settings Summary + this.SaveSingleMarketSettingsSummary(); + + // Save Runtime Summary + this.SaveRuntimeSummary(headerLinesAdded); + + // Cleanup to free memory in between intervals + this.Cleanup(); + + // Change state to Finished / Stopped + this.State = Constants.PTMagicBotState_Idle; + } else { + this.State = Constants.PTMagicBotState_Idle; + Log.DoLogWarn("PTMagic disabled, shutting down until next raid..."); + } + } else { + if (this.RunCount > 1) { + Log.DoLogWarn("PTMagic already raiding since " + this.LastRuntime.ToString() + " - Process frozen? Checking things..."); + + if (File.Exists(Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar + Constants.PTMagicPathData + Path.DirectorySeparatorChar + "LastRuntimeSummary.json")) { + FileInfo fiLastSummary = new FileInfo(Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar + Constants.PTMagicPathData + Path.DirectorySeparatorChar + "LastRuntimeSummary.json"); + if (fiLastSummary.LastWriteTime < DateTime.Now.AddMinutes(-(this.PTMagicConfiguration.AnalyzerSettings.MarketAnalyzer.IntervalMinutes * 2))) { + Log.DoLogWarn("PTMagic seems to have frozen after raid " + this.RunCount.ToString() + ", but don't worry I will sacrifice some Magicbots to get this running again..."); + this.State = Constants.PTMagicBotState_Idle; + Log.DoLogInfo("PTMagic status resetted, waiting for the next raid to be good to go again."); + } + } else { + Log.DoLogWarn("No LastRuntimeSummary.json found after raid " + this.RunCount.ToString() + ", trying to reset PT Magic status..."); + this.State = Constants.PTMagicBotState_Idle; + Log.DoLogInfo("PTMagic status resetted, waiting for the next raid to be good to go again."); + } + } + } + } + + private bool HaveSettingsChanged() { + bool result = false; + + FileInfo generalSettingsFile = new FileInfo(Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar + "settings.general.json"); + FileInfo analyzerSettingsFile = new FileInfo(Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar + "settings.analyzer.json"); + if (generalSettingsFile.LastWriteTime > this.LastSettingFileCheck || analyzerSettingsFile.LastWriteTime > this.LastSettingFileCheck) { + Log.DoLogInfo("Detected configuration changes. Reloading settings..."); + + try { + PTMagicConfiguration = new PTMagicConfiguration(); + + GlobalSetting defaultSetting = this.PTMagicConfiguration.AnalyzerSettings.GlobalSettings.Find(s => s.SettingName.Equals("default", StringComparison.InvariantCultureIgnoreCase)); + if (defaultSetting == null) { + defaultSetting = this.PTMagicConfiguration.AnalyzerSettings.GlobalSettings.Find(s => s.SettingName.IndexOf("default", StringComparison.InvariantCultureIgnoreCase) > -1); + if (defaultSetting != null) { + Log.DoLogDebug("No setting named 'default' found, taking '" + defaultSetting.SettingName + "' as default."); + this.DefaultSettingName = defaultSetting.SettingName; + } else { + Log.DoLogError("No 'default' setting found! Terminating process..."); + this.Timer.Stop(); + Exception ex = new Exception("No 'default' setting found!Terminating process..."); + throw ex; + } + } else { + this.DefaultSettingName = defaultSetting.SettingName; + } + + Log.DoLogInfo("New configuration reloaded."); + this.LastSettingFileCheck = DateTime.Now; + result = true; + + if (this.Timer.Interval != this.PTMagicConfiguration.AnalyzerSettings.MarketAnalyzer.IntervalMinutes * 60 * 1000) { + Log.DoLogInfo("Setting for 'IntervalMinutes' changed in MarketAnalyzer, setting new timer..."); + this.Timer.Stop(); + this.Timer.Interval = this.PTMagicConfiguration.AnalyzerSettings.MarketAnalyzer.IntervalMinutes * 60 * 1000; + this.Timer.Start(); + Log.DoLogInfo("New timer set to " + this.PTMagicConfiguration.AnalyzerSettings.MarketAnalyzer.IntervalMinutes.ToString() + " minutes."); + } + + SettingsFiles.CheckPresets(this.PTMagicConfiguration, this.Log, true); + } catch (Exception ex) { + Log.DoLogCritical("Error loading new configuration!", ex); + } + } else { + result = SettingsFiles.CheckPresets(this.PTMagicConfiguration, this.Log, false); + } + + return result; + } + + private void ValidateSettings() { + // Check for a valid exchange + if (this.PTMagicConfiguration.GeneralSettings.Application.Exchange == null) { + Log.DoLogError("Your setting for Application.Exchange in settings.general.json is invalid (null)! Terminating process."); + this.Timer.Stop(); + Exception ex = new Exception("Your setting for Application.Exchange in settings.general.json is invalid (null)! Terminating process."); + throw ex; + } else { + if (this.PTMagicConfiguration.GeneralSettings.Application.Exchange.Equals("")) { + Log.DoLogError("Your setting for Application.Exchange in settings.general.json is invalid (empty)! Terminating process."); + this.Timer.Stop(); + Exception ex = new Exception("Your setting for Application.Exchange in settings.general.json is invalid (empty)! Terminating process."); + throw ex; + } else { + if (!this.PTMagicConfiguration.GeneralSettings.Application.Exchange.Equals("Binance", StringComparison.InvariantCultureIgnoreCase) && !this.PTMagicConfiguration.GeneralSettings.Application.Exchange.Equals("Bittrex", StringComparison.InvariantCultureIgnoreCase) && !this.PTMagicConfiguration.GeneralSettings.Application.Exchange.Equals("Poloniex", StringComparison.InvariantCultureIgnoreCase)) { + Log.DoLogError("Your setting for Application.Exchange in settings.general.json is invalid (" + this.PTMagicConfiguration.GeneralSettings.Application.Exchange + ")! Terminating process."); + this.Timer.Stop(); + Exception ex = new Exception("Your setting for Application.Exchange in settings.general.json is invalid (" + this.PTMagicConfiguration.GeneralSettings.Application.Exchange + ")! Terminating process."); + throw ex; + } + } + } + } + + private void CheckLatestGitHubVersion(string currentVersion) { + // Get latest version number + if (this.LastVersionCheck < DateTime.Now.AddMinutes(-30)) { + this.LatestVersion = BaseAnalyzer.GetLatestGitHubRelease(this.Log, currentVersion); + this.LastVersionCheck = DateTime.Now; + if (!SystemHelper.IsRecentVersion(currentVersion, this.LatestVersion)) { + this.Log.DoLogWarn("Your bot is out of date! The most recent version of PTMagic is " + this.LatestVersion); + } + } + } + + private void GetMainFiatCurrencyDetails() { + this.LastRuntimeSummary.MainFiatCurrency = this.LastMainFiatCurrency; + this.LastRuntimeSummary.MainFiatCurrencyExchangeRate = this.LastMainFiatCurrencyExchangeRate; + + if (this.LastFiatCurrencyCheck < DateTime.Now.AddHours(-12) && !this.PTMagicConfiguration.GeneralSettings.Application.MainFiatCurrency.Equals("USD", StringComparison.InvariantCultureIgnoreCase)) { + try { + this.LastRuntimeSummary.MainFiatCurrency = this.PTMagicConfiguration.GeneralSettings.Application.MainFiatCurrency; + this.LastRuntimeSummary.MainFiatCurrencyExchangeRate = BaseAnalyzer.GetMainFiatCurrencyRate(this.PTMagicConfiguration.GeneralSettings.Application.MainFiatCurrency, this.Log); + this.LastMainFiatCurrency = this.LastRuntimeSummary.MainFiatCurrency; + this.LastMainFiatCurrencyExchangeRate = this.LastRuntimeSummary.MainFiatCurrencyExchangeRate; + + this.LastFiatCurrencyCheck = DateTime.Now; + } catch (Exception ex) { + + // Fallback to USD in case something went wrong + this.Log.DoLogError("Fixer.io exchange rate check error: " + ex.Message); + this.LastRuntimeSummary.MainFiatCurrency = "USD"; + this.LastRuntimeSummary.MainFiatCurrencyExchangeRate = 1; + this.LastMainFiatCurrency = "USD"; + this.LastMainFiatCurrencyExchangeRate = 1; + } + } + } + + private void LoadCurrentProfitTrailerProperties(string pairsPropertiesPath, string dcaPropertiesPath, string indicatorsPropertiesPath) { + if (this.ProfitTrailerMajorVersion == 1) { + // Load current PT properties from files (Valid for PT 1.x) + this.Log.DoLogInfo("Loading current Profit Trailer properties from files..."); + + this.PairsLines = File.ReadLines(pairsPropertiesPath).ToList(); + this.DCALines = File.ReadLines(dcaPropertiesPath).ToList(); + this.IndicatorsLines = File.ReadLines(indicatorsPropertiesPath).ToList(); + } else { + // Load current PT properties from API (Valid for PT 2.x and above) + this.Log.DoLogInfo("Loading current Profit Trailer properties from API..."); + + this.PairsLines = SettingsAPI.GetPropertyLinesFromAPI("PAIRS", this.PTMagicConfiguration, this.Log); + this.DCALines = SettingsAPI.GetPropertyLinesFromAPI("DCA", this.PTMagicConfiguration, this.Log); + this.IndicatorsLines = SettingsAPI.GetPropertyLinesFromAPI("INDICATORS", this.PTMagicConfiguration, this.Log); + } + + if (this.PairsLines != null && this.DCALines != null && this.IndicatorsLines != null) { + this.Log.DoLogInfo("Properties loaded - P (" + this.PairsLines.Count.ToString() + " lines) - D (" + this.DCALines.Count.ToString() + " lines) - I (" + this.IndicatorsLines.Count.ToString() + " lines)."); + } else { + this.Log.DoLogError("Unable to load all Profit Trailer properties! Waiting for the next interval to retry..."); + Exception ex = new Exception("Unable to load all Profit Trailer properties! Waiting for the next interval to retry..."); + this.State = 0; + throw ex; + } + + // Get market from PT properties + this.LastRuntimeSummary.MainMarket = SettingsHandler.GetMainMarket(this.PTMagicConfiguration, this.PairsLines, this.Log); + + this.LastRuntimeSummary.ProfitTrailerMajorVersion = this.ProfitTrailerMajorVersion; + } + + private void LoadSMSSummaries() { + this.Log.DoLogInfo("Loading Single Market Setting Summaries..."); + this.SingleMarketSettingSummaries = new List(); + if (File.Exists(Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar + Constants.PTMagicPathData + Path.DirectorySeparatorChar + "SingleMarketSettingSummary.json")) { + try { + Dictionary smsVerificationResult = new Dictionary(); + // Cleanup SMS Summaries in case a SMS got removed + foreach (SingleMarketSettingSummary smsSummary in JsonConvert.DeserializeObject>(System.IO.File.ReadAllText(Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar + Constants.PTMagicPathData + Path.DirectorySeparatorChar + "SingleMarketSettingSummary.json"))) { + string smsName = smsSummary.SingleMarketSetting.SettingName; + bool smsIsValid = false; + if (smsVerificationResult.ContainsKey(smsName)) { + smsIsValid = smsVerificationResult[smsName]; + } else { + SingleMarketSetting sms = this.PTMagicConfiguration.AnalyzerSettings.SingleMarketSettings.Find(s => s.SettingName.Equals(smsName)); + if (sms != null) { + smsIsValid = true; + smsVerificationResult.Add(smsName, true); + } else { + smsVerificationResult.Add(smsName, false); + } + } + + if (smsIsValid) { + this.SingleMarketSettingSummaries.Add(smsSummary); + } + } + + this.Log.DoLogInfo("Single Market Setting Summaries loaded."); + } catch { } + } + } + + private void BuildMarketData() { + // Get most recent market data from CMC + string cmcMarketDataResult = CoinMarketCap.GetMarketData(this.PTMagicConfiguration, this.Log); + + if (this.PTMagicConfiguration.GeneralSettings.Application.Exchange.Equals("Bittrex", StringComparison.InvariantCultureIgnoreCase)) { + + // Get most recent market data from Bittrex + this.ExchangeMarketList = Bittrex.GetMarketData(this.LastRuntimeSummary.MainMarket, this.MarketInfos, this.PTMagicConfiguration, this.Log); + } else if (this.PTMagicConfiguration.GeneralSettings.Application.Exchange.Equals("Binance", StringComparison.InvariantCultureIgnoreCase)) { + + // Get most recent market data from Binance + this.ExchangeMarketList = Binance.GetMarketData(this.LastRuntimeSummary.MainMarket, this.MarketInfos, this.PTMagicConfiguration, this.Log); + } else if (this.PTMagicConfiguration.GeneralSettings.Application.Exchange.Equals("Poloniex", StringComparison.InvariantCultureIgnoreCase)) { + + // Get most recent market data from Poloniex + this.ExchangeMarketList = Poloniex.GetMarketData(this.LastRuntimeSummary.MainMarket, this.MarketInfos, this.PTMagicConfiguration, this.Log); + } + + // Check if problems occured during the Exchange contact + if (this.ExchangeMarketList == null) { + Exception ex = new Exception("Unable to contact " + this.PTMagicConfiguration.GeneralSettings.Application.Exchange + " for fresh market data. Trying again in " + this.PTMagicConfiguration.AnalyzerSettings.MarketAnalyzer.IntervalMinutes + " minute(s)."); + Log.DoLogError(ex.Message); + this.State = Constants.PTMagicBotState_Idle; + throw ex; + } + } + + private void BuildMarketList() { + string marketPairs = SettingsHandler.GetMarketPairs(this.PTMagicConfiguration, this.PairsLines, this.Log); + if (marketPairs.ToLower().Equals("all") || marketPairs.ToLower().Equals("false") || marketPairs.ToLower().Equals("true") || marketPairs.Equals("")) { + this.MarketList = this.ExchangeMarketList; + } else { + if (this.ProfitTrailerMajorVersion == 1) { + this.MarketList = SystemHelper.ConvertTokenStringToList(marketPairs, ","); + } else { + // Since PT 2.0 the main market is no longer included in the market list so we need to rebuild the list + List originalMarketList = SystemHelper.ConvertTokenStringToList(marketPairs, ","); + foreach (string market in originalMarketList) { + this.MarketList.Add(SystemHelper.GetFullMarketName(this.LastRuntimeSummary.MainMarket, market, this.PTMagicConfiguration.GeneralSettings.Application.Exchange)); + } + } + } + } + + private void ValidateMarketList() { + // Check if markets are valid for the selected main market + List validMarkets = this.MarketList.FindAll(m => m.IndexOf(this.LastRuntimeSummary.MainMarket, StringComparison.InvariantCultureIgnoreCase) > -1); + if (validMarkets.Count == 0) { + Exception ex = new Exception("No valid pairs found for main market '" + this.LastRuntimeSummary.MainMarket + "' in configured pars list (" + SystemHelper.ConvertListToTokenString(this.MarketList, ",", true) + ")! Terminating process..."); + Log.DoLogError(ex.Message); + this.State = Constants.PTMagicBotState_Idle; + this.Timer.Stop(); + throw ex; + } + } + + private void BuildGlobalMarketTrends() { + this.Log.DoLogInfo("Build global market trends..."); + this.SingleMarketTrendChanges = BaseAnalyzer.BuildMarketTrends("Exchange", this.LastRuntimeSummary.MainMarket, this.MarketList, "Volume", false, new Dictionary>(), this.PTMagicConfiguration, this.Log); + this.GlobalMarketTrendChanges = new Dictionary>(); + + // CoinMarketCap + this.GlobalMarketTrendChanges = BaseAnalyzer.BuildMarketTrends("CoinMarketCap", this.LastRuntimeSummary.MainMarket, new List(), "", true, this.GlobalMarketTrendChanges, this.PTMagicConfiguration, this.Log); + + // Bittrex + foreach (MarketTrend marketTrend in this.PTMagicConfiguration.AnalyzerSettings.MarketAnalyzer.MarketTrends.FindAll(mt => mt.Platform.Equals("Exchange", StringComparison.InvariantCultureIgnoreCase))) { + if (this.SingleMarketTrendChanges.ContainsKey(marketTrend.Name)) { + int maxMarkets = this.SingleMarketTrendChanges[marketTrend.Name].Count; + if (marketTrend.MaxMarkets > 0 && marketTrend.MaxMarkets <= this.SingleMarketTrendChanges[marketTrend.Name].Count) { + maxMarkets = marketTrend.MaxMarkets; + } + + this.GlobalMarketTrendChanges.Add(marketTrend.Name, this.SingleMarketTrendChanges[marketTrend.Name].Take(maxMarkets).ToList()); + } + } + + this.AverageMarketTrendChanges = BaseAnalyzer.BuildGlobalMarketTrends(this.GlobalMarketTrendChanges, this.PTMagicConfiguration, this.Log); + + this.Log.DoLogInfo("Global market trends built."); + } + + private void CheckGlobalSettingsTriggers(ref GlobalSetting triggeredSetting, ref List matchedTriggers) { + this.Log.DoLogInfo("Checking global settings triggers..."); + foreach (GlobalSetting globalSetting in this.PTMagicConfiguration.AnalyzerSettings.GlobalSettings) { + // Reset triggers for each setting + matchedTriggers = new List(); + + if (globalSetting.Triggers.Count > 0) { + this.Log.DoLogInfo("Checking triggers for '" + globalSetting.SettingName + "'..."); + List triggerResults = new List(); + foreach (Trigger trigger in globalSetting.Triggers) { + MarketTrend marketTrend = this.PTMagicConfiguration.AnalyzerSettings.MarketAnalyzer.MarketTrends.Find(mt => mt.Name == trigger.MarketTrendName); + if (marketTrend != null) { + + // Get market trend change for trigger + if (this.AverageMarketTrendChanges.ContainsKey(marketTrend.Name)) { + double averageMarketTrendChange = this.AverageMarketTrendChanges[marketTrend.Name]; + if (averageMarketTrendChange >= trigger.MinChange && averageMarketTrendChange < trigger.MaxChange) { + + // Trigger met! + this.Log.DoLogInfo("Trigger '" + trigger.MarketTrendName + "' triggered! TrendChange = " + averageMarketTrendChange.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")) + "%"); + + string triggerContent = trigger.MarketTrendName + " - "; + if (trigger.MinChange != Constants.MinTrendChange) { + triggerContent += " - Min: " + trigger.MinChange.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")) + "%"; + } + + if (trigger.MaxChange != Constants.MaxTrendChange) { + triggerContent += " - Max: " + trigger.MaxChange.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")) + "%"; + } + + matchedTriggers.Add(triggerContent); + + triggerResults.Add(true); + } else { + this.Log.DoLogDebug("Trigger '" + trigger.MarketTrendName + "' not triggered. TrendChange = " + averageMarketTrendChange.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")) + "%"); + triggerResults.Add(false); + } + } else { + this.Log.DoLogError("Trigger '" + trigger.MarketTrendName + "' not found in this.AverageMarketTrendChanges[] (" + SystemHelper.ConvertListToTokenString(this.AverageMarketTrendChanges.Keys.ToList(), ",", true) + "). Unable to load recent trends?"); + triggerResults.Add(false); + } + } else { + this.Log.DoLogWarn("Market Trend '" + trigger.MarketTrendName + "' not found! Trigger ignored!"); + triggerResults.Add(false); + } + } + + // Check if all triggers have to get triggered or just one + bool settingTriggered = false; + switch (globalSetting.TriggerConnection.ToLower()) { + case "and": + settingTriggered = triggerResults.FindAll(tr => tr == false).Count == 0; + break; + case "or": + settingTriggered = triggerResults.FindAll(tr => tr == true).Count > 0; + break; + } + + // Setting got triggered -> Activate it! + if (settingTriggered) { + triggeredSetting = globalSetting; + break; + } + } + } + } + + private void ActivateSetting(ref bool headerLinesAdded, ref GlobalSetting triggeredSetting, ref List matchedTriggers) { + string activeSettingName = SettingsHandler.GetActiveSetting(this.PTMagicConfiguration, this.DefaultSettingName, ref headerLinesAdded, this.PairsLines, this.DCALines, this.IndicatorsLines, this.Log); + if (activeSettingName.Equals("") && this.PTMagicConfiguration.GeneralSettings.Application.TestMode) { + activeSettingName = this.ActiveSetting; + } + + if (this.EnforceSettingsReapply) { + this.Log.DoLogInfo("Reapply '" + activeSettingName + "' as the settings.analyzer.json or a preset file got changed."); + } + + GlobalSetting activeSetting = this.PTMagicConfiguration.AnalyzerSettings.GlobalSettings.Find(s => s.SettingName.Equals(activeSettingName, StringComparison.InvariantCultureIgnoreCase)); + if (this.EnforceSettingsReapply || !activeSettingName.Equals(triggeredSetting.SettingName, StringComparison.InvariantCultureIgnoreCase)) { + this.Log.DoLogInfo("Setting '" + activeSettingName + "' currently active. Checking for flood protection..."); + + // If the setting we are about to activate is the default one, do not list matched triggers + if (triggeredSetting.SettingName.Equals(this.DefaultSettingName, StringComparison.InvariantCultureIgnoreCase)) { + matchedTriggers = new List(); + } + + // Check if flood protection is active + if (this.EnforceSettingsReapply || !this.LastSetting.Equals(triggeredSetting.SettingName, StringComparison.InvariantCultureIgnoreCase) || this.LastSettingsChange <= DateTime.UtcNow.AddMinutes(-PTMagicConfiguration.GeneralSettings.Application.FloodProtectionMinutes)) { + + // Setting not set => Change setting + this.Log.DoLogInfo("Switching global settings to '" + triggeredSetting.SettingName + "'..."); + SettingsHandler.CompileProperties(this.DefaultSettingName, triggeredSetting, this.PTMagicConfiguration, this.PairsLines, this.DCALines, this.IndicatorsLines, this.Log); + this.GlobalSettingWritten = true; + this.Log.DoLogInfo("Setting '" + triggeredSetting.SettingName + "' now active!"); + + this.LastRuntimeSummary.LastGlobalSettingSwitch = this.LastRuntimeSummary.LastRuntime; + this.LastRuntimeSummary.CurrentGlobalSetting = triggeredSetting; + + // Build Telegram message + string telegramMessage = this.PTMagicConfiguration.GeneralSettings.Application.InstanceName + ": Setting switched to '*" + SystemHelper.SplitCamelCase(triggeredSetting.SettingName) + "*'."; + + if (matchedTriggers.Count > 0) { + telegramMessage += "\n\n*Matching Triggers:*"; + foreach (string triggerResult in matchedTriggers) { + telegramMessage += "\n" + triggerResult; + } + } + + if (this.AverageMarketTrendChanges.Keys.Count > 0) { + telegramMessage += "\n\n*Market Trends:*"; + foreach (string key in this.AverageMarketTrendChanges.Keys) { + telegramMessage += "\n" + key + ": " + this.AverageMarketTrendChanges[key].ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")) + "%"; + } + } + + // Send Telegram message + if (this.PTMagicConfiguration.GeneralSettings.Telegram.IsEnabled) TelegramHelper.SendMessage(this.PTMagicConfiguration.GeneralSettings.Telegram.BotToken, this.PTMagicConfiguration.GeneralSettings.Telegram.ChatId, telegramMessage, this.PTMagicConfiguration.GeneralSettings.Telegram.SilentMode, this.Log); + + this.LastSetting = activeSettingName; + this.LastSettingsChange = DateTime.UtcNow; + + } else { + this.Log.DoLogInfo("Flood protection active until " + this.LastSettingsChange.AddMinutes(PTMagicConfiguration.GeneralSettings.Application.FloodProtectionMinutes).ToString() + " (UTC). Not switching settings to '" + triggeredSetting.SettingName + "'!"); + + this.LastRuntimeSummary.FloodProtectedSetting = triggeredSetting; + this.LastRuntimeSummary.CurrentGlobalSetting = activeSetting; + } + } else { + matchedTriggers = new List(); + + // Setting already set => Do nothing + this.Log.DoLogInfo("Setting '" + triggeredSetting.SettingName + "' already active. No action taken."); + + this.LastRuntimeSummary.CurrentGlobalSetting = triggeredSetting; + } + + this.ActiveSetting = this.LastRuntimeSummary.CurrentGlobalSetting.SettingName; + } + + private void ApplySingleMarketSettings() { + if (this.PTMagicConfiguration.AnalyzerSettings.SingleMarketSettings.Count > 0) { + this.Log.DoLogInfo("Checking single market settings triggers for " + this.MarketList.Count.ToString() + " markets..."); + + int marketPairProcess = 1; + Dictionary> matchedMarketTriggers = new Dictionary>(); + foreach (string marketPair in this.MarketList) { + this.Log.DoLogDebug("'" + marketPair + "' - Checking triggers (" + marketPairProcess.ToString() + "/" + this.MarketList.Count.ToString() + ")..."); + + bool stopTriggers = false; + foreach (SingleMarketSetting marketSetting in this.PTMagicConfiguration.AnalyzerSettings.SingleMarketSettings) { + List matchedSingleMarketTriggers = new List(); + + // Check ignore markets + List ignoredMarkets = SystemHelper.ConvertTokenStringToList(marketSetting.IgnoredMarkets, ","); + if (ignoredMarkets.Contains(marketPair)) { + this.Log.DoLogDebug("'" + marketPair + "' - Is ignored in '" + marketSetting.SettingName + "'."); + continue; + } + + // Check allowed markets + List allowedMarkets = SystemHelper.ConvertTokenStringToList(marketSetting.AllowedMarkets, ","); + if (allowedMarkets.Count > 0 && !allowedMarkets.Contains(marketPair)) { + this.Log.DoLogDebug("'" + marketPair + "' - Is not allowed in '" + marketSetting.SettingName + "'."); + continue; + } + + // Check ignore global settings + List ignoredGlobalSettings = SystemHelper.ConvertTokenStringToList(marketSetting.IgnoredGlobalSettings, ","); + if (ignoredGlobalSettings.Contains(this.ActiveSetting)) { + this.Log.DoLogDebug("'" + marketPair + "' - '" + this.ActiveSetting + "' - Is ignored in '" + marketSetting.SettingName + "'."); + continue; + } + + // Check allowed global settings + List allowedGlobalSettings = SystemHelper.ConvertTokenStringToList(marketSetting.AllowedGlobalSettings, ","); + if (allowedGlobalSettings.Count > 0 && !allowedGlobalSettings.Contains(this.ActiveSetting)) { + this.Log.DoLogDebug("'" + marketPair + "' - '" + this.ActiveSetting + "' - Is not allowed in '" + marketSetting.SettingName + "'."); + continue; + } + + #region Checking Off Triggers + SingleMarketSettingSummary smss = this.SingleMarketSettingSummaries.Find(s => s.Market.Equals(marketPair, StringComparison.InvariantCultureIgnoreCase) && s.SingleMarketSetting.SettingName.Equals(marketSetting.SettingName, StringComparison.InvariantCultureIgnoreCase)); + if (smss != null) { + if (marketSetting.OffTriggers != null) { + if (marketSetting.OffTriggers.Count > 0) { + + this.Log.DoLogDebug("'" + marketPair + "' - Checking off triggers '" + marketSetting.SettingName + "'..."); + + List offTriggerResults = new List(); + foreach (OffTrigger offTrigger in marketSetting.OffTriggers) { + if (offTrigger.HoursSinceTriggered > 0) { + #region Check for Activation time period trigger + int smsActiveHours = (int)Math.Floor(DateTime.UtcNow.Subtract(smss.ActivationDateTimeUTC).TotalHours); + if (smsActiveHours >= offTrigger.HoursSinceTriggered) { + + // Trigger met! + this.Log.DoLogDebug("'" + marketPair + "' - SMS already active for " + smsActiveHours.ToString() + " hours. Trigger matched!"); + + offTriggerResults.Add(true); + } else { + + // Trigger not met! + this.Log.DoLogDebug("'" + marketPair + "' - SMS only active for " + smsActiveHours.ToString() + " hours. Trigger not matched!"); + + offTriggerResults.Add(false); + } + #endregion + } else if (offTrigger.Min24hVolume > 0 || offTrigger.Max24hVolume < Constants.Max24hVolume) { + #region Check for 24h volume trigger + List marketTrendChanges = this.SingleMarketTrendChanges[this.SingleMarketTrendChanges.Keys.Last()]; + if (marketTrendChanges.Count > 0) { + MarketTrendChange mtc = marketTrendChanges.Find(m => m.Market.Equals(marketPair, StringComparison.InvariantCultureIgnoreCase)); + if (mtc != null) { + if (mtc.Volume24h >= offTrigger.Min24hVolume && mtc.Volume24h <= offTrigger.Max24hVolume) { + + // Trigger met! + this.Log.DoLogDebug("'" + marketPair + "' - 24h volume off trigger matched! 24h volume = " + mtc.Volume24h.ToString(new System.Globalization.CultureInfo("en-US")) + " " + this.LastRuntimeSummary.MainMarket); + + offTriggerResults.Add(true); + } else { + + // Trigger not met! + this.Log.DoLogDebug("'" + marketPair + "' - 24h volume off trigger not matched! 24h volume = " + mtc.Volume24h.ToString(new System.Globalization.CultureInfo("en-US")) + " " + this.LastRuntimeSummary.MainMarket); + + offTriggerResults.Add(false); + } + } + } + + #endregion + } else { + #region Check for market trend triggers + if (this.SingleMarketTrendChanges.ContainsKey(offTrigger.MarketTrendName)) { + + List marketTrendChanges = this.SingleMarketTrendChanges[offTrigger.MarketTrendName]; + if (marketTrendChanges.Count > 0) { + double averageMarketTrendChange = marketTrendChanges.Average(m => m.TrendChange); + + MarketTrendChange mtc = marketTrendChanges.Find(m => m.Market.Equals(marketPair, StringComparison.InvariantCultureIgnoreCase)); + if (mtc != null) { + // Get trend change according to configured relation + double trendChange = mtc.TrendChange; + + if (offTrigger.MarketTrendRelation.Equals(Constants.MarketTrendRelationRelative)) { + + // Build pair trend change relative to the global market trend + trendChange = trendChange - averageMarketTrendChange; + } else if (offTrigger.MarketTrendRelation.Equals(Constants.MarketTrendRelationRelativeTrigger)) { + + // Build pair trend change relative to the trigger price + double currentPrice = mtc.LastPrice; + double triggerPrice = smss.TriggerSnapshot.LastPrice; + double triggerTrend = (currentPrice - triggerPrice) / triggerPrice * 100; + trendChange = triggerTrend; + } + + // Get market trend change for trigger + if (trendChange >= offTrigger.MinChange && trendChange < offTrigger.MaxChange) { + + // Trigger met! + this.Log.DoLogDebug("'" + marketPair + "' - Off Trigger '" + offTrigger.MarketTrendName + "' triggered! TrendChange (" + offTrigger.MarketTrendRelation + ") = " + trendChange.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")) + "%"); + + offTriggerResults.Add(true); + } else { + this.Log.DoLogDebug("'" + marketPair + "' - Off Trigger '" + offTrigger.MarketTrendName + "' not triggered. TrendChange (" + offTrigger.MarketTrendRelation + ") = " + trendChange.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")) + "%"); + offTriggerResults.Add(false); + } + } else { + offTriggerResults.Add(false); + } + } else { + offTriggerResults.Add(false); + } + } + #endregion + } + } + + // Check if all off triggers have to get triggered or just one + bool settingOffTriggered = false; + switch (marketSetting.OffTriggerConnection.ToLower()) { + case "and": + settingOffTriggered = offTriggerResults.FindAll(tr => tr == false).Count == 0; + break; + case "or": + settingOffTriggered = offTriggerResults.FindAll(tr => tr == true).Count > 0; + break; + } + + // Setting got off triggered, remove it from the summary + if (settingOffTriggered) { + this.Log.DoLogDebug("'" + marketPair + "' - '" + marketSetting.SettingName + "' off triggered!"); + this.SingleMarketSettingSummaries.Remove(smss); + smss = null; + } else { + this.Log.DoLogDebug("'" + marketPair + "' - '" + marketSetting.SettingName + "' not off triggered!"); + } + } else { + this.Log.DoLogDebug("'" + marketPair + "' - '" + marketSetting.SettingName + "' has no off triggers -> triggering off!"); + this.SingleMarketSettingSummaries.Remove(smss); + smss = null; + } + } + } + #endregion + + if (marketSetting.Triggers.Count > 0 && !stopTriggers) { + #region Checking Triggers + this.Log.DoLogDebug("'" + marketPair + "' - Checking triggers for '" + marketSetting.SettingName + "'..."); + + List triggerResults = new List(); + Dictionary relevantTriggers = new Dictionary(); + int triggerIndex = 0; + foreach (Trigger trigger in marketSetting.Triggers) { + + if (trigger.Min24hVolume > 0 || trigger.Max24hVolume < Constants.Max24hVolume) { + #region Check for 24h volume trigger + List marketTrendChanges = this.SingleMarketTrendChanges[this.SingleMarketTrendChanges.Keys.Last()]; + if (marketTrendChanges.Count > 0) { + MarketTrendChange mtc = marketTrendChanges.Find(m => m.Market.Equals(marketPair, StringComparison.InvariantCultureIgnoreCase)); + if (mtc != null) { + + if (mtc.Volume24h >= trigger.Min24hVolume && mtc.Volume24h <= trigger.Max24hVolume) { + // Trigger met! + this.Log.DoLogDebug("'" + marketPair + "' - 24h volume trigger matched! 24h volume = " + mtc.Volume24h.ToString(new System.Globalization.CultureInfo("en-US")) + " " + this.LastRuntimeSummary.MainMarket); + + relevantTriggers.Add(triggerIndex, mtc.Volume24h); + + string triggerContent = "24h Volume"; + if (trigger.Min24hVolume > 0) { + triggerContent += " - Min: " + trigger.Min24hVolume.ToString(new System.Globalization.CultureInfo("en-US")) + " " + this.LastRuntimeSummary.MainMarket; + } + + if (trigger.Max24hVolume < Constants.Max24hVolume) { + triggerContent += " - Max: " + trigger.Max24hVolume.ToString(new System.Globalization.CultureInfo("en-US")) + " " + this.LastRuntimeSummary.MainMarket; + } + + matchedSingleMarketTriggers.Add(marketSetting.SettingName + ": " + triggerContent + " - 24h volume = " + mtc.Volume24h.ToString(new System.Globalization.CultureInfo("en-US")) + " " + this.LastRuntimeSummary.MainMarket); + + triggerResults.Add(true); + } else { + this.Log.DoLogDebug("'" + marketPair + "' - 24h volume trigger not matched. 24h volume = " + mtc.Volume24h.ToString(new System.Globalization.CultureInfo("en-US")) + " " + this.LastRuntimeSummary.MainMarket); + triggerResults.Add(false); + } + } + } + + #endregion + } else if (trigger.AgeDaysLowerThan > 0) { + #region Check for age trigger + MarketInfo marketInfo = null; + if (this.MarketInfos.ContainsKey(marketPair)) { + marketInfo = this.MarketInfos[marketPair]; + } + + if (marketInfo != null) { + int marketAge = (int)Math.Floor(DateTime.Now.ToUniversalTime().Subtract(marketInfo.FirstSeen).TotalDays); + if (marketAge < trigger.AgeDaysLowerThan) { + matchedSingleMarketTriggers.Add(marketSetting.SettingName + ": '" + marketPair + "' is only " + marketAge.ToString() + " days old on this exchange. Trigger matched!"); + this.Log.DoLogDebug("'" + marketPair + "' - Is only " + marketAge.ToString() + " days old on this exchange. Trigger matched!"); + + relevantTriggers.Add(triggerIndex, marketAge); + triggerResults.Add(true); + } else { + this.Log.DoLogDebug("'" + marketPair + "' - Age Trigger not triggered. Is already " + marketAge.ToString() + " days old on this exchange."); + triggerResults.Add(false); + } + } else { + matchedSingleMarketTriggers.Add("Age for '" + marketPair + "' not found, trigger matched just to be safe!"); + this.Log.DoLogDebug("'" + marketPair + "' - Age not found, trigger matched just to be safe!"); + triggerResults.Add(true); + } + + #endregion + } else { + #region Check for market trend triggers + if (this.SingleMarketTrendChanges.ContainsKey(trigger.MarketTrendName)) { + + List marketTrendChanges = this.SingleMarketTrendChanges[trigger.MarketTrendName]; + if (marketTrendChanges.Count > 0) { + double averageMarketTrendChange = marketTrendChanges.Average(m => m.TrendChange); + + MarketTrendChange mtc = marketTrendChanges.Find(m => m.Market.Equals(marketPair, StringComparison.InvariantCultureIgnoreCase)); + if (mtc != null) { + // Get trend change according to configured relation + double trendChange = mtc.TrendChange; + + if (trigger.MarketTrendRelation.Equals(Constants.MarketTrendRelationRelative)) { + // Build pair trend change relative to the global market trend + trendChange = trendChange - averageMarketTrendChange; + } + + // Get market trend change for trigger + if (trendChange >= trigger.MinChange && trendChange < trigger.MaxChange) { + + // Trigger met! + this.Log.DoLogDebug("'" + marketPair + "' - Trigger '" + trigger.MarketTrendName + "' triggered! TrendChange (" + trigger.MarketTrendRelation + ") = " + trendChange.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")) + "%"); + + relevantTriggers.Add(triggerIndex, trendChange); + + string triggerContent = trigger.MarketTrendName + " - "; + if (trigger.MinChange != Constants.MinTrendChange) { + triggerContent += " - Min: " + trigger.MinChange.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")) + "%"; + } + + if (trigger.MaxChange != Constants.MaxTrendChange) { + triggerContent += " - Max: " + trigger.MaxChange.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")) + "%"; + } + + matchedSingleMarketTriggers.Add(marketSetting.SettingName + ": " + triggerContent + " - TrendChange (" + trigger.MarketTrendRelation + ") = " + trendChange.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")) + "%"); + + triggerResults.Add(true); + } else { + this.Log.DoLogDebug("'" + marketPair + "' - Trigger '" + trigger.MarketTrendName + "' not triggered. TrendChange (" + trigger.MarketTrendRelation + ") = " + trendChange.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")) + "%"); + triggerResults.Add(false); + } + } else { + this.Log.DoLogDebug("'" + marketPair + "' - No market trend change found for '" + trigger.MarketTrendName + "'! Coin just got released? Trigger ignored!"); + triggerResults.Add(false); + } + } else { + this.Log.DoLogWarn("'" + marketPair + "' - No market trend changes found for '" + trigger.MarketTrendName + "'! Trigger ignored!"); + triggerResults.Add(false); + } + } else { + MarketTrend marketTrend = this.PTMagicConfiguration.AnalyzerSettings.MarketAnalyzer.MarketTrends.Find(mt => mt.Name.Equals(trigger.MarketTrendName, StringComparison.InvariantCultureIgnoreCase)); + if (marketTrend != null) { + if (!marketTrend.Platform.Equals("Exchange", StringComparison.InvariantCultureIgnoreCase)) { + this.Log.DoLogWarn("Market Trend '" + trigger.MarketTrendName + "' is invalid for single market settings! Only trends using the platform 'Exchange' are valid for single market settings."); + triggerResults.Add(false); + } + } else { + this.Log.DoLogWarn("Market Trend '" + trigger.MarketTrendName + "' not found! Trigger ignored!"); + triggerResults.Add(false); + } + } + #endregion + } + triggerIndex++; + } + + // Check if all triggers have to get triggered or just one + bool settingTriggered = false; + switch (marketSetting.TriggerConnection.ToLower()) { + case "and": + settingTriggered = triggerResults.FindAll(tr => tr == false).Count == 0; + break; + case "or": + settingTriggered = triggerResults.FindAll(tr => tr == true).Count > 0; + break; + } + #endregion + + bool isFreshTrigger = true; + + // Setting not triggered -> Check if it is already active as a long term SMS using Off Triggers + if (!settingTriggered) { + this.Log.DoLogDebug("'" + marketPair + "' - SMS '" + marketSetting.SettingName + "' not triggered, checking for long term activation."); + if (smss != null) { + if (marketSetting.OffTriggers != null) { + if (marketSetting.OffTriggers.Count > 0) { + this.Log.DoLogDebug("'" + marketPair + "' - SMS '" + marketSetting.SettingName + "' has off triggers, starting special trigger..."); + // Setting already active and using off triggers -> set as triggered + settingTriggered = true; + isFreshTrigger = false; + + matchedSingleMarketTriggers = new List(); + foreach (string matchedTriggerContent in smss.TriggerSnapshot.MatchedTriggersContent) { + if (matchedTriggerContent.StartsWith(marketSetting.SettingName + ":")) { + matchedSingleMarketTriggers.Add(matchedTriggerContent); + } + } + + int removalLength = matchedSingleMarketTriggers.Count - marketSetting.Triggers.Count; + if (removalLength > 0) { + matchedSingleMarketTriggers.RemoveRange(0, removalLength); + } + + this.Log.DoLogDebug("'" + marketPair + "' - Activating SMS '" + marketSetting.SettingName + "' as off triggers are not met."); + } + } + } + } + + // Setting got triggered -> Activate it! + if (settingTriggered) { + this.Log.DoLogDebug("'" + marketPair + "' - '" + marketSetting.SettingName + "' triggered!"); + + // Save matched triggers to get displayed in the comment lines + if (!matchedMarketTriggers.ContainsKey(marketPair)) { + matchedMarketTriggers.Add(marketPair, matchedSingleMarketTriggers); + } else { + matchedMarketTriggers[marketPair].AddRange(matchedSingleMarketTriggers); + } + + if (!this.TriggeredSingleMarketSettings.ContainsKey(marketPair)) { + List smsList = new List(); + smsList.Add(marketSetting); + this.TriggeredSingleMarketSettings.Add(marketPair, smsList); + } else { + this.TriggeredSingleMarketSettings[marketPair].Add(marketSetting); + } + + // Counting triggered setting + if (!this.SingleMarketSettingsCount.ContainsKey(marketSetting.SettingName)) { + this.SingleMarketSettingsCount.Add(marketSetting.SettingName, 1); + } else { + this.SingleMarketSettingsCount[marketSetting.SettingName]++; + } + + if (isFreshTrigger) { + this.Log.DoLogDebug("'" + marketPair + "' - SMS '" + marketSetting.SettingName + "' saving summary data..."); + + // Check if this setting is already active for this market + if (smss == null || marketSetting.RefreshOffTriggers) { + if (smss == null) { + smss = new SingleMarketSettingSummary(); + } else { + this.SingleMarketSettingSummaries.Remove(smss); + } + + smss.ActivationDateTimeUTC = DateTime.UtcNow; + smss.Market = marketPair; + smss.SingleMarketSetting = marketSetting; + smss.TriggerSnapshot = new TriggerSnapshot(); + smss.TriggerSnapshot.Last24hVolume = 0; + smss.TriggerSnapshot.LastPrice = 0; + smss.TriggerSnapshot.RelevantTriggers = relevantTriggers; + smss.TriggerSnapshot.MatchedTriggersContent = matchedSingleMarketTriggers; + + List marketTrendChanges = this.SingleMarketTrendChanges[this.SingleMarketTrendChanges.Keys.Last()]; + if (marketTrendChanges.Count > 0) { + MarketTrendChange mtc = marketTrendChanges.Find(m => m.Market.Equals(marketPair, StringComparison.InvariantCultureIgnoreCase)); + if (mtc != null) { + smss.TriggerSnapshot.Last24hVolume = mtc.Volume24h; + smss.TriggerSnapshot.LastPrice = mtc.LastPrice; + } + } + + this.SingleMarketSettingSummaries.Add(smss); + + this.Log.DoLogDebug("'" + marketPair + "' - SMS '" + marketSetting.SettingName + "' summary data saved."); + } else { + this.Log.DoLogDebug("'" + marketPair + "' - SMS '" + marketSetting.SettingName + "' already active for this market and no refresh allowed."); + } + } + + // Stop processing other settings if configured + if (marketSetting.StopProcessWhenTriggered) { + stopTriggers = true; + } + } else { + this.Log.DoLogDebug("'" + marketPair + "' - '" + marketSetting.SettingName + "' not triggered!"); + } + } + } + + if ((marketPairProcess % 10) == 0) { + this.Log.DoLogInfo("What are you looking at? " + marketPairProcess + "/" + this.MarketList.Count + " markets done..."); + } + + marketPairProcess++; + } + + if (this.TriggeredSingleMarketSettings.Count > 0) { + + // Write single market settings + this.Log.DoLogInfo("Building single market settings for '" + this.TriggeredSingleMarketSettings.Count.ToString() + "' markets..."); + + SettingsHandler.CompileSingleMarketProperties(this.ProfitTrailerMajorVersion, this.LastRuntimeSummary.MainMarket, this.TriggeredSingleMarketSettings, matchedMarketTriggers, this.PTMagicConfiguration, this.PairsLines, this.DCALines, this.IndicatorsLines, this.Log); + this.SingleMarketSettingWritten = true; + + this.Log.DoLogInfo("Building single market settings completed."); + } else { + this.Log.DoLogInfo("No settings triggered for single markets."); + + // Remove single market settings if no triggers are met - if necessary + this.SingleMarketSettingWritten = SettingsHandler.RemoveSingleMarketSettings(this.PTMagicConfiguration, this.PairsLines, this.DCALines, this.IndicatorsLines, this.Log); + } + + } else { + this.Log.DoLogInfo("No single market settings found."); + } + } + + private void SaveProfitTrailerProperties(bool headerLinesAdded, string pairsPropertiesPath, string dcaPropertiesPath, string indicatorsPropertiesPath) { + if (headerLinesAdded || this.GlobalSettingWritten || this.SingleMarketSettingWritten) { + if (this.ProfitTrailerMajorVersion == 1) { + // Save current PT properties to files (Valid for PT 1.x) + this.Log.DoLogInfo("Saving properties files..."); + + // Write Pairs.properties + if (this.PTMagicConfiguration.GeneralSettings.Backup.IsEnabled) FileHelper.CreateBackup(pairsPropertiesPath, this.PTMagicConfiguration.GeneralSettings.Application.ProfitTrailerPath + Constants.PTPathTrading + Path.DirectorySeparatorChar + "_backups" + Path.DirectorySeparatorChar); + this.Log.DoLogInfo("Writing Pairs.properties..."); + if (!this.PTMagicConfiguration.GeneralSettings.Application.TestMode) File.WriteAllLines(pairsPropertiesPath, this.PairsLines); + + // Write DCA.properties + if (this.PTMagicConfiguration.GeneralSettings.Backup.IsEnabled) FileHelper.CreateBackup(dcaPropertiesPath, this.PTMagicConfiguration.GeneralSettings.Application.ProfitTrailerPath + Constants.PTPathTrading + Path.DirectorySeparatorChar + "_backups" + Path.DirectorySeparatorChar); + this.Log.DoLogInfo("Writing DCA.properties..."); + if (!this.PTMagicConfiguration.GeneralSettings.Application.TestMode) File.WriteAllLines(dcaPropertiesPath, this.DCALines); + + // Write Indicators.properties + if (this.PTMagicConfiguration.GeneralSettings.Backup.IsEnabled) FileHelper.CreateBackup(indicatorsPropertiesPath, this.PTMagicConfiguration.GeneralSettings.Application.ProfitTrailerPath + Constants.PTPathTrading + Path.DirectorySeparatorChar + "_backups" + Path.DirectorySeparatorChar); + this.Log.DoLogInfo("Writing Indicators.properties..."); + if (!this.PTMagicConfiguration.GeneralSettings.Application.TestMode) File.WriteAllLines(indicatorsPropertiesPath, this.IndicatorsLines); + + this.Log.DoLogInfo("All properties files saved!"); + } else { + // Save current PT properties to API (Valid for PT 2.x and above) + this.Log.DoLogInfo("Saving properties using API..."); + + // Send Pairs.properties + if (!this.PTMagicConfiguration.GeneralSettings.Application.TestMode) SettingsAPI.SendPropertyLinesToAPI("PAIRS", this.PairsLines, this.PTMagicConfiguration, this.Log); + + // Send DCA.properties + if (!this.PTMagicConfiguration.GeneralSettings.Application.TestMode) SettingsAPI.SendPropertyLinesToAPI("DCA", this.DCALines, this.PTMagicConfiguration, this.Log); + + // Send Indicators.properties + if (!this.PTMagicConfiguration.GeneralSettings.Application.TestMode) SettingsAPI.SendPropertyLinesToAPI("INDICATORS", this.IndicatorsLines, this.PTMagicConfiguration, this.Log); + + this.Log.DoLogInfo("All properties saved!"); + } + + } else { + this.Log.DoLogInfo("Nothing changed, no files touched!"); + } + } + + private void SaveSingleMarketSettingsSummary() { + JsonSerializerSettings smsSummaryJsonSettings = new JsonSerializerSettings(); + smsSummaryJsonSettings.NullValueHandling = NullValueHandling.Ignore; + smsSummaryJsonSettings.DefaultValueHandling = DefaultValueHandling.Ignore; + + FileHelper.WriteTextToFile(Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar + Constants.PTMagicPathData + Path.DirectorySeparatorChar, "SingleMarketSettingSummary.json", JsonConvert.SerializeObject(this.SingleMarketSettingSummaries, Formatting.None, smsSummaryJsonSettings)); + + this.Log.DoLogInfo("Single Market Settings Summary saved."); + } + + private void SaveRuntimeSummary(bool headerLinesAdded) { + DateTime endTime = DateTime.Now; + int elapsedSeconds = (int)Math.Round(endTime.Subtract(this.LastRuntime).TotalSeconds, 0); + + this.LastRuntimeSummary.LastRuntimeSeconds = elapsedSeconds; + + this.Log.DoLogInfo("Building LastRuntimeSummary.json for your monitor..."); + + // Load existing runtime summary and read ongoing data + if (File.Exists(Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar + Constants.PTMagicPathData + Path.DirectorySeparatorChar + "LastRuntimeSummary.json")) { + try { + Summary summary = JsonConvert.DeserializeObject(System.IO.File.ReadAllText(Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar + Constants.PTMagicPathData + Path.DirectorySeparatorChar + "LastRuntimeSummary.json")); + if (summary != null) { + + // Last setting switch in case the app got restarted and has no history + if (this.LastRuntimeSummary.LastGlobalSettingSwitch == Constants.confMinDate) { + this.LastRuntimeSummary.LastGlobalSettingSwitch = summary.LastGlobalSettingSwitch; + } + + // Market trend changes history for graph data + foreach (string key in summary.MarketTrendChanges.Keys) { + this.LastRuntimeSummary.MarketTrendChanges.Add(key, summary.MarketTrendChanges[key].FindAll(mtc => mtc.TrendDateTime >= DateTime.Now.AddHours(-PTMagicConfiguration.AnalyzerSettings.MarketAnalyzer.StoreDataMaxHours))); + } + + // Global setting summary to be kept + this.LastRuntimeSummary.GlobalSettingSummary.AddRange(summary.GlobalSettingSummary.FindAll(gss => gss.SwitchDateTime >= DateTime.Now.AddHours(-96))); + + this.Log.DoLogInfo("Summary: Loaded old LastRuntimeSummary.json to keep data."); + } + } catch (Exception ex) { + this.Log.DoLogCritical("Summary: Error loading old summary (" + ex.Message + "). Creating new one.", ex); + } + } + + this.Log.DoLogInfo("Summary: Building global settings summary..."); + + // Change setting summary + GlobalSettingSummary lastSettingSummary = null; + if (this.LastRuntimeSummary.LastGlobalSettingSwitch == this.LastRuntimeSummary.LastRuntime || this.LastRuntimeSummary.GlobalSettingSummary.Count == 0) { + + // Setting got switched this run, add a new setting summary + GlobalSettingSummary gss = new GlobalSettingSummary(); + gss.SettingName = this.LastRuntimeSummary.CurrentGlobalSetting.SettingName; + gss.SwitchDateTime = this.LastRuntimeSummary.LastRuntime.ToUniversalTime(); + + if (this.LastRuntimeSummary.GlobalSettingSummary.Count > 0) { + lastSettingSummary = this.LastRuntimeSummary.GlobalSettingSummary.OrderByDescending(lss => lss.SwitchDateTime).First(); + lastSettingSummary.ActiveSeconds = (int)Math.Ceiling(DateTime.Now.ToUniversalTime().Subtract(lastSettingSummary.SwitchDateTime).TotalSeconds); + } + + this.LastRuntimeSummary.GlobalSettingSummary.Add(gss); + + lastSettingSummary = this.LastRuntimeSummary.GlobalSettingSummary.OrderByDescending(lss => lss.SwitchDateTime).First(); + } else { + + // Setting did not get switched, update data + if (this.LastRuntimeSummary.GlobalSettingSummary.Count > 0) { + lastSettingSummary = this.LastRuntimeSummary.GlobalSettingSummary.OrderByDescending(lss => lss.SwitchDateTime).First(); + lastSettingSummary.ActiveSeconds = (int)Math.Ceiling(DateTime.Now.ToUniversalTime().Subtract(lastSettingSummary.SwitchDateTime).TotalSeconds); + } + } + + this.Log.DoLogInfo("Summary: Built global settings summary."); + + this.Log.DoLogInfo("Summary: Save market trend changes for summary."); + // Save market trend changes for the summary + foreach (string key in this.AverageMarketTrendChanges.Keys) { + List mtChanges = new List(); + if (this.LastRuntimeSummary.MarketTrendChanges.ContainsKey(key)) { + mtChanges = this.LastRuntimeSummary.MarketTrendChanges[key]; + } + + MarketTrendChange newChange = new MarketTrendChange(); + newChange.MarketTrendName = key; + newChange.TrendChange = this.AverageMarketTrendChanges[key]; + newChange.TrendDateTime = this.LastRuntimeSummary.LastRuntime; + + mtChanges.Add(newChange); + if (lastSettingSummary != null) { + if (!lastSettingSummary.MarketTrendChanges.ContainsKey(key)) { + GlobalSetting gs = this.PTMagicConfiguration.AnalyzerSettings.GlobalSettings.Find(g => g.SettingName.Equals(lastSettingSummary.SettingName)); + if (gs != null) { + if (gs.SettingName.Equals("Default", StringComparison.InvariantCultureIgnoreCase) || gs.Triggers.Find(t => t.MarketTrendName.Equals(key)) != null) { + lastSettingSummary.MarketTrendChanges.Add(key, newChange); + } + } + } + } + + this.LastRuntimeSummary.MarketTrendChanges[key] = mtChanges; + } + this.Log.DoLogInfo("Summary: Market trends saved."); + + this.Log.DoLogInfo("Summary: Getting current global properties..."); + + // Get current global settings from PAIRS.PROPERTIES + Dictionary pairsProperties = SettingsHandler.GetPropertiesAsDictionary(this.PairsLines); + Dictionary dcaProperties = SettingsHandler.GetPropertiesAsDictionary(this.DCALines); + + string defaultBuyValueString = SettingsHandler.GetCurrentPropertyValue(pairsProperties, "ALL_buy_value", "DEFAULT_A_buy_value"); + double defaultBuyValue = SystemHelper.TextToDouble(defaultBuyValueString, 0, "en-US"); + + string defaultTrailingBuyString = SettingsHandler.GetCurrentPropertyValue(pairsProperties, "ALL_trailing_buy", "DEFAULT_trailing_buy"); + double defaultTrailingBuy = SystemHelper.TextToDouble(defaultTrailingBuyString, 0, "en-US"); + + string defaultSellValueString = SettingsHandler.GetCurrentPropertyValue(pairsProperties, "ALL_sell_value", "DEFAULT_A_sell_value"); + double defaultSellValue = SystemHelper.TextToDouble(defaultSellValueString, 0, "en-US"); + + string defaultTrailingProfitString = SettingsHandler.GetCurrentPropertyValue(pairsProperties, "ALL_trailing_profit", "DEFAULT_trailing_profit"); + double defaultTrailingProfit = SystemHelper.TextToDouble(defaultTrailingProfitString, 0, "en-US"); + + string defaultMaxTradingPairsString = SettingsHandler.GetCurrentPropertyValue(pairsProperties, "ALL_max_trading_pairs", "max_trading_pairs"); + double defaultMaxTradingPairs = SystemHelper.TextToDouble(defaultMaxTradingPairsString, 0, "en-US"); + + string defaultMaxCostString = SettingsHandler.GetCurrentPropertyValue(pairsProperties, "ALL_max_cost", "DEFAULT_initial_cost"); + double defaultMaxCost = SystemHelper.TextToDouble(defaultMaxCostString, 0, "en-US"); + + string defaultMaxCostPercentageString = SettingsHandler.GetCurrentPropertyValue(pairsProperties, "ALL_max_cost_percentage", "DEFAULT_initial_cost_percentage"); + double defaultMaxCostPercentage = SystemHelper.TextToDouble(defaultMaxCostPercentageString, 0, "en-US"); + + string defaultMinBuyVolumeString = SettingsHandler.GetCurrentPropertyValue(pairsProperties, "ALL_min_buy_volume", "DEFAULT_min_buy_volume"); + double defaultMinBuyVolume = SystemHelper.TextToDouble(defaultMinBuyVolumeString, 0, "en-US"); + + string defaultDCALevelString = SettingsHandler.GetCurrentPropertyValue(dcaProperties, "max_buy_times", "DEFAULT_DCA_max_buy_times"); + double defaultDCALevel = SystemHelper.TextToDouble(defaultDCALevelString, 0, "en-US"); + + string defaultBuyStrategy = SettingsHandler.GetCurrentPropertyValue(pairsProperties, "ALL_buy_strategy", "DEFAULT_A_buy_strategy"); + + string defaultSellStrategy = SettingsHandler.GetCurrentPropertyValue(pairsProperties, "ALL_sell_strategy", "DEFAULT_A_sell_strategy"); + + string defaultDCAEnabledString = SettingsHandler.GetCurrentPropertyValue(pairsProperties, "ALL_DCA_enabled", "DEFAULT_DCA_enabled"); + bool defaultDCAEnabled = (defaultDCAEnabledString.Equals("false", StringComparison.InvariantCultureIgnoreCase)) ? false : true; + + string defaultSOMActiveString = SettingsHandler.GetCurrentPropertyValue(pairsProperties, "ALL_sell_only_mode", "DEFAULT_sell_only_mode_enabled"); + bool defaultSOMActive = (defaultSOMActiveString.Equals("false", StringComparison.InvariantCultureIgnoreCase)) ? false : true; + this.LastRuntimeSummary.IsSOMActive = defaultSOMActive; + + string dcaBuyStrategyString = SettingsHandler.GetCurrentPropertyValue(dcaProperties, "buy_strategy", "DEFAULT_DCA_A_buy_strategy"); + this.LastRuntimeSummary.DCABuyStrategy = dcaBuyStrategyString; + + this.LastRuntimeSummary.BuyValue = defaultBuyValue; + this.LastRuntimeSummary.TrailingBuy = defaultTrailingBuy; + this.LastRuntimeSummary.SellValue = defaultSellValue; + this.LastRuntimeSummary.TrailingProfit = defaultTrailingProfit; + this.LastRuntimeSummary.MaxTradingPairs = defaultMaxTradingPairs; + this.LastRuntimeSummary.MaxCost = defaultMaxCost; + this.LastRuntimeSummary.MaxCostPercentage = defaultMaxCostPercentage; + this.LastRuntimeSummary.MinBuyVolume = defaultMinBuyVolume; + this.LastRuntimeSummary.BuyStrategy = defaultBuyStrategy; + this.LastRuntimeSummary.SellStrategy = defaultSellStrategy; + this.LastRuntimeSummary.DCALevels = defaultDCALevel; + + double maxDCALevel = this.LastRuntimeSummary.DCALevels; + if (maxDCALevel == 0) maxDCALevel = 1000; + + string dcaDefaultTriggerString = SettingsHandler.GetCurrentPropertyValue(dcaProperties, "buy_trigger", "DEFAULT_DCA_buy_trigger"); + double dcaDefaultTrigger = SystemHelper.TextToDouble(dcaDefaultTriggerString, 0, "en-US"); + + this.LastRuntimeSummary.DCATrigger = dcaDefaultTrigger; + + // Get configured DCA triggers + for (int dca = 1; dca <= maxDCALevel; dca++) { + string dcaTriggerString = SettingsHandler.GetCurrentPropertyValue(dcaProperties, "buy_trigger_" + dca.ToString(), "DEFAULT_DCA_buy_trigger_" + dca.ToString()); + if (!dcaTriggerString.Equals("")) { + double dcaTrigger = SystemHelper.TextToDouble(dcaTriggerString, 0, "en-US"); + + this.LastRuntimeSummary.DCATriggers.Add(dca, dcaTrigger); + } else { + if (this.LastRuntimeSummary.DCALevels == 0) this.LastRuntimeSummary.DCALevels = dca - 1; + break; + } + } + + // Get configured DCA percentages + if (this.ProfitTrailerMajorVersion >= 2) { + string dcaDefaultPercentageString = SettingsHandler.GetCurrentPropertyValue(dcaProperties, "DEFAULT_DCA_buy_percentage", ""); + double dcaDefaultPercentage = SystemHelper.TextToDouble(dcaDefaultPercentageString, 0, "en-US"); + + this.LastRuntimeSummary.DCAPercentage = dcaDefaultPercentage; + + for (int dca = 1; dca <= maxDCALevel; dca++) { + string dcaPercentageString = SettingsHandler.GetCurrentPropertyValue(dcaProperties, "DEFAULT_DCA_buy_percentage_" + dca.ToString(), ""); + if (!dcaPercentageString.Equals("")) { + double dcaPercentage = SystemHelper.TextToDouble(dcaPercentageString, 0, "en-US"); + + this.LastRuntimeSummary.DCAPercentages.Add(dca, dcaPercentage); + } else { + if (this.LastRuntimeSummary.DCALevels == 0) this.LastRuntimeSummary.DCALevels = dca - 1; + break; + } + } + } else { + this.LastRuntimeSummary.DCAPercentage = 100; + } + + // Get configured Buy Strategies + for (char c = 'A'; c <= 'Z'; c++) { + string buyStrategyName = SettingsHandler.GetCurrentPropertyValue(pairsProperties, "DEFAULT_" + c + "_buy_strategy", ""); + if (!buyStrategyName.Equals("")) { + StrategySummary buyStrategy = new StrategySummary(); + buyStrategy.Name = buyStrategyName; + buyStrategy.Value = SystemHelper.TextToDouble(SettingsHandler.GetCurrentPropertyValue(pairsProperties, "DEFAULT_" + c + "_buy_value", ""), 0, "en-US"); + + this.LastRuntimeSummary.BuyStrategies.Add(buyStrategy); + } else { + break; + } + } + + // Get configured Sell Strategies + for (char c = 'A'; c <= 'Z'; c++) { + string sellStrategyName = SettingsHandler.GetCurrentPropertyValue(pairsProperties, "DEFAULT_" + c + "_sell_strategy", ""); + if (!sellStrategyName.Equals("")) { + StrategySummary sellStrategy = new StrategySummary(); + sellStrategy.Name = sellStrategyName; + sellStrategy.Value = SystemHelper.TextToDouble(SettingsHandler.GetCurrentPropertyValue(pairsProperties, "DEFAULT_" + c + "_sell_value", ""), 0, "en-US"); + + this.LastRuntimeSummary.SellStrategies.Add(sellStrategy); + } else { + break; + } + } + + // Get configured DCA Buy Strategies + for (char c = 'A'; c <= 'Z'; c++) { + string buyStrategyName = SettingsHandler.GetCurrentPropertyValue(dcaProperties, "DEFAULT_DCA_" + c + "_buy_strategy", ""); + if (!buyStrategyName.Equals("")) { + StrategySummary buyStrategy = new StrategySummary(); + buyStrategy.Name = buyStrategyName; + buyStrategy.Value = SystemHelper.TextToDouble(SettingsHandler.GetCurrentPropertyValue(dcaProperties, "DEFAULT_DCA_" + c + "_buy_value", ""), 0, "en-US"); + + this.LastRuntimeSummary.DCABuyStrategies.Add(buyStrategy); + } else { + break; + } + } + + // Get configured DCA Sell Strategies + for (char c = 'A'; c <= 'Z'; c++) { + string sellStrategyName = SettingsHandler.GetCurrentPropertyValue(dcaProperties, "DEFAULT_DCA_" + c + "_sell_strategy", ""); + if (!sellStrategyName.Equals("")) { + StrategySummary sellStrategy = new StrategySummary(); + sellStrategy.Name = sellStrategyName; + sellStrategy.Value = SystemHelper.TextToDouble(SettingsHandler.GetCurrentPropertyValue(dcaProperties, "DEFAULT_DCA_" + c + "_sell_value", ""), 0, "en-US"); + + this.LastRuntimeSummary.DCASellStrategies.Add(sellStrategy); + } else { + break; + } + } + + // Get current main currency price + Dictionary recentMarkets = BaseAnalyzer.GetMarketDataFromFile(this.PTMagicConfiguration, this.Log, "Exchange", DateTime.UtcNow, "Recent"); + if (recentMarkets.Keys.Count > 0) { + this.LastRuntimeSummary.MainMarketPrice = recentMarkets.First().Value.MainCurrencyPriceUSD; + + if (!this.LastRuntimeSummary.MainFiatCurrency.Equals("USD", StringComparison.InvariantCultureIgnoreCase)) { + this.LastRuntimeSummary.MainMarketPrice = this.LastRuntimeSummary.MainMarketPrice * this.LastRuntimeSummary.MainFiatCurrencyExchangeRate; + } + } + + this.Log.DoLogInfo("Summary: Current global properties saved."); + + this.Log.DoLogInfo("Summary: Getting current single market properties..."); + // Get current single market settings from PAIRS.PROPERTIES for each configured market + foreach (string marketPair in this.MarketList) { + MarketPairSummary mpSummary = new MarketPairSummary(); + mpSummary.CurrentBuyValue = defaultBuyValue; + mpSummary.CurrentTrailingBuy = defaultTrailingBuy; + mpSummary.CurrentSellValue = defaultSellValue; + mpSummary.CurrentTrailingProfit = defaultTrailingProfit; + mpSummary.IsDCAEnabled = defaultDCAEnabled; + mpSummary.IsSOMActive = defaultSOMActive; + mpSummary.ActiveSingleSettings = new List(); + + if (this.MarketList.Contains(marketPair)) { + + // Pair is allowed for trading, check for individual values + mpSummary.IsTradingEnabled = true; + + if (this.TriggeredSingleMarketSettings.Count > 0) { + if (this.TriggeredSingleMarketSettings.ContainsKey(marketPair)) { + mpSummary.ActiveSingleSettings = this.TriggeredSingleMarketSettings[marketPair]; + } + } + + string marketPairSimple = marketPair.Replace(this.LastRuntimeSummary.MainMarket, "").Replace("_", "").Replace("-", ""); + + // Get configured Buy Strategies + for (char c = 'A'; c <= 'Z'; c++) { + string buyStrategyName = SettingsHandler.GetCurrentPropertyValue(pairsProperties, marketPairSimple + "_" + c + "_buy_strategy", ""); + if (!buyStrategyName.Equals("")) { + StrategySummary buyStrategy = new StrategySummary(); + buyStrategy.Name = buyStrategyName; + buyStrategy.Value = SystemHelper.TextToDouble(SettingsHandler.GetCurrentPropertyValue(pairsProperties, marketPair + "_" + c + "_buy_value", ""), 0, "en-US"); + + mpSummary.BuyStrategies.Add(buyStrategy); + } else { + break; + } + } + if (mpSummary.BuyStrategies.Count == 0) mpSummary.BuyStrategies = this.LastRuntimeSummary.BuyStrategies; + + // Get configured Sell Strategies + for (char c = 'A'; c <= 'Z'; c++) { + string sellStrategyName = SettingsHandler.GetCurrentPropertyValue(pairsProperties, marketPairSimple + "_" + c + "_sell_strategy", ""); + if (!sellStrategyName.Equals("")) { + StrategySummary sellStrategy = new StrategySummary(); + sellStrategy.Name = sellStrategyName; + sellStrategy.Value = SystemHelper.TextToDouble(SettingsHandler.GetCurrentPropertyValue(pairsProperties, marketPairSimple + "_" + c + "_sell_value", ""), 0, "en-US"); + + mpSummary.SellStrategies.Add(sellStrategy); + } else { + break; + } + } + if (mpSummary.SellStrategies.Count == 0) mpSummary.SellStrategies = this.LastRuntimeSummary.SellStrategies; + + string pairBuyValueString = SettingsHandler.GetCurrentPropertyValue(pairsProperties, marketPairSimple + "_buy_value", marketPairSimple + "_A_buy_value"); + double pairBuyValue = SystemHelper.TextToDouble(pairBuyValueString, 100, "en-US"); + if (pairBuyValue < 100) mpSummary.CurrentBuyValue = pairBuyValue; + + string pairTrailingBuyString = SettingsHandler.GetCurrentPropertyValue(pairsProperties, marketPair + "_trailing_buy", marketPairSimple + "_trailing_buy"); + double pairTrailingBuy = SystemHelper.TextToDouble(pairTrailingBuyString, -1, "en-US"); + if (pairTrailingBuy > -1) mpSummary.CurrentTrailingBuy = pairTrailingBuy; + + string pairSellValueString = SettingsHandler.GetCurrentPropertyValue(pairsProperties, marketPair + "_sell_value", marketPairSimple + "_A_sell_value"); + double pairSellValue = SystemHelper.TextToDouble(pairSellValueString, 0, "en-US"); + if (pairSellValue > -1) mpSummary.CurrentSellValue = pairSellValue; + + string pairTrailingProfitString = SettingsHandler.GetCurrentPropertyValue(pairsProperties, marketPair + "_trailing_profit", marketPairSimple + "_trailing_profit"); + double pairTrailingProfit = SystemHelper.TextToDouble(pairTrailingProfitString, 0, "en-US"); + if (pairTrailingProfit > -1) mpSummary.CurrentTrailingProfit = pairTrailingProfit; + + string pairTradingEnabledString = SettingsHandler.GetCurrentPropertyValue(pairsProperties, marketPair + "_trading_enabled", marketPairSimple + "_trading_enabled"); + mpSummary.IsTradingEnabled = (pairTradingEnabledString.Equals("false", StringComparison.InvariantCultureIgnoreCase)) ? false : true; + + string pairDCAEnabledString = SettingsHandler.GetCurrentPropertyValue(pairsProperties, marketPair + "_DCA_enabled", marketPairSimple + "_DCA_enabled"); + mpSummary.IsDCAEnabled = (pairDCAEnabledString.Equals("false", StringComparison.InvariantCultureIgnoreCase)) ? false : defaultDCAEnabled; + + string pairSOMActiveString = SettingsHandler.GetCurrentPropertyValue(pairsProperties, marketPair + "_sell_only_mode", marketPairSimple + "_sell_only_mode_enabled"); + mpSummary.IsSOMActive = (pairSOMActiveString.Equals("true", StringComparison.InvariantCultureIgnoreCase)) ? true : false; + } + + // Get market trend values for each market pair + foreach (string marketTrendName in this.SingleMarketTrendChanges.Keys) { + if (this.SingleMarketTrendChanges.ContainsKey(marketTrendName)) { + MarketTrendChange mtc = this.SingleMarketTrendChanges[marketTrendName].Find(m => m.Market == marketPair); + if (mtc != null) { + double marketTrendChange = mtc.TrendChange; + mpSummary.MarketTrendChanges.Add(marketTrendName, marketTrendChange); + + mpSummary.LatestPrice = mtc.LastPrice; + mpSummary.Latest24hVolume = mtc.Volume24h; + } + } + } + + if (!this.LastRuntimeSummary.MarketSummary.ContainsKey(marketPair)) { + this.LastRuntimeSummary.MarketSummary.Add(marketPair, mpSummary); + } + } + + this.Log.DoLogInfo("Summary: Current single market properties saved."); + + string serialziedJson = JsonConvert.SerializeObject(this.LastRuntimeSummary); + + // Save the summary JSON file + try { + FileHelper.WriteTextToFile(Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar + Constants.PTMagicPathData + Path.DirectorySeparatorChar, "LastRuntimeSummary.json", serialziedJson); + + this.Log.DoLogInfo("Summary: LastRuntimeSummary.json saved."); + } catch (Exception ex) { + this.Log.DoLogCritical("Exception while writing LastRuntimeSummary.json", ex); + + try { + this.Log.DoLogInfo("Summary: Retrying one more time to save LastRuntimeSummary.json."); + FileHelper.WriteTextToFile(Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar + Constants.PTMagicPathData + Path.DirectorySeparatorChar, "LastRuntimeSummary.json", serialziedJson); + + this.Log.DoLogInfo("Summary: LastRuntimeSummary.json saved."); + } catch (Exception ex2) { + this.Log.DoLogCritical("Nope, another Exception while writing LastRuntimeSummary.json", ex2); + } + } + + string logsPath = Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar + Constants.PTMagicPathLogs + Path.DirectorySeparatorChar; + if (Directory.Exists(logsPath)) { + FileHelper.CleanupFiles(logsPath, 24 * 3); + this.Log.DoLogInfo("Cleaned up logfiles."); + } + + this.TotalElapsedSeconds += elapsedSeconds; + this.Log.DoLogInfo("##########################################################"); + this.Log.DoLogInfo("#******************* RAID SUMMARY ********************#"); + this.Log.DoLogInfo("+ PT Magic Version: " + this.LastRuntimeSummary.Version); + if (!SystemHelper.IsRecentVersion(this.LastRuntimeSummary.Version, this.LatestVersion)) { + this.Log.DoLogWarn("+ Your version is out of date! The most recent version is " + this.LatestVersion); + } + this.Log.DoLogInfo("+ Proft Trailer Major Version: " + PTMagicConfiguration.GeneralSettings.Application.ProfitTrailerMajorVersion.ToString()); + this.Log.DoLogInfo("+ Instance name: " + PTMagicConfiguration.GeneralSettings.Application.InstanceName); + this.Log.DoLogInfo("+ Time spent: " + SystemHelper.GetProperDurationTime(elapsedSeconds)); + this.Log.DoLogInfo("+ Active setting: " + this.LastRuntimeSummary.CurrentGlobalSetting.SettingName); + this.Log.DoLogInfo("+ Global setting changed: " + ((this.LastRuntimeSummary.LastGlobalSettingSwitch == this.LastRuntimeSummary.LastRuntime) ? "Yes" : "No") + " " + ((this.LastRuntimeSummary.FloodProtectedSetting != null) ? "(Flood protection!)" : "")); + this.Log.DoLogInfo("+ Files changed: " + (((headerLinesAdded || this.GlobalSettingWritten || this.SingleMarketSettingWritten) && !this.PTMagicConfiguration.GeneralSettings.Application.TestMode) ? "Yes" : "No")); + this.Log.DoLogInfo("+ Markets with active single market settings: " + this.TriggeredSingleMarketSettings.Count.ToString()); + foreach (string activeSMS in this.SingleMarketSettingsCount.Keys) { + this.Log.DoLogInfo("+ " + activeSMS + ": " + this.SingleMarketSettingsCount[activeSMS].ToString()); + } + this.Log.DoLogInfo("+ " + this.TotalElapsedSeconds.ToString() + " Magicbots killed in " + this.RunCount.ToString() + " raids on Cryptodragon's Lair " + this.PTMagicConfiguration.AnalyzerSettings.MarketAnalyzer.IntervalMinutes.ToString() + "."); + this.Log.DoLogInfo(""); + this.Log.DoLogInfo("DO NOT CLOSE THIS WINDOW! THIS IS THE BOT THAT ANALYZES TRENDS AND CHANGES SETTINGS!"); + this.Log.DoLogInfo(""); + this.Log.DoLogInfo("#********************************************************#"); + this.Log.DoLogInfo("##########################################################"); + this.Log.DoLogInfo(""); + } + + private void Cleanup() { + this.GlobalSettingWritten = false; + this.SingleMarketSettingWritten = false; + this.EnforceSettingsReapply = false; + + this.PairsLines = null; + this.DCALines = null; + this.IndicatorsLines = null; + + this.SingleMarketTrendChanges = new Dictionary>(); + this.GlobalMarketTrendChanges = new Dictionary>(); + this.AverageMarketTrendChanges = new Dictionary(); + this.SingleMarketSettingsCount = new Dictionary(); + this.TriggeredSingleMarketSettings = new Dictionary>(); + this.ExchangeMarketList = null; + this.MarketList = new List(); + this.LastRuntimeSummary = null; + } + #endregion + } +} diff --git a/Core/Main/PTMagicConfiguration.cs b/Core/Main/PTMagicConfiguration.cs new file mode 100644 index 0000000..3b93bb0 --- /dev/null +++ b/Core/Main/PTMagicConfiguration.cs @@ -0,0 +1,118 @@ +using System; +using System.IO; +using System.Collections.Generic; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Newtonsoft.Json; +using Core.Helper; +using Core.Main.DataObjects.PTMagicData; + +namespace Core.Main { + + public class PTMagicConfiguration { + private GeneralSettings _generalSettings = null; + private AnalyzerSettings _analyzerSettings = null; + private SecureSettings _secureSettings = null; + + public PTMagicConfiguration() { + LoadSettings(Directory.GetCurrentDirectory()); + } + + public PTMagicConfiguration(string basePath) { + LoadSettings(basePath); + } + + private void LoadSettings(string basePath) { + if (!basePath.EndsWith(Path.DirectorySeparatorChar)) { + basePath += Path.DirectorySeparatorChar; + } + + GeneralSettingsWrapper gsw = JsonConvert.DeserializeObject(File.ReadAllText(basePath + "settings.general.json")); + _generalSettings = gsw.GeneralSettings; + + AnalyzerSettingsWrapper asw = JsonConvert.DeserializeObject(File.ReadAllText(basePath + "settings.analyzer.json")); + _analyzerSettings = asw.AnalyzerSettings; + + if (!_generalSettings.Application.ProfitTrailerPath.EndsWith(Path.DirectorySeparatorChar)) { + _generalSettings.Application.ProfitTrailerPath += Path.DirectorySeparatorChar; + } + + if (!_generalSettings.Application.ProfitTrailerMonitorURL.EndsWith("/")) { + _generalSettings.Application.ProfitTrailerMonitorURL += "/"; + } + + if (File.Exists(basePath + "settings.secure.json")) { + SecureSettingsWrapper ssw = JsonConvert.DeserializeObject(File.ReadAllText(basePath + "settings.secure.json")); + _secureSettings = ssw.SecureSettings; + } + } + + public string GetProfitTrailerLicenseKeyMasked() { + string result = ""; + + if (!this.GeneralSettings.Application.ProfitTrailerLicense.Equals("")) { + result = this.GeneralSettings.Application.ProfitTrailerLicense.Substring(0, 4); + + for (int i = 1; i < this.GeneralSettings.Application.ProfitTrailerLicense.Length - 8; i++) { + result += "*"; + } + + result += this.GeneralSettings.Application.ProfitTrailerLicense.Substring(this.GeneralSettings.Application.ProfitTrailerLicense.Length - 4); + } + + return result; + } + + public GeneralSettings GeneralSettings { + get { + return _generalSettings; + } + } + + public AnalyzerSettings AnalyzerSettings { + get { + return _analyzerSettings; + } + } + + public SecureSettings SecureSettings { + get { + if (_secureSettings == null) _secureSettings = new SecureSettings(); + return _secureSettings; + } + } + + public void WriteGeneralSettings(string basePath) { + GeneralSettingsWrapper gsWrapper = new GeneralSettingsWrapper(); + gsWrapper.GeneralSettings = this.GeneralSettings; + + FileHelper.CreateBackup(basePath + "settings.general.json", basePath, "settings.general.json.backup"); + + FileHelper.WriteTextToFile(basePath, "settings.general.json", JsonConvert.SerializeObject(gsWrapper, Formatting.Indented)); + } + + public void WriteAnalyzerSettings(string basePath) { + AnalyzerSettingsWrapper asWrapper = new AnalyzerSettingsWrapper(); + asWrapper.AnalyzerSettings = this.AnalyzerSettings; + + JsonSerializerSettings settings = new JsonSerializerSettings(); + settings.NullValueHandling = NullValueHandling.Ignore; + settings.DefaultValueHandling = DefaultValueHandling.Ignore; + + FileHelper.CreateBackup(basePath + "settings.analyzer.json", basePath, "settings.analyzer.json.backup"); + + FileHelper.WriteTextToFile(basePath, "settings.analyzer.json", JsonConvert.SerializeObject(asWrapper, Formatting.Indented, settings)); + } + + public void WriteSecureSettings(string password, string basePath) { + string passwordEncrypted = EncryptionHelper.Encrypt(password); + + this.SecureSettings.MonitorPassword = passwordEncrypted; + + SecureSettingsWrapper ssWrapper = new SecureSettingsWrapper(); + ssWrapper.SecureSettings = this.SecureSettings; + + FileHelper.WriteTextToFile(basePath, "settings.secure.json", JsonConvert.SerializeObject(ssWrapper, Formatting.Indented)); + } + } +} diff --git a/Core/MarketAnalyzer/BaseAnalyzer.cs b/Core/MarketAnalyzer/BaseAnalyzer.cs new file mode 100644 index 0000000..ca5b343 --- /dev/null +++ b/Core/MarketAnalyzer/BaseAnalyzer.cs @@ -0,0 +1,376 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net; +using System.Text; +using Newtonsoft.Json; +using Core.Main; +using Core.Helper; +using Core.Main.DataObjects.PTMagicData; + +namespace Core.MarketAnalyzer { + public class BaseAnalyzer { + public static Dictionary GetJsonFromURL(string url, LogHelper log) { + Dictionary jsonObject = null; + + HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); + request.ContentType = "application/json"; + request.UserAgent = "PTMagic.Import"; + + try { + HttpWebResponse httpResponse = (HttpWebResponse)request.GetResponse(); + + StreamReader jsonReader = new StreamReader(httpResponse.GetResponseStream()); + string jsonString = jsonReader.ReadToEnd(); + jsonReader.Close(); + + jsonObject = JsonConvert.DeserializeObject>(jsonString); + + return jsonObject; + } catch (WebException ex) { + log.DoLogCritical(ex.Message, ex); + throw ex; + } catch (Exception ex) { + log.DoLogCritical(ex.Message, ex); + } + + return jsonObject; + } + + public static Newtonsoft.Json.Linq.JObject GetSimpleJsonObjectFromURL(string url, LogHelper log, bool onlyLogDebug) { + Newtonsoft.Json.Linq.JObject jsonObject = null; + + HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); + request.ContentType = "application/json"; + request.UserAgent = "PTMagic.Import"; + + try { + HttpWebResponse httpResponse = (HttpWebResponse)request.GetResponse(); + + StreamReader jsonReader = new StreamReader(httpResponse.GetResponseStream()); + string jsonString = jsonReader.ReadToEnd(); + jsonReader.Close(); + + jsonObject = JsonConvert.DeserializeObject(jsonString); + + return jsonObject; + } catch (WebException ex) { + log.DoLogCritical(ex.Message, ex); + throw ex; + } catch (Exception ex) { + if (onlyLogDebug) { + log.DoLogDebug("Url: " + url + " Message: " + ex.Message); + } else { + log.DoLogCritical(ex.Message, ex); + } + } + + return jsonObject; + } + + public static List GetSimpleJsonListFromURL(string url, LogHelper log) { + List jsonObject = null; + + HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); + request.ContentType = "application/json"; + request.UserAgent = "PTMagic.Import"; + + try { + HttpWebResponse httpResponse = (HttpWebResponse)request.GetResponse(); + + StreamReader jsonReader = new StreamReader(httpResponse.GetResponseStream()); + string jsonString = jsonReader.ReadToEnd(); + jsonReader.Close(); + + jsonObject = JsonConvert.DeserializeObject>(jsonString); + + return jsonObject; + } catch (WebException ex) { + log.DoLogCritical(ex.Message, ex); + throw ex; + } catch (Exception ex) { + log.DoLogCritical(ex.Message, ex); + } + + return jsonObject; + } + + public static Newtonsoft.Json.Linq.JArray GetSimpleJsonArrayFromURL(string url, LogHelper log) { + Newtonsoft.Json.Linq.JArray jsonObject = null; + + HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); + request.ContentType = "application/json"; + request.UserAgent = "PTMagic.Import"; + + try { + HttpWebResponse httpResponse = (HttpWebResponse)request.GetResponse(); + + StreamReader jsonReader = new StreamReader(httpResponse.GetResponseStream()); + string jsonString = jsonReader.ReadToEnd(); + jsonReader.Close(); + + jsonObject = JsonConvert.DeserializeObject(jsonString); + + return jsonObject; + } catch (WebException ex) { + log.DoLogCritical(ex.Message, ex); + throw ex; + } catch (Exception ex) { + log.DoLogCritical(ex.Message, ex); + } + + return jsonObject; + } + + public static string GetLatestGitHubRelease(LogHelper log, string defaultVersion) { + string result = defaultVersion; + + try { + string baseUrl = "https://api.github.com/repos/legedric/ptmagic/releases/latest"; + + log.DoLogDebug("GitHub - Getting most recent release..."); + Newtonsoft.Json.Linq.JObject jsonObject = GetSimpleJsonObjectFromURL(baseUrl, log, true); + if (jsonObject != null) { + log.DoLogDebug("GitHub - Received most recent release."); + + result = jsonObject.GetValue("tag_name").ToString(); + log.DoLogDebug("GitHub - Most recent release version is " + result); + } + } catch (WebException ex) { + log.DoLogDebug("GitHub version check error: " + ex.Message); + } catch (Exception ex) { + log.DoLogDebug("GitHub version check error: " + ex.Message); + } + + return result; + } + + public static double GetMainFiatCurrencyRate(string currency, LogHelper log) { + double result = 1; + + string baseUrl = "http://free.currencyconverterapi.com/api/v5/convert?q=USD_" + currency + "&compact=y"; + + log.DoLogDebug("http://free.currencyconverterapi.com - Getting latest exchange rates..."); + Newtonsoft.Json.Linq.JObject jsonObject = GetSimpleJsonObjectFromURL(baseUrl, log, true); + if (jsonObject != null) { + log.DoLogDebug("http://free.currencyconverterapi.com - Received latest exchange rates."); + + result = (double)jsonObject["USD_" + currency]["val"]; + log.DoLogInfo("http://free.currencyconverterapi.com - Latest exchange rate for USD to " + currency + " is " + result); + } + + return result; + } + + public static Dictionary GetMarketInfosFromFile(PTMagicConfiguration systemConfiguration, LogHelper log) { + Dictionary result = new Dictionary(); + + string marketInfoFilePath = Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar + Constants.PTMagicPathData + Path.DirectorySeparatorChar + Constants.PTMagicPathExchange + Path.DirectorySeparatorChar + "MarketInfo.json"; + if (File.Exists(marketInfoFilePath)) { + try { + result = JsonConvert.DeserializeObject>(System.IO.File.ReadAllText(marketInfoFilePath)); + } catch (Exception ex) { + log.DoLogDebug(ex.Message); + } + } + + if (result == null) { + result = new Dictionary(); + } + + return result; + } + + public static void SaveMarketInfosToFile(Dictionary marketInfos, PTMagicConfiguration systemConfiguration, LogHelper log) { + FileHelper.WriteTextToFile(Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar + Constants.PTMagicPathData + Path.DirectorySeparatorChar + Constants.PTMagicPathExchange + Path.DirectorySeparatorChar, "MarketInfo.json", JsonConvert.SerializeObject(marketInfos)); + } + + public static Dictionary GetMarketDataFromFile(PTMagicConfiguration systemConfiguration, LogHelper log, string platform, DateTime maxDateTime, string marketCaption) { + Dictionary result = new Dictionary(); + + DirectoryInfo dataDirectory = new DirectoryInfo(Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar + Constants.PTMagicPathData + Path.DirectorySeparatorChar + platform + Path.DirectorySeparatorChar); + + // Get market files older than max datetime in descending order (newest file up top) + List marketFiles = dataDirectory.EnumerateFiles("MarketData*") + .Select(x => { x.Refresh(); return x; }) + .Where(x => x.LastWriteTimeUtc <= maxDateTime) + .ToArray().OrderByDescending(f => f.LastWriteTimeUtc).ToList(); + + FileInfo marketFile = null; + if (marketFiles.Count > 0) { + marketFile = marketFiles.First(); + + log.DoLogDebug(platform + " - " + marketCaption + " market data loaded (" + marketFile.LastWriteTimeUtc.ToString() + ")"); + } else { + log.DoLogDebug(platform + " - Not able to load " + marketCaption + " market data. Loading next youngest market file instead."); + + // Get market files younger than max datetime in ascending order (oldest file up top) + marketFiles = dataDirectory.EnumerateFiles("MarketData*") + .Select(x => { x.Refresh(); return x; }) + .Where(x => x.LastWriteTimeUtc >= maxDateTime) + .ToArray().OrderBy(f => f.LastWriteTimeUtc).ToList(); + if (marketFiles.Count > 0) { + marketFile = marketFiles.First(); + log.DoLogDebug(platform + " - " + marketCaption + " market data loaded (" + marketFile.LastWriteTimeUtc.ToString() + ")"); + } + } + + try { + // Get JSON object + result = JsonConvert.DeserializeObject>(marketFile.OpenText().ReadToEnd()); + } catch (Exception ex) { + log.DoLogCritical(ex.Message, ex); + } + + return result; + } + + public static Dictionary> BuildMarketTrends(string platform, string mainMarket, List marketList, string sortBy, bool isGlobal, Dictionary> output, PTMagicConfiguration systemConfiguration, LogHelper log) { + + try { + List marketTrends = systemConfiguration.AnalyzerSettings.MarketAnalyzer.MarketTrends.FindAll(mt => mt.Platform.Equals(platform, StringComparison.InvariantCultureIgnoreCase)); + if (marketTrends.Count > 0) { + Dictionary recentMarkets = BaseAnalyzer.GetMarketDataFromFile(systemConfiguration, log, platform, DateTime.Now.ToUniversalTime(), "Recent"); + + foreach (MarketTrend marketTrend in marketTrends) { + if (platform.Equals("Exchange", StringComparison.InvariantCultureIgnoreCase)) { + log.DoLogInfo(platform + " - Building market trend changes for '" + marketTrend.Name + "' on main market '" + mainMarket + "' with " + marketList.Count.ToString() + " markets..."); + } else { + log.DoLogInfo(platform + " - Building market trend changes for '" + marketTrend.Name + "'..."); + } + + Dictionary trendMarkets = BaseAnalyzer.GetMarketDataFromFile(systemConfiguration, log, platform, DateTime.Now.ToUniversalTime().AddMinutes(-marketTrend.TrendMinutes), marketTrend.Name); + + List marketTrendChanges = BaseAnalyzer.GetMarketTrendChanges(platform, mainMarket, marketTrend, marketList, recentMarkets, trendMarkets, sortBy, isGlobal, systemConfiguration, log); + + output.Add(marketTrend.Name, marketTrendChanges); + + log.DoLogInfo(platform + " - " + marketTrendChanges.Count.ToString() + " Market trend changes built for '" + marketTrend.Name + "'."); + } + } + + } catch (Exception ex) { + log.DoLogCritical(ex.Message, ex); + } + + return output; + } + + public static List GetMarketTrendChanges(string platform, string mainMarket, MarketTrend marketTrend, List marketList, Dictionary recentMarkets, Dictionary trendMarkets, string sortBy, bool isGlobal, PTMagicConfiguration systemConfiguration, LogHelper log) { + List result = new List(); + + var sortedMarkets = new SortedDictionary(recentMarkets).OrderBy(m => m.Value.Position); + if (sortBy.Equals("Volume")) { + sortedMarkets = new SortedDictionary(recentMarkets).OrderByDescending(m => m.Value.Volume24h); + } + + int marketCount = 1; + foreach (KeyValuePair recentMarketPair in sortedMarkets) { + if (marketList.Count == 0 || marketList.Contains(recentMarketPair.Key)) { + bool excludeMainCurrency = systemConfiguration.AnalyzerSettings.MarketAnalyzer.ExcludeMainCurrency; + if (!marketTrend.ExcludeMainCurrency) { + excludeMainCurrency = marketTrend.ExcludeMainCurrency; + } + + if (platform.Equals("CoinMarketCap", StringComparison.InvariantCulture) && excludeMainCurrency) { + + // Check if this is the main currency (only for CoinMarketCap) + if (recentMarketPair.Value.Symbol.Equals(mainMarket, StringComparison.InvariantCultureIgnoreCase)) { + + // If the current market is the main currency, skip it + continue; + } + } + Market recentMarket = recentMarkets[recentMarketPair.Key]; + + if (trendMarkets.ContainsKey(recentMarketPair.Key)) { + List ignoredMarkets = SystemHelper.ConvertTokenStringToList(marketTrend.IgnoredMarkets, ","); + if (ignoredMarkets.Contains(recentMarketPair.Value.Symbol)) { + log.DoLogDebug(platform + " - Market trend '" + marketTrend.Name + "' for '" + recentMarketPair.Key + "' is ignored in this trend."); + continue; + } + + List allowedMarkets = SystemHelper.ConvertTokenStringToList(marketTrend.AllowedMarkets, ","); + if (allowedMarkets.Count > 0 && !allowedMarkets.Contains(recentMarketPair.Value.Symbol)) { + log.DoLogDebug(platform + " - Market trend '" + marketTrend.Name + "' for '" + recentMarketPair.Key + "' is not allowed in this trend."); + continue; + } + + Market trendMarket = trendMarkets[recentMarketPair.Key]; + + if (trendMarket != null) { + double recentMarketPrice = recentMarket.Price; + double trendMarketPrice = trendMarket.Price; + + if (!platform.Equals("CoinMarketCap", StringComparison.InvariantCulture) && marketTrend.TrendCurrency.Equals("Fiat", StringComparison.InvariantCultureIgnoreCase)) { + if (recentMarket.MainCurrencyPriceUSD > 0 && trendMarket.MainCurrencyPriceUSD > 0) { + recentMarketPrice = recentMarketPrice * recentMarket.MainCurrencyPriceUSD; + trendMarketPrice = trendMarketPrice * trendMarket.MainCurrencyPriceUSD; + } + } + + double trendMarketChange = (recentMarketPrice - trendMarketPrice) / trendMarketPrice * 100; + + MarketTrendChange mtc = new MarketTrendChange(); + mtc.MarketTrendName = marketTrend.Name; + mtc.TrendMinutes = marketTrend.TrendMinutes; + mtc.TrendChange = trendMarketChange; + mtc.Market = recentMarket.Name; + mtc.LastPrice = recentMarket.Price; + mtc.Volume24h = recentMarket.Volume24h; + mtc.TrendDateTime = DateTime.Now; + + result.Add(mtc); + + log.DoLogDebug(platform + " - Market trend '" + marketTrend.Name + "' for '" + recentMarketPair.Key + "' (Vol. " + recentMarket.Volume24h.ToString("#,#0.00") + ") is " + trendMarketChange.ToString("#,#0.00") + "% in " + SystemHelper.GetProperDurationTime(marketTrend.TrendMinutes * 60).ToLower() + "."); + + marketCount++; + } + } + } + } + + if (marketTrend.MaxMarkets > 0 && isGlobal) { + int maxMarkets = (marketTrend.MaxMarkets <= result.Count) ? marketTrend.MaxMarkets : result.Count; + + result = result.GetRange(0, maxMarkets); + } + + return result; + } + + public static Dictionary BuildGlobalMarketTrends(Dictionary> globalMarketTrendChanges, PTMagicConfiguration systemConfiguration, LogHelper log) { + Dictionary result = new Dictionary(); + + List marketTrends = systemConfiguration.AnalyzerSettings.MarketAnalyzer.MarketTrends; + if (marketTrends.Count > 0) { + foreach (MarketTrend marketTrend in marketTrends) { + log.DoLogInfo("Building market trend average for '" + marketTrend.Name + "'"); + + if (globalMarketTrendChanges.ContainsKey(marketTrend.Name)) { + List marketTrendChanges = globalMarketTrendChanges[marketTrend.Name]; + if (marketTrendChanges != null && marketTrendChanges.Count > 0) { + + double averageTrendChange = marketTrendChanges.Average(mtc => mtc.TrendChange); + + result.Add(marketTrend.Name, averageTrendChange); + + log.DoLogInfo("Built average market trend change '" + marketTrend.Name + "' (" + averageTrendChange.ToString("#,#0.00") + "% in " + marketTrend.TrendMinutes.ToString() + " minutes) for " + marketTrendChanges.Count.ToString() + " markets."); + } else { + result.Add(marketTrend.Name, 0); + + log.DoLogWarn("No market trend changes found for '" + marketTrend.Name + "' - returning 0%"); + } + } else { + result.Add(marketTrend.Name, 0); + + log.DoLogWarn("Market trend '" + marketTrend.Name + "' not found in globalMarketTrendChanges[] - returning 0%"); + } + } + } + + return result; + } + } +} diff --git a/Core/MarketAnalyzer/Binance.cs b/Core/MarketAnalyzer/Binance.cs new file mode 100644 index 0000000..dfbe20a --- /dev/null +++ b/Core/MarketAnalyzer/Binance.cs @@ -0,0 +1,350 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.IO; +using System.Text; +using Core.Main; +using Core.Helper; +using Core.Main.DataObjects.PTMagicData; +using Newtonsoft.Json; +using Core.ProfitTrailer; +using System.Net; + +namespace Core.MarketAnalyzer { + public class Binance : BaseAnalyzer { + public static double GetMainCurrencyPrice(string mainMarket, PTMagicConfiguration systemConfiguration, LogHelper log) { + double result = 0; + + try { + string baseUrl = "https://api.binance.com/api/v1/ticker/24hr?symbol=" + mainMarket + "USDT"; + + log.DoLogInfo("Binance - Getting main market price..."); + Newtonsoft.Json.Linq.JObject jsonObject = GetSimpleJsonObjectFromURL(baseUrl, log, false); + if (jsonObject != null) { + log.DoLogInfo("Binance - Market data received for " + mainMarket + "USDT"); + + result = (double)jsonObject.GetValue("lastPrice"); + log.DoLogInfo("Binance - Current price for " + mainMarket + "USDT: " + result.ToString("#,#0.00") + " USD"); + } + } catch (Exception ex) { + log.DoLogCritical(ex.Message, ex); + } + + return result; + } + + public static List GetMarketData(string mainMarket, Dictionary marketInfos, PTMagicConfiguration systemConfiguration, LogHelper log) { + List result = new List(); + + string lastMarket = ""; + Newtonsoft.Json.Linq.JObject lastTicker = null; + try { + string baseUrl = "https://api.binance.com/api/v1/ticker/24hr"; + + log.DoLogInfo("Binance - Getting market data..."); + Newtonsoft.Json.Linq.JArray jsonArray = GetSimpleJsonArrayFromURL(baseUrl, log); + if (jsonArray.Count > 0) { + double mainCurrencyPrice = 1; + if (!mainMarket.Equals("USDT", StringComparison.InvariantCultureIgnoreCase)) { + mainCurrencyPrice = Binance.GetMainCurrencyPrice(mainMarket, systemConfiguration, log); + } + + log.DoLogInfo("Binance - Market data received for " + jsonArray.Count.ToString() + " currencies"); + + if (mainCurrencyPrice > 0) { + Dictionary markets = new Dictionary(); + foreach (Newtonsoft.Json.Linq.JObject currencyTicker in jsonArray) { + string marketName = currencyTicker["symbol"].ToString(); + if (marketName.EndsWith(mainMarket, StringComparison.InvariantCultureIgnoreCase)) { + + // Set last values in case any error occurs + lastMarket = marketName; + lastTicker = currencyTicker; + + Market market = new Market(); + market.Position = markets.Count + 1; + market.Name = marketName; + market.Symbol = currencyTicker["symbol"].ToString(); + market.Price = SystemHelper.TextToDouble(currencyTicker["lastPrice"].ToString(), 0, "en-US"); + market.Volume24h = SystemHelper.TextToDouble(currencyTicker["quoteVolume"].ToString(), 0, "en-US"); + market.MainCurrencyPriceUSD = mainCurrencyPrice; + + markets.Add(market.Name, market); + + result.Add(market.Name); + } + } + + Binance.CheckFirstSeenDates(markets, ref marketInfos, systemConfiguration, log); + + BaseAnalyzer.SaveMarketInfosToFile(marketInfos, systemConfiguration, log); + + Binance.CheckForMarketDataRecreation(mainMarket, markets, systemConfiguration, log); + + DateTime fileDateTime = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, DateTime.Now.Hour, DateTime.Now.Minute, 0).ToUniversalTime(); + + FileHelper.WriteTextToFile(Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar + Constants.PTMagicPathData + Path.DirectorySeparatorChar + Constants.PTMagicPathExchange + Path.DirectorySeparatorChar, "MarketData_" + fileDateTime.ToString("yyyy-MM-dd_HH.mm") + ".json", JsonConvert.SerializeObject(markets), fileDateTime, fileDateTime); + + log.DoLogInfo("Binance - Market data saved for " + markets.Count.ToString() + " markets with " + mainMarket + "."); + + FileHelper.CleanupFiles(Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar + Constants.PTMagicPathData + Path.DirectorySeparatorChar + Constants.PTMagicPathExchange + Path.DirectorySeparatorChar, systemConfiguration.AnalyzerSettings.MarketAnalyzer.StoreDataMaxHours); + log.DoLogInfo("Binance - Market data cleaned."); + } else { + log.DoLogError("Binance - Failed to get main market price for " + mainMarket + "."); + result = null; + } + } + } catch (WebException ex) { + if (ex.Response != null) { + using (HttpWebResponse errorResponse = (HttpWebResponse)ex.Response) { + using (StreamReader reader = new StreamReader(errorResponse.GetResponseStream())) { + Dictionary errorData = JsonConvert.DeserializeObject>(reader.ReadToEnd()); + if (errorData != null) { + string errorMessage = "Unable to get data from Binance with URL '" + errorResponse.ResponseUri + "'!"; + if (errorData.ContainsKey("code")) { + errorMessage += " - Code: " + errorData["code"]; + } + + if (errorData.ContainsKey("msg")) { + errorMessage += " - Message: " + errorData["msg"]; + } + + log.DoLogError(errorMessage); + } + } + } + } + result = null; + } catch (Exception ex) { + log.DoLogCritical("Exception while getting data for '" + lastMarket + "': " + ex.Message, ex); + result = null; + } + + return result; + } + + public static void CheckFirstSeenDates(Dictionary markets, ref Dictionary marketInfos, PTMagicConfiguration systemConfiguration, LogHelper log) { + log.DoLogInfo("Binance - Checking first seen dates for " + markets.Count + " markets. This may take a while..."); + + int marketsChecked = 0; + foreach (string key in markets.Keys) { + // Save market info + MarketInfo marketInfo = null; + if (marketInfos.ContainsKey(key)) { + marketInfo = marketInfos[key]; + } + + if (marketInfo == null) { + marketInfo = new MarketInfo(); + marketInfo.Name = key; + marketInfos.Add(key, marketInfo); + marketInfo.FirstSeen = Binance.GetFirstSeenDate(key, systemConfiguration, log); + } else { + if (marketInfo.FirstSeen == Constants.confMinDate) { + marketInfo.FirstSeen = Binance.GetFirstSeenDate(key, systemConfiguration, log); + } + } + marketInfo.LastSeen = DateTime.Now.ToUniversalTime(); + + marketsChecked++; + + if ((marketsChecked % 20) == 0) { + log.DoLogInfo("Binance - Yes, I am still checking first seen dates... " + marketsChecked + "/" + markets.Count + " markets done..."); + } + } + } + + public static DateTime GetFirstSeenDate(string marketName, PTMagicConfiguration systemConfiguration, LogHelper log) { + DateTime result = Constants.confMinDate; + + string baseUrl = "https://api.binance.com/api/v1/klines?interval=1d&symbol=" + marketName + "&limit=100"; + + log.DoLogDebug("Binance - Getting first seen date for '" + marketName + "'..."); + + Newtonsoft.Json.Linq.JArray jsonArray = GetSimpleJsonArrayFromURL(baseUrl, log); + if (jsonArray.Count > 0) { + result = Constants.Epoch.AddMilliseconds((Int64)jsonArray[0][0]); + log.DoLogDebug("Binance - First seen date for '" + marketName + "' set to " + result.ToString()); + } + + return result; + } + + public static List GetMarketTicks(string marketName, int ticksNeeded, PTMagicConfiguration systemConfiguration, LogHelper log) { + List result = new List(); + + try { + Int64 endTime = (Int64)Math.Ceiling(DateTime.Now.ToUniversalTime().Subtract(Constants.Epoch).TotalMilliseconds); + int ticksLimit = 500; + string baseUrl = ""; + int ticksFetched = 0; + + if (ticksNeeded < ticksLimit) { + ticksLimit = ticksNeeded; + } + + bool go = true; + while (ticksFetched < ticksNeeded && go) { + baseUrl = "https://api.binance.com/api/v1/klines?interval=1m&symbol=" + marketName + "&endTime=" + endTime.ToString() + "&limit=" + ticksLimit.ToString(); + + log.DoLogDebug("Binance - Getting " + ticksLimit.ToString() + " ticks for '" + marketName + "'..."); + Newtonsoft.Json.Linq.JArray jsonArray = GetSimpleJsonArrayFromURL(baseUrl, log); + if (jsonArray.Count > 0) { + log.DoLogDebug("Binance - " + jsonArray.Count.ToString() + " ticks received."); + + foreach (Newtonsoft.Json.Linq.JArray marketTick in jsonArray) { + + MarketTick tick = new MarketTick(); + tick.Price = (double)marketTick[4]; + tick.Volume24h = (double)marketTick[7]; + tick.Time = Constants.Epoch.AddMilliseconds((Int64)marketTick[0]); + + result.Add(tick); + } + + ticksFetched = ticksFetched + jsonArray.Count; + endTime = endTime - ticksLimit * 60 * 1000; + if (ticksNeeded - ticksFetched < ticksLimit) { + ticksLimit = ticksNeeded - ticksFetched; + } + } else { + log.DoLogDebug("Binance - No ticks received."); + go = false; + } + } + } catch (WebException ex) { + if (ex.Response != null) { + using (HttpWebResponse errorResponse = (HttpWebResponse)ex.Response) { + using (StreamReader reader = new StreamReader(errorResponse.GetResponseStream())) { + Dictionary errorData = JsonConvert.DeserializeObject>(reader.ReadToEnd()); + if (errorData != null) { + string errorMessage = "Unable to get data from Binance with URL '" + errorResponse.ResponseUri + "'!"; + if (errorData.ContainsKey("code")) { + errorMessage += " - Code: " + errorData["code"]; + } + + if (errorData.ContainsKey("msg")) { + errorMessage += " - Message: " + errorData["msg"]; + } + + log.DoLogError(errorMessage); + } + } + } + } + result = null; + } catch (Exception ex) { + log.DoLogCritical(ex.Message, ex); + } + + return result; + } + + public static void CheckForMarketDataRecreation(string mainMarket, Dictionary markets, PTMagicConfiguration systemConfiguration, LogHelper log) { + string binanceDataDirectoryPath = Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar + Constants.PTMagicPathData + Path.DirectorySeparatorChar + Constants.PTMagicPathExchange + Path.DirectorySeparatorChar; + + if (!Directory.Exists(binanceDataDirectoryPath)) { + Directory.CreateDirectory(binanceDataDirectoryPath); + } + + DirectoryInfo dataDirectory = new DirectoryInfo(binanceDataDirectoryPath); + + // Check for existing market files + DateTime latestMarketDataFileDateTime = Constants.confMinDate; + List marketFiles = dataDirectory.EnumerateFiles("MarketData*").ToList(); + FileInfo latestMarketDataFile = null; + if (marketFiles.Count > 0) { + latestMarketDataFile = marketFiles.OrderByDescending(mdf => mdf.LastWriteTimeUtc).First(); + latestMarketDataFileDateTime = latestMarketDataFile.LastWriteTimeUtc; + } + + if (latestMarketDataFileDateTime < DateTime.Now.ToUniversalTime().AddMinutes(-20)) { + int lastMarketDataAgeInSeconds = (int)Math.Ceiling(DateTime.Now.ToUniversalTime().Subtract(latestMarketDataFileDateTime).TotalSeconds); + + // Go back in time and create market data + DateTime startDateTime = DateTime.Now.ToUniversalTime(); + DateTime endDateTime = DateTime.Now.ToUniversalTime().AddHours(-systemConfiguration.AnalyzerSettings.MarketAnalyzer.StoreDataMaxHours); + if (latestMarketDataFileDateTime != Constants.confMinDate && latestMarketDataFileDateTime > endDateTime) { + // Existing market files too old => Recreate market data for configured timeframe + log.DoLogInfo("Binance - Recreating market data for " + markets.Count + " markets over " + SystemHelper.GetProperDurationTime(lastMarketDataAgeInSeconds) + ". This may take a while..."); + endDateTime = latestMarketDataFileDateTime; + } else { + // No existing market files found => Recreate market data for configured timeframe + log.DoLogInfo("Binance - Recreating market data for " + markets.Count + " markets over " + systemConfiguration.AnalyzerSettings.MarketAnalyzer.StoreDataMaxHours + " hours. This may take a while..."); + } + + int totalTicks = (int)Math.Ceiling(startDateTime.Subtract(endDateTime).TotalMinutes); + + // Get Ticks for main market + List mainMarketTicks = new List(); + if (!mainMarket.Equals("USDT", StringComparison.InvariantCultureIgnoreCase)) { + mainMarketTicks = Binance.GetMarketTicks(mainMarket + "USDT", totalTicks, systemConfiguration, log); + } + + // Get Ticks for all markets + log.DoLogDebug("Binance - Getting ticks for '" + markets.Count + "' markets"); + Dictionary> marketTicks = new Dictionary>(); + foreach (string key in markets.Keys) { + marketTicks.Add(key, Binance.GetMarketTicks(key, totalTicks, systemConfiguration, log)); + + if ((marketTicks.Count % 10) == 0) { + log.DoLogInfo("Binance - No worries, I am still alive... " + marketTicks.Count + "/" + markets.Count + " markets done..."); + } + } + + log.DoLogInfo("Binance - Ticks completed."); + + log.DoLogInfo("Binance - Creating initial market data ticks. This may take another while..."); + + // Go back in time and create market data + int completedTicks = 0; + if (marketTicks.Count > 0) { + for (DateTime tickTime = startDateTime; tickTime >= endDateTime; tickTime = tickTime.AddMinutes(-1)) { + completedTicks++; + + double mainCurrencyPrice = 1; + if (mainMarketTicks.Count > 0) { + List mainCurrencyTickRange = mainMarketTicks.FindAll(t => t.Time <= tickTime); + if (mainCurrencyTickRange.Count > 0) { + MarketTick mainCurrencyTick = mainCurrencyTickRange.OrderByDescending(t => t.Time).First(); + mainCurrencyPrice = mainCurrencyTick.Price; + } + } + + Dictionary tickMarkets = new Dictionary(); + foreach (string key in markets.Keys) { + List tickRange = marketTicks[key].FindAll(t => t.Time <= tickTime); + + if (tickRange.Count > 0) { + MarketTick marketTick = tickRange.OrderByDescending(t => t.Time).First(); + + Market market = new Market(); + market.Position = markets.Count + 1; + market.Name = key; + market.Symbol = key; + market.Price = marketTick.Price; + //market.Volume24h = marketTick.Volume24h; + market.MainCurrencyPriceUSD = mainCurrencyPrice; + + tickMarkets.Add(market.Name, market); + } + } + + DateTime fileDateTime = new DateTime(tickTime.ToLocalTime().Year, tickTime.ToLocalTime().Month, tickTime.ToLocalTime().Day, tickTime.ToLocalTime().Hour, tickTime.ToLocalTime().Minute, 0).ToUniversalTime(); + + FileHelper.WriteTextToFile(Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar + Constants.PTMagicPathData + Path.DirectorySeparatorChar + Constants.PTMagicPathExchange + Path.DirectorySeparatorChar, "MarketData_" + fileDateTime.ToString("yyyy-MM-dd_HH.mm") + ".json", JsonConvert.SerializeObject(tickMarkets), fileDateTime, fileDateTime); + + log.DoLogDebug("Binance - Market data saved for tick " + fileDateTime.ToString() + " - MainCurrencyPrice=" + mainCurrencyPrice.ToString("#,#0.00") + " USD."); + + if ((completedTicks % 100) == 0) { + log.DoLogInfo("Binance - Our magicbots are still at work, hang on... " + completedTicks + "/" + totalTicks + " ticks done..."); + } + } + } + + log.DoLogInfo("Binance - Initial market data created. Ready to go!"); + } + + } + } +} diff --git a/Core/MarketAnalyzer/Bittrex.cs b/Core/MarketAnalyzer/Bittrex.cs new file mode 100644 index 0000000..9ab8489 --- /dev/null +++ b/Core/MarketAnalyzer/Bittrex.cs @@ -0,0 +1,258 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.IO; +using System.Text; +using Core.Main; +using Core.Helper; +using Core.Main.DataObjects.PTMagicData; +using Newtonsoft.Json; +using Core.ProfitTrailer; + +namespace Core.MarketAnalyzer { + public class Bittrex : BaseAnalyzer { + public static double GetMainCurrencyPrice(string mainMarket, PTMagicConfiguration systemConfiguration, LogHelper log) { + double result = 0; + + try { + string baseUrl = "https://bittrex.com/api/v1.1/public/getmarketsummary?market=USDT-" + mainMarket; + + log.DoLogInfo("Bittrex - Getting main market price..."); + Dictionary jsonObject = GetJsonFromURL(baseUrl, log); + if (jsonObject.Count > 0) { + if (jsonObject["success"]) { + log.DoLogInfo("Bittrex - Market data received for USDT-" + mainMarket); + + result = jsonObject["result"][0]["Last"]; + log.DoLogInfo("Bittrex - Current price for USDT-" + mainMarket + ": " + result.ToString("#,#0.00") + " USD"); + } + } + } catch (Exception ex) { + log.DoLogCritical(ex.Message, ex); + } + + return result; + } + + public static List GetMarketData(string mainMarket, Dictionary marketInfos, PTMagicConfiguration systemConfiguration, LogHelper log) { + List result = new List(); + + string lastMarket = ""; + Newtonsoft.Json.Linq.JObject lastTicker = null; + try { + string baseUrl = "https://bittrex.com/api/v2.0/pub/markets/GetMarketSummaries"; + + log.DoLogInfo("Bittrex - Getting market data..."); + Dictionary jsonObject = GetJsonFromURL(baseUrl, log); + if (jsonObject.Count > 0) { + if (jsonObject["success"]) { + log.DoLogInfo("Bittrex - Market data received for " + jsonObject["result"].Count.ToString() + " currencies"); + + double mainCurrencyPrice = 1; + if (!mainMarket.Equals("USDT", StringComparison.InvariantCultureIgnoreCase)) { + mainCurrencyPrice = Bittrex.GetMainCurrencyPrice(mainMarket, systemConfiguration, log); + } + + if (mainCurrencyPrice > 0) { + Dictionary markets = new Dictionary(); + foreach (Newtonsoft.Json.Linq.JObject currencyTicker in jsonObject["result"]) { + string marketName = currencyTicker["Summary"]["MarketName"].ToString(); + if (marketName.StartsWith(mainMarket, StringComparison.InvariantCultureIgnoreCase)) { + + // Set last values in case any error occurs + lastMarket = marketName; + lastTicker = currencyTicker; + + Market market = new Market(); + market.Position = markets.Count + 1; + market.Name = marketName; + market.Symbol = currencyTicker["Summary"]["MarketName"].ToString(); + if (currencyTicker["Summary"]["Last"].Type == Newtonsoft.Json.Linq.JTokenType.Float) market.Price = (double)currencyTicker["Summary"]["Last"]; + if (currencyTicker["Summary"]["BaseVolume"].Type == Newtonsoft.Json.Linq.JTokenType.Float) market.Volume24h = (double)currencyTicker["Summary"]["BaseVolume"]; + market.MainCurrencyPriceUSD = mainCurrencyPrice; + + markets.Add(market.Name, market); + + result.Add(market.Name); + + // Save market info + MarketInfo marketInfo = null; + if (marketInfos.ContainsKey(marketName)) { + marketInfo = marketInfos[marketName]; + } + + if (marketInfo == null) { + marketInfo = new MarketInfo(); + marketInfo.Name = marketName; + marketInfos.Add(marketName, marketInfo); + } + if (currencyTicker["Summary"]["Created"].Type == Newtonsoft.Json.Linq.JTokenType.Date) marketInfo.FirstSeen = (DateTime)currencyTicker["Summary"]["Created"]; + marketInfo.LastSeen = DateTime.Now.ToUniversalTime(); + } + } + + BaseAnalyzer.SaveMarketInfosToFile(marketInfos, systemConfiguration, log); + + Bittrex.CheckForMarketDataRecreation(mainMarket, markets, systemConfiguration, log); + + DateTime fileDateTime = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, DateTime.Now.Hour, DateTime.Now.Minute, 0).ToUniversalTime(); + + FileHelper.WriteTextToFile(Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar + Constants.PTMagicPathData + Path.DirectorySeparatorChar + Constants.PTMagicPathExchange + Path.DirectorySeparatorChar, "MarketData_" + fileDateTime.ToString("yyyy-MM-dd_HH.mm") + ".json", JsonConvert.SerializeObject(markets), fileDateTime, fileDateTime); + + log.DoLogInfo("Bittrex - Market data saved for " + markets.Count.ToString() + " markets with " + mainMarket + "."); + + FileHelper.CleanupFiles(Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar + Constants.PTMagicPathData + Path.DirectorySeparatorChar + Constants.PTMagicPathExchange + Path.DirectorySeparatorChar, systemConfiguration.AnalyzerSettings.MarketAnalyzer.StoreDataMaxHours); + log.DoLogInfo("Bittrex - Market data cleaned."); + } else { + log.DoLogError("Bittrex - Failed to get main market price for " + mainMarket + "."); + result = null; + } + } + } + } catch (Exception ex) { + log.DoLogCritical("Exception while getting data for '" + lastMarket + "': " + ex.Message, ex); + result = null; + } + + return result; + } + + public static List GetMarketTicks(string marketName, PTMagicConfiguration systemConfiguration, LogHelper log) { + List result = new List(); + + try { + string baseUrl = "https://bittrex.com/Api/v2.0/pub/market/GetTicks?tickInterval=oneMin&marketName=" + marketName; + + log.DoLogDebug("Bittrex - Getting ticks for '" + marketName + "'..."); + Dictionary jsonObject = GetJsonFromURL(baseUrl, log); + if (jsonObject.Count > 0) { + if (jsonObject["success"]) { + if (jsonObject["result"] != null) { + log.DoLogDebug("Bittrex - " + jsonObject["result"].Count.ToString() + " ticks received."); + + foreach (var marketTick in jsonObject["result"]) { + + MarketTick tick = new MarketTick(); + tick.Price = (double)marketTick["C"]; + tick.Time = SystemHelper.TextToDateTime(marketTick["T"].ToString(), Constants.confMinDate); + + result.Add(tick); + } + } else { + log.DoLogDebug("Bittrex - No ticks received."); + } + } + } + } catch (Exception ex) { + log.DoLogCritical(ex.Message, ex); + } + + return result; + } + + public static void CheckForMarketDataRecreation(string mainMarket, Dictionary markets, PTMagicConfiguration systemConfiguration, LogHelper log) { + string bittrexDataDirectoryPath = Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar + Constants.PTMagicPathData + Path.DirectorySeparatorChar + Constants.PTMagicPathExchange + Path.DirectorySeparatorChar; + + if (!Directory.Exists(bittrexDataDirectoryPath)) { + Directory.CreateDirectory(bittrexDataDirectoryPath); + } + + DirectoryInfo dataDirectory = new DirectoryInfo(bittrexDataDirectoryPath); + + // Check for existing market files + DateTime latestMarketDataFileDateTime = Constants.confMinDate; + List marketFiles = dataDirectory.EnumerateFiles("MarketData*").ToList(); + FileInfo latestMarketDataFile = null; + if (marketFiles.Count > 0) { + latestMarketDataFile = marketFiles.OrderByDescending(mdf => mdf.LastWriteTimeUtc).First(); + latestMarketDataFileDateTime = latestMarketDataFile.LastWriteTimeUtc; + } + + if (latestMarketDataFileDateTime < DateTime.Now.ToUniversalTime().AddMinutes(-20)) { + int lastMarketDataAgeInSeconds = (int)Math.Ceiling(DateTime.Now.ToUniversalTime().Subtract(latestMarketDataFileDateTime).TotalSeconds); + + // Go back in time and create market data + DateTime startDateTime = DateTime.Now.ToUniversalTime(); + DateTime endDateTime = DateTime.Now.ToUniversalTime().AddHours(-systemConfiguration.AnalyzerSettings.MarketAnalyzer.StoreDataMaxHours); + if (latestMarketDataFileDateTime != Constants.confMinDate && latestMarketDataFileDateTime > endDateTime) { + // Existing market files too old => Recreate market data for configured timeframe + log.DoLogInfo("Bittrex - Recreating market data for " + markets.Count + " markets over " + SystemHelper.GetProperDurationTime(lastMarketDataAgeInSeconds) + ". This may take a while..."); + endDateTime = latestMarketDataFileDateTime; + } else { + // No existing market files found => Recreate market data for configured timeframe + log.DoLogInfo("Bittrex - Recreating market data for " + markets.Count + " markets over " + systemConfiguration.AnalyzerSettings.MarketAnalyzer.StoreDataMaxHours + " hours. This may take a while..."); + } + + // Get Ticks for main market + List mainMarketTicks = new List(); + if (!mainMarket.Equals("USDT", StringComparison.InvariantCultureIgnoreCase)) { + mainMarketTicks = Bittrex.GetMarketTicks("USDT-" + mainMarket, systemConfiguration, log); + } + + // Get Ticks for all markets + log.DoLogDebug("Bittrex - Getting ticks for '" + markets.Count + "' markets"); + Dictionary> marketTicks = new Dictionary>(); + foreach (string key in markets.Keys) { + marketTicks.Add(key, Bittrex.GetMarketTicks(key, systemConfiguration, log)); + + if ((marketTicks.Count % 10) == 0) { + log.DoLogInfo("Bittrex - No worries, I am still alive... " + marketTicks.Count + "/" + markets.Count + " markets done..."); + } + } + + log.DoLogInfo("Bittrex - Ticks completed."); + + log.DoLogInfo("Bittrex - Creating initial market data ticks. This may take another while..."); + + int totalTicks = (int)Math.Ceiling(startDateTime.Subtract(endDateTime).TotalMinutes); + int completedTicks = 0; + if (marketTicks.Count > 0) { + for (DateTime tickTime = startDateTime.ToUniversalTime(); tickTime >= endDateTime.ToUniversalTime(); tickTime = tickTime.AddMinutes(-1)) { + completedTicks++; + + double mainCurrencyPrice = 1; + if (mainMarketTicks.Count > 0) { + List mainCurrencyTickRange = mainMarketTicks.FindAll(t => t.Time <= tickTime); + if (mainCurrencyTickRange.Count > 0) { + MarketTick mainCurrencyTick = mainCurrencyTickRange.OrderByDescending(t => t.Time).First(); + mainCurrencyPrice = mainCurrencyTick.Price; + } + } + + Dictionary tickMarkets = new Dictionary(); + foreach (string key in markets.Keys) { + List tickRange = marketTicks[key].FindAll(t => t.Time <= tickTime); + + if (tickRange.Count > 0) { + MarketTick marketTick = tickRange.OrderByDescending(t => t.Time).First(); + + Market market = new Market(); + market.Position = markets.Count + 1; + market.Name = key; + market.Symbol = key; + market.Price = marketTick.Price; + //market.Volume24h = marketTick.Volume24h; + market.MainCurrencyPriceUSD = mainCurrencyPrice; + + tickMarkets.Add(market.Name, market); + } + } + + DateTime fileDateTime = new DateTime(tickTime.ToLocalTime().Year, tickTime.ToLocalTime().Month, tickTime.ToLocalTime().Day, tickTime.ToLocalTime().Hour, tickTime.ToLocalTime().Minute, 0).ToUniversalTime(); + + FileHelper.WriteTextToFile(Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar + Constants.PTMagicPathData + Path.DirectorySeparatorChar + Constants.PTMagicPathExchange + Path.DirectorySeparatorChar, "MarketData_" + fileDateTime.ToString("yyyy-MM-dd_HH.mm") + ".json", JsonConvert.SerializeObject(tickMarkets), fileDateTime, fileDateTime); + + log.DoLogDebug("Bittrex - Market data saved for tick " + fileDateTime.ToString() + " - MainCurrencyPrice=" + mainCurrencyPrice.ToString("#,#0.00") + " USD."); + + if ((completedTicks % 100) == 0) { + log.DoLogInfo("Bittrex - Our magicbots are still at work, hang on... " + completedTicks + "/" + totalTicks + " ticks done..."); + } + } + } + + log.DoLogInfo("Bittrex - Initial market data created. Ready to go!"); + } + + } + } +} diff --git a/Core/MarketAnalyzer/CoinMarketCap.cs b/Core/MarketAnalyzer/CoinMarketCap.cs new file mode 100644 index 0000000..ab36840 --- /dev/null +++ b/Core/MarketAnalyzer/CoinMarketCap.cs @@ -0,0 +1,130 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using Core.Main; +using Core.Helper; +using Core.Main.DataObjects.PTMagicData; +using Newtonsoft.Json; + +namespace Core.MarketAnalyzer { + public class CoinMarketCap : BaseAnalyzer { + public static string GetMarketData(PTMagicConfiguration systemConfiguration, LogHelper log) { + string result = ""; + try { + string baseUrl = "https://api.coinmarketcap.com/v2/ticker/"; + + log.DoLogInfo("CoinMarketCap - Getting market data..."); + + Dictionary jsonObject = GetJsonFromURL(baseUrl, log); + if (jsonObject.Count > 0) { + if (jsonObject["data"] != null) { + Newtonsoft.Json.Linq.JObject jsonDataObject = (Newtonsoft.Json.Linq.JObject)jsonObject["data"]; + log.DoLogInfo("CoinMarketCap - Market data received for " + jsonDataObject.Count.ToString() + " currencies"); + + Dictionary markets = new Dictionary(); + foreach (Newtonsoft.Json.Linq.JToken currencyTicker in jsonDataObject.Children()) { + + if (currencyTicker.First["quotes"] != null) { + + if (currencyTicker.First["quotes"]["USD"] != null) { + Market market = new Market(); + market.Position = markets.Count + 1; + market.Name = currencyTicker.First["name"].ToString(); + market.Symbol = currencyTicker.First["symbol"].ToString(); + market.Price = (double)currencyTicker.First["quotes"]["USD"]["price"]; + market.Volume24h = (double)currencyTicker.First["quotes"]["USD"]["volume_24h"]; + if (currencyTicker.First["quotes"]["USD"]["percent_change_24h"] != null) { + market.TrendChange24h = (double)currencyTicker.First["quotes"]["USD"]["percent_change_24h"]; + } + + markets.Add(market.Name, market); + } + } + } + + CoinMarketCap.CheckForMarketDataRecreation(markets, systemConfiguration, log); + + DateTime fileDateTime = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, DateTime.Now.Hour, DateTime.Now.Minute, 0).ToUniversalTime(); + + FileHelper.WriteTextToFile(Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar + Constants.PTMagicPathData + Path.DirectorySeparatorChar + Constants.PTMagicPathCoinMarketCap + Path.DirectorySeparatorChar, "MarketData_" + fileDateTime.ToString("yyyy-MM-dd_HH.mm") + ".json", JsonConvert.SerializeObject(markets), fileDateTime, fileDateTime); + + + log.DoLogInfo("CoinMarketCap - Market data saved."); + + FileHelper.CleanupFiles(Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar + Constants.PTMagicPathData + Path.DirectorySeparatorChar + Constants.PTMagicPathCoinMarketCap + Path.DirectorySeparatorChar, systemConfiguration.AnalyzerSettings.MarketAnalyzer.StoreDataMaxHours); + log.DoLogInfo("CoinMarketCap - Market data cleaned."); + } + } + } catch (Exception ex) { + log.DoLogCritical(ex.Message, ex); + result = ex.Message; + } + + return result; + } + + public static void CheckForMarketDataRecreation(Dictionary markets, PTMagicConfiguration systemConfiguration, LogHelper log) { + string coinMarketCapDataDirectoryPath = Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar + Constants.PTMagicPathData + Path.DirectorySeparatorChar + Constants.PTMagicPathCoinMarketCap + Path.DirectorySeparatorChar; + + if (!Directory.Exists(coinMarketCapDataDirectoryPath)) { + Directory.CreateDirectory(coinMarketCapDataDirectoryPath); + } + + DirectoryInfo dataDirectory = new DirectoryInfo(Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar + Constants.PTMagicPathData + Path.DirectorySeparatorChar + Constants.PTMagicPathCoinMarketCap + Path.DirectorySeparatorChar); + + List marketFiles = dataDirectory.EnumerateFiles("MarketData*") + .Select(x => { x.Refresh(); return x; }) + .Where(x => x.LastWriteTimeUtc <= DateTime.Now.AddHours(-24)) + .ToArray().OrderByDescending(f => f.LastWriteTimeUtc).ToList(); + + bool build24hMarketDataFile = false; + FileInfo marketFile = null; + if (marketFiles.Count > 0) { + marketFile = marketFiles.First(); + if (marketFile.LastWriteTimeUtc <= DateTime.Now.AddHours(-24).AddMinutes(-systemConfiguration.AnalyzerSettings.MarketAnalyzer.IntervalMinutes).AddSeconds(-10)) { + log.DoLogDebug("CoinMarketCap - 24h market data file too old (" + marketFile.LastWriteTimeUtc.ToString() + "). Rebuilding data..."); + build24hMarketDataFile = true; + } + } else { + marketFiles = dataDirectory.EnumerateFiles("MarketData*") + .Select(x => { x.Refresh(); return x; }) + .Where(x => x.LastWriteTimeUtc >= DateTime.Now.AddHours(-24)) + .ToArray().OrderBy(f => f.LastWriteTimeUtc).ToList(); + + if (marketFiles.Count > 0) { + marketFile = marketFiles.First(); + if (marketFile.LastWriteTimeUtc >= DateTime.Now.AddHours(-24).AddMinutes(systemConfiguration.AnalyzerSettings.MarketAnalyzer.IntervalMinutes).AddSeconds(10)) { + log.DoLogDebug("CoinMarketCap - 24h market data file too young (" + marketFile.LastWriteTimeUtc.ToString() + "). Rebuilding data..."); + build24hMarketDataFile = true; + } + } else { + log.DoLogDebug("CoinMarketCap - 24h market data not found. Rebuilding data..."); + build24hMarketDataFile = true; + } + } + + if (build24hMarketDataFile) { + Dictionary markets24h = new Dictionary(); + foreach (string key in markets.Keys) { + Market market24h = new Market(); + market24h.Position = markets.Count + 1; + market24h.Name = markets[key].Name; + market24h.Symbol = markets[key].Symbol; + market24h.Price = markets[key].Price / (1 + (markets[key].TrendChange24h / 100)); + market24h.Volume24h = markets[key].Volume24h; + + markets24h.Add(markets[key].Name, market24h); + } + + DateTime fileDateTime = new DateTime(DateTime.Now.ToLocalTime().AddHours(-24).Year, DateTime.Now.ToLocalTime().AddHours(-24).Month, DateTime.Now.ToLocalTime().AddHours(-24).Day, DateTime.Now.ToLocalTime().AddHours(-24).Hour, DateTime.Now.ToLocalTime().AddHours(-24).Minute, 0).ToUniversalTime(); + + FileHelper.WriteTextToFile(Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar + Constants.PTMagicPathData + Path.DirectorySeparatorChar + Constants.PTMagicPathCoinMarketCap + Path.DirectorySeparatorChar, "MarketData_" + fileDateTime.ToString("yyyy-MM-dd_HH.mm") + ".json", JsonConvert.SerializeObject(markets24h), fileDateTime, fileDateTime); + + + log.DoLogInfo("CoinMarketCap - 24h market data rebuilt."); + } + } + } +} diff --git a/Core/MarketAnalyzer/Poloniex.cs b/Core/MarketAnalyzer/Poloniex.cs new file mode 100644 index 0000000..d790941 --- /dev/null +++ b/Core/MarketAnalyzer/Poloniex.cs @@ -0,0 +1,291 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.IO; +using System.Text; +using Core.Main; +using Core.Helper; +using Core.Main.DataObjects.PTMagicData; +using Newtonsoft.Json; +using Core.ProfitTrailer; + +namespace Core.MarketAnalyzer { + public class Poloniex : BaseAnalyzer { + public static double GetMainCurrencyPrice(string mainMarket, PTMagicConfiguration systemConfiguration, LogHelper log) { + double result = 0; + + try { + string baseUrl = "https://bittrex.com/api/v1.1/public/getmarketsummary?market=USDT-" + mainMarket; + + log.DoLogInfo("Poloniex - Getting main market price..."); + Dictionary jsonObject = GetJsonFromURL(baseUrl, log); + if (jsonObject.Count > 0) { + if (jsonObject["success"]) { + log.DoLogInfo("Poloniex - Market data received for USDT_" + mainMarket); + + result = jsonObject["result"][0]["Last"]; + log.DoLogInfo("Poloniex - Current price for USDT_" + mainMarket + ": " + result.ToString("#,#0.00") + " USD"); + } + } + } catch (Exception ex) { + log.DoLogCritical(ex.Message, ex); + } + + return result; + } + + public static List GetMarketData(string mainMarket, Dictionary marketInfos, PTMagicConfiguration systemConfiguration, LogHelper log) { + List result = new List(); + + string lastMarket = ""; + KeyValuePair lastTicker = new KeyValuePair(); + try { + string baseUrl = "https://poloniex.com/public?command=returnTicker"; + + log.DoLogInfo("Poloniex - Getting market data..."); + Dictionary jsonObject = GetJsonFromURL(baseUrl, log); + if (jsonObject.Count > 0) { + log.DoLogInfo("Poloniex - Market data received for " + jsonObject.Count.ToString() + " currencies"); + + double mainCurrencyPrice = 1; + if (!mainMarket.Equals("USDT", StringComparison.InvariantCultureIgnoreCase)) { + mainCurrencyPrice = Poloniex.GetMainCurrencyPrice(mainMarket, systemConfiguration, log); + } + + if (mainCurrencyPrice > 0) { + Dictionary markets = new Dictionary(); + foreach (KeyValuePair currencyTicker in jsonObject) { + string marketName = currencyTicker.Key.ToString(); + if (marketName.StartsWith(mainMarket, StringComparison.InvariantCultureIgnoreCase)) { + + // Set last values in case any error occurs + lastMarket = marketName; + lastTicker = currencyTicker; + + Market market = new Market(); + market.Position = markets.Count + 1; + market.Name = marketName; + market.Symbol = currencyTicker.Key.ToString(); + market.Price = SystemHelper.TextToDouble(currencyTicker.Value["last"].ToString(), 0.0, "en-US"); + market.Volume24h = SystemHelper.TextToDouble(currencyTicker.Value["baseVolume"].ToString(), 0.0, "en-US"); + market.MainCurrencyPriceUSD = mainCurrencyPrice; + + markets.Add(market.Name, market); + + result.Add(market.Name); + } + } + + Poloniex.CheckFirstSeenDates(markets, ref marketInfos, systemConfiguration, log); + + BaseAnalyzer.SaveMarketInfosToFile(marketInfos, systemConfiguration, log); + + Poloniex.CheckForMarketDataRecreation(mainMarket, markets, systemConfiguration, log); + + DateTime fileDateTime = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, DateTime.Now.Hour, DateTime.Now.Minute, 0).ToUniversalTime(); + + FileHelper.WriteTextToFile(Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar + Constants.PTMagicPathData + Path.DirectorySeparatorChar + Constants.PTMagicPathExchange + Path.DirectorySeparatorChar, "MarketData_" + fileDateTime.ToString("yyyy-MM-dd_HH.mm") + ".json", JsonConvert.SerializeObject(markets), fileDateTime, fileDateTime); + + + log.DoLogInfo("Poloniex - Market data saved for " + markets.Count.ToString() + " markets with " + mainMarket + "."); + + FileHelper.CleanupFiles(Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar + Constants.PTMagicPathData + Path.DirectorySeparatorChar + Constants.PTMagicPathExchange + Path.DirectorySeparatorChar, systemConfiguration.AnalyzerSettings.MarketAnalyzer.StoreDataMaxHours); + log.DoLogInfo("Poloniex - Market data cleaned."); + } else { + log.DoLogError("Poloniex - Failed to get main market price for " + mainMarket + "."); + result = null; + } + } + } catch (Exception ex) { + log.DoLogCritical("Exception while getting data for '" + lastMarket + "': " + ex.Message, ex); + result = null; + } + + return result; + } + + public static void CheckFirstSeenDates(Dictionary markets, ref Dictionary marketInfos, PTMagicConfiguration systemConfiguration, LogHelper log) { + log.DoLogInfo("Poloniex - Checking first seen dates for " + markets.Count + " markets. This may take a while..."); + + int marketsChecked = 0; + foreach (string key in markets.Keys) { + // Save market info + MarketInfo marketInfo = null; + if (marketInfos.ContainsKey(key)) { + marketInfo = marketInfos[key]; + } + if (marketInfo == null) { + marketInfo = new MarketInfo(); + marketInfo.Name = key; + marketInfos.Add(key, marketInfo); + marketInfo.FirstSeen = Poloniex.GetFirstSeenDate(key, systemConfiguration, log); + } else { + if (marketInfo.FirstSeen == Constants.confMinDate) { + marketInfo.FirstSeen = Poloniex.GetFirstSeenDate(key, systemConfiguration, log); + } + } + marketInfo.LastSeen = DateTime.Now.ToUniversalTime(); + + marketsChecked++; + + if ((marketsChecked % 20) == 0) { + log.DoLogInfo("Poloniex - Yes, I am still checking first seen dates... " + marketsChecked + "/" + markets.Count + " markets done..."); + } + } + } + + public static DateTime GetFirstSeenDate(string marketName, PTMagicConfiguration systemConfiguration, LogHelper log) { + DateTime result = Constants.confMinDate; + + Int64 startTime = (Int64)Math.Ceiling(DateTime.Now.ToUniversalTime().AddDays(-100).Subtract(Constants.Epoch).TotalSeconds); + string baseUrl = "https://poloniex.com/public?command=returnChartData&period=14400&start=" + startTime.ToString() + "&end=9999999999¤cyPair=" + marketName; + + log.DoLogDebug("Poloniex - Getting first seen date for '" + marketName + "'..."); + + List jsonObject = GetSimpleJsonListFromURL(baseUrl, log); + if (jsonObject.Count > 0) { + var marketTick = jsonObject[0]; + + result = Constants.Epoch.AddSeconds((int)marketTick["date"]); + log.DoLogDebug("Poloniex - First seen date for '" + marketName + "' set to " + result.ToString()); + } + + return result; + } + + public static List GetMarketTicks(string marketName, PTMagicConfiguration systemConfiguration, LogHelper log) { + List result = new List(); + + try { + Int64 startTime = (Int64)Math.Ceiling(DateTime.Now.ToUniversalTime().AddHours(-systemConfiguration.AnalyzerSettings.MarketAnalyzer.StoreDataMaxHours).Subtract(Constants.Epoch).TotalSeconds); + string baseUrl = "https://poloniex.com/public?command=returnChartData&period=300&start=" + startTime.ToString() + "&end=9999999999¤cyPair=" + marketName; + + log.DoLogDebug("Poloniex - Getting ticks for '" + marketName + "'..."); + List jsonObject = GetSimpleJsonListFromURL(baseUrl, log); + if (jsonObject.Count > 0) { + log.DoLogDebug("Poloniex - " + jsonObject.Count.ToString() + " ticks received."); + + foreach (var marketTick in jsonObject) { + + MarketTick tick = new MarketTick(); + tick.Price = (double)marketTick["close"]; + tick.Time = Constants.Epoch.AddSeconds((int)marketTick["date"]); + + result.Add(tick); + } + } + } catch (Exception ex) { + log.DoLogCritical(ex.Message, ex); + } + + return result; + } + + public static void CheckForMarketDataRecreation(string mainMarket, Dictionary markets, PTMagicConfiguration systemConfiguration, LogHelper log) { + string poloniexDataDirectoryPath = Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar + Constants.PTMagicPathData + Path.DirectorySeparatorChar + Constants.PTMagicPathExchange + Path.DirectorySeparatorChar; + + if (!Directory.Exists(poloniexDataDirectoryPath)) { + Directory.CreateDirectory(poloniexDataDirectoryPath); + } + + DirectoryInfo dataDirectory = new DirectoryInfo(poloniexDataDirectoryPath); + + // Check for existing market files + DateTime latestMarketDataFileDateTime = Constants.confMinDate; + List marketFiles = dataDirectory.EnumerateFiles("MarketData*").ToList(); + FileInfo latestMarketDataFile = null; + if (marketFiles.Count > 0) { + latestMarketDataFile = marketFiles.OrderByDescending(mdf => mdf.LastWriteTimeUtc).First(); + latestMarketDataFileDateTime = latestMarketDataFile.LastWriteTimeUtc; + } + + if (latestMarketDataFileDateTime < DateTime.Now.ToUniversalTime().AddMinutes(-(systemConfiguration.AnalyzerSettings.MarketAnalyzer.IntervalMinutes * 3))) { + int lastMarketDataAgeInSeconds = (int)Math.Ceiling(DateTime.Now.ToUniversalTime().Subtract(latestMarketDataFileDateTime).TotalSeconds); + + // Go back in time and create market data + DateTime startDateTime = DateTime.Now.ToUniversalTime(); + DateTime endDateTime = DateTime.Now.ToUniversalTime().AddHours(-systemConfiguration.AnalyzerSettings.MarketAnalyzer.StoreDataMaxHours); + if (latestMarketDataFileDateTime != Constants.confMinDate && latestMarketDataFileDateTime > endDateTime) { + // Existing market files too old => Recreate market data for configured timeframe + log.DoLogInfo("Poloniex - Recreating market data for " + markets.Count + " markets over " + SystemHelper.GetProperDurationTime(lastMarketDataAgeInSeconds) + ". This may take a while..."); + endDateTime = latestMarketDataFileDateTime; + } else { + // No existing market files found => Recreate market data for configured timeframe + log.DoLogInfo("Poloniex - Recreating market data for " + markets.Count + " markets over " + systemConfiguration.AnalyzerSettings.MarketAnalyzer.StoreDataMaxHours + " hours. This may take a while..."); + } + + // Get Ticks for main market + List mainMarketTicks = new List(); + if (!mainMarket.Equals("USDT", StringComparison.InvariantCultureIgnoreCase)) { + mainMarketTicks = Poloniex.GetMarketTicks("USDT_" + mainMarket, systemConfiguration, log); + } + + // Get Ticks for all markets + log.DoLogDebug("Poloniex - Getting ticks for '" + markets.Count + "' markets"); + Dictionary> marketTicks = new Dictionary>(); + foreach (string key in markets.Keys) { + marketTicks.Add(key, Poloniex.GetMarketTicks(key, systemConfiguration, log)); + + if ((marketTicks.Count % 10) == 0) { + log.DoLogInfo("Poloniex - No worries, I am still alive... " + marketTicks.Count + "/" + markets.Count + " markets done..."); + } + } + + log.DoLogInfo("Poloniex - Ticks completed."); + + log.DoLogInfo("Poloniex - Creating initial market data ticks. This may take another while..."); + + // Go back in time and create market data + int totalTicks = (int)Math.Ceiling(startDateTime.Subtract(endDateTime).TotalMinutes); + int completedTicks = 0; + if (marketTicks.Count > 0) { + for (DateTime tickTime = startDateTime; tickTime >= endDateTime; tickTime = tickTime.AddMinutes(-5)) { + completedTicks++; + + double mainCurrencyPrice = 1; + if (mainMarketTicks.Count > 0) { + List mainCurrencyTickRange = mainMarketTicks.FindAll(t => t.Time <= tickTime); + if (mainCurrencyTickRange.Count > 0) { + MarketTick mainCurrencyTick = mainCurrencyTickRange.OrderByDescending(t => t.Time).First(); + mainCurrencyPrice = mainCurrencyTick.Price; + } + } + + Dictionary tickMarkets = new Dictionary(); + foreach (string key in markets.Keys) { + List tickRange = marketTicks[key].FindAll(t => t.Time <= tickTime); + + if (tickRange.Count > 0) { + MarketTick marketTick = tickRange.OrderByDescending(t => t.Time).First(); + + Market market = new Market(); + market.Position = markets.Count + 1; + market.Name = key; + market.Symbol = key; + market.Price = marketTick.Price; + //market.Volume24h = marketTick.Volume24h; + market.MainCurrencyPriceUSD = mainCurrencyPrice; + + tickMarkets.Add(market.Name, market); + } + } + + DateTime fileDateTime = new DateTime(tickTime.ToLocalTime().Year, tickTime.ToLocalTime().Month, tickTime.ToLocalTime().Day, tickTime.ToLocalTime().Hour, tickTime.ToLocalTime().Minute, 0).ToUniversalTime(); + + FileHelper.WriteTextToFile(Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar + Constants.PTMagicPathData + Path.DirectorySeparatorChar + Constants.PTMagicPathExchange + Path.DirectorySeparatorChar, "MarketData_" + fileDateTime.ToString("yyyy-MM-dd_HH.mm") + ".json", JsonConvert.SerializeObject(tickMarkets), fileDateTime, fileDateTime); + + + log.DoLogDebug("Poloniex - Market data saved for tick " + tickTime.ToLocalTime().ToString() + " - MainCurrencyPrice=" + mainCurrencyPrice.ToString("#,#0.00") + " USD."); + + if ((completedTicks % 100) == 0) { + log.DoLogInfo("Poloniex - Our magicbots are still at work, hang on... " + completedTicks + "/" + totalTicks + " ticks done..."); + } + } + } + + log.DoLogInfo("Poloniex - Initial market data created. Ready to go!"); + } + + } + } +} diff --git a/Core/ProfitTrailer/SettingsAPI.cs b/Core/ProfitTrailer/SettingsAPI.cs new file mode 100644 index 0000000..ed3f33c --- /dev/null +++ b/Core/ProfitTrailer/SettingsAPI.cs @@ -0,0 +1,154 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.IO; +using System.Net; +using System.Net.Security; +using System.Security.Cryptography.X509Certificates; +using System.Net.Http; +using System.Text; +using System.Threading.Tasks; +using Core.Main; +using Core.Helper; +using Core.Main.DataObjects.PTMagicData; +using Newtonsoft.Json; + +namespace Core.ProfitTrailer { + public static class SettingsAPI { + public static List GetPropertyLinesFromAPI(string ptFileName, PTMagicConfiguration systemConfiguration, LogHelper log) { + List result = null; + + try { + ServicePointManager.Expect100Continue = true; + ServicePointManager.DefaultConnectionLimit = 9999; + ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; + ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(CertificateHelper.AllwaysGoodCertificate); + + HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(systemConfiguration.GeneralSettings.Application.ProfitTrailerMonitorURL + "settingsapi/settings/load"); + httpWebRequest.ContentType = "application/x-www-form-urlencoded"; + httpWebRequest.Method = "POST"; + + // PT is using ordinary POST data, not JSON + string query = "fileName=" + ptFileName + "&configName=" + systemConfiguration.GeneralSettings.Application.ProfitTrailerDefaultSettingName + "&license=" + systemConfiguration.GeneralSettings.Application.ProfitTrailerLicense; + byte[] formData = Encoding.ASCII.GetBytes(query); + httpWebRequest.ContentLength = formData.Length; + + using (Stream stream = httpWebRequest.GetRequestStream()) { + stream.Write(formData, 0, formData.Length); + } + + //using (StreamWriter streamWriter = new StreamWriter(httpWebRequest.GetRequestStream())) { + // string json = JsonConvert.SerializeObject(new { + // fileName = ptFileName, + // configName = systemConfiguration.GeneralSettings.Application.ProfitTrailerDefaultSettingName, + // license = systemConfiguration.GeneralSettings.Application.ProfitTrailerLicense + // }); + + // streamWriter.Write(json); + //} + + HttpWebResponse httpResponse = (HttpWebResponse)httpWebRequest.GetResponse(); + using (StreamReader streamReader = new StreamReader(httpResponse.GetResponseStream())) { + string jsonResult = streamReader.ReadToEnd(); + result = JsonConvert.DeserializeObject>(jsonResult); + } + } catch (WebException ex) { + // Manual error handling as PT doesn't seem to provide a proper error response... + if (ex.Message.IndexOf("401") > -1) { + log.DoLogError("Loading " + ptFileName + ".properties failed for setting '" + systemConfiguration.GeneralSettings.Application.ProfitTrailerDefaultSettingName + "': Unauthorized! The specified Profit Trailer license key '" + systemConfiguration.GetProfitTrailerLicenseKeyMasked() + "' is invalid!"); + } else { + log.DoLogCritical("Loading " + ptFileName + ".properties failed for setting '" + systemConfiguration.GeneralSettings.Application.ProfitTrailerDefaultSettingName + "': " + ex.Message, ex); + } + + } catch (Exception ex) { + log.DoLogCritical("Loading " + ptFileName + ".properties failed for setting '" + systemConfiguration.GeneralSettings.Application.ProfitTrailerDefaultSettingName + "': " + ex.Message, ex); + } + + return result; + } + + public static void SendPropertyLinesToAPI(string ptFileName, List lines, PTMagicConfiguration systemConfiguration, LogHelper log) { + int retryCount = 0; + int maxRetries = 3; + bool transferCompleted = false; + bool transferCanceled = false; + + while (!transferCompleted && !transferCanceled) { + try { + ServicePointManager.Expect100Continue = true; + ServicePointManager.DefaultConnectionLimit = 9999; + ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; + ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(CertificateHelper.AllwaysGoodCertificate); + + HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(systemConfiguration.GeneralSettings.Application.ProfitTrailerMonitorURL + "settingsapi/settings/save"); + httpWebRequest.ContentType = "application/x-www-form-urlencoded"; + httpWebRequest.Method = "POST"; + httpWebRequest.Proxy = null; + httpWebRequest.Timeout = 30000; + + // PT is using ordinary POST data, not JSON + string query = "fileName=" + ptFileName + "&configName=" + systemConfiguration.GeneralSettings.Application.ProfitTrailerDefaultSettingName + "&license=" + systemConfiguration.GeneralSettings.Application.ProfitTrailerLicense; + string propertiesString = SystemHelper.ConvertListToTokenString(lines, Environment.NewLine, false); + query += "&saveData=" + WebUtility.UrlEncode(propertiesString); + + byte[] formData = Encoding.ASCII.GetBytes(query); + httpWebRequest.ContentLength = formData.Length; + + using (Stream stream = httpWebRequest.GetRequestStream()) { + stream.Write(formData, 0, formData.Length); + } + log.DoLogDebug("Built POST request for " + ptFileName + ".properties."); + + //using (StreamWriter streamWriter = new StreamWriter(httpWebRequest.GetRequestStream())) { + // string json = JsonConvert.SerializeObject(new { + // fileName = ptFileName, + // configName = systemConfiguration.GeneralSettings.Application.ProfitTrailerDefaultSettingName, + // license = systemConfiguration.GeneralSettings.Application.ProfitTrailerLicense, + // saveData = propertiesString + // }); + + // streamWriter.Write(json); + //} + + log.DoLogInfo("Sending " + ptFileName + ".properties..."); + HttpWebResponse httpResponse = (HttpWebResponse)httpWebRequest.GetResponse(); + log.DoLogInfo(ptFileName + ".properties sent!"); + httpResponse.Close(); + log.DoLogDebug(ptFileName + ".properties response object closed."); + transferCompleted = true; + + } catch (WebException ex) { + // Manual error handling as PT doesn't seem to provide a proper error response... + if (ex.Message.IndexOf("401") > -1) { + log.DoLogError("Saving " + ptFileName + ".properties failed for setting '" + systemConfiguration.GeneralSettings.Application.ProfitTrailerDefaultSettingName + "': Unauthorized! The specified Profit Trailer license key '" + systemConfiguration.GetProfitTrailerLicenseKeyMasked() + "' is invalid!"); + transferCanceled = true; + } else if (ex.Message.IndexOf("timed out") > -1) { + // Handle timeout seperately + retryCount++; + if (retryCount <= maxRetries) { + log.DoLogError("Saving " + ptFileName + ".properties failed for setting '" + systemConfiguration.GeneralSettings.Application.ProfitTrailerDefaultSettingName + "': Timeout! Starting retry number " + retryCount + "/" + maxRetries.ToString() + "!"); + } else { + transferCanceled = true; + log.DoLogError("Saving " + ptFileName + ".properties failed for setting '" + systemConfiguration.GeneralSettings.Application.ProfitTrailerDefaultSettingName + "': Timeout! Canceling transfer after " + maxRetries.ToString() + " failed retries."); + } + } else { + log.DoLogCritical("Saving " + ptFileName + ".properties failed for setting '" + systemConfiguration.GeneralSettings.Application.ProfitTrailerDefaultSettingName + "': " + ex.Message, ex); + transferCanceled = true; + } + + } catch (TimeoutException ex) { + retryCount++; + if (retryCount <= maxRetries) { + log.DoLogError("Saving " + ptFileName + ".properties failed for setting '" + systemConfiguration.GeneralSettings.Application.ProfitTrailerDefaultSettingName + "': Timeout (" + ex.Message + ")! Starting retry number " + retryCount + "/" + maxRetries.ToString() + "!"); + } else { + transferCanceled = true; + log.DoLogError("Saving " + ptFileName + ".properties failed for setting '" + systemConfiguration.GeneralSettings.Application.ProfitTrailerDefaultSettingName + "': Timeout (" + ex.Message + ")! Canceling transfer after " + maxRetries.ToString() + " failed retries."); + } + } catch (Exception ex) { + log.DoLogCritical("Saving " + ptFileName + ".properties failed for setting '" + systemConfiguration.GeneralSettings.Application.ProfitTrailerDefaultSettingName + "': " + ex.Message, ex); + transferCanceled = true; + } + } + } + } +} \ No newline at end of file diff --git a/Core/ProfitTrailer/SettingsFiles.cs b/Core/ProfitTrailer/SettingsFiles.cs new file mode 100644 index 0000000..ba0e751 --- /dev/null +++ b/Core/ProfitTrailer/SettingsFiles.cs @@ -0,0 +1,184 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.IO; +using System.Net; +using System.Net.Security; +using System.Security.Cryptography.X509Certificates; +using System.Net.Http; +using System.Text; +using System.Threading.Tasks; +using Core.Main; +using Core.Helper; +using Core.Main.DataObjects.PTMagicData; +using Newtonsoft.Json; + +namespace Core.ProfitTrailer { + public static class SettingsFiles { + public static string GetActiveSetting(PTMagicConfiguration systemConfiguration, string pairsFileName, string dcaFileName, string indicatorsFileName, LogHelper log) { + string pairsPropertiesPath = systemConfiguration.GeneralSettings.Application.ProfitTrailerPath + Constants.PTPathTrading + Path.DirectorySeparatorChar + pairsFileName; + + string result = SettingsFiles.GetActiveSettingFromFile(pairsPropertiesPath, systemConfiguration, log); + + if (result.Equals("")) { + SettingsFiles.WriteHeaderLines(pairsPropertiesPath, "Default", systemConfiguration); + + string dcaPropertiesPath = systemConfiguration.GeneralSettings.Application.ProfitTrailerPath + Constants.PTPathTrading + Path.DirectorySeparatorChar + dcaFileName; + SettingsFiles.WriteHeaderLines(dcaPropertiesPath, "Default", systemConfiguration); + + string inditactorsPropertiesPath = systemConfiguration.GeneralSettings.Application.ProfitTrailerPath + Constants.PTPathTrading + Path.DirectorySeparatorChar + indicatorsFileName; + SettingsFiles.WriteHeaderLines(inditactorsPropertiesPath, "Default", systemConfiguration); + } + + + return result; + } + + public static void WriteHeaderLines(string filePath, string settingName, PTMagicConfiguration systemConfiguration) { + // Writing Header lines + List lines = File.ReadAllLines(filePath).ToList(); + lines.Insert(0, ""); + lines.Insert(0, "# ####################################"); + lines.Insert(0, "# PTMagic_LastChanged = " + DateTime.Now.ToShortDateString() + " " + DateTime.Now.ToShortTimeString()); + lines.Insert(0, "# PTMagic_ActiveSetting = " + SystemHelper.StripBadCode(settingName, Constants.WhiteListProperties)); + lines.Insert(0, "# ####### PTMagic Current Setting ########"); + lines.Insert(0, "# ####################################"); + + if (!systemConfiguration.GeneralSettings.Application.TestMode) File.WriteAllLines(filePath, lines); + } + + public static string GetActiveSettingFromFile(string filePath, PTMagicConfiguration systemConfiguration, LogHelper log) { + string result = ""; + + if (File.Exists(filePath)) { + StreamReader sr = new StreamReader(filePath); + try { + string line = sr.ReadLine(); + while (line != null) { + if (line.IndexOf("PTMagic_ActiveSetting", StringComparison.InvariantCultureIgnoreCase) > -1) { + result = line.Replace("PTMagic_ActiveSetting", "", StringComparison.InvariantCultureIgnoreCase); + result = result.Replace("#", ""); + result = result.Replace("=", "").Trim(); + result = SystemHelper.StripBadCode(result, Constants.WhiteListProperties); + break; + } + line = sr.ReadLine(); + } + } catch { } finally { + sr.Close(); + } + } + + return result; + } + + + public static List GetPresetFileLinesAsList(string settingName, string fileName, PTMagicConfiguration systemConfiguration) { + return SettingsFiles.GetPresetFileLinesAsList(Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar, settingName, fileName, systemConfiguration); + } + + public static List GetPresetFileLinesAsList(string baseFolderPath, string settingName, string fileName, PTMagicConfiguration systemConfiguration) { + fileName = fileName.Replace(".PROPERTIES", ".properties"); + string settingPropertiesPath = baseFolderPath + Constants.PTMagicPathPresets + Path.DirectorySeparatorChar + settingName + Path.DirectorySeparatorChar + fileName; + + List result = new List(); + if (File.Exists(settingPropertiesPath)) { + result = File.ReadAllLines(settingPropertiesPath).ToList(); + } + + return result; + } + + public static bool CheckPresets(PTMagicConfiguration systemConfiguration, LogHelper log, bool forceCheck) { + if (!forceCheck) { + + // If the check is not enforced, check for file changes + string[] presetFilePaths = Directory.GetFiles(Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar + Constants.PTMagicPathPresets, "*.*", SearchOption.AllDirectories); + foreach (string presetFilePath in presetFilePaths) { + if (presetFilePath.IndexOf(".properties", StringComparison.InvariantCultureIgnoreCase) > -1) { + FileInfo presetFile = new FileInfo(presetFilePath); + if (presetFile.LastWriteTime > DateTime.Now.AddMinutes(-systemConfiguration.AnalyzerSettings.MarketAnalyzer.IntervalMinutes).AddSeconds(2)) { + + // File has changed recently, force preparation check + log.DoLogInfo("Preset files changed, enforcing preparation check..."); + forceCheck = true; + break; + } + } + } + } + + + if (forceCheck) { + log.DoLogInfo("Checking automated settings for presets..."); + foreach (GlobalSetting setting in systemConfiguration.AnalyzerSettings.GlobalSettings) { + if (setting.PairsProperties != null) { + if (setting.PairsProperties.ContainsKey("File")) { + setting.PairsProperties["File"] = SystemHelper.PropertyToString(setting.PairsProperties["File"]).Replace(".PROPERTIES", ".properties"); + + // Check preset PAIRS.PROPERTIES for header lines + string settingPairsPropertiesPath = Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar + Constants.PTMagicPathPresets + Path.DirectorySeparatorChar + setting.SettingName + Path.DirectorySeparatorChar + setting.PairsProperties["File"]; + string headerPairsSetting = SettingsFiles.GetActiveSettingFromFile(settingPairsPropertiesPath, systemConfiguration, log); + if (headerPairsSetting.Equals("")) { + if (File.Exists(settingPairsPropertiesPath)) { + SettingsFiles.WriteHeaderLines(settingPairsPropertiesPath, setting.SettingName, systemConfiguration); + } else { + Exception ex = new Exception("Not able to find preset file " + SystemHelper.PropertyToString(setting.PairsProperties["File"]) + " for '" + setting.SettingName + "'"); + log.DoLogCritical("Not able to find preset file " + SystemHelper.PropertyToString(setting.PairsProperties["File"]) + " for '" + setting.SettingName + "'", ex); + throw ex; + } + + } + + log.DoLogInfo("Prepared " + SystemHelper.PropertyToString(setting.PairsProperties["File"]) + " for '" + setting.SettingName + "'"); + } + } + + if (setting.DCAProperties != null) { + if (setting.DCAProperties.ContainsKey("File")) { + setting.DCAProperties["File"] = SystemHelper.PropertyToString(setting.DCAProperties["File"]).Replace(".PROPERTIES", ".properties"); + + // Check preset DCA.PROPERTIES for header lines + string settingDCAPropertiesPath = Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar + Constants.PTMagicPathPresets + Path.DirectorySeparatorChar + setting.SettingName + Path.DirectorySeparatorChar + setting.DCAProperties["File"]; + string headerDCASetting = SettingsFiles.GetActiveSettingFromFile(settingDCAPropertiesPath, systemConfiguration, log); + if (headerDCASetting.Equals("")) { + if (File.Exists(settingDCAPropertiesPath)) { + SettingsFiles.WriteHeaderLines(settingDCAPropertiesPath, setting.SettingName, systemConfiguration); + } else { + Exception ex = new Exception("Not able to find preset file " + SystemHelper.PropertyToString(setting.DCAProperties["File"]) + " for '" + setting.SettingName + "'"); + log.DoLogCritical("Not able to find preset file " + SystemHelper.PropertyToString(setting.DCAProperties["File"]) + " for '" + setting.SettingName + "'", ex); + throw ex; + } + } + + log.DoLogInfo("Prepared " + SystemHelper.PropertyToString(setting.DCAProperties["File"]) + " for '" + setting.SettingName + "'"); + } + } + + if (setting.IndicatorsProperties != null) { + if (setting.IndicatorsProperties.ContainsKey("File")) { + setting.IndicatorsProperties["File"] = SystemHelper.PropertyToString(setting.IndicatorsProperties["File"]).Replace(".PROPERTIES", ".properties"); + + // Check preset INDICATORS.PROPERTIES for header lines + string settingIndicatorsPropertiesPath = Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar + Constants.PTMagicPathPresets + Path.DirectorySeparatorChar + setting.SettingName + Path.DirectorySeparatorChar + setting.IndicatorsProperties["File"]; + string headerIndicatorsSetting = SettingsFiles.GetActiveSettingFromFile(settingIndicatorsPropertiesPath, systemConfiguration, log); + if (headerIndicatorsSetting.Equals("")) { + if (File.Exists(settingIndicatorsPropertiesPath)) { + SettingsFiles.WriteHeaderLines(settingIndicatorsPropertiesPath, setting.SettingName, systemConfiguration); + } else { + Exception ex = new Exception("Not able to find preset file " + SystemHelper.PropertyToString(setting.IndicatorsProperties["File"]) + " for '" + setting.SettingName + "'"); + log.DoLogCritical("Not able to find preset file " + SystemHelper.PropertyToString(setting.IndicatorsProperties["File"]) + " for '" + setting.SettingName + "'", ex); + throw ex; + } + } + + log.DoLogInfo("Prepared " + SystemHelper.PropertyToString(setting.IndicatorsProperties["File"]) + " for '" + setting.SettingName + "'"); + } + } + } + } + + return forceCheck; + } + } +} \ No newline at end of file diff --git a/Core/ProfitTrailer/SettingsHandler.cs b/Core/ProfitTrailer/SettingsHandler.cs new file mode 100644 index 0000000..cac47d1 --- /dev/null +++ b/Core/ProfitTrailer/SettingsHandler.cs @@ -0,0 +1,512 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.IO; +using System.Net; +using System.Net.Security; +using System.Security.Cryptography.X509Certificates; +using System.Net.Http; +using System.Text; +using System.Threading.Tasks; +using Core.Main; +using Core.Helper; +using Core.Main.DataObjects.PTMagicData; +using Newtonsoft.Json; + +namespace Core.ProfitTrailer { + public static class SettingsHandler { + public static string GetMainMarket(PTMagicConfiguration systemConfiguration, List pairsLines, LogHelper log) { + string result = ""; + + foreach (string line in pairsLines) { + if (line.Replace(" ", "").StartsWith("MARKET", StringComparison.InvariantCultureIgnoreCase)) { + result = line.Replace("MARKET", "", StringComparison.InvariantCultureIgnoreCase); + result = result.Replace("#", ""); + result = result.Replace("=", "").Trim(); + break; + } + } + + return result; + } + + public static string GetMarketPairs(PTMagicConfiguration systemConfiguration, List pairsLines, LogHelper log) { + string result = ""; + + foreach (string line in pairsLines) { + if (line.Replace(" ", "").StartsWith("ALL_enabled_pairs", StringComparison.InvariantCultureIgnoreCase) || line.Replace(" ", "").StartsWith("enabled_pairs", StringComparison.InvariantCultureIgnoreCase)) { + result = line.Replace("ALL_enabled_pairs", "", StringComparison.InvariantCultureIgnoreCase); + result = result.Replace("enabled_pairs", "", StringComparison.InvariantCultureIgnoreCase); + result = result.Replace("#", ""); + result = result.Replace("=", "").Trim(); + break; + } + } + + return result; + } + + public static string GetActiveSetting(PTMagicConfiguration systemConfiguration, string defaultSettingName, ref bool headerLinesAdded, List pairsLines, List dcaLines, List indicatorsLines, LogHelper log) { + string result = ""; + + foreach (string line in pairsLines) { + if (line.IndexOf("PTMagic_ActiveSetting", StringComparison.InvariantCultureIgnoreCase) > -1) { + result = line.Replace("PTMagic_ActiveSetting", "", StringComparison.InvariantCultureIgnoreCase); + result = result.Replace("#", ""); + result = result.Replace("=", "").Trim(); + result = SystemHelper.StripBadCode(result, Constants.WhiteListProperties); + break; + } + } + + if (result.Equals("")) { + SettingsHandler.WriteHeaderLines(ref pairsLines, defaultSettingName, systemConfiguration); + SettingsHandler.WriteHeaderLines(ref dcaLines, defaultSettingName, systemConfiguration); + SettingsHandler.WriteHeaderLines(ref indicatorsLines, defaultSettingName, systemConfiguration); + headerLinesAdded = true; + } + + return result; + } + + public static void WriteHeaderLines(ref List lines, string settingName, PTMagicConfiguration systemConfiguration) { + // Writing Header lines + lines.Insert(0, ""); + lines.Insert(0, "# ####################################"); + lines.Insert(0, "# PTMagic_LastChanged = " + DateTime.Now.ToShortDateString() + " " + DateTime.Now.ToShortTimeString()); + lines.Insert(0, "# PTMagic_ActiveSetting = " + SystemHelper.StripBadCode(settingName, Constants.WhiteListProperties)); + lines.Insert(0, "# ####### PTMagic Current Setting ########"); + lines.Insert(0, "# ####################################"); + } + + public static Dictionary GetPropertiesAsDictionary(List propertyLines) { + Dictionary result = new Dictionary(); + + foreach (string line in propertyLines) { + if (!line.StartsWith("#", StringComparison.InvariantCultureIgnoreCase)) { + string[] lineContentArray = line.Split("="); + if (lineContentArray.Length == 2) { + if (!result.ContainsKey(lineContentArray[0].Trim())) { + result.Add(lineContentArray[0].Trim(), lineContentArray[1].Trim()); + } else { + result[lineContentArray[0].Trim()] = lineContentArray[1].Trim(); + } + } + } + } + + return result; + } + + public static string GetCurrentPropertyValue(Dictionary properties, string propertyKey, string fallbackPropertyKey) { + string result = ""; + + if (properties.ContainsKey(propertyKey)) { + result = properties[propertyKey]; + } else if (!fallbackPropertyKey.Equals("") && properties.ContainsKey(fallbackPropertyKey)) { + result = properties[fallbackPropertyKey]; + } + + return result; + } + + public static void CompileProperties(string defaultSettingName, GlobalSetting setting, PTMagicConfiguration systemConfiguration, List pairsLines, List dcaLines, List indicatorsLines, LogHelper log) { + SettingsHandler.BuildPropertyLines(ref pairsLines, defaultSettingName, setting, setting.PairsProperties, "pairs", systemConfiguration, log); + SettingsHandler.BuildPropertyLines(ref dcaLines, defaultSettingName, setting, setting.DCAProperties, "dca", systemConfiguration, log); + SettingsHandler.BuildPropertyLines(ref indicatorsLines, defaultSettingName, setting, setting.IndicatorsProperties, "indicators", systemConfiguration, log); + } + + public static void BuildPropertyLines(ref List lines, string defaultSettingName, GlobalSetting setting, Dictionary properties, string propertiesType, PTMagicConfiguration systemConfiguration, LogHelper log) { + List result = new List(); + + if (properties != null) { + + // Building Properties + if (!setting.SettingName.Equals(defaultSettingName, StringComparison.InvariantCultureIgnoreCase) && systemConfiguration.GeneralSettings.Application.AlwaysLoadDefaultBeforeSwitch && !properties.ContainsKey("File")) { + + // Load default settings as basis for the switch + GlobalSetting defaultSetting = systemConfiguration.AnalyzerSettings.GlobalSettings.Find(a => a.SettingName.Equals(defaultSettingName, StringComparison.InvariantCultureIgnoreCase)); + if (defaultSetting != null) { + + Dictionary defaultProperties = new Dictionary(); + switch (propertiesType) { + case "pairs": + defaultProperties = defaultSetting.PairsProperties; + break; + case "dca": + defaultProperties = defaultSetting.DCAProperties; + break; + case "inidcators": + defaultProperties = defaultSetting.IndicatorsProperties; + break; + } + + if (defaultProperties.ContainsKey("File")) { + lines = SettingsFiles.GetPresetFileLinesAsList(defaultSetting.SettingName, defaultProperties["File"].ToString(), systemConfiguration); + } + } + } else { + + // Check if settings are configured in a seperate file + if (properties.ContainsKey("File")) { + lines = SettingsFiles.GetPresetFileLinesAsList(setting.SettingName, properties["File"].ToString(), systemConfiguration); + } + } + + foreach (string line in lines) { + if (line.IndexOf("PTMagic_ActiveSetting", StringComparison.InvariantCultureIgnoreCase) > -1) { + + // Setting current active setting + result.Add("# PTMagic_ActiveSetting = " + setting.SettingName); + + } else if (line.IndexOf("PTMagic_LastChanged", StringComparison.InvariantCultureIgnoreCase) > -1) { + + // Setting last change datetime + result.Add("# PTMagic_LastChanged = " + DateTime.Now.ToShortDateString() + " " + DateTime.Now.ToShortTimeString()); + + } else if (line.IndexOf("PTMagic_SingleMarketSettings", StringComparison.InvariantCultureIgnoreCase) > -1) { + + // Single Market Settings will get overwritten every single run => crop the lines + break; + } else { + + // Writing property items + int oldResultCount = result.Count; + if (properties != null) { + foreach (string settingProperty in properties.Keys) { + result = SettingsHandler.BuildPropertyLine(result, setting.SettingName, line, properties, settingProperty); + } + } + if (oldResultCount == result.Count) result.Add(line); + } + } + } + + lines = result; + } + + public static List BuildPropertyLine(List result, string settingName, string line, Dictionary properties, string settingProperty) { + int valueMode = Constants.ValueModeDefault; + string propertyKey = settingProperty; + + // Check for offset values + if (propertyKey.IndexOf("_OFFSETPERCENT") > -1) { + valueMode = Constants.ValueModeOffsetPercent; + propertyKey = propertyKey.Replace("_OFFSETPERCENT", ""); + } else if (propertyKey.IndexOf("_OFFSET") > -1) { + valueMode = Constants.ValueModeOffset; + propertyKey = propertyKey.Replace("_OFFSET", ""); + } + + if (line.StartsWith(propertyKey + " ", StringComparison.InvariantCultureIgnoreCase) || line.StartsWith(propertyKey + "=", StringComparison.InvariantCultureIgnoreCase)) { + string newValueString = SystemHelper.PropertyToString(properties[settingProperty]); + if (newValueString.ToLower().Equals("true") || newValueString.ToLower().Equals("false")) { + newValueString = newValueString.ToLower(); + } + + string oldValueString = line.Replace(propertyKey, "").Replace("=", "").Trim(); + + switch (valueMode) { + case Constants.ValueModeOffset: + // Offset value by a fixed amount + double offsetValue = SystemHelper.TextToDouble(newValueString, 0, "en-US"); + if (offsetValue != 0) { + double oldValue = SystemHelper.TextToDouble(oldValueString, 0, "en-US"); + newValueString = Math.Round((oldValue + offsetValue), 8).ToString(new System.Globalization.CultureInfo("en-US")); + } + break; + case Constants.ValueModeOffsetPercent: + // Offset value by percentage + double offsetValuePercent = SystemHelper.TextToDouble(newValueString, 0, "en-US"); + if (offsetValuePercent != 0) { + double oldValue = SystemHelper.TextToDouble(oldValueString, 0, "en-US"); + if (oldValue < 0) offsetValuePercent = offsetValuePercent * -1; + double oldValueOffset = (oldValue * (offsetValuePercent / 100)); + newValueString = Math.Round((oldValue + oldValueOffset), 8).ToString(new System.Globalization.CultureInfo("en-US")); + } + break; + default: + break; + } + + line = propertyKey + " = " + newValueString; + + string previousLine = result.Last(); + if (previousLine.IndexOf("PTMagic Changed Line", StringComparison.InvariantCultureIgnoreCase) > -1) { + previousLine = "# PTMagic changed line for setting '" + settingName + "' on " + DateTime.Now.ToShortDateString() + " " + DateTime.Now.ToShortTimeString(); + + result.RemoveAt(result.Count - 1); + result.Add(previousLine); + } else { + string editLine = "# PTMagic changed line for setting '" + settingName + "' on " + DateTime.Now.ToShortDateString() + " " + DateTime.Now.ToShortTimeString(); + result.Add(editLine); + } + result.Add(line); + } + + return result; + } + + public static void CompileSingleMarketProperties(int ptMajorVersion, string mainMarket, Dictionary> singleMarketSettings, Dictionary> matchedTriggers, PTMagicConfiguration systemConfiguration, List pairsLines, List dcaLines, List indicatorsLines, LogHelper log) { + try { + List globalPairsLines = new List(); + List globalDCALines = new List(); + List globalIndicatorsLines = new List(); + + List newPairsLines = new List(); + List newDCALines = new List(); + List newIndicatorsLines = new List(); + + foreach (string pairsLine in pairsLines) { + if (pairsLine.IndexOf("PTMagic_SingleMarketSettings", StringComparison.InvariantCultureIgnoreCase) > -1) { + + // Single Market Settings will get overwritten every single run => crop the lines + break; + } else { + string globalPairsLine = pairsLine; + + globalPairsLines.Add(globalPairsLine); + } + } + + newPairsLines.Add("# PTMagic_SingleMarketSettings - Written on " + DateTime.Now.ToString()); + newPairsLines.Add("# ########################################################################"); + newPairsLines.Add(""); + + foreach (string dcaLine in dcaLines) { + if (dcaLine.IndexOf("PTMagic_SingleMarketSettings", StringComparison.InvariantCultureIgnoreCase) > -1) { + + // Single Market Settings will get overwritten every single run => crop the lines + break; + } else { + string globalDCALine = dcaLine; + + globalDCALines.Add(globalDCALine); + } + } + + newDCALines.Add("# PTMagic_SingleMarketSettings - Written on " + DateTime.Now.ToString()); + newDCALines.Add("# ########################################################################"); + newDCALines.Add(""); + + foreach (string indicatorsLine in indicatorsLines) { + if (indicatorsLine.IndexOf("PTMagic_SingleMarketSettings", StringComparison.InvariantCultureIgnoreCase) > -1) { + + // Single Market Settings will get overwritten every single run => crop the lines + break; + } else { + string globalIndicatorsLine = indicatorsLine; + + globalIndicatorsLines.Add(globalIndicatorsLine); + } + } + + Dictionary globalPairsProperties = SettingsHandler.GetPropertiesAsDictionary(globalPairsLines); + Dictionary globalDCAProperties = SettingsHandler.GetPropertiesAsDictionary(globalDCALines); + Dictionary globalIndicatorsProperties = SettingsHandler.GetPropertiesAsDictionary(globalIndicatorsLines); + + newIndicatorsLines.Add("# PTMagic_SingleMarketSettings - Written on " + DateTime.Now.ToString()); + newIndicatorsLines.Add("# ########################################################################"); + newIndicatorsLines.Add(""); + + foreach (string marketPair in singleMarketSettings.Keys.OrderBy(k => k)) { + Dictionary pairsPropertiesToApply = new Dictionary(); + Dictionary dcaPropertiesToApply = new Dictionary(); + Dictionary indicatorsPropertiesToApply = new Dictionary(); + + // Build Properties as a whole list so that a single coin also has only one block with single market settings applied to it + foreach (SingleMarketSetting setting in singleMarketSettings[marketPair]) { + log.DoLogInfo("Building single market settings '" + setting.SettingName + "' for '" + marketPair + "'..."); + + foreach (string settingPairsProperty in setting.PairsProperties.Keys) { + if (!pairsPropertiesToApply.ContainsKey(settingPairsProperty)) { + pairsPropertiesToApply.Add(settingPairsProperty, setting.PairsProperties[settingPairsProperty]); + } else { + pairsPropertiesToApply[settingPairsProperty] = setting.PairsProperties[settingPairsProperty]; + } + } + + foreach (string settingDCAProperty in setting.DCAProperties.Keys) { + if (!dcaPropertiesToApply.ContainsKey(settingDCAProperty)) { + dcaPropertiesToApply.Add(settingDCAProperty, setting.DCAProperties[settingDCAProperty]); + } else { + dcaPropertiesToApply[settingDCAProperty] = setting.DCAProperties[settingDCAProperty]; + } + } + + foreach (string settingIndicatorsProperty in setting.IndicatorsProperties.Keys) { + if (!indicatorsPropertiesToApply.ContainsKey(settingIndicatorsProperty)) { + indicatorsPropertiesToApply.Add(settingIndicatorsProperty, setting.IndicatorsProperties[settingIndicatorsProperty]); + } else { + indicatorsPropertiesToApply[settingIndicatorsProperty] = setting.IndicatorsProperties[settingIndicatorsProperty]; + } + } + + log.DoLogInfo("Built single market settings '" + setting.SettingName + "' for '" + marketPair + "'."); + } + + newPairsLines = SettingsHandler.BuildPropertyLinesForSingleMarketSetting(ptMajorVersion, mainMarket, marketPair, singleMarketSettings[marketPair], pairsPropertiesToApply, matchedTriggers, globalPairsProperties, newPairsLines, systemConfiguration, log); + newDCALines = SettingsHandler.BuildPropertyLinesForSingleMarketSetting(ptMajorVersion, mainMarket, marketPair, singleMarketSettings[marketPair], dcaPropertiesToApply, matchedTriggers, globalDCAProperties, newDCALines, systemConfiguration, log); + newIndicatorsLines = SettingsHandler.BuildPropertyLinesForSingleMarketSetting(ptMajorVersion, mainMarket, marketPair, singleMarketSettings[marketPair], indicatorsPropertiesToApply, matchedTriggers, globalIndicatorsProperties, newIndicatorsLines, systemConfiguration, log); + } + + // Combine global settings lines with single market settings lines + globalPairsLines.AddRange(newPairsLines); + globalDCALines.AddRange(newDCALines); + globalIndicatorsLines.AddRange(newIndicatorsLines); + + pairsLines = globalPairsLines; + dcaLines = globalDCALines; + indicatorsLines = globalIndicatorsLines; + } catch (Exception ex) { + log.DoLogCritical("Critical error while writing settings!", ex); + throw (ex); + } + } + + public static List BuildPropertyLinesForSingleMarketSetting(int ptMajorVersion, string mainMarket, string marketPair, List appliedSettings, Dictionary properties, Dictionary> matchedTriggers, Dictionary fullProperties, List newPropertyLines, PTMagicConfiguration systemConfiguration, LogHelper log) { + if (properties.Keys.Count > 0) { + string appliedSettingsStringList = ""; + foreach (SingleMarketSetting sms in appliedSettings) { + if (!appliedSettingsStringList.Equals("")) appliedSettingsStringList += ", "; + appliedSettingsStringList += sms.SettingName; + } + + newPropertyLines.Add("# " + marketPair + " - Current active settings: " + appliedSettingsStringList); + newPropertyLines.Add("# Matching triggers:"); + foreach (string matchingTrigger in matchedTriggers[marketPair]) { + newPropertyLines.Add("# " + matchingTrigger); + } + + foreach (string settingProperty in properties.Keys) { + int valueMode = Constants.ValueModeDefault; + string propertyKey = settingProperty; + + // Check for offset values + if (propertyKey.IndexOf("_OFFSETPERCENT") > -1) { + valueMode = Constants.ValueModeOffsetPercent; + propertyKey = propertyKey.Replace("_OFFSETPERCENT", ""); + } else if (propertyKey.IndexOf("_OFFSET") > -1) { + valueMode = Constants.ValueModeOffset; + propertyKey = propertyKey.Replace("_OFFSET", ""); + } + + string newValueString = SystemHelper.PropertyToString(properties[settingProperty]); + if (newValueString.ToLower().Equals("true") || newValueString.ToLower().Equals("false")) { + newValueString = newValueString.ToLower(); + } + + string propertyMarketName = marketPair; + if (ptMajorVersion > 1) { + // Adjust market pair name for PT 2.0 and above + propertyMarketName = propertyMarketName.Replace(mainMarket, "").Replace("_", "").Replace("-", ""); + } + + string propertyKeyString = ""; + if (propertyKey.StartsWith("ALL", StringComparison.InvariantCultureIgnoreCase)) { + propertyKeyString = propertyKey.Replace("ALL", propertyMarketName, StringComparison.InvariantCultureIgnoreCase); + } else if (propertyKey.StartsWith("DEFAULT", StringComparison.InvariantCultureIgnoreCase)) { + propertyKeyString = propertyKey.Replace("DEFAULT", propertyMarketName, StringComparison.InvariantCultureIgnoreCase); + } else { + if (propertyKey.StartsWith("_", StringComparison.InvariantCultureIgnoreCase)) { + propertyKeyString = propertyMarketName + propertyKey; + } else { + propertyKeyString = propertyMarketName + "_" + propertyKey; + } + } + + switch (valueMode) { + case Constants.ValueModeOffset: + // Offset value by a fixed amount + double offsetValue = SystemHelper.TextToDouble(newValueString, 0, "en-US"); + if (offsetValue != 0) { + double oldValue = SystemHelper.TextToDouble(SettingsHandler.GetCurrentPropertyValue(fullProperties, propertyKey, propertyKey.Replace("ALL_", "DEFAULT_")), 0, "en-US"); + newValueString = Math.Round((oldValue + offsetValue), 8).ToString(new System.Globalization.CultureInfo("en-US")); + } + break; + case Constants.ValueModeOffsetPercent: + // Offset value by percentage + double offsetValuePercent = SystemHelper.TextToDouble(newValueString, 0, "en-US"); + if (offsetValuePercent != 0) { + double oldValue = SystemHelper.TextToDouble(SettingsHandler.GetCurrentPropertyValue(fullProperties, propertyKey, propertyKey.Replace("ALL_", "DEFAULT_")), 0, "en-US"); + if (oldValue < 0) offsetValuePercent = offsetValuePercent * -1; + double oldValueOffset = (oldValue * (offsetValuePercent / 100)); + newValueString = Math.Round((oldValue + oldValueOffset), 8).ToString(new System.Globalization.CultureInfo("en-US")); + } + break; + default: + break; + } + + newPropertyLines.Add(propertyKeyString + " = " + newValueString); + } + newPropertyLines.Add(""); + } + + return newPropertyLines; + } + + public static bool RemoveSingleMarketSettings(PTMagicConfiguration systemConfiguration, List pairsLines, List dcaLines, List indicatorsLines, LogHelper log) { + bool result = false; + try { + List cleanedUpPairsLines = new List(); + List cleanedUpDCALines = new List(); + List cleanedUpIndicatorsLines = new List(); + + bool removedPairsSingleMarketSettings = false; + foreach (string pairsLine in pairsLines) { + if (pairsLine.IndexOf("PTMagic_SingleMarketSettings", StringComparison.InvariantCultureIgnoreCase) > -1) { + + // Single Market Settings will get overwritten every single run => crop the lines + removedPairsSingleMarketSettings = true; + break; + } else { + string newPairsLine = pairsLine; + + cleanedUpPairsLines.Add(newPairsLine); + } + } + + bool removedDCASingleMarketSettings = false; + foreach (string dcaLine in dcaLines) { + if (dcaLine.IndexOf("PTMagic_SingleMarketSettings", StringComparison.InvariantCultureIgnoreCase) > -1) { + + // Single Market Settings will get overwritten every single run => crop the lines + removedDCASingleMarketSettings = true; + break; + } else { + string newDCALine = dcaLine; + + cleanedUpDCALines.Add(newDCALine); + } + } + + bool removedIndicatorsSingleMarketSettings = false; + foreach (string indicatorsLine in indicatorsLines) { + if (indicatorsLine.IndexOf("PTMagic_SingleMarketSettings", StringComparison.InvariantCultureIgnoreCase) > -1) { + + // Single Market Settings will get overwritten every single run => crop the lines + removedIndicatorsSingleMarketSettings = true; + break; + } else { + string newIndicatorsLine = indicatorsLine; + + cleanedUpIndicatorsLines.Add(newIndicatorsLine); + } + } + + pairsLines = cleanedUpPairsLines; + dcaLines = cleanedUpDCALines; + indicatorsLines = cleanedUpIndicatorsLines; + + result = removedPairsSingleMarketSettings && removedDCASingleMarketSettings && removedIndicatorsSingleMarketSettings; + } catch (Exception ex) { + log.DoLogCritical("Critical error while writing settings!", ex); + } + + return result; + } + + + } +} diff --git a/Core/ProfitTrailer/StrategyHelper.cs b/Core/ProfitTrailer/StrategyHelper.cs new file mode 100644 index 0000000..095b03f --- /dev/null +++ b/Core/ProfitTrailer/StrategyHelper.cs @@ -0,0 +1,334 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.IO; +using System.Net; +using System.Net.Security; +using System.Security.Cryptography.X509Certificates; +using System.Net.Http; +using System.Text; +using System.Threading.Tasks; +using Core.Main; +using Core.Helper; +using Core.Main.DataObjects.PTMagicData; +using Newtonsoft.Json; + +namespace Core.ProfitTrailer { + public static class StrategyHelper { + public static string GetStrategyShortcut(string strategyName, bool onlyValidStrategies) { + string result = strategyName; + + switch (strategyName.ToLower()) { + case "lowbb": + result = "LBB"; + break; + case "highbb": + result = "HBB"; + break; + case "gain": + result = "G"; + break; + case "loss": + result = "L"; + break; + case "smagain": + result = "SG"; + break; + case "emagain": + result = "EG"; + break; + case "smaspread": + result = "SS"; + break; + case "emaspread": + result = "ES"; + break; + case "smacross": + result = "SC"; + break; + case "emacross": + result = "EC"; + break; + case "rsi": + result = "RSI"; + break; + case "stoch": + result = "STOCH"; + break; + case "stochrsi": + result = "SRSI"; + break; + case "macd": + result = "MACD"; + break; + case "obv": + result = "OBV"; + break; + case "bbwidth": + result = "BBW"; + break; + case "anderson": + result = "AND"; + break; + case "som enabled": + result = "SOM"; + break; + case "max buy times": + result = "MAX"; + break; + case "max pairs": + result = "PAIRS"; + break; + case "max spread": + result = "SPREAD"; + break; + case "price increase": + result = "PIN"; + break; + case "min buy volume": + result = "VOL"; + break; + case "min buy balance": + result = "MIN"; + break; + case "coin age": + result = "AGE"; + break; + case "too new": + result = "NEW"; + break; + case "blacklisted": + result = "BLACK"; + break; + case "insufficient balance": + result = "BAL"; + break; + case "max cost reached": + result = "COST"; + break; + case "rebuy timeout": + result = "TIMEOUT"; + break; + default: + break; + } + + if (onlyValidStrategies) { + if (strategyName.IndexOf("SOM") > -1 || strategyName.IndexOf("MAX") > -1 || strategyName.IndexOf("MIN") > -1 || strategyName.IndexOf("PRICE") > -1 || strategyName.IndexOf("BLACK") > -1 || strategyName.IndexOf("INSUFFICIENT") > -1 || strategyName.IndexOf("COST") > -1 || strategyName.IndexOf("TIMEOUT") > -1) { + result = ""; + } + } + + return result; + } + + public static bool IsValidStrategy(string strategyName) { + return StrategyHelper.IsValidStrategy(strategyName, false); + } + + public static bool IsValidStrategy(string strategyName, bool checkForAnyInvalid) { + bool result = false; + + if (!checkForAnyInvalid) { + switch (strategyName.ToLower()) { + case "lowbb": + case "highbb": + case "gain": + case "loss": + case "smagain": + case "emagain": + case "smaspread": + case "emaspread": + case "smacross": + case "emacross": + case "rsi": + case "stoch": + case "stochrsi": + case "macd": + case "obv": + case "bbwidth": + case "anderson": + result = true; + break; + default: + break; + } + } else { + if (strategyName.IndexOf("max", StringComparison.InvariantCultureIgnoreCase) == -1 + && strategyName.IndexOf("min", StringComparison.InvariantCultureIgnoreCase) == -1 + && strategyName.IndexOf("som", StringComparison.InvariantCultureIgnoreCase) == -1 + && strategyName.IndexOf("price", StringComparison.InvariantCultureIgnoreCase) == -1 + && strategyName.IndexOf("black", StringComparison.InvariantCultureIgnoreCase) == -1 + && strategyName.IndexOf("new", StringComparison.InvariantCultureIgnoreCase) == -1 + && strategyName.IndexOf("insufficient", StringComparison.InvariantCultureIgnoreCase) == -1 + && strategyName.IndexOf("timeout", StringComparison.InvariantCultureIgnoreCase) == -1 + && strategyName.IndexOf("spread", StringComparison.InvariantCultureIgnoreCase) == -1 + && strategyName.IndexOf("pairs", StringComparison.InvariantCultureIgnoreCase) == -1) { + result = true; + } + } + + return result; + } + + public static int GetStrategyValueDecimals(string strategyName) { + int result = 0; + + switch (strategyName.ToLower()) { + case "lowbb": + case "highbb": + result = 8; + break; + case "gain": + case "loss": + case "smagain": + case "emagain": + case "smaspread": + case "emaspread": + case "anderson": + case "smacross": + case "emacross": + result = 2; + break; + case "rsi": + case "stochrsi": + case "stoch": + case "macd": + case "obv": + case "bbwidth": + result = 0; + break; + default: + break; + } + + return result; + } + + public static string GetStrategyText(Summary summary, List strategies, string strategyText, bool isTrailingBuyActive) { + if (strategies.Count > 0) { + foreach (Strategy strategy in strategies) { + string textClass = (strategy.IsTrailing) ? "label-success" : "label-danger"; + if (!StrategyHelper.IsValidStrategy(strategy.Name)) { + strategyText += "" + StrategyHelper.GetStrategyShortcut(strategy.Name, false) + " "; + } else { + strategyText += "" + StrategyHelper.GetStrategyShortcut(strategy.Name, false) + " "; + } + } + + if (isTrailingBuyActive) { + strategyText += " "; + } + } else { + if (isTrailingBuyActive) { + strategyText = "" + StrategyHelper.GetStrategyShortcut(strategyText, true) + ""; + strategyText += " "; + } else { + if (StrategyHelper.IsValidStrategy(strategyText)) { + strategyText = "" + StrategyHelper.GetStrategyShortcut(strategyText, true) + ""; + } else if (strategyText.Equals("")) { + strategyText = summary.DCABuyStrategy; + strategyText = "" + StrategyHelper.GetStrategyShortcut(strategyText, true) + ""; + } else { + strategyText = "" + StrategyHelper.GetStrategyShortcut(strategyText, false) + " "; + } + } + } + + return strategyText; + } + + public static string GetCurrentValueText(List strategies, string strategyText, double bbValue, double simpleValue, bool includeShortcut) { + string result = ""; + + if (strategies.Count > 0) { + foreach (Strategy strategy in strategies) { + if (StrategyHelper.IsValidStrategy(strategy.Name)) { + if (!result.Equals("")) result += "
"; + + string decimalFormat = ""; + int decimals = StrategyHelper.GetStrategyValueDecimals(strategy.Name); + for (int d = 1; d <= decimals; d++) { + decimalFormat += "0"; + } + + if (includeShortcut) { + result += "" + StrategyHelper.GetStrategyShortcut(strategy.Name, true) + " "; + } + + if (StrategyHelper.GetStrategyShortcut(strategy.Name, true).IndexOf("and", StringComparison.InvariantCultureIgnoreCase) > -1) { + result += simpleValue.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")); + } else { + if (decimals == 0) { + if (!SystemHelper.IsInteger(strategy.CurrentValue)) { + result += strategy.CurrentValue.ToString("#,#", new System.Globalization.CultureInfo("en-US")); + } else { + result += strategy.CurrentValue.ToString("#,#0", new System.Globalization.CultureInfo("en-US")); + } + } else { + result += strategy.CurrentValue.ToString("#,#0." + decimalFormat, new System.Globalization.CultureInfo("en-US")); + } + } + } + } + } else { + if (StrategyHelper.GetStrategyShortcut(strategyText, true).IndexOf("bb", StringComparison.InvariantCultureIgnoreCase) > -1) { + result = bbValue.ToString("#,#0.00000000", new System.Globalization.CultureInfo("en-US")); + } else { + result = simpleValue.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")) + "%"; + } + } + + return result; + } + + public static string GetTriggerValueText(Summary summary, List strategies, string strategyText, double bbValue, double simpleValue, int buyLevel, bool includeShortcut) { + string result = ""; + + if (strategies.Count > 0) { + foreach (Strategy strategy in strategies) { + if (StrategyHelper.IsValidStrategy(strategy.Name)) { + if (!result.Equals("")) result += "
"; + + string decimalFormat = ""; + int decimals = StrategyHelper.GetStrategyValueDecimals(strategy.Name); + for (int d = 1; d <= decimals; d++) { + decimalFormat += "0"; + } + + if (includeShortcut) { + result += "" + StrategyHelper.GetStrategyShortcut(strategy.Name, true) + " "; + } + + if (StrategyHelper.GetStrategyShortcut(strategy.Name, true).IndexOf("and", StringComparison.InvariantCultureIgnoreCase) > -1) { + result += strategy.TriggerValue.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")); + } else { + if (decimals == 0) { + if (!SystemHelper.IsInteger(strategy.EntryValue)) { + result += strategy.EntryValue.ToString(new System.Globalization.CultureInfo("en-US")); + } else { + result += strategy.EntryValue.ToString("#,#0", new System.Globalization.CultureInfo("en-US")); + } + } else { + result += strategy.EntryValue.ToString("#,#0." + decimalFormat, new System.Globalization.CultureInfo("en-US")); + } + } + } + } + } else { + if (StrategyHelper.GetStrategyShortcut(strategyText, true).IndexOf("bb", StringComparison.InvariantCultureIgnoreCase) > -1) { + result = bbValue.ToString("#,#0.00000000", new System.Globalization.CultureInfo("en-US")); + } else { + if (simpleValue == Constants.MinTrendChange) { + if (summary.DCATriggers.ContainsKey(buyLevel + 1)) { + simpleValue = summary.DCATriggers[buyLevel + 1]; + } + } + result = simpleValue.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")) + "%"; + } + } + + return result; + } + } +} \ No newline at end of file diff --git a/Monitor/Monitor.csproj b/Monitor/Monitor.csproj new file mode 100644 index 0000000..e1e8537 --- /dev/null +++ b/Monitor/Monitor.csproj @@ -0,0 +1,38 @@ + + + netcoreapp2.0 + + + + + + + + + + + + + + + + + Always + + + + + + + + + + + + + + + + + + diff --git a/Monitor/Pages/BagAnalyzer.cshtml b/Monitor/Pages/BagAnalyzer.cshtml new file mode 100644 index 0000000..2d13740 --- /dev/null +++ b/Monitor/Pages/BagAnalyzer.cshtml @@ -0,0 +1,102 @@ +@page +@model BagAnalyzerModel +@{ + ViewData["Title"] = ""; +} + +@section Styles { + +} + +@if (Model.PTData.DCALog.Count == 0) { +
+
+
+

No Pairs/Bags!

+ +

Sorry, but your Profit Trailer did not buy anything so far that's worth analyzing.

+
+
+
+} else { + +
+
+
+

DCA and Bought Pairs Analyzer

+ + + + + + + + + + + + + + + + + + + +
MarketDCABuy StratsBT ValueBuy TriggerProfitSell StratsSTBid PriceAvg. PriceCost
+
+
+
+ + +} + +@section Scripts { + + + + + +} diff --git a/Monitor/Pages/BagAnalyzer.cshtml.cs b/Monitor/Pages/BagAnalyzer.cshtml.cs new file mode 100644 index 0000000..a4a6dee --- /dev/null +++ b/Monitor/Pages/BagAnalyzer.cshtml.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.AspNetCore.Http; +using Core.Main; +using Core.Main.DataObjects; +using Core.Main.DataObjects.PTMagicData; + +namespace Monitor.Pages { + public class BagAnalyzerModel : _Internal.BasePageModelSecure { + public ProfitTrailerData PTData = null; + + public void OnGet() { + base.Init(); + + BindData(); + } + + private void BindData() { + PTData = new ProfitTrailerData(PTMagicBasePath, PTMagicConfiguration); + } + } +} diff --git a/Monitor/Pages/BuyAnalyzer.cshtml b/Monitor/Pages/BuyAnalyzer.cshtml new file mode 100644 index 0000000..71835de --- /dev/null +++ b/Monitor/Pages/BuyAnalyzer.cshtml @@ -0,0 +1,87 @@ +@page +@model BuyAnalyzerModel +@{ + ViewData["Title"] = ""; +} + +@section Styles { + +} + +@if (Model.PTData.BuyLog.Count == 0) { +
+
+
+

No possible buys!

+ +

Sorry, but your Profit Trailer did not buy anything so far that's worth buying.

+
+
+
+} else { + +
+
+
+

Possible Buy Analyzer

+ + + + + + + + + + + + +
MarketBuy StrategyBT ValueBuy TriggerAsk Price
+
+
+
+ +} + +@section Scripts { + + + + +} diff --git a/Monitor/Pages/BuyAnalyzer.cshtml.cs b/Monitor/Pages/BuyAnalyzer.cshtml.cs new file mode 100644 index 0000000..dc2676c --- /dev/null +++ b/Monitor/Pages/BuyAnalyzer.cshtml.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.AspNetCore.Http; +using Core.Main; +using Core.Main.DataObjects; +using Core.Main.DataObjects.PTMagicData; + +namespace Monitor.Pages { + public class BuyAnalyzerModel : _Internal.BasePageModelSecure { + public ProfitTrailerData PTData = null; + + public void OnGet() { + base.Init(); + + BindData(); + } + + private void BindData() { + PTData = new ProfitTrailerData(PTMagicBasePath, PTMagicConfiguration); + } + } +} diff --git a/Monitor/Pages/Components/PairIcon/default.cshtml b/Monitor/Pages/Components/PairIcon/default.cshtml new file mode 100644 index 0000000..0491cda --- /dev/null +++ b/Monitor/Pages/Components/PairIcon/default.cshtml @@ -0,0 +1,37 @@ +@model Core.Main.DataObjects.PTMagicData.MarketPairSummary + +@if (Model != null) { + if (Model.ActiveSingleSettings != null) { + string settingsNames = ""; + foreach (Core.Main.DataObjects.PTMagicData.SingleMarketSetting sms in Model.ActiveSingleSettings) { + if (!settingsNames.Equals("")) { + settingsNames += "
"; + } + settingsNames += Core.Helper.SystemHelper.SplitCamelCase(sms.SettingName); + } +
+

Active Single Settings

+ + + + + + + + + + + + + + + + + + + + +
Settings@settingsNames
Buy Value@Model.CurrentBuyValue.ToString(new System.Globalization.CultureInfo("en-US"))Trailing Buy@Model.CurrentTrailingBuy.ToString(new System.Globalization.CultureInfo("en-US"))
Sell Value@Model.CurrentSellValue.ToString(new System.Globalization.CultureInfo("en-US"))Trailing Profit@Model.CurrentTrailingProfit.ToString(new System.Globalization.CultureInfo("en-US"))
+
+ } +} \ No newline at end of file diff --git a/Monitor/Pages/DCACalculator.cshtml b/Monitor/Pages/DCACalculator.cshtml new file mode 100644 index 0000000..77d30dd --- /dev/null +++ b/Monitor/Pages/DCACalculator.cshtml @@ -0,0 +1,248 @@ +@page +@model DCACalculatorModel +@{ + ViewData["Title"] = ""; +} + +@section Styles { + +} + +@{ + string maxCostCaption = "Max"; + if (Model.Summary.ProfitTrailerMajorVersion > 1) { + maxCostCaption = "Initial"; + } +} + +
+
+
+

DCA Calculator

+ +

+ Use this calculator to help building a proper setup for your Profit Trailer settings for ALL_max_trading_pairs, ALL_@maxCostCaption.ToLower()_cost and DCA levels.
+ To do so enter your available balance and adjust the values to whatever you consider the best setting for your parameters.
+ If you are having problems understanding the different modes, please read this wiki article. +

+ + @if (Model.PTMagicConfiguration.GeneralSettings.Monitor.DefaultDCAMode.Equals("simple", StringComparison.InvariantCultureIgnoreCase)) { +
+
+
+
+ } else { +
+
+
+
+ } +
+
+ In simple mode the DCA calculator will only take your number of pairs, DCA levels and initial cost and will calculate the necessary fundings for you. In this mode the ANDERSON method is quite inaccurate as it will calculate the DCA steps by using the the simple proportional cost for each DCA level, regardless of what level the price may be at the time the DCA buy will happen. +
+
+ In advanced mode the DCA calculator will also take your DCA triggers into account for the calculation of the necessary fundings for you. In this mode the ANDERSON method is being calculated more accurate as it will calculate the necessary costs using your buy triggers to calculate the actual cost of coins at the current price according to your triggers and percentages. +
+
+
+
+
+ +
+
+
+
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ + @{ + double maxCostValue = Model.Summary.MaxCost; + if (maxCostValue == 0) { + maxCostValue = Model.Summary.MaxCostPercentage; + } + } + +
+ +
+ +
+
+ +
+
+
+
+ +
+
+

Please enter a valid balance value on the left to calculate results...

+ + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
hidden }"> +
+
+

DCA Triggers

+ + + + + + + + + + + + + + + + + + + + + + @for (int l = 1; l <= (int)Model.Summary.DCALevels; l++) { + double dcaPercentage = Model.Summary.DCAPercentage; + if (Model.Summary.DCAPercentages.ContainsKey(l)) { + dcaPercentage = Model.Summary.DCAPercentages[l]; + } + + double dcaTrigger = Model.Summary.DCATrigger; + if (Model.Summary.DCATriggers.ContainsKey(l)) { + dcaTrigger = Model.Summary.DCATriggers[l]; + } + + + + + + + + + } + +
DCA LevelTrigger %Buy %Approx. Drop %Simple Cost / PairAdvanced Cost / Pair
0@Model.Summary.BuyValue.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US"))%
@l@dcaTrigger.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US"))%@dcaPercentage.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US"))%
+
+
+
+ +@{ + int maxDCALevels = 12; + if (Model.Summary.DCALevels > maxDCALevels) { + maxDCALevels = (int)Model.Summary.DCALevels; + } +} +
+
+
+

DCA Overview

+
+ + + + + @for (int col = 1; col <= maxDCALevels; col++) { + + } + + + + @for (int row = 1; row <= Model.PTMagicConfiguration.GeneralSettings.Monitor.MaxDCAPairs; row++) { + + + @for (int col = 1; col <= maxDCALevels; col++) { + + } + + } + +
DCA @col
@row Pairs
+
+
+
+
+ +@section Scripts { + + + +} diff --git a/Monitor/Pages/DCACalculator.cshtml.cs b/Monitor/Pages/DCACalculator.cshtml.cs new file mode 100644 index 0000000..af7277d --- /dev/null +++ b/Monitor/Pages/DCACalculator.cshtml.cs @@ -0,0 +1,21 @@ +using Microsoft.AspNetCore.Mvc.RazorPages; +using System.Linq; +using Core.Main; +using Core.Main.DataObjects; +using Core.Main.DataObjects.PTMagicData; + +namespace Monitor.Pages { + public class DCACalculatorModel : _Internal.BasePageModelSecure { + public ProfitTrailerData PTData = null; + + public void OnGet() { + base.Init(); + + BindData(); + } + + private void BindData() { + PTData = new ProfitTrailerData(PTMagicBasePath, PTMagicConfiguration); + } + } +} diff --git a/Monitor/Pages/Error.cshtml b/Monitor/Pages/Error.cshtml new file mode 100644 index 0000000..6c83966 --- /dev/null +++ b/Monitor/Pages/Error.cshtml @@ -0,0 +1,21 @@ +@page +@model ErrorModel +@{ + Layout = null; + ViewData["Title"] = "Error"; +} + +

Error.

+

An error occurred while processing your request.

+ +@if (Model.ShowRequestId) +{ +

+ Request ID: @Model.RequestId +

+} + +@if (Model.Exception != null) { +

@Model.Exception.Error.Message

+

@Model.Exception.Error.StackTrace

+} \ No newline at end of file diff --git a/Monitor/Pages/Error.cshtml.cs b/Monitor/Pages/Error.cshtml.cs new file mode 100644 index 0000000..0207673 --- /dev/null +++ b/Monitor/Pages/Error.cshtml.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Diagnostics; +using Microsoft.AspNetCore.Mvc.RazorPages; + +namespace Monitor.Pages { + public class ErrorModel : PageModel { + public string RequestId { get; set; } + public IExceptionHandlerFeature Exception = null; + + public bool ShowRequestId => !string.IsNullOrEmpty(RequestId); + + public void OnGet() { + Exception = HttpContext.Features.Get(); + + RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier; + } + } +} diff --git a/Monitor/Pages/Index.cshtml b/Monitor/Pages/Index.cshtml new file mode 100644 index 0000000..d61c407 --- /dev/null +++ b/Monitor/Pages/Index.cshtml @@ -0,0 +1,89 @@ +@page +@model IndexModel +@{ + ViewData["Title"] = ""; +} + +@section Styles { + +} + +
+
+ + + +@section Scripts { + + + + + +} \ No newline at end of file diff --git a/Monitor/Pages/Index.cshtml.cs b/Monitor/Pages/Index.cshtml.cs new file mode 100644 index 0000000..17b8ed7 --- /dev/null +++ b/Monitor/Pages/Index.cshtml.cs @@ -0,0 +1,8 @@ +namespace Monitor.Pages { + public class IndexModel : _Internal.BasePageModelSecure { + + public void OnGet() { + base.Init(); + } + } +} diff --git a/Monitor/Pages/Login.cshtml b/Monitor/Pages/Login.cshtml new file mode 100644 index 0000000..ad74c3b --- /dev/null +++ b/Monitor/Pages/Login.cshtml @@ -0,0 +1,49 @@ +@page +@model LoginModel +@{ + ViewData["Title"] = ""; + Layout = "_LayoutPublic"; +} + +@section Styles { + +} + + +
+ +
+ +
+
+

PT Magic

+

+ Please enter your password. +

+
+ + + + +
+

+
+ +
+ +
+
+ +
+
+

+ Need to set a new password?
Delete "settings.secure.json" from your PT Magic directory! +

+
+
+ +@section Scripts { + +} \ No newline at end of file diff --git a/Monitor/Pages/Login.cshtml.cs b/Monitor/Pages/Login.cshtml.cs new file mode 100644 index 0000000..19cccf9 --- /dev/null +++ b/Monitor/Pages/Login.cshtml.cs @@ -0,0 +1,43 @@ +using System; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Core.Main; +using Core.Helper; + +namespace Monitor.Pages { + public class LoginModel : _Internal.BasePageModel { + public string CurrentPassword = ""; + + public void OnGet() { + base.PreInit(); + + CurrentPassword = PTMagicConfiguration.SecureSettings.MonitorPassword; + if (CurrentPassword.Equals("")) { + Response.Redirect(PTMagicConfiguration.GeneralSettings.Monitor.RootUrl + "SetupPassword"); + } + } + + public void OnPost(string password, string cbRememberMe) { + base.PreInit(); + + string encryptedPassword = EncryptionHelper.Encrypt(password); + + if (encryptedPassword.Equals(PTMagicConfiguration.SecureSettings.MonitorPassword)) { + HttpContext.Session.SetString("LoggedIn" + PTMagicConfiguration.GeneralSettings.Monitor.Port.ToString(), DateTime.Now.ToUniversalTime().ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fff'Z'")); + + if (cbRememberMe != null) { + if (cbRememberMe.Equals("on", StringComparison.InvariantCultureIgnoreCase)) { + CookieOptions cookieOption = new CookieOptions(); + cookieOption.Expires = DateTime.Now.AddYears(1); + + string cookieValue = EncryptionHelper.Encrypt(encryptedPassword); + + Response.Cookies.Append("PTMRememberMeKey", cookieValue, cookieOption); + } + } + + Response.Redirect(PTMagicConfiguration.GeneralSettings.Monitor.RootUrl); + } + } + } +} diff --git a/Monitor/Pages/ManageSMS.cshtml b/Monitor/Pages/ManageSMS.cshtml new file mode 100644 index 0000000..9daf170 --- /dev/null +++ b/Monitor/Pages/ManageSMS.cshtml @@ -0,0 +1,239 @@ +@page +@model ManageSMSModel +@{ + ViewData["Title"] = ""; +} + +@section Styles { +} + +
+
+
+
+ +

Applied Single Market Setting Details

+ + + + + + + + + + + + + + + + @{ + string lastMarket = ""; + } + @foreach (Core.Main.DataObjects.PTMagicData.SingleMarketSettingSummary smsSummary in Model.SingleMarketSettingSummaries.OrderBy(s => s.Market)) { + Core.Main.DataObjects.PTMagicData.MarketPairSummary mps = null; + if (Model.Summary.MarketSummary.ContainsKey(smsSummary.Market)) { + mps = Model.Summary.MarketSummary[smsSummary.Market]; + } else { + mps = new Core.Main.DataObjects.PTMagicData.MarketPairSummary(); + } + + bool settingHasOffTriggers = false; + if (smsSummary.SingleMarketSetting.OffTriggers.Count > 0) { + settingHasOffTriggers = true; + } + + int activeSeconds = (int)Math.Floor(DateTime.UtcNow.Subtract(smsSummary.ActivationDateTimeUTC).TotalSeconds); + int activeHours = (int)Math.Floor(DateTime.UtcNow.Subtract(smsSummary.ActivationDateTimeUTC).TotalHours); + + + + + + + + + + + lastMarket = smsSummary.Market; + } + +
Market NameLast PriceVolumeActive SettingTriggered timeOff TriggersCurrent Values
+ @if (!lastMarket.Equals(smsSummary.Market)) { + @smsSummary.Market + } + + @if (!lastMarket.Equals(smsSummary.Market)) { + @mps.LatestPrice.ToString("#,#0.00000000", new System.Globalization.CultureInfo("en-US")) @Model.Summary.MainMarket + } + + @if (!lastMarket.Equals(smsSummary.Market)) { + @Math.Round(mps.Latest24hVolume, 0).ToString("#,#0", new System.Globalization.CultureInfo("en-US")) @Model.Summary.MainMarket + } + + @Core.Helper.SystemHelper.SplitCamelCase(smsSummary.SingleMarketSetting.SettingName) + + @Core.Helper.SystemHelper.GetProperDurationTime(activeSeconds) + + @if (settingHasOffTriggers) { + foreach (Core.Main.DataObjects.PTMagicData.OffTrigger ot in smsSummary.SingleMarketSetting.OffTriggers) { + string triggerTextClass = "text-danger"; + if (ot.HoursSinceTriggered > 0) { + triggerTextClass = (activeHours >= ot.HoursSinceTriggered) ? "text-success" : "text-danger"; +

Hours Since Triggered@ot.HoursSinceTriggered

+ } + if (ot.Min24hVolume > 0 || ot.Max24hVolume < Core.Main.Constants.Max24hVolume) { + triggerTextClass = (mps.Latest24hVolume >= ot.Min24hVolume && mps.Latest24hVolume <= ot.Max24hVolume) ? "text-success" : "text-danger"; +

+ Volume + + @if (ot.Min24hVolume > 0) { + @("min: " + ot.Min24hVolume.ToString("#,#0.00000000", new System.Globalization.CultureInfo("en-US")) + " " + Model.Summary.MainMarket) + } + @if (ot.Min24hVolume > 0 && ot.Max24hVolume < Core.Main.Constants.Max24hVolume) { + @(", ") + } + @if (ot.Max24hVolume < Core.Main.Constants.Max24hVolume) { + @("max: " + ot.Max24hVolume.ToString("#,#0.00000000", new System.Globalization.CultureInfo("en-US")) + " " + Model.Summary.MainMarket) + } + +

+ } + if (ot.Max24hVolume < Core.Main.Constants.Max24hVolume) { + triggerTextClass = (mps.Latest24hVolume <= ot.Max24hVolume) ? "text-success" : "text-danger"; +

Max 24h Volume@ot.Max24hVolume.ToString("#,#0.00000000", new System.Globalization.CultureInfo("en-US")) @Model.Summary.MainMarket

+ } + if (!ot.MarketTrendName.Equals("")) { + double trendChange = Model.GetTrendChange(ot.MarketTrendName, mps, smsSummary.TriggerSnapshot, ot.MarketTrendRelation); + triggerTextClass = (trendChange >= ot.MinChange && trendChange <= ot.MaxChange) ? "text-success" : "text-danger"; +

+ @Core.Helper.SystemHelper.SplitCamelCase(ot.MarketTrendName) (@Core.Helper.SystemHelper.SplitCamelCase(ot.MarketTrendRelation)) + + @if (ot.MinChange > Core.Main.Constants.MinTrendChange) { + @("min: " + ot.MinChange.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")) + "%") + } + @if (ot.MinChange > Core.Main.Constants.MinTrendChange && ot.MaxChange < Core.Main.Constants.MaxTrendChange) { + @(", ") + } + @if (ot.MaxChange < Core.Main.Constants.MaxTrendChange) { + @("max: " + ot.MaxChange.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")) + "%") + } + +

+ } + } + } else { + Not specified + } +
+ @if (settingHasOffTriggers) { + foreach (Core.Main.DataObjects.PTMagicData.OffTrigger ot in smsSummary.SingleMarketSetting.OffTriggers) { + string triggerTextClass = "text-danger"; + if (ot.HoursSinceTriggered > 0) { + triggerTextClass = (activeHours >= ot.HoursSinceTriggered) ? "text-success" : "text-danger"; +

@activeHours.ToString(new System.Globalization.CultureInfo("en-US"))

+ } + if (ot.Min24hVolume > 0) { + triggerTextClass = (mps.Latest24hVolume >= ot.Min24hVolume) ? "text-success" : "text-danger"; +

@Math.Round(mps.Latest24hVolume, 0).ToString("#,#0", new System.Globalization.CultureInfo("en-US")) @Model.Summary.MainMarket

+ } + if (ot.Max24hVolume < Core.Main.Constants.Max24hVolume) { + triggerTextClass = (mps.Latest24hVolume <= ot.Max24hVolume) ? "text-success" : "text-danger"; +

@Math.Round(mps.Latest24hVolume, 0).ToString("#,#0", new System.Globalization.CultureInfo("en-US")) @Model.Summary.MainMarket

+ } + if (!ot.MarketTrendName.Equals("")) { + if (mps.MarketTrendChanges.ContainsKey(ot.MarketTrendName)) { + double trendChange = Model.GetTrendChange(ot.MarketTrendName, mps, smsSummary.TriggerSnapshot, ot.MarketTrendRelation); + triggerTextClass = (trendChange >= ot.MinChange && trendChange <= ot.MaxChange) ? "text-success" : "text-danger"; + string trendChangeOutput = trendChange.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")); +

@trendChangeOutput%

+ } + } + } + } +
+ @if (settingHasOffTriggers) { + @if (Model.PTMagicConfiguration.GeneralSettings.Monitor.IsPasswordProtected) { + Reset + } else { + Reset + } + } +
+ +
+
+
+
+ + + + +@section Scripts { + + +} diff --git a/Monitor/Pages/ManageSMS.cshtml.cs b/Monitor/Pages/ManageSMS.cshtml.cs new file mode 100644 index 0000000..a3f13d5 --- /dev/null +++ b/Monitor/Pages/ManageSMS.cshtml.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using Microsoft.AspNetCore.Http; +using Core.Main; +using Core.Main.DataObjects.PTMagicData; +using Newtonsoft.Json; + +namespace Monitor.Pages { + public class ManageSMSModel : _Internal.BasePageModelSecure { + public List SingleMarketSettingSummaries = new List(); + + public void OnGet() { + base.Init(); + + BindData(); + } + + private void BindData() { + if (System.IO.File.Exists(PTMagicBasePath + Constants.PTMagicPathData + Path.DirectorySeparatorChar + "SingleMarketSettingSummary.json")) { + try { + SingleMarketSettingSummaries = JsonConvert.DeserializeObject>(System.IO.File.ReadAllText(PTMagicBasePath + Constants.PTMagicPathData + Path.DirectorySeparatorChar + "SingleMarketSettingSummary.json")); + } catch { } + } + + string notification = GetStringParameter("n", ""); + if (notification.Equals("SettingReset")) { + NotifyHeadline = "Setting Reset!"; + NotifyMessage = "The setting will get reset on the next interval!"; + NotifyType = "success"; + } + } + + public double GetTrendChange(string marketTrend, MarketPairSummary mps, TriggerSnapshot ts, string marketTrendRelation) { + double result = 0; + + if (mps.MarketTrendChanges.ContainsKey(marketTrend)) { + result = mps.MarketTrendChanges[marketTrend]; + double averageMarketTrendChange = Summary.MarketTrendChanges[marketTrend].OrderByDescending(mtc => mtc.TrendDateTime).First().TrendChange; + if (marketTrendRelation.Equals(Constants.MarketTrendRelationAbsolute, StringComparison.InvariantCulture)) { + result = result - averageMarketTrendChange; + } else if (marketTrendRelation.Equals(Constants.MarketTrendRelationRelativeTrigger, StringComparison.InvariantCulture)) { + double currentPrice = mps.LatestPrice; + double triggerPrice = ts.LastPrice; + double triggerTrend = (currentPrice - triggerPrice) / triggerPrice * 100; + result = triggerTrend; + } + } + + return result; + } + } +} diff --git a/Monitor/Pages/MarketAnalyzer.cshtml b/Monitor/Pages/MarketAnalyzer.cshtml new file mode 100644 index 0000000..99170bb --- /dev/null +++ b/Monitor/Pages/MarketAnalyzer.cshtml @@ -0,0 +1,245 @@ +@page +@model MarketAnalyzerModel +@{ + ViewData["Title"] = ""; +} + +@section Styles { + + +} +
+
+
+

Market Trend Averages

+ + + + + + + + + + + + @foreach (Core.Main.DataObjects.PTMagicData.MarketTrend marketTrend in Model.MarketTrends.OrderBy(mt => mt.TrendMinutes)) { + if (Model.Summary.MarketTrendChanges.ContainsKey(marketTrend.Name)) { + double trendChange = Model.Summary.MarketTrendChanges[marketTrend.Name].OrderByDescending(mtc => mtc.TrendDateTime).First().TrendChange; + string trendChangeOutput = trendChange.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")); + + int marketCount = marketTrend.MaxMarkets; + string marketCountString = marketCount.ToString(); + + if (marketCount == 0) { + marketCountString = "All"; + } else if (marketCount > Model.Summary.MarketSummary.Keys.Count && marketTrend.Platform.Equals("Exchange", StringComparison.InvariantCultureIgnoreCase)) { + marketCountString = Model.Summary.MarketSummary.Keys.Count.ToString(); + } + + + + + + + } + } + +
NameMarketsTimeframeChange
@Core.Helper.SystemHelper.SplitCamelCase(marketTrend.Name)@marketCountString@Core.Helper.SystemHelper.GetProperDurationTime(marketTrend.TrendMinutes * 60, false)@trendChangeOutput%
+ + @if (!Model.TrendChartDataJSON.Equals("")) { +
+ +
+ } else { +

Not able to load graph, no market trend data found.
If you still do not see a graph after more than hour, report an issue.

+ } +
+
+
+ +
+
+
+ +

Trend Overview for @Model.Summary.MarketSummary.Keys.Count markets on @Model.PTMagicConfiguration.GeneralSettings.Application.Exchange

+ +
+
+
+
+ +
+
+ The absolute trend changes are the trend changes for each coin on its own for the specified timeframe without putting the change into any relation with the overall market. +
+
+ The relative trend changes are the trend changes for each coin in relation (or compared) to the overall market trend for the specified timeframe. +
+
+ + @{ + List marketTrends = Model.MarketTrends.FindAll(mt => mt.Platform.Equals("Exchange") && mt.DisplayOnMarketAnalyzerList); + } + + + + + + + + + + + @foreach (Core.Main.DataObjects.PTMagicData.MarketTrend marketTrend in marketTrends) { + + } + + + + @foreach (string market in Model.Summary.MarketSummary.Keys.OrderBy(m => m)) { + Core.Main.DataObjects.PTMagicData.MarketPairSummary mps = Model.Summary.MarketSummary[market]; + int marketTrendsDisplayed = 0; + + + + + @if (mps.ActiveSingleSettings == null || mps.ActiveSingleSettings.Count == 0) { + + } else { + + } + + + @foreach (Core.Main.DataObjects.PTMagicData.MarketTrend marketTrend in marketTrends) { + if (mps.MarketTrendChanges.ContainsKey(marketTrend.Name)) { + marketTrendsDisplayed++; + string trendChangeOutput = mps.MarketTrendChanges[marketTrend.Name].ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")); + + } + } + @for (int i = 0; i < marketTrends.Count - marketTrendsDisplayed; i++) { + + } + + } + + + + + + + + + + + + + @foreach (Core.Main.DataObjects.PTMagicData.MarketTrend marketTrend in marketTrends) { + + } + + + + @foreach (string market in Model.Summary.MarketSummary.Keys.OrderBy(m => m)) { + Core.Main.DataObjects.PTMagicData.MarketPairSummary mps = Model.Summary.MarketSummary[market]; + int marketTrendsDisplayed = 0; + + + + + @if (mps.ActiveSingleSettings == null || mps.ActiveSingleSettings.Count == 0) { + + } else { + + } + + + @foreach (Core.Main.DataObjects.PTMagicData.MarketTrend marketTrend in marketTrends) { + if (mps.MarketTrendChanges.ContainsKey(marketTrend.Name)) { + marketTrendsDisplayed++; + double relativeTrend = Model.Summary.MarketSummary[market].MarketTrendChanges[marketTrend.Name] - Model.Summary.MarketTrendChanges[marketTrend.Name].OrderByDescending(mtc => mtc.TrendDateTime).First().TrendChange; + string trendChangeOutput = relativeTrend.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")); + + } + } + @for (int i = 0; i < marketTrends.Count - marketTrendsDisplayed; i++) { + + } + + } + + +
+
+
+ +@section Scripts { + + + + + + +} diff --git a/Monitor/Pages/MarketAnalyzer.cshtml.cs b/Monitor/Pages/MarketAnalyzer.cshtml.cs new file mode 100644 index 0000000..5a81200 --- /dev/null +++ b/Monitor/Pages/MarketAnalyzer.cshtml.cs @@ -0,0 +1,90 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.AspNetCore.Http; +using Core.Main; +using Core.Helper; +using Core.Main.DataObjects.PTMagicData; + +namespace Monitor.Pages { + public class MarketAnalyzerModel : _Internal.BasePageModelSecure { + public List MarketTrends { get; set; } = new List(); + public string TrendChartDataJSON = ""; + + public void OnGet() { + base.Init(); + + BindData(); + } + + private void BindData() { + // Get market trends + MarketTrends = PTMagicConfiguration.AnalyzerSettings.MarketAnalyzer.MarketTrends.OrderBy(mt => mt.TrendMinutes).ThenByDescending(mt => mt.Platform).ToList(); + + BuildMarketTrendChartData(); + } + + private void BuildMarketTrendChartData() { + if (MarketTrends.Count > 0) { + TrendChartDataJSON = "["; + int mtIndex = 0; + foreach (MarketTrend mt in MarketTrends) { + if (mt.DisplayGraph) { + string lineColor = ""; + if (mtIndex < Constants.ChartLineColors.Length) { + lineColor = Constants.ChartLineColors[mtIndex]; + } else { + lineColor = Constants.ChartLineColors[mtIndex - 20]; + } + + if (Summary.MarketTrendChanges.ContainsKey(mt.Name)) { + List marketTrendChangeSummaries = Summary.MarketTrendChanges[mt.Name]; + + if (marketTrendChangeSummaries.Count > 0) { + if (!TrendChartDataJSON.Equals("[")) TrendChartDataJSON += ","; + + TrendChartDataJSON += "{"; + TrendChartDataJSON += "key: '" + SystemHelper.SplitCamelCase(mt.Name) + "',"; + TrendChartDataJSON += "color: '" + lineColor + "',"; + TrendChartDataJSON += "values: ["; + + // Get trend ticks for chart + DateTime currentDateTime = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, DateTime.Now.Hour, 0, 0); + DateTime startDateTime = currentDateTime.AddHours(-PTMagicConfiguration.GeneralSettings.Monitor.GraphMaxTimeframeHours); + DateTime endDateTime = currentDateTime; + int trendChartTicks = 0; + for (DateTime tickTime = startDateTime; tickTime <= endDateTime; tickTime = tickTime.AddMinutes(PTMagicConfiguration.GeneralSettings.Monitor.GraphIntervalMinutes)) { + List tickRange = marketTrendChangeSummaries.FindAll(m => m.TrendDateTime >= tickTime).OrderBy(m => m.TrendDateTime).ToList(); + if (tickRange.Count > 0) { + MarketTrendChange mtc = tickRange.First(); + if (tickTime != startDateTime) TrendChartDataJSON += ",\n"; + if (Double.IsInfinity(mtc.TrendChange)) mtc.TrendChange = 0; + + TrendChartDataJSON += "{ x: new Date('" + tickTime.ToString("yyyy-MM-ddTHH:mm:ss").Replace(".", ":") + "'), y: " + mtc.TrendChange.ToString("0.00", new System.Globalization.CultureInfo("en-US")) + "}"; + trendChartTicks++; + } + } + + // Add most recent tick + List latestTickRange = marketTrendChangeSummaries.OrderByDescending(m => m.TrendDateTime).ToList(); + if (latestTickRange.Count > 0) { + MarketTrendChange mtc = latestTickRange.First(); + if (trendChartTicks > 0) TrendChartDataJSON += ",\n"; + if (Double.IsInfinity(mtc.TrendChange)) mtc.TrendChange = 0; + + TrendChartDataJSON += "{ x: new Date('" + mtc.TrendDateTime.ToString("yyyy-MM-ddTHH:mm:ss").Replace(".", ":") + "'), y: " + mtc.TrendChange.ToString("0.00", new System.Globalization.CultureInfo("en-US")) + "}"; + } + + TrendChartDataJSON += "]"; + TrendChartDataJSON += "}"; + + mtIndex++; + } + } + } + } + TrendChartDataJSON += "]"; + } + } + } +} diff --git a/Monitor/Pages/PresetFiles.cshtml b/Monitor/Pages/PresetFiles.cshtml new file mode 100644 index 0000000..37e7f02 --- /dev/null +++ b/Monitor/Pages/PresetFiles.cshtml @@ -0,0 +1,144 @@ +@page +@model PresetFilesModel +@{ + ViewData["Title"] = ""; +} + +@section Styles { + +} + +
+
+
+

Preset Files

+ +

+ Use this list to edit your preset files for PTM. +

+
+
+
+ +@foreach (Core.Main.DataObjects.PTMagicData.GlobalSetting globalSetting in Model.GlobalSettingsWithPresets) { + +
+
+
+

+ @Core.Helper.SystemHelper.SplitCamelCase(globalSetting.SettingName) +

+ + +
+
+
+} + +
+ + +
+ +@section Scripts { + + + + +} diff --git a/Monitor/Pages/PresetFiles.cshtml.cs b/Monitor/Pages/PresetFiles.cshtml.cs new file mode 100644 index 0000000..702df82 --- /dev/null +++ b/Monitor/Pages/PresetFiles.cshtml.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.AspNetCore.Http; +using Core.Main; +using Core.Helper; +using Core.Main.DataObjects.PTMagicData; +using System.Globalization; + +namespace Monitor.Pages { + public class PresetFilesModel : _Internal.BasePageModelSecure { + public List GlobalSettingsWithPresets = new List(); + + public void OnGet() { + base.Init(); + + BindData(); + } + + public void BindData() { + string notification = GetStringParameter("n", ""); + if (notification.Equals("PresetFileSaved")) { + NotifyHeadline = "Preset File Saved!"; + NotifyMessage = "The preset file was saved and will be applied during the next interval."; + NotifyType = "success"; + } + + foreach (GlobalSetting globalSetting in PTMagicConfiguration.AnalyzerSettings.GlobalSettings) { + if (globalSetting.PairsProperties.ContainsKey("File") || globalSetting.DCAProperties.ContainsKey("File") || globalSetting.IndicatorsProperties.ContainsKey("File")) { + GlobalSettingsWithPresets.Add(globalSetting); + } + } + } + } +} diff --git a/Monitor/Pages/SalesAnalyzer.cshtml b/Monitor/Pages/SalesAnalyzer.cshtml new file mode 100644 index 0000000..ec7263b --- /dev/null +++ b/Monitor/Pages/SalesAnalyzer.cshtml @@ -0,0 +1,360 @@ +@page +@model SalesAnalyzer +@{ + ViewData["Title"] = ""; +} + +@section Styles { + + + + + +} + +@if (Model.PTData.SellLog.Count == 0) { +
+
+
+

No Sales!

+ +

Sorry, but your Profit Trailer did not sell anything so far. Please wait for the bot to have at least one sale and you will start seeing data in here.

+
+
+
+} else { +
+
+
+

Sales Analysis

+ @{ + double totalProfit = Model.PTData.SellLog.Sum(s => s.Profit); + double totalProfitFiat = Math.Round(totalProfit * Model.Summary.MainMarketPrice, 2); + double percentGain = Math.Round(totalProfit / Model.PTMagicConfiguration.GeneralSettings.Application.StartBalance * 100, 2); + double avgDailyGain = Model.DailyGains.Values.Average(dg => dg); + double avgMonthlyGain = Model.MonthlyGains.Values.Average(dg => dg); + + string percentGainText = percentGain.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")) + "%"; + if (Model.PTData.TransactionData.Transactions.Count > 0) { + percentGainText = ""; + } + } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TotalAVG/DayAVG/Month
Sales@Model.PTData.SellLog.Count@Math.Round((double)Model.PTData.SellLog.Count / (double)Model.PTData.SellLog.GroupBy(d => d.SoldDate.Date).ToList().Count, 2).ToString("#,#0.00", new System.Globalization.CultureInfo("en-US"))@Math.Round((double)Model.PTData.SellLog.Count / (double)Model.PTData.SellLog.GroupBy(d => d.SoldDate.Date.ToString("yyyy-MM")).ToList().Count, 2).ToString("#,#0.00", new System.Globalization.CultureInfo("en-US"))
Profit@totalProfit.ToString("#,#0.00000000", new System.Globalization.CultureInfo("en-US"))@Math.Round(totalProfit / (double)Model.PTData.SellLog.GroupBy(d => d.SoldDate.Date).ToList().Count, 8).ToString("#,#0.00000000", new System.Globalization.CultureInfo("en-US"))@Math.Round(totalProfit / (double)Model.PTData.SellLog.GroupBy(d => d.SoldDate.Date.ToString("yyyy-MM")).ToList().Count, 8).ToString("#,#0.00000000", new System.Globalization.CultureInfo("en-US"))
Profit USD@Html.Raw(Model.MainFiatCurrencySymbol + totalProfitFiat.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")))@Html.Raw(Model.MainFiatCurrencySymbol + Math.Round(totalProfitFiat / (double)Model.PTData.SellLog.GroupBy(d => d.SoldDate.Date).ToList().Count, 8).ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")))@Html.Raw(Model.MainFiatCurrencySymbol + Math.Round(totalProfitFiat / (double)Model.PTData.SellLog.GroupBy(d => d.SoldDate.Date.ToString("yyyy-MM")).ToList().Count, 8).ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")))
% Gain@Html.Raw(percentGainText)@avgDailyGain.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US"))%@avgMonthlyGain.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US"))%
+
+
+ +
+
+ @{ + double currentTotalBalance = Model.PTData.GetCurrentBalance(); + double estimatedBalance1Month = Math.Round(currentTotalBalance * Math.Pow((1 + (avgDailyGain / 100)), 30.0), 8); + double estimatedBalance3Months = Math.Round(currentTotalBalance * Math.Pow((1 + (avgDailyGain / 100)), 90.0), 8); + double estimatedBalance6Months = Math.Round(currentTotalBalance * Math.Pow((1 + (avgDailyGain / 100)), 180.0), 8); + double estimatedBalance1Year = Math.Round(currentTotalBalance * Math.Pow((1 + (avgDailyGain / 100)), 365.0), 8); + } + +

Balance Prediction

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Est. BalanceEst. @Model.Summary.MainFiatCurrency ValueEst. Gain
1 month@estimatedBalance1Month.ToString("#,#0.00000000", new System.Globalization.CultureInfo("en-US"))@Html.Raw(Model.MainFiatCurrencySymbol + Math.Round(estimatedBalance1Month * Model.Summary.MainMarketPrice, 2).ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")))@Math.Round((estimatedBalance1Month - currentTotalBalance) / currentTotalBalance * 100, 2).ToString("#,#0.00", new System.Globalization.CultureInfo("en-US"))%
3 months@estimatedBalance3Months.ToString("#,#0.00000000", new System.Globalization.CultureInfo("en-US"))@Html.Raw(Model.MainFiatCurrencySymbol + Math.Round(estimatedBalance3Months * Model.Summary.MainMarketPrice, 2).ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")))@Math.Round((estimatedBalance3Months - currentTotalBalance) / currentTotalBalance * 100, 2).ToString("#,#0.00", new System.Globalization.CultureInfo("en-US"))%
6 months@estimatedBalance6Months.ToString("#,#0.00000000", new System.Globalization.CultureInfo("en-US"))@Html.Raw(Model.MainFiatCurrencySymbol + Math.Round(estimatedBalance6Months * Model.Summary.MainMarketPrice, 2).ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")))@Math.Round((estimatedBalance6Months - currentTotalBalance) / currentTotalBalance * 100, 2).ToString("#,#0.00", new System.Globalization.CultureInfo("en-US"))%
1 year@estimatedBalance1Year.ToString("#,#0.00000000", new System.Globalization.CultureInfo("en-US"))@Html.Raw(Model.MainFiatCurrencySymbol + Math.Round(estimatedBalance1Year * Model.Summary.MainMarketPrice, 2).ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")))@Math.Round((estimatedBalance1Year - currentTotalBalance) / currentTotalBalance * 100, 2).ToString("#,#0.00", new System.Globalization.CultureInfo("en-US"))%
+
+
+
+ +
+
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+
+ +
+
+
+

Last @Model.PTMagicConfiguration.GeneralSettings.Monitor.MaxDailySummaries days

+ + + + + + + + + + + + + @for (DateTime salesDate = Model.DateTimeNow.DateTime.Date; salesDate >= Model.DateTimeNow.DateTime.AddDays(-Model.PTMagicConfiguration.GeneralSettings.Monitor.MaxDailySummaries) && salesDate >= Model.MinSellLogDate; salesDate = salesDate.AddDays(-1)) { + List salesDateSales = Model.PTData.SellLog.FindAll(sl => sl.SoldDate.Date == salesDate); + double salesDateProfit = salesDateSales.Sum(sl => sl.Profit); + double salesDateProfitFiat = Math.Round(salesDateProfit * Model.Summary.MainMarketPrice, 2); + double salesDateStartBalance = Model.PTData.GetSnapshotBalance(salesDate); + double salesDateGain = Math.Round(salesDateProfit / salesDateStartBalance * 100, 2); + + + + + + + + } + +
DaySalesProfit @Model.Summary.MainMarketProfit @Model.Summary.MainFiatCurrency% Gain
@salesDate.ToShortDateString()@salesDateSales.Count@salesDateProfit.ToString("#,#0.00000000", new System.Globalization.CultureInfo("en-US"))@Html.Raw(Model.MainFiatCurrencySymbol + salesDateProfitFiat.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")))@salesDateGain.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US"))%
+
+
+ +
+
+

Last @Model.PTMagicConfiguration.GeneralSettings.Monitor.MaxMonthlySummaries months

+ + + + + + + + + + + + + + @{ + DateTime minSellLogMonthDate = new DateTime(Model.MinSellLogDate.Year, Model.MinSellLogDate.Month, 1).Date; + DateTime salesMonthStartDate = new DateTime(Model.DateTimeNow.DateTime.Year, Model.DateTimeNow.DateTime.Month, 1).Date; + } + @for (DateTime salesMonthDate = salesMonthStartDate.Date; salesMonthDate >= Model.DateTimeNow.DateTime.AddMonths(-Model.PTMagicConfiguration.GeneralSettings.Monitor.MaxMonthlySummaries) && salesMonthDate >= minSellLogMonthDate; salesMonthDate = salesMonthDate.AddMonths(-1)) { + List salesMonthSales = Model.PTData.SellLog.FindAll(sl => sl.SoldDate.Date.Month == salesMonthDate.Month && sl.SoldDate.Date.Year == salesMonthDate.Year); + double salesDateProfit = salesMonthSales.Sum(sl => sl.Profit); + double salesDateProfitFiat = Math.Round(salesDateProfit * Model.Summary.MainMarketPrice, 2); + double salesDateStartBalance = Model.PTData.GetSnapshotBalance(salesMonthDate); + double salesDateGain = Math.Round(salesDateProfit / salesDateStartBalance * 100, 2); + + double salesDateAVGDailyGain = 0; + double monthDailyProfit = 0; + int days = 0; + for (int d = 1; d <= DateTime.DaysInMonth(salesMonthDate.Year, salesMonthDate.Month); d++) { + DateTime monthDay = salesMonthDate.AddDays(-salesMonthDate.Day + d); + if (monthDay <= Model.DateTimeNow) { + days++; + List monthDaySales = Model.PTData.SellLog.FindAll(sl => sl.SoldDate.Date == monthDay.Date); + double monthDayProfit = monthDaySales.Sum(sl => sl.Profit); + double monthDayStartBalance = Model.PTData.GetSnapshotBalance(monthDay); + monthDailyProfit += Math.Round(monthDayProfit / monthDayStartBalance * 100, 2); + } + } + salesDateAVGDailyGain = Math.Round(monthDailyProfit / days, 2); + + + + + + + + + } + +
MonthSalesProfit @Model.Summary.MainMarketProfit @Model.Summary.MainFiatCurrency% GainAVG %/Day
@salesMonthDate.ToString("MMMM", new System.Globalization.CultureInfo("en-US"))@salesMonthSales.Count@salesDateProfit.ToString("#,#0.00000000", new System.Globalization.CultureInfo("en-US"))@Html.Raw(Model.MainFiatCurrencySymbol + salesDateProfitFiat.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")))@salesDateGain.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US"))%@salesDateAVGDailyGain.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US"))%
+
+
+
+ +
+
+
+ +

Top @Model.PTMagicConfiguration.GeneralSettings.Monitor.MaxTopMarkets Sales Market Analysis

+ + + + + + + + + + + + + + + @{ + var topMarkets = Model.PTData.SellLog.GroupBy(m => m.Market).Select(mg => mg.Sum(m => m.Profit)); + int marketRank = 0; + } + @foreach (KeyValuePair marketData in Model.TopMarkets) { + marketRank++; + int trades = Model.PTData.SellLog.FindAll(m => m.Market == marketData.Key).Count; + double profitFiat = Math.Round(marketData.Value * Model.Summary.MainMarketPrice, 2); + double profitFiatPerTrade = Math.Round(profitFiat / trades, 2); + + + + + + + + + + } + +
RankMarketSalesProfit @Model.Summary.MainMarketProfit @Model.Summary.MainFiatCurrencyProfit @Model.Summary.MainFiatCurrency/TradeProfit %/Trade
@marketRank@marketData.Key@trades@marketData.Value.ToString("#,#0.00000000", new System.Globalization.CultureInfo("en-US"))@profitFiat.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")) @Model.Summary.MainFiatCurrency@profitFiatPerTrade.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")) @Model.Summary.MainFiatCurrency@Model.PTData.SellLog.FindAll(m => m.Market == marketData.Key).Average(p => p.ProfitPercent).ToString("#,#0.00", new System.Globalization.CultureInfo("en-US"))%
+
+
+
+ + +} + +@section Scripts { + + + + + + + + + + + + + + + + + + + + +} diff --git a/Monitor/Pages/SalesAnalyzer.cshtml.cs b/Monitor/Pages/SalesAnalyzer.cshtml.cs new file mode 100644 index 0000000..b5466aa --- /dev/null +++ b/Monitor/Pages/SalesAnalyzer.cshtml.cs @@ -0,0 +1,112 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.AspNetCore.Mvc.RazorPages; +using Core.Main; +using Core.Helper; +using Core.Main.DataObjects; +using Core.Main.DataObjects.PTMagicData; + +namespace Monitor.Pages { + public class SalesAnalyzer : _Internal.BasePageModelSecure { + public ProfitTrailerData PTData = null; + public string TradesChartDataJSON = ""; + public string ProfitChartDataJSON = ""; + public IEnumerable> TopMarkets = null; + public DateTime MinSellLogDate = Constants.confMinDate; + public Dictionary DailyGains = new Dictionary(); + public Dictionary MonthlyGains = new Dictionary(); + public DateTimeOffset DateTimeNow = Constants.confMinDate; + + public void OnGet() { + base.Init(); + + BindData(); + } + + private void BindData() { + PTData = new ProfitTrailerData(PTMagicBasePath, PTMagicConfiguration); + + // Convert local offset time to UTC + TimeSpan offsetTimeSpan = TimeSpan.Parse(PTMagicConfiguration.GeneralSettings.Application.TimezoneOffset.Replace("+", "")); + DateTimeNow = DateTimeOffset.UtcNow.ToOffset(offsetTimeSpan); + + BuildTopMarkets(); + BuildSalesChartData(); + } + + private void BuildTopMarkets() { + var markets = PTData.SellLog.GroupBy(m => m.Market); + Dictionary topMarketsDic = new Dictionary(); + foreach (var market in markets) { + double totalProfit = PTData.SellLog.FindAll(m => m.Market == market.Key).Sum(m => m.Profit); + + topMarketsDic.Add(market.Key, totalProfit); + } + TopMarkets = new SortedDictionary(topMarketsDic).OrderByDescending(m => m.Value).Take(PTMagicConfiguration.GeneralSettings.Monitor.MaxTopMarkets); + } + + private void BuildSalesChartData() { + if (PTData.SellLog.Count > 0) { + MinSellLogDate = PTData.SellLog.OrderBy(sl => sl.SoldDate).First().SoldDate.Date; + DateTime graphStartDate = DateTimeNow.DateTime.Date.AddDays(-30); + if (MinSellLogDate > graphStartDate) graphStartDate = MinSellLogDate; + + int tradeDayIndex = 0; + string tradesPerDayJSON = ""; + string profitPerDayJSON = ""; + for (DateTime salesDate = graphStartDate; salesDate <= DateTimeNow.DateTime.Date; salesDate = salesDate.AddDays(1)) { + if (tradeDayIndex > 0) { + tradesPerDayJSON += ",\n"; + profitPerDayJSON += ",\n"; + } + + int trades = PTData.SellLog.FindAll(t => t.SoldDate.Date == salesDate.Date).Count; + double profit = PTData.SellLog.FindAll(t => t.SoldDate.Date == salesDate.Date).Sum(t => t.Profit); + double profitFiat = Math.Round(profit * Summary.MainMarketPrice, 2); + + tradesPerDayJSON += "{x: new Date('" + salesDate.Date.ToString("yyyy-MM-dd") + "'), y: " + trades + "}"; + profitPerDayJSON += "{x: new Date('" + salesDate.Date.ToString("yyyy-MM-dd") + "'), y: " + profitFiat.ToString("0.00", new System.Globalization.CultureInfo("en-US")) + "}"; + + tradeDayIndex++; + } + + TradesChartDataJSON = "["; + TradesChartDataJSON += "{"; + TradesChartDataJSON += "key: 'Sales',"; + TradesChartDataJSON += "color: '" + Constants.ChartLineColors[0] + "',"; + TradesChartDataJSON += "values: [" + tradesPerDayJSON + "]"; + TradesChartDataJSON += "}"; + TradesChartDataJSON += "]"; + + ProfitChartDataJSON = "["; + ProfitChartDataJSON += "{"; + ProfitChartDataJSON += "key: 'Profit in " + Summary.MainFiatCurrency + "',"; + ProfitChartDataJSON += "color: '" + Constants.ChartLineColors[1] + "',"; + ProfitChartDataJSON += "values: [" + profitPerDayJSON + "]"; + ProfitChartDataJSON += "}"; + ProfitChartDataJSON += "]"; + + for (DateTime salesDate = DateTimeNow.DateTime.Date; salesDate >= MinSellLogDate; salesDate = salesDate.AddDays(-1)) { + List salesDateSales = PTData.SellLog.FindAll(sl => sl.SoldDate.Date == salesDate); + double salesDateProfit = salesDateSales.Sum(sl => sl.Profit); + double salesDateStartBalance = PTData.GetSnapshotBalance(salesDate); + double salesDateGain = Math.Round(salesDateProfit / salesDateStartBalance * 100, 2); + + DailyGains.Add(salesDate, salesDateGain); + } + + DateTime minSellLogMonthDate = new DateTime(MinSellLogDate.Year, MinSellLogDate.Month, 1).Date; + DateTime salesMonthStartDate = new DateTime(DateTimeNow.DateTime.Year, DateTimeNow.DateTime.Month, 1).Date; + for (DateTime salesMonthDate = salesMonthStartDate.Date; salesMonthDate >= minSellLogMonthDate; salesMonthDate = salesMonthDate.AddMonths(-1)) { + List salesMonthSales = PTData.SellLog.FindAll(sl => sl.SoldDate.Date.Month == salesMonthDate.Month && sl.SoldDate.Date.Year == salesMonthDate.Year); + double salesDateProfit = salesMonthSales.Sum(sl => sl.Profit); + double salesDateStartBalance = PTData.GetSnapshotBalance(salesMonthDate); + double salesDateGain = Math.Round(salesDateProfit / salesDateStartBalance * 100, 2); + + MonthlyGains.Add(salesMonthDate, salesDateGain); + } + } + } + } +} diff --git a/Monitor/Pages/SettingsAnalyzer.cshtml b/Monitor/Pages/SettingsAnalyzer.cshtml new file mode 100644 index 0000000..7b9bb05 --- /dev/null +++ b/Monitor/Pages/SettingsAnalyzer.cshtml @@ -0,0 +1,357 @@ +@page +@model SettingsAnalyzerModel +@{ ViewData["Title"] = ""; +} + +@section Styles { + +} + +
+
+
+

Analyzer Settings

+ +

+ In this area you may change the settings of your settings.analyzer.json file. Please use this with caution as all settings you saved here will directly affect your PT Magic bot. +

+

Please note: When you save your settings using this interface, all existing comments will be removed from your settings.analyzer.json!

+
+
+
+ +
+
+
+

Restore Backup

+ +

+ You messed up your settings?
Restore your backup! +

+ + +
+
+
+
+

Download Settings

+ +

+ Want to save or share your settings?
Download them! +

+ + + Download Settings + +
+
+
+
+

Upload Settings

+ +

+ Found some settings somewhere?
Upload them! +

+ + +
+
+
+ +
+
+
+
+
+

Market Trends (@Model.PTMagicConfiguration.AnalyzerSettings.MarketAnalyzer.MarketTrends.Count)

+ + +
+
+

Global Settings (@Model.PTMagicConfiguration.AnalyzerSettings.GlobalSettings.Count)

+ + +
+
+

Single Market Settings (@Model.PTMagicConfiguration.AnalyzerSettings.SingleMarketSettings.Count)

+ + +
+
+ +
+
+ +
+
+
+ + +
+
+
+
+ + +
+
+
+
+
+
+ +
+
+
+
+

Market Analyzer

+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+
+
+
+ +
+ @if (Model.PTMagicConfiguration.AnalyzerSettings.MarketAnalyzer.MarketTrends.Count > 0) { + @foreach (Core.Main.DataObjects.PTMagicData.MarketTrend mt in Model.PTMagicConfiguration.AnalyzerSettings.MarketAnalyzer.MarketTrends) { +
+ } + } else { +
+
+
+ No Market Trends found! +
+
+
+ } +
+ +
+ @if (Model.PTMagicConfiguration.AnalyzerSettings.GlobalSettings.Count > 0) { + @foreach (Core.Main.DataObjects.PTMagicData.GlobalSetting gs in Model.PTMagicConfiguration.AnalyzerSettings.GlobalSettings) { +
+ } + } else { +
+
+
+ No Global Settings found! +
+
+
+ } +
+ +
+ @if (Model.PTMagicConfiguration.AnalyzerSettings.SingleMarketSettings.Count > 0) { + @foreach (Core.Main.DataObjects.PTMagicData.SingleMarketSetting sms in Model.PTMagicConfiguration.AnalyzerSettings.SingleMarketSettings) { +
+ } + } else { +
+
+
+ No Single Market Settings found! +
+
+
+ } +
+ +
+
+
+ + Loading settings, please wait... + +
+
+
+ + +
+ + + + + + + +@section Scripts { + + + + +} diff --git a/Monitor/Pages/SettingsAnalyzer.cshtml.cs b/Monitor/Pages/SettingsAnalyzer.cshtml.cs new file mode 100644 index 0000000..570e4bd --- /dev/null +++ b/Monitor/Pages/SettingsAnalyzer.cshtml.cs @@ -0,0 +1,333 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.AspNetCore.Http; +using Core.Main; +using Core.Helper; +using Core.Main.DataObjects.PTMagicData; +using Microsoft.Extensions.Primitives; + +namespace Monitor.Pages { + public class SettingsAnalyzerModel : _Internal.BasePageModelSecure { + public string ValidationMessage = ""; + + public void OnGet() { + base.Init(); + + string notification = GetStringParameter("n", ""); + if (notification.Equals("BackupRestored")) { + NotifyHeadline = "Backup restored!"; + NotifyMessage = "Your backup of settings.analyzer.json was successfully restored."; + NotifyType = "success"; + } + } + + public void OnPost() { + base.Init(); + + PTMagicConfiguration.AnalyzerSettings.MarketAnalyzer.StoreDataMaxHours = SystemHelper.TextToInteger(HttpContext.Request.Form["MarketAnalyzer_StoreDataMaxHours"], PTMagicConfiguration.AnalyzerSettings.MarketAnalyzer.StoreDataMaxHours); + PTMagicConfiguration.AnalyzerSettings.MarketAnalyzer.IntervalMinutes = SystemHelper.TextToInteger(HttpContext.Request.Form["MarketAnalyzer_IntervalMinutes"], PTMagicConfiguration.AnalyzerSettings.MarketAnalyzer.IntervalMinutes); + PTMagicConfiguration.AnalyzerSettings.MarketAnalyzer.ExcludeMainCurrency = HttpContext.Request.Form["MarketAnalyzer_ExcludeMainCurrency"].Equals("on"); + + List formKeys = HttpContext.Request.Form.Keys.ToList(); + + SaveMarketTrends(formKeys); + SaveGlobalSettings(formKeys); + SaveSingleMarketSettings(formKeys); + + PTMagicConfiguration.WriteAnalyzerSettings(PTMagicBasePath); + + NotifyHeadline = "Settings saved!"; + NotifyMessage = "Settings saved successfully to settings.analyzer.json."; + NotifyType = "success"; + } + + private void SaveMarketTrends(List formKeys) { + List newMarketTrends = new List(); + List marketTrendFormKeys = formKeys.FindAll(k => k.StartsWith("MarketAnalyzer_MarketTrend_") && k.EndsWith("|Name")); + foreach (string marketTrendFormKey in marketTrendFormKeys) { + MarketTrend mt = null; + + string originalNameSimplified = marketTrendFormKey.Replace("MarketAnalyzer_MarketTrend_", "").Replace("|Name", ""); + string mtFormKey = "MarketAnalyzer_MarketTrend_" + originalNameSimplified + "|"; + + if (originalNameSimplified.Equals("")) { + mt = new MarketTrend(); + } else { + mt = PTMagicConfiguration.AnalyzerSettings.MarketAnalyzer.MarketTrends.Find(m => SystemHelper.StripBadCode(m.Name, Constants.WhiteListNames).Equals(originalNameSimplified)); + } + + mt.Name = HttpContext.Request.Form[marketTrendFormKey]; + mt.Platform = HttpContext.Request.Form[mtFormKey + "Platform"]; + mt.MaxMarkets = SystemHelper.TextToInteger(HttpContext.Request.Form[mtFormKey + "MaxMarkets"], mt.MaxMarkets); + mt.TrendMinutes = SystemHelper.TextToInteger(HttpContext.Request.Form[mtFormKey + "TrendMinutes"], mt.TrendMinutes); + mt.TrendCurrency = HttpContext.Request.Form[mtFormKey + "TrendCurrency"]; + mt.IgnoredMarkets = HttpContext.Request.Form[mtFormKey + "IgnoredMarkets"]; + mt.AllowedMarkets = HttpContext.Request.Form[mtFormKey + "AllowedMarkets"]; + mt.DisplayGraph = HttpContext.Request.Form[mtFormKey + "DisplayGraph"].Equals("on"); + mt.ExcludeMainCurrency = HttpContext.Request.Form[mtFormKey + "ExcludeMainCurrency"].Equals("on"); + + newMarketTrends.Add(mt); + } + PTMagicConfiguration.AnalyzerSettings.MarketAnalyzer.MarketTrends = newMarketTrends; + } + + private void SaveGlobalSettings(List formKeys) { + List newGlobalMarketSettings = new List(); + List globalSettingFormKeys = formKeys.FindAll(k => k.StartsWith("MarketAnalyzer_GlobalSetting_") && k.EndsWith("|SettingName")); + foreach (string globalSettingFormKey in globalSettingFormKeys) { + GlobalSetting gs = null; + + string originalNameSimplified = globalSettingFormKey.Replace("MarketAnalyzer_GlobalSetting_", "").Replace("|SettingName", ""); + string gsFormKey = "MarketAnalyzer_GlobalSetting_" + originalNameSimplified + "|"; + + if (originalNameSimplified.Equals("")) { + gs = new GlobalSetting(); + } else { + gs = PTMagicConfiguration.AnalyzerSettings.GlobalSettings.Find(s => SystemHelper.StripBadCode(s.SettingName, Constants.WhiteListNames).Equals(originalNameSimplified)); + } + + gs.SettingName = SystemHelper.StripBadCode(HttpContext.Request.Form[gsFormKey + "SettingName"], Constants.WhiteListNames); + gs.TriggerConnection = HttpContext.Request.Form[gsFormKey + "TriggerConnection"]; + + // Triggers + if (!gs.SettingName.Equals("Default", StringComparison.InvariantCultureIgnoreCase)) { + List newTriggers = new List(); + List globalSettingTriggerFormKeys = formKeys.FindAll(k => k.StartsWith(gsFormKey + "Trigger_") && k.EndsWith("|MarketTrendName")); + foreach (string globalSettingTriggerFormKey in globalSettingTriggerFormKeys) { + Trigger trigger = null; + + string originalTriggerNameSimplified = globalSettingTriggerFormKey.Replace(gsFormKey + "Trigger_", "").Replace("|MarketTrendName", ""); + string tFormKey = gsFormKey + "Trigger_" + originalTriggerNameSimplified + "|"; + + for (int f = 0; f < HttpContext.Request.Form[tFormKey + "MarketTrendName"].Count; f++) { + + if (originalTriggerNameSimplified.Equals("")) { + trigger = new Trigger(); + } else { + trigger = gs.Triggers.Find(t => SystemHelper.StripBadCode(t.MarketTrendName, Constants.WhiteListNames).Equals(originalTriggerNameSimplified)); + } + + trigger.MarketTrendName = HttpContext.Request.Form[tFormKey + "MarketTrendName"][f]; + trigger.MinChange = SystemHelper.TextToDouble(HttpContext.Request.Form[tFormKey + "MinChange"][f], Constants.MinTrendChange, "en-US"); + trigger.MaxChange = SystemHelper.TextToDouble(HttpContext.Request.Form[tFormKey + "MaxChange"][f], Constants.MaxTrendChange, "en-US"); + + newTriggers.Add(trigger); + } + } + gs.Triggers = newTriggers; + } + + // Pairs Properties + Dictionary newPairsProperties = GetProfitTrailerProperties(formKeys, gsFormKey, "Pairs"); + gs.PairsProperties = newPairsProperties; + + // DCA Properties + Dictionary newDCAProperties = GetProfitTrailerProperties(formKeys, gsFormKey, "DCA"); + gs.DCAProperties = newDCAProperties; + + // Indicators Properties + Dictionary newIndicatorsProperties = GetProfitTrailerProperties(formKeys, gsFormKey, "Indicators"); + gs.IndicatorsProperties = newIndicatorsProperties; + + newGlobalMarketSettings.Add(gs); + } + PTMagicConfiguration.AnalyzerSettings.GlobalSettings = newGlobalMarketSettings; + } + + private void SaveSingleMarketSettings(List formKeys) { + List newSingleMarketMarketSettings = new List(); + List singleMarketSettingFormKeys = formKeys.FindAll(k => k.StartsWith("MarketAnalyzer_SingleMarketSetting_") && k.EndsWith("|SettingName")); + foreach (string singleMarketSettingFormKey in singleMarketSettingFormKeys) { + SingleMarketSetting sms = null; + + string originalNameSimplified = singleMarketSettingFormKey.Replace("MarketAnalyzer_SingleMarketSetting_", "").Replace("|SettingName", ""); + string smsFormKey = "MarketAnalyzer_SingleMarketSetting_" + originalNameSimplified + "|"; + + if (originalNameSimplified.Equals("")) { + sms = new SingleMarketSetting(); + } else { + sms = PTMagicConfiguration.AnalyzerSettings.SingleMarketSettings.Find(s => SystemHelper.StripBadCode(s.SettingName, Constants.WhiteListNames).Equals(originalNameSimplified)); + } + + sms.SettingName = SystemHelper.StripBadCode(HttpContext.Request.Form[smsFormKey + "SettingName"], Constants.WhiteListNames); + sms.TriggerConnection = HttpContext.Request.Form[smsFormKey + "TriggerConnection"]; + sms.OffTriggerConnection = HttpContext.Request.Form[smsFormKey + "OffTriggerConnection"]; + sms.IgnoredMarkets = HttpContext.Request.Form[smsFormKey + "IgnoredMarkets"]; + sms.AllowedMarkets = HttpContext.Request.Form[smsFormKey + "AllowedMarkets"]; + sms.StopProcessWhenTriggered = HttpContext.Request.Form[smsFormKey + "StopProcessWhenTriggered"].Equals("on"); + + #region Triggers + List newTriggers = new List(); + List singleMarketSettingTriggerFormKeys = formKeys.FindAll(k => k.StartsWith(smsFormKey + "Trigger_") && k.EndsWith("|MarketTrendName")); + foreach (string singleMarketSettingTriggerFormKey in singleMarketSettingTriggerFormKeys) { + Trigger trigger = null; + + string originalTriggerNameSimplified = singleMarketSettingTriggerFormKey.Replace(smsFormKey + "Trigger_", "").Replace("|MarketTrendName", ""); + string tFormKey = smsFormKey + "Trigger_" + originalTriggerNameSimplified + "|"; + + for (int f = 0; f < HttpContext.Request.Form[tFormKey + "MarketTrendName"].Count; f++) { + if (originalTriggerNameSimplified.Equals("")) { + trigger = new Trigger(); + } else { + trigger = sms.Triggers.Find(t => SystemHelper.StripBadCode(t.MarketTrendName, Constants.WhiteListNames).Equals(originalTriggerNameSimplified)); + } + + trigger.MarketTrendName = HttpContext.Request.Form[tFormKey + "MarketTrendName"][f]; + trigger.MarketTrendRelation = HttpContext.Request.Form[tFormKey + "MarketTrendRelation"][f]; + trigger.MinChange = SystemHelper.TextToDouble(HttpContext.Request.Form[tFormKey + "MinChange"][f], Constants.MinTrendChange, "en-US"); + trigger.MaxChange = SystemHelper.TextToDouble(HttpContext.Request.Form[tFormKey + "MaxChange"][f], Constants.MaxTrendChange, "en-US"); + + newTriggers.Add(trigger); + } + } + + List singleMarketSettingCoinAgeTriggerFormKeys = formKeys.FindAll(k => k.StartsWith(smsFormKey + "Trigger_AgeDaysLowerThan")); + foreach (string singleMarketSettingCoinAgeTriggerFormKey in singleMarketSettingCoinAgeTriggerFormKeys) { + Trigger trigger = null; + + string originalTriggerIndex = singleMarketSettingCoinAgeTriggerFormKey.Replace(smsFormKey + "Trigger_AgeDaysLowerThan", ""); + string tFormKey = smsFormKey + "Trigger_AgeDaysLowerThan" + originalTriggerIndex; + + for (int f = 0; f < HttpContext.Request.Form[tFormKey].Count; f++) { + trigger = new Trigger(); + + trigger.AgeDaysLowerThan = SystemHelper.TextToInteger(HttpContext.Request.Form[tFormKey][f], 0); + + newTriggers.Add(trigger); + } + } + + List singleMarketSetting24hVolumeTriggerFormKeys = formKeys.FindAll(k => k.StartsWith(smsFormKey + "Trigger_24hVolume") && k.EndsWith("|Min24hVolume")); + foreach (string singleMarketSetting24hVolumeTriggerFormKey in singleMarketSetting24hVolumeTriggerFormKeys) { + Trigger trigger = null; + + string originalTriggerIndex = singleMarketSetting24hVolumeTriggerFormKey.Replace(smsFormKey + "Trigger_24hVolume", "").Replace("|Min24hVolume", ""); + string tFormKey = smsFormKey + "Trigger_24hVolume" + originalTriggerIndex + "|"; + + for (int f = 0; f < HttpContext.Request.Form[tFormKey + "Min24hVolume"].Count; f++) { + trigger = new Trigger(); + + trigger.Min24hVolume = SystemHelper.TextToDouble(HttpContext.Request.Form[tFormKey + "Min24hVolume"][f], 0, "en-US"); + trigger.Max24hVolume = SystemHelper.TextToDouble(HttpContext.Request.Form[tFormKey + "Max24hVolume"][f], Constants.Max24hVolume, "en-US"); + + newTriggers.Add(trigger); + } + } + sms.Triggers = newTriggers; + + #endregion + + #region Off Triggers + List newOffTriggers = new List(); + List singleMarketSettingOffTriggerFormKeys = formKeys.FindAll(k => k.StartsWith(smsFormKey + "OffTrigger_") && k.EndsWith("|MarketTrendName")); + foreach (string singleMarketSettingOffTriggerFormKey in singleMarketSettingOffTriggerFormKeys) { + OffTrigger offTrigger = null; + + string originalOffTriggerNameSimplified = singleMarketSettingOffTriggerFormKey.Replace(smsFormKey + "OffTrigger_", "").Replace("|MarketTrendName", ""); + string tFormKey = smsFormKey + "OffTrigger_" + originalOffTriggerNameSimplified + "|"; + + for (int f = 0; f < HttpContext.Request.Form[tFormKey + "MarketTrendName"].Count; f++) { + if (originalOffTriggerNameSimplified.Equals("")) { + offTrigger = new OffTrigger(); + } else { + offTrigger = sms.OffTriggers.Find(t => SystemHelper.StripBadCode(t.MarketTrendName, Constants.WhiteListNames).Equals(originalOffTriggerNameSimplified)); + } + + offTrigger.MarketTrendName = HttpContext.Request.Form[tFormKey + "MarketTrendName"][f]; + offTrigger.MarketTrendRelation = HttpContext.Request.Form[tFormKey + "MarketTrendRelation"][f]; + offTrigger.MinChange = SystemHelper.TextToDouble(HttpContext.Request.Form[tFormKey + "MinChange"][f], Constants.MinTrendChange, "en-US"); + offTrigger.MaxChange = SystemHelper.TextToDouble(HttpContext.Request.Form[tFormKey + "MaxChange"][f], Constants.MaxTrendChange, "en-US"); + + newOffTriggers.Add(offTrigger); + } + } + + List singleMarketSettingHoursActiveOffTriggerFormKeys = formKeys.FindAll(k => k.StartsWith(smsFormKey + "OffTrigger_HoursSinceTriggered")); + foreach (string singleMarketSettingHoursActiveOffTriggerFormKey in singleMarketSettingHoursActiveOffTriggerFormKeys) { + OffTrigger offTrigger = null; + + string originalOffTriggerIndex = singleMarketSettingHoursActiveOffTriggerFormKey.Replace(smsFormKey + "OffTrigger_HoursSinceTriggered", ""); + string tFormKey = smsFormKey + "OffTrigger_HoursSinceTriggered" + originalOffTriggerIndex; + + for (int f = 0; f < HttpContext.Request.Form[tFormKey].Count; f++) { + offTrigger = new OffTrigger(); + + offTrigger.HoursSinceTriggered = SystemHelper.TextToInteger(HttpContext.Request.Form[tFormKey][f], 0); + + newOffTriggers.Add(offTrigger); + } + } + + List singleMarketSetting24hVolumeOffTriggerFormKeys = formKeys.FindAll(k => k.StartsWith(smsFormKey + "OffTrigger_24hVolume") && k.EndsWith("|Min24hVolume")); + foreach (string singleMarketSetting24hVolumeOffTriggerFormKey in singleMarketSetting24hVolumeOffTriggerFormKeys) { + OffTrigger offTrigger = null; + + string originalOffTriggerIndex = singleMarketSetting24hVolumeOffTriggerFormKey.Replace(smsFormKey + "OffTrigger_24hVolume", "").Replace("|Min24hVolume", ""); + string tFormKey = smsFormKey + "OffTrigger_24hVolume" + originalOffTriggerIndex + "|"; + + for (int f = 0; f < HttpContext.Request.Form[tFormKey + "Min24hVolume"].Count; f++) { + offTrigger = new OffTrigger(); + + offTrigger.Min24hVolume = SystemHelper.TextToDouble(HttpContext.Request.Form[tFormKey + "Min24hVolume"][f], 0, "en-US"); + offTrigger.Max24hVolume = SystemHelper.TextToDouble(HttpContext.Request.Form[tFormKey + "Max24hVolume"][f], Constants.Max24hVolume, "en-US"); + + newOffTriggers.Add(offTrigger); + } + } + sms.OffTriggers = newOffTriggers; + + #endregion + + // Pairs Properties + Dictionary newPairsProperties = GetProfitTrailerProperties(formKeys, smsFormKey, "Pairs"); + sms.PairsProperties = newPairsProperties; + + // DCA Properties + Dictionary newDCAProperties = GetProfitTrailerProperties(formKeys, smsFormKey, "DCA"); + sms.DCAProperties = newDCAProperties; + + // Indicators Properties + Dictionary newIndicatorsProperties = GetProfitTrailerProperties(formKeys, smsFormKey, "Indicators"); + sms.IndicatorsProperties = newIndicatorsProperties; + + newSingleMarketMarketSettings.Add(sms); + } + PTMagicConfiguration.AnalyzerSettings.SingleMarketSettings = newSingleMarketMarketSettings; + } + + private Dictionary GetProfitTrailerProperties(List formKeys, string sFormKey, string propertyType) { + Dictionary result = new Dictionary(); + + List globalSettingPairsPropertiesFormKeys = formKeys.FindAll(k => k.StartsWith(sFormKey + propertyType + "Property_") && k.IndexOf("|Value") == -1); + foreach (string globalSettingPairsFormKey in globalSettingPairsPropertiesFormKeys) { + string originalKeySimplified = globalSettingPairsFormKey.Replace(sFormKey + propertyType + "Property_", ""); + string propertyFormKey = sFormKey + propertyType + "Property_" + originalKeySimplified; + + for (int f = 0; f < HttpContext.Request.Form[propertyFormKey].Count; f++) { + string propertyKey = HttpContext.Request.Form[propertyFormKey][f] + HttpContext.Request.Form[propertyFormKey + "|ValueMode"][f]; + string propertyValueString = HttpContext.Request.Form[propertyFormKey + "|Value"][f]; + + object propertyValue = new object(); + if (propertyValueString.Equals("true", StringComparison.InvariantCultureIgnoreCase) | propertyValueString.Equals("false", StringComparison.InvariantCultureIgnoreCase)) { + propertyValue = Convert.ToBoolean(propertyValueString); + } else { + if (SystemHelper.IsDouble(propertyValueString, "en-US")) { + propertyValue = SystemHelper.TextToDouble(propertyValueString, 0, "en-US"); + + if (((double)propertyValue % 1) == 0) { + propertyValue = Convert.ToInt32(propertyValue); + } + } else { + propertyValue = propertyValueString; + } + } + + result.Add(propertyKey, propertyValue); + } + } + + return result; + } + } +} diff --git a/Monitor/Pages/SettingsGeneral.cshtml b/Monitor/Pages/SettingsGeneral.cshtml new file mode 100644 index 0000000..a7335e7 --- /dev/null +++ b/Monitor/Pages/SettingsGeneral.cshtml @@ -0,0 +1,477 @@ +@page +@model SettingsGeneralModel +@{ + ViewData["Title"] = ""; +} + +@section Styles { + +} + +
+
+
+

General Settings

+ +

+ In this area you may change the settings of your settings.general.json file. Please use this with caution as all settings you saved here will directly affect your PT Magic bot. +

+

Please note: When you save your settings using this interface, all existing comments will be removed from your settings.general.json!

+
+
+
+ +
+
+
+

Restore Backup

+ +

+ PT Magic automatically creates a backup when you save your settings.general.json file using this interface. In case you notice some suspicious behaviour or just want to go back to your previous settings, you may restore the most recent backup here. +

+ + +
+
+
+ +
+
+
+
+

Application

+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ @Model.PTMagicConfiguration.GeneralSettings.Application.ProfitTrailerMajorVersion +
+
+ +
+ +
+ @Model.PTMagicConfiguration.GeneralSettings.Application.ProfitTrailerPath +
+
+ +
+ +
+ @Model.PTMagicConfiguration.GetProfitTrailerLicenseKeyMasked() +
+
+ + + +
+ +
+ @Model.PTMagicConfiguration.GeneralSettings.Application.ProfitTrailerDefaultSettingName +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+
+
+
+ +
+
+
+

Monitor

+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ @Model.PTMagicConfiguration.GeneralSettings.Monitor.Port +
+
+ +
+ +
+ @Model.PTMagicConfiguration.GeneralSettings.Monitor.RootUrl +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+
+
+
+ +
+
+
+

Backup

+ +
+ +
+ +
+
+ +
+ +
+ +
+
+
+
+
+ +
+
+
+

Telegram

+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+
+
+
+ + @if (!Model.ValidationMessage.Equals("")) { +
+
+
+ @Model.ValidationMessage +
+
+
+ } + + +
+ + + + + + + +@section Scripts { + + + +} diff --git a/Monitor/Pages/SettingsGeneral.cshtml.cs b/Monitor/Pages/SettingsGeneral.cshtml.cs new file mode 100644 index 0000000..395b73e --- /dev/null +++ b/Monitor/Pages/SettingsGeneral.cshtml.cs @@ -0,0 +1,98 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.AspNetCore.Http; +using Core.Main; +using Core.Helper; +using Core.Main.DataObjects.PTMagicData; + +namespace Monitor.Pages { + public class SettingsGeneralModel : _Internal.BasePageModelSecure { + public string ValidationMessage = ""; + + private string GetTimezoneOffsetString(TimeZoneInfo tzi) { + string result = ""; + + result += (tzi.BaseUtcOffset >= TimeSpan.Zero) ? "+" : "-"; + result += Math.Abs(tzi.BaseUtcOffset.Hours).ToString().Trim(); + result += ":"; + result += Math.Abs(tzi.BaseUtcOffset.Minutes).ToString("00").Trim(); + + return result; + } + + public string GetTimezoneSelection() { + string result = ""; + + List tzOffsetList = new List(); + foreach (TimeZoneInfo tzi in TimeZoneInfo.GetSystemTimeZones()) { + string offsetString = this.GetTimezoneOffsetString(tzi); + if (!tzOffsetList.Contains(offsetString)) { + string selected = ""; + if (PTMagicConfiguration.GeneralSettings.Application.TimezoneOffset.Equals(offsetString, StringComparison.InvariantCultureIgnoreCase)) { + selected = " selected=\"selected\""; + } + + result += "" + offsetString + "\n"; + tzOffsetList.Add(offsetString); + } + } + + return result; + } + + public void OnGet() { + base.Init(); + + string notification = GetStringParameter("n", ""); + if (notification.Equals("BackupRestored")) { + NotifyHeadline = "Backup restored!"; + NotifyMessage = "Your backup of settings.general.json was successfully restored."; + NotifyType = "success"; + } + } + + public void OnPost() { + base.Init(); + + PTMagicConfiguration.GeneralSettings.Application.IsEnabled = HttpContext.Request.Form["Application_IsEnabled"].Equals("on"); + PTMagicConfiguration.GeneralSettings.Application.TestMode = HttpContext.Request.Form["Application_TestMode"].Equals("on"); + PTMagicConfiguration.GeneralSettings.Application.Exchange = HttpContext.Request.Form["Application_Exchange"]; + PTMagicConfiguration.GeneralSettings.Application.StartBalance = SystemHelper.TextToDouble(HttpContext.Request.Form["Application_StartBalance"], PTMagicConfiguration.GeneralSettings.Application.StartBalance, "en-US"); + PTMagicConfiguration.GeneralSettings.Application.TimezoneOffset = HttpContext.Request.Form["Application_TimezoneOffset"].ToString().Replace(" ", ""); + PTMagicConfiguration.GeneralSettings.Application.AlwaysLoadDefaultBeforeSwitch = HttpContext.Request.Form["Application_AlwaysLoadDefaultBeforeSwitch"].Equals("on"); + PTMagicConfiguration.GeneralSettings.Application.FloodProtectionMinutes = SystemHelper.TextToInteger(HttpContext.Request.Form["Application_FloodProtectionMinutes"], PTMagicConfiguration.GeneralSettings.Application.FloodProtectionMinutes); + PTMagicConfiguration.GeneralSettings.Application.InstanceName = HttpContext.Request.Form["Application_InstanceName"]; + + PTMagicConfiguration.GeneralSettings.Monitor.IsPasswordProtected = HttpContext.Request.Form["Monitor_IsPasswordProtected"].Equals("on"); + PTMagicConfiguration.GeneralSettings.Monitor.OpenBrowserOnStart = HttpContext.Request.Form["Monitor_OpenBrowserOnStart"].Equals("on"); + PTMagicConfiguration.GeneralSettings.Monitor.GraphIntervalMinutes = SystemHelper.TextToInteger(HttpContext.Request.Form["Monitor_GraphIntervalMinutes"], PTMagicConfiguration.GeneralSettings.Monitor.GraphIntervalMinutes); + PTMagicConfiguration.GeneralSettings.Monitor.GraphMaxTimeframeHours = SystemHelper.TextToInteger(HttpContext.Request.Form["Monitor_GraphMaxTimeframeHours"], PTMagicConfiguration.GeneralSettings.Monitor.GraphMaxTimeframeHours); + PTMagicConfiguration.GeneralSettings.Monitor.RefreshSeconds = SystemHelper.TextToInteger(HttpContext.Request.Form["Monitor_RefreshSeconds"], PTMagicConfiguration.GeneralSettings.Monitor.RefreshSeconds); + PTMagicConfiguration.GeneralSettings.Monitor.BagAnalyzerRefreshSeconds = SystemHelper.TextToInteger(HttpContext.Request.Form["Monitor_BagAnalyzerRefreshSeconds"], PTMagicConfiguration.GeneralSettings.Monitor.BagAnalyzerRefreshSeconds); + PTMagicConfiguration.GeneralSettings.Monitor.BuyAnalyzerRefreshSeconds = SystemHelper.TextToInteger(HttpContext.Request.Form["Monitor_BuyAnalyzerRefreshSeconds"], PTMagicConfiguration.GeneralSettings.Monitor.BuyAnalyzerRefreshSeconds); + PTMagicConfiguration.GeneralSettings.Monitor.LinkPlatform = HttpContext.Request.Form["Monitor_LinkPlatform"]; + PTMagicConfiguration.GeneralSettings.Monitor.MaxTopMarkets = SystemHelper.TextToInteger(HttpContext.Request.Form["Monitor_MaxTopMarkets"], PTMagicConfiguration.GeneralSettings.Monitor.MaxTopMarkets); + PTMagicConfiguration.GeneralSettings.Monitor.MaxDailySummaries = SystemHelper.TextToInteger(HttpContext.Request.Form["Monitor_MaxDailySummaries"], PTMagicConfiguration.GeneralSettings.Monitor.MaxDailySummaries); + PTMagicConfiguration.GeneralSettings.Monitor.MaxMonthlySummaries = SystemHelper.TextToInteger(HttpContext.Request.Form["Monitor_MaxMonthlySummaries"], PTMagicConfiguration.GeneralSettings.Monitor.MaxMonthlySummaries); + PTMagicConfiguration.GeneralSettings.Monitor.MaxDashboardBuyEntries = SystemHelper.TextToInteger(HttpContext.Request.Form["Monitor_MaxDashboardBuyEntries"], PTMagicConfiguration.GeneralSettings.Monitor.MaxDashboardBuyEntries); + PTMagicConfiguration.GeneralSettings.Monitor.MaxDashboardBagEntries = SystemHelper.TextToInteger(HttpContext.Request.Form["Monitor_MaxDashboardBagEntries"], PTMagicConfiguration.GeneralSettings.Monitor.MaxDashboardBagEntries); + PTMagicConfiguration.GeneralSettings.Monitor.MaxDCAPairs = SystemHelper.TextToInteger(HttpContext.Request.Form["Monitor_MaxDCAPairs"], PTMagicConfiguration.GeneralSettings.Monitor.MaxDCAPairs); + PTMagicConfiguration.GeneralSettings.Monitor.DefaultDCAMode = HttpContext.Request.Form["Monitor_DefaultDCAMode"]; + + PTMagicConfiguration.GeneralSettings.Backup.IsEnabled = HttpContext.Request.Form["Backup_IsEnabled"].Equals("on"); + PTMagicConfiguration.GeneralSettings.Backup.MaxHours = SystemHelper.TextToInteger(HttpContext.Request.Form["Backup_MaxHours"], PTMagicConfiguration.GeneralSettings.Backup.MaxHours); + + PTMagicConfiguration.GeneralSettings.Telegram.IsEnabled = HttpContext.Request.Form["Telegram_IsEnabled"].Equals("on"); + PTMagicConfiguration.GeneralSettings.Telegram.BotToken = HttpContext.Request.Form["Telegram_BotToken"].ToString().Trim(); + PTMagicConfiguration.GeneralSettings.Telegram.ChatId = SystemHelper.TextToInteger64(HttpContext.Request.Form["Telegram_ChatId"], PTMagicConfiguration.GeneralSettings.Telegram.ChatId); + PTMagicConfiguration.GeneralSettings.Telegram.SilentMode = HttpContext.Request.Form["Telegram_SilentMode"].Equals("on"); + + PTMagicConfiguration.WriteGeneralSettings(PTMagicBasePath); + + NotifyHeadline = "Settings saved!"; + NotifyMessage = "Settings saved successfully to settings.general.json."; + NotifyType = "success"; + } + } +} diff --git a/Monitor/Pages/SetupPassword.cshtml b/Monitor/Pages/SetupPassword.cshtml new file mode 100644 index 0000000..7c2f9d0 --- /dev/null +++ b/Monitor/Pages/SetupPassword.cshtml @@ -0,0 +1,55 @@ +@page +@model SetupPasswordModel +@{ + ViewData["Title"] = ""; + Layout = "_LayoutPublic"; +} + +@section Styles { + +} + +
+
+

PT Magic

+

Setup your password.

+
+ +
+
+
+
+ +
+
+ +
+
+ +
+
+ + @if (!Model.ValidationMessage.Equals("")) { +
+
+ @Model.ValidationMessage +
+
+ } + +
+
+ +
+
+ +
+ +
+
+ +@section Scripts { + +} \ No newline at end of file diff --git a/Monitor/Pages/SetupPassword.cshtml.cs b/Monitor/Pages/SetupPassword.cshtml.cs new file mode 100644 index 0000000..34e48ab --- /dev/null +++ b/Monitor/Pages/SetupPassword.cshtml.cs @@ -0,0 +1,30 @@ +using System; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Http; +using System.Threading.Tasks; +using Newtonsoft.Json; +using Core.Main; + +namespace Monitor.Pages { + public class SetupPasswordModel : _Internal.BasePageModel { + public string ValidationMessage = ""; + + public void OnGet() { + base.PreInit(); + } + + public void OnPost(string password, string passwordConfirm) { + if (!password.Equals(passwordConfirm)) { + ValidationMessage = "Password does not match the confirmation!"; + } + + if (ModelState.IsValid) { + base.PreInit(); + PTMagicConfiguration.WriteSecureSettings(password, PTMagicBasePath); + + Response.Redirect(PTMagicConfiguration.GeneralSettings.Monitor.RootUrl + "Login"); + } + } + + } +} diff --git a/Monitor/Pages/StatusSummary.cshtml b/Monitor/Pages/StatusSummary.cshtml new file mode 100644 index 0000000..94de61b --- /dev/null +++ b/Monitor/Pages/StatusSummary.cshtml @@ -0,0 +1,286 @@ +@page +@model StatusSummaryModel +@{ + ViewData["Title"] = ""; +} + +@section Styles { + + +} + +
+
+
+

PTMagic Status

+ @{ + DateTime lastRuntime = Model.Summary.LastRuntime; + double elapsedSecondsSinceRuntime = DateTime.Now.Subtract(lastRuntime).TotalSeconds; + double intervalSeconds = Model.PTMagicConfiguration.AnalyzerSettings.MarketAnalyzer.IntervalMinutes * 60.0; + + string ptMagicHealthIcon = ""; + if (elapsedSecondsSinceRuntime > (intervalSeconds + intervalSeconds * 0.2)) { + ptMagicHealthIcon = ""; + } + + string floodProtectionIcon = ""; + if (Model.Summary.FloodProtectedSetting != null) { + floodProtectionIcon = ""; + } + + string lastGlobalSettingSwitch = Core.Helper.SystemHelper.GetProperDurationTime((int)Math.Ceiling(DateTime.Now.Subtract(Model.Summary.LastGlobalSettingSwitch).TotalSeconds)) + " ago"; + if (Model.Summary.LastGlobalSettingSwitch == Core.Main.Constants.confMinDate) { + lastGlobalSettingSwitch = "-"; + } + + int activeSingleSettings = Model.MarketsWithSingleSettings.Count; + string singleSettingInfoIcon = ""; + if (activeSingleSettings > 0) { + singleSettingInfoIcon = "Single Market Settings active for:
-" + Core.Helper.SystemHelper.ConvertListToTokenString(Model.MarketsWithSingleSettings, "
-", true) + "\" data-template=\"\">
"; + } + } + + + + + + + + + + + + + + + + + + + + + + + + +
Active Global Setting@Html.Raw(floodProtectionIcon) @Core.Helper.SystemHelper.SplitCamelCase(Model.Summary.CurrentGlobalSetting.SettingName)
Last Runtime@Html.Raw(ptMagicHealthIcon) @Core.Helper.SystemHelper.GetProperDurationTime((int)Math.Ceiling(elapsedSecondsSinceRuntime)) ago
Last Runtime Length @Core.Helper.SystemHelper.GetProperDurationTime(Model.Summary.LastRuntimeSeconds)
Last Setting Switch@lastGlobalSettingSwitch
Active Single Settings@Html.Raw(singleSettingInfoIcon) @activeSingleSettings
+
+ +
+

Active Settings

+ @{ + string maxCostCaption = "Max"; + if (Model.Summary.ProfitTrailerMajorVersion > 1) { + maxCostCaption = "Initial"; + } + } + + + + + + + @if (Model.Summary.MaxCost > 0) { + + + } else { + + + } + + + + + + + + + + + + + + +
Max Pairs@Model.Summary.MaxTradingPairs.ToString(new System.Globalization.CultureInfo("en-US"))@maxCostCaption Cost@Model.Summary.MaxCost.ToString(new System.Globalization.CultureInfo("en-US"))@maxCostCaption Cost %@Model.Summary.MaxCostPercentage.ToString(new System.Globalization.CultureInfo("en-US"))
DCA Level@Model.Summary.DCALevels.ToString(new System.Globalization.CultureInfo("en-US"))Min Vol.@Model.Summary.MinBuyVolume.ToString(new System.Globalization.CultureInfo("en-US"))
Trailing Buy@Model.Summary.TrailingBuy.ToString(new System.Globalization.CultureInfo("en-US"))Trailing Profit@Model.Summary.TrailingProfit.ToString(new System.Globalization.CultureInfo("en-US"))
+
+ +
+

Active Buy Strategies

+ + + + @if (Model.Summary.BuyStrategies.Count == 0) { + + + + + + + } else { + char buyStrategyIndex = 'A'; + foreach (Core.Main.DataObjects.PTMagicData.StrategySummary buyStrategy in Model.Summary.BuyStrategies) { + + + + + + + buyStrategyIndex++; + } + } + +
Buy Strat.@Model.Summary.BuyStrategyBuy Value@Model.Summary.BuyValue.ToString(new System.Globalization.CultureInfo("en-US"))
Buy Strat. @buyStrategyIndex@buyStrategy.NameBuy Value @buyStrategyIndex@buyStrategy.Value.ToString(new System.Globalization.CultureInfo("en-US"))
+
+ +
+

Active Sell Strategies

+ + + + @if (Model.Summary.SellStrategies.Count == 0) { + + + + + + + } else { + char sellStrategyIndex = 'A'; + foreach (Core.Main.DataObjects.PTMagicData.StrategySummary sellStrategy in Model.Summary.SellStrategies) { + + + + + + + sellStrategyIndex++; + } + } + +
Sell Strat.@Model.Summary.SellStrategySell Value@Model.Summary.SellValue.ToString(new System.Globalization.CultureInfo("en-US"))
Sell Strat. @sellStrategyIndex@sellStrategy.NameSell Value @sellStrategyIndex@sellStrategy.Value.ToString(new System.Globalization.CultureInfo("en-US"))
+
+
+ +
+
+
+
+

Settings Active Time (Last 24h)

+ +
+ +
+
+
+
+
+

Settings Active Time (Last 3 days)

+ +
+ +
+
+ +
+
+ + +
+

Global Settings Log

+ + + + + + + + + + + + @foreach (Core.Main.DataObjects.PTMagicData.GlobalSettingSummary gss in Model.Summary.GlobalSettingSummary.OrderByDescending(g => g.SwitchDateTime).Take(Model.PTMagicConfiguration.GeneralSettings.Monitor.MaxSettingsLogEntries)) { + TimeSpan offsetTimeSpan = TimeSpan.Parse(Model.PTMagicConfiguration.GeneralSettings.Application.TimezoneOffset.Replace("+", "")); + DateTimeOffset settingActivationTime = gss.SwitchDateTime; + settingActivationTime = settingActivationTime.ToOffset(offsetTimeSpan); + + string marketTrendsSummary = ""; + foreach (string mt in gss.MarketTrendChanges.Keys) { + if (!marketTrendsSummary.Equals("")) { + marketTrendsSummary += "
"; + } + marketTrendsSummary += Core.Helper.SystemHelper.SplitCamelCase(mt) + ": " + gss.MarketTrendChanges[mt].TrendChange.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")) + "%"; + } + + + + + + + } + +
Activation TimeSettingActive TimeMarket Trends
@settingActivationTime.DateTime.ToShortDateString() @settingActivationTime.DateTime.ToShortTimeString()@Core.Helper.SystemHelper.SplitCamelCase(gss.SettingName)@Core.Helper.SystemHelper.GetProperDurationTime(gss.ActiveSeconds)@Html.Raw(marketTrendsSummary)
+
+
+ +
+ + +@section Scripts { + + + + + + +} \ No newline at end of file diff --git a/Monitor/Pages/StatusSummary.cshtml.cs b/Monitor/Pages/StatusSummary.cshtml.cs new file mode 100644 index 0000000..95258d3 --- /dev/null +++ b/Monitor/Pages/StatusSummary.cshtml.cs @@ -0,0 +1,169 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.AspNetCore.Http; +using Core.Main; +using Core.Helper; +using Core.Main.DataObjects.PTMagicData; + +namespace Monitor.Pages { + public class StatusSummaryModel : _Internal.BasePageModelSecure { + public List MarketsWithSingleSettings = new List(); + public string SettingsDistribution24hChartDataJSON = ""; + public string SettingsDistribution3dChartDataJSON = ""; + private Dictionary settingsChartColors = new Dictionary(); + + public void OnGet() { + base.Init(); + + BindData(); + } + + private void BindData() { + BuildMarketsWithSingleSettings(); + BuildChartColors(); + Build24hChartData(); + Build3dChartData(); + } + + private void BuildMarketsWithSingleSettings() { + // Get markets with active single settings + foreach (string key in Summary.MarketSummary.Keys) { + if (Summary.MarketSummary[key].ActiveSingleSettings != null) { + if (Summary.MarketSummary[key].ActiveSingleSettings.Count > 0) { + MarketsWithSingleSettings.Add(key); + } + } + } + MarketsWithSingleSettings.Sort(); + } + + private void BuildChartColors() { + int settingIndex = 0; + foreach (GlobalSetting globalSetting in PTMagicConfiguration.AnalyzerSettings.GlobalSettings) { + string chartColor = ""; + if (settingIndex < Constants.ChartLineColors.Length) { + chartColor = Constants.ChartLineColors[settingIndex]; + } else { + chartColor = Constants.ChartLineColors[settingIndex - 20]; + } + + settingsChartColors.Add(globalSetting.SettingName, chartColor); + + settingIndex++; + } + } + + private void Build24hChartData() { + if (Summary.GlobalSettingSummary.Count > 0) { + DateTime dateTime24hAgo = DateTime.Now.AddHours(-24); + List gsSummaries24h = Summary.GlobalSettingSummary.FindAll(gss => gss.SwitchDateTime >= dateTime24hAgo); + IEnumerable gsNames24h = gsSummaries24h.GroupBy(gss => gss.SettingName).Select(group => group.First()); + + if (Summary.GlobalSettingSummary.FindAll(gss => gss.SwitchDateTime <= dateTime24hAgo).Count > 0) { + GlobalSettingSummary gsBefore24h = Summary.GlobalSettingSummary.FindAll(gss => gss.SwitchDateTime <= dateTime24hAgo).OrderByDescending(gss => gss.SwitchDateTime).First(); + if (gsBefore24h != null) { + DateTime gsSwitchedOffDateTime = gsBefore24h.SwitchDateTime.AddSeconds(gsBefore24h.ActiveSeconds); + if (gsSwitchedOffDateTime > dateTime24hAgo) { + gsBefore24h.ActiveSeconds = (int)Math.Floor(gsSwitchedOffDateTime.Subtract(dateTime24hAgo).TotalSeconds); + + gsSummaries24h.Add(gsBefore24h); + + if (gsNames24h.Select(gss => gss.SettingName.Equals(gsBefore24h.SettingName)) == null) { + gsNames24h.Append(gsBefore24h); + } + } + } + } + + if (gsNames24h.Count() > 0) { + SettingsDistribution24hChartDataJSON = "["; + int gssIndex = 0; + double totalCoveredSeconds = gsSummaries24h.Sum(gs => gs.ActiveSeconds); + foreach (GlobalSettingSummary gss in gsNames24h) { + string lineColor = ""; + if (settingsChartColors.ContainsKey(gss.SettingName)) { + lineColor = settingsChartColors[gss.SettingName]; + } else { + if (gssIndex < Constants.ChartLineColors.Length) { + lineColor = Constants.ChartLineColors[gssIndex]; + } else { + lineColor = Constants.ChartLineColors[gssIndex - 20]; + } + } + + if (!SettingsDistribution24hChartDataJSON.Equals("[")) SettingsDistribution24hChartDataJSON += ","; + + double gsActiveSeconds = gsSummaries24h.FindAll(gs => gs.SettingName.Equals(gss.SettingName)).Sum(gs => gs.ActiveSeconds); + double chartValue = gsActiveSeconds / totalCoveredSeconds * 100; + + SettingsDistribution24hChartDataJSON += "{"; + SettingsDistribution24hChartDataJSON += "label: '" + SystemHelper.SplitCamelCase(gss.SettingName) + "',"; + SettingsDistribution24hChartDataJSON += "color: '" + lineColor + "',"; + SettingsDistribution24hChartDataJSON += "value: " + chartValue.ToString("0.00", new System.Globalization.CultureInfo("en-US")) + ""; + SettingsDistribution24hChartDataJSON += "}"; + + gssIndex++; + } + SettingsDistribution24hChartDataJSON += "]"; + } + } + } + + private void Build3dChartData() { + if (Summary.GlobalSettingSummary.Count > 0) { + DateTime dateTime3dAgo = DateTime.Now.AddHours(-72); + List gsSummaries3d = Summary.GlobalSettingSummary.FindAll(gss => gss.SwitchDateTime >= dateTime3dAgo); + IEnumerable gsNames3d = gsSummaries3d.GroupBy(gss => gss.SettingName).Select(group => group.First()); + + if (Summary.GlobalSettingSummary.FindAll(gss => gss.SwitchDateTime <= dateTime3dAgo).Count > 0) { + GlobalSettingSummary gsBefore3d = Summary.GlobalSettingSummary.FindAll(gss => gss.SwitchDateTime <= dateTime3dAgo).OrderByDescending(gss => gss.SwitchDateTime).First(); + if (gsBefore3d != null) { + DateTime gsSwitchedOffDateTime = gsBefore3d.SwitchDateTime.AddSeconds(gsBefore3d.ActiveSeconds); + if (gsSwitchedOffDateTime > dateTime3dAgo) { + gsBefore3d.ActiveSeconds = (int)Math.Floor(gsSwitchedOffDateTime.Subtract(dateTime3dAgo).TotalSeconds); + + gsSummaries3d.Add(gsBefore3d); + + if (gsNames3d.Select(gss => gss.SettingName.Equals(gsBefore3d.SettingName)) == null) { + gsNames3d.Append(gsBefore3d); + } + } + } + } + + if (gsNames3d.Count() > 0) { + SettingsDistribution3dChartDataJSON = "["; + int gssIndex = 0; + double totalCoveredSeconds = gsSummaries3d.Sum(gs => gs.ActiveSeconds); + foreach (GlobalSettingSummary gss in gsNames3d) { + string lineColor = ""; + if (settingsChartColors.ContainsKey(gss.SettingName)) { + lineColor = settingsChartColors[gss.SettingName]; + } else { + if (gssIndex < Constants.ChartLineColors.Length) { + lineColor = Constants.ChartLineColors[gssIndex]; + } else { + lineColor = Constants.ChartLineColors[gssIndex - 20]; + } + } + + if (!SettingsDistribution3dChartDataJSON.Equals("[")) SettingsDistribution3dChartDataJSON += ","; + + double gsActiveSeconds = gsSummaries3d.FindAll(gs => gs.SettingName.Equals(gss.SettingName)).Sum(gs => gs.ActiveSeconds); + double chartValue = gsActiveSeconds / totalCoveredSeconds * 100; + + SettingsDistribution3dChartDataJSON += "{"; + SettingsDistribution3dChartDataJSON += "label: '" + SystemHelper.SplitCamelCase(gss.SettingName) + "',"; + SettingsDistribution3dChartDataJSON += "color: '" + lineColor + "',"; + SettingsDistribution3dChartDataJSON += "value: " + chartValue.ToString("0.00", new System.Globalization.CultureInfo("en-US")) + ""; + SettingsDistribution3dChartDataJSON += "}"; + + gssIndex++; + } + SettingsDistribution3dChartDataJSON += "]"; + } + } + } + } +} diff --git a/Monitor/Pages/Transactions.cshtml b/Monitor/Pages/Transactions.cshtml new file mode 100644 index 0000000..b41eb9a --- /dev/null +++ b/Monitor/Pages/Transactions.cshtml @@ -0,0 +1,174 @@ +@page +@model TransactionsModel +@{ + ViewData["Title"] = ""; +} + +@section Styles { + + + +} + +
+
+
+

Transactions

+ +

+ In this area you may add manual transactions (like deposits and withdrawals) to your PT Magic data. Adding this kind of information will help PT Magic calculating your percentage gains and your balance more accurately. +

+
+
+
+ +
+
+
+
+

New Transaction

+ +
+ +
+ +
+
+ +
+ +
+
+ + +
+
+
+ +
+ +
+
+ + +
+
+
+ +
+ +
+ +
+
+
+
+
+ + @if (!Model.ValidationMessage.Equals("")) { +
+
+
+ @Model.ValidationMessage +
+
+
+ } +
+ + +
+
+
+

Your Transactions

+ + @if (Model.TransactionData.Transactions.Count > 0) { + + + + + + + + + + + @foreach (Core.Main.DataObjects.PTMagicData.Transaction transaction in Model.TransactionData.Transactions) { + + + + + @if (transaction.Amount > 0) { + + } else { + + } + + } + +
TimeAmountType
@transaction.GetLocalDateTime(Model.PTMagicConfiguration.GeneralSettings.Application.TimezoneOffset).ToShortDateString() @transaction.GetLocalDateTime(Model.PTMagicConfiguration.GeneralSettings.Application.TimezoneOffset).ToShortTimeString()@transaction.Amount.ToString("#,#0.00000000", new System.Globalization.CultureInfo("en-US"))DepositWithdrawal
+ } else { +

No transactions found.

+ } +
+
+
+ + + +@section Scripts { + + + + + + + +} diff --git a/Monitor/Pages/Transactions.cshtml.cs b/Monitor/Pages/Transactions.cshtml.cs new file mode 100644 index 0000000..e6f544b --- /dev/null +++ b/Monitor/Pages/Transactions.cshtml.cs @@ -0,0 +1,64 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.AspNetCore.Http; +using Core.Main; +using Core.Helper; +using Core.Main.DataObjects; +using Core.Main.DataObjects.PTMagicData; +using System.Globalization; + +namespace Monitor.Pages { + public class TransactionsModel : _Internal.BasePageModelSecure { + public TransactionData TransactionData = null; + public string ValidationMessage = ""; + + public void OnGet() { + base.Init(); + + BindData(); + } + + private void BindData() { + TransactionData = new TransactionData(PTMagicBasePath); + } + + public void OnPost() { + base.Init(); + + BindData(); + + SaveTransaction(); + } + + private void SaveTransaction() { + double transactionAmount = 0; + DateTimeOffset transactionDateTime = Constants.confMinDate; + + try { + transactionAmount = SystemHelper.TextToDouble(HttpContext.Request.Form["Transaction_Amount"], transactionAmount, "en-US"); + //transactionDateTime = DateTimeOffset.Parse(HttpContext.Request.Form["Transaction_Date"] + " " + HttpContext.Request.Form["Transaction_Time"], CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal); + DateTime tmp = DateTime.Parse(HttpContext.Request.Form["Transaction_Date"] + " " + HttpContext.Request.Form["Transaction_Time"], CultureInfo.InvariantCulture, DateTimeStyles.None); + + // Convert local offset time to UTC + TimeSpan offsetTimeSpan = TimeSpan.Parse(PTMagicConfiguration.GeneralSettings.Application.TimezoneOffset.Replace("+", "")); + transactionDateTime = new DateTimeOffset(tmp, offsetTimeSpan); + } catch { } + + if (transactionAmount == 0) { + ValidationMessage = "Please enter a valid amount in the format 123.45!"; + } else { + if (transactionDateTime == Constants.confMinDate) { + ValidationMessage = "Please select a valid date and time!"; + } else { + TransactionData.Transactions.Add(new Transaction() { GUID = Guid.NewGuid().ToString(), Amount = transactionAmount, UTCDateTime = transactionDateTime.UtcDateTime }); + TransactionData.SaveTransactions(PTMagicBasePath); + + NotifyHeadline = "Transaction saved!"; + NotifyMessage = "Transaction saved successfully to _data/Transactions.json."; + NotifyType = "success"; + } + } + } + } +} diff --git a/Monitor/Pages/_Layout.cshtml b/Monitor/Pages/_Layout.cshtml new file mode 100644 index 0000000..c769dda --- /dev/null +++ b/Monitor/Pages/_Layout.cshtml @@ -0,0 +1,206 @@ + + + + + + + + + + @Model.PTMagicConfiguration.GeneralSettings.Application.InstanceName Monitor @ViewData["Title"] + + @RenderSection("Styles", required: false) + + + + + + + + + + + + +
+
+
+ + + + + + + + + +
+ +
+
+ + + +
+ + +
+
+ + @RenderBody() + +
+ +
+ + + + + + + + + + + + + + + + + + + + @RenderSection("Scripts", required: false) + + + + + + + diff --git a/Monitor/Pages/_LayoutPublic.cshtml b/Monitor/Pages/_LayoutPublic.cshtml new file mode 100644 index 0000000..f6700bb --- /dev/null +++ b/Monitor/Pages/_LayoutPublic.cshtml @@ -0,0 +1,50 @@ + + + + + + + + + + + PT Magic Monitor @ViewData["Title"] + + @RenderSection("Styles", required: false) + + + + + + + + + + + + +
+
+ + @RenderBody() + +
+ + + + + + + + + + + + @RenderSection("Scripts", required: false) + + + + + diff --git a/Monitor/Pages/_ValidationScriptsPartial.cshtml b/Monitor/Pages/_ValidationScriptsPartial.cshtml new file mode 100644 index 0000000..a2b13b3 --- /dev/null +++ b/Monitor/Pages/_ValidationScriptsPartial.cshtml @@ -0,0 +1,18 @@ + + + + + + + + diff --git a/Monitor/Pages/_ViewImports.cshtml b/Monitor/Pages/_ViewImports.cshtml new file mode 100644 index 0000000..7cdd326 --- /dev/null +++ b/Monitor/Pages/_ViewImports.cshtml @@ -0,0 +1,3 @@ +@using Monitor +@namespace Monitor.Pages +@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers diff --git a/Monitor/Pages/_ViewStart.cshtml b/Monitor/Pages/_ViewStart.cshtml new file mode 100644 index 0000000..a5f1004 --- /dev/null +++ b/Monitor/Pages/_ViewStart.cshtml @@ -0,0 +1,3 @@ +@{ + Layout = "_Layout"; +} diff --git a/Monitor/Pages/_get/BagDetails.cshtml b/Monitor/Pages/_get/BagDetails.cshtml new file mode 100644 index 0000000..0bb8b7e --- /dev/null +++ b/Monitor/Pages/_get/BagDetails.cshtml @@ -0,0 +1,267 @@ +@page +@model BagDetailsModel +@{ + Layout = null; + + Core.Main.DataObjects.PTMagicData.MarketPairSummary mps = null; + + if (Model.Summary.MarketSummary.ContainsKey(Model.DCALogData.Market)) { + mps = Model.Summary.MarketSummary[Model.DCALogData.Market]; + } + int nextBuyTrigger = Model.DCALogData.BoughtTimes + 1; + + double nextBuyTriggerPercent = 0; + if (Model.Summary.DCATriggers.Count >= nextBuyTrigger) { + nextBuyTriggerPercent = Model.Summary.DCATriggers[nextBuyTrigger]; + } + + bool buyDisabled = false; + string buyTriggerText = Model.DCALogData.BuyTriggerPercent.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")) + "%"; + + + if (mps != null) { + if (!mps.IsDCAEnabled) { + nextBuyTriggerPercent = 0; + buyDisabled = true; + buyTriggerText = ""; + } else { + if (Model.DCALogData.BuyTriggerPercent == 0) { + Model.DCALogData.BuyTriggerPercent = Model.DCALogData.ProfitPercent; + } + } + } else { + buyDisabled = Model.DCALogData.BuyStrategy == null; + if (Model.DCALogData.BuyTriggerPercent == 0) { + Model.DCALogData.BuyTriggerPercent = Model.DCALogData.ProfitPercent; + } + } + + bool isTrailingBuyActive = Model.DCALogData.IsTrailing; + if (Model.DCALogData.BuyStrategies.Count > 0) { + isTrailingBuyActive = (Model.DCALogData.BuyStrategies.FindAll(bs => !bs.IsTrailing).Count == 0); + } + + string buyStrategyText = Core.ProfitTrailer.StrategyHelper.GetStrategyText(Model.Summary, Model.DCALogData.BuyStrategies, Model.DCALogData.BuyStrategy, isTrailingBuyActive); + if (!Core.ProfitTrailer.StrategyHelper.IsValidStrategy(buyStrategyText, true)) { + buyDisabled = true; + } + + string currentBuyValueText = Core.ProfitTrailer.StrategyHelper.GetCurrentValueText(Model.DCALogData.BuyStrategies, Model.DCALogData.BuyStrategy, Model.DCALogData.CurrentLowBBValue, Model.DCALogData.BuyTriggerPercent, true); + string triggerBuyValueText = Core.ProfitTrailer.StrategyHelper.GetTriggerValueText(Model.Summary, Model.DCALogData.BuyStrategies, Model.DCALogData.BuyStrategy, Model.DCALogData.BBTrigger, Core.Main.Constants.MinTrendChange, Model.DCALogData.BoughtTimes, true); + + string bagAgeText = ""; + int bagAgeSeconds = (int)Math.Ceiling(Model.DateTimeNow.Subtract(Model.DCALogData.FirstBoughtDate).TotalSeconds); + bagAgeText = Core.Helper.SystemHelper.GetProperDurationTime(bagAgeSeconds); + + double nextBuyTriggerPrice = 0.0; + double nextAvgBoughtPrice = 0.0; + if (nextBuyTriggerPercent != 0) { + nextBuyTriggerPrice = Model.DCALogData.AverageBuyPrice + (Model.DCALogData.AverageBuyPrice * nextBuyTriggerPercent / 100); + nextAvgBoughtPrice = (Model.DCALogData.TotalCost + (Model.DCALogData.Amount * nextBuyTriggerPrice)) / (Model.DCALogData.Amount * 2); + } + + bool isTrailingSellActive = false; + if (Model.DCALogData.SellStrategies.Count > 0) { + isTrailingSellActive = (Model.DCALogData.SellStrategies.FindAll(ss => !ss.IsTrailing).Count == 0); + } + + string sellStrategyText = Core.ProfitTrailer.StrategyHelper.GetStrategyText(Model.Summary, Model.DCALogData.SellStrategies, Model.DCALogData.SellStrategy, isTrailingSellActive); + string currentSellValueText = Core.ProfitTrailer.StrategyHelper.GetCurrentValueText(Model.DCALogData.SellStrategies, Model.DCALogData.SellStrategy, Model.DCALogData.CurrentHighBBValue, Model.DCALogData.ProfitPercent, true); + string triggerSellValueText = Core.ProfitTrailer.StrategyHelper.GetTriggerValueText(Model.Summary, Model.DCALogData.SellStrategies, Model.DCALogData.SellStrategy, Model.DCALogData.BBTrigger, Model.DCALogData.SellTrigger, 0, true); + + double sellTriggerPrice = Model.DCALogData.AverageBuyPrice + (Model.DCALogData.AverageBuyPrice * Model.DCALogData.SellTrigger / 100); + + double averageProfitPercent = 0; + if (Model.PTData.SellLog.FindAll(m => m.Market == Model.DCALogData.Market).Count > 0) { + averageProfitPercent = Model.PTData.SellLog.FindAll(m => m.Market == Model.DCALogData.Market).Average(p => p.ProfitPercent); + } + + double investedFiatValue = Math.Round(Model.DCALogData.TotalCost * Model.Summary.MainMarketPrice, 2); + double currentValue = Math.Round(Model.DCALogData.Amount * Model.DCALogData.CurrentPrice, 8); + double currentFiatValue = Math.Round(Model.DCALogData.Amount * Model.DCALogData.CurrentPrice * Model.Summary.MainMarketPrice, 2); + double currentProfit = Math.Round(currentValue - Model.DCALogData.TotalCost, 8); + double currentFiatProfit = Math.Round(currentFiatValue - investedFiatValue, 2); +} + + + + diff --git a/Monitor/Pages/_get/BagDetails.cshtml.cs b/Monitor/Pages/_get/BagDetails.cshtml.cs new file mode 100644 index 0000000..77c7daf --- /dev/null +++ b/Monitor/Pages/_get/BagDetails.cshtml.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.AspNetCore.Http; +using Core.Main; +using Core.Main.DataObjects; +using Core.Main.DataObjects.PTMagicData; +using Core.MarketAnalyzer; + +namespace Monitor.Pages { + public class BagDetailsModel : _Internal.BasePageModelSecure { + public ProfitTrailerData PTData = null; + public string DCAMarket = ""; + public DCALogData DCALogData = null; + public DateTimeOffset DateTimeNow = Constants.confMinDate; + + public void OnGet() { + // Initialize Config + base.Init(); + + BindData(); + } + + private void BindData() { + DCAMarket = GetStringParameter("m", ""); + + PTData = new ProfitTrailerData(PTMagicBasePath, PTMagicConfiguration); + + DCALogData = PTData.DCALog.Find(d => d.Market == DCAMarket); + + // Convert local offset time to UTC + TimeSpan offsetTimeSpan = TimeSpan.Parse(PTMagicConfiguration.GeneralSettings.Application.TimezoneOffset.Replace("+", "")); + DateTimeNow = DateTimeOffset.UtcNow.ToOffset(offsetTimeSpan); + } + } +} diff --git a/Monitor/Pages/_get/BagList.cshtml b/Monitor/Pages/_get/BagList.cshtml new file mode 100644 index 0000000..b01dcf1 --- /dev/null +++ b/Monitor/Pages/_get/BagList.cshtml @@ -0,0 +1,122 @@ +@page +@model BagListModel +@{ + Layout = null; + + System.Reflection.PropertyInfo propertyInfo = typeof(Core.Main.DataObjects.PTMagicData.DCALogData).GetProperty(Model.SortFieldId); + List dcaLogResult = Model.PTData.DCALog.OrderByDescending(d => propertyInfo.GetValue(d, null)).ToList(); + if (Model.SortDirection.Equals("ASC")) { + dcaLogResult = Model.PTData.DCALog.OrderBy(d => propertyInfo.GetValue(d, null)).ToList(); + } +} + +@foreach (Core.Main.DataObjects.PTMagicData.DCALogData dcaLogEntry in dcaLogResult) { + Core.Main.DataObjects.PTMagicData.MarketPairSummary mps = null; + if (Model.Summary.MarketSummary.ContainsKey(dcaLogEntry.Market)) { + mps = Model.Summary.MarketSummary[dcaLogEntry.Market]; + } + int nextBuyTrigger = dcaLogEntry.BoughtTimes + 1; + + double nextBuyTriggerPercent = 0; + if (Model.Summary.DCATriggers.Count >= nextBuyTrigger) { + nextBuyTriggerPercent = Model.Summary.DCATriggers[nextBuyTrigger]; + } + + bool buyDisabled = false; + string buyTriggerText = dcaLogEntry.BuyTriggerPercent.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")) + "%"; + + if (mps != null) { + if (!mps.IsDCAEnabled) { + nextBuyTriggerPercent = 0; + buyDisabled = true; + buyTriggerText = ""; + } else { + if (dcaLogEntry.BuyTriggerPercent == 0) { + dcaLogEntry.BuyTriggerPercent = dcaLogEntry.ProfitPercent; + } + } + } else { + buyDisabled = dcaLogEntry.BuyStrategy == null; + if (dcaLogEntry.BuyTriggerPercent == 0) { + dcaLogEntry.BuyTriggerPercent = dcaLogEntry.ProfitPercent; + } + } + + bool isTrailingBuyActive = dcaLogEntry.IsTrailing; + if (dcaLogEntry.BuyStrategies.Count > 0) { + isTrailingBuyActive = (dcaLogEntry.BuyStrategies.FindAll(bs => !bs.IsTrailing).Count == 0); + } + + string buyStrategyText = Core.ProfitTrailer.StrategyHelper.GetStrategyText(Model.Summary, dcaLogEntry.BuyStrategies, dcaLogEntry.BuyStrategy, isTrailingBuyActive); + if (!Core.ProfitTrailer.StrategyHelper.IsValidStrategy(buyStrategyText, true)) { + buyDisabled = true; + } + + string currentBuyValueText = Core.ProfitTrailer.StrategyHelper.GetCurrentValueText(dcaLogEntry.BuyStrategies, dcaLogEntry.BuyStrategy, dcaLogEntry.CurrentLowBBValue, dcaLogEntry.BuyTriggerPercent, true); + string triggerBuyValueText = Core.ProfitTrailer.StrategyHelper.GetTriggerValueText(Model.Summary, dcaLogEntry.BuyStrategies, dcaLogEntry.BuyStrategy, dcaLogEntry.BBTrigger, Core.Main.Constants.MinTrendChange, dcaLogEntry.BoughtTimes, true); + + bool isTrailingSellActive = false; + if (dcaLogEntry.SellStrategies.Count > 0) { + isTrailingSellActive = (dcaLogEntry.SellStrategies.FindAll(ss => !ss.IsTrailing).Count == 0); + } + + string sellStrategyText = Core.ProfitTrailer.StrategyHelper.GetStrategyText(Model.Summary, dcaLogEntry.SellStrategies, dcaLogEntry.SellStrategy, isTrailingSellActive); + string currentSellValueText = Core.ProfitTrailer.StrategyHelper.GetCurrentValueText(dcaLogEntry.SellStrategies, dcaLogEntry.SellStrategy, dcaLogEntry.CurrentHighBBValue, dcaLogEntry.ProfitPercent, true); + string triggerSellValueText = Core.ProfitTrailer.StrategyHelper.GetTriggerValueText(Model.Summary, dcaLogEntry.SellStrategies, dcaLogEntry.SellStrategy, dcaLogEntry.BBTrigger, dcaLogEntry.SellTrigger, 0, true); + + + @if (mps != null && (mps.ActiveSingleSettings == null || mps.ActiveSingleSettings.Count == 0)) { + @dcaLogEntry.Market + } else { + @dcaLogEntry.Market + } + + @if (dcaLogEntry.BoughtTimes > 0) { + @dcaLogEntry.BoughtTimes; + } + + @if (buyDisabled) { + @Html.Raw(buyStrategyText) + } else { + @Html.Raw(buyStrategyText) + } + + @if (!buyDisabled) { + @Html.Raw(currentBuyValueText) + } + + @if (!buyDisabled && dcaLogEntry.BoughtTimes < Model.Summary.DCALevels) { + @Html.Raw(triggerBuyValueText) + } else { + if (!buyDisabled && dcaLogEntry.BoughtTimes >= Model.Summary.DCALevels) { + MAX + } else { + Disabled! + } + } + @dcaLogEntry.ProfitPercent.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US"))% + @Html.Raw(sellStrategyText) + + @Html.Raw(triggerSellValueText) + + @dcaLogEntry.CurrentPrice.ToString("#,#0.00000000", new System.Globalization.CultureInfo("en-US")) + @dcaLogEntry.AverageBuyPrice.ToString("#,#0.00000000", new System.Globalization.CultureInfo("en-US")) + @dcaLogEntry.TotalCost.ToString("#,#0.00000000", new System.Globalization.CultureInfo("en-US")) + Details + +} + + + \ No newline at end of file diff --git a/Monitor/Pages/_get/BagList.cshtml.cs b/Monitor/Pages/_get/BagList.cshtml.cs new file mode 100644 index 0000000..35ebd89 --- /dev/null +++ b/Monitor/Pages/_get/BagList.cshtml.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.AspNetCore.Http; +using Core.Main; +using Core.Main.DataObjects; +using Core.Main.DataObjects.PTMagicData; +using Core.MarketAnalyzer; + +namespace Monitor.Pages { + public class BagListModel : _Internal.BasePageModelSecureAJAX { + public ProfitTrailerData PTData = null; + public string SortFieldId = ""; + public string SortDirection = ""; + + public void OnGet() { + base.Init(); + + BindData(); + } + + private void BindData() { + SortFieldId = GetStringParameter("s", "ProfitPercent"); + SortDirection = GetStringParameter("d", "DESC"); + + PTData = new ProfitTrailerData(PTMagicBasePath, PTMagicConfiguration); + } + } +} diff --git a/Monitor/Pages/_get/BuyList.cshtml b/Monitor/Pages/_get/BuyList.cshtml new file mode 100644 index 0000000..7b6d76e --- /dev/null +++ b/Monitor/Pages/_get/BuyList.cshtml @@ -0,0 +1,54 @@ +@page +@model BuyListModel +@{ + Layout = null; + + System.Reflection.PropertyInfo propertyInfo = typeof(Core.Main.DataObjects.PTMagicData.BuyLogData).GetProperty(Model.SortFieldId); + List buyLogResult = Model.PTData.BuyLog.OrderByDescending(d => propertyInfo.GetValue(d, null)).ToList(); + if (Model.SortDirection.Equals("ASC")) { + buyLogResult = Model.PTData.BuyLog.OrderBy(d => propertyInfo.GetValue(d, null)).ToList(); + } +} + +@foreach (Core.Main.DataObjects.PTMagicData.BuyLogData buyLogEntry in buyLogResult) { + Core.Main.DataObjects.PTMagicData.MarketPairSummary mps = null; + if (Model.Summary.MarketSummary.ContainsKey(buyLogEntry.Market)) { + mps = Model.Summary.MarketSummary[buyLogEntry.Market]; + } + + bool isTrailingBuyActive = buyLogEntry.IsTrailing; + if (buyLogEntry.BuyStrategies.Count > 0) { + isTrailingBuyActive = (buyLogEntry.BuyStrategies.FindAll(bs => !bs.IsTrailing).Count == 0); + } + + bool buyDisabled = false; + string buyStrategyText = Core.ProfitTrailer.StrategyHelper.GetStrategyText(Model.Summary, buyLogEntry.BuyStrategies, buyLogEntry.BuyStrategy, isTrailingBuyActive); + if (!Core.ProfitTrailer.StrategyHelper.IsValidStrategy(buyStrategyText, true)) { + buyDisabled = true; + } + + string currentValueText = Core.ProfitTrailer.StrategyHelper.GetCurrentValueText(buyLogEntry.BuyStrategies, buyLogEntry.BuyStrategy, buyLogEntry.CurrentLowBBValue, buyLogEntry.CurrentValue, true); + string triggerValueText = Core.ProfitTrailer.StrategyHelper.GetTriggerValueText(Model.Summary, buyLogEntry.BuyStrategies, buyLogEntry.BuyStrategy, buyLogEntry.BBTrigger, buyLogEntry.TriggerValue, 0, true); + + @if (mps != null && (mps.ActiveSingleSettings == null || mps.ActiveSingleSettings.Count == 0)) { + @buyLogEntry.Market + } else { + @buyLogEntry.Market + } + @if (buyDisabled) { + @Html.Raw(buyStrategyText) + } else { + @Html.Raw(buyStrategyText) + } + @Html.Raw(currentValueText) + @Html.Raw(triggerValueText) + @buyLogEntry.CurrentPrice.ToString("#,#0.00000000", new System.Globalization.CultureInfo("en-US")) + +} + + + \ No newline at end of file diff --git a/Monitor/Pages/_get/BuyList.cshtml.cs b/Monitor/Pages/_get/BuyList.cshtml.cs new file mode 100644 index 0000000..67cf211 --- /dev/null +++ b/Monitor/Pages/_get/BuyList.cshtml.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.AspNetCore.Http; +using Core.Main; +using Core.Main.DataObjects; +using Core.Main.DataObjects.PTMagicData; +using Core.MarketAnalyzer; + +namespace Monitor.Pages { + public class BuyListModel : _Internal.BasePageModelSecureAJAX { + public ProfitTrailerData PTData = null; + public string SortFieldId = ""; + public string SortDirection = ""; + + public void OnGet() { + base.Init(); + + BindData(); + } + + private void BindData() { + SortFieldId = GetStringParameter("s", "ProfitPercent"); + SortDirection = GetStringParameter("d", "DESC"); + + PTData = new ProfitTrailerData(PTMagicBasePath, PTMagicConfiguration); + } + } +} diff --git a/Monitor/Pages/_get/DashboardBottom.cshtml b/Monitor/Pages/_get/DashboardBottom.cshtml new file mode 100644 index 0000000..a5d8265 --- /dev/null +++ b/Monitor/Pages/_get/DashboardBottom.cshtml @@ -0,0 +1,195 @@ +@page +@model DashboardBottomModel +@{ + Layout = null; +} + +
+
+
+

Sales Overviewmore

+ @{ + double totalProfit = Model.PTData.SellLog.Sum(s => s.Profit); + double totalProfitFiat = Math.Round(totalProfit * Model.Summary.MainMarketPrice, 2); + double percentGain = Math.Round(totalProfit / Model.PTMagicConfiguration.GeneralSettings.Application.StartBalance * 100, 2); + string percentGainText = percentGain.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")) + "%"; + if (Model.PTData.TransactionData.Transactions.Count > 0) { + percentGainText = ""; + } + + double todaysStartBalance = Model.PTData.GetSnapshotBalance(Model.DateTimeNow.DateTime); + double todaysProfit = Model.PTData.SellLogToday.Sum(s => s.Profit); + double todaysProfitFiat = Math.Round(todaysProfit * Model.Summary.MainMarketPrice, 2); + double todaysPercentGain = Math.Round(todaysProfit / todaysStartBalance * 100, 2); + + double yesterdaysStartBalance = Model.PTData.GetSnapshotBalance(Model.DateTimeNow.DateTime.AddDays(-1)); + double yesterdaysProfit = Model.PTData.SellLogYesterday.Sum(s => s.Profit); + double yesterdaysProfitFiat = Math.Round(yesterdaysProfit * Model.Summary.MainMarketPrice, 2); + double yesterdaysPercentGain = Math.Round(yesterdaysProfit / yesterdaysStartBalance * 100, 2); + + double last7DaysStartBalance = Model.PTData.GetSnapshotBalance(Model.DateTimeNow.DateTime.AddDays(-7)); + double last7DaysProfit = Model.PTData.SellLogLast7Days.Sum(s => s.Profit); + double last7DaysProfitFiat = Math.Round(last7DaysProfit * Model.Summary.MainMarketPrice, 2); + double last7DaysPercentGain = Math.Round(last7DaysProfit / last7DaysStartBalance * 100, 2); + } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SalesProfit @Model.Summary.MainMarketProfit @Model.Summary.MainFiatCurrency% Gain
Today@Model.PTData.SellLogToday.Count@todaysProfit.ToString("#,#0.00000000", new System.Globalization.CultureInfo("en-US"))@Html.Raw(Model.MainFiatCurrencySymbol + todaysProfitFiat.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")))@todaysPercentGain.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US"))%
Yesterday@Model.PTData.SellLogYesterday.Count@yesterdaysProfit.ToString("#,#0.00000000", new System.Globalization.CultureInfo("en-US"))@Html.Raw(Model.MainFiatCurrencySymbol + yesterdaysProfitFiat.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")))@yesterdaysPercentGain.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US"))%
Last 7 Days@Model.PTData.SellLogLast7Days.Count@last7DaysProfit.ToString("#,#0.00000000", new System.Globalization.CultureInfo("en-US"))@Html.Raw(Model.MainFiatCurrencySymbol + last7DaysProfitFiat.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")))@last7DaysPercentGain.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US"))%
Total@Model.PTData.SellLog.Count@totalProfit.ToString("#,#0.00000000", new System.Globalization.CultureInfo("en-US"))@Html.Raw(Model.MainFiatCurrencySymbol + totalProfitFiat.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")))@Html.Raw(percentGainText)
+
+
+
+
+

Market Trendsmore

+ + + + + + + + + + + + @foreach (var marketTrend in Model.MarketTrends.OrderBy(mt => mt.TrendMinutes)) { + if (Model.Summary.MarketTrendChanges.ContainsKey(marketTrend.Name)) { + double trendChange = Model.Summary.MarketTrendChanges[marketTrend.Name].OrderByDescending(mtc => mtc.TrendDateTime).First().TrendChange; + string trendChangeOutput = trendChange.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")); + + int marketCount = marketTrend.MaxMarkets; + string marketCountString = marketCount.ToString(); + + if (marketCount == 0) { + marketCountString = "All"; + } else if (marketCount > Model.Summary.MarketSummary.Keys.Count && marketTrend.Platform.Equals("Exchange", StringComparison.InvariantCultureIgnoreCase)) { + marketCountString = Model.Summary.MarketSummary.Keys.Count.ToString(); + } + + + + + + + } + } + +
NameMarketsTimeframeChange
@Core.Helper.SystemHelper.SplitCamelCase(marketTrend.Name)@marketCountString@Core.Helper.SystemHelper.GetProperDurationTime(marketTrend.TrendMinutes * 60, false)@trendChangeOutput%
+
+
+ +
+ +
+
+
+ @if (!Model.ProfitChartDataJSON.Equals("")) { +
+ +
+ } else { +

Not able to load graph, no sales data found.
If you still do not see a graph after you made your first sale, report an issue.

+ } +
+
+ +
+
+ @if (!Model.TrendChartDataJSON.Equals("")) { +
+ +
+ } else { +

Not able to load graph, no market trend data found.
If you still do not see a graph after more than hour, report an issue.

+ } +
+
+
+ + \ No newline at end of file diff --git a/Monitor/Pages/_get/DashboardBottom.cshtml.cs b/Monitor/Pages/_get/DashboardBottom.cshtml.cs new file mode 100644 index 0000000..ed71361 --- /dev/null +++ b/Monitor/Pages/_get/DashboardBottom.cshtml.cs @@ -0,0 +1,144 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.AspNetCore.Http; +using Core.Main; +using Core.Helper; +using Core.Main.DataObjects; +using Core.Main.DataObjects.PTMagicData; +using Core.MarketAnalyzer; + +namespace Monitor.Pages { + public class DashboardBottomModel : _Internal.BasePageModelSecureAJAX { + public ProfitTrailerData PTData = null; + public List MarketTrends { get; set; } = new List(); + public string TrendChartDataJSON = ""; + public string ProfitChartDataJSON = ""; + public string LastGlobalSetting = "Default"; + public DateTimeOffset DateTimeNow = Constants.confMinDate; + + public void OnGet() { + // Initialize Config + base.Init(); + + BindData(); + } + + private void BindData() { + PTData = new ProfitTrailerData(PTMagicBasePath, PTMagicConfiguration); + + // Cleanup temp files + FileHelper.CleanupFilesMinutes(PTMagicMonitorBasePath + "wwwroot" + System.IO.Path.DirectorySeparatorChar + "assets" + System.IO.Path.DirectorySeparatorChar + "tmp" + System.IO.Path.DirectorySeparatorChar, 5); + + // Convert local offset time to UTC + TimeSpan offsetTimeSpan = TimeSpan.Parse(PTMagicConfiguration.GeneralSettings.Application.TimezoneOffset.Replace("+", "")); + DateTimeNow = DateTimeOffset.UtcNow.ToOffset(offsetTimeSpan); + + // Get last and current active setting + if (!String.IsNullOrEmpty(HttpContext.Session.GetString("LastGlobalSetting"))) { + LastGlobalSetting = HttpContext.Session.GetString("LastGlobalSetting"); + } + HttpContext.Session.SetString("LastGlobalSetting", Summary.CurrentGlobalSetting.SettingName); + + // Get market trends + MarketTrends = PTMagicConfiguration.AnalyzerSettings.MarketAnalyzer.MarketTrends.OrderBy(mt => mt.TrendMinutes).ThenByDescending(mt => mt.Platform).ToList(); + + BuildMarketTrendChartData(); + BuildProfitChartData(); + } + + private void BuildMarketTrendChartData() { + if (MarketTrends.Count > 0) { + TrendChartDataJSON = "["; + int mtIndex = 0; + foreach (MarketTrend mt in MarketTrends) { + if (mt.DisplayGraph) { + string lineColor = ""; + if (mtIndex < Constants.ChartLineColors.Length) { + lineColor = Constants.ChartLineColors[mtIndex]; + } else { + lineColor = Constants.ChartLineColors[mtIndex - 20]; + } + + if (Summary.MarketTrendChanges.ContainsKey(mt.Name)) { + List marketTrendChangeSummaries = Summary.MarketTrendChanges[mt.Name]; + + if (marketTrendChangeSummaries.Count > 0) { + if (!TrendChartDataJSON.Equals("[")) TrendChartDataJSON += ","; + + TrendChartDataJSON += "{"; + TrendChartDataJSON += "key: '" + SystemHelper.SplitCamelCase(mt.Name) + "',"; + TrendChartDataJSON += "color: '" + lineColor + "',"; + TrendChartDataJSON += "values: ["; + + // Get trend ticks for chart + DateTime currentDateTime = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, DateTime.Now.Hour, 0, 0); + DateTime startDateTime = currentDateTime.AddHours(-PTMagicConfiguration.GeneralSettings.Monitor.GraphMaxTimeframeHours); + DateTime endDateTime = currentDateTime; + int trendChartTicks = 0; + for (DateTime tickTime = startDateTime; tickTime <= endDateTime; tickTime = tickTime.AddMinutes(PTMagicConfiguration.GeneralSettings.Monitor.GraphIntervalMinutes)) { + List tickRange = marketTrendChangeSummaries.FindAll(m => m.TrendDateTime >= tickTime).OrderBy(m => m.TrendDateTime).ToList(); + if (tickRange.Count > 0) { + MarketTrendChange mtc = tickRange.First(); + if (tickTime != startDateTime) TrendChartDataJSON += ",\n"; + if (Double.IsInfinity(mtc.TrendChange)) mtc.TrendChange = 0; + + TrendChartDataJSON += "{ x: new Date('" + tickTime.ToString("yyyy-MM-ddTHH:mm:ss").Replace(".", ":") + "'), y: " + mtc.TrendChange.ToString("0.00", new System.Globalization.CultureInfo("en-US")) + "}"; + trendChartTicks++; + } + } + + // Add most recent tick + List latestTickRange = marketTrendChangeSummaries.OrderByDescending(m => m.TrendDateTime).ToList(); + if (latestTickRange.Count > 0) { + MarketTrendChange mtc = latestTickRange.First(); + if (trendChartTicks > 0) TrendChartDataJSON += ",\n"; + if (Double.IsInfinity(mtc.TrendChange)) mtc.TrendChange = 0; + + TrendChartDataJSON += "{ x: new Date('" + mtc.TrendDateTime.ToString("yyyy-MM-ddTHH:mm:ss").Replace(".", ":") + "'), y: " + mtc.TrendChange.ToString("0.00", new System.Globalization.CultureInfo("en-US")) + "}"; + } + + TrendChartDataJSON += "]"; + TrendChartDataJSON += "}"; + + mtIndex++; + } + } + } + } + TrendChartDataJSON += "]"; + } + } + + private void BuildProfitChartData() { + int tradeDayIndex = 0; + string profitPerDayJSON = ""; + if (PTData.SellLog.Count > 0) { + DateTime minSellLogDate = PTData.SellLog.OrderBy(sl => sl.SoldDate).First().SoldDate.Date; + DateTime graphStartDate = DateTime.Now.Date.AddDays(-30); + if (minSellLogDate > graphStartDate) graphStartDate = minSellLogDate; + for (DateTime salesDate = graphStartDate; salesDate <= DateTime.Now.Date; salesDate = salesDate.AddDays(1)) { + if (tradeDayIndex > 0) { + profitPerDayJSON += ",\n"; + } + + int trades = PTData.SellLog.FindAll(t => t.SoldDate.Date == salesDate).Count; + double profit = PTData.SellLog.FindAll(t => t.SoldDate.Date == salesDate).Sum(t => t.Profit); + double profitFiat = Math.Round(profit * Summary.MainMarketPrice, 2); + + profitPerDayJSON += "{x: new Date('" + salesDate.ToString("yyyy-MM-dd") + "'), y: " + profitFiat.ToString("0.00", new System.Globalization.CultureInfo("en-US")) + "}"; + + tradeDayIndex++; + } + + ProfitChartDataJSON = "["; + ProfitChartDataJSON += "{"; + ProfitChartDataJSON += "key: 'Profit in " + Summary.MainFiatCurrency + "',"; + ProfitChartDataJSON += "color: '" + Constants.ChartLineColors[1] + "',"; + ProfitChartDataJSON += "values: [" + profitPerDayJSON + "]"; + ProfitChartDataJSON += "}"; + ProfitChartDataJSON += "]"; + } + } + } +} diff --git a/Monitor/Pages/_get/DashboardTop.cshtml b/Monitor/Pages/_get/DashboardTop.cshtml new file mode 100644 index 0000000..bad1271 --- /dev/null +++ b/Monitor/Pages/_get/DashboardTop.cshtml @@ -0,0 +1,175 @@ +@page +@model DashboardTopModel +@{ + Layout = null; +} + +
+
+
+

Possible Buys (@Model.PTData.BuyLog.Count)more

+ @if (Model.PTData.BuyLog.Count == 0) { + +

Your Profit Trailer did not find anything worth buying so far.

+ + } else { + + + + + + + + + + @foreach (Core.Main.DataObjects.PTMagicData.BuyLogData buyLogEntry in Model.PTData.BuyLog.OrderByDescending(b => b.IsTrailing).ThenBy(b => b.CurrentValue).Take(Model.PTMagicConfiguration.GeneralSettings.Monitor.MaxDashboardBuyEntries)) { + Core.Main.DataObjects.PTMagicData.MarketPairSummary mps = null; + if (Model.Summary.MarketSummary.ContainsKey(buyLogEntry.Market)) { + mps = Model.Summary.MarketSummary[buyLogEntry.Market]; + } + + bool isTrailingBuyActive = buyLogEntry.IsTrailing; + if (buyLogEntry.BuyStrategies.Count > 0) { + isTrailingBuyActive = (buyLogEntry.BuyStrategies.FindAll(bs => !bs.IsTrailing) == null); + } + + bool buyDisabled = false; + string buyStrategyText = Core.ProfitTrailer.StrategyHelper.GetStrategyText(Model.Summary, buyLogEntry.BuyStrategies, buyLogEntry.BuyStrategy, isTrailingBuyActive); + if (!Core.ProfitTrailer.StrategyHelper.IsValidStrategy(buyStrategyText, true)) { + buyDisabled = true; + } + + + @if (mps == null || mps.ActiveSingleSettings == null || mps.ActiveSingleSettings.Count == 0) { + + } else { + + } + @if (buyDisabled) { + + } else { + + } + + + } + +
MarketBuy StrategiesAsk Price
@buyLogEntry.Market@buyLogEntry.Market @Html.Raw(buyStrategyText)@Html.Raw(buyStrategyText)@buyLogEntry.CurrentPrice.ToString("#,#0.00000000", new System.Globalization.CultureInfo("en-US"))
+ + @if (Model.PTData.BuyLog.Count > Model.PTMagicConfiguration.GeneralSettings.Monitor.MaxDashboardBuyEntries) { +

@Model.PTMagicConfiguration.GeneralSettings.Monitor.MaxDashboardBuyEntries of @Model.PTData.BuyLog.Count items listed - View all items

+ } + } +
+
+ +
+
+

Pairs & DCA (@Model.PTData.DCALog.Count)more

+ + @if (Model.PTData.DCALog.Count == 0) { + +

Your Profit Trailer did not buy anything so far that's worth analyzing.

+ + } else { + + + + + + + + + + + + + + @foreach (Core.Main.DataObjects.PTMagicData.DCALogData dcaLogEntry in Model.PTData.DCALog.OrderByDescending(d => d.ProfitPercent).Take(Model.PTMagicConfiguration.GeneralSettings.Monitor.MaxDashboardBagEntries)) { + Core.Main.DataObjects.PTMagicData.MarketPairSummary mps = null; + if (Model.Summary.MarketSummary.ContainsKey(dcaLogEntry.Market)) { + mps = Model.Summary.MarketSummary[dcaLogEntry.Market]; + } + + bool dcaEnabled = true; + if (mps != null) { + dcaEnabled = mps.IsDCAEnabled; + } + + bool isTrailingBuyActive = dcaLogEntry.IsTrailing; + if (dcaLogEntry.BuyStrategies.Count > 0) { + isTrailingBuyActive = (dcaLogEntry.BuyStrategies.FindAll(bs => !bs.IsTrailing) == null); + } + + bool isTrailingSellActive = false; + if (dcaLogEntry.SellStrategies.Count > 0) { + isTrailingSellActive = (dcaLogEntry.SellStrategies.FindAll(ss => !ss.IsTrailing) == null); + } + + bool buyDisabled = false; + string buyStrategyText = Core.ProfitTrailer.StrategyHelper.GetStrategyText(Model.Summary, dcaLogEntry.BuyStrategies, dcaLogEntry.BuyStrategy, isTrailingBuyActive); + if (!Core.ProfitTrailer.StrategyHelper.IsValidStrategy(buyStrategyText, true)) { + buyDisabled = true; + } + + string sellStrategyText = Core.ProfitTrailer.StrategyHelper.GetStrategyText(Model.Summary, dcaLogEntry.SellStrategies, dcaLogEntry.SellStrategy, isTrailingSellActive); + + + @if (mps == null || mps.ActiveSingleSettings == null || mps.ActiveSingleSettings.Count == 0) { + + } else { + + } + + @if (buyDisabled) { + + } else { + + } + + + + + } + +
MarketDCABuy StratsSell StratsProfit
@dcaLogEntry.Market@dcaLogEntry.Market + @if (dcaEnabled) { + @if (dcaLogEntry.BoughtTimes > 0) { + @dcaLogEntry.BoughtTimes; + } + } else { + Disabled! + } + @Html.Raw(buyStrategyText)@Html.Raw(buyStrategyText)@Html.Raw(sellStrategyText) + @if (isTrailingSellActive) { + + } + @dcaLogEntry.ProfitPercent.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US"))% +
+ + @if (Model.PTData.DCALog.Count > Model.PTMagicConfiguration.GeneralSettings.Monitor.MaxDashboardBagEntries) { +

@Model.PTMagicConfiguration.GeneralSettings.Monitor.MaxDashboardBagEntries of @Model.PTData.DCALog.Count items listed - View all items

+ } + } +
+
+
+ + + + diff --git a/Monitor/Pages/_get/DashboardTop.cshtml.cs b/Monitor/Pages/_get/DashboardTop.cshtml.cs new file mode 100644 index 0000000..98d549e --- /dev/null +++ b/Monitor/Pages/_get/DashboardTop.cshtml.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.AspNetCore.Http; +using Core.Main; +using Core.Main.DataObjects; +using Core.Main.DataObjects.PTMagicData; +using Core.MarketAnalyzer; + +namespace Monitor.Pages { + public class DashboardTopModel : _Internal.BasePageModelSecureAJAX { + public ProfitTrailerData PTData = null; + public DateTimeOffset DateTimeNow = Constants.confMinDate; + + public void OnGet() { + // Initialize Config + base.Init(); + + BindData(); + } + + private void BindData() { + PTData = new ProfitTrailerData(PTMagicBasePath, PTMagicConfiguration); + + // Convert local offset time to UTC + TimeSpan offsetTimeSpan = TimeSpan.Parse(PTMagicConfiguration.GeneralSettings.Application.TimezoneOffset.Replace("+", "")); + DateTimeNow = DateTimeOffset.UtcNow.ToOffset(offsetTimeSpan); + } + } +} diff --git a/Monitor/Pages/_get/DownloadFile.cshtml b/Monitor/Pages/_get/DownloadFile.cshtml new file mode 100644 index 0000000..e47402b --- /dev/null +++ b/Monitor/Pages/_get/DownloadFile.cshtml @@ -0,0 +1,5 @@ +@page +@model DownloadFileModel +@{ + Layout = null; +} \ No newline at end of file diff --git a/Monitor/Pages/_get/DownloadFile.cshtml.cs b/Monitor/Pages/_get/DownloadFile.cshtml.cs new file mode 100644 index 0000000..63498ca --- /dev/null +++ b/Monitor/Pages/_get/DownloadFile.cshtml.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using Core.Main; +using Core.Helper; +using Core.Main.DataObjects.PTMagicData; +using Core.MarketAnalyzer; + +namespace Monitor.Pages { + public class DownloadFileModel : _Internal.BasePageModelSecure { + + public void OnGet() { + // Initialize Config + base.Init(); + + InitializeDownload(); + } + + private void InitializeDownload() { + string fileName = GetStringParameter("f", ""); + if (System.IO.File.Exists(PTMagicBasePath + fileName)) { + if (!System.IO.Directory.Exists(PTMagicMonitorBasePath + "wwwroot" + System.IO.Path.DirectorySeparatorChar + "assets" + System.IO.Path.DirectorySeparatorChar + "tmp" + System.IO.Path.DirectorySeparatorChar)) { + System.IO.Directory.CreateDirectory(PTMagicMonitorBasePath + "wwwroot" + System.IO.Path.DirectorySeparatorChar + "assets" + System.IO.Path.DirectorySeparatorChar + "tmp" + System.IO.Path.DirectorySeparatorChar); + } + + string sourcefilePath = PTMagicBasePath + fileName; + string destinationFilePath = PTMagicMonitorBasePath + "wwwroot" + System.IO.Path.DirectorySeparatorChar + "assets" + System.IO.Path.DirectorySeparatorChar + "tmp" + System.IO.Path.DirectorySeparatorChar + fileName + ".zip"; + + ZIPHelper.CreateZipFile(new ArrayList() { sourcefilePath }, destinationFilePath); + + Response.Redirect(PTMagicConfiguration.GeneralSettings.Monitor.RootUrl + "assets/tmp/" + fileName + ".zip"); + } + } + } +} diff --git a/Monitor/Pages/_get/PresetFile.cshtml b/Monitor/Pages/_get/PresetFile.cshtml new file mode 100644 index 0000000..d1aef9e --- /dev/null +++ b/Monitor/Pages/_get/PresetFile.cshtml @@ -0,0 +1,21 @@ +@page +@model PresetFileModel +@{ + Layout = null; +} + +
+ + diff --git a/Monitor/Pages/_get/PresetFile.cshtml.cs b/Monitor/Pages/_get/PresetFile.cshtml.cs new file mode 100644 index 0000000..fa00ebd --- /dev/null +++ b/Monitor/Pages/_get/PresetFile.cshtml.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.AspNetCore.Http; +using Core.Main; +using Core.Helper; +using Core.Main.DataObjects.PTMagicData; +using Core.MarketAnalyzer; +using Core.ProfitTrailer; + +namespace Monitor.Pages { + public class PresetFileModel : _Internal.BasePageModelSecureAJAX { + public string FileName = ""; + public string SettingName = ""; + public string FileContent = ""; + + public void OnGet() { + base.Init(); + + BindData(); + } + + private void BindData() { + FileName = GetStringParameter("f", ""); + SettingName = GetStringParameter("gs", ""); + + if (!FileName.Equals("") && !SettingName.Equals("")) { + List presetFileLines = SettingsFiles.GetPresetFileLinesAsList(PTMagicBasePath, SettingName, FileName, PTMagicConfiguration); + FileContent = SystemHelper.ConvertListToTokenString(presetFileLines, Environment.NewLine, false); + } + } + } +} diff --git a/Monitor/Pages/_get/ReturnToLogin.cshtml b/Monitor/Pages/_get/ReturnToLogin.cshtml new file mode 100644 index 0000000..8599bfc --- /dev/null +++ b/Monitor/Pages/_get/ReturnToLogin.cshtml @@ -0,0 +1,6 @@ +@page +@model ReturnToLoginModel +@{ + Layout = null; +} +returntologin \ No newline at end of file diff --git a/Monitor/Pages/_get/ReturnToLogin.cshtml.cs b/Monitor/Pages/_get/ReturnToLogin.cshtml.cs new file mode 100644 index 0000000..fbd7c2f --- /dev/null +++ b/Monitor/Pages/_get/ReturnToLogin.cshtml.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Core.Main; +using Core.Main.DataObjects.PTMagicData; +using Core.MarketAnalyzer; + +namespace Monitor.Pages { + public class ReturnToLoginModel : _Internal.BasePageModel { + public void OnGet() { + + } + } +} diff --git a/Monitor/Pages/_get/SalesList.cshtml b/Monitor/Pages/_get/SalesList.cshtml new file mode 100644 index 0000000..2766e68 --- /dev/null +++ b/Monitor/Pages/_get/SalesList.cshtml @@ -0,0 +1,86 @@ +@page +@model SalesListModel +@{ + Layout = null; +} + + + + + \ No newline at end of file diff --git a/Monitor/Pages/_get/SalesList.cshtml.cs b/Monitor/Pages/_get/SalesList.cshtml.cs new file mode 100644 index 0000000..2ae5dfe --- /dev/null +++ b/Monitor/Pages/_get/SalesList.cshtml.cs @@ -0,0 +1,49 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.AspNetCore.Http; +using Core.Main; +using Core.Helper; +using Core.Main.DataObjects; +using Core.Main.DataObjects.PTMagicData; +using Core.MarketAnalyzer; + +namespace Monitor.Pages { + public class SalesListModel : _Internal.BasePageModelSecure { + public ProfitTrailerData PTData = null; + private string salesDateString = ""; + private string salesMonthString = ""; + + public string SalesTimeframe = ""; + public DateTime SalesDate = Constants.confMinDate; + public List SellLog = new List(); + + public void OnGet() { + // Initialize Config + base.Init(); + + BindData(); + } + + private void BindData() { + salesDateString = GetStringParameter("d", ""); + salesMonthString = GetStringParameter("m", ""); + + PTData = new ProfitTrailerData(PTMagicBasePath, PTMagicConfiguration); + + if (!salesDateString.Equals("")) { + SalesDate = SystemHelper.TextToDateTime(salesDateString, Constants.confMinDate); + if (SalesDate != Constants.confMinDate) { + SalesTimeframe = SalesDate.ToShortDateString(); + SellLog = PTData.SellLog.FindAll(sl => sl.SoldDate.Date == SalesDate.Date).OrderByDescending(sl => sl.SoldDate).ToList(); + } + } else if (!salesMonthString.Equals("")) { + SalesDate = SystemHelper.TextToDateTime(salesMonthString + "-01", Constants.confMinDate); + if (SalesDate != Constants.confMinDate) { + SalesTimeframe = SalesDate.ToString("MMMM yyyy", new System.Globalization.CultureInfo("en-US")); + SellLog = PTData.SellLog.FindAll(sl => sl.SoldDate.Date.Month == SalesDate.Month && sl.SoldDate.Date.Year == SalesDate.Year).OrderByDescending(sl => sl.SoldDate).ToList(); + } + } + } + } +} diff --git a/Monitor/Pages/_get/SettingsGlobalSettings.cshtml b/Monitor/Pages/_get/SettingsGlobalSettings.cshtml new file mode 100644 index 0000000..f7f6cfc --- /dev/null +++ b/Monitor/Pages/_get/SettingsGlobalSettings.cshtml @@ -0,0 +1,210 @@ +@page +@model SettingsGlobalSettingsModel +@{ + Layout = null; +} +
+ +
+
+
+ @if (!Model.GlobalSetting.SettingName.Equals("")) { +

+ Global Setting "@Model.GlobalSetting.SettingName" + @if (!Model.GlobalSetting.SettingName.StartsWith("Default", StringComparison.InvariantCultureIgnoreCase)) { + + + } +

+ } else { +

New Global Setting

+ } + +
+ +
+ @if (!Model.GlobalSetting.SettingName.StartsWith("Default", StringComparison.InvariantCultureIgnoreCase)) { + + Allowed characters: Letters, Numbers and '_' + } else { + + @Model.GlobalSetting.SettingName + } +
+
+ + @if (!Model.GlobalSetting.SettingName.StartsWith("Default", StringComparison.InvariantCultureIgnoreCase)) { +
+ +
+ +
+
+ +
+ +
Triggers (@Model.GlobalSetting.Triggers.Count)
+
+ + + } + +
+ +
Pairs Properties (@Model.GlobalSetting.PairsProperties.Count)
+
+ + + +
+ +
DCA Properties (@Model.GlobalSetting.DCAProperties.Count)
+
+ + +
+ +
Indicators Properties (@Model.GlobalSetting.IndicatorsProperties.Count)
+
+ + + + +
+
+
+ +
\ No newline at end of file diff --git a/Monitor/Pages/_get/SettingsGlobalSettings.cshtml.cs b/Monitor/Pages/_get/SettingsGlobalSettings.cshtml.cs new file mode 100644 index 0000000..87e4408 --- /dev/null +++ b/Monitor/Pages/_get/SettingsGlobalSettings.cshtml.cs @@ -0,0 +1,75 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.AspNetCore.Http; +using Core.Main; +using Core.Helper; +using Core.Main.DataObjects.PTMagicData; +using Core.MarketAnalyzer; + +namespace Monitor.Pages { + public class SettingsGlobalSettingsModel : _Internal.BasePageModelSecure { + public GlobalSetting GlobalSetting = null; + public string SettingName = ""; + + public void OnGet() { + // Initialize Config + base.Init(); + + BindData(); + } + + private void BindData() { + SettingName = this.GetStringParameter("gs", ""); + if (!SettingName.Equals("")) { + GlobalSetting = PTMagicConfiguration.AnalyzerSettings.GlobalSettings.Find(gs => SystemHelper.StripBadCode(gs.SettingName, Constants.WhiteListNames).Equals(SettingName)); + } else { + GlobalSetting = new GlobalSetting(); + GlobalSetting.SettingName = "New Setting"; + } + } + + public string GetMarketTrendSelection(Trigger t) { + string result = ""; + + foreach (MarketTrend mt in PTMagicConfiguration.AnalyzerSettings.MarketAnalyzer.MarketTrends) { + string selected = ""; + if (t != null) { + if (t.MarketTrendName.Equals(mt.Name, StringComparison.InvariantCultureIgnoreCase)) { + selected = " selected=\"selected\""; + } + } + + result += "" + mt.Name + ""; + } + + return result; + } + + public string GetValueModes(string propertyKey) { + string result = ""; + + string selected = ""; + if (propertyKey.IndexOf("_OFFSET", StringComparison.InvariantCultureIgnoreCase) == -1) { + selected = " selected=\"selected\""; + } + result += "Flat value"; + + if (propertyKey.EndsWith("_OFFSET", StringComparison.InvariantCultureIgnoreCase)) { + selected = " selected=\"selected\""; + } else { + selected = ""; + } + result += "Offset by flat value"; + + if (propertyKey.EndsWith("_OFFSETPERCENT", StringComparison.InvariantCultureIgnoreCase)) { + selected = " selected=\"selected\""; + } else { + selected = ""; + } + result += "Offset by percent"; + + return result; + } + } +} diff --git a/Monitor/Pages/_get/SettingsMarketTrends.cshtml b/Monitor/Pages/_get/SettingsMarketTrends.cshtml new file mode 100644 index 0000000..916e558 --- /dev/null +++ b/Monitor/Pages/_get/SettingsMarketTrends.cshtml @@ -0,0 +1,136 @@ +@page +@model SettingsMarketTrendsModel +@{ + Layout = null; +} +
+ +
+
+
+ @if (!Model.MarketTrend.Name.Equals("")) { +

+ Market Trend "@Model.MarketTrend.Name" + + +

+ } else { +

New Market Trend

+ } + +
+ +
+ + Allowed characters: Letters, Numbers and '_' +
+
+ +
+ +
+ +
+
+ +
+ +
+ + 0 = All available markets +
+
+ +
+ +
+ +
+
+ +
+ +
+ + Market = Trend of each coin against your main market (BTC, ETH) / Fiat = Trend of each coin against USD +
+
+ +
+ +
+ +
+
+ +
+ +
+ + Leave empty to allow all +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ + +
+
+
+ +
diff --git a/Monitor/Pages/_get/SettingsMarketTrends.cshtml.cs b/Monitor/Pages/_get/SettingsMarketTrends.cshtml.cs new file mode 100644 index 0000000..a37141a --- /dev/null +++ b/Monitor/Pages/_get/SettingsMarketTrends.cshtml.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.AspNetCore.Http; +using Core.Main; +using Core.Helper; +using Core.Main.DataObjects.PTMagicData; +using Core.MarketAnalyzer; + +namespace Monitor.Pages { + public class SettingsMarketTrendsModel : _Internal.BasePageModelSecure { + public MarketTrend MarketTrend = null; + public string MarketTrendName = ""; + + public void OnGet() { + // Initialize Config + base.Init(); + + BindData(); + } + + private void BindData() { + MarketTrendName = this.GetStringParameter("mt", ""); + if (!MarketTrendName.Equals("")) { + MarketTrend = PTMagicConfiguration.AnalyzerSettings.MarketAnalyzer.MarketTrends.Find(m => SystemHelper.StripBadCode(m.Name, Constants.WhiteListNames).Equals(MarketTrendName)); + } else { + MarketTrend = new MarketTrend(); + MarketTrend.Name = "New Market Trend"; + } + } + } +} diff --git a/Monitor/Pages/_get/SettingsSingleMarketSettings.cshtml b/Monitor/Pages/_get/SettingsSingleMarketSettings.cshtml new file mode 100644 index 0000000..be75b87 --- /dev/null +++ b/Monitor/Pages/_get/SettingsSingleMarketSettings.cshtml @@ -0,0 +1,381 @@ +@page +@model SettingsSingleMarketSettingsModel +@{ + Layout = null; +} +
+ +
+
+
+ @if (!Model.SingleMarketSetting.SettingName.Equals("")) { +

+ Single Market Setting "@Model.SingleMarketSetting.SettingName" + + +

+ } else { +

New Single Market Setting

+ } + +
+ +
+ + Allowed characters: Letters, Numbers and '_' +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ + Leave empty to allow all +
+
+ +
+ +
+ +
+
+ +
+ +
Triggers (@Model.SingleMarketSetting.Triggers.Count)
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+ +
Off Triggers (@Model.SingleMarketSetting.OffTriggers.Count)
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+ +
Pairs Properties (@Model.SingleMarketSetting.PairsProperties.Count)
+
+ + + +
+ +
DCA Properties (@Model.SingleMarketSetting.DCAProperties.Count)
+
+ + + +
+ +
Indicators Properties (@Model.SingleMarketSetting.IndicatorsProperties.Count)
+
+ + + + +
+
+
+ + +
\ No newline at end of file diff --git a/Monitor/Pages/_get/SettingsSingleMarketSettings.cshtml.cs b/Monitor/Pages/_get/SettingsSingleMarketSettings.cshtml.cs new file mode 100644 index 0000000..07a4f98 --- /dev/null +++ b/Monitor/Pages/_get/SettingsSingleMarketSettings.cshtml.cs @@ -0,0 +1,146 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.AspNetCore.Http; +using Core.Main; +using Core.Helper; +using Core.Main.DataObjects.PTMagicData; +using Core.MarketAnalyzer; + +namespace Monitor.Pages { + public class SettingsSingleMarketSettingsModel : _Internal.BasePageModelSecure { + public SingleMarketSetting SingleMarketSetting = null; + public string SettingName = ""; + + public void OnGet() { + // Initialize Config + base.Init(); + + BindData(); + } + + private void BindData() { + SettingName = this.GetStringParameter("gs", ""); + if (!SettingName.Equals("")) { + SingleMarketSetting = PTMagicConfiguration.AnalyzerSettings.SingleMarketSettings.Find(sms => SystemHelper.StripBadCode(sms.SettingName, Constants.WhiteListNames).Equals(SettingName)); + } else { + SingleMarketSetting = new SingleMarketSetting(); + SingleMarketSetting.SettingName = "New Setting"; + } + } + + public string GetMarketTrendSelection(Trigger t) { + string result = ""; + + foreach (MarketTrend mt in PTMagicConfiguration.AnalyzerSettings.MarketAnalyzer.MarketTrends.FindAll(m => m.Platform.Equals("Exchange", StringComparison.InvariantCultureIgnoreCase))) { + string selected = ""; + if (t != null) { + if (t.MarketTrendName.Equals(mt.Name, StringComparison.InvariantCultureIgnoreCase)) { + selected = " selected=\"selected\""; + } + } + + result += "" + mt.Name + ""; + } + + return result; + } + + public string GetOffTriggerMarketTrendSelection(OffTrigger ot) { + string result = ""; + + foreach (MarketTrend mt in PTMagicConfiguration.AnalyzerSettings.MarketAnalyzer.MarketTrends.FindAll(m => m.Platform.Equals("Exchange", StringComparison.InvariantCultureIgnoreCase))) { + string selected = ""; + if (ot != null) { + if (ot.MarketTrendName.Equals(mt.Name, StringComparison.InvariantCultureIgnoreCase)) { + selected = " selected=\"selected\""; + } + } + + result += "" + mt.Name + ""; + } + + return result; + } + + public string GetMarketTrendRelationSelection(Trigger t) { + string result = ""; + + string selected = ""; + if (t != null) { + if (t.MarketTrendRelation.Equals("Relative", StringComparison.InvariantCultureIgnoreCase)) { + selected = " selected=\"selected\""; + } + } + result += "Relative"; + + if (t != null) { + if (t.MarketTrendRelation.Equals("Absolute", StringComparison.InvariantCultureIgnoreCase)) { + selected = " selected=\"selected\""; + } else { + selected = ""; + } + } + result += "Absolute"; + + return result; + } + + public string GetOffTriggerMarketTrendRelationSelection(OffTrigger ot) { + string result = ""; + + string selected = ""; + if (ot != null) { + if (ot.MarketTrendRelation.Equals("Relative", StringComparison.InvariantCultureIgnoreCase)) { + selected = " selected=\"selected\""; + } + } + result += "Relative"; + + if (ot != null) { + if (ot.MarketTrendRelation.Equals("RelativeTrigger", StringComparison.InvariantCultureIgnoreCase)) { + selected = " selected=\"selected\""; + } + } + result += "Relative to trigger price"; + + if (ot != null) { + if (ot.MarketTrendRelation.Equals("Absolute", StringComparison.InvariantCultureIgnoreCase)) { + selected = " selected=\"selected\""; + } else { + selected = ""; + } + } + result += "Absolute"; + + + return result; + } + + public string GetValueModes(string propertyKey) { + string result = ""; + + string selected = ""; + if (propertyKey.IndexOf("_OFFSET", StringComparison.InvariantCultureIgnoreCase) == -1) { + selected = " selected=\"selected\""; + } + result += "Flat value"; + + if (propertyKey.EndsWith("_OFFSET", StringComparison.InvariantCultureIgnoreCase)) { + selected = " selected=\"selected\""; + } else { + selected = ""; + } + result += "Offset by flat value"; + + if (propertyKey.EndsWith("_OFFSETPERCENT", StringComparison.InvariantCultureIgnoreCase)) { + selected = " selected=\"selected\""; + } else { + selected = ""; + } + result += "Offset by percent"; + + return result; + } + } +} diff --git a/Monitor/Pages/_get/TickerWidgets.cshtml b/Monitor/Pages/_get/TickerWidgets.cshtml new file mode 100644 index 0000000..c75a23a --- /dev/null +++ b/Monitor/Pages/_get/TickerWidgets.cshtml @@ -0,0 +1,62 @@ +@page +@model TickerWidgetsModel +@{ + Layout = null; + + int activeSingleSettings = Model.MarketsWithSingleSettings.Count; + string singleSettingInfoIcon = ""; + if (activeSingleSettings > 0) { + singleSettingInfoIcon = "Single Market Settings active for:
-" + Core.Helper.SystemHelper.ConvertListToTokenString(Model.MarketsWithSingleSettings, "
-", true) + "\" data-template=\"\">
"; + } + + double currentBalance = Model.PTData.GetCurrentBalance(); + string currentBalanceString = currentBalance.ToString("#,#0.00000000", new System.Globalization.CultureInfo("en-US")); + if (currentBalance > 100) { + currentBalanceString = Math.Round(currentBalance, 2).ToString("#,#0.00", new System.Globalization.CultureInfo("en-US")); + } + + DateTime lastRuntime = Model.Summary.LastRuntime; + double elapsedSecondsSinceRuntime = DateTime.Now.Subtract(lastRuntime).TotalSeconds; + double intervalSeconds = Model.PTMagicConfiguration.AnalyzerSettings.MarketAnalyzer.IntervalMinutes * 60.0; + + string iconColor = "text-success"; + string ptMagicHealthIcon = "fa-heartbeat"; + string ptMagicHealthTooltip = "PT Magic is alive and healthy!"; + if (elapsedSecondsSinceRuntime > (intervalSeconds + intervalSeconds * 0.2)) { + ptMagicHealthIcon = "fa-exclamation-triangle"; + ptMagicHealthTooltip = "PT Magic seems to have problems, check the logs!"; + iconColor = "text-danger"; + } +} + +@if (!Model.Summary.MainMarket.Equals("USDT", StringComparison.InvariantCultureIgnoreCase)) { +
+ @Model.Summary.MainMarket: @Html.Raw(Model.MainFiatCurrencySymbol + Model.Summary.MainMarketPrice.ToString("#,#0.00", new System.Globalization.CultureInfo("en-US"))) +
+} + +
+ TV: @currentBalanceString @Model.Summary.MainMarket +
+ +
+ GS: @Core.Helper.SystemHelper.SplitCamelCase(Model.Summary.CurrentGlobalSetting.SettingName) +
+ +
+ SMS: @Html.Raw(singleSettingInfoIcon) @activeSingleSettings +
+ +
+ PTM: +
+ + diff --git a/Monitor/Pages/_get/TickerWidgets.cshtml.cs b/Monitor/Pages/_get/TickerWidgets.cshtml.cs new file mode 100644 index 0000000..6d7d7cc --- /dev/null +++ b/Monitor/Pages/_get/TickerWidgets.cshtml.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.AspNetCore.Http; +using Core.Main; +using Core.Main.DataObjects; +using Core.Main.DataObjects.PTMagicData; +using Core.MarketAnalyzer; + +namespace Monitor.Pages { + public class TickerWidgetsModel : _Internal.BasePageModelSecureAJAX { + public ProfitTrailerData PTData = null; + public List MarketsWithSingleSettings = new List(); + + public void OnGet() { + // Initialize Config + base.Init(); + + BindData(); + } + + private void BindData() { + PTData = new ProfitTrailerData(PTMagicBasePath, PTMagicConfiguration); + + // Get markets with active single settings + foreach (string key in Summary.MarketSummary.Keys) { + if (Summary.MarketSummary[key].ActiveSingleSettings != null) { + if (Summary.MarketSummary[key].ActiveSingleSettings.Count > 0) { + MarketsWithSingleSettings.Add(key); + } + } + } + MarketsWithSingleSettings.Sort(); + } + } +} diff --git a/Monitor/Pages/_post/RemoveTransaction.cshtml b/Monitor/Pages/_post/RemoveTransaction.cshtml new file mode 100644 index 0000000..9816506 --- /dev/null +++ b/Monitor/Pages/_post/RemoveTransaction.cshtml @@ -0,0 +1,5 @@ +@page +@model RemoveTransactionModel +@{ + Layout = null; +} diff --git a/Monitor/Pages/_post/RemoveTransaction.cshtml.cs b/Monitor/Pages/_post/RemoveTransaction.cshtml.cs new file mode 100644 index 0000000..3f129d4 --- /dev/null +++ b/Monitor/Pages/_post/RemoveTransaction.cshtml.cs @@ -0,0 +1,58 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.AspNetCore.Http; +using Core.Main; +using Core.Main.DataObjects; +using Core.Main.DataObjects.PTMagicData; +using Core.MarketAnalyzer; +using Microsoft.AspNetCore.Mvc; +using System.Threading.Tasks; +using System.IO; +using Newtonsoft.Json; + +namespace Monitor.Pages { + public class RemoveTransactionForm { + public string Transaction_GUID = ""; + } + + public class RemoveTransactionModel : _Internal.BasePageModelSecure { + + public void OnGet() { + // Initialize Config + base.Init(); + + } + + [HttpPost] + public ActionResult OnPost() { + base.Init(); + + JsonResult result = new JsonResult("Error removing transaction."); + + MemoryStream stream = new MemoryStream(); + Request.Body.CopyTo(stream); + stream.Position = 0; + using (StreamReader reader = new StreamReader(stream)) { + string requestBody = reader.ReadToEnd(); + if (requestBody.Length > 0) { + RemoveTransactionForm rtf = JsonConvert.DeserializeObject(requestBody); + if (rtf != null) { + TransactionData transactionData = new TransactionData(PTMagicBasePath); + Transaction removeTransaction = transactionData.Transactions.Find(t => t.GUID.Equals(rtf.Transaction_GUID)); + if (removeTransaction != null) { + transactionData.Transactions.Remove(removeTransaction); + transactionData.SaveTransactions(PTMagicBasePath); + + result = new JsonResult("Success"); + } else { + result = new JsonResult("Transaction not found!"); + } + } + } + } + + return result; + } + } +} diff --git a/Monitor/Pages/_post/ResetSingleMarketSetting.cshtml b/Monitor/Pages/_post/ResetSingleMarketSetting.cshtml new file mode 100644 index 0000000..de4181d --- /dev/null +++ b/Monitor/Pages/_post/ResetSingleMarketSetting.cshtml @@ -0,0 +1,5 @@ +@page +@model ResetSingleMarketSettingModel +@{ + Layout = null; +} diff --git a/Monitor/Pages/_post/ResetSingleMarketSetting.cshtml.cs b/Monitor/Pages/_post/ResetSingleMarketSetting.cshtml.cs new file mode 100644 index 0000000..db3c91e --- /dev/null +++ b/Monitor/Pages/_post/ResetSingleMarketSetting.cshtml.cs @@ -0,0 +1,67 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.AspNetCore.Http; +using Core.Main; +using Core.Helper; +using Core.Main.DataObjects.PTMagicData; +using Core.MarketAnalyzer; +using Microsoft.AspNetCore.Mvc; +using System.Threading.Tasks; +using System.IO; +using Newtonsoft.Json; + +namespace Monitor.Pages { + public class ResetSingleMarketSettingForm { + public string Market = ""; + public string Setting = ""; + } + + public class ResetSingleMarketSettingModel : _Internal.BasePageModelSecure { + + public void OnGet() { + // Initialize Config + base.Init(); + + } + + [HttpPost] + public ActionResult OnPost() { + base.Init(); + + JsonResult result = new JsonResult("Error removing transaction."); + + MemoryStream stream = new MemoryStream(); + Request.Body.CopyTo(stream); + stream.Position = 0; + using (StreamReader reader = new StreamReader(stream)) { + string requestBody = reader.ReadToEnd(); + if (requestBody.Length > 0) { + ResetSingleMarketSettingForm rsf = JsonConvert.DeserializeObject(requestBody); + if (rsf != null) { + if (System.IO.File.Exists(PTMagicBasePath + Constants.PTMagicPathData + Path.DirectorySeparatorChar + "SingleMarketSettingSummary.json")) { + try { + List smsSummaries = JsonConvert.DeserializeObject>(System.IO.File.ReadAllText(PTMagicBasePath + Constants.PTMagicPathData + Path.DirectorySeparatorChar + "SingleMarketSettingSummary.json")); + SingleMarketSettingSummary smsSummary = smsSummaries.Find(s => s.Market.Equals(rsf.Market) && s.SingleMarketSetting.SettingName.Equals(rsf.Setting)); + if (smsSummary != null) { + smsSummaries.Remove(smsSummary); + + // Save Single Market Settings Summary + JsonSerializerSettings smsSummaryJsonSettings = new JsonSerializerSettings(); + smsSummaryJsonSettings.NullValueHandling = NullValueHandling.Ignore; + smsSummaryJsonSettings.DefaultValueHandling = DefaultValueHandling.Ignore; + + FileHelper.WriteTextToFile(PTMagicBasePath + Constants.PTMagicPathData + Path.DirectorySeparatorChar, "SingleMarketSettingSummary.json", JsonConvert.SerializeObject(smsSummaries, Formatting.None, smsSummaryJsonSettings)); + + } + + } catch { } + } + } + } + } + + return result; + } + } +} diff --git a/Monitor/Pages/_post/RestoreBackup.cshtml b/Monitor/Pages/_post/RestoreBackup.cshtml new file mode 100644 index 0000000..f896c19 --- /dev/null +++ b/Monitor/Pages/_post/RestoreBackup.cshtml @@ -0,0 +1,5 @@ +@page +@model RestoreBackupModel +@{ + Layout = null; +} diff --git a/Monitor/Pages/_post/RestoreBackup.cshtml.cs b/Monitor/Pages/_post/RestoreBackup.cshtml.cs new file mode 100644 index 0000000..3b79244 --- /dev/null +++ b/Monitor/Pages/_post/RestoreBackup.cshtml.cs @@ -0,0 +1,60 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.AspNetCore.Http; +using Core.Main; +using Core.Main.DataObjects.PTMagicData; +using Core.MarketAnalyzer; +using Microsoft.AspNetCore.Mvc; +using System.Threading.Tasks; +using System.IO; +using Newtonsoft.Json; + +namespace Monitor.Pages { + public class RestoreBackupForm { + public string File = ""; + } + + public class RestoreBackupModel : _Internal.BasePageModelSecure { + + public void OnGet() { + // Initialize Config + base.Init(); + + } + + [HttpPost] + public ActionResult OnPost() { + base.Init(); + + JsonResult result = new JsonResult("Error restoring backup."); + + MemoryStream stream = new MemoryStream(); + Request.Body.CopyTo(stream); + stream.Position = 0; + using (StreamReader reader = new StreamReader(stream)) { + string requestBody = reader.ReadToEnd(); + if (requestBody.Length > 0) { + RestoreBackupForm rbf = JsonConvert.DeserializeObject(requestBody); + if (rbf != null) { + if (System.IO.File.Exists(PTMagicBasePath + rbf.File)) { + if (System.IO.File.Exists(PTMagicBasePath + rbf.File + ".backup")) { + try { + System.IO.File.Copy(PTMagicBasePath + rbf.File + ".backup", PTMagicBasePath + rbf.File, true); + + result = new JsonResult("Success"); + } catch { } + } else { + result = new JsonResult("Error restoring backup - File '" + rbf.File + ".backup' not found in " + PTMagicBasePath + "."); + } + } else { + result = new JsonResult("Error restoring backup - File '" + rbf.File + "' not found in " + PTMagicBasePath + "."); + } + } + } + } + + return result; + } + } +} diff --git a/Monitor/Pages/_post/SavePresetFile.cshtml b/Monitor/Pages/_post/SavePresetFile.cshtml new file mode 100644 index 0000000..9eb05bd --- /dev/null +++ b/Monitor/Pages/_post/SavePresetFile.cshtml @@ -0,0 +1,5 @@ +@page +@model SavePresetFileModel +@{ + Layout = null; +} \ No newline at end of file diff --git a/Monitor/Pages/_post/SavePresetFile.cshtml.cs b/Monitor/Pages/_post/SavePresetFile.cshtml.cs new file mode 100644 index 0000000..96bb60c --- /dev/null +++ b/Monitor/Pages/_post/SavePresetFile.cshtml.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.AspNetCore.Http; +using Core.Main; +using Core.Main.DataObjects.PTMagicData; +using Core.MarketAnalyzer; +using Microsoft.AspNetCore.Mvc; +using System.Threading.Tasks; +using System.IO; +using Newtonsoft.Json; + +namespace Monitor.Pages { + public class SavePresetFileForm { + public string FileName = ""; + public string SettingName = ""; + public string FileContent = ""; + } + + public class SavePresetFileModel : _Internal.BasePageModelSecure { + public void OnGet() { + // Initialize Config + base.Init(); + + } + + [HttpPost] + public ActionResult OnPost() { + base.Init(); + + JsonResult result = new JsonResult("Error saving preset file."); + + MemoryStream stream = new MemoryStream(); + Request.Body.CopyTo(stream); + stream.Position = 0; + using (StreamReader reader = new StreamReader(stream)) { + string requestBody = reader.ReadToEnd(); + if (requestBody.Length > 0) { + SavePresetFileForm spff = JsonConvert.DeserializeObject(requestBody); + if (spff != null) { + string settingPropertiesPath = PTMagicBasePath + Constants.PTMagicPathPresets + Path.DirectorySeparatorChar + spff.SettingName + Path.DirectorySeparatorChar + spff.FileName; + if (System.IO.File.Exists(settingPropertiesPath)) { + try { + System.IO.File.WriteAllText(settingPropertiesPath, spff.FileContent); + } catch { } + } + } + } + } + + return result; + } + } +} diff --git a/Monitor/Pages/_post/TestTelegram.cshtml b/Monitor/Pages/_post/TestTelegram.cshtml new file mode 100644 index 0000000..6c3f1f3 --- /dev/null +++ b/Monitor/Pages/_post/TestTelegram.cshtml @@ -0,0 +1,5 @@ +@page +@model TestTelegramModel +@{ + Layout = null; +} diff --git a/Monitor/Pages/_post/TestTelegram.cshtml.cs b/Monitor/Pages/_post/TestTelegram.cshtml.cs new file mode 100644 index 0000000..a4ae497 --- /dev/null +++ b/Monitor/Pages/_post/TestTelegram.cshtml.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.AspNetCore.Http; +using Core.Main; +using Core.Helper; +using Core.Main.DataObjects.PTMagicData; +using Core.MarketAnalyzer; +using Microsoft.AspNetCore.Mvc; +using System.Threading.Tasks; +using System.IO; +using Newtonsoft.Json; + +namespace Monitor.Pages { + public class TestTelegramForm { + public string Telegram_BotToken = ""; + public Int64 Telegram_ChatId = 0; + public string Telegram_SilentMode = "off"; + } + + public class TestTelegramModel : _Internal.BasePageModelSecure { + + public void OnGet() { + // Initialize Config + base.Init(); + + } + + [HttpPost] + public ActionResult OnPost() { + base.Init(); + + JsonResult result = new JsonResult("Error sending Telegram message."); + + MemoryStream stream = new MemoryStream(); + Request.Body.CopyTo(stream); + stream.Position = 0; + using (StreamReader reader = new StreamReader(stream)) { + string requestBody = reader.ReadToEnd(); + if (requestBody.Length > 0) { + TestTelegramForm tf = JsonConvert.DeserializeObject(requestBody); + if (tf != null) { + TelegramHelper.SendMessage(tf.Telegram_BotToken.Trim(), tf.Telegram_ChatId, "PT Magic Telegram test message.", tf.Telegram_SilentMode.Equals("on"), Log); + + result =new JsonResult("Success"); + } + } + } + + return result; + } + } +} diff --git a/Monitor/Program.cs b/Monitor/Program.cs new file mode 100644 index 0000000..7fda2ec --- /dev/null +++ b/Monitor/Program.cs @@ -0,0 +1,116 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net; +using System.Threading.Tasks; +using Microsoft.AspNetCore; +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Logging; +using Core.Main; + +namespace Monitor { + public class Program { + public static void Main(string[] args) { + Console.WriteLine("##########################################################"); + Console.WriteLine("#********************************************************#"); + Console.WriteLine("INFO: Starting PT Magic Monitor..."); + Console.WriteLine("INFO: Beginning startup checks..."); + + string monitorBasePath = Directory.GetCurrentDirectory(); + if (!System.IO.File.Exists(monitorBasePath + Path.DirectorySeparatorChar + "appsettings.json")) { + monitorBasePath += Path.DirectorySeparatorChar + "Monitor"; + } + + // Startup checks + string appsettingsJson = monitorBasePath + Path.DirectorySeparatorChar + "appsettings.json"; + if (!File.Exists(appsettingsJson)) { + Console.WriteLine("ERROR: appsettings.json not found: '" + appsettingsJson + "'. Please check if the file exists. If not, review the PT Magic setup steps listed on the wiki!"); + if (Console.KeyAvailable) Console.ReadKey(); + } else { + Console.WriteLine("INFO: appsettings.json found in " + monitorBasePath); + + IConfiguration config = new ConfigurationBuilder() + .SetBasePath(monitorBasePath) + .AddJsonFile("appsettings.json", false) + .Build(); + + string ptMagicBasePath = config.GetValue("PTMagicBasePath"); + + if (!ptMagicBasePath.EndsWith(Path.DirectorySeparatorChar)) { + ptMagicBasePath += Path.DirectorySeparatorChar; + } + + // More startup checks + // Check if PT Magic directoy is correctly configured + if (!Directory.Exists(ptMagicBasePath)) { + Console.WriteLine("ERROR: PT Magic directory not found: '" + ptMagicBasePath + "'. Please check your setting for 'PTMagicBasePath' in 'Monitor/appsettings.json'"); + if (Console.KeyAvailable) Console.ReadKey(); + } else { + Console.WriteLine("INFO: PT Magic directory found at " + ptMagicBasePath); + + // Check if PT Magic settings file exists + string settingsGeneralJson = ptMagicBasePath + "settings.general.json"; + if (!File.Exists(settingsGeneralJson)) { + Console.WriteLine("ERROR: PT Magic settings not found: '" + settingsGeneralJson + "'. Please check if you setup PT Magic correctly!"); + if (Console.KeyAvailable) Console.ReadKey(); + } else { + Console.WriteLine("INFO: settings.general.json found at " + settingsGeneralJson); + + // Check if PT Magic settings file exists + string lastRuntimeSummaryJson = ptMagicBasePath + Constants.PTMagicPathData + Path.DirectorySeparatorChar + "LastRuntimeSummary.json"; + if (!File.Exists(lastRuntimeSummaryJson)) { + Console.WriteLine("ERROR: PT Magic runtime summary not found: '" + lastRuntimeSummaryJson + "'. Please wait for PT Magic to complete its first run!"); + if (Console.KeyAvailable) Console.ReadKey(); + } else { + Console.WriteLine("INFO: LastRuntimeSummary.json found at " + lastRuntimeSummaryJson); + + PTMagicConfiguration ptMagicConfiguration = null; + try { + ptMagicConfiguration = new PTMagicConfiguration(ptMagicBasePath); + } catch (Exception ex) { + throw ex; + } + + string wwwrootPath = monitorBasePath + Path.DirectorySeparatorChar + "wwwroot"; + if (!Directory.Exists(wwwrootPath)) { + Console.WriteLine("ERROR: wwwroot directory not found: '" + wwwrootPath + "'. Did you copy all files as instructed on the wiki?"); + if (Console.KeyAvailable) Console.ReadKey(); + } else { + Console.WriteLine("INFO: wwwroot directory found at " + wwwrootPath); + + string assetsPath = wwwrootPath + Path.DirectorySeparatorChar + "assets"; + if (!Directory.Exists(assetsPath)) { + Console.WriteLine("ERROR: assets directory not found: '" + assetsPath + "'. Did you copy all files as instructed on the wiki?"); + if (Console.KeyAvailable) Console.ReadKey(); + } else { + Console.WriteLine("INFO: assets directory found at " + assetsPath); + Console.WriteLine("INFO: ALL CHECKS COMPLETED - ATTEMPTING TO START WEBSERVER..."); + Console.WriteLine("#********************************************************#"); + Console.WriteLine(""); + Console.WriteLine("DO NOT CLOSE THIS WINDOW! THIS IS THE WEBSERVER FOR YOUR MONITOR!"); + Console.WriteLine(""); + Console.WriteLine("##########################################################"); + Console.WriteLine(""); + + BuildWebHost(args, monitorBasePath, monitorBasePath + Path.DirectorySeparatorChar + "wwwroot", ptMagicConfiguration.GeneralSettings.Monitor.Port).Run(); + } + } + + } + } + } + } + } + + public static IWebHost BuildWebHost(string[] args, string contentRoot, string webroot, int port) => + new WebHostBuilder() + .UseUrls("http://0.0.0.0:" + port.ToString()) + .UseStartup() + .UseKestrel() + .UseContentRoot(contentRoot) + .UseWebRoot(webroot) + .Build(); + } +} diff --git a/Monitor/Startup.cs b/Monitor/Startup.cs new file mode 100644 index 0000000..9cccea2 --- /dev/null +++ b/Monitor/Startup.cs @@ -0,0 +1,84 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Session; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Core.Main; +using System.Runtime.InteropServices; +using System.Diagnostics; + +namespace Monitor { + public class Startup { + PTMagicConfiguration systemConfiguration = null; + + public Startup() { + } + + // This method gets called by the runtime. Use this method to add services to the container. + public void ConfigureServices(IServiceCollection services) { + string monitorBasePath = Directory.GetCurrentDirectory(); + if (!System.IO.File.Exists(monitorBasePath + Path.DirectorySeparatorChar + "appsettings.json")) { + monitorBasePath += Path.DirectorySeparatorChar + "Monitor"; + } + + IConfiguration config = new ConfigurationBuilder() + .SetBasePath(monitorBasePath) + .AddJsonFile("appsettings.json", false) + .Build(); + + string ptMagicBasePath = config.GetValue("PTMagicBasePath"); + + if (!ptMagicBasePath.EndsWith(Path.DirectorySeparatorChar)) { + ptMagicBasePath += Path.DirectorySeparatorChar; + } + + + try { + systemConfiguration = new PTMagicConfiguration(ptMagicBasePath); + } catch (Exception ex) { + throw ex; + } + + services.AddMvc(); + services.AddAntiforgery(o => o.HeaderName = "XSRF-TOKEN"); + services.AddSingleton(); + services.AddDistributedMemoryCache(); + services.AddSession(options => { + options.IdleTimeout = TimeSpan.FromSeconds(900); + options.Cookie.HttpOnly = true; + options.Cookie.Name = "PTMagicMonitor" + systemConfiguration.GeneralSettings.Monitor.Port.ToString(); + }); + } + + // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. + public void Configure(IApplicationBuilder app, IHostingEnvironment env) { + app.UseStaticFiles(); + if (env.IsDevelopment()) { + app.UseBrowserLink(); + app.UseDeveloperExceptionPage(); + //app.UseExceptionHandler("/Error"); + } else { + app.UseExceptionHandler("/Error"); + } + app.UseSession(); + app.UseMvc(); + if (systemConfiguration.GeneralSettings.Monitor.OpenBrowserOnStart) OpenBrowser("http://localhost:" + systemConfiguration.GeneralSettings.Monitor.Port.ToString()); + } + + public static void OpenBrowser(string url) { + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { + Process.Start(new ProcessStartInfo("cmd", $"/c start {url}")); // Works ok on windows + } else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) { + Process.Start("xdg-open", url); // Works ok on linux + } else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) { + Process.Start("open", url); // Not tested + } + } + } +} diff --git a/Monitor/ViewComponents/PairIconViewComponent.cs b/Monitor/ViewComponents/PairIconViewComponent.cs new file mode 100644 index 0000000..7ce23e0 --- /dev/null +++ b/Monitor/ViewComponents/PairIconViewComponent.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; + +namespace Monitor.ViewComponents { + public class PairIconViewComponent :ViewComponent { + public async Task InvokeAsync(Core.Main.DataObjects.PTMagicData.MarketPairSummary mps) { + IViewComponentResult result = null; + await Task.Run(() => { + result = View(mps); + }); + return result; + } + } +} diff --git a/Monitor/_Internal/BasePageModel.cs b/Monitor/_Internal/BasePageModel.cs new file mode 100644 index 0000000..58af014 --- /dev/null +++ b/Monitor/_Internal/BasePageModel.cs @@ -0,0 +1,140 @@ +using System; +using System.IO; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Newtonsoft.Json; +using Core.Main; +using Core.Helper; +using Core.Main.DataObjects.PTMagicData; +using Core.MarketAnalyzer; +using Core.ProfitTrailer; +using Microsoft.Extensions.Primitives; +using System.Diagnostics; + +namespace Monitor._Internal { + + public class BasePageModel : PageModel { + public string PTMagicBasePath = ""; + public string PTMagicMonitorBasePath = ""; + public PTMagicConfiguration PTMagicConfiguration = null; + + public Summary Summary { get; set; } = new Summary(); + public LogHelper Log = null; + public string LatestVersion = ""; + public string CurrentBotVersion = ""; + public string NotifyHeadline = ""; + public string NotifyMessage = ""; + public string NotifyType = ""; + + public string MainFiatCurrencySymbol = "$"; + + public void PreInit() { + PTMagicMonitorBasePath = Directory.GetCurrentDirectory(); + if (!System.IO.File.Exists(PTMagicMonitorBasePath + Path.DirectorySeparatorChar + "appsettings.json")) { + PTMagicMonitorBasePath += Path.DirectorySeparatorChar + "Monitor"; + } + + if (!PTMagicMonitorBasePath.EndsWith(Path.DirectorySeparatorChar)) { + PTMagicMonitorBasePath += Path.DirectorySeparatorChar; + } + + IConfiguration config = new ConfigurationBuilder() + .SetBasePath(PTMagicMonitorBasePath) + .AddJsonFile("appsettings.json", false) + .Build(); + + PTMagicBasePath = config.GetValue("PTMagicBasePath"); + + if (!PTMagicBasePath.EndsWith(Path.DirectorySeparatorChar)) { + PTMagicBasePath += Path.DirectorySeparatorChar; + } + + + try { + PTMagicConfiguration = new PTMagicConfiguration(PTMagicBasePath); + } catch (Exception ex) { + throw ex; + } + + IServiceProvider logProvider = ServiceHelper.BuildLoggerService(PTMagicBasePath); + Log = logProvider.GetRequiredService(); + + Summary = JsonConvert.DeserializeObject(System.IO.File.ReadAllText(PTMagicBasePath + Constants.PTMagicPathData + Path.DirectorySeparatorChar + "LastRuntimeSummary.json")); + if (Summary.CurrentGlobalSetting == null) Summary.CurrentGlobalSetting = PTMagicConfiguration.AnalyzerSettings.GlobalSettings.Find(s => s.SettingName.IndexOf("default", StringComparison.InvariantCultureIgnoreCase) > -1); + + MainFiatCurrencySymbol = SystemHelper.GetCurrencySymbol(Summary.MainFiatCurrency); + + try { + // Get latest release from GitHub + if (!String.IsNullOrEmpty(HttpContext.Session.GetString("LatestVersion"))) { + LatestVersion = HttpContext.Session.GetString("LatestVersion"); + } else { + LatestVersion = BaseAnalyzer.GetLatestGitHubRelease(Log, Summary.Version); + HttpContext.Session.SetString("LatestVersion", LatestVersion); + } + + } catch { } + + try { + // Get current bot version + if (!String.IsNullOrEmpty(HttpContext.Session.GetString("CurrentBotVersion"))) { + CurrentBotVersion = HttpContext.Session.GetString("CurrentBotVersion"); + } else { + string ptMagicBotDllPath = PTMagicBasePath + "PTMagic.dll"; + if (System.IO.File.Exists(ptMagicBotDllPath)) { + FileVersionInfo ptMagicDllInfo = FileVersionInfo.GetVersionInfo(ptMagicBotDllPath); + + CurrentBotVersion = ptMagicDllInfo.ProductVersion.Substring(0, ptMagicDllInfo.ProductVersion.LastIndexOf(".")); + HttpContext.Session.SetString("CurrentBotVersion", CurrentBotVersion); + } else { + CurrentBotVersion = Summary.Version; + } + } + + } catch { + CurrentBotVersion = Summary.Version; + } + } + + protected string GetStringParameter(string paramName, string defaultValue) { + string result = defaultValue; + + if (HttpContext.Request.Query.ContainsKey(paramName)) { + result = HttpContext.Request.Query[paramName]; + } else if (HttpContext.Request.Method.Equals("POST") && HttpContext.Request.Form.ContainsKey(paramName)) { + result = HttpContext.Request.Form[paramName]; + } + + return result; + } + + /// + /// Holt einen Url-Parameter als Integer, wenn vorhanden. + /// + /// Name des Parameters + /// Defaultvalue, wenn Parameter nicht vorhanden ist. + /// Der Wert des Parameters als Integer. + protected int GetIntParameter(string paramName, int defaultValue) { + int result = defaultValue; + + if (HttpContext.Request.Query.ContainsKey(paramName)) { + try { + result = Int32.Parse(HttpContext.Request.Query[paramName]); + } catch { + result = defaultValue; + } + } else if (HttpContext.Request.Method.Equals("POST") && HttpContext.Request.Form.ContainsKey(paramName)) { + try { + result = Int32.Parse(HttpContext.Request.Form[paramName]); + } catch { + result = defaultValue; + } + } + + return result; + } + } +} diff --git a/Monitor/_Internal/BasePageModelSecure.cs b/Monitor/_Internal/BasePageModelSecure.cs new file mode 100644 index 0000000..6c6b5ec --- /dev/null +++ b/Monitor/_Internal/BasePageModelSecure.cs @@ -0,0 +1,41 @@ +using System; +using System.IO; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Newtonsoft.Json; +using Core.Main; +using Core.Helper; +using Core.Main.DataObjects.PTMagicData; +using Core.MarketAnalyzer; +using Core.ProfitTrailer; +using Microsoft.Extensions.Primitives; + +namespace Monitor._Internal { + + public class BasePageModelSecure : BasePageModel { + public void Init() { + base.PreInit(); + + if (String.IsNullOrEmpty(HttpContext.Session.GetString("LoggedIn" + PTMagicConfiguration.GeneralSettings.Monitor.Port.ToString())) && PTMagicConfiguration.GeneralSettings.Monitor.IsPasswordProtected) { + bool redirectToLogin = true; + if (Request.Cookies.ContainsKey("PTMRememberMeKey")) { + string rememberMeKey = Request.Cookies["PTMRememberMeKey"]; + if (!rememberMeKey.Equals("")) { + string encryptedPassword = EncryptionHelper.Decrypt(Request.Cookies["PTMRememberMeKey"]); + if (encryptedPassword.Equals(PTMagicConfiguration.SecureSettings.MonitorPassword)) { + HttpContext.Session.SetString("LoggedIn" + PTMagicConfiguration.GeneralSettings.Monitor.Port.ToString(), DateTime.Now.ToUniversalTime().ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fff'Z'")); + redirectToLogin = false; + } + } + } + + if (redirectToLogin) { + HttpContext.Response.Redirect(PTMagicConfiguration.GeneralSettings.Monitor.RootUrl + "Login"); + } + } + } + } +} diff --git a/Monitor/_Internal/BasePageModelSecureAJAX.cs b/Monitor/_Internal/BasePageModelSecureAJAX.cs new file mode 100644 index 0000000..7948288 --- /dev/null +++ b/Monitor/_Internal/BasePageModelSecureAJAX.cs @@ -0,0 +1,41 @@ +using System; +using System.IO; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Newtonsoft.Json; +using Core.Main; +using Core.Helper; +using Core.Main.DataObjects.PTMagicData; +using Core.MarketAnalyzer; +using Core.ProfitTrailer; +using Microsoft.Extensions.Primitives; + +namespace Monitor._Internal { + + public class BasePageModelSecureAJAX : BasePageModel { + public void Init() { + base.PreInit(); + + if (String.IsNullOrEmpty(HttpContext.Session.GetString("LoggedIn" + PTMagicConfiguration.GeneralSettings.Monitor.Port.ToString())) && PTMagicConfiguration.GeneralSettings.Monitor.IsPasswordProtected) { + bool redirectToLogin = true; + if (Request.Cookies.ContainsKey("PTMRememberMeKey")) { + string rememberMeKey = Request.Cookies["PTMRememberMeKey"]; + if (!rememberMeKey.Equals("")) { + string encryptedPassword = EncryptionHelper.Decrypt(Request.Cookies["PTMRememberMeKey"]); + if (encryptedPassword.Equals(PTMagicConfiguration.SecureSettings.MonitorPassword)) { + HttpContext.Session.SetString("LoggedIn" + PTMagicConfiguration.GeneralSettings.Monitor.Port.ToString(), DateTime.Now.ToUniversalTime().ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fff'Z'")); + redirectToLogin = false; + } + } + } + + if (redirectToLogin) { + HttpContext.Response.Redirect(PTMagicConfiguration.GeneralSettings.Monitor.RootUrl + "_get/ReturnToLogin"); + } + } + } + } +} diff --git a/Monitor/wwwroot/assets/css/bootstrap.min.css b/Monitor/wwwroot/assets/css/bootstrap.min.css new file mode 100644 index 0000000..622b5a9 --- /dev/null +++ b/Monitor/wwwroot/assets/css/bootstrap.min.css @@ -0,0 +1,7 @@ +/*! + * Bootstrap v4.0.0-beta (https://getbootstrap.com) + * Copyright 2011-2017 The Bootstrap Authors + * Copyright 2011-2017 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */@media print{*,::after,::before{text-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}html{box-sizing:border-box;font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:transparent}*,::after,::before{box-sizing:inherit}@-ms-viewport{width:device-width}article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}dfn{font-style:italic}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent;-webkit-text-decoration-skip:objects}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg:not(:root){overflow:hidden}[role=button],a,area,button,input,label,select,summary,textarea{-ms-touch-action:manipulation;touch-action:manipulation}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#868e96;text-align:left;caption-side:bottom}th{text-align:left}label{display:inline-block;margin-bottom:.5rem}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.1}.display-2{font-size:5.5rem;font-weight:300;line-height:1.1}.display-3{font-size:4.5rem;font-weight:300;line-height:1.1}.display-4{font-size:3.5rem;font-weight:300;line-height:1.1}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:5px}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#868e96}.blockquote-footer::before{content:"\2014 \00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #ddd;border-radius:.25rem;transition:all .2s ease-in-out;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#868e96}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}code{padding:.2rem .4rem;font-size:90%;color:#bd4147;background-color:#f8f9fa;border-radius:.25rem}a>code{padding:0;color:inherit;background-color:inherit}kbd{padding:.2rem .4rem;font-size:90%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;margin-top:0;margin-bottom:1rem;font-size:90%;color:#212529}pre code{padding:0;font-size:inherit;color:inherit;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-right:15px;padding-left:15px;width:100%}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid{width:100%;margin-right:auto;margin-left:auto;padding-right:15px;padding-left:15px;width:100%}.row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;min-height:1px;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-1{-ms-flex-order:1;order:1}.order-2{-ms-flex-order:2;order:2}.order-3{-ms-flex-order:3;order:3}.order-4{-ms-flex-order:4;order:4}.order-5{-ms-flex-order:5;order:5}.order-6{-ms-flex-order:6;order:6}.order-7{-ms-flex-order:7;order:7}.order-8{-ms-flex-order:8;order:8}.order-9{-ms-flex-order:9;order:9}.order-10{-ms-flex-order:10;order:10}.order-11{-ms-flex-order:11;order:11}.order-12{-ms-flex-order:12;order:12}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-sm-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-1{-ms-flex-order:1;order:1}.order-sm-2{-ms-flex-order:2;order:2}.order-sm-3{-ms-flex-order:3;order:3}.order-sm-4{-ms-flex-order:4;order:4}.order-sm-5{-ms-flex-order:5;order:5}.order-sm-6{-ms-flex-order:6;order:6}.order-sm-7{-ms-flex-order:7;order:7}.order-sm-8{-ms-flex-order:8;order:8}.order-sm-9{-ms-flex-order:9;order:9}.order-sm-10{-ms-flex-order:10;order:10}.order-sm-11{-ms-flex-order:11;order:11}.order-sm-12{-ms-flex-order:12;order:12}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-md-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-1{-ms-flex-order:1;order:1}.order-md-2{-ms-flex-order:2;order:2}.order-md-3{-ms-flex-order:3;order:3}.order-md-4{-ms-flex-order:4;order:4}.order-md-5{-ms-flex-order:5;order:5}.order-md-6{-ms-flex-order:6;order:6}.order-md-7{-ms-flex-order:7;order:7}.order-md-8{-ms-flex-order:8;order:8}.order-md-9{-ms-flex-order:9;order:9}.order-md-10{-ms-flex-order:10;order:10}.order-md-11{-ms-flex-order:11;order:11}.order-md-12{-ms-flex-order:12;order:12}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-lg-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-1{-ms-flex-order:1;order:1}.order-lg-2{-ms-flex-order:2;order:2}.order-lg-3{-ms-flex-order:3;order:3}.order-lg-4{-ms-flex-order:4;order:4}.order-lg-5{-ms-flex-order:5;order:5}.order-lg-6{-ms-flex-order:6;order:6}.order-lg-7{-ms-flex-order:7;order:7}.order-lg-8{-ms-flex-order:8;order:8}.order-lg-9{-ms-flex-order:9;order:9}.order-lg-10{-ms-flex-order:10;order:10}.order-lg-11{-ms-flex-order:11;order:11}.order-lg-12{-ms-flex-order:12;order:12}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-xl-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-1{-ms-flex-order:1;order:1}.order-xl-2{-ms-flex-order:2;order:2}.order-xl-3{-ms-flex-order:3;order:3}.order-xl-4{-ms-flex-order:4;order:4}.order-xl-5{-ms-flex-order:5;order:5}.order-xl-6{-ms-flex-order:6;order:6}.order-xl-7{-ms-flex-order:7;order:7}.order-xl-8{-ms-flex-order:8;order:8}.order-xl-9{-ms-flex-order:9;order:9}.order-xl-10{-ms-flex-order:10;order:10}.order-xl-11{-ms-flex-order:11;order:11}.order-xl-12{-ms-flex-order:12;order:12}}.table{width:100%;max-width:100%;margin-bottom:1rem;background-color:transparent}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #e9ecef}.table thead th{vertical-align:bottom;border-bottom:2px solid #e9ecef}.table tbody+tbody{border-top:2px solid #e9ecef}.table .table{background-color:#fff}.table-sm td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid #e9ecef}.table-bordered td,.table-bordered th{border:1px solid #e9ecef}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8daff}.table-hover .table-primary:hover{background-color:#9fcdff}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#dddfe2}.table-hover .table-secondary:hover{background-color:#cfd2d6}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#cfd2d6}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-hover .table-success:hover{background-color:#b1dfbb}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-hover .table-info:hover{background-color:#abdde5}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-hover .table-warning:hover{background-color:#ffe8a1}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c6cb}.table-hover .table-danger:hover{background-color:#f1b0b7}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-hover .table-light:hover{background-color:#ececf6}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-hover .table-dark:hover{background-color:#b9bbbe}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.thead-inverse th{color:#fff;background-color:#212529}.thead-default th{color:#495057;background-color:#e9ecef}.table-inverse{color:#fff;background-color:#212529}.table-inverse td,.table-inverse th,.table-inverse thead th{border-color:#32383e}.table-inverse.table-bordered{border:0}.table-inverse.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-inverse.table-hover tbody tr:hover{background-color:rgba(255,255,255,.075)}@media (max-width:991px){.table-responsive{display:block;width:100%;overflow-x:auto;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive.table-bordered{border:0}}.form-control{display:block;width:100%;padding:.5rem .75rem;font-size:1rem;line-height:1.25;color:#495057;background-color:#fff;background-image:none;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0}.form-control::-webkit-input-placeholder{color:#868e96;opacity:1}.form-control:-ms-input-placeholder{color:#868e96;opacity:1}.form-control::placeholder{color:#868e96;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}select.form-control:not([size]):not([multiple]){height:calc(2.25rem + 2px)}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block}.col-form-label{padding-top:calc(.5rem - 1px * 2);padding-bottom:calc(.5rem - 1px * 2);margin-bottom:0}.col-form-label-lg{padding-top:calc(.5rem - 1px * 2);padding-bottom:calc(.5rem - 1px * 2);font-size:1.25rem}.col-form-label-sm{padding-top:calc(.25rem - 1px * 2);padding-bottom:calc(.25rem - 1px * 2);font-size:.875rem}.col-form-legend{padding-top:.5rem;padding-bottom:.5rem;margin-bottom:0;font-size:1rem}.form-control-plaintext{padding-top:.5rem;padding-bottom:.5rem;margin-bottom:0;line-height:1.25;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm,.input-group-lg>.form-control-plaintext.form-control,.input-group-lg>.form-control-plaintext.input-group-addon,.input-group-lg>.input-group-btn>.form-control-plaintext.btn,.input-group-sm>.form-control-plaintext.form-control,.input-group-sm>.form-control-plaintext.input-group-addon,.input-group-sm>.input-group-btn>.form-control-plaintext.btn{padding-right:0;padding-left:0}.form-control-sm,.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-sm>.input-group-btn>select.btn:not([size]):not([multiple]),.input-group-sm>select.form-control:not([size]):not([multiple]),.input-group-sm>select.input-group-addon:not([size]):not([multiple]),select.form-control-sm:not([size]):not([multiple]){height:calc(1.8125rem + 2px)}.form-control-lg,.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-lg>.input-group-btn>select.btn:not([size]):not([multiple]),.input-group-lg>select.form-control:not([size]):not([multiple]),.input-group-lg>select.input-group-addon:not([size]):not([multiple]),select.form-control-lg:not([size]):not([multiple]){height:calc(2.3125rem + 2px)}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;margin-bottom:.5rem}.form-check.disabled .form-check-label{color:#868e96}.form-check-label{padding-left:1.25rem;margin-bottom:0}.form-check-input{position:absolute;margin-top:.25rem;margin-left:-1.25rem}.form-check-input:only-child{position:static}.form-check-inline{display:inline-block}.form-check-inline .form-check-label{vertical-align:middle}.form-check-inline+.form-check-inline{margin-left:.75rem}.invalid-feedback{display:none;margin-top:.25rem;font-size:.875rem;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;width:250px;padding:.5rem;margin-top:.1rem;font-size:.875rem;line-height:1;color:#fff;background-color:rgba(220,53,69,.8);border-radius:.2rem}.custom-select.is-valid,.form-control.is-valid,.was-validated .custom-select:valid,.was-validated .form-control:valid{border-color:#28a745}.custom-select.is-valid:focus,.form-control.is-valid:focus,.was-validated .custom-select:valid:focus,.was-validated .form-control:valid:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-select.is-valid~.invalid-feedback,.custom-select.is-valid~.invalid-tooltip,.form-control.is-valid~.invalid-feedback,.form-control.is-valid~.invalid-tooltip,.was-validated .custom-select:valid~.invalid-feedback,.was-validated .custom-select:valid~.invalid-tooltip,.was-validated .form-control:valid~.invalid-feedback,.was-validated .form-control:valid~.invalid-tooltip{display:block}.form-check-input.is-valid+.form-check-label,.was-validated .form-check-input:valid+.form-check-label{color:#28a745}.custom-control-input.is-valid~.custom-control-indicator,.was-validated .custom-control-input:valid~.custom-control-indicator{background-color:rgba(40,167,69,.25)}.custom-control-input.is-valid~.custom-control-description,.was-validated .custom-control-input:valid~.custom-control-description{color:#28a745}.custom-file-input.is-valid~.custom-file-control,.was-validated .custom-file-input:valid~.custom-file-control{border-color:#28a745}.custom-file-input.is-valid~.custom-file-control::before,.was-validated .custom-file-input:valid~.custom-file-control::before{border-color:inherit}.custom-file-input.is-valid:focus,.was-validated .custom-file-input:valid:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-select.is-invalid,.form-control.is-invalid,.was-validated .custom-select:invalid,.was-validated .form-control:invalid{border-color:#dc3545}.custom-select.is-invalid:focus,.form-control.is-invalid:focus,.was-validated .custom-select:invalid:focus,.was-validated .form-control:invalid:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-select.is-invalid~.invalid-feedback,.custom-select.is-invalid~.invalid-tooltip,.form-control.is-invalid~.invalid-feedback,.form-control.is-invalid~.invalid-tooltip,.was-validated .custom-select:invalid~.invalid-feedback,.was-validated .custom-select:invalid~.invalid-tooltip,.was-validated .form-control:invalid~.invalid-feedback,.was-validated .form-control:invalid~.invalid-tooltip{display:block}.form-check-input.is-invalid+.form-check-label,.was-validated .form-check-input:invalid+.form-check-label{color:#dc3545}.custom-control-input.is-invalid~.custom-control-indicator,.was-validated .custom-control-input:invalid~.custom-control-indicator{background-color:rgba(220,53,69,.25)}.custom-control-input.is-invalid~.custom-control-description,.was-validated .custom-control-input:invalid~.custom-control-description{color:#dc3545}.custom-file-input.is-invalid~.custom-file-control,.was-validated .custom-file-input:invalid~.custom-file-control{border-color:#dc3545}.custom-file-input.is-invalid~.custom-file-control::before,.was-validated .custom-file-input:invalid~.custom-file-control::before{border-color:inherit}.custom-file-input.is-invalid:focus,.was-validated .custom-file-input:invalid:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-ms-flexbox;display:flex;-ms-flex:0 0 auto;flex:0 0 auto;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .input-group{width:auto}.form-inline .form-control-label{margin-bottom:0;vertical-align:middle}.form-inline .form-check{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:auto;margin-top:0;margin-bottom:0}.form-inline .form-check-label{padding-left:0}.form-inline .form-check-input{position:relative;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;padding-left:0}.form-inline .custom-control-indicator{position:static;display:inline-block;margin-right:.25rem;vertical-align:text-bottom}.form-inline .has-feedback .form-control-feedback{top:0}}.btn{display:inline-block;font-weight:400;text-align:center;white-space:nowrap;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid transparent;padding:.5rem .75rem;font-size:1rem;line-height:1.25;border-radius:.25rem;transition:all .15s ease-in-out}.btn:focus,.btn:hover{text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 3px rgba(0,123,255,.25)}.btn.disabled,.btn:disabled{opacity:.65}.btn.active,.btn:active{background-image:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.focus,.btn-primary:focus{box-shadow:0 0 0 3px rgba(0,123,255,.5)}.btn-primary.disabled,.btn-primary:disabled{background-color:#007bff;border-color:#007bff}.btn-primary.active,.btn-primary:active,.show>.btn-primary.dropdown-toggle{background-color:#0069d9;background-image:none;border-color:#0062cc}.btn-secondary{color:#fff;background-color:#868e96;border-color:#868e96}.btn-secondary:hover{color:#fff;background-color:#727b84;border-color:#6c757d}.btn-secondary.focus,.btn-secondary:focus{box-shadow:0 0 0 3px rgba(134,142,150,.5)}.btn-secondary.disabled,.btn-secondary:disabled{background-color:#868e96;border-color:#868e96}.btn-secondary.active,.btn-secondary:active,.show>.btn-secondary.dropdown-toggle{background-color:#727b84;background-image:none;border-color:#6c757d}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{box-shadow:0 0 0 3px rgba(40,167,69,.5)}.btn-success.disabled,.btn-success:disabled{background-color:#28a745;border-color:#28a745}.btn-success.active,.btn-success:active,.show>.btn-success.dropdown-toggle{background-color:#218838;background-image:none;border-color:#1e7e34}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{box-shadow:0 0 0 3px rgba(23,162,184,.5)}.btn-info.disabled,.btn-info:disabled{background-color:#17a2b8;border-color:#17a2b8}.btn-info.active,.btn-info:active,.show>.btn-info.dropdown-toggle{background-color:#138496;background-image:none;border-color:#117a8b}.btn-warning{color:#111;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#111;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{box-shadow:0 0 0 3px rgba(255,193,7,.5)}.btn-warning.disabled,.btn-warning:disabled{background-color:#ffc107;border-color:#ffc107}.btn-warning.active,.btn-warning:active,.show>.btn-warning.dropdown-toggle{background-color:#e0a800;background-image:none;border-color:#d39e00}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{box-shadow:0 0 0 3px rgba(220,53,69,.5)}.btn-danger.disabled,.btn-danger:disabled{background-color:#dc3545;border-color:#dc3545}.btn-danger.active,.btn-danger:active,.show>.btn-danger.dropdown-toggle{background-color:#c82333;background-image:none;border-color:#bd2130}.btn-light{color:#111;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#111;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{box-shadow:0 0 0 3px rgba(248,249,250,.5)}.btn-light.disabled,.btn-light:disabled{background-color:#f8f9fa;border-color:#f8f9fa}.btn-light.active,.btn-light:active,.show>.btn-light.dropdown-toggle{background-color:#e2e6ea;background-image:none;border-color:#dae0e5}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{box-shadow:0 0 0 3px rgba(52,58,64,.5)}.btn-dark.disabled,.btn-dark:disabled{background-color:#343a40;border-color:#343a40}.btn-dark.active,.btn-dark:active,.show>.btn-dark.dropdown-toggle{background-color:#23272b;background-image:none;border-color:#1d2124}.btn-outline-primary{color:#007bff;background-color:transparent;background-image:none;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 3px rgba(0,123,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary.active,.btn-outline-primary:active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-secondary{color:#868e96;background-color:transparent;background-image:none;border-color:#868e96}.btn-outline-secondary:hover{color:#fff;background-color:#868e96;border-color:#868e96}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 3px rgba(134,142,150,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#868e96;background-color:transparent}.btn-outline-secondary.active,.btn-outline-secondary:active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#868e96;border-color:#868e96}.btn-outline-success{color:#28a745;background-color:transparent;background-image:none;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 3px rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success.active,.btn-outline-success:active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-info{color:#17a2b8;background-color:transparent;background-image:none;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 3px rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info.active,.btn-outline-info:active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-warning{color:#ffc107;background-color:transparent;background-image:none;border-color:#ffc107}.btn-outline-warning:hover{color:#fff;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 3px rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning.active,.btn-outline-warning:active,.show>.btn-outline-warning.dropdown-toggle{color:#fff;background-color:#ffc107;border-color:#ffc107}.btn-outline-danger{color:#dc3545;background-color:transparent;background-image:none;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 3px rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger.active,.btn-outline-danger:active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-light{color:#f8f9fa;background-color:transparent;background-image:none;border-color:#f8f9fa}.btn-outline-light:hover{color:#fff;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 3px rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light.active,.btn-outline-light:active,.show>.btn-outline-light.dropdown-toggle{color:#fff;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-dark{color:#343a40;background-color:transparent;background-image:none;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 3px rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark.active,.btn-outline-dark:active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-link{font-weight:400;color:#007bff;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link:disabled{background-color:transparent}.btn-link,.btn-link:active,.btn-link:focus{border-color:transparent;box-shadow:none}.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#0056b3;text-decoration:underline;background-color:transparent}.btn-link:disabled{color:#868e96}.btn-link:disabled:focus,.btn-link:disabled:hover{text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;transition:opacity .15s linear}.fade.show{opacity:1}.collapse{display:none}.collapse.show{display:block}tr.collapse.show{display:table-row}tbody.collapse.show{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}.dropdown,.dropup{position:relative}.dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropup .dropdown-menu{margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{border-top:0;border-bottom:.3em solid}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background:0 0;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#868e96;background-color:transparent}.show>a{outline:0}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#868e96;white-space:nowrap}.btn-group,.btn-group-vertical{position:relative;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-ms-flex:0 1 auto;flex:0 1 auto;margin-bottom:0}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:2}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group,.btn-group-vertical .btn+.btn,.btn-group-vertical .btn+.btn-group,.btn-group-vertical .btn-group+.btn,.btn-group-vertical .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn+.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.btn+.dropdown-toggle-split::after{margin-left:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:center;justify-content:center}.btn-group-vertical .btn,.btn-group-vertical .btn-group{width:100%}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-ms-flexbox;display:flex;width:100%}.input-group .form-control{position:relative;z-index:2;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;margin-bottom:0}.input-group .form-control:active,.input-group .form-control:focus,.input-group .form-control:hover{z-index:3}.input-group .form-control,.input-group-addon,.input-group-btn{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{white-space:nowrap;vertical-align:middle}.input-group-addon{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.25;color:#495057;text-align:center;background-color:#e9ecef;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.input-group-addon.form-control-sm,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.input-group-addon.btn{padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.input-group-addon.form-control-lg,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.input-group-addon.btn{padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:not(:last-child),.input-group-addon:not(:last-child),.input-group-btn:not(:first-child)>.btn-group:not(:last-child)>.btn,.input-group-btn:not(:first-child)>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:not(:last-child)>.btn,.input-group-btn:not(:last-child)>.btn-group>.btn,.input-group-btn:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:not(:last-child){border-right:0}.input-group .form-control:not(:first-child),.input-group-addon:not(:first-child),.input-group-btn:not(:first-child)>.btn,.input-group-btn:not(:first-child)>.btn-group>.btn,.input-group-btn:not(:first-child)>.dropdown-toggle,.input-group-btn:not(:last-child)>.btn-group:not(:first-child)>.btn,.input-group-btn:not(:last-child)>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.form-control+.input-group-addon:not(:first-child){border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:3}.input-group-btn:not(:last-child)>.btn,.input-group-btn:not(:last-child)>.btn-group{margin-right:-1px}.input-group-btn:not(:first-child)>.btn,.input-group-btn:not(:first-child)>.btn-group{z-index:2;margin-left:-1px}.input-group-btn:not(:first-child)>.btn-group:active,.input-group-btn:not(:first-child)>.btn-group:focus,.input-group-btn:not(:first-child)>.btn-group:hover,.input-group-btn:not(:first-child)>.btn:active,.input-group-btn:not(:first-child)>.btn:focus,.input-group-btn:not(:first-child)>.btn:hover{z-index:3}.custom-control{position:relative;display:-ms-inline-flexbox;display:inline-flex;min-height:1.5rem;padding-left:1.5rem;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked~.custom-control-indicator{color:#fff;background-color:#007bff}.custom-control-input:focus~.custom-control-indicator{box-shadow:0 0 0 1px #fff,0 0 0 3px #007bff}.custom-control-input:active~.custom-control-indicator{color:#fff;background-color:#b3d7ff}.custom-control-input:disabled~.custom-control-indicator{background-color:#e9ecef}.custom-control-input:disabled~.custom-control-description{color:#868e96}.custom-control-indicator{position:absolute;top:.25rem;left:0;display:block;width:1rem;height:1rem;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#ddd;background-repeat:no-repeat;background-position:center center;background-size:50% 50%}.custom-checkbox .custom-control-indicator{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-indicator{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' 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")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-indicator{background-color:#007bff;background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E")}.custom-radio .custom-control-indicator{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-indicator{background-image: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='%23fff'/%3E%3C/svg%3E")}.custom-controls-stacked{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.custom-controls-stacked .custom-control{margin-bottom:.25rem}.custom-controls-stacked .custom-control+.custom-control{margin-left:0}.custom-select{display:inline-block;max-width:100%;height:calc(2.25rem + 2px);padding:.375rem 1.75rem .375rem .75rem;line-height:1.25;color:#495057;vertical-align:middle;background:#fff url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23333' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right .75rem center;background-size:8px 10px;border:1px solid rgba(0,0,0,.15);border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select:disabled{color:#868e96;background-color:#e9ecef}.custom-select::-ms-expand{opacity:0}.custom-select-sm{height:calc(1.8125rem + 2px);padding-top:.375rem;padding-bottom:.375rem;font-size:75%}.custom-file{position:relative;display:inline-block;max-width:100%;height:2.5rem;margin-bottom:0}.custom-file-input{min-width:14rem;max-width:100%;height:2.5rem;margin:0;opacity:0}.custom-file-control{position:absolute;top:0;right:0;left:0;z-index:5;height:2.5rem;padding:.5rem 1rem;line-height:1.5;color:#495057;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#fff;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.custom-file-control:lang(en):empty::after{content:"Choose file..."}.custom-file-control::before{position:absolute;top:-1px;right:-1px;bottom:-1px;z-index:6;display:block;height:2.5rem;padding:.5rem 1rem;line-height:1.5;color:#495057;background-color:#e9ecef;border:1px solid rgba(0,0,0,.15);border-radius:0 .25rem .25rem 0}.custom-file-control:lang(en)::before{content:"Browse"}.nav{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#868e96}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #ddd}.nav-tabs .nav-link.disabled{color:#868e96;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#ddd #ddd #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.show>.nav-pills .nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item{-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.navbar>.container,.navbar>.container-fluid{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background:0 0;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat center center;background-size:100% 100%}@media (max-width:575px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:-ms-flexbox!important;display:flex!important}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:767px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:-ms-flexbox!important;display:flex!important}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:991px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:-ms-flexbox!important;display:flex!important}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:-ms-flexbox!important;display:flex!important}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:-ms-flexbox!important;display:flex!important}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-dark .navbar-text{color:rgba(255,255,255,.5)}.card{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card-body{-ms-flex:1 1 auto;flex:1 1 auto;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img{width:100%;border-radius:calc(.25rem - 1px)}.card-img-top{width:100%;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img-bottom{width:100%;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}@media (min-width:576px){.card-deck{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{display:-ms-flexbox;display:flex;-ms-flex:1 0 0%;flex:1 0 0%;-ms-flex-direction:column;flex-direction:column;margin-right:15px;margin-left:15px}}@media (min-width:576px){.card-group{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group .card{-ms-flex:1 0 0%;flex:1 0 0%}.card-group .card+.card{margin-left:0;border-left:0}.card-group .card:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.card-group .card:first-child .card-img-top{border-top-right-radius:0}.card-group .card:first-child .card-img-bottom{border-bottom-right-radius:0}.card-group .card:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.card-group .card:last-child .card-img-top{border-top-left-radius:0}.card-group .card:last-child .card-img-bottom{border-bottom-left-radius:0}.card-group .card:not(:first-child):not(:last-child){border-radius:0}.card-group .card:not(:first-child):not(:last-child) .card-img-bottom,.card-group .card:not(:first-child):not(:last-child) .card-img-top{border-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-webkit-column-count:3;column-count:3;-webkit-column-gap:1.25rem;column-gap:1.25rem}.card-columns .card{display:inline-block;width:100%}}.breadcrumb{padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb::after{display:block;clear:both;content:""}.breadcrumb-item{float:left}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.5rem;padding-left:.5rem;color:#868e96;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#868e96}.pagination{display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#868e96;pointer-events:none;background-color:#fff;border-color:#ddd}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #ddd}.page-link:focus,.page-link:hover{color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#ddd}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}.badge-primary[href]:focus,.badge-primary[href]:hover{color:#fff;text-decoration:none;background-color:#0062cc}.badge-secondary{color:#fff;background-color:#868e96}.badge-secondary[href]:focus,.badge-secondary[href]:hover{color:#fff;text-decoration:none;background-color:#6c757d}.badge-success{color:#fff;background-color:#28a745}.badge-success[href]:focus,.badge-success[href]:hover{color:#fff;text-decoration:none;background-color:#1e7e34}.badge-info{color:#fff;background-color:#17a2b8}.badge-info[href]:focus,.badge-info[href]:hover{color:#fff;text-decoration:none;background-color:#117a8b}.badge-warning{color:#111;background-color:#ffc107}.badge-warning[href]:focus,.badge-warning[href]:hover{color:#111;text-decoration:none;background-color:#d39e00}.badge-danger{color:#fff;background-color:#dc3545}.badge-danger[href]:focus,.badge-danger[href]:hover{color:#fff;text-decoration:none;background-color:#bd2130}.badge-light{color:#111;background-color:#f8f9fa}.badge-light[href]:focus,.badge-light[href]:hover{color:#111;text-decoration:none;background-color:#dae0e5}.badge-dark{color:#fff;background-color:#343a40}.badge-dark[href]:focus,.badge-dark[href]:hover{color:#fff;text-decoration:none;background-color:#1d2124}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible .close{position:relative;top:-.75rem;right:-1.25rem;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#464a4e;background-color:#e7e8ea;border-color:#dddfe2}.alert-secondary hr{border-top-color:#cfd2d6}.alert-secondary .alert-link{color:#2e3133}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-ms-flexbox;display:flex;overflow:hidden;font-size:.75rem;line-height:1rem;text-align:center;background-color:#e9ecef;border-radius:.25rem}.progress-bar{height:1rem;line-height:1rem;color:#fff;background-color:#007bff;transition:width .6s ease}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}.media{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start}.media-body{-ms-flex:1;flex:1}.list-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.list-group-item:focus,.list-group-item:hover{text-decoration:none}.list-group-item.disabled,.list-group-item:disabled{color:#868e96;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-flush .list-group-item{border-right:0;border-left:0;border-radius:0}.list-group-flush:first-child .list-group-item:first-child{border-top:0}.list-group-flush:last-child .list-group-item:last-child{border-bottom:0}.list-group-item-primary{color:#004085;background-color:#b8daff}a.list-group-item-primary,button.list-group-item-primary{color:#004085}a.list-group-item-primary:focus,a.list-group-item-primary:hover,button.list-group-item-primary:focus,button.list-group-item-primary:hover{color:#004085;background-color:#9fcdff}a.list-group-item-primary.active,button.list-group-item-primary.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#464a4e;background-color:#dddfe2}a.list-group-item-secondary,button.list-group-item-secondary{color:#464a4e}a.list-group-item-secondary:focus,a.list-group-item-secondary:hover,button.list-group-item-secondary:focus,button.list-group-item-secondary:hover{color:#464a4e;background-color:#cfd2d6}a.list-group-item-secondary.active,button.list-group-item-secondary.active{color:#fff;background-color:#464a4e;border-color:#464a4e}.list-group-item-success{color:#155724;background-color:#c3e6cb}a.list-group-item-success,button.list-group-item-success{color:#155724}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#155724;background-color:#b1dfbb}a.list-group-item-success.active,button.list-group-item-success.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}a.list-group-item-info,button.list-group-item-info{color:#0c5460}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#0c5460;background-color:#abdde5}a.list-group-item-info.active,button.list-group-item-info.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}a.list-group-item-warning,button.list-group-item-warning{color:#856404}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#856404;background-color:#ffe8a1}a.list-group-item-warning.active,button.list-group-item-warning.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}a.list-group-item-danger,button.list-group-item-danger{color:#721c24}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#721c24;background-color:#f1b0b7}a.list-group-item-danger.active,button.list-group-item-danger.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}a.list-group-item-light,button.list-group-item-light{color:#818182}a.list-group-item-light:focus,a.list-group-item-light:hover,button.list-group-item-light:focus,button.list-group-item-light:hover{color:#818182;background-color:#ececf6}a.list-group-item-light.active,button.list-group-item-light.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}a.list-group-item-dark,button.list-group-item-dark{color:#1b1e21}a.list-group-item-dark:focus,a.list-group-item-dark:hover,button.list-group-item-dark:focus,button.list-group-item-dark:hover{color:#1b1e21;background-color:#b9bbbe}a.list-group-item-dark.active,button.list-group-item-dark.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:focus,.close:hover{color:#000;text-decoration:none;opacity:.75}button.close{padding:0;background:0 0;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;outline:0}.modal.fade .modal-dialog{transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.show .modal-dialog{-webkit-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;padding:15px;border-bottom:1px solid #e9ecef}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;padding:15px}.modal-footer{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:end;justify-content:flex-end;padding:15px;border-top:1px solid #e9ecef}.modal-footer>:not(:first-child){margin-left:.25rem}.modal-footer>:not(:last-child){margin-right:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:30px auto}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg{max-width:800px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:5px;height:5px}.tooltip.bs-tooltip-auto[x-placement^=top],.tooltip.bs-tooltip-top{padding:5px 0}.tooltip.bs-tooltip-auto[x-placement^=top] .arrow,.tooltip.bs-tooltip-top .arrow{bottom:0}.tooltip.bs-tooltip-auto[x-placement^=top] .arrow::before,.tooltip.bs-tooltip-top .arrow::before{margin-left:-3px;content:"";border-width:5px 5px 0;border-top-color:#000}.tooltip.bs-tooltip-auto[x-placement^=right],.tooltip.bs-tooltip-right{padding:0 5px}.tooltip.bs-tooltip-auto[x-placement^=right] .arrow,.tooltip.bs-tooltip-right .arrow{left:0}.tooltip.bs-tooltip-auto[x-placement^=right] .arrow::before,.tooltip.bs-tooltip-right .arrow::before{margin-top:-3px;content:"";border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.bs-tooltip-auto[x-placement^=bottom],.tooltip.bs-tooltip-bottom{padding:5px 0}.tooltip.bs-tooltip-auto[x-placement^=bottom] .arrow,.tooltip.bs-tooltip-bottom .arrow{top:0}.tooltip.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.tooltip.bs-tooltip-bottom .arrow::before{margin-left:-3px;content:"";border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bs-tooltip-auto[x-placement^=left],.tooltip.bs-tooltip-left{padding:0 5px}.tooltip.bs-tooltip-auto[x-placement^=left] .arrow,.tooltip.bs-tooltip-left .arrow{right:0}.tooltip.bs-tooltip-auto[x-placement^=left] .arrow::before,.tooltip.bs-tooltip-left .arrow::before{right:0;margin-top:-3px;content:"";border-width:5px 0 5px 5px;border-left-color:#000}.tooltip .arrow::before{position:absolute;border-color:transparent;border-style:solid}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;padding:1px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .arrow{position:absolute;display:block;width:10px;height:5px}.popover .arrow::after,.popover .arrow::before{position:absolute;display:block;border-color:transparent;border-style:solid}.popover .arrow::before{content:"";border-width:11px}.popover .arrow::after{content:"";border-width:11px}.popover.bs-popover-auto[x-placement^=top],.popover.bs-popover-top{margin-bottom:10px}.popover.bs-popover-auto[x-placement^=top] .arrow,.popover.bs-popover-top .arrow{bottom:0}.popover.bs-popover-auto[x-placement^=top] .arrow::after,.popover.bs-popover-auto[x-placement^=top] .arrow::before,.popover.bs-popover-top .arrow::after,.popover.bs-popover-top .arrow::before{border-bottom-width:0}.popover.bs-popover-auto[x-placement^=top] .arrow::before,.popover.bs-popover-top .arrow::before{bottom:-11px;margin-left:-6px;border-top-color:rgba(0,0,0,.25)}.popover.bs-popover-auto[x-placement^=top] .arrow::after,.popover.bs-popover-top .arrow::after{bottom:-10px;margin-left:-6px;border-top-color:#fff}.popover.bs-popover-auto[x-placement^=right],.popover.bs-popover-right{margin-left:10px}.popover.bs-popover-auto[x-placement^=right] .arrow,.popover.bs-popover-right .arrow{left:0}.popover.bs-popover-auto[x-placement^=right] .arrow::after,.popover.bs-popover-auto[x-placement^=right] .arrow::before,.popover.bs-popover-right .arrow::after,.popover.bs-popover-right .arrow::before{margin-top:-8px;border-left-width:0}.popover.bs-popover-auto[x-placement^=right] .arrow::before,.popover.bs-popover-right .arrow::before{left:-11px;border-right-color:rgba(0,0,0,.25)}.popover.bs-popover-auto[x-placement^=right] .arrow::after,.popover.bs-popover-right .arrow::after{left:-10px;border-right-color:#fff}.popover.bs-popover-auto[x-placement^=bottom],.popover.bs-popover-bottom{margin-top:10px}.popover.bs-popover-auto[x-placement^=bottom] .arrow,.popover.bs-popover-bottom .arrow{top:0}.popover.bs-popover-auto[x-placement^=bottom] .arrow::after,.popover.bs-popover-auto[x-placement^=bottom] .arrow::before,.popover.bs-popover-bottom .arrow::after,.popover.bs-popover-bottom .arrow::before{margin-left:-7px;border-top-width:0}.popover.bs-popover-auto[x-placement^=bottom] .arrow::before,.popover.bs-popover-bottom .arrow::before{top:-11px;border-bottom-color:rgba(0,0,0,.25)}.popover.bs-popover-auto[x-placement^=bottom] .arrow::after,.popover.bs-popover-bottom .arrow::after{top:-10px;border-bottom-color:#fff}.popover.bs-popover-auto[x-placement^=bottom] .popover-header::before,.popover.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:20px;margin-left:-10px;content:"";border-bottom:1px solid #f7f7f7}.popover.bs-popover-auto[x-placement^=left],.popover.bs-popover-left{margin-right:10px}.popover.bs-popover-auto[x-placement^=left] .arrow,.popover.bs-popover-left .arrow{right:0}.popover.bs-popover-auto[x-placement^=left] .arrow::after,.popover.bs-popover-auto[x-placement^=left] .arrow::before,.popover.bs-popover-left .arrow::after,.popover.bs-popover-left .arrow::before{margin-top:-8px;border-right-width:0}.popover.bs-popover-auto[x-placement^=left] .arrow::before,.popover.bs-popover-left .arrow::before{right:-11px;border-left-color:rgba(0,0,0,.25)}.popover.bs-popover-auto[x-placement^=left] .arrow::after,.popover.bs-popover-left .arrow::after{right:-10px;border-left-color:#fff}.popover-header{padding:8px 14px;margin-bottom:0;font-size:1rem;color:inherit;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:9px 14px;color:#212529}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-item{position:relative;display:none;-ms-flex-align:center;align-items:center;width:100%;transition:-webkit-transform .6s ease;transition:transform .6s ease;transition:transform .6s ease,-webkit-transform .6s ease;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.carousel-item-next,.carousel-item-prev{position:absolute;top:0}.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translateX(0);transform:translateX(0)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.active.carousel-item-right,.carousel-item-next{-webkit-transform:translateX(100%);transform:translateX(100%)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.active.carousel-item-right,.carousel-item-next{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}.active.carousel-item-left,.carousel-item-prev{-webkit-transform:translateX(-100%);transform:translateX(-100%)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.active.carousel-item-left,.carousel-item-prev{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:transparent no-repeat center center;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M4 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")}.carousel-control-next-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M1.5 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")}.carousel-indicators{position:absolute;right:0;bottom:10px;left:0;z-index:15;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{position:relative;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;background-color:rgba(255,255,255,.5)}.carousel-indicators li::before{position:absolute;top:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators li::after{position:absolute;bottom:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#007bff!important}a.bg-primary:focus,a.bg-primary:hover{background-color:#0062cc!important}.bg-secondary{background-color:#868e96!important}a.bg-secondary:focus,a.bg-secondary:hover{background-color:#6c757d!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#dc3545!important}a.bg-danger:focus,a.bg-danger:hover{background-color:#bd2130!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #e9ecef!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#007bff!important}.border-secondary{border-color:#868e96!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-right{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-circle{border-radius:50%}.rounded-0{border-radius:0}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-cell{display:table-cell!important}.d-flex{display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}.d-print-block{display:none!important}@media print{.d-print-block{display:block!important}}.d-print-inline{display:none!important}@media print{.d-print-inline{display:inline!important}}.d-print-inline-block{display:none!important}@media print{.d-print-inline-block{display:inline-block!important}}@media print{.d-print-none{display:none!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.857143%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-sm-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-md-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-lg-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-xl-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;-webkit-clip-path:inset(50%);clip-path:inset(50%);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal;-webkit-clip-path:none;clip-path:none}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.m-0{margin:0!important}.mt-0{margin-top:0!important}.mr-0{margin-right:0!important}.mb-0{margin-bottom:0!important}.ml-0{margin-left:0!important}.mx-0{margin-right:0!important;margin-left:0!important}.my-0{margin-top:0!important;margin-bottom:0!important}.m-1{margin:.25rem!important}.mt-1{margin-top:.25rem!important}.mr-1{margin-right:.25rem!important}.mb-1{margin-bottom:.25rem!important}.ml-1{margin-left:.25rem!important}.mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.m-2{margin:.5rem!important}.mt-2{margin-top:.5rem!important}.mr-2{margin-right:.5rem!important}.mb-2{margin-bottom:.5rem!important}.ml-2{margin-left:.5rem!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.m-3{margin:1rem!important}.mt-3{margin-top:1rem!important}.mr-3{margin-right:1rem!important}.mb-3{margin-bottom:1rem!important}.ml-3{margin-left:1rem!important}.mx-3{margin-right:1rem!important;margin-left:1rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.m-4{margin:1.5rem!important}.mt-4{margin-top:1.5rem!important}.mr-4{margin-right:1.5rem!important}.mb-4{margin-bottom:1.5rem!important}.ml-4{margin-left:1.5rem!important}.mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.m-5{margin:3rem!important}.mt-5{margin-top:3rem!important}.mr-5{margin-right:3rem!important}.mb-5{margin-bottom:3rem!important}.ml-5{margin-left:3rem!important}.mx-5{margin-right:3rem!important;margin-left:3rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.p-0{padding:0!important}.pt-0{padding-top:0!important}.pr-0{padding-right:0!important}.pb-0{padding-bottom:0!important}.pl-0{padding-left:0!important}.px-0{padding-right:0!important;padding-left:0!important}.py-0{padding-top:0!important;padding-bottom:0!important}.p-1{padding:.25rem!important}.pt-1{padding-top:.25rem!important}.pr-1{padding-right:.25rem!important}.pb-1{padding-bottom:.25rem!important}.pl-1{padding-left:.25rem!important}.px-1{padding-right:.25rem!important;padding-left:.25rem!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.p-2{padding:.5rem!important}.pt-2{padding-top:.5rem!important}.pr-2{padding-right:.5rem!important}.pb-2{padding-bottom:.5rem!important}.pl-2{padding-left:.5rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.p-3{padding:1rem!important}.pt-3{padding-top:1rem!important}.pr-3{padding-right:1rem!important}.pb-3{padding-bottom:1rem!important}.pl-3{padding-left:1rem!important}.px-3{padding-right:1rem!important;padding-left:1rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.p-4{padding:1.5rem!important}.pt-4{padding-top:1.5rem!important}.pr-4{padding-right:1.5rem!important}.pb-4{padding-bottom:1.5rem!important}.pl-4{padding-left:1.5rem!important}.px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.p-5{padding:3rem!important}.pt-5{padding-top:3rem!important}.pr-5{padding-right:3rem!important}.pb-5{padding-bottom:3rem!important}.pl-5{padding-left:3rem!important}.px-5{padding-right:3rem!important;padding-left:3rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.m-auto{margin:auto!important}.mt-auto{margin-top:auto!important}.mr-auto{margin-right:auto!important}.mb-auto{margin-bottom:auto!important}.ml-auto{margin-left:auto!important}.mx-auto{margin-right:auto!important;margin-left:auto!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0{margin-top:0!important}.mr-sm-0{margin-right:0!important}.mb-sm-0{margin-bottom:0!important}.ml-sm-0{margin-left:0!important}.mx-sm-0{margin-right:0!important;margin-left:0!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1{margin-top:.25rem!important}.mr-sm-1{margin-right:.25rem!important}.mb-sm-1{margin-bottom:.25rem!important}.ml-sm-1{margin-left:.25rem!important}.mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2{margin-top:.5rem!important}.mr-sm-2{margin-right:.5rem!important}.mb-sm-2{margin-bottom:.5rem!important}.ml-sm-2{margin-left:.5rem!important}.mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3{margin-top:1rem!important}.mr-sm-3{margin-right:1rem!important}.mb-sm-3{margin-bottom:1rem!important}.ml-sm-3{margin-left:1rem!important}.mx-sm-3{margin-right:1rem!important;margin-left:1rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4{margin-top:1.5rem!important}.mr-sm-4{margin-right:1.5rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.ml-sm-4{margin-left:1.5rem!important}.mx-sm-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5{margin-top:3rem!important}.mr-sm-5{margin-right:3rem!important}.mb-sm-5{margin-bottom:3rem!important}.ml-sm-5{margin-left:3rem!important}.mx-sm-5{margin-right:3rem!important;margin-left:3rem!important}.my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0{padding-top:0!important}.pr-sm-0{padding-right:0!important}.pb-sm-0{padding-bottom:0!important}.pl-sm-0{padding-left:0!important}.px-sm-0{padding-right:0!important;padding-left:0!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1{padding-top:.25rem!important}.pr-sm-1{padding-right:.25rem!important}.pb-sm-1{padding-bottom:.25rem!important}.pl-sm-1{padding-left:.25rem!important}.px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2{padding-top:.5rem!important}.pr-sm-2{padding-right:.5rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pl-sm-2{padding-left:.5rem!important}.px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3{padding-top:1rem!important}.pr-sm-3{padding-right:1rem!important}.pb-sm-3{padding-bottom:1rem!important}.pl-sm-3{padding-left:1rem!important}.px-sm-3{padding-right:1rem!important;padding-left:1rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4{padding-top:1.5rem!important}.pr-sm-4{padding-right:1.5rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pl-sm-4{padding-left:1.5rem!important}.px-sm-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5{padding-top:3rem!important}.pr-sm-5{padding-right:3rem!important}.pb-sm-5{padding-bottom:3rem!important}.pl-sm-5{padding-left:3rem!important}.px-sm-5{padding-right:3rem!important;padding-left:3rem!important}.py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto{margin-top:auto!important}.mr-sm-auto{margin-right:auto!important}.mb-sm-auto{margin-bottom:auto!important}.ml-sm-auto{margin-left:auto!important}.mx-sm-auto{margin-right:auto!important;margin-left:auto!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0{margin-top:0!important}.mr-md-0{margin-right:0!important}.mb-md-0{margin-bottom:0!important}.ml-md-0{margin-left:0!important}.mx-md-0{margin-right:0!important;margin-left:0!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.m-md-1{margin:.25rem!important}.mt-md-1{margin-top:.25rem!important}.mr-md-1{margin-right:.25rem!important}.mb-md-1{margin-bottom:.25rem!important}.ml-md-1{margin-left:.25rem!important}.mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2{margin-top:.5rem!important}.mr-md-2{margin-right:.5rem!important}.mb-md-2{margin-bottom:.5rem!important}.ml-md-2{margin-left:.5rem!important}.mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3{margin-top:1rem!important}.mr-md-3{margin-right:1rem!important}.mb-md-3{margin-bottom:1rem!important}.ml-md-3{margin-left:1rem!important}.mx-md-3{margin-right:1rem!important;margin-left:1rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4{margin-top:1.5rem!important}.mr-md-4{margin-right:1.5rem!important}.mb-md-4{margin-bottom:1.5rem!important}.ml-md-4{margin-left:1.5rem!important}.mx-md-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5{margin-top:3rem!important}.mr-md-5{margin-right:3rem!important}.mb-md-5{margin-bottom:3rem!important}.ml-md-5{margin-left:3rem!important}.mx-md-5{margin-right:3rem!important;margin-left:3rem!important}.my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}.p-md-0{padding:0!important}.pt-md-0{padding-top:0!important}.pr-md-0{padding-right:0!important}.pb-md-0{padding-bottom:0!important}.pl-md-0{padding-left:0!important}.px-md-0{padding-right:0!important;padding-left:0!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.p-md-1{padding:.25rem!important}.pt-md-1{padding-top:.25rem!important}.pr-md-1{padding-right:.25rem!important}.pb-md-1{padding-bottom:.25rem!important}.pl-md-1{padding-left:.25rem!important}.px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2{padding-top:.5rem!important}.pr-md-2{padding-right:.5rem!important}.pb-md-2{padding-bottom:.5rem!important}.pl-md-2{padding-left:.5rem!important}.px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3{padding-top:1rem!important}.pr-md-3{padding-right:1rem!important}.pb-md-3{padding-bottom:1rem!important}.pl-md-3{padding-left:1rem!important}.px-md-3{padding-right:1rem!important;padding-left:1rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4{padding-top:1.5rem!important}.pr-md-4{padding-right:1.5rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pl-md-4{padding-left:1.5rem!important}.px-md-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5{padding-top:3rem!important}.pr-md-5{padding-right:3rem!important}.pb-md-5{padding-bottom:3rem!important}.pl-md-5{padding-left:3rem!important}.px-md-5{padding-right:3rem!important;padding-left:3rem!important}.py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto{margin-top:auto!important}.mr-md-auto{margin-right:auto!important}.mb-md-auto{margin-bottom:auto!important}.ml-md-auto{margin-left:auto!important}.mx-md-auto{margin-right:auto!important;margin-left:auto!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0{margin-top:0!important}.mr-lg-0{margin-right:0!important}.mb-lg-0{margin-bottom:0!important}.ml-lg-0{margin-left:0!important}.mx-lg-0{margin-right:0!important;margin-left:0!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1{margin-top:.25rem!important}.mr-lg-1{margin-right:.25rem!important}.mb-lg-1{margin-bottom:.25rem!important}.ml-lg-1{margin-left:.25rem!important}.mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2{margin-top:.5rem!important}.mr-lg-2{margin-right:.5rem!important}.mb-lg-2{margin-bottom:.5rem!important}.ml-lg-2{margin-left:.5rem!important}.mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3{margin-top:1rem!important}.mr-lg-3{margin-right:1rem!important}.mb-lg-3{margin-bottom:1rem!important}.ml-lg-3{margin-left:1rem!important}.mx-lg-3{margin-right:1rem!important;margin-left:1rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4{margin-top:1.5rem!important}.mr-lg-4{margin-right:1.5rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.ml-lg-4{margin-left:1.5rem!important}.mx-lg-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5{margin-top:3rem!important}.mr-lg-5{margin-right:3rem!important}.mb-lg-5{margin-bottom:3rem!important}.ml-lg-5{margin-left:3rem!important}.mx-lg-5{margin-right:3rem!important;margin-left:3rem!important}.my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0{padding-top:0!important}.pr-lg-0{padding-right:0!important}.pb-lg-0{padding-bottom:0!important}.pl-lg-0{padding-left:0!important}.px-lg-0{padding-right:0!important;padding-left:0!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1{padding-top:.25rem!important}.pr-lg-1{padding-right:.25rem!important}.pb-lg-1{padding-bottom:.25rem!important}.pl-lg-1{padding-left:.25rem!important}.px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2{padding-top:.5rem!important}.pr-lg-2{padding-right:.5rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pl-lg-2{padding-left:.5rem!important}.px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3{padding-top:1rem!important}.pr-lg-3{padding-right:1rem!important}.pb-lg-3{padding-bottom:1rem!important}.pl-lg-3{padding-left:1rem!important}.px-lg-3{padding-right:1rem!important;padding-left:1rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4{padding-top:1.5rem!important}.pr-lg-4{padding-right:1.5rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pl-lg-4{padding-left:1.5rem!important}.px-lg-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5{padding-top:3rem!important}.pr-lg-5{padding-right:3rem!important}.pb-lg-5{padding-bottom:3rem!important}.pl-lg-5{padding-left:3rem!important}.px-lg-5{padding-right:3rem!important;padding-left:3rem!important}.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto{margin-top:auto!important}.mr-lg-auto{margin-right:auto!important}.mb-lg-auto{margin-bottom:auto!important}.ml-lg-auto{margin-left:auto!important}.mx-lg-auto{margin-right:auto!important;margin-left:auto!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0{margin-top:0!important}.mr-xl-0{margin-right:0!important}.mb-xl-0{margin-bottom:0!important}.ml-xl-0{margin-left:0!important}.mx-xl-0{margin-right:0!important;margin-left:0!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1{margin-top:.25rem!important}.mr-xl-1{margin-right:.25rem!important}.mb-xl-1{margin-bottom:.25rem!important}.ml-xl-1{margin-left:.25rem!important}.mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2{margin-top:.5rem!important}.mr-xl-2{margin-right:.5rem!important}.mb-xl-2{margin-bottom:.5rem!important}.ml-xl-2{margin-left:.5rem!important}.mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3{margin-top:1rem!important}.mr-xl-3{margin-right:1rem!important}.mb-xl-3{margin-bottom:1rem!important}.ml-xl-3{margin-left:1rem!important}.mx-xl-3{margin-right:1rem!important;margin-left:1rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4{margin-top:1.5rem!important}.mr-xl-4{margin-right:1.5rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.ml-xl-4{margin-left:1.5rem!important}.mx-xl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5{margin-top:3rem!important}.mr-xl-5{margin-right:3rem!important}.mb-xl-5{margin-bottom:3rem!important}.ml-xl-5{margin-left:3rem!important}.mx-xl-5{margin-right:3rem!important;margin-left:3rem!important}.my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0{padding-top:0!important}.pr-xl-0{padding-right:0!important}.pb-xl-0{padding-bottom:0!important}.pl-xl-0{padding-left:0!important}.px-xl-0{padding-right:0!important;padding-left:0!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1{padding-top:.25rem!important}.pr-xl-1{padding-right:.25rem!important}.pb-xl-1{padding-bottom:.25rem!important}.pl-xl-1{padding-left:.25rem!important}.px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2{padding-top:.5rem!important}.pr-xl-2{padding-right:.5rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pl-xl-2{padding-left:.5rem!important}.px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3{padding-top:1rem!important}.pr-xl-3{padding-right:1rem!important}.pb-xl-3{padding-bottom:1rem!important}.pl-xl-3{padding-left:1rem!important}.px-xl-3{padding-right:1rem!important;padding-left:1rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4{padding-top:1.5rem!important}.pr-xl-4{padding-right:1.5rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pl-xl-4{padding-left:1.5rem!important}.px-xl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5{padding-top:3rem!important}.pr-xl-5{padding-right:3rem!important}.pb-xl-5{padding-bottom:3rem!important}.pl-xl-5{padding-left:3rem!important}.px-xl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto{margin-top:auto!important}.mr-xl-auto{margin-right:auto!important}.mb-xl-auto{margin-bottom:auto!important}.ml-xl-auto{margin-left:auto!important}.mx-xl-auto{margin-right:auto!important;margin-left:auto!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}}.text-justify{text-align:justify!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-normal{font-weight:400}.font-weight-bold{font-weight:700}.font-italic{font-style:italic}.text-white{color:#fff!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0062cc!important}.text-secondary{color:#868e96!important}a.text-secondary:focus,a.text-secondary:hover{color:#6c757d!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#1e7e34!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#117a8b!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#d39e00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#bd2130!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#dae0e5!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#1d2124!important}.text-muted{color:#868e96!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.visible{visibility:visible!important}.invisible{visibility:hidden!important} +/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/Monitor/wwwroot/assets/css/custom.css b/Monitor/wwwroot/assets/css/custom.css new file mode 100644 index 0000000..0865297 --- /dev/null +++ b/Monitor/wwwroot/assets/css/custom.css @@ -0,0 +1,192 @@ +a { + color: #33b5e5; +} + + a:hover, a:focus, a:active { + color: #50cefc; + } + +.logo > .logo-version { + font-size: 12px; + font-weight: normal; + color: #33b5e5 !important; + margin-left: 10px; +} + +.ptstatus-icon { + font-size: 22px; +} + +.text-highlight { + color: #e67e22; +} + +.pair-tooltip { + min-width: 400px; + background: none; +} + +.tooltip-200 { + min-width: 250px; +} + +.text-dark { + color: #303841 !important; +} + +.text-ptmagic { + color: #33b5e5 !important; +} + +.hidden { + display: none; +} + +.btn-ptmagic { + border: 1px solid #33b5e5 !important; + background: #33b5e5; + color: #ffffff; +} + + .btn-ptmagic:hover { + border: 1px solid #33b5e5 !important; + background: #33b5e5 !important; + color: #ffffff !important; + } + +.btn-custom.btn-ptmagic { + color: #33b5e5; +} + +.btn-ptmagic.btn-mini { + padding: .15rem .5rem; + font-size: .475rem; + line-height: 1.2; + border-radius: .1rem; +} + +.btn-xs { + line-height: 1.4; + padding: 0.14286rem 0.5rem; + font-size: 0.78571rem; +} + +@media only screen and (max-width: 991px) { + .ticker-widgets { + display:none; + } +} + +.ticker-widgets div { + display: inline-block; + margin-top: 12px; + margin-left: 10px; +} + +.ticker-widget { + margin-top: 12px; + margin-right: 12px; +} + +.card-box-mini { + padding: 7px; + margin-bottom: 0px; +} + +.card-box-dark { + background: #333333; +} + +.card-box-success-outlined { + background: none; + border: 1px solid #81c868; + border-radius: 5px; + color: #81c868; +} + +.card-box-warning-outlined { + background: none; + border: 1px solid #ffbd4a; + border-radius: 5px; + color: #ffbd4a; +} + +.card-box-ptmagic-outlined { + background: none; + border: 1px solid #33b5e5; + border-radius: 5px; + color: #33b5e5; +} + +.card-box-ptmagic-status-outlined { + background: none; + border: 1px solid #33b5e5; + border-radius: 5px; + color: #33b5e5; + padding: 7px; +} + +.ptmagic-version { + text-align: center; + position: absolute; + bottom: 10px; + width: 100%; +} + +.tablesaw-sortable .tablesaw-sortable-head button { + min-width: unset; +} + +.tablesaw-sortable-switch { + display: none; +} + +.table-scroll-hori { + display: block; + width: 100%; + overflow-x: auto; + -ms-overflow-style: -ms-autohiding-scrollbar; +} + +.trend-chart .nvd3.nv-line .nvd3.nv-scatter .nv-groups .nv-point, +.trades-chart .nvd3.nv-line .nvd3.nv-scatter .nv-groups .nv-point, +.profit-chart .nvd3.nv-line .nvd3.nv-scatter .nv-groups .nv-point { + fill-opacity: 1 !important; + stroke-opacity: 1 !important; +} + + +/* Custom menu styles */ +#topnav .navigation-menu { + text-align: left; +} + + #topnav .navigation-menu > li > a i { + display: inline-block; + padding-right: 5px; + color: #33b5e5; + } + + #topnav .navigation-menu > li > a { + padding-top: 12px; + padding-bottom: 10px; + padding-left: 10px; + padding-right: 10px; + } + + #topnav .navigation-menu > li > a:hover, #topnav .navigation-menu > li > a:focus, #topnav .navigation-menu > li > a:active { + color: #50cefc; + } + + #topnav .navigation-menu > li > a:hover i, #topnav .navigation-menu > li > a:focus i, #topnav .navigation-menu > li > a:active i { + color: #c6cace; + } + + #topnav .navigation-menu > li .submenu li a i { + color: #33b5e5; + width: 20px; + } + +#topnav .has-submenu.active > a { + color: #50cefc; +} diff --git a/Monitor/wwwroot/assets/css/icons.css b/Monitor/wwwroot/assets/css/icons.css new file mode 100644 index 0000000..71ec276 --- /dev/null +++ b/Monitor/wwwroot/assets/css/icons.css @@ -0,0 +1,12598 @@ +@charset "UTF-8"; +/* +Template Name: UBold Dashboard +Author: CoderThemes +Email: coderthemes@gmail.com +File: Icons +*/ +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */ +/* FONT PATH + * -------------------------- */ +@font-face { + font-family: 'FontAwesome'; + src: url("../fonts/fontawesome-webfont.eot?v=4.7.0"); + src: url("../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0") format("embedded-opentype"), url("../fonts/fontawesome-webfont.woff2?v=4.7.0") format("woff2"), url("../fonts/fontawesome-webfont.woff?v=4.7.0") format("woff"), url("../fonts/fontawesome-webfont.ttf?v=4.7.0") format("truetype"), url("../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular") format("svg"); + font-weight: normal; + font-style: normal; } +.fa { + display: inline-block; + font: normal normal normal 14px/1 FontAwesome; + font-size: inherit; + text-rendering: auto; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; } + +/* makes the font 33% larger relative to the icon container */ +.fa-lg { + font-size: 1.33333em; + line-height: 0.75em; + vertical-align: -15%; } + +.fa-2x { + font-size: 2em; } + +.fa-3x { + font-size: 3em; } + +.fa-4x { + font-size: 4em; } + +.fa-5x { + font-size: 5em; } + +.fa-fw { + width: 1.28571em; + text-align: center; } + +.fa-ul { + padding-left: 0; + margin-left: 2.14286em; + list-style-type: none; } + .fa-ul > li { + position: relative; } + +.fa-li { + position: absolute; + left: -2.14286em; + width: 2.14286em; + top: 0.14286em; + text-align: center; } + .fa-li.fa-lg { + left: -1.85714em; } + +.fa-border { + padding: .2em .25em .15em; + border: solid 0.08em #eee; + border-radius: .1em; } + +.fa-pull-left { + float: left; } + +.fa-pull-right { + float: right; } + +.fa.fa-pull-left { + margin-right: .3em; } +.fa.fa-pull-right { + margin-left: .3em; } + +/* Deprecated as of 4.4.0 */ +.pull-right { + float: right; } + +.pull-left { + float: left; } + +.fa.pull-left { + margin-right: .3em; } +.fa.pull-right { + margin-left: .3em; } + +.fa-spin { + -webkit-animation: fa-spin 2s infinite linear; + animation: fa-spin 2s infinite linear; } + +.fa-pulse { + -webkit-animation: fa-spin 1s infinite steps(8); + animation: fa-spin 1s infinite steps(8); } + +@-webkit-keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); } } +@keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); } } +.fa-rotate-90 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)"; + -webkit-transform: rotate(90deg); + -ms-transform: rotate(90deg); + transform: rotate(90deg); } + +.fa-rotate-180 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)"; + -webkit-transform: rotate(180deg); + -ms-transform: rotate(180deg); + transform: rotate(180deg); } + +.fa-rotate-270 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)"; + -webkit-transform: rotate(270deg); + -ms-transform: rotate(270deg); + transform: rotate(270deg); } + +.fa-flip-horizontal { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)"; + -webkit-transform: scale(-1, 1); + -ms-transform: scale(-1, 1); + transform: scale(-1, 1); } + +.fa-flip-vertical { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; + -webkit-transform: scale(1, -1); + -ms-transform: scale(1, -1); + transform: scale(1, -1); } + +:root .fa-rotate-90, +:root .fa-rotate-180, +:root .fa-rotate-270, +:root .fa-flip-horizontal, +:root .fa-flip-vertical { + filter: none; } + +.fa-stack { + position: relative; + display: inline-block; + width: 2em; + height: 2em; + line-height: 2em; + vertical-align: middle; } + +.fa-stack-1x, .fa-stack-2x { + position: absolute; + left: 0; + width: 100%; + text-align: center; } + +.fa-stack-1x { + line-height: inherit; } + +.fa-stack-2x { + font-size: 2em; } + +.fa-inverse { + color: #fff; } + +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen + readers do not read off random characters that represent icons */ +.fa-glass:before { + content: ""; } + +.fa-music:before { + content: ""; } + +.fa-search:before { + content: ""; } + +.fa-envelope-o:before { + content: ""; } + +.fa-heart:before { + content: ""; } + +.fa-star:before { + content: ""; } + +.fa-star-o:before { + content: ""; } + +.fa-user:before { + content: ""; } + +.fa-film:before { + content: ""; } + +.fa-th-large:before { + content: ""; } + +.fa-th:before { + content: ""; } + +.fa-th-list:before { + content: ""; } + +.fa-check:before { + content: ""; } + +.fa-remove:before, +.fa-close:before, +.fa-times:before { + content: ""; } + +.fa-search-plus:before { + content: ""; } + +.fa-search-minus:before { + content: ""; } + +.fa-power-off:before { + content: ""; } + +.fa-signal:before { + content: ""; } + +.fa-gear:before, +.fa-cog:before { + content: ""; } + +.fa-trash-o:before { + content: ""; } + +.fa-home:before { + content: ""; } + +.fa-file-o:before { + content: ""; } + +.fa-clock-o:before { + content: ""; } + +.fa-road:before { + content: ""; } + +.fa-download:before { + content: ""; } + +.fa-arrow-circle-o-down:before { + content: ""; } + +.fa-arrow-circle-o-up:before { + content: ""; } + +.fa-inbox:before { + content: ""; } + +.fa-play-circle-o:before { + content: ""; } + +.fa-rotate-right:before, +.fa-repeat:before { + content: ""; } + +.fa-refresh:before { + content: ""; } + +.fa-list-alt:before { + content: ""; } + +.fa-lock:before { + content: ""; } + +.fa-flag:before { + content: ""; } + +.fa-headphones:before { + content: ""; } + +.fa-volume-off:before { + content: ""; } + +.fa-volume-down:before { + content: ""; } + +.fa-volume-up:before { + content: ""; } + +.fa-qrcode:before { + content: ""; } + +.fa-barcode:before { + content: ""; } + +.fa-tag:before { + content: ""; } + +.fa-tags:before { + content: ""; } + +.fa-book:before { + content: ""; } + +.fa-bookmark:before { + content: ""; } + +.fa-print:before { + content: ""; } + +.fa-camera:before { + content: ""; } + +.fa-font:before { + content: ""; } + +.fa-bold:before { + content: ""; } + +.fa-italic:before { + content: ""; } + +.fa-text-height:before { + content: ""; } + +.fa-text-width:before { + content: ""; } + +.fa-align-left:before { + content: ""; } + +.fa-align-center:before { + content: ""; } + +.fa-align-right:before { + content: ""; } + +.fa-align-justify:before { + content: ""; } + +.fa-list:before { + content: ""; } + +.fa-dedent:before, +.fa-outdent:before { + content: ""; } + +.fa-indent:before { + content: ""; } + +.fa-video-camera:before { + content: ""; } + +.fa-photo:before, +.fa-image:before, +.fa-picture-o:before { + content: ""; } + +.fa-pencil:before { + content: ""; } + +.fa-map-marker:before { + content: ""; } + +.fa-adjust:before { + content: ""; } + +.fa-tint:before { + content: ""; } + +.fa-edit:before, +.fa-pencil-square-o:before { + content: ""; } + +.fa-share-square-o:before { + content: ""; } + +.fa-check-square-o:before { + content: ""; } + +.fa-arrows:before { + content: ""; } + +.fa-step-backward:before { + content: ""; } + +.fa-fast-backward:before { + content: ""; } + +.fa-backward:before { + content: ""; } + +.fa-play:before { + content: ""; } + +.fa-pause:before { + content: ""; } + +.fa-stop:before { + content: ""; } + +.fa-forward:before { + content: ""; } + +.fa-fast-forward:before { + content: ""; } + +.fa-step-forward:before { + content: ""; } + +.fa-eject:before { + content: ""; } + +.fa-chevron-left:before { + content: ""; } + +.fa-chevron-right:before { + content: ""; } + +.fa-plus-circle:before { + content: ""; } + +.fa-minus-circle:before { + content: ""; } + +.fa-times-circle:before { + content: ""; } + +.fa-check-circle:before { + content: ""; } + +.fa-question-circle:before { + content: ""; } + +.fa-info-circle:before { + content: ""; } + +.fa-crosshairs:before { + content: ""; } + +.fa-times-circle-o:before { + content: ""; } + +.fa-check-circle-o:before { + content: ""; } + +.fa-ban:before { + content: ""; } + +.fa-arrow-left:before { + content: ""; } + +.fa-arrow-right:before { + content: ""; } + +.fa-arrow-up:before { + content: ""; } + +.fa-arrow-down:before { + content: ""; } + +.fa-mail-forward:before, +.fa-share:before { + content: ""; } + +.fa-expand:before { + content: ""; } + +.fa-compress:before { + content: ""; } + +.fa-plus:before { + content: ""; } + +.fa-minus:before { + content: ""; } + +.fa-asterisk:before { + content: ""; } + +.fa-exclamation-circle:before { + content: ""; } + +.fa-gift:before { + content: ""; } + +.fa-leaf:before { + content: ""; } + +.fa-fire:before { + content: ""; } + +.fa-eye:before { + content: ""; } + +.fa-eye-slash:before { + content: ""; } + +.fa-warning:before, +.fa-exclamation-triangle:before { + content: ""; } + +.fa-plane:before { + content: ""; } + +.fa-calendar:before { + content: ""; } + +.fa-random:before { + content: ""; } + +.fa-comment:before { + content: ""; } + +.fa-magnet:before { + content: ""; } + +.fa-chevron-up:before { + content: ""; } + +.fa-chevron-down:before { + content: ""; } + +.fa-retweet:before { + content: ""; } + +.fa-shopping-cart:before { + content: ""; } + +.fa-folder:before { + content: ""; } + +.fa-folder-open:before { + content: ""; } + +.fa-arrows-v:before { + content: ""; } + +.fa-arrows-h:before { + content: ""; } + +.fa-bar-chart-o:before, +.fa-bar-chart:before { + content: ""; } + +.fa-twitter-square:before { + content: ""; } + +.fa-facebook-square:before { + content: ""; } + +.fa-camera-retro:before { + content: ""; } + +.fa-key:before { + content: ""; } + +.fa-gears:before, +.fa-cogs:before { + content: ""; } + +.fa-comments:before { + content: ""; } + +.fa-thumbs-o-up:before { + content: ""; } + +.fa-thumbs-o-down:before { + content: ""; } + +.fa-star-half:before { + content: ""; } + +.fa-heart-o:before { + content: ""; } + +.fa-sign-out:before { + content: ""; } + +.fa-linkedin-square:before { + content: ""; } + +.fa-thumb-tack:before { + content: ""; } + +.fa-external-link:before { + content: ""; } + +.fa-sign-in:before { + content: ""; } + +.fa-trophy:before { + content: ""; } + +.fa-github-square:before { + content: ""; } + +.fa-upload:before { + content: ""; } + +.fa-lemon-o:before { + content: ""; } + +.fa-phone:before { + content: ""; } + +.fa-square-o:before { + content: ""; } + +.fa-bookmark-o:before { + content: ""; } + +.fa-phone-square:before { + content: ""; } + +.fa-twitter:before { + content: ""; } + +.fa-facebook-f:before, +.fa-facebook:before { + content: ""; } + +.fa-github:before { + content: ""; } + +.fa-unlock:before { + content: ""; } + +.fa-credit-card:before { + content: ""; } + +.fa-feed:before, +.fa-rss:before { + content: ""; } + +.fa-hdd-o:before { + content: ""; } + +.fa-bullhorn:before { + content: ""; } + +.fa-bell:before { + content: ""; } + +.fa-certificate:before { + content: ""; } + +.fa-hand-o-right:before { + content: ""; } + +.fa-hand-o-left:before { + content: ""; } + +.fa-hand-o-up:before { + content: ""; } + +.fa-hand-o-down:before { + content: ""; } + +.fa-arrow-circle-left:before { + content: ""; } + +.fa-arrow-circle-right:before { + content: ""; } + +.fa-arrow-circle-up:before { + content: ""; } + +.fa-arrow-circle-down:before { + content: ""; } + +.fa-globe:before { + content: ""; } + +.fa-wrench:before { + content: ""; } + +.fa-tasks:before { + content: ""; } + +.fa-filter:before { + content: ""; } + +.fa-briefcase:before { + content: ""; } + +.fa-arrows-alt:before { + content: ""; } + +.fa-group:before, +.fa-users:before { + content: ""; } + +.fa-chain:before, +.fa-link:before { + content: ""; } + +.fa-cloud:before { + content: ""; } + +.fa-flask:before { + content: ""; } + +.fa-cut:before, +.fa-scissors:before { + content: ""; } + +.fa-copy:before, +.fa-files-o:before { + content: ""; } + +.fa-paperclip:before { + content: ""; } + +.fa-save:before, +.fa-floppy-o:before { + content: ""; } + +.fa-square:before { + content: ""; } + +.fa-navicon:before, +.fa-reorder:before, +.fa-bars:before { + content: ""; } + +.fa-list-ul:before { + content: ""; } + +.fa-list-ol:before { + content: ""; } + +.fa-strikethrough:before { + content: ""; } + +.fa-underline:before { + content: ""; } + +.fa-table:before { + content: ""; } + +.fa-magic:before { + content: ""; } + +.fa-truck:before { + content: ""; } + +.fa-pinterest:before { + content: ""; } + +.fa-pinterest-square:before { + content: ""; } + +.fa-google-plus-square:before { + content: ""; } + +.fa-google-plus:before { + content: ""; } + +.fa-money:before { + content: ""; } + +.fa-caret-down:before { + content: ""; } + +.fa-caret-up:before { + content: ""; } + +.fa-caret-left:before { + content: ""; } + +.fa-caret-right:before { + content: ""; } + +.fa-columns:before { + content: ""; } + +.fa-unsorted:before, +.fa-sort:before { + content: ""; } + +.fa-sort-down:before, +.fa-sort-desc:before { + content: ""; } + +.fa-sort-up:before, +.fa-sort-asc:before { + content: ""; } + +.fa-envelope:before { + content: ""; } + +.fa-linkedin:before { + content: ""; } + +.fa-rotate-left:before, +.fa-undo:before { + content: ""; } + +.fa-legal:before, +.fa-gavel:before { + content: ""; } + +.fa-dashboard:before, +.fa-tachometer:before { + content: ""; } + +.fa-comment-o:before { + content: ""; } + +.fa-comments-o:before { + content: ""; } + +.fa-flash:before, +.fa-bolt:before { + content: ""; } + +.fa-sitemap:before { + content: ""; } + +.fa-umbrella:before { + content: ""; } + +.fa-paste:before, +.fa-clipboard:before { + content: ""; } + +.fa-lightbulb-o:before { + content: ""; } + +.fa-exchange:before { + content: ""; } + +.fa-cloud-download:before { + content: ""; } + +.fa-cloud-upload:before { + content: ""; } + +.fa-user-md:before { + content: ""; } + +.fa-stethoscope:before { + content: ""; } + +.fa-suitcase:before { + content: ""; } + +.fa-bell-o:before { + content: ""; } + +.fa-coffee:before { + content: ""; } + +.fa-cutlery:before { + content: ""; } + +.fa-file-text-o:before { + content: ""; } + +.fa-building-o:before { + content: ""; } + +.fa-hospital-o:before { + content: ""; } + +.fa-ambulance:before { + content: ""; } + +.fa-medkit:before { + content: ""; } + +.fa-fighter-jet:before { + content: ""; } + +.fa-beer:before { + content: ""; } + +.fa-h-square:before { + content: ""; } + +.fa-plus-square:before { + content: ""; } + +.fa-angle-double-left:before { + content: ""; } + +.fa-angle-double-right:before { + content: ""; } + +.fa-angle-double-up:before { + content: ""; } + +.fa-angle-double-down:before { + content: ""; } + +.fa-angle-left:before { + content: ""; } + +.fa-angle-right:before { + content: ""; } + +.fa-angle-up:before { + content: ""; } + +.fa-angle-down:before { + content: ""; } + +.fa-desktop:before { + content: ""; } + +.fa-laptop:before { + content: ""; } + +.fa-tablet:before { + content: ""; } + +.fa-mobile-phone:before, +.fa-mobile:before { + content: ""; } + +.fa-circle-o:before { + content: ""; } + +.fa-quote-left:before { + content: ""; } + +.fa-quote-right:before { + content: ""; } + +.fa-spinner:before { + content: ""; } + +.fa-circle:before { + content: ""; } + +.fa-mail-reply:before, +.fa-reply:before { + content: ""; } + +.fa-github-alt:before { + content: ""; } + +.fa-folder-o:before { + content: ""; } + +.fa-folder-open-o:before { + content: ""; } + +.fa-smile-o:before { + content: ""; } + +.fa-frown-o:before { + content: ""; } + +.fa-meh-o:before { + content: ""; } + +.fa-gamepad:before { + content: ""; } + +.fa-keyboard-o:before { + content: ""; } + +.fa-flag-o:before { + content: ""; } + +.fa-flag-checkered:before { + content: ""; } + +.fa-terminal:before { + content: ""; } + +.fa-code:before { + content: ""; } + +.fa-mail-reply-all:before, +.fa-reply-all:before { + content: ""; } + +.fa-star-half-empty:before, +.fa-star-half-full:before, +.fa-star-half-o:before { + content: ""; } + +.fa-location-arrow:before { + content: ""; } + +.fa-crop:before { + content: ""; } + +.fa-code-fork:before { + content: ""; } + +.fa-unlink:before, +.fa-chain-broken:before { + content: ""; } + +.fa-question:before { + content: ""; } + +.fa-info:before { + content: ""; } + +.fa-exclamation:before { + content: ""; } + +.fa-superscript:before { + content: ""; } + +.fa-subscript:before { + content: ""; } + +.fa-eraser:before { + content: ""; } + +.fa-puzzle-piece:before { + content: ""; } + +.fa-microphone:before { + content: ""; } + +.fa-microphone-slash:before { + content: ""; } + +.fa-shield:before { + content: ""; } + +.fa-calendar-o:before { + content: ""; } + +.fa-fire-extinguisher:before { + content: ""; } + +.fa-rocket:before { + content: ""; } + +.fa-maxcdn:before { + content: ""; } + +.fa-chevron-circle-left:before { + content: ""; } + +.fa-chevron-circle-right:before { + content: ""; } + +.fa-chevron-circle-up:before { + content: ""; } + +.fa-chevron-circle-down:before { + content: ""; } + +.fa-html5:before { + content: ""; } + +.fa-css3:before { + content: ""; } + +.fa-anchor:before { + content: ""; } + +.fa-unlock-alt:before { + content: ""; } + +.fa-bullseye:before { + content: ""; } + +.fa-ellipsis-h:before { + content: ""; } + +.fa-ellipsis-v:before { + content: ""; } + +.fa-rss-square:before { + content: ""; } + +.fa-play-circle:before { + content: ""; } + +.fa-ticket:before { + content: ""; } + +.fa-minus-square:before { + content: ""; } + +.fa-minus-square-o:before { + content: ""; } + +.fa-level-up:before { + content: ""; } + +.fa-level-down:before { + content: ""; } + +.fa-check-square:before { + content: ""; } + +.fa-pencil-square:before { + content: ""; } + +.fa-external-link-square:before { + content: ""; } + +.fa-share-square:before { + content: ""; } + +.fa-compass:before { + content: ""; } + +.fa-toggle-down:before, +.fa-caret-square-o-down:before { + content: ""; } + +.fa-toggle-up:before, +.fa-caret-square-o-up:before { + content: ""; } + +.fa-toggle-right:before, +.fa-caret-square-o-right:before { + content: ""; } + +.fa-euro:before, +.fa-eur:before { + content: ""; } + +.fa-gbp:before { + content: ""; } + +.fa-dollar:before, +.fa-usd:before { + content: ""; } + +.fa-rupee:before, +.fa-inr:before { + content: ""; } + +.fa-cny:before, +.fa-rmb:before, +.fa-yen:before, +.fa-jpy:before { + content: ""; } + +.fa-ruble:before, +.fa-rouble:before, +.fa-rub:before { + content: ""; } + +.fa-won:before, +.fa-krw:before { + content: ""; } + +.fa-bitcoin:before, +.fa-btc:before { + content: ""; } + +.fa-file:before { + content: ""; } + +.fa-file-text:before { + content: ""; } + +.fa-sort-alpha-asc:before { + content: ""; } + +.fa-sort-alpha-desc:before { + content: ""; } + +.fa-sort-amount-asc:before { + content: ""; } + +.fa-sort-amount-desc:before { + content: ""; } + +.fa-sort-numeric-asc:before { + content: ""; } + +.fa-sort-numeric-desc:before { + content: ""; } + +.fa-thumbs-up:before { + content: ""; } + +.fa-thumbs-down:before { + content: ""; } + +.fa-youtube-square:before { + content: ""; } + +.fa-youtube:before { + content: ""; } + +.fa-xing:before { + content: ""; } + +.fa-xing-square:before { + content: ""; } + +.fa-youtube-play:before { + content: ""; } + +.fa-dropbox:before { + content: ""; } + +.fa-stack-overflow:before { + content: ""; } + +.fa-instagram:before { + content: ""; } + +.fa-flickr:before { + content: ""; } + +.fa-adn:before { + content: ""; } + +.fa-bitbucket:before { + content: ""; } + +.fa-bitbucket-square:before { + content: ""; } + +.fa-tumblr:before { + content: ""; } + +.fa-tumblr-square:before { + content: ""; } + +.fa-long-arrow-down:before { + content: ""; } + +.fa-long-arrow-up:before { + content: ""; } + +.fa-long-arrow-left:before { + content: ""; } + +.fa-long-arrow-right:before { + content: ""; } + +.fa-apple:before { + content: ""; } + +.fa-windows:before { + content: ""; } + +.fa-android:before { + content: ""; } + +.fa-linux:before { + content: ""; } + +.fa-dribbble:before { + content: ""; } + +.fa-skype:before { + content: ""; } + +.fa-foursquare:before { + content: ""; } + +.fa-trello:before { + content: ""; } + +.fa-female:before { + content: ""; } + +.fa-male:before { + content: ""; } + +.fa-gittip:before, +.fa-gratipay:before { + content: ""; } + +.fa-sun-o:before { + content: ""; } + +.fa-moon-o:before { + content: ""; } + +.fa-archive:before { + content: ""; } + +.fa-bug:before { + content: ""; } + +.fa-vk:before { + content: ""; } + +.fa-weibo:before { + content: ""; } + +.fa-renren:before { + content: ""; } + +.fa-pagelines:before { + content: ""; } + +.fa-stack-exchange:before { + content: ""; } + +.fa-arrow-circle-o-right:before { + content: ""; } + +.fa-arrow-circle-o-left:before { + content: ""; } + +.fa-toggle-left:before, +.fa-caret-square-o-left:before { + content: ""; } + +.fa-dot-circle-o:before { + content: ""; } + +.fa-wheelchair:before { + content: ""; } + +.fa-vimeo-square:before { + content: ""; } + +.fa-turkish-lira:before, +.fa-try:before { + content: ""; } + +.fa-plus-square-o:before { + content: ""; } + +.fa-space-shuttle:before { + content: ""; } + +.fa-slack:before { + content: ""; } + +.fa-envelope-square:before { + content: ""; } + +.fa-wordpress:before { + content: ""; } + +.fa-openid:before { + content: ""; } + +.fa-institution:before, +.fa-bank:before, +.fa-university:before { + content: ""; } + +.fa-mortar-board:before, +.fa-graduation-cap:before { + content: ""; } + +.fa-yahoo:before { + content: ""; } + +.fa-google:before { + content: ""; } + +.fa-reddit:before { + content: ""; } + +.fa-reddit-square:before { + content: ""; } + +.fa-stumbleupon-circle:before { + content: ""; } + +.fa-stumbleupon:before { + content: ""; } + +.fa-delicious:before { + content: ""; } + +.fa-digg:before { + content: ""; } + +.fa-pied-piper-pp:before { + content: ""; } + +.fa-pied-piper-alt:before { + content: ""; } + +.fa-drupal:before { + content: ""; } + +.fa-joomla:before { + content: ""; } + +.fa-language:before { + content: ""; } + +.fa-fax:before { + content: ""; } + +.fa-building:before { + content: ""; } + +.fa-child:before { + content: ""; } + +.fa-paw:before { + content: ""; } + +.fa-spoon:before { + content: ""; } + +.fa-cube:before { + content: ""; } + +.fa-cubes:before { + content: ""; } + +.fa-behance:before { + content: ""; } + +.fa-behance-square:before { + content: ""; } + +.fa-steam:before { + content: ""; } + +.fa-steam-square:before { + content: ""; } + +.fa-recycle:before { + content: ""; } + +.fa-automobile:before, +.fa-car:before { + content: ""; } + +.fa-cab:before, +.fa-taxi:before { + content: ""; } + +.fa-tree:before { + content: ""; } + +.fa-spotify:before { + content: ""; } + +.fa-deviantart:before { + content: ""; } + +.fa-soundcloud:before { + content: ""; } + +.fa-database:before { + content: ""; } + +.fa-file-pdf-o:before { + content: ""; } + +.fa-file-word-o:before { + content: ""; } + +.fa-file-excel-o:before { + content: ""; } + +.fa-file-powerpoint-o:before { + content: ""; } + +.fa-file-photo-o:before, +.fa-file-picture-o:before, +.fa-file-image-o:before { + content: ""; } + +.fa-file-zip-o:before, +.fa-file-archive-o:before { + content: ""; } + +.fa-file-sound-o:before, +.fa-file-audio-o:before { + content: ""; } + +.fa-file-movie-o:before, +.fa-file-video-o:before { + content: ""; } + +.fa-file-code-o:before { + content: ""; } + +.fa-vine:before { + content: ""; } + +.fa-codepen:before { + content: ""; } + +.fa-jsfiddle:before { + content: ""; } + +.fa-life-bouy:before, +.fa-life-buoy:before, +.fa-life-saver:before, +.fa-support:before, +.fa-life-ring:before { + content: ""; } + +.fa-circle-o-notch:before { + content: ""; } + +.fa-ra:before, +.fa-resistance:before, +.fa-rebel:before { + content: ""; } + +.fa-ge:before, +.fa-empire:before { + content: ""; } + +.fa-git-square:before { + content: ""; } + +.fa-git:before { + content: ""; } + +.fa-y-combinator-square:before, +.fa-yc-square:before, +.fa-hacker-news:before { + content: ""; } + +.fa-tencent-weibo:before { + content: ""; } + +.fa-qq:before { + content: ""; } + +.fa-wechat:before, +.fa-weixin:before { + content: ""; } + +.fa-send:before, +.fa-paper-plane:before { + content: ""; } + +.fa-send-o:before, +.fa-paper-plane-o:before { + content: ""; } + +.fa-history:before { + content: ""; } + +.fa-circle-thin:before { + content: ""; } + +.fa-header:before { + content: ""; } + +.fa-paragraph:before { + content: ""; } + +.fa-sliders:before { + content: ""; } + +.fa-share-alt:before { + content: ""; } + +.fa-share-alt-square:before { + content: ""; } + +.fa-bomb:before { + content: ""; } + +.fa-soccer-ball-o:before, +.fa-futbol-o:before { + content: ""; } + +.fa-tty:before { + content: ""; } + +.fa-binoculars:before { + content: ""; } + +.fa-plug:before { + content: ""; } + +.fa-slideshare:before { + content: ""; } + +.fa-twitch:before { + content: ""; } + +.fa-yelp:before { + content: ""; } + +.fa-newspaper-o:before { + content: ""; } + +.fa-wifi:before { + content: ""; } + +.fa-calculator:before { + content: ""; } + +.fa-paypal:before { + content: ""; } + +.fa-google-wallet:before { + content: ""; } + +.fa-cc-visa:before { + content: ""; } + +.fa-cc-mastercard:before { + content: ""; } + +.fa-cc-discover:before { + content: ""; } + +.fa-cc-amex:before { + content: ""; } + +.fa-cc-paypal:before { + content: ""; } + +.fa-cc-stripe:before { + content: ""; } + +.fa-bell-slash:before { + content: ""; } + +.fa-bell-slash-o:before { + content: ""; } + +.fa-trash:before { + content: ""; } + +.fa-copyright:before { + content: ""; } + +.fa-at:before { + content: ""; } + +.fa-eyedropper:before { + content: ""; } + +.fa-paint-brush:before { + content: ""; } + +.fa-birthday-cake:before { + content: ""; } + +.fa-area-chart:before { + content: ""; } + +.fa-pie-chart:before { + content: ""; } + +.fa-line-chart:before { + content: ""; } + +.fa-lastfm:before { + content: ""; } + +.fa-lastfm-square:before { + content: ""; } + +.fa-toggle-off:before { + content: ""; } + +.fa-toggle-on:before { + content: ""; } + +.fa-bicycle:before { + content: ""; } + +.fa-bus:before { + content: ""; } + +.fa-ioxhost:before { + content: ""; } + +.fa-angellist:before { + content: ""; } + +.fa-cc:before { + content: ""; } + +.fa-shekel:before, +.fa-sheqel:before, +.fa-ils:before { + content: ""; } + +.fa-meanpath:before { + content: ""; } + +.fa-buysellads:before { + content: ""; } + +.fa-connectdevelop:before { + content: ""; } + +.fa-dashcube:before { + content: ""; } + +.fa-forumbee:before { + content: ""; } + +.fa-leanpub:before { + content: ""; } + +.fa-sellsy:before { + content: ""; } + +.fa-shirtsinbulk:before { + content: ""; } + +.fa-simplybuilt:before { + content: ""; } + +.fa-skyatlas:before { + content: ""; } + +.fa-cart-plus:before { + content: ""; } + +.fa-cart-arrow-down:before { + content: ""; } + +.fa-diamond:before { + content: ""; } + +.fa-ship:before { + content: ""; } + +.fa-user-secret:before { + content: ""; } + +.fa-motorcycle:before { + content: ""; } + +.fa-street-view:before { + content: ""; } + +.fa-heartbeat:before { + content: ""; } + +.fa-venus:before { + content: ""; } + +.fa-mars:before { + content: ""; } + +.fa-mercury:before { + content: ""; } + +.fa-intersex:before, +.fa-transgender:before { + content: ""; } + +.fa-transgender-alt:before { + content: ""; } + +.fa-venus-double:before { + content: ""; } + +.fa-mars-double:before { + content: ""; } + +.fa-venus-mars:before { + content: ""; } + +.fa-mars-stroke:before { + content: ""; } + +.fa-mars-stroke-v:before { + content: ""; } + +.fa-mars-stroke-h:before { + content: ""; } + +.fa-neuter:before { + content: ""; } + +.fa-genderless:before { + content: ""; } + +.fa-facebook-official:before { + content: ""; } + +.fa-pinterest-p:before { + content: ""; } + +.fa-whatsapp:before { + content: ""; } + +.fa-server:before { + content: ""; } + +.fa-user-plus:before { + content: ""; } + +.fa-user-times:before { + content: ""; } + +.fa-hotel:before, +.fa-bed:before { + content: ""; } + +.fa-viacoin:before { + content: ""; } + +.fa-train:before { + content: ""; } + +.fa-subway:before { + content: ""; } + +.fa-medium:before { + content: ""; } + +.fa-yc:before, +.fa-y-combinator:before { + content: ""; } + +.fa-optin-monster:before { + content: ""; } + +.fa-opencart:before { + content: ""; } + +.fa-expeditedssl:before { + content: ""; } + +.fa-battery-4:before, +.fa-battery:before, +.fa-battery-full:before { + content: ""; } + +.fa-battery-3:before, +.fa-battery-three-quarters:before { + content: ""; } + +.fa-battery-2:before, +.fa-battery-half:before { + content: ""; } + +.fa-battery-1:before, +.fa-battery-quarter:before { + content: ""; } + +.fa-battery-0:before, +.fa-battery-empty:before { + content: ""; } + +.fa-mouse-pointer:before { + content: ""; } + +.fa-i-cursor:before { + content: ""; } + +.fa-object-group:before { + content: ""; } + +.fa-object-ungroup:before { + content: ""; } + +.fa-sticky-note:before { + content: ""; } + +.fa-sticky-note-o:before { + content: ""; } + +.fa-cc-jcb:before { + content: ""; } + +.fa-cc-diners-club:before { + content: ""; } + +.fa-clone:before { + content: ""; } + +.fa-balance-scale:before { + content: ""; } + +.fa-hourglass-o:before { + content: ""; } + +.fa-hourglass-1:before, +.fa-hourglass-start:before { + content: ""; } + +.fa-hourglass-2:before, +.fa-hourglass-half:before { + content: ""; } + +.fa-hourglass-3:before, +.fa-hourglass-end:before { + content: ""; } + +.fa-hourglass:before { + content: ""; } + +.fa-hand-grab-o:before, +.fa-hand-rock-o:before { + content: ""; } + +.fa-hand-stop-o:before, +.fa-hand-paper-o:before { + content: ""; } + +.fa-hand-scissors-o:before { + content: ""; } + +.fa-hand-lizard-o:before { + content: ""; } + +.fa-hand-spock-o:before { + content: ""; } + +.fa-hand-pointer-o:before { + content: ""; } + +.fa-hand-peace-o:before { + content: ""; } + +.fa-trademark:before { + content: ""; } + +.fa-registered:before { + content: ""; } + +.fa-creative-commons:before { + content: ""; } + +.fa-gg:before { + content: ""; } + +.fa-gg-circle:before { + content: ""; } + +.fa-tripadvisor:before { + content: ""; } + +.fa-odnoklassniki:before { + content: ""; } + +.fa-odnoklassniki-square:before { + content: ""; } + +.fa-get-pocket:before { + content: ""; } + +.fa-wikipedia-w:before { + content: ""; } + +.fa-safari:before { + content: ""; } + +.fa-chrome:before { + content: ""; } + +.fa-firefox:before { + content: ""; } + +.fa-opera:before { + content: ""; } + +.fa-internet-explorer:before { + content: ""; } + +.fa-tv:before, +.fa-television:before { + content: ""; } + +.fa-contao:before { + content: ""; } + +.fa-500px:before { + content: ""; } + +.fa-amazon:before { + content: ""; } + +.fa-calendar-plus-o:before { + content: ""; } + +.fa-calendar-minus-o:before { + content: ""; } + +.fa-calendar-times-o:before { + content: ""; } + +.fa-calendar-check-o:before { + content: ""; } + +.fa-industry:before { + content: ""; } + +.fa-map-pin:before { + content: ""; } + +.fa-map-signs:before { + content: ""; } + +.fa-map-o:before { + content: ""; } + +.fa-map:before { + content: ""; } + +.fa-commenting:before { + content: ""; } + +.fa-commenting-o:before { + content: ""; } + +.fa-houzz:before { + content: ""; } + +.fa-vimeo:before { + content: ""; } + +.fa-black-tie:before { + content: ""; } + +.fa-fonticons:before { + content: ""; } + +.fa-reddit-alien:before { + content: ""; } + +.fa-edge:before { + content: ""; } + +.fa-credit-card-alt:before { + content: ""; } + +.fa-codiepie:before { + content: ""; } + +.fa-modx:before { + content: ""; } + +.fa-fort-awesome:before { + content: ""; } + +.fa-usb:before { + content: ""; } + +.fa-product-hunt:before { + content: ""; } + +.fa-mixcloud:before { + content: ""; } + +.fa-scribd:before { + content: ""; } + +.fa-pause-circle:before { + content: ""; } + +.fa-pause-circle-o:before { + content: ""; } + +.fa-stop-circle:before { + content: ""; } + +.fa-stop-circle-o:before { + content: ""; } + +.fa-shopping-bag:before { + content: ""; } + +.fa-shopping-basket:before { + content: ""; } + +.fa-hashtag:before { + content: ""; } + +.fa-bluetooth:before { + content: ""; } + +.fa-bluetooth-b:before { + content: ""; } + +.fa-percent:before { + content: ""; } + +.fa-gitlab:before { + content: ""; } + +.fa-wpbeginner:before { + content: ""; } + +.fa-wpforms:before { + content: ""; } + +.fa-envira:before { + content: ""; } + +.fa-universal-access:before { + content: ""; } + +.fa-wheelchair-alt:before { + content: ""; } + +.fa-question-circle-o:before { + content: ""; } + +.fa-blind:before { + content: ""; } + +.fa-audio-description:before { + content: ""; } + +.fa-volume-control-phone:before { + content: ""; } + +.fa-braille:before { + content: ""; } + +.fa-assistive-listening-systems:before { + content: ""; } + +.fa-asl-interpreting:before, +.fa-american-sign-language-interpreting:before { + content: ""; } + +.fa-deafness:before, +.fa-hard-of-hearing:before, +.fa-deaf:before { + content: ""; } + +.fa-glide:before { + content: ""; } + +.fa-glide-g:before { + content: ""; } + +.fa-signing:before, +.fa-sign-language:before { + content: ""; } + +.fa-low-vision:before { + content: ""; } + +.fa-viadeo:before { + content: ""; } + +.fa-viadeo-square:before { + content: ""; } + +.fa-snapchat:before { + content: ""; } + +.fa-snapchat-ghost:before { + content: ""; } + +.fa-snapchat-square:before { + content: ""; } + +.fa-pied-piper:before { + content: ""; } + +.fa-first-order:before { + content: ""; } + +.fa-yoast:before { + content: ""; } + +.fa-themeisle:before { + content: ""; } + +.fa-google-plus-circle:before, +.fa-google-plus-official:before { + content: ""; } + +.fa-fa:before, +.fa-font-awesome:before { + content: ""; } + +.fa-handshake-o:before { + content: ""; } + +.fa-envelope-open:before { + content: ""; } + +.fa-envelope-open-o:before { + content: ""; } + +.fa-linode:before { + content: ""; } + +.fa-address-book:before { + content: ""; } + +.fa-address-book-o:before { + content: ""; } + +.fa-vcard:before, +.fa-address-card:before { + content: ""; } + +.fa-vcard-o:before, +.fa-address-card-o:before { + content: ""; } + +.fa-user-circle:before { + content: ""; } + +.fa-user-circle-o:before { + content: ""; } + +.fa-user-o:before { + content: ""; } + +.fa-id-badge:before { + content: ""; } + +.fa-drivers-license:before, +.fa-id-card:before { + content: ""; } + +.fa-drivers-license-o:before, +.fa-id-card-o:before { + content: ""; } + +.fa-quora:before { + content: ""; } + +.fa-free-code-camp:before { + content: ""; } + +.fa-telegram:before { + content: ""; } + +.fa-thermometer-4:before, +.fa-thermometer:before, +.fa-thermometer-full:before { + content: ""; } + +.fa-thermometer-3:before, +.fa-thermometer-three-quarters:before { + content: ""; } + +.fa-thermometer-2:before, +.fa-thermometer-half:before { + content: ""; } + +.fa-thermometer-1:before, +.fa-thermometer-quarter:before { + content: ""; } + +.fa-thermometer-0:before, +.fa-thermometer-empty:before { + content: ""; } + +.fa-shower:before { + content: ""; } + +.fa-bathtub:before, +.fa-s15:before, +.fa-bath:before { + content: ""; } + +.fa-podcast:before { + content: ""; } + +.fa-window-maximize:before { + content: ""; } + +.fa-window-minimize:before { + content: ""; } + +.fa-window-restore:before { + content: ""; } + +.fa-times-rectangle:before, +.fa-window-close:before { + content: ""; } + +.fa-times-rectangle-o:before, +.fa-window-close-o:before { + content: ""; } + +.fa-bandcamp:before { + content: ""; } + +.fa-grav:before { + content: ""; } + +.fa-etsy:before { + content: ""; } + +.fa-imdb:before { + content: ""; } + +.fa-ravelry:before { + content: ""; } + +.fa-eercast:before { + content: ""; } + +.fa-microchip:before { + content: ""; } + +.fa-snowflake-o:before { + content: ""; } + +.fa-superpowers:before { + content: ""; } + +.fa-wpexplorer:before { + content: ""; } + +.fa-meetup:before { + content: ""; } + +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; } + +.sr-only-focusable:active, .sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; } + +@font-face { + font-family: 'themify'; + src: url("../fonts/themify.eot?-fvbane"); + src: url("../fonts/themify.eot?#iefix-fvbane") format("embedded-opentype"), url("../fonts/themify.woff?-fvbane") format("woff"), url("../fonts/themify.ttf?-fvbane") format("truetype"), url("../fonts/themify.svg?-fvbane#themify") format("svg"); + font-weight: normal; + font-style: normal; } +[class^="ti-"], [class*=" ti-"] { + font-family: 'themify'; + speak: none; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + /* Better Font Rendering =========== */ + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; } + +.ti-wand:before { + content: "\e600"; } + +.ti-volume:before { + content: "\e601"; } + +.ti-user:before { + content: "\e602"; } + +.ti-unlock:before { + content: "\e603"; } + +.ti-unlink:before { + content: "\e604"; } + +.ti-trash:before { + content: "\e605"; } + +.ti-thought:before { + content: "\e606"; } + +.ti-target:before { + content: "\e607"; } + +.ti-tag:before { + content: "\e608"; } + +.ti-tablet:before { + content: "\e609"; } + +.ti-star:before { + content: "\e60a"; } + +.ti-spray:before { + content: "\e60b"; } + +.ti-signal:before { + content: "\e60c"; } + +.ti-shopping-cart:before { + content: "\e60d"; } + +.ti-shopping-cart-full:before { + content: "\e60e"; } + +.ti-settings:before { + content: "\e60f"; } + +.ti-search:before { + content: "\e610"; } + +.ti-zoom-in:before { + content: "\e611"; } + +.ti-zoom-out:before { + content: "\e612"; } + +.ti-cut:before { + content: "\e613"; } + +.ti-ruler:before { + content: "\e614"; } + +.ti-ruler-pencil:before { + content: "\e615"; } + +.ti-ruler-alt:before { + content: "\e616"; } + +.ti-bookmark:before { + content: "\e617"; } + +.ti-bookmark-alt:before { + content: "\e618"; } + +.ti-reload:before { + content: "\e619"; } + +.ti-plus:before { + content: "\e61a"; } + +.ti-pin:before { + content: "\e61b"; } + +.ti-pencil:before { + content: "\e61c"; } + +.ti-pencil-alt:before { + content: "\e61d"; } + +.ti-paint-roller:before { + content: "\e61e"; } + +.ti-paint-bucket:before { + content: "\e61f"; } + +.ti-na:before { + content: "\e620"; } + +.ti-mobile:before { + content: "\e621"; } + +.ti-minus:before { + content: "\e622"; } + +.ti-medall:before { + content: "\e623"; } + +.ti-medall-alt:before { + content: "\e624"; } + +.ti-marker:before { + content: "\e625"; } + +.ti-marker-alt:before { + content: "\e626"; } + +.ti-arrow-up:before { + content: "\e627"; } + +.ti-arrow-right:before { + content: "\e628"; } + +.ti-arrow-left:before { + content: "\e629"; } + +.ti-arrow-down:before { + content: "\e62a"; } + +.ti-lock:before { + content: "\e62b"; } + +.ti-location-arrow:before { + content: "\e62c"; } + +.ti-link:before { + content: "\e62d"; } + +.ti-layout:before { + content: "\e62e"; } + +.ti-layers:before { + content: "\e62f"; } + +.ti-layers-alt:before { + content: "\e630"; } + +.ti-key:before { + content: "\e631"; } + +.ti-import:before { + content: "\e632"; } + +.ti-image:before { + content: "\e633"; } + +.ti-heart:before { + content: "\e634"; } + +.ti-heart-broken:before { + content: "\e635"; } + +.ti-hand-stop:before { + content: "\e636"; } + +.ti-hand-open:before { + content: "\e637"; } + +.ti-hand-drag:before { + content: "\e638"; } + +.ti-folder:before { + content: "\e639"; } + +.ti-flag:before { + content: "\e63a"; } + +.ti-flag-alt:before { + content: "\e63b"; } + +.ti-flag-alt-2:before { + content: "\e63c"; } + +.ti-eye:before { + content: "\e63d"; } + +.ti-export:before { + content: "\e63e"; } + +.ti-exchange-vertical:before { + content: "\e63f"; } + +.ti-desktop:before { + content: "\e640"; } + +.ti-cup:before { + content: "\e641"; } + +.ti-crown:before { + content: "\e642"; } + +.ti-comments:before { + content: "\e643"; } + +.ti-comment:before { + content: "\e644"; } + +.ti-comment-alt:before { + content: "\e645"; } + +.ti-close:before { + content: "\e646"; } + +.ti-clip:before { + content: "\e647"; } + +.ti-angle-up:before { + content: "\e648"; } + +.ti-angle-right:before { + content: "\e649"; } + +.ti-angle-left:before { + content: "\e64a"; } + +.ti-angle-down:before { + content: "\e64b"; } + +.ti-check:before { + content: "\e64c"; } + +.ti-check-box:before { + content: "\e64d"; } + +.ti-camera:before { + content: "\e64e"; } + +.ti-announcement:before { + content: "\e64f"; } + +.ti-brush:before { + content: "\e650"; } + +.ti-briefcase:before { + content: "\e651"; } + +.ti-bolt:before { + content: "\e652"; } + +.ti-bolt-alt:before { + content: "\e653"; } + +.ti-blackboard:before { + content: "\e654"; } + +.ti-bag:before { + content: "\e655"; } + +.ti-move:before { + content: "\e656"; } + +.ti-arrows-vertical:before { + content: "\e657"; } + +.ti-arrows-horizontal:before { + content: "\e658"; } + +.ti-fullscreen:before { + content: "\e659"; } + +.ti-arrow-top-right:before { + content: "\e65a"; } + +.ti-arrow-top-left:before { + content: "\e65b"; } + +.ti-arrow-circle-up:before { + content: "\e65c"; } + +.ti-arrow-circle-right:before { + content: "\e65d"; } + +.ti-arrow-circle-left:before { + content: "\e65e"; } + +.ti-arrow-circle-down:before { + content: "\e65f"; } + +.ti-angle-double-up:before { + content: "\e660"; } + +.ti-angle-double-right:before { + content: "\e661"; } + +.ti-angle-double-left:before { + content: "\e662"; } + +.ti-angle-double-down:before { + content: "\e663"; } + +.ti-zip:before { + content: "\e664"; } + +.ti-world:before { + content: "\e665"; } + +.ti-wheelchair:before { + content: "\e666"; } + +.ti-view-list:before { + content: "\e667"; } + +.ti-view-list-alt:before { + content: "\e668"; } + +.ti-view-grid:before { + content: "\e669"; } + +.ti-uppercase:before { + content: "\e66a"; } + +.ti-upload:before { + content: "\e66b"; } + +.ti-underline:before { + content: "\e66c"; } + +.ti-truck:before { + content: "\e66d"; } + +.ti-timer:before { + content: "\e66e"; } + +.ti-ticket:before { + content: "\e66f"; } + +.ti-thumb-up:before { + content: "\e670"; } + +.ti-thumb-down:before { + content: "\e671"; } + +.ti-text:before { + content: "\e672"; } + +.ti-stats-up:before { + content: "\e673"; } + +.ti-stats-down:before { + content: "\e674"; } + +.ti-split-v:before { + content: "\e675"; } + +.ti-split-h:before { + content: "\e676"; } + +.ti-smallcap:before { + content: "\e677"; } + +.ti-shine:before { + content: "\e678"; } + +.ti-shift-right:before { + content: "\e679"; } + +.ti-shift-left:before { + content: "\e67a"; } + +.ti-shield:before { + content: "\e67b"; } + +.ti-notepad:before { + content: "\e67c"; } + +.ti-server:before { + content: "\e67d"; } + +.ti-quote-right:before { + content: "\e67e"; } + +.ti-quote-left:before { + content: "\e67f"; } + +.ti-pulse:before { + content: "\e680"; } + +.ti-printer:before { + content: "\e681"; } + +.ti-power-off:before { + content: "\e682"; } + +.ti-plug:before { + content: "\e683"; } + +.ti-pie-chart:before { + content: "\e684"; } + +.ti-paragraph:before { + content: "\e685"; } + +.ti-panel:before { + content: "\e686"; } + +.ti-package:before { + content: "\e687"; } + +.ti-music:before { + content: "\e688"; } + +.ti-music-alt:before { + content: "\e689"; } + +.ti-mouse:before { + content: "\e68a"; } + +.ti-mouse-alt:before { + content: "\e68b"; } + +.ti-money:before { + content: "\e68c"; } + +.ti-microphone:before { + content: "\e68d"; } + +.ti-menu:before { + content: "\e68e"; } + +.ti-menu-alt:before { + content: "\e68f"; } + +.ti-map:before { + content: "\e690"; } + +.ti-map-alt:before { + content: "\e691"; } + +.ti-loop:before { + content: "\e692"; } + +.ti-location-pin:before { + content: "\e693"; } + +.ti-list:before { + content: "\e694"; } + +.ti-light-bulb:before { + content: "\e695"; } + +.ti-Italic:before { + content: "\e696"; } + +.ti-info:before { + content: "\e697"; } + +.ti-infinite:before { + content: "\e698"; } + +.ti-id-badge:before { + content: "\e699"; } + +.ti-hummer:before { + content: "\e69a"; } + +.ti-home:before { + content: "\e69b"; } + +.ti-help:before { + content: "\e69c"; } + +.ti-headphone:before { + content: "\e69d"; } + +.ti-harddrives:before { + content: "\e69e"; } + +.ti-harddrive:before { + content: "\e69f"; } + +.ti-gift:before { + content: "\e6a0"; } + +.ti-game:before { + content: "\e6a1"; } + +.ti-filter:before { + content: "\e6a2"; } + +.ti-files:before { + content: "\e6a3"; } + +.ti-file:before { + content: "\e6a4"; } + +.ti-eraser:before { + content: "\e6a5"; } + +.ti-envelope:before { + content: "\e6a6"; } + +.ti-download:before { + content: "\e6a7"; } + +.ti-direction:before { + content: "\e6a8"; } + +.ti-direction-alt:before { + content: "\e6a9"; } + +.ti-dashboard:before { + content: "\e6aa"; } + +.ti-control-stop:before { + content: "\e6ab"; } + +.ti-control-shuffle:before { + content: "\e6ac"; } + +.ti-control-play:before { + content: "\e6ad"; } + +.ti-control-pause:before { + content: "\e6ae"; } + +.ti-control-forward:before { + content: "\e6af"; } + +.ti-control-backward:before { + content: "\e6b0"; } + +.ti-cloud:before { + content: "\e6b1"; } + +.ti-cloud-up:before { + content: "\e6b2"; } + +.ti-cloud-down:before { + content: "\e6b3"; } + +.ti-clipboard:before { + content: "\e6b4"; } + +.ti-car:before { + content: "\e6b5"; } + +.ti-calendar:before { + content: "\e6b6"; } + +.ti-book:before { + content: "\e6b7"; } + +.ti-bell:before { + content: "\e6b8"; } + +.ti-basketball:before { + content: "\e6b9"; } + +.ti-bar-chart:before { + content: "\e6ba"; } + +.ti-bar-chart-alt:before { + content: "\e6bb"; } + +.ti-back-right:before { + content: "\e6bc"; } + +.ti-back-left:before { + content: "\e6bd"; } + +.ti-arrows-corner:before { + content: "\e6be"; } + +.ti-archive:before { + content: "\e6bf"; } + +.ti-anchor:before { + content: "\e6c0"; } + +.ti-align-right:before { + content: "\e6c1"; } + +.ti-align-left:before { + content: "\e6c2"; } + +.ti-align-justify:before { + content: "\e6c3"; } + +.ti-align-center:before { + content: "\e6c4"; } + +.ti-alert:before { + content: "\e6c5"; } + +.ti-alarm-clock:before { + content: "\e6c6"; } + +.ti-agenda:before { + content: "\e6c7"; } + +.ti-write:before { + content: "\e6c8"; } + +.ti-window:before { + content: "\e6c9"; } + +.ti-widgetized:before { + content: "\e6ca"; } + +.ti-widget:before { + content: "\e6cb"; } + +.ti-widget-alt:before { + content: "\e6cc"; } + +.ti-wallet:before { + content: "\e6cd"; } + +.ti-video-clapper:before { + content: "\e6ce"; } + +.ti-video-camera:before { + content: "\e6cf"; } + +.ti-vector:before { + content: "\e6d0"; } + +.ti-themify-logo:before { + content: "\e6d1"; } + +.ti-themify-favicon:before { + content: "\e6d2"; } + +.ti-themify-favicon-alt:before { + content: "\e6d3"; } + +.ti-support:before { + content: "\e6d4"; } + +.ti-stamp:before { + content: "\e6d5"; } + +.ti-split-v-alt:before { + content: "\e6d6"; } + +.ti-slice:before { + content: "\e6d7"; } + +.ti-shortcode:before { + content: "\e6d8"; } + +.ti-shift-right-alt:before { + content: "\e6d9"; } + +.ti-shift-left-alt:before { + content: "\e6da"; } + +.ti-ruler-alt-2:before { + content: "\e6db"; } + +.ti-receipt:before { + content: "\e6dc"; } + +.ti-pin2:before { + content: "\e6dd"; } + +.ti-pin-alt:before { + content: "\e6de"; } + +.ti-pencil-alt2:before { + content: "\e6df"; } + +.ti-palette:before { + content: "\e6e0"; } + +.ti-more:before { + content: "\e6e1"; } + +.ti-more-alt:before { + content: "\e6e2"; } + +.ti-microphone-alt:before { + content: "\e6e3"; } + +.ti-magnet:before { + content: "\e6e4"; } + +.ti-line-double:before { + content: "\e6e5"; } + +.ti-line-dotted:before { + content: "\e6e6"; } + +.ti-line-dashed:before { + content: "\e6e7"; } + +.ti-layout-width-full:before { + content: "\e6e8"; } + +.ti-layout-width-default:before { + content: "\e6e9"; } + +.ti-layout-width-default-alt:before { + content: "\e6ea"; } + +.ti-layout-tab:before { + content: "\e6eb"; } + +.ti-layout-tab-window:before { + content: "\e6ec"; } + +.ti-layout-tab-v:before { + content: "\e6ed"; } + +.ti-layout-tab-min:before { + content: "\e6ee"; } + +.ti-layout-slider:before { + content: "\e6ef"; } + +.ti-layout-slider-alt:before { + content: "\e6f0"; } + +.ti-layout-sidebar-right:before { + content: "\e6f1"; } + +.ti-layout-sidebar-none:before { + content: "\e6f2"; } + +.ti-layout-sidebar-left:before { + content: "\e6f3"; } + +.ti-layout-placeholder:before { + content: "\e6f4"; } + +.ti-layout-menu:before { + content: "\e6f5"; } + +.ti-layout-menu-v:before { + content: "\e6f6"; } + +.ti-layout-menu-separated:before { + content: "\e6f7"; } + +.ti-layout-menu-full:before { + content: "\e6f8"; } + +.ti-layout-media-right-alt:before { + content: "\e6f9"; } + +.ti-layout-media-right:before { + content: "\e6fa"; } + +.ti-layout-media-overlay:before { + content: "\e6fb"; } + +.ti-layout-media-overlay-alt:before { + content: "\e6fc"; } + +.ti-layout-media-overlay-alt-2:before { + content: "\e6fd"; } + +.ti-layout-media-left-alt:before { + content: "\e6fe"; } + +.ti-layout-media-left:before { + content: "\e6ff"; } + +.ti-layout-media-center-alt:before { + content: "\e700"; } + +.ti-layout-media-center:before { + content: "\e701"; } + +.ti-layout-list-thumb:before { + content: "\e702"; } + +.ti-layout-list-thumb-alt:before { + content: "\e703"; } + +.ti-layout-list-post:before { + content: "\e704"; } + +.ti-layout-list-large-image:before { + content: "\e705"; } + +.ti-layout-line-solid:before { + content: "\e706"; } + +.ti-layout-grid4:before { + content: "\e707"; } + +.ti-layout-grid3:before { + content: "\e708"; } + +.ti-layout-grid2:before { + content: "\e709"; } + +.ti-layout-grid2-thumb:before { + content: "\e70a"; } + +.ti-layout-cta-right:before { + content: "\e70b"; } + +.ti-layout-cta-left:before { + content: "\e70c"; } + +.ti-layout-cta-center:before { + content: "\e70d"; } + +.ti-layout-cta-btn-right:before { + content: "\e70e"; } + +.ti-layout-cta-btn-left:before { + content: "\e70f"; } + +.ti-layout-column4:before { + content: "\e710"; } + +.ti-layout-column3:before { + content: "\e711"; } + +.ti-layout-column2:before { + content: "\e712"; } + +.ti-layout-accordion-separated:before { + content: "\e713"; } + +.ti-layout-accordion-merged:before { + content: "\e714"; } + +.ti-layout-accordion-list:before { + content: "\e715"; } + +.ti-ink-pen:before { + content: "\e716"; } + +.ti-info-alt:before { + content: "\e717"; } + +.ti-help-alt:before { + content: "\e718"; } + +.ti-headphone-alt:before { + content: "\e719"; } + +.ti-hand-point-up:before { + content: "\e71a"; } + +.ti-hand-point-right:before { + content: "\e71b"; } + +.ti-hand-point-left:before { + content: "\e71c"; } + +.ti-hand-point-down:before { + content: "\e71d"; } + +.ti-gallery:before { + content: "\e71e"; } + +.ti-face-smile:before { + content: "\e71f"; } + +.ti-face-sad:before { + content: "\e720"; } + +.ti-credit-card:before { + content: "\e721"; } + +.ti-control-skip-forward:before { + content: "\e722"; } + +.ti-control-skip-backward:before { + content: "\e723"; } + +.ti-control-record:before { + content: "\e724"; } + +.ti-control-eject:before { + content: "\e725"; } + +.ti-comments-smiley:before { + content: "\e726"; } + +.ti-brush-alt:before { + content: "\e727"; } + +.ti-youtube:before { + content: "\e728"; } + +.ti-vimeo:before { + content: "\e729"; } + +.ti-twitter:before { + content: "\e72a"; } + +.ti-time:before { + content: "\e72b"; } + +.ti-tumblr:before { + content: "\e72c"; } + +.ti-skype:before { + content: "\e72d"; } + +.ti-share:before { + content: "\e72e"; } + +.ti-share-alt:before { + content: "\e72f"; } + +.ti-rocket:before { + content: "\e730"; } + +.ti-pinterest:before { + content: "\e731"; } + +.ti-new-window:before { + content: "\e732"; } + +.ti-microsoft:before { + content: "\e733"; } + +.ti-list-ol:before { + content: "\e734"; } + +.ti-linkedin:before { + content: "\e735"; } + +.ti-layout-sidebar-2:before { + content: "\e736"; } + +.ti-layout-grid4-alt:before { + content: "\e737"; } + +.ti-layout-grid3-alt:before { + content: "\e738"; } + +.ti-layout-grid2-alt:before { + content: "\e739"; } + +.ti-layout-column4-alt:before { + content: "\e73a"; } + +.ti-layout-column3-alt:before { + content: "\e73b"; } + +.ti-layout-column2-alt:before { + content: "\e73c"; } + +.ti-instagram:before { + content: "\e73d"; } + +.ti-google:before { + content: "\e73e"; } + +.ti-github:before { + content: "\e73f"; } + +.ti-flickr:before { + content: "\e740"; } + +.ti-facebook:before { + content: "\e741"; } + +.ti-dropbox:before { + content: "\e742"; } + +.ti-dribbble:before { + content: "\e743"; } + +.ti-apple:before { + content: "\e744"; } + +.ti-android:before { + content: "\e745"; } + +.ti-save:before { + content: "\e746"; } + +.ti-save-alt:before { + content: "\e747"; } + +.ti-yahoo:before { + content: "\e748"; } + +.ti-wordpress:before { + content: "\e749"; } + +.ti-vimeo-alt:before { + content: "\e74a"; } + +.ti-twitter-alt:before { + content: "\e74b"; } + +.ti-tumblr-alt:before { + content: "\e74c"; } + +.ti-trello:before { + content: "\e74d"; } + +.ti-stack-overflow:before { + content: "\e74e"; } + +.ti-soundcloud:before { + content: "\e74f"; } + +.ti-sharethis:before { + content: "\e750"; } + +.ti-sharethis-alt:before { + content: "\e751"; } + +.ti-reddit:before { + content: "\e752"; } + +.ti-pinterest-alt:before { + content: "\e753"; } + +.ti-microsoft-alt:before { + content: "\e754"; } + +.ti-linux:before { + content: "\e755"; } + +.ti-jsfiddle:before { + content: "\e756"; } + +.ti-joomla:before { + content: "\e757"; } + +.ti-html5:before { + content: "\e758"; } + +.ti-flickr-alt:before { + content: "\e759"; } + +.ti-email:before { + content: "\e75a"; } + +.ti-drupal:before { + content: "\e75b"; } + +.ti-dropbox-alt:before { + content: "\e75c"; } + +.ti-css3:before { + content: "\e75d"; } + +.ti-rss:before { + content: "\e75e"; } + +.ti-rss-alt:before { + content: "\e75f"; } + +/*! + * Material Design Iconic Font 1.0.1 by Sergey Kupletsky (@zavoloklom) - http://zavoloklom.github.io/material-design-iconic-font/ + * License - https://github.com/zavoloklom/material-design-iconic-font/blob/gh-pages/License.md (Attribution-ShareAlike 4.0 International license) + */ +@font-face { + font-family: 'Material Design Iconic Font'; + src: url("../fonts/Material-Design-Iconic-Font.eot?v=1.0.1"); + src: url("../fonts/Material-Design-Iconic-Font.eot?#iefix&v=1.0.1") format("embedded-opentype"), url("../fonts/Material-Design-Iconic-Font.woff?v=1.0.1") format("woff"), url("../fonts/Material-Design-Iconic-Font.ttf?v=1.0.1") format("truetype"), url("../fonts/Material-Design-Iconic-Font.svg?v=1.0.1#Material-Design-Iconic-Font") format("svg"); + font-weight: normal; + font-style: normal; } +[class^="md-"], +[class*=" md-"] { + display: inline-block; + font: normal normal normal 14px/1 'Material Design Iconic Font'; + font-size: inherit; + speak: none; + text-rendering: auto; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; } + +.md { + line-height: inherit; + vertical-align: bottom; } + +.md-lg { + font-size: 1.5em; + line-height: .5em; + vertical-align: -35%; } + +.md-2x { + font-size: 2em; } + +.md-3x { + font-size: 3em; } + +.md-4x { + font-size: 4em; } + +.md-5x { + font-size: 5em; } + +.md-border { + padding: .2em .25em .15em; + border: solid 0.08em grey; + border-radius: .1em; } + +.md-border-circle { + padding: .2em .25em .15em; + border: solid 0.08em grey; + border-radius: 50%; } + +[class^="md-"].pull-left, +[class*=" md-"].pull-left { + float: left; + margin-right: .3em; } + +[class^="md-"].pull-right, +[class*=" md-"].pull-right { + float: right; + margin-left: .3em; } + +.md-spin { + -webkit-animation: md-spin 1.5s infinite linear; + animation: md-spin 1.5s infinite linear; } + +.md-spin-reverse { + -webkit-animation: md-spin-reverse 1.5s infinite linear; + animation: md-spin-reverse 1.5s infinite linear; } + +@-webkit-keyframes md-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); } } +@keyframes md-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); } } +@-webkit-keyframes md-spin-reverse { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); } + 100% { + -webkit-transform: rotate(-359deg); + transform: rotate(-359deg); } } +@keyframes md-spin-reverse { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); } + 100% { + -webkit-transform: rotate(-359deg); + transform: rotate(-359deg); } } +.md-rotate-90 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1); + -webkit-transform: rotate(90deg); + -ms-transform: rotate(90deg); + transform: rotate(90deg); } + +.md-rotate-180 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2); + -webkit-transform: rotate(180deg); + -ms-transform: rotate(180deg); + transform: rotate(180deg); } + +.md-rotate-270 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3); + -webkit-transform: rotate(270deg); + -ms-transform: rotate(270deg); + transform: rotate(270deg); } + +.md-flip-horizontal { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1); + -webkit-transform: scale(-1, 1); + -ms-transform: scale(-1, 1); + transform: scale(-1, 1); } + +.md-flip-vertical { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1); + -webkit-transform: scale(1, -1); + -ms-transform: scale(1, -1); + transform: scale(1, -1); } + +:root .md-rotate-90, +:root .md-rotate-180, +:root .md-rotate-270, +:root .md-flip-horizontal, +:root .md-flip-vertical { + filter: none; } + +/* Material Design Iconic Font uses the Unicode Private Use Area (PUA) to ensure screen + readers do not read off random characters that represent icons */ +/* If you do not want use all icons you can disable icon set here */ +.md-3d-rotation:before { + content: "\f000"; } + +.md-accessibility:before { + content: "\f001"; } + +.md-account-balance:before { + content: "\f002"; } + +.md-account-balance-wallet:before { + content: "\f003"; } + +.md-account-box:before { + content: "\f004"; } + +.md-account-child:before { + content: "\f005"; } + +.md-account-circle:before { + content: "\f006"; } + +.md-add-shopping-cart:before { + content: "\f007"; } + +.md-alarm:before { + content: "\f008"; } + +.md-alarm-add:before { + content: "\f009"; } + +.md-alarm-off:before { + content: "\f00a"; } + +.md-alarm-on:before { + content: "\f00b"; } + +.md-android:before { + content: "\f00c"; } + +.md-announcement:before { + content: "\f00d"; } + +.md-aspect-ratio:before { + content: "\f00e"; } + +.md-assessment:before { + content: "\f00f"; } + +.md-assignment:before { + content: "\f010"; } + +.md-assignment-ind:before { + content: "\f011"; } + +.md-assignment-late:before { + content: "\f012"; } + +.md-assignment-return:before { + content: "\f013"; } + +.md-assignment-returned:before { + content: "\f014"; } + +.md-assignment-turned-in:before { + content: "\f015"; } + +.md-autorenew:before { + content: "\f016"; } + +.md-backup:before { + content: "\f017"; } + +.md-book:before { + content: "\f018"; } + +.md-bookmark:before { + content: "\f019"; } + +.md-bookmark-outline:before { + content: "\f01a"; } + +.md-bug-report:before { + content: "\f01b"; } + +.md-cached:before { + content: "\f01c"; } + +.md-class:before { + content: "\f01d"; } + +.md-credit-card:before { + content: "\f01e"; } + +.md-dashboard:before { + content: "\f01f"; } + +.md-delete:before { + content: "\f020"; } + +.md-description:before { + content: "\f021"; } + +.md-dns:before { + content: "\f022"; } + +.md-done:before { + content: "\f023"; } + +.md-done-all:before { + content: "\f024"; } + +.md-event:before { + content: "\f025"; } + +.md-exit-to-app:before { + content: "\f026"; } + +.md-explore:before { + content: "\f027"; } + +.md-extension:before { + content: "\f028"; } + +.md-face-unlock:before { + content: "\f029"; } + +.md-favorite:before { + content: "\f02a"; } + +.md-favorite-outline:before { + content: "\f02b"; } + +.md-find-in-page:before { + content: "\f02c"; } + +.md-find-replace:before { + content: "\f02d"; } + +.md-flip-to-back:before { + content: "\f02e"; } + +.md-flip-to-front:before { + content: "\f02f"; } + +.md-get-app:before { + content: "\f030"; } + +.md-grade:before { + content: "\f031"; } + +.md-group-work:before { + content: "\f032"; } + +.md-help:before { + content: "\f033"; } + +.md-highlight-remove:before { + content: "\f034"; } + +.md-history:before { + content: "\f035"; } + +.md-home:before { + content: "\f036"; } + +.md-https:before { + content: "\f037"; } + +.md-info:before { + content: "\f038"; } + +.md-info-outline:before { + content: "\f039"; } + +.md-input:before { + content: "\f03a"; } + +.md-invert-colors:before { + content: "\f03b"; } + +.md-label:before { + content: "\f03c"; } + +.md-label-outline:before { + content: "\f03d"; } + +.md-language:before { + content: "\f03e"; } + +.md-launch:before { + content: "\f03f"; } + +.md-list:before { + content: "\f040"; } + +.md-lock:before { + content: "\f041"; } + +.md-lock-open:before { + content: "\f042"; } + +.md-lock-outline:before { + content: "\f043"; } + +.md-loyalty:before { + content: "\f044"; } + +.md-markunread-mailbox:before { + content: "\f045"; } + +.md-note-add:before { + content: "\f046"; } + +.md-open-in-browser:before { + content: "\f047"; } + +.md-open-in-new:before { + content: "\f048"; } + +.md-open-with:before { + content: "\f049"; } + +.md-pageview:before { + content: "\f04a"; } + +.md-payment:before { + content: "\f04b"; } + +.md-perm-camera-mic:before { + content: "\f04c"; } + +.md-perm-contact-cal:before { + content: "\f04d"; } + +.md-perm-data-setting:before { + content: "\f04e"; } + +.md-perm-device-info:before { + content: "\f04f"; } + +.md-perm-identity:before { + content: "\f050"; } + +.md-perm-media:before { + content: "\f051"; } + +.md-perm-phone-msg:before { + content: "\f052"; } + +.md-perm-scan-wifi:before { + content: "\f053"; } + +.md-picture-in-picture:before { + content: "\f054"; } + +.md-polymer:before { + content: "\f055"; } + +.md-print:before { + content: "\f056"; } + +.md-query-builder:before { + content: "\f057"; } + +.md-question-answer:before { + content: "\f058"; } + +.md-receipt:before { + content: "\f059"; } + +.md-redeem:before { + content: "\f05a"; } + +.md-report-problem:before { + content: "\f05b"; } + +.md-restore:before { + content: "\f05c"; } + +.md-room:before { + content: "\f05d"; } + +.md-schedule:before { + content: "\f05e"; } + +.md-search:before { + content: "\f05f"; } + +.md-settings:before { + content: "\f060"; } + +.md-settings-applications:before { + content: "\f061"; } + +.md-settings-backup-restore:before { + content: "\f062"; } + +.md-settings-bluetooth:before { + content: "\f063"; } + +.md-settings-cell:before { + content: "\f064"; } + +.md-settings-display:before { + content: "\f065"; } + +.md-settings-ethernet:before { + content: "\f066"; } + +.md-settings-input-antenna:before { + content: "\f067"; } + +.md-settings-input-component:before { + content: "\f068"; } + +.md-settings-input-composite:before { + content: "\f069"; } + +.md-settings-input-hdmi:before { + content: "\f06a"; } + +.md-settings-input-svideo:before { + content: "\f06b"; } + +.md-settings-overscan:before { + content: "\f06c"; } + +.md-settings-phone:before { + content: "\f06d"; } + +.md-settings-power:before { + content: "\f06e"; } + +.md-settings-remote:before { + content: "\f06f"; } + +.md-settings-voice:before { + content: "\f070"; } + +.md-shop:before { + content: "\f071"; } + +.md-shopping-basket:before { + content: "\f072"; } + +.md-shopping-cart:before { + content: "\f073"; } + +.md-shop-two:before { + content: "\f074"; } + +.md-speaker-notes:before { + content: "\f075"; } + +.md-spellcheck:before { + content: "\f076"; } + +.md-star-rate:before { + content: "\f077"; } + +.md-stars:before { + content: "\f078"; } + +.md-store:before { + content: "\f079"; } + +.md-subject:before { + content: "\f07a"; } + +.md-swap-horiz:before { + content: "\f07b"; } + +.md-swap-vert:before { + content: "\f07c"; } + +.md-swap-vert-circle:before { + content: "\f07d"; } + +.md-system-update-tv:before { + content: "\f07e"; } + +.md-tab:before { + content: "\f07f"; } + +.md-tab-unselected:before { + content: "\f080"; } + +.md-theaters:before { + content: "\f081"; } + +.md-thumb-down:before { + content: "\f082"; } + +.md-thumbs-up-down:before { + content: "\f083"; } + +.md-thumb-up:before { + content: "\f084"; } + +.md-toc:before { + content: "\f085"; } + +.md-today:before { + content: "\f086"; } + +.md-track-changes:before { + content: "\f087"; } + +.md-translate:before { + content: "\f088"; } + +.md-trending-down:before { + content: "\f089"; } + +.md-trending-neutral:before { + content: "\f08a"; } + +.md-trending-up:before { + content: "\f08b"; } + +.md-turned-in:before { + content: "\f08c"; } + +.md-turned-in-not:before { + content: "\f08d"; } + +.md-verified-user:before { + content: "\f08e"; } + +.md-view-agenda:before { + content: "\f08f"; } + +.md-view-array:before { + content: "\f090"; } + +.md-view-carousel:before { + content: "\f091"; } + +.md-view-column:before { + content: "\f092"; } + +.md-view-day:before { + content: "\f093"; } + +.md-view-headline:before { + content: "\f094"; } + +.md-view-list:before { + content: "\f095"; } + +.md-view-module:before { + content: "\f096"; } + +.md-view-quilt:before { + content: "\f097"; } + +.md-view-stream:before { + content: "\f098"; } + +.md-view-week:before { + content: "\f099"; } + +.md-visibility:before { + content: "\f09a"; } + +.md-visibility-off:before { + content: "\f09b"; } + +.md-wallet-giftcard:before { + content: "\f09c"; } + +.md-wallet-membership:before { + content: "\f09d"; } + +.md-wallet-travel:before { + content: "\f09e"; } + +.md-work:before { + content: "\f09f"; } + +.md-error:before { + content: "\f0a0"; } + +.md-warning:before { + content: "\f0a1"; } + +.md-album:before { + content: "\f0a2"; } + +.md-av-timer:before { + content: "\f0a3"; } + +.md-closed-caption:before { + content: "\f0a4"; } + +.md-equalizer:before { + content: "\f0a5"; } + +.md-explicit:before { + content: "\f0a6"; } + +.md-fast-forward:before { + content: "\f0a7"; } + +.md-fast-rewind:before { + content: "\f0a8"; } + +.md-games:before { + content: "\f0a9"; } + +.md-hearing:before { + content: "\f0aa"; } + +.md-high-quality:before { + content: "\f0ab"; } + +.md-loop:before { + content: "\f0ac"; } + +.md-mic:before { + content: "\f0ad"; } + +.md-mic-none:before { + content: "\f0ae"; } + +.md-mic-off:before { + content: "\f0af"; } + +.md-movie:before { + content: "\f0b0"; } + +.md-my-library-add:before { + content: "\f0b1"; } + +.md-my-library-books:before { + content: "\f0b2"; } + +.md-my-library-music:before { + content: "\f0b3"; } + +.md-new-releases:before { + content: "\f0b4"; } + +.md-not-interested:before { + content: "\f0b5"; } + +.md-pause:before { + content: "\f0b6"; } + +.md-pause-circle-fill:before { + content: "\f0b7"; } + +.md-pause-circle-outline:before { + content: "\f0b8"; } + +.md-play-arrow:before { + content: "\f0b9"; } + +.md-play-circle-fill:before { + content: "\f0ba"; } + +.md-play-circle-outline:before { + content: "\f0bb"; } + +.md-playlist-add:before { + content: "\f0bc"; } + +.md-play-shopping-bag:before { + content: "\f0bd"; } + +.md-queue:before { + content: "\f0be"; } + +.md-queue-music:before { + content: "\f0bf"; } + +.md-radio:before { + content: "\f0c0"; } + +.md-recent-actors:before { + content: "\f0c1"; } + +.md-repeat:before { + content: "\f0c2"; } + +.md-repeat-one:before { + content: "\f0c3"; } + +.md-replay:before { + content: "\f0c4"; } + +.md-shuffle:before { + content: "\f0c5"; } + +.md-skip-next:before { + content: "\f0c6"; } + +.md-skip-previous:before { + content: "\f0c7"; } + +.md-snooze:before { + content: "\f0c8"; } + +.md-stop:before { + content: "\f0c9"; } + +.md-subtitles:before { + content: "\f0ca"; } + +.md-surround-sound:before { + content: "\f0cb"; } + +.md-videocam:before { + content: "\f0cc"; } + +.md-videocam-off:before { + content: "\f0cd"; } + +.md-video-collection:before { + content: "\f0ce"; } + +.md-volume-down:before { + content: "\f0cf"; } + +.md-volume-mute:before { + content: "\f0d0"; } + +.md-volume-off:before { + content: "\f0d1"; } + +.md-volume-up:before { + content: "\f0d2"; } + +.md-web:before { + content: "\f0d3"; } + +.md-business:before { + content: "\f0d4"; } + +.md-call:before { + content: "\f0d5"; } + +.md-call-end:before { + content: "\f0d6"; } + +.md-call-made:before { + content: "\f0d7"; } + +.md-call-merge:before { + content: "\f0d8"; } + +.md-call-missed:before { + content: "\f0d9"; } + +.md-call-received:before { + content: "\f0da"; } + +.md-call-split:before { + content: "\f0db"; } + +.md-chat:before { + content: "\f0dc"; } + +.md-clear-all:before { + content: "\f0dd"; } + +.md-comment:before { + content: "\f0de"; } + +.md-contacts:before { + content: "\f0df"; } + +.md-dialer-sip:before { + content: "\f0e0"; } + +.md-dialpad:before { + content: "\f0e1"; } + +.md-dnd-on:before { + content: "\f0e2"; } + +.md-email:before { + content: "\f0e3"; } + +.md-forum:before { + content: "\f0e4"; } + +.md-import-export:before { + content: "\f0e5"; } + +.md-invert-colors-off:before { + content: "\f0e6"; } + +.md-invert-colors-on:before { + content: "\f0e7"; } + +.md-live-help:before { + content: "\f0e8"; } + +.md-location-off:before { + content: "\f0e9"; } + +.md-location-on:before { + content: "\f0ea"; } + +.md-message:before { + content: "\f0eb"; } + +.md-messenger:before { + content: "\f0ec"; } + +.md-no-sim:before { + content: "\f0ed"; } + +.md-phone:before { + content: "\f0ee"; } + +.md-portable-wifi-off:before { + content: "\f0ef"; } + +.md-quick-contacts-dialer:before { + content: "\f0f0"; } + +.md-quick-contacts-mail:before { + content: "\f0f1"; } + +.md-ring-volume:before { + content: "\f0f2"; } + +.md-stay-current-landscape:before { + content: "\f0f3"; } + +.md-stay-current-portrait:before { + content: "\f0f4"; } + +.md-stay-primary-landscape:before { + content: "\f0f5"; } + +.md-stay-primary-portrait:before { + content: "\f0f6"; } + +.md-swap-calls:before { + content: "\f0f7"; } + +.md-textsms:before { + content: "\f0f8"; } + +.md-voicemail:before { + content: "\f0f9"; } + +.md-vpn-key:before { + content: "\f0fa"; } + +.md-add:before { + content: "\f0fb"; } + +.md-add-box:before { + content: "\f0fc"; } + +.md-add-circle:before { + content: "\f0fd"; } + +.md-add-circle-outline:before { + content: "\f0fe"; } + +.md-archive:before { + content: "\f0ff"; } + +.md-backspace:before { + content: "\f100"; } + +.md-block:before { + content: "\f101"; } + +.md-clear:before { + content: "\f102"; } + +.md-content-copy:before { + content: "\f103"; } + +.md-content-cut:before { + content: "\f104"; } + +.md-content-paste:before { + content: "\f105"; } + +.md-create:before { + content: "\f106"; } + +.md-drafts:before { + content: "\f107"; } + +.md-filter-list:before { + content: "\f108"; } + +.md-flag:before { + content: "\f109"; } + +.md-forward:before { + content: "\f10a"; } + +.md-gesture:before { + content: "\f10b"; } + +.md-inbox:before { + content: "\f10c"; } + +.md-link:before { + content: "\f10d"; } + +.md-mail:before { + content: "\f10e"; } + +.md-markunread:before { + content: "\f10f"; } + +.md-redo:before { + content: "\f110"; } + +.md-remove:before { + content: "\f111"; } + +.md-remove-circle:before { + content: "\f112"; } + +.md-remove-circle-outline:before { + content: "\f113"; } + +.md-reply:before { + content: "\f114"; } + +.md-reply-all:before { + content: "\f115"; } + +.md-report:before { + content: "\f116"; } + +.md-save:before { + content: "\f117"; } + +.md-select-all:before { + content: "\f118"; } + +.md-send:before { + content: "\f119"; } + +.md-sort:before { + content: "\f11a"; } + +.md-text-format:before { + content: "\f11b"; } + +.md-undo:before { + content: "\f11c"; } + +.md-access-alarm:before { + content: "\f11d"; } + +.md-access-alarms:before { + content: "\f11e"; } + +.md-access-time:before { + content: "\f11f"; } + +.md-add-alarm:before { + content: "\f120"; } + +.md-airplanemode-off:before { + content: "\f121"; } + +.md-airplanemode-on:before { + content: "\f122"; } + +.md-battery-20:before { + content: "\f123"; } + +.md-battery-30:before { + content: "\f124"; } + +.md-battery-50:before { + content: "\f125"; } + +.md-battery-60:before { + content: "\f126"; } + +.md-battery-80:before { + content: "\f127"; } + +.md-battery-90:before { + content: "\f128"; } + +.md-battery-alert:before { + content: "\f129"; } + +.md-battery-charging-20:before { + content: "\f12a"; } + +.md-battery-charging-30:before { + content: "\f12b"; } + +.md-battery-charging-50:before { + content: "\f12c"; } + +.md-battery-charging-60:before { + content: "\f12d"; } + +.md-battery-charging-80:before { + content: "\f12e"; } + +.md-battery-charging-90:before { + content: "\f12f"; } + +.md-battery-charging-full:before { + content: "\f130"; } + +.md-battery-full:before { + content: "\f131"; } + +.md-battery-std:before { + content: "\f132"; } + +.md-battery-unknown:before { + content: "\f133"; } + +.md-bluetooth:before { + content: "\f134"; } + +.md-bluetooth-connected:before { + content: "\f135"; } + +.md-bluetooth-disabled:before { + content: "\f136"; } + +.md-bluetooth-searching:before { + content: "\f137"; } + +.md-brightness-auto:before { + content: "\f138"; } + +.md-brightness-high:before { + content: "\f139"; } + +.md-brightness-low:before { + content: "\f13a"; } + +.md-brightness-medium:before { + content: "\f13b"; } + +.md-data-usage:before { + content: "\f13c"; } + +.md-developer-mode:before { + content: "\f13d"; } + +.md-devices:before { + content: "\f13e"; } + +.md-dvr:before { + content: "\f13f"; } + +.md-gps-fixed:before { + content: "\f140"; } + +.md-gps-not-fixed:before { + content: "\f141"; } + +.md-gps-off:before { + content: "\f142"; } + +.md-location-disabled:before { + content: "\f143"; } + +.md-location-searching:before { + content: "\f144"; } + +.md-multitrack-audio:before { + content: "\f145"; } + +.md-network-cell:before { + content: "\f146"; } + +.md-network-wifi:before { + content: "\f147"; } + +.md-nfc:before { + content: "\f148"; } + +.md-now-wallpaper:before { + content: "\f149"; } + +.md-now-widgets:before { + content: "\f14a"; } + +.md-screen-lock-landscape:before { + content: "\f14b"; } + +.md-screen-lock-portrait:before { + content: "\f14c"; } + +.md-screen-lock-rotation:before { + content: "\f14d"; } + +.md-screen-rotation:before { + content: "\f14e"; } + +.md-sd-storage:before { + content: "\f14f"; } + +.md-settings-system-daydream:before { + content: "\f150"; } + +.md-signal-cellular-0-bar:before { + content: "\f151"; } + +.md-signal-cellular-1-bar:before { + content: "\f152"; } + +.md-signal-cellular-2-bar:before { + content: "\f153"; } + +.md-signal-cellular-3-bar:before { + content: "\f154"; } + +.md-signal-cellular-4-bar:before { + content: "\f155"; } + +.md-signal-cellular-connected-no-internet-0-bar:before { + content: "\f156"; } + +.md-signal-cellular-connected-no-internet-1-bar:before { + content: "\f157"; } + +.md-signal-cellular-connected-no-internet-2-bar:before { + content: "\f158"; } + +.md-signal-cellular-connected-no-internet-3-bar:before { + content: "\f159"; } + +.md-signal-cellular-connected-no-internet-4-bar:before { + content: "\f15a"; } + +.md-signal-cellular-no-sim:before { + content: "\f15b"; } + +.md-signal-cellular-null:before { + content: "\f15c"; } + +.md-signal-cellular-off:before { + content: "\f15d"; } + +.md-signal-wifi-0-bar:before { + content: "\f15e"; } + +.md-signal-wifi-1-bar:before { + content: "\f15f"; } + +.md-signal-wifi-2-bar:before { + content: "\f160"; } + +.md-signal-wifi-3-bar:before { + content: "\f161"; } + +.md-signal-wifi-4-bar:before { + content: "\f162"; } + +.md-signal-wifi-off:before { + content: "\f163"; } + +.md-storage:before { + content: "\f164"; } + +.md-usb:before { + content: "\f165"; } + +.md-wifi-lock:before { + content: "\f166"; } + +.md-wifi-tethering:before { + content: "\f167"; } + +.md-attach-file:before { + content: "\f168"; } + +.md-attach-money:before { + content: "\f169"; } + +.md-border-all:before { + content: "\f16a"; } + +.md-border-bottom:before { + content: "\f16b"; } + +.md-border-clear:before { + content: "\f16c"; } + +.md-border-color:before { + content: "\f16d"; } + +.md-border-horizontal:before { + content: "\f16e"; } + +.md-border-inner:before { + content: "\f16f"; } + +.md-border-left:before { + content: "\f170"; } + +.md-border-outer:before { + content: "\f171"; } + +.md-border-right:before { + content: "\f172"; } + +.md-border-style:before { + content: "\f173"; } + +.md-border-top:before { + content: "\f174"; } + +.md-border-vertical:before { + content: "\f175"; } + +.md-format-align-center:before { + content: "\f176"; } + +.md-format-align-justify:before { + content: "\f177"; } + +.md-format-align-left:before { + content: "\f178"; } + +.md-format-align-right:before { + content: "\f179"; } + +.md-format-bold:before { + content: "\f17a"; } + +.md-format-clear:before { + content: "\f17b"; } + +.md-format-color-fill:before { + content: "\f17c"; } + +.md-format-color-reset:before { + content: "\f17d"; } + +.md-format-color-text:before { + content: "\f17e"; } + +.md-format-indent-decrease:before { + content: "\f17f"; } + +.md-format-indent-increase:before { + content: "\f180"; } + +.md-format-italic:before { + content: "\f181"; } + +.md-format-line-spacing:before { + content: "\f182"; } + +.md-format-list-bulleted:before { + content: "\f183"; } + +.md-format-list-numbered:before { + content: "\f184"; } + +.md-format-paint:before { + content: "\f185"; } + +.md-format-quote:before { + content: "\f186"; } + +.md-format-size:before { + content: "\f187"; } + +.md-format-strikethrough:before { + content: "\f188"; } + +.md-format-textdirection-l-to-r:before { + content: "\f189"; } + +.md-format-textdirection-r-to-l:before { + content: "\f18a"; } + +.md-format-underline:before { + content: "\f18b"; } + +.md-functions:before { + content: "\f18c"; } + +.md-insert-chart:before { + content: "\f18d"; } + +.md-insert-comment:before { + content: "\f18e"; } + +.md-insert-drive-file:before { + content: "\f18f"; } + +.md-insert-emoticon:before { + content: "\f190"; } + +.md-insert-invitation:before { + content: "\f191"; } + +.md-insert-link:before { + content: "\f192"; } + +.md-insert-photo:before { + content: "\f193"; } + +.md-merge-type:before { + content: "\f194"; } + +.md-mode-comment:before { + content: "\f195"; } + +.md-mode-edit:before { + content: "\f196"; } + +.md-publish:before { + content: "\f197"; } + +.md-vertical-align-bottom:before { + content: "\f198"; } + +.md-vertical-align-center:before { + content: "\f199"; } + +.md-vertical-align-top:before { + content: "\f19a"; } + +.md-wrap-text:before { + content: "\f19b"; } + +.md-attachment:before { + content: "\f19c"; } + +.md-cloud:before { + content: "\f19d"; } + +.md-cloud-circle:before { + content: "\f19e"; } + +.md-cloud-done:before { + content: "\f19f"; } + +.md-cloud-download:before { + content: "\f1a0"; } + +.md-cloud-off:before { + content: "\f1a1"; } + +.md-cloud-queue:before { + content: "\f1a2"; } + +.md-cloud-upload:before { + content: "\f1a3"; } + +.md-file-download:before { + content: "\f1a4"; } + +.md-file-upload:before { + content: "\f1a5"; } + +.md-folder:before { + content: "\f1a6"; } + +.md-folder-open:before { + content: "\f1a7"; } + +.md-folder-shared:before { + content: "\f1a8"; } + +.md-cast:before { + content: "\f1a9"; } + +.md-cast-connected:before { + content: "\f1aa"; } + +.md-computer:before { + content: "\f1ab"; } + +.md-desktop-mac:before { + content: "\f1ac"; } + +.md-desktop-windows:before { + content: "\f1ad"; } + +.md-dock:before { + content: "\f1ae"; } + +.md-gamepad:before { + content: "\f1af"; } + +.md-headset:before { + content: "\f1b0"; } + +.md-headset-mic:before { + content: "\f1b1"; } + +.md-keyboard:before { + content: "\f1b2"; } + +.md-keyboard-alt:before { + content: "\f1b3"; } + +.md-keyboard-arrow-down:before { + content: "\f1b4"; } + +.md-keyboard-arrow-left:before { + content: "\f1b5"; } + +.md-keyboard-arrow-right:before { + content: "\f1b6"; } + +.md-keyboard-arrow-up:before { + content: "\f1b7"; } + +.md-keyboard-backspace:before { + content: "\f1b8"; } + +.md-keyboard-capslock:before { + content: "\f1b9"; } + +.md-keyboard-control:before { + content: "\f1ba"; } + +.md-keyboard-hide:before { + content: "\f1bb"; } + +.md-keyboard-return:before { + content: "\f1bc"; } + +.md-keyboard-tab:before { + content: "\f1bd"; } + +.md-keyboard-voice:before { + content: "\f1be"; } + +.md-laptop:before { + content: "\f1bf"; } + +.md-laptop-chromebook:before { + content: "\f1c0"; } + +.md-laptop-mac:before { + content: "\f1c1"; } + +.md-laptop-windows:before { + content: "\f1c2"; } + +.md-memory:before { + content: "\f1c3"; } + +.md-mouse:before { + content: "\f1c4"; } + +.md-phone-android:before { + content: "\f1c5"; } + +.md-phone-iphone:before { + content: "\f1c6"; } + +.md-phonelink:before { + content: "\f1c7"; } + +.md-phonelink-off:before { + content: "\f1c8"; } + +.md-security:before { + content: "\f1c9"; } + +.md-sim-card:before { + content: "\f1ca"; } + +.md-smartphone:before { + content: "\f1cb"; } + +.md-speaker:before { + content: "\f1cc"; } + +.md-tablet:before { + content: "\f1cd"; } + +.md-tablet-android:before { + content: "\f1ce"; } + +.md-tablet-mac:before { + content: "\f1cf"; } + +.md-tv:before { + content: "\f1d0"; } + +.md-watch:before { + content: "\f1d1"; } + +.md-add-to-photos:before { + content: "\f1d2"; } + +.md-adjust:before { + content: "\f1d3"; } + +.md-assistant-photo:before { + content: "\f1d4"; } + +.md-audiotrack:before { + content: "\f1d5"; } + +.md-blur-circular:before { + content: "\f1d6"; } + +.md-blur-linear:before { + content: "\f1d7"; } + +.md-blur-off:before { + content: "\f1d8"; } + +.md-blur-on:before { + content: "\f1d9"; } + +.md-brightness-1:before { + content: "\f1da"; } + +.md-brightness-2:before { + content: "\f1db"; } + +.md-brightness-3:before { + content: "\f1dc"; } + +.md-brightness-4:before { + content: "\f1dd"; } + +.md-brightness-5:before { + content: "\f1de"; } + +.md-brightness-6:before { + content: "\f1df"; } + +.md-brightness-7:before { + content: "\f1e0"; } + +.md-brush:before { + content: "\f1e1"; } + +.md-camera:before { + content: "\f1e2"; } + +.md-camera-alt:before { + content: "\f1e3"; } + +.md-camera-front:before { + content: "\f1e4"; } + +.md-camera-rear:before { + content: "\f1e5"; } + +.md-camera-roll:before { + content: "\f1e6"; } + +.md-center-focus-strong:before { + content: "\f1e7"; } + +.md-center-focus-weak:before { + content: "\f1e8"; } + +.md-collections:before { + content: "\f1e9"; } + +.md-colorize:before { + content: "\f1ea"; } + +.md-color-lens:before { + content: "\f1eb"; } + +.md-compare:before { + content: "\f1ec"; } + +.md-control-point:before { + content: "\f1ed"; } + +.md-control-point-duplicate:before { + content: "\f1ee"; } + +.md-crop:before { + content: "\f1ef"; } + +.md-crop-3-2:before { + content: "\f1f0"; } + +.md-crop-5-4:before { + content: "\f1f1"; } + +.md-crop-7-5:before { + content: "\f1f2"; } + +.md-crop-16-9:before { + content: "\f1f3"; } + +.md-crop-din:before { + content: "\f1f4"; } + +.md-crop-free:before { + content: "\f1f5"; } + +.md-crop-landscape:before { + content: "\f1f6"; } + +.md-crop-original:before { + content: "\f1f7"; } + +.md-crop-portrait:before { + content: "\f1f8"; } + +.md-crop-square:before { + content: "\f1f9"; } + +.md-dehaze:before { + content: "\f1fa"; } + +.md-details:before { + content: "\f1fb"; } + +.md-edit:before { + content: "\f1fc"; } + +.md-exposure:before { + content: "\f1fd"; } + +.md-exposure-minus-1:before { + content: "\f1fe"; } + +.md-exposure-minus-2:before { + content: "\f1ff"; } + +.md-exposure-zero:before { + content: "\f200"; } + +.md-exposure-plus-1:before { + content: "\f201"; } + +.md-exposure-plus-2:before { + content: "\f202"; } + +.md-filter:before { + content: "\f203"; } + +.md-filter-1:before { + content: "\f204"; } + +.md-filter-2:before { + content: "\f205"; } + +.md-filter-3:before { + content: "\f206"; } + +.md-filter-4:before { + content: "\f207"; } + +.md-filter-5:before { + content: "\f208"; } + +.md-filter-6:before { + content: "\f209"; } + +.md-filter-7:before { + content: "\f20a"; } + +.md-filter-8:before { + content: "\f20b"; } + +.md-filter-9:before { + content: "\f20c"; } + +.md-filter-9-plus:before { + content: "\f20d"; } + +.md-filter-b-and-w:before { + content: "\f20e"; } + +.md-filter-center-focus:before { + content: "\f20f"; } + +.md-filter-drama:before { + content: "\f210"; } + +.md-filter-frames:before { + content: "\f211"; } + +.md-filter-hdr:before { + content: "\f212"; } + +.md-filter-none:before { + content: "\f213"; } + +.md-filter-tilt-shift:before { + content: "\f214"; } + +.md-filter-vintage:before { + content: "\f215"; } + +.md-flare:before { + content: "\f216"; } + +.md-flash-auto:before { + content: "\f217"; } + +.md-flash-off:before { + content: "\f218"; } + +.md-flash-on:before { + content: "\f219"; } + +.md-flip:before { + content: "\f21a"; } + +.md-gradient:before { + content: "\f21b"; } + +.md-grain:before { + content: "\f21c"; } + +.md-grid-off:before { + content: "\f21d"; } + +.md-grid-on:before { + content: "\f21e"; } + +.md-hdr-off:before { + content: "\f21f"; } + +.md-hdr-on:before { + content: "\f220"; } + +.md-hdr-strong:before { + content: "\f221"; } + +.md-hdr-weak:before { + content: "\f222"; } + +.md-healing:before { + content: "\f223"; } + +.md-image:before { + content: "\f224"; } + +.md-image-aspect-ratio:before { + content: "\f225"; } + +.md-iso:before { + content: "\f226"; } + +.md-landscape:before { + content: "\f227"; } + +.md-leak-add:before { + content: "\f228"; } + +.md-leak-remove:before { + content: "\f229"; } + +.md-lens:before { + content: "\f22a"; } + +.md-looks:before { + content: "\f22b"; } + +.md-looks-1:before { + content: "\f22c"; } + +.md-looks-2:before { + content: "\f22d"; } + +.md-looks-3:before { + content: "\f22e"; } + +.md-looks-4:before { + content: "\f22f"; } + +.md-looks-5:before { + content: "\f230"; } + +.md-looks-6:before { + content: "\f231"; } + +.md-loupe:before { + content: "\f232"; } + +.md-movie-creation:before { + content: "\f233"; } + +.md-nature:before { + content: "\f234"; } + +.md-nature-people:before { + content: "\f235"; } + +.md-navigate-before:before { + content: "\f236"; } + +.md-navigate-next:before { + content: "\f237"; } + +.md-palette:before { + content: "\f238"; } + +.md-panorama:before { + content: "\f239"; } + +.md-panorama-fisheye:before { + content: "\f23a"; } + +.md-panorama-horizontal:before { + content: "\f23b"; } + +.md-panorama-vertical:before { + content: "\f23c"; } + +.md-panorama-wide-angle:before { + content: "\f23d"; } + +.md-photo:before { + content: "\f23e"; } + +.md-photo-album:before { + content: "\f23f"; } + +.md-photo-camera:before { + content: "\f240"; } + +.md-photo-library:before { + content: "\f241"; } + +.md-portrait:before { + content: "\f242"; } + +.md-remove-red-eye:before { + content: "\f243"; } + +.md-rotate-left:before { + content: "\f244"; } + +.md-rotate-right:before { + content: "\f245"; } + +.md-slideshow:before { + content: "\f246"; } + +.md-straighten:before { + content: "\f247"; } + +.md-style:before { + content: "\f248"; } + +.md-switch-camera:before { + content: "\f249"; } + +.md-switch-video:before { + content: "\f24a"; } + +.md-tag-faces:before { + content: "\f24b"; } + +.md-texture:before { + content: "\f24c"; } + +.md-timelapse:before { + content: "\f24d"; } + +.md-timer:before { + content: "\f24e"; } + +.md-timer-3:before { + content: "\f24f"; } + +.md-timer-10:before { + content: "\f250"; } + +.md-timer-auto:before { + content: "\f251"; } + +.md-timer-off:before { + content: "\f252"; } + +.md-tonality:before { + content: "\f253"; } + +.md-transform:before { + content: "\f254"; } + +.md-tune:before { + content: "\f255"; } + +.md-wb-auto:before { + content: "\f256"; } + +.md-wb-cloudy:before { + content: "\f257"; } + +.md-wb-incandescent:before { + content: "\f258"; } + +.md-wb-irradescent:before { + content: "\f259"; } + +.md-wb-sunny:before { + content: "\f25a"; } + +.md-beenhere:before { + content: "\f25b"; } + +.md-directions:before { + content: "\f25c"; } + +.md-directions-bike:before { + content: "\f25d"; } + +.md-directions-bus:before { + content: "\f25e"; } + +.md-directions-car:before { + content: "\f25f"; } + +.md-directions-ferry:before { + content: "\f260"; } + +.md-directions-subway:before { + content: "\f261"; } + +.md-directions-train:before { + content: "\f262"; } + +.md-directions-transit:before { + content: "\f263"; } + +.md-directions-walk:before { + content: "\f264"; } + +.md-flight:before { + content: "\f265"; } + +.md-hotel:before { + content: "\f266"; } + +.md-layers:before { + content: "\f267"; } + +.md-layers-clear:before { + content: "\f268"; } + +.md-local-airport:before { + content: "\f269"; } + +.md-local-atm:before { + content: "\f26a"; } + +.md-local-attraction:before { + content: "\f26b"; } + +.md-local-bar:before { + content: "\f26c"; } + +.md-local-cafe:before { + content: "\f26d"; } + +.md-local-car-wash:before { + content: "\f26e"; } + +.md-local-convenience-store:before { + content: "\f26f"; } + +.md-local-drink:before { + content: "\f270"; } + +.md-local-florist:before { + content: "\f271"; } + +.md-local-gas-station:before { + content: "\f272"; } + +.md-local-grocery-store:before { + content: "\f273"; } + +.md-local-hospital:before { + content: "\f274"; } + +.md-local-hotel:before { + content: "\f275"; } + +.md-local-laundry-service:before { + content: "\f276"; } + +.md-local-library:before { + content: "\f277"; } + +.md-local-mall:before { + content: "\f278"; } + +.md-local-movies:before { + content: "\f279"; } + +.md-local-offer:before { + content: "\f27a"; } + +.md-local-parking:before { + content: "\f27b"; } + +.md-local-pharmacy:before { + content: "\f27c"; } + +.md-local-phone:before { + content: "\f27d"; } + +.md-local-pizza:before { + content: "\f27e"; } + +.md-local-play:before { + content: "\f27f"; } + +.md-local-post-office:before { + content: "\f280"; } + +.md-local-print-shop:before { + content: "\f281"; } + +.md-local-restaurant:before { + content: "\f282"; } + +.md-local-see:before { + content: "\f283"; } + +.md-local-shipping:before { + content: "\f284"; } + +.md-local-taxi:before { + content: "\f285"; } + +.md-location-history:before { + content: "\f286"; } + +.md-map:before { + content: "\f287"; } + +.md-my-location:before { + content: "\f288"; } + +.md-navigation:before { + content: "\f289"; } + +.md-pin-drop:before { + content: "\f28a"; } + +.md-place:before { + content: "\f28b"; } + +.md-rate-review:before { + content: "\f28c"; } + +.md-restaurant-menu:before { + content: "\f28d"; } + +.md-satellite:before { + content: "\f28e"; } + +.md-store-mall-directory:before { + content: "\f28f"; } + +.md-terrain:before { + content: "\f290"; } + +.md-traffic:before { + content: "\f291"; } + +.md-apps:before { + content: "\f292"; } + +.md-cancel:before { + content: "\f293"; } + +.md-arrow-drop-down-circle:before { + content: "\f294"; } + +.md-arrow-drop-down:before { + content: "\f295"; } + +.md-arrow-drop-up:before { + content: "\f296"; } + +.md-arrow-back:before { + content: "\f297"; } + +.md-arrow-forward:before { + content: "\f298"; } + +.md-check:before { + content: "\f299"; } + +.md-close:before { + content: "\f29a"; } + +.md-chevron-left:before { + content: "\f29b"; } + +.md-chevron-right:before { + content: "\f29c"; } + +.md-expand-less:before { + content: "\f29d"; } + +.md-expand-more:before { + content: "\f29e"; } + +.md-fullscreen:before { + content: "\f29f"; } + +.md-fullscreen-exit:before { + content: "\f2a0"; } + +.md-menu:before { + content: "\f2a1"; } + +.md-more-horiz:before { + content: "\f2a2"; } + +.md-more-vert:before { + content: "\f2a3"; } + +.md-refresh:before { + content: "\f2a4"; } + +.md-unfold-less:before { + content: "\f2a5"; } + +.md-unfold-more:before { + content: "\f2a6"; } + +.md-adb:before { + content: "\f2a7"; } + +.md-bluetooth-audio:before { + content: "\f2a8"; } + +.md-disc-full:before { + content: "\f2a9"; } + +.md-dnd-forwardslash:before { + content: "\f2aa"; } + +.md-do-not-disturb:before { + content: "\f2ab"; } + +.md-drive-eta:before { + content: "\f2ac"; } + +.md-event-available:before { + content: "\f2ad"; } + +.md-event-busy:before { + content: "\f2ae"; } + +.md-event-note:before { + content: "\f2af"; } + +.md-folder-special:before { + content: "\f2b0"; } + +.md-mms:before { + content: "\f2b1"; } + +.md-more:before { + content: "\f2b2"; } + +.md-network-locked:before { + content: "\f2b3"; } + +.md-phone-bluetooth-speaker:before { + content: "\f2b4"; } + +.md-phone-forwarded:before { + content: "\f2b5"; } + +.md-phone-in-talk:before { + content: "\f2b6"; } + +.md-phone-locked:before { + content: "\f2b7"; } + +.md-phone-missed:before { + content: "\f2b8"; } + +.md-phone-paused:before { + content: "\f2b9"; } + +.md-play-download:before { + content: "\f2ba"; } + +.md-play-install:before { + content: "\f2bb"; } + +.md-sd-card:before { + content: "\f2bc"; } + +.md-sim-card-alert:before { + content: "\f2bd"; } + +.md-sms:before { + content: "\f2be"; } + +.md-sms-failed:before { + content: "\f2bf"; } + +.md-sync:before { + content: "\f2c0"; } + +.md-sync-disabled:before { + content: "\f2c1"; } + +.md-sync-problem:before { + content: "\f2c2"; } + +.md-system-update:before { + content: "\f2c3"; } + +.md-tap-and-play:before { + content: "\f2c4"; } + +.md-time-to-leave:before { + content: "\f2c5"; } + +.md-vibration:before { + content: "\f2c6"; } + +.md-voice-chat:before { + content: "\f2c7"; } + +.md-vpn-lock:before { + content: "\f2c8"; } + +.md-cake:before { + content: "\f2c9"; } + +.md-domain:before { + content: "\f2ca"; } + +.md-location-city:before { + content: "\f2cb"; } + +.md-mood:before { + content: "\f2cc"; } + +.md-notifications-none:before { + content: "\f2cd"; } + +.md-notifications:before { + content: "\f2ce"; } + +.md-notifications-off:before { + content: "\f2cf"; } + +.md-notifications-on:before { + content: "\f2d0"; } + +.md-notifications-paused:before { + content: "\f2d1"; } + +.md-pages:before { + content: "\f2d2"; } + +.md-party-mode:before { + content: "\f2d3"; } + +.md-group:before { + content: "\f2d4"; } + +.md-group-add:before { + content: "\f2d5"; } + +.md-people:before { + content: "\f2d6"; } + +.md-people-outline:before { + content: "\f2d7"; } + +.md-person:before { + content: "\f2d8"; } + +.md-person-add:before { + content: "\f2d9"; } + +.md-person-outline:before { + content: "\f2da"; } + +.md-plus-one:before { + content: "\f2db"; } + +.md-poll:before { + content: "\f2dc"; } + +.md-public:before { + content: "\f2dd"; } + +.md-school:before { + content: "\f2de"; } + +.md-share:before { + content: "\f2df"; } + +.md-whatshot:before { + content: "\f2e0"; } + +.md-check-box:before { + content: "\f2e1"; } + +.md-check-box-outline-blank:before { + content: "\f2e2"; } + +.md-radio-button-off:before { + content: "\f2e3"; } + +.md-radio-button-on:before { + content: "\f2e4"; } + +.md-star:before { + content: "\f2e5"; } + +.md-star-half:before { + content: "\f2e6"; } + +.md-star-outline:before { + content: "\f2e7"; } + +@font-face { + font-family: "simple-line-icons"; + src: url("../fonts/Simple-Line-Icons.eot?-i3a2kk"); + src: url("../fonts/Simple-Line-Icons.eot?#iefix-i3a2kk") format("embedded-opentype"), url("../fonts/Simple-Line-Icons.ttf?-i3a2kk") format("truetype"), url("../fonts/Simple-Line-Icons.woff2?-i3a2kk") format("woff2"), url("../fonts/Simple-Line-Icons.woff?-i3a2kk") format("woff"), url("../fonts/Simple-Line-Icons.svg?-i3a2kk#simple-line-icons") format("svg"); + font-weight: normal; + font-style: normal; } +.icon-user, .icon-people, .icon-user-female, .icon-user-follow, .icon-user-following, .icon-user-unfollow, .icon-login, .icon-logout, .icon-emotsmile, .icon-phone, .icon-call-end, .icon-call-in, .icon-call-out, .icon-map, .icon-location-pin, .icon-direction, .icon-directions, .icon-compass, .icon-layers, .icon-menu, .icon-list, .icon-options-vertical, .icon-options, .icon-arrow-down, .icon-arrow-left, .icon-arrow-right, .icon-arrow-up, .icon-arrow-up-circle, .icon-arrow-left-circle, .icon-arrow-right-circle, .icon-arrow-down-circle, .icon-check, .icon-clock, .icon-plus, .icon-close, .icon-trophy, .icon-screen-smartphone, .icon-screen-desktop, .icon-plane, .icon-notebook, .icon-mustache, .icon-mouse, .icon-magnet, .icon-energy, .icon-disc, .icon-cursor, .icon-cursor-move, .icon-crop, .icon-chemistry, .icon-speedometer, .icon-shield, .icon-screen-tablet, .icon-magic-wand, .icon-hourglass, .icon-graduation, .icon-ghost, .icon-game-controller, .icon-fire, .icon-eyeglass, .icon-envelope-open, .icon-envelope-letter, .icon-bell, .icon-badge, .icon-anchor, .icon-wallet, .icon-vector, .icon-speech, .icon-puzzle, .icon-printer, .icon-present, .icon-playlist, .icon-pin, .icon-picture, .icon-handbag, .icon-globe-alt, .icon-globe, .icon-folder-alt, .icon-folder, .icon-film, .icon-feed, .icon-drop, .icon-drawar, .icon-docs, .icon-doc, .icon-diamond, .icon-cup, .icon-calculator, .icon-bubbles, .icon-briefcase, .icon-book-open, .icon-basket-loaded, .icon-basket, .icon-bag, .icon-action-undo, .icon-action-redo, .icon-wrench, .icon-umbrella, .icon-trash, .icon-tag, .icon-support, .icon-frame, .icon-size-fullscreen, .icon-size-actual, .icon-shuffle, .icon-share-alt, .icon-share, .icon-rocket, .icon-question, .icon-pie-chart, .icon-pencil, .icon-note, .icon-loop, .icon-home, .icon-grid, .icon-graph, .icon-microphone, .icon-music-tone-alt, .icon-music-tone, .icon-earphones-alt, .icon-earphones, .icon-equalizer, .icon-like, .icon-dislike, .icon-control-start, .icon-control-rewind, .icon-control-play, .icon-control-pause, .icon-control-forward, .icon-control-end, .icon-volume-1, .icon-volume-2, .icon-volume-off, .icon-calender, .icon-bulb, .icon-chart, .icon-ban, .icon-bubble, .icon-camrecorder, .icon-camera, .icon-cloud-download, .icon-cloud-upload, .icon-envelope, .icon-eye, .icon-flag, .icon-heart, .icon-info, .icon-key, .icon-link, .icon-lock, .icon-lock-open, .icon-magnifier, .icon-magnifier-add, .icon-magnifier-remove, .icon-paper-clip, .icon-paper-plane, .icon-power, .icon-refresh, .icon-reload, .icon-settings, .icon-star, .icon-symble-female, .icon-symbol-male, .icon-target, .icon-credit-card, .icon-paypal, .icon-social-tumblr, .icon-social-twitter, .icon-social-facebook, .icon-social-instagram, .icon-social-linkedin, .icon-social-pintarest, .icon-social-github, .icon-social-gplus, .icon-social-reddit, .icon-social-skype, .icon-social-dribbble, .icon-social-behance, .icon-social-foursqare, .icon-social-soundcloud, .icon-social-spotify, .icon-social-stumbleupon, .icon-social-youtube, .icon-social-dropbox { + font-family: "simple-line-icons"; + speak: none; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + /* Better Font Rendering =========== */ + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; } + +.icon-user:before { + content: "\e005"; } + +.icon-people:before { + content: "\e001"; } + +.icon-user-female:before { + content: "\e000"; } + +.icon-user-follow:before { + content: "\e002"; } + +.icon-user-following:before { + content: "\e003"; } + +.icon-user-unfollow:before { + content: "\e004"; } + +.icon-login:before { + content: "\e066"; } + +.icon-logout:before { + content: "\e065"; } + +.icon-emotsmile:before { + content: "\e021"; } + +.icon-phone:before { + content: "\e600"; } + +.icon-call-end:before { + content: "\e048"; } + +.icon-call-in:before { + content: "\e047"; } + +.icon-call-out:before { + content: "\e046"; } + +.icon-map:before { + content: "\e033"; } + +.icon-location-pin:before { + content: "\e096"; } + +.icon-direction:before { + content: "\e042"; } + +.icon-directions:before { + content: "\e041"; } + +.icon-compass:before { + content: "\e045"; } + +.icon-layers:before { + content: "\e034"; } + +.icon-menu:before { + content: "\e601"; } + +.icon-list:before { + content: "\e067"; } + +.icon-options-vertical:before { + content: "\e602"; } + +.icon-options:before { + content: "\e603"; } + +.icon-arrow-down:before { + content: "\e604"; } + +.icon-arrow-left:before { + content: "\e605"; } + +.icon-arrow-right:before { + content: "\e606"; } + +.icon-arrow-up:before { + content: "\e607"; } + +.icon-arrow-up-circle:before { + content: "\e078"; } + +.icon-arrow-left-circle:before { + content: "\e07a"; } + +.icon-arrow-right-circle:before { + content: "\e079"; } + +.icon-arrow-down-circle:before { + content: "\e07b"; } + +.icon-check:before { + content: "\e080"; } + +.icon-clock:before { + content: "\e081"; } + +.icon-plus:before { + content: "\e095"; } + +.icon-close:before { + content: "\e082"; } + +.icon-trophy:before { + content: "\e006"; } + +.icon-screen-smartphone:before { + content: "\e010"; } + +.icon-screen-desktop:before { + content: "\e011"; } + +.icon-plane:before { + content: "\e012"; } + +.icon-notebook:before { + content: "\e013"; } + +.icon-mustache:before { + content: "\e014"; } + +.icon-mouse:before { + content: "\e015"; } + +.icon-magnet:before { + content: "\e016"; } + +.icon-energy:before { + content: "\e020"; } + +.icon-disc:before { + content: "\e022"; } + +.icon-cursor:before { + content: "\e06e"; } + +.icon-cursor-move:before { + content: "\e023"; } + +.icon-crop:before { + content: "\e024"; } + +.icon-chemistry:before { + content: "\e026"; } + +.icon-speedometer:before { + content: "\e007"; } + +.icon-shield:before { + content: "\e00e"; } + +.icon-screen-tablet:before { + content: "\e00f"; } + +.icon-magic-wand:before { + content: "\e017"; } + +.icon-hourglass:before { + content: "\e018"; } + +.icon-graduation:before { + content: "\e019"; } + +.icon-ghost:before { + content: "\e01a"; } + +.icon-game-controller:before { + content: "\e01b"; } + +.icon-fire:before { + content: "\e01c"; } + +.icon-eyeglass:before { + content: "\e01d"; } + +.icon-envelope-open:before { + content: "\e01e"; } + +.icon-envelope-letter:before { + content: "\e01f"; } + +.icon-bell:before { + content: "\e027"; } + +.icon-badge:before { + content: "\e028"; } + +.icon-anchor:before { + content: "\e029"; } + +.icon-wallet:before { + content: "\e02a"; } + +.icon-vector:before { + content: "\e02b"; } + +.icon-speech:before { + content: "\e02c"; } + +.icon-puzzle:before { + content: "\e02d"; } + +.icon-printer:before { + content: "\e02e"; } + +.icon-present:before { + content: "\e02f"; } + +.icon-playlist:before { + content: "\e030"; } + +.icon-pin:before { + content: "\e031"; } + +.icon-picture:before { + content: "\e032"; } + +.icon-handbag:before { + content: "\e035"; } + +.icon-globe-alt:before { + content: "\e036"; } + +.icon-globe:before { + content: "\e037"; } + +.icon-folder-alt:before { + content: "\e039"; } + +.icon-folder:before { + content: "\e089"; } + +.icon-film:before { + content: "\e03a"; } + +.icon-feed:before { + content: "\e03b"; } + +.icon-drop:before { + content: "\e03e"; } + +.icon-drawar:before { + content: "\e03f"; } + +.icon-docs:before { + content: "\e040"; } + +.icon-doc:before { + content: "\e085"; } + +.icon-diamond:before { + content: "\e043"; } + +.icon-cup:before { + content: "\e044"; } + +.icon-calculator:before { + content: "\e049"; } + +.icon-bubbles:before { + content: "\e04a"; } + +.icon-briefcase:before { + content: "\e04b"; } + +.icon-book-open:before { + content: "\e04c"; } + +.icon-basket-loaded:before { + content: "\e04d"; } + +.icon-basket:before { + content: "\e04e"; } + +.icon-bag:before { + content: "\e04f"; } + +.icon-action-undo:before { + content: "\e050"; } + +.icon-action-redo:before { + content: "\e051"; } + +.icon-wrench:before { + content: "\e052"; } + +.icon-umbrella:before { + content: "\e053"; } + +.icon-trash:before { + content: "\e054"; } + +.icon-tag:before { + content: "\e055"; } + +.icon-support:before { + content: "\e056"; } + +.icon-frame:before { + content: "\e038"; } + +.icon-size-fullscreen:before { + content: "\e057"; } + +.icon-size-actual:before { + content: "\e058"; } + +.icon-shuffle:before { + content: "\e059"; } + +.icon-share-alt:before { + content: "\e05a"; } + +.icon-share:before { + content: "\e05b"; } + +.icon-rocket:before { + content: "\e05c"; } + +.icon-question:before { + content: "\e05d"; } + +.icon-pie-chart:before { + content: "\e05e"; } + +.icon-pencil:before { + content: "\e05f"; } + +.icon-note:before { + content: "\e060"; } + +.icon-loop:before { + content: "\e064"; } + +.icon-home:before { + content: "\e069"; } + +.icon-grid:before { + content: "\e06a"; } + +.icon-graph:before { + content: "\e06b"; } + +.icon-microphone:before { + content: "\e063"; } + +.icon-music-tone-alt:before { + content: "\e061"; } + +.icon-music-tone:before { + content: "\e062"; } + +.icon-earphones-alt:before { + content: "\e03c"; } + +.icon-earphones:before { + content: "\e03d"; } + +.icon-equalizer:before { + content: "\e06c"; } + +.icon-like:before { + content: "\e068"; } + +.icon-dislike:before { + content: "\e06d"; } + +.icon-control-start:before { + content: "\e06f"; } + +.icon-control-rewind:before { + content: "\e070"; } + +.icon-control-play:before { + content: "\e071"; } + +.icon-control-pause:before { + content: "\e072"; } + +.icon-control-forward:before { + content: "\e073"; } + +.icon-control-end:before { + content: "\e074"; } + +.icon-volume-1:before { + content: "\e09f"; } + +.icon-volume-2:before { + content: "\e0a0"; } + +.icon-volume-off:before { + content: "\e0a1"; } + +.icon-calender:before { + content: "\e075"; } + +.icon-bulb:before { + content: "\e076"; } + +.icon-chart:before { + content: "\e077"; } + +.icon-ban:before { + content: "\e07c"; } + +.icon-bubble:before { + content: "\e07d"; } + +.icon-camrecorder:before { + content: "\e07e"; } + +.icon-camera:before { + content: "\e07f"; } + +.icon-cloud-download:before { + content: "\e083"; } + +.icon-cloud-upload:before { + content: "\e084"; } + +.icon-envelope:before { + content: "\e086"; } + +.icon-eye:before { + content: "\e087"; } + +.icon-flag:before { + content: "\e088"; } + +.icon-heart:before { + content: "\e08a"; } + +.icon-info:before { + content: "\e08b"; } + +.icon-key:before { + content: "\e08c"; } + +.icon-link:before { + content: "\e08d"; } + +.icon-lock:before { + content: "\e08e"; } + +.icon-lock-open:before { + content: "\e08f"; } + +.icon-magnifier:before { + content: "\e090"; } + +.icon-magnifier-add:before { + content: "\e091"; } + +.icon-magnifier-remove:before { + content: "\e092"; } + +.icon-paper-clip:before { + content: "\e093"; } + +.icon-paper-plane:before { + content: "\e094"; } + +.icon-power:before { + content: "\e097"; } + +.icon-refresh:before { + content: "\e098"; } + +.icon-reload:before { + content: "\e099"; } + +.icon-settings:before { + content: "\e09a"; } + +.icon-star:before { + content: "\e09b"; } + +.icon-symble-female:before { + content: "\e09c"; } + +.icon-symbol-male:before { + content: "\e09d"; } + +.icon-target:before { + content: "\e09e"; } + +.icon-credit-card:before { + content: "\e025"; } + +.icon-paypal:before { + content: "\e608"; } + +.icon-social-tumblr:before { + content: "\e00a"; } + +.icon-social-twitter:before { + content: "\e009"; } + +.icon-social-facebook:before { + content: "\e00b"; } + +.icon-social-instagram:before { + content: "\e609"; } + +.icon-social-linkedin:before { + content: "\e60a"; } + +.icon-social-pintarest:before { + content: "\e60b"; } + +.icon-social-github:before { + content: "\e60c"; } + +.icon-social-gplus:before { + content: "\e60d"; } + +.icon-social-reddit:before { + content: "\e60e"; } + +.icon-social-skype:before { + content: "\e60f"; } + +.icon-social-dribbble:before { + content: "\e00d"; } + +.icon-social-behance:before { + content: "\e610"; } + +.icon-social-foursqare:before { + content: "\e611"; } + +.icon-social-soundcloud:before { + content: "\e612"; } + +.icon-social-spotify:before { + content: "\e613"; } + +.icon-social-stumbleupon:before { + content: "\e614"; } + +.icon-social-youtube:before { + content: "\e008"; } + +.icon-social-dropbox:before { + content: "\e00c"; } + +/*! + Ionicons, v1.5.0 + Created by Ben Sperry for the Ionic Framework, http://ionicons.com/ + https://twitter.com/benjsperry https://twitter.com/ionicframework + MIT License: https://github.com/driftyco/ionicons +*/ +@font-face { + font-family: "Ionicons"; + src: url("../fonts/ionicons.eot?v=1.5.0"); + src: url("../fonts/ionicons.eot?v=1.5.0#iefix") format("embedded-opentype"), url("../fonts/ionicons.ttf?v=1.5.0") format("truetype"), url("../fonts/ionicons.woff?v=1.5.0") format("woff"), url("../fonts/ionicons.svg?v=1.5.0#Ionicons") format("svg"); + font-weight: normal; + font-style: normal; } +.ion, .ion-loading-a, +.ion-loading-b, +.ion-loading-c, +.ion-loading-d, +.ion-looping, +.ion-refreshing, +.ion-ios7-reloading, .ionicons, +.ion-alert, +.ion-alert-circled, +.ion-android-add, +.ion-android-add-contact, +.ion-android-alarm, +.ion-android-archive, +.ion-android-arrow-back, +.ion-android-arrow-down-left, +.ion-android-arrow-down-right, +.ion-android-arrow-forward, +.ion-android-arrow-up-left, +.ion-android-arrow-up-right, +.ion-android-battery, +.ion-android-book, +.ion-android-calendar, +.ion-android-call, +.ion-android-camera, +.ion-android-chat, +.ion-android-checkmark, +.ion-android-clock, +.ion-android-close, +.ion-android-contact, +.ion-android-contacts, +.ion-android-data, +.ion-android-developer, +.ion-android-display, +.ion-android-download, +.ion-android-drawer, +.ion-android-dropdown, +.ion-android-earth, +.ion-android-folder, +.ion-android-forums, +.ion-android-friends, +.ion-android-hand, +.ion-android-image, +.ion-android-inbox, +.ion-android-information, +.ion-android-keypad, +.ion-android-lightbulb, +.ion-android-locate, +.ion-android-location, +.ion-android-mail, +.ion-android-microphone, +.ion-android-mixer, +.ion-android-more, +.ion-android-note, +.ion-android-playstore, +.ion-android-printer, +.ion-android-promotion, +.ion-android-reminder, +.ion-android-remove, +.ion-android-search, +.ion-android-send, +.ion-android-settings, +.ion-android-share, +.ion-android-social, +.ion-android-social-user, +.ion-android-sort, +.ion-android-stair-drawer, +.ion-android-star, +.ion-android-stopwatch, +.ion-android-storage, +.ion-android-system-back, +.ion-android-system-home, +.ion-android-system-windows, +.ion-android-timer, +.ion-android-trash, +.ion-android-user-menu, +.ion-android-volume, +.ion-android-wifi, +.ion-aperture, +.ion-archive, +.ion-arrow-down-a, +.ion-arrow-down-b, +.ion-arrow-down-c, +.ion-arrow-expand, +.ion-arrow-graph-down-left, +.ion-arrow-graph-down-right, +.ion-arrow-graph-up-left, +.ion-arrow-graph-up-right, +.ion-arrow-left-a, +.ion-arrow-left-b, +.ion-arrow-left-c, +.ion-arrow-move, +.ion-arrow-resize, +.ion-arrow-return-left, +.ion-arrow-return-right, +.ion-arrow-right-a, +.ion-arrow-right-b, +.ion-arrow-right-c, +.ion-arrow-shrink, +.ion-arrow-swap, +.ion-arrow-up-a, +.ion-arrow-up-b, +.ion-arrow-up-c, +.ion-asterisk, +.ion-at, +.ion-bag, +.ion-battery-charging, +.ion-battery-empty, +.ion-battery-full, +.ion-battery-half, +.ion-battery-low, +.ion-beaker, +.ion-beer, +.ion-bluetooth, +.ion-bonfire, +.ion-bookmark, +.ion-briefcase, +.ion-bug, +.ion-calculator, +.ion-calendar, +.ion-camera, +.ion-card, +.ion-cash, +.ion-chatbox, +.ion-chatbox-working, +.ion-chatboxes, +.ion-chatbubble, +.ion-chatbubble-working, +.ion-chatbubbles, +.ion-checkmark, +.ion-checkmark-circled, +.ion-checkmark-round, +.ion-chevron-down, +.ion-chevron-left, +.ion-chevron-right, +.ion-chevron-up, +.ion-clipboard, +.ion-clock, +.ion-close, +.ion-close-circled, +.ion-close-round, +.ion-closed-captioning, +.ion-cloud, +.ion-code, +.ion-code-download, +.ion-code-working, +.ion-coffee, +.ion-compass, +.ion-compose, +.ion-connection-bars, +.ion-contrast, +.ion-cube, +.ion-disc, +.ion-document, +.ion-document-text, +.ion-drag, +.ion-earth, +.ion-edit, +.ion-egg, +.ion-eject, +.ion-email, +.ion-eye, +.ion-eye-disabled, +.ion-female, +.ion-filing, +.ion-film-marker, +.ion-fireball, +.ion-flag, +.ion-flame, +.ion-flash, +.ion-flash-off, +.ion-flask, +.ion-folder, +.ion-fork, +.ion-fork-repo, +.ion-forward, +.ion-funnel, +.ion-game-controller-a, +.ion-game-controller-b, +.ion-gear-a, +.ion-gear-b, +.ion-grid, +.ion-hammer, +.ion-happy, +.ion-headphone, +.ion-heart, +.ion-heart-broken, +.ion-help, +.ion-help-buoy, +.ion-help-circled, +.ion-home, +.ion-icecream, +.ion-icon-social-google-plus, +.ion-icon-social-google-plus-outline, +.ion-image, +.ion-images, +.ion-information, +.ion-information-circled, +.ion-ionic, +.ion-ios7-alarm, +.ion-ios7-alarm-outline, +.ion-ios7-albums, +.ion-ios7-albums-outline, +.ion-ios7-americanfootball, +.ion-ios7-americanfootball-outline, +.ion-ios7-analytics, +.ion-ios7-analytics-outline, +.ion-ios7-arrow-back, +.ion-ios7-arrow-down, +.ion-ios7-arrow-forward, +.ion-ios7-arrow-left, +.ion-ios7-arrow-right, +.ion-ios7-arrow-thin-down, +.ion-ios7-arrow-thin-left, +.ion-ios7-arrow-thin-right, +.ion-ios7-arrow-thin-up, +.ion-ios7-arrow-up, +.ion-ios7-at, +.ion-ios7-at-outline, +.ion-ios7-barcode, +.ion-ios7-barcode-outline, +.ion-ios7-baseball, +.ion-ios7-baseball-outline, +.ion-ios7-basketball, +.ion-ios7-basketball-outline, +.ion-ios7-bell, +.ion-ios7-bell-outline, +.ion-ios7-bolt, +.ion-ios7-bolt-outline, +.ion-ios7-bookmarks, +.ion-ios7-bookmarks-outline, +.ion-ios7-box, +.ion-ios7-box-outline, +.ion-ios7-briefcase, +.ion-ios7-briefcase-outline, +.ion-ios7-browsers, +.ion-ios7-browsers-outline, +.ion-ios7-calculator, +.ion-ios7-calculator-outline, +.ion-ios7-calendar, +.ion-ios7-calendar-outline, +.ion-ios7-camera, +.ion-ios7-camera-outline, +.ion-ios7-cart, +.ion-ios7-cart-outline, +.ion-ios7-chatboxes, +.ion-ios7-chatboxes-outline, +.ion-ios7-chatbubble, +.ion-ios7-chatbubble-outline, +.ion-ios7-checkmark, +.ion-ios7-checkmark-empty, +.ion-ios7-checkmark-outline, +.ion-ios7-circle-filled, +.ion-ios7-circle-outline, +.ion-ios7-clock, +.ion-ios7-clock-outline, +.ion-ios7-close, +.ion-ios7-close-empty, +.ion-ios7-close-outline, +.ion-ios7-cloud, +.ion-ios7-cloud-download, +.ion-ios7-cloud-download-outline, +.ion-ios7-cloud-outline, +.ion-ios7-cloud-upload, +.ion-ios7-cloud-upload-outline, +.ion-ios7-cloudy, +.ion-ios7-cloudy-night, +.ion-ios7-cloudy-night-outline, +.ion-ios7-cloudy-outline, +.ion-ios7-cog, +.ion-ios7-cog-outline, +.ion-ios7-compose, +.ion-ios7-compose-outline, +.ion-ios7-contact, +.ion-ios7-contact-outline, +.ion-ios7-copy, +.ion-ios7-copy-outline, +.ion-ios7-download, +.ion-ios7-download-outline, +.ion-ios7-drag, +.ion-ios7-email, +.ion-ios7-email-outline, +.ion-ios7-expand, +.ion-ios7-eye, +.ion-ios7-eye-outline, +.ion-ios7-fastforward, +.ion-ios7-fastforward-outline, +.ion-ios7-filing, +.ion-ios7-filing-outline, +.ion-ios7-film, +.ion-ios7-film-outline, +.ion-ios7-flag, +.ion-ios7-flag-outline, +.ion-ios7-folder, +.ion-ios7-folder-outline, +.ion-ios7-football, +.ion-ios7-football-outline, +.ion-ios7-gear, +.ion-ios7-gear-outline, +.ion-ios7-glasses, +.ion-ios7-glasses-outline, +.ion-ios7-heart, +.ion-ios7-heart-outline, +.ion-ios7-help, +.ion-ios7-help-empty, +.ion-ios7-help-outline, +.ion-ios7-home, +.ion-ios7-home-outline, +.ion-ios7-infinite, +.ion-ios7-infinite-outline, +.ion-ios7-information, +.ion-ios7-information-empty, +.ion-ios7-information-outline, +.ion-ios7-ionic-outline, +.ion-ios7-keypad, +.ion-ios7-keypad-outline, +.ion-ios7-lightbulb, +.ion-ios7-lightbulb-outline, +.ion-ios7-location, +.ion-ios7-location-outline, +.ion-ios7-locked, +.ion-ios7-locked-outline, +.ion-ios7-loop, +.ion-ios7-loop-strong, +.ion-ios7-medkit, +.ion-ios7-medkit-outline, +.ion-ios7-mic, +.ion-ios7-mic-off, +.ion-ios7-mic-outline, +.ion-ios7-minus, +.ion-ios7-minus-empty, +.ion-ios7-minus-outline, +.ion-ios7-monitor, +.ion-ios7-monitor-outline, +.ion-ios7-moon, +.ion-ios7-moon-outline, +.ion-ios7-more, +.ion-ios7-more-outline, +.ion-ios7-musical-note, +.ion-ios7-musical-notes, +.ion-ios7-navigate, +.ion-ios7-navigate-outline, +.ion-ios7-paper, +.ion-ios7-paper-outline, +.ion-ios7-paperplane, +.ion-ios7-paperplane-outline, +.ion-ios7-partlysunny, +.ion-ios7-partlysunny-outline, +.ion-ios7-pause, +.ion-ios7-pause-outline, +.ion-ios7-paw, +.ion-ios7-paw-outline, +.ion-ios7-people, +.ion-ios7-people-outline, +.ion-ios7-person, +.ion-ios7-person-outline, +.ion-ios7-personadd, +.ion-ios7-personadd-outline, +.ion-ios7-photos, +.ion-ios7-photos-outline, +.ion-ios7-pie, +.ion-ios7-pie-outline, +.ion-ios7-play, +.ion-ios7-play-outline, +.ion-ios7-plus, +.ion-ios7-plus-empty, +.ion-ios7-plus-outline, +.ion-ios7-pricetag, +.ion-ios7-pricetag-outline, +.ion-ios7-pricetags, +.ion-ios7-pricetags-outline, +.ion-ios7-printer, +.ion-ios7-printer-outline, +.ion-ios7-pulse, +.ion-ios7-pulse-strong, +.ion-ios7-rainy, +.ion-ios7-rainy-outline, +.ion-ios7-recording, +.ion-ios7-recording-outline, +.ion-ios7-redo, +.ion-ios7-redo-outline, +.ion-ios7-refresh, +.ion-ios7-refresh-empty, +.ion-ios7-refresh-outline, +.ion-ios7-reload, +.ion-ios7-reverse-camera, +.ion-ios7-reverse-camera-outline, +.ion-ios7-rewind, +.ion-ios7-rewind-outline, +.ion-ios7-search, +.ion-ios7-search-strong, +.ion-ios7-settings, +.ion-ios7-settings-strong, +.ion-ios7-shrink, +.ion-ios7-skipbackward, +.ion-ios7-skipbackward-outline, +.ion-ios7-skipforward, +.ion-ios7-skipforward-outline, +.ion-ios7-snowy, +.ion-ios7-speedometer, +.ion-ios7-speedometer-outline, +.ion-ios7-star, +.ion-ios7-star-half, +.ion-ios7-star-outline, +.ion-ios7-stopwatch, +.ion-ios7-stopwatch-outline, +.ion-ios7-sunny, +.ion-ios7-sunny-outline, +.ion-ios7-telephone, +.ion-ios7-telephone-outline, +.ion-ios7-tennisball, +.ion-ios7-tennisball-outline, +.ion-ios7-thunderstorm, +.ion-ios7-thunderstorm-outline, +.ion-ios7-time, +.ion-ios7-time-outline, +.ion-ios7-timer, +.ion-ios7-timer-outline, +.ion-ios7-toggle, +.ion-ios7-toggle-outline, +.ion-ios7-trash, +.ion-ios7-trash-outline, +.ion-ios7-undo, +.ion-ios7-undo-outline, +.ion-ios7-unlocked, +.ion-ios7-unlocked-outline, +.ion-ios7-upload, +.ion-ios7-upload-outline, +.ion-ios7-videocam, +.ion-ios7-videocam-outline, +.ion-ios7-volume-high, +.ion-ios7-volume-low, +.ion-ios7-wineglass, +.ion-ios7-wineglass-outline, +.ion-ios7-world, +.ion-ios7-world-outline, +.ion-ipad, +.ion-iphone, +.ion-ipod, +.ion-jet, +.ion-key, +.ion-knife, +.ion-laptop, +.ion-leaf, +.ion-levels, +.ion-lightbulb, +.ion-link, +.ion-load-a, +.ion-load-b, +.ion-load-c, +.ion-load-d, +.ion-location, +.ion-locked, +.ion-log-in, +.ion-log-out, +.ion-loop, +.ion-magnet, +.ion-male, +.ion-man, +.ion-map, +.ion-medkit, +.ion-merge, +.ion-mic-a, +.ion-mic-b, +.ion-mic-c, +.ion-minus, +.ion-minus-circled, +.ion-minus-round, +.ion-model-s, +.ion-monitor, +.ion-more, +.ion-mouse, +.ion-music-note, +.ion-navicon, +.ion-navicon-round, +.ion-navigate, +.ion-network, +.ion-no-smoking, +.ion-nuclear, +.ion-outlet, +.ion-paper-airplane, +.ion-paperclip, +.ion-pause, +.ion-person, +.ion-person-add, +.ion-person-stalker, +.ion-pie-graph, +.ion-pin, +.ion-pinpoint, +.ion-pizza, +.ion-plane, +.ion-planet, +.ion-play, +.ion-playstation, +.ion-plus, +.ion-plus-circled, +.ion-plus-round, +.ion-podium, +.ion-pound, +.ion-power, +.ion-pricetag, +.ion-pricetags, +.ion-printer, +.ion-pull-request, +.ion-qr-scanner, +.ion-quote, +.ion-radio-waves, +.ion-record, +.ion-refresh, +.ion-reply, +.ion-reply-all, +.ion-ribbon-a, +.ion-ribbon-b, +.ion-sad, +.ion-scissors, +.ion-search, +.ion-settings, +.ion-share, +.ion-shuffle, +.ion-skip-backward, +.ion-skip-forward, +.ion-social-android, +.ion-social-android-outline, +.ion-social-apple, +.ion-social-apple-outline, +.ion-social-bitcoin, +.ion-social-bitcoin-outline, +.ion-social-buffer, +.ion-social-buffer-outline, +.ion-social-designernews, +.ion-social-designernews-outline, +.ion-social-dribbble, +.ion-social-dribbble-outline, +.ion-social-dropbox, +.ion-social-dropbox-outline, +.ion-social-facebook, +.ion-social-facebook-outline, +.ion-social-foursquare, +.ion-social-foursquare-outline, +.ion-social-freebsd-devil, +.ion-social-github, +.ion-social-github-outline, +.ion-social-google, +.ion-social-google-outline, +.ion-social-googleplus, +.ion-social-googleplus-outline, +.ion-social-hackernews, +.ion-social-hackernews-outline, +.ion-social-instagram, +.ion-social-instagram-outline, +.ion-social-linkedin, +.ion-social-linkedin-outline, +.ion-social-pinterest, +.ion-social-pinterest-outline, +.ion-social-reddit, +.ion-social-reddit-outline, +.ion-social-rss, +.ion-social-rss-outline, +.ion-social-skype, +.ion-social-skype-outline, +.ion-social-tumblr, +.ion-social-tumblr-outline, +.ion-social-tux, +.ion-social-twitter, +.ion-social-twitter-outline, +.ion-social-usd, +.ion-social-usd-outline, +.ion-social-vimeo, +.ion-social-vimeo-outline, +.ion-social-windows, +.ion-social-windows-outline, +.ion-social-wordpress, +.ion-social-wordpress-outline, +.ion-social-yahoo, +.ion-social-yahoo-outline, +.ion-social-youtube, +.ion-social-youtube-outline, +.ion-speakerphone, +.ion-speedometer, +.ion-spoon, +.ion-star, +.ion-stats-bars, +.ion-steam, +.ion-stop, +.ion-thermometer, +.ion-thumbsdown, +.ion-thumbsup, +.ion-toggle, +.ion-toggle-filled, +.ion-trash-a, +.ion-trash-b, +.ion-trophy, +.ion-umbrella, +.ion-university, +.ion-unlocked, +.ion-upload, +.ion-usb, +.ion-videocamera, +.ion-volume-high, +.ion-volume-low, +.ion-volume-medium, +.ion-volume-mute, +.ion-wand, +.ion-waterdrop, +.ion-wifi, +.ion-wineglass, +.ion-woman, +.ion-wrench, +.ion-xbox { + display: inline-block; + font-family: "Ionicons"; + speak: none; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + text-rendering: auto; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; } + +.ion-spin, .ion-loading-a, +.ion-loading-b, +.ion-loading-c, +.ion-loading-d, +.ion-looping, +.ion-refreshing, +.ion-ios7-reloading { + -webkit-animation: spin 1s infinite linear; + -moz-animation: spin 1s infinite linear; + -o-animation: spin 1s infinite linear; + animation: spin 1s infinite linear; } + +@-moz-keyframes spin { + 0% { + -moz-transform: rotate(0deg); } + 100% { + -moz-transform: rotate(359deg); } } +@-webkit-keyframes spin { + 0% { + -webkit-transform: rotate(0deg); } + 100% { + -webkit-transform: rotate(359deg); } } +@-o-keyframes spin { + 0% { + -o-transform: rotate(0deg); } + 100% { + -o-transform: rotate(359deg); } } +@-ms-keyframes spin { + 0% { + -ms-transform: rotate(0deg); } + 100% { + -ms-transform: rotate(359deg); } } +@keyframes spin { + 0% { + transform: rotate(0deg); } + 100% { + transform: rotate(359deg); } } +.ion-loading-a { + -webkit-animation-timing-function: steps(8, start); + -moz-animation-timing-function: steps(8, start); + animation-timing-function: steps(8, start); } + +.ion-alert:before { + content: ""; } + +.ion-alert-circled:before { + content: ""; } + +.ion-android-add:before { + content: ""; } + +.ion-android-add-contact:before { + content: ""; } + +.ion-android-alarm:before { + content: ""; } + +.ion-android-archive:before { + content: ""; } + +.ion-android-arrow-back:before { + content: ""; } + +.ion-android-arrow-down-left:before { + content: ""; } + +.ion-android-arrow-down-right:before { + content: ""; } + +.ion-android-arrow-forward:before { + content: ""; } + +.ion-android-arrow-up-left:before { + content: ""; } + +.ion-android-arrow-up-right:before { + content: ""; } + +.ion-android-battery:before { + content: ""; } + +.ion-android-book:before { + content: ""; } + +.ion-android-calendar:before { + content: ""; } + +.ion-android-call:before { + content: ""; } + +.ion-android-camera:before { + content: ""; } + +.ion-android-chat:before { + content: ""; } + +.ion-android-checkmark:before { + content: ""; } + +.ion-android-clock:before { + content: ""; } + +.ion-android-close:before { + content: ""; } + +.ion-android-contact:before { + content: ""; } + +.ion-android-contacts:before { + content: ""; } + +.ion-android-data:before { + content: ""; } + +.ion-android-developer:before { + content: ""; } + +.ion-android-display:before { + content: ""; } + +.ion-android-download:before { + content: ""; } + +.ion-android-drawer:before { + content: ""; } + +.ion-android-dropdown:before { + content: ""; } + +.ion-android-earth:before { + content: ""; } + +.ion-android-folder:before { + content: ""; } + +.ion-android-forums:before { + content: ""; } + +.ion-android-friends:before { + content: ""; } + +.ion-android-hand:before { + content: ""; } + +.ion-android-image:before { + content: ""; } + +.ion-android-inbox:before { + content: ""; } + +.ion-android-information:before { + content: ""; } + +.ion-android-keypad:before { + content: ""; } + +.ion-android-lightbulb:before { + content: ""; } + +.ion-android-locate:before { + content: ""; } + +.ion-android-location:before { + content: ""; } + +.ion-android-mail:before { + content: ""; } + +.ion-android-microphone:before { + content: ""; } + +.ion-android-mixer:before { + content: ""; } + +.ion-android-more:before { + content: ""; } + +.ion-android-note:before { + content: ""; } + +.ion-android-playstore:before { + content: ""; } + +.ion-android-printer:before { + content: ""; } + +.ion-android-promotion:before { + content: ""; } + +.ion-android-reminder:before { + content: ""; } + +.ion-android-remove:before { + content: ""; } + +.ion-android-search:before { + content: ""; } + +.ion-android-send:before { + content: ""; } + +.ion-android-settings:before { + content: ""; } + +.ion-android-share:before { + content: ""; } + +.ion-android-social:before { + content: ""; } + +.ion-android-social-user:before { + content: ""; } + +.ion-android-sort:before { + content: ""; } + +.ion-android-stair-drawer:before { + content: ""; } + +.ion-android-star:before { + content: ""; } + +.ion-android-stopwatch:before { + content: ""; } + +.ion-android-storage:before { + content: ""; } + +.ion-android-system-back:before { + content: ""; } + +.ion-android-system-home:before { + content: ""; } + +.ion-android-system-windows:before { + content: ""; } + +.ion-android-timer:before { + content: ""; } + +.ion-android-trash:before { + content: ""; } + +.ion-android-user-menu:before { + content: ""; } + +.ion-android-volume:before { + content: ""; } + +.ion-android-wifi:before { + content: ""; } + +.ion-aperture:before { + content: ""; } + +.ion-archive:before { + content: ""; } + +.ion-arrow-down-a:before { + content: ""; } + +.ion-arrow-down-b:before { + content: ""; } + +.ion-arrow-down-c:before { + content: ""; } + +.ion-arrow-expand:before { + content: ""; } + +.ion-arrow-graph-down-left:before { + content: ""; } + +.ion-arrow-graph-down-right:before { + content: ""; } + +.ion-arrow-graph-up-left:before { + content: ""; } + +.ion-arrow-graph-up-right:before { + content: ""; } + +.ion-arrow-left-a:before { + content: ""; } + +.ion-arrow-left-b:before { + content: ""; } + +.ion-arrow-left-c:before { + content: ""; } + +.ion-arrow-move:before { + content: ""; } + +.ion-arrow-resize:before { + content: ""; } + +.ion-arrow-return-left:before { + content: ""; } + +.ion-arrow-return-right:before { + content: ""; } + +.ion-arrow-right-a:before { + content: ""; } + +.ion-arrow-right-b:before { + content: ""; } + +.ion-arrow-right-c:before { + content: ""; } + +.ion-arrow-shrink:before { + content: ""; } + +.ion-arrow-swap:before { + content: ""; } + +.ion-arrow-up-a:before { + content: ""; } + +.ion-arrow-up-b:before { + content: ""; } + +.ion-arrow-up-c:before { + content: ""; } + +.ion-asterisk:before { + content: ""; } + +.ion-at:before { + content: ""; } + +.ion-bag:before { + content: ""; } + +.ion-battery-charging:before { + content: ""; } + +.ion-battery-empty:before { + content: ""; } + +.ion-battery-full:before { + content: ""; } + +.ion-battery-half:before { + content: ""; } + +.ion-battery-low:before { + content: ""; } + +.ion-beaker:before { + content: ""; } + +.ion-beer:before { + content: ""; } + +.ion-bluetooth:before { + content: ""; } + +.ion-bonfire:before { + content: ""; } + +.ion-bookmark:before { + content: ""; } + +.ion-briefcase:before { + content: ""; } + +.ion-bug:before { + content: ""; } + +.ion-calculator:before { + content: ""; } + +.ion-calendar:before { + content: ""; } + +.ion-camera:before { + content: ""; } + +.ion-card:before { + content: ""; } + +.ion-cash:before { + content: ""; } + +.ion-chatbox:before { + content: ""; } + +.ion-chatbox-working:before { + content: ""; } + +.ion-chatboxes:before { + content: ""; } + +.ion-chatbubble:before { + content: ""; } + +.ion-chatbubble-working:before { + content: ""; } + +.ion-chatbubbles:before { + content: ""; } + +.ion-checkmark:before { + content: ""; } + +.ion-checkmark-circled:before { + content: ""; } + +.ion-checkmark-round:before { + content: ""; } + +.ion-chevron-down:before { + content: ""; } + +.ion-chevron-left:before { + content: ""; } + +.ion-chevron-right:before { + content: ""; } + +.ion-chevron-up:before { + content: ""; } + +.ion-clipboard:before { + content: ""; } + +.ion-clock:before { + content: ""; } + +.ion-close:before { + content: ""; } + +.ion-close-circled:before { + content: ""; } + +.ion-close-round:before { + content: ""; } + +.ion-closed-captioning:before { + content: ""; } + +.ion-cloud:before { + content: ""; } + +.ion-code:before { + content: ""; } + +.ion-code-download:before { + content: ""; } + +.ion-code-working:before { + content: ""; } + +.ion-coffee:before { + content: ""; } + +.ion-compass:before { + content: ""; } + +.ion-compose:before { + content: ""; } + +.ion-connection-bars:before { + content: ""; } + +.ion-contrast:before { + content: ""; } + +.ion-cube:before { + content: ""; } + +.ion-disc:before { + content: ""; } + +.ion-document:before { + content: ""; } + +.ion-document-text:before { + content: ""; } + +.ion-drag:before { + content: ""; } + +.ion-earth:before { + content: ""; } + +.ion-edit:before { + content: ""; } + +.ion-egg:before { + content: ""; } + +.ion-eject:before { + content: ""; } + +.ion-email:before { + content: ""; } + +.ion-eye:before { + content: ""; } + +.ion-eye-disabled:before { + content: ""; } + +.ion-female:before { + content: ""; } + +.ion-filing:before { + content: ""; } + +.ion-film-marker:before { + content: ""; } + +.ion-fireball:before { + content: ""; } + +.ion-flag:before { + content: ""; } + +.ion-flame:before { + content: ""; } + +.ion-flash:before { + content: ""; } + +.ion-flash-off:before { + content: ""; } + +.ion-flask:before { + content: ""; } + +.ion-folder:before { + content: ""; } + +.ion-fork:before { + content: ""; } + +.ion-fork-repo:before { + content: ""; } + +.ion-forward:before { + content: ""; } + +.ion-funnel:before { + content: ""; } + +.ion-game-controller-a:before { + content: ""; } + +.ion-game-controller-b:before { + content: ""; } + +.ion-gear-a:before { + content: ""; } + +.ion-gear-b:before { + content: ""; } + +.ion-grid:before { + content: ""; } + +.ion-hammer:before { + content: ""; } + +.ion-happy:before { + content: ""; } + +.ion-headphone:before { + content: ""; } + +.ion-heart:before { + content: ""; } + +.ion-heart-broken:before { + content: ""; } + +.ion-help:before { + content: ""; } + +.ion-help-buoy:before { + content: ""; } + +.ion-help-circled:before { + content: ""; } + +.ion-home:before { + content: ""; } + +.ion-icecream:before { + content: ""; } + +.ion-icon-social-google-plus:before { + content: ""; } + +.ion-icon-social-google-plus-outline:before { + content: ""; } + +.ion-image:before { + content: ""; } + +.ion-images:before { + content: ""; } + +.ion-information:before { + content: ""; } + +.ion-information-circled:before { + content: ""; } + +.ion-ionic:before { + content: ""; } + +.ion-ios7-alarm:before { + content: ""; } + +.ion-ios7-alarm-outline:before { + content: ""; } + +.ion-ios7-albums:before { + content: ""; } + +.ion-ios7-albums-outline:before { + content: ""; } + +.ion-ios7-americanfootball:before { + content: ""; } + +.ion-ios7-americanfootball-outline:before { + content: ""; } + +.ion-ios7-analytics:before { + content: ""; } + +.ion-ios7-analytics-outline:before { + content: ""; } + +.ion-ios7-arrow-back:before { + content: ""; } + +.ion-ios7-arrow-down:before { + content: ""; } + +.ion-ios7-arrow-forward:before { + content: ""; } + +.ion-ios7-arrow-left:before { + content: ""; } + +.ion-ios7-arrow-right:before { + content: ""; } + +.ion-ios7-arrow-thin-down:before { + content: ""; } + +.ion-ios7-arrow-thin-left:before { + content: ""; } + +.ion-ios7-arrow-thin-right:before { + content: ""; } + +.ion-ios7-arrow-thin-up:before { + content: ""; } + +.ion-ios7-arrow-up:before { + content: ""; } + +.ion-ios7-at:before { + content: ""; } + +.ion-ios7-at-outline:before { + content: ""; } + +.ion-ios7-barcode:before { + content: ""; } + +.ion-ios7-barcode-outline:before { + content: ""; } + +.ion-ios7-baseball:before { + content: ""; } + +.ion-ios7-baseball-outline:before { + content: ""; } + +.ion-ios7-basketball:before { + content: ""; } + +.ion-ios7-basketball-outline:before { + content: ""; } + +.ion-ios7-bell:before { + content: ""; } + +.ion-ios7-bell-outline:before { + content: ""; } + +.ion-ios7-bolt:before { + content: ""; } + +.ion-ios7-bolt-outline:before { + content: ""; } + +.ion-ios7-bookmarks:before { + content: ""; } + +.ion-ios7-bookmarks-outline:before { + content: ""; } + +.ion-ios7-box:before { + content: ""; } + +.ion-ios7-box-outline:before { + content: ""; } + +.ion-ios7-briefcase:before { + content: ""; } + +.ion-ios7-briefcase-outline:before { + content: ""; } + +.ion-ios7-browsers:before { + content: ""; } + +.ion-ios7-browsers-outline:before { + content: ""; } + +.ion-ios7-calculator:before { + content: ""; } + +.ion-ios7-calculator-outline:before { + content: ""; } + +.ion-ios7-calendar:before { + content: ""; } + +.ion-ios7-calendar-outline:before { + content: ""; } + +.ion-ios7-camera:before { + content: ""; } + +.ion-ios7-camera-outline:before { + content: ""; } + +.ion-ios7-cart:before { + content: ""; } + +.ion-ios7-cart-outline:before { + content: ""; } + +.ion-ios7-chatboxes:before { + content: ""; } + +.ion-ios7-chatboxes-outline:before { + content: ""; } + +.ion-ios7-chatbubble:before { + content: ""; } + +.ion-ios7-chatbubble-outline:before { + content: ""; } + +.ion-ios7-checkmark:before { + content: ""; } + +.ion-ios7-checkmark-empty:before { + content: ""; } + +.ion-ios7-checkmark-outline:before { + content: ""; } + +.ion-ios7-circle-filled:before { + content: ""; } + +.ion-ios7-circle-outline:before { + content: ""; } + +.ion-ios7-clock:before { + content: ""; } + +.ion-ios7-clock-outline:before { + content: ""; } + +.ion-ios7-close:before { + content: ""; } + +.ion-ios7-close-empty:before { + content: ""; } + +.ion-ios7-close-outline:before { + content: ""; } + +.ion-ios7-cloud:before { + content: ""; } + +.ion-ios7-cloud-download:before { + content: ""; } + +.ion-ios7-cloud-download-outline:before { + content: ""; } + +.ion-ios7-cloud-outline:before { + content: ""; } + +.ion-ios7-cloud-upload:before { + content: ""; } + +.ion-ios7-cloud-upload-outline:before { + content: ""; } + +.ion-ios7-cloudy:before { + content: ""; } + +.ion-ios7-cloudy-night:before { + content: ""; } + +.ion-ios7-cloudy-night-outline:before { + content: ""; } + +.ion-ios7-cloudy-outline:before { + content: ""; } + +.ion-ios7-cog:before { + content: ""; } + +.ion-ios7-cog-outline:before { + content: ""; } + +.ion-ios7-compose:before { + content: ""; } + +.ion-ios7-compose-outline:before { + content: ""; } + +.ion-ios7-contact:before { + content: ""; } + +.ion-ios7-contact-outline:before { + content: ""; } + +.ion-ios7-copy:before { + content: ""; } + +.ion-ios7-copy-outline:before { + content: ""; } + +.ion-ios7-download:before { + content: ""; } + +.ion-ios7-download-outline:before { + content: ""; } + +.ion-ios7-drag:before { + content: ""; } + +.ion-ios7-email:before { + content: ""; } + +.ion-ios7-email-outline:before { + content: ""; } + +.ion-ios7-expand:before { + content: ""; } + +.ion-ios7-eye:before { + content: ""; } + +.ion-ios7-eye-outline:before { + content: ""; } + +.ion-ios7-fastforward:before { + content: ""; } + +.ion-ios7-fastforward-outline:before { + content: ""; } + +.ion-ios7-filing:before { + content: ""; } + +.ion-ios7-filing-outline:before { + content: ""; } + +.ion-ios7-film:before { + content: ""; } + +.ion-ios7-film-outline:before { + content: ""; } + +.ion-ios7-flag:before { + content: ""; } + +.ion-ios7-flag-outline:before { + content: ""; } + +.ion-ios7-folder:before { + content: ""; } + +.ion-ios7-folder-outline:before { + content: ""; } + +.ion-ios7-football:before { + content: ""; } + +.ion-ios7-football-outline:before { + content: ""; } + +.ion-ios7-gear:before { + content: ""; } + +.ion-ios7-gear-outline:before { + content: ""; } + +.ion-ios7-glasses:before { + content: ""; } + +.ion-ios7-glasses-outline:before { + content: ""; } + +.ion-ios7-heart:before { + content: ""; } + +.ion-ios7-heart-outline:before { + content: ""; } + +.ion-ios7-help:before { + content: ""; } + +.ion-ios7-help-empty:before { + content: ""; } + +.ion-ios7-help-outline:before { + content: ""; } + +.ion-ios7-home:before { + content: ""; } + +.ion-ios7-home-outline:before { + content: ""; } + +.ion-ios7-infinite:before { + content: ""; } + +.ion-ios7-infinite-outline:before { + content: ""; } + +.ion-ios7-information:before { + content: ""; } + +.ion-ios7-information-empty:before { + content: ""; } + +.ion-ios7-information-outline:before { + content: ""; } + +.ion-ios7-ionic-outline:before { + content: ""; } + +.ion-ios7-keypad:before { + content: ""; } + +.ion-ios7-keypad-outline:before { + content: ""; } + +.ion-ios7-lightbulb:before { + content: ""; } + +.ion-ios7-lightbulb-outline:before { + content: ""; } + +.ion-ios7-location:before { + content: ""; } + +.ion-ios7-location-outline:before { + content: ""; } + +.ion-ios7-locked:before { + content: ""; } + +.ion-ios7-locked-outline:before { + content: ""; } + +.ion-ios7-loop:before { + content: ""; } + +.ion-ios7-loop-strong:before { + content: ""; } + +.ion-ios7-medkit:before { + content: ""; } + +.ion-ios7-medkit-outline:before { + content: ""; } + +.ion-ios7-mic:before { + content: ""; } + +.ion-ios7-mic-off:before { + content: ""; } + +.ion-ios7-mic-outline:before { + content: ""; } + +.ion-ios7-minus:before { + content: ""; } + +.ion-ios7-minus-empty:before { + content: ""; } + +.ion-ios7-minus-outline:before { + content: ""; } + +.ion-ios7-monitor:before { + content: ""; } + +.ion-ios7-monitor-outline:before { + content: ""; } + +.ion-ios7-moon:before { + content: ""; } + +.ion-ios7-moon-outline:before { + content: ""; } + +.ion-ios7-more:before { + content: ""; } + +.ion-ios7-more-outline:before { + content: ""; } + +.ion-ios7-musical-note:before { + content: ""; } + +.ion-ios7-musical-notes:before { + content: ""; } + +.ion-ios7-navigate:before { + content: ""; } + +.ion-ios7-navigate-outline:before { + content: ""; } + +.ion-ios7-paper:before { + content: ""; } + +.ion-ios7-paper-outline:before { + content: ""; } + +.ion-ios7-paperplane:before { + content: ""; } + +.ion-ios7-paperplane-outline:before { + content: ""; } + +.ion-ios7-partlysunny:before { + content: ""; } + +.ion-ios7-partlysunny-outline:before { + content: ""; } + +.ion-ios7-pause:before { + content: ""; } + +.ion-ios7-pause-outline:before { + content: ""; } + +.ion-ios7-paw:before { + content: ""; } + +.ion-ios7-paw-outline:before { + content: ""; } + +.ion-ios7-people:before { + content: ""; } + +.ion-ios7-people-outline:before { + content: ""; } + +.ion-ios7-person:before { + content: ""; } + +.ion-ios7-person-outline:before { + content: ""; } + +.ion-ios7-personadd:before { + content: ""; } + +.ion-ios7-personadd-outline:before { + content: ""; } + +.ion-ios7-photos:before { + content: ""; } + +.ion-ios7-photos-outline:before { + content: ""; } + +.ion-ios7-pie:before { + content: ""; } + +.ion-ios7-pie-outline:before { + content: ""; } + +.ion-ios7-play:before { + content: ""; } + +.ion-ios7-play-outline:before { + content: ""; } + +.ion-ios7-plus:before { + content: ""; } + +.ion-ios7-plus-empty:before { + content: ""; } + +.ion-ios7-plus-outline:before { + content: ""; } + +.ion-ios7-pricetag:before { + content: ""; } + +.ion-ios7-pricetag-outline:before { + content: ""; } + +.ion-ios7-pricetags:before { + content: ""; } + +.ion-ios7-pricetags-outline:before { + content: ""; } + +.ion-ios7-printer:before { + content: ""; } + +.ion-ios7-printer-outline:before { + content: ""; } + +.ion-ios7-pulse:before { + content: ""; } + +.ion-ios7-pulse-strong:before { + content: ""; } + +.ion-ios7-rainy:before { + content: ""; } + +.ion-ios7-rainy-outline:before { + content: ""; } + +.ion-ios7-recording:before { + content: ""; } + +.ion-ios7-recording-outline:before { + content: ""; } + +.ion-ios7-redo:before { + content: ""; } + +.ion-ios7-redo-outline:before { + content: ""; } + +.ion-ios7-refresh:before { + content: ""; } + +.ion-ios7-refresh-empty:before { + content: ""; } + +.ion-ios7-refresh-outline:before { + content: ""; } + +.ion-ios7-reload:before, .ion-ios7-reloading:before { + content: ""; } + +.ion-ios7-reverse-camera:before { + content: ""; } + +.ion-ios7-reverse-camera-outline:before { + content: ""; } + +.ion-ios7-rewind:before { + content: ""; } + +.ion-ios7-rewind-outline:before { + content: ""; } + +.ion-ios7-search:before { + content: ""; } + +.ion-ios7-search-strong:before { + content: ""; } + +.ion-ios7-settings:before { + content: ""; } + +.ion-ios7-settings-strong:before { + content: ""; } + +.ion-ios7-shrink:before { + content: ""; } + +.ion-ios7-skipbackward:before { + content: ""; } + +.ion-ios7-skipbackward-outline:before { + content: ""; } + +.ion-ios7-skipforward:before { + content: ""; } + +.ion-ios7-skipforward-outline:before { + content: ""; } + +.ion-ios7-snowy:before { + content: ""; } + +.ion-ios7-speedometer:before { + content: ""; } + +.ion-ios7-speedometer-outline:before { + content: ""; } + +.ion-ios7-star:before { + content: ""; } + +.ion-ios7-star-half:before { + content: ""; } + +.ion-ios7-star-outline:before { + content: ""; } + +.ion-ios7-stopwatch:before { + content: ""; } + +.ion-ios7-stopwatch-outline:before { + content: ""; } + +.ion-ios7-sunny:before { + content: ""; } + +.ion-ios7-sunny-outline:before { + content: ""; } + +.ion-ios7-telephone:before { + content: ""; } + +.ion-ios7-telephone-outline:before { + content: ""; } + +.ion-ios7-tennisball:before { + content: ""; } + +.ion-ios7-tennisball-outline:before { + content: ""; } + +.ion-ios7-thunderstorm:before { + content: ""; } + +.ion-ios7-thunderstorm-outline:before { + content: ""; } + +.ion-ios7-time:before { + content: ""; } + +.ion-ios7-time-outline:before { + content: ""; } + +.ion-ios7-timer:before { + content: ""; } + +.ion-ios7-timer-outline:before { + content: ""; } + +.ion-ios7-toggle:before { + content: ""; } + +.ion-ios7-toggle-outline:before { + content: ""; } + +.ion-ios7-trash:before { + content: ""; } + +.ion-ios7-trash-outline:before { + content: ""; } + +.ion-ios7-undo:before { + content: ""; } + +.ion-ios7-undo-outline:before { + content: ""; } + +.ion-ios7-unlocked:before { + content: ""; } + +.ion-ios7-unlocked-outline:before { + content: ""; } + +.ion-ios7-upload:before { + content: ""; } + +.ion-ios7-upload-outline:before { + content: ""; } + +.ion-ios7-videocam:before { + content: ""; } + +.ion-ios7-videocam-outline:before { + content: ""; } + +.ion-ios7-volume-high:before { + content: ""; } + +.ion-ios7-volume-low:before { + content: ""; } + +.ion-ios7-wineglass:before { + content: ""; } + +.ion-ios7-wineglass-outline:before { + content: ""; } + +.ion-ios7-world:before { + content: ""; } + +.ion-ios7-world-outline:before { + content: ""; } + +.ion-ipad:before { + content: ""; } + +.ion-iphone:before { + content: ""; } + +.ion-ipod:before { + content: ""; } + +.ion-jet:before { + content: ""; } + +.ion-key:before { + content: ""; } + +.ion-knife:before { + content: ""; } + +.ion-laptop:before { + content: ""; } + +.ion-leaf:before { + content: ""; } + +.ion-levels:before { + content: ""; } + +.ion-lightbulb:before { + content: ""; } + +.ion-link:before { + content: ""; } + +.ion-load-a:before, .ion-loading-a:before { + content: ""; } + +.ion-load-b:before, .ion-loading-b:before { + content: ""; } + +.ion-load-c:before, .ion-loading-c:before { + content: ""; } + +.ion-load-d:before, .ion-loading-d:before { + content: ""; } + +.ion-location:before { + content: ""; } + +.ion-locked:before { + content: ""; } + +.ion-log-in:before { + content: ""; } + +.ion-log-out:before { + content: ""; } + +.ion-loop:before, .ion-looping:before { + content: ""; } + +.ion-magnet:before { + content: ""; } + +.ion-male:before { + content: ""; } + +.ion-man:before { + content: ""; } + +.ion-map:before { + content: ""; } + +.ion-medkit:before { + content: ""; } + +.ion-merge:before { + content: ""; } + +.ion-mic-a:before { + content: ""; } + +.ion-mic-b:before { + content: ""; } + +.ion-mic-c:before { + content: ""; } + +.ion-minus:before { + content: ""; } + +.ion-minus-circled:before { + content: ""; } + +.ion-minus-round:before { + content: ""; } + +.ion-model-s:before { + content: ""; } + +.ion-monitor:before { + content: ""; } + +.ion-more:before { + content: ""; } + +.ion-mouse:before { + content: ""; } + +.ion-music-note:before { + content: ""; } + +.ion-navicon:before { + content: ""; } + +.ion-navicon-round:before { + content: ""; } + +.ion-navigate:before { + content: ""; } + +.ion-network:before { + content: ""; } + +.ion-no-smoking:before { + content: ""; } + +.ion-nuclear:before { + content: ""; } + +.ion-outlet:before { + content: ""; } + +.ion-paper-airplane:before { + content: ""; } + +.ion-paperclip:before { + content: ""; } + +.ion-pause:before { + content: ""; } + +.ion-person:before { + content: ""; } + +.ion-person-add:before { + content: ""; } + +.ion-person-stalker:before { + content: ""; } + +.ion-pie-graph:before { + content: ""; } + +.ion-pin:before { + content: ""; } + +.ion-pinpoint:before { + content: ""; } + +.ion-pizza:before { + content: ""; } + +.ion-plane:before { + content: ""; } + +.ion-planet:before { + content: ""; } + +.ion-play:before { + content: ""; } + +.ion-playstation:before { + content: ""; } + +.ion-plus:before { + content: ""; } + +.ion-plus-circled:before { + content: ""; } + +.ion-plus-round:before { + content: ""; } + +.ion-podium:before { + content: ""; } + +.ion-pound:before { + content: ""; } + +.ion-power:before { + content: ""; } + +.ion-pricetag:before { + content: ""; } + +.ion-pricetags:before { + content: ""; } + +.ion-printer:before { + content: ""; } + +.ion-pull-request:before { + content: ""; } + +.ion-qr-scanner:before { + content: ""; } + +.ion-quote:before { + content: ""; } + +.ion-radio-waves:before { + content: ""; } + +.ion-record:before { + content: ""; } + +.ion-refresh:before, .ion-refreshing:before { + content: ""; } + +.ion-reply:before { + content: ""; } + +.ion-reply-all:before { + content: ""; } + +.ion-ribbon-a:before { + content: ""; } + +.ion-ribbon-b:before { + content: ""; } + +.ion-sad:before { + content: ""; } + +.ion-scissors:before { + content: ""; } + +.ion-search:before { + content: ""; } + +.ion-settings:before { + content: ""; } + +.ion-share:before { + content: ""; } + +.ion-shuffle:before { + content: ""; } + +.ion-skip-backward:before { + content: ""; } + +.ion-skip-forward:before { + content: ""; } + +.ion-social-android:before { + content: ""; } + +.ion-social-android-outline:before { + content: ""; } + +.ion-social-apple:before { + content: ""; } + +.ion-social-apple-outline:before { + content: ""; } + +.ion-social-bitcoin:before { + content: ""; } + +.ion-social-bitcoin-outline:before { + content: ""; } + +.ion-social-buffer:before { + content: ""; } + +.ion-social-buffer-outline:before { + content: ""; } + +.ion-social-designernews:before { + content: ""; } + +.ion-social-designernews-outline:before { + content: ""; } + +.ion-social-dribbble:before { + content: ""; } + +.ion-social-dribbble-outline:before { + content: ""; } + +.ion-social-dropbox:before { + content: ""; } + +.ion-social-dropbox-outline:before { + content: ""; } + +.ion-social-facebook:before { + content: ""; } + +.ion-social-facebook-outline:before { + content: ""; } + +.ion-social-foursquare:before { + content: ""; } + +.ion-social-foursquare-outline:before { + content: ""; } + +.ion-social-freebsd-devil:before { + content: ""; } + +.ion-social-github:before { + content: ""; } + +.ion-social-github-outline:before { + content: ""; } + +.ion-social-google:before { + content: ""; } + +.ion-social-google-outline:before { + content: ""; } + +.ion-social-googleplus:before { + content: ""; } + +.ion-social-googleplus-outline:before { + content: ""; } + +.ion-social-hackernews:before { + content: ""; } + +.ion-social-hackernews-outline:before { + content: ""; } + +.ion-social-instagram:before { + content: ""; } + +.ion-social-instagram-outline:before { + content: ""; } + +.ion-social-linkedin:before { + content: ""; } + +.ion-social-linkedin-outline:before { + content: ""; } + +.ion-social-pinterest:before { + content: ""; } + +.ion-social-pinterest-outline:before { + content: ""; } + +.ion-social-reddit:before { + content: ""; } + +.ion-social-reddit-outline:before { + content: ""; } + +.ion-social-rss:before { + content: ""; } + +.ion-social-rss-outline:before { + content: ""; } + +.ion-social-skype:before { + content: ""; } + +.ion-social-skype-outline:before { + content: ""; } + +.ion-social-tumblr:before { + content: ""; } + +.ion-social-tumblr-outline:before { + content: ""; } + +.ion-social-tux:before { + content: ""; } + +.ion-social-twitter:before { + content: ""; } + +.ion-social-twitter-outline:before { + content: ""; } + +.ion-social-usd:before { + content: ""; } + +.ion-social-usd-outline:before { + content: ""; } + +.ion-social-vimeo:before { + content: ""; } + +.ion-social-vimeo-outline:before { + content: ""; } + +.ion-social-windows:before { + content: ""; } + +.ion-social-windows-outline:before { + content: ""; } + +.ion-social-wordpress:before { + content: ""; } + +.ion-social-wordpress-outline:before { + content: ""; } + +.ion-social-yahoo:before { + content: ""; } + +.ion-social-yahoo-outline:before { + content: ""; } + +.ion-social-youtube:before { + content: ""; } + +.ion-social-youtube-outline:before { + content: ""; } + +.ion-speakerphone:before { + content: ""; } + +.ion-speedometer:before { + content: ""; } + +.ion-spoon:before { + content: ""; } + +.ion-star:before { + content: ""; } + +.ion-stats-bars:before { + content: ""; } + +.ion-steam:before { + content: ""; } + +.ion-stop:before { + content: ""; } + +.ion-thermometer:before { + content: ""; } + +.ion-thumbsdown:before { + content: ""; } + +.ion-thumbsup:before { + content: ""; } + +.ion-toggle:before { + content: ""; } + +.ion-toggle-filled:before { + content: ""; } + +.ion-trash-a:before { + content: ""; } + +.ion-trash-b:before { + content: ""; } + +.ion-trophy:before { + content: ""; } + +.ion-umbrella:before { + content: ""; } + +.ion-university:before { + content: ""; } + +.ion-unlocked:before { + content: ""; } + +.ion-upload:before { + content: ""; } + +.ion-usb:before { + content: ""; } + +.ion-videocamera:before { + content: ""; } + +.ion-volume-high:before { + content: ""; } + +.ion-volume-low:before { + content: ""; } + +.ion-volume-medium:before { + content: ""; } + +.ion-volume-mute:before { + content: ""; } + +.ion-wand:before { + content: ""; } + +.ion-waterdrop:before { + content: ""; } + +.ion-wifi:before { + content: ""; } + +.ion-wineglass:before { + content: ""; } + +.ion-woman:before { + content: ""; } + +.ion-wrench:before { + content: ""; } + +.ion-xbox:before { + content: ""; } + +/*! + * Weather Icons 2.0 + * Updated August 1, 2015 + * Weather themed icons for Bootstrap + * Author - Erik Flowers - erik@helloerik.com + * Email: erik@helloerik.com + * Twitter: http://twitter.com/Erik_UX + * ------------------------------------------------------------------------------ + * Maintained at http://erikflowers.github.io/weather-icons + * + * License + * ------------------------------------------------------------------------------ + * - Font licensed under SIL OFL 1.1 - + * http://scripts.sil.org/OFL + * - CSS, SCSS and LESS are licensed under MIT License - + * http://opensource.org/licenses/mit-license.html + * - Documentation licensed under CC BY 3.0 - + * http://creativecommons.org/licenses/by/3.0/ + * - Inspired by and works great as a companion with Font Awesome + * "Font Awesome by Dave Gandy - http://fontawesome.io" + */ +@font-face { + font-family: "weathericons"; + src: url("../fonts/weathericons-regular-webfont.eot"); + src: url("../fonts/weathericons-regular-webfont.eot?#iefix") format("embedded-opentype"), url("../fonts/weathericons-regular-webfont.woff2") format("woff2"), url("../fonts/weathericons-regular-webfont.woff") format("woff"), url("../fonts/weathericons-regular-webfont.ttf") format("truetype"), url("../fonts/weathericons-regular-webfont.svg#weather_iconsregular") format("svg"); + font-weight: normal; + font-style: normal; } +.wi { + display: inline-block; + font-family: "weathericons"; + font-style: normal; + font-weight: normal; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; } + +.wi-fw { + width: 1.4em; + text-align: center; } + +.wi-rotate-90 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1); + -webkit-transform: rotate(90deg); + -ms-transform: rotate(90deg); + transform: rotate(90deg); } + +.wi-rotate-180 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2); + -webkit-transform: rotate(180deg); + -ms-transform: rotate(180deg); + transform: rotate(180deg); } + +.wi-rotate-270 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3); + -webkit-transform: rotate(270deg); + -ms-transform: rotate(270deg); + transform: rotate(270deg); } + +.wi-flip-horizontal { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0); + -webkit-transform: scale(-1, 1); + -ms-transform: scale(-1, 1); + transform: scale(-1, 1); } + +.wi-flip-vertical { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2); + -webkit-transform: scale(1, -1); + -ms-transform: scale(1, -1); + transform: scale(1, -1); } + +.wi-day-sunny:before { + content: ""; } + +.wi-day-cloudy:before { + content: ""; } + +.wi-day-cloudy-gusts:before { + content: ""; } + +.wi-day-cloudy-windy:before { + content: ""; } + +.wi-day-fog:before { + content: ""; } + +.wi-day-hail:before { + content: ""; } + +.wi-day-haze:before { + content: ""; } + +.wi-day-lightning:before { + content: ""; } + +.wi-day-rain:before { + content: ""; } + +.wi-day-rain-mix:before { + content: ""; } + +.wi-day-rain-wind:before { + content: ""; } + +.wi-day-showers:before { + content: ""; } + +.wi-day-sleet:before { + content: ""; } + +.wi-day-sleet-storm:before { + content: ""; } + +.wi-day-snow:before { + content: ""; } + +.wi-day-snow-thunderstorm:before { + content: ""; } + +.wi-day-snow-wind:before { + content: ""; } + +.wi-day-sprinkle:before { + content: ""; } + +.wi-day-storm-showers:before { + content: ""; } + +.wi-day-sunny-overcast:before { + content: ""; } + +.wi-day-thunderstorm:before { + content: ""; } + +.wi-day-windy:before { + content: ""; } + +.wi-solar-eclipse:before { + content: ""; } + +.wi-hot:before { + content: ""; } + +.wi-day-cloudy-high:before { + content: ""; } + +.wi-day-light-wind:before { + content: ""; } + +.wi-night-clear:before { + content: ""; } + +.wi-night-alt-cloudy:before { + content: ""; } + +.wi-night-alt-cloudy-gusts:before { + content: ""; } + +.wi-night-alt-cloudy-windy:before { + content: ""; } + +.wi-night-alt-hail:before { + content: ""; } + +.wi-night-alt-lightning:before { + content: ""; } + +.wi-night-alt-rain:before { + content: ""; } + +.wi-night-alt-rain-mix:before { + content: ""; } + +.wi-night-alt-rain-wind:before { + content: ""; } + +.wi-night-alt-showers:before { + content: ""; } + +.wi-night-alt-sleet:before { + content: ""; } + +.wi-night-alt-sleet-storm:before { + content: ""; } + +.wi-night-alt-snow:before { + content: ""; } + +.wi-night-alt-snow-thunderstorm:before { + content: ""; } + +.wi-night-alt-snow-wind:before { + content: ""; } + +.wi-night-alt-sprinkle:before { + content: ""; } + +.wi-night-alt-storm-showers:before { + content: ""; } + +.wi-night-alt-thunderstorm:before { + content: ""; } + +.wi-night-cloudy:before { + content: ""; } + +.wi-night-cloudy-gusts:before { + content: ""; } + +.wi-night-cloudy-windy:before { + content: ""; } + +.wi-night-fog:before { + content: ""; } + +.wi-night-hail:before { + content: ""; } + +.wi-night-lightning:before { + content: ""; } + +.wi-night-partly-cloudy:before { + content: ""; } + +.wi-night-rain:before { + content: ""; } + +.wi-night-rain-mix:before { + content: ""; } + +.wi-night-rain-wind:before { + content: ""; } + +.wi-night-showers:before { + content: ""; } + +.wi-night-sleet:before { + content: ""; } + +.wi-night-sleet-storm:before { + content: ""; } + +.wi-night-snow:before { + content: ""; } + +.wi-night-snow-thunderstorm:before { + content: ""; } + +.wi-night-snow-wind:before { + content: ""; } + +.wi-night-sprinkle:before { + content: ""; } + +.wi-night-storm-showers:before { + content: ""; } + +.wi-night-thunderstorm:before { + content: ""; } + +.wi-lunar-eclipse:before { + content: ""; } + +.wi-stars:before { + content: ""; } + +.wi-storm-showers:before { + content: ""; } + +.wi-thunderstorm:before { + content: ""; } + +.wi-night-alt-cloudy-high:before { + content: ""; } + +.wi-night-cloudy-high:before { + content: ""; } + +.wi-night-alt-partly-cloudy:before { + content: ""; } + +.wi-cloud:before { + content: ""; } + +.wi-cloudy:before { + content: ""; } + +.wi-cloudy-gusts:before { + content: ""; } + +.wi-cloudy-windy:before { + content: ""; } + +.wi-fog:before { + content: ""; } + +.wi-hail:before { + content: ""; } + +.wi-rain:before { + content: ""; } + +.wi-rain-mix:before { + content: ""; } + +.wi-rain-wind:before { + content: ""; } + +.wi-showers:before { + content: ""; } + +.wi-sleet:before { + content: ""; } + +.wi-snow:before { + content: ""; } + +.wi-sprinkle:before { + content: ""; } + +.wi-storm-showers:before { + content: ""; } + +.wi-thunderstorm:before { + content: ""; } + +.wi-snow-wind:before { + content: ""; } + +.wi-snow:before { + content: ""; } + +.wi-smog:before { + content: ""; } + +.wi-smoke:before { + content: ""; } + +.wi-lightning:before { + content: ""; } + +.wi-raindrops:before { + content: ""; } + +.wi-raindrop:before { + content: ""; } + +.wi-dust:before { + content: ""; } + +.wi-snowflake-cold:before { + content: ""; } + +.wi-windy:before { + content: ""; } + +.wi-strong-wind:before { + content: ""; } + +.wi-sandstorm:before { + content: ""; } + +.wi-earthquake:before { + content: ""; } + +.wi-fire:before { + content: ""; } + +.wi-flood:before { + content: ""; } + +.wi-meteor:before { + content: ""; } + +.wi-tsunami:before { + content: ""; } + +.wi-volcano:before { + content: ""; } + +.wi-hurricane:before { + content: ""; } + +.wi-tornado:before { + content: ""; } + +.wi-small-craft-advisory:before { + content: ""; } + +.wi-gale-warning:before { + content: ""; } + +.wi-storm-warning:before { + content: ""; } + +.wi-hurricane-warning:before { + content: ""; } + +.wi-wind-direction:before { + content: ""; } + +.wi-alien:before { + content: ""; } + +.wi-celsius:before { + content: ""; } + +.wi-fahrenheit:before { + content: ""; } + +.wi-degrees:before { + content: ""; } + +.wi-thermometer:before { + content: ""; } + +.wi-thermometer-exterior:before { + content: ""; } + +.wi-thermometer-internal:before { + content: ""; } + +.wi-cloud-down:before { + content: ""; } + +.wi-cloud-up:before { + content: ""; } + +.wi-cloud-refresh:before { + content: ""; } + +.wi-horizon:before { + content: ""; } + +.wi-horizon-alt:before { + content: ""; } + +.wi-sunrise:before { + content: ""; } + +.wi-sunset:before { + content: ""; } + +.wi-moonrise:before { + content: ""; } + +.wi-moonset:before { + content: ""; } + +.wi-refresh:before { + content: ""; } + +.wi-refresh-alt:before { + content: ""; } + +.wi-umbrella:before { + content: ""; } + +.wi-barometer:before { + content: ""; } + +.wi-humidity:before { + content: ""; } + +.wi-na:before { + content: ""; } + +.wi-train:before { + content: ""; } + +.wi-moon-new:before { + content: ""; } + +.wi-moon-waxing-cresent-1:before { + content: ""; } + +.wi-moon-waxing-cresent-2:before { + content: ""; } + +.wi-moon-waxing-cresent-3:before { + content: ""; } + +.wi-moon-waxing-cresent-4:before { + content: ""; } + +.wi-moon-waxing-cresent-5:before { + content: ""; } + +.wi-moon-waxing-cresent-6:before { + content: ""; } + +.wi-moon-first-quarter:before { + content: ""; } + +.wi-moon-waxing-gibbous-1:before { + content: ""; } + +.wi-moon-waxing-gibbous-2:before { + content: ""; } + +.wi-moon-waxing-gibbous-3:before { + content: ""; } + +.wi-moon-waxing-gibbous-4:before { + content: ""; } + +.wi-moon-waxing-gibbous-5:before { + content: ""; } + +.wi-moon-waxing-gibbous-6:before { + content: ""; } + +.wi-moon-full:before { + content: ""; } + +.wi-moon-waning-gibbous-1:before { + content: ""; } + +.wi-moon-waning-gibbous-2:before { + content: ""; } + +.wi-moon-waning-gibbous-3:before { + content: ""; } + +.wi-moon-waning-gibbous-4:before { + content: ""; } + +.wi-moon-waning-gibbous-5:before { + content: ""; } + +.wi-moon-waning-gibbous-6:before { + content: ""; } + +.wi-moon-third-quarter:before { + content: ""; } + +.wi-moon-waning-crescent-1:before { + content: ""; } + +.wi-moon-waning-crescent-2:before { + content: ""; } + +.wi-moon-waning-crescent-3:before { + content: ""; } + +.wi-moon-waning-crescent-4:before { + content: ""; } + +.wi-moon-waning-crescent-5:before { + content: ""; } + +.wi-moon-waning-crescent-6:before { + content: ""; } + +.wi-moon-alt-new:before { + content: ""; } + +.wi-moon-alt-waxing-cresent-1:before { + content: ""; } + +.wi-moon-alt-waxing-cresent-2:before { + content: ""; } + +.wi-moon-alt-waxing-cresent-3:before { + content: ""; } + +.wi-moon-alt-waxing-cresent-4:before { + content: ""; } + +.wi-moon-alt-waxing-cresent-5:before { + content: ""; } + +.wi-moon-alt-waxing-cresent-6:before { + content: ""; } + +.wi-moon-alt-first-quarter:before { + content: ""; } + +.wi-moon-alt-waxing-gibbous-1:before { + content: ""; } + +.wi-moon-alt-waxing-gibbous-2:before { + content: ""; } + +.wi-moon-alt-waxing-gibbous-3:before { + content: ""; } + +.wi-moon-alt-waxing-gibbous-4:before { + content: ""; } + +.wi-moon-alt-waxing-gibbous-5:before { + content: ""; } + +.wi-moon-alt-waxing-gibbous-6:before { + content: ""; } + +.wi-moon-alt-full:before { + content: ""; } + +.wi-moon-alt-waning-gibbous-1:before { + content: ""; } + +.wi-moon-alt-waning-gibbous-2:before { + content: ""; } + +.wi-moon-alt-waning-gibbous-3:before { + content: ""; } + +.wi-moon-alt-waning-gibbous-4:before { + content: ""; } + +.wi-moon-alt-waning-gibbous-5:before { + content: ""; } + +.wi-moon-alt-waning-gibbous-6:before { + content: ""; } + +.wi-moon-alt-third-quarter:before { + content: ""; } + +.wi-moon-alt-waning-crescent-1:before { + content: ""; } + +.wi-moon-alt-waning-crescent-2:before { + content: ""; } + +.wi-moon-alt-waning-crescent-3:before { + content: ""; } + +.wi-moon-alt-waning-crescent-4:before { + content: ""; } + +.wi-moon-alt-waning-crescent-5:before { + content: ""; } + +.wi-moon-alt-waning-crescent-6:before { + content: ""; } + +.wi-moon-0:before { + content: ""; } + +.wi-moon-1:before { + content: ""; } + +.wi-moon-2:before { + content: ""; } + +.wi-moon-3:before { + content: ""; } + +.wi-moon-4:before { + content: ""; } + +.wi-moon-5:before { + content: ""; } + +.wi-moon-6:before { + content: ""; } + +.wi-moon-7:before { + content: ""; } + +.wi-moon-8:before { + content: ""; } + +.wi-moon-9:before { + content: ""; } + +.wi-moon-10:before { + content: ""; } + +.wi-moon-11:before { + content: ""; } + +.wi-moon-12:before { + content: ""; } + +.wi-moon-13:before { + content: ""; } + +.wi-moon-14:before { + content: ""; } + +.wi-moon-15:before { + content: ""; } + +.wi-moon-16:before { + content: ""; } + +.wi-moon-17:before { + content: ""; } + +.wi-moon-18:before { + content: ""; } + +.wi-moon-19:before { + content: ""; } + +.wi-moon-20:before { + content: ""; } + +.wi-moon-21:before { + content: ""; } + +.wi-moon-22:before { + content: ""; } + +.wi-moon-23:before { + content: ""; } + +.wi-moon-24:before { + content: ""; } + +.wi-moon-25:before { + content: ""; } + +.wi-moon-26:before { + content: ""; } + +.wi-moon-27:before { + content: ""; } + +.wi-time-1:before { + content: ""; } + +.wi-time-2:before { + content: ""; } + +.wi-time-3:before { + content: ""; } + +.wi-time-4:before { + content: ""; } + +.wi-time-5:before { + content: ""; } + +.wi-time-6:before { + content: ""; } + +.wi-time-7:before { + content: ""; } + +.wi-time-8:before { + content: ""; } + +.wi-time-9:before { + content: ""; } + +.wi-time-10:before { + content: ""; } + +.wi-time-11:before { + content: ""; } + +.wi-time-12:before { + content: ""; } + +.wi-direction-up:before { + content: ""; } + +.wi-direction-up-right:before { + content: ""; } + +.wi-direction-right:before { + content: ""; } + +.wi-direction-down-right:before { + content: ""; } + +.wi-direction-down:before { + content: ""; } + +.wi-direction-down-left:before { + content: ""; } + +.wi-direction-left:before { + content: ""; } + +.wi-direction-up-left:before { + content: ""; } + +.wi-wind-beaufort-0:before { + content: ""; } + +.wi-wind-beaufort-1:before { + content: ""; } + +.wi-wind-beaufort-2:before { + content: ""; } + +.wi-wind-beaufort-3:before { + content: ""; } + +.wi-wind-beaufort-4:before { + content: ""; } + +.wi-wind-beaufort-5:before { + content: ""; } + +.wi-wind-beaufort-6:before { + content: ""; } + +.wi-wind-beaufort-7:before { + content: ""; } + +.wi-wind-beaufort-8:before { + content: ""; } + +.wi-wind-beaufort-9:before { + content: ""; } + +.wi-wind-beaufort-10:before { + content: ""; } + +.wi-wind-beaufort-11:before { + content: ""; } + +.wi-wind-beaufort-12:before { + content: ""; } + +.wi-yahoo-0:before { + content: ""; } + +.wi-yahoo-1:before { + content: ""; } + +.wi-yahoo-2:before { + content: ""; } + +.wi-yahoo-3:before { + content: ""; } + +.wi-yahoo-4:before { + content: ""; } + +.wi-yahoo-5:before { + content: ""; } + +.wi-yahoo-6:before { + content: ""; } + +.wi-yahoo-7:before { + content: ""; } + +.wi-yahoo-8:before { + content: ""; } + +.wi-yahoo-9:before { + content: ""; } + +.wi-yahoo-10:before { + content: ""; } + +.wi-yahoo-11:before { + content: ""; } + +.wi-yahoo-12:before { + content: ""; } + +.wi-yahoo-13:before { + content: ""; } + +.wi-yahoo-14:before { + content: ""; } + +.wi-yahoo-15:before { + content: ""; } + +.wi-yahoo-16:before { + content: ""; } + +.wi-yahoo-17:before { + content: ""; } + +.wi-yahoo-18:before { + content: ""; } + +.wi-yahoo-19:before { + content: ""; } + +.wi-yahoo-20:before { + content: ""; } + +.wi-yahoo-21:before { + content: ""; } + +.wi-yahoo-22:before { + content: ""; } + +.wi-yahoo-23:before { + content: ""; } + +.wi-yahoo-24:before { + content: ""; } + +.wi-yahoo-25:before { + content: ""; } + +.wi-yahoo-26:before { + content: ""; } + +.wi-yahoo-27:before { + content: ""; } + +.wi-yahoo-28:before { + content: ""; } + +.wi-yahoo-29:before { + content: ""; } + +.wi-yahoo-30:before { + content: ""; } + +.wi-yahoo-31:before { + content: ""; } + +.wi-yahoo-32:before { + content: ""; } + +.wi-yahoo-33:before { + content: ""; } + +.wi-yahoo-34:before { + content: ""; } + +.wi-yahoo-35:before { + content: ""; } + +.wi-yahoo-36:before { + content: ""; } + +.wi-yahoo-37:before { + content: ""; } + +.wi-yahoo-38:before { + content: ""; } + +.wi-yahoo-39:before { + content: ""; } + +.wi-yahoo-40:before { + content: ""; } + +.wi-yahoo-41:before { + content: ""; } + +.wi-yahoo-42:before { + content: ""; } + +.wi-yahoo-43:before { + content: ""; } + +.wi-yahoo-44:before { + content: ""; } + +.wi-yahoo-45:before { + content: ""; } + +.wi-yahoo-46:before { + content: ""; } + +.wi-yahoo-47:before { + content: ""; } + +.wi-yahoo-3200:before { + content: ""; } + +.wi-forecast-io-clear-day:before { + content: ""; } + +.wi-forecast-io-clear-night:before { + content: ""; } + +.wi-forecast-io-rain:before { + content: ""; } + +.wi-forecast-io-snow:before { + content: ""; } + +.wi-forecast-io-sleet:before { + content: ""; } + +.wi-forecast-io-wind:before { + content: ""; } + +.wi-forecast-io-fog:before { + content: ""; } + +.wi-forecast-io-cloudy:before { + content: ""; } + +.wi-forecast-io-partly-cloudy-day:before { + content: ""; } + +.wi-forecast-io-partly-cloudy-night:before { + content: ""; } + +.wi-forecast-io-hail:before { + content: ""; } + +.wi-forecast-io-thunderstorm:before { + content: ""; } + +.wi-forecast-io-tornado:before { + content: ""; } + +.wi-wmo4680-0:before, +.wi-wmo4680-00:before { + content: ""; } + +.wi-wmo4680-1:before, +.wi-wmo4680-01:before { + content: ""; } + +.wi-wmo4680-2:before, +.wi-wmo4680-02:before { + content: ""; } + +.wi-wmo4680-3:before, +.wi-wmo4680-03:before { + content: ""; } + +.wi-wmo4680-4:before, +.wi-wmo4680-04:before { + content: ""; } + +.wi-wmo4680-5:before, +.wi-wmo4680-05:before { + content: ""; } + +.wi-wmo4680-10:before { + content: ""; } + +.wi-wmo4680-11:before { + content: ""; } + +.wi-wmo4680-12:before { + content: ""; } + +.wi-wmo4680-18:before { + content: ""; } + +.wi-wmo4680-20:before { + content: ""; } + +.wi-wmo4680-21:before { + content: ""; } + +.wi-wmo4680-22:before { + content: ""; } + +.wi-wmo4680-23:before { + content: ""; } + +.wi-wmo4680-24:before { + content: ""; } + +.wi-wmo4680-25:before { + content: ""; } + +.wi-wmo4680-26:before { + content: ""; } + +.wi-wmo4680-27:before { + content: ""; } + +.wi-wmo4680-28:before { + content: ""; } + +.wi-wmo4680-29:before { + content: ""; } + +.wi-wmo4680-30:before { + content: ""; } + +.wi-wmo4680-31:before { + content: ""; } + +.wi-wmo4680-32:before { + content: ""; } + +.wi-wmo4680-33:before { + content: ""; } + +.wi-wmo4680-34:before { + content: ""; } + +.wi-wmo4680-35:before { + content: ""; } + +.wi-wmo4680-40:before { + content: ""; } + +.wi-wmo4680-41:before { + content: ""; } + +.wi-wmo4680-42:before { + content: ""; } + +.wi-wmo4680-43:before { + content: ""; } + +.wi-wmo4680-44:before { + content: ""; } + +.wi-wmo4680-45:before { + content: ""; } + +.wi-wmo4680-46:before { + content: ""; } + +.wi-wmo4680-47:before { + content: ""; } + +.wi-wmo4680-48:before { + content: ""; } + +.wi-wmo4680-50:before { + content: ""; } + +.wi-wmo4680-51:before { + content: ""; } + +.wi-wmo4680-52:before { + content: ""; } + +.wi-wmo4680-53:before { + content: ""; } + +.wi-wmo4680-54:before { + content: ""; } + +.wi-wmo4680-55:before { + content: ""; } + +.wi-wmo4680-56:before { + content: ""; } + +.wi-wmo4680-57:before { + content: ""; } + +.wi-wmo4680-58:before { + content: ""; } + +.wi-wmo4680-60:before { + content: ""; } + +.wi-wmo4680-61:before { + content: ""; } + +.wi-wmo4680-62:before { + content: ""; } + +.wi-wmo4680-63:before { + content: ""; } + +.wi-wmo4680-64:before { + content: ""; } + +.wi-wmo4680-65:before { + content: ""; } + +.wi-wmo4680-66:before { + content: ""; } + +.wi-wmo4680-67:before { + content: ""; } + +.wi-wmo4680-68:before { + content: ""; } + +.wi-wmo4680-70:before { + content: ""; } + +.wi-wmo4680-71:before { + content: ""; } + +.wi-wmo4680-72:before { + content: ""; } + +.wi-wmo4680-73:before { + content: ""; } + +.wi-wmo4680-74:before { + content: ""; } + +.wi-wmo4680-75:before { + content: ""; } + +.wi-wmo4680-76:before { + content: ""; } + +.wi-wmo4680-77:before { + content: ""; } + +.wi-wmo4680-78:before { + content: ""; } + +.wi-wmo4680-80:before { + content: ""; } + +.wi-wmo4680-81:before { + content: ""; } + +.wi-wmo4680-82:before { + content: ""; } + +.wi-wmo4680-83:before { + content: ""; } + +.wi-wmo4680-84:before { + content: ""; } + +.wi-wmo4680-85:before { + content: ""; } + +.wi-wmo4680-86:before { + content: ""; } + +.wi-wmo4680-87:before { + content: ""; } + +.wi-wmo4680-89:before { + content: ""; } + +.wi-wmo4680-90:before { + content: ""; } + +.wi-wmo4680-91:before { + content: ""; } + +.wi-wmo4680-92:before { + content: ""; } + +.wi-wmo4680-93:before { + content: ""; } + +.wi-wmo4680-94:before { + content: ""; } + +.wi-wmo4680-95:before { + content: ""; } + +.wi-wmo4680-96:before { + content: ""; } + +.wi-wmo4680-99:before { + content: ""; } + +.wi-owm-200:before { + content: ""; } + +.wi-owm-201:before { + content: ""; } + +.wi-owm-202:before { + content: ""; } + +.wi-owm-210:before { + content: ""; } + +.wi-owm-211:before { + content: ""; } + +.wi-owm-212:before { + content: ""; } + +.wi-owm-221:before { + content: ""; } + +.wi-owm-230:before { + content: ""; } + +.wi-owm-231:before { + content: ""; } + +.wi-owm-232:before { + content: ""; } + +.wi-owm-300:before { + content: ""; } + +.wi-owm-301:before { + content: ""; } + +.wi-owm-302:before { + content: ""; } + +.wi-owm-310:before { + content: ""; } + +.wi-owm-311:before { + content: ""; } + +.wi-owm-312:before { + content: ""; } + +.wi-owm-313:before { + content: ""; } + +.wi-owm-314:before { + content: ""; } + +.wi-owm-321:before { + content: ""; } + +.wi-owm-500:before { + content: ""; } + +.wi-owm-501:before { + content: ""; } + +.wi-owm-502:before { + content: ""; } + +.wi-owm-503:before { + content: ""; } + +.wi-owm-504:before { + content: ""; } + +.wi-owm-511:before { + content: ""; } + +.wi-owm-520:before { + content: ""; } + +.wi-owm-521:before { + content: ""; } + +.wi-owm-522:before { + content: ""; } + +.wi-owm-531:before { + content: ""; } + +.wi-owm-600:before { + content: ""; } + +.wi-owm-601:before { + content: ""; } + +.wi-owm-602:before { + content: ""; } + +.wi-owm-611:before { + content: ""; } + +.wi-owm-612:before { + content: ""; } + +.wi-owm-615:before { + content: ""; } + +.wi-owm-616:before { + content: ""; } + +.wi-owm-620:before { + content: ""; } + +.wi-owm-621:before { + content: ""; } + +.wi-owm-622:before { + content: ""; } + +.wi-owm-701:before { + content: ""; } + +.wi-owm-711:before { + content: ""; } + +.wi-owm-721:before { + content: ""; } + +.wi-owm-731:before { + content: ""; } + +.wi-owm-741:before { + content: ""; } + +.wi-owm-761:before { + content: ""; } + +.wi-owm-762:before { + content: ""; } + +.wi-owm-771:before { + content: ""; } + +.wi-owm-781:before { + content: ""; } + +.wi-owm-800:before { + content: ""; } + +.wi-owm-801:before { + content: ""; } + +.wi-owm-802:before { + content: ""; } + +.wi-owm-803:before { + content: ""; } + +.wi-owm-803:before { + content: ""; } + +.wi-owm-804:before { + content: ""; } + +.wi-owm-900:before { + content: ""; } + +.wi-owm-901:before { + content: ""; } + +.wi-owm-902:before { + content: ""; } + +.wi-owm-903:before { + content: ""; } + +.wi-owm-904:before { + content: ""; } + +.wi-owm-905:before { + content: ""; } + +.wi-owm-906:before { + content: ""; } + +.wi-owm-957:before { + content: ""; } + +.wi-owm-day-200:before { + content: ""; } + +.wi-owm-day-201:before { + content: ""; } + +.wi-owm-day-202:before { + content: ""; } + +.wi-owm-day-210:before { + content: ""; } + +.wi-owm-day-211:before { + content: ""; } + +.wi-owm-day-212:before { + content: ""; } + +.wi-owm-day-221:before { + content: ""; } + +.wi-owm-day-230:before { + content: ""; } + +.wi-owm-day-231:before { + content: ""; } + +.wi-owm-day-232:before { + content: ""; } + +.wi-owm-day-300:before { + content: ""; } + +.wi-owm-day-301:before { + content: ""; } + +.wi-owm-day-302:before { + content: ""; } + +.wi-owm-day-310:before { + content: ""; } + +.wi-owm-day-311:before { + content: ""; } + +.wi-owm-day-312:before { + content: ""; } + +.wi-owm-day-313:before { + content: ""; } + +.wi-owm-day-314:before { + content: ""; } + +.wi-owm-day-321:before { + content: ""; } + +.wi-owm-day-500:before { + content: ""; } + +.wi-owm-day-501:before { + content: ""; } + +.wi-owm-day-502:before { + content: ""; } + +.wi-owm-day-503:before { + content: ""; } + +.wi-owm-day-504:before { + content: ""; } + +.wi-owm-day-511:before { + content: ""; } + +.wi-owm-day-520:before { + content: ""; } + +.wi-owm-day-521:before { + content: ""; } + +.wi-owm-day-522:before { + content: ""; } + +.wi-owm-day-531:before { + content: ""; } + +.wi-owm-day-600:before { + content: ""; } + +.wi-owm-day-601:before { + content: ""; } + +.wi-owm-day-602:before { + content: ""; } + +.wi-owm-day-611:before { + content: ""; } + +.wi-owm-day-612:before { + content: ""; } + +.wi-owm-day-615:before { + content: ""; } + +.wi-owm-day-616:before { + content: ""; } + +.wi-owm-day-620:before { + content: ""; } + +.wi-owm-day-621:before { + content: ""; } + +.wi-owm-day-622:before { + content: ""; } + +.wi-owm-day-701:before { + content: ""; } + +.wi-owm-day-711:before { + content: ""; } + +.wi-owm-day-721:before { + content: ""; } + +.wi-owm-day-731:before { + content: ""; } + +.wi-owm-day-741:before { + content: ""; } + +.wi-owm-day-761:before { + content: ""; } + +.wi-owm-day-762:before { + content: ""; } + +.wi-owm-day-781:before { + content: ""; } + +.wi-owm-day-800:before { + content: ""; } + +.wi-owm-day-801:before { + content: ""; } + +.wi-owm-day-802:before { + content: ""; } + +.wi-owm-day-803:before { + content: ""; } + +.wi-owm-day-804:before { + content: ""; } + +.wi-owm-day-900:before { + content: ""; } + +.wi-owm-day-902:before { + content: ""; } + +.wi-owm-day-903:before { + content: ""; } + +.wi-owm-day-904:before { + content: ""; } + +.wi-owm-day-906:before { + content: ""; } + +.wi-owm-day-957:before { + content: ""; } + +.wi-owm-night-200:before { + content: ""; } + +.wi-owm-night-201:before { + content: ""; } + +.wi-owm-night-202:before { + content: ""; } + +.wi-owm-night-210:before { + content: ""; } + +.wi-owm-night-211:before { + content: ""; } + +.wi-owm-night-212:before { + content: ""; } + +.wi-owm-night-221:before { + content: ""; } + +.wi-owm-night-230:before { + content: ""; } + +.wi-owm-night-231:before { + content: ""; } + +.wi-owm-night-232:before { + content: ""; } + +.wi-owm-night-300:before { + content: ""; } + +.wi-owm-night-301:before { + content: ""; } + +.wi-owm-night-302:before { + content: ""; } + +.wi-owm-night-310:before { + content: ""; } + +.wi-owm-night-311:before { + content: ""; } + +.wi-owm-night-312:before { + content: ""; } + +.wi-owm-night-313:before { + content: ""; } + +.wi-owm-night-314:before { + content: ""; } + +.wi-owm-night-321:before { + content: ""; } + +.wi-owm-night-500:before { + content: ""; } + +.wi-owm-night-501:before { + content: ""; } + +.wi-owm-night-502:before { + content: ""; } + +.wi-owm-night-503:before { + content: ""; } + +.wi-owm-night-504:before { + content: ""; } + +.wi-owm-night-511:before { + content: ""; } + +.wi-owm-night-520:before { + content: ""; } + +.wi-owm-night-521:before { + content: ""; } + +.wi-owm-night-522:before { + content: ""; } + +.wi-owm-night-531:before { + content: ""; } + +.wi-owm-night-600:before { + content: ""; } + +.wi-owm-night-601:before { + content: ""; } + +.wi-owm-night-602:before { + content: ""; } + +.wi-owm-night-611:before { + content: ""; } + +.wi-owm-night-612:before { + content: ""; } + +.wi-owm-night-615:before { + content: ""; } + +.wi-owm-night-616:before { + content: ""; } + +.wi-owm-night-620:before { + content: ""; } + +.wi-owm-night-621:before { + content: ""; } + +.wi-owm-night-622:before { + content: ""; } + +.wi-owm-night-701:before { + content: ""; } + +.wi-owm-night-711:before { + content: ""; } + +.wi-owm-night-721:before { + content: ""; } + +.wi-owm-night-731:before { + content: ""; } + +.wi-owm-night-741:before { + content: ""; } + +.wi-owm-night-761:before { + content: ""; } + +.wi-owm-night-762:before { + content: ""; } + +.wi-owm-night-781:before { + content: ""; } + +.wi-owm-night-800:before { + content: ""; } + +.wi-owm-night-801:before { + content: ""; } + +.wi-owm-night-802:before { + content: ""; } + +.wi-owm-night-803:before { + content: ""; } + +.wi-owm-night-804:before { + content: ""; } + +.wi-owm-night-900:before { + content: ""; } + +.wi-owm-night-902:before { + content: ""; } + +.wi-owm-night-903:before { + content: ""; } + +.wi-owm-night-904:before { + content: ""; } + +.wi-owm-night-906:before { + content: ""; } + +.wi-owm-night-957:before { + content: ""; } + +/* @FONT-FACE loads font into browser */ +@font-face { + font-family: 'typicons'; + font-weight: normal; + font-style: normal; + src: url("../fonts/typicons.eot"); + src: url("../fonts/typicons.eot?#iefix") format("embedded-opentype"), url("../fonts/typicons.woff") format("woff"), url("../fonts/typicons.ttf") format("truetype"), url("../fonts/typicons.svg#typicons") format("svg"); } +/* :before psuedo-selector inserts and styles icon */ +.typcn:before { + font-family: 'typicons'; + font-style: normal; + font-weight: normal; + speak: none; + display: inline-block; + text-decoration: inherit; + width: 1em; + height: 1em; + font-size: 1em; + text-align: center; + -webkit-font-smoothing: antialiased; + font-smoothing: antialiased; + text-rendering: optimizeLegibility; } + +/* Code for individual icons */ +.typcn-adjust-brightness:before { + content: '\e000'; + /* 'εÇÇ' */ } + +.typcn-adjust-contrast:before { + content: '\e001'; + /* 'εÇü' */ } + +.typcn-anchor-outline:before { + content: '\e002'; + /* 'εÇé' */ } + +.typcn-anchor:before { + content: '\e003'; + /* 'εÇâ' */ } + +.typcn-archive:before { + content: '\e004'; + /* 'εÇä' */ } + +.typcn-arrow-back-outline:before { + content: '\e005'; + /* 'εÇà' */ } + +.typcn-arrow-back:before { + content: '\e006'; + /* 'εÇå' */ } + +.typcn-arrow-down-outline:before { + content: '\e007'; + /* 'εÇç' */ } + +.typcn-arrow-down-thick:before { + content: '\e008'; + /* 'εÇê' */ } + +.typcn-arrow-down:before { + content: '\e009'; + /* 'εÇë' */ } + +.typcn-arrow-forward-outline:before { + content: '\e00a'; + /* 'εÇè' */ } + +.typcn-arrow-forward:before { + content: '\e00b'; + /* 'εÇï' */ } + +.typcn-arrow-left-outline:before { + content: '\e00c'; + /* 'εÇî' */ } + +.typcn-arrow-left-thick:before { + content: '\e00d'; + /* 'εÇì' */ } + +.typcn-arrow-left:before { + content: '\e00e'; + /* 'εÇÄ' */ } + +.typcn-arrow-loop-outline:before { + content: '\e00f'; + /* 'εÇÅ' */ } + +.typcn-arrow-loop:before { + content: '\e010'; + /* 'εÇÉ' */ } + +.typcn-arrow-maximise-outline:before { + content: '\e011'; + /* 'εÇæ' */ } + +.typcn-arrow-maximise:before { + content: '\e012'; + /* 'εÇÆ' */ } + +.typcn-arrow-minimise-outline:before { + content: '\e013'; + /* 'εÇô' */ } + +.typcn-arrow-minimise:before { + content: '\e014'; + /* 'εÇö' */ } + +.typcn-arrow-move-outline:before { + content: '\e015'; + /* 'εÇò' */ } + +.typcn-arrow-move:before { + content: '\e016'; + /* 'εÇû' */ } + +.typcn-arrow-repeat-outline:before { + content: '\e017'; + /* 'εÇù' */ } + +.typcn-arrow-repeat:before { + content: '\e018'; + /* 'εÇÿ' */ } + +.typcn-arrow-right-outline:before { + content: '\e019'; + /* 'εÇÖ' */ } + +.typcn-arrow-right-thick:before { + content: '\e01a'; + /* 'εÇÜ' */ } + +.typcn-arrow-right:before { + content: '\e01b'; + /* 'εÇ¢' */ } + +.typcn-arrow-shuffle:before { + content: '\e01c'; + /* 'εÇ£' */ } + +.typcn-arrow-sorted-down:before { + content: '\e01d'; + /* 'εÇ¥' */ } + +.typcn-arrow-sorted-up:before { + content: '\e01e'; + /* 'εÇ₧' */ } + +.typcn-arrow-sync-outline:before { + content: '\e01f'; + /* 'εǃ' */ } + +.typcn-arrow-sync:before { + content: '\e020'; + /* 'εÇá' */ } + +.typcn-arrow-unsorted:before { + content: '\e021'; + /* 'εÇí' */ } + +.typcn-arrow-up-outline:before { + content: '\e022'; + /* 'εÇó' */ } + +.typcn-arrow-up-thick:before { + content: '\e023'; + /* 'εÇú' */ } + +.typcn-arrow-up:before { + content: '\e024'; + /* 'εÇñ' */ } + +.typcn-at:before { + content: '\e025'; + /* 'εÇÑ' */ } + +.typcn-attachment-outline:before { + content: '\e026'; + /* 'εǪ' */ } + +.typcn-attachment:before { + content: '\e027'; + /* 'εǺ' */ } + +.typcn-backspace-outline:before { + content: '\e028'; + /* 'εÇ¿' */ } + +.typcn-backspace:before { + content: '\e029'; + /* 'εÇ⌐' */ } + +.typcn-battery-charge:before { + content: '\e02a'; + /* 'εǬ' */ } + +.typcn-battery-full:before { + content: '\e02b'; + /* 'εǽ' */ } + +.typcn-battery-high:before { + content: '\e02c'; + /* 'εǼ' */ } + +.typcn-battery-low:before { + content: '\e02d'; + /* 'εÇ¡' */ } + +.typcn-battery-mid:before { + content: '\e02e'; + /* 'εÇ«' */ } + +.typcn-beaker:before { + content: '\e02f'; + /* 'εÇ»' */ } + +.typcn-beer:before { + content: '\e030'; + /* 'εÇ░' */ } + +.typcn-bell:before { + content: '\e031'; + /* 'εÇ▒' */ } + +.typcn-book:before { + content: '\e032'; + /* 'εÇ▓' */ } + +.typcn-bookmark:before { + content: '\e033'; + /* 'εÇ│' */ } + +.typcn-briefcase:before { + content: '\e034'; + /* 'εÇ┤' */ } + +.typcn-brush:before { + content: '\e035'; + /* 'εÇ╡' */ } + +.typcn-business-card:before { + content: '\e036'; + /* 'εÇ╢' */ } + +.typcn-calculator:before { + content: '\e037'; + /* 'εÇ╖' */ } + +.typcn-calendar-outline:before { + content: '\e038'; + /* 'εÇ╕' */ } + +.typcn-calendar:before { + content: '\e039'; + /* 'εÇ╣' */ } + +.typcn-camera-outline:before { + content: '\e03a'; + /* 'εÇ║' */ } + +.typcn-camera:before { + content: '\e03b'; + /* 'εÇ╗' */ } + +.typcn-cancel-outline:before { + content: '\e03c'; + /* 'εÇ╝' */ } + +.typcn-cancel:before { + content: '\e03d'; + /* 'εÇ╜' */ } + +.typcn-chart-area-outline:before { + content: '\e03e'; + /* 'εÇ╛' */ } + +.typcn-chart-area:before { + content: '\e03f'; + /* 'εÇ┐' */ } + +.typcn-chart-bar-outline:before { + content: '\e040'; + /* 'εüÇ' */ } + +.typcn-chart-bar:before { + content: '\e041'; + /* 'εüü' */ } + +.typcn-chart-line-outline:before { + content: '\e042'; + /* 'εüé' */ } + +.typcn-chart-line:before { + content: '\e043'; + /* 'εüâ' */ } + +.typcn-chart-pie-outline:before { + content: '\e044'; + /* 'εüä' */ } + +.typcn-chart-pie:before { + content: '\e045'; + /* 'εüà' */ } + +.typcn-chevron-left-outline:before { + content: '\e046'; + /* 'εüå' */ } + +.typcn-chevron-left:before { + content: '\e047'; + /* 'εüç' */ } + +.typcn-chevron-right-outline:before { + content: '\e048'; + /* 'εüê' */ } + +.typcn-chevron-right:before { + content: '\e049'; + /* 'εüë' */ } + +.typcn-clipboard:before { + content: '\e04a'; + /* 'εüè' */ } + +.typcn-cloud-storage:before { + content: '\e04b'; + /* 'εüï' */ } + +.typcn-cloud-storage-outline:before { + content: '\e054'; + /* 'εüö' */ } + +.typcn-code-outline:before { + content: '\e04c'; + /* 'εüî' */ } + +.typcn-code:before { + content: '\e04d'; + /* 'εüì' */ } + +.typcn-coffee:before { + content: '\e04e'; + /* 'εüÄ' */ } + +.typcn-cog-outline:before { + content: '\e04f'; + /* 'εüÅ' */ } + +.typcn-cog:before { + content: '\e050'; + /* 'εüÉ' */ } + +.typcn-compass:before { + content: '\e051'; + /* 'εüæ' */ } + +.typcn-contacts:before { + content: '\e052'; + /* 'εüÆ' */ } + +.typcn-credit-card:before { + content: '\e053'; + /* 'εüô' */ } + +.typcn-css3:before { + content: '\e055'; + /* 'εüò' */ } + +.typcn-database:before { + content: '\e056'; + /* 'εüû' */ } + +.typcn-delete-outline:before { + content: '\e057'; + /* 'εüù' */ } + +.typcn-delete:before { + content: '\e058'; + /* 'εüÿ' */ } + +.typcn-device-desktop:before { + content: '\e059'; + /* 'εüÖ' */ } + +.typcn-device-laptop:before { + content: '\e05a'; + /* 'εüÜ' */ } + +.typcn-device-phone:before { + content: '\e05b'; + /* 'εü¢' */ } + +.typcn-device-tablet:before { + content: '\e05c'; + /* 'εü£' */ } + +.typcn-directions:before { + content: '\e05d'; + /* 'εü¥' */ } + +.typcn-divide-outline:before { + content: '\e05e'; + /* 'εü₧' */ } + +.typcn-divide:before { + content: '\e05f'; + /* 'εüƒ' */ } + +.typcn-document-add:before { + content: '\e060'; + /* 'εüá' */ } + +.typcn-document-delete:before { + content: '\e061'; + /* 'εüí' */ } + +.typcn-document-text:before { + content: '\e062'; + /* 'εüó' */ } + +.typcn-document:before { + content: '\e063'; + /* 'εüú' */ } + +.typcn-download-outline:before { + content: '\e064'; + /* 'εüñ' */ } + +.typcn-download:before { + content: '\e065'; + /* 'εüÑ' */ } + +.typcn-dropbox:before { + content: '\e066'; + /* 'εüª' */ } + +.typcn-edit:before { + content: '\e067'; + /* 'εüº' */ } + +.typcn-eject-outline:before { + content: '\e068'; + /* 'εü¿' */ } + +.typcn-eject:before { + content: '\e069'; + /* 'εü⌐' */ } + +.typcn-equals-outline:before { + content: '\e06a'; + /* 'εü¬' */ } + +.typcn-equals:before { + content: '\e06b'; + /* 'εü½' */ } + +.typcn-export-outline:before { + content: '\e06c'; + /* 'εü¼' */ } + +.typcn-export:before { + content: '\e06d'; + /* 'εü¡' */ } + +.typcn-eye-outline:before { + content: '\e06e'; + /* 'εü«' */ } + +.typcn-eye:before { + content: '\e06f'; + /* 'εü»' */ } + +.typcn-feather:before { + content: '\e070'; + /* 'εü░' */ } + +.typcn-film:before { + content: '\e071'; + /* 'εü▒' */ } + +.typcn-filter:before { + content: '\e072'; + /* 'εü▓' */ } + +.typcn-flag-outline:before { + content: '\e073'; + /* 'εü│' */ } + +.typcn-flag:before { + content: '\e074'; + /* 'εü┤' */ } + +.typcn-flash-outline:before { + content: '\e075'; + /* 'εü╡' */ } + +.typcn-flash:before { + content: '\e076'; + /* 'εü╢' */ } + +.typcn-flow-children:before { + content: '\e077'; + /* 'εü╖' */ } + +.typcn-flow-merge:before { + content: '\e078'; + /* 'εü╕' */ } + +.typcn-flow-parallel:before { + content: '\e079'; + /* 'εü╣' */ } + +.typcn-flow-switch:before { + content: '\e07a'; + /* 'εü║' */ } + +.typcn-folder-add:before { + content: '\e07b'; + /* 'εü╗' */ } + +.typcn-folder-delete:before { + content: '\e07c'; + /* 'εü╝' */ } + +.typcn-folder-open:before { + content: '\e07d'; + /* 'εü╜' */ } + +.typcn-folder:before { + content: '\e07e'; + /* 'εü╛' */ } + +.typcn-gift:before { + content: '\e07f'; + /* 'εü┐' */ } + +.typcn-globe-outline:before { + content: '\e080'; + /* 'εéÇ' */ } + +.typcn-globe:before { + content: '\e081'; + /* 'εéü' */ } + +.typcn-group-outline:before { + content: '\e082'; + /* 'εéé' */ } + +.typcn-group:before { + content: '\e083'; + /* 'εéâ' */ } + +.typcn-headphones:before { + content: '\e084'; + /* 'εéä' */ } + +.typcn-heart-full-outline:before { + content: '\e085'; + /* 'εéà' */ } + +.typcn-heart-half-outline:before { + content: '\e086'; + /* 'εéå' */ } + +.typcn-heart-outline:before { + content: '\e087'; + /* 'εéç' */ } + +.typcn-heart:before { + content: '\e088'; + /* 'εéê' */ } + +.typcn-home-outline:before { + content: '\e089'; + /* 'εéë' */ } + +.typcn-home:before { + content: '\e08a'; + /* 'εéè' */ } + +.typcn-html5:before { + content: '\e08b'; + /* 'εéï' */ } + +.typcn-image-outline:before { + content: '\e08c'; + /* 'εéî' */ } + +.typcn-image:before { + content: '\e08d'; + /* 'εéì' */ } + +.typcn-infinity-outline:before { + content: '\e08e'; + /* 'εéÄ' */ } + +.typcn-infinity:before { + content: '\e08f'; + /* 'εéÅ' */ } + +.typcn-info-large-outline:before { + content: '\e090'; + /* 'εéÉ' */ } + +.typcn-info-large:before { + content: '\e091'; + /* 'εéæ' */ } + +.typcn-info-outline:before { + content: '\e092'; + /* 'εéÆ' */ } + +.typcn-info:before { + content: '\e093'; + /* 'εéô' */ } + +.typcn-input-checked-outline:before { + content: '\e094'; + /* 'εéö' */ } + +.typcn-input-checked:before { + content: '\e095'; + /* 'εéò' */ } + +.typcn-key-outline:before { + content: '\e096'; + /* 'εéû' */ } + +.typcn-key:before { + content: '\e097'; + /* 'εéù' */ } + +.typcn-keyboard:before { + content: '\e098'; + /* 'εéÿ' */ } + +.typcn-leaf:before { + content: '\e099'; + /* 'εéÖ' */ } + +.typcn-lightbulb:before { + content: '\e09a'; + /* 'εéÜ' */ } + +.typcn-link-outline:before { + content: '\e09b'; + /* 'εé¢' */ } + +.typcn-link:before { + content: '\e09c'; + /* 'εé£' */ } + +.typcn-location-arrow-outline:before { + content: '\e09d'; + /* 'εé¥' */ } + +.typcn-location-arrow:before { + content: '\e09e'; + /* 'εé₧' */ } + +.typcn-location-outline:before { + content: '\e09f'; + /* 'εéƒ' */ } + +.typcn-location:before { + content: '\e0a0'; + /* 'εéá' */ } + +.typcn-lock-closed-outline:before { + content: '\e0a1'; + /* 'εéí' */ } + +.typcn-lock-closed:before { + content: '\e0a2'; + /* 'εéó' */ } + +.typcn-lock-open-outline:before { + content: '\e0a3'; + /* 'εéú' */ } + +.typcn-lock-open:before { + content: '\e0a4'; + /* 'εéñ' */ } + +.typcn-mail:before { + content: '\e0a5'; + /* 'εéÑ' */ } + +.typcn-map:before { + content: '\e0a6'; + /* 'εéª' */ } + +.typcn-media-eject-outline:before { + content: '\e0a7'; + /* 'εéº' */ } + +.typcn-media-eject:before { + content: '\e0a8'; + /* 'εé¿' */ } + +.typcn-media-fast-forward-outline:before { + content: '\e0a9'; + /* 'εé⌐' */ } + +.typcn-media-fast-forward:before { + content: '\e0aa'; + /* 'εé¬' */ } + +.typcn-media-pause-outline:before { + content: '\e0ab'; + /* 'εé½' */ } + +.typcn-media-pause:before { + content: '\e0ac'; + /* 'εé¼' */ } + +.typcn-media-play-outline:before { + content: '\e0ad'; + /* 'εé¡' */ } + +.typcn-media-play-reverse-outline:before { + content: '\e0ae'; + /* 'εé«' */ } + +.typcn-media-play-reverse:before { + content: '\e0af'; + /* 'εé»' */ } + +.typcn-media-play:before { + content: '\e0b0'; + /* 'εé░' */ } + +.typcn-media-record-outline:before { + content: '\e0b1'; + /* 'εé▒' */ } + +.typcn-media-record:before { + content: '\e0b2'; + /* 'εé▓' */ } + +.typcn-media-rewind-outline:before { + content: '\e0b3'; + /* 'εé│' */ } + +.typcn-media-rewind:before { + content: '\e0b4'; + /* 'εé┤' */ } + +.typcn-media-stop-outline:before { + content: '\e0b5'; + /* 'εé╡' */ } + +.typcn-media-stop:before { + content: '\e0b6'; + /* 'εé╢' */ } + +.typcn-message-typing:before { + content: '\e0b7'; + /* 'εé╖' */ } + +.typcn-message:before { + content: '\e0b8'; + /* 'εé╕' */ } + +.typcn-messages:before { + content: '\e0b9'; + /* 'εé╣' */ } + +.typcn-microphone-outline:before { + content: '\e0ba'; + /* 'εé║' */ } + +.typcn-microphone:before { + content: '\e0bb'; + /* 'εé╗' */ } + +.typcn-minus-outline:before { + content: '\e0bc'; + /* 'εé╝' */ } + +.typcn-minus:before { + content: '\e0bd'; + /* 'εé╜' */ } + +.typcn-mortar-board:before { + content: '\e0be'; + /* 'εé╛' */ } + +.typcn-news:before { + content: '\e0bf'; + /* 'εé┐' */ } + +.typcn-notes-outline:before { + content: '\e0c0'; + /* 'εâÇ' */ } + +.typcn-notes:before { + content: '\e0c1'; + /* 'εâü' */ } + +.typcn-pen:before { + content: '\e0c2'; + /* 'εâé' */ } + +.typcn-pencil:before { + content: '\e0c3'; + /* 'εââ' */ } + +.typcn-phone-outline:before { + content: '\e0c4'; + /* 'εâä' */ } + +.typcn-phone:before { + content: '\e0c5'; + /* 'εâà' */ } + +.typcn-pi-outline:before { + content: '\e0c6'; + /* 'εâå' */ } + +.typcn-pi:before { + content: '\e0c7'; + /* 'εâç' */ } + +.typcn-pin-outline:before { + content: '\e0c8'; + /* 'εâê' */ } + +.typcn-pin:before { + content: '\e0c9'; + /* 'εâë' */ } + +.typcn-pipette:before { + content: '\e0ca'; + /* 'εâè' */ } + +.typcn-plane-outline:before { + content: '\e0cb'; + /* 'εâï' */ } + +.typcn-plane:before { + content: '\e0cc'; + /* 'εâî' */ } + +.typcn-plug:before { + content: '\e0cd'; + /* 'εâì' */ } + +.typcn-plus-outline:before { + content: '\e0ce'; + /* 'εâÄ' */ } + +.typcn-plus:before { + content: '\e0cf'; + /* 'εâÅ' */ } + +.typcn-point-of-interest-outline:before { + content: '\e0d0'; + /* 'εâÉ' */ } + +.typcn-point-of-interest:before { + content: '\e0d1'; + /* 'εâæ' */ } + +.typcn-power-outline:before { + content: '\e0d2'; + /* 'εâÆ' */ } + +.typcn-power:before { + content: '\e0d3'; + /* 'εâô' */ } + +.typcn-printer:before { + content: '\e0d4'; + /* 'εâö' */ } + +.typcn-puzzle-outline:before { + content: '\e0d5'; + /* 'εâò' */ } + +.typcn-puzzle:before { + content: '\e0d6'; + /* 'εâû' */ } + +.typcn-radar-outline:before { + content: '\e0d7'; + /* 'εâù' */ } + +.typcn-radar:before { + content: '\e0d8'; + /* 'εâÿ' */ } + +.typcn-refresh-outline:before { + content: '\e0d9'; + /* 'εâÖ' */ } + +.typcn-refresh:before { + content: '\e0da'; + /* 'εâÜ' */ } + +.typcn-rss-outline:before { + content: '\e0db'; + /* 'εâ¢' */ } + +.typcn-rss:before { + content: '\e0dc'; + /* 'εâ£' */ } + +.typcn-scissors-outline:before { + content: '\e0dd'; + /* 'εâ¥' */ } + +.typcn-scissors:before { + content: '\e0de'; + /* 'εâ₧' */ } + +.typcn-shopping-bag:before { + content: '\e0df'; + /* 'εâƒ' */ } + +.typcn-shopping-cart:before { + content: '\e0e0'; + /* 'εâá' */ } + +.typcn-social-at-circular:before { + content: '\e0e1'; + /* 'εâí' */ } + +.typcn-social-dribbble-circular:before { + content: '\e0e2'; + /* 'εâó' */ } + +.typcn-social-dribbble:before { + content: '\e0e3'; + /* 'εâú' */ } + +.typcn-social-facebook-circular:before { + content: '\e0e4'; + /* 'εâñ' */ } + +.typcn-social-facebook:before { + content: '\e0e5'; + /* 'εâÑ' */ } + +.typcn-social-flickr-circular:before { + content: '\e0e6'; + /* 'εâª' */ } + +.typcn-social-flickr:before { + content: '\e0e7'; + /* 'εâº' */ } + +.typcn-social-github-circular:before { + content: '\e0e8'; + /* 'εâ¿' */ } + +.typcn-social-github:before { + content: '\e0e9'; + /* 'εâ⌐' */ } + +.typcn-social-google-plus-circular:before { + content: '\e0ea'; + /* 'εâ¬' */ } + +.typcn-social-google-plus:before { + content: '\e0eb'; + /* 'εâ½' */ } + +.typcn-social-instagram-circular:before { + content: '\e0ec'; + /* 'εâ¼' */ } + +.typcn-social-instagram:before { + content: '\e0ed'; + /* 'εâ¡' */ } + +.typcn-social-last-fm-circular:before { + content: '\e0ee'; + /* 'εâ«' */ } + +.typcn-social-last-fm:before { + content: '\e0ef'; + /* 'εâ»' */ } + +.typcn-social-linkedin-circular:before { + content: '\e0f0'; + /* 'εâ░' */ } + +.typcn-social-linkedin:before { + content: '\e0f1'; + /* 'εâ▒' */ } + +.typcn-social-pinterest-circular:before { + content: '\e0f2'; + /* 'εâ▓' */ } + +.typcn-social-pinterest:before { + content: '\e0f3'; + /* 'εâ│' */ } + +.typcn-social-skype-outline:before { + content: '\e0f4'; + /* 'εâ┤' */ } + +.typcn-social-skype:before { + content: '\e0f5'; + /* 'εâ╡' */ } + +.typcn-social-tumbler-circular:before { + content: '\e0f6'; + /* 'εâ╢' */ } + +.typcn-social-tumbler:before { + content: '\e0f7'; + /* 'εâ╖' */ } + +.typcn-social-twitter-circular:before { + content: '\e0f8'; + /* 'εâ╕' */ } + +.typcn-social-twitter:before { + content: '\e0f9'; + /* 'εâ╣' */ } + +.typcn-social-vimeo-circular:before { + content: '\e0fa'; + /* 'εâ║' */ } + +.typcn-social-vimeo:before { + content: '\e0fb'; + /* 'εâ╗' */ } + +.typcn-social-youtube-circular:before { + content: '\e0fc'; + /* 'εâ╝' */ } + +.typcn-social-youtube:before { + content: '\e0fd'; + /* 'εâ╜' */ } + +.typcn-sort-alphabetically-outline:before { + content: '\e0fe'; + /* 'εâ╛' */ } + +.typcn-sort-alphabetically:before { + content: '\e0ff'; + /* 'εâ┐' */ } + +.typcn-sort-numerically-outline:before { + content: '\e100'; + /* 'εäÇ' */ } + +.typcn-sort-numerically:before { + content: '\e101'; + /* 'εäü' */ } + +.typcn-spanner-outline:before { + content: '\e102'; + /* 'εäé' */ } + +.typcn-spanner:before { + content: '\e103'; + /* 'εäâ' */ } + +.typcn-spiral:before { + content: '\e104'; + /* 'εää' */ } + +.typcn-star-full-outline:before { + content: '\e105'; + /* 'εäà' */ } + +.typcn-star-half-outline:before { + content: '\e106'; + /* 'εäå' */ } + +.typcn-star-half:before { + content: '\e107'; + /* 'εäç' */ } + +.typcn-star-outline:before { + content: '\e108'; + /* 'εäê' */ } + +.typcn-star:before { + content: '\e109'; + /* 'εäë' */ } + +.typcn-starburst-outline:before { + content: '\e10a'; + /* 'εäè' */ } + +.typcn-starburst:before { + content: '\e10b'; + /* 'εäï' */ } + +.typcn-stopwatch:before { + content: '\e10c'; + /* 'εäî' */ } + +.typcn-support:before { + content: '\e10d'; + /* 'εäì' */ } + +.typcn-tabs-outline:before { + content: '\e10e'; + /* 'εäÄ' */ } + +.typcn-tag:before { + content: '\e10f'; + /* 'εäÅ' */ } + +.typcn-tags:before { + content: '\e110'; + /* 'εäÉ' */ } + +.typcn-th-large-outline:before { + content: '\e111'; + /* 'εäæ' */ } + +.typcn-th-large:before { + content: '\e112'; + /* 'εäÆ' */ } + +.typcn-th-list-outline:before { + content: '\e113'; + /* 'εäô' */ } + +.typcn-th-list:before { + content: '\e114'; + /* 'εäö' */ } + +.typcn-th-menu-outline:before { + content: '\e115'; + /* 'εäò' */ } + +.typcn-th-menu:before { + content: '\e116'; + /* 'εäû' */ } + +.typcn-th-small-outline:before { + content: '\e117'; + /* 'εäù' */ } + +.typcn-th-small:before { + content: '\e118'; + /* 'εäÿ' */ } + +.typcn-thermometer:before { + content: '\e119'; + /* 'εäÖ' */ } + +.typcn-thumbs-down:before { + content: '\e11a'; + /* 'εäÜ' */ } + +.typcn-thumbs-ok:before { + content: '\e11b'; + /* 'εä¢' */ } + +.typcn-thumbs-up:before { + content: '\e11c'; + /* 'εä£' */ } + +.typcn-tick-outline:before { + content: '\e11d'; + /* 'εä¥' */ } + +.typcn-tick:before { + content: '\e11e'; + /* 'εä₧' */ } + +.typcn-ticket:before { + content: '\e11f'; + /* 'εäƒ' */ } + +.typcn-time:before { + content: '\e120'; + /* 'εäá' */ } + +.typcn-times-outline:before { + content: '\e121'; + /* 'εäí' */ } + +.typcn-times:before { + content: '\e122'; + /* 'εäó' */ } + +.typcn-trash:before { + content: '\e123'; + /* 'εäú' */ } + +.typcn-tree:before { + content: '\e124'; + /* 'εäñ' */ } + +.typcn-upload-outline:before { + content: '\e125'; + /* 'εäÑ' */ } + +.typcn-upload:before { + content: '\e126'; + /* 'εäª' */ } + +.typcn-user-add-outline:before { + content: '\e127'; + /* 'εäº' */ } + +.typcn-user-add:before { + content: '\e128'; + /* 'εä¿' */ } + +.typcn-user-delete-outline:before { + content: '\e129'; + /* 'εä⌐' */ } + +.typcn-user-delete:before { + content: '\e12a'; + /* 'εä¬' */ } + +.typcn-user-outline:before { + content: '\e12b'; + /* 'εä½' */ } + +.typcn-user:before { + content: '\e12c'; + /* 'εä¼' */ } + +.typcn-vendor-android:before { + content: '\e12d'; + /* 'εä¡' */ } + +.typcn-vendor-apple:before { + content: '\e12e'; + /* 'εä«' */ } + +.typcn-vendor-microsoft:before { + content: '\e12f'; + /* 'εä»' */ } + +.typcn-video-outline:before { + content: '\e130'; + /* 'εä░' */ } + +.typcn-video:before { + content: '\e131'; + /* 'εä▒' */ } + +.typcn-volume-down:before { + content: '\e132'; + /* 'εä▓' */ } + +.typcn-volume-mute:before { + content: '\e133'; + /* 'εä│' */ } + +.typcn-volume-up:before { + content: '\e134'; + /* 'εä┤' */ } + +.typcn-volume:before { + content: '\e135'; + /* 'εä╡' */ } + +.typcn-warning-outline:before { + content: '\e136'; + /* 'εä╢' */ } + +.typcn-warning:before { + content: '\e137'; + /* 'εä╖' */ } + +.typcn-watch:before { + content: '\e138'; + /* 'εä╕' */ } + +.typcn-waves-outline:before { + content: '\e139'; + /* 'εä╣' */ } + +.typcn-waves:before { + content: '\e13a'; + /* 'εä║' */ } + +.typcn-weather-cloudy:before { + content: '\e13b'; + /* 'εä╗' */ } + +.typcn-weather-downpour:before { + content: '\e13c'; + /* 'εä╝' */ } + +.typcn-weather-night:before { + content: '\e13d'; + /* 'εä╜' */ } + +.typcn-weather-partly-sunny:before { + content: '\e13e'; + /* 'εä╛' */ } + +.typcn-weather-shower:before { + content: '\e13f'; + /* 'εä┐' */ } + +.typcn-weather-snow:before { + content: '\e140'; + /* 'εàÇ' */ } + +.typcn-weather-stormy:before { + content: '\e141'; + /* 'εàü' */ } + +.typcn-weather-sunny:before { + content: '\e142'; + /* 'εàé' */ } + +.typcn-weather-windy-cloudy:before { + content: '\e143'; + /* 'εàâ' */ } + +.typcn-weather-windy:before { + content: '\e144'; + /* 'εàä' */ } + +.typcn-wi-fi-outline:before { + content: '\e145'; + /* 'εàà' */ } + +.typcn-wi-fi:before { + content: '\e146'; + /* 'εàå' */ } + +.typcn-wine:before { + content: '\e147'; + /* 'εàç' */ } + +.typcn-world-outline:before { + content: '\e148'; + /* 'εàê' */ } + +.typcn-world:before { + content: '\e149'; + /* 'εàë' */ } + +.typcn-zoom-in-outline:before { + content: '\e14a'; + /* 'εàè' */ } + +.typcn-zoom-in:before { + content: '\e14b'; + /* 'εàï' */ } + +.typcn-zoom-out-outline:before { + content: '\e14c'; + /* 'εàî' */ } + +.typcn-zoom-out:before { + content: '\e14d'; + /* 'εàì' */ } + +.typcn-zoom-outline:before { + content: '\e14e'; + /* 'εàÄ' */ } + +.typcn-zoom:before { + content: '\e14f'; + /* 'εàÅ' */ } + +@font-face { + font-family: "dripicons-v2"; + src: url("../fonts/dripicons-v2.eot"); + src: url("../fonts/dripicons-v2.eot?#iefix") format("embedded-opentype"), url("../fonts/dripicons-v2.woff") format("woff"), url("../fonts/dripicons-v2.ttf") format("truetype"), url("../fonts/dripicons-v2.svg#dripicons-v2") format("svg"); + font-weight: normal; + font-style: normal; } +[data-icon]:before { + font-family: "dripicons-v2" !important; + content: attr(data-icon); + font-style: normal !important; + font-weight: normal !important; + font-variant: normal !important; + text-transform: none !important; + speak: none; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; } + +[class^="dripicons-"]:before, +[class*=" dripicons-"]:before { + font-family: "dripicons-v2" !important; + font-style: normal !important; + font-weight: normal !important; + font-variant: normal !important; + text-transform: none !important; + speak: none; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; } + +.dripicons-alarm:before { + content: "\61"; } + +.dripicons-align-center:before { + content: "\62"; } + +.dripicons-align-justify:before { + content: "\63"; } + +.dripicons-align-left:before { + content: "\64"; } + +.dripicons-align-right:before { + content: "\65"; } + +.dripicons-anchor:before { + content: "\66"; } + +.dripicons-archive:before { + content: "\67"; } + +.dripicons-arrow-down:before { + content: "\68"; } + +.dripicons-arrow-left:before { + content: "\69"; } + +.dripicons-arrow-right:before { + content: "\6a"; } + +.dripicons-arrow-thin-down:before { + content: "\6b"; } + +.dripicons-arrow-thin-left:before { + content: "\6c"; } + +.dripicons-arrow-thin-right:before { + content: "\6d"; } + +.dripicons-arrow-thin-up:before { + content: "\6e"; } + +.dripicons-arrow-up:before { + content: "\6f"; } + +.dripicons-article:before { + content: "\70"; } + +.dripicons-backspace:before { + content: "\71"; } + +.dripicons-basket:before { + content: "\72"; } + +.dripicons-basketball:before { + content: "\73"; } + +.dripicons-battery-empty:before { + content: "\74"; } + +.dripicons-battery-full:before { + content: "\75"; } + +.dripicons-battery-low:before { + content: "\76"; } + +.dripicons-battery-medium:before { + content: "\77"; } + +.dripicons-bell:before { + content: "\78"; } + +.dripicons-blog:before { + content: "\79"; } + +.dripicons-bluetooth:before { + content: "\7a"; } + +.dripicons-bold:before { + content: "\41"; } + +.dripicons-bookmark:before { + content: "\42"; } + +.dripicons-bookmarks:before { + content: "\43"; } + +.dripicons-box:before { + content: "\44"; } + +.dripicons-briefcase:before { + content: "\45"; } + +.dripicons-brightness-low:before { + content: "\46"; } + +.dripicons-brightness-max:before { + content: "\47"; } + +.dripicons-brightness-medium:before { + content: "\48"; } + +.dripicons-broadcast:before { + content: "\49"; } + +.dripicons-browser:before { + content: "\4a"; } + +.dripicons-browser-upload:before { + content: "\4b"; } + +.dripicons-brush:before { + content: "\4c"; } + +.dripicons-calendar:before { + content: "\4d"; } + +.dripicons-camcorder:before { + content: "\4e"; } + +.dripicons-camera:before { + content: "\4f"; } + +.dripicons-card:before { + content: "\50"; } + +.dripicons-cart:before { + content: "\51"; } + +.dripicons-checklist:before { + content: "\52"; } + +.dripicons-checkmark:before { + content: "\53"; } + +.dripicons-chevron-down:before { + content: "\54"; } + +.dripicons-chevron-left:before { + content: "\55"; } + +.dripicons-chevron-right:before { + content: "\56"; } + +.dripicons-chevron-up:before { + content: "\57"; } + +.dripicons-clipboard:before { + content: "\58"; } + +.dripicons-clock:before { + content: "\59"; } + +.dripicons-clockwise:before { + content: "\5a"; } + +.dripicons-cloud:before { + content: "\30"; } + +.dripicons-cloud-download:before { + content: "\31"; } + +.dripicons-cloud-upload:before { + content: "\32"; } + +.dripicons-code:before { + content: "\33"; } + +.dripicons-contract:before { + content: "\34"; } + +.dripicons-contract-2:before { + content: "\35"; } + +.dripicons-conversation:before { + content: "\36"; } + +.dripicons-copy:before { + content: "\37"; } + +.dripicons-crop:before { + content: "\38"; } + +.dripicons-cross:before { + content: "\39"; } + +.dripicons-crosshair:before { + content: "\21"; } + +.dripicons-cutlery:before { + content: "\22"; } + +.dripicons-device-desktop:before { + content: "\23"; } + +.dripicons-device-mobile:before { + content: "\24"; } + +.dripicons-device-tablet:before { + content: "\25"; } + +.dripicons-direction:before { + content: "\26"; } + +.dripicons-disc:before { + content: "\27"; } + +.dripicons-document:before { + content: "\28"; } + +.dripicons-document-delete:before { + content: "\29"; } + +.dripicons-document-edit:before { + content: "\2a"; } + +.dripicons-document-new:before { + content: "\2b"; } + +.dripicons-document-remove:before { + content: "\2c"; } + +.dripicons-dot:before { + content: "\2d"; } + +.dripicons-dots-2:before { + content: "\2e"; } + +.dripicons-dots-3:before { + content: "\2f"; } + +.dripicons-download:before { + content: "\3a"; } + +.dripicons-duplicate:before { + content: "\3b"; } + +.dripicons-enter:before { + content: "\3c"; } + +.dripicons-exit:before { + content: "\3d"; } + +.dripicons-expand:before { + content: "\3e"; } + +.dripicons-expand-2:before { + content: "\3f"; } + +.dripicons-experiment:before { + content: "\40"; } + +.dripicons-export:before { + content: "\5b"; } + +.dripicons-feed:before { + content: "\5d"; } + +.dripicons-flag:before { + content: "\5e"; } + +.dripicons-flashlight:before { + content: "\5f"; } + +.dripicons-folder:before { + content: "\60"; } + +.dripicons-folder-open:before { + content: "\7b"; } + +.dripicons-forward:before { + content: "\7c"; } + +.dripicons-gaming:before { + content: "\7d"; } + +.dripicons-gear:before { + content: "\7e"; } + +.dripicons-graduation:before { + content: "\5c"; } + +.dripicons-graph-bar:before { + content: "\e000"; } + +.dripicons-graph-line:before { + content: "\e001"; } + +.dripicons-graph-pie:before { + content: "\e002"; } + +.dripicons-headset:before { + content: "\e003"; } + +.dripicons-heart:before { + content: "\e004"; } + +.dripicons-help:before { + content: "\e005"; } + +.dripicons-home:before { + content: "\e006"; } + +.dripicons-hourglass:before { + content: "\e007"; } + +.dripicons-inbox:before { + content: "\e008"; } + +.dripicons-information:before { + content: "\e009"; } + +.dripicons-italic:before { + content: "\e00a"; } + +.dripicons-jewel:before { + content: "\e00b"; } + +.dripicons-lifting:before { + content: "\e00c"; } + +.dripicons-lightbulb:before { + content: "\e00d"; } + +.dripicons-link:before { + content: "\e00e"; } + +.dripicons-link-broken:before { + content: "\e00f"; } + +.dripicons-list:before { + content: "\e010"; } + +.dripicons-loading:before { + content: "\e011"; } + +.dripicons-location:before { + content: "\e012"; } + +.dripicons-lock:before { + content: "\e013"; } + +.dripicons-lock-open:before { + content: "\e014"; } + +.dripicons-mail:before { + content: "\e015"; } + +.dripicons-map:before { + content: "\e016"; } + +.dripicons-media-loop:before { + content: "\e017"; } + +.dripicons-media-next:before { + content: "\e018"; } + +.dripicons-media-pause:before { + content: "\e019"; } + +.dripicons-media-play:before { + content: "\e01a"; } + +.dripicons-media-previous:before { + content: "\e01b"; } + +.dripicons-media-record:before { + content: "\e01c"; } + +.dripicons-media-shuffle:before { + content: "\e01d"; } + +.dripicons-media-stop:before { + content: "\e01e"; } + +.dripicons-medical:before { + content: "\e01f"; } + +.dripicons-menu:before { + content: "\e020"; } + +.dripicons-message:before { + content: "\e021"; } + +.dripicons-meter:before { + content: "\e022"; } + +.dripicons-microphone:before { + content: "\e023"; } + +.dripicons-minus:before { + content: "\e024"; } + +.dripicons-monitor:before { + content: "\e025"; } + +.dripicons-move:before { + content: "\e026"; } + +.dripicons-music:before { + content: "\e027"; } + +.dripicons-network-1:before { + content: "\e028"; } + +.dripicons-network-2:before { + content: "\e029"; } + +.dripicons-network-3:before { + content: "\e02a"; } + +.dripicons-network-4:before { + content: "\e02b"; } + +.dripicons-network-5:before { + content: "\e02c"; } + +.dripicons-pamphlet:before { + content: "\e02d"; } + +.dripicons-paperclip:before { + content: "\e02e"; } + +.dripicons-pencil:before { + content: "\e02f"; } + +.dripicons-phone:before { + content: "\e030"; } + +.dripicons-photo:before { + content: "\e031"; } + +.dripicons-photo-group:before { + content: "\e032"; } + +.dripicons-pill:before { + content: "\e033"; } + +.dripicons-pin:before { + content: "\e034"; } + +.dripicons-plus:before { + content: "\e035"; } + +.dripicons-power:before { + content: "\e036"; } + +.dripicons-preview:before { + content: "\e037"; } + +.dripicons-print:before { + content: "\e038"; } + +.dripicons-pulse:before { + content: "\e039"; } + +.dripicons-question:before { + content: "\e03a"; } + +.dripicons-reply:before { + content: "\e03b"; } + +.dripicons-reply-all:before { + content: "\e03c"; } + +.dripicons-return:before { + content: "\e03d"; } + +.dripicons-retweet:before { + content: "\e03e"; } + +.dripicons-rocket:before { + content: "\e03f"; } + +.dripicons-scale:before { + content: "\e040"; } + +.dripicons-search:before { + content: "\e041"; } + +.dripicons-shopping-bag:before { + content: "\e042"; } + +.dripicons-skip:before { + content: "\e043"; } + +.dripicons-stack:before { + content: "\e044"; } + +.dripicons-star:before { + content: "\e045"; } + +.dripicons-stopwatch:before { + content: "\e046"; } + +.dripicons-store:before { + content: "\e047"; } + +.dripicons-suitcase:before { + content: "\e048"; } + +.dripicons-swap:before { + content: "\e049"; } + +.dripicons-tag:before { + content: "\e04a"; } + +.dripicons-tag-delete:before { + content: "\e04b"; } + +.dripicons-tags:before { + content: "\e04c"; } + +.dripicons-thumbs-down:before { + content: "\e04d"; } + +.dripicons-thumbs-up:before { + content: "\e04e"; } + +.dripicons-ticket:before { + content: "\e04f"; } + +.dripicons-time-reverse:before { + content: "\e050"; } + +.dripicons-to-do:before { + content: "\e051"; } + +.dripicons-toggles:before { + content: "\e052"; } + +.dripicons-trash:before { + content: "\e053"; } + +.dripicons-trophy:before { + content: "\e054"; } + +.dripicons-upload:before { + content: "\e055"; } + +.dripicons-user:before { + content: "\e056"; } + +.dripicons-user-group:before { + content: "\e057"; } + +.dripicons-user-id:before { + content: "\e058"; } + +.dripicons-vibrate:before { + content: "\e059"; } + +.dripicons-view-apps:before { + content: "\e05a"; } + +.dripicons-view-list:before { + content: "\e05b"; } + +.dripicons-view-list-large:before { + content: "\e05c"; } + +.dripicons-view-thumb:before { + content: "\e05d"; } + +.dripicons-volume-full:before { + content: "\e05e"; } + +.dripicons-volume-low:before { + content: "\e05f"; } + +.dripicons-volume-medium:before { + content: "\e060"; } + +.dripicons-volume-off:before { + content: "\e061"; } + +.dripicons-wallet:before { + content: "\e062"; } + +.dripicons-warning:before { + content: "\e063"; } + +.dripicons-web:before { + content: "\e064"; } + +.dripicons-weight:before { + content: "\e065"; } + +.dripicons-wifi:before { + content: "\e066"; } + +.dripicons-wrong:before { + content: "\e067"; } + +.dripicons-zoom-in:before { + content: "\e068"; } + +.dripicons-zoom-out:before { + content: "\e069"; } + +/*# sourceMappingURL=icons.css.map */ diff --git a/Monitor/wwwroot/assets/css/icons.css.map b/Monitor/wwwroot/assets/css/icons.css.map new file mode 100644 index 0000000..c08510c --- /dev/null +++ b/Monitor/wwwroot/assets/css/icons.css.map @@ -0,0 +1,7 @@ +{ +"version": 3, +"mappings": "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AO,ECAjB,GAAO;;ADC/B,gCAAiC;EAAC,OAAO,ECAjB,GAAO;;ADC/B,6BAA8B;EAAC,OAAO,ECAjB,GAAO;;ADC5B,gCAAiC;EAAC,OAAO,ECAjB,GAAO;;ADC/B,gCAAiC;EAAC,OAAO,ECAjB,GAAO;;ADC/B,gCAAiC;EAAC,OAAO,ECAjB,GAAO;;ADC/B,gCAAiC;EAAC,OAAO,ECAjB,GAAO;;ADC/B,gCAAiC;EAAC,OAAO,ECAjB,GAAO;;ADC/B,gCAAiC;EAAC,OAAO,ECAjB,GAAO;;ADC/B,oBAAqB;EAAC,OAAO,ECAjB,GAAO;;ADCnB,gCAAiC;EAAC,OAAO,ECAjB,GAAO;;ADC/B,gCAAiC;EAAC,OAAO,ECAjB,GAAO;;ADC/B,gCAAiC;EAAC,OAAO,ECAjB,GAAO;;ADC/B,gCAAiC;EAAC,OAAO,ECAjB,GAAO;;ADC/B,gCAAiC;EAAC,OAAO,ECAjB,GAAO;;ADC/B,gCAAiC;EAAC,OAAO,ECAjB,GAAO;;ADC/B,6BAA8B;EAAC,OAAO,ECAjB,GAAO;;ADC5B,iCAAkC;EAAC,OAAO,ECAjB,GAAO;;ADChC,iCAAkC;EAAC,OAAO,ECAjB,GAAO;;ADChC,iCAAkC;EAAC,OAAO,ECAjB,GAAO;;ADChC,iCAAkC;EAAC,OAAO,ECAjB,GAAO;;ADChC,iCAAkC;EAAC,OAAO,ECAjB,GAAO;;ADChC,iCAAkC;EAAC,OAAO,ECAjB,GAAO;;ADChC,uBAAwB;EAAC,OAAO,ECAjB,GAAO;;ADCtB,oCAAqC;EAAC,OAAO,ECAjB,GAAO;;ADCnC,oCAAqC;EAAC,OAAO,ECAjB,GAAO;;ADCnC,oCAAqC;EAAC,OAAO,ECAjB,GAAO;;ADCnC,oCAAqC;EAAC,OAAO,ECAjB,GAAO;;ADCnC,oCAAqC;EAAC,OAAO,ECAjB,GAAO;;ADCnC,oCAAqC;EAAC,OAAO,ECAjB,GAAO;;ADCnC,iCAAkC;EAAC,OAAO,ECAjB,GAAO;;ADChC,oCAAqC;EAAC,OAAO,ECAjB,GAAO;;ADCnC,oCAAqC;EAAC,OAAO,ECAjB,GAAO;;ADCnC,oCAAqC;EAAC,OAAO,ECAjB,GAAO;;ADCnC,oCAAqC;EAAC,OAAO,ECAjB,GAAO;;ADCnC,oCAAqC;EAAC,OAAO,ECAjB,GAAO;;ADCnC,oCAAqC;EAAC,OAAO,ECAjB,GAAO;;ADCnC,wBAAyB;EAAC,OAAO,ECAjB,GAAO;;ADCvB,oCAAqC;EAAC,OAAO,ECAjB,GAAO;;ADCnC,oCAAqC;EAAC,OAAO,ECAjB,GAAO;;ADCnC,oCAAqC;EAAC,OAAO,ECAjB,GAAO;;ADCnC,oCAAqC;EAAC,OAAO,ECAjB,GAAO;;ADCnC,oCAAqC;EAAC,OAAO,ECAjB,GAAO;;ADCnC,oCAAqC;EAAC,OAAO,ECAjB,GAAO;;ADCnC,iCAAkC;EAAC,OAAO,ECAjB,GAAO;;ADChC,qCAAsC;EAAC,OAAO,ECAjB,GAAO;;ADCpC,qCAAsC;EAAC,OAAO,ECAjB,GAAO;;ADCpC,qCAAsC;EAAC,OAAO,ECAjB,GAAO;;ADCpC,qCAAsC;EAAC,OAAO,ECAjB,GAAO;;ADCpC,qCAAsC;EAAC,OAAO,ECAjB,GAAO;;ADCpC,qCAAsC;EAAC,OAAO,ECAjB,GAAO;;ACvDpC,iBAAkB;EAAC,OAAO,EDAf,GAAO;;ACClB,iBAAkB;EAAC,OAAO,EDAF,GAAO;;ACC/B,iBAAkB;EAAC,OAAO,EDAF,GAAO;;ACC/B,iBAAkB;EAAC,OAAO,EDAF,GAAO;;ACC/B,iBAAkB;EAAC,OAAO,EDAF,GAAO;;ACC/B,iBAAkB;EAAC,OAAO,EDAF,GAAO;;ACC/B,iBAAkB;EAAC,OAAO,EDAF,GAAO;;ACC/B,iBAAkB;EAAC,OAAO,EDAL,GAAO;;ACC5B,iBAAkB;EAAC,OAAO,EDAF,GAAO;;ACC/B,iBAAkB;EAAC,OAAO,EDAF,GAAO;;ACC/B,kBAAmB;EAAC,OAAO,EDAH,GAAO;;ACC/B,kBAAmB;EAAC,OAAO,EDAH,GAAO;;ACC/B,kBAAmB;EAAC,OAAO,EDAH,GAAO;;ACC/B,kBAAmB;EAAC,OAAO,EDAH,GAAO;;ACC/B,kBAAmB;EAAC,OAAO,EDAf,GAAO;;ACCnB,kBAAmB;EAAC,OAAO,EDAH,GAAO;;ACC/B,kBAAmB;EAAC,OAAO,EDAH,GAAO;;ACC/B,kBAAmB;EAAC,OAAO,EDAH,GAAO;;ACC/B,kBAAmB;EAAC,OAAO,EDAH,GAAO;;ACC/B,kBAAmB;EAAC,OAAO,EDAH,GAAO;;ACC/B,kBAAmB;EAAC,OAAO,EDAH,GAAO;;ACC/B,kBAAmB;EAAC,OAAO,EDAN,GAAO;;ACC5B,kBAAmB;EAAC,OAAO,EDAF,GAAO;;ACChC,kBAAmB;EAAC,OAAO,EDAF,GAAO;;ACChC,kBAAmB;EAAC,OAAO,EDAF,GAAO;;ACChC,kBAAmB;EAAC,OAAO,EDAF,GAAO;;ACChC,kBAAmB;EAAC,OAAO,EDAF,GAAO;;ACChC,kBAAmB;EAAC,OAAO,EDAF,GAAO;;AE3BhC,iBAAkB;EAAC,OAAO,ECAjB,GAAO;;ADChB,iBAAkB;EAAC,OAAO,ECAjB,GAAO;;ADChB,iBAAkB;EAAC,OAAO,ECAjB,GAAO;;ADChB,iBAAkB;EAAC,OAAO,ECAjB,GAAO;;ADChB,iBAAkB;EAAC,OAAO,ECAjB,GAAO;;ADChB,iBAAkB;EAAC,OAAO,ECAjB,GAAO;;ADChB,iBAAkB;EAAC,OAAO,ECAjB,GAAO;;ADChB,iBAAkB;EAAC,OAAO,ECAjB,GAAO;;ADChB,iBAAkB;EAAC,OAAO,ECAjB,GAAO;;ADChB,kBAAmB;EAAC,OAAO,ECAjB,GAAO;;ADCjB,kBAAmB;EAAC,OAAO,ECAjB,GAAO;;ADCjB,kBAAmB;EAAC,OAAO,ECAjB,GAAO;;ACXjB,uBAAwB;EAAC,OAAO,ECAjB,GAAO;;ADCtB,6BAA8B;EAAC,OAAO,ECAjB,GAAO;;ADC5B,0BAA2B;EAAC,OAAO,ECAjB,GAAO;;ADCzB,+BAAgC;EAAC,OAAO,ECAjB,GAAO;;ADC9B,yBAA0B;EAAC,OAAO,ECAjB,GAAO;;ADCxB,8BAA+B;EAAC,OAAO,ECAjB,GAAO;;ADC7B,yBAA0B;EAAC,OAAO,ECAjB,GAAO;;ADCxB,4BAA6B;EAAC,OAAO,ECAjB,GAAO;;ACP3B,0BAA2B;EAAC,OAAO,ECAjB,GAAO;;ADCzB,0BAA2B;EAAC,OAAO,ECAjB,GAAO;;ADCzB,0BAA2B;EAAC,OAAO,ECAjB,GAAO;;ADCzB,0BAA2B;EAAC,OAAO,ECAjB,GAAO;;ADCzB,0BAA2B;EAAC,OAAO,ECAjB,GAAO;;ADCzB,0BAA2B;EAAC,OAAO,ECAjB,GAAO;;ADCzB,0BAA2B;EAAC,OAAO,ECAjB,GAAO;;ADCzB,0BAA2B;EAAC,OAAO,ECAjB,GAAO;;ADCzB,0BAA2B;EAAC,OAAO,ECAjB,GAAO;;ADCzB,0BAA2B;EAAC,OAAO,ECAjB,GAAO;;ADCzB,2BAA4B;EAAC,OAAO,ECAjB,GAAO;;ADC1B,2BAA4B;EAAC,OAAO,ECAjB,GAAO;;ADC1B,2BAA4B;EAAC,OAAO,ECAjB,GAAO;;ACZ1B,kBAAkC;EAAE,OAAO,EbkCjC,GAAO;;AajCjB,kBAAkC;EAAE,OAAO,EhBiBvB,GAAO;;AgBhB3B,kBAAkC;EAAE,OAAO,Eb+B/B,GAAO;;Aa9BnB,kBAAkC;EAAE,OAAO,EbW5B,GAAO;;AaVtB,kBAAkC;EAAE,OAAO,EbU5B,GAAO;;AaTtB,kBAAkC;EAAE,OAAO,EbEhC,GAAO;;AaDlB,kBAAkC;EAAE,OAAO,EbChC,GAAO;;AaAlB,kBAAkC;EAAE,OAAO,EbAhC,GAAO;;AaClB,kBAAkC;EAAE,OAAO,EbHpC,GAAO;;AaId,kBAAkC;EAAE,OAAO,EbAjC,GAAO;;AaCjB,mBAAmC;EAAE,OAAO,EbLrC,GAAO;;AaMd,mBAAmC;EAAE,OAAO,EbFlC,GAAO;;AaGjB,mBAAmC;EAAE,OAAO,EbHlC,GAAO;;AaIjB,mBAAmC;EAAE,OAAO,EbGrC,GAAO;;AaFd,mBAAmC;EAAE,OAAO,EhBAjC,GAAO;;AgBClB,mBAAmC;EAAE,OAAO,EbAhC,GAAO;;AaCnB,mBAAmC;EAAE,OAAO,EbArC,GAAO;;AaCd,mBAAmC;EAAE,OAAO,EbZrC,GAAO;;Aaad,mBAAmC;EAAE,OAAO,EbXjC,GAAO;;AaYlB,mBAAmC;EAAE,OAAO,EbGrC,GAAO;;AaFd,mBAAmC;EAAE,OAAO,EbhBtC,GAAO;;AaiBb,mBAAmC;EAAE,OAAO,EbGpC,GAAO;;AaFf,mBAAmC;EAAE,OAAO,EbJpC,GAAO;;AaKf,mBAAmC;EAAE,OAAO,EbE9B,GAAO;;AaDrB,mBAAmC;EAAE,OAAO,EbC9B,GAAO;;AaArB,mBAAmC;EAAE,OAAO,EbF3B,GAAO;;AaGxB,mBAAmC;EAAE,OAAO,EbzBnC,GAAO;;Aa0BhB,mBAAmC;EAAE,OAAO,EdT7B,GAAO;;AcUtB,mBAAmC;EAAE,OAAO,EhB3B/B,GAAO;;AgB4BpB,mBAAmC;EAAE,OAAO,EdX7B,GAAO;;AcYtB,mBAAmC;EAAE,OAAO,EhB7B/B,GAAO;;AgB8BpB,mBAAmC;EAAE,OAAO,Ed/B9B,GAAO;;AcgCrB,mBAAmC;EAAE,OAAO,EhBhChC,GAAO;;AgBiCnB,mBAAmC;EAAE,OAAO,EdTtB,GAAO;;AcU7B,mBAAmC;EAAE,OAAO,EhBfvB,GAAO;;AgBgB5B,mBAAmC;EAAE,OAAO,Eb5BjC,GAAO;;Aa6BlB,mBAAmC;EAAE,OAAO,EhBbtC,GAAO;;AgBcb,mBAAmC;EAAE,OAAO,EhBnBxB,GAAO;;AgBoB3B,mBAAmC;EAAE,OAAO,EhBpBxB,GAAO;;AgBqB3B,mBAAmC;EAAE,OAAO,EhBrBxB,GAAO;;AgBsB3B,mBAAmC;EAAE,OAAO,Eb/BlC,GAAO;;AagCjB,mBAAmC;EAAE,OAAO,Eb1BhC,GAAO;;Aa2BnB,mBAAmC;EAAE,OAAO,Eb1BrC,GAAO;;Aa2Bd,mBAAmC;EAAE,OAAO,Eb5BhC,GAAO;;Aa6BnB,mBAAmC;EAAE,OAAO,EhBzBvB,GAAO;;AgB0B5B,mBAAmC;EAAE,OAAO,EhB3BxB,GAAO;;AgB4B3B,mBAAmC;EAAE,OAAO,Eb9BrC,GAAO;;Aa+Bd,mBAAmC;EAAE,OAAO,EhB7BxB,GAAO;;AgB8B3B,qBAAqC;EAAE,OAAO,EdVtC,GAAO;;AetCf,gCAA2D;EAAE,OAAO,EjBAxD,GAAO;;AiBCnB,kCAA2D;EAAE,OAAO,EfDtD,GAAO;;AeErB,2BAA2D;EAAE,OAAO,EdI7D,GAAO;;AcHd,2BAA2D;EAAE,OAAO,Eda7D,GAAO;;AcZd,4BAA2D;EAAE,OAAO,EdM5D,GAAO;;AcLf,2BAA2D;EAAE,OAAO,EdoBtD,GAAO;;AcnBrB,0BAA2D;EAAE,OAAO,EdF9D,GAAO;;AcGb,6BAA2D;EAAE,OAAO,EdN3D,GAAO;;AcOhB,wCAA2D;EAAE,OAAO,EjBPvD,GAAO;;AiBQpB,0CAA2D;EAAE,OAAO,EfSrD,GAAO;;AeRtB,2BAA2D;EAAE,OAAO,EdL7D,GAAO;;AcMd,mCAA2D;EAAE,OAAO,EdGrD,GAAO;;AcFtB,8BAA2D;EAAE,OAAO,EdsB1D,GAAO;;AelCjB;qBAC2C;EAAE,OAAO,EZGtC,GAAO;;AYFrB;qBAC2C;EAAE,OAAO,EfF3C,GAAO;;AeGhB;qBAC2C;EAAE,OAAO,EZDtC,GAAO;;AYErB;qBAC2C;EAAE,OAAO,EfN3C,GAAO;;AeOhB;qBAC2C;EAAE,OAAO,EfL9C,GAAO;;AeMb;qBAC2C;EAAE,OAAO,EfP9C,GAAO;;AeQb,qBAA2C;EAAE,OAAO,EfR9C,GAAO;;AeSb,qBAA2C;EAAE,OAAO,EfT9C,GAAO;;AeUb,qBAA2C;EAAE,OAAO,EfKxC,GAAO;;AeJnB,qBAA2C;EAAE,OAAO,EfUtC,GAAO;;AeTrB,qBAA2C;EAAE,OAAO,EfZ9C,GAAO;;Aeab,qBAA2C;EAAE,OAAO,EfVzC,GAAO;;AeWlB,qBAA2C;EAAE,OAAO,EfXzC,GAAO;;AeYlB,qBAA2C;EAAE,OAAO,Efb7C,GAAO;;Aecd,qBAA2C;EAAE,OAAO,EfJ7C,GAAO;;AeKd,qBAA2C;EAAE,OAAO,EfhB7C,GAAO;;AeiBd,qBAA2C;EAAE,OAAO,EfRrC,GAAO;;AeStB,qBAA2C;EAAE,OAAO,EfD7C,GAAO;;AeEd,qBAA2C;EAAE,OAAO,EfF7C,GAAO;;AeGd,qBAA2C;EAAE,OAAO,EfH7C,GAAO;;AeId,qBAA2C;EAAE,OAAO,EftB9C,GAAO;;AeuBb,qBAA2C;EAAE,OAAO,EfvB9C,GAAO;;AewBb,qBAA2C;EAAE,OAAO,EfxB9C,GAAO;;AeyBb,qBAA2C;EAAE,OAAO,EfzB9C,GAAO;;Ae0Bb,qBAA2C;EAAE,OAAO,Ef1B9C,GAAO;;Ae2Bb,qBAA2C;EAAE,OAAO,Ef3B9C,GAAO;;Ae4Bb,qBAA2C;EAAE,OAAO,EfzBzC,GAAO;;Ae0BlB,qBAA2C;EAAE,OAAO,EfrBzC,GAAO;;AesBlB,qBAA2C;EAAE,OAAO,Ef5B7C,GAAO;;Ae6Bd,qBAA2C;EAAE,OAAO,EfvBzC,GAAO;;AewBlB,qBAA2C;EAAE,OAAO,Ef9B7C,GAAO;;Ae+Bd,qBAA2C;EAAE,OAAO,EfhC7C,GAAO;;AeiCd,qBAA2C;EAAE,OAAO,EfjC7C,GAAO;;AekCd,qBAA2C;EAAE,OAAO,EfvB7C,GAAO;;AewBd,qBAA2C;EAAE,OAAO,EfxB7C,GAAO;;AeyBd,qBAA2C;EAAE,OAAO,Ef7BzC,GAAO;;Ae8BlB,qBAA2C;EAAE,OAAO,Ef9BzC,GAAO;;Ae+BlB,qBAA2C;EAAE,OAAO,EfrC7C,GAAO;;AesCd,qBAA2C;EAAE,OAAO,EftC7C,GAAO;;AeuCd,qBAA2C;EAAE,OAAO,EftBnC,GAAO;;AeuBxB,qBAA2C;EAAE,OAAO,EfvBnC,GAAO;;AewBxB,qBAA2C;EAAE,OAAO,EfxBnC,GAAO;;AeyBxB,qBAA2C;EAAE,OAAO,EfpCzC,GAAO;;AeqClB,qBAA2C;EAAE,OAAO,Ef3C7C,GAAO;;Ae4Cd,qBAA2C;EAAE,OAAO,EftCzC,GAAO;;AeuClB,qBAA2C;EAAE,OAAO,EfvCzC,GAAO;;AewClB,qBAA2C;EAAE,OAAO,Ef9C7C,GAAO;;Ae+Cd,qBAA2C;EAAE,OAAO,Ef/C7C,GAAO;;AegDd,qBAA2C;EAAE,OAAO,EfjD7C,GAAO;;AekDd,qBAA2C;EAAE,OAAO,EflD7C,GAAO;;AemDd,qBAA2C;EAAE,OAAO,EfnD7C,GAAO;;AeoDd,qBAA2C;EAAE,OAAO,EflDzC,GAAO;;AemDlB,qBAA2C;EAAE,OAAO,EfnDzC,GAAO;;AeoDlB,qBAA2C;EAAE,OAAO,Ef3C7C,GAAO;;Ae4Cd,qBAA2C;EAAE,OAAO,Ef5C7C,GAAO;;Ae6Cd,qBAA2C;EAAE,OAAO,Ef7C7C,GAAO;;Ae8Cd,qBAA2C;EAAE,OAAO,Ef9C7C,GAAO;;Ae+Cd,qBAA2C;EAAE,OAAO,EfxCnC,GAAO;;AeyCxB,qBAA2C;EAAE,OAAO,EfzCnC,GAAO;;Ae0CxB,qBAA2C;EAAE,OAAO,Ef1CnC,GAAO;;Ae2CxB,qBAA2C;EAAE,OAAO,EflD7C,GAAO;;AemDd,qBAA2C;EAAE,OAAO,Ef5CnC,GAAO;;Ae6CxB,qBAA2C;EAAE,OAAO,Ef9D7C,GAAO;;Ae+Dd,qBAA2C;EAAE,OAAO,EfzDzC,GAAO;;Ae0DlB,qBAA2C;EAAE,OAAO,EfhE7C,GAAO;;AeiEd,qBAA2C;EAAE,OAAO,EfjE7C,GAAO;;AekEd,qBAA2C;EAAE,OAAO,Ef3DpC,GAAO;;Ae4DvB,qBAA2C;EAAE,OAAO,EflEzC,GAAO;;AemElB,qBAA2C;EAAE,OAAO,EfnEzC,GAAO;;AeoElB,qBAA2C;EAAE,OAAO,EfpEzC,GAAO;;AeqElB,qBAA2C;EAAE,OAAO,EfvE7C,GAAO;;AewEd,qBAA2C;EAAE,OAAO,Ef1DxC,GAAO;;Ae2DnB,qBAA2C;EAAE,OAAO,EfjEpC,GAAO;;AekEvB,qBAA2C;EAAE,OAAO,EfjErC,GAAO;;AekEtB,qBAA2C;EAAE,OAAO,EflErC,GAAO;;AemEtB,qBAA2C;EAAE,OAAO,Ef9DxC,GAAO;;Ae+DnB,qBAA2C;EAAE,OAAO,EfpErC,GAAO;;AeqEtB,qBAA2C;EAAE,OAAO,EfrErC,GAAO;;AesEtB,qBAA2C;EAAE,OAAO,EflD1C,GAAO;;AgBjCb,kBAA6D;EAAE,OAAO,EhBa3D,GAAO;;AgBZlB,kBAA6D;EAAE,OAAO,EhBY3D,GAAO;;AgBXlB,kBAA6D;EAAE,OAAO,EhBW3D,GAAO;;AgBVlB,kBAA6D;EAAE,OAAO,EhBe9D,GAAO;;AgBdf,kBAA6D;EAAE,OAAO,EhBc9D,GAAO;;AgBbf,kBAA6D;EAAE,OAAO,EhBa9D,GAAO;;AgBZf,kBAA6D;EAAE,OAAO,EhBY9D,GAAO;;AgBXf,kBAA6D;EAAE,OAAO,EhBM3D,GAAO;;AgBLlB,kBAA6D;EAAE,OAAO,EhBK3D,GAAO;;AgBJlB,kBAA6D;EAAE,OAAO,EhBI3D,GAAO;;AgBHlB,kBAA6D;EAAE,OAAO,EhBC/D,GAAO;;AgBAd,kBAA6D;EAAE,OAAO,EhBA/D,GAAO;;AgBCd,kBAA6D;EAAE,OAAO,EhBPnE,GAAO;;AgBQV,kBAA6D;EAAE,OAAO,EhBP/D,GAAO;;AgBQd,kBAA6D;EAAE,OAAO,EhBTnE,GAAO;;AgBUV,kBAA6D;EAAE,OAAO,EhBVnE,GAAO;;AgBWV,kBAA6D;EAAE,OAAO,EhBRhE,GAAO;;AgBSb,kBAA6D;EAAE,OAAO,EhBZnE,GAAO;;AgBaV,kBAA6D;EAAE,OAAO,EhBP/D,GAAO;;AgBQd,kBAA6D;EAAE,OAAO,EhBR/D,GAAO;;AgBSd,kBAA6D;EAAE,OAAO,EhBfnE,GAAO;;AgBgBV,kBAA6D;EAAE,OAAO,EhBhBnE,GAAO;;AgBiBV,kBAA6D;EAAE,OAAO,EhBjBnE,GAAO;;AgBkBV,kBAA6D;EAAE,OAAO,EhBlBnE,GAAO;;AgBmBV,kBAA6D;EAAE,OAAO,EhBlB/D,GAAO;;AgBmBd,kBAA6D;EAAE,OAAO,EhBjBhE,GAAO;;AgBkBb,kBAA6D;EAAE,OAAO,EhBlBhE,GAAO;;AgBmBb,kBAA6D;EAAE,OAAO,EhBnBhE,GAAO;;AgBoBb,kBAA6D;EAAE,OAAO,EhBhB1D,GAAO;;AgBiBnB,kBAA6D;EAAE,OAAO,EhBdnE,GAAO;;AgBeV,kBAA6D;EAAE,OAAO,EhBfnE,GAAO;;AgBgBV,kBAA6D;EAAE,OAAO,EhBtBlE,GAAO;;AgBuBX,kBAA6D;EAAE,OAAO,EhB1B/D,GAAO;;AgB2Bd,kBAA6D;EAAE,OAAO,EhB3B/D,GAAO;;AgB4Bd,kBAA6D;EAAE,OAAO,EhB5B/D,GAAO;;AgB6Bd,kBAA6D;EAAE,OAAO,EhB7B/D,GAAO;;AgB8Bd,kBAA6D;EAAE,OAAO,EhB9B/D,GAAO;;AgB+Bd,kBAA6D;EAAE,OAAO,EhBtBnE,GAAO;;AgBuBV,kBAA6D;EAAE,OAAO,EhBvBnE,GAAO;;AgBwBV,kBAA6D;EAAE,OAAO,EhB/BhE,GAAO;;AgBgCb,kBAA6D;EAAE,OAAO,EhBvBlE,GAAO;;AgBwBX,kBAA6D;EAAE,OAAO,EnBpC/D,GAAO;;AmBqCd,kBAA6D;EAAE,OAAO,EhBrBnE,GAAO;;AgBsBV,kBAA6D;EAAE,OAAO,EhBxCpE,GAAO;;AgByCT,kBAA6D;EAAE,OAAO,EhBvBnE,GAAO;;AgBwBV,kBAA6D;EAAE,OAAO,EhBxBnE,GAAO;;AgByBV,kBAA6D;EAAE,OAAO,EhB7C3D,GAAO;;AgB8ClB,kBAA6D;EAAE,OAAO,EhBdhE,GAAO;;AgBeb,kBAA6D;EAAE,OAAO,EnBjD9D,GAAO;;AmBkDf,kBAA6D;EAAE,OAAO,EhBhD3D,GAAO;;AgBiDlB,kBAA6D;EAAE,OAAO,EhBjD3D,GAAO;;AgBkDlB,kBAA6D;EAAE,OAAO,EhBlD3D,GAAO;;AgBmDlB,kBAA6D;EAAE,OAAO,EhBlD3D,GAAO;;AgBmDlB,kBAA6D;EAAE,OAAO,EhBrDjE,GAAO;;AgBsDZ,kBAA6D;EAAE,OAAO,EhBrBhE,GAAO;;AgBsBb,kBAA6D;EAAE,OAAO,EhB3C1D,GAAO;;AgB4CnB,kBAA6D;EAAE,OAAO,EhBxB9D,GAAO;;AgByBf,kBAA6D;EAAE,OAAO,EhBnCzD,GAAO;;AgBoCpB,kBAA6D;EAAE,OAAO,EnBpCpE,GAAO;;AmBqCT,kBAA6D;EAAE,OAAO,EhBpClE,GAAO;;AgBqCX,kBAA6D;EAAE,OAAO,EhBxDnE,GAAO;;AgByDV,kBAA6D;EAAE,OAAO,EhBrC5D,GAAO;;AgBuCjB,sBAA6D;EAAE,OAAO,EnB5CvD,GAAO;;AmB6CtB,sBAA6D;EAAE,OAAO,EnB7CvD,GAAO;;AmB8CtB,sBAA6D;EAAE,OAAO,EnB9CvD,GAAO;;AmB+CtB,sBAA6D;EAAE,OAAO,EnB5D1D,GAAO;;AmB6DnB,sBAA6D;EAAE,OAAO,EnB7D1D,GAAO;;AmB8DnB,sBAA6D;EAAE,OAAO,EnB9D1D,GAAO;;AmB+DnB,sBAA6D;EAAE,OAAO,EnB/D1D,GAAO;;AmBgEnB,sBAA6D;EAAE,OAAO,EnBnDvD,GAAO;;AmBoDtB,sBAA6D;EAAE,OAAO,EnBpDvD,GAAO;;AmBqDtB,sBAA6D;EAAE,OAAO,EnBrDvD,GAAO;;AmBsDtB,sBAA6D;EAAE,OAAO,EnBzD3D,GAAO;;AmB0DlB,sBAA6D;EAAE,OAAO,EnB1D3D,GAAO;;AmB2DlB,sBAA6D;EAAE,OAAO,EnBpE/D,GAAO;;AmBqEd,sBAA6D;EAAE,OAAO,EnBrE/D,GAAO;;AmBsEd,sBAA6D;EAAE,OAAO,EnBtE/D,GAAO;;AmBuEd,sBAA6D;EAAE,OAAO,EnBvE/D,GAAO;;AmBwEd,sBAA6D;EAAE,OAAO,EnBxE/D,GAAO;;AmByEd,sBAA6D;EAAE,OAAO,EnBzE/D,GAAO;;AmB0Ed,sBAA6D;EAAE,OAAO,EnBjE3D,GAAO;;AmBkElB,sBAA6D;EAAE,OAAO,EnBlE3D,GAAO;;AmBmElB,sBAA6D;EAAE,OAAO,EnB5E/D,GAAO;;AmB6Ed,sBAA6D;EAAE,OAAO,EnB7E/D,GAAO;;AmB8Ed,sBAA6D;EAAE,OAAO,EnB9E/D,GAAO;;AmB+Ed,sBAA6D;EAAE,OAAO,EnB/E/D,GAAO;;AmBgFd,sBAA6D;EAAE,OAAO,EnB/E3D,GAAO;;AmBgFlB,sBAA6D;EAAE,OAAO,EnB9E5D,GAAO;;AmB+EjB,sBAA6D;EAAE,OAAO,EnB/E5D,GAAO;;AmBgFjB,sBAA6D;EAAE,OAAO,EnBhF5D,GAAO;;AmBiFjB,sBAA6D;EAAE,OAAO,EnB1EtD,GAAO;;AmB2EvB,sBAA6D;EAAE,OAAO,EnB/E/D,GAAO;;AmBgFd,sBAA6D;EAAE,OAAO,EnBlF9D,GAAO;;AmBmFf,sBAA6D;EAAE,OAAO,EnBjF/D,GAAO;;AmBkFd,sBAA6D;EAAE,OAAO,EnBvF3D,GAAO;;AmBwFlB,sBAA6D;EAAE,OAAO,EnBxF3D,GAAO;;AmByFlB,sBAA6D;EAAE,OAAO,EnBzF3D,GAAO;;AmB0FlB,sBAA6D;EAAE,OAAO,EnB1F3D,GAAO;;AmB2FlB,sBAA6D;EAAE,OAAO,EnB3F3D,GAAO;;AmB4FlB,sBAA6D;EAAE,OAAO,EnBvF/D,GAAO;;AmBwFd,sBAA6D;EAAE,OAAO,EnBxF/D,GAAO;;AmByFd,sBAA6D;EAAE,OAAO,EnB5F5D,GAAO;;AmB6FjB,sBAA6D;EAAE,OAAO,EhBtFlE,GAAO;;AgBuFX,sBAA6D;EAAE,OAAO,EnBnG/D,GAAO;;AmBoGd,sBAA6D;EAAE,OAAO,EhBpFnE,GAAO;;AgBqFV,sBAA6D;EAAE,OAAO,EnBvGhE,GAAO;;AmBwGb,sBAA6D;EAAE,OAAO,EhBtFnE,GAAO;;AgBuFV,sBAA6D;EAAE,OAAO,EhBvFnE,GAAO;;AgBwFV,sBAA6D;EAAE,OAAO,EhB5EhE,GAAO;;AgB6Eb,sBAA6D;EAAE,OAAO,EnB/G9D,GAAO;;AmBgHf,sBAA6D;EAAE,OAAO,EnB9GvD,GAAO;;AmB+GtB,sBAA6D;EAAE,OAAO,EnB/GvD,GAAO;;AmBgHtB,sBAA6D;EAAE,OAAO,EnBhHvD,GAAO;;AmBiHtB,sBAA6D;EAAE,OAAO,EnBhGrD,GAAO;;AmBiGxB,sBAA6D;EAAE,OAAO,EhBlFhE,GAAO;;AgBmFb,sBAA6D;EAAE,OAAO,EhBpF9D,GAAO;;AgBqFf,sBAA6D;EAAE,OAAO,EhB/FzD,GAAO;;AgBgGpB,sBAA6D;EAAE,OAAO,EnBhGpE,GAAO;;AmBiGT,sBAA6D;EAAE,OAAO,EnBnH/D,GAAO;;AmBoHd,sBAA6D;EAAE,OAAO,EhBhG5D,GAAO;;AgBkGjB,wBAA6D;EAAE,OAAO,EjB1GjD,GAAO;;AiB2G5B,wBAA6D;EAAE,OAAO,EjB3GjD,GAAO;;AiB4G5B,wBAA6D;EAAE,OAAO,EjB5GjD,GAAO;;AiB6G5B,wBAA6D;EAAE,OAAO,EjBzHpD,GAAO;;AiB0HzB,wBAA6D;EAAE,OAAO,EjB1HpD,GAAO;;AiB2HzB,wBAA6D;EAAE,OAAO,EjB3HpD,GAAO;;AiB4HzB,wBAA6D;EAAE,OAAO,EjB5HpD,GAAO;;AiB6HzB,wBAA6D;EAAE,OAAO,EjBjHjD,GAAO;;AiBkH5B,wBAA6D;EAAE,OAAO,EjBlHjD,GAAO;;AiBmH5B,wBAA6D;EAAE,OAAO,EjBnHjD,GAAO;;AiBoH5B,wBAA6D;EAAE,OAAO,EjBtHrD,GAAO;;AiBuHxB,wBAA6D;EAAE,OAAO,EjBvHrD,GAAO;;AiBwHxB,wBAA6D;EAAE,OAAO,EjBjIzD,GAAO;;AiBkIpB,wBAA6D;EAAE,OAAO,EjBlIzD,GAAO;;AiBmIpB,wBAA6D;EAAE,OAAO,EjBnIzD,GAAO;;AiBoIpB,wBAA6D;EAAE,OAAO,EjBpIzD,GAAO;;AiBqIpB,wBAA6D;EAAE,OAAO,EjBrIzD,GAAO;;AiBsIpB,wBAA6D;EAAE,OAAO,EjBtIzD,GAAO;;AiBuIpB,wBAA6D;EAAE,OAAO,EjB9HrD,GAAO;;AiB+HxB,wBAA6D;EAAE,OAAO,EjB/HrD,GAAO;;AiBgIxB,wBAA6D;EAAE,OAAO,EjBzIzD,GAAO;;AiB0IpB,wBAA6D;EAAE,OAAO,EjB1IzD,GAAO;;AiB2IpB,wBAA6D;EAAE,OAAO,EjB3IzD,GAAO;;AiB4IpB,wBAA6D;EAAE,OAAO,EjB5IzD,GAAO;;AiB6IpB,wBAA6D;EAAE,OAAO,EjB5IrD,GAAO;;AiB6IxB,wBAA6D;EAAE,OAAO,EjB3ItD,GAAO;;AiB4IvB,wBAA6D;EAAE,OAAO,EjB5ItD,GAAO;;AiB6IvB,wBAA6D;EAAE,OAAO,EjB7ItD,GAAO;;AiB8IvB,wBAA6D;EAAE,OAAO,EjBvIhD,GAAO;;AiBwI7B,wBAA6D;EAAE,OAAO,EjB5IzD,GAAO;;AiB6IpB,wBAA6D;EAAE,OAAO,EjB/IxD,GAAO;;AiBgJrB,wBAA6D;EAAE,OAAO,EjB9IzD,GAAO;;AiB+IpB,wBAA6D;EAAE,OAAO,EjBpJrD,GAAO;;AiBqJxB,wBAA6D;EAAE,OAAO,EjBrJrD,GAAO;;AiBsJxB,wBAA6D;EAAE,OAAO,EjBtJrD,GAAO;;AiBuJxB,wBAA6D;EAAE,OAAO,EjBvJrD,GAAO;;AiBwJxB,wBAA6D;EAAE,OAAO,EjBxJrD,GAAO;;AiByJxB,wBAA6D;EAAE,OAAO,EjBpJzD,GAAO;;AiBqJpB,wBAA6D;EAAE,OAAO,EjBrJzD,GAAO;;AiBsJpB,wBAA6D;EAAE,OAAO,EjBzJtD,GAAO;;AiB0JvB,wBAA6D;EAAE,OAAO,EhBjJlE,GAAO;;AgBkJX,wBAA6D;EAAE,OAAO,EnB9J/D,GAAO;;AmB+Jd,wBAA6D;EAAE,OAAO,EhB/InE,GAAO;;AgBgJV,wBAA6D;EAAE,OAAO,EjBjJ9D,GAAO;;AiBkJf,wBAA6D;EAAE,OAAO,EhBjJnE,GAAO;;AgBkJV,wBAA6D;EAAE,OAAO,EhBlJnE,GAAO;;AgBmJV,wBAA6D;EAAE,OAAO,EhBvIhE,GAAO;;AgBwIb,wBAA6D;EAAE,OAAO,EjB1K5D,GAAO;;AiB2KjB,wBAA6D;EAAE,OAAO,EjBzKjD,GAAO;;AiB0K5B,wBAA6D;EAAE,OAAO,EjB1KjD,GAAO;;AiB2K5B,wBAA6D;EAAE,OAAO,EjB3KjD,GAAO;;AiB4K5B,wBAA6D;EAAE,OAAO,EjB7KvD,GAAO;;AiB8KtB,wBAA6D;EAAE,OAAO,EhB7IhE,GAAO;;AgB8Ib,wBAA6D;EAAE,OAAO,EhB/I9D,G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", +"sources": ["../scss/icons.scss","../scss/icons/font-awesome/scss/font-awesome.scss","../scss/icons/font-awesome/scss/_path.scss","../scss/icons/font-awesome/scss/_core.scss","../scss/icons/font-awesome/scss/_larger.scss","../scss/icons/font-awesome/scss/_fixed-width.scss","../scss/icons/font-awesome/scss/_list.scss","../scss/icons/font-awesome/scss/_variables.scss","../scss/icons/font-awesome/scss/_bordered-pulled.scss","../scss/icons/font-awesome/scss/_animated.scss","../scss/icons/font-awesome/scss/_rotated-flipped.scss","../scss/icons/font-awesome/scss/_mixins.scss","../scss/icons/font-awesome/scss/_stacked.scss","../scss/icons/font-awesome/scss/_icons.scss","../scss/icons/font-awesome/scss/_screen-reader.scss","../scss/icons/themify-icons/themify-icons.scss","../scss/icons/material-design-iconic-font/material-design-iconic-font.scss","../scss/icons/simple-line-icons/scss/simple-line-icons.scss","../scss/icons/ionicons/scss/ionicons.scss","../scss/icons/ionicons/scss/_ionicons-font.scss","../scss/icons/ionicons/scss/_ionicons-variables.scss","../scss/icons/ionicons/scss/_ionicons-animation.scss","../scss/icons/ionicons/scss/_ionicons-icons.scss","../scss/icons/weather-icons/sass/weather-icons.min.scss","../scss/icons/weather-icons/sass/weather-icons-core.scss","../scss/icons/weather-icons/sass/icon-classes/classes-day.scss","../scss/icons/weather-icons/sass/icon-variables/variables-day.scss","../scss/icons/weather-icons/sass/icon-classes/classes-night.scss","../scss/icons/weather-icons/sass/icon-variables/variables-night.scss","../scss/icons/weather-icons/sass/icon-variables/variables-neutral.scss","../scss/icons/weather-icons/sass/icon-classes/classes-neutral.scss","../scss/icons/weather-icons/sass/icon-classes/classes-misc.scss","../scss/icons/weather-icons/sass/icon-variables/variables-misc.scss","../scss/icons/weather-icons/sass/icon-classes/classes-moon.scss","../scss/icons/weather-icons/sass/icon-variables/variables-moon.scss","../scss/icons/weather-icons/sass/icon-classes/classes-moon-aliases.scss","../scss/icons/weather-icons/sass/icon-classes/classes-time.scss","../scss/icons/weather-icons/sass/icon-variables/variables-time.scss","../scss/icons/weather-icons/sass/icon-classes/classes-direction.scss","../scss/icons/weather-icons/sass/icon-variables/variables-direction.scss","../scss/icons/weather-icons/sass/icon-classes/classes-beaufort.scss","../scss/icons/weather-icons/sass/icon-variables/variables-beaufort.scss","../scss/icons/weather-icons/sass/mappings/wi-yahoo.scss","../scss/icons/weather-icons/sass/mappings/wi-forecast-io.scss","../scss/icons/weather-icons/sass/mappings/wi-wmo4680.scss","../scss/icons/weather-icons/sass/mappings/wi-owm.scss","../scss/icons/typicons/typicons.scss","../scss/icons/dripicons/dripicons.scss"], +"names": [], +"file": "icons.css" +} \ No newline at end of file diff --git a/Monitor/wwwroot/assets/css/style.css b/Monitor/wwwroot/assets/css/style.css new file mode 100644 index 0000000..4f2fadf --- /dev/null +++ b/Monitor/wwwroot/assets/css/style.css @@ -0,0 +1,5824 @@ +/* +Template Name: UBold Dashboard +Author: Coderthemes +Email: coderthemes@gmail.com +File: Main Css +*/ +@import url("https://fonts.googleapis.com/css?family=Noto+Sans:400,700|Source+Sans+Pro:400,600,700"); +/* ============= + Common +============= */ +body { + background: #303841; + margin: 0; + overflow-x: hidden; + color: rgba(255, 255, 255, 0.7); + font-family: "Noto Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + padding-bottom: 60px; } + +html { + position: relative; + min-height: 100%; + background: #303841; } + +h1, h2, h3, h4, h5, h6 { + margin: 10px 0; + font-family: "Source Sans Pro", "Helvetica Neue", Helvetica, Arial, sans-serif; } + +p { + line-height: 1.6; + margin-bottom: 10px; } + +* { + outline: none !important; } + +b { + font-weight: 600; } + +a { + color: #33b5e5; } + a:hover, a:focus, a:active { + color: #83cdbd; + outline: 0; + text-decoration: none; } + +a.text-dark:focus, a.text-dark:hover { + color: #ffffff !important; } + +/* Footer */ +.footer { + border-top: 1px solid rgba(255, 255, 255, 0.1); + bottom: 0; + text-align: left !important; + padding: 20px 30px; + position: absolute; + right: 0; + left: 240px; + font-size: 13px; } + +#wrapper { + height: 100%; + overflow: hidden; + width: 100%; } + +.page { + bottom: 0; + left: 0; + right: 0; + top: 0; } + +/* Page titles */ +.page-title { + font-size: 20px; + font-weight: 600; + margin-bottom: 0; + margin-top: 7px; } + +.page-title + .breadcrumb { + font-size: 0.9rem; } + +.page-title-alt { + margin-bottom: 23px; + margin-top: 10px; } + +.page-header { + border-bottom: 1px solid #4c5a67; } + +.header-title { + text-transform: uppercase; + font-size: 17px; + font-weight: 600; + line-height: 16px; + margin-bottom: 8px; } + +.social-links li a { + -webkit-border-radius: 50%; + background: #414d59; + border-radius: 50%; + color: #98a6ad; + display: inline-block; + height: 30px; + line-height: 30px; + text-align: center; + width: 30px; } + +/* ============= + Helper clasess +============= */ +.p-0 { + padding: 0 !important; } + +.p-20 { + padding: 20px !important; } + +.p-30 { + padding: 30px !important; } + +.p-l-0 { + padding-left: 0 !important; } + +.p-r-0 { + padding-right: 0 !important; } + +.p-t-0 { + padding-top: 0 !important; } + +.p-t-10 { + padding-top: 10px !important; } + +.p-b-0 { + padding-bottom: 0 !important; } + +.p-b-10 { + padding-bottom: 10px !important; } + +.p-l-r-10 { + padding-left: 10px; + padding-right: 10px; } + +.m-0 { + margin: 0 !important; } + +.m-r-5 { + margin-right: 5px !important; } + +.m-r-10 { + margin-right: 10px !important; } + +.m-r-15 { + margin-right: 15px !important; } + +.m-l-5 { + margin-left: 5px !important; } + +.m-l-10 { + margin-left: 10px !important; } + +.m-l-15 { + margin-left: 15px !important; } + +.m-t-5 { + margin-top: 5px !important; } + +.m-t-0 { + margin-top: 0 !important; } + +.m-t-10 { + margin-top: 10px !important; } + +.m-t-15 { + margin-top: 15px !important; } + +.m-t-20 { + margin-top: 20px !important; } + +.m-t-30 { + margin-top: 30px !important; } + +.m-t-40 { + margin-top: 40px !important; } + +.m-b-0 { + margin-bottom: 0 !important; } + +.m-b-5 { + margin-bottom: 5px !important; } + +.m-b-10 { + margin-bottom: 10px !important; } + +.m-b-15 { + margin-bottom: 15px !important; } + +.m-b-20 { + margin-bottom: 20px !important; } + +.m-b-30 { + margin-bottom: 30px !important; } + +.w-xs { + min-width: 80px; } + +.w-sm { + min-width: 95px; } + +.w-md { + min-width: 110px; } + +.w-lg { + min-width: 140px; } + +.m-h-40 { + min-height: 40px; } + +.m-h-50 { + min-height: 50px; } + +.l-h-34 { + line-height: 34px; } + +.font-600 { + font-weight: 600; } + +.font-bold { + font-weight: 700; } + +.font-normal { + font-weight: normal; } + +.font-light { + font-weight: 300; } + +.font-13 { + font-size: 13px !important; } + +.font-16 { + font-size: 16px !important; } + +.font-18 { + font-size: 18px !important; } + +.wrapper-md { + padding: 20px; } + +.pull-in { + margin-left: -15px; + margin-right: -15px; } + +.pull-in-card { + margin-left: -20px !important; + margin-right: -20px !important; } + +.b-0 { + border: none !important; } + +.vertical-middle { + vertical-align: middle; } + +.b-r-0 { + border-radius: 0 !important; } + +.bx-shadow { + -moz-box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.1); + -webkit-box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.1); + box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.1); } + +.mx-box { + max-height: 380px; + min-height: 380px; } + +.thumb-sm { + height: 32px; + width: 32px; } + +.thumb-md { + height: 48px; + width: 48px; } + +.thumb-lg { + height: 88px; + width: 88px; } + +/* ============= + Extras +============= */ +/* Table type box */ +.table-box { + display: table; + height: 100%; + width: 100%; } + .table-box .table-detail { + display: table-cell; + vertical-align: middle; } + +/* Card Box */ +.card-box { + padding: 20px; + border: 1px solid rgba(54, 64, 74, 0.05); + border-radius: 5px; + margin-bottom: 20px; + background-clip: padding-box; + background-color: #36404a; } + +/* Grid page */ +.grid-structure .grid-container { + background-color: #f4f8fb; + margin-bottom: 10px; + padding: 10px 20px; } + +/* Demo only */ +.icon-list-demo div { + cursor: pointer; + line-height: 45px; + white-space: nowrap; + color: #98a6ad; } + .icon-list-demo div:hover { + color: #ffffff; } + .icon-list-demo div p { + margin-bottom: 0; + line-height: inherit; } +.icon-list-demo i { + -webkit-transition: all 0.2s; + display: inline-block; + font-size: 18px; + margin: 0; + text-align: center; + transition: all 0.2s; + vertical-align: middle; + width: 40px; } +.icon-list-demo .col-md-4 { + border-radius: 3px; } + .icon-list-demo .col-md-4:hover { + background-color: #33b5e5; } + .icon-list-demo .col-md-4:hover i { + -o-transform: scale(2); + -webkit-transform: scale(2); + -moz-transform: scale(2); + transform: scale(2); } + +.button-list { + margin-left: -8px; + margin-bottom: -12px; } + .button-list .btn { + margin-bottom: 12px; + margin-left: 8px; } + +/* Switchery demo */ +.switchery-demo .switchery { + margin-bottom: 10px; } + +.slider-track { + background-image: none; + background-color: #4c5a67; } + +/* ============= + Bootstrap-custom +============= */ +.container-fluid { + max-width: 95%; } + +.container-alt { + margin-left: auto; + margin-right: auto; + padding-left: 10px; + padding-right: 10px; } + +.row { + margin-right: -10px; + margin-left: -10px; } + +.col, .col-1, .col-10, .col-11, .col-12, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, +.col-8, .col-9, .col-lg, .col-lg-1, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg-2, .col-lg-3, +.col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-md, .col-md-1, .col-md-10, +.col-md-11, .col-md-12, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, +.col-md-8, .col-md-9, .col-sm, .col-sm-1, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm-2, +.col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-xl, +.col-xl-1, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, +.col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9 { + padding-left: 10px; + padding-right: 10px; } + +.breadcrumb { + background-color: transparent; + margin-bottom: 15px; + padding-top: 10px; + padding-left: 0; } + .breadcrumb a { + color: #98a6ad; } + +.breadcrumb > li + li:before { + padding: 0 5px; + color: #ccc; + content: "\f105" !important; + font-family: FontAwesome !important; } + +/* Dropdown */ +.dropdown-menu { + padding: 4px 0; + border: 0; + font-size: inherit; + background-color: #434f5c; + box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.26); + color: #e6e6e6; } + .dropdown-menu > li > a { + padding: 6px 20px; } + .dropdown-menu .dropdown-item { + color: #e6e6e6; } + .dropdown-menu .dropdown-item:focus, .dropdown-menu .dropdown-item:hover { + color: #ffffff; + background-color: #475462; } + .dropdown-menu .dropdown-item.active, .dropdown-menu .dropdown-item:active { + color: #ffffff; + background-color: #475462; } + +.dropdown-item.active, .dropdown-item:active { + background-color: #f2f2f2; + color: inherit; } + +.dropup .dropdown-menu { + box-shadow: 0px -1px 5px 0 rgba(0, 0, 0, 0.26); } + +.dropdown-lg { + width: 260px; } + +.arrow-none:after { + border: none; + margin: 0; + display: none; } + +.popover-header { + margin-top: 0; + color: #36404a; } + +.blockquote { + font-size: 1.01rem; } + +/* Close Icon */ +.close { + opacity: .6; + color: #ffffff; } + +/* Background colors */ +.bg-custom { + background-color: #5fbeaa !important; } + +.bg-primary { + background-color: #5d9cec !important; } + +.bg-success { + background-color: #81c868 !important; } + +.bg-info { + background-color: #34d3eb !important; } + +.bg-warning { + background-color: #ffbd4a !important; } + +.bg-danger { + background-color: #f05050 !important; } + +.bg-muted { + background-color: #f4f8fb !important; } + +.bg-inverse { + background-color: #4c5667 !important; } + +.bg-purple { + background-color: #7266ba !important; } + +.bg-pink { + background-color: #fb6d9d !important; } + +.bg-white { + background-color: #ffffff !important; } + +.bg-lightdark { + background-color: #f4f8fb !important; } + +/* Text colors */ +.text-custom { + color: #5fbeaa !important; } + +.text-white { + color: #36404a !important; } + +.text-danger { + color: #f05050 !important; } + +.text-muted { + color: #98a6ad !important; } + +.text-primary { + color: #5d9cec !important; } + +.text-warning { + color: #ffbd4a !important; } + +.text-success { + color: #81c868 !important; } + +.text-info { + color: #34d3eb !important; } + +.text-inverse { + color: #4c5667 !important; } + +.text-pink { + color: #fb6d9d !important; } + +.text-purple { + color: #7266ba !important; } + +.text-dark { + color: #ffffff !important; } + +/* Labels */ +.label { + display: inline; + padding: 0.3em .6em; + font-size: 75%; + font-weight: 700; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: .25em; } + +.label:empty { + display: none; } + +.label-white { + background-color: rgba(255, 255, 255, 0.7); + color: #36404a !important; } + +.label-default { + background-color: #33b5e5; } + +.label-primary { + background-color: #5d9cec; } + +.label-success { + background-color: #81c868; } + +.label-info { + background-color: #34d3eb; } + +.label-warning { + background-color: #ffbd4a; } + +.label-danger { + background-color: #f05050; } + +.label-purple { + background-color: #7266ba; } + +.label-pink { + background-color: #fb6d9d; } + +.label-inverse { + background-color: #4c5667; } + +.label-muted { + background-color: #98a6ad; } + +/* Badge */ +.badge { + text-transform: uppercase; + padding: 3px 5px; + margin-top: 1px; + display: inline-block; + min-width: 10px; + font-weight: 700; + line-height: 1; + color: #ffffff; + text-align: center; + white-space: nowrap; + vertical-align: middle; + border-radius: 10px; + background-color: #33b5e5; } + +.badge-xs { + font-size: 9px; } + +.badge-xs, .badge-sm { + -webkit-transform: translate(0, -2px); + -ms-transform: translate(0, -2px); + -o-transform: translate(0, -2px); + transform: translate(0, -2px); } + +.badge-white { + background-color: rgba(255, 255, 255, 0.7); + color: #36404a !important; } + +.badge-primary { + background-color: #5d9cec; } + +.badge-success { + background-color: #81c868; } + +.badge-info { + background-color: #34d3eb; } + +.badge-warning { + background-color: #ffbd4a; } + +.badge-danger { + background-color: #f05050; } + +.badge-purple { + background-color: #7266ba; } + +.badge-pink { + background-color: #fb6d9d; } + +.badge-inverse { + background-color: #4c5667; } + +/* List group */ +.list-group-item { + background-color: transparent; } + +.list-group-item.active, .list-group-item.active:hover, .list-group-item.active:focus { + background-color: #33b5e5; + border-color: #33b5e5; } + +/* Dropcap */ +.dropcap { + font-size: 3.1em; } + +.dropcap, .dropcap-circle, .dropcap-square { + display: block; + float: left; + font-weight: 400; + line-height: 36px; + margin-right: 6px; + text-shadow: none; } + +/* Tooltips */ +.tooltip-inner { + border-radius: 1px; + padding: 6px 10px; } + +.jqstooltip { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + width: auto !important; + height: auto !important; } + +/* Popover */ +.popover { + font-family: inherit; + border-radius: 3px; } + .popover .popover-title { + background-color: transparent; + color: #33b5e5; + font-weight: 600; + margin: 0; } + +/* Code */ +code { + color: #5d9cec; + background-color: #414d59; + border-radius: 4px; } + +/* Pre */ +pre { + background-color: #f4f8fb; + border: 1px solid #D4D8DA; } + +/* Media */ +.media { + margin-bottom: 20px; } + .media .media-heading { + font-weight: 600; + font-size: 16px; } + +.media:last-of-type { + margin-bottom: 0; } + +.card { + background-color: #36404a; } + +.list-group-item { + border: 1px solid #4c5a67; } + +.img-thumbnail { + background-color: #4c5a67; + border: 1px solid #505f6d; } + +hr { + border-top: 1px solid #566676; } + +/* =========== + Pagination + =============*/ +.pagination > li:first-child > a, +.pagination > li:first-child > span { + border-bottom-left-radius: 3px; + border-top-left-radius: 3px; } + +.pagination > li:last-child > a, +.pagination > li:last-child > span { + border-bottom-right-radius: 3px; + border-top-right-radius: 3px; } + +.pagination > li > a, +.pagination > li > span { + color: #e6e6e6; } + +.pagination > li > a:hover, +.pagination > li > span:hover, +.pagination > li > a:focus, +.pagination > li > span:focus { + background-color: #566676; + color: #ffffff; } + +.pagination-split li { + margin-left: 5px; + display: inline-block; + float: left; } + +.pagination-split li:first-child { + margin-left: 0; } + +.pagination-split li a { + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; } + +.pagination > .active > a, +.pagination > .active > span, +.pagination > .active > a:hover, +.pagination > .active > span:hover, +.pagination > .active > a:focus, +.pagination > .active > span:focus, +.page-item.active .page-link { + background-color: #33b5e5; + border-color: #33b5e5; } + +.pager .disabled > a, .pager .disabled > a:focus, .pager .disabled > a:hover, .pager .disabled > span { + opacity: 0.6; } + +.pager li > a, .pager li > span { + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; + color: #4c5667; } + +.page-link { + background-color: #4c5a67; + border: none; } + +.page-item.disabled .page-link { + color: #ffffff; + background-color: #566676; } + +.page-item.active .page-link { + background-color: #33b5e5; } + +/* Form components */ +label { + font-weight: 600; } + +.form-control { + border: 1px solid #505f6d; + background-color: #414d59; + box-shadow: none; + color: #ffffff; + font-size: inherit; } + .form-control:focus { + background: #45525f; + border-color: #566676; + box-shadow: none; + color: #ffffff; } + +.form-control:disabled, .form-control[readonly] { + background-color: #475462; } + +.input-group-addon { + border-radius: 2px; + background-color: #475462; + color: #98a6ad; + border: 1px solid #566676; } + +textarea.form-control { + min-height: 90px; } + +select[multiple] { + height: auto; } + +.input-lg { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; } + +.input-sm { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; } + +.form-horizontal .form-group { + margin-left: -10px; + margin-right: -10px; } + +.form-control-feedback { + line-height: 38px !important; } + +.input-group-btn .btn { + padding: 10px 12px; } +.input-group-btn .btn-sm { + padding: 4px 10px; } +.input-group-btn .btn-lg { + padding: 10px 17px; } + +.has-success .form-control { + border-color: #81c868; + box-shadow: none !important; } + +.has-warning .form-control { + border-color: #ffbd4a; + box-shadow: none !important; } + +.has-error .form-control { + border-color: #f05050; + box-shadow: none !important; } + +/* ============= + Tabs +============= */ +.tab-content { + padding: 20px 0 0 0; } + +.nav-tabs { + border-bottom: 1px solid #4c5a67; } + +.nav-tabs > li > a, .nav-pills > li > a { + color: #98a6ad; + font-weight: 600; } + +.nav-pills .nav-item.show .nav-link, .nav-pills .nav-link.active { + background-color: #33b5e5; } + +/* Vertial tab */ +.tabs-vertical-env .tab-content { + background: #3a4550; + display: table-cell; + padding: 0 0 0 20px; + margin-bottom: 0; + vertical-align: top; } +.tabs-vertical-env .nav.tabs-vertical { + display: table-cell; + min-width: 120px; + vertical-align: top; + width: 150px; } + .tabs-vertical-env .nav.tabs-vertical li > a { + color: #98a6ad; + white-space: nowrap; + font-weight: 600; + border-radius: 2px; } + .tabs-vertical-env .nav.tabs-vertical li > a.active { + background-color: #33b5e5; + border: 0; + color: #ffffff; } + +.tabs-vertical-env-right .tab-content { + padding: 0 20px 0 0; } + +.tabs-bordered { + border-bottom: 2px solid rgba(152, 166, 173, 0.2) !important; } + .tabs-bordered .nav-item { + margin-bottom: -2px; } + +.tabs-bordered li a, .tabs-bordered li a:hover, .tabs-bordered li a:focus { + border: 0 !important; + padding: 10px 20px !important; } + +.tabs-bordered li a.active { + border-bottom: 2px solid #5fbeaa !important; } + +/* Navpills */ +.nav-pills > li > a { + color: #98a6ad; } + +.nav-pills > li.active > a, .nav-pills > li.active > a:focus, .nav-pills > li.active > a:hover { + background-color: #33b5e5; } + +.nav-tabs .nav-item.show .nav-link, .nav-tabs .nav-link.active { + color: #ffffff; + background-color: #4c5a67; + border-color: #4c5a67 #4c5a67 #4c5a67; } + +.nav-tabs .nav-link:focus, .nav-tabs .nav-link:hover { + border-color: #4c5a67 #4c5a67 #4c5a67; } + +/* ============= + Alerts +============= */ +.alert-success { + background-color: #dff1d8 !important; + border-color: #a0d68d !important; + color: #81c868; } + .alert-success .alert-link { + color: #81c868; } + +.alert-info { + background-color: #d6f6fb !important; + border-color: #62ddf0 !important; + color: #34d3eb; } + .alert-info .alert-link { + color: #34d3eb; } + +.alert-warning { + background-color: #fff5e3 !important; + border-color: #ffd07d !important; + color: #ffbd4a; } + .alert-warning .alert-link { + color: #ffbd4a; } + +.alert-danger { + background-color: #fef4f4 !important; + border-color: #f47f7f !important; + color: #f05050; } + .alert-danger .alert-link { + color: #f05050; } + +/* Modals */ +.modal .modal-dialog .modal-content { + -moz-box-shadow: none; + -webkit-box-shadow: none; + border-color: #566676; + border-radius: 2px; + box-shadow: none; + padding: 25px; + background-color: #4c5a67; } + .modal .modal-dialog .modal-content .modal-header { + margin: 0; + padding: 0 0 15px 0; + border-bottom: 2px solid #566676; } + .modal .modal-dialog .modal-content .modal-body { + padding: 20px 0; } + .modal .modal-dialog .modal-content .modal-footer { + padding: 15px 0 0 0; + border-top: 1px solid #566676; } + +.modal-full { + width: 98%; + max-width: 100%; } + +.modal-content .nav.nav-tabs + .tab-content { + margin-bottom: 0; } + +/* Custom-modal */ +.modal-demo { + background-color: #4c5a67; + width: 600px; + border-radius: 4px; + display: none; } + .modal-demo .close { + position: absolute; + top: 15px; + right: 25px; + color: #eeeeee; } + +.custom-modal-title { + padding: 15px 25px 15px 25px; + line-height: 22px; + font-size: 18px; + background-color: #33b5e5; + color: #ffffff; + text-align: left; + margin: 0; } + +.custom-modal-text { + padding: 20px; } + +.custombox-modal-flash .close, .custombox-modal-rotatedown .close { + top: 20px; + z-index: 9999; } + +/* ============= + Carousel +============= */ +.carousel-control { + width: 10%; } + .carousel-control span { + position: absolute; + top: 50%; + z-index: 5; + display: inline-block; + font-size: 30px; } + +.carousel-item.active, +.carousel-item-next, +.carousel-item-prev { + display: block; } + +/* Owl */ +.slider-bg { + background-size: cover !important; + padding: 5.5% 4.5%; } + +.container { + width: 90%; } + +.wrapper { + padding-top: 148px; } + +.page-title-box { + padding: 22px 0; } + .page-title-box .page-title { + font-size: 20px; + margin-bottom: 0; + margin-top: 0; + font-weight: 600; } + +#topnav { + position: fixed; + right: 0; + left: 0; + top: 0; + z-index: 1030; + background-color: transparent; + border: 0; + -webkit-transition: all .5s ease; + transition: all .5s ease; + min-height: 62px; } + #topnav .has-submenu.active > a { + color: #33b5e5; + background-color: rgba(255, 255, 255, 0.1) !important; } + #topnav .has-submenu.active > a i { + color: #33b5e5; } + #topnav .has-submenu.active .submenu li.active > a { + color: #33b5e5; } + #topnav .topbar-main { + background: #303841; } + #topnav .topbar-main .logo { + color: #36404a !important; + font-size: 24px; + font-weight: 700; + letter-spacing: 1px; + line-height: 60px; + text-transform: uppercase; + float: left; } + #topnav .topbar-main .logo-sm { + display: none; } + #topnav .topbar-main .badge-topbar { + position: absolute; + top: 7px; + right: 7px; + z-index: 99; } + #topnav .topbar-main .nav > li > a { + height: 36px; + width: 36px; + padding: 0; + font-size: 24px; + line-height: 35px; + text-align: center; + border-radius: 50%; + margin: 12px 8px; + color: rgba(54, 64, 74, 0.7); } + #topnav .topbar-main .nav > li > a:focus, #topnav .topbar-main .nav > li > a:hover { + background-color: rgba(54, 64, 74, 0.1); + color: #36404a; } + #topnav .topbar-main .navbar-nav > .open > a { + background-color: rgba(54, 64, 74, 0.1) !important; } + #topnav .topbar-main .profile img { + height: 34px; + width: 34px; + display: block; } + #topnav .topbar-main .dropdown-menu-lg { + width: 300px; } + #topnav .topbar-main .dropdown-menu-lg .list-group { + margin-bottom: 0; } + #topnav .topbar-main .dropdown-menu-lg .list-group-item { + border: none; + padding: 10px 20px; } + #topnav .topbar-main .dropdown-menu-lg .media-heading { + margin-bottom: 0px; } + #topnav .topbar-main .dropdown-menu-lg .media-body p { + color: #828282; } + #topnav .topbar-main .navbar-nav { + margin: 0px; } + #topnav .app-search { + position: relative; + margin-top: 14px; } + #topnav .app-search a { + position: absolute; + top: 7px; + right: 26px; + color: rgba(54, 64, 74, 0.7); } + #topnav .app-search a:hover { + color: rgba(54, 64, 74, 0.9); } + #topnav .app-search .form-control, + #topnav .app-search .form-control:focus { + border-color: transparent; + height: 34px; + color: #36404a; + border-radius: 30px; + padding: 7px 40px 7px 20px; + margin: 0 12px 0 5px; + background: rgba(54, 64, 74, 0.1); + box-shadow: none; + width: 190px; } + #topnav .app-search input::-webkit-input-placeholder { + color: rgba(54, 64, 74, 0.8); } + #topnav .app-search input:-moz-placeholder { + color: rgba(54, 64, 74, 0.8); } + #topnav .app-search input::-moz-placeholder { + color: rgba(54, 64, 74, 0.8); } + #topnav .app-search input:-ms-input-placeholder { + color: rgba(54, 64, 74, 0.8); } + #topnav .navbar-custom { + background-color: #414d59; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); } + #topnav .navbar-toggle { + border: 0; + position: relative; + padding: 0; + margin: 0; + cursor: pointer; } + #topnav .navbar-toggle:hover { + background-color: transparent; } + #topnav .navbar-toggle:hover span { + background-color: #98a6ad; } + #topnav .navbar-toggle:focus { + background-color: transparent; } + #topnav .navbar-toggle:focus span { + background-color: #ffffff; } + #topnav .navbar-toggle .lines { + width: 25px; + display: block; + position: relative; + margin: 0 10px 0 0; + padding-top: 13px; + height: 23px; + -webkit-transition: all .5s ease; + transition: all .5s ease; } + #topnav .navbar-toggle span { + height: 2px; + width: 100%; + background-color: rgba(255, 255, 255, 0.8); + display: block; + margin-bottom: 5px; + -webkit-transition: -webkit-transform .5s ease; + transition: -webkit-transform .5s ease; + transition: transform .5s ease; } + #topnav .navbar-toggle.open span { + position: absolute; } + #topnav .navbar-toggle.open span:first-child { + top: 18px; + -webkit-transform: rotate(45deg); + transform: rotate(45deg); } + #topnav .navbar-toggle.open span:nth-child(2) { + visibility: hidden; } + #topnav .navbar-toggle.open span:last-child { + width: 100%; + top: 18px; + -webkit-transform: rotate(-45deg); + transform: rotate(-45deg); } + #topnav .navigation-menu { + list-style: none; + margin: 0; + padding: 0; + text-align: center; } + #topnav .navigation-menu > li { + display: inline-block; + position: relative; } + #topnav .navigation-menu > li > a { + display: block; + color: rgba(255, 255, 255, 0.7); + font-weight: 500; + -webkit-transition: all .5s ease; + transition: all .5s ease; + line-height: 20px; + padding-left: 25px; + padding-right: 25px; } + #topnav .navigation-menu > li > a:hover { + color: #33b5e5; } + #topnav .navigation-menu > li > a:focus { + color: #33b5e5; } + #topnav .navigation-menu > li > a:active { + color: #33b5e5; } + #topnav .navigation-menu > li > a i { + font-size: 18px; + vertical-align: middle; + margin-bottom: 5px; + text-align: center; + display: block; + -webkit-transition: all .5s ease; + transition: all .5s ease; } + #topnav .navigation-menu > li > a:hover, #topnav .navigation-menu > li > a:focus { + background-color: transparent; } + +/* + Responsive Menu +*/ +@media (min-width: 992px) { + #topnav .navigation-menu > li > a { + padding-top: 20px; + padding-bottom: 20px; } + + #topnav .navigation-menu > li > ul > li.has-submenu:active > a, #topnav .navigation-menu > li > ul > li.has-submenu:hover > a { + color: #33b5e5; } + + #topnav .navigation-menu > li.last-elements .submenu { + left: auto; + right: 0; } + #topnav .navigation-menu > li.last-elements .submenu > li.has-submenu .submenu { + left: auto; + right: 100%; + margin-left: 0; + margin-right: 10px; } + #topnav .navigation-menu > li:hover a { + color: #33b5e5; } + #topnav .navigation-menu > li:hover a i { + color: #33b5e5; } + #topnav .navigation-menu > li .submenu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + padding: 15px 0; + list-style: none; + min-width: 200px; + text-align: left; + visibility: hidden; + opacity: 0; + margin-top: 10px; + -webkit-transition: all .2s ease; + transition: all .2s ease; + background-color: #475462; + box-shadow: 0 2px 6px rgba(0, 0, 0, 0.05); } + #topnav .navigation-menu > li .submenu.megamenu { + white-space: nowrap; + width: auto; } + #topnav .navigation-menu > li .submenu.megamenu > li { + overflow: hidden; + width: 200px; + display: inline-block; + vertical-align: top; } + #topnav .navigation-menu > li .submenu > li.has-submenu > a:after { + content: "\56"; + font-family: "dripicons-v2" !important; + position: absolute; + right: 20px; + top: 8px; + font-size: 15px; } + #topnav .navigation-menu > li .submenu > li .submenu { + left: 100%; + top: 0; + margin-left: 10px; + margin-top: -1px; } + #topnav .navigation-menu > li .submenu li { + position: relative; } + #topnav .navigation-menu > li .submenu li ul { + list-style: none; + padding-left: 0; + margin: 0; } + #topnav .navigation-menu > li .submenu li a { + display: block; + padding: 8px 25px; + clear: both; + white-space: nowrap; + color: #98a6ad; + -webkit-transition: all .35s ease; + transition: all .35s ease; } + #topnav .navigation-menu > li .submenu li a:hover { + color: #ffffff; } + #topnav .navigation-menu > li .submenu li span { + display: block; + padding: 8px 25px; + clear: both; + line-height: 1.42857143; + white-space: nowrap; + font-size: 10px; + text-transform: uppercase; + letter-spacing: 2px; + font-weight: 500; + color: #98a6ad; } + #topnav .navbar-toggle { + display: none; } + + #topnav #navigation { + display: block !important; } } +@media (max-width: 991px) { + .wrapper { + padding-top: 60px; } + + .container { + width: auto !important; } + + #topnav .navigation-menu { + float: none; + max-height: 400px; + text-align: left; } + #topnav .navigation-menu > li { + display: block; } + #topnav .navigation-menu > li > a { + color: #36404a; + padding: 15px; } + #topnav .navigation-menu > li > a i { + display: inline-block; + margin-right: 10px; + margin-bottom: 0; + vertical-align: inherit; } + #topnav .navigation-menu > li > a:after { + position: absolute; + right: 15px; } + #topnav .navigation-menu > li .submenu { + display: none; + list-style: none; + padding-left: 20px; + margin: 0; } + #topnav .navigation-menu > li .submenu li a { + display: block; + position: relative; + padding: 7px 20px; + color: #36404a; } + #topnav .navigation-menu > li .submenu li a:hover { + color: #33b5e5; } + #topnav .navigation-menu > li .submenu li.has-submenu > a:after { + content: "\54"; + font-family: "dripicons-v2" !important; + position: absolute; + right: 30px; } + #topnav .navigation-menu > li .submenu.open { + display: block; } + #topnav .navigation-menu > li .submenu .submenu { + display: none; + list-style: none; } + #topnav .navigation-menu > li .submenu .submenu.open { + display: block; } + #topnav .navigation-menu > li .submenu.megamenu > li > ul { + list-style: none; + padding-left: 0; } + #topnav .navigation-menu > li .submenu.megamenu > li > ul > li > span { + display: block; + position: relative; + padding: 15px; + text-transform: uppercase; + font-size: 11px; + letter-spacing: 2px; + color: #36404a; } + #topnav .navigation-menu > li.has-submenu.open > a { + color: #33b5e5; } + #topnav .navbar-header { + float: left; } + + #navigation { + position: absolute; + top: 62px; + left: 0; + width: 100%; + display: none; + height: auto; + padding-bottom: 0; + overflow: auto; + border-top: 1px solid #e7e7e7; + border-bottom: 1px solid #e7e7e7; + background-color: #fff; } + + #navigation.open { + display: block; + overflow-y: auto; } } +@media (min-width: 768px) { + #topnav .navigation-menu > li.has-submenu:hover > .submenu { + visibility: visible; + opacity: 1; + margin-top: 0; } + + #topnav .navigation-menu > li.has-submenu:hover > .submenu > li.has-submenu:hover > .submenu { + visibility: visible; + opacity: 1; + margin-left: 0; + margin-right: 0; } + + .navbar-toggle { + display: block; } } +.topbar-custom { + border-radius: 0; + margin-bottom: 0; } + .topbar-custom .nav-link { + padding: 0; + line-height: 60px; + color: rgba(54, 64, 74, 0.6); } + .topbar-custom .dropdown-toggle:after { + content: initial; } + .topbar-custom .menu-left { + overflow: hidden; } + +/* Footer */ +.footer { + bottom: 0; + padding: 20px 0; + position: absolute; + right: 0; + left: 0; } + .footer ul li { + padding-left: 10px; + padding-right: 10px; } + .footer ul li a { + color: #98a6ad; } + .footer ul li a:hover { + color: #33b5e5; } + +/* Notification */ +.user-list .user-list-item { + padding: 10px 12px !important; + border-bottom: 1px solid #EEEEEE !important; } + .user-list .user-list-item .avatar { + float: left; + margin-right: 5px; + width: 30px; + height: 30px; } + .user-list .user-list-item .avatar img { + border-radius: 50%; + width: 100%; } + .user-list .user-list-item .icon { + float: left; + margin-right: 5px; + height: 30px; + width: 30px; + border-radius: 50%; + text-align: center; } + .user-list .user-list-item .icon i { + color: #ffffff; + line-height: 30px; + font-size: 16px; } + .user-list .user-list-item .user-desc { + margin-left: 40px; } + .user-list .user-list-item .user-desc span.name { + color: #36404a; + text-overflow: ellipsis; + white-space: nowrap; + display: block; + width: 100%; + overflow: hidden; + font-size: 13px; } + .user-list .user-list-item .user-desc span.desc { + color: #98a6ad; + text-overflow: ellipsis; + white-space: nowrap; + display: block; + width: 100%; + overflow: hidden; + font-size: 12px; } + .user-list .user-list-item .user-desc span.time { + font-size: 11px; } + +/* Notification */ +.notification-list { + margin-left: 0 !important; } + .notification-list .noti-title { + border-radius: 0.25rem 0.25rem 0 0; + background-color: #475462; + margin: -6px -1px 0px -1px; + width: auto; + padding: 12px 20px; } + .notification-list .noti-title h5 { + color: #ffffff; + margin: 0; } + .notification-list .noti-title .label { + float: right; } + .notification-list .noti-icon { + font-size: 22px; + padding: 0 12px; + vertical-align: middle; + color: rgba(255, 255, 255, 0.8); } + .notification-list .noti-icon-badge { + display: inline-block; + position: absolute; + top: 14px; + right: 8px; } + .notification-list .notify-item { + padding: 10px 20px; } + .notification-list .notify-item .notify-icon { + float: left; + height: 36px; + width: 36px; + line-height: 36px; + text-align: center; + margin-right: 10px; + border-radius: 50%; + color: #ffffff; } + .notification-list .notify-item .notify-icon img { + margin-top: 4px; } + .notification-list .notify-item .notify-details { + margin-bottom: 0; + overflow: hidden; + margin-left: 45px; + text-overflow: ellipsis; + white-space: nowrap; } + .notification-list .notify-item .notify-details b { + font-weight: 500; } + .notification-list .notify-item .notify-details small { + display: block; } + .notification-list .notify-item .notify-details span { + display: block; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + font-size: 13px; } + .notification-list .notify-all { + border-radius: 0 0 0.25rem 0.25rem; + margin: 0 0 -5px 0; + background-color: #475462; } + .notification-list .profile-dropdown .notify-item { + padding: 4px 20px; } + +.profile-dropdown { + width: 170px; } + .profile-dropdown i { + font-size: 17px; + vertical-align: middle; + margin-right: 5px; } + .profile-dropdown span { + vertical-align: middle; } + +.nav-user { + padding: 0 12px !important; } + .nav-user img { + height: 36px; + width: 36px; } + +/* ============= + Animation +============= */ +/* Bounce 1 */ +@-webkit-keyframes cd-bounce-1 { + 0% { + opacity: 0; + -webkit-transform: scale(0.5); } + 60% { + opacity: 1; + -webkit-transform: scale(1.2); } + 100% { + -webkit-transform: scale(1); } } +@-moz-keyframes cd-bounce-1 { + 0% { + opacity: 0; + -moz-transform: scale(0.5); } + 60% { + opacity: 1; + -moz-transform: scale(1.2); } + 100% { + -moz-transform: scale(1); } } +@-o-keyframes cd-bounce-1 { + 0% { + opacity: 0; + -o-transform: scale(0.5); } + 60% { + opacity: 1; + -o-transform: scale(1.2); } + 100% { + -o-transform: scale(1); } } +/* Bounce 2 */ +@-webkit-keyframes cd-bounce-2 { + 0% { + opacity: 0; + -webkit-transform: translateX(-100px); } + 60% { + opacity: 1; + -webkit-transform: translateX(20px); } + 100% { + -webkit-transform: translateX(0); } } +@-moz-keyframes cd-bounce-2 { + 0% { + opacity: 0; + -moz-transform: translateX(-100px); } + 60% { + opacity: 1; + -moz-transform: translateX(20px); } + 100% { + -moz-transform: translateX(0); } } +@-o-keyframes cd-bounce-2 { + 0% { + opacity: 0; + -o-transform: translateX(-100px); } + 60% { + opacity: 1; + -o-transform: translateX(20px); } + 100% { + opacity: 1; + -o-transform: translateX(0); } } +/* Dropdown */ +@-webkit-keyframes dropdownOpen { + 0% { + opacity: 0; + -webkit-transform: scale(0); } + 100% { + -webkit-transform: scale(1); } } +@-moz-keyframes dropdownOpen { + 0% { + opacity: 0; + -moz-transform: scale(0); } + 100% { + -moz-transform: scale(1); } } +@-o-keyframes dropdownOpen { + 0% { + opacity: 0; + -o-transform: scale(0); } + 100% { + -o-transform: scale(1); } } +/* Progressbar Animated */ +@-webkit-keyframes animationProgress { + from { + width: 0; } } +@keyframes animationProgress { + from { + width: 0; } } +/* Portlets loader */ +@-webkit-keyframes loaderAnimate { + 0% { + -webkit-transform: rotate(0deg); } + 100% { + -webkit-transform: rotate(220deg); } } +@-moz-keyframes loaderAnimate { + 0% { + -moz-transform: rotate(0deg); } + 100% { + -moz-transform: rotate(220deg); } } +@-o-keyframes loaderAnimate { + 0% { + -o-transform: rotate(0deg); } + 100% { + -o-transform: rotate(220deg); } } +@keyframes loaderAnimate { + 0% { + transform: rotate(0deg); } + 100% { + transform: rotate(220deg); } } +@-webkit-keyframes loaderAnimate2 { + 0% { + box-shadow: inset #555 0 0 0 8px; + -webkit-transform: rotate(-140deg); } + 50% { + box-shadow: inset #555 0 0 0 2px; } + 100% { + box-shadow: inset #555 0 0 0 8px; + -webkit-transform: rotate(140deg); } } +@-moz-keyframes loaderAnimate2 { + 0% { + box-shadow: inset #555 0 0 0 8px; + -moz-transform: rotate(-140deg); } + 50% { + box-shadow: inset #555 0 0 0 2px; } + 100% { + box-shadow: inset #555 0 0 0 8px; + -moz-transform: rotate(140deg); } } +@-o-keyframes loaderAnimate2 { + 0% { + box-shadow: inset #555 0 0 0 8px; + -o-transform: rotate(-140deg); } + 50% { + box-shadow: inset #555 0 0 0 2px; } + 100% { + box-shadow: inset #555 0 0 0 8px; + -o-transform: rotate(140deg); } } +@keyframes loaderAnimate2 { + 0% { + box-shadow: inset #555 0 0 0 8px; + -webkit-transform: rotate(-140deg); + -moz-transform: rotate(-140deg); + -ms-transform: rotate(-140deg); + transform: rotate(-140deg); } + 50% { + box-shadow: inset #555 0 0 0 2px; } + 100% { + box-shadow: inset #555 0 0 0 8px; + -webkit-transform: rotate(140deg); + -moz-transform: rotate(140deg); + -ms-transform: rotate(140deg); + transform: rotate(140deg); } } +@keyframes loaderAnimate2 { + 0% { + box-shadow: inset #999 0 0 0 17px; + transform: rotate(-140deg); } + 50% { + box-shadow: inset #999 0 0 0 2px; } + 100% { + box-shadow: inset #999 0 0 0 17px; + transform: rotate(140deg); } } +/*! + * Waves v0.6.0 + * http://fian.my.id/Waves + * + * Copyright 2014 Alfiana E. Sibuea and other contributors + * Released under the MIT license + * https://github.com/fians/Waves/blob/master/LICENSE + */ +.waves-effect { + position: relative; + cursor: pointer; + display: inline-block; + overflow: hidden; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -webkit-tap-highlight-color: transparent; + vertical-align: middle; + z-index: 1; + will-change: opacity, transform; + -webkit-transition: all 0.3s ease-out; + -moz-transition: all 0.3s ease-out; + -o-transition: all 0.3s ease-out; + -ms-transition: all 0.3s ease-out; + transition: all 0.3s ease-out; } + +.waves-effect .waves-ripple { + position: absolute; + border-radius: 50%; + width: 20px; + height: 20px; + margin-top: -10px; + margin-left: -10px; + opacity: 0; + background: rgba(0, 0, 0, 0.2); + -webkit-transition: all 0.7s ease-out; + -moz-transition: all 0.7s ease-out; + -o-transition: all 0.7s ease-out; + -ms-transition: all 0.7s ease-out; + transition: all 0.7s ease-out; + -webkit-transition-property: -webkit-transform, opacity; + -moz-transition-property: -moz-transform, opacity; + -o-transition-property: -o-transform, opacity; + transition-property: transform, opacity; + -webkit-transform: scale(0); + -moz-transform: scale(0); + -ms-transform: scale(0); + -o-transform: scale(0); + transform: scale(0); + pointer-events: none; } + +.waves-effect.waves-light .waves-ripple { + background-color: rgba(255, 255, 255, 0.45); } + +.waves-effect.waves-red .waves-ripple { + background-color: rgba(244, 67, 54, 0.7); } + +.waves-effect.waves-yellow .waves-ripple { + background-color: rgba(255, 235, 59, 0.7); } + +.waves-effect.waves-orange .waves-ripple { + background-color: rgba(255, 152, 0, 0.7); } + +.waves-effect.waves-purple .waves-ripple { + background-color: rgba(156, 39, 176, 0.7); } + +.waves-effect.waves-green .waves-ripple { + background-color: rgba(76, 175, 80, 0.7); } + +.waves-effect.waves-teal .waves-ripple { + background-color: rgba(0, 150, 136, 0.7); } + +.waves-notransition { + -webkit-transition: none !important; + -moz-transition: none !important; + -o-transition: none !important; + -ms-transition: none !important; + transition: none !important; } + +.waves-circle { + -webkit-transform: translateZ(0); + -moz-transform: translateZ(0); + -ms-transform: translateZ(0); + -o-transform: translateZ(0); + transform: translateZ(0); + text-align: center; + width: 2.5em; + height: 2.5em; + line-height: 2.5em; + border-radius: 50%; + -webkit-mask-image: none; } + +.waves-input-wrapper { + border-radius: 0.2em; + vertical-align: bottom; } + .waves-input-wrapper .waves-button-input { + position: relative; + top: 0; + left: 0; + z-index: 1; } + +.waves-block { + display: block; } + +/* ============= + Print css +============= */ +@media print { + body { + color: #36404a; } + + #topnav, .footer, .page-title-box { + display: none; + margin: 0; + padding: 0; } + + .left, .right-bar { + display: none; } + + .wrapper { + padding: 0 !important; } } +/* ============= + Buttons +============= */ +.btn { + border-radius: 3px; + outline: none !important; + font-size: 14px; } + +.btn-md { + padding: 8px 16px; } + +.btn-primary, .btn-success, .btn-default, .btn-info, .btn-warning, .btn-danger, .btn-inverse, .btn-purple, .btn-pink { + color: #ffffff !important; } + +.btn-default, .btn-default:hover, .btn-default:focus, .btn-default:active, .btn-default.active, .btn-default.focus, .btn-default:active, .btn-default:focus, .btn-default:hover, .open > .dropdown-toggle.btn-default { + background-color: #5fbeaa !important; + border: 1px solid #5fbeaa !important; } + +.btn-white, .btn-white:hover, .btn-white:focus, .btn-white:active, .btn-white.active, .btn-white.focus, .btn-white:active, .btn-white:focus, .btn-white:hover, .open > .dropdown-toggle.btn-white { + border: 1px solid #eaeaea !important; + background-color: #ffffff; + color: #4c5667 !important; } + .btn-white:hover, .btn-white:hover:hover, .btn-white:focus:hover, .btn-white:active:hover, .btn-white.active:hover, .btn-white.focus:hover, .btn-white:active:hover, .btn-white:focus:hover, .btn-white:hover:hover, .open > .dropdown-toggle.btn-white:hover { + background-color: #f9f9f9; } + .btn-white:focus, .btn-white:hover:focus, .btn-white:focus:focus, .btn-white:active:focus, .btn-white.active:focus, .btn-white.focus:focus, .btn-white:active:focus, .btn-white:focus:focus, .btn-white:hover:focus, .open > .dropdown-toggle.btn-white:focus { + background-color: #f9f9f9; } + .btn-white:active, .btn-white:hover:active, .btn-white:focus:active, .btn-white:active:active, .btn-white.active:active, .btn-white.focus:active, .btn-white:active:active, .btn-white:focus:active, .btn-white:hover:active, .open > .dropdown-toggle.btn-white:active { + background-color: #f9f9f9; } + +.btn-primary, .btn-primary:hover, .btn-primary:focus, .btn-primary:active, .btn-primary.active, .btn-primary.focus, .btn-primary:active, .btn-primary:focus, .btn-primary:hover, .open > .dropdown-toggle.btn-primary { + background-color: #5d9cec !important; + border: 1px solid #5d9cec !important; } + +.btn-success, .btn-success:hover, .btn-success:focus, .btn-success:active, .btn-success.active, .btn-success.focus, .btn-success:active, .btn-success:focus, .btn-success:hover, .open > .dropdown-toggle.btn-success { + background-color: #81c868 !important; + border: 1px solid #81c868 !important; } + +.btn-info, .btn-info:hover, .btn-info:focus, .btn-info:active, .btn-info.active, .btn-info.focus, .btn-info:active, .btn-info:focus, .btn-info:hover, .open > .dropdown-toggle.btn-info { + background-color: #34d3eb !important; + border: 1px solid #34d3eb !important; } + +.btn-warning, .btn-warning:hover, .btn-warning:focus, .btn-warning:active, .btn-warning.active, .btn-warning.focus, .btn-warning:active, .btn-warning:focus, .btn-warning:hover, .open > .dropdown-toggle.btn-warning { + background-color: #ffbd4a !important; + border: 1px solid #ffbd4a !important; } + +.btn-danger, .btn-danger:active, .btn-danger:focus, .btn-danger:hover, .btn-danger.active, .btn-danger.focus, .btn-danger:active, .btn-danger:focus, .btn-danger:hover, .open > .dropdown-toggle.btn-danger { + background-color: #f05050 !important; + border: 1px solid #f05050 !important; } + +.btn-inverse, .btn-inverse:hover, .btn-inverse:focus, .btn-inverse:active, .btn-inverse.active, .btn-inverse.focus, .btn-inverse:active, .btn-inverse:focus, .btn-inverse:hover, .open > .dropdown-toggle.btn-inverse { + background-color: #4c5667 !important; + border: 1px solid #4c5667 !important; + color: #ffffff; } + +.btn-inverse.focus, .btn-inverse:focus { + -webkit-box-shadow: 0 0 0 3px rgba(76, 86, 103, 0.5); + box-shadow: 0 0 0 3px rgba(76, 86, 103, 0.5); } + +.btn-purple, .btn-purple:hover, .btn-purple:focus, .btn-purple:active { + background-color: #7266ba !important; + border: 1px solid #7266ba !important; + color: #ffffff; } + +.btn-purple.focus, .btn-purple:focus { + -webkit-box-shadow: 0 0 0 3px rgba(114, 102, 186, 0.5); + box-shadow: 0 0 0 3px rgba(114, 102, 186, 0.5); } + +.btn-pink, .btn-pink:hover, .btn-pink:focus, .btn-pink:active { + background-color: #fb6d9d !important; + border: 1px solid #fb6d9d !important; + color: #ffffff; } + +.btn-pink.focus, .btn-pink:focus { + -webkit-box-shadow: 0 0 0 3px rgba(251, 109, 157, 0.5); + box-shadow: 0 0 0 3px rgba(251, 109, 157, 0.5); } + +.open > .dropdown-toggle.btn-primary.btn-custom, +.open > .dropdown-toggle.btn-success.btn-custom, +.open > .dropdown-toggle.btn-info.btn-custom, +.open > .dropdown-toggle.btn-warning.btn-custom, +.open > .dropdown-toggle.btn-danger.btn-custom, +.open > .dropdown-toggle.btn-default.btn-custom { + border-width: 2px !important; + color: #ffffff !important; } + +.open > .dropdown-toggle.btn-white.btn-custom { + border-width: 2px !important; } + +.btn-custom.btn-default { + color: #5fbeaa !important; } + +.btn-custom.btn-primary { + color: #5d9cec !important; } + +.btn-custom.btn-success { + color: #81c868 !important; } + +.btn-custom.btn-info { + color: #34d3eb !important; } + +.btn-custom.btn-warning { + color: #ffbd4a !important; } + +.btn-custom.btn-danger { + color: #f05050 !important; } + +.btn-custom.btn-inverse { + color: #4c5667 !important; } + +.btn-custom.btn-purple { + color: #7266ba !important; } + +.btn-custom.btn-white { + color: #ffffff !important; } + .btn-custom.btn-white:hover, .btn-custom.btn-white:focus, .btn-custom.btn-white:active { + color: #4c5667 !important; + background-color: #f4f8fb !important; } + +.btn-custom.btn-pink { + color: #fb6d9d !important; } + +.btn-rounded { + border-radius: 2em !important; + padding: 6px 20px; } + .btn-rounded .btn-label { + padding: 7px 15px 7px 20px; + margin-left: -20px; } + .btn-rounded .btn-label-right { + margin-right: -20px; + margin-left: 12px; } + +.btn-custom { + -moz-border-radius: 2px; + -moz-transition: all 400ms ease-in-out; + -o-transition: all 400ms ease-in-out; + -webkit-border-radius: 2px; + -webkit-transition: all 400ms ease-in-out; + background-color: transparent !important; + border-radius: 5px; + transition: all 400ms ease-in-out; + background-clip: inherit; } + .btn-custom:hover { + color: #ffffff !important; } + .btn-custom:focus { + color: #ffffff !important; } + +.btn-label { + background: rgba(0, 0, 0, 0.05); + display: inline-block; + padding: 7px 15px; + border-radius: 3px 0 0 3px; + margin: -7px -13px; + margin-right: 12px; } + +.btn-label-right { + margin-left: 12px; + margin-right: -13px; + border-radius: 0px 3px 3px 0px; } + +.btn-group.open .dropdown-toggle { + box-shadow: none; } + +/* File Upload */ +.fileupload { + overflow: hidden; + position: relative; } + .fileupload input.upload { + cursor: pointer; + filter: alpha(opacity=0); + font-size: 20px; + margin: 0; + opacity: 0; + padding: 0; + position: absolute; + right: 0; + top: 0; } + +/* Social Buttons */ +.btn-facebook { + color: #ffffff !important; + background-color: #3b5998 !important; } + +.btn-twitter { + color: #ffffff !important; + background-color: #00aced !important; } + +.btn-linkedin { + color: #ffffff !important; + background-color: #007bb6 !important; } + +.btn-dribbble { + color: #ffffff !important; + background-color: #ea4c89 !important; } + +.btn-googleplus { + color: #ffffff !important; + background-color: #dd4b39 !important; } + +.btn-instagram { + color: #ffffff !important; + background-color: #517fa4 !important; } + +.btn-pinterest { + color: #ffffff !important; + background-color: #cb2027 !important; } + +.btn-dropbox { + color: #ffffff !important; + background-color: #007ee5 !important; } + +.btn-flickr { + color: #ffffff !important; + background-color: #ff0084 !important; } + +.btn-tumblr { + color: #ffffff !important; + background-color: #32506d !important; } + +.btn-skype { + color: #ffffff !important; + background-color: #00aff0 !important; } + +.btn-youtube { + color: #ffffff !important; + background-color: #bb0000 !important; } + +.btn-github { + color: #ffffff !important; + background-color: #171515 !important; } + +.checkbox { + padding-left: 5px; } + .checkbox label { + display: inline-block; + padding-left: 5px; + position: relative; + font-weight: 500; + font-size: 13px; } + .checkbox label::before { + -o-transition: 0.3s ease-in-out; + -webkit-transition: 0.3s ease-in-out; + background-color: #414d59; + border-radius: 2px; + border: 1px solid #98a6ad; + content: ""; + display: inline-block; + height: 17px; + left: 0; + margin-left: -17px; + position: absolute; + transition: 0.3s ease-in-out; + width: 17px; + outline: none !important; } + .checkbox label::after { + color: #98a6ad; + display: inline-block; + font-size: 11px; + height: 16px; + left: 0; + margin-left: -17px; + padding-left: 3px; + padding-top: 1px; + position: absolute; + top: 0; + width: 16px; } + .checkbox input[type="checkbox"] { + cursor: pointer; + opacity: 0; + z-index: 1; + outline: none !important; } + .checkbox input[type="checkbox"]:disabled + label { + opacity: 0.65; } + .checkbox input[type="checkbox"]:focus + label::before { + outline-offset: -2px; + outline: none; } + .checkbox input[type="checkbox"]:checked + label::after { + content: "\f00c"; + font-family: 'FontAwesome'; } + .checkbox input[type="checkbox"]:disabled + label::before { + background-color: #eeeeee; + cursor: not-allowed; } + +.checkbox.checkbox-circle label::before { + border-radius: 50%; } + +.checkbox.checkbox-inline { + margin-top: 0; } + +.checkbox.checkbox-single input { + height: 18px; + width: 18px; + position: absolute; } +.checkbox.checkbox-single label { + height: 18px; + width: 18px; } + .checkbox.checkbox-single label:before { + margin-left: 0; } + .checkbox.checkbox-single label:after { + margin-left: 0; } + +.checkbox-custom input[type="checkbox"]:checked + label::before { + background-color: #5d9cec; + border-color: #5d9cec; } +.checkbox-custom input[type="checkbox"]:checked + label::after { + color: #ffffff; } + +.checkbox-primary input[type="checkbox"]:checked + label::before { + background-color: #5d9cec; + border-color: #5d9cec; } +.checkbox-primary input[type="checkbox"]:checked + label::after { + color: #ffffff; } + +.checkbox-danger input[type="checkbox"]:checked + label::before { + background-color: #f05050; + border-color: #f05050; } +.checkbox-danger input[type="checkbox"]:checked + label::after { + color: #ffffff; } + +.checkbox-info input[type="checkbox"]:checked + label::before { + background-color: #34d3eb; + border-color: #34d3eb; } +.checkbox-info input[type="checkbox"]:checked + label::after { + color: #ffffff; } + +.checkbox-warning input[type="checkbox"]:checked + label::before { + background-color: #ffbd4a; + border-color: #ffbd4a; } +.checkbox-warning input[type="checkbox"]:checked + label::after { + color: #ffffff; } + +.checkbox-success input[type="checkbox"]:checked + label::before { + background-color: #81c868; + border-color: #81c868; } +.checkbox-success input[type="checkbox"]:checked + label::after { + color: #ffffff; } + +.checkbox-purple input[type="checkbox"]:checked + label::before { + background-color: #7266ba; + border-color: #7266ba; } +.checkbox-purple input[type="checkbox"]:checked + label::after { + color: #ffffff; } + +.checkbox-pink input[type="checkbox"]:checked + label::before { + background-color: #fb6d9d; + border-color: #fb6d9d; } +.checkbox-pink input[type="checkbox"]:checked + label::after { + color: #ffffff; } + +.checkbox-inverse input[type="checkbox"]:checked + label::before { + background-color: #4c5667; + border-color: #4c5667; } +.checkbox-inverse input[type="checkbox"]:checked + label::after { + color: #ffffff; } + +/* Radios */ +.radio label { + display: inline-block; + padding-left: 5px; + position: relative; + font-weight: 500; + font-size: 13px; } + .radio label::before { + -o-transition: border 0.5s ease-in-out; + -webkit-transition: border 0.5s ease-in-out; + background-color: #414d59; + border-radius: 50%; + border: 1px solid #98a6ad; + content: ""; + display: inline-block; + height: 17px; + left: 0; + margin-left: -20px; + position: absolute; + transition: border 0.5s ease-in-out; + width: 17px; + outline: none !important; } + .radio label::after { + -moz-transition: -moz-transform 0.1s cubic-bezier(0.8, -0.33, 0.2, 1.33); + -ms-transform: scale(0, 0); + -o-transform: scale(0, 0); + -o-transition: -o-transform 0.1s cubic-bezier(0.8, -0.33, 0.2, 1.33); + -webkit-transform: scale(0, 0); + -webkit-transition: -webkit-transform 0.1s cubic-bezier(0.8, -0.33, 0.2, 1.33); + background-color: #98a6ad; + border-radius: 50%; + content: " "; + display: inline-block; + height: 11px; + left: 3px; + margin-left: -20px; + position: absolute; + top: 3px; + transform: scale(0, 0); + transition: transform 0.1s cubic-bezier(0.8, -0.33, 0.2, 1.33); + width: 11px; } +.radio input[type="radio"] { + cursor: pointer; + opacity: 0; + z-index: 1; + outline: none !important; } + .radio input[type="radio"]:disabled + label { + opacity: 0.65; } +.radio input[type="radio"]:focus + label::before { + outline-offset: -2px; + outline: thin dotted; } +.radio input[type="radio"]:checked + label::after { + -ms-transform: scale(1, 1); + -o-transform: scale(1, 1); + -webkit-transform: scale(1, 1); + transform: scale(1, 1); } +.radio input[type="radio"]:disabled + label::before { + cursor: not-allowed; } + +.radio.radio-inline { + margin-top: 0; } + +.radio.radio-single label { + height: 17px; } + +.radio-custom input[type="radio"] + label::after { + background-color: #5d9cec; } +.radio-custom input[type="radio"]:checked + label::before { + border-color: #5d9cec; } +.radio-custom input[type="radio"]:checked + label::after { + background-color: #5d9cec; } + +.radio-primary input[type="radio"] + label::after { + background-color: #5d9cec; } +.radio-primary input[type="radio"]:checked + label::before { + border-color: #5d9cec; } +.radio-primary input[type="radio"]:checked + label::after { + background-color: #5d9cec; } + +.radio-danger input[type="radio"] + label::after { + background-color: #f05050; } +.radio-danger input[type="radio"]:checked + label::before { + border-color: #f05050; } +.radio-danger input[type="radio"]:checked + label::after { + background-color: #f05050; } + +.radio-info input[type="radio"] + label::after { + background-color: #34d3eb; } +.radio-info input[type="radio"]:checked + label::before { + border-color: #34d3eb; } +.radio-info input[type="radio"]:checked + label::after { + background-color: #34d3eb; } + +.radio-warning input[type="radio"] + label::after { + background-color: #ffbd4a; } +.radio-warning input[type="radio"]:checked + label::before { + border-color: #ffbd4a; } +.radio-warning input[type="radio"]:checked + label::after { + background-color: #ffbd4a; } + +.radio-success input[type="radio"] + label::after { + background-color: #81c868; } +.radio-success input[type="radio"]:checked + label::before { + border-color: #81c868; } +.radio-success input[type="radio"]:checked + label::after { + background-color: #81c868; } + +.radio-purple input[type="radio"] + label::after { + background-color: #7266ba; } +.radio-purple input[type="radio"]:checked + label::before { + border-color: #7266ba; } +.radio-purple input[type="radio"]:checked + label::after { + background-color: #7266ba; } + +.radio-pink input[type="radio"] + label::after { + background-color: #fb6d9d; } +.radio-pink input[type="radio"]:checked + label::before { + border-color: #fb6d9d; } +.radio-pink input[type="radio"]:checked + label::after { + background-color: #fb6d9d; } + +/* ============= + Portlets +============= */ +.portlet { + background: #36404a; + border: 1px solid rgba(54, 64, 74, 0.05); + border-radius: 5px; + margin-bottom: 20px; + background-clip: padding-box; } + .portlet .portlet-heading { + border-radius: 3px 3px 0 0; + padding: 12px 20px; } + .portlet .portlet-heading .portlet-title { + float: left; + font-size: 18px; + font-weight: 600; + margin-bottom: 0; + margin-top: 5px; } + .portlet .portlet-heading .portlet-widgets { + display: inline-block; + float: right; + font-size: 15px; + line-height: 30px; + padding-left: 15px; + position: relative; + text-align: right; } + .portlet .portlet-heading .portlet-widgets .divider { + margin: 0 5px; } + .portlet .portlet-heading .portlet-widgets .collapsed .ion-minus-round:before { + content: "\f217" !important; } + .portlet .portlet-heading a { + color: #999999; } + .portlet .portlet-body { + -moz-border-radius-bottomleft: 5px; + -moz-border-radius-bottomright: 5px; + -webkit-border-bottom-left-radius: 5px; + -webkit-border-bottom-right-radius: 5px; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + padding: 15px; } + +.portlet .portlet-heading.bg-custom a, .portlet .portlet-heading.bg-purple a, .portlet .portlet-heading.bg-info a, .portlet .portlet-heading.bg-success a, .portlet .portlet-heading.bg-primary a, .portlet .portlet-heading.bg-danger a, .portlet .portlet-heading.bg-warning a, .portlet .portlet-heading.bg-inverse a, .portlet .portlet-heading.bg-pink a { + color: #ffffff; } + +.panel-disabled { + background: rgba(255, 255, 255, 0.2); + bottom: 20px; + left: 10px; + position: absolute; + right: 10px; + top: 0; + border-radius: 5px; } + +.loader-1 { + -moz-animation: loaderAnimate 1000ms linear infinite; + -o-animation: loaderAnimate 1000ms linear infinite; + -webkit-animation: loaderAnimate 1000ms linear infinite; + animation: loaderAnimate 1000ms linear infinite; + clip: rect(0, 30px, 30px, 15px); + height: 30px; + left: 50%; + margin-left: -15px; + margin-top: -15px; + position: absolute; + top: 50%; + width: 30px; } + .loader-1:after { + -moz-animation: loaderAnimate2 1000ms ease-in-out infinite; + -o-animation: loaderAnimate2 1000ms ease-in-out infinite; + -webkit-animation: loaderAnimate2 1000ms ease-in-out infinite; + animation: loaderAnimate2 1000ms ease-in-out infinite; + border-radius: 50%; + clip: rect(0, 30px, 30px, 15px); + content: ''; + height: 30px; + position: absolute; + width: 30px; } + +/* ============= + Progressbars +============= */ +.progress { + -webkit-box-shadow: none !important; + background-color: #414d59; + box-shadow: none !important; + height: 10px; + margin-bottom: 18px; + overflow: hidden; } + +.progress-bar { + box-shadow: none; + font-size: 8px; + font-weight: 600; + line-height: 12px; } + +.progress.progress-sm { + height: 5px !important; } + .progress.progress-sm .progress-bar { + font-size: 8px; + line-height: 5px; } + +.progress.progress-md { + height: 15px !important; } + .progress.progress-md .progress-bar { + font-size: 10.8px; + line-height: 14.4px; } + +.progress.progress-lg { + height: 1rem !important; } + .progress.progress-lg .progress-bar { + font-size: 12px; + line-height: 20px; } + +.progress-bar-primary { + background-color: #5d9cec; } + +.progress-bar-success { + background-color: #81c868; } + +.progress-bar-info { + background-color: #34d3eb; } + +.progress-bar-warning { + background-color: #ffbd4a; } + +.progress-bar-danger { + background-color: #f05050; } + +.progress-bar-inverse { + background-color: #4c5667; } + +.progress-bar-purple { + background-color: #7266ba; } + +.progress-bar-pink { + background-color: #fb6d9d; } + +.progress-bar-custom { + background-color: #33b5e5; } + +.progress-animated { + -webkit-animation-duration: 5s; + -webkit-animation-name: animationProgress; + -webkit-transition: 5s all; + animation-duration: 5s; + animation-name: animationProgress; + transition: 5s all; } + +/* Progressbar Vertical */ +.progress-vertical { + min-height: 250px; + height: 250px; + width: 10px; + position: relative; + display: inline-block; + margin-bottom: 0; + margin-right: 20px; } + .progress-vertical .progress-bar { + width: 100%; } + +.progress-vertical-bottom { + min-height: 250px; + height: 250px; + position: relative; + width: 10px; + display: inline-block; + margin-bottom: 0; + margin-right: 20px; } + .progress-vertical-bottom .progress-bar { + width: 100%; + position: absolute; + bottom: 0; } + +.progress-vertical.progress-sm, .progress-vertical-bottom.progress-sm { + width: 5px !important; } + .progress-vertical.progress-sm .progress-bar, .progress-vertical-bottom.progress-sm .progress-bar { + font-size: 8px; + line-height: 5px; } + +.progress-vertical.progress-md, .progress-vertical-bottom.progress-md { + width: 15px !important; } + .progress-vertical.progress-md .progress-bar, .progress-vertical-bottom.progress-md .progress-bar { + font-size: 10.8px; + line-height: 14.4px; } + +.progress-vertical.progress-lg, .progress-vertical-bottom.progress-lg { + width: 20px !important; } + .progress-vertical.progress-lg .progress-bar, .progress-vertical-bottom.progress-lg .progress-bar { + font-size: 12px; + line-height: 20px; } + +/* ============= + Tables +============= */ +.table { + margin-bottom: 10px; } + +.table-striped > tbody > tr:nth-of-type(odd), .table-hover > tbody > tr:hover, +.table > thead > tr > td.active, .table > tbody > tr > td.active, .table > tfoot > tr > td.active, +.table > thead > tr > th.active, .table > tbody > tr > th.active, .table > tfoot > tr > th.active, +.table > thead > tr.active > td, .table > tbody > tr.active > td, .table > tfoot > tr.active > td, +.table > thead > tr.active > th, .table > tbody > tr.active > th, .table > tfoot > tr.active > th { + background-color: #414d59 !important; } + +.table > thead > tr > th, .table > tbody > tr > th, .table > tfoot > tr > th, +.table > thead > tr > td, .table > tbody > tr > td, .table > tfoot > tr > td, +.table > thead > tr > th, .table-bordered { + border-top: 1px solid #414d59; } + +.table-bordered > thead > tr > th, +.table-bordered > tbody > tr > th, +.table-bordered > tfoot > tr > th, +.table-bordered > thead > tr > td, +.table-bordered > tbody > tr > td, +.table-bordered > tfoot > tr > td { + border: 1px solid #414d59; } + +.table > thead > tr > th { + vertical-align: bottom; + border-bottom: 2px solid #414d59; } + +.table-bordered, .table-responsive[data-pattern="priority-columns"] { + border: 1px solid #414d59; } + +table.focus-on tbody tr.focused th { + background-color: #33b5e5; + color: #ffffff; } +table.focus-on tbody tr.focused td { + background-color: #33b5e5; + color: #ffffff; } + +.table-wrapper .btn-toolbar { + display: block; } +.table-wrapper .dropdown-menu { + left: auto; + right: 0; } + +.sticky-table-header.fixed-solution { + top: 147px !important; + background-color: #33b5e5; } + +.fixed-table-container tbody .selected td { + background-color: #414d59; } + +.modal-block { + background: transparent; + margin: 40px auto; + max-width: 600px; + padding: 0; + position: relative; + text-align: left; } + +/* Data table */ +#datatable-editable .actions a { + padding: 5px; } +#datatable-editable .form-control { + background-color: #ffffff; + width: 100%; } +#datatable-editable .fa-trash-o { + color: #f05050; } +#datatable-editable .fa-times { + color: #f05050; } +#datatable-editable .fa-pencil { + color: #29b6f6; } +#datatable-editable .fa-save { + color: #33b86c; } + +#datatable td { + font-weight: normal; } + +div.dataTables_paginate ul.pagination { + margin-top: 30px; } + +div.dataTables_info { + padding-top: 38px; } + +.dt-buttons { + float: left; } + +div#datatable-buttons_info { + float: left; } + +#datatable-editable .form-control { + background-color: #ffffff; + width: auto; + height: 20px; } + +/* Footable */ +.footable-odd { + background-color: #36404a; } + +.footable-detail-show { + background-color: #414d59; } + +.footable-row-detail { + background-color: #414d59; } + +.footable-pagination li { + margin-left: 5px; + display: inline-block; + float: left; } + .footable-pagination li a { + position: relative; + display: block; + padding: .5rem .75rem; + margin-left: -1px; + line-height: 1.25; + color: #98a6ad; + background-color: #414d59; + border: 1px solid #414d59; } +.footable-pagination li.active a { + color: #ffffff; } + +/* Bootstrap Table */ +table[data-toggle="table"] { + display: none; } + +.fixed-table-pagination .pagination-detail, .fixed-table-pagination div.pagination { + margin-top: 20px; } + +.fixed-table-container { + border: none; } + +.bootstrap-table .table > thead > tr > th { + border-bottom: 2px solid #4c5a67; + background: #414d59; } + +.fixed-table-container thead th .th-inner { + padding: 9px 12px; } + +.bootstrap-table .table, .bootstrap-table .table > tbody > tr > td, .bootstrap-table .table > tbody > tr > th, .bootstrap-table .table > tfoot > tr > td, .bootstrap-table .table > tfoot > tr > th, .bootstrap-table .table > thead > tr > td { + padding: 8px 12px !important; } + +.fixed-table-pagination .pagination a { + display: block; + border-radius: 3px; } +.fixed-table-pagination .page-number.active a { + color: #ffffff; } +.fixed-table-pagination .page-list .dropdown-menu a { + color: #98a6ad; + display: block; } + +/* Tablesaw */ +.tablesaw thead { + background: #414d59; + background-image: none; + border: none; } + +table.tablesaw thead th, table.tablesaw thead td { + color: #ffffff; } + +.tablesaw thead th { + text-shadow: none; + letter-spacing: 0.06em; } + +.tablesaw thead tr:first-child th { + padding-top: 1.1em; + padding-bottom: 0.9em; + font-weight: 600; + font-family: inherit; + border: none; } + +.tablesaw td, .tablesaw tbody th { + font-size: inherit; + line-height: inherit; + padding: 10px !important; } + +.tablesaw-stack tbody tr, .tablesaw tbody tr { + border-bottom: none; } + +.tablesaw-sortable .tablesaw-sortable-head.tablesaw-sortable-ascending button:after, .tablesaw-sortable .tablesaw-sortable-head.tablesaw-sortable-descending button:after { + font-family: FontAwesome; + font-size: 10px; } + +.tablesaw-sortable .tablesaw-sortable-head.tablesaw-sortable-ascending button:after { + content: "\f176"; } + +.tablesaw-sortable .tablesaw-sortable-head.tablesaw-sortable-descending button:after { + content: "\f175"; } + +.tablesaw-bar .btn-select.btn-small:after, .tablesaw-bar .btn-select.btn-micro:after { + font-size: 8px; + padding-right: 10px; } + +.tablesaw-swipe .tablesaw-cell-persist { + box-shadow: none; } + +.tablesaw-enhanced .tablesaw-bar .btn { + text-shadow: none; + background-image: none; } + +.tablesaw-enhanced .tablesaw-bar .btn.btn-select:hover { + background: #ffffff; } + +.tablesaw-enhanced .tablesaw-bar .btn:hover, .tablesaw-enhanced .tablesaw-bar .btn:focus, .tablesaw-enhanced .tablesaw-bar .btn:active { + color: #5fbeaa !important; + background-color: #ebeff2; + outline: none !important; + box-shadow: none !important; + background-image: none; } + +.tablesaw-swipe .tablesaw-cell-persist { + border-right: 1px solid #566676; } + +.tablesaw-columntoggle-btnwrap.visible .tablesaw-columntoggle-popup { + background-color: #4c5a67; } + +.tablesaw-columntoggle-btnwrap .btn-group { + display: block; } + +/* Fixed table */ +.fixedHeader-floating { + top: 60px !important; } + +/* Key Table */ +table.dataTable th.focus, table.dataTable td.focus { + outline: 3px solid #5fbeaa !important; + outline-offset: -1px; } + +/* ColVid Tables */ +div.ColVis { + float: none; + margin-right: 30px; } + +button.ColVis_Button, .ColVis_Button:hover { + float: none; + border-radius: 3px; + outline: none !important; + background: none; + box-shadow: none; + color: #ffffff !important; + background-color: #5fbeaa !important; + border: 1px solid #5fbeaa !important; } + +.dataTables_length { + float: left; } + +div.ColVis_collectionBackground { + background-color: transparent; } + +ul.ColVis_collection { + padding: 10px 0px 0px 0px; + background-color: #ffffff; + box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.26); + border: none; } + ul.ColVis_collection li { + background: transparent !important; + padding: 3px 10px !important; + border: none !important; + box-shadow: none !important; } + +#datatable-colvid_info { + float: left; } + +/* JsGrid table */ +.jsgrid-grid-header, .jsgrid-header-row > .jsgrid-header-cell, +.jsgrid-filter-row > .jsgrid-cell, .jsgrid-row > .jsgrid-cell { + background: transparent; } + +.jsgrid-cell { + padding: .8em; } + +.jsgrid-edit-row > .jsgrid-cell, .jsgrid-filter-row > .jsgrid-cell, +.jsgrid-grid-body, .jsgrid-grid-header, .jsgrid-header-row > .jsgrid-header-cell, +.jsgrid-insert-row > .jsgrid-cell { + border: 1px solid rgba(255, 255, 255, 0.1); } + +.jsgrid-selected-row > .jsgrid-cell { + background: #414d59; + border-color: #414d59; } + .jsgrid-selected-row > .jsgrid-cell .jsgrid-button { + background-color: #ebeff2; } + +.jsgrid-cell { + border: 1px solid rgba(255, 255, 255, 0.1); } + +.jsgrid-alt-row > .jsgrid-cell { + background: #414d59; } + +.jsgrid-edit-row > .jsgrid-cell, .jsgrid-insert-row > .jsgrid-cell { + background: rgba(255, 255, 255, 0.1); } + .jsgrid-edit-row > .jsgrid-cell .jsgrid-button, .jsgrid-insert-row > .jsgrid-cell .jsgrid-button { + background-color: #ebeff2; } + +.jsgrid input, .jsgrid select, .jsgrid textarea { + border: 1px solid #4c5a67; + padding: .4em .6em; + color: #ffffff; + background-color: transparent; } + +.jsgrid-pager-container { + margin-top: 10px; } + +.jsgrid-pager-page { + padding: 0; + margin: 0 2px; } + +.jsgrid-pager-page a, .jsgrid-pager-current-page { + background-color: rgba(255, 255, 255, 0.2); + border-radius: 50%; + height: 24px; + width: 24px; + display: inline-block; + text-align: center; + line-height: 24px; + color: #ffffff; } + +.jsgrid-pager-page.jsgrid-pager-current-page { + background-color: #33b5e5; } + +.jsgrid-pager-nav-button a { + color: #98a6ad; + font-weight: 500; + font-family: "Source Sans Pro", "Helvetica Neue", Helvetica, Arial, sans-serif; } + .jsgrid-pager-nav-button a:hover { + color: #33b5e5; } + +.jsgrid .jsgrid-button { + width: 24px; + height: 24px; + border-radius: 50%; + background-image: url("../images/download.png"); + background-color: #eee; } + .jsgrid .jsgrid-button:hover { + opacity: 0.9; + background-color: #ebeff2; } + +.jsgrid-search-mode-button { + background-position: 0 -295px; } + +.jsgrid-insert-button { + background-position: 0 -160px; } + +.jsgrid-header-sort:before { + position: absolute; } + +.jsgrid-header-cell { + text-align: center !important; } + +/* ============= + Widgets +============= */ +/* Widget-box styles */ +.widget-box-1 i.inform { + font-size: 20px; + cursor: pointer; } +.widget-box-1 h4 { + margin-bottom: 5px; + margin-top: 0; } +.widget-box-1 h2 { + margin: 20px; + font-weight: 600; } +.widget-box-1 p { + margin-bottom: 0; } + +.widget-s-1 { + border-radius: 6px; } + +/* Widget (background-icon) */ +.widget-bg-color-icon .bg-icon { + height: 80px; + width: 80px; + text-align: center; + border-radius: 50%; } + .widget-bg-color-icon .bg-icon i { + font-size: 32px; + line-height: 80px; } +.widget-bg-color-icon .bg-icon-info { + background-color: rgba(52, 211, 235, 0.2); + border: 1px solid #34d3eb; } +.widget-bg-color-icon .bg-icon-primary { + background-color: rgba(93, 156, 236, 0.2); + border: 1px solid #5d9cec; } +.widget-bg-color-icon .bg-icon-pink { + background-color: rgba(251, 109, 157, 0.2); + border: 1px solid #fb6d9d; } +.widget-bg-color-icon .bg-icon-purple { + background-color: rgba(114, 102, 186, 0.2); + border: 1px solid #7266ba; } +.widget-bg-color-icon .bg-icon-success { + background-color: rgba(129, 200, 104, 0.2); + border: 1px solid #81c868; } +.widget-bg-color-icon .bg-icon-custom { + background-color: rgba(95, 190, 170, 0.2); + border: 1px solid #33b5e5; } +.widget-bg-color-icon .bg-icon-warning { + background-color: rgba(255, 189, 74, 0.2); + border: 1px solid #ffbd4a; } +.widget-bg-color-icon .bg-icon-danger { + background-color: rgba(240, 80, 80, 0.2); + border: 1px solid #f05050; } +.widget-bg-color-icon .bg-icon-inverse { + background-color: rgba(76, 86, 103, 0.2); + border: 1px solid #4c5667; } + +.mini-stat-icon { + -moz-border-radius: 100%; + -webkit-border-radius: 100%; + border-radius: 100%; + background-color: rgba(255, 255, 255, 0.2); + display: inline-block; + float: left; + font-size: 30px; + height: 60px; + line-height: 60px; + margin-right: 10px; + text-align: center; + width: 60px; } + +.mini-stat-info { + padding-top: 2px; + color: #eeeeee; } + .mini-stat-info span { + color: #ffffff; + display: block; + font-size: 24px; + font-weight: 600; } + .mini-stat-info span.name { + color: #ffffff; + display: block; + font-size: 18px; + font-weight: 600; + margin-top: 5px; } + +.widget-inline { + padding: 20px 0 !important; } + .widget-inline .col-lg-3 { + padding: 0; } + .widget-inline .widget-inline-box { + border-right: 1px solid #4c5a67; + padding: 20px; } + .widget-inline .widget-inline-box i { + font-size: 32px; } + +/* Inbox-widget */ +.inbox-widget .inbox-item { + border-bottom: 1px solid #4c5a67; + overflow: hidden; + padding: 10px 0; + position: relative; } + .inbox-widget .inbox-item .inbox-item-img { + display: block; + float: left; + margin-right: 15px; + width: 40px; } + .inbox-widget .inbox-item img { + width: 40px; } + .inbox-widget .inbox-item .inbox-item-author { + color: #ffffff; + display: block; + margin: 0; } + .inbox-widget .inbox-item .inbox-item-text { + color: #98a6ad; + display: block; + font-size: 12px; + margin: 0; } + .inbox-widget .inbox-item .inbox-item-date { + color: #98a6ad; + font-size: 11px; + position: absolute; + right: 7px; + top: 2px; } + +/* Chat widget */ +.conversation-list { + list-style: none; + max-height: 330px; + padding: 0 20px; } + .conversation-list li { + margin-bottom: 24px; } + .conversation-list .chat-avatar { + display: inline-block; + float: left; + text-align: center; + width: 40px; } + .conversation-list .chat-avatar img { + border-radius: 100%; + width: 100%; } + .conversation-list .chat-avatar i { + font-size: 12px; + font-style: normal; } + .conversation-list .ctext-wrap { + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + background: #45525f; + border-radius: 3px; + display: inline-block; + padding: 10px; + position: relative; } + .conversation-list .ctext-wrap i { + color: #ffffff; + display: block; + font-size: 12px; + font-style: normal; + font-weight: bold; + position: relative; } + .conversation-list .ctext-wrap p { + margin: 0; + padding-top: 3px; } + .conversation-list .ctext-wrap:after { + right: 100%; + top: 20%; + border: 5px solid rgba(213, 242, 239, 0); + content: " "; + height: 0; + width: 0; + position: absolute; + pointer-events: none; + border-right-color: #45525f; + margin-top: -5px; } + .conversation-list .conversation-text { + display: inline-block; + float: left; + font-size: 12px; + margin-left: 12px; + width: 70%; } + .conversation-list .odd .chat-avatar { + float: right !important; } + .conversation-list .odd .conversation-text { + float: right !important; + margin-right: 12px; + text-align: right; + width: 70% !important; } + .conversation-list .odd p { + color: #f2f2f2; } + .conversation-list .odd .ctext-wrap { + background: #5fbeaa !important; } + .conversation-list .odd .ctext-wrap i { + color: #ffffff; } + .conversation-list .odd .ctext-wrap:after { + border-color: rgba(238, 238, 242, 0) !important; + border-left-color: #5fbeaa !important; + left: 100% !important; + top: 20% !important; } + +.chat-send button { + width: 100%; } + +/* Todos widget */ +#todo-message { + font-size: 16px; } + +.todo-list li { + border-radius: 0; + border: 0; + margin: 0; + padding: 10px 0; + color: #98a6ad; + display: block; } + .todo-list li:last-of-type { + border-bottom: none; } + +/* Chat app */ +.chat-app-list { + padding: 0 20px; } + .chat-app-list .list-group-item { + background: transparent; } + +/* Widget-chart */ +.widget-chart ul li { + width: 31.5%; + display: inline-block; + padding: 0; } + +.widget-panel { + padding: 30px 20px; + padding-left: 30px; + border-radius: 4px; + position: relative; + margin-bottom: 20px; } + .widget-panel i { + font-size: 60px; + padding: 30px; + position: absolute; + right: 0; + bottom: 0; + top: 0; + line-height: 60px; } + +.widget-style-2 i { + font-size: 48px; + padding: 30px 40px; } + +/* Google maps widget*/ +.gmap iframe { + width: 100%; + margin: 0 !important; + padding: 0 !important; } + +.gmap-info:before { + color: #333333; + content: "\f041"; + font-family: "FontAwesome"; + font-size: 35px; + left: 10px; + position: absolute; + top: 8px; } + +.gmap-info { + float: left; + padding: 0 20px 0 50px; + position: relative; } + +.gmap-buttons { + float: right; + margin-top: 28px; } + +.gmap-buttons .btn { + margin-left: 3px; } + +/* Google maps ends */ +/* Table with Action */ +.table-actions-bar tr td { + vertical-align: middle !important; } +.table-actions-bar .table-action-btn { + color: #98a6ad; + display: inline-block; + width: 28px; + border-radius: 50%; + text-align: center; + line-height: 24px; + font-size: 20px; } + .table-actions-bar .table-action-btn:hover { + color: #33b5e5; + border-color: #33b5e5; } + +/* Transaction */ +.transaction-list li { + padding: 7px 0; + border-bottom: 1px solid #3c4853; + clear: both; + position: relative; } +.transaction-list i { + width: 20px; + position: absolute; + top: 10px; + font-size: 12px; } +.transaction-list .tran-text { + padding-left: 25px; + white-space: nowrap; + display: inline-block; + overflow: hidden; + text-overflow: ellipsis; + width: 115px; } +.transaction-list .tran-price { + margin-left: 30px; } + +/* Friend list */ +.friend-list a { + margin: 5px; + display: inline-block; } +.friend-list .extra-number { + height: 48px; + width: 48px; + display: block; + line-height: 48px; + color: #98a6ad; + font-weight: 700; + background-color: #45525f; + border-radius: 50%; + border: 1px solid #505f6d; } + +/* Profile widget */ +.profile-widget .bg-profile { + height: 125px; } +.profile-widget .img-thumbnail { + margin-top: -42px; + border: none; } +.profile-widget .widget-list { + padding: 10px; + margin-top: 20px; + margin-left: 0; + padding-bottom: 30px; } + .profile-widget .widget-list span { + display: block; + font-weight: bold; + font-size: 18px; } + +/* Bar widget */ +.bar-widget .iconbox { + display: inline-block; + height: 50px; + width: 50px; + margin-right: 20px; + border-radius: 50%; + color: #ffffff; + text-align: center; } + .bar-widget .iconbox i { + line-height: 50px; + font-size: 20px; } + +/* Social type widgets */ +.widget-profile-one .card-box { + border-radius: 0; } + .widget-profile-one .card-box:first-of-type { + border-top-left-radius: 4px !important; + border-top-right-radius: 4px !important; } + .widget-profile-one .card-box:last-of-type { + border-bottom-left-radius: 4px !important; + border-bottom-right-radius: 4px !important; } + +.social-feed-box h3 { + font-size: 18px; + font-style: italic; } + +.widget-box-two { + border-bottom-left-radius: 3px !important; + border-bottom-right-radius: 3px !important; } + +.social-feed-slider { + padding-bottom: 50px; } + .social-feed-slider .carousel-indicators { + bottom: 0; } + +.pro-widget-img { + border-top-left-radius: 4px !important; + border-top-right-radius: 4px !important; + padding: 70px 0; + background-size: cover; + background: url("../images/big/bg.jpg") center right no-repeat; } + +/* Blog styles */ +.blog-box-one { + margin-bottom: 20px; } + +.blog-box-one .cover-wrapper { + overflow: hidden; + width: 100%; + position: relative; + z-index: 1; + border-top-left-radius: 4px !important; + border-top-right-radius: 4px !important; } + +.blog-box-one .cover-wrapper img { + transition: all .3s ease; + -webkit-transition: all .3s ease; + -moz-transition: all .3s ease; + border-top-left-radius: 4px !important; + border-top-right-radius: 4px !important; } + +.blog-box-one .cover-wrapper:hover img { + -ms-transform: scale(1.1, 1.1); + -webkit-transform: scale(1.1, 1.1); + transform: scale(1.1, 1.1); } + +.blog-box-one .post-info { + background-color: #36404a; + padding: 20px; + border-bottom-left-radius: 4px !important; + border-bottom-right-radius: 4px !important; } + +.blog-box-one .post-info .date { + float: left; + border-bottom: 3px solid #71b6f9; } + +.post-info .date .day { + font-size: 22px; + color: #ffffff; + font-weight: 600; + line-height: 22px; } + +.post-info .date .month { + text-transform: uppercase; + text-align: center; + width: 100%; + display: inline-block; } + +.blog-box-one .meta { + padding-left: 0; } + +.blog-box-one .post-info .meta-container { + padding-left: 55px; } + +.blog-box-one .post-info p { + margin-top: 15px; } + +.blog-widget-action a { + color: #98a6ad; + display: inline-block; + margin-right: 10px; } + +/* ============= + Form Advanced +============= */ +.error { + color: #f05050; + font-size: 12px; + font-weight: 500; } + +/* Form validation */ +.parsley-error { + border-color: #f05050 !important; } + +.parsley-errors-list { + display: none; + margin: 0; + padding: 0; } + +.parsley-errors-list.filled { + display: block; } + +.parsley-errors-list > li { + font-size: 12px; + list-style: none; + color: #f05050; } + +/* Datepicker */ +.datepicker { + padding: 8px; } + .datepicker th { + font-size: 14px !important; } + +.datepicker > div { + display: inherit; } + +.daterangepicker .input-mini { + color: #ffffff; + border: 1px solid #566676; } + +.datepicker table tr td.today, .datepicker table tr td.today:hover, +.datepicker table tr td.today.disabled, .datepicker table tr td.today.disabled:hover, +.datepicker table tr td.selected, .datepicker table tr td.selected:hover, +.datepicker table tr td.selected.disabled, .datepicker table tr td.selected.disabled:hover, +.datepicker table tr td span.active, .datepicker table tr td span.active:hover, +.datepicker table tr td span.active.disabled, .datepicker table tr td span.active.disabled:hover { + background-image: none; + background-color: #33b5e5; + color: #ffffff; } + +.datepicker table tr td span.active:hover, .datepicker table tr td span.active:hover:hover, +.datepicker table tr td span.active.disabled:hover, .datepicker table tr td span.active.disabled:hover:hover, +.datepicker table tr td span.active:active, .datepicker table tr td span.active:hover:active, +.datepicker table tr td span.active.disabled:active, .datepicker table tr td span.active.disabled:hover:active, +.datepicker table tr td span.active.active, .datepicker table tr td span.active:hover.active, +.datepicker table tr td span.active.disabled.active, .datepicker table tr td span.active.disabled:hover.active, +.datepicker table tr td span.active.disabled, .datepicker table tr td span.active:hover.disabled, +.datepicker table tr td span.active.disabled.disabled, .datepicker table tr td span.active.disabled:hover.disabled, +.datepicker table tr td span.active[disabled], .datepicker table tr td span.active:hover[disabled], +.datepicker table tr td span.active.disabled[disabled], .datepicker table tr td span.active.disabled:hover[disabled] { + background-color: #33b5e5; } + +.datepicker table tr td.active, .datepicker table tr td.active:hover, .datepicker table tr td.active.disabled, +.datepicker table tr td.active.disabled:hover { + background-color: #5fbeaa !important; + background-image: none; + box-shadow: none; + text-shadow: none; } + +.datepicker thead tr:first-child th:hover, .datepicker tfoot tr th:hover { + background-color: #fafafa; } + +.datepicker-inline { + border: 2px solid #414d59; } + +.daterangepicker td.active, .daterangepicker td.active:hover { + background-color: #5d9cec; + border-color: #5d9cec; } + +.daterangepicker .input-mini.active { + border: 1px solid #5d6e7f; } + +.daterangepicker .ranges li { + border-radius: 2px; + color: #98a6ad; + font-weight: 600; + font-size: 12px; + background-color: #4c5a67; + border-color: #4c5a67; } + +.daterangepicker select.hourselect, .daterangepicker select.minuteselect, +.daterangepicker select.secondselect, .daterangepicker select.ampmselect { + border: 1px solid #4c5a67; + padding: 2px; + width: 60px; } + +.daterangepicker .ranges li.active, .daterangepicker .ranges li:hover { + background-color: #5d9cec; + border: 1px solid #5d9cec; + color: #ffffff; } + +.daterangepicker td.available:hover, .daterangepicker th.available:hover, +.datepicker table tr td.day.focused, .datepicker table tr td.day:hover, +.datepicker .datepicker-switch:hover, .datepicker .next:hover, .datepicker .prev:hover, .datepicker tfoot tr th:hover { + background-color: #4c5a67; } + +.daterangepicker td.off, .daterangepicker td.off.in-range, .daterangepicker td.off.start-date, .daterangepicker td.off.end-date { + background-color: transparent; } + +.daterangepicker .calendar-table { + border: none; + background-color: transparent; } + +.search-input { + margin-bottom: 10px; } + +.ms-selectable { + box-shadow: none; + outline: none !important; } + +.ms-container .ms-list.ms-focus { + box-shadow: none; } +.ms-container .ms-selectable li.ms-hover { + background-color: #5d9cec; } +.ms-container .ms-selection li.ms-hover { + background-color: #5d9cec; } + +/* ============== + Summernote +===================*/ +.note-btn-group .dropdown-menu > li > a { + display: block; + padding: 5px 20px; + clear: both; + font-weight: normal; + line-height: 1.42857143; + color: #ffffff; + white-space: nowrap; } + .note-btn-group .dropdown-menu > li > a:hover { + background-color: #3a4550; } + +.note-image-popover, .note-air-popover, .note-link-popover { + display: none; } + .note-image-popover .dropdown-toggle::after, .note-air-popover .dropdown-toggle::after, .note-link-popover .dropdown-toggle::after { + margin-left: 0; } + +.note-icon-caret { + display: none; } + +.note-editor { + position: relative; } + .note-editor .btn-default { + background-color: transparent; + border-color: transparent; + color: #ffffff; } + .note-editor .btn-group-sm > .btn, .note-editor .btn-sm { + padding: 8px 12px; } + .note-editor .note-toolbar { + background-color: #45525f; + border-bottom: 1px solid #45525f; + margin: 0; } + .note-editor .note-statusbar { + background-color: #45525f !important; } + .note-editor .note-statusbar .note-resizebar { + border-top: none; } + +.note-editor.note-frame { + border: 1px solid #45525f; } + +.note-popover .popover .popover-content { + padding: 5px 0 10px 5px; } +.note-popover .btn-default { + background-color: transparent; + border-color: transparent; } +.note-popover .btn-group-sm > .btn, .note-popover .btn-sm { + padding: 8px 12px; } + +.note-toolbar { + padding: 5px 0 10px 5px; } + +.note-editor.note-frame .note-editing-area .note-editable { + padding: 10px; + overflow: auto; + color: #98a6ad; + background-color: #414d59; } + +.code-edit-wrap { + padding: 0 !important; } + +.cm-s-ambiance .CodeMirror-linenumber { + color: #bcbcbc; } +.cm-s-ambiance .CodeMirror-gutters { + background-color: #4c5667 !important; + box-shadow: none; } + +.cm-s-ambiance.CodeMirror { + background-color: #4c5667 !important; + box-shadow: none; } + +/* Timepicker */ +.bootstrap-timepicker-widget table td a:hover { + background-color: transparent; + border-color: transparent; + border-radius: 4px; + color: #5d9cec; + text-decoration: none; } + +.editor-horizontal .popover-content { + padding: 9px 30px; } + +/* Bootstrap select */ +.bootstrap-select.show > .dropdown-menu > .dropdown-menu { + display: block; } + +.bootstrap-select > .dropdown-menu > .dropdown-menu li.hidden { + display: none; } + +.bootstrap-select > .dropdown-menu > .dropdown-menu li a { + display: block; + width: 100%; + padding: 3px 1.5rem; + clear: both; + font-weight: 400; + color: #98a6ad; + text-align: inherit; + white-space: nowrap; + background: 0 0; + border: 0; } + .bootstrap-select > .dropdown-menu > .dropdown-menu li a:hover { + color: #ffffff; } + +.bootstrap-select .check-mark::after { + content: "\f299"; + font-family: "Material Design Iconic Font"; } + +.bootstrap-select button { + overflow: hidden; + text-overflow: ellipsis; } + +.bootstrap-select.btn-group.show-tick .dropdown-menu li.selected a span.check-mark { + margin-top: 0; } + +.bootstrap-filestyle .form-control { + max-height: 39px; } + +/* =========== + Form Uploads + =============*/ +.dropzone { + min-height: 230px; + border: 2px dashed #4c5a67; + border-radius: 6px; + background-color: #3a4550; } + .dropzone .dz-message { + font-size: 30px; } + +/* X-Editable */ +.editable-click, a.editable-click, a.editable-click:hover { + border: none; } + +/* AUTOCOMPLETE */ +.autocomplete-suggestions { + border: 1px solid #4c5a67; + background-color: #414d59; + cursor: default; + overflow: auto; + -webkit-box-shadow: 0 2px 2px rgba(0, 0, 0, 0.15); + -moz-box-shadow: 0 2px 2px rgba(0, 0, 0, 0.15); + box-shadow: 0 2px 2px rgba(0, 0, 0, 0.15); } + +.autocomplete-suggestion { + padding: 2px 5px; + white-space: nowrap; + overflow: hidden; } + +.autocomplete-no-suggestion { + padding: 2px 5px; } + +.autocomplete-selected { + background: rgba(152, 166, 173, 0.15); + cursor: pointer; } + +.autocomplete-group { + padding: 2px 5px; } + +.autocomplete-group strong { + font-weight: bold; + font-size: 16px; + color: #ffffff; + display: block; } + +/* Image crop */ +.img-container, +.img-preview { + background-color: #f7f7f7; + overflow: hidden; + width: 100%; + text-align: center; } + +.img-container { + min-height: 200px; + max-height: 466px; + margin-bottom: 20px; } + +@media (min-width: 768px) { + .img-container { + min-height: 466px; } } +.img-container > img { + max-width: 100%; } + +.docs-preview { + margin-right: -15px; + margin-bottom: 10px; } + +.img-preview { + float: left; + margin-right: 10px; + margin-bottom: 10px; } + +.img-preview > img { + max-width: 100%; } + +#showDataURL img { + width: 100%; } + +/* bootstrap tag input */ +.bootstrap-tagsinput { + box-shadow: none; + padding: 3px 7px; + border: 1px solid #4c5a67; + background-color: #414d59; + color: #ffffff; + width: 100%; } + .bootstrap-tagsinput .label-info { + background-color: #5fbeaa !important; + display: inline-block; + padding: 6px 10px; + border-radius: 3px; + font-size: 14px; + margin: 2px; + font-weight: normal; } + .bootstrap-tagsinput input { + color: #ffffff; } + +/* Multiple select*/ +.ms-container { + background: transparent url("../images/multiple-arrow.png") no-repeat 50% 50%; } + .ms-container .ms-selectable, .ms-container .ms-selection { + background-color: #3c4853; } + .ms-container .ms-list { + box-shadow: none; + border: 1px solid #4c5a67; } + .ms-container .ms-list.ms-focus { + box-shadow: none; + border: 1px solid #505f6d; } + .ms-container .ms-selectable li.ms-elem-selectable { + border: none; + padding: 5px 10px; + color: #98a6ad; } + .ms-container .ms-selection li.ms-elem-selection { + border: none; + padding: 5px 10px; + color: #98a6ad; } + +.search-input { + margin-bottom: 10px; } + +.ms-selectable { + box-shadow: none; + outline: none !important; } + +.ms-container .ms-list.ms-focus { + box-shadow: none; } +.ms-container .ms-selectable li.ms-hover { + background-color: #33b5e5; + color: #ffffff; } +.ms-container .ms-selection li.ms-hover { + background-color: #33b5e5; + color: #ffffff; } + +/* Select 2 */ +.select2-container { + width: 100% !important; } + .select2-container .select2-selection--single { + border: 1px solid #4c5a67 !important; + height: 38px !important; + background-color: #414d59; } + .select2-container .select2-selection--single .select2-selection__rendered { + line-height: 36px !important; + padding-left: 12px !important; + color: #98a6ad; } + .select2-container .select2-selection--single .select2-selection__arrow { + height: 34px; + width: 34px; + right: 3px; } + .select2-container .select2-selection--single .select2-selection__arrow b { + border-color: #999 transparent transparent transparent; + border-width: 6px 6px 0 6px; } + +.select2-container--open .select2-selection--single .select2-selection__arrow b { + border-color: transparent transparent #999 transparent !important; + border-width: 0 6px 6px 6px !important; } + +.select2-container--default .select2-results__option--highlighted[aria-selected] { + background-color: #33b5e5; } + +.select2-results__option { + padding: 6px 12px; } + +.select2-dropdown { + border: 1px solid #4c5a67 !important; + background-color: #414d59; + padding-top: 5px; + box-shadow: 0 2px 2px rgba(0, 0, 0, 0.15); } + +.select2-search input { + border: 1px solid #4c5a67 !important; + background-color: #414d59; + color: #ffffff; } + +.select2-container--default .select2-results__option[aria-selected=true] { + background-color: #475462; } + +.select2-container .select2-selection--multiple { + border: 1px solid #4c5a67 !important; + height: 38px !important; + background-color: #414d59; } + .select2-container .select2-selection--multiple .select2-selection__rendered { + padding: 2px 10px; } + .select2-container .select2-selection--multiple .select2-search__field { + margin-top: 7px; + border: 0 !important; } + .select2-container .select2-selection--multiple .select2-selection__choice { + background-color: #33b5e5; + border: 1px solid #33b5e5; + border-radius: 1px; + padding: 0 7px; } + +.select2-container--default .select2-selection--multiple .select2-selection__choice__remove { + color: #ffffff; } + +/* Bootstrap-select */ +.bootstrap-select:not([class*=col-]):not([class*=form-control]):not(.input-group-btn) { + width: 100% !important; } + +.bootstrap-select .dropdown-toggle:focus { + outline: none !important; } +.bootstrap-select .glyphicon { + padding-right: 6px; } + +/* Bootstrap filestyle */ +.icon-span-filestyle { + padding-right: 5px; } + +/* Bootstrap-touchSpin */ +.bootstrap-touchspin .input-group-btn-vertical .btn { + padding: 9px 12px; } +.bootstrap-touchspin .input-group-btn-vertical i { + top: 4px; + left: 8px; } + +/* == Bootstrap Switch == */ +.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-primary, +.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-primary { + background: #5d9cec; } + +.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-info, +.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-info { + background: #34d3eb; } + +.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-success, +.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-success { + background: #81c868; } + +.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-warning, +.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-warning { + background: #ffbd4a; } + +.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-danger, +.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-danger { + background: #f05050; } + +.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-default, +.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-default { + background: #eeeeee; } + +.bootstrap-switch.bootstrap-switch-focused { + border-color: #98a6ad; + box-shadow: none; } + +/* == X editable == */ +.editable-checklist label { + display: block !important; } + +.bootstrap-timepicker-widget.dropdown-menu:after, .colorpicker:after, .daterangepicker:after { + border-bottom: 6px solid #434f5c; } + +.bootstrap-timepicker-widget.timepicker-orient-bottom:before { + border-top: 7px solid #434f5c; } + +.bootstrap-timepicker-widget.timepicker-orient-bottom:after, .datepicker-dropdown.datepicker-orient-top:after { + border-top: 6px solid #434f5c; } + +.daterangepicker:before { + border-bottom: 7px solid #4c5a67; } + +/* =========== + Wizard + =============*/ +.wizard > .content { + background: #36404a; + min-height: 240px; + padding: 20px; } + +.wizard > .content > .body { + padding: 0; + position: relative; } + .wizard > .content > .body input { + border: 1px solid #505f6d; } + .wizard > .content > .body ul > li { + display: block; + line-height: 30px; } + .wizard > .content > .body label.error { + color: #f05050; + margin-left: 0; } + .wizard > .content > .body label { + display: inline-block; + margin-top: 10px; } + +.wizard > .steps .number { + border-radius: 50%; + background-color: rgba(255, 255, 255, 0.3); + display: inline-block; + line-height: 30px; + margin-right: 10px; + width: 30px; + text-align: center; } +.wizard > .steps .disabled a { + background: #4c5a67; + color: #ffffff; + cursor: default; + border: 1px solid #4c5a67; } + .wizard > .steps .disabled a:hover, .wizard > .steps .disabled a:active { + background: #505f6d; + cursor: default; + color: #ffffff; + border: 1px solid #4c5a67; } +.wizard > .steps .current a { + background: #33b5e5; } + .wizard > .steps .current a:hover { + background: #33b5e5; } + .wizard > .steps .current a:hover .number { + color: #ffffff; } + .wizard > .steps .current a:active { + background: #33b5e5; } + .wizard > .steps .current a:active .number { + color: #ffffff; } + .wizard > .steps .current a .number { + color: #ffffff; } +.wizard > .steps .done a { + background: #505f6d; } + .wizard > .steps .done a:hover { + background: #505f6d; } + .wizard > .steps .done a:active { + background: #505f6d; } + +.wizard > .steps a, .wizard > .steps a:hover, .wizard > .steps a:active, .wizard > .content { + border-radius: 2px; } + +.wizard > .actions a { + background: #33b5e5; + border-radius: 2px; + color: #ffffff; } + .wizard > .actions a:hover { + background: #33b5e5; + border-radius: 2px; + color: #ffffff; } + .wizard > .actions a:active { + background: #33b5e5; + border-radius: 2px; + color: #ffffff; } +.wizard > .actions .disabled a { + background: #505f6d; + color: #ffffff; + cursor: default; + border: 1px solid #505f6d; } + .wizard > .actions .disabled a:hover, .wizard > .actions .disabled a:active { + background: #505f6d; + color: #ffffff; + cursor: default; + border: 1px solid #505f6d; } + +@media (max-width: 767px) { + .wizard > .steps > ul > li { + width: 100%; } + + .wizard > .content { + padding: 0 !important; } + + .wizard > .content > .body { + float: none; + position: relative; + width: 100%; + height: 100%; + padding: 0; } + + .wizard.vertical > .steps { + display: inline; + float: none; + width: 100%; } + + .wizard.vertical > .content { + display: inline; + float: none; + margin: 0; + width: 100%; } } +/* =========== + Calendar + =============*/ +.calendar { + float: left; + margin-bottom: 0; } + +.none-border .modal-footer { + border-top: none; } + +.fc-toolbar { + margin-bottom: 5px; } + .fc-toolbar h2 { + font-size: 18px; + font-weight: 600; + line-height: 30px; + text-transform: uppercase; } + +.fc-day { + background: #414d59; } + +.fc-unthemed .fc-today { + background: #475462 !important; } + +.fc-unthemed .fc-content, .fc-unthemed .fc-divider, .fc-unthemed .fc-popover, .fc-unthemed .fc-row, .fc-unthemed tbody, .fc-unthemed td, .fc-unthemed th, .fc-unthemed thead { + border-color: #4c5a67; } + +.fc-unthemed .fc-divider, .fc-unthemed .fc-popover .fc-header { + background: #4c5a67; } + +.fc-toolbar .fc-state-active, .fc-toolbar .ui-state-active, +.fc-toolbar button:focus, .fc-toolbar button:hover, +.fc-toolbar .ui-state-hover { + z-index: 0; } + +.fc-widget-header { + border: 1px solid #d5d5d5; } + +.fc-widget-content { + border: 1px solid #d5d5d5; } + +.fc th.fc-widget-header { + background: #4c5a67; + font-size: 14px; + line-height: 20px; + padding: 10px 0; + text-transform: uppercase; } + +.fc-button { + background: #4c5a67; + border: 1px solid #4c5a67; + color: #ffffff; + text-transform: capitalize; } + +.fc-text-arrow { + font-family: arial; + font-size: 16px; } + +.fc-state-hover { + background: #4c5a67; } + +.fc-state-highlight { + background: #f0f0f0; } + +.fc-cell-overlay { + background: #f0f0f0; } + +.fc-unthemed .fc-today { + background: #ffffff; } + +.fc-event { + border-radius: 2px; + border: none; + cursor: move; + font-size: 13px; + margin: 5px 7px; + padding: 5px 5px; + text-align: center; } + .fc-event .fc-content { + color: #ffffff; } + +.external-event { + color: #ffffff; + cursor: move; + margin: 10px 0; + padding: 6px 10px; } + +.fc-basic-view td.fc-week-number span { + padding-right: 5px; } +.fc-basic-view td.fc-day-number { + padding-right: 5px; } + +/* Wysiwig */ +.mce-content-body p { + color: #9398a0; + font-size: 14px; + font-weight: 300; } + +.mce-popover .mce-arrow:after { + border-bottom-color: red; } + +.mce-popover .mce-colorbutton-grid { + margin: 0; + border: 1px solid #d7dce5 !important; + padding: 4px; } + +.mce-reset .mce-window-head { + border-bottom: 1px solid #d7dce5; } + +.mce-reset .mce-window-head .mce-title { + color: #707780; + font-size: 16px; + font-weight: 400; } + +.mce-reset .mce-textbox { + border-radius: 0; + box-shadow: none; + outline: 0; + border-color: #d7dce5; + height: 30px; + font-weight: 300; + line-height: 30px; + color: #aaaaaa; + font-size: 14px; } + +.mce-reset .mce-textbox:focus { + box-shadow: none; + border-color: #33b5e5; } + +.mce-reset .mce-checkbox .mce-ico { + background-image: none; + background-color: #ffffff; + border-radius: 0; + border: 1px solid #d7dce5; } + +.mce-reset .mce-checkbox .mce-label { + color: #707780; + font-size: 12px; + font-weight: 400; } + +.mce-container { + border-radius: 0 !important; + border-width: 0 !important; } + +.mce-container .mce-menubar { + background-color: #f2f4f7 !important; + border: 1px solid #d7dce5 !important; + padding: 2px; } + +.mce-container .mce-menubar .mce-btn button span { + color: #707780; + font-size: 14px; + font-weight: 400; + text-transform: capitalize; } + +.mce-container .mce-menubar .mce-btn button .mce-caret { + border-top-color: #707780; } + +.mce-container .mce-menubar .mce-btn button:hover { + background-color: #e8ebf1; } + +.mce-container .mce-menubar .mce-btn.mce-active button { + background-color: #e8ebf1; } + +.mce-container .mce-btn { + background-color: #d7dce5; + background-image: none; + outline: 0; + border: 0; + border-radius: 0; } + +.mce-container .mce-btn button { + color: #ffffff; + font-size: 14px; + font-weight: 400; + text-shadow: none; } + +.mce-container .mce-btn:hover { + background-color: #b8c1d1; + background-image: none; } + +.mce-container .mce-primary { + background-color: #33b5e5; + background-image: none; + outline: 0; + border: 0; + border-radius: 0; } + +.mce-container .mce-primary button { + color: #ffffff; + font-size: 14px; + font-weight: 400; + text-shadow: none; } + +.mce-container .mce-primary:hover { + background-color: #0c7cd5; + background-image: none; } + +.mce-container .mce-toolbar-grp { + background-color: #f2f4f7 !important; + border: 1px solid #d7dce5 !important; + border-top-width: 0 !important; + padding: 6px; } + +.mce-container .mce-edit-area { + border: 1px solid #d7dce5 !important; + border-width: 0px 1px !important; } + +.mce-container .mce-statusbar { + background-color: #f2f4f7 !important; + border: 1px solid #d7dce5 !important; } + +.mce-container .mce-statusbar .mce-path .mce-path-item { + color: #707780; + font-size: 14px; + font-weight: 400; } + +.mce-container .mce-widget { + color: #9398a0; + font-size: 14px; + font-weight: 400; + border-left: 1px solid transparent; } + +.mce-container .mce-btn-group { + border: 1px solid #e9ecf2 !important; } + +.mce-container .mce-btn-group .mce-btn { + box-shadow: none; + background-image: none; + background-color: #ffffff; + border-width: 0; + border-radius: 0 !important; } + +.mce-container .mce-btn-group .mce-btn:hover, +.mce-container .mce-btn-group .mce-btn:focus { + box-shadow: none; + background-image: none; + background-color: #ffffff; } + +.mce-container .mce-btn-group .mce-btn button span { + color: #707780; + font-size: 14px; + font-weight: 300; } + +.mce-container .mce-btn-group .mce-btn button .mce-caret { + color: #707780; + font-size: 14px; } + +.mce-container .mce-ico { + color: #707780; + font-size: 14px; } + +.mce-container .mce-panel { + background-image: none; } + +.mce-container.mce-menu { + border: 1px solid #d7dce5 !important; } + +.mce-container.mce-menu .mce-menu-item { + background-image: none; } + +.mce-container.mce-menu .mce-menu-item .mce-ico { + color: #33b5e5; + font-size: 14px; } + +.mce-container.mce-menu .mce-menu-item .mce-text { + color: #707780; + font-size: 14px; + font-weight: 400; + text-transform: capitalize; } + +.mce-container.mce-menu .mce-menu-item .mce-menu-shortcut { + color: #aaaaaa; + font-size: 12px; + font-weight: 300; + text-transform: capitalize; } + +.mce-container.mce-menu .mce-menu-item:hover, +.mce-container.mce-menu .mce-menu-item:focus, +.mce-container.mce-menu .mce-menu-item.mce-selected { + background-color: #33b5e5; } + +.mce-container.mce-menu .mce-menu-item:hover .mce-ico, +.mce-container.mce-menu .mce-menu-item:focus .mce-ico, +.mce-container.mce-menu .mce-menu-item.mce-selected .mce-ico, +.mce-container.mce-menu .mce-menu-item:hover .mce-text, +.mce-container.mce-menu .mce-menu-item:focus .mce-text, +.mce-container.mce-menu .mce-menu-item.mce-selected .mce-text, +.mce-container.mce-menu .mce-menu-item:hover .mce-menu-shortcut, +.mce-container.mce-menu .mce-menu-item:focus .mce-menu-shortcut, +.mce-container.mce-menu .mce-menu-item.mce-selected .mce-menu-shortcut { + color: #ffffff; } + +.mce-container.mce-menu .mce-menu-item.mce-disabled .mce-ico, +.mce-container.mce-menu .mce-menu-item.mce-disabled .mce-text, +.mce-container.mce-menu .mce-menu-item.mce-disabled .mce-menu-shortcut { + color: #aaaaaa; } + +.mce-container.mce-menu .mce-menu-item.mce-disabled:hover, +.mce-container.mce-menu .mce-menu-item.mce-disabled:focus, +.mce-container.mce-menu .mce-menu-item.mce-disabled.mce-selected { + background-color: #d7dce5; } + +.mce-container.mce-menu .mce-menu-item.mce-disabled:hover .mce-ico, +.mce-container.mce-menu .mce-menu-item.mce-disabled:focus .mce-ico, +.mce-container.mce-menu .mce-menu-item.mce-disabled.mce-selected .mce-ico, +.mce-container.mce-menu .mce-menu-item.mce-disabled:hover .mce-text, +.mce-container.mce-menu .mce-menu-item.mce-disabled:focus .mce-text, +.mce-container.mce-menu .mce-menu-item.mce-disabled.mce-selected .mce-text, +.mce-container.mce-menu .mce-menu-item.mce-disabled:hover .mce-menu-shortcut, +.mce-container.mce-menu .mce-menu-item.mce-disabled:focus .mce-menu-shortcut, +.mce-container.mce-menu .mce-menu-item.mce-disabled.mce-selected .mce-menu-shortcut { + color: #ffffff; } + +.mce-container.mce-menu .mce-menu-item-sep { + background-color: #d7dce5; } + +.mce-container.mce-menu .mce-menu-item-sep:hover { + background-color: #d7dce5; } + +.mce-menubtn button { + color: #36404a !important; } + +.mce-menu-item-normal.mce-active { + background-color: #5fbeaa !important; } + .mce-menu-item-normal.mce-active .mce-text { + color: #ffffff !important; } + +/* ============= + Notification +============= */ +.notifyjs-metro-base { + position: relative; + min-height: 52px; + min-width: 250px; + color: #444; + border-radius: 3px; + -webkit-border-radius: 3px; + box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2); + -webkit-animation: dropdownOpen 0.3s ease-out; + -o-animation: dropdownOpen 0.3s ease-out; + animation: dropdownOpen 0.3s ease-out; } + +.notifyjs-metro-base .image { + display: table; + position: absolute; + height: auto; + width: auto; + left: 25px; + top: 50%; + font-size: 24px; + -moz-transform: translate(-50%, -50%); + -ms-transform: translate(-50%, -50%); + -o-transform: translate(-50%, -50%); + -webkit-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); } + +.notifyjs-metro-base .text-wrapper { + display: inline-block; + vertical-align: top; + text-align: left; + margin: 10px 10px 10px 52px; + clear: both; } + +.notifyjs-metro-base .title { + font-size: 15px; + line-height: 20px; + margin-bottom: 5px; + font-weight: bold; } + +.notifyjs-metro-base .text { + font-size: 12px; + font-weight: normal; + max-width: 360px; + vertical-align: middle; } + +.notifyjs-metro-cool { + color: #fafafa !important; + background-color: #4A525F; + border: 1px solid #4A525F; } + +/* ============= + Bootstrap Range slider +============= */ +.slider .slider-horizontal { + margin: 10px 0; } +.slider .slider-vertical { + margin: 0 10px; } + +.slider-handle.round { + position: absolute; + width: 20px; + height: 20px; + border: 1px solid #EFF2F7; + background: #fff; + cursor: pointer; } + +.slider-default .slider-selection { + background-image: none; + background-color: #909aa0; } + +.slider-primary .slider-selection { + background-image: none; + background-color: #5d9cec; } + +.slider-success .slider-selection { + background-image: none; + background-color: #81c868; } + +.slider-info .slider-selection { + background-image: none; + background-color: #34d3eb; } + +.slider-warning .slider-selection { + background-image: none; + background-color: #ffbd4a; } + +.slider-danger .slider-selection { + background-image: none; + background-color: #f05050; } + +.slider-custom .slider-selection { + background-image: none; + background-color: #33b5e5; } + +.slider-pink .slider-selection { + background-image: none; + background-color: #fb6d9d; } + +.slider-purple .slider-selection { + background-image: none; + background-color: #7266ba; } + +.slider-inverse .slider-selection { + background-image: none; + background-color: #4c5667; } + +/* =========== */ +/* Sweet Alert */ +/* =========== */ +.sweet-alert { + background-color: #4c5a67; } + .sweet-alert p { + font-size: 14px; + line-height: 22px; } + .sweet-alert .icon.success .placeholder { + border: 4px solid rgba(129, 200, 104, 0.3); } + .sweet-alert .icon.success .line { + background-color: #81c868; } + .sweet-alert .icon.warning { + border-color: #ffbd4a; } + .sweet-alert .icon.info { + border-color: #34d3eb; } + .sweet-alert .btn-warning:focus, .sweet-alert .btn-info:focus, .sweet-alert .btn-success:focus, .sweet-alert .btn-danger:focus, .sweet-alert .btn-default:focus { + box-shadow: none; } + .sweet-alert .btn-lg { + font-size: 15px !important; } + +.sweet-alert .icon.success::before, .sweet-alert .icon.success::after, .sweet-alert .icon.success .fix { + background-color: #4c5a67; } + +/* =========== */ +/* Sweet Alert 2*/ +/* =========== */ +.swal2-modal .swal2-title { + font-size: 28px; } +.swal2-modal .swal2-content { + font-size: 16px; } +.swal2-modal .swal2-spacer { + margin: 10px 0; } +.swal2-modal .swal2-file, .swal2-modal .swal2-input, .swal2-modal .swal2-textarea { + border: 2px solid #98a6ad; + font-size: 16px; + box-shadow: none !important; } + +.swal2-icon.swal2-question { + color: #33b5e5; + border-color: #33b5e5; } + +.swal2-icon.swal2-success { + border-color: #81c868; } + .swal2-icon.swal2-success .line { + background-color: #81c868; } + .swal2-icon.swal2-success .placeholder { + border-color: #81c868; } + +.swal2-icon.swal2-warning { + color: #ffbd4a; + border-color: #ffbd4a; } + +.swal2-icon.swal2-error { + border-color: #f05050; } + .swal2-icon.swal2-error .line { + background-color: #f05050; } + +.swal2-modal .swal2-file:focus, .swal2-modal .swal2-input:focus, .swal2-modal .swal2-textarea:focus { + outline: 0; + border: 2px solid #33b5e5; } + +/* ============= + Charts +============= */ +/* Morris chart */ +.morris-hover.morris-default-style { + border-radius: 5px; + padding: 10px 12px; + background: #ffffff; + border: none; + color: #36404a !important; } + .morris-hover.morris-default-style .morris-hover-point { + color: #36404a !important; } + +.chart-detail-list li { + margin: 0 10px; } + .chart-detail-list li h5 { + font-size: 15px; } + +.pieLabel div { + font-size: 14px !important; } + +.jqstooltip { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; } + +.chart { + position: relative; + display: inline-block; + width: 110px; + height: 110px; + margin-top: 20px; + margin-bottom: 20px; + text-align: center; } + .chart canvas { + position: absolute; + top: 0; + left: 0; } + +.chart.chart-widget-pie { + margin-top: 5px; + margin-bottom: 5px; } + +.percent { + display: inline-block; + line-height: 110px; + z-index: 2; + font-weight: 600; + font-size: 18px; + color: #ffffff; } + .percent:after { + content: '%'; + margin-left: 0.1em; + font-size: .8em; } + +#flotTip { + padding: 8px 12px; + background-color: #ffffff; + z-index: 100; + color: #36404a; + opacity: 0.9; + font-size: 13px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; } + +.legend tr { + height: 20px; } + +.legend div:first-of-type { + background-color: transparent !important; } + +.legendLabel { + padding-left: 5px !important; + line-height: 10px; + padding-right: 10px; + color: #98a6ad; } + +/* Sparkline chart */ +.jqstooltip { + background-color: #ffffff !important; + padding: 5px 10px !important; + border-radius: 3px; } + +.jqsfield { + font-size: 12px !important; + line-height: 18px !important; + color: #36404a !important; } + +/* C3 chart */ +.c3-tooltip td > span { + background: #36404a; } + +.c3-tooltip td { + border-left: none; } + +.c3-tooltip { + box-shadow: 0 0 8px 0 #777; + opacity: 1; } + +.c3-chart-arcs-title { + font-size: 18px; + font-weight: 600; } + +.c3-tooltip tr { + border: none !important; } + +.c3-tooltip th { + background-color: #36404a; } + +.c3 text { + fill: rgba(255, 255, 255, 0.5); + font-size: 14px; } + +.c3 line, +.c3 path { + stroke: rgba(255, 255, 255, 0.5); } + +/* Chartist chart */ +.ct-golden-section:before { + float: none; } + +.ct-grid { + stroke: rgba(255, 255, 255, 0.2); } + +.ct-chart { + height: 300px; } + .ct-chart .ct-label { + fill: #a3afb7; + color: #a3afb7; + font-size: 12px; + line-height: 1; } + +.ct-chart.simple-pie-chart-chartist .ct-label { + color: #ffffff; + fill: #ffffff; + font-size: 16px; } + +.ct-chart .ct-series.ct-series-a .ct-bar, .ct-chart .ct-series.ct-series-a .ct-line, .ct-chart .ct-series.ct-series-a .ct-point, .ct-chart .ct-series.ct-series-a .ct-slice-donut { + stroke: #5d9cec; } + +.ct-chart .ct-series.ct-series-b .ct-bar, .ct-chart .ct-series.ct-series-b .ct-line, .ct-chart .ct-series.ct-series-b .ct-point, .ct-chart .ct-series.ct-series-b .ct-slice-donut { + stroke: #fb6d9d; } + +.ct-chart .ct-series.ct-series-c .ct-bar, .ct-chart .ct-series.ct-series-c .ct-line, .ct-chart .ct-series.ct-series-c .ct-point, .ct-chart .ct-series.ct-series-c .ct-slice-donut { + stroke: #34d3eb; } + +.ct-chart .ct-series.ct-series-d .ct-bar, .ct-chart .ct-series.ct-series-d .ct-line, .ct-chart .ct-series.ct-series-d .ct-point, .ct-chart .ct-series.ct-series-d .ct-slice-donut { + stroke: #33b5e5; } + +.ct-chart .ct-series.ct-series-e .ct-bar, .ct-chart .ct-series.ct-series-e .ct-line, .ct-chart .ct-series.ct-series-e .ct-point, .ct-chart .ct-series.ct-series-e .ct-slice-donut { + stroke: #36404a; } + +.ct-chart .ct-series.ct-series-f .ct-bar, .ct-chart .ct-series.ct-series-f .ct-line, .ct-chart .ct-series.ct-series-f .ct-point, .ct-chart .ct-series.ct-series-f .ct-slice-donut { + stroke: #7266ba; } + +.ct-chart .ct-series.ct-series-g .ct-bar, .ct-chart .ct-series.ct-series-g .ct-line, .ct-chart .ct-series.ct-series-g .ct-point, .ct-chart .ct-series.ct-series-g .ct-slice-donut { + stroke: #81c868; } + +.ct-series-a .ct-area, .ct-series-a .ct-slice-pie { + fill: #5d9cec; } + +.ct-series-b .ct-area, .ct-series-b .ct-slice-pie { + fill: #fb6d9d; } + +.ct-series-c .ct-area, .ct-series-c .ct-slice-pie { + fill: #34d3eb; } + +.ct-series-d .ct-area, .ct-series-d .ct-slice-pie { + fill: #33b5e5; } + +.chartist-tooltip { + position: absolute; + display: inline-block; + opacity: 0; + min-width: 10px; + padding: 2px 10px; + border-radius: 3px; + background: #ffffff; + color: #36404a; + text-align: center; + pointer-events: none; + z-index: 1; + -webkit-transition: opacity .2s linear; + -moz-transition: opacity .2s linear; + -o-transition: opacity .2s linear; + transition: opacity .2s linear; } + +.chartist-tooltip.tooltip-show { + opacity: 1; } + +/* Circliful charts */ +.circliful-chart { + margin: 0 auto; } + +.circle-text, .circle-info, .circle-text-half, .circle-info-half { + font-size: 12px; + font-weight: 600; } + +/* === Nvd3 Charts === */ +.nvd3 text { + fill: rgba(255, 255, 255, 0.3); } + +.nvd3 .nv-axis line, +.nvd3 .nv-axis path { + stroke: rgba(255, 255, 255, 0.1); } + +.nvd3 .nv-discretebar .nv-groups text, +.nvd3 .nv-multibarHorizontal .nv-groups text { + fill: rgba(255, 255, 255, 0.5); } + +.multi-chart .nv-legend-symbol { + fill: #ffffff !important; + fill-opacity: 0; + stroke: #ffffff !important; } + +/* Ricksaw Charts */ +#legend { + background: #36404a; + position: absolute; + top: 0; + right: 15px; } + +#legend .line { + color: #333; } + +.rickshaw_graph .detail .x_label { + color: #36404a; } + +.rickshaw_graph .detail { + background: rgba(255, 255, 255, 0.1); } + +.rickshaw_graph svg { + max-width: 100%; } + +.rickshaw_legend .label { + font-family: inherit; + letter-spacing: 0.01em; + font-weight: 600; + color: #ffffff; } + +/* ============= + Count Down +============= */ +.home-wrapper { + margin: 10% 0; } + +.home-text { + font-weight: 600; } + +.u-countdown { + margin-top: 40px; + text-align: center; } + .u-countdown div { + display: inline-block; } + .u-countdown div span { + display: block; + width: 150px; } + .u-countdown div span:first-child { + font-size: 3em; + font-weight: 700; + height: 48px; + line-height: 48px; } + .u-countdown div span:last-child { + color: #ffffff; + font-size: 0.9em; + height: 25px; + line-height: 25px; } + +.u-countdown > * { + text-align: center; } + +.cd-text { + font-size: 15px; + line-height: 24px; + font-style: italic; } + +/* ============= + Timeline +============= */ +.cd-container { + width: 90%; + max-width: 1170px; + margin: 0 auto; } + +.cd-container::after { + content: ''; + display: table; + clear: both; } + +#cd-timeline { + margin-bottom: 2em; + margin-top: 2em; + padding: 2em 0; + position: relative; } + #cd-timeline::before { + background: #3c4853; + content: ''; + height: 100%; + left: 18px; + position: absolute; + top: 0; + width: 4px; } + +@media only screen and (min-width: 1170px) { + #cd-timeline { + margin-bottom: 3em; + margin-top: 3em; } + #cd-timeline::before { + left: 50%; + margin-left: -2px; } } +.cd-timeline-block { + margin: 2em 0; + position: relative; } + .cd-timeline-block:after { + clear: both; + content: ""; + display: table; } + +.cd-timeline-block:first-child { + margin-top: 0; } + +.cd-timeline-block:last-child { + margin-bottom: 0; } + +@media only screen and (min-width: 1170px) { + .cd-timeline-block { + margin: 4em 0; } + + .cd-timeline-block:first-child { + margin-top: 0; } + + .cd-timeline-block:last-child { + margin-bottom: 0; } } +.cd-timeline-img { + position: absolute; + top: 0; + left: 0; + width: 40px; + height: 40px; + border-radius: 50%; + box-shadow: 0 0 0 4px #414d59, inset 0 2px 0 rgba(0, 0, 0, 0.08), 0 3px 0 4px rgba(0, 0, 0, 0.05); + text-align: center; + line-height: 40px; + font-size: 20px; + color: #ffffff; } + +.cd-timeline-img.cd-success { + background: #81c868; } + +.cd-timeline-img.cd-info { + background: #34d3eb; } + +.cd-timeline-img.cd-pink { + background: #fb6d9d; } + +.cd-timeline-img.cd-danger { + background: #f05050; } + +.cd-timeline-img.cd-primary { + background: #5d9cec; } + +.cd-timeline-img.cd-warning { + background: #ffbd4a; } + +@media only screen and (min-width: 1170px) { + .cd-timeline-img { + width: 60px; + height: 60px; + line-height: 60px; + left: 50%; + margin-left: -30px; + -webkit-transform: translateZ(0); + -webkit-backface-visibility: hidden; } + + .cssanimations .cd-timeline-img.is-hidden { + visibility: hidden; } + + .cssanimations .cd-timeline-img.bounce-in { + visibility: visible; + -webkit-animation: cd-bounce-1 0.6s; + -moz-animation: cd-bounce-1 0.6s; + animation: cd-bounce-1 0.6s; } } +.cd-timeline-content { + -moz-box-shadow: 0 5px 5px -5px rgba(0, 0, 0, 0.1); + -webkit-box-shadow: 0 5px 5px -5px rgba(0, 0, 0, 0.1); + background: #3c4853; + border-radius: 0; + box-shadow: 0 5px 5px -5px rgba(0, 0, 0, 0.1); + margin-left: 60px; + padding: 1em; + position: relative; } + .cd-timeline-content img { + display: block; + width: 100%; } + .cd-timeline-content:after { + clear: both; + content: ""; + display: table; } + .cd-timeline-content h2 { + margin-top: 0; } + .cd-timeline-content p { + font-size: 14px; + margin: 10px 0 10px 0; } + .cd-timeline-content .cd-read-more { + background: #acb7c0; + border-radius: 0.25em; + color: white; + display: inline-block; + float: right; + font-size: 14px; + padding: .8em 1em; } + .cd-timeline-content .cd-date { + display: inline-block; + font-size: 14px; } + .cd-timeline-content h3 { + font-size: 21px; + margin: 0; } + +.no-touch .cd-timeline-content .cd-read-more:hover { + background-color: #bac4cb; } + +.cd-timeline-content .cd-date { + float: left; + padding: .8em 0; + opacity: .7; } + +.cd-timeline-content::before { + content: ''; + position: absolute; + top: 16px; + right: 100%; + height: 0; + width: 0; + border: 7px solid transparent; + border-right: 7px solid #3c4853; } + +@media only screen and (min-width: 1170px) { + .cd-timeline-content { + margin-left: 0; + padding: 1.6em; + width: 45%; } + + .cd-timeline-content::before { + top: 24px; + left: 100%; + border-color: transparent; + border-left-color: #3c4853; } + + .cd-timeline-content .cd-read-more { + float: left; } + + .cd-timeline-content .cd-date { + position: absolute; + width: 100%; + left: 122%; + top: 6px; } + + .cd-timeline-block:nth-child(even) .cd-timeline-content { + float: right; } + + .cd-timeline-block:nth-child(even) .cd-timeline-content::before { + top: 24px; + left: auto; + right: 100%; + border-color: transparent; + border-right-color: #3c4853; } + + .cd-timeline-block:nth-child(even) .cd-timeline-content .cd-read-more { + float: right; } + + .cd-timeline-block:nth-child(even) .cd-timeline-content .cd-date { + left: auto; + right: 122%; + text-align: right; } + + .cssanimations .cd-timeline-content.is-hidden { + visibility: hidden; } + + .cssanimations .cd-timeline-content.bounce-in { + visibility: visible; + -webkit-animation: cd-bounce-2 0.6s; + -moz-animation: cd-bounce-2 0.6s; + animation: cd-bounce-2 0.6s; } } +@media only screen and (min-width: 1170px) { + .cssanimations .cd-timeline-block:nth-child(even) .cd-timeline-content.bounce-in { + -webkit-animation: cd-bounce-2-inverse 0.6s; + -moz-animation: cd-bounce-2-inverse 0.6s; + animation: cd-bounce-2-inverse 0.6s; } } +/* Time line 2 */ +.timeline-2 { + border-left: 2px solid #98a6ad; + position: relative; } + .timeline-2 .time-item:after { + background-color: #36404a; + border-color: #98a6ad; + border-radius: 10px; + border-style: solid; + border-width: 2px; + bottom: 0; + content: ''; + height: 14px; + left: 0; + margin-left: -8px; + position: absolute; + top: 5px; + width: 14px; } + +.time-item { + border-color: #dee5e7; + padding-bottom: 1px; + position: relative; } + .time-item:before { + content: " "; + display: table; } + .time-item:after { + background-color: #ffffff; + border-color: #98a6ad; + border-radius: 10px; + border-style: solid; + border-width: 2px; + bottom: 0; + content: ''; + height: 14px; + left: 0; + margin-left: -8px; + position: absolute; + top: 5px; + width: 14px; } + +.time-item-item:after { + content: " "; + display: table; } + +.item-info { + margin-bottom: 15px; + margin-left: 15px; } + .item-info p { + margin-bottom: 10px !important; } + +/* ============= + Email +============= */ +.mails a { + color: rgba(255, 255, 255, 0.7); } +.mails td { + vertical-align: middle !important; + position: relative; } + .mails td:last-of-type { + width: 100px; + padding-right: 20px; } +.mails tr:hover .text-white { + display: none; } +.mails .mail-select { + padding: 12px 20px; + min-width: 134px; } +.mails .checkbox { + margin-bottom: 0; + margin-top: 0; + vertical-align: middle; + display: inline-block; + height: 17px; } + .mails .checkbox label { + min-height: 16px; } + +.mail-list .list-group-item { + background-color: transparent; + color: #ffffff; } + .mail-list .list-group-item:hover, .mail-list .list-group-item:focus { + background-color: transparent; } +.mail-list .list-group-item.active { + color: #f05050; } + +.unread a { + font-weight: 600; + color: #98a6ad; } + +/* ============= + Gallery +============= */ +.port { + padding-bottom: 20px; } + +.portfolioFilter a { + -moz-box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.1); + -moz-transition: all 0.3s ease-out; + -ms-transition: all 0.3s ease-out; + -o-transition: all 0.3s ease-out; + transition: all 0.3s ease-out; + -webkit-box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.1); + -webkit-transition: all 0.3s ease-out; + box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.1); + color: #98a6ad; + border-radius: 3px; + padding: 5px 10px; + display: inline-block; + margin-bottom: 5px; } + .portfolioFilter a:hover { + background-color: #33b5e5; + color: #ffffff; } +.portfolioFilter a.current { + background-color: #33b5e5; + color: #ffffff; } + +.gallery-second a { + box-shadow: none !important; + font-weight: 600; } + .gallery-second a:hover { + background-color: transparent; + color: #33b5e5; } + +.thumb { + background-color: #3c4853; + border-radius: 3px; + box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1); + margin-top: 30px; + padding-bottom: 10px; + padding-left: 10px; + padding-right: 10px; + padding-top: 10px; + width: 100%; } + +.thumb-img { + border-radius: 2px; + overflow: hidden; + width: 100%; } + +.gal-detail h4 { + margin-top: 16px; } + +/* Gallery Second */ +.portfolio-masonry-box { + overflow: hidden; + position: relative; + padding: 0; + margin-top: 20px; } + .portfolio-masonry-box .portfolio-masonry-img { + position: relative; + overflow: hidden; } + .portfolio-masonry-box .portfolio-masonry-img:after { + content: " "; + display: block; + width: 100%; + height: 100%; + position: absolute; + top: 0; + left: 0; + background: rgba(250, 250, 250, 0); + -webkit-transition: all 0.27s cubic-bezier(0.3, 0.1, 0.58, 1); + -moz-transition: all 0.27s cubic-bezier(0.3, 0.1, 0.58, 1); + -o-transition: all 0.27s cubic-bezier(0.3, 0.1, 0.58, 1); + transition: all 0.27s cubic-bezier(0.3, 0.1, 0.58, 1); } + .portfolio-masonry-box .portfolio-masonry-img > img { + -webkit-transition: all 0.3s cubic-bezier(0.3, 0.1, 0.58, 1); + -moz-transition: all 0.3s cubic-bezier(0.3, 0.1, 0.58, 1); + -o-transition: all 0.3s cubic-bezier(0.3, 0.1, 0.58, 1); + transition: all 0.3s cubic-bezier(0.3, 0.1, 0.58, 1); + border-radius: 0; } + .portfolio-masonry-box .portfolio-masonry-detail { + opacity: 0; + width: 100%; + padding: 20px 20px 0 20px; + box-sizing: border-box; + position: absolute; + left: 0; + text-align: center; + overflow: hidden; + -webkit-transition: all 0.27s cubic-bezier(0.3, 0.1, 0.58, 1); + -moz-transition: all 0.27s cubic-bezier(0.3, 0.1, 0.58, 1); + -o-transition: all 0.27s cubic-bezier(0.3, 0.1, 0.58, 1); + transition: all 0.27s cubic-bezier(0.3, 0.1, 0.58, 1); } + .portfolio-masonry-box .portfolio-masonry-detail h4 { + margin-bottom: 3px; + color: #ffffff !important; + font-weight: bold; } + .portfolio-masonry-box .portfolio-masonry-detail p { + color: #ffffff !important; + text-transform: uppercase; + font-size: 12px; } + +.portfolio-masonry-box:hover .portfolio-masonry-detail { + -webkit-transform: translateY(-100%); + -moz-transform: translateY(-100%); + transform: translateY(-100%); + z-index: 3; + opacity: 1; } +.portfolio-masonry-box:hover .portfolio-masonry-img:after { + background: rgba(54, 64, 74, 0.7); } +.portfolio-masonry-box:hover .portfolio-masonry-img > img { + -webkit-transform: scale(1.05); + -moz-transform: scale(1.05); + -o-transform: scale(1.05); + -ms-transform: scale(1.05); + transform: scale(1.05); } + +/* ============= + Maintenance +============= */ +.icon-main { + font-size: 88px; + margin-bottom: 50px; } + +.maintenance-page { + margin: 10% 0; } + +/* ============= + Maps +============= */ +.gmaps, .gmaps-panaroma { + height: 300px; + background: #eeeeee; + border-radius: 3px; } + +.gmaps-overlay { + display: block; + text-align: center; + color: #ffffff; + font-size: 16px; + line-height: 40px; + background: #5d9cec; + border-radius: 4px; + padding: 10px 20px; } + +.gmaps-overlay_arrow { + left: 50%; + margin-left: -16px; + width: 0; + height: 0; + position: absolute; } + +.gmaps-overlay_arrow.above { + bottom: -15px; + border-left: 16px solid transparent; + border-right: 16px solid transparent; + border-top: 16px solid #5d9cec; } + +.gmaps-overlay_arrow.below { + top: -15px; + border-left: 16px solid transparent; + border-right: 16px solid transparent; + border-bottom: 16px solid #5d9cec; } + +.jvectormap-zoomin, .jvectormap-zoomout { + width: 10px; + height: 10px; + line-height: 10px; } + +.jvectormap-zoomout { + top: 40px; } + +/* ============= + Nestable +============= */ +.custom-dd .dd-list .dd-item .dd-handle { + background: #414d59; + border: none; + padding: 8px 16px; + height: auto; + font-weight: 400; + border-radius: 3px; + color: #98a6ad; } + .custom-dd .dd-list .dd-item .dd-handle:hover { + color: #33b5e5; } +.custom-dd .dd-list .dd-item button { + height: auto; + font-size: 17px; + margin: 8px auto; + color: #98a6ad; + width: 30px; } + +.custom-dd-empty .dd-list .dd3-handle { + border: none; + background: #414d59; + height: 36px; + width: 36px; } + .custom-dd-empty .dd-list .dd3-handle:before { + color: inherit; + top: 7px; } + .custom-dd-empty .dd-list .dd3-handle:hover { + color: #33b5e5; } +.custom-dd-empty .dd-list .dd3-content { + height: auto; + border: none; + padding: 8px 16px 8px 46px; + background: #414d59; + font-weight: 400; + color: #98a6ad; } + .custom-dd-empty .dd-list .dd3-content:hover { + color: #33b5e5; } +.custom-dd-empty .dd-list button { + width: 26px; + height: 26px; + font-size: 16px; + font-weight: 600; } + +/* ============= + Pricing +============= */ +.pricing-plan { + padding-bottom: 50px; } + +.price_card { + -moz-border-radius: 5px; + -moz-box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.1); + -webkit-border-radius: 5px; + background: #3c4853; + border-radius: 5px; + box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.1); + margin-bottom: 30px; + padding-bottom: 20px; + position: relative; + -webkit-box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.1); } + .price_card .name { + display: block; + font-size: 16px; + font-weight: 700; + padding: 0 0 30px; + text-align: center; + width: 100%; } + .price_card button { + margin-top: 20px; } + +.pricing-header { + -moz-border-radius-topleft: 5px; + -moz-border-radius-topright: 5px; + -webkit-border-top-left-radius: 5px; + -webkit-border-top-right-radius: 5px; + border-top-left-radius: 5px; + border-top-right-radius: 5px; + color: #ffffff; } + +.price { + display: block; + font-size: 48px; + font-weight: 300; + padding: 30px 0 10px; + text-align: center; + width: 100%; } + +.price-features { + color: #98a6ad; + list-style: none; + margin: 0; + padding: 0; + text-align: center; } + .price-features li { + margin: 0 35px; + padding: 20px 15px; } + +.pricing-item { + margin: 0 0 30px; + position: relative; + text-align: center; } + +.pricing-item-inner { + -moz-transition: all 0.27s cubic-bezier(0, 0, 0.58, 1); + -ms-transition: all 0.27s cubic-bezier(0, 0, 0.58, 1); + -o-transition: all 0.27s cubic-bezier(0, 0, 0.58, 1); + -webkit-transition: all 0.27s cubic-bezier(0, 0, 0.58, 1); + border-radius: 7px; + border: 2px solid rgba(151, 160, 175, 0.2); + transition: all 0.27s cubic-bezier(0, 0, 0.58, 1); + vertical-align: middle; } + +.pricing-wrap { + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; + overflow: hidden; + padding: 30px 20px; + position: relative; + text-align: center; } + +.pricing-icon { + font-size: 32px; + padding-bottom: 5px; + padding-top: 10px; + position: relative; + z-index: 1; } + +.pricing-title { + font-size: 16px; + font-weight: 700; + margin-bottom: 40px; + position: relative; + text-transform: uppercase; + z-index: 1; } + +.pr-list { + color: #97a0af; + font-size: 12px; + font-weight: 400; + margin: 0 -20px 30px; + padding: 0; + text-transform: uppercase; } + .pr-list li { + list-style: none; + padding: 12px 20px; } + +.pricing-num { + font-size: 40px; + font-weight: 700; + line-height: 1; } + .pricing-num sup { + font-size: 18px; + font-weight: 400; + left: -3px; + margin-left: -7px; + position: relative; + top: -20px; } + +.pr-per { + color: #97a0af; + font-size: 12px; } + +.pr-button { + margin-top: 30px; } + +/* ============= + Profile +============= */ +.profile-detail { + text-align: center; + padding: 30px 20px; } + .profile-detail img { + height: 120px; + width: 120px; } + .profile-detail .status-list li { + padding: 0 20px; } + +.profile-tabs li a { + color: #36404a !important; } +.profile-tabs li.active a { + color: #ffffff !important; } + +.profile-pills li a { + color: rgba(255, 255, 255, 0.5) !important; + padding: 0 10px; + line-height: 30px !important; } + .profile-pills li a i { + font-size: 14px; } + +.comment { + padding-top: 12px; } + .comment .comment-avatar { + position: relative; + -webkit-border-radius: 3px; + -webkit-background-clip: padding-box; + -moz-border-radius: 3px; + -moz-background-clip: padding; + border-radius: 3px; + background-clip: padding-box; + display: block; + float: left; + height: 32px; + width: 32px; } + .comment .comment-body { + float: none; + margin-left: 40px; + position: relative; } + .comment .comment-text { + border: 1px solid #414d59; + border-radius: 2px; + padding: 7px 12px 8px; } + .comment .comment-header { + font-size: 12px; + padding-bottom: 2px; } + .comment .comment-header a { + color: #98a6ad; + font-weight: bold; } + .comment .comment-header span { + color: #98a6ad; + display: inline-block; + font-size: 11px; + margin-left: 5px; } + .comment .comment-footer { + display: block; + font-size: 12px; + padding: 4px 12px 0; } + .comment .comment-footer i { + font-size: 13px; + margin-right: 7px; } + .comment .comment-footer, .comment .comment-footer a { + color: rgba(255, 255, 255, 0.5); } + .comment .comment-footer:hover, .comment .comment-footer a:hover { + color: #33b5e5; } + +.comment > .comment { + margin-left: 32px !important; } + +/* ============= + sitemap +============= */ +.sitemap-wrapper a { + color: #98a6ad; } + .sitemap-wrapper a:hover { + color: #33b5e5; } +.sitemap-wrapper h5 { + font-weight: 600; + font-size: 16px; + line-height: 32px; } + .sitemap-wrapper h5 i { + padding-right: 10px; } +.sitemap-wrapper ul { + padding-left: 30px; } + .sitemap-wrapper ul li a { + font-size: 15px; + line-height: 30px; } + +/* ============= + FAQ +============= */ +.faq-box { + padding: 24px 0; + border-bottom: 1px solid #4c5a67; } + .faq-box .question { + font-weight: 600; + font-size: 16px; + margin-top: 0; } + .faq-box .answer { + color: #98a6ad; + margin-bottom: 0; } + +/* ============= + Search result +============= */ +.search-result-box .tab-content { + padding: 30px 30px 10px 30px; + box-shadow: none; } +.search-result-box .search-item { + padding-bottom: 20px; + border-bottom: 1px solid #4c5a67; + margin-bottom: 30px; } + +/* ============= + Contact +============= */ +.contact-search .btn-white { + position: absolute; + top: 1px; + right: 16px; + background-color: transparent !important; + border: none !important; + font-size: 16px; + box-shadow: none !important; + outline: none !important; + color: #98a6ad !important; } + +.contact-card { + position: relative; } + .contact-card:hover .contact-action { + display: block; } + .contact-card img { + width: 80px; + height: 80px; } + .contact-card .member-info { + padding-left: 100px; + padding-bottom: 20px; } + .contact-card .member-info h4, .contact-card .member-info p { + display: block; + overflow: hidden; + text-overflow: ellipsis; + width: 100%; + white-space: nowrap; } + .contact-card .contact-action { + position: absolute; + right: 0; + top: 0; + display: none; } + +/* ============= + Opportunities +============= */ +.opport-box .checkbx-detail { + width: 30px; } +.opport-box .lable-detail { + text-align: center; + width: 20%; } +.opport-box .member-info { + padding-right: 10px; } + .opport-box .member-info h4 { + font-size: 16px; + display: block; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; } + .opport-box .member-info p { + font-size: 13px; + display: block; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; } + +/* ============= + Product +============= */ +.product-list-box { + position: relative; } + .product-list-box img { + height: auto; + margin: 0 auto; + display: block; } + .product-list-box .product-action { + position: absolute; + right: 20px; + top: 20px; + display: none; } + .product-list-box .price-tag { + float: right; + height: 64px; + width: 64px; + text-align: center; + line-height: 64px; + background-color: rgba(152, 166, 173, 0.2); + border: 1px solid #98a6ad; + border-radius: 50%; + margin-top: 20px; + font-size: 18px; + font-weight: 600; + margin-right: 10px; } + .product-list-box .detail { + padding: 20px; + margin: 0px -10px -10px; + overflow: hidden; } + .product-list-box .detail h4 a { + white-space: nowrap; + display: block; + overflow: hidden; + text-overflow: ellipsis; + font-weight: 600; } + .product-list-box:hover .product-action { + display: block; } + +.rating ul { + margin-left: 0; } + .rating ul li { + padding: 0; } + .rating ul li a { + color: #ffbd4a; + font-size: 15px; + margin-bottom: 0; } + +.product-search { + border-radius: 30px; + padding: 7px 22px; + background-color: transparent !important; + border: 2px solid #98a6ad !important; } + +.product-detail-box .sp-wrap { + max-width: 100%; } + +/* ============= + Accounts pages +============= */ +.account-pages { + position: absolute; + height: 100%; + width: 100%; + top: 0; } + +.wrapper-page { + margin: 5% auto; + position: relative; + width: 420px; } + .wrapper-page .card-box { + border: 1px solid rgba(54, 64, 74, 0.1); } + +.panel-pages { + border-radius: 6px; } + .panel-pages .panel-body { + padding: 30px; } + .panel-pages .panel-heading { + -moz-border-radius: 6px 6px 0 0; + -webkit-border-radius: 6px 6px 0 0; + border-radius: 6px 6px 0 0; + padding: 40px 20px; + position: relative; } + .panel-pages .panel-heading h3 { + position: relative; + z-index: 999; } + +.user-thumb { + position: relative; + z-index: 999; } + .user-thumb img { + height: 88px; + margin: 0 auto; + width: 88px; } + +.ex-page-content .text-error { + color: #252932; + font-size: 98px; + font-weight: 700; + line-height: 150px; } + .ex-page-content .text-error i { + font-size: 78px; + padding: 0 10px; } + +/* signup-signin-page */ +.signup-signin-page { + width: auto; } + +/* ============= + Tree view page +============= */ +.jstree-default .jstree-clicked { + background: rgba(95, 190, 170, 0.4); + box-shadow: none; } +.jstree-default .jstree-hovered { + background: rgba(95, 190, 170, 0.2); + box-shadow: none; } +.jstree-default .jstree-wholerow-clicked { + background: rgba(95, 190, 170, 0.4); } +.jstree-default .jstree-wholerow-hovered { + background: rgba(95, 190, 170, 0.2); } +.jstree-default .zmdi { + font-size: 16px; } + +/* ============= + Tour page +============= */ +div.hopscotch-bubble { + border: 3px solid #5d9cec; + border-radius: 5px; } + div.hopscotch-bubble .hopscotch-next { + background-color: #5d9cec !important; + background-image: none !important; + border-color: #5d9cec !important; + text-shadow: none !important; + margin: 0 0 0 5px !important; } + div.hopscotch-bubble .hopscotch-prev { + background-color: #5d9cec !important; + background-image: none !important; + border-color: #5d9cec !important; + text-shadow: none !important; + color: #ffffff !important; } + +div.hopscotch-bubble .hopscotch-bubble-number { + background: #33b5e5; + padding: 0; + border-radius: 50%; } + +div.hopscotch-bubble .hopscotch-bubble-arrow-container.left .hopscotch-bubble-arrow-border { + border-right: 19px solid #5d9cec; } + +div.hopscotch-bubble .hopscotch-bubble-arrow-container.right .hopscotch-bubble-arrow { + border-left: 19px solid #5d9cec; + left: -2px; } + +div.hopscotch-bubble .hopscotch-bubble-arrow-container.left .hopscotch-bubble-arrow { + border: none; } + +div.hopscotch-bubble .hopscotch-bubble-arrow-container.right .hopscotch-bubble-arrow-border { + border-left: 0 solid #5d9cec; } + +div.hopscotch-bubble .hopscotch-bubble-arrow-container.up .hopscotch-bubble-arrow { + border-bottom: 19px solid #5d9cec; + top: 0; } + +div.hopscotch-bubble .hopscotch-bubble-arrow-container.up .hopscotch-bubble-arrow-border { + border-bottom: 0 solid rgba(0, 0, 0, 0.5); } + +div.hopscotch-bubble .hopscotch-bubble-arrow-container.down .hopscotch-bubble-arrow { + border-top: 19px solid #5d9cec; + top: -2px; } + +div.hopscotch-bubble .hopscotch-bubble-arrow-container.down .hopscotch-bubble-arrow-border { + border-top: 0 solid rgba(0, 0, 0, 0.5); } + +/* ============= + Task board +============= */ +.taskList li { + background-color: #3c4853; + border: 1px solid rgba(152, 166, 173, 0.2); + border-left-width: 3px; + border-radius: 3px; + padding: 10px; + margin-bottom: 15px; } +.taskList .task-success { + border-left-color: #81c868; } +.taskList .task-info { + border-left-color: #34d3eb; } +.taskList .task-warning { + border-left-color: #ffbd4a; } +.taskList .task-danger { + border-left-color: #f05050; } +.taskList a { + font-size: 13px; } +.taskList .checkbox { + margin-left: 20px; } + +.task-placeholder { + border: 1px dashed rgba(152, 166, 173, 0.5) !important; + background-color: rgba(152, 166, 173, 0.2) !important; + padding: 20px; } + +@media only screen and (max-width: 6000px) and (min-width: 700px) { + .wrapper.right-bar-enabled .right-bar { + right: 0; + z-index: 99; } } +@media (min-width: 768px) and (max-width: 1024px) { + .email-msg { + display: none; } } +@media (min-width: 768px) and (max-width: 991px) { + body { + overflow-x: hidden; } } +@media (max-width: 767px) { + body { + overflow-x: hidden; } + + .app-search { + display: none; } + + .left.side-menu, .sidebar-inner.slimscrollleft { + overflow: auto !important; } + + .enlarged .left.side-menu { + margin-left: -75px; } + + .content-page { + margin-left: 0px !important; } + + .footer { + left: 0px !important; } + + .mobile-sidebar { + left: 0px; } + + .mobile-content { + left: 250px; + right: -250px; } + + .wrapper-page { + width: 90%; } + + .wizard > .steps > ul > li { + width: 100%; } + + .wizard > .content { + padding: 0px !important; } + + .wizard > .content > .body { + float: none; + position: relative; + width: 100%; + height: 100%; + padding: 0%; } + + .wizard.vertical > .steps { + display: inline; + float: none; + width: 100%; } + + .wizard.vertical > .content { + display: inline; + float: none; + margin: 0%; + width: 100%; } + + .navbar-nav .open .dropdown-menu { + background-color: #ffffff; + box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.26); + left: auto; + position: absolute; + right: 0; } + + .todo-send { + margin-top: 10px; + padding-left: 15px; } + + .chat-inputbar { + padding-left: 15px; } + + .chat-send { + margin-top: 10px; + padding-left: 15px; + padding-right: 15px; } + + .dataTables_wrapper .col-xs-6 { + width: 100%; + text-align: left; } + + .product-search { + margin-bottom: 30px; } + + .top-menu-item-xs { + display: inline-flex !important; } + + .dropdown-menu-lg { + width: 240px !important; } } +@media (max-width: 480px) { + .navbar-custom { + margin-left: 70px !important; } + + .side-menu { + z-index: 10 !important; } + + .button-menu-mobile { + display: block; } + + .search-bar { + display: none !important; } + + .ms-container { + width: 100%; } + + #btn-fullscreen { + display: none; } } +@media (max-width: 420px) { + .hide-phone { + display: none !important; } } +/* Container-alt */ +@media (min-width: 768px) { + .container-alt { + width: 750px; } } +@media (min-width: 992px) { + .container-alt { + width: 970px; } } +@media (min-width: 1200px) { + .container-alt { + width: 1170px; } } +@media (max-width: 419px) { + .topbar-left { + width: 70px !important; } + + .logo .icon-c-logo { + display: inline-block !important; + line-height: 58px !important; } + .logo span { + display: none !important; } + + .content-page { + margin-left: 70px; } + + .forced .side-menu.left { + box-shadow: 0 12px 12px rgba(0, 0, 0, 0.1); } + + .enlarged .side-menu.left { + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1) !important; } + + .conversation-list .conversation-text, .conversation-list .odd .conversation-text { + width: 100% !important; } } + +/*# sourceMappingURL=style.css.map */ diff --git a/Monitor/wwwroot/assets/css/style.css.map b/Monitor/wwwroot/assets/css/style.css.map new file mode 100644 index 0000000..60797a4 --- /dev/null +++ b/Monitor/wwwroot/assets/css/style.css.map @@ -0,0 +1,7 @@ +{ +"version": 3, +"mappings": "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", +"sources": ["../scss/style.scss","../scss/_variables.scss","../scss/_common.scss","../scss/_helper.scss","../scss/_bootstrap-reset.scss","../scss/_pagination.scss","../scss/_form-components.scss","../scss/_tabs-accordions.scss","../scss/_alerts.scss","../scss/_modals.scss","../scss/_carousel.scss","../scss/_menu.scss","../scss/_animation.scss","../scss/_waves.scss","../scss/_print.scss","../scss/_buttons.scss","../scss/_checkbox-radio.scss","../scss/_portlets.scss","../scss/_progressbars.scss","../scss/_tables.scss","../scss/_widgets.scss","../scss/_form-advanced.scss","../scss/_form-wizard.scss","../scss/_calendar.scss","../scss/_wysiwig.scss","../scss/_notification.scss","../scss/_bootstrap-range-slider.scss","../scss/_sweet-alert.scss","../scss/_charts.scss","../scss/_countdown.scss","../scss/_timeline.scss","../scss/_email.scss","../scss/_gallery.scss","../scss/_maintenance.scss","../scss/_maps.scss","../scss/_nestable-list.scss","../scss/_pricing.scss","../scss/_profile.scss","../scss/_sitemap.scss","../scss/_faq.scss","../scss/_search-result.scss","../scss/_contact.scss","../scss/_opportunities.scss","../scss/_products.scss","../scss/_account-pages.scss","../scss/_treeview.scss","../scss/_tour.scss","../scss/_taskboard.scss","../scss/_responsive.scss"], +"names": [], +"file": "style.css" +} \ No newline at end of file diff --git a/Monitor/wwwroot/assets/fonts/FontAwesome.otf b/Monitor/wwwroot/assets/fonts/FontAwesome.otf new file mode 100644 index 0000000..401ec0f Binary files /dev/null and b/Monitor/wwwroot/assets/fonts/FontAwesome.otf differ diff --git a/Monitor/wwwroot/assets/fonts/Material-Design-Iconic-Font.eot b/Monitor/wwwroot/assets/fonts/Material-Design-Iconic-Font.eot new file mode 100644 index 0000000..df3fa77 Binary files /dev/null and b/Monitor/wwwroot/assets/fonts/Material-Design-Iconic-Font.eot differ diff --git a/Monitor/wwwroot/assets/fonts/Material-Design-Iconic-Font.svg b/Monitor/wwwroot/assets/fonts/Material-Design-Iconic-Font.svg new file mode 100644 index 0000000..d4eefd0 --- /dev/null +++ b/Monitor/wwwroot/assets/fonts/Material-Design-Iconic-Font.svg @@ -0,0 +1,773 @@ + + + + + +{ + "fontFamily": "Material-Design-Iconic-Font", + "majorVersion": 1, + "minorVersion": 0, + "fontURL": "http://zavoloklom.github.io/material-design-iconic-font/", + "description": "Material Design Iconic Font is a full suite of material design icons (created and maintained by Google) for easy scalable vector graphics on websites.\nFont generated by IcoMoon.", + "copyright": "CSS: Kupletsky Sergey, Icons: Google", + "designerURL": "http://zavoloklom.github.io/", + "license": "Attribution-ShareAlike 4.0 International license", + "licenseURL": "http://creativecommons.org/licenses/by-sa/4.0/", + "version": "Version 1.0", + "fontId": "Material-Design-Iconic-Font", + "psName": "Material-Design-Iconic-Font", + "subFamily": "Regular", + "fullName": "Material-Design-Iconic-Font" +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Monitor/wwwroot/assets/fonts/Material-Design-Iconic-Font.ttf b/Monitor/wwwroot/assets/fonts/Material-Design-Iconic-Font.ttf new file mode 100644 index 0000000..b41cdc3 Binary files /dev/null and b/Monitor/wwwroot/assets/fonts/Material-Design-Iconic-Font.ttf differ diff --git a/Monitor/wwwroot/assets/fonts/Material-Design-Iconic-Font.woff b/Monitor/wwwroot/assets/fonts/Material-Design-Iconic-Font.woff new file mode 100644 index 0000000..ccca1b0 Binary files /dev/null and b/Monitor/wwwroot/assets/fonts/Material-Design-Iconic-Font.woff differ diff --git a/Monitor/wwwroot/assets/fonts/Simple-Line-Icons.eot b/Monitor/wwwroot/assets/fonts/Simple-Line-Icons.eot new file mode 100644 index 0000000..533fd7f Binary files /dev/null and b/Monitor/wwwroot/assets/fonts/Simple-Line-Icons.eot differ diff --git a/Monitor/wwwroot/assets/fonts/Simple-Line-Icons.svg b/Monitor/wwwroot/assets/fonts/Simple-Line-Icons.svg new file mode 100644 index 0000000..bed0f14 --- /dev/null +++ b/Monitor/wwwroot/assets/fonts/Simple-Line-Icons.svg @@ -0,0 +1,211 @@ + + + + + + +{ + "fontFamily": "simple-line-icons", + "majorVersion": 2, + "minorVersion": 0, + "license": "MIT", + "designer": "Jamal Jama, Ahmad Firoz", + "version": "Version 2.0", + "fontId": "simple-line-icons", + "psName": "simple-line-icons", + "subFamily": "Regular", + "fullName": "simple-line-icons", + "description": "Font generated by IcoMoon." +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Monitor/wwwroot/assets/fonts/Simple-Line-Icons.ttf b/Monitor/wwwroot/assets/fonts/Simple-Line-Icons.ttf new file mode 100644 index 0000000..ecf85a4 Binary files /dev/null and b/Monitor/wwwroot/assets/fonts/Simple-Line-Icons.ttf differ diff --git a/Monitor/wwwroot/assets/fonts/Simple-Line-Icons.woff b/Monitor/wwwroot/assets/fonts/Simple-Line-Icons.woff new file mode 100644 index 0000000..b38250d Binary files /dev/null and b/Monitor/wwwroot/assets/fonts/Simple-Line-Icons.woff differ diff --git a/Monitor/wwwroot/assets/fonts/Simple-Line-Icons.woff2 b/Monitor/wwwroot/assets/fonts/Simple-Line-Icons.woff2 new file mode 100644 index 0000000..ec9373a Binary files /dev/null and b/Monitor/wwwroot/assets/fonts/Simple-Line-Icons.woff2 differ diff --git a/Monitor/wwwroot/assets/fonts/dripicons-v2.eot b/Monitor/wwwroot/assets/fonts/dripicons-v2.eot new file mode 100644 index 0000000..8afeaaa Binary files /dev/null and b/Monitor/wwwroot/assets/fonts/dripicons-v2.eot differ diff --git a/Monitor/wwwroot/assets/fonts/dripicons-v2.svg b/Monitor/wwwroot/assets/fonts/dripicons-v2.svg new file mode 100644 index 0000000..0b50172 --- /dev/null +++ b/Monitor/wwwroot/assets/fonts/dripicons-v2.svg @@ -0,0 +1,210 @@ + + + +Generated by Fontastic.me + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Monitor/wwwroot/assets/fonts/dripicons-v2.ttf b/Monitor/wwwroot/assets/fonts/dripicons-v2.ttf new file mode 100644 index 0000000..041e333 Binary files /dev/null and b/Monitor/wwwroot/assets/fonts/dripicons-v2.ttf differ diff --git a/Monitor/wwwroot/assets/fonts/dripicons-v2.woff b/Monitor/wwwroot/assets/fonts/dripicons-v2.woff new file mode 100644 index 0000000..5322e3d Binary files /dev/null and b/Monitor/wwwroot/assets/fonts/dripicons-v2.woff differ diff --git a/Monitor/wwwroot/assets/fonts/fontawesome-webfont.eot b/Monitor/wwwroot/assets/fonts/fontawesome-webfont.eot new file mode 100644 index 0000000..e9f60ca Binary files /dev/null and b/Monitor/wwwroot/assets/fonts/fontawesome-webfont.eot differ diff --git a/Monitor/wwwroot/assets/fonts/fontawesome-webfont.svg b/Monitor/wwwroot/assets/fonts/fontawesome-webfont.svg new file mode 100644 index 0000000..855c845 --- /dev/null +++ b/Monitor/wwwroot/assets/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Monitor/wwwroot/assets/fonts/fontawesome-webfont.ttf b/Monitor/wwwroot/assets/fonts/fontawesome-webfont.ttf new file mode 100644 index 0000000..35acda2 Binary files /dev/null and b/Monitor/wwwroot/assets/fonts/fontawesome-webfont.ttf differ diff --git a/Monitor/wwwroot/assets/fonts/fontawesome-webfont.woff b/Monitor/wwwroot/assets/fonts/fontawesome-webfont.woff new file mode 100644 index 0000000..400014a Binary files /dev/null and b/Monitor/wwwroot/assets/fonts/fontawesome-webfont.woff differ diff --git a/Monitor/wwwroot/assets/fonts/fontawesome-webfont.woff2 b/Monitor/wwwroot/assets/fonts/fontawesome-webfont.woff2 new file mode 100644 index 0000000..4d13fc6 Binary files /dev/null and b/Monitor/wwwroot/assets/fonts/fontawesome-webfont.woff2 differ diff --git a/Monitor/wwwroot/assets/fonts/ionicons.eot b/Monitor/wwwroot/assets/fonts/ionicons.eot new file mode 100644 index 0000000..7e677c6 Binary files /dev/null and b/Monitor/wwwroot/assets/fonts/ionicons.eot differ diff --git a/Monitor/wwwroot/assets/fonts/ionicons.svg b/Monitor/wwwroot/assets/fonts/ionicons.svg new file mode 100644 index 0000000..9252bab --- /dev/null +++ b/Monitor/wwwroot/assets/fonts/ionicons.svg @@ -0,0 +1,1899 @@ + + + + + +Created by FontForge 20120731 at Mon Jun 16 13:18:27 2014 + By Adam Bradley +Created by Adam Bradley with FontForge 2.0 (http://fontforge.sf.net) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Monitor/wwwroot/assets/fonts/ionicons.ttf b/Monitor/wwwroot/assets/fonts/ionicons.ttf new file mode 100644 index 0000000..e347409 Binary files /dev/null and b/Monitor/wwwroot/assets/fonts/ionicons.ttf differ diff --git a/Monitor/wwwroot/assets/fonts/ionicons.woff b/Monitor/wwwroot/assets/fonts/ionicons.woff new file mode 100644 index 0000000..5267cb1 Binary files /dev/null and b/Monitor/wwwroot/assets/fonts/ionicons.woff differ diff --git a/Monitor/wwwroot/assets/fonts/themify.eot b/Monitor/wwwroot/assets/fonts/themify.eot new file mode 100644 index 0000000..9ec298b Binary files /dev/null and b/Monitor/wwwroot/assets/fonts/themify.eot differ diff --git a/Monitor/wwwroot/assets/fonts/themify.svg b/Monitor/wwwroot/assets/fonts/themify.svg new file mode 100644 index 0000000..3d53854 --- /dev/null +++ b/Monitor/wwwroot/assets/fonts/themify.svg @@ -0,0 +1,362 @@ + + + +Generated by IcoMoon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Monitor/wwwroot/assets/fonts/themify.ttf b/Monitor/wwwroot/assets/fonts/themify.ttf new file mode 100644 index 0000000..5d627e7 Binary files /dev/null and b/Monitor/wwwroot/assets/fonts/themify.ttf differ diff --git a/Monitor/wwwroot/assets/fonts/themify.woff b/Monitor/wwwroot/assets/fonts/themify.woff new file mode 100644 index 0000000..847ebd1 Binary files /dev/null and b/Monitor/wwwroot/assets/fonts/themify.woff differ diff --git a/Monitor/wwwroot/assets/fonts/typicons.eot b/Monitor/wwwroot/assets/fonts/typicons.eot new file mode 100644 index 0000000..0873b12 Binary files /dev/null and b/Monitor/wwwroot/assets/fonts/typicons.eot differ diff --git a/Monitor/wwwroot/assets/fonts/typicons.less b/Monitor/wwwroot/assets/fonts/typicons.less new file mode 100644 index 0000000..643aea7 --- /dev/null +++ b/Monitor/wwwroot/assets/fonts/typicons.less @@ -0,0 +1,1040 @@ +@charset 'UTF-8'; + +/* @FONT-FACE loads font into browser */ +@font-face { + font-family: 'typicons'; + font-weight: normal; + font-style: normal; + src: url('../fonts/typicons.eot'); + src: url('../fonts/typicons.eot?#iefix') format('embedded-opentype'), + url('../fonts/typicons.woff') format('woff'), + url('../fonts/typicons.ttf') format('truetype'), + url('../fonts/typicons.svg#typicons') format('svg'); +} + +/* :before psuedo-selector inserts and styles icon */ +.typcn:before { + font-family: 'typicons'; + font-style: normal; + font-weight: normal; + speak: none; + display: inline-block; + text-decoration: inherit; + width: 1em; + height: 1em; + font-size: 1em; + text-align: center; + -webkit-font-smoothing: antialiased; + font-smoothing: antialiased; + text-rendering: optimizeLegibility; +} + +/* Code for individual icons */ +.typcn-adjust-brightness:before { + content: '\e000'; /* '' */ +} +.typcn-adjust-contrast:before { + content: '\e001'; /* '' */ +} +.typcn-anchor-outline:before { + content: '\e002'; /* '' */ +} +.typcn-anchor:before { + content: '\e003'; /* '' */ +} +.typcn-archive:before { + content: '\e004'; /* '' */ +} +.typcn-arrow-back-outline:before { + content: '\e005'; /* '' */ +} +.typcn-arrow-back:before { + content: '\e006'; /* '' */ +} +.typcn-arrow-down-outline:before { + content: '\e007'; /* '' */ +} +.typcn-arrow-down-thick:before { + content: '\e008'; /* '' */ +} +.typcn-arrow-down:before { + content: '\e009'; /* '' */ +} +.typcn-arrow-forward-outline:before { + content: '\e00a'; /* '' */ +} +.typcn-arrow-forward:before { + content: '\e00b'; /* '' */ +} +.typcn-arrow-left-outline:before { + content: '\e00c'; /* '' */ +} +.typcn-arrow-left-thick:before { + content: '\e00d'; /* '' */ +} +.typcn-arrow-left:before { + content: '\e00e'; /* '' */ +} +.typcn-arrow-loop-outline:before { + content: '\e00f'; /* '' */ +} +.typcn-arrow-loop:before { + content: '\e010'; /* '' */ +} +.typcn-arrow-maximise-outline:before { + content: '\e011'; /* '' */ +} +.typcn-arrow-maximise:before { + content: '\e012'; /* '' */ +} +.typcn-arrow-minimise-outline:before { + content: '\e013'; /* '' */ +} +.typcn-arrow-minimise:before { + content: '\e014'; /* '' */ +} +.typcn-arrow-move-outline:before { + content: '\e015'; /* '' */ +} +.typcn-arrow-move:before { + content: '\e016'; /* '' */ +} +.typcn-arrow-repeat-outline:before { + content: '\e017'; /* '' */ +} +.typcn-arrow-repeat:before { + content: '\e018'; /* '' */ +} +.typcn-arrow-right-outline:before { + content: '\e019'; /* '' */ +} +.typcn-arrow-right-thick:before { + content: '\e01a'; /* '' */ +} +.typcn-arrow-right:before { + content: '\e01b'; /* '' */ +} +.typcn-arrow-shuffle:before { + content: '\e01c'; /* '' */ +} +.typcn-arrow-sorted-down:before { + content: '\e01d'; /* '' */ +} +.typcn-arrow-sorted-up:before { + content: '\e01e'; /* '' */ +} +.typcn-arrow-sync-outline:before { + content: '\e01f'; /* '' */ +} +.typcn-arrow-sync:before { + content: '\e020'; /* '' */ +} +.typcn-arrow-unsorted:before { + content: '\e021'; /* '' */ +} +.typcn-arrow-up-outline:before { + content: '\e022'; /* '' */ +} +.typcn-arrow-up-thick:before { + content: '\e023'; /* '' */ +} +.typcn-arrow-up:before { + content: '\e024'; /* '' */ +} +.typcn-at:before { + content: '\e025'; /* '' */ +} +.typcn-attachment-outline:before { + content: '\e026'; /* '' */ +} +.typcn-attachment:before { + content: '\e027'; /* '' */ +} +.typcn-backspace-outline:before { + content: '\e028'; /* '' */ +} +.typcn-backspace:before { + content: '\e029'; /* '' */ +} +.typcn-battery-charge:before { + content: '\e02a'; /* '' */ +} +.typcn-battery-full:before { + content: '\e02b'; /* '' */ +} +.typcn-battery-high:before { + content: '\e02c'; /* '' */ +} +.typcn-battery-low:before { + content: '\e02d'; /* '' */ +} +.typcn-battery-mid:before { + content: '\e02e'; /* '' */ +} +.typcn-beaker:before { + content: '\e02f'; /* '' */ +} +.typcn-beer:before { + content: '\e030'; /* '' */ +} +.typcn-bell:before { + content: '\e031'; /* '' */ +} +.typcn-book:before { + content: '\e032'; /* '' */ +} +.typcn-bookmark:before { + content: '\e033'; /* '' */ +} +.typcn-briefcase:before { + content: '\e034'; /* '' */ +} +.typcn-brush:before { + content: '\e035'; /* '' */ +} +.typcn-business-card:before { + content: '\e036'; /* '' */ +} +.typcn-calculator:before { + content: '\e037'; /* '' */ +} +.typcn-calendar-outline:before { + content: '\e038'; /* '' */ +} +.typcn-calendar:before { + content: '\e039'; /* '' */ +} +.typcn-camera-outline:before { + content: '\e03a'; /* '' */ +} +.typcn-camera:before { + content: '\e03b'; /* '' */ +} +.typcn-cancel-outline:before { + content: '\e03c'; /* '' */ +} +.typcn-cancel:before { + content: '\e03d'; /* '' */ +} +.typcn-chart-area-outline:before { + content: '\e03e'; /* '' */ +} +.typcn-chart-area:before { + content: '\e03f'; /* '' */ +} +.typcn-chart-bar-outline:before { + content: '\e040'; /* '' */ +} +.typcn-chart-bar:before { + content: '\e041'; /* '' */ +} +.typcn-chart-line-outline:before { + content: '\e042'; /* '' */ +} +.typcn-chart-line:before { + content: '\e043'; /* '' */ +} +.typcn-chart-pie-outline:before { + content: '\e044'; /* '' */ +} +.typcn-chart-pie:before { + content: '\e045'; /* '' */ +} +.typcn-chevron-left-outline:before { + content: '\e046'; /* '' */ +} +.typcn-chevron-left:before { + content: '\e047'; /* '' */ +} +.typcn-chevron-right-outline:before { + content: '\e048'; /* '' */ +} +.typcn-chevron-right:before { + content: '\e049'; /* '' */ +} +.typcn-clipboard:before { + content: '\e04a'; /* '' */ +} +.typcn-cloud-storage:before { + content: '\e04b'; /* '' */ +} +.typcn-cloud-storage-outline:before { + content: '\e054'; /* '' */ +} +.typcn-code-outline:before { + content: '\e04c'; /* '' */ +} +.typcn-code:before { + content: '\e04d'; /* '' */ +} +.typcn-coffee:before { + content: '\e04e'; /* '' */ +} +.typcn-cog-outline:before { + content: '\e04f'; /* '' */ +} +.typcn-cog:before { + content: '\e050'; /* '' */ +} +.typcn-compass:before { + content: '\e051'; /* '' */ +} +.typcn-contacts:before { + content: '\e052'; /* '' */ +} +.typcn-credit-card:before { + content: '\e053'; /* '' */ +} +.typcn-css3:before { + content: '\e055'; /* '' */ +} +.typcn-database:before { + content: '\e056'; /* '' */ +} +.typcn-delete-outline:before { + content: '\e057'; /* '' */ +} +.typcn-delete:before { + content: '\e058'; /* '' */ +} +.typcn-device-desktop:before { + content: '\e059'; /* '' */ +} +.typcn-device-laptop:before { + content: '\e05a'; /* '' */ +} +.typcn-device-phone:before { + content: '\e05b'; /* '' */ +} +.typcn-device-tablet:before { + content: '\e05c'; /* '' */ +} +.typcn-directions:before { + content: '\e05d'; /* '' */ +} +.typcn-divide-outline:before { + content: '\e05e'; /* '' */ +} +.typcn-divide:before { + content: '\e05f'; /* '' */ +} +.typcn-document-add:before { + content: '\e060'; /* '' */ +} +.typcn-document-delete:before { + content: '\e061'; /* '' */ +} +.typcn-document-text:before { + content: '\e062'; /* '' */ +} +.typcn-document:before { + content: '\e063'; /* '' */ +} +.typcn-download-outline:before { + content: '\e064'; /* '' */ +} +.typcn-download:before { + content: '\e065'; /* '' */ +} +.typcn-dropbox:before { + content: '\e066'; /* '' */ +} +.typcn-edit:before { + content: '\e067'; /* '' */ +} +.typcn-eject-outline:before { + content: '\e068'; /* '' */ +} +.typcn-eject:before { + content: '\e069'; /* '' */ +} +.typcn-equals-outline:before { + content: '\e06a'; /* '' */ +} +.typcn-equals:before { + content: '\e06b'; /* '' */ +} +.typcn-export-outline:before { + content: '\e06c'; /* '' */ +} +.typcn-export:before { + content: '\e06d'; /* '' */ +} +.typcn-eye-outline:before { + content: '\e06e'; /* '' */ +} +.typcn-eye:before { + content: '\e06f'; /* '' */ +} +.typcn-feather:before { + content: '\e070'; /* '' */ +} +.typcn-film:before { + content: '\e071'; /* '' */ +} +.typcn-filter:before { + content: '\e072'; /* '' */ +} +.typcn-flag-outline:before { + content: '\e073'; /* '' */ +} +.typcn-flag:before { + content: '\e074'; /* '' */ +} +.typcn-flash-outline:before { + content: '\e075'; /* '' */ +} +.typcn-flash:before { + content: '\e076'; /* '' */ +} +.typcn-flow-children:before { + content: '\e077'; /* '' */ +} +.typcn-flow-merge:before { + content: '\e078'; /* '' */ +} +.typcn-flow-parallel:before { + content: '\e079'; /* '' */ +} +.typcn-flow-switch:before { + content: '\e07a'; /* '' */ +} +.typcn-folder-add:before { + content: '\e07b'; /* '' */ +} +.typcn-folder-delete:before { + content: '\e07c'; /* '' */ +} +.typcn-folder-open:before { + content: '\e07d'; /* '' */ +} +.typcn-folder:before { + content: '\e07e'; /* '' */ +} +.typcn-gift:before { + content: '\e07f'; /* '' */ +} +.typcn-globe-outline:before { + content: '\e080'; /* '' */ +} +.typcn-globe:before { + content: '\e081'; /* '' */ +} +.typcn-group-outline:before { + content: '\e082'; /* '' */ +} +.typcn-group:before { + content: '\e083'; /* '' */ +} +.typcn-headphones:before { + content: '\e084'; /* '' */ +} +.typcn-heart-full-outline:before { + content: '\e085'; /* '' */ +} +.typcn-heart-half-outline:before { + content: '\e086'; /* '' */ +} +.typcn-heart-outline:before { + content: '\e087'; /* '' */ +} +.typcn-heart:before { + content: '\e088'; /* '' */ +} +.typcn-home-outline:before { + content: '\e089'; /* '' */ +} +.typcn-home:before { + content: '\e08a'; /* '' */ +} +.typcn-html5:before { + content: '\e08b'; /* '' */ +} +.typcn-image-outline:before { + content: '\e08c'; /* '' */ +} +.typcn-image:before { + content: '\e08d'; /* '' */ +} +.typcn-infinity-outline:before { + content: '\e08e'; /* '' */ +} +.typcn-infinity:before { + content: '\e08f'; /* '' */ +} +.typcn-info-large-outline:before { + content: '\e090'; /* '' */ +} +.typcn-info-large:before { + content: '\e091'; /* '' */ +} +.typcn-info-outline:before { + content: '\e092'; /* '' */ +} +.typcn-info:before { + content: '\e093'; /* '' */ +} +.typcn-input-checked-outline:before { + content: '\e094'; /* '' */ +} +.typcn-input-checked:before { + content: '\e095'; /* '' */ +} +.typcn-key-outline:before { + content: '\e096'; /* '' */ +} +.typcn-key:before { + content: '\e097'; /* '' */ +} +.typcn-keyboard:before { + content: '\e098'; /* '' */ +} +.typcn-leaf:before { + content: '\e099'; /* '' */ +} +.typcn-lightbulb:before { + content: '\e09a'; /* '' */ +} +.typcn-link-outline:before { + content: '\e09b'; /* '' */ +} +.typcn-link:before { + content: '\e09c'; /* '' */ +} +.typcn-location-arrow-outline:before { + content: '\e09d'; /* '' */ +} +.typcn-location-arrow:before { + content: '\e09e'; /* '' */ +} +.typcn-location-outline:before { + content: '\e09f'; /* '' */ +} +.typcn-location:before { + content: '\e0a0'; /* '' */ +} +.typcn-lock-closed-outline:before { + content: '\e0a1'; /* '' */ +} +.typcn-lock-closed:before { + content: '\e0a2'; /* '' */ +} +.typcn-lock-open-outline:before { + content: '\e0a3'; /* '' */ +} +.typcn-lock-open:before { + content: '\e0a4'; /* '' */ +} +.typcn-mail:before { + content: '\e0a5'; /* '' */ +} +.typcn-map:before { + content: '\e0a6'; /* '' */ +} +.typcn-media-eject-outline:before { + content: '\e0a7'; /* '' */ +} +.typcn-media-eject:before { + content: '\e0a8'; /* '' */ +} +.typcn-media-fast-forward-outline:before { + content: '\e0a9'; /* '' */ +} +.typcn-media-fast-forward:before { + content: '\e0aa'; /* '' */ +} +.typcn-media-pause-outline:before { + content: '\e0ab'; /* '' */ +} +.typcn-media-pause:before { + content: '\e0ac'; /* '' */ +} +.typcn-media-play-outline:before { + content: '\e0ad'; /* '' */ +} +.typcn-media-play-reverse-outline:before { + content: '\e0ae'; /* '' */ +} +.typcn-media-play-reverse:before { + content: '\e0af'; /* '' */ +} +.typcn-media-play:before { + content: '\e0b0'; /* '' */ +} +.typcn-media-record-outline:before { + content: '\e0b1'; /* '' */ +} +.typcn-media-record:before { + content: '\e0b2'; /* '' */ +} +.typcn-media-rewind-outline:before { + content: '\e0b3'; /* '' */ +} +.typcn-media-rewind:before { + content: '\e0b4'; /* '' */ +} +.typcn-media-stop-outline:before { + content: '\e0b5'; /* '' */ +} +.typcn-media-stop:before { + content: '\e0b6'; /* '' */ +} +.typcn-message-typing:before { + content: '\e0b7'; /* '' */ +} +.typcn-message:before { + content: '\e0b8'; /* '' */ +} +.typcn-messages:before { + content: '\e0b9'; /* '' */ +} +.typcn-microphone-outline:before { + content: '\e0ba'; /* '' */ +} +.typcn-microphone:before { + content: '\e0bb'; /* '' */ +} +.typcn-minus-outline:before { + content: '\e0bc'; /* '' */ +} +.typcn-minus:before { + content: '\e0bd'; /* '' */ +} +.typcn-mortar-board:before { + content: '\e0be'; /* '' */ +} +.typcn-news:before { + content: '\e0bf'; /* '' */ +} +.typcn-notes-outline:before { + content: '\e0c0'; /* '' */ +} +.typcn-notes:before { + content: '\e0c1'; /* '' */ +} +.typcn-pen:before { + content: '\e0c2'; /* '' */ +} +.typcn-pencil:before { + content: '\e0c3'; /* '' */ +} +.typcn-phone-outline:before { + content: '\e0c4'; /* '' */ +} +.typcn-phone:before { + content: '\e0c5'; /* '' */ +} +.typcn-pi-outline:before { + content: '\e0c6'; /* '' */ +} +.typcn-pi:before { + content: '\e0c7'; /* '' */ +} +.typcn-pin-outline:before { + content: '\e0c8'; /* '' */ +} +.typcn-pin:before { + content: '\e0c9'; /* '' */ +} +.typcn-pipette:before { + content: '\e0ca'; /* '' */ +} +.typcn-plane-outline:before { + content: '\e0cb'; /* '' */ +} +.typcn-plane:before { + content: '\e0cc'; /* '' */ +} +.typcn-plug:before { + content: '\e0cd'; /* '' */ +} +.typcn-plus-outline:before { + content: '\e0ce'; /* '' */ +} +.typcn-plus:before { + content: '\e0cf'; /* '' */ +} +.typcn-point-of-interest-outline:before { + content: '\e0d0'; /* '' */ +} +.typcn-point-of-interest:before { + content: '\e0d1'; /* '' */ +} +.typcn-power-outline:before { + content: '\e0d2'; /* '' */ +} +.typcn-power:before { + content: '\e0d3'; /* '' */ +} +.typcn-printer:before { + content: '\e0d4'; /* '' */ +} +.typcn-puzzle-outline:before { + content: '\e0d5'; /* '' */ +} +.typcn-puzzle:before { + content: '\e0d6'; /* '' */ +} +.typcn-radar-outline:before { + content: '\e0d7'; /* '' */ +} +.typcn-radar:before { + content: '\e0d8'; /* '' */ +} +.typcn-refresh-outline:before { + content: '\e0d9'; /* '' */ +} +.typcn-refresh:before { + content: '\e0da'; /* '' */ +} +.typcn-rss-outline:before { + content: '\e0db'; /* '' */ +} +.typcn-rss:before { + content: '\e0dc'; /* '' */ +} +.typcn-scissors-outline:before { + content: '\e0dd'; /* '' */ +} +.typcn-scissors:before { + content: '\e0de'; /* '' */ +} +.typcn-shopping-bag:before { + content: '\e0df'; /* '' */ +} +.typcn-shopping-cart:before { + content: '\e0e0'; /* '' */ +} +.typcn-social-at-circular:before { + content: '\e0e1'; /* '' */ +} +.typcn-social-dribbble-circular:before { + content: '\e0e2'; /* '' */ +} +.typcn-social-dribbble:before { + content: '\e0e3'; /* '' */ +} +.typcn-social-facebook-circular:before { + content: '\e0e4'; /* '' */ +} +.typcn-social-facebook:before { + content: '\e0e5'; /* '' */ +} +.typcn-social-flickr-circular:before { + content: '\e0e6'; /* '' */ +} +.typcn-social-flickr:before { + content: '\e0e7'; /* '' */ +} +.typcn-social-github-circular:before { + content: '\e0e8'; /* '' */ +} +.typcn-social-github:before { + content: '\e0e9'; /* '' */ +} +.typcn-social-google-plus-circular:before { + content: '\e0ea'; /* '' */ +} +.typcn-social-google-plus:before { + content: '\e0eb'; /* '' */ +} +.typcn-social-instagram-circular:before { + content: '\e0ec'; /* '' */ +} +.typcn-social-instagram:before { + content: '\e0ed'; /* '' */ +} +.typcn-social-last-fm-circular:before { + content: '\e0ee'; /* '' */ +} +.typcn-social-last-fm:before { + content: '\e0ef'; /* '' */ +} +.typcn-social-linkedin-circular:before { + content: '\e0f0'; /* '' */ +} +.typcn-social-linkedin:before { + content: '\e0f1'; /* '' */ +} +.typcn-social-pinterest-circular:before { + content: '\e0f2'; /* '' */ +} +.typcn-social-pinterest:before { + content: '\e0f3'; /* '' */ +} +.typcn-social-skype-outline:before { + content: '\e0f4'; /* '' */ +} +.typcn-social-skype:before { + content: '\e0f5'; /* '' */ +} +.typcn-social-tumbler-circular:before { + content: '\e0f6'; /* '' */ +} +.typcn-social-tumbler:before { + content: '\e0f7'; /* '' */ +} +.typcn-social-twitter-circular:before { + content: '\e0f8'; /* '' */ +} +.typcn-social-twitter:before { + content: '\e0f9'; /* '' */ +} +.typcn-social-vimeo-circular:before { + content: '\e0fa'; /* '' */ +} +.typcn-social-vimeo:before { + content: '\e0fb'; /* '' */ +} +.typcn-social-youtube-circular:before { + content: '\e0fc'; /* '' */ +} +.typcn-social-youtube:before { + content: '\e0fd'; /* '' */ +} +.typcn-sort-alphabetically-outline:before { + content: '\e0fe'; /* '' */ +} +.typcn-sort-alphabetically:before { + content: '\e0ff'; /* '' */ +} +.typcn-sort-numerically-outline:before { + content: '\e100'; /* '' */ +} +.typcn-sort-numerically:before { + content: '\e101'; /* '' */ +} +.typcn-spanner-outline:before { + content: '\e102'; /* '' */ +} +.typcn-spanner:before { + content: '\e103'; /* '' */ +} +.typcn-spiral:before { + content: '\e104'; /* '' */ +} +.typcn-star-full-outline:before { + content: '\e105'; /* '' */ +} +.typcn-star-half-outline:before { + content: '\e106'; /* '' */ +} +.typcn-star-half:before { + content: '\e107'; /* '' */ +} +.typcn-star-outline:before { + content: '\e108'; /* '' */ +} +.typcn-star:before { + content: '\e109'; /* '' */ +} +.typcn-starburst-outline:before { + content: '\e10a'; /* '' */ +} +.typcn-starburst:before { + content: '\e10b'; /* '' */ +} +.typcn-stopwatch:before { + content: '\e10c'; /* '' */ +} +.typcn-support:before { + content: '\e10d'; /* '' */ +} +.typcn-tabs-outline:before { + content: '\e10e'; /* '' */ +} +.typcn-tag:before { + content: '\e10f'; /* '' */ +} +.typcn-tags:before { + content: '\e110'; /* '' */ +} +.typcn-th-large-outline:before { + content: '\e111'; /* '' */ +} +.typcn-th-large:before { + content: '\e112'; /* '' */ +} +.typcn-th-list-outline:before { + content: '\e113'; /* '' */ +} +.typcn-th-list:before { + content: '\e114'; /* '' */ +} +.typcn-th-menu-outline:before { + content: '\e115'; /* '' */ +} +.typcn-th-menu:before { + content: '\e116'; /* '' */ +} +.typcn-th-small-outline:before { + content: '\e117'; /* '' */ +} +.typcn-th-small:before { + content: '\e118'; /* '' */ +} +.typcn-thermometer:before { + content: '\e119'; /* '' */ +} +.typcn-thumbs-down:before { + content: '\e11a'; /* '' */ +} +.typcn-thumbs-ok:before { + content: '\e11b'; /* '' */ +} +.typcn-thumbs-up:before { + content: '\e11c'; /* '' */ +} +.typcn-tick-outline:before { + content: '\e11d'; /* '' */ +} +.typcn-tick:before { + content: '\e11e'; /* '' */ +} +.typcn-ticket:before { + content: '\e11f'; /* '' */ +} +.typcn-time:before { + content: '\e120'; /* '' */ +} +.typcn-times-outline:before { + content: '\e121'; /* '' */ +} +.typcn-times:before { + content: '\e122'; /* '' */ +} +.typcn-trash:before { + content: '\e123'; /* '' */ +} +.typcn-tree:before { + content: '\e124'; /* '' */ +} +.typcn-upload-outline:before { + content: '\e125'; /* '' */ +} +.typcn-upload:before { + content: '\e126'; /* '' */ +} +.typcn-user-add-outline:before { + content: '\e127'; /* '' */ +} +.typcn-user-add:before { + content: '\e128'; /* '' */ +} +.typcn-user-delete-outline:before { + content: '\e129'; /* '' */ +} +.typcn-user-delete:before { + content: '\e12a'; /* '' */ +} +.typcn-user-outline:before { + content: '\e12b'; /* '' */ +} +.typcn-user:before { + content: '\e12c'; /* '' */ +} +.typcn-vendor-android:before { + content: '\e12d'; /* '' */ +} +.typcn-vendor-apple:before { + content: '\e12e'; /* '' */ +} +.typcn-vendor-microsoft:before { + content: '\e12f'; /* '' */ +} +.typcn-video-outline:before { + content: '\e130'; /* '' */ +} +.typcn-video:before { + content: '\e131'; /* '' */ +} +.typcn-volume-down:before { + content: '\e132'; /* '' */ +} +.typcn-volume-mute:before { + content: '\e133'; /* '' */ +} +.typcn-volume-up:before { + content: '\e134'; /* '' */ +} +.typcn-volume:before { + content: '\e135'; /* '' */ +} +.typcn-warning-outline:before { + content: '\e136'; /* '' */ +} +.typcn-warning:before { + content: '\e137'; /* '' */ +} +.typcn-watch:before { + content: '\e138'; /* '' */ +} +.typcn-waves-outline:before { + content: '\e139'; /* '' */ +} +.typcn-waves:before { + content: '\e13a'; /* '' */ +} +.typcn-weather-cloudy:before { + content: '\e13b'; /* '' */ +} +.typcn-weather-downpour:before { + content: '\e13c'; /* '' */ +} +.typcn-weather-night:before { + content: '\e13d'; /* '' */ +} +.typcn-weather-partly-sunny:before { + content: '\e13e'; /* '' */ +} +.typcn-weather-shower:before { + content: '\e13f'; /* '' */ +} +.typcn-weather-snow:before { + content: '\e140'; /* '' */ +} +.typcn-weather-stormy:before { + content: '\e141'; /* '' */ +} +.typcn-weather-sunny:before { + content: '\e142'; /* '' */ +} +.typcn-weather-windy-cloudy:before { + content: '\e143'; /* '' */ +} +.typcn-weather-windy:before { + content: '\e144'; /* '' */ +} +.typcn-wi-fi-outline:before { + content: '\e145'; /* '' */ +} +.typcn-wi-fi:before { + content: '\e146'; /* '' */ +} +.typcn-wine:before { + content: '\e147'; /* '' */ +} +.typcn-world-outline:before { + content: '\e148'; /* '' */ +} +.typcn-world:before { + content: '\e149'; /* '' */ +} +.typcn-zoom-in-outline:before { + content: '\e14a'; /* '' */ +} +.typcn-zoom-in:before { + content: '\e14b'; /* '' */ +} +.typcn-zoom-out-outline:before { + content: '\e14c'; /* '' */ +} +.typcn-zoom-out:before { + content: '\e14d'; /* '' */ +} +.typcn-zoom-outline:before { + content: '\e14e'; /* '' */ +} +.typcn-zoom:before { + content: '\e14f'; /* '' */ +} \ No newline at end of file diff --git a/Monitor/wwwroot/assets/fonts/typicons.svg b/Monitor/wwwroot/assets/fonts/typicons.svg new file mode 100644 index 0000000..63929fe --- /dev/null +++ b/Monitor/wwwroot/assets/fonts/typicons.svg @@ -0,0 +1,1180 @@ + + + + +Created by FontForge 20120731 at Sun Jul 27 14:53:18 2014 + By Stephen Hutchings +(c) Stephen Hutchings 2012 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Monitor/wwwroot/assets/fonts/typicons.ttf b/Monitor/wwwroot/assets/fonts/typicons.ttf new file mode 100644 index 0000000..f7df94b Binary files /dev/null and b/Monitor/wwwroot/assets/fonts/typicons.ttf differ diff --git a/Monitor/wwwroot/assets/fonts/typicons.woff b/Monitor/wwwroot/assets/fonts/typicons.woff new file mode 100644 index 0000000..14dc020 Binary files /dev/null and b/Monitor/wwwroot/assets/fonts/typicons.woff differ diff --git a/Monitor/wwwroot/assets/fonts/weathericons-regular-webfont.eot b/Monitor/wwwroot/assets/fonts/weathericons-regular-webfont.eot new file mode 100644 index 0000000..330b7ec Binary files /dev/null and b/Monitor/wwwroot/assets/fonts/weathericons-regular-webfont.eot differ diff --git a/Monitor/wwwroot/assets/fonts/weathericons-regular-webfont.svg b/Monitor/wwwroot/assets/fonts/weathericons-regular-webfont.svg new file mode 100644 index 0000000..397d730 --- /dev/null +++ b/Monitor/wwwroot/assets/fonts/weathericons-regular-webfont.svg @@ -0,0 +1,257 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Monitor/wwwroot/assets/fonts/weathericons-regular-webfont.ttf b/Monitor/wwwroot/assets/fonts/weathericons-regular-webfont.ttf new file mode 100644 index 0000000..948f0a5 Binary files /dev/null and b/Monitor/wwwroot/assets/fonts/weathericons-regular-webfont.ttf differ diff --git a/Monitor/wwwroot/assets/fonts/weathericons-regular-webfont.woff b/Monitor/wwwroot/assets/fonts/weathericons-regular-webfont.woff new file mode 100644 index 0000000..e0b2f94 Binary files /dev/null and b/Monitor/wwwroot/assets/fonts/weathericons-regular-webfont.woff differ diff --git a/Monitor/wwwroot/assets/fonts/weathericons-regular-webfont.woff2 b/Monitor/wwwroot/assets/fonts/weathericons-regular-webfont.woff2 new file mode 100644 index 0000000..bb0c19d Binary files /dev/null and b/Monitor/wwwroot/assets/fonts/weathericons-regular-webfont.woff2 differ diff --git a/Monitor/wwwroot/assets/img/qr-btc.png b/Monitor/wwwroot/assets/img/qr-btc.png new file mode 100644 index 0000000..13e2289 Binary files /dev/null and b/Monitor/wwwroot/assets/img/qr-btc.png differ diff --git a/Monitor/wwwroot/assets/img/qr-eth.png b/Monitor/wwwroot/assets/img/qr-eth.png new file mode 100644 index 0000000..f8a6925 Binary files /dev/null and b/Monitor/wwwroot/assets/img/qr-eth.png differ diff --git a/Monitor/wwwroot/assets/img/qr-ltc.png b/Monitor/wwwroot/assets/img/qr-ltc.png new file mode 100644 index 0000000..eabbd2a Binary files /dev/null and b/Monitor/wwwroot/assets/img/qr-ltc.png differ diff --git a/Monitor/wwwroot/assets/img/qr-neo.png b/Monitor/wwwroot/assets/img/qr-neo.png new file mode 100644 index 0000000..666911c Binary files /dev/null and b/Monitor/wwwroot/assets/img/qr-neo.png differ diff --git a/Monitor/wwwroot/assets/js/analyzer-settings.js b/Monitor/wwwroot/assets/js/analyzer-settings.js new file mode 100644 index 0000000..7925d4a --- /dev/null +++ b/Monitor/wwwroot/assets/js/analyzer-settings.js @@ -0,0 +1,315 @@ +var statusMarketTrends = []; +var statusGlobalSettings = []; +var statusSingleMarketSettings = []; + +var checkedMTButtons = false; +var checkedGSButtons = false; +var checkedSMSButtons = false; + +const GSStandardTriggerTemplate = ({ settingType, settingName, trendName, marketTrends, minChange, maxChange }) => ` +
+
+ + Market Trend name +
+
+ + Min. trend change % - Read the Wiki! +
+
+ + Max. trend change % - Read the Wiki! +
+
+
+`; + +const SMSStandardTriggerTemplate = ({ settingType, settingName, trendName, triggerPrefix, marketTrends, marketTrendRelations, minChange, maxChange }) => ` +
+
+ + Market Trend name +
+
+ + Market Trend relation +
+
+ + Min. trend change % - Read the Wiki! +
+
+ + Max. trend change % - Read the Wiki! +
+
+
+`; + +const CoinAgeTriggerTemplate = ({ settingType, settingName, triggerIndex, coinAgeDays }) => ` +
+ +
+ + Days since a coin was added to an exchange. +
+
+
+`; + +const SMS24hVolumeTriggerTemplate = ({ settingType, settingName, triggerIndex, triggerPrefix, mainMarket, min24hVolume, max24hVolume }) => ` +
+ +
+ + Min. 24h Volume +
+
+ + Max. 24h Volume +
+
+
+`; + +const SMSHoursActiveTriggerTemplate = ({ settingType, settingName, triggerIndex, hoursSinceTriggered }) => ` +
+ +
+ + Number of hours the setting will be max. active. +
+
+
+`; + +const PropertyTemplate = ({ settingType, settingName, propertyType, propertyKey, propertyKeySimple, value, valueModes}) => ` +
+
+ + Any variable from PT's settings may be used! +
+
+ + The value for this setting. +
+
+ + Value mode - Read the Wiki! +
+
+
+`; + +function checkMTMoveButtons() { + if (!checkedMTButtons) { + $('.btn-move-MT').each(function (index) { + var dataTarget = $(this).data('datatarget'); + var dataDirection = $(this).data('datadirection'); + + var currentElement = $('#' + dataTarget).closest('.settings-markettrend'); + + if (dataDirection === 'up') { + if ($(currentElement).is('.settings-markettrend:first-child')) { + $(this).addClass('hidden'); + } else { + $(this).removeClass('hidden'); + } + } else if (dataDirection === 'down') { + if ($(currentElement).is('.settings-markettrend:last-child')) { + $(this).addClass('hidden'); + } else { + $(this).removeClass('hidden'); + } + } + }); + } + checkedMTButtons = true; +} + +function checkGSMoveButtons() { + if (!checkedGSButtons) { + $('.btn-move-GS').each(function (index) { + var dataTarget = $(this).data('datatarget'); + var dataDirection = $(this).data('datadirection'); + + var currentElement = $('#' + dataTarget).closest('.settings-globalsetting'); + + if (dataDirection === 'up') { + if ($(currentElement).is('.settings-globalsetting:first-child')) { + $(this).addClass('hidden'); + } else { + $(this).removeClass('hidden'); + } + } else if (dataDirection === 'down') { + if ($(currentElement).is('.settings-globalsetting:last-child')) { + $(this).addClass('hidden'); + } else { + $(this).removeClass('hidden'); + + // Get next element + var nextElement = $(currentElement).next('.settings-globalsetting').find('div'); + var nextElementId = $(nextElement).attr('id').toLowerCase().replace('globalsetting_', ''); + if (nextElementId.startsWith('default')) { + // Hide "Move Down" button when the next setting is the default setting + $(this).addClass('hidden'); + } + } + } + }); + } + checkedGSButtons = true; +} + +function checkSMSMoveButtons() { + if (!checkedSMSButtons) { + $('.btn-move-SMS').each(function (index) { + var dataTarget = $(this).data('datatarget'); + var dataDirection = $(this).data('datadirection'); + + var currentElement = $('#' + dataTarget).closest('.settings-singlemarketsetting'); + + if (dataDirection === 'up') { + if ($(currentElement).is('.settings-singlemarketsetting:first-child')) { + $(this).addClass('hidden'); + } else { + $(this).removeClass('hidden'); + } + } else if (dataDirection === 'down') { + if ($(currentElement).is('.settings-singlemarketsetting:last-child')) { + $(this).addClass('hidden'); + } else { + $(this).removeClass('hidden'); + } + } + }); + } + checkedSMSButtons = true; +} + +function checkBuildStatus() { + var buildCompleted = true; + + for (key in statusMarketTrends) { + if (!statusMarketTrends[key]) { + buildCompleted = false; + } + } + + if (buildCompleted) { + for (key in statusGlobalSettings) { + if (!statusGlobalSettings[key]) { + buildCompleted = false; + } + } + } + + if (buildCompleted) { + for (key in statusSingleMarketSettings) { + if (!statusSingleMarketSettings[key]) { + buildCompleted = false; + } + } + } + + if (buildCompleted) { + $('#div-loading-settings').addClass('hidden'); + $('#div-save-settings').removeClass('hidden'); + + checkMTMoveButtons(); + checkGSMoveButtons(); + checkSMSMoveButtons(); + } +} + +$.fn.buildMarketTrendSettings = function () { + return this.each(function (index) { + var element = $(this); + var marketTrendName = $(this).data('trendname'); + var rootUrl = $(this).data('rooturl'); + + if (marketTrendName !== '') { + statusMarketTrends[marketTrendName] = false; + } + + $(this).load(rootUrl + '_get/SettingsMarketTrends?mt=' + encodeURIComponent(marketTrendName), '', function (responseText, textStatus, XMLHttpRequest) { + if (textStatus === 'error') { + $.Notification.notify('error', 'top left', 'Build MarketTrendSettings failed!', 'PTMagic Monitor failed to build MarketTrendSettings.') + } else { + statusMarketTrends[marketTrendName] = true; + checkBuildStatus(); + + $(this).removeClass('new'); + $('[data-toggle="tooltip"]').tooltip(); + var elems = Array.prototype.slice.call(document.querySelectorAll('[data-plugin="switchery"][data-switchery="false"]')); + elems.forEach(function (html) { + var switchery = new Switchery(html, { size : 'small' }); + }); + } + }); + }); +}; + +$.fn.buildGlobalSettings = function () { + return this.each(function (index) { + var element = $(this); + var settingName = $(this).data('settingname'); + var rootUrl = $(this).data('rooturl'); + + if (settingName !== '') { + statusGlobalSettings[settingName] = false; + } + + $(this).load(rootUrl + '_get/SettingsGlobalSettings?gs=' + encodeURIComponent(settingName), '', function (responseText, textStatus, XMLHttpRequest) { + if (textStatus === 'error') { + $.Notification.notify('error', 'top left', 'Build GlobalSettings failed!', 'PTMagic Monitor failed to build GlobalSettings.') + } else { + statusGlobalSettings[settingName] = true; + checkBuildStatus(); + + $(this).removeClass('new'); + $('[data-toggle="tooltip"]').tooltip(); + var elems = Array.prototype.slice.call(document.querySelectorAll('[data-plugin="switchery"][data-switchery="false"]')); + elems.forEach(function (html) { + var switchery = new Switchery(html, { size: 'small' }); + }); + } + }); + }); +}; + +$.fn.buildSingleMarketSettings = function () { + return this.each(function (index) { + var element = $(this); + var settingName = $(this).data('settingname'); + var rootUrl = $(this).data('rooturl'); + + if (settingName !== '') { + statusSingleMarketSettings[settingName] = false; + } + + $(this).load(rootUrl + '_get/SettingsSingleMarketSettings?gs=' + encodeURIComponent(settingName), '', function (responseText, textStatus, XMLHttpRequest) { + if (textStatus === 'error') { + $.Notification.notify('error', 'top left', 'Build SingleMarketSettings failed!', 'PTMagic Monitor failed to build SingleMarketSettings.') + } else { + statusSingleMarketSettings[settingName] = true; + checkBuildStatus(); + + $(this).removeClass('new'); + $('[data-toggle="tooltip"]').tooltip(); + var elems = Array.prototype.slice.call(document.querySelectorAll('[data-plugin="switchery"][data-switchery="false"]')); + elems.forEach(function (html) { + var switchery = new Switchery(html, { size: 'small' }); + }); + } + }); + }); +}; \ No newline at end of file diff --git a/Monitor/wwwroot/assets/js/bootstrap.min.js b/Monitor/wwwroot/assets/js/bootstrap.min.js new file mode 100644 index 0000000..e187476 --- /dev/null +++ b/Monitor/wwwroot/assets/js/bootstrap.min.js @@ -0,0 +1,6 @@ +/*! + * Bootstrap v4.0.0-beta (https://getbootstrap.com) + * Copyright 2011-2017 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery. jQuery must be included before Bootstrap's JavaScript.");!function(t){var e=jQuery.fn.jquery.split(" ")[0].split(".");if(e[0]<2&&e[1]<9||1==e[0]&&9==e[1]&&e[2]<1||e[0]>=4)throw new Error("Bootstrap's JavaScript requires at least jQuery v1.9.1 but less than v4.0.0")}(),function(){function t(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function e(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}var i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},o=function(){function t(t,e){for(var n=0;n0?n:null}catch(t){return null}},reflow:function(t){return t.offsetHeight},triggerTransitionEnd:function(e){t(e).trigger(s.end)},supportsTransitionEnd:function(){return Boolean(s)},typeCheckConfig:function(t,i,o){for(var r in o)if(o.hasOwnProperty(r)){var s=o[r],a=i[r],l=a&&n(a)?"element":e(a);if(!new RegExp(s).test(l))throw new Error(t.toUpperCase()+': Option "'+r+'" provided type "'+l+'" but expected type "'+s+'".')}}};return s=o(),t.fn.emulateTransitionEnd=r,l.supportsTransitionEnd()&&(t.event.special[l.TRANSITION_END]=i()),l}(jQuery),s=(function(t){var e="alert",i=t.fn[e],s={DISMISS:'[data-dismiss="alert"]'},a={CLOSE:"close.bs.alert",CLOSED:"closed.bs.alert",CLICK_DATA_API:"click.bs.alert.data-api"},l={ALERT:"alert",FADE:"fade",SHOW:"show"},h=function(){function e(t){n(this,e),this._element=t}return e.prototype.close=function(t){t=t||this._element;var e=this._getRootElement(t);this._triggerCloseEvent(e).isDefaultPrevented()||this._removeElement(e)},e.prototype.dispose=function(){t.removeData(this._element,"bs.alert"),this._element=null},e.prototype._getRootElement=function(e){var n=r.getSelectorFromElement(e),i=!1;return n&&(i=t(n)[0]),i||(i=t(e).closest("."+l.ALERT)[0]),i},e.prototype._triggerCloseEvent=function(e){var n=t.Event(a.CLOSE);return t(e).trigger(n),n},e.prototype._removeElement=function(e){var n=this;t(e).removeClass(l.SHOW),r.supportsTransitionEnd()&&t(e).hasClass(l.FADE)?t(e).one(r.TRANSITION_END,function(t){return n._destroyElement(e,t)}).emulateTransitionEnd(150):this._destroyElement(e)},e.prototype._destroyElement=function(e){t(e).detach().trigger(a.CLOSED).remove()},e._jQueryInterface=function(n){return this.each(function(){var i=t(this),o=i.data("bs.alert");o||(o=new e(this),i.data("bs.alert",o)),"close"===n&&o[n](this)})},e._handleDismiss=function(t){return function(e){e&&e.preventDefault(),t.close(this)}},o(e,null,[{key:"VERSION",get:function(){return"4.0.0-beta"}}]),e}();t(document).on(a.CLICK_DATA_API,s.DISMISS,h._handleDismiss(new h)),t.fn[e]=h._jQueryInterface,t.fn[e].Constructor=h,t.fn[e].noConflict=function(){return t.fn[e]=i,h._jQueryInterface}}(jQuery),function(t){var e="button",i=t.fn[e],r={ACTIVE:"active",BUTTON:"btn",FOCUS:"focus"},s={DATA_TOGGLE_CARROT:'[data-toggle^="button"]',DATA_TOGGLE:'[data-toggle="buttons"]',INPUT:"input",ACTIVE:".active",BUTTON:".btn"},a={CLICK_DATA_API:"click.bs.button.data-api",FOCUS_BLUR_DATA_API:"focus.bs.button.data-api blur.bs.button.data-api"},l=function(){function e(t){n(this,e),this._element=t}return e.prototype.toggle=function(){var e=!0,n=!0,i=t(this._element).closest(s.DATA_TOGGLE)[0];if(i){var o=t(this._element).find(s.INPUT)[0];if(o){if("radio"===o.type)if(o.checked&&t(this._element).hasClass(r.ACTIVE))e=!1;else{var a=t(i).find(s.ACTIVE)[0];a&&t(a).removeClass(r.ACTIVE)}if(e){if(o.hasAttribute("disabled")||i.hasAttribute("disabled")||o.classList.contains("disabled")||i.classList.contains("disabled"))return;o.checked=!t(this._element).hasClass(r.ACTIVE),t(o).trigger("change")}o.focus(),n=!1}}n&&this._element.setAttribute("aria-pressed",!t(this._element).hasClass(r.ACTIVE)),e&&t(this._element).toggleClass(r.ACTIVE)},e.prototype.dispose=function(){t.removeData(this._element,"bs.button"),this._element=null},e._jQueryInterface=function(n){return this.each(function(){var i=t(this).data("bs.button");i||(i=new e(this),t(this).data("bs.button",i)),"toggle"===n&&i[n]()})},o(e,null,[{key:"VERSION",get:function(){return"4.0.0-beta"}}]),e}();t(document).on(a.CLICK_DATA_API,s.DATA_TOGGLE_CARROT,function(e){e.preventDefault();var n=e.target;t(n).hasClass(r.BUTTON)||(n=t(n).closest(s.BUTTON)),l._jQueryInterface.call(t(n),"toggle")}).on(a.FOCUS_BLUR_DATA_API,s.DATA_TOGGLE_CARROT,function(e){var n=t(e.target).closest(s.BUTTON)[0];t(n).toggleClass(r.FOCUS,/^focus(in)?$/.test(e.type))}),t.fn[e]=l._jQueryInterface,t.fn[e].Constructor=l,t.fn[e].noConflict=function(){return t.fn[e]=i,l._jQueryInterface}}(jQuery),function(t){var e="carousel",s="bs.carousel",a="."+s,l=t.fn[e],h={interval:5e3,keyboard:!0,slide:!1,pause:"hover",wrap:!0},c={interval:"(number|boolean)",keyboard:"boolean",slide:"(boolean|string)",pause:"(string|boolean)",wrap:"boolean"},u={NEXT:"next",PREV:"prev",LEFT:"left",RIGHT:"right"},d={SLIDE:"slide"+a,SLID:"slid"+a,KEYDOWN:"keydown"+a,MOUSEENTER:"mouseenter"+a,MOUSELEAVE:"mouseleave"+a,TOUCHEND:"touchend"+a,LOAD_DATA_API:"load.bs.carousel.data-api",CLICK_DATA_API:"click.bs.carousel.data-api"},f={CAROUSEL:"carousel",ACTIVE:"active",SLIDE:"slide",RIGHT:"carousel-item-right",LEFT:"carousel-item-left",NEXT:"carousel-item-next",PREV:"carousel-item-prev",ITEM:"carousel-item"},p={ACTIVE:".active",ACTIVE_ITEM:".active.carousel-item",ITEM:".carousel-item",NEXT_PREV:".carousel-item-next, .carousel-item-prev",INDICATORS:".carousel-indicators",DATA_SLIDE:"[data-slide], [data-slide-to]",DATA_RIDE:'[data-ride="carousel"]'},_=function(){function l(e,i){n(this,l),this._items=null,this._interval=null,this._activeElement=null,this._isPaused=!1,this._isSliding=!1,this.touchTimeout=null,this._config=this._getConfig(i),this._element=t(e)[0],this._indicatorsElement=t(this._element).find(p.INDICATORS)[0],this._addEventListeners()}return l.prototype.next=function(){this._isSliding||this._slide(u.NEXT)},l.prototype.nextWhenVisible=function(){document.hidden||this.next()},l.prototype.prev=function(){this._isSliding||this._slide(u.PREV)},l.prototype.pause=function(e){e||(this._isPaused=!0),t(this._element).find(p.NEXT_PREV)[0]&&r.supportsTransitionEnd()&&(r.triggerTransitionEnd(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null},l.prototype.cycle=function(t){t||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config.interval&&!this._isPaused&&(this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))},l.prototype.to=function(e){var n=this;this._activeElement=t(this._element).find(p.ACTIVE_ITEM)[0];var i=this._getItemIndex(this._activeElement);if(!(e>this._items.length-1||e<0))if(this._isSliding)t(this._element).one(d.SLID,function(){return n.to(e)});else{if(i===e)return this.pause(),void this.cycle();var o=e>i?u.NEXT:u.PREV;this._slide(o,this._items[e])}},l.prototype.dispose=function(){t(this._element).off(a),t.removeData(this._element,s),this._items=null,this._config=null,this._element=null,this._interval=null,this._isPaused=null,this._isSliding=null,this._activeElement=null,this._indicatorsElement=null},l.prototype._getConfig=function(n){return n=t.extend({},h,n),r.typeCheckConfig(e,n,c),n},l.prototype._addEventListeners=function(){var e=this;this._config.keyboard&&t(this._element).on(d.KEYDOWN,function(t){return e._keydown(t)}),"hover"===this._config.pause&&(t(this._element).on(d.MOUSEENTER,function(t){return e.pause(t)}).on(d.MOUSELEAVE,function(t){return e.cycle(t)}),"ontouchstart"in document.documentElement&&t(this._element).on(d.TOUCHEND,function(){e.pause(),e.touchTimeout&&clearTimeout(e.touchTimeout),e.touchTimeout=setTimeout(function(t){return e.cycle(t)},500+e._config.interval)}))},l.prototype._keydown=function(t){if(!/input|textarea/i.test(t.target.tagName))switch(t.which){case 37:t.preventDefault(),this.prev();break;case 39:t.preventDefault(),this.next();break;default:return}},l.prototype._getItemIndex=function(e){return this._items=t.makeArray(t(e).parent().find(p.ITEM)),this._items.indexOf(e)},l.prototype._getItemByDirection=function(t,e){var n=t===u.NEXT,i=t===u.PREV,o=this._getItemIndex(e),r=this._items.length-1;if((i&&0===o||n&&o===r)&&!this._config.wrap)return e;var s=(o+(t===u.PREV?-1:1))%this._items.length;return-1===s?this._items[this._items.length-1]:this._items[s]},l.prototype._triggerSlideEvent=function(e,n){var i=this._getItemIndex(e),o=this._getItemIndex(t(this._element).find(p.ACTIVE_ITEM)[0]),r=t.Event(d.SLIDE,{relatedTarget:e,direction:n,from:o,to:i});return t(this._element).trigger(r),r},l.prototype._setActiveIndicatorElement=function(e){if(this._indicatorsElement){t(this._indicatorsElement).find(p.ACTIVE).removeClass(f.ACTIVE);var n=this._indicatorsElement.children[this._getItemIndex(e)];n&&t(n).addClass(f.ACTIVE)}},l.prototype._slide=function(e,n){var i=this,o=t(this._element).find(p.ACTIVE_ITEM)[0],s=this._getItemIndex(o),a=n||o&&this._getItemByDirection(e,o),l=this._getItemIndex(a),h=Boolean(this._interval),c=void 0,_=void 0,g=void 0;if(e===u.NEXT?(c=f.LEFT,_=f.NEXT,g=u.LEFT):(c=f.RIGHT,_=f.PREV,g=u.RIGHT),a&&t(a).hasClass(f.ACTIVE))this._isSliding=!1;else if(!this._triggerSlideEvent(a,g).isDefaultPrevented()&&o&&a){this._isSliding=!0,h&&this.pause(),this._setActiveIndicatorElement(a);var m=t.Event(d.SLID,{relatedTarget:a,direction:g,from:s,to:l});r.supportsTransitionEnd()&&t(this._element).hasClass(f.SLIDE)?(t(a).addClass(_),r.reflow(a),t(o).addClass(c),t(a).addClass(c),t(o).one(r.TRANSITION_END,function(){t(a).removeClass(c+" "+_).addClass(f.ACTIVE),t(o).removeClass(f.ACTIVE+" "+_+" "+c),i._isSliding=!1,setTimeout(function(){return t(i._element).trigger(m)},0)}).emulateTransitionEnd(600)):(t(o).removeClass(f.ACTIVE),t(a).addClass(f.ACTIVE),this._isSliding=!1,t(this._element).trigger(m)),h&&this.cycle()}},l._jQueryInterface=function(e){return this.each(function(){var n=t(this).data(s),o=t.extend({},h,t(this).data());"object"===(void 0===e?"undefined":i(e))&&t.extend(o,e);var r="string"==typeof e?e:o.slide;if(n||(n=new l(this,o),t(this).data(s,n)),"number"==typeof e)n.to(e);else if("string"==typeof r){if(void 0===n[r])throw new Error('No method named "'+r+'"');n[r]()}else o.interval&&(n.pause(),n.cycle())})},l._dataApiClickHandler=function(e){var n=r.getSelectorFromElement(this);if(n){var i=t(n)[0];if(i&&t(i).hasClass(f.CAROUSEL)){var o=t.extend({},t(i).data(),t(this).data()),a=this.getAttribute("data-slide-to");a&&(o.interval=!1),l._jQueryInterface.call(t(i),o),a&&t(i).data(s).to(a),e.preventDefault()}}},o(l,null,[{key:"VERSION",get:function(){return"4.0.0-beta"}},{key:"Default",get:function(){return h}}]),l}();t(document).on(d.CLICK_DATA_API,p.DATA_SLIDE,_._dataApiClickHandler),t(window).on(d.LOAD_DATA_API,function(){t(p.DATA_RIDE).each(function(){var e=t(this);_._jQueryInterface.call(e,e.data())})}),t.fn[e]=_._jQueryInterface,t.fn[e].Constructor=_,t.fn[e].noConflict=function(){return t.fn[e]=l,_._jQueryInterface}}(jQuery),function(t){var e="collapse",s="bs.collapse",a=t.fn[e],l={toggle:!0,parent:""},h={toggle:"boolean",parent:"string"},c={SHOW:"show.bs.collapse",SHOWN:"shown.bs.collapse",HIDE:"hide.bs.collapse",HIDDEN:"hidden.bs.collapse",CLICK_DATA_API:"click.bs.collapse.data-api"},u={SHOW:"show",COLLAPSE:"collapse",COLLAPSING:"collapsing",COLLAPSED:"collapsed"},d={WIDTH:"width",HEIGHT:"height"},f={ACTIVES:".show, .collapsing",DATA_TOGGLE:'[data-toggle="collapse"]'},p=function(){function a(e,i){n(this,a),this._isTransitioning=!1,this._element=e,this._config=this._getConfig(i),this._triggerArray=t.makeArray(t('[data-toggle="collapse"][href="#'+e.id+'"],[data-toggle="collapse"][data-target="#'+e.id+'"]'));for(var o=t(f.DATA_TOGGLE),s=0;s0&&this._triggerArray.push(l)}this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}return a.prototype.toggle=function(){t(this._element).hasClass(u.SHOW)?this.hide():this.show()},a.prototype.show=function(){var e=this;if(!this._isTransitioning&&!t(this._element).hasClass(u.SHOW)){var n=void 0,i=void 0;if(this._parent&&((n=t.makeArray(t(this._parent).children().children(f.ACTIVES))).length||(n=null)),!(n&&(i=t(n).data(s))&&i._isTransitioning)){var o=t.Event(c.SHOW);if(t(this._element).trigger(o),!o.isDefaultPrevented()){n&&(a._jQueryInterface.call(t(n),"hide"),i||t(n).data(s,null));var l=this._getDimension();t(this._element).removeClass(u.COLLAPSE).addClass(u.COLLAPSING),this._element.style[l]=0,this._triggerArray.length&&t(this._triggerArray).removeClass(u.COLLAPSED).attr("aria-expanded",!0),this.setTransitioning(!0);var h=function(){t(e._element).removeClass(u.COLLAPSING).addClass(u.COLLAPSE).addClass(u.SHOW),e._element.style[l]="",e.setTransitioning(!1),t(e._element).trigger(c.SHOWN)};if(r.supportsTransitionEnd()){var d="scroll"+(l[0].toUpperCase()+l.slice(1));t(this._element).one(r.TRANSITION_END,h).emulateTransitionEnd(600),this._element.style[l]=this._element[d]+"px"}else h()}}}},a.prototype.hide=function(){var e=this;if(!this._isTransitioning&&t(this._element).hasClass(u.SHOW)){var n=t.Event(c.HIDE);if(t(this._element).trigger(n),!n.isDefaultPrevented()){var i=this._getDimension();if(this._element.style[i]=this._element.getBoundingClientRect()[i]+"px",r.reflow(this._element),t(this._element).addClass(u.COLLAPSING).removeClass(u.COLLAPSE).removeClass(u.SHOW),this._triggerArray.length)for(var o=0;o0},l.prototype._getPopperConfig=function(){var t={placement:this._getPlacement(),modifiers:{offset:{offset:this._config.offset},flip:{enabled:this._config.flip}}};return this._inNavbar&&(t.modifiers.applyStyle={enabled:!this._inNavbar}),t},l._jQueryInterface=function(e){return this.each(function(){var n=t(this).data(s),o="object"===(void 0===e?"undefined":i(e))?e:null;if(n||(n=new l(this,o),t(this).data(s,n)),"string"==typeof e){if(void 0===n[e])throw new Error('No method named "'+e+'"');n[e]()}})},l._clearMenus=function(e){if(!e||3!==e.which&&("keyup"!==e.type||9===e.which))for(var n=t.makeArray(t(d.DATA_TOGGLE)),i=0;i0&&r--,40===e.which&&rdocument.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},a.prototype._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},a.prototype._checkScrollbar=function(){this._isBodyOverflowing=document.body.clientWidth=n){var i=this._targets[this._targets.length-1];this._activeTarget!==i&&this._activate(i)}else{if(this._activeTarget&&t0)return this._activeTarget=null,void this._clear();for(var o=this._offsets.length;o--;)this._activeTarget!==this._targets[o]&&t>=this._offsets[o]&&(void 0===this._offsets[o+1]||t .dropdown-menu .active"},l=function(){function e(t){n(this,e),this._element=t}return e.prototype.show=function(){var e=this;if(!(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&t(this._element).hasClass(s.ACTIVE)||t(this._element).hasClass(s.DISABLED))){var n=void 0,o=void 0,l=t(this._element).closest(a.NAV_LIST_GROUP)[0],h=r.getSelectorFromElement(this._element);l&&(o=t.makeArray(t(l).find(a.ACTIVE)),o=o[o.length-1]);var c=t.Event(i.HIDE,{relatedTarget:this._element}),u=t.Event(i.SHOW,{relatedTarget:o});if(o&&t(o).trigger(c),t(this._element).trigger(u),!u.isDefaultPrevented()&&!c.isDefaultPrevented()){h&&(n=t(h)[0]),this._activate(this._element,l);var d=function(){var n=t.Event(i.HIDDEN,{relatedTarget:e._element}),r=t.Event(i.SHOWN,{relatedTarget:o});t(o).trigger(n),t(e._element).trigger(r)};n?this._activate(n,n.parentNode,d):d()}}},e.prototype.dispose=function(){t.removeData(this._element,"bs.tab"),this._element=null},e.prototype._activate=function(e,n,i){var o=this,l=t(n).find(a.ACTIVE)[0],h=i&&r.supportsTransitionEnd()&&l&&t(l).hasClass(s.FADE),c=function(){return o._transitionComplete(e,l,h,i)};l&&h?t(l).one(r.TRANSITION_END,c).emulateTransitionEnd(150):c(),l&&t(l).removeClass(s.SHOW)},e.prototype._transitionComplete=function(e,n,i,o){if(n){t(n).removeClass(s.ACTIVE);var l=t(n.parentNode).find(a.DROPDOWN_ACTIVE_CHILD)[0];l&&t(l).removeClass(s.ACTIVE),n.setAttribute("aria-expanded",!1)}if(t(e).addClass(s.ACTIVE),e.setAttribute("aria-expanded",!0),i?(r.reflow(e),t(e).addClass(s.SHOW)):t(e).removeClass(s.FADE),e.parentNode&&t(e.parentNode).hasClass(s.DROPDOWN_MENU)){var h=t(e).closest(a.DROPDOWN)[0];h&&t(h).find(a.DROPDOWN_TOGGLE).addClass(s.ACTIVE),e.setAttribute("aria-expanded",!0)}o&&o()},e._jQueryInterface=function(n){return this.each(function(){var i=t(this),o=i.data("bs.tab");if(o||(o=new e(this),i.data("bs.tab",o)),"string"==typeof n){if(void 0===o[n])throw new Error('No method named "'+n+'"');o[n]()}})},o(e,null,[{key:"VERSION",get:function(){return"4.0.0-beta"}}]),e}();t(document).on(i.CLICK_DATA_API,a.DATA_TOGGLE,function(e){e.preventDefault(),l._jQueryInterface.call(t(this),"show")}),t.fn.tab=l._jQueryInterface,t.fn.tab.Constructor=l,t.fn.tab.noConflict=function(){return t.fn.tab=e,l._jQueryInterface}}(jQuery),function(t){if("undefined"==typeof Popper)throw new Error("Bootstrap tooltips require Popper.js (https://popper.js.org)");var e="tooltip",s=".bs.tooltip",a=t.fn[e],l=new RegExp("(^|\\s)bs-tooltip\\S+","g"),h={animation:"boolean",template:"string",title:"(string|element|function)",trigger:"string",delay:"(number|object)",html:"boolean",selector:"(string|boolean)",placement:"(string|function)",offset:"(number|string)",container:"(string|element|boolean)",fallbackPlacement:"(string|array)"},c={AUTO:"auto",TOP:"top",RIGHT:"right",BOTTOM:"bottom",LEFT:"left"},u={animation:!0,template:'',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip"},d={SHOW:"show",OUT:"out"},f={HIDE:"hide"+s,HIDDEN:"hidden"+s,SHOW:"show"+s,SHOWN:"shown"+s,INSERTED:"inserted"+s,CLICK:"click"+s,FOCUSIN:"focusin"+s,FOCUSOUT:"focusout"+s,MOUSEENTER:"mouseenter"+s,MOUSELEAVE:"mouseleave"+s},p={FADE:"fade",SHOW:"show"},_={TOOLTIP:".tooltip",TOOLTIP_INNER:".tooltip-inner",ARROW:".arrow"},g={HOVER:"hover",FOCUS:"focus",CLICK:"click",MANUAL:"manual"},m=function(){function a(t,e){n(this,a),this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}return a.prototype.enable=function(){this._isEnabled=!0},a.prototype.disable=function(){this._isEnabled=!1},a.prototype.toggleEnabled=function(){this._isEnabled=!this._isEnabled},a.prototype.toggle=function(e){if(e){var n=this.constructor.DATA_KEY,i=t(e.currentTarget).data(n);i||(i=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(n,i)),i._activeTrigger.click=!i._activeTrigger.click,i._isWithActiveTrigger()?i._enter(null,i):i._leave(null,i)}else{if(t(this.getTipElement()).hasClass(p.SHOW))return void this._leave(null,this);this._enter(null,this)}},a.prototype.dispose=function(){clearTimeout(this._timeout),t.removeData(this.element,this.constructor.DATA_KEY),t(this.element).off(this.constructor.EVENT_KEY),t(this.element).closest(".modal").off("hide.bs.modal"),this.tip&&t(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,this._activeTrigger=null,null!==this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},a.prototype.show=function(){var e=this;if("none"===t(this.element).css("display"))throw new Error("Please use show on visible elements");var n=t.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){t(this.element).trigger(n);var i=t.contains(this.element.ownerDocument.documentElement,this.element);if(n.isDefaultPrevented()||!i)return;var o=this.getTipElement(),s=r.getUID(this.constructor.NAME);o.setAttribute("id",s),this.element.setAttribute("aria-describedby",s),this.setContent(),this.config.animation&&t(o).addClass(p.FADE);var l="function"==typeof this.config.placement?this.config.placement.call(this,o,this.element):this.config.placement,h=this._getAttachment(l);this.addAttachmentClass(h);var c=!1===this.config.container?document.body:t(this.config.container);t(o).data(this.constructor.DATA_KEY,this),t.contains(this.element.ownerDocument.documentElement,this.tip)||t(o).appendTo(c),t(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new Popper(this.element,o,{placement:h,modifiers:{offset:{offset:this.config.offset},flip:{behavior:this.config.fallbackPlacement},arrow:{element:_.ARROW}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){e._handlePopperPlacementChange(t)}}),t(o).addClass(p.SHOW),"ontouchstart"in document.documentElement&&t("body").children().on("mouseover",null,t.noop);var u=function(){e.config.animation&&e._fixTransition();var n=e._hoverState;e._hoverState=null,t(e.element).trigger(e.constructor.Event.SHOWN),n===d.OUT&&e._leave(null,e)};r.supportsTransitionEnd()&&t(this.tip).hasClass(p.FADE)?t(this.tip).one(r.TRANSITION_END,u).emulateTransitionEnd(a._TRANSITION_DURATION):u()}},a.prototype.hide=function(e){var n=this,i=this.getTipElement(),o=t.Event(this.constructor.Event.HIDE),s=function(){n._hoverState!==d.SHOW&&i.parentNode&&i.parentNode.removeChild(i),n._cleanTipClass(),n.element.removeAttribute("aria-describedby"),t(n.element).trigger(n.constructor.Event.HIDDEN),null!==n._popper&&n._popper.destroy(),e&&e()};t(this.element).trigger(o),o.isDefaultPrevented()||(t(i).removeClass(p.SHOW),"ontouchstart"in document.documentElement&&t("body").children().off("mouseover",null,t.noop),this._activeTrigger[g.CLICK]=!1,this._activeTrigger[g.FOCUS]=!1,this._activeTrigger[g.HOVER]=!1,r.supportsTransitionEnd()&&t(this.tip).hasClass(p.FADE)?t(i).one(r.TRANSITION_END,s).emulateTransitionEnd(150):s(),this._hoverState="")},a.prototype.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},a.prototype.isWithContent=function(){return Boolean(this.getTitle())},a.prototype.addAttachmentClass=function(e){t(this.getTipElement()).addClass("bs-tooltip-"+e)},a.prototype.getTipElement=function(){return this.tip=this.tip||t(this.config.template)[0]},a.prototype.setContent=function(){var e=t(this.getTipElement());this.setElementContent(e.find(_.TOOLTIP_INNER),this.getTitle()),e.removeClass(p.FADE+" "+p.SHOW)},a.prototype.setElementContent=function(e,n){var o=this.config.html;"object"===(void 0===n?"undefined":i(n))&&(n.nodeType||n.jquery)?o?t(n).parent().is(e)||e.empty().append(n):e.text(t(n).text()):e[o?"html":"text"](n)},a.prototype.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},a.prototype._getAttachment=function(t){return c[t.toUpperCase()]},a.prototype._setListeners=function(){var e=this;this.config.trigger.split(" ").forEach(function(n){if("click"===n)t(e.element).on(e.constructor.Event.CLICK,e.config.selector,function(t){return e.toggle(t)});else if(n!==g.MANUAL){var i=n===g.HOVER?e.constructor.Event.MOUSEENTER:e.constructor.Event.FOCUSIN,o=n===g.HOVER?e.constructor.Event.MOUSELEAVE:e.constructor.Event.FOCUSOUT;t(e.element).on(i,e.config.selector,function(t){return e._enter(t)}).on(o,e.config.selector,function(t){return e._leave(t)})}t(e.element).closest(".modal").on("hide.bs.modal",function(){return e.hide()})}),this.config.selector?this.config=t.extend({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},a.prototype._fixTitle=function(){var t=i(this.element.getAttribute("data-original-title"));(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},a.prototype._enter=function(e,n){var i=this.constructor.DATA_KEY;(n=n||t(e.currentTarget).data(i))||(n=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(i,n)),e&&(n._activeTrigger["focusin"===e.type?g.FOCUS:g.HOVER]=!0),t(n.getTipElement()).hasClass(p.SHOW)||n._hoverState===d.SHOW?n._hoverState=d.SHOW:(clearTimeout(n._timeout),n._hoverState=d.SHOW,n.config.delay&&n.config.delay.show?n._timeout=setTimeout(function(){n._hoverState===d.SHOW&&n.show()},n.config.delay.show):n.show())},a.prototype._leave=function(e,n){var i=this.constructor.DATA_KEY;(n=n||t(e.currentTarget).data(i))||(n=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(i,n)),e&&(n._activeTrigger["focusout"===e.type?g.FOCUS:g.HOVER]=!1),n._isWithActiveTrigger()||(clearTimeout(n._timeout),n._hoverState=d.OUT,n.config.delay&&n.config.delay.hide?n._timeout=setTimeout(function(){n._hoverState===d.OUT&&n.hide()},n.config.delay.hide):n.hide())},a.prototype._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},a.prototype._getConfig=function(n){return(n=t.extend({},this.constructor.Default,t(this.element).data(),n)).delay&&"number"==typeof n.delay&&(n.delay={show:n.delay,hide:n.delay}),n.title&&"number"==typeof n.title&&(n.title=n.title.toString()),n.content&&"number"==typeof n.content&&(n.content=n.content.toString()),r.typeCheckConfig(e,n,this.constructor.DefaultType),n},a.prototype._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},a.prototype._cleanTipClass=function(){var e=t(this.getTipElement()),n=e.attr("class").match(l);null!==n&&n.length>0&&e.removeClass(n.join(""))},a.prototype._handlePopperPlacementChange=function(t){this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},a.prototype._fixTransition=function(){var e=this.getTipElement(),n=this.config.animation;null===e.getAttribute("x-placement")&&(t(e).removeClass(p.FADE),this.config.animation=!1,this.hide(),this.show(),this.config.animation=n)},a._jQueryInterface=function(e){return this.each(function(){var n=t(this).data("bs.tooltip"),o="object"===(void 0===e?"undefined":i(e))&&e;if((n||!/dispose|hide/.test(e))&&(n||(n=new a(this,o),t(this).data("bs.tooltip",n)),"string"==typeof e)){if(void 0===n[e])throw new Error('No method named "'+e+'"');n[e]()}})},o(a,null,[{key:"VERSION",get:function(){return"4.0.0-beta"}},{key:"Default",get:function(){return u}},{key:"NAME",get:function(){return e}},{key:"DATA_KEY",get:function(){return"bs.tooltip"}},{key:"Event",get:function(){return f}},{key:"EVENT_KEY",get:function(){return s}},{key:"DefaultType",get:function(){return h}}]),a}();return t.fn[e]=m._jQueryInterface,t.fn[e].Constructor=m,t.fn[e].noConflict=function(){return t.fn[e]=a,m._jQueryInterface},m}(jQuery));!function(r){var a="popover",l=".bs.popover",h=r.fn[a],c=new RegExp("(^|\\s)bs-popover\\S+","g"),u=r.extend({},s.Default,{placement:"right",trigger:"click",content:"",template:''}),d=r.extend({},s.DefaultType,{content:"(string|element|function)"}),f={FADE:"fade",SHOW:"show"},p={TITLE:".popover-header",CONTENT:".popover-body"},_={HIDE:"hide"+l,HIDDEN:"hidden"+l,SHOW:"show"+l,SHOWN:"shown"+l,INSERTED:"inserted"+l,CLICK:"click"+l,FOCUSIN:"focusin"+l,FOCUSOUT:"focusout"+l,MOUSEENTER:"mouseenter"+l,MOUSELEAVE:"mouseleave"+l},g=function(s){function h(){return n(this,h),t(this,s.apply(this,arguments))}return e(h,s),h.prototype.isWithContent=function(){return this.getTitle()||this._getContent()},h.prototype.addAttachmentClass=function(t){r(this.getTipElement()).addClass("bs-popover-"+t)},h.prototype.getTipElement=function(){return this.tip=this.tip||r(this.config.template)[0]},h.prototype.setContent=function(){var t=r(this.getTipElement());this.setElementContent(t.find(p.TITLE),this.getTitle()),this.setElementContent(t.find(p.CONTENT),this._getContent()),t.removeClass(f.FADE+" "+f.SHOW)},h.prototype._getContent=function(){return this.element.getAttribute("data-content")||("function"==typeof this.config.content?this.config.content.call(this.element):this.config.content)},h.prototype._cleanTipClass=function(){var t=r(this.getTipElement()),e=t.attr("class").match(c);null!==e&&e.length>0&&t.removeClass(e.join(""))},h._jQueryInterface=function(t){return this.each(function(){var e=r(this).data("bs.popover"),n="object"===(void 0===t?"undefined":i(t))?t:null;if((e||!/destroy|hide/.test(t))&&(e||(e=new h(this,n),r(this).data("bs.popover",e)),"string"==typeof t)){if(void 0===e[t])throw new Error('No method named "'+t+'"');e[t]()}})},o(h,null,[{key:"VERSION",get:function(){return"4.0.0-beta"}},{key:"Default",get:function(){return u}},{key:"NAME",get:function(){return a}},{key:"DATA_KEY",get:function(){return"bs.popover"}},{key:"Event",get:function(){return _}},{key:"EVENT_KEY",get:function(){return l}},{key:"DefaultType",get:function(){return d}}]),h}(s);r.fn[a]=g._jQueryInterface,r.fn[a].Constructor=g,r.fn[a].noConflict=function(){return r.fn[a]=h,g._jQueryInterface}}(jQuery)}(); \ No newline at end of file diff --git a/Monitor/wwwroot/assets/js/custom.js b/Monitor/wwwroot/assets/js/custom.js new file mode 100644 index 0000000..4e7a0e7 --- /dev/null +++ b/Monitor/wwwroot/assets/js/custom.js @@ -0,0 +1,74 @@ +(function () { + + /** + * Decimal adjustment of a number. + * + * @param {String} type The type of adjustment. + * @param {Number} value The number. + * @param {Integer} exp The exponent (the 10 logarithm of the adjustment base). + * @returns {Number} The adjusted value. + */ + function decimalAdjust(type, value, exp) { + // If the exp is undefined or zero... + if (typeof exp === 'undefined' || +exp === 0) { + return Math[type](value); + } + value = +value; + exp = +exp; + // If the value is not a number or the exp is not an integer... + if (isNaN(value) || !(typeof exp === 'number' && exp % 1 === 0)) { + return NaN; + } + // Shift + value = value.toString().split('e'); + value = Math[type](+(value[0] + 'e' + (value[1] ? (+value[1] - exp) : -exp))); + // Shift back + value = value.toString().split('e'); + return +(value[0] + 'e' + (value[1] ? (+value[1] + exp) : exp)); + } + + // Decimal round + if (!Math.round10) { + Math.round10 = function (value, exp) { + return decimalAdjust('round', value, exp); + }; + } + // Decimal floor + if (!Math.floor10) { + Math.floor10 = function (value, exp) { + return decimalAdjust('floor', value, exp); + }; + } + // Decimal ceil + if (!Math.ceil10) { + Math.ceil10 = function (value, exp) { + return decimalAdjust('ceil', value, exp); + }; + } +})(); + +function isFloat(n) { + return Number(n) === n && n % 1 !== 0; +} + +$.fn.autocolor = function (isSawTableCell = false) { + return this.each(function (index) { + var element = $(this); + + if (isSawTableCell) { + element = $(".tablesaw-cell-content", this); + } + + var text = $(element).text().replace(/[^\d.,-]/g, ''); + var floatVal = parseFloat(text); + + element.removeClass('text-danger'); + element.removeClass('text-success'); + if (floatVal > 0) { + element.addClass('text-success'); + } else { + element.addClass('text-danger'); + } + }); + +}; \ No newline at end of file diff --git a/Monitor/wwwroot/assets/js/dca.js b/Monitor/wwwroot/assets/js/dca.js new file mode 100644 index 0000000..ec707b1 --- /dev/null +++ b/Monitor/wwwroot/assets/js/dca.js @@ -0,0 +1,146 @@ +$('.dca-input').on('input', function (e) { + var dcaMode = $('.btn-dca-mode.btn-dca-mode-active').data('dca-mode'); + + var totalCap = parseFloat($('#dca-capital').val()); + var pairs = parseFloat($('#dca-pairs').val()); + var dcaLevels = parseFloat($('#dca-levels').val()); + var maxCost = parseFloat($('#dca-max-cost').val()); + var maxCostType = $('#dca-max-cost-type').val(); + if (maxCostType == 2) { + maxCost = totalCap * maxCost / 100; + } + + var startPrice = maxCost; + for (var c = 0; c <= dcaLevels; c++) { + var initialBuyValue = parseFloat($('.dca-trigger-0').data('triggervalue')); + var totalDrop = initialBuyValue; + var lastAvgPrice = startPrice; + var lastBuyPrice = startPrice + var totalCoins = 1; + var costPerPairAdvanced = maxCost; + var triggerCount = 0; + + var lastPercentageValue = 0; + for (var t = 1; t <= c; t++) { + var triggerValue = parseFloat($('.dca-trigger-' + t).data('triggervalue')); + var percentageValue = parseFloat($('.dca-percentage-' + t).data('percentagevalue')); + if (isNaN(percentageValue)) { + percentageValue = lastPercentageValue; + } + + if (isNaN(triggerValue)) { + triggerValue = ""; + break; + } else { + triggerCount++; + lastBuyPrice = lastAvgPrice + (lastAvgPrice * triggerValue / 100); + var buyCoins = (totalCoins * percentageValue / 100); + var buyCost = buyCoins * lastBuyPrice; + + costPerPairAdvanced = costPerPairAdvanced + buyCost; + totalCoins = totalCoins + buyCoins; + + lastAvgPrice = costPerPairAdvanced / totalCoins; + + totalDrop = initialBuyValue - Math.round10((startPrice - lastBuyPrice) / startPrice * 100, -2); + + //console.log("DCA=" + c + " --- t=" + t + ", triggerValue=" + triggerValue + ", lastBuyPrice=" + lastBuyPrice + ", totalCostAdvanced=" + totalCostAdvanced + ", totalCoins=" + totalCoins); + } + + lastPercentageValue = percentageValue; + } + + $('.dca-drop-1-' + c).html(totalDrop.toFixed(2) + '%'); + + for (var r = 0; r <= $('#dca-maxpairs').val(); r++) { + getDCACost(maxCost, c, r, '.dca-' + r + '-' + c, dcaMode, triggerCount, costPerPairAdvanced); + } + } + + var costPerPair = Math.round10(getDCACostPerPairSimple(maxCost, dcaLevels), -8); + var totalCost = getDCACost(maxCost, dcaLevels, pairs, '', dcaMode, triggerCount, costPerPairAdvanced); + + if (dcaMode == "advanced") { + costPerPair = costPerPairAdvanced; + } + + var result = Math.round10(totalCap - totalCost, -8); + var resultPercent = Math.round10(result / totalCap * 100, -2); + + if (totalCap > 0 && (isFloat(result) || Number.isInteger(result))) { + $('#dca-cost-pair').html(costPerPair.toFixed(8)); + $('#dca-capital-needed').html(totalCost.toFixed(8)); + $('#dca-result').html(result.toFixed(8)); + $('#dca-result-percent').html(resultPercent + '%'); + + $('#dca-result,#dca-result-percent').removeClass('text-success'); + $('#dca-result,#dca-result-percent').removeClass('text-danger'); + if (result > 0) { + $('#dca-result,#dca-result-percent').addClass('text-success'); + } else { + $('#dca-result,#dca-result-percent').addClass('text-danger'); + } + + $('#dca-noresult').css('display', 'none'); + $('#dca-result-table').css('display', 'table'); + } +}); + +function getDCACostPerPairSimple(initialCost, dcaLevel) { + var result = initialCost; + + for (var t = 1; t <= dcaLevel; t++) { + var percentageValue = parseFloat($('.dca-percentage-' + t).data('percentagevalue')); + if (isNaN(percentageValue)) { + percentageValue = 100; + } + + var buyCost = (result * percentageValue / 100); + result = result + buyCost; + + //console.log("DCA=" + c + " --- t=" + t + ", triggerValue=" + triggerValue + ", lastBuyPrice=" + lastBuyPrice + ", totalCostAdvanced=" + totalCostAdvanced + ", totalCoins=" + totalCoins); + } + + return result; +} + +function getDCACost(maxCost, dcaLevel, pairs, container, dcaMode, triggerCount, costPerPairAdvanced) { + var costPerPairSimple = Math.round10(getDCACostPerPairSimple(maxCost, dcaLevel), -8); + var totalCostSimple = Math.round10(costPerPairSimple * pairs, -8); + var totalCostAdvanced = Math.round10(costPerPairAdvanced * pairs, -8); + var totalCapAvailable = parseFloat($('#dca-capital').val()); + var result = totalCostSimple; + + if (dcaMode == "advanced") { + result = totalCostAdvanced; + } + + if (isFloat(result) || Number.isInteger(result)) { + if (container != '') { + $(container + '-simp').html(totalCostSimple.toFixed(8)); + $(container + '-adv').html(costPerPairAdvanced.toFixed(8)); + + if (dcaMode == "advanced") { + if (dcaLevel > triggerCount) { + result = ""; + } + } + + if (result == "") { + $(container).html(result); + } else { + $(container).html(result.toFixed(8)); + } + + $(container).removeClass('text-success'); + $(container).removeClass('text-danger'); + if (result < totalCapAvailable) { + $(container).addClass('text-success'); + } else { + $(container).addClass('text-danger'); + } + } + } + + return result; +} \ No newline at end of file diff --git a/Monitor/wwwroot/assets/js/detect.js b/Monitor/wwwroot/assets/js/detect.js new file mode 100644 index 0000000..f86b2d6 --- /dev/null +++ b/Monitor/wwwroot/assets/js/detect.js @@ -0,0 +1,7 @@ +/** + * jQuery.browser.mobile (http://detectmobilebrowser.com/) + * + * jQuery.browser.mobile will be true if the browser is a mobile device + * + **/ +(function(a){(jQuery.browser=jQuery.browser||{}).mobile=/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4))})(navigator.userAgent||navigator.vendor||window.opera); \ No newline at end of file diff --git a/Monitor/wwwroot/assets/js/fastclick.js b/Monitor/wwwroot/assets/js/fastclick.js new file mode 100644 index 0000000..3af4f9d --- /dev/null +++ b/Monitor/wwwroot/assets/js/fastclick.js @@ -0,0 +1,841 @@ +;(function () { + 'use strict'; + + /** + * @preserve FastClick: polyfill to remove click delays on browsers with touch UIs. + * + * @codingstandard ftlabs-jsv2 + * @copyright The Financial Times Limited [All Rights Reserved] + * @license MIT License (see LICENSE.txt) + */ + + /*jslint browser:true, node:true*/ + /*global define, Event, Node*/ + + + /** + * Instantiate fast-clicking listeners on the specified layer. + * + * @constructor + * @param {Element} layer The layer to listen on + * @param {Object} [options={}] The options to override the defaults + */ + function FastClick(layer, options) { + var oldOnClick; + + options = options || {}; + + /** + * Whether a click is currently being tracked. + * + * @type boolean + */ + this.trackingClick = false; + + + /** + * Timestamp for when click tracking started. + * + * @type number + */ + this.trackingClickStart = 0; + + + /** + * The element being tracked for a click. + * + * @type EventTarget + */ + this.targetElement = null; + + + /** + * X-coordinate of touch start event. + * + * @type number + */ + this.touchStartX = 0; + + + /** + * Y-coordinate of touch start event. + * + * @type number + */ + this.touchStartY = 0; + + + /** + * ID of the last touch, retrieved from Touch.identifier. + * + * @type number + */ + this.lastTouchIdentifier = 0; + + + /** + * Touchmove boundary, beyond which a click will be cancelled. + * + * @type number + */ + this.touchBoundary = options.touchBoundary || 10; + + + /** + * The FastClick layer. + * + * @type Element + */ + this.layer = layer; + + /** + * The minimum time between tap(touchstart and touchend) events + * + * @type number + */ + this.tapDelay = options.tapDelay || 200; + + /** + * The maximum time for a tap + * + * @type number + */ + this.tapTimeout = options.tapTimeout || 700; + + if (FastClick.notNeeded(layer)) { + return; + } + + // Some old versions of Android don't have Function.prototype.bind + function bind(method, context) { + return function() { return method.apply(context, arguments); }; + } + + + var methods = ['onMouse', 'onClick', 'onTouchStart', 'onTouchMove', 'onTouchEnd', 'onTouchCancel']; + var context = this; + for (var i = 0, l = methods.length; i < l; i++) { + context[methods[i]] = bind(context[methods[i]], context); + } + + // Set up event handlers as required + if (deviceIsAndroid) { + layer.addEventListener('mouseover', this.onMouse, true); + layer.addEventListener('mousedown', this.onMouse, true); + layer.addEventListener('mouseup', this.onMouse, true); + } + + layer.addEventListener('click', this.onClick, true); + layer.addEventListener('touchstart', this.onTouchStart, false); + layer.addEventListener('touchmove', this.onTouchMove, false); + layer.addEventListener('touchend', this.onTouchEnd, false); + layer.addEventListener('touchcancel', this.onTouchCancel, false); + + // Hack is required for browsers that don't support Event#stopImmediatePropagation (e.g. Android 2) + // which is how FastClick normally stops click events bubbling to callbacks registered on the FastClick + // layer when they are cancelled. + if (!Event.prototype.stopImmediatePropagation) { + layer.removeEventListener = function(type, callback, capture) { + var rmv = Node.prototype.removeEventListener; + if (type === 'click') { + rmv.call(layer, type, callback.hijacked || callback, capture); + } else { + rmv.call(layer, type, callback, capture); + } + }; + + layer.addEventListener = function(type, callback, capture) { + var adv = Node.prototype.addEventListener; + if (type === 'click') { + adv.call(layer, type, callback.hijacked || (callback.hijacked = function(event) { + if (!event.propagationStopped) { + callback(event); + } + }), capture); + } else { + adv.call(layer, type, callback, capture); + } + }; + } + + // If a handler is already declared in the element's onclick attribute, it will be fired before + // FastClick's onClick handler. Fix this by pulling out the user-defined handler function and + // adding it as listener. + if (typeof layer.onclick === 'function') { + + // Android browser on at least 3.2 requires a new reference to the function in layer.onclick + // - the old one won't work if passed to addEventListener directly. + oldOnClick = layer.onclick; + layer.addEventListener('click', function(event) { + oldOnClick(event); + }, false); + layer.onclick = null; + } + } + + /** + * Windows Phone 8.1 fakes user agent string to look like Android and iPhone. + * + * @type boolean + */ + var deviceIsWindowsPhone = navigator.userAgent.indexOf("Windows Phone") >= 0; + + /** + * Android requires exceptions. + * + * @type boolean + */ + var deviceIsAndroid = navigator.userAgent.indexOf('Android') > 0 && !deviceIsWindowsPhone; + + + /** + * iOS requires exceptions. + * + * @type boolean + */ + var deviceIsIOS = /iP(ad|hone|od)/.test(navigator.userAgent) && !deviceIsWindowsPhone; + + + /** + * iOS 4 requires an exception for select elements. + * + * @type boolean + */ + var deviceIsIOS4 = deviceIsIOS && (/OS 4_\d(_\d)?/).test(navigator.userAgent); + + + /** + * iOS 6.0-7.* requires the target element to be manually derived + * + * @type boolean + */ + var deviceIsIOSWithBadTarget = deviceIsIOS && (/OS [6-7]_\d/).test(navigator.userAgent); + + /** + * BlackBerry requires exceptions. + * + * @type boolean + */ + var deviceIsBlackBerry10 = navigator.userAgent.indexOf('BB10') > 0; + + /** + * Determine whether a given element requires a native click. + * + * @param {EventTarget|Element} target Target DOM element + * @returns {boolean} Returns true if the element needs a native click + */ + FastClick.prototype.needsClick = function(target) { + switch (target.nodeName.toLowerCase()) { + + // Don't send a synthetic click to disabled inputs (issue #62) + case 'button': + case 'select': + case 'textarea': + if (target.disabled) { + return true; + } + + break; + case 'input': + + // File inputs need real clicks on iOS 6 due to a browser bug (issue #68) + if ((deviceIsIOS && target.type === 'file') || target.disabled) { + return true; + } + + break; + case 'label': + case 'iframe': // iOS8 homescreen apps can prevent events bubbling into frames + case 'video': + return true; + } + + return (/\bneedsclick\b/).test(target.className); + }; + + + /** + * Determine whether a given element requires a call to focus to simulate click into element. + * + * @param {EventTarget|Element} target Target DOM element + * @returns {boolean} Returns true if the element requires a call to focus to simulate native click. + */ + FastClick.prototype.needsFocus = function(target) { + switch (target.nodeName.toLowerCase()) { + case 'textarea': + return true; + case 'select': + return !deviceIsAndroid; + case 'input': + switch (target.type) { + case 'button': + case 'checkbox': + case 'file': + case 'image': + case 'radio': + case 'submit': + return false; + } + + // No point in attempting to focus disabled inputs + return !target.disabled && !target.readOnly; + default: + return (/\bneedsfocus\b/).test(target.className); + } + }; + + + /** + * Send a click event to the specified element. + * + * @param {EventTarget|Element} targetElement + * @param {Event} event + */ + FastClick.prototype.sendClick = function(targetElement, event) { + var clickEvent, touch; + + // On some Android devices activeElement needs to be blurred otherwise the synthetic click will have no effect (#24) + if (document.activeElement && document.activeElement !== targetElement) { + document.activeElement.blur(); + } + + touch = event.changedTouches[0]; + + // Synthesise a click event, with an extra attribute so it can be tracked + clickEvent = document.createEvent('MouseEvents'); + clickEvent.initMouseEvent(this.determineEventType(targetElement), true, true, window, 1, touch.screenX, touch.screenY, touch.clientX, touch.clientY, false, false, false, false, 0, null); + clickEvent.forwardedTouchEvent = true; + targetElement.dispatchEvent(clickEvent); + }; + + FastClick.prototype.determineEventType = function(targetElement) { + + //Issue #159: Android Chrome Select Box does not open with a synthetic click event + if (deviceIsAndroid && targetElement.tagName.toLowerCase() === 'select') { + return 'mousedown'; + } + + return 'click'; + }; + + + /** + * @param {EventTarget|Element} targetElement + */ + FastClick.prototype.focus = function(targetElement) { + var length; + + // Issue #160: on iOS 7, some input elements (e.g. date datetime month) throw a vague TypeError on setSelectionRange. These elements don't have an integer value for the selectionStart and selectionEnd properties, but unfortunately that can't be used for detection because accessing the properties also throws a TypeError. Just check the type instead. Filed as Apple bug #15122724. + if (deviceIsIOS && targetElement.setSelectionRange && targetElement.type.indexOf('date') !== 0 && targetElement.type !== 'time' && targetElement.type !== 'month') { + length = targetElement.value.length; + targetElement.setSelectionRange(length, length); + } else { + targetElement.focus(); + } + }; + + + /** + * Check whether the given target element is a child of a scrollable layer and if so, set a flag on it. + * + * @param {EventTarget|Element} targetElement + */ + FastClick.prototype.updateScrollParent = function(targetElement) { + var scrollParent, parentElement; + + scrollParent = targetElement.fastClickScrollParent; + + // Attempt to discover whether the target element is contained within a scrollable layer. Re-check if the + // target element was moved to another parent. + if (!scrollParent || !scrollParent.contains(targetElement)) { + parentElement = targetElement; + do { + if (parentElement.scrollHeight > parentElement.offsetHeight) { + scrollParent = parentElement; + targetElement.fastClickScrollParent = parentElement; + break; + } + + parentElement = parentElement.parentElement; + } while (parentElement); + } + + // Always update the scroll top tracker if possible. + if (scrollParent) { + scrollParent.fastClickLastScrollTop = scrollParent.scrollTop; + } + }; + + + /** + * @param {EventTarget} targetElement + * @returns {Element|EventTarget} + */ + FastClick.prototype.getTargetElementFromEventTarget = function(eventTarget) { + + // On some older browsers (notably Safari on iOS 4.1 - see issue #56) the event target may be a text node. + if (eventTarget.nodeType === Node.TEXT_NODE) { + return eventTarget.parentNode; + } + + return eventTarget; + }; + + + /** + * On touch start, record the position and scroll offset. + * + * @param {Event} event + * @returns {boolean} + */ + FastClick.prototype.onTouchStart = function(event) { + var targetElement, touch, selection; + + // Ignore multiple touches, otherwise pinch-to-zoom is prevented if both fingers are on the FastClick element (issue #111). + if (event.targetTouches.length > 1) { + return true; + } + + targetElement = this.getTargetElementFromEventTarget(event.target); + touch = event.targetTouches[0]; + + if (deviceIsIOS) { + + // Only trusted events will deselect text on iOS (issue #49) + selection = window.getSelection(); + if (selection.rangeCount && !selection.isCollapsed) { + return true; + } + + if (!deviceIsIOS4) { + + // Weird things happen on iOS when an alert or confirm dialog is opened from a click event callback (issue #23): + // when the user next taps anywhere else on the page, new touchstart and touchend events are dispatched + // with the same identifier as the touch event that previously triggered the click that triggered the alert. + // Sadly, there is an issue on iOS 4 that causes some normal touch events to have the same identifier as an + // immediately preceeding touch event (issue #52), so this fix is unavailable on that platform. + // Issue 120: touch.identifier is 0 when Chrome dev tools 'Emulate touch events' is set with an iOS device UA string, + // which causes all touch events to be ignored. As this block only applies to iOS, and iOS identifiers are always long, + // random integers, it's safe to to continue if the identifier is 0 here. + if (touch.identifier && touch.identifier === this.lastTouchIdentifier) { + event.preventDefault(); + return false; + } + + this.lastTouchIdentifier = touch.identifier; + + // If the target element is a child of a scrollable layer (using -webkit-overflow-scrolling: touch) and: + // 1) the user does a fling scroll on the scrollable layer + // 2) the user stops the fling scroll with another tap + // then the event.target of the last 'touchend' event will be the element that was under the user's finger + // when the fling scroll was started, causing FastClick to send a click event to that layer - unless a check + // is made to ensure that a parent layer was not scrolled before sending a synthetic click (issue #42). + this.updateScrollParent(targetElement); + } + } + + this.trackingClick = true; + this.trackingClickStart = event.timeStamp; + this.targetElement = targetElement; + + this.touchStartX = touch.pageX; + this.touchStartY = touch.pageY; + + // Prevent phantom clicks on fast double-tap (issue #36) + if ((event.timeStamp - this.lastClickTime) < this.tapDelay) { + event.preventDefault(); + } + + return true; + }; + + + /** + * Based on a touchmove event object, check whether the touch has moved past a boundary since it started. + * + * @param {Event} event + * @returns {boolean} + */ + FastClick.prototype.touchHasMoved = function(event) { + var touch = event.changedTouches[0], boundary = this.touchBoundary; + + if (Math.abs(touch.pageX - this.touchStartX) > boundary || Math.abs(touch.pageY - this.touchStartY) > boundary) { + return true; + } + + return false; + }; + + + /** + * Update the last position. + * + * @param {Event} event + * @returns {boolean} + */ + FastClick.prototype.onTouchMove = function(event) { + if (!this.trackingClick) { + return true; + } + + // If the touch has moved, cancel the click tracking + if (this.targetElement !== this.getTargetElementFromEventTarget(event.target) || this.touchHasMoved(event)) { + this.trackingClick = false; + this.targetElement = null; + } + + return true; + }; + + + /** + * Attempt to find the labelled control for the given label element. + * + * @param {EventTarget|HTMLLabelElement} labelElement + * @returns {Element|null} + */ + FastClick.prototype.findControl = function(labelElement) { + + // Fast path for newer browsers supporting the HTML5 control attribute + if (labelElement.control !== undefined) { + return labelElement.control; + } + + // All browsers under test that support touch events also support the HTML5 htmlFor attribute + if (labelElement.htmlFor) { + return document.getElementById(labelElement.htmlFor); + } + + // If no for attribute exists, attempt to retrieve the first labellable descendant element + // the list of which is defined here: http://www.w3.org/TR/html5/forms.html#category-label + return labelElement.querySelector('button, input:not([type=hidden]), keygen, meter, output, progress, select, textarea'); + }; + + + /** + * On touch end, determine whether to send a click event at once. + * + * @param {Event} event + * @returns {boolean} + */ + FastClick.prototype.onTouchEnd = function(event) { + var forElement, trackingClickStart, targetTagName, scrollParent, touch, targetElement = this.targetElement; + + if (!this.trackingClick) { + return true; + } + + // Prevent phantom clicks on fast double-tap (issue #36) + if ((event.timeStamp - this.lastClickTime) < this.tapDelay) { + this.cancelNextClick = true; + return true; + } + + if ((event.timeStamp - this.trackingClickStart) > this.tapTimeout) { + return true; + } + + // Reset to prevent wrong click cancel on input (issue #156). + this.cancelNextClick = false; + + this.lastClickTime = event.timeStamp; + + trackingClickStart = this.trackingClickStart; + this.trackingClick = false; + this.trackingClickStart = 0; + + // On some iOS devices, the targetElement supplied with the event is invalid if the layer + // is performing a transition or scroll, and has to be re-detected manually. Note that + // for this to function correctly, it must be called *after* the event target is checked! + // See issue #57; also filed as rdar://13048589 . + if (deviceIsIOSWithBadTarget) { + touch = event.changedTouches[0]; + + // In certain cases arguments of elementFromPoint can be negative, so prevent setting targetElement to null + targetElement = document.elementFromPoint(touch.pageX - window.pageXOffset, touch.pageY - window.pageYOffset) || targetElement; + targetElement.fastClickScrollParent = this.targetElement.fastClickScrollParent; + } + + targetTagName = targetElement.tagName.toLowerCase(); + if (targetTagName === 'label') { + forElement = this.findControl(targetElement); + if (forElement) { + this.focus(targetElement); + if (deviceIsAndroid) { + return false; + } + + targetElement = forElement; + } + } else if (this.needsFocus(targetElement)) { + + // Case 1: If the touch started a while ago (best guess is 100ms based on tests for issue #36) then focus will be triggered anyway. Return early and unset the target element reference so that the subsequent click will be allowed through. + // Case 2: Without this exception for input elements tapped when the document is contained in an iframe, then any inputted text won't be visible even though the value attribute is updated as the user types (issue #37). + if ((event.timeStamp - trackingClickStart) > 100 || (deviceIsIOS && window.top !== window && targetTagName === 'input')) { + this.targetElement = null; + return false; + } + + this.focus(targetElement); + this.sendClick(targetElement, event); + + // Select elements need the event to go through on iOS 4, otherwise the selector menu won't open. + // Also this breaks opening selects when VoiceOver is active on iOS6, iOS7 (and possibly others) + if (!deviceIsIOS || targetTagName !== 'select') { + this.targetElement = null; + event.preventDefault(); + } + + return false; + } + + if (deviceIsIOS && !deviceIsIOS4) { + + // Don't send a synthetic click event if the target element is contained within a parent layer that was scrolled + // and this tap is being used to stop the scrolling (usually initiated by a fling - issue #42). + scrollParent = targetElement.fastClickScrollParent; + if (scrollParent && scrollParent.fastClickLastScrollTop !== scrollParent.scrollTop) { + return true; + } + } + + // Prevent the actual click from going though - unless the target node is marked as requiring + // real clicks or if it is in the whitelist in which case only non-programmatic clicks are permitted. + if (!this.needsClick(targetElement)) { + event.preventDefault(); + this.sendClick(targetElement, event); + } + + return false; + }; + + + /** + * On touch cancel, stop tracking the click. + * + * @returns {void} + */ + FastClick.prototype.onTouchCancel = function() { + this.trackingClick = false; + this.targetElement = null; + }; + + + /** + * Determine mouse events which should be permitted. + * + * @param {Event} event + * @returns {boolean} + */ + FastClick.prototype.onMouse = function(event) { + + // If a target element was never set (because a touch event was never fired) allow the event + if (!this.targetElement) { + return true; + } + + if (event.forwardedTouchEvent) { + return true; + } + + // Programmatically generated events targeting a specific element should be permitted + if (!event.cancelable) { + return true; + } + + // Derive and check the target element to see whether the mouse event needs to be permitted; + // unless explicitly enabled, prevent non-touch click events from triggering actions, + // to prevent ghost/doubleclicks. + if (!this.needsClick(this.targetElement) || this.cancelNextClick) { + + // Prevent any user-added listeners declared on FastClick element from being fired. + if (event.stopImmediatePropagation) { + event.stopImmediatePropagation(); + } else { + + // Part of the hack for browsers that don't support Event#stopImmediatePropagation (e.g. Android 2) + event.propagationStopped = true; + } + + // Cancel the event + event.stopPropagation(); + event.preventDefault(); + + return false; + } + + // If the mouse event is permitted, return true for the action to go through. + return true; + }; + + + /** + * On actual clicks, determine whether this is a touch-generated click, a click action occurring + * naturally after a delay after a touch (which needs to be cancelled to avoid duplication), or + * an actual click which should be permitted. + * + * @param {Event} event + * @returns {boolean} + */ + FastClick.prototype.onClick = function(event) { + var permitted; + + // It's possible for another FastClick-like library delivered with third-party code to fire a click event before FastClick does (issue #44). In that case, set the click-tracking flag back to false and return early. This will cause onTouchEnd to return early. + if (this.trackingClick) { + this.targetElement = null; + this.trackingClick = false; + return true; + } + + // Very odd behaviour on iOS (issue #18): if a submit element is present inside a form and the user hits enter in the iOS simulator or clicks the Go button on the pop-up OS keyboard the a kind of 'fake' click event will be triggered with the submit-type input element as the target. + if (event.target.type === 'submit' && event.detail === 0) { + return true; + } + + permitted = this.onMouse(event); + + // Only unset targetElement if the click is not permitted. This will ensure that the check for !targetElement in onMouse fails and the browser's click doesn't go through. + if (!permitted) { + this.targetElement = null; + } + + // If clicks are permitted, return true for the action to go through. + return permitted; + }; + + + /** + * Remove all FastClick's event listeners. + * + * @returns {void} + */ + FastClick.prototype.destroy = function() { + var layer = this.layer; + + if (deviceIsAndroid) { + layer.removeEventListener('mouseover', this.onMouse, true); + layer.removeEventListener('mousedown', this.onMouse, true); + layer.removeEventListener('mouseup', this.onMouse, true); + } + + layer.removeEventListener('click', this.onClick, true); + layer.removeEventListener('touchstart', this.onTouchStart, false); + layer.removeEventListener('touchmove', this.onTouchMove, false); + layer.removeEventListener('touchend', this.onTouchEnd, false); + layer.removeEventListener('touchcancel', this.onTouchCancel, false); + }; + + + /** + * Check whether FastClick is needed. + * + * @param {Element} layer The layer to listen on + */ + FastClick.notNeeded = function(layer) { + var metaViewport; + var chromeVersion; + var blackberryVersion; + var firefoxVersion; + + // Devices that don't support touch don't need FastClick + if (typeof window.ontouchstart === 'undefined') { + return true; + } + + // Chrome version - zero for other browsers + chromeVersion = +(/Chrome\/([0-9]+)/.exec(navigator.userAgent) || [,0])[1]; + + if (chromeVersion) { + + if (deviceIsAndroid) { + metaViewport = document.querySelector('meta[name=viewport]'); + + if (metaViewport) { + // Chrome on Android with user-scalable="no" doesn't need FastClick (issue #89) + if (metaViewport.content.indexOf('user-scalable=no') !== -1) { + return true; + } + // Chrome 32 and above with width=device-width or less don't need FastClick + if (chromeVersion > 31 && document.documentElement.scrollWidth <= window.outerWidth) { + return true; + } + } + + // Chrome desktop doesn't need FastClick (issue #15) + } else { + return true; + } + } + + if (deviceIsBlackBerry10) { + blackberryVersion = navigator.userAgent.match(/Version\/([0-9]*)\.([0-9]*)/); + + // BlackBerry 10.3+ does not require Fastclick library. + // https://github.com/ftlabs/fastclick/issues/251 + if (blackberryVersion[1] >= 10 && blackberryVersion[2] >= 3) { + metaViewport = document.querySelector('meta[name=viewport]'); + + if (metaViewport) { + // user-scalable=no eliminates click delay. + if (metaViewport.content.indexOf('user-scalable=no') !== -1) { + return true; + } + // width=device-width (or less than device-width) eliminates click delay. + if (document.documentElement.scrollWidth <= window.outerWidth) { + return true; + } + } + } + } + + // IE10 with -ms-touch-action: none or manipulation, which disables double-tap-to-zoom (issue #97) + if (layer.style.msTouchAction === 'none' || layer.style.touchAction === 'manipulation') { + return true; + } + + // Firefox version - zero for other browsers + firefoxVersion = +(/Firefox\/([0-9]+)/.exec(navigator.userAgent) || [,0])[1]; + + if (firefoxVersion >= 27) { + // Firefox 27+ does not have tap delay if the content is not zoomable - https://bugzilla.mozilla.org/show_bug.cgi?id=922896 + + metaViewport = document.querySelector('meta[name=viewport]'); + if (metaViewport && (metaViewport.content.indexOf('user-scalable=no') !== -1 || document.documentElement.scrollWidth <= window.outerWidth)) { + return true; + } + } + + // IE11: prefixed -ms-touch-action is no longer supported and it's recomended to use non-prefixed version + // http://msdn.microsoft.com/en-us/library/windows/apps/Hh767313.aspx + if (layer.style.touchAction === 'none' || layer.style.touchAction === 'manipulation') { + return true; + } + + return false; + }; + + + /** + * Factory method for creating a FastClick object + * + * @param {Element} layer The layer to listen on + * @param {Object} [options={}] The options to override the defaults + */ + FastClick.attach = function(layer, options) { + return new FastClick(layer, options); + }; + + + if (typeof define === 'function' && typeof define.amd === 'object' && define.amd) { + + // AMD. Register as an anonymous module. + define(function() { + return FastClick; + }); + } else if (typeof module !== 'undefined' && module.exports) { + module.exports = FastClick.attach; + module.exports.FastClick = FastClick; + } else { + window.FastClick = FastClick; + } +}()); diff --git a/Monitor/wwwroot/assets/js/jquery.app.js b/Monitor/wwwroot/assets/js/jquery.app.js new file mode 100644 index 0000000..914a6d7 --- /dev/null +++ b/Monitor/wwwroot/assets/js/jquery.app.js @@ -0,0 +1,84 @@ +/** + * Theme: Adminox Admin Template + * Author: Coderthemes + * Module/App: Main Js + */ + + +(function ($) { + + 'use strict'; + + function initNavbar() { + + $('.navbar-toggle').on('click', function (event) { + $(this).toggleClass('open'); + $('#navigation').slideToggle(400); + }); + + $('.navigation-menu>li').slice(-2).addClass('last-elements'); + + $('.navigation-menu li.has-submenu a[href="#"]').on('click', function (e) { + if ($(window).width() < 992) { + e.preventDefault(); + $(this).parent('li').toggleClass('open').find('.submenu:first').toggleClass('open'); + } + }); + } + function initScrollbar() { + $('.slimscroll-noti').slimScroll({ + height: '230px', + position: 'right', + size: "5px", + color: '#98a6ad', + wheelStep: 10 + }); + $('.slimscroller').slimScroll({ + height: 'auto', + position: 'right', + size: "5px", + color: '#98a6ad' + }); + $('#todo-list').slimScroll({ + height: '280px', + color: '#98a6ad', + size: "5px" + }); + $('.conversation-list').slimScroll({ + height: '340px', + color: '#98a6ad', + size: "5px" + }); + $('.inbox-widget').slimScroll({ + height: '380px', + color: '#98a6ad', + size: "5px" + }); + $('.recent-activities').slimScroll({ + height: '355px', + color: '#98a6ad', + size: "5px" + }); + } + // === following js will activate the menu in left side bar based on url ==== + function initMenuItem() { + $(".navigation-menu a").each(function () { + if (this.href == window.location.href) { + $(this).parent().addClass("active"); // add active to li of the current link + $(this).parent().parent().parent().addClass("active"); // add active class to an anchor + $(this).parent().parent().parent().parent().parent().addClass("active"); // add active class to an anchor + } + }); + } + function init() { + initNavbar(); + initScrollbar(); + initMenuItem(); + } + + init(); + +})(jQuery); + + + diff --git a/Monitor/wwwroot/assets/js/jquery.blockUI.js b/Monitor/wwwroot/assets/js/jquery.blockUI.js new file mode 100644 index 0000000..90ce5d6 --- /dev/null +++ b/Monitor/wwwroot/assets/js/jquery.blockUI.js @@ -0,0 +1,620 @@ +/*! + * jQuery blockUI plugin + * Version 2.70.0-2014.11.23 + * Requires jQuery v1.7 or later + * + * Examples at: http://malsup.com/jquery/block/ + * Copyright (c) 2007-2013 M. Alsup + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + * + * Thanks to Amir-Hossein Sobhi for some excellent contributions! + */ + +;(function() { +/*jshint eqeqeq:false curly:false latedef:false */ +"use strict"; + + function setup($) { + $.fn._fadeIn = $.fn.fadeIn; + + var noOp = $.noop || function() {}; + + // this bit is to ensure we don't call setExpression when we shouldn't (with extra muscle to handle + // confusing userAgent strings on Vista) + var msie = /MSIE/.test(navigator.userAgent); + var ie6 = /MSIE 6.0/.test(navigator.userAgent) && ! /MSIE 8.0/.test(navigator.userAgent); + var mode = document.documentMode || 0; + var setExpr = $.isFunction( document.createElement('div').style.setExpression ); + + // global $ methods for blocking/unblocking the entire page + $.blockUI = function(opts) { install(window, opts); }; + $.unblockUI = function(opts) { remove(window, opts); }; + + // convenience method for quick growl-like notifications (http://www.google.com/search?q=growl) + $.growlUI = function(title, message, timeout, onClose) { + var $m = $('
'); + if (title) $m.append('

'+title+'

'); + if (message) $m.append('

'+message+'

'); + if (timeout === undefined) timeout = 3000; + + // Added by konapun: Set timeout to 30 seconds if this growl is moused over, like normal toast notifications + var callBlock = function(opts) { + opts = opts || {}; + + $.blockUI({ + message: $m, + fadeIn : typeof opts.fadeIn !== 'undefined' ? opts.fadeIn : 700, + fadeOut: typeof opts.fadeOut !== 'undefined' ? opts.fadeOut : 1000, + timeout: typeof opts.timeout !== 'undefined' ? opts.timeout : timeout, + centerY: false, + showOverlay: false, + onUnblock: onClose, + css: $.blockUI.defaults.growlCSS + }); + }; + + callBlock(); + var nonmousedOpacity = $m.css('opacity'); + $m.mouseover(function() { + callBlock({ + fadeIn: 0, + timeout: 30000 + }); + + var displayBlock = $('.blockMsg'); + displayBlock.stop(); // cancel fadeout if it has started + displayBlock.fadeTo(300, 1); // make it easier to read the message by removing transparency + }).mouseout(function() { + $('.blockMsg').fadeOut(1000); + }); + // End konapun additions + }; + + // plugin method for blocking element content + $.fn.block = function(opts) { + if ( this[0] === window ) { + $.blockUI( opts ); + return this; + } + var fullOpts = $.extend({}, $.blockUI.defaults, opts || {}); + this.each(function() { + var $el = $(this); + if (fullOpts.ignoreIfBlocked && $el.data('blockUI.isBlocked')) + return; + $el.unblock({ fadeOut: 0 }); + }); + + return this.each(function() { + if ($.css(this,'position') == 'static') { + this.style.position = 'relative'; + $(this).data('blockUI.static', true); + } + this.style.zoom = 1; // force 'hasLayout' in ie + install(this, opts); + }); + }; + + // plugin method for unblocking element content + $.fn.unblock = function(opts) { + if ( this[0] === window ) { + $.unblockUI( opts ); + return this; + } + return this.each(function() { + remove(this, opts); + }); + }; + + $.blockUI.version = 2.70; // 2nd generation blocking at no extra cost! + + // override these in your code to change the default behavior and style + $.blockUI.defaults = { + // message displayed when blocking (use null for no message) + message: '

Please wait...

', + + title: null, // title string; only used when theme == true + draggable: true, // only used when theme == true (requires jquery-ui.js to be loaded) + + theme: false, // set to true to use with jQuery UI themes + + // styles for the message when blocking; if you wish to disable + // these and use an external stylesheet then do this in your code: + // $.blockUI.defaults.css = {}; + css: { + padding: 0, + margin: 0, + width: '30%', + top: '40%', + left: '35%', + textAlign: 'center', + color: '#000', + border: '3px solid #aaa', + backgroundColor:'#fff', + cursor: 'wait' + }, + + // minimal style set used when themes are used + themedCSS: { + width: '30%', + top: '40%', + left: '35%' + }, + + // styles for the overlay + overlayCSS: { + backgroundColor: '#000', + opacity: 0.6, + cursor: 'wait' + }, + + // style to replace wait cursor before unblocking to correct issue + // of lingering wait cursor + cursorReset: 'default', + + // styles applied when using $.growlUI + growlCSS: { + width: '350px', + top: '10px', + left: '', + right: '10px', + border: 'none', + padding: '5px', + opacity: 0.6, + cursor: 'default', + color: '#fff', + backgroundColor: '#000', + '-webkit-border-radius':'10px', + '-moz-border-radius': '10px', + 'border-radius': '10px' + }, + + // IE issues: 'about:blank' fails on HTTPS and javascript:false is s-l-o-w + // (hat tip to Jorge H. N. de Vasconcelos) + /*jshint scripturl:true */ + iframeSrc: /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank', + + // force usage of iframe in non-IE browsers (handy for blocking applets) + forceIframe: false, + + // z-index for the blocking overlay + baseZ: 1000, + + // set these to true to have the message automatically centered + centerX: true, // <-- only effects element blocking (page block controlled via css above) + centerY: true, + + // allow body element to be stetched in ie6; this makes blocking look better + // on "short" pages. disable if you wish to prevent changes to the body height + allowBodyStretch: true, + + // enable if you want key and mouse events to be disabled for content that is blocked + bindEvents: true, + + // be default blockUI will supress tab navigation from leaving blocking content + // (if bindEvents is true) + constrainTabKey: true, + + // fadeIn time in millis; set to 0 to disable fadeIn on block + fadeIn: 200, + + // fadeOut time in millis; set to 0 to disable fadeOut on unblock + fadeOut: 400, + + // time in millis to wait before auto-unblocking; set to 0 to disable auto-unblock + timeout: 0, + + // disable if you don't want to show the overlay + showOverlay: true, + + // if true, focus will be placed in the first available input field when + // page blocking + focusInput: true, + + // elements that can receive focus + focusableElements: ':input:enabled:visible', + + // suppresses the use of overlay styles on FF/Linux (due to performance issues with opacity) + // no longer needed in 2012 + // applyPlatformOpacityRules: true, + + // callback method invoked when fadeIn has completed and blocking message is visible + onBlock: null, + + // callback method invoked when unblocking has completed; the callback is + // passed the element that has been unblocked (which is the window object for page + // blocks) and the options that were passed to the unblock call: + // onUnblock(element, options) + onUnblock: null, + + // callback method invoked when the overlay area is clicked. + // setting this will turn the cursor to a pointer, otherwise cursor defined in overlayCss will be used. + onOverlayClick: null, + + // don't ask; if you really must know: http://groups.google.com/group/jquery-en/browse_thread/thread/36640a8730503595/2f6a79a77a78e493#2f6a79a77a78e493 + quirksmodeOffsetHack: 4, + + // class name of the message block + blockMsgClass: 'blockMsg', + + // if it is already blocked, then ignore it (don't unblock and reblock) + ignoreIfBlocked: false + }; + + // private data and functions follow... + + var pageBlock = null; + var pageBlockEls = []; + + function install(el, opts) { + var css, themedCSS; + var full = (el == window); + var msg = (opts && opts.message !== undefined ? opts.message : undefined); + opts = $.extend({}, $.blockUI.defaults, opts || {}); + + if (opts.ignoreIfBlocked && $(el).data('blockUI.isBlocked')) + return; + + opts.overlayCSS = $.extend({}, $.blockUI.defaults.overlayCSS, opts.overlayCSS || {}); + css = $.extend({}, $.blockUI.defaults.css, opts.css || {}); + if (opts.onOverlayClick) + opts.overlayCSS.cursor = 'pointer'; + + themedCSS = $.extend({}, $.blockUI.defaults.themedCSS, opts.themedCSS || {}); + msg = msg === undefined ? opts.message : msg; + + // remove the current block (if there is one) + if (full && pageBlock) + remove(window, {fadeOut:0}); + + // if an existing element is being used as the blocking content then we capture + // its current place in the DOM (and current display style) so we can restore + // it when we unblock + if (msg && typeof msg != 'string' && (msg.parentNode || msg.jquery)) { + var node = msg.jquery ? msg[0] : msg; + var data = {}; + $(el).data('blockUI.history', data); + data.el = node; + data.parent = node.parentNode; + data.display = node.style.display; + data.position = node.style.position; + if (data.parent) + data.parent.removeChild(node); + } + + $(el).data('blockUI.onUnblock', opts.onUnblock); + var z = opts.baseZ; + + // blockUI uses 3 layers for blocking, for simplicity they are all used on every platform; + // layer1 is the iframe layer which is used to supress bleed through of underlying content + // layer2 is the overlay layer which has opacity and a wait cursor (by default) + // layer3 is the message content that is displayed while blocking + var lyr1, lyr2, lyr3, s; + if (msie || opts.forceIframe) + lyr1 = $(''); + else + lyr1 = $(''); + + if (opts.theme) + lyr2 = $(''); + else + lyr2 = $(''); + + if (opts.theme && full) { + s = ''; + } + else if (opts.theme) { + s = ''; + } + else if (full) { + s = ''; + } + else { + s = ''; + } + lyr3 = $(s); + + // if we have a message, style it + if (msg) { + if (opts.theme) { + lyr3.css(themedCSS); + lyr3.addClass('ui-widget-content'); + } + else + lyr3.css(css); + } + + // style the overlay + if (!opts.theme /*&& (!opts.applyPlatformOpacityRules)*/) + lyr2.css(opts.overlayCSS); + lyr2.css('position', full ? 'fixed' : 'absolute'); + + // make iframe layer transparent in IE + if (msie || opts.forceIframe) + lyr1.css('opacity',0.0); + + //$([lyr1[0],lyr2[0],lyr3[0]]).appendTo(full ? 'body' : el); + var layers = [lyr1,lyr2,lyr3], $par = full ? $('body') : $(el); + $.each(layers, function() { + this.appendTo($par); + }); + + if (opts.theme && opts.draggable && $.fn.draggable) { + lyr3.draggable({ + handle: '.ui-dialog-titlebar', + cancel: 'li' + }); + } + + // ie7 must use absolute positioning in quirks mode and to account for activex issues (when scrolling) + var expr = setExpr && (!$.support.boxModel || $('object,embed', full ? null : el).length > 0); + if (ie6 || expr) { + // give body 100% height + if (full && opts.allowBodyStretch && $.support.boxModel) + $('html,body').css('height','100%'); + + // fix ie6 issue when blocked element has a border width + if ((ie6 || !$.support.boxModel) && !full) { + var t = sz(el,'borderTopWidth'), l = sz(el,'borderLeftWidth'); + var fixT = t ? '(0 - '+t+')' : 0; + var fixL = l ? '(0 - '+l+')' : 0; + } + + // simulate fixed position + $.each(layers, function(i,o) { + var s = o[0].style; + s.position = 'absolute'; + if (i < 2) { + if (full) + s.setExpression('height','Math.max(document.body.scrollHeight, document.body.offsetHeight) - (jQuery.support.boxModel?0:'+opts.quirksmodeOffsetHack+') + "px"'); + else + s.setExpression('height','this.parentNode.offsetHeight + "px"'); + if (full) + s.setExpression('width','jQuery.support.boxModel && document.documentElement.clientWidth || document.body.clientWidth + "px"'); + else + s.setExpression('width','this.parentNode.offsetWidth + "px"'); + if (fixL) s.setExpression('left', fixL); + if (fixT) s.setExpression('top', fixT); + } + else if (opts.centerY) { + if (full) s.setExpression('top','(document.documentElement.clientHeight || document.body.clientHeight) / 2 - (this.offsetHeight / 2) + (blah = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + "px"'); + s.marginTop = 0; + } + else if (!opts.centerY && full) { + var top = (opts.css && opts.css.top) ? parseInt(opts.css.top, 10) : 0; + var expression = '((document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + '+top+') + "px"'; + s.setExpression('top',expression); + } + }); + } + + // show the message + if (msg) { + if (opts.theme) + lyr3.find('.ui-widget-content').append(msg); + else + lyr3.append(msg); + if (msg.jquery || msg.nodeType) + $(msg).show(); + } + + if ((msie || opts.forceIframe) && opts.showOverlay) + lyr1.show(); // opacity is zero + if (opts.fadeIn) { + var cb = opts.onBlock ? opts.onBlock : noOp; + var cb1 = (opts.showOverlay && !msg) ? cb : noOp; + var cb2 = msg ? cb : noOp; + if (opts.showOverlay) + lyr2._fadeIn(opts.fadeIn, cb1); + if (msg) + lyr3._fadeIn(opts.fadeIn, cb2); + } + else { + if (opts.showOverlay) + lyr2.show(); + if (msg) + lyr3.show(); + if (opts.onBlock) + opts.onBlock.bind(lyr3)(); + } + + // bind key and mouse events + bind(1, el, opts); + + if (full) { + pageBlock = lyr3[0]; + pageBlockEls = $(opts.focusableElements,pageBlock); + if (opts.focusInput) + setTimeout(focus, 20); + } + else + center(lyr3[0], opts.centerX, opts.centerY); + + if (opts.timeout) { + // auto-unblock + var to = setTimeout(function() { + if (full) + $.unblockUI(opts); + else + $(el).unblock(opts); + }, opts.timeout); + $(el).data('blockUI.timeout', to); + } + } + + // remove the block + function remove(el, opts) { + var count; + var full = (el == window); + var $el = $(el); + var data = $el.data('blockUI.history'); + var to = $el.data('blockUI.timeout'); + if (to) { + clearTimeout(to); + $el.removeData('blockUI.timeout'); + } + opts = $.extend({}, $.blockUI.defaults, opts || {}); + bind(0, el, opts); // unbind events + + if (opts.onUnblock === null) { + opts.onUnblock = $el.data('blockUI.onUnblock'); + $el.removeData('blockUI.onUnblock'); + } + + var els; + if (full) // crazy selector to handle odd field errors in ie6/7 + els = $('body').children().filter('.blockUI').add('body > .blockUI'); + else + els = $el.find('>.blockUI'); + + // fix cursor issue + if ( opts.cursorReset ) { + if ( els.length > 1 ) + els[1].style.cursor = opts.cursorReset; + if ( els.length > 2 ) + els[2].style.cursor = opts.cursorReset; + } + + if (full) + pageBlock = pageBlockEls = null; + + if (opts.fadeOut) { + count = els.length; + els.stop().fadeOut(opts.fadeOut, function() { + if ( --count === 0) + reset(els,data,opts,el); + }); + } + else + reset(els, data, opts, el); + } + + // move blocking element back into the DOM where it started + function reset(els,data,opts,el) { + var $el = $(el); + if ( $el.data('blockUI.isBlocked') ) + return; + + els.each(function(i,o) { + // remove via DOM calls so we don't lose event handlers + if (this.parentNode) + this.parentNode.removeChild(this); + }); + + if (data && data.el) { + data.el.style.display = data.display; + data.el.style.position = data.position; + data.el.style.cursor = 'default'; // #59 + if (data.parent) + data.parent.appendChild(data.el); + $el.removeData('blockUI.history'); + } + + if ($el.data('blockUI.static')) { + $el.css('position', 'static'); // #22 + } + + if (typeof opts.onUnblock == 'function') + opts.onUnblock(el,opts); + + // fix issue in Safari 6 where block artifacts remain until reflow + var body = $(document.body), w = body.width(), cssW = body[0].style.width; + body.width(w-1).width(w); + body[0].style.width = cssW; + } + + // bind/unbind the handler + function bind(b, el, opts) { + var full = el == window, $el = $(el); + + // don't bother unbinding if there is nothing to unbind + if (!b && (full && !pageBlock || !full && !$el.data('blockUI.isBlocked'))) + return; + + $el.data('blockUI.isBlocked', b); + + // don't bind events when overlay is not in use or if bindEvents is false + if (!full || !opts.bindEvents || (b && !opts.showOverlay)) + return; + + // bind anchors and inputs for mouse and key events + var events = 'mousedown mouseup keydown keypress keyup touchstart touchend touchmove'; + if (b) + $(document).bind(events, opts, handler); + else + $(document).unbind(events, handler); + + // former impl... + // var $e = $('a,:input'); + // b ? $e.bind(events, opts, handler) : $e.unbind(events, handler); + } + + // event handler to suppress keyboard/mouse events when blocking + function handler(e) { + // allow tab navigation (conditionally) + if (e.type === 'keydown' && e.keyCode && e.keyCode == 9) { + if (pageBlock && e.data.constrainTabKey) { + var els = pageBlockEls; + var fwd = !e.shiftKey && e.target === els[els.length-1]; + var back = e.shiftKey && e.target === els[0]; + if (fwd || back) { + setTimeout(function(){focus(back);},10); + return false; + } + } + } + var opts = e.data; + var target = $(e.target); + if (target.hasClass('blockOverlay') && opts.onOverlayClick) + opts.onOverlayClick(e); + + // allow events within the message content + if (target.parents('div.' + opts.blockMsgClass).length > 0) + return true; + + // allow events for content that is not being blocked + return target.parents().children().filter('div.blockUI').length === 0; + } + + function focus(back) { + if (!pageBlockEls) + return; + var e = pageBlockEls[back===true ? pageBlockEls.length-1 : 0]; + if (e) + e.focus(); + } + + function center(el, x, y) { + var p = el.parentNode, s = el.style; + var l = ((p.offsetWidth - el.offsetWidth)/2) - sz(p,'borderLeftWidth'); + var t = ((p.offsetHeight - el.offsetHeight)/2) - sz(p,'borderTopWidth'); + if (x) s.left = l > 0 ? (l+'px') : '0'; + if (y) s.top = t > 0 ? (t+'px') : '0'; + } + + function sz(el, p) { + return parseInt($.css(el,p),10)||0; + } + + } + + + /*global define:true */ + if (typeof define === 'function' && define.amd && define.amd.jQuery) { + define(['jquery'], setup); + } else { + setup(jQuery); + } + +})(); diff --git a/Monitor/wwwroot/assets/js/jquery.core.js b/Monitor/wwwroot/assets/js/jquery.core.js new file mode 100644 index 0000000..e1f67bb --- /dev/null +++ b/Monitor/wwwroot/assets/js/jquery.core.js @@ -0,0 +1,323 @@ +//portlets +!function($) { + "use strict"; + + /** + Portlet Widget + */ + var Portlet = function() { + this.$body = $("body"), + this.$portletIdentifier = ".portlet", + this.$portletCloser = '.portlet a[data-toggle="remove"]', + this.$portletRefresher = '.portlet a[data-toggle="reload"]' + }; + + //on init + Portlet.prototype.init = function() { + // Panel closest + var $this = this; + $(document).on("click",this.$portletCloser, function (ev) { + ev.preventDefault(); + var $portlet = $(this).closest($this.$portletIdentifier); + var $portlet_parent = $portlet.parent(); + $portlet.remove(); + if ($portlet_parent.children().length == 0) { + $portlet_parent.remove(); + } + }); + + // Panel Reload + $(document).on("click",this.$portletRefresher, function (ev) { + ev.preventDefault(); + var $portlet = $(this).closest($this.$portletIdentifier); + // This is just a simulation, nothing is going to be reloaded + $portlet.append('
'); + var $pd = $portlet.find('.panel-disabled'); + setTimeout(function () { + $pd.fadeOut('fast', function () { + $pd.remove(); + }); + }, 500 + 300 * (Math.random() * 5)); + }); + }, + // + $.Portlet = new Portlet, $.Portlet.Constructor = Portlet + +}(window.jQuery), + +/** + * Notifications + */ +function($) { + "use strict"; + + var Notification = function() {}; + + //simple notificaiton + Notification.prototype.notify = function(style,position, title, text) { + var icon = 'fa fa-adjust'; + if(style == "error"){ + icon = "fa fa-exclamation"; + }else if(style == "warning"){ + icon = "fa fa-warning"; + }else if(style == "success"){ + icon = "fa fa-check"; + }else if(style == "custom"){ + icon = "md md-album"; + }else if(style == "info"){ + icon = "fa fa-question"; + }else{ + icon = "fa fa-adjust"; + } + $.notify({ + title: title, + text: text, + image: "" + }, { + style: 'metro', + className: style, + globalPosition:position, + showAnimation: "show", + showDuration: 0, + hideDuration: 0, + autoHide: true, + clickToHide: true + }); + }, + + //auto hide notification + Notification.prototype.autoHideNotify = function (style,position, title, text) { + var icon = "fa fa-adjust"; + if(style == "error"){ + icon = "fa fa-exclamation"; + }else if(style == "warning"){ + icon = "fa fa-warning"; + }else if(style == "success"){ + icon = "fa fa-check"; + }else if(style == "custom"){ + icon = "md md-album"; + }else if(style == "info"){ + icon = "fa fa-question"; + }else{ + icon = "fa fa-adjust"; + } + $.notify({ + title: title, + text: text, + image: "" + }, { + style: 'metro', + className: style, + globalPosition:position, + showAnimation: "show", + showDuration: 0, + hideDuration: 0, + autoHideDelay: 5000, + autoHide: true, + clickToHide: true + }); + }, + //confirmation notification + Notification.prototype.confirm = function(style,position, title) { + var icon = "fa fa-adjust"; + if(style == "error"){ + icon = "fa fa-exclamation"; + }else if(style == "warning"){ + icon = "fa fa-warning"; + }else if(style == "success"){ + icon = "fa fa-check"; + }else if(style == "custom"){ + icon = "md md-album"; + }else if(style == "info"){ + icon = "fa fa-question"; + }else{ + icon = "fa fa-adjust"; + } + $.notify({ + title: title, + text: 'Are you sure you want to do nothing?

Yes No', + image: "" + }, { + style: 'metro', + className: style, + globalPosition:position, + showAnimation: "show", + showDuration: 0, + hideDuration: 0, + autoHide: false, + clickToHide: false + }); + //listen for click events from this style + $(document).on('click', '.notifyjs-metro-base .no', function() { + //programmatically trigger propogating hide event + $(this).trigger('notify-hide'); + }); + $(document).on('click', '.notifyjs-metro-base .yes', function() { + //show button text + alert($(this).text() + " clicked!"); + //hide notification + $(this).trigger('notify-hide'); + }); + }, + //init - examples + Notification.prototype.init = function() { + + }, + //init + $.Notification = new Notification, $.Notification.Constructor = Notification +}(window.jQuery), + +/** + * Components + */ +function($) { + "use strict"; + + var Components = function() {}; + + //initializing tooltip + Components.prototype.initTooltipPlugin = function() { + $.fn.tooltip && $('[data-toggle="tooltip"]').tooltip() + }, + + //initializing popover + Components.prototype.initPopoverPlugin = function() { + $.fn.popover && $('[data-toggle="popover"]').popover() + }, + + //initializing custom modal + Components.prototype.initCustomModalPlugin = function() { + $('[data-plugin="custommodal"]').on('click', function(e) { + Custombox.open({ + target: $(this).attr("href"), + effect: $(this).attr("data-animation"), + overlaySpeed: $(this).attr("data-overlaySpeed"), + overlayColor: $(this).attr("data-overlayColor") + }); + e.preventDefault(); + }); + }, + + //initializing nicescroll + Components.prototype.initNiceScrollPlugin = function() { + //You can change the color of scroll bar here + $.fn.niceScroll && $(".nicescroll").niceScroll({ cursorcolor: '#98a6ad',cursorwidth:'6px', cursorborderradius: '5px'}); + }, + + //initializing Slimscroll + Components.prototype.initSlimScrollPlugin = function() { + //You can change the color of scroll bar here + $.fn.niceScroll && $(".slimscroll-noti").slimScroll({ position: 'right',size: "5px", color: '#98a6ad',height: '230px',wheelStep: 10}); + }, + + //range slider + Components.prototype.initRangeSlider = function() { + $.fn.slider && $('[data-plugin="range-slider"]').slider({}); + }, + + /* ------------- + * Form related controls + */ + //switch + Components.prototype.initSwitchery = function() { + $('[data-plugin="switchery"]').each(function (idx, obj) { + new Switchery($(this)[0], $(this).data()); + }); + }, + //multiselect + Components.prototype.initMultiSelect = function() { + if($('[data-plugin="multiselect"]').length > 0) + $('[data-plugin="multiselect"]').multiSelect($(this).data()); + }, + + /* ------------- + * small charts related widgets + */ + //peity charts + Components.prototype.initPeityCharts = function() { + $('[data-plugin="peity-pie"]').each(function(idx, obj) { + var colors = $(this).attr('data-colors')?$(this).attr('data-colors').split(","):[]; + var width = $(this).attr('data-width')?$(this).attr('data-width'):20; //default is 20 + var height = $(this).attr('data-height')?$(this).attr('data-height'):20; //default is 20 + $(this).peity("pie", { + fill: colors, + width: width, + height: height + }); + }); + //donut + $('[data-plugin="peity-donut"]').each(function(idx, obj) { + var colors = $(this).attr('data-colors')?$(this).attr('data-colors').split(","):[]; + var width = $(this).attr('data-width')?$(this).attr('data-width'):20; //default is 20 + var height = $(this).attr('data-height')?$(this).attr('data-height'):20; //default is 20 + $(this).peity("donut", { + fill: colors, + width: width, + height: height + }); + }); + + $('[data-plugin="peity-donut-alt"]').each(function(idx, obj) { + $(this).peity("donut"); + }); + + // line + $('[data-plugin="peity-line"]').each(function(idx, obj) { + $(this).peity("line", $(this).data()); + }); + + // bar + $('[data-plugin="peity-bar"]').each(function(idx, obj) { + var colors = $(this).attr('data-colors')?$(this).attr('data-colors').split(","):[]; + var width = $(this).attr('data-width')?$(this).attr('data-width'):20; //default is 20 + var height = $(this).attr('data-height')?$(this).attr('data-height'):20; //default is 20 + $(this).peity("bar", { + fill: colors, + width: width, + height: height + }); + }); + }, + + Components.prototype.initCounterUp = function() { + var delay = $(this).attr('data-delay')?$(this).attr('data-delay'):100; //default is 100 + var time = $(this).attr('data-time')?$(this).attr('data-time'):1200; //default is 1200 + $('[data-plugin="counterup"]').each(function(idx, obj) { + $(this).counterUp({ + delay: 100, + time: 1200 + }); + }); + }, + + + + //initilizing + Components.prototype.init = function() { + var $this = this; + this.initTooltipPlugin(), + this.initPopoverPlugin(), + this.initNiceScrollPlugin(), + this.initSlimScrollPlugin(), + this.initCustomModalPlugin(), + this.initRangeSlider(), + this.initSwitchery(), + this.initMultiSelect(), + this.initPeityCharts(), + this.initCounterUp(), + //creating portles + $.Portlet.init(); + }, + + $.Components = new Components, $.Components.Constructor = Components + +}(window.jQuery), + //initializing main application module +function($) { + "use strict"; + $.Components.init(); +}(window.jQuery); + + + + diff --git a/Monitor/wwwroot/assets/js/jquery.min.js b/Monitor/wwwroot/assets/js/jquery.min.js new file mode 100644 index 0000000..4c5be4c --- /dev/null +++ b/Monitor/wwwroot/assets/js/jquery.min.js @@ -0,0 +1,4 @@ +/*! jQuery v3.1.1 | (c) jQuery Foundation | jquery.org/license */ +!function(a,b){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){"use strict";var c=[],d=a.document,e=Object.getPrototypeOf,f=c.slice,g=c.concat,h=c.push,i=c.indexOf,j={},k=j.toString,l=j.hasOwnProperty,m=l.toString,n=m.call(Object),o={};function p(a,b){b=b||d;var c=b.createElement("script");c.text=a,b.head.appendChild(c).parentNode.removeChild(c)}var q="3.1.1",r=function(a,b){return new r.fn.init(a,b)},s=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,t=/^-ms-/,u=/-([a-z])/g,v=function(a,b){return b.toUpperCase()};r.fn=r.prototype={jquery:q,constructor:r,length:0,toArray:function(){return f.call(this)},get:function(a){return null==a?f.call(this):a<0?this[a+this.length]:this[a]},pushStack:function(a){var b=r.merge(this.constructor(),a);return b.prevObject=this,b},each:function(a){return r.each(this,a)},map:function(a){return this.pushStack(r.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(f.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(a<0?b:0);return this.pushStack(c>=0&&c0&&b-1 in a)}var x=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;c+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ca=function(a,b){return b?"\0"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0&&("form"in a||"label"in a)},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"form"in b?b.parentNode&&b.disabled===!1?"label"in b?"label"in b.parentNode?b.parentNode.disabled===a:b.disabled===a:b.isDisabled===a||b.isDisabled!==!a&&ea(b)===a:b.disabled===a:"label"in b&&b.disabled===a}}function pa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!!b&&"HTML"!==b.nodeName},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}}):(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c,d,e,f=b.getElementById(a);if(f){if(c=f.getAttributeNode("id"),c&&c.value===a)return[f];e=b.getElementsByName(a),d=0;while(f=e[d++])if(c=f.getAttributeNode("id"),c&&c.value===a)return[f]}return[]}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){if("undefined"!=typeof b.getElementsByClassName&&p)return b.getElementsByClassName(a)},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(_,aa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:!b||(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(O," ")+" ").indexOf(c)>-1:"|="===b&&(e===c||e.slice(0,c.length+1)===c+"-"))}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:oa(!1),disabled:oa(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[c<0?c+b:c]}),even:pa(function(a,b){for(var c=0;c=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=c<0?c+b:c;++d1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function va(a,b,c){for(var d=0,e=b.length;d-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];i1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,i0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,c,e){var f,i,j,k,l,m="function"==typeof a&&a,n=!e&&g(a=m.selector||a);if(c=c||[],1===n.length){if(i=n[0]=n[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&9===b.nodeType&&p&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(_,aa),b)||[])[0],!b)return c;m&&(b=b.parentNode),a=a.slice(i.shift().value.length)}f=V.needsContext.test(a)?0:i.length;while(f--){if(j=i[f],d.relative[k=j.type])break;if((l=d.find[k])&&(e=l(j.matches[0].replace(_,aa),$.test(i[0].type)&&qa(b.parentNode)||b))){if(i.splice(f,1),a=e.length&&sa(i),!a)return G.apply(c,e),c;break}}}return(m||h(a,n))(e,b,!p,c,!b||$.test(a)&&qa(b.parentNode)||b),c},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){if(!c)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){if(!c&&"input"===a.nodeName.toLowerCase())return a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;if(!c)return a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);r.find=x,r.expr=x.selectors,r.expr[":"]=r.expr.pseudos,r.uniqueSort=r.unique=x.uniqueSort,r.text=x.getText,r.isXMLDoc=x.isXML,r.contains=x.contains,r.escapeSelector=x.escape;var y=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&r(a).is(c))break;d.push(a)}return d},z=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},A=r.expr.match.needsContext,B=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,C=/^.[^:#\[\.,]*$/;function D(a,b,c){return r.isFunction(b)?r.grep(a,function(a,d){return!!b.call(a,d,a)!==c}):b.nodeType?r.grep(a,function(a){return a===b!==c}):"string"!=typeof b?r.grep(a,function(a){return i.call(b,a)>-1!==c}):C.test(b)?r.filter(b,a,c):(b=r.filter(b,a),r.grep(a,function(a){return i.call(b,a)>-1!==c&&1===a.nodeType}))}r.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?r.find.matchesSelector(d,a)?[d]:[]:r.find.matches(a,r.grep(b,function(a){return 1===a.nodeType}))},r.fn.extend({find:function(a){var b,c,d=this.length,e=this;if("string"!=typeof a)return this.pushStack(r(a).filter(function(){for(b=0;b1?r.uniqueSort(c):c},filter:function(a){return this.pushStack(D(this,a||[],!1))},not:function(a){return this.pushStack(D(this,a||[],!0))},is:function(a){return!!D(this,"string"==typeof a&&A.test(a)?r(a):a||[],!1).length}});var E,F=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,G=r.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||E,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:F.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof r?b[0]:b,r.merge(this,r.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),B.test(e[1])&&r.isPlainObject(b))for(e in b)r.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&(this[0]=f,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):r.isFunction(a)?void 0!==c.ready?c.ready(a):a(r):r.makeArray(a,this)};G.prototype=r.fn,E=r(d);var H=/^(?:parents|prev(?:Until|All))/,I={children:!0,contents:!0,next:!0,prev:!0};r.fn.extend({has:function(a){var b=r(a,this),c=b.length;return this.filter(function(){for(var a=0;a-1:1===c.nodeType&&r.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?r.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?i.call(r(a),this[0]):i.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(r.uniqueSort(r.merge(this.get(),r(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function J(a,b){while((a=a[b])&&1!==a.nodeType);return a}r.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return y(a,"parentNode")},parentsUntil:function(a,b,c){return y(a,"parentNode",c)},next:function(a){return J(a,"nextSibling")},prev:function(a){return J(a,"previousSibling")},nextAll:function(a){return y(a,"nextSibling")},prevAll:function(a){return y(a,"previousSibling")},nextUntil:function(a,b,c){return y(a,"nextSibling",c)},prevUntil:function(a,b,c){return y(a,"previousSibling",c)},siblings:function(a){return z((a.parentNode||{}).firstChild,a)},children:function(a){return z(a.firstChild)},contents:function(a){return a.contentDocument||r.merge([],a.childNodes)}},function(a,b){r.fn[a]=function(c,d){var e=r.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=r.filter(d,e)),this.length>1&&(I[a]||r.uniqueSort(e),H.test(a)&&e.reverse()),this.pushStack(e)}});var K=/[^\x20\t\r\n\f]+/g;function L(a){var b={};return r.each(a.match(K)||[],function(a,c){b[c]=!0}),b}r.Callbacks=function(a){a="string"==typeof a?L(a):r.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h-1)f.splice(c,1),c<=h&&h--}),this},has:function(a){return a?r.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||b||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j};function M(a){return a}function N(a){throw a}function O(a,b,c){var d;try{a&&r.isFunction(d=a.promise)?d.call(a).done(b).fail(c):a&&r.isFunction(d=a.then)?d.call(a,b,c):b.call(void 0,a)}catch(a){c.call(void 0,a)}}r.extend({Deferred:function(b){var c=[["notify","progress",r.Callbacks("memory"),r.Callbacks("memory"),2],["resolve","done",r.Callbacks("once memory"),r.Callbacks("once memory"),0,"resolved"],["reject","fail",r.Callbacks("once memory"),r.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},"catch":function(a){return e.then(null,a)},pipe:function(){var a=arguments;return r.Deferred(function(b){r.each(c,function(c,d){var e=r.isFunction(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=e&&e.apply(this,arguments);a&&r.isFunction(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){var f=0;function g(b,c,d,e){return function(){var h=this,i=arguments,j=function(){var a,j;if(!(b=f&&(d!==N&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?k():(r.Deferred.getStackHook&&(k.stackTrace=r.Deferred.getStackHook()),a.setTimeout(k))}}return r.Deferred(function(a){c[0][3].add(g(0,a,r.isFunction(e)?e:M,a.notifyWith)),c[1][3].add(g(0,a,r.isFunction(b)?b:M)),c[2][3].add(g(0,a,r.isFunction(d)?d:N))}).promise()},promise:function(a){return null!=a?r.extend(a,e):e}},f={};return r.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[0][2].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?void 0:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array(c),e=f.call(arguments),g=r.Deferred(),h=function(a){return function(c){d[a]=this,e[a]=arguments.length>1?f.call(arguments):c,--b||g.resolveWith(d,e)}};if(b<=1&&(O(a,g.done(h(c)).resolve,g.reject),"pending"===g.state()||r.isFunction(e[c]&&e[c].then)))return g.then();while(c--)O(e[c],h(c),g.reject);return g.promise()}});var P=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;r.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&P.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,b.stack,c)},r.readyException=function(b){a.setTimeout(function(){throw b})};var Q=r.Deferred();r.fn.ready=function(a){return Q.then(a)["catch"](function(a){r.readyException(a)}),this},r.extend({isReady:!1,readyWait:1,holdReady:function(a){a?r.readyWait++:r.ready(!0)},ready:function(a){(a===!0?--r.readyWait:r.isReady)||(r.isReady=!0,a!==!0&&--r.readyWait>0||Q.resolveWith(d,[r]))}}),r.ready.then=Q.then;function R(){d.removeEventListener("DOMContentLoaded",R), +a.removeEventListener("load",R),r.ready()}"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(r.ready):(d.addEventListener("DOMContentLoaded",R),a.addEventListener("load",R));var S=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===r.type(c)){e=!0;for(h in c)S(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,r.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(r(a),c)})),b))for(;h1,null,!0)},removeData:function(a){return this.each(function(){W.remove(this,a)})}}),r.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=V.get(a,b),c&&(!d||r.isArray(c)?d=V.access(a,b,r.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=r.queue(a,b),d=c.length,e=c.shift(),f=r._queueHooks(a,b),g=function(){r.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return V.get(a,c)||V.access(a,c,{empty:r.Callbacks("once memory").add(function(){V.remove(a,[b+"queue",c])})})}}),r.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length\x20\t\r\n\f]+)/i,ka=/^$|\/(?:java|ecma)script/i,la={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};la.optgroup=la.option,la.tbody=la.tfoot=la.colgroup=la.caption=la.thead,la.th=la.td;function ma(a,b){var c;return c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[],void 0===b||b&&r.nodeName(a,b)?r.merge([a],c):c}function na(a,b){for(var c=0,d=a.length;c-1)e&&e.push(f);else if(j=r.contains(f.ownerDocument,f),g=ma(l.appendChild(f),"script"),j&&na(g),c){k=0;while(f=g[k++])ka.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),o.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="",o.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var qa=d.documentElement,ra=/^key/,sa=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,ta=/^([^.]*)(?:\.(.+)|)/;function ua(){return!0}function va(){return!1}function wa(){try{return d.activeElement}catch(a){}}function xa(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)xa(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=va;else if(!e)return a;return 1===f&&(g=e,e=function(a){return r().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=r.guid++)),a.each(function(){r.event.add(this,b,e,d,c)})}r.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=V.get(a);if(q){c.handler&&(f=c,c=f.handler,e=f.selector),e&&r.find.matchesSelector(qa,e),c.guid||(c.guid=r.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(K)||[""],j=b.length;while(j--)h=ta.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=r.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=r.event.special[n]||{},k=r.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&r.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),r.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=V.hasData(a)&&V.get(a);if(q&&(i=q.events)){b=(b||"").match(K)||[""],j=b.length;while(j--)if(h=ta.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){l=r.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||r.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)r.event.remove(a,n+b[j],c,d,!0);r.isEmptyObject(i)&&V.remove(a,"handle events")}},dispatch:function(a){var b=r.event.fix(a),c,d,e,f,g,h,i=new Array(arguments.length),j=(V.get(this,"events")||{})[b.type]||[],k=r.event.special[b.type]||{};for(i[0]=b,c=1;c=1))for(;j!==this;j=j.parentNode||this)if(1===j.nodeType&&("click"!==a.type||j.disabled!==!0)){for(f=[],g={},c=0;c-1:r.find(e,this,null,[j]).length),g[e]&&f.push(d);f.length&&h.push({elem:j,handlers:f})}return j=this,i\x20\t\r\n\f]*)[^>]*)\/>/gi,za=/\s*$/g;function Da(a,b){return r.nodeName(a,"table")&&r.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a:a}function Ea(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function Fa(a){var b=Ba.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ga(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(V.hasData(a)&&(f=V.access(a),g=V.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;c1&&"string"==typeof q&&!o.checkClone&&Aa.test(q))return a.each(function(e){var f=a.eq(e);s&&(b[0]=q.call(this,e,f.html())),Ia(f,b,c,d)});if(m&&(e=pa(b,a[0].ownerDocument,!1,a,d),f=e.firstChild,1===e.childNodes.length&&(e=f),f||d)){for(h=r.map(ma(e,"script"),Ea),i=h.length;l")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=r.contains(a.ownerDocument,a);if(!(o.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||r.isXMLDoc(a)))for(g=ma(h),f=ma(a),d=0,e=f.length;d0&&na(g,!i&&ma(a,"script")),h},cleanData:function(a){for(var b,c,d,e=r.event.special,f=0;void 0!==(c=a[f]);f++)if(T(c)){if(b=c[V.expando]){if(b.events)for(d in b.events)e[d]?r.event.remove(c,d):r.removeEvent(c,d,b.handle);c[V.expando]=void 0}c[W.expando]&&(c[W.expando]=void 0)}}}),r.fn.extend({detach:function(a){return Ja(this,a,!0)},remove:function(a){return Ja(this,a)},text:function(a){return S(this,function(a){return void 0===a?r.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return Ia(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Da(this,a);b.appendChild(a)}})},prepend:function(){return Ia(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Da(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ia(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ia(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(r.cleanData(ma(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null!=a&&a,b=null==b?a:b,this.map(function(){return r.clone(this,a,b)})},html:function(a){return S(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!za.test(a)&&!la[(ja.exec(a)||["",""])[1].toLowerCase()]){a=r.htmlPrefilter(a);try{for(;c1)}});function Ya(a,b,c,d,e){return new Ya.prototype.init(a,b,c,d,e)}r.Tween=Ya,Ya.prototype={constructor:Ya,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||r.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(r.cssNumber[c]?"":"px")},cur:function(){var a=Ya.propHooks[this.prop];return a&&a.get?a.get(this):Ya.propHooks._default.get(this)},run:function(a){var b,c=Ya.propHooks[this.prop];return this.options.duration?this.pos=b=r.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Ya.propHooks._default.set(this),this}},Ya.prototype.init.prototype=Ya.prototype,Ya.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=r.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){r.fx.step[a.prop]?r.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[r.cssProps[a.prop]]&&!r.cssHooks[a.prop]?a.elem[a.prop]=a.now:r.style(a.elem,a.prop,a.now+a.unit)}}},Ya.propHooks.scrollTop=Ya.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},r.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},r.fx=Ya.prototype.init,r.fx.step={};var Za,$a,_a=/^(?:toggle|show|hide)$/,ab=/queueHooks$/;function bb(){$a&&(a.requestAnimationFrame(bb),r.fx.tick())}function cb(){return a.setTimeout(function(){Za=void 0}),Za=r.now()}function db(a,b){var c,d=0,e={height:a};for(b=b?1:0;d<4;d+=2-b)c=ba[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function eb(a,b,c){for(var d,e=(hb.tweeners[b]||[]).concat(hb.tweeners["*"]),f=0,g=e.length;f1)},removeAttr:function(a){return this.each(function(){r.removeAttr(this,a)})}}),r.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?r.prop(a,b,c):(1===f&&r.isXMLDoc(a)||(e=r.attrHooks[b.toLowerCase()]||(r.expr.match.bool.test(b)?ib:void 0)), +void 0!==c?null===c?void r.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=r.find.attr(a,b),null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!o.radioValue&&"radio"===b&&r.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d=0,e=b&&b.match(K);if(e&&1===a.nodeType)while(c=e[d++])a.removeAttribute(c)}}),ib={set:function(a,b,c){return b===!1?r.removeAttr(a,c):a.setAttribute(c,c),c}},r.each(r.expr.match.bool.source.match(/\w+/g),function(a,b){var c=jb[b]||r.find.attr;jb[b]=function(a,b,d){var e,f,g=b.toLowerCase();return d||(f=jb[g],jb[g]=e,e=null!=c(a,b,d)?g:null,jb[g]=f),e}});var kb=/^(?:input|select|textarea|button)$/i,lb=/^(?:a|area)$/i;r.fn.extend({prop:function(a,b){return S(this,r.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[r.propFix[a]||a]})}}),r.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&r.isXMLDoc(a)||(b=r.propFix[b]||b,e=r.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=r.find.attr(a,"tabindex");return b?parseInt(b,10):kb.test(a.nodeName)||lb.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),o.optSelected||(r.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),r.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){r.propFix[this.toLowerCase()]=this});function mb(a){var b=a.match(K)||[];return b.join(" ")}function nb(a){return a.getAttribute&&a.getAttribute("class")||""}r.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).addClass(a.call(this,b,nb(this)))});if("string"==typeof a&&a){b=a.match(K)||[];while(c=this[i++])if(e=nb(c),d=1===c.nodeType&&" "+mb(e)+" "){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=mb(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).removeClass(a.call(this,b,nb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(K)||[];while(c=this[i++])if(e=nb(c),d=1===c.nodeType&&" "+mb(e)+" "){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=mb(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):r.isFunction(a)?this.each(function(c){r(this).toggleClass(a.call(this,c,nb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=r(this),f=a.match(K)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=nb(this),b&&V.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":V.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+mb(nb(c))+" ").indexOf(b)>-1)return!0;return!1}});var ob=/\r/g;r.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=r.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,r(this).val()):a,null==e?e="":"number"==typeof e?e+="":r.isArray(e)&&(e=r.map(e,function(a){return null==a?"":a+""})),b=r.valHooks[this.type]||r.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=r.valHooks[e.type]||r.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(ob,""):null==c?"":c)}}}),r.extend({valHooks:{option:{get:function(a){var b=r.find.attr(a,"value");return null!=b?b:mb(r.text(a))}},select:{get:function(a){var b,c,d,e=a.options,f=a.selectedIndex,g="select-one"===a.type,h=g?null:[],i=g?f+1:e.length;for(d=f<0?i:g?f:0;d-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),r.each(["radio","checkbox"],function(){r.valHooks[this]={set:function(a,b){if(r.isArray(b))return a.checked=r.inArray(r(a).val(),b)>-1}},o.checkOn||(r.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var pb=/^(?:focusinfocus|focusoutblur)$/;r.extend(r.event,{trigger:function(b,c,e,f){var g,h,i,j,k,m,n,o=[e||d],p=l.call(b,"type")?b.type:b,q=l.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!pb.test(p+r.event.triggered)&&(p.indexOf(".")>-1&&(q=p.split("."),p=q.shift(),q.sort()),k=p.indexOf(":")<0&&"on"+p,b=b[r.expando]?b:new r.Event(p,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=q.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:r.makeArray(c,[b]),n=r.event.special[p]||{},f||!n.trigger||n.trigger.apply(e,c)!==!1)){if(!f&&!n.noBubble&&!r.isWindow(e)){for(j=n.delegateType||p,pb.test(j+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),i=h;i===(e.ownerDocument||d)&&o.push(i.defaultView||i.parentWindow||a)}g=0;while((h=o[g++])&&!b.isPropagationStopped())b.type=g>1?j:n.bindType||p,m=(V.get(h,"events")||{})[b.type]&&V.get(h,"handle"),m&&m.apply(h,c),m=k&&h[k],m&&m.apply&&T(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=p,f||b.isDefaultPrevented()||n._default&&n._default.apply(o.pop(),c)!==!1||!T(e)||k&&r.isFunction(e[p])&&!r.isWindow(e)&&(i=e[k],i&&(e[k]=null),r.event.triggered=p,e[p](),r.event.triggered=void 0,i&&(e[k]=i)),b.result}},simulate:function(a,b,c){var d=r.extend(new r.Event,c,{type:a,isSimulated:!0});r.event.trigger(d,null,b)}}),r.fn.extend({trigger:function(a,b){return this.each(function(){r.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];if(c)return r.event.trigger(a,b,c,!0)}}),r.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(a,b){r.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),r.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),o.focusin="onfocusin"in a,o.focusin||r.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){r.event.simulate(b,a.target,r.event.fix(a))};r.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=V.access(d,b);e||d.addEventListener(a,c,!0),V.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=V.access(d,b)-1;e?V.access(d,b,e):(d.removeEventListener(a,c,!0),V.remove(d,b))}}});var qb=a.location,rb=r.now(),sb=/\?/;r.parseXML=function(b){var c;if(!b||"string"!=typeof b)return null;try{c=(new a.DOMParser).parseFromString(b,"text/xml")}catch(d){c=void 0}return c&&!c.getElementsByTagName("parsererror").length||r.error("Invalid XML: "+b),c};var tb=/\[\]$/,ub=/\r?\n/g,vb=/^(?:submit|button|image|reset|file)$/i,wb=/^(?:input|select|textarea|keygen)/i;function xb(a,b,c,d){var e;if(r.isArray(b))r.each(b,function(b,e){c||tb.test(a)?d(a,e):xb(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==r.type(b))d(a,b);else for(e in b)xb(a+"["+e+"]",b[e],c,d)}r.param=function(a,b){var c,d=[],e=function(a,b){var c=r.isFunction(b)?b():b;d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(null==c?"":c)};if(r.isArray(a)||a.jquery&&!r.isPlainObject(a))r.each(a,function(){e(this.name,this.value)});else for(c in a)xb(c,a[c],b,e);return d.join("&")},r.fn.extend({serialize:function(){return r.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=r.prop(this,"elements");return a?r.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!r(this).is(":disabled")&&wb.test(this.nodeName)&&!vb.test(a)&&(this.checked||!ia.test(a))}).map(function(a,b){var c=r(this).val();return null==c?null:r.isArray(c)?r.map(c,function(a){return{name:b.name,value:a.replace(ub,"\r\n")}}):{name:b.name,value:c.replace(ub,"\r\n")}}).get()}});var yb=/%20/g,zb=/#.*$/,Ab=/([?&])_=[^&]*/,Bb=/^(.*?):[ \t]*([^\r\n]*)$/gm,Cb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Db=/^(?:GET|HEAD)$/,Eb=/^\/\//,Fb={},Gb={},Hb="*/".concat("*"),Ib=d.createElement("a");Ib.href=qb.href;function Jb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(K)||[];if(r.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Kb(a,b,c,d){var e={},f=a===Gb;function g(h){var i;return e[h]=!0,r.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Lb(a,b){var c,d,e=r.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&r.extend(!0,a,d),a}function Mb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}if(f)return f!==i[0]&&i.unshift(f),c[f]}function Nb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}r.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:qb.href,type:"GET",isLocal:Cb.test(qb.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Hb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":r.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Lb(Lb(a,r.ajaxSettings),b):Lb(r.ajaxSettings,a)},ajaxPrefilter:Jb(Fb),ajaxTransport:Jb(Gb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var e,f,g,h,i,j,k,l,m,n,o=r.ajaxSetup({},c),p=o.context||o,q=o.context&&(p.nodeType||p.jquery)?r(p):r.event,s=r.Deferred(),t=r.Callbacks("once memory"),u=o.statusCode||{},v={},w={},x="canceled",y={readyState:0,getResponseHeader:function(a){var b;if(k){if(!h){h={};while(b=Bb.exec(g))h[b[1].toLowerCase()]=b[2]}b=h[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return k?g:null},setRequestHeader:function(a,b){return null==k&&(a=w[a.toLowerCase()]=w[a.toLowerCase()]||a,v[a]=b),this},overrideMimeType:function(a){return null==k&&(o.mimeType=a),this},statusCode:function(a){var b;if(a)if(k)y.always(a[y.status]);else for(b in a)u[b]=[u[b],a[b]];return this},abort:function(a){var b=a||x;return e&&e.abort(b),A(0,b),this}};if(s.promise(y),o.url=((b||o.url||qb.href)+"").replace(Eb,qb.protocol+"//"),o.type=c.method||c.type||o.method||o.type,o.dataTypes=(o.dataType||"*").toLowerCase().match(K)||[""],null==o.crossDomain){j=d.createElement("a");try{j.href=o.url,j.href=j.href,o.crossDomain=Ib.protocol+"//"+Ib.host!=j.protocol+"//"+j.host}catch(z){o.crossDomain=!0}}if(o.data&&o.processData&&"string"!=typeof o.data&&(o.data=r.param(o.data,o.traditional)),Kb(Fb,o,c,y),k)return y;l=r.event&&o.global,l&&0===r.active++&&r.event.trigger("ajaxStart"),o.type=o.type.toUpperCase(),o.hasContent=!Db.test(o.type),f=o.url.replace(zb,""),o.hasContent?o.data&&o.processData&&0===(o.contentType||"").indexOf("application/x-www-form-urlencoded")&&(o.data=o.data.replace(yb,"+")):(n=o.url.slice(f.length),o.data&&(f+=(sb.test(f)?"&":"?")+o.data,delete o.data),o.cache===!1&&(f=f.replace(Ab,"$1"),n=(sb.test(f)?"&":"?")+"_="+rb++ +n),o.url=f+n),o.ifModified&&(r.lastModified[f]&&y.setRequestHeader("If-Modified-Since",r.lastModified[f]),r.etag[f]&&y.setRequestHeader("If-None-Match",r.etag[f])),(o.data&&o.hasContent&&o.contentType!==!1||c.contentType)&&y.setRequestHeader("Content-Type",o.contentType),y.setRequestHeader("Accept",o.dataTypes[0]&&o.accepts[o.dataTypes[0]]?o.accepts[o.dataTypes[0]]+("*"!==o.dataTypes[0]?", "+Hb+"; q=0.01":""):o.accepts["*"]);for(m in o.headers)y.setRequestHeader(m,o.headers[m]);if(o.beforeSend&&(o.beforeSend.call(p,y,o)===!1||k))return y.abort();if(x="abort",t.add(o.complete),y.done(o.success),y.fail(o.error),e=Kb(Gb,o,c,y)){if(y.readyState=1,l&&q.trigger("ajaxSend",[y,o]),k)return y;o.async&&o.timeout>0&&(i=a.setTimeout(function(){y.abort("timeout")},o.timeout));try{k=!1,e.send(v,A)}catch(z){if(k)throw z;A(-1,z)}}else A(-1,"No Transport");function A(b,c,d,h){var j,m,n,v,w,x=c;k||(k=!0,i&&a.clearTimeout(i),e=void 0,g=h||"",y.readyState=b>0?4:0,j=b>=200&&b<300||304===b,d&&(v=Mb(o,y,d)),v=Nb(o,v,y,j),j?(o.ifModified&&(w=y.getResponseHeader("Last-Modified"),w&&(r.lastModified[f]=w),w=y.getResponseHeader("etag"),w&&(r.etag[f]=w)),204===b||"HEAD"===o.type?x="nocontent":304===b?x="notmodified":(x=v.state,m=v.data,n=v.error,j=!n)):(n=x,!b&&x||(x="error",b<0&&(b=0))),y.status=b,y.statusText=(c||x)+"",j?s.resolveWith(p,[m,x,y]):s.rejectWith(p,[y,x,n]),y.statusCode(u),u=void 0,l&&q.trigger(j?"ajaxSuccess":"ajaxError",[y,o,j?m:n]),t.fireWith(p,[y,x]),l&&(q.trigger("ajaxComplete",[y,o]),--r.active||r.event.trigger("ajaxStop")))}return y},getJSON:function(a,b,c){return r.get(a,b,c,"json")},getScript:function(a,b){return r.get(a,void 0,b,"script")}}),r.each(["get","post"],function(a,b){r[b]=function(a,c,d,e){return r.isFunction(c)&&(e=e||d,d=c,c=void 0),r.ajax(r.extend({url:a,type:b,dataType:e,data:c,success:d},r.isPlainObject(a)&&a))}}),r._evalUrl=function(a){return r.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},r.fn.extend({wrapAll:function(a){var b;return this[0]&&(r.isFunction(a)&&(a=a.call(this[0])),b=r(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this},wrapInner:function(a){return r.isFunction(a)?this.each(function(b){r(this).wrapInner(a.call(this,b))}):this.each(function(){var b=r(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=r.isFunction(a);return this.each(function(c){r(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(a){return this.parent(a).not("body").each(function(){r(this).replaceWith(this.childNodes)}),this}}),r.expr.pseudos.hidden=function(a){return!r.expr.pseudos.visible(a)},r.expr.pseudos.visible=function(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)},r.ajaxSettings.xhr=function(){try{return new a.XMLHttpRequest}catch(b){}};var Ob={0:200,1223:204},Pb=r.ajaxSettings.xhr();o.cors=!!Pb&&"withCredentials"in Pb,o.ajax=Pb=!!Pb,r.ajaxTransport(function(b){var c,d;if(o.cors||Pb&&!b.crossDomain)return{send:function(e,f){var g,h=b.xhr();if(h.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(g in b.xhrFields)h[g]=b.xhrFields[g];b.mimeType&&h.overrideMimeType&&h.overrideMimeType(b.mimeType),b.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest");for(g in e)h.setRequestHeader(g,e[g]);c=function(a){return function(){c&&(c=d=h.onload=h.onerror=h.onabort=h.onreadystatechange=null,"abort"===a?h.abort():"error"===a?"number"!=typeof h.status?f(0,"error"):f(h.status,h.statusText):f(Ob[h.status]||h.status,h.statusText,"text"!==(h.responseType||"text")||"string"!=typeof h.responseText?{binary:h.response}:{text:h.responseText},h.getAllResponseHeaders()))}},h.onload=c(),d=h.onerror=c("error"),void 0!==h.onabort?h.onabort=d:h.onreadystatechange=function(){4===h.readyState&&a.setTimeout(function(){c&&d()})},c=c("abort");try{h.send(b.hasContent&&b.data||null)}catch(i){if(c)throw i}},abort:function(){c&&c()}}}),r.ajaxPrefilter(function(a){a.crossDomain&&(a.contents.script=!1)}),r.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return r.globalEval(a),a}}}),r.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),r.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(e,f){b=r(" + + + + diff --git a/Monitor/wwwroot/assets/plugins/jquery-ui/jquery-ui.css b/Monitor/wwwroot/assets/plugins/jquery-ui/jquery-ui.css new file mode 100644 index 0000000..4b955f0 --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/jquery-ui/jquery-ui.css @@ -0,0 +1,1225 @@ +/*! jQuery UI - v1.11.4 - 2015-03-11 +* http://jqueryui.com +* Includes: core.css, accordion.css, autocomplete.css, button.css, datepicker.css, dialog.css, draggable.css, menu.css, progressbar.css, resizable.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS%2CTahoma%2CVerdana%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=f6a828&bgTextureHeader=gloss_wave&bgImgOpacityHeader=35&borderColorHeader=e78f08&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=eeeeee&bgTextureContent=highlight_soft&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=333333&iconColorContent=222222&bgColorDefault=f6f6f6&bgTextureDefault=glass&bgImgOpacityDefault=100&borderColorDefault=cccccc&fcDefault=1c94c4&iconColorDefault=ef8c08&bgColorHover=fdf5ce&bgTextureHover=glass&bgImgOpacityHover=100&borderColorHover=fbcb09&fcHover=c77405&iconColorHover=ef8c08&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=fbd850&fcActive=eb8f00&iconColorActive=ef8c08&bgColorHighlight=ffe45c&bgTextureHighlight=highlight_soft&bgImgOpacityHighlight=75&borderColorHighlight=fed22f&fcHighlight=363636&iconColorHighlight=228ef1&bgColorError=b81900&bgTextureError=diagonals_thick&bgImgOpacityError=18&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffd27a&bgColorOverlay=666666&bgTextureOverlay=diagonals_thick&bgImgOpacityOverlay=20&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=flat&bgImgOpacityShadow=10&opacityShadow=20&thicknessShadow=5px&offsetTopShadow=-5px&offsetLeftShadow=-5px&cornerRadiusShadow=5px +* Copyright 2015 jQuery Foundation and other contributors; Licensed MIT */ + +/* Layout helpers +----------------------------------*/ +.ui-helper-hidden { + display: none; +} +.ui-helper-hidden-accessible { + border: 0; + clip: rect(0 0 0 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; +} +.ui-helper-reset { + margin: 0; + padding: 0; + border: 0; + outline: 0; + line-height: 1.3; + text-decoration: none; + font-size: 100%; + list-style: none; +} +.ui-helper-clearfix:before, +.ui-helper-clearfix:after { + content: ""; + display: table; + border-collapse: collapse; +} +.ui-helper-clearfix:after { + clear: both; +} +.ui-helper-clearfix { + min-height: 0; /* support: IE7 */ +} +.ui-helper-zfix { + width: 100%; + height: 100%; + top: 0; + left: 0; + position: absolute; + opacity: 0; + filter:Alpha(Opacity=0); /* support: IE8 */ +} + +.ui-front { + z-index: 100; +} + + +/* Interaction Cues +----------------------------------*/ +.ui-state-disabled { + cursor: default !important; +} + + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { + display: block; + text-indent: -99999px; + overflow: hidden; + background-repeat: no-repeat; +} + + +/* Misc visuals +----------------------------------*/ + +/* Overlays */ +.ui-widget-overlay { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; +} +.ui-accordion .ui-accordion-header { + display: block; + cursor: pointer; + position: relative; + margin: 2px 0 0 0; + padding: .5em .5em .5em .7em; + min-height: 0; /* support: IE7 */ + font-size: 100%; +} +.ui-accordion .ui-accordion-icons { + padding-left: 2.2em; +} +.ui-accordion .ui-accordion-icons .ui-accordion-icons { + padding-left: 2.2em; +} +.ui-accordion .ui-accordion-header .ui-accordion-header-icon { + position: absolute; + left: .5em; + top: 50%; + margin-top: -8px; +} +.ui-accordion .ui-accordion-content { + padding: 1em 2.2em; + border-top: 0; + overflow: auto; +} +.ui-autocomplete { + position: absolute; + top: 0; + left: 0; + cursor: default; +} +.ui-button { + display: inline-block; + position: relative; + padding: 0; + line-height: normal; + margin-right: .1em; + cursor: pointer; + vertical-align: middle; + text-align: center; + overflow: visible; /* removes extra width in IE */ +} +.ui-button, +.ui-button:link, +.ui-button:visited, +.ui-button:hover, +.ui-button:active { + text-decoration: none; +} +/* to make room for the icon, a width needs to be set here */ +.ui-button-icon-only { + width: 2.2em; +} +/* button elements seem to need a little more width */ +button.ui-button-icon-only { + width: 2.4em; +} +.ui-button-icons-only { + width: 3.4em; +} +button.ui-button-icons-only { + width: 3.7em; +} + +/* button text element */ +.ui-button .ui-button-text { + display: block; + line-height: normal; +} +.ui-button-text-only .ui-button-text { + padding: .4em 1em; +} +.ui-button-icon-only .ui-button-text, +.ui-button-icons-only .ui-button-text { + padding: .4em; + text-indent: -9999999px; +} +.ui-button-text-icon-primary .ui-button-text, +.ui-button-text-icons .ui-button-text { + padding: .4em 1em .4em 2.1em; +} +.ui-button-text-icon-secondary .ui-button-text, +.ui-button-text-icons .ui-button-text { + padding: .4em 2.1em .4em 1em; +} +.ui-button-text-icons .ui-button-text { + padding-left: 2.1em; + padding-right: 2.1em; +} +/* no icon support for input elements, provide padding by default */ +input.ui-button { + padding: .4em 1em; +} + +/* button icon element(s) */ +.ui-button-icon-only .ui-icon, +.ui-button-text-icon-primary .ui-icon, +.ui-button-text-icon-secondary .ui-icon, +.ui-button-text-icons .ui-icon, +.ui-button-icons-only .ui-icon { + position: absolute; + top: 50%; + margin-top: -8px; +} +.ui-button-icon-only .ui-icon { + left: 50%; + margin-left: -8px; +} +.ui-button-text-icon-primary .ui-button-icon-primary, +.ui-button-text-icons .ui-button-icon-primary, +.ui-button-icons-only .ui-button-icon-primary { + left: .5em; +} +.ui-button-text-icon-secondary .ui-button-icon-secondary, +.ui-button-text-icons .ui-button-icon-secondary, +.ui-button-icons-only .ui-button-icon-secondary { + right: .5em; +} + +/* button sets */ +.ui-buttonset { + margin-right: 7px; +} +.ui-buttonset .ui-button { + margin-left: 0; + margin-right: -.3em; +} + +/* workarounds */ +/* reset extra padding in Firefox, see h5bp.com/l */ +input.ui-button::-moz-focus-inner, +button.ui-button::-moz-focus-inner { + border: 0; + padding: 0; +} +.ui-datepicker { + width: 17em; + padding: .2em .2em 0; + display: none; +} +.ui-datepicker .ui-datepicker-header { + position: relative; + padding: .2em 0; +} +.ui-datepicker .ui-datepicker-prev, +.ui-datepicker .ui-datepicker-next { + position: absolute; + top: 2px; + width: 1.8em; + height: 1.8em; +} +.ui-datepicker .ui-datepicker-prev-hover, +.ui-datepicker .ui-datepicker-next-hover { + top: 1px; +} +.ui-datepicker .ui-datepicker-prev { + left: 2px; +} +.ui-datepicker .ui-datepicker-next { + right: 2px; +} +.ui-datepicker .ui-datepicker-prev-hover { + left: 1px; +} +.ui-datepicker .ui-datepicker-next-hover { + right: 1px; +} +.ui-datepicker .ui-datepicker-prev span, +.ui-datepicker .ui-datepicker-next span { + display: block; + position: absolute; + left: 50%; + margin-left: -8px; + top: 50%; + margin-top: -8px; +} +.ui-datepicker .ui-datepicker-title { + margin: 0 2.3em; + line-height: 1.8em; + text-align: center; +} +.ui-datepicker .ui-datepicker-title select { + font-size: 1em; + margin: 1px 0; +} +.ui-datepicker select.ui-datepicker-month, +.ui-datepicker select.ui-datepicker-year { + width: 45%; +} +.ui-datepicker table { + width: 100%; + font-size: .9em; + border-collapse: collapse; + margin: 0 0 .4em; +} +.ui-datepicker th { + padding: .7em .3em; + text-align: center; + font-weight: bold; + border: 0; +} +.ui-datepicker td { + border: 0; + padding: 1px; +} +.ui-datepicker td span, +.ui-datepicker td a { + display: block; + padding: .2em; + text-align: right; + text-decoration: none; +} +.ui-datepicker .ui-datepicker-buttonpane { + background-image: none; + margin: .7em 0 0 0; + padding: 0 .2em; + border-left: 0; + border-right: 0; + border-bottom: 0; +} +.ui-datepicker .ui-datepicker-buttonpane button { + float: right; + margin: .5em .2em .4em; + cursor: pointer; + padding: .2em .6em .3em .6em; + width: auto; + overflow: visible; +} +.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { + float: left; +} + +/* with multiple calendars */ +.ui-datepicker.ui-datepicker-multi { + width: auto; +} +.ui-datepicker-multi .ui-datepicker-group { + float: left; +} +.ui-datepicker-multi .ui-datepicker-group table { + width: 95%; + margin: 0 auto .4em; +} +.ui-datepicker-multi-2 .ui-datepicker-group { + width: 50%; +} +.ui-datepicker-multi-3 .ui-datepicker-group { + width: 33.3%; +} +.ui-datepicker-multi-4 .ui-datepicker-group { + width: 25%; +} +.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header, +.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { + border-left-width: 0; +} +.ui-datepicker-multi .ui-datepicker-buttonpane { + clear: left; +} +.ui-datepicker-row-break { + clear: both; + width: 100%; + font-size: 0; +} + +/* RTL support */ +.ui-datepicker-rtl { + direction: rtl; +} +.ui-datepicker-rtl .ui-datepicker-prev { + right: 2px; + left: auto; +} +.ui-datepicker-rtl .ui-datepicker-next { + left: 2px; + right: auto; +} +.ui-datepicker-rtl .ui-datepicker-prev:hover { + right: 1px; + left: auto; +} +.ui-datepicker-rtl .ui-datepicker-next:hover { + left: 1px; + right: auto; +} +.ui-datepicker-rtl .ui-datepicker-buttonpane { + clear: right; +} +.ui-datepicker-rtl .ui-datepicker-buttonpane button { + float: left; +} +.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current, +.ui-datepicker-rtl .ui-datepicker-group { + float: right; +} +.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header, +.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { + border-right-width: 0; + border-left-width: 1px; +} +.ui-dialog { + overflow: hidden; + position: absolute; + top: 0; + left: 0; + padding: .2em; + outline: 0; +} +.ui-dialog .ui-dialog-titlebar { + padding: .4em 1em; + position: relative; +} +.ui-dialog .ui-dialog-title { + float: left; + margin: .1em 0; + white-space: nowrap; + width: 90%; + overflow: hidden; + text-overflow: ellipsis; +} +.ui-dialog .ui-dialog-titlebar-close { + position: absolute; + right: .3em; + top: 50%; + width: 20px; + margin: -10px 0 0 0; + padding: 1px; + height: 20px; +} +.ui-dialog .ui-dialog-content { + position: relative; + border: 0; + padding: .5em 1em; + background: none; + overflow: auto; +} +.ui-dialog .ui-dialog-buttonpane { + text-align: left; + border-width: 1px 0 0 0; + background-image: none; + margin-top: .5em; + padding: .3em 1em .5em .4em; +} +.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { + float: right; +} +.ui-dialog .ui-dialog-buttonpane button { + margin: .5em .4em .5em 0; + cursor: pointer; +} +.ui-dialog .ui-resizable-se { + width: 12px; + height: 12px; + right: -5px; + bottom: -5px; + background-position: 16px 16px; +} +.ui-draggable .ui-dialog-titlebar { + cursor: move; +} +.ui-draggable-handle { + -ms-touch-action: none; + touch-action: none; +} +.ui-menu { + list-style: none; + padding: 0; + margin: 0; + display: block; + outline: none; +} +.ui-menu .ui-menu { + position: absolute; +} +.ui-menu .ui-menu-item { + position: relative; + margin: 0; + padding: 3px 1em 3px .4em; + cursor: pointer; + min-height: 0; /* support: IE7 */ + /* support: IE10, see #8844 */ + list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"); +} +.ui-menu .ui-menu-divider { + margin: 5px 0; + height: 0; + font-size: 0; + line-height: 0; + border-width: 1px 0 0 0; +} +.ui-menu .ui-state-focus, +.ui-menu .ui-state-active { + margin: -1px; +} + +/* icon support */ +.ui-menu-icons { + position: relative; +} +.ui-menu-icons .ui-menu-item { + padding-left: 2em; +} + +/* left-aligned */ +.ui-menu .ui-icon { + position: absolute; + top: 0; + bottom: 0; + left: .2em; + margin: auto 0; +} + +/* right-aligned */ +.ui-menu .ui-menu-icon { + left: auto; + right: 0; +} +.ui-progressbar { + height: 2em; + text-align: left; + overflow: hidden; +} +.ui-progressbar .ui-progressbar-value { + margin: -1px; + height: 100%; +} +.ui-progressbar .ui-progressbar-overlay { + background: url("data:image/gif;base64,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"); + height: 100%; + filter: alpha(opacity=25); /* support: IE8 */ + opacity: 0.25; +} +.ui-progressbar-indeterminate .ui-progressbar-value { + background-image: none; +} +.ui-resizable { + position: relative; +} +.ui-resizable-handle { + position: absolute; + font-size: 0.1px; + display: block; + -ms-touch-action: none; + touch-action: none; +} +.ui-resizable-disabled .ui-resizable-handle, +.ui-resizable-autohide .ui-resizable-handle { + display: none; +} +.ui-resizable-n { + cursor: n-resize; + height: 7px; + width: 100%; + top: -5px; + left: 0; +} +.ui-resizable-s { + cursor: s-resize; + height: 7px; + width: 100%; + bottom: -5px; + left: 0; +} +.ui-resizable-e { + cursor: e-resize; + width: 7px; + right: -5px; + top: 0; + height: 100%; +} +.ui-resizable-w { + cursor: w-resize; + width: 7px; + left: -5px; + top: 0; + height: 100%; +} +.ui-resizable-se { + cursor: se-resize; + width: 12px; + height: 12px; + right: 1px; + bottom: 1px; +} +.ui-resizable-sw { + cursor: sw-resize; + width: 9px; + height: 9px; + left: -5px; + bottom: -5px; +} +.ui-resizable-nw { + cursor: nw-resize; + width: 9px; + height: 9px; + left: -5px; + top: -5px; +} +.ui-resizable-ne { + cursor: ne-resize; + width: 9px; + height: 9px; + right: -5px; + top: -5px; +} +.ui-selectable { + -ms-touch-action: none; + touch-action: none; +} +.ui-selectable-helper { + position: absolute; + z-index: 100; + border: 1px dotted black; +} +.ui-selectmenu-menu { + padding: 0; + margin: 0; + position: absolute; + top: 0; + left: 0; + display: none; +} +.ui-selectmenu-menu .ui-menu { + overflow: auto; + /* Support: IE7 */ + overflow-x: hidden; + padding-bottom: 1px; +} +.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup { + font-size: 1em; + font-weight: bold; + line-height: 1.5; + padding: 2px 0.4em; + margin: 0.5em 0 0 0; + height: auto; + border: 0; +} +.ui-selectmenu-open { + display: block; +} +.ui-selectmenu-button { + display: inline-block; + overflow: hidden; + position: relative; + text-decoration: none; + cursor: pointer; +} +.ui-selectmenu-button span.ui-icon { + right: 0.5em; + left: auto; + margin-top: -8px; + position: absolute; + top: 50%; +} +.ui-selectmenu-button span.ui-selectmenu-text { + text-align: left; + padding: 0.4em 2.1em 0.4em 1em; + display: block; + line-height: 1.4; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.ui-slider { + position: relative; + text-align: left; +} +.ui-slider .ui-slider-handle { + position: absolute; + z-index: 2; + width: 1.2em; + height: 1.2em; + cursor: default; + -ms-touch-action: none; + touch-action: none; +} +.ui-slider .ui-slider-range { + position: absolute; + z-index: 1; + font-size: .7em; + display: block; + border: 0; + background-position: 0 0; +} + +/* support: IE8 - See #6727 */ +.ui-slider.ui-state-disabled .ui-slider-handle, +.ui-slider.ui-state-disabled .ui-slider-range { + filter: inherit; +} + +.ui-slider-horizontal { + height: .8em; +} +.ui-slider-horizontal .ui-slider-handle { + top: -.3em; + margin-left: -.6em; +} +.ui-slider-horizontal .ui-slider-range { + top: 0; + height: 100%; +} +.ui-slider-horizontal .ui-slider-range-min { + left: 0; +} +.ui-slider-horizontal .ui-slider-range-max { + right: 0; +} + +.ui-slider-vertical { + width: .8em; + height: 100px; +} +.ui-slider-vertical .ui-slider-handle { + left: -.3em; + margin-left: 0; + margin-bottom: -.6em; +} +.ui-slider-vertical .ui-slider-range { + left: 0; + width: 100%; +} +.ui-slider-vertical .ui-slider-range-min { + bottom: 0; +} +.ui-slider-vertical .ui-slider-range-max { + top: 0; +} +.ui-sortable-handle { + -ms-touch-action: none; + touch-action: none; +} +.ui-spinner { + position: relative; + display: inline-block; + overflow: hidden; + padding: 0; + vertical-align: middle; +} +.ui-spinner-input { + border: none; + background: none; + color: inherit; + padding: 0; + margin: .2em 0; + vertical-align: middle; + margin-left: .4em; + margin-right: 22px; +} +.ui-spinner-button { + width: 16px; + height: 50%; + font-size: .5em; + padding: 0; + margin: 0; + text-align: center; + position: absolute; + cursor: default; + display: block; + overflow: hidden; + right: 0; +} +/* more specificity required here to override default borders */ +.ui-spinner a.ui-spinner-button { + border-top: none; + border-bottom: none; + border-right: none; +} +/* vertically center icon */ +.ui-spinner .ui-icon { + position: absolute; + margin-top: -8px; + top: 50%; + left: 0; +} +.ui-spinner-up { + top: 0; +} +.ui-spinner-down { + bottom: 0; +} + +/* TR overrides */ +.ui-spinner .ui-icon-triangle-1-s { + /* need to fix icons sprite */ + background-position: -65px -16px; +} +.ui-tabs { + position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */ + padding: .2em; +} +.ui-tabs .ui-tabs-nav { + margin: 0; + padding: .2em .2em 0; +} +.ui-tabs .ui-tabs-nav li { + list-style: none; + float: left; + position: relative; + top: 0; + margin: 1px .2em 0 0; + border-bottom-width: 0; + padding: 0; + white-space: nowrap; +} +.ui-tabs .ui-tabs-nav .ui-tabs-anchor { + float: left; + padding: .5em 1em; + text-decoration: none; +} +.ui-tabs .ui-tabs-nav li.ui-tabs-active { + margin-bottom: -1px; + padding-bottom: 1px; +} +.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor, +.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor, +.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor { + cursor: text; +} +.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor { + cursor: pointer; +} +.ui-tabs .ui-tabs-panel { + display: block; + border-width: 0; + padding: 1em 1.4em; + background: none; +} +.ui-tooltip { + padding: 8px; + position: absolute; + z-index: 9999; + max-width: 300px; + -webkit-box-shadow: 0 0 5px #aaa; + box-shadow: 0 0 5px #aaa; +} +body .ui-tooltip { + border-width: 2px; +} + +/* Component containers +----------------------------------*/ +.ui-widget { + font-family: Trebuchet MS,Tahoma,Verdana,Arial,sans-serif; + font-size: 1.1em; +} +.ui-widget .ui-widget { + font-size: 1em; +} +.ui-widget input, +.ui-widget select, +.ui-widget textarea, +.ui-widget button { + font-family: Trebuchet MS,Tahoma,Verdana,Arial,sans-serif; + font-size: 1em; +} +.ui-widget-content { + border: 1px solid #dddddd; + background: #eeeeee url("images/ui-bg_highlight-soft_100_eeeeee_1x100.png") 50% top repeat-x; + color: #333333; +} +.ui-widget-content a { + color: #333333; +} +.ui-widget-header { + border: 1px solid #e78f08; + background: #f6a828 url("images/ui-bg_gloss-wave_35_f6a828_500x100.png") 50% 50% repeat-x; + color: #ffffff; + font-weight: bold; +} +.ui-widget-header a { + color: #ffffff; +} + +/* Interaction states +----------------------------------*/ +.ui-state-default, +.ui-widget-content .ui-state-default, +.ui-widget-header .ui-state-default { + border: 1px solid #cccccc; + background: #f6f6f6 url("images/ui-bg_glass_100_f6f6f6_1x400.png") 50% 50% repeat-x; + font-weight: bold; + color: #1c94c4; +} +.ui-state-default a, +.ui-state-default a:link, +.ui-state-default a:visited { + color: #1c94c4; + text-decoration: none; +} +.ui-state-hover, +.ui-widget-content .ui-state-hover, +.ui-widget-header .ui-state-hover, +.ui-state-focus, +.ui-widget-content .ui-state-focus, +.ui-widget-header .ui-state-focus { + border: 1px solid #fbcb09; + background: #fdf5ce url("images/ui-bg_glass_100_fdf5ce_1x400.png") 50% 50% repeat-x; + font-weight: bold; + color: #c77405; +} +.ui-state-hover a, +.ui-state-hover a:hover, +.ui-state-hover a:link, +.ui-state-hover a:visited, +.ui-state-focus a, +.ui-state-focus a:hover, +.ui-state-focus a:link, +.ui-state-focus a:visited { + color: #c77405; + text-decoration: none; +} +.ui-state-active, +.ui-widget-content .ui-state-active, +.ui-widget-header .ui-state-active { + border: 1px solid #fbd850; + background: #ffffff url("images/ui-bg_glass_65_ffffff_1x400.png") 50% 50% repeat-x; + font-weight: bold; + color: #eb8f00; +} +.ui-state-active a, +.ui-state-active a:link, +.ui-state-active a:visited { + color: #eb8f00; + text-decoration: none; +} + +/* Interaction Cues +----------------------------------*/ +.ui-state-highlight, +.ui-widget-content .ui-state-highlight, +.ui-widget-header .ui-state-highlight { + border: 1px solid #fed22f; + background: #ffe45c url("images/ui-bg_highlight-soft_75_ffe45c_1x100.png") 50% top repeat-x; + color: #363636; +} +.ui-state-highlight a, +.ui-widget-content .ui-state-highlight a, +.ui-widget-header .ui-state-highlight a { + color: #363636; +} +.ui-state-error, +.ui-widget-content .ui-state-error, +.ui-widget-header .ui-state-error { + border: 1px solid #cd0a0a; + background: #b81900 url("images/ui-bg_diagonals-thick_18_b81900_40x40.png") 50% 50% repeat; + color: #ffffff; +} +.ui-state-error a, +.ui-widget-content .ui-state-error a, +.ui-widget-header .ui-state-error a { + color: #ffffff; +} +.ui-state-error-text, +.ui-widget-content .ui-state-error-text, +.ui-widget-header .ui-state-error-text { + color: #ffffff; +} +.ui-priority-primary, +.ui-widget-content .ui-priority-primary, +.ui-widget-header .ui-priority-primary { + font-weight: bold; +} +.ui-priority-secondary, +.ui-widget-content .ui-priority-secondary, +.ui-widget-header .ui-priority-secondary { + opacity: .7; + filter:Alpha(Opacity=70); /* support: IE8 */ + font-weight: normal; +} +.ui-state-disabled, +.ui-widget-content .ui-state-disabled, +.ui-widget-header .ui-state-disabled { + opacity: .35; + filter:Alpha(Opacity=35); /* support: IE8 */ + background-image: none; +} +.ui-state-disabled .ui-icon { + filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */ +} + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { + width: 16px; + height: 16px; +} +.ui-icon, +.ui-widget-content .ui-icon { + background-image: url("images/ui-icons_222222_256x240.png"); +} +.ui-widget-header .ui-icon { + background-image: url("images/ui-icons_ffffff_256x240.png"); +} +.ui-state-default .ui-icon { + background-image: url("images/ui-icons_ef8c08_256x240.png"); +} +.ui-state-hover .ui-icon, +.ui-state-focus .ui-icon { + background-image: url("images/ui-icons_ef8c08_256x240.png"); +} +.ui-state-active .ui-icon { + background-image: url("images/ui-icons_ef8c08_256x240.png"); +} +.ui-state-highlight .ui-icon { + background-image: url("images/ui-icons_228ef1_256x240.png"); +} +.ui-state-error .ui-icon, +.ui-state-error-text .ui-icon { + background-image: url("images/ui-icons_ffd27a_256x240.png"); +} + +/* positioning */ +.ui-icon-blank { background-position: 16px 16px; } +.ui-icon-carat-1-n { background-position: 0 0; } +.ui-icon-carat-1-ne { background-position: -16px 0; } +.ui-icon-carat-1-e { background-position: -32px 0; } +.ui-icon-carat-1-se { background-position: -48px 0; } +.ui-icon-carat-1-s { background-position: -64px 0; } +.ui-icon-carat-1-sw { background-position: -80px 0; } +.ui-icon-carat-1-w { background-position: -96px 0; } +.ui-icon-carat-1-nw { background-position: -112px 0; } +.ui-icon-carat-2-n-s { background-position: -128px 0; } +.ui-icon-carat-2-e-w { background-position: -144px 0; } +.ui-icon-triangle-1-n { background-position: 0 -16px; } +.ui-icon-triangle-1-ne { background-position: -16px -16px; } +.ui-icon-triangle-1-e { background-position: -32px -16px; } +.ui-icon-triangle-1-se { background-position: -48px -16px; } +.ui-icon-triangle-1-s { background-position: -64px -16px; } +.ui-icon-triangle-1-sw { background-position: -80px -16px; } +.ui-icon-triangle-1-w { background-position: -96px -16px; } +.ui-icon-triangle-1-nw { background-position: -112px -16px; } +.ui-icon-triangle-2-n-s { background-position: -128px -16px; } +.ui-icon-triangle-2-e-w { background-position: -144px -16px; } +.ui-icon-arrow-1-n { background-position: 0 -32px; } +.ui-icon-arrow-1-ne { background-position: -16px -32px; } +.ui-icon-arrow-1-e { background-position: -32px -32px; } +.ui-icon-arrow-1-se { background-position: -48px -32px; } +.ui-icon-arrow-1-s { background-position: -64px -32px; } +.ui-icon-arrow-1-sw { background-position: -80px -32px; } +.ui-icon-arrow-1-w { background-position: -96px -32px; } +.ui-icon-arrow-1-nw { background-position: -112px -32px; } +.ui-icon-arrow-2-n-s { background-position: -128px -32px; } +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } +.ui-icon-arrow-2-e-w { background-position: -160px -32px; } +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; } +.ui-icon-arrowstop-1-n { background-position: -192px -32px; } +.ui-icon-arrowstop-1-e { background-position: -208px -32px; } +.ui-icon-arrowstop-1-s { background-position: -224px -32px; } +.ui-icon-arrowstop-1-w { background-position: -240px -32px; } +.ui-icon-arrowthick-1-n { background-position: 0 -48px; } +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; } +.ui-icon-arrowthick-1-e { background-position: -32px -48px; } +.ui-icon-arrowthick-1-se { background-position: -48px -48px; } +.ui-icon-arrowthick-1-s { background-position: -64px -48px; } +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; } +.ui-icon-arrowthick-1-w { background-position: -96px -48px; } +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; } +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; } +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; } +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; } +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; } +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } +.ui-icon-arrow-4 { background-position: 0 -80px; } +.ui-icon-arrow-4-diag { background-position: -16px -80px; } +.ui-icon-extlink { background-position: -32px -80px; } +.ui-icon-newwin { background-position: -48px -80px; } +.ui-icon-refresh { background-position: -64px -80px; } +.ui-icon-shuffle { background-position: -80px -80px; } +.ui-icon-transfer-e-w { background-position: -96px -80px; } +.ui-icon-transferthick-e-w { background-position: -112px -80px; } +.ui-icon-folder-collapsed { background-position: 0 -96px; } +.ui-icon-folder-open { background-position: -16px -96px; } +.ui-icon-document { background-position: -32px -96px; } +.ui-icon-document-b { background-position: -48px -96px; } +.ui-icon-note { background-position: -64px -96px; } +.ui-icon-mail-closed { background-position: -80px -96px; } +.ui-icon-mail-open { background-position: -96px -96px; } +.ui-icon-suitcase { background-position: -112px -96px; } +.ui-icon-comment { background-position: -128px -96px; } +.ui-icon-person { background-position: -144px -96px; } +.ui-icon-print { background-position: -160px -96px; } +.ui-icon-trash { background-position: -176px -96px; } +.ui-icon-locked { background-position: -192px -96px; } +.ui-icon-unlocked { background-position: -208px -96px; } +.ui-icon-bookmark { background-position: -224px -96px; } +.ui-icon-tag { background-position: -240px -96px; } +.ui-icon-home { background-position: 0 -112px; } +.ui-icon-flag { background-position: -16px -112px; } +.ui-icon-calendar { background-position: -32px -112px; } +.ui-icon-cart { background-position: -48px -112px; } +.ui-icon-pencil { background-position: -64px -112px; } +.ui-icon-clock { background-position: -80px -112px; } +.ui-icon-disk { background-position: -96px -112px; } +.ui-icon-calculator { background-position: -112px -112px; } +.ui-icon-zoomin { background-position: -128px -112px; } +.ui-icon-zoomout { background-position: -144px -112px; } +.ui-icon-search { background-position: -160px -112px; } +.ui-icon-wrench { background-position: -176px -112px; } +.ui-icon-gear { background-position: -192px -112px; } +.ui-icon-heart { background-position: -208px -112px; } +.ui-icon-star { background-position: -224px -112px; } +.ui-icon-link { background-position: -240px -112px; } +.ui-icon-cancel { background-position: 0 -128px; } +.ui-icon-plus { background-position: -16px -128px; } +.ui-icon-plusthick { background-position: -32px -128px; } +.ui-icon-minus { background-position: -48px -128px; } +.ui-icon-minusthick { background-position: -64px -128px; } +.ui-icon-close { background-position: -80px -128px; } +.ui-icon-closethick { background-position: -96px -128px; } +.ui-icon-key { background-position: -112px -128px; } +.ui-icon-lightbulb { background-position: -128px -128px; } +.ui-icon-scissors { background-position: -144px -128px; } +.ui-icon-clipboard { background-position: -160px -128px; } +.ui-icon-copy { background-position: -176px -128px; } +.ui-icon-contact { background-position: -192px -128px; } +.ui-icon-image { background-position: -208px -128px; } +.ui-icon-video { background-position: -224px -128px; } +.ui-icon-script { background-position: -240px -128px; } +.ui-icon-alert { background-position: 0 -144px; } +.ui-icon-info { background-position: -16px -144px; } +.ui-icon-notice { background-position: -32px -144px; } +.ui-icon-help { background-position: -48px -144px; } +.ui-icon-check { background-position: -64px -144px; } +.ui-icon-bullet { background-position: -80px -144px; } +.ui-icon-radio-on { background-position: -96px -144px; } +.ui-icon-radio-off { background-position: -112px -144px; } +.ui-icon-pin-w { background-position: -128px -144px; } +.ui-icon-pin-s { background-position: -144px -144px; } +.ui-icon-play { background-position: 0 -160px; } +.ui-icon-pause { background-position: -16px -160px; } +.ui-icon-seek-next { background-position: -32px -160px; } +.ui-icon-seek-prev { background-position: -48px -160px; } +.ui-icon-seek-end { background-position: -64px -160px; } +.ui-icon-seek-start { background-position: -80px -160px; } +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ +.ui-icon-seek-first { background-position: -80px -160px; } +.ui-icon-stop { background-position: -96px -160px; } +.ui-icon-eject { background-position: -112px -160px; } +.ui-icon-volume-off { background-position: -128px -160px; } +.ui-icon-volume-on { background-position: -144px -160px; } +.ui-icon-power { background-position: 0 -176px; } +.ui-icon-signal-diag { background-position: -16px -176px; } +.ui-icon-signal { background-position: -32px -176px; } +.ui-icon-battery-0 { background-position: -48px -176px; } +.ui-icon-battery-1 { background-position: -64px -176px; } +.ui-icon-battery-2 { background-position: -80px -176px; } +.ui-icon-battery-3 { background-position: -96px -176px; } +.ui-icon-circle-plus { background-position: 0 -192px; } +.ui-icon-circle-minus { background-position: -16px -192px; } +.ui-icon-circle-close { background-position: -32px -192px; } +.ui-icon-circle-triangle-e { background-position: -48px -192px; } +.ui-icon-circle-triangle-s { background-position: -64px -192px; } +.ui-icon-circle-triangle-w { background-position: -80px -192px; } +.ui-icon-circle-triangle-n { background-position: -96px -192px; } +.ui-icon-circle-arrow-e { background-position: -112px -192px; } +.ui-icon-circle-arrow-s { background-position: -128px -192px; } +.ui-icon-circle-arrow-w { background-position: -144px -192px; } +.ui-icon-circle-arrow-n { background-position: -160px -192px; } +.ui-icon-circle-zoomin { background-position: -176px -192px; } +.ui-icon-circle-zoomout { background-position: -192px -192px; } +.ui-icon-circle-check { background-position: -208px -192px; } +.ui-icon-circlesmall-plus { background-position: 0 -208px; } +.ui-icon-circlesmall-minus { background-position: -16px -208px; } +.ui-icon-circlesmall-close { background-position: -32px -208px; } +.ui-icon-squaresmall-plus { background-position: -48px -208px; } +.ui-icon-squaresmall-minus { background-position: -64px -208px; } +.ui-icon-squaresmall-close { background-position: -80px -208px; } +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; } +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } +.ui-icon-grip-solid-vertical { background-position: -32px -224px; } +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; } +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } +.ui-icon-grip-diagonal-se { background-position: -80px -224px; } + + +/* Misc visuals +----------------------------------*/ + +/* Corner radius */ +.ui-corner-all, +.ui-corner-top, +.ui-corner-left, +.ui-corner-tl { + border-top-left-radius: 4px; +} +.ui-corner-all, +.ui-corner-top, +.ui-corner-right, +.ui-corner-tr { + border-top-right-radius: 4px; +} +.ui-corner-all, +.ui-corner-bottom, +.ui-corner-left, +.ui-corner-bl { + border-bottom-left-radius: 4px; +} +.ui-corner-all, +.ui-corner-bottom, +.ui-corner-right, +.ui-corner-br { + border-bottom-right-radius: 4px; +} + +/* Overlays */ +.ui-widget-overlay { + background: #666666 url("images/ui-bg_diagonals-thick_20_666666_40x40.png") 50% 50% repeat; + opacity: .5; + filter: Alpha(Opacity=50); /* support: IE8 */ +} +.ui-widget-shadow { + margin: -5px 0 0 -5px; + padding: 5px; + background: #000000 url("images/ui-bg_flat_10_000000_40x100.png") 50% 50% repeat-x; + opacity: .2; + filter: Alpha(Opacity=20); /* support: IE8 */ + border-radius: 5px; +} diff --git a/Monitor/wwwroot/assets/plugins/jquery-ui/jquery-ui.js b/Monitor/wwwroot/assets/plugins/jquery-ui/jquery-ui.js new file mode 100644 index 0000000..31ee9cd --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/jquery-ui/jquery-ui.js @@ -0,0 +1,16617 @@ +/*! jQuery UI - v1.11.4 - 2015-03-11 +* http://jqueryui.com +* Includes: core.js, widget.js, mouse.js, position.js, accordion.js, autocomplete.js, button.js, datepicker.js, dialog.js, draggable.js, droppable.js, effect.js, effect-blind.js, effect-bounce.js, effect-clip.js, effect-drop.js, effect-explode.js, effect-fade.js, effect-fold.js, effect-highlight.js, effect-puff.js, effect-pulsate.js, effect-scale.js, effect-shake.js, effect-size.js, effect-slide.js, effect-transfer.js, menu.js, progressbar.js, resizable.js, selectable.js, selectmenu.js, slider.js, sortable.js, spinner.js, tabs.js, tooltip.js +* Copyright 2015 jQuery Foundation and other contributors; Licensed MIT */ + +(function( factory ) { + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define([ "jquery" ], factory ); + } else { + + // Browser globals + factory( jQuery ); + } +}(function( $ ) { +/*! + * jQuery UI Core 1.11.4 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://api.jqueryui.com/category/ui-core/ + */ + + +// $.ui might exist from components with no dependencies, e.g., $.ui.position +$.ui = $.ui || {}; + +$.extend( $.ui, { + version: "1.11.4", + + keyCode: { + BACKSPACE: 8, + COMMA: 188, + DELETE: 46, + DOWN: 40, + END: 35, + ENTER: 13, + ESCAPE: 27, + HOME: 36, + LEFT: 37, + PAGE_DOWN: 34, + PAGE_UP: 33, + PERIOD: 190, + RIGHT: 39, + SPACE: 32, + TAB: 9, + UP: 38 + } +}); + +// plugins +$.fn.extend({ + scrollParent: function( includeHidden ) { + var position = this.css( "position" ), + excludeStaticParent = position === "absolute", + overflowRegex = includeHidden ? /(auto|scroll|hidden)/ : /(auto|scroll)/, + scrollParent = this.parents().filter( function() { + var parent = $( this ); + if ( excludeStaticParent && parent.css( "position" ) === "static" ) { + return false; + } + return overflowRegex.test( parent.css( "overflow" ) + parent.css( "overflow-y" ) + parent.css( "overflow-x" ) ); + }).eq( 0 ); + + return position === "fixed" || !scrollParent.length ? $( this[ 0 ].ownerDocument || document ) : scrollParent; + }, + + uniqueId: (function() { + var uuid = 0; + + return function() { + return this.each(function() { + if ( !this.id ) { + this.id = "ui-id-" + ( ++uuid ); + } + }); + }; + })(), + + removeUniqueId: function() { + return this.each(function() { + if ( /^ui-id-\d+$/.test( this.id ) ) { + $( this ).removeAttr( "id" ); + } + }); + } +}); + +// selectors +function focusable( element, isTabIndexNotNaN ) { + var map, mapName, img, + nodeName = element.nodeName.toLowerCase(); + if ( "area" === nodeName ) { + map = element.parentNode; + mapName = map.name; + if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) { + return false; + } + img = $( "img[usemap='#" + mapName + "']" )[ 0 ]; + return !!img && visible( img ); + } + return ( /^(input|select|textarea|button|object)$/.test( nodeName ) ? + !element.disabled : + "a" === nodeName ? + element.href || isTabIndexNotNaN : + isTabIndexNotNaN) && + // the element and all of its ancestors must be visible + visible( element ); +} + +function visible( element ) { + return $.expr.filters.visible( element ) && + !$( element ).parents().addBack().filter(function() { + return $.css( this, "visibility" ) === "hidden"; + }).length; +} + +$.extend( $.expr[ ":" ], { + data: $.expr.createPseudo ? + $.expr.createPseudo(function( dataName ) { + return function( elem ) { + return !!$.data( elem, dataName ); + }; + }) : + // support: jQuery <1.8 + function( elem, i, match ) { + return !!$.data( elem, match[ 3 ] ); + }, + + focusable: function( element ) { + return focusable( element, !isNaN( $.attr( element, "tabindex" ) ) ); + }, + + tabbable: function( element ) { + var tabIndex = $.attr( element, "tabindex" ), + isTabIndexNaN = isNaN( tabIndex ); + return ( isTabIndexNaN || tabIndex >= 0 ) && focusable( element, !isTabIndexNaN ); + } +}); + +// support: jQuery <1.8 +if ( !$( "" ).outerWidth( 1 ).jquery ) { + $.each( [ "Width", "Height" ], function( i, name ) { + var side = name === "Width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ], + type = name.toLowerCase(), + orig = { + innerWidth: $.fn.innerWidth, + innerHeight: $.fn.innerHeight, + outerWidth: $.fn.outerWidth, + outerHeight: $.fn.outerHeight + }; + + function reduce( elem, size, border, margin ) { + $.each( side, function() { + size -= parseFloat( $.css( elem, "padding" + this ) ) || 0; + if ( border ) { + size -= parseFloat( $.css( elem, "border" + this + "Width" ) ) || 0; + } + if ( margin ) { + size -= parseFloat( $.css( elem, "margin" + this ) ) || 0; + } + }); + return size; + } + + $.fn[ "inner" + name ] = function( size ) { + if ( size === undefined ) { + return orig[ "inner" + name ].call( this ); + } + + return this.each(function() { + $( this ).css( type, reduce( this, size ) + "px" ); + }); + }; + + $.fn[ "outer" + name] = function( size, margin ) { + if ( typeof size !== "number" ) { + return orig[ "outer" + name ].call( this, size ); + } + + return this.each(function() { + $( this).css( type, reduce( this, size, true, margin ) + "px" ); + }); + }; + }); +} + +// support: jQuery <1.8 +if ( !$.fn.addBack ) { + $.fn.addBack = function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter( selector ) + ); + }; +} + +// support: jQuery 1.6.1, 1.6.2 (http://bugs.jquery.com/ticket/9413) +if ( $( "" ).data( "a-b", "a" ).removeData( "a-b" ).data( "a-b" ) ) { + $.fn.removeData = (function( removeData ) { + return function( key ) { + if ( arguments.length ) { + return removeData.call( this, $.camelCase( key ) ); + } else { + return removeData.call( this ); + } + }; + })( $.fn.removeData ); +} + +// deprecated +$.ui.ie = !!/msie [\w.]+/.exec( navigator.userAgent.toLowerCase() ); + +$.fn.extend({ + focus: (function( orig ) { + return function( delay, fn ) { + return typeof delay === "number" ? + this.each(function() { + var elem = this; + setTimeout(function() { + $( elem ).focus(); + if ( fn ) { + fn.call( elem ); + } + }, delay ); + }) : + orig.apply( this, arguments ); + }; + })( $.fn.focus ), + + disableSelection: (function() { + var eventType = "onselectstart" in document.createElement( "div" ) ? + "selectstart" : + "mousedown"; + + return function() { + return this.bind( eventType + ".ui-disableSelection", function( event ) { + event.preventDefault(); + }); + }; + })(), + + enableSelection: function() { + return this.unbind( ".ui-disableSelection" ); + }, + + zIndex: function( zIndex ) { + if ( zIndex !== undefined ) { + return this.css( "zIndex", zIndex ); + } + + if ( this.length ) { + var elem = $( this[ 0 ] ), position, value; + while ( elem.length && elem[ 0 ] !== document ) { + // Ignore z-index if position is set to a value where z-index is ignored by the browser + // This makes behavior of this function consistent across browsers + // WebKit always returns auto if the element is positioned + position = elem.css( "position" ); + if ( position === "absolute" || position === "relative" || position === "fixed" ) { + // IE returns 0 when zIndex is not specified + // other browsers return a string + // we ignore the case of nested elements with an explicit value of 0 + //
+ value = parseInt( elem.css( "zIndex" ), 10 ); + if ( !isNaN( value ) && value !== 0 ) { + return value; + } + } + elem = elem.parent(); + } + } + + return 0; + } +}); + +// $.ui.plugin is deprecated. Use $.widget() extensions instead. +$.ui.plugin = { + add: function( module, option, set ) { + var i, + proto = $.ui[ module ].prototype; + for ( i in set ) { + proto.plugins[ i ] = proto.plugins[ i ] || []; + proto.plugins[ i ].push( [ option, set[ i ] ] ); + } + }, + call: function( instance, name, args, allowDisconnected ) { + var i, + set = instance.plugins[ name ]; + + if ( !set ) { + return; + } + + if ( !allowDisconnected && ( !instance.element[ 0 ].parentNode || instance.element[ 0 ].parentNode.nodeType === 11 ) ) { + return; + } + + for ( i = 0; i < set.length; i++ ) { + if ( instance.options[ set[ i ][ 0 ] ] ) { + set[ i ][ 1 ].apply( instance.element, args ); + } + } + } +}; + + +/*! + * jQuery UI Widget 1.11.4 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://api.jqueryui.com/jQuery.widget/ + */ + + +var widget_uuid = 0, + widget_slice = Array.prototype.slice; + +$.cleanData = (function( orig ) { + return function( elems ) { + var events, elem, i; + for ( i = 0; (elem = elems[i]) != null; i++ ) { + try { + + // Only trigger remove when necessary to save time + events = $._data( elem, "events" ); + if ( events && events.remove ) { + $( elem ).triggerHandler( "remove" ); + } + + // http://bugs.jquery.com/ticket/8235 + } catch ( e ) {} + } + orig( elems ); + }; +})( $.cleanData ); + +$.widget = function( name, base, prototype ) { + var fullName, existingConstructor, constructor, basePrototype, + // proxiedPrototype allows the provided prototype to remain unmodified + // so that it can be used as a mixin for multiple widgets (#8876) + proxiedPrototype = {}, + namespace = name.split( "." )[ 0 ]; + + name = name.split( "." )[ 1 ]; + fullName = namespace + "-" + name; + + if ( !prototype ) { + prototype = base; + base = $.Widget; + } + + // create selector for plugin + $.expr[ ":" ][ fullName.toLowerCase() ] = function( elem ) { + return !!$.data( elem, fullName ); + }; + + $[ namespace ] = $[ namespace ] || {}; + existingConstructor = $[ namespace ][ name ]; + constructor = $[ namespace ][ name ] = function( options, element ) { + // allow instantiation without "new" keyword + if ( !this._createWidget ) { + return new constructor( options, element ); + } + + // allow instantiation without initializing for simple inheritance + // must use "new" keyword (the code above always passes args) + if ( arguments.length ) { + this._createWidget( options, element ); + } + }; + // extend with the existing constructor to carry over any static properties + $.extend( constructor, existingConstructor, { + version: prototype.version, + // copy the object used to create the prototype in case we need to + // redefine the widget later + _proto: $.extend( {}, prototype ), + // track widgets that inherit from this widget in case this widget is + // redefined after a widget inherits from it + _childConstructors: [] + }); + + basePrototype = new base(); + // we need to make the options hash a property directly on the new instance + // otherwise we'll modify the options hash on the prototype that we're + // inheriting from + basePrototype.options = $.widget.extend( {}, basePrototype.options ); + $.each( prototype, function( prop, value ) { + if ( !$.isFunction( value ) ) { + proxiedPrototype[ prop ] = value; + return; + } + proxiedPrototype[ prop ] = (function() { + var _super = function() { + return base.prototype[ prop ].apply( this, arguments ); + }, + _superApply = function( args ) { + return base.prototype[ prop ].apply( this, args ); + }; + return function() { + var __super = this._super, + __superApply = this._superApply, + returnValue; + + this._super = _super; + this._superApply = _superApply; + + returnValue = value.apply( this, arguments ); + + this._super = __super; + this._superApply = __superApply; + + return returnValue; + }; + })(); + }); + constructor.prototype = $.widget.extend( basePrototype, { + // TODO: remove support for widgetEventPrefix + // always use the name + a colon as the prefix, e.g., draggable:start + // don't prefix for widgets that aren't DOM-based + widgetEventPrefix: existingConstructor ? (basePrototype.widgetEventPrefix || name) : name + }, proxiedPrototype, { + constructor: constructor, + namespace: namespace, + widgetName: name, + widgetFullName: fullName + }); + + // If this widget is being redefined then we need to find all widgets that + // are inheriting from it and redefine all of them so that they inherit from + // the new version of this widget. We're essentially trying to replace one + // level in the prototype chain. + if ( existingConstructor ) { + $.each( existingConstructor._childConstructors, function( i, child ) { + var childPrototype = child.prototype; + + // redefine the child widget using the same prototype that was + // originally used, but inherit from the new version of the base + $.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor, child._proto ); + }); + // remove the list of existing child constructors from the old constructor + // so the old child constructors can be garbage collected + delete existingConstructor._childConstructors; + } else { + base._childConstructors.push( constructor ); + } + + $.widget.bridge( name, constructor ); + + return constructor; +}; + +$.widget.extend = function( target ) { + var input = widget_slice.call( arguments, 1 ), + inputIndex = 0, + inputLength = input.length, + key, + value; + for ( ; inputIndex < inputLength; inputIndex++ ) { + for ( key in input[ inputIndex ] ) { + value = input[ inputIndex ][ key ]; + if ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) { + // Clone objects + if ( $.isPlainObject( value ) ) { + target[ key ] = $.isPlainObject( target[ key ] ) ? + $.widget.extend( {}, target[ key ], value ) : + // Don't extend strings, arrays, etc. with objects + $.widget.extend( {}, value ); + // Copy everything else by reference + } else { + target[ key ] = value; + } + } + } + } + return target; +}; + +$.widget.bridge = function( name, object ) { + var fullName = object.prototype.widgetFullName || name; + $.fn[ name ] = function( options ) { + var isMethodCall = typeof options === "string", + args = widget_slice.call( arguments, 1 ), + returnValue = this; + + if ( isMethodCall ) { + this.each(function() { + var methodValue, + instance = $.data( this, fullName ); + if ( options === "instance" ) { + returnValue = instance; + return false; + } + if ( !instance ) { + return $.error( "cannot call methods on " + name + " prior to initialization; " + + "attempted to call method '" + options + "'" ); + } + if ( !$.isFunction( instance[options] ) || options.charAt( 0 ) === "_" ) { + return $.error( "no such method '" + options + "' for " + name + " widget instance" ); + } + methodValue = instance[ options ].apply( instance, args ); + if ( methodValue !== instance && methodValue !== undefined ) { + returnValue = methodValue && methodValue.jquery ? + returnValue.pushStack( methodValue.get() ) : + methodValue; + return false; + } + }); + } else { + + // Allow multiple hashes to be passed on init + if ( args.length ) { + options = $.widget.extend.apply( null, [ options ].concat(args) ); + } + + this.each(function() { + var instance = $.data( this, fullName ); + if ( instance ) { + instance.option( options || {} ); + if ( instance._init ) { + instance._init(); + } + } else { + $.data( this, fullName, new object( options, this ) ); + } + }); + } + + return returnValue; + }; +}; + +$.Widget = function( /* options, element */ ) {}; +$.Widget._childConstructors = []; + +$.Widget.prototype = { + widgetName: "widget", + widgetEventPrefix: "", + defaultElement: "
", + options: { + disabled: false, + + // callbacks + create: null + }, + _createWidget: function( options, element ) { + element = $( element || this.defaultElement || this )[ 0 ]; + this.element = $( element ); + this.uuid = widget_uuid++; + this.eventNamespace = "." + this.widgetName + this.uuid; + + this.bindings = $(); + this.hoverable = $(); + this.focusable = $(); + + if ( element !== this ) { + $.data( element, this.widgetFullName, this ); + this._on( true, this.element, { + remove: function( event ) { + if ( event.target === element ) { + this.destroy(); + } + } + }); + this.document = $( element.style ? + // element within the document + element.ownerDocument : + // element is window or document + element.document || element ); + this.window = $( this.document[0].defaultView || this.document[0].parentWindow ); + } + + this.options = $.widget.extend( {}, + this.options, + this._getCreateOptions(), + options ); + + this._create(); + this._trigger( "create", null, this._getCreateEventData() ); + this._init(); + }, + _getCreateOptions: $.noop, + _getCreateEventData: $.noop, + _create: $.noop, + _init: $.noop, + + destroy: function() { + this._destroy(); + // we can probably remove the unbind calls in 2.0 + // all event bindings should go through this._on() + this.element + .unbind( this.eventNamespace ) + .removeData( this.widgetFullName ) + // support: jquery <1.6.3 + // http://bugs.jquery.com/ticket/9413 + .removeData( $.camelCase( this.widgetFullName ) ); + this.widget() + .unbind( this.eventNamespace ) + .removeAttr( "aria-disabled" ) + .removeClass( + this.widgetFullName + "-disabled " + + "ui-state-disabled" ); + + // clean up events and states + this.bindings.unbind( this.eventNamespace ); + this.hoverable.removeClass( "ui-state-hover" ); + this.focusable.removeClass( "ui-state-focus" ); + }, + _destroy: $.noop, + + widget: function() { + return this.element; + }, + + option: function( key, value ) { + var options = key, + parts, + curOption, + i; + + if ( arguments.length === 0 ) { + // don't return a reference to the internal hash + return $.widget.extend( {}, this.options ); + } + + if ( typeof key === "string" ) { + // handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } } + options = {}; + parts = key.split( "." ); + key = parts.shift(); + if ( parts.length ) { + curOption = options[ key ] = $.widget.extend( {}, this.options[ key ] ); + for ( i = 0; i < parts.length - 1; i++ ) { + curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {}; + curOption = curOption[ parts[ i ] ]; + } + key = parts.pop(); + if ( arguments.length === 1 ) { + return curOption[ key ] === undefined ? null : curOption[ key ]; + } + curOption[ key ] = value; + } else { + if ( arguments.length === 1 ) { + return this.options[ key ] === undefined ? null : this.options[ key ]; + } + options[ key ] = value; + } + } + + this._setOptions( options ); + + return this; + }, + _setOptions: function( options ) { + var key; + + for ( key in options ) { + this._setOption( key, options[ key ] ); + } + + return this; + }, + _setOption: function( key, value ) { + this.options[ key ] = value; + + if ( key === "disabled" ) { + this.widget() + .toggleClass( this.widgetFullName + "-disabled", !!value ); + + // If the widget is becoming disabled, then nothing is interactive + if ( value ) { + this.hoverable.removeClass( "ui-state-hover" ); + this.focusable.removeClass( "ui-state-focus" ); + } + } + + return this; + }, + + enable: function() { + return this._setOptions({ disabled: false }); + }, + disable: function() { + return this._setOptions({ disabled: true }); + }, + + _on: function( suppressDisabledCheck, element, handlers ) { + var delegateElement, + instance = this; + + // no suppressDisabledCheck flag, shuffle arguments + if ( typeof suppressDisabledCheck !== "boolean" ) { + handlers = element; + element = suppressDisabledCheck; + suppressDisabledCheck = false; + } + + // no element argument, shuffle and use this.element + if ( !handlers ) { + handlers = element; + element = this.element; + delegateElement = this.widget(); + } else { + element = delegateElement = $( element ); + this.bindings = this.bindings.add( element ); + } + + $.each( handlers, function( event, handler ) { + function handlerProxy() { + // allow widgets to customize the disabled handling + // - disabled as an array instead of boolean + // - disabled class as method for disabling individual parts + if ( !suppressDisabledCheck && + ( instance.options.disabled === true || + $( this ).hasClass( "ui-state-disabled" ) ) ) { + return; + } + return ( typeof handler === "string" ? instance[ handler ] : handler ) + .apply( instance, arguments ); + } + + // copy the guid so direct unbinding works + if ( typeof handler !== "string" ) { + handlerProxy.guid = handler.guid = + handler.guid || handlerProxy.guid || $.guid++; + } + + var match = event.match( /^([\w:-]*)\s*(.*)$/ ), + eventName = match[1] + instance.eventNamespace, + selector = match[2]; + if ( selector ) { + delegateElement.delegate( selector, eventName, handlerProxy ); + } else { + element.bind( eventName, handlerProxy ); + } + }); + }, + + _off: function( element, eventName ) { + eventName = (eventName || "").split( " " ).join( this.eventNamespace + " " ) + + this.eventNamespace; + element.unbind( eventName ).undelegate( eventName ); + + // Clear the stack to avoid memory leaks (#10056) + this.bindings = $( this.bindings.not( element ).get() ); + this.focusable = $( this.focusable.not( element ).get() ); + this.hoverable = $( this.hoverable.not( element ).get() ); + }, + + _delay: function( handler, delay ) { + function handlerProxy() { + return ( typeof handler === "string" ? instance[ handler ] : handler ) + .apply( instance, arguments ); + } + var instance = this; + return setTimeout( handlerProxy, delay || 0 ); + }, + + _hoverable: function( element ) { + this.hoverable = this.hoverable.add( element ); + this._on( element, { + mouseenter: function( event ) { + $( event.currentTarget ).addClass( "ui-state-hover" ); + }, + mouseleave: function( event ) { + $( event.currentTarget ).removeClass( "ui-state-hover" ); + } + }); + }, + + _focusable: function( element ) { + this.focusable = this.focusable.add( element ); + this._on( element, { + focusin: function( event ) { + $( event.currentTarget ).addClass( "ui-state-focus" ); + }, + focusout: function( event ) { + $( event.currentTarget ).removeClass( "ui-state-focus" ); + } + }); + }, + + _trigger: function( type, event, data ) { + var prop, orig, + callback = this.options[ type ]; + + data = data || {}; + event = $.Event( event ); + event.type = ( type === this.widgetEventPrefix ? + type : + this.widgetEventPrefix + type ).toLowerCase(); + // the original event may come from any element + // so we need to reset the target on the new event + event.target = this.element[ 0 ]; + + // copy original event properties over to the new event + orig = event.originalEvent; + if ( orig ) { + for ( prop in orig ) { + if ( !( prop in event ) ) { + event[ prop ] = orig[ prop ]; + } + } + } + + this.element.trigger( event, data ); + return !( $.isFunction( callback ) && + callback.apply( this.element[0], [ event ].concat( data ) ) === false || + event.isDefaultPrevented() ); + } +}; + +$.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) { + $.Widget.prototype[ "_" + method ] = function( element, options, callback ) { + if ( typeof options === "string" ) { + options = { effect: options }; + } + var hasOptions, + effectName = !options ? + method : + options === true || typeof options === "number" ? + defaultEffect : + options.effect || defaultEffect; + options = options || {}; + if ( typeof options === "number" ) { + options = { duration: options }; + } + hasOptions = !$.isEmptyObject( options ); + options.complete = callback; + if ( options.delay ) { + element.delay( options.delay ); + } + if ( hasOptions && $.effects && $.effects.effect[ effectName ] ) { + element[ method ]( options ); + } else if ( effectName !== method && element[ effectName ] ) { + element[ effectName ]( options.duration, options.easing, callback ); + } else { + element.queue(function( next ) { + $( this )[ method ](); + if ( callback ) { + callback.call( element[ 0 ] ); + } + next(); + }); + } + }; +}); + +var widget = $.widget; + + +/*! + * jQuery UI Mouse 1.11.4 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://api.jqueryui.com/mouse/ + */ + + +var mouseHandled = false; +$( document ).mouseup( function() { + mouseHandled = false; +}); + +var mouse = $.widget("ui.mouse", { + version: "1.11.4", + options: { + cancel: "input,textarea,button,select,option", + distance: 1, + delay: 0 + }, + _mouseInit: function() { + var that = this; + + this.element + .bind("mousedown." + this.widgetName, function(event) { + return that._mouseDown(event); + }) + .bind("click." + this.widgetName, function(event) { + if (true === $.data(event.target, that.widgetName + ".preventClickEvent")) { + $.removeData(event.target, that.widgetName + ".preventClickEvent"); + event.stopImmediatePropagation(); + return false; + } + }); + + this.started = false; + }, + + // TODO: make sure destroying one instance of mouse doesn't mess with + // other instances of mouse + _mouseDestroy: function() { + this.element.unbind("." + this.widgetName); + if ( this._mouseMoveDelegate ) { + this.document + .unbind("mousemove." + this.widgetName, this._mouseMoveDelegate) + .unbind("mouseup." + this.widgetName, this._mouseUpDelegate); + } + }, + + _mouseDown: function(event) { + // don't let more than one widget handle mouseStart + if ( mouseHandled ) { + return; + } + + this._mouseMoved = false; + + // we may have missed mouseup (out of window) + (this._mouseStarted && this._mouseUp(event)); + + this._mouseDownEvent = event; + + var that = this, + btnIsLeft = (event.which === 1), + // event.target.nodeName works around a bug in IE 8 with + // disabled inputs (#7620) + elIsCancel = (typeof this.options.cancel === "string" && event.target.nodeName ? $(event.target).closest(this.options.cancel).length : false); + if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) { + return true; + } + + this.mouseDelayMet = !this.options.delay; + if (!this.mouseDelayMet) { + this._mouseDelayTimer = setTimeout(function() { + that.mouseDelayMet = true; + }, this.options.delay); + } + + if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) { + this._mouseStarted = (this._mouseStart(event) !== false); + if (!this._mouseStarted) { + event.preventDefault(); + return true; + } + } + + // Click event may never have fired (Gecko & Opera) + if (true === $.data(event.target, this.widgetName + ".preventClickEvent")) { + $.removeData(event.target, this.widgetName + ".preventClickEvent"); + } + + // these delegates are required to keep context + this._mouseMoveDelegate = function(event) { + return that._mouseMove(event); + }; + this._mouseUpDelegate = function(event) { + return that._mouseUp(event); + }; + + this.document + .bind( "mousemove." + this.widgetName, this._mouseMoveDelegate ) + .bind( "mouseup." + this.widgetName, this._mouseUpDelegate ); + + event.preventDefault(); + + mouseHandled = true; + return true; + }, + + _mouseMove: function(event) { + // Only check for mouseups outside the document if you've moved inside the document + // at least once. This prevents the firing of mouseup in the case of IE<9, which will + // fire a mousemove event if content is placed under the cursor. See #7778 + // Support: IE <9 + if ( this._mouseMoved ) { + // IE mouseup check - mouseup happened when mouse was out of window + if ($.ui.ie && ( !document.documentMode || document.documentMode < 9 ) && !event.button) { + return this._mouseUp(event); + + // Iframe mouseup check - mouseup occurred in another document + } else if ( !event.which ) { + return this._mouseUp( event ); + } + } + + if ( event.which || event.button ) { + this._mouseMoved = true; + } + + if (this._mouseStarted) { + this._mouseDrag(event); + return event.preventDefault(); + } + + if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) { + this._mouseStarted = + (this._mouseStart(this._mouseDownEvent, event) !== false); + (this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event)); + } + + return !this._mouseStarted; + }, + + _mouseUp: function(event) { + this.document + .unbind( "mousemove." + this.widgetName, this._mouseMoveDelegate ) + .unbind( "mouseup." + this.widgetName, this._mouseUpDelegate ); + + if (this._mouseStarted) { + this._mouseStarted = false; + + if (event.target === this._mouseDownEvent.target) { + $.data(event.target, this.widgetName + ".preventClickEvent", true); + } + + this._mouseStop(event); + } + + mouseHandled = false; + return false; + }, + + _mouseDistanceMet: function(event) { + return (Math.max( + Math.abs(this._mouseDownEvent.pageX - event.pageX), + Math.abs(this._mouseDownEvent.pageY - event.pageY) + ) >= this.options.distance + ); + }, + + _mouseDelayMet: function(/* event */) { + return this.mouseDelayMet; + }, + + // These are placeholder methods, to be overriden by extending plugin + _mouseStart: function(/* event */) {}, + _mouseDrag: function(/* event */) {}, + _mouseStop: function(/* event */) {}, + _mouseCapture: function(/* event */) { return true; } +}); + + +/*! + * jQuery UI Position 1.11.4 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://api.jqueryui.com/position/ + */ + +(function() { + +$.ui = $.ui || {}; + +var cachedScrollbarWidth, supportsOffsetFractions, + max = Math.max, + abs = Math.abs, + round = Math.round, + rhorizontal = /left|center|right/, + rvertical = /top|center|bottom/, + roffset = /[\+\-]\d+(\.[\d]+)?%?/, + rposition = /^\w+/, + rpercent = /%$/, + _position = $.fn.position; + +function getOffsets( offsets, width, height ) { + return [ + parseFloat( offsets[ 0 ] ) * ( rpercent.test( offsets[ 0 ] ) ? width / 100 : 1 ), + parseFloat( offsets[ 1 ] ) * ( rpercent.test( offsets[ 1 ] ) ? height / 100 : 1 ) + ]; +} + +function parseCss( element, property ) { + return parseInt( $.css( element, property ), 10 ) || 0; +} + +function getDimensions( elem ) { + var raw = elem[0]; + if ( raw.nodeType === 9 ) { + return { + width: elem.width(), + height: elem.height(), + offset: { top: 0, left: 0 } + }; + } + if ( $.isWindow( raw ) ) { + return { + width: elem.width(), + height: elem.height(), + offset: { top: elem.scrollTop(), left: elem.scrollLeft() } + }; + } + if ( raw.preventDefault ) { + return { + width: 0, + height: 0, + offset: { top: raw.pageY, left: raw.pageX } + }; + } + return { + width: elem.outerWidth(), + height: elem.outerHeight(), + offset: elem.offset() + }; +} + +$.position = { + scrollbarWidth: function() { + if ( cachedScrollbarWidth !== undefined ) { + return cachedScrollbarWidth; + } + var w1, w2, + div = $( "
" ), + innerDiv = div.children()[0]; + + $( "body" ).append( div ); + w1 = innerDiv.offsetWidth; + div.css( "overflow", "scroll" ); + + w2 = innerDiv.offsetWidth; + + if ( w1 === w2 ) { + w2 = div[0].clientWidth; + } + + div.remove(); + + return (cachedScrollbarWidth = w1 - w2); + }, + getScrollInfo: function( within ) { + var overflowX = within.isWindow || within.isDocument ? "" : + within.element.css( "overflow-x" ), + overflowY = within.isWindow || within.isDocument ? "" : + within.element.css( "overflow-y" ), + hasOverflowX = overflowX === "scroll" || + ( overflowX === "auto" && within.width < within.element[0].scrollWidth ), + hasOverflowY = overflowY === "scroll" || + ( overflowY === "auto" && within.height < within.element[0].scrollHeight ); + return { + width: hasOverflowY ? $.position.scrollbarWidth() : 0, + height: hasOverflowX ? $.position.scrollbarWidth() : 0 + }; + }, + getWithinInfo: function( element ) { + var withinElement = $( element || window ), + isWindow = $.isWindow( withinElement[0] ), + isDocument = !!withinElement[ 0 ] && withinElement[ 0 ].nodeType === 9; + return { + element: withinElement, + isWindow: isWindow, + isDocument: isDocument, + offset: withinElement.offset() || { left: 0, top: 0 }, + scrollLeft: withinElement.scrollLeft(), + scrollTop: withinElement.scrollTop(), + + // support: jQuery 1.6.x + // jQuery 1.6 doesn't support .outerWidth/Height() on documents or windows + width: isWindow || isDocument ? withinElement.width() : withinElement.outerWidth(), + height: isWindow || isDocument ? withinElement.height() : withinElement.outerHeight() + }; + } +}; + +$.fn.position = function( options ) { + if ( !options || !options.of ) { + return _position.apply( this, arguments ); + } + + // make a copy, we don't want to modify arguments + options = $.extend( {}, options ); + + var atOffset, targetWidth, targetHeight, targetOffset, basePosition, dimensions, + target = $( options.of ), + within = $.position.getWithinInfo( options.within ), + scrollInfo = $.position.getScrollInfo( within ), + collision = ( options.collision || "flip" ).split( " " ), + offsets = {}; + + dimensions = getDimensions( target ); + if ( target[0].preventDefault ) { + // force left top to allow flipping + options.at = "left top"; + } + targetWidth = dimensions.width; + targetHeight = dimensions.height; + targetOffset = dimensions.offset; + // clone to reuse original targetOffset later + basePosition = $.extend( {}, targetOffset ); + + // force my and at to have valid horizontal and vertical positions + // if a value is missing or invalid, it will be converted to center + $.each( [ "my", "at" ], function() { + var pos = ( options[ this ] || "" ).split( " " ), + horizontalOffset, + verticalOffset; + + if ( pos.length === 1) { + pos = rhorizontal.test( pos[ 0 ] ) ? + pos.concat( [ "center" ] ) : + rvertical.test( pos[ 0 ] ) ? + [ "center" ].concat( pos ) : + [ "center", "center" ]; + } + pos[ 0 ] = rhorizontal.test( pos[ 0 ] ) ? pos[ 0 ] : "center"; + pos[ 1 ] = rvertical.test( pos[ 1 ] ) ? pos[ 1 ] : "center"; + + // calculate offsets + horizontalOffset = roffset.exec( pos[ 0 ] ); + verticalOffset = roffset.exec( pos[ 1 ] ); + offsets[ this ] = [ + horizontalOffset ? horizontalOffset[ 0 ] : 0, + verticalOffset ? verticalOffset[ 0 ] : 0 + ]; + + // reduce to just the positions without the offsets + options[ this ] = [ + rposition.exec( pos[ 0 ] )[ 0 ], + rposition.exec( pos[ 1 ] )[ 0 ] + ]; + }); + + // normalize collision option + if ( collision.length === 1 ) { + collision[ 1 ] = collision[ 0 ]; + } + + if ( options.at[ 0 ] === "right" ) { + basePosition.left += targetWidth; + } else if ( options.at[ 0 ] === "center" ) { + basePosition.left += targetWidth / 2; + } + + if ( options.at[ 1 ] === "bottom" ) { + basePosition.top += targetHeight; + } else if ( options.at[ 1 ] === "center" ) { + basePosition.top += targetHeight / 2; + } + + atOffset = getOffsets( offsets.at, targetWidth, targetHeight ); + basePosition.left += atOffset[ 0 ]; + basePosition.top += atOffset[ 1 ]; + + return this.each(function() { + var collisionPosition, using, + elem = $( this ), + elemWidth = elem.outerWidth(), + elemHeight = elem.outerHeight(), + marginLeft = parseCss( this, "marginLeft" ), + marginTop = parseCss( this, "marginTop" ), + collisionWidth = elemWidth + marginLeft + parseCss( this, "marginRight" ) + scrollInfo.width, + collisionHeight = elemHeight + marginTop + parseCss( this, "marginBottom" ) + scrollInfo.height, + position = $.extend( {}, basePosition ), + myOffset = getOffsets( offsets.my, elem.outerWidth(), elem.outerHeight() ); + + if ( options.my[ 0 ] === "right" ) { + position.left -= elemWidth; + } else if ( options.my[ 0 ] === "center" ) { + position.left -= elemWidth / 2; + } + + if ( options.my[ 1 ] === "bottom" ) { + position.top -= elemHeight; + } else if ( options.my[ 1 ] === "center" ) { + position.top -= elemHeight / 2; + } + + position.left += myOffset[ 0 ]; + position.top += myOffset[ 1 ]; + + // if the browser doesn't support fractions, then round for consistent results + if ( !supportsOffsetFractions ) { + position.left = round( position.left ); + position.top = round( position.top ); + } + + collisionPosition = { + marginLeft: marginLeft, + marginTop: marginTop + }; + + $.each( [ "left", "top" ], function( i, dir ) { + if ( $.ui.position[ collision[ i ] ] ) { + $.ui.position[ collision[ i ] ][ dir ]( position, { + targetWidth: targetWidth, + targetHeight: targetHeight, + elemWidth: elemWidth, + elemHeight: elemHeight, + collisionPosition: collisionPosition, + collisionWidth: collisionWidth, + collisionHeight: collisionHeight, + offset: [ atOffset[ 0 ] + myOffset[ 0 ], atOffset [ 1 ] + myOffset[ 1 ] ], + my: options.my, + at: options.at, + within: within, + elem: elem + }); + } + }); + + if ( options.using ) { + // adds feedback as second argument to using callback, if present + using = function( props ) { + var left = targetOffset.left - position.left, + right = left + targetWidth - elemWidth, + top = targetOffset.top - position.top, + bottom = top + targetHeight - elemHeight, + feedback = { + target: { + element: target, + left: targetOffset.left, + top: targetOffset.top, + width: targetWidth, + height: targetHeight + }, + element: { + element: elem, + left: position.left, + top: position.top, + width: elemWidth, + height: elemHeight + }, + horizontal: right < 0 ? "left" : left > 0 ? "right" : "center", + vertical: bottom < 0 ? "top" : top > 0 ? "bottom" : "middle" + }; + if ( targetWidth < elemWidth && abs( left + right ) < targetWidth ) { + feedback.horizontal = "center"; + } + if ( targetHeight < elemHeight && abs( top + bottom ) < targetHeight ) { + feedback.vertical = "middle"; + } + if ( max( abs( left ), abs( right ) ) > max( abs( top ), abs( bottom ) ) ) { + feedback.important = "horizontal"; + } else { + feedback.important = "vertical"; + } + options.using.call( this, props, feedback ); + }; + } + + elem.offset( $.extend( position, { using: using } ) ); + }); +}; + +$.ui.position = { + fit: { + left: function( position, data ) { + var within = data.within, + withinOffset = within.isWindow ? within.scrollLeft : within.offset.left, + outerWidth = within.width, + collisionPosLeft = position.left - data.collisionPosition.marginLeft, + overLeft = withinOffset - collisionPosLeft, + overRight = collisionPosLeft + data.collisionWidth - outerWidth - withinOffset, + newOverRight; + + // element is wider than within + if ( data.collisionWidth > outerWidth ) { + // element is initially over the left side of within + if ( overLeft > 0 && overRight <= 0 ) { + newOverRight = position.left + overLeft + data.collisionWidth - outerWidth - withinOffset; + position.left += overLeft - newOverRight; + // element is initially over right side of within + } else if ( overRight > 0 && overLeft <= 0 ) { + position.left = withinOffset; + // element is initially over both left and right sides of within + } else { + if ( overLeft > overRight ) { + position.left = withinOffset + outerWidth - data.collisionWidth; + } else { + position.left = withinOffset; + } + } + // too far left -> align with left edge + } else if ( overLeft > 0 ) { + position.left += overLeft; + // too far right -> align with right edge + } else if ( overRight > 0 ) { + position.left -= overRight; + // adjust based on position and margin + } else { + position.left = max( position.left - collisionPosLeft, position.left ); + } + }, + top: function( position, data ) { + var within = data.within, + withinOffset = within.isWindow ? within.scrollTop : within.offset.top, + outerHeight = data.within.height, + collisionPosTop = position.top - data.collisionPosition.marginTop, + overTop = withinOffset - collisionPosTop, + overBottom = collisionPosTop + data.collisionHeight - outerHeight - withinOffset, + newOverBottom; + + // element is taller than within + if ( data.collisionHeight > outerHeight ) { + // element is initially over the top of within + if ( overTop > 0 && overBottom <= 0 ) { + newOverBottom = position.top + overTop + data.collisionHeight - outerHeight - withinOffset; + position.top += overTop - newOverBottom; + // element is initially over bottom of within + } else if ( overBottom > 0 && overTop <= 0 ) { + position.top = withinOffset; + // element is initially over both top and bottom of within + } else { + if ( overTop > overBottom ) { + position.top = withinOffset + outerHeight - data.collisionHeight; + } else { + position.top = withinOffset; + } + } + // too far up -> align with top + } else if ( overTop > 0 ) { + position.top += overTop; + // too far down -> align with bottom edge + } else if ( overBottom > 0 ) { + position.top -= overBottom; + // adjust based on position and margin + } else { + position.top = max( position.top - collisionPosTop, position.top ); + } + } + }, + flip: { + left: function( position, data ) { + var within = data.within, + withinOffset = within.offset.left + within.scrollLeft, + outerWidth = within.width, + offsetLeft = within.isWindow ? within.scrollLeft : within.offset.left, + collisionPosLeft = position.left - data.collisionPosition.marginLeft, + overLeft = collisionPosLeft - offsetLeft, + overRight = collisionPosLeft + data.collisionWidth - outerWidth - offsetLeft, + myOffset = data.my[ 0 ] === "left" ? + -data.elemWidth : + data.my[ 0 ] === "right" ? + data.elemWidth : + 0, + atOffset = data.at[ 0 ] === "left" ? + data.targetWidth : + data.at[ 0 ] === "right" ? + -data.targetWidth : + 0, + offset = -2 * data.offset[ 0 ], + newOverRight, + newOverLeft; + + if ( overLeft < 0 ) { + newOverRight = position.left + myOffset + atOffset + offset + data.collisionWidth - outerWidth - withinOffset; + if ( newOverRight < 0 || newOverRight < abs( overLeft ) ) { + position.left += myOffset + atOffset + offset; + } + } else if ( overRight > 0 ) { + newOverLeft = position.left - data.collisionPosition.marginLeft + myOffset + atOffset + offset - offsetLeft; + if ( newOverLeft > 0 || abs( newOverLeft ) < overRight ) { + position.left += myOffset + atOffset + offset; + } + } + }, + top: function( position, data ) { + var within = data.within, + withinOffset = within.offset.top + within.scrollTop, + outerHeight = within.height, + offsetTop = within.isWindow ? within.scrollTop : within.offset.top, + collisionPosTop = position.top - data.collisionPosition.marginTop, + overTop = collisionPosTop - offsetTop, + overBottom = collisionPosTop + data.collisionHeight - outerHeight - offsetTop, + top = data.my[ 1 ] === "top", + myOffset = top ? + -data.elemHeight : + data.my[ 1 ] === "bottom" ? + data.elemHeight : + 0, + atOffset = data.at[ 1 ] === "top" ? + data.targetHeight : + data.at[ 1 ] === "bottom" ? + -data.targetHeight : + 0, + offset = -2 * data.offset[ 1 ], + newOverTop, + newOverBottom; + if ( overTop < 0 ) { + newOverBottom = position.top + myOffset + atOffset + offset + data.collisionHeight - outerHeight - withinOffset; + if ( newOverBottom < 0 || newOverBottom < abs( overTop ) ) { + position.top += myOffset + atOffset + offset; + } + } else if ( overBottom > 0 ) { + newOverTop = position.top - data.collisionPosition.marginTop + myOffset + atOffset + offset - offsetTop; + if ( newOverTop > 0 || abs( newOverTop ) < overBottom ) { + position.top += myOffset + atOffset + offset; + } + } + } + }, + flipfit: { + left: function() { + $.ui.position.flip.left.apply( this, arguments ); + $.ui.position.fit.left.apply( this, arguments ); + }, + top: function() { + $.ui.position.flip.top.apply( this, arguments ); + $.ui.position.fit.top.apply( this, arguments ); + } + } +}; + +// fraction support test +(function() { + var testElement, testElementParent, testElementStyle, offsetLeft, i, + body = document.getElementsByTagName( "body" )[ 0 ], + div = document.createElement( "div" ); + + //Create a "fake body" for testing based on method used in jQuery.support + testElement = document.createElement( body ? "div" : "body" ); + testElementStyle = { + visibility: "hidden", + width: 0, + height: 0, + border: 0, + margin: 0, + background: "none" + }; + if ( body ) { + $.extend( testElementStyle, { + position: "absolute", + left: "-1000px", + top: "-1000px" + }); + } + for ( i in testElementStyle ) { + testElement.style[ i ] = testElementStyle[ i ]; + } + testElement.appendChild( div ); + testElementParent = body || document.documentElement; + testElementParent.insertBefore( testElement, testElementParent.firstChild ); + + div.style.cssText = "position: absolute; left: 10.7432222px;"; + + offsetLeft = $( div ).offset().left; + supportsOffsetFractions = offsetLeft > 10 && offsetLeft < 11; + + testElement.innerHTML = ""; + testElementParent.removeChild( testElement ); +})(); + +})(); + +var position = $.ui.position; + + +/*! + * jQuery UI Accordion 1.11.4 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://api.jqueryui.com/accordion/ + */ + + +var accordion = $.widget( "ui.accordion", { + version: "1.11.4", + options: { + active: 0, + animate: {}, + collapsible: false, + event: "click", + header: "> li > :first-child,> :not(li):even", + heightStyle: "auto", + icons: { + activeHeader: "ui-icon-triangle-1-s", + header: "ui-icon-triangle-1-e" + }, + + // callbacks + activate: null, + beforeActivate: null + }, + + hideProps: { + borderTopWidth: "hide", + borderBottomWidth: "hide", + paddingTop: "hide", + paddingBottom: "hide", + height: "hide" + }, + + showProps: { + borderTopWidth: "show", + borderBottomWidth: "show", + paddingTop: "show", + paddingBottom: "show", + height: "show" + }, + + _create: function() { + var options = this.options; + this.prevShow = this.prevHide = $(); + this.element.addClass( "ui-accordion ui-widget ui-helper-reset" ) + // ARIA + .attr( "role", "tablist" ); + + // don't allow collapsible: false and active: false / null + if ( !options.collapsible && (options.active === false || options.active == null) ) { + options.active = 0; + } + + this._processPanels(); + // handle negative values + if ( options.active < 0 ) { + options.active += this.headers.length; + } + this._refresh(); + }, + + _getCreateEventData: function() { + return { + header: this.active, + panel: !this.active.length ? $() : this.active.next() + }; + }, + + _createIcons: function() { + var icons = this.options.icons; + if ( icons ) { + $( "" ) + .addClass( "ui-accordion-header-icon ui-icon " + icons.header ) + .prependTo( this.headers ); + this.active.children( ".ui-accordion-header-icon" ) + .removeClass( icons.header ) + .addClass( icons.activeHeader ); + this.headers.addClass( "ui-accordion-icons" ); + } + }, + + _destroyIcons: function() { + this.headers + .removeClass( "ui-accordion-icons" ) + .children( ".ui-accordion-header-icon" ) + .remove(); + }, + + _destroy: function() { + var contents; + + // clean up main element + this.element + .removeClass( "ui-accordion ui-widget ui-helper-reset" ) + .removeAttr( "role" ); + + // clean up headers + this.headers + .removeClass( "ui-accordion-header ui-accordion-header-active ui-state-default " + + "ui-corner-all ui-state-active ui-state-disabled ui-corner-top" ) + .removeAttr( "role" ) + .removeAttr( "aria-expanded" ) + .removeAttr( "aria-selected" ) + .removeAttr( "aria-controls" ) + .removeAttr( "tabIndex" ) + .removeUniqueId(); + + this._destroyIcons(); + + // clean up content panels + contents = this.headers.next() + .removeClass( "ui-helper-reset ui-widget-content ui-corner-bottom " + + "ui-accordion-content ui-accordion-content-active ui-state-disabled" ) + .css( "display", "" ) + .removeAttr( "role" ) + .removeAttr( "aria-hidden" ) + .removeAttr( "aria-labelledby" ) + .removeUniqueId(); + + if ( this.options.heightStyle !== "content" ) { + contents.css( "height", "" ); + } + }, + + _setOption: function( key, value ) { + if ( key === "active" ) { + // _activate() will handle invalid values and update this.options + this._activate( value ); + return; + } + + if ( key === "event" ) { + if ( this.options.event ) { + this._off( this.headers, this.options.event ); + } + this._setupEvents( value ); + } + + this._super( key, value ); + + // setting collapsible: false while collapsed; open first panel + if ( key === "collapsible" && !value && this.options.active === false ) { + this._activate( 0 ); + } + + if ( key === "icons" ) { + this._destroyIcons(); + if ( value ) { + this._createIcons(); + } + } + + // #5332 - opacity doesn't cascade to positioned elements in IE + // so we need to add the disabled class to the headers and panels + if ( key === "disabled" ) { + this.element + .toggleClass( "ui-state-disabled", !!value ) + .attr( "aria-disabled", value ); + this.headers.add( this.headers.next() ) + .toggleClass( "ui-state-disabled", !!value ); + } + }, + + _keydown: function( event ) { + if ( event.altKey || event.ctrlKey ) { + return; + } + + var keyCode = $.ui.keyCode, + length = this.headers.length, + currentIndex = this.headers.index( event.target ), + toFocus = false; + + switch ( event.keyCode ) { + case keyCode.RIGHT: + case keyCode.DOWN: + toFocus = this.headers[ ( currentIndex + 1 ) % length ]; + break; + case keyCode.LEFT: + case keyCode.UP: + toFocus = this.headers[ ( currentIndex - 1 + length ) % length ]; + break; + case keyCode.SPACE: + case keyCode.ENTER: + this._eventHandler( event ); + break; + case keyCode.HOME: + toFocus = this.headers[ 0 ]; + break; + case keyCode.END: + toFocus = this.headers[ length - 1 ]; + break; + } + + if ( toFocus ) { + $( event.target ).attr( "tabIndex", -1 ); + $( toFocus ).attr( "tabIndex", 0 ); + toFocus.focus(); + event.preventDefault(); + } + }, + + _panelKeyDown: function( event ) { + if ( event.keyCode === $.ui.keyCode.UP && event.ctrlKey ) { + $( event.currentTarget ).prev().focus(); + } + }, + + refresh: function() { + var options = this.options; + this._processPanels(); + + // was collapsed or no panel + if ( ( options.active === false && options.collapsible === true ) || !this.headers.length ) { + options.active = false; + this.active = $(); + // active false only when collapsible is true + } else if ( options.active === false ) { + this._activate( 0 ); + // was active, but active panel is gone + } else if ( this.active.length && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) { + // all remaining panel are disabled + if ( this.headers.length === this.headers.find(".ui-state-disabled").length ) { + options.active = false; + this.active = $(); + // activate previous panel + } else { + this._activate( Math.max( 0, options.active - 1 ) ); + } + // was active, active panel still exists + } else { + // make sure active index is correct + options.active = this.headers.index( this.active ); + } + + this._destroyIcons(); + + this._refresh(); + }, + + _processPanels: function() { + var prevHeaders = this.headers, + prevPanels = this.panels; + + this.headers = this.element.find( this.options.header ) + .addClass( "ui-accordion-header ui-state-default ui-corner-all" ); + + this.panels = this.headers.next() + .addClass( "ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom" ) + .filter( ":not(.ui-accordion-content-active)" ) + .hide(); + + // Avoid memory leaks (#10056) + if ( prevPanels ) { + this._off( prevHeaders.not( this.headers ) ); + this._off( prevPanels.not( this.panels ) ); + } + }, + + _refresh: function() { + var maxHeight, + options = this.options, + heightStyle = options.heightStyle, + parent = this.element.parent(); + + this.active = this._findActive( options.active ) + .addClass( "ui-accordion-header-active ui-state-active ui-corner-top" ) + .removeClass( "ui-corner-all" ); + this.active.next() + .addClass( "ui-accordion-content-active" ) + .show(); + + this.headers + .attr( "role", "tab" ) + .each(function() { + var header = $( this ), + headerId = header.uniqueId().attr( "id" ), + panel = header.next(), + panelId = panel.uniqueId().attr( "id" ); + header.attr( "aria-controls", panelId ); + panel.attr( "aria-labelledby", headerId ); + }) + .next() + .attr( "role", "tabpanel" ); + + this.headers + .not( this.active ) + .attr({ + "aria-selected": "false", + "aria-expanded": "false", + tabIndex: -1 + }) + .next() + .attr({ + "aria-hidden": "true" + }) + .hide(); + + // make sure at least one header is in the tab order + if ( !this.active.length ) { + this.headers.eq( 0 ).attr( "tabIndex", 0 ); + } else { + this.active.attr({ + "aria-selected": "true", + "aria-expanded": "true", + tabIndex: 0 + }) + .next() + .attr({ + "aria-hidden": "false" + }); + } + + this._createIcons(); + + this._setupEvents( options.event ); + + if ( heightStyle === "fill" ) { + maxHeight = parent.height(); + this.element.siblings( ":visible" ).each(function() { + var elem = $( this ), + position = elem.css( "position" ); + + if ( position === "absolute" || position === "fixed" ) { + return; + } + maxHeight -= elem.outerHeight( true ); + }); + + this.headers.each(function() { + maxHeight -= $( this ).outerHeight( true ); + }); + + this.headers.next() + .each(function() { + $( this ).height( Math.max( 0, maxHeight - + $( this ).innerHeight() + $( this ).height() ) ); + }) + .css( "overflow", "auto" ); + } else if ( heightStyle === "auto" ) { + maxHeight = 0; + this.headers.next() + .each(function() { + maxHeight = Math.max( maxHeight, $( this ).css( "height", "" ).height() ); + }) + .height( maxHeight ); + } + }, + + _activate: function( index ) { + var active = this._findActive( index )[ 0 ]; + + // trying to activate the already active panel + if ( active === this.active[ 0 ] ) { + return; + } + + // trying to collapse, simulate a click on the currently active header + active = active || this.active[ 0 ]; + + this._eventHandler({ + target: active, + currentTarget: active, + preventDefault: $.noop + }); + }, + + _findActive: function( selector ) { + return typeof selector === "number" ? this.headers.eq( selector ) : $(); + }, + + _setupEvents: function( event ) { + var events = { + keydown: "_keydown" + }; + if ( event ) { + $.each( event.split( " " ), function( index, eventName ) { + events[ eventName ] = "_eventHandler"; + }); + } + + this._off( this.headers.add( this.headers.next() ) ); + this._on( this.headers, events ); + this._on( this.headers.next(), { keydown: "_panelKeyDown" }); + this._hoverable( this.headers ); + this._focusable( this.headers ); + }, + + _eventHandler: function( event ) { + var options = this.options, + active = this.active, + clicked = $( event.currentTarget ), + clickedIsActive = clicked[ 0 ] === active[ 0 ], + collapsing = clickedIsActive && options.collapsible, + toShow = collapsing ? $() : clicked.next(), + toHide = active.next(), + eventData = { + oldHeader: active, + oldPanel: toHide, + newHeader: collapsing ? $() : clicked, + newPanel: toShow + }; + + event.preventDefault(); + + if ( + // click on active header, but not collapsible + ( clickedIsActive && !options.collapsible ) || + // allow canceling activation + ( this._trigger( "beforeActivate", event, eventData ) === false ) ) { + return; + } + + options.active = collapsing ? false : this.headers.index( clicked ); + + // when the call to ._toggle() comes after the class changes + // it causes a very odd bug in IE 8 (see #6720) + this.active = clickedIsActive ? $() : clicked; + this._toggle( eventData ); + + // switch classes + // corner classes on the previously active header stay after the animation + active.removeClass( "ui-accordion-header-active ui-state-active" ); + if ( options.icons ) { + active.children( ".ui-accordion-header-icon" ) + .removeClass( options.icons.activeHeader ) + .addClass( options.icons.header ); + } + + if ( !clickedIsActive ) { + clicked + .removeClass( "ui-corner-all" ) + .addClass( "ui-accordion-header-active ui-state-active ui-corner-top" ); + if ( options.icons ) { + clicked.children( ".ui-accordion-header-icon" ) + .removeClass( options.icons.header ) + .addClass( options.icons.activeHeader ); + } + + clicked + .next() + .addClass( "ui-accordion-content-active" ); + } + }, + + _toggle: function( data ) { + var toShow = data.newPanel, + toHide = this.prevShow.length ? this.prevShow : data.oldPanel; + + // handle activating a panel during the animation for another activation + this.prevShow.add( this.prevHide ).stop( true, true ); + this.prevShow = toShow; + this.prevHide = toHide; + + if ( this.options.animate ) { + this._animate( toShow, toHide, data ); + } else { + toHide.hide(); + toShow.show(); + this._toggleComplete( data ); + } + + toHide.attr({ + "aria-hidden": "true" + }); + toHide.prev().attr({ + "aria-selected": "false", + "aria-expanded": "false" + }); + // if we're switching panels, remove the old header from the tab order + // if we're opening from collapsed state, remove the previous header from the tab order + // if we're collapsing, then keep the collapsing header in the tab order + if ( toShow.length && toHide.length ) { + toHide.prev().attr({ + "tabIndex": -1, + "aria-expanded": "false" + }); + } else if ( toShow.length ) { + this.headers.filter(function() { + return parseInt( $( this ).attr( "tabIndex" ), 10 ) === 0; + }) + .attr( "tabIndex", -1 ); + } + + toShow + .attr( "aria-hidden", "false" ) + .prev() + .attr({ + "aria-selected": "true", + "aria-expanded": "true", + tabIndex: 0 + }); + }, + + _animate: function( toShow, toHide, data ) { + var total, easing, duration, + that = this, + adjust = 0, + boxSizing = toShow.css( "box-sizing" ), + down = toShow.length && + ( !toHide.length || ( toShow.index() < toHide.index() ) ), + animate = this.options.animate || {}, + options = down && animate.down || animate, + complete = function() { + that._toggleComplete( data ); + }; + + if ( typeof options === "number" ) { + duration = options; + } + if ( typeof options === "string" ) { + easing = options; + } + // fall back from options to animation in case of partial down settings + easing = easing || options.easing || animate.easing; + duration = duration || options.duration || animate.duration; + + if ( !toHide.length ) { + return toShow.animate( this.showProps, duration, easing, complete ); + } + if ( !toShow.length ) { + return toHide.animate( this.hideProps, duration, easing, complete ); + } + + total = toShow.show().outerHeight(); + toHide.animate( this.hideProps, { + duration: duration, + easing: easing, + step: function( now, fx ) { + fx.now = Math.round( now ); + } + }); + toShow + .hide() + .animate( this.showProps, { + duration: duration, + easing: easing, + complete: complete, + step: function( now, fx ) { + fx.now = Math.round( now ); + if ( fx.prop !== "height" ) { + if ( boxSizing === "content-box" ) { + adjust += fx.now; + } + } else if ( that.options.heightStyle !== "content" ) { + fx.now = Math.round( total - toHide.outerHeight() - adjust ); + adjust = 0; + } + } + }); + }, + + _toggleComplete: function( data ) { + var toHide = data.oldPanel; + + toHide + .removeClass( "ui-accordion-content-active" ) + .prev() + .removeClass( "ui-corner-top" ) + .addClass( "ui-corner-all" ); + + // Work around for rendering bug in IE (#5421) + if ( toHide.length ) { + toHide.parent()[ 0 ].className = toHide.parent()[ 0 ].className; + } + this._trigger( "activate", null, data ); + } +}); + + +/*! + * jQuery UI Menu 1.11.4 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://api.jqueryui.com/menu/ + */ + + +var menu = $.widget( "ui.menu", { + version: "1.11.4", + defaultElement: "
    ", + delay: 300, + options: { + icons: { + submenu: "ui-icon-carat-1-e" + }, + items: "> *", + menus: "ul", + position: { + my: "left-1 top", + at: "right top" + }, + role: "menu", + + // callbacks + blur: null, + focus: null, + select: null + }, + + _create: function() { + this.activeMenu = this.element; + + // Flag used to prevent firing of the click handler + // as the event bubbles up through nested menus + this.mouseHandled = false; + this.element + .uniqueId() + .addClass( "ui-menu ui-widget ui-widget-content" ) + .toggleClass( "ui-menu-icons", !!this.element.find( ".ui-icon" ).length ) + .attr({ + role: this.options.role, + tabIndex: 0 + }); + + if ( this.options.disabled ) { + this.element + .addClass( "ui-state-disabled" ) + .attr( "aria-disabled", "true" ); + } + + this._on({ + // Prevent focus from sticking to links inside menu after clicking + // them (focus should always stay on UL during navigation). + "mousedown .ui-menu-item": function( event ) { + event.preventDefault(); + }, + "click .ui-menu-item": function( event ) { + var target = $( event.target ); + if ( !this.mouseHandled && target.not( ".ui-state-disabled" ).length ) { + this.select( event ); + + // Only set the mouseHandled flag if the event will bubble, see #9469. + if ( !event.isPropagationStopped() ) { + this.mouseHandled = true; + } + + // Open submenu on click + if ( target.has( ".ui-menu" ).length ) { + this.expand( event ); + } else if ( !this.element.is( ":focus" ) && $( this.document[ 0 ].activeElement ).closest( ".ui-menu" ).length ) { + + // Redirect focus to the menu + this.element.trigger( "focus", [ true ] ); + + // If the active item is on the top level, let it stay active. + // Otherwise, blur the active item since it is no longer visible. + if ( this.active && this.active.parents( ".ui-menu" ).length === 1 ) { + clearTimeout( this.timer ); + } + } + } + }, + "mouseenter .ui-menu-item": function( event ) { + // Ignore mouse events while typeahead is active, see #10458. + // Prevents focusing the wrong item when typeahead causes a scroll while the mouse + // is over an item in the menu + if ( this.previousFilter ) { + return; + } + var target = $( event.currentTarget ); + // Remove ui-state-active class from siblings of the newly focused menu item + // to avoid a jump caused by adjacent elements both having a class with a border + target.siblings( ".ui-state-active" ).removeClass( "ui-state-active" ); + this.focus( event, target ); + }, + mouseleave: "collapseAll", + "mouseleave .ui-menu": "collapseAll", + focus: function( event, keepActiveItem ) { + // If there's already an active item, keep it active + // If not, activate the first item + var item = this.active || this.element.find( this.options.items ).eq( 0 ); + + if ( !keepActiveItem ) { + this.focus( event, item ); + } + }, + blur: function( event ) { + this._delay(function() { + if ( !$.contains( this.element[0], this.document[0].activeElement ) ) { + this.collapseAll( event ); + } + }); + }, + keydown: "_keydown" + }); + + this.refresh(); + + // Clicks outside of a menu collapse any open menus + this._on( this.document, { + click: function( event ) { + if ( this._closeOnDocumentClick( event ) ) { + this.collapseAll( event ); + } + + // Reset the mouseHandled flag + this.mouseHandled = false; + } + }); + }, + + _destroy: function() { + // Destroy (sub)menus + this.element + .removeAttr( "aria-activedescendant" ) + .find( ".ui-menu" ).addBack() + .removeClass( "ui-menu ui-widget ui-widget-content ui-menu-icons ui-front" ) + .removeAttr( "role" ) + .removeAttr( "tabIndex" ) + .removeAttr( "aria-labelledby" ) + .removeAttr( "aria-expanded" ) + .removeAttr( "aria-hidden" ) + .removeAttr( "aria-disabled" ) + .removeUniqueId() + .show(); + + // Destroy menu items + this.element.find( ".ui-menu-item" ) + .removeClass( "ui-menu-item" ) + .removeAttr( "role" ) + .removeAttr( "aria-disabled" ) + .removeUniqueId() + .removeClass( "ui-state-hover" ) + .removeAttr( "tabIndex" ) + .removeAttr( "role" ) + .removeAttr( "aria-haspopup" ) + .children().each( function() { + var elem = $( this ); + if ( elem.data( "ui-menu-submenu-carat" ) ) { + elem.remove(); + } + }); + + // Destroy menu dividers + this.element.find( ".ui-menu-divider" ).removeClass( "ui-menu-divider ui-widget-content" ); + }, + + _keydown: function( event ) { + var match, prev, character, skip, + preventDefault = true; + + switch ( event.keyCode ) { + case $.ui.keyCode.PAGE_UP: + this.previousPage( event ); + break; + case $.ui.keyCode.PAGE_DOWN: + this.nextPage( event ); + break; + case $.ui.keyCode.HOME: + this._move( "first", "first", event ); + break; + case $.ui.keyCode.END: + this._move( "last", "last", event ); + break; + case $.ui.keyCode.UP: + this.previous( event ); + break; + case $.ui.keyCode.DOWN: + this.next( event ); + break; + case $.ui.keyCode.LEFT: + this.collapse( event ); + break; + case $.ui.keyCode.RIGHT: + if ( this.active && !this.active.is( ".ui-state-disabled" ) ) { + this.expand( event ); + } + break; + case $.ui.keyCode.ENTER: + case $.ui.keyCode.SPACE: + this._activate( event ); + break; + case $.ui.keyCode.ESCAPE: + this.collapse( event ); + break; + default: + preventDefault = false; + prev = this.previousFilter || ""; + character = String.fromCharCode( event.keyCode ); + skip = false; + + clearTimeout( this.filterTimer ); + + if ( character === prev ) { + skip = true; + } else { + character = prev + character; + } + + match = this._filterMenuItems( character ); + match = skip && match.index( this.active.next() ) !== -1 ? + this.active.nextAll( ".ui-menu-item" ) : + match; + + // If no matches on the current filter, reset to the last character pressed + // to move down the menu to the first item that starts with that character + if ( !match.length ) { + character = String.fromCharCode( event.keyCode ); + match = this._filterMenuItems( character ); + } + + if ( match.length ) { + this.focus( event, match ); + this.previousFilter = character; + this.filterTimer = this._delay(function() { + delete this.previousFilter; + }, 1000 ); + } else { + delete this.previousFilter; + } + } + + if ( preventDefault ) { + event.preventDefault(); + } + }, + + _activate: function( event ) { + if ( !this.active.is( ".ui-state-disabled" ) ) { + if ( this.active.is( "[aria-haspopup='true']" ) ) { + this.expand( event ); + } else { + this.select( event ); + } + } + }, + + refresh: function() { + var menus, items, + that = this, + icon = this.options.icons.submenu, + submenus = this.element.find( this.options.menus ); + + this.element.toggleClass( "ui-menu-icons", !!this.element.find( ".ui-icon" ).length ); + + // Initialize nested menus + submenus.filter( ":not(.ui-menu)" ) + .addClass( "ui-menu ui-widget ui-widget-content ui-front" ) + .hide() + .attr({ + role: this.options.role, + "aria-hidden": "true", + "aria-expanded": "false" + }) + .each(function() { + var menu = $( this ), + item = menu.parent(), + submenuCarat = $( "" ) + .addClass( "ui-menu-icon ui-icon " + icon ) + .data( "ui-menu-submenu-carat", true ); + + item + .attr( "aria-haspopup", "true" ) + .prepend( submenuCarat ); + menu.attr( "aria-labelledby", item.attr( "id" ) ); + }); + + menus = submenus.add( this.element ); + items = menus.find( this.options.items ); + + // Initialize menu-items containing spaces and/or dashes only as dividers + items.not( ".ui-menu-item" ).each(function() { + var item = $( this ); + if ( that._isDivider( item ) ) { + item.addClass( "ui-widget-content ui-menu-divider" ); + } + }); + + // Don't refresh list items that are already adapted + items.not( ".ui-menu-item, .ui-menu-divider" ) + .addClass( "ui-menu-item" ) + .uniqueId() + .attr({ + tabIndex: -1, + role: this._itemRole() + }); + + // Add aria-disabled attribute to any disabled menu item + items.filter( ".ui-state-disabled" ).attr( "aria-disabled", "true" ); + + // If the active item has been removed, blur the menu + if ( this.active && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) { + this.blur(); + } + }, + + _itemRole: function() { + return { + menu: "menuitem", + listbox: "option" + }[ this.options.role ]; + }, + + _setOption: function( key, value ) { + if ( key === "icons" ) { + this.element.find( ".ui-menu-icon" ) + .removeClass( this.options.icons.submenu ) + .addClass( value.submenu ); + } + if ( key === "disabled" ) { + this.element + .toggleClass( "ui-state-disabled", !!value ) + .attr( "aria-disabled", value ); + } + this._super( key, value ); + }, + + focus: function( event, item ) { + var nested, focused; + this.blur( event, event && event.type === "focus" ); + + this._scrollIntoView( item ); + + this.active = item.first(); + focused = this.active.addClass( "ui-state-focus" ).removeClass( "ui-state-active" ); + // Only update aria-activedescendant if there's a role + // otherwise we assume focus is managed elsewhere + if ( this.options.role ) { + this.element.attr( "aria-activedescendant", focused.attr( "id" ) ); + } + + // Highlight active parent menu item, if any + this.active + .parent() + .closest( ".ui-menu-item" ) + .addClass( "ui-state-active" ); + + if ( event && event.type === "keydown" ) { + this._close(); + } else { + this.timer = this._delay(function() { + this._close(); + }, this.delay ); + } + + nested = item.children( ".ui-menu" ); + if ( nested.length && event && ( /^mouse/.test( event.type ) ) ) { + this._startOpening(nested); + } + this.activeMenu = item.parent(); + + this._trigger( "focus", event, { item: item } ); + }, + + _scrollIntoView: function( item ) { + var borderTop, paddingTop, offset, scroll, elementHeight, itemHeight; + if ( this._hasScroll() ) { + borderTop = parseFloat( $.css( this.activeMenu[0], "borderTopWidth" ) ) || 0; + paddingTop = parseFloat( $.css( this.activeMenu[0], "paddingTop" ) ) || 0; + offset = item.offset().top - this.activeMenu.offset().top - borderTop - paddingTop; + scroll = this.activeMenu.scrollTop(); + elementHeight = this.activeMenu.height(); + itemHeight = item.outerHeight(); + + if ( offset < 0 ) { + this.activeMenu.scrollTop( scroll + offset ); + } else if ( offset + itemHeight > elementHeight ) { + this.activeMenu.scrollTop( scroll + offset - elementHeight + itemHeight ); + } + } + }, + + blur: function( event, fromFocus ) { + if ( !fromFocus ) { + clearTimeout( this.timer ); + } + + if ( !this.active ) { + return; + } + + this.active.removeClass( "ui-state-focus" ); + this.active = null; + + this._trigger( "blur", event, { item: this.active } ); + }, + + _startOpening: function( submenu ) { + clearTimeout( this.timer ); + + // Don't open if already open fixes a Firefox bug that caused a .5 pixel + // shift in the submenu position when mousing over the carat icon + if ( submenu.attr( "aria-hidden" ) !== "true" ) { + return; + } + + this.timer = this._delay(function() { + this._close(); + this._open( submenu ); + }, this.delay ); + }, + + _open: function( submenu ) { + var position = $.extend({ + of: this.active + }, this.options.position ); + + clearTimeout( this.timer ); + this.element.find( ".ui-menu" ).not( submenu.parents( ".ui-menu" ) ) + .hide() + .attr( "aria-hidden", "true" ); + + submenu + .show() + .removeAttr( "aria-hidden" ) + .attr( "aria-expanded", "true" ) + .position( position ); + }, + + collapseAll: function( event, all ) { + clearTimeout( this.timer ); + this.timer = this._delay(function() { + // If we were passed an event, look for the submenu that contains the event + var currentMenu = all ? this.element : + $( event && event.target ).closest( this.element.find( ".ui-menu" ) ); + + // If we found no valid submenu ancestor, use the main menu to close all sub menus anyway + if ( !currentMenu.length ) { + currentMenu = this.element; + } + + this._close( currentMenu ); + + this.blur( event ); + this.activeMenu = currentMenu; + }, this.delay ); + }, + + // With no arguments, closes the currently active menu - if nothing is active + // it closes all menus. If passed an argument, it will search for menus BELOW + _close: function( startMenu ) { + if ( !startMenu ) { + startMenu = this.active ? this.active.parent() : this.element; + } + + startMenu + .find( ".ui-menu" ) + .hide() + .attr( "aria-hidden", "true" ) + .attr( "aria-expanded", "false" ) + .end() + .find( ".ui-state-active" ).not( ".ui-state-focus" ) + .removeClass( "ui-state-active" ); + }, + + _closeOnDocumentClick: function( event ) { + return !$( event.target ).closest( ".ui-menu" ).length; + }, + + _isDivider: function( item ) { + + // Match hyphen, em dash, en dash + return !/[^\-\u2014\u2013\s]/.test( item.text() ); + }, + + collapse: function( event ) { + var newItem = this.active && + this.active.parent().closest( ".ui-menu-item", this.element ); + if ( newItem && newItem.length ) { + this._close(); + this.focus( event, newItem ); + } + }, + + expand: function( event ) { + var newItem = this.active && + this.active + .children( ".ui-menu " ) + .find( this.options.items ) + .first(); + + if ( newItem && newItem.length ) { + this._open( newItem.parent() ); + + // Delay so Firefox will not hide activedescendant change in expanding submenu from AT + this._delay(function() { + this.focus( event, newItem ); + }); + } + }, + + next: function( event ) { + this._move( "next", "first", event ); + }, + + previous: function( event ) { + this._move( "prev", "last", event ); + }, + + isFirstItem: function() { + return this.active && !this.active.prevAll( ".ui-menu-item" ).length; + }, + + isLastItem: function() { + return this.active && !this.active.nextAll( ".ui-menu-item" ).length; + }, + + _move: function( direction, filter, event ) { + var next; + if ( this.active ) { + if ( direction === "first" || direction === "last" ) { + next = this.active + [ direction === "first" ? "prevAll" : "nextAll" ]( ".ui-menu-item" ) + .eq( -1 ); + } else { + next = this.active + [ direction + "All" ]( ".ui-menu-item" ) + .eq( 0 ); + } + } + if ( !next || !next.length || !this.active ) { + next = this.activeMenu.find( this.options.items )[ filter ](); + } + + this.focus( event, next ); + }, + + nextPage: function( event ) { + var item, base, height; + + if ( !this.active ) { + this.next( event ); + return; + } + if ( this.isLastItem() ) { + return; + } + if ( this._hasScroll() ) { + base = this.active.offset().top; + height = this.element.height(); + this.active.nextAll( ".ui-menu-item" ).each(function() { + item = $( this ); + return item.offset().top - base - height < 0; + }); + + this.focus( event, item ); + } else { + this.focus( event, this.activeMenu.find( this.options.items ) + [ !this.active ? "first" : "last" ]() ); + } + }, + + previousPage: function( event ) { + var item, base, height; + if ( !this.active ) { + this.next( event ); + return; + } + if ( this.isFirstItem() ) { + return; + } + if ( this._hasScroll() ) { + base = this.active.offset().top; + height = this.element.height(); + this.active.prevAll( ".ui-menu-item" ).each(function() { + item = $( this ); + return item.offset().top - base + height > 0; + }); + + this.focus( event, item ); + } else { + this.focus( event, this.activeMenu.find( this.options.items ).first() ); + } + }, + + _hasScroll: function() { + return this.element.outerHeight() < this.element.prop( "scrollHeight" ); + }, + + select: function( event ) { + // TODO: It should never be possible to not have an active item at this + // point, but the tests don't trigger mouseenter before click. + this.active = this.active || $( event.target ).closest( ".ui-menu-item" ); + var ui = { item: this.active }; + if ( !this.active.has( ".ui-menu" ).length ) { + this.collapseAll( event, true ); + } + this._trigger( "select", event, ui ); + }, + + _filterMenuItems: function(character) { + var escapedCharacter = character.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" ), + regex = new RegExp( "^" + escapedCharacter, "i" ); + + return this.activeMenu + .find( this.options.items ) + + // Only match on items, not dividers or other content (#10571) + .filter( ".ui-menu-item" ) + .filter(function() { + return regex.test( $.trim( $( this ).text() ) ); + }); + } +}); + + +/*! + * jQuery UI Autocomplete 1.11.4 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://api.jqueryui.com/autocomplete/ + */ + + +$.widget( "ui.autocomplete", { + version: "1.11.4", + defaultElement: "", + options: { + appendTo: null, + autoFocus: false, + delay: 300, + minLength: 1, + position: { + my: "left top", + at: "left bottom", + collision: "none" + }, + source: null, + + // callbacks + change: null, + close: null, + focus: null, + open: null, + response: null, + search: null, + select: null + }, + + requestIndex: 0, + pending: 0, + + _create: function() { + // Some browsers only repeat keydown events, not keypress events, + // so we use the suppressKeyPress flag to determine if we've already + // handled the keydown event. #7269 + // Unfortunately the code for & in keypress is the same as the up arrow, + // so we use the suppressKeyPressRepeat flag to avoid handling keypress + // events when we know the keydown event was used to modify the + // search term. #7799 + var suppressKeyPress, suppressKeyPressRepeat, suppressInput, + nodeName = this.element[ 0 ].nodeName.toLowerCase(), + isTextarea = nodeName === "textarea", + isInput = nodeName === "input"; + + this.isMultiLine = + // Textareas are always multi-line + isTextarea ? true : + // Inputs are always single-line, even if inside a contentEditable element + // IE also treats inputs as contentEditable + isInput ? false : + // All other element types are determined by whether or not they're contentEditable + this.element.prop( "isContentEditable" ); + + this.valueMethod = this.element[ isTextarea || isInput ? "val" : "text" ]; + this.isNewMenu = true; + + this.element + .addClass( "ui-autocomplete-input" ) + .attr( "autocomplete", "off" ); + + this._on( this.element, { + keydown: function( event ) { + if ( this.element.prop( "readOnly" ) ) { + suppressKeyPress = true; + suppressInput = true; + suppressKeyPressRepeat = true; + return; + } + + suppressKeyPress = false; + suppressInput = false; + suppressKeyPressRepeat = false; + var keyCode = $.ui.keyCode; + switch ( event.keyCode ) { + case keyCode.PAGE_UP: + suppressKeyPress = true; + this._move( "previousPage", event ); + break; + case keyCode.PAGE_DOWN: + suppressKeyPress = true; + this._move( "nextPage", event ); + break; + case keyCode.UP: + suppressKeyPress = true; + this._keyEvent( "previous", event ); + break; + case keyCode.DOWN: + suppressKeyPress = true; + this._keyEvent( "next", event ); + break; + case keyCode.ENTER: + // when menu is open and has focus + if ( this.menu.active ) { + // #6055 - Opera still allows the keypress to occur + // which causes forms to submit + suppressKeyPress = true; + event.preventDefault(); + this.menu.select( event ); + } + break; + case keyCode.TAB: + if ( this.menu.active ) { + this.menu.select( event ); + } + break; + case keyCode.ESCAPE: + if ( this.menu.element.is( ":visible" ) ) { + if ( !this.isMultiLine ) { + this._value( this.term ); + } + this.close( event ); + // Different browsers have different default behavior for escape + // Single press can mean undo or clear + // Double press in IE means clear the whole form + event.preventDefault(); + } + break; + default: + suppressKeyPressRepeat = true; + // search timeout should be triggered before the input value is changed + this._searchTimeout( event ); + break; + } + }, + keypress: function( event ) { + if ( suppressKeyPress ) { + suppressKeyPress = false; + if ( !this.isMultiLine || this.menu.element.is( ":visible" ) ) { + event.preventDefault(); + } + return; + } + if ( suppressKeyPressRepeat ) { + return; + } + + // replicate some key handlers to allow them to repeat in Firefox and Opera + var keyCode = $.ui.keyCode; + switch ( event.keyCode ) { + case keyCode.PAGE_UP: + this._move( "previousPage", event ); + break; + case keyCode.PAGE_DOWN: + this._move( "nextPage", event ); + break; + case keyCode.UP: + this._keyEvent( "previous", event ); + break; + case keyCode.DOWN: + this._keyEvent( "next", event ); + break; + } + }, + input: function( event ) { + if ( suppressInput ) { + suppressInput = false; + event.preventDefault(); + return; + } + this._searchTimeout( event ); + }, + focus: function() { + this.selectedItem = null; + this.previous = this._value(); + }, + blur: function( event ) { + if ( this.cancelBlur ) { + delete this.cancelBlur; + return; + } + + clearTimeout( this.searching ); + this.close( event ); + this._change( event ); + } + }); + + this._initSource(); + this.menu = $( "
      " ) + .addClass( "ui-autocomplete ui-front" ) + .appendTo( this._appendTo() ) + .menu({ + // disable ARIA support, the live region takes care of that + role: null + }) + .hide() + .menu( "instance" ); + + this._on( this.menu.element, { + mousedown: function( event ) { + // prevent moving focus out of the text field + event.preventDefault(); + + // IE doesn't prevent moving focus even with event.preventDefault() + // so we set a flag to know when we should ignore the blur event + this.cancelBlur = true; + this._delay(function() { + delete this.cancelBlur; + }); + + // clicking on the scrollbar causes focus to shift to the body + // but we can't detect a mouseup or a click immediately afterward + // so we have to track the next mousedown and close the menu if + // the user clicks somewhere outside of the autocomplete + var menuElement = this.menu.element[ 0 ]; + if ( !$( event.target ).closest( ".ui-menu-item" ).length ) { + this._delay(function() { + var that = this; + this.document.one( "mousedown", function( event ) { + if ( event.target !== that.element[ 0 ] && + event.target !== menuElement && + !$.contains( menuElement, event.target ) ) { + that.close(); + } + }); + }); + } + }, + menufocus: function( event, ui ) { + var label, item; + // support: Firefox + // Prevent accidental activation of menu items in Firefox (#7024 #9118) + if ( this.isNewMenu ) { + this.isNewMenu = false; + if ( event.originalEvent && /^mouse/.test( event.originalEvent.type ) ) { + this.menu.blur(); + + this.document.one( "mousemove", function() { + $( event.target ).trigger( event.originalEvent ); + }); + + return; + } + } + + item = ui.item.data( "ui-autocomplete-item" ); + if ( false !== this._trigger( "focus", event, { item: item } ) ) { + // use value to match what will end up in the input, if it was a key event + if ( event.originalEvent && /^key/.test( event.originalEvent.type ) ) { + this._value( item.value ); + } + } + + // Announce the value in the liveRegion + label = ui.item.attr( "aria-label" ) || item.value; + if ( label && $.trim( label ).length ) { + this.liveRegion.children().hide(); + $( "
      " ).text( label ).appendTo( this.liveRegion ); + } + }, + menuselect: function( event, ui ) { + var item = ui.item.data( "ui-autocomplete-item" ), + previous = this.previous; + + // only trigger when focus was lost (click on menu) + if ( this.element[ 0 ] !== this.document[ 0 ].activeElement ) { + this.element.focus(); + this.previous = previous; + // #6109 - IE triggers two focus events and the second + // is asynchronous, so we need to reset the previous + // term synchronously and asynchronously :-( + this._delay(function() { + this.previous = previous; + this.selectedItem = item; + }); + } + + if ( false !== this._trigger( "select", event, { item: item } ) ) { + this._value( item.value ); + } + // reset the term after the select event + // this allows custom select handling to work properly + this.term = this._value(); + + this.close( event ); + this.selectedItem = item; + } + }); + + this.liveRegion = $( "", { + role: "status", + "aria-live": "assertive", + "aria-relevant": "additions" + }) + .addClass( "ui-helper-hidden-accessible" ) + .appendTo( this.document[ 0 ].body ); + + // turning off autocomplete prevents the browser from remembering the + // value when navigating through history, so we re-enable autocomplete + // if the page is unloaded before the widget is destroyed. #7790 + this._on( this.window, { + beforeunload: function() { + this.element.removeAttr( "autocomplete" ); + } + }); + }, + + _destroy: function() { + clearTimeout( this.searching ); + this.element + .removeClass( "ui-autocomplete-input" ) + .removeAttr( "autocomplete" ); + this.menu.element.remove(); + this.liveRegion.remove(); + }, + + _setOption: function( key, value ) { + this._super( key, value ); + if ( key === "source" ) { + this._initSource(); + } + if ( key === "appendTo" ) { + this.menu.element.appendTo( this._appendTo() ); + } + if ( key === "disabled" && value && this.xhr ) { + this.xhr.abort(); + } + }, + + _appendTo: function() { + var element = this.options.appendTo; + + if ( element ) { + element = element.jquery || element.nodeType ? + $( element ) : + this.document.find( element ).eq( 0 ); + } + + if ( !element || !element[ 0 ] ) { + element = this.element.closest( ".ui-front" ); + } + + if ( !element.length ) { + element = this.document[ 0 ].body; + } + + return element; + }, + + _initSource: function() { + var array, url, + that = this; + if ( $.isArray( this.options.source ) ) { + array = this.options.source; + this.source = function( request, response ) { + response( $.ui.autocomplete.filter( array, request.term ) ); + }; + } else if ( typeof this.options.source === "string" ) { + url = this.options.source; + this.source = function( request, response ) { + if ( that.xhr ) { + that.xhr.abort(); + } + that.xhr = $.ajax({ + url: url, + data: request, + dataType: "json", + success: function( data ) { + response( data ); + }, + error: function() { + response([]); + } + }); + }; + } else { + this.source = this.options.source; + } + }, + + _searchTimeout: function( event ) { + clearTimeout( this.searching ); + this.searching = this._delay(function() { + + // Search if the value has changed, or if the user retypes the same value (see #7434) + var equalValues = this.term === this._value(), + menuVisible = this.menu.element.is( ":visible" ), + modifierKey = event.altKey || event.ctrlKey || event.metaKey || event.shiftKey; + + if ( !equalValues || ( equalValues && !menuVisible && !modifierKey ) ) { + this.selectedItem = null; + this.search( null, event ); + } + }, this.options.delay ); + }, + + search: function( value, event ) { + value = value != null ? value : this._value(); + + // always save the actual value, not the one passed as an argument + this.term = this._value(); + + if ( value.length < this.options.minLength ) { + return this.close( event ); + } + + if ( this._trigger( "search", event ) === false ) { + return; + } + + return this._search( value ); + }, + + _search: function( value ) { + this.pending++; + this.element.addClass( "ui-autocomplete-loading" ); + this.cancelSearch = false; + + this.source( { term: value }, this._response() ); + }, + + _response: function() { + var index = ++this.requestIndex; + + return $.proxy(function( content ) { + if ( index === this.requestIndex ) { + this.__response( content ); + } + + this.pending--; + if ( !this.pending ) { + this.element.removeClass( "ui-autocomplete-loading" ); + } + }, this ); + }, + + __response: function( content ) { + if ( content ) { + content = this._normalize( content ); + } + this._trigger( "response", null, { content: content } ); + if ( !this.options.disabled && content && content.length && !this.cancelSearch ) { + this._suggest( content ); + this._trigger( "open" ); + } else { + // use ._close() instead of .close() so we don't cancel future searches + this._close(); + } + }, + + close: function( event ) { + this.cancelSearch = true; + this._close( event ); + }, + + _close: function( event ) { + if ( this.menu.element.is( ":visible" ) ) { + this.menu.element.hide(); + this.menu.blur(); + this.isNewMenu = true; + this._trigger( "close", event ); + } + }, + + _change: function( event ) { + if ( this.previous !== this._value() ) { + this._trigger( "change", event, { item: this.selectedItem } ); + } + }, + + _normalize: function( items ) { + // assume all items have the right format when the first item is complete + if ( items.length && items[ 0 ].label && items[ 0 ].value ) { + return items; + } + return $.map( items, function( item ) { + if ( typeof item === "string" ) { + return { + label: item, + value: item + }; + } + return $.extend( {}, item, { + label: item.label || item.value, + value: item.value || item.label + }); + }); + }, + + _suggest: function( items ) { + var ul = this.menu.element.empty(); + this._renderMenu( ul, items ); + this.isNewMenu = true; + this.menu.refresh(); + + // size and position menu + ul.show(); + this._resizeMenu(); + ul.position( $.extend({ + of: this.element + }, this.options.position ) ); + + if ( this.options.autoFocus ) { + this.menu.next(); + } + }, + + _resizeMenu: function() { + var ul = this.menu.element; + ul.outerWidth( Math.max( + // Firefox wraps long text (possibly a rounding bug) + // so we add 1px to avoid the wrapping (#7513) + ul.width( "" ).outerWidth() + 1, + this.element.outerWidth() + ) ); + }, + + _renderMenu: function( ul, items ) { + var that = this; + $.each( items, function( index, item ) { + that._renderItemData( ul, item ); + }); + }, + + _renderItemData: function( ul, item ) { + return this._renderItem( ul, item ).data( "ui-autocomplete-item", item ); + }, + + _renderItem: function( ul, item ) { + return $( "
    • " ).text( item.label ).appendTo( ul ); + }, + + _move: function( direction, event ) { + if ( !this.menu.element.is( ":visible" ) ) { + this.search( null, event ); + return; + } + if ( this.menu.isFirstItem() && /^previous/.test( direction ) || + this.menu.isLastItem() && /^next/.test( direction ) ) { + + if ( !this.isMultiLine ) { + this._value( this.term ); + } + + this.menu.blur(); + return; + } + this.menu[ direction ]( event ); + }, + + widget: function() { + return this.menu.element; + }, + + _value: function() { + return this.valueMethod.apply( this.element, arguments ); + }, + + _keyEvent: function( keyEvent, event ) { + if ( !this.isMultiLine || this.menu.element.is( ":visible" ) ) { + this._move( keyEvent, event ); + + // prevents moving cursor to beginning/end of the text field in some browsers + event.preventDefault(); + } + } +}); + +$.extend( $.ui.autocomplete, { + escapeRegex: function( value ) { + return value.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" ); + }, + filter: function( array, term ) { + var matcher = new RegExp( $.ui.autocomplete.escapeRegex( term ), "i" ); + return $.grep( array, function( value ) { + return matcher.test( value.label || value.value || value ); + }); + } +}); + +// live region extension, adding a `messages` option +// NOTE: This is an experimental API. We are still investigating +// a full solution for string manipulation and internationalization. +$.widget( "ui.autocomplete", $.ui.autocomplete, { + options: { + messages: { + noResults: "No search results.", + results: function( amount ) { + return amount + ( amount > 1 ? " results are" : " result is" ) + + " available, use up and down arrow keys to navigate."; + } + } + }, + + __response: function( content ) { + var message; + this._superApply( arguments ); + if ( this.options.disabled || this.cancelSearch ) { + return; + } + if ( content && content.length ) { + message = this.options.messages.results( content.length ); + } else { + message = this.options.messages.noResults; + } + this.liveRegion.children().hide(); + $( "
      " ).text( message ).appendTo( this.liveRegion ); + } +}); + +var autocomplete = $.ui.autocomplete; + + +/*! + * jQuery UI Button 1.11.4 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://api.jqueryui.com/button/ + */ + + +var lastActive, + baseClasses = "ui-button ui-widget ui-state-default ui-corner-all", + typeClasses = "ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only", + formResetHandler = function() { + var form = $( this ); + setTimeout(function() { + form.find( ":ui-button" ).button( "refresh" ); + }, 1 ); + }, + radioGroup = function( radio ) { + var name = radio.name, + form = radio.form, + radios = $( [] ); + if ( name ) { + name = name.replace( /'/g, "\\'" ); + if ( form ) { + radios = $( form ).find( "[name='" + name + "'][type=radio]" ); + } else { + radios = $( "[name='" + name + "'][type=radio]", radio.ownerDocument ) + .filter(function() { + return !this.form; + }); + } + } + return radios; + }; + +$.widget( "ui.button", { + version: "1.11.4", + defaultElement: "").addClass(this._triggerClass). + html(!buttonImage ? buttonText : $("").attr( + { src:buttonImage, alt:buttonText, title:buttonText }))); + input[isRTL ? "before" : "after"](inst.trigger); + inst.trigger.click(function() { + if ($.datepicker._datepickerShowing && $.datepicker._lastInput === input[0]) { + $.datepicker._hideDatepicker(); + } else if ($.datepicker._datepickerShowing && $.datepicker._lastInput !== input[0]) { + $.datepicker._hideDatepicker(); + $.datepicker._showDatepicker(input[0]); + } else { + $.datepicker._showDatepicker(input[0]); + } + return false; + }); + } + }, + + /* Apply the maximum length for the date format. */ + _autoSize: function(inst) { + if (this._get(inst, "autoSize") && !inst.inline) { + var findMax, max, maxI, i, + date = new Date(2009, 12 - 1, 20), // Ensure double digits + dateFormat = this._get(inst, "dateFormat"); + + if (dateFormat.match(/[DM]/)) { + findMax = function(names) { + max = 0; + maxI = 0; + for (i = 0; i < names.length; i++) { + if (names[i].length > max) { + max = names[i].length; + maxI = i; + } + } + return maxI; + }; + date.setMonth(findMax(this._get(inst, (dateFormat.match(/MM/) ? + "monthNames" : "monthNamesShort")))); + date.setDate(findMax(this._get(inst, (dateFormat.match(/DD/) ? + "dayNames" : "dayNamesShort"))) + 20 - date.getDay()); + } + inst.input.attr("size", this._formatDate(inst, date).length); + } + }, + + /* Attach an inline date picker to a div. */ + _inlineDatepicker: function(target, inst) { + var divSpan = $(target); + if (divSpan.hasClass(this.markerClassName)) { + return; + } + divSpan.addClass(this.markerClassName).append(inst.dpDiv); + $.data(target, "datepicker", inst); + this._setDate(inst, this._getDefaultDate(inst), true); + this._updateDatepicker(inst); + this._updateAlternate(inst); + //If disabled option is true, disable the datepicker before showing it (see ticket #5665) + if( inst.settings.disabled ) { + this._disableDatepicker( target ); + } + // Set display:block in place of inst.dpDiv.show() which won't work on disconnected elements + // http://bugs.jqueryui.com/ticket/7552 - A Datepicker created on a detached div has zero height + inst.dpDiv.css( "display", "block" ); + }, + + /* Pop-up the date picker in a "dialog" box. + * @param input element - ignored + * @param date string or Date - the initial date to display + * @param onSelect function - the function to call when a date is selected + * @param settings object - update the dialog date picker instance's settings (anonymous object) + * @param pos int[2] - coordinates for the dialog's position within the screen or + * event - with x/y coordinates or + * leave empty for default (screen centre) + * @return the manager object + */ + _dialogDatepicker: function(input, date, onSelect, settings, pos) { + var id, browserWidth, browserHeight, scrollX, scrollY, + inst = this._dialogInst; // internal instance + + if (!inst) { + this.uuid += 1; + id = "dp" + this.uuid; + this._dialogInput = $(""); + this._dialogInput.keydown(this._doKeyDown); + $("body").append(this._dialogInput); + inst = this._dialogInst = this._newInst(this._dialogInput, false); + inst.settings = {}; + $.data(this._dialogInput[0], "datepicker", inst); + } + datepicker_extendRemove(inst.settings, settings || {}); + date = (date && date.constructor === Date ? this._formatDate(inst, date) : date); + this._dialogInput.val(date); + + this._pos = (pos ? (pos.length ? pos : [pos.pageX, pos.pageY]) : null); + if (!this._pos) { + browserWidth = document.documentElement.clientWidth; + browserHeight = document.documentElement.clientHeight; + scrollX = document.documentElement.scrollLeft || document.body.scrollLeft; + scrollY = document.documentElement.scrollTop || document.body.scrollTop; + this._pos = // should use actual width/height below + [(browserWidth / 2) - 100 + scrollX, (browserHeight / 2) - 150 + scrollY]; + } + + // move input on screen for focus, but hidden behind dialog + this._dialogInput.css("left", (this._pos[0] + 20) + "px").css("top", this._pos[1] + "px"); + inst.settings.onSelect = onSelect; + this._inDialog = true; + this.dpDiv.addClass(this._dialogClass); + this._showDatepicker(this._dialogInput[0]); + if ($.blockUI) { + $.blockUI(this.dpDiv); + } + $.data(this._dialogInput[0], "datepicker", inst); + return this; + }, + + /* Detach a datepicker from its control. + * @param target element - the target input field or division or span + */ + _destroyDatepicker: function(target) { + var nodeName, + $target = $(target), + inst = $.data(target, "datepicker"); + + if (!$target.hasClass(this.markerClassName)) { + return; + } + + nodeName = target.nodeName.toLowerCase(); + $.removeData(target, "datepicker"); + if (nodeName === "input") { + inst.append.remove(); + inst.trigger.remove(); + $target.removeClass(this.markerClassName). + unbind("focus", this._showDatepicker). + unbind("keydown", this._doKeyDown). + unbind("keypress", this._doKeyPress). + unbind("keyup", this._doKeyUp); + } else if (nodeName === "div" || nodeName === "span") { + $target.removeClass(this.markerClassName).empty(); + } + + if ( datepicker_instActive === inst ) { + datepicker_instActive = null; + } + }, + + /* Enable the date picker to a jQuery selection. + * @param target element - the target input field or division or span + */ + _enableDatepicker: function(target) { + var nodeName, inline, + $target = $(target), + inst = $.data(target, "datepicker"); + + if (!$target.hasClass(this.markerClassName)) { + return; + } + + nodeName = target.nodeName.toLowerCase(); + if (nodeName === "input") { + target.disabled = false; + inst.trigger.filter("button"). + each(function() { this.disabled = false; }).end(). + filter("img").css({opacity: "1.0", cursor: ""}); + } else if (nodeName === "div" || nodeName === "span") { + inline = $target.children("." + this._inlineClass); + inline.children().removeClass("ui-state-disabled"); + inline.find("select.ui-datepicker-month, select.ui-datepicker-year"). + prop("disabled", false); + } + this._disabledInputs = $.map(this._disabledInputs, + function(value) { return (value === target ? null : value); }); // delete entry + }, + + /* Disable the date picker to a jQuery selection. + * @param target element - the target input field or division or span + */ + _disableDatepicker: function(target) { + var nodeName, inline, + $target = $(target), + inst = $.data(target, "datepicker"); + + if (!$target.hasClass(this.markerClassName)) { + return; + } + + nodeName = target.nodeName.toLowerCase(); + if (nodeName === "input") { + target.disabled = true; + inst.trigger.filter("button"). + each(function() { this.disabled = true; }).end(). + filter("img").css({opacity: "0.5", cursor: "default"}); + } else if (nodeName === "div" || nodeName === "span") { + inline = $target.children("." + this._inlineClass); + inline.children().addClass("ui-state-disabled"); + inline.find("select.ui-datepicker-month, select.ui-datepicker-year"). + prop("disabled", true); + } + this._disabledInputs = $.map(this._disabledInputs, + function(value) { return (value === target ? null : value); }); // delete entry + this._disabledInputs[this._disabledInputs.length] = target; + }, + + /* Is the first field in a jQuery collection disabled as a datepicker? + * @param target element - the target input field or division or span + * @return boolean - true if disabled, false if enabled + */ + _isDisabledDatepicker: function(target) { + if (!target) { + return false; + } + for (var i = 0; i < this._disabledInputs.length; i++) { + if (this._disabledInputs[i] === target) { + return true; + } + } + return false; + }, + + /* Retrieve the instance data for the target control. + * @param target element - the target input field or division or span + * @return object - the associated instance data + * @throws error if a jQuery problem getting data + */ + _getInst: function(target) { + try { + return $.data(target, "datepicker"); + } + catch (err) { + throw "Missing instance data for this datepicker"; + } + }, + + /* Update or retrieve the settings for a date picker attached to an input field or division. + * @param target element - the target input field or division or span + * @param name object - the new settings to update or + * string - the name of the setting to change or retrieve, + * when retrieving also "all" for all instance settings or + * "defaults" for all global defaults + * @param value any - the new value for the setting + * (omit if above is an object or to retrieve a value) + */ + _optionDatepicker: function(target, name, value) { + var settings, date, minDate, maxDate, + inst = this._getInst(target); + + if (arguments.length === 2 && typeof name === "string") { + return (name === "defaults" ? $.extend({}, $.datepicker._defaults) : + (inst ? (name === "all" ? $.extend({}, inst.settings) : + this._get(inst, name)) : null)); + } + + settings = name || {}; + if (typeof name === "string") { + settings = {}; + settings[name] = value; + } + + if (inst) { + if (this._curInst === inst) { + this._hideDatepicker(); + } + + date = this._getDateDatepicker(target, true); + minDate = this._getMinMaxDate(inst, "min"); + maxDate = this._getMinMaxDate(inst, "max"); + datepicker_extendRemove(inst.settings, settings); + // reformat the old minDate/maxDate values if dateFormat changes and a new minDate/maxDate isn't provided + if (minDate !== null && settings.dateFormat !== undefined && settings.minDate === undefined) { + inst.settings.minDate = this._formatDate(inst, minDate); + } + if (maxDate !== null && settings.dateFormat !== undefined && settings.maxDate === undefined) { + inst.settings.maxDate = this._formatDate(inst, maxDate); + } + if ( "disabled" in settings ) { + if ( settings.disabled ) { + this._disableDatepicker(target); + } else { + this._enableDatepicker(target); + } + } + this._attachments($(target), inst); + this._autoSize(inst); + this._setDate(inst, date); + this._updateAlternate(inst); + this._updateDatepicker(inst); + } + }, + + // change method deprecated + _changeDatepicker: function(target, name, value) { + this._optionDatepicker(target, name, value); + }, + + /* Redraw the date picker attached to an input field or division. + * @param target element - the target input field or division or span + */ + _refreshDatepicker: function(target) { + var inst = this._getInst(target); + if (inst) { + this._updateDatepicker(inst); + } + }, + + /* Set the dates for a jQuery selection. + * @param target element - the target input field or division or span + * @param date Date - the new date + */ + _setDateDatepicker: function(target, date) { + var inst = this._getInst(target); + if (inst) { + this._setDate(inst, date); + this._updateDatepicker(inst); + this._updateAlternate(inst); + } + }, + + /* Get the date(s) for the first entry in a jQuery selection. + * @param target element - the target input field or division or span + * @param noDefault boolean - true if no default date is to be used + * @return Date - the current date + */ + _getDateDatepicker: function(target, noDefault) { + var inst = this._getInst(target); + if (inst && !inst.inline) { + this._setDateFromField(inst, noDefault); + } + return (inst ? this._getDate(inst) : null); + }, + + /* Handle keystrokes. */ + _doKeyDown: function(event) { + var onSelect, dateStr, sel, + inst = $.datepicker._getInst(event.target), + handled = true, + isRTL = inst.dpDiv.is(".ui-datepicker-rtl"); + + inst._keyEvent = true; + if ($.datepicker._datepickerShowing) { + switch (event.keyCode) { + case 9: $.datepicker._hideDatepicker(); + handled = false; + break; // hide on tab out + case 13: sel = $("td." + $.datepicker._dayOverClass + ":not(." + + $.datepicker._currentClass + ")", inst.dpDiv); + if (sel[0]) { + $.datepicker._selectDay(event.target, inst.selectedMonth, inst.selectedYear, sel[0]); + } + + onSelect = $.datepicker._get(inst, "onSelect"); + if (onSelect) { + dateStr = $.datepicker._formatDate(inst); + + // trigger custom callback + onSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]); + } else { + $.datepicker._hideDatepicker(); + } + + return false; // don't submit the form + case 27: $.datepicker._hideDatepicker(); + break; // hide on escape + case 33: $.datepicker._adjustDate(event.target, (event.ctrlKey ? + -$.datepicker._get(inst, "stepBigMonths") : + -$.datepicker._get(inst, "stepMonths")), "M"); + break; // previous month/year on page up/+ ctrl + case 34: $.datepicker._adjustDate(event.target, (event.ctrlKey ? + +$.datepicker._get(inst, "stepBigMonths") : + +$.datepicker._get(inst, "stepMonths")), "M"); + break; // next month/year on page down/+ ctrl + case 35: if (event.ctrlKey || event.metaKey) { + $.datepicker._clearDate(event.target); + } + handled = event.ctrlKey || event.metaKey; + break; // clear on ctrl or command +end + case 36: if (event.ctrlKey || event.metaKey) { + $.datepicker._gotoToday(event.target); + } + handled = event.ctrlKey || event.metaKey; + break; // current on ctrl or command +home + case 37: if (event.ctrlKey || event.metaKey) { + $.datepicker._adjustDate(event.target, (isRTL ? +1 : -1), "D"); + } + handled = event.ctrlKey || event.metaKey; + // -1 day on ctrl or command +left + if (event.originalEvent.altKey) { + $.datepicker._adjustDate(event.target, (event.ctrlKey ? + -$.datepicker._get(inst, "stepBigMonths") : + -$.datepicker._get(inst, "stepMonths")), "M"); + } + // next month/year on alt +left on Mac + break; + case 38: if (event.ctrlKey || event.metaKey) { + $.datepicker._adjustDate(event.target, -7, "D"); + } + handled = event.ctrlKey || event.metaKey; + break; // -1 week on ctrl or command +up + case 39: if (event.ctrlKey || event.metaKey) { + $.datepicker._adjustDate(event.target, (isRTL ? -1 : +1), "D"); + } + handled = event.ctrlKey || event.metaKey; + // +1 day on ctrl or command +right + if (event.originalEvent.altKey) { + $.datepicker._adjustDate(event.target, (event.ctrlKey ? + +$.datepicker._get(inst, "stepBigMonths") : + +$.datepicker._get(inst, "stepMonths")), "M"); + } + // next month/year on alt +right + break; + case 40: if (event.ctrlKey || event.metaKey) { + $.datepicker._adjustDate(event.target, +7, "D"); + } + handled = event.ctrlKey || event.metaKey; + break; // +1 week on ctrl or command +down + default: handled = false; + } + } else if (event.keyCode === 36 && event.ctrlKey) { // display the date picker on ctrl+home + $.datepicker._showDatepicker(this); + } else { + handled = false; + } + + if (handled) { + event.preventDefault(); + event.stopPropagation(); + } + }, + + /* Filter entered characters - based on date format. */ + _doKeyPress: function(event) { + var chars, chr, + inst = $.datepicker._getInst(event.target); + + if ($.datepicker._get(inst, "constrainInput")) { + chars = $.datepicker._possibleChars($.datepicker._get(inst, "dateFormat")); + chr = String.fromCharCode(event.charCode == null ? event.keyCode : event.charCode); + return event.ctrlKey || event.metaKey || (chr < " " || !chars || chars.indexOf(chr) > -1); + } + }, + + /* Synchronise manual entry and field/alternate field. */ + _doKeyUp: function(event) { + var date, + inst = $.datepicker._getInst(event.target); + + if (inst.input.val() !== inst.lastVal) { + try { + date = $.datepicker.parseDate($.datepicker._get(inst, "dateFormat"), + (inst.input ? inst.input.val() : null), + $.datepicker._getFormatConfig(inst)); + + if (date) { // only if valid + $.datepicker._setDateFromField(inst); + $.datepicker._updateAlternate(inst); + $.datepicker._updateDatepicker(inst); + } + } + catch (err) { + } + } + return true; + }, + + /* Pop-up the date picker for a given input field. + * If false returned from beforeShow event handler do not show. + * @param input element - the input field attached to the date picker or + * event - if triggered by focus + */ + _showDatepicker: function(input) { + input = input.target || input; + if (input.nodeName.toLowerCase() !== "input") { // find from button/image trigger + input = $("input", input.parentNode)[0]; + } + + if ($.datepicker._isDisabledDatepicker(input) || $.datepicker._lastInput === input) { // already here + return; + } + + var inst, beforeShow, beforeShowSettings, isFixed, + offset, showAnim, duration; + + inst = $.datepicker._getInst(input); + if ($.datepicker._curInst && $.datepicker._curInst !== inst) { + $.datepicker._curInst.dpDiv.stop(true, true); + if ( inst && $.datepicker._datepickerShowing ) { + $.datepicker._hideDatepicker( $.datepicker._curInst.input[0] ); + } + } + + beforeShow = $.datepicker._get(inst, "beforeShow"); + beforeShowSettings = beforeShow ? beforeShow.apply(input, [input, inst]) : {}; + if(beforeShowSettings === false){ + return; + } + datepicker_extendRemove(inst.settings, beforeShowSettings); + + inst.lastVal = null; + $.datepicker._lastInput = input; + $.datepicker._setDateFromField(inst); + + if ($.datepicker._inDialog) { // hide cursor + input.value = ""; + } + if (!$.datepicker._pos) { // position below input + $.datepicker._pos = $.datepicker._findPos(input); + $.datepicker._pos[1] += input.offsetHeight; // add the height + } + + isFixed = false; + $(input).parents().each(function() { + isFixed |= $(this).css("position") === "fixed"; + return !isFixed; + }); + + offset = {left: $.datepicker._pos[0], top: $.datepicker._pos[1]}; + $.datepicker._pos = null; + //to avoid flashes on Firefox + inst.dpDiv.empty(); + // determine sizing offscreen + inst.dpDiv.css({position: "absolute", display: "block", top: "-1000px"}); + $.datepicker._updateDatepicker(inst); + // fix width for dynamic number of date pickers + // and adjust position before showing + offset = $.datepicker._checkOffset(inst, offset, isFixed); + inst.dpDiv.css({position: ($.datepicker._inDialog && $.blockUI ? + "static" : (isFixed ? "fixed" : "absolute")), display: "none", + left: offset.left + "px", top: offset.top + "px"}); + + if (!inst.inline) { + showAnim = $.datepicker._get(inst, "showAnim"); + duration = $.datepicker._get(inst, "duration"); + inst.dpDiv.css( "z-index", datepicker_getZindex( $( input ) ) + 1 ); + $.datepicker._datepickerShowing = true; + + if ( $.effects && $.effects.effect[ showAnim ] ) { + inst.dpDiv.show(showAnim, $.datepicker._get(inst, "showOptions"), duration); + } else { + inst.dpDiv[showAnim || "show"](showAnim ? duration : null); + } + + if ( $.datepicker._shouldFocusInput( inst ) ) { + inst.input.focus(); + } + + $.datepicker._curInst = inst; + } + }, + + /* Generate the date picker content. */ + _updateDatepicker: function(inst) { + this.maxRows = 4; //Reset the max number of rows being displayed (see #7043) + datepicker_instActive = inst; // for delegate hover events + inst.dpDiv.empty().append(this._generateHTML(inst)); + this._attachHandlers(inst); + + var origyearshtml, + numMonths = this._getNumberOfMonths(inst), + cols = numMonths[1], + width = 17, + activeCell = inst.dpDiv.find( "." + this._dayOverClass + " a" ); + + if ( activeCell.length > 0 ) { + datepicker_handleMouseover.apply( activeCell.get( 0 ) ); + } + + inst.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width(""); + if (cols > 1) { + inst.dpDiv.addClass("ui-datepicker-multi-" + cols).css("width", (width * cols) + "em"); + } + inst.dpDiv[(numMonths[0] !== 1 || numMonths[1] !== 1 ? "add" : "remove") + + "Class"]("ui-datepicker-multi"); + inst.dpDiv[(this._get(inst, "isRTL") ? "add" : "remove") + + "Class"]("ui-datepicker-rtl"); + + if (inst === $.datepicker._curInst && $.datepicker._datepickerShowing && $.datepicker._shouldFocusInput( inst ) ) { + inst.input.focus(); + } + + // deffered render of the years select (to avoid flashes on Firefox) + if( inst.yearshtml ){ + origyearshtml = inst.yearshtml; + setTimeout(function(){ + //assure that inst.yearshtml didn't change. + if( origyearshtml === inst.yearshtml && inst.yearshtml ){ + inst.dpDiv.find("select.ui-datepicker-year:first").replaceWith(inst.yearshtml); + } + origyearshtml = inst.yearshtml = null; + }, 0); + } + }, + + // #6694 - don't focus the input if it's already focused + // this breaks the change event in IE + // Support: IE and jQuery <1.9 + _shouldFocusInput: function( inst ) { + return inst.input && inst.input.is( ":visible" ) && !inst.input.is( ":disabled" ) && !inst.input.is( ":focus" ); + }, + + /* Check positioning to remain on screen. */ + _checkOffset: function(inst, offset, isFixed) { + var dpWidth = inst.dpDiv.outerWidth(), + dpHeight = inst.dpDiv.outerHeight(), + inputWidth = inst.input ? inst.input.outerWidth() : 0, + inputHeight = inst.input ? inst.input.outerHeight() : 0, + viewWidth = document.documentElement.clientWidth + (isFixed ? 0 : $(document).scrollLeft()), + viewHeight = document.documentElement.clientHeight + (isFixed ? 0 : $(document).scrollTop()); + + offset.left -= (this._get(inst, "isRTL") ? (dpWidth - inputWidth) : 0); + offset.left -= (isFixed && offset.left === inst.input.offset().left) ? $(document).scrollLeft() : 0; + offset.top -= (isFixed && offset.top === (inst.input.offset().top + inputHeight)) ? $(document).scrollTop() : 0; + + // now check if datepicker is showing outside window viewport - move to a better place if so. + offset.left -= Math.min(offset.left, (offset.left + dpWidth > viewWidth && viewWidth > dpWidth) ? + Math.abs(offset.left + dpWidth - viewWidth) : 0); + offset.top -= Math.min(offset.top, (offset.top + dpHeight > viewHeight && viewHeight > dpHeight) ? + Math.abs(dpHeight + inputHeight) : 0); + + return offset; + }, + + /* Find an object's position on the screen. */ + _findPos: function(obj) { + var position, + inst = this._getInst(obj), + isRTL = this._get(inst, "isRTL"); + + while (obj && (obj.type === "hidden" || obj.nodeType !== 1 || $.expr.filters.hidden(obj))) { + obj = obj[isRTL ? "previousSibling" : "nextSibling"]; + } + + position = $(obj).offset(); + return [position.left, position.top]; + }, + + /* Hide the date picker from view. + * @param input element - the input field attached to the date picker + */ + _hideDatepicker: function(input) { + var showAnim, duration, postProcess, onClose, + inst = this._curInst; + + if (!inst || (input && inst !== $.data(input, "datepicker"))) { + return; + } + + if (this._datepickerShowing) { + showAnim = this._get(inst, "showAnim"); + duration = this._get(inst, "duration"); + postProcess = function() { + $.datepicker._tidyDialog(inst); + }; + + // DEPRECATED: after BC for 1.8.x $.effects[ showAnim ] is not needed + if ( $.effects && ( $.effects.effect[ showAnim ] || $.effects[ showAnim ] ) ) { + inst.dpDiv.hide(showAnim, $.datepicker._get(inst, "showOptions"), duration, postProcess); + } else { + inst.dpDiv[(showAnim === "slideDown" ? "slideUp" : + (showAnim === "fadeIn" ? "fadeOut" : "hide"))]((showAnim ? duration : null), postProcess); + } + + if (!showAnim) { + postProcess(); + } + this._datepickerShowing = false; + + onClose = this._get(inst, "onClose"); + if (onClose) { + onClose.apply((inst.input ? inst.input[0] : null), [(inst.input ? inst.input.val() : ""), inst]); + } + + this._lastInput = null; + if (this._inDialog) { + this._dialogInput.css({ position: "absolute", left: "0", top: "-100px" }); + if ($.blockUI) { + $.unblockUI(); + $("body").append(this.dpDiv); + } + } + this._inDialog = false; + } + }, + + /* Tidy up after a dialog display. */ + _tidyDialog: function(inst) { + inst.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar"); + }, + + /* Close date picker if clicked elsewhere. */ + _checkExternalClick: function(event) { + if (!$.datepicker._curInst) { + return; + } + + var $target = $(event.target), + inst = $.datepicker._getInst($target[0]); + + if ( ( ( $target[0].id !== $.datepicker._mainDivId && + $target.parents("#" + $.datepicker._mainDivId).length === 0 && + !$target.hasClass($.datepicker.markerClassName) && + !$target.closest("." + $.datepicker._triggerClass).length && + $.datepicker._datepickerShowing && !($.datepicker._inDialog && $.blockUI) ) ) || + ( $target.hasClass($.datepicker.markerClassName) && $.datepicker._curInst !== inst ) ) { + $.datepicker._hideDatepicker(); + } + }, + + /* Adjust one of the date sub-fields. */ + _adjustDate: function(id, offset, period) { + var target = $(id), + inst = this._getInst(target[0]); + + if (this._isDisabledDatepicker(target[0])) { + return; + } + this._adjustInstDate(inst, offset + + (period === "M" ? this._get(inst, "showCurrentAtPos") : 0), // undo positioning + period); + this._updateDatepicker(inst); + }, + + /* Action for current link. */ + _gotoToday: function(id) { + var date, + target = $(id), + inst = this._getInst(target[0]); + + if (this._get(inst, "gotoCurrent") && inst.currentDay) { + inst.selectedDay = inst.currentDay; + inst.drawMonth = inst.selectedMonth = inst.currentMonth; + inst.drawYear = inst.selectedYear = inst.currentYear; + } else { + date = new Date(); + inst.selectedDay = date.getDate(); + inst.drawMonth = inst.selectedMonth = date.getMonth(); + inst.drawYear = inst.selectedYear = date.getFullYear(); + } + this._notifyChange(inst); + this._adjustDate(target); + }, + + /* Action for selecting a new month/year. */ + _selectMonthYear: function(id, select, period) { + var target = $(id), + inst = this._getInst(target[0]); + + inst["selected" + (period === "M" ? "Month" : "Year")] = + inst["draw" + (period === "M" ? "Month" : "Year")] = + parseInt(select.options[select.selectedIndex].value,10); + + this._notifyChange(inst); + this._adjustDate(target); + }, + + /* Action for selecting a day. */ + _selectDay: function(id, month, year, td) { + var inst, + target = $(id); + + if ($(td).hasClass(this._unselectableClass) || this._isDisabledDatepicker(target[0])) { + return; + } + + inst = this._getInst(target[0]); + inst.selectedDay = inst.currentDay = $("a", td).html(); + inst.selectedMonth = inst.currentMonth = month; + inst.selectedYear = inst.currentYear = year; + this._selectDate(id, this._formatDate(inst, + inst.currentDay, inst.currentMonth, inst.currentYear)); + }, + + /* Erase the input field and hide the date picker. */ + _clearDate: function(id) { + var target = $(id); + this._selectDate(target, ""); + }, + + /* Update the input field with the selected date. */ + _selectDate: function(id, dateStr) { + var onSelect, + target = $(id), + inst = this._getInst(target[0]); + + dateStr = (dateStr != null ? dateStr : this._formatDate(inst)); + if (inst.input) { + inst.input.val(dateStr); + } + this._updateAlternate(inst); + + onSelect = this._get(inst, "onSelect"); + if (onSelect) { + onSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]); // trigger custom callback + } else if (inst.input) { + inst.input.trigger("change"); // fire the change event + } + + if (inst.inline){ + this._updateDatepicker(inst); + } else { + this._hideDatepicker(); + this._lastInput = inst.input[0]; + if (typeof(inst.input[0]) !== "object") { + inst.input.focus(); // restore focus + } + this._lastInput = null; + } + }, + + /* Update any alternate field to synchronise with the main field. */ + _updateAlternate: function(inst) { + var altFormat, date, dateStr, + altField = this._get(inst, "altField"); + + if (altField) { // update alternate field too + altFormat = this._get(inst, "altFormat") || this._get(inst, "dateFormat"); + date = this._getDate(inst); + dateStr = this.formatDate(altFormat, date, this._getFormatConfig(inst)); + $(altField).each(function() { $(this).val(dateStr); }); + } + }, + + /* Set as beforeShowDay function to prevent selection of weekends. + * @param date Date - the date to customise + * @return [boolean, string] - is this date selectable?, what is its CSS class? + */ + noWeekends: function(date) { + var day = date.getDay(); + return [(day > 0 && day < 6), ""]; + }, + + /* Set as calculateWeek to determine the week of the year based on the ISO 8601 definition. + * @param date Date - the date to get the week for + * @return number - the number of the week within the year that contains this date + */ + iso8601Week: function(date) { + var time, + checkDate = new Date(date.getTime()); + + // Find Thursday of this week starting on Monday + checkDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7)); + + time = checkDate.getTime(); + checkDate.setMonth(0); // Compare with Jan 1 + checkDate.setDate(1); + return Math.floor(Math.round((time - checkDate) / 86400000) / 7) + 1; + }, + + /* Parse a string value into a date object. + * See formatDate below for the possible formats. + * + * @param format string - the expected format of the date + * @param value string - the date in the above format + * @param settings Object - attributes include: + * shortYearCutoff number - the cutoff year for determining the century (optional) + * dayNamesShort string[7] - abbreviated names of the days from Sunday (optional) + * dayNames string[7] - names of the days from Sunday (optional) + * monthNamesShort string[12] - abbreviated names of the months (optional) + * monthNames string[12] - names of the months (optional) + * @return Date - the extracted date value or null if value is blank + */ + parseDate: function (format, value, settings) { + if (format == null || value == null) { + throw "Invalid arguments"; + } + + value = (typeof value === "object" ? value.toString() : value + ""); + if (value === "") { + return null; + } + + var iFormat, dim, extra, + iValue = 0, + shortYearCutoffTemp = (settings ? settings.shortYearCutoff : null) || this._defaults.shortYearCutoff, + shortYearCutoff = (typeof shortYearCutoffTemp !== "string" ? shortYearCutoffTemp : + new Date().getFullYear() % 100 + parseInt(shortYearCutoffTemp, 10)), + dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort, + dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames, + monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort, + monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames, + year = -1, + month = -1, + day = -1, + doy = -1, + literal = false, + date, + // Check whether a format character is doubled + lookAhead = function(match) { + var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) === match); + if (matches) { + iFormat++; + } + return matches; + }, + // Extract a number from the string value + getNumber = function(match) { + var isDoubled = lookAhead(match), + size = (match === "@" ? 14 : (match === "!" ? 20 : + (match === "y" && isDoubled ? 4 : (match === "o" ? 3 : 2)))), + minSize = (match === "y" ? size : 1), + digits = new RegExp("^\\d{" + minSize + "," + size + "}"), + num = value.substring(iValue).match(digits); + if (!num) { + throw "Missing number at position " + iValue; + } + iValue += num[0].length; + return parseInt(num[0], 10); + }, + // Extract a name from the string value and convert to an index + getName = function(match, shortNames, longNames) { + var index = -1, + names = $.map(lookAhead(match) ? longNames : shortNames, function (v, k) { + return [ [k, v] ]; + }).sort(function (a, b) { + return -(a[1].length - b[1].length); + }); + + $.each(names, function (i, pair) { + var name = pair[1]; + if (value.substr(iValue, name.length).toLowerCase() === name.toLowerCase()) { + index = pair[0]; + iValue += name.length; + return false; + } + }); + if (index !== -1) { + return index + 1; + } else { + throw "Unknown name at position " + iValue; + } + }, + // Confirm that a literal character matches the string value + checkLiteral = function() { + if (value.charAt(iValue) !== format.charAt(iFormat)) { + throw "Unexpected literal at position " + iValue; + } + iValue++; + }; + + for (iFormat = 0; iFormat < format.length; iFormat++) { + if (literal) { + if (format.charAt(iFormat) === "'" && !lookAhead("'")) { + literal = false; + } else { + checkLiteral(); + } + } else { + switch (format.charAt(iFormat)) { + case "d": + day = getNumber("d"); + break; + case "D": + getName("D", dayNamesShort, dayNames); + break; + case "o": + doy = getNumber("o"); + break; + case "m": + month = getNumber("m"); + break; + case "M": + month = getName("M", monthNamesShort, monthNames); + break; + case "y": + year = getNumber("y"); + break; + case "@": + date = new Date(getNumber("@")); + year = date.getFullYear(); + month = date.getMonth() + 1; + day = date.getDate(); + break; + case "!": + date = new Date((getNumber("!") - this._ticksTo1970) / 10000); + year = date.getFullYear(); + month = date.getMonth() + 1; + day = date.getDate(); + break; + case "'": + if (lookAhead("'")){ + checkLiteral(); + } else { + literal = true; + } + break; + default: + checkLiteral(); + } + } + } + + if (iValue < value.length){ + extra = value.substr(iValue); + if (!/^\s+/.test(extra)) { + throw "Extra/unparsed characters found in date: " + extra; + } + } + + if (year === -1) { + year = new Date().getFullYear(); + } else if (year < 100) { + year += new Date().getFullYear() - new Date().getFullYear() % 100 + + (year <= shortYearCutoff ? 0 : -100); + } + + if (doy > -1) { + month = 1; + day = doy; + do { + dim = this._getDaysInMonth(year, month - 1); + if (day <= dim) { + break; + } + month++; + day -= dim; + } while (true); + } + + date = this._daylightSavingAdjust(new Date(year, month - 1, day)); + if (date.getFullYear() !== year || date.getMonth() + 1 !== month || date.getDate() !== day) { + throw "Invalid date"; // E.g. 31/02/00 + } + return date; + }, + + /* Standard date formats. */ + ATOM: "yy-mm-dd", // RFC 3339 (ISO 8601) + COOKIE: "D, dd M yy", + ISO_8601: "yy-mm-dd", + RFC_822: "D, d M y", + RFC_850: "DD, dd-M-y", + RFC_1036: "D, d M y", + RFC_1123: "D, d M yy", + RFC_2822: "D, d M yy", + RSS: "D, d M y", // RFC 822 + TICKS: "!", + TIMESTAMP: "@", + W3C: "yy-mm-dd", // ISO 8601 + + _ticksTo1970: (((1970 - 1) * 365 + Math.floor(1970 / 4) - Math.floor(1970 / 100) + + Math.floor(1970 / 400)) * 24 * 60 * 60 * 10000000), + + /* Format a date object into a string value. + * The format can be combinations of the following: + * d - day of month (no leading zero) + * dd - day of month (two digit) + * o - day of year (no leading zeros) + * oo - day of year (three digit) + * D - day name short + * DD - day name long + * m - month of year (no leading zero) + * mm - month of year (two digit) + * M - month name short + * MM - month name long + * y - year (two digit) + * yy - year (four digit) + * @ - Unix timestamp (ms since 01/01/1970) + * ! - Windows ticks (100ns since 01/01/0001) + * "..." - literal text + * '' - single quote + * + * @param format string - the desired format of the date + * @param date Date - the date value to format + * @param settings Object - attributes include: + * dayNamesShort string[7] - abbreviated names of the days from Sunday (optional) + * dayNames string[7] - names of the days from Sunday (optional) + * monthNamesShort string[12] - abbreviated names of the months (optional) + * monthNames string[12] - names of the months (optional) + * @return string - the date in the above format + */ + formatDate: function (format, date, settings) { + if (!date) { + return ""; + } + + var iFormat, + dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort, + dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames, + monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort, + monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames, + // Check whether a format character is doubled + lookAhead = function(match) { + var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) === match); + if (matches) { + iFormat++; + } + return matches; + }, + // Format a number, with leading zero if necessary + formatNumber = function(match, value, len) { + var num = "" + value; + if (lookAhead(match)) { + while (num.length < len) { + num = "0" + num; + } + } + return num; + }, + // Format a name, short or long as requested + formatName = function(match, value, shortNames, longNames) { + return (lookAhead(match) ? longNames[value] : shortNames[value]); + }, + output = "", + literal = false; + + if (date) { + for (iFormat = 0; iFormat < format.length; iFormat++) { + if (literal) { + if (format.charAt(iFormat) === "'" && !lookAhead("'")) { + literal = false; + } else { + output += format.charAt(iFormat); + } + } else { + switch (format.charAt(iFormat)) { + case "d": + output += formatNumber("d", date.getDate(), 2); + break; + case "D": + output += formatName("D", date.getDay(), dayNamesShort, dayNames); + break; + case "o": + output += formatNumber("o", + Math.round((new Date(date.getFullYear(), date.getMonth(), date.getDate()).getTime() - new Date(date.getFullYear(), 0, 0).getTime()) / 86400000), 3); + break; + case "m": + output += formatNumber("m", date.getMonth() + 1, 2); + break; + case "M": + output += formatName("M", date.getMonth(), monthNamesShort, monthNames); + break; + case "y": + output += (lookAhead("y") ? date.getFullYear() : + (date.getYear() % 100 < 10 ? "0" : "") + date.getYear() % 100); + break; + case "@": + output += date.getTime(); + break; + case "!": + output += date.getTime() * 10000 + this._ticksTo1970; + break; + case "'": + if (lookAhead("'")) { + output += "'"; + } else { + literal = true; + } + break; + default: + output += format.charAt(iFormat); + } + } + } + } + return output; + }, + + /* Extract all possible characters from the date format. */ + _possibleChars: function (format) { + var iFormat, + chars = "", + literal = false, + // Check whether a format character is doubled + lookAhead = function(match) { + var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) === match); + if (matches) { + iFormat++; + } + return matches; + }; + + for (iFormat = 0; iFormat < format.length; iFormat++) { + if (literal) { + if (format.charAt(iFormat) === "'" && !lookAhead("'")) { + literal = false; + } else { + chars += format.charAt(iFormat); + } + } else { + switch (format.charAt(iFormat)) { + case "d": case "m": case "y": case "@": + chars += "0123456789"; + break; + case "D": case "M": + return null; // Accept anything + case "'": + if (lookAhead("'")) { + chars += "'"; + } else { + literal = true; + } + break; + default: + chars += format.charAt(iFormat); + } + } + } + return chars; + }, + + /* Get a setting value, defaulting if necessary. */ + _get: function(inst, name) { + return inst.settings[name] !== undefined ? + inst.settings[name] : this._defaults[name]; + }, + + /* Parse existing date and initialise date picker. */ + _setDateFromField: function(inst, noDefault) { + if (inst.input.val() === inst.lastVal) { + return; + } + + var dateFormat = this._get(inst, "dateFormat"), + dates = inst.lastVal = inst.input ? inst.input.val() : null, + defaultDate = this._getDefaultDate(inst), + date = defaultDate, + settings = this._getFormatConfig(inst); + + try { + date = this.parseDate(dateFormat, dates, settings) || defaultDate; + } catch (event) { + dates = (noDefault ? "" : dates); + } + inst.selectedDay = date.getDate(); + inst.drawMonth = inst.selectedMonth = date.getMonth(); + inst.drawYear = inst.selectedYear = date.getFullYear(); + inst.currentDay = (dates ? date.getDate() : 0); + inst.currentMonth = (dates ? date.getMonth() : 0); + inst.currentYear = (dates ? date.getFullYear() : 0); + this._adjustInstDate(inst); + }, + + /* Retrieve the default date shown on opening. */ + _getDefaultDate: function(inst) { + return this._restrictMinMax(inst, + this._determineDate(inst, this._get(inst, "defaultDate"), new Date())); + }, + + /* A date may be specified as an exact value or a relative one. */ + _determineDate: function(inst, date, defaultDate) { + var offsetNumeric = function(offset) { + var date = new Date(); + date.setDate(date.getDate() + offset); + return date; + }, + offsetString = function(offset) { + try { + return $.datepicker.parseDate($.datepicker._get(inst, "dateFormat"), + offset, $.datepicker._getFormatConfig(inst)); + } + catch (e) { + // Ignore + } + + var date = (offset.toLowerCase().match(/^c/) ? + $.datepicker._getDate(inst) : null) || new Date(), + year = date.getFullYear(), + month = date.getMonth(), + day = date.getDate(), + pattern = /([+\-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g, + matches = pattern.exec(offset); + + while (matches) { + switch (matches[2] || "d") { + case "d" : case "D" : + day += parseInt(matches[1],10); break; + case "w" : case "W" : + day += parseInt(matches[1],10) * 7; break; + case "m" : case "M" : + month += parseInt(matches[1],10); + day = Math.min(day, $.datepicker._getDaysInMonth(year, month)); + break; + case "y": case "Y" : + year += parseInt(matches[1],10); + day = Math.min(day, $.datepicker._getDaysInMonth(year, month)); + break; + } + matches = pattern.exec(offset); + } + return new Date(year, month, day); + }, + newDate = (date == null || date === "" ? defaultDate : (typeof date === "string" ? offsetString(date) : + (typeof date === "number" ? (isNaN(date) ? defaultDate : offsetNumeric(date)) : new Date(date.getTime())))); + + newDate = (newDate && newDate.toString() === "Invalid Date" ? defaultDate : newDate); + if (newDate) { + newDate.setHours(0); + newDate.setMinutes(0); + newDate.setSeconds(0); + newDate.setMilliseconds(0); + } + return this._daylightSavingAdjust(newDate); + }, + + /* Handle switch to/from daylight saving. + * Hours may be non-zero on daylight saving cut-over: + * > 12 when midnight changeover, but then cannot generate + * midnight datetime, so jump to 1AM, otherwise reset. + * @param date (Date) the date to check + * @return (Date) the corrected date + */ + _daylightSavingAdjust: function(date) { + if (!date) { + return null; + } + date.setHours(date.getHours() > 12 ? date.getHours() + 2 : 0); + return date; + }, + + /* Set the date(s) directly. */ + _setDate: function(inst, date, noChange) { + var clear = !date, + origMonth = inst.selectedMonth, + origYear = inst.selectedYear, + newDate = this._restrictMinMax(inst, this._determineDate(inst, date, new Date())); + + inst.selectedDay = inst.currentDay = newDate.getDate(); + inst.drawMonth = inst.selectedMonth = inst.currentMonth = newDate.getMonth(); + inst.drawYear = inst.selectedYear = inst.currentYear = newDate.getFullYear(); + if ((origMonth !== inst.selectedMonth || origYear !== inst.selectedYear) && !noChange) { + this._notifyChange(inst); + } + this._adjustInstDate(inst); + if (inst.input) { + inst.input.val(clear ? "" : this._formatDate(inst)); + } + }, + + /* Retrieve the date(s) directly. */ + _getDate: function(inst) { + var startDate = (!inst.currentYear || (inst.input && inst.input.val() === "") ? null : + this._daylightSavingAdjust(new Date( + inst.currentYear, inst.currentMonth, inst.currentDay))); + return startDate; + }, + + /* Attach the onxxx handlers. These are declared statically so + * they work with static code transformers like Caja. + */ + _attachHandlers: function(inst) { + var stepMonths = this._get(inst, "stepMonths"), + id = "#" + inst.id.replace( /\\\\/g, "\\" ); + inst.dpDiv.find("[data-handler]").map(function () { + var handler = { + prev: function () { + $.datepicker._adjustDate(id, -stepMonths, "M"); + }, + next: function () { + $.datepicker._adjustDate(id, +stepMonths, "M"); + }, + hide: function () { + $.datepicker._hideDatepicker(); + }, + today: function () { + $.datepicker._gotoToday(id); + }, + selectDay: function () { + $.datepicker._selectDay(id, +this.getAttribute("data-month"), +this.getAttribute("data-year"), this); + return false; + }, + selectMonth: function () { + $.datepicker._selectMonthYear(id, this, "M"); + return false; + }, + selectYear: function () { + $.datepicker._selectMonthYear(id, this, "Y"); + return false; + } + }; + $(this).bind(this.getAttribute("data-event"), handler[this.getAttribute("data-handler")]); + }); + }, + + /* Generate the HTML for the current state of the date picker. */ + _generateHTML: function(inst) { + var maxDraw, prevText, prev, nextText, next, currentText, gotoDate, + controls, buttonPanel, firstDay, showWeek, dayNames, dayNamesMin, + monthNames, monthNamesShort, beforeShowDay, showOtherMonths, + selectOtherMonths, defaultDate, html, dow, row, group, col, selectedDate, + cornerClass, calender, thead, day, daysInMonth, leadDays, curRows, numRows, + printDate, dRow, tbody, daySettings, otherMonth, unselectable, + tempDate = new Date(), + today = this._daylightSavingAdjust( + new Date(tempDate.getFullYear(), tempDate.getMonth(), tempDate.getDate())), // clear time + isRTL = this._get(inst, "isRTL"), + showButtonPanel = this._get(inst, "showButtonPanel"), + hideIfNoPrevNext = this._get(inst, "hideIfNoPrevNext"), + navigationAsDateFormat = this._get(inst, "navigationAsDateFormat"), + numMonths = this._getNumberOfMonths(inst), + showCurrentAtPos = this._get(inst, "showCurrentAtPos"), + stepMonths = this._get(inst, "stepMonths"), + isMultiMonth = (numMonths[0] !== 1 || numMonths[1] !== 1), + currentDate = this._daylightSavingAdjust((!inst.currentDay ? new Date(9999, 9, 9) : + new Date(inst.currentYear, inst.currentMonth, inst.currentDay))), + minDate = this._getMinMaxDate(inst, "min"), + maxDate = this._getMinMaxDate(inst, "max"), + drawMonth = inst.drawMonth - showCurrentAtPos, + drawYear = inst.drawYear; + + if (drawMonth < 0) { + drawMonth += 12; + drawYear--; + } + if (maxDate) { + maxDraw = this._daylightSavingAdjust(new Date(maxDate.getFullYear(), + maxDate.getMonth() - (numMonths[0] * numMonths[1]) + 1, maxDate.getDate())); + maxDraw = (minDate && maxDraw < minDate ? minDate : maxDraw); + while (this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1)) > maxDraw) { + drawMonth--; + if (drawMonth < 0) { + drawMonth = 11; + drawYear--; + } + } + } + inst.drawMonth = drawMonth; + inst.drawYear = drawYear; + + prevText = this._get(inst, "prevText"); + prevText = (!navigationAsDateFormat ? prevText : this.formatDate(prevText, + this._daylightSavingAdjust(new Date(drawYear, drawMonth - stepMonths, 1)), + this._getFormatConfig(inst))); + + prev = (this._canAdjustMonth(inst, -1, drawYear, drawMonth) ? + "" + prevText + "" : + (hideIfNoPrevNext ? "" : "" + prevText + "")); + + nextText = this._get(inst, "nextText"); + nextText = (!navigationAsDateFormat ? nextText : this.formatDate(nextText, + this._daylightSavingAdjust(new Date(drawYear, drawMonth + stepMonths, 1)), + this._getFormatConfig(inst))); + + next = (this._canAdjustMonth(inst, +1, drawYear, drawMonth) ? + "" + nextText + "" : + (hideIfNoPrevNext ? "" : "" + nextText + "")); + + currentText = this._get(inst, "currentText"); + gotoDate = (this._get(inst, "gotoCurrent") && inst.currentDay ? currentDate : today); + currentText = (!navigationAsDateFormat ? currentText : + this.formatDate(currentText, gotoDate, this._getFormatConfig(inst))); + + controls = (!inst.inline ? "" : ""); + + buttonPanel = (showButtonPanel) ? "
      " + (isRTL ? controls : "") + + (this._isInRange(inst, gotoDate) ? "" : "") + (isRTL ? "" : controls) + "
      " : ""; + + firstDay = parseInt(this._get(inst, "firstDay"),10); + firstDay = (isNaN(firstDay) ? 0 : firstDay); + + showWeek = this._get(inst, "showWeek"); + dayNames = this._get(inst, "dayNames"); + dayNamesMin = this._get(inst, "dayNamesMin"); + monthNames = this._get(inst, "monthNames"); + monthNamesShort = this._get(inst, "monthNamesShort"); + beforeShowDay = this._get(inst, "beforeShowDay"); + showOtherMonths = this._get(inst, "showOtherMonths"); + selectOtherMonths = this._get(inst, "selectOtherMonths"); + defaultDate = this._getDefaultDate(inst); + html = ""; + dow; + for (row = 0; row < numMonths[0]; row++) { + group = ""; + this.maxRows = 4; + for (col = 0; col < numMonths[1]; col++) { + selectedDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, inst.selectedDay)); + cornerClass = " ui-corner-all"; + calender = ""; + if (isMultiMonth) { + calender += "
      "; + } + calender += "
      " + + (/all|left/.test(cornerClass) && row === 0 ? (isRTL ? next : prev) : "") + + (/all|right/.test(cornerClass) && row === 0 ? (isRTL ? prev : next) : "") + + this._generateMonthYearHeader(inst, drawMonth, drawYear, minDate, maxDate, + row > 0 || col > 0, monthNames, monthNamesShort) + // draw month headers + "
      " + + ""; + thead = (showWeek ? "" : ""); + for (dow = 0; dow < 7; dow++) { // days of the week + day = (dow + firstDay) % 7; + thead += ""; + } + calender += thead + ""; + daysInMonth = this._getDaysInMonth(drawYear, drawMonth); + if (drawYear === inst.selectedYear && drawMonth === inst.selectedMonth) { + inst.selectedDay = Math.min(inst.selectedDay, daysInMonth); + } + leadDays = (this._getFirstDayOfMonth(drawYear, drawMonth) - firstDay + 7) % 7; + curRows = Math.ceil((leadDays + daysInMonth) / 7); // calculate the number of rows to generate + numRows = (isMultiMonth ? this.maxRows > curRows ? this.maxRows : curRows : curRows); //If multiple months, use the higher number of rows (see #7043) + this.maxRows = numRows; + printDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1 - leadDays)); + for (dRow = 0; dRow < numRows; dRow++) { // create date picker rows + calender += ""; + tbody = (!showWeek ? "" : ""); + for (dow = 0; dow < 7; dow++) { // create date picker days + daySettings = (beforeShowDay ? + beforeShowDay.apply((inst.input ? inst.input[0] : null), [printDate]) : [true, ""]); + otherMonth = (printDate.getMonth() !== drawMonth); + unselectable = (otherMonth && !selectOtherMonths) || !daySettings[0] || + (minDate && printDate < minDate) || (maxDate && printDate > maxDate); + tbody += ""; // display selectable date + printDate.setDate(printDate.getDate() + 1); + printDate = this._daylightSavingAdjust(printDate); + } + calender += tbody + ""; + } + drawMonth++; + if (drawMonth > 11) { + drawMonth = 0; + drawYear++; + } + calender += "
      " + this._get(inst, "weekHeader") + "= 5 ? " class='ui-datepicker-week-end'" : "") + ">" + + "" + dayNamesMin[day] + "
      " + + this._get(inst, "calculateWeek")(printDate) + "" + // actions + (otherMonth && !showOtherMonths ? " " : // display for other months + (unselectable ? "" + printDate.getDate() + "" : "" + printDate.getDate() + "")) + "
      " + (isMultiMonth ? "
      " + + ((numMonths[0] > 0 && col === numMonths[1]-1) ? "
      " : "") : ""); + group += calender; + } + html += group; + } + html += buttonPanel; + inst._keyEvent = false; + return html; + }, + + /* Generate the month and year header. */ + _generateMonthYearHeader: function(inst, drawMonth, drawYear, minDate, maxDate, + secondary, monthNames, monthNamesShort) { + + var inMinYear, inMaxYear, month, years, thisYear, determineYear, year, endYear, + changeMonth = this._get(inst, "changeMonth"), + changeYear = this._get(inst, "changeYear"), + showMonthAfterYear = this._get(inst, "showMonthAfterYear"), + html = "
      ", + monthHtml = ""; + + // month selection + if (secondary || !changeMonth) { + monthHtml += "" + monthNames[drawMonth] + ""; + } else { + inMinYear = (minDate && minDate.getFullYear() === drawYear); + inMaxYear = (maxDate && maxDate.getFullYear() === drawYear); + monthHtml += ""; + } + + if (!showMonthAfterYear) { + html += monthHtml + (secondary || !(changeMonth && changeYear) ? " " : ""); + } + + // year selection + if ( !inst.yearshtml ) { + inst.yearshtml = ""; + if (secondary || !changeYear) { + html += "" + drawYear + ""; + } else { + // determine range of years to display + years = this._get(inst, "yearRange").split(":"); + thisYear = new Date().getFullYear(); + determineYear = function(value) { + var year = (value.match(/c[+\-].*/) ? drawYear + parseInt(value.substring(1), 10) : + (value.match(/[+\-].*/) ? thisYear + parseInt(value, 10) : + parseInt(value, 10))); + return (isNaN(year) ? thisYear : year); + }; + year = determineYear(years[0]); + endYear = Math.max(year, determineYear(years[1] || "")); + year = (minDate ? Math.max(year, minDate.getFullYear()) : year); + endYear = (maxDate ? Math.min(endYear, maxDate.getFullYear()) : endYear); + inst.yearshtml += ""; + + html += inst.yearshtml; + inst.yearshtml = null; + } + } + + html += this._get(inst, "yearSuffix"); + if (showMonthAfterYear) { + html += (secondary || !(changeMonth && changeYear) ? " " : "") + monthHtml; + } + html += "
      "; // Close datepicker_header + return html; + }, + + /* Adjust one of the date sub-fields. */ + _adjustInstDate: function(inst, offset, period) { + var year = inst.drawYear + (period === "Y" ? offset : 0), + month = inst.drawMonth + (period === "M" ? offset : 0), + day = Math.min(inst.selectedDay, this._getDaysInMonth(year, month)) + (period === "D" ? offset : 0), + date = this._restrictMinMax(inst, this._daylightSavingAdjust(new Date(year, month, day))); + + inst.selectedDay = date.getDate(); + inst.drawMonth = inst.selectedMonth = date.getMonth(); + inst.drawYear = inst.selectedYear = date.getFullYear(); + if (period === "M" || period === "Y") { + this._notifyChange(inst); + } + }, + + /* Ensure a date is within any min/max bounds. */ + _restrictMinMax: function(inst, date) { + var minDate = this._getMinMaxDate(inst, "min"), + maxDate = this._getMinMaxDate(inst, "max"), + newDate = (minDate && date < minDate ? minDate : date); + return (maxDate && newDate > maxDate ? maxDate : newDate); + }, + + /* Notify change of month/year. */ + _notifyChange: function(inst) { + var onChange = this._get(inst, "onChangeMonthYear"); + if (onChange) { + onChange.apply((inst.input ? inst.input[0] : null), + [inst.selectedYear, inst.selectedMonth + 1, inst]); + } + }, + + /* Determine the number of months to show. */ + _getNumberOfMonths: function(inst) { + var numMonths = this._get(inst, "numberOfMonths"); + return (numMonths == null ? [1, 1] : (typeof numMonths === "number" ? [1, numMonths] : numMonths)); + }, + + /* Determine the current maximum date - ensure no time components are set. */ + _getMinMaxDate: function(inst, minMax) { + return this._determineDate(inst, this._get(inst, minMax + "Date"), null); + }, + + /* Find the number of days in a given month. */ + _getDaysInMonth: function(year, month) { + return 32 - this._daylightSavingAdjust(new Date(year, month, 32)).getDate(); + }, + + /* Find the day of the week of the first of a month. */ + _getFirstDayOfMonth: function(year, month) { + return new Date(year, month, 1).getDay(); + }, + + /* Determines if we should allow a "next/prev" month display change. */ + _canAdjustMonth: function(inst, offset, curYear, curMonth) { + var numMonths = this._getNumberOfMonths(inst), + date = this._daylightSavingAdjust(new Date(curYear, + curMonth + (offset < 0 ? offset : numMonths[0] * numMonths[1]), 1)); + + if (offset < 0) { + date.setDate(this._getDaysInMonth(date.getFullYear(), date.getMonth())); + } + return this._isInRange(inst, date); + }, + + /* Is the given date in the accepted range? */ + _isInRange: function(inst, date) { + var yearSplit, currentYear, + minDate = this._getMinMaxDate(inst, "min"), + maxDate = this._getMinMaxDate(inst, "max"), + minYear = null, + maxYear = null, + years = this._get(inst, "yearRange"); + if (years){ + yearSplit = years.split(":"); + currentYear = new Date().getFullYear(); + minYear = parseInt(yearSplit[0], 10); + maxYear = parseInt(yearSplit[1], 10); + if ( yearSplit[0].match(/[+\-].*/) ) { + minYear += currentYear; + } + if ( yearSplit[1].match(/[+\-].*/) ) { + maxYear += currentYear; + } + } + + return ((!minDate || date.getTime() >= minDate.getTime()) && + (!maxDate || date.getTime() <= maxDate.getTime()) && + (!minYear || date.getFullYear() >= minYear) && + (!maxYear || date.getFullYear() <= maxYear)); + }, + + /* Provide the configuration settings for formatting/parsing. */ + _getFormatConfig: function(inst) { + var shortYearCutoff = this._get(inst, "shortYearCutoff"); + shortYearCutoff = (typeof shortYearCutoff !== "string" ? shortYearCutoff : + new Date().getFullYear() % 100 + parseInt(shortYearCutoff, 10)); + return {shortYearCutoff: shortYearCutoff, + dayNamesShort: this._get(inst, "dayNamesShort"), dayNames: this._get(inst, "dayNames"), + monthNamesShort: this._get(inst, "monthNamesShort"), monthNames: this._get(inst, "monthNames")}; + }, + + /* Format the given date for display. */ + _formatDate: function(inst, day, month, year) { + if (!day) { + inst.currentDay = inst.selectedDay; + inst.currentMonth = inst.selectedMonth; + inst.currentYear = inst.selectedYear; + } + var date = (day ? (typeof day === "object" ? day : + this._daylightSavingAdjust(new Date(year, month, day))) : + this._daylightSavingAdjust(new Date(inst.currentYear, inst.currentMonth, inst.currentDay))); + return this.formatDate(this._get(inst, "dateFormat"), date, this._getFormatConfig(inst)); + } +}); + +/* + * Bind hover events for datepicker elements. + * Done via delegate so the binding only occurs once in the lifetime of the parent div. + * Global datepicker_instActive, set by _updateDatepicker allows the handlers to find their way back to the active picker. + */ +function datepicker_bindHover(dpDiv) { + var selector = "button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a"; + return dpDiv.delegate(selector, "mouseout", function() { + $(this).removeClass("ui-state-hover"); + if (this.className.indexOf("ui-datepicker-prev") !== -1) { + $(this).removeClass("ui-datepicker-prev-hover"); + } + if (this.className.indexOf("ui-datepicker-next") !== -1) { + $(this).removeClass("ui-datepicker-next-hover"); + } + }) + .delegate( selector, "mouseover", datepicker_handleMouseover ); +} + +function datepicker_handleMouseover() { + if (!$.datepicker._isDisabledDatepicker( datepicker_instActive.inline? datepicker_instActive.dpDiv.parent()[0] : datepicker_instActive.input[0])) { + $(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover"); + $(this).addClass("ui-state-hover"); + if (this.className.indexOf("ui-datepicker-prev") !== -1) { + $(this).addClass("ui-datepicker-prev-hover"); + } + if (this.className.indexOf("ui-datepicker-next") !== -1) { + $(this).addClass("ui-datepicker-next-hover"); + } + } +} + +/* jQuery extend now ignores nulls! */ +function datepicker_extendRemove(target, props) { + $.extend(target, props); + for (var name in props) { + if (props[name] == null) { + target[name] = props[name]; + } + } + return target; +} + +/* Invoke the datepicker functionality. + @param options string - a command, optionally followed by additional parameters or + Object - settings for attaching new datepicker functionality + @return jQuery object */ +$.fn.datepicker = function(options){ + + /* Verify an empty collection wasn't passed - Fixes #6976 */ + if ( !this.length ) { + return this; + } + + /* Initialise the date picker. */ + if (!$.datepicker.initialized) { + $(document).mousedown($.datepicker._checkExternalClick); + $.datepicker.initialized = true; + } + + /* Append datepicker main container to body if not exist. */ + if ($("#"+$.datepicker._mainDivId).length === 0) { + $("body").append($.datepicker.dpDiv); + } + + var otherArgs = Array.prototype.slice.call(arguments, 1); + if (typeof options === "string" && (options === "isDisabled" || options === "getDate" || options === "widget")) { + return $.datepicker["_" + options + "Datepicker"]. + apply($.datepicker, [this[0]].concat(otherArgs)); + } + if (options === "option" && arguments.length === 2 && typeof arguments[1] === "string") { + return $.datepicker["_" + options + "Datepicker"]. + apply($.datepicker, [this[0]].concat(otherArgs)); + } + return this.each(function() { + typeof options === "string" ? + $.datepicker["_" + options + "Datepicker"]. + apply($.datepicker, [this].concat(otherArgs)) : + $.datepicker._attachDatepicker(this, options); + }); +}; + +$.datepicker = new Datepicker(); // singleton instance +$.datepicker.initialized = false; +$.datepicker.uuid = new Date().getTime(); +$.datepicker.version = "1.11.4"; + +var datepicker = $.datepicker; + + +/*! + * jQuery UI Draggable 1.11.4 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://api.jqueryui.com/draggable/ + */ + + +$.widget("ui.draggable", $.ui.mouse, { + version: "1.11.4", + widgetEventPrefix: "drag", + options: { + addClasses: true, + appendTo: "parent", + axis: false, + connectToSortable: false, + containment: false, + cursor: "auto", + cursorAt: false, + grid: false, + handle: false, + helper: "original", + iframeFix: false, + opacity: false, + refreshPositions: false, + revert: false, + revertDuration: 500, + scope: "default", + scroll: true, + scrollSensitivity: 20, + scrollSpeed: 20, + snap: false, + snapMode: "both", + snapTolerance: 20, + stack: false, + zIndex: false, + + // callbacks + drag: null, + start: null, + stop: null + }, + _create: function() { + + if ( this.options.helper === "original" ) { + this._setPositionRelative(); + } + if (this.options.addClasses){ + this.element.addClass("ui-draggable"); + } + if (this.options.disabled){ + this.element.addClass("ui-draggable-disabled"); + } + this._setHandleClassName(); + + this._mouseInit(); + }, + + _setOption: function( key, value ) { + this._super( key, value ); + if ( key === "handle" ) { + this._removeHandleClassName(); + this._setHandleClassName(); + } + }, + + _destroy: function() { + if ( ( this.helper || this.element ).is( ".ui-draggable-dragging" ) ) { + this.destroyOnClear = true; + return; + } + this.element.removeClass( "ui-draggable ui-draggable-dragging ui-draggable-disabled" ); + this._removeHandleClassName(); + this._mouseDestroy(); + }, + + _mouseCapture: function(event) { + var o = this.options; + + this._blurActiveElement( event ); + + // among others, prevent a drag on a resizable-handle + if (this.helper || o.disabled || $(event.target).closest(".ui-resizable-handle").length > 0) { + return false; + } + + //Quit if we're not on a valid handle + this.handle = this._getHandle(event); + if (!this.handle) { + return false; + } + + this._blockFrames( o.iframeFix === true ? "iframe" : o.iframeFix ); + + return true; + + }, + + _blockFrames: function( selector ) { + this.iframeBlocks = this.document.find( selector ).map(function() { + var iframe = $( this ); + + return $( "
      " ) + .css( "position", "absolute" ) + .appendTo( iframe.parent() ) + .outerWidth( iframe.outerWidth() ) + .outerHeight( iframe.outerHeight() ) + .offset( iframe.offset() )[ 0 ]; + }); + }, + + _unblockFrames: function() { + if ( this.iframeBlocks ) { + this.iframeBlocks.remove(); + delete this.iframeBlocks; + } + }, + + _blurActiveElement: function( event ) { + var document = this.document[ 0 ]; + + // Only need to blur if the event occurred on the draggable itself, see #10527 + if ( !this.handleElement.is( event.target ) ) { + return; + } + + // support: IE9 + // IE9 throws an "Unspecified error" accessing document.activeElement from an
      ',srcAction:"iframe_src",patterns:{youtube:{index:"youtube.com",id:"v=",src:"//www.youtube.com/embed/%id%?autoplay=1"},vimeo:{index:"vimeo.com/",id:"/",src:"//player.vimeo.com/video/%id%?autoplay=1"},gmaps:{index:"//maps.google.",src:"%id%&output=embed"}}},proto:{initIframe:function(){t.types.push(Z),x("BeforeChange",function(e,t,n){t!==n&&(t===Z?D():n===Z&&D(!0))}),x(l+"."+Z,function(){D()})},getIframe:function(n,i){var o=n.src,r=t.st.iframe;e.each(r.patterns,function(){return o.indexOf(this.index)>-1?(this.id&&(o="string"==typeof this.id?o.substr(o.lastIndexOf(this.id)+this.id.length,o.length):this.id.call(this,o)),o=this.src.replace("%id%",o),!1):void 0});var a={};return r.srcAction&&(a[r.srcAction]=o),t._parseMarkup(i,a,n),t.updateStatus("ready"),i}}});var K=function(e){var n=t.items.length;return e>n-1?e-n:0>e?n+e:e},Y=function(e,t,n){return e.replace(/%curr%/gi,t+1).replace(/%total%/gi,n)};e.magnificPopup.registerModule("gallery",{options:{enabled:!1,arrowMarkup:'',preload:[0,2],navigateByImgClick:!0,arrows:!0,tPrev:"Previous (Left arrow key)",tNext:"Next (Right arrow key)",tCounter:"%curr% of %total%"},proto:{initGallery:function(){var n=t.st.gallery,i=".mfp-gallery",r=Boolean(e.fn.mfpFastClick);return t.direction=!0,n&&n.enabled?(a+=" mfp-gallery",x(f+i,function(){n.navigateByImgClick&&t.wrap.on("click"+i,".mfp-img",function(){return t.items.length>1?(t.next(),!1):void 0}),o.on("keydown"+i,function(e){37===e.keyCode?t.prev():39===e.keyCode&&t.next()})}),x("UpdateStatus"+i,function(e,n){n.text&&(n.text=Y(n.text,t.currItem.index,t.items.length))}),x(p+i,function(e,i,o,r){var a=t.items.length;o.counter=a>1?Y(n.tCounter,r.index,a):""}),x("BuildControls"+i,function(){if(t.items.length>1&&n.arrows&&!t.arrowLeft){var i=n.arrowMarkup,o=t.arrowLeft=e(i.replace(/%title%/gi,n.tPrev).replace(/%dir%/gi,"left")).addClass(y),a=t.arrowRight=e(i.replace(/%title%/gi,n.tNext).replace(/%dir%/gi,"right")).addClass(y),s=r?"mfpFastClick":"click";o[s](function(){t.prev()}),a[s](function(){t.next()}),t.isIE7&&(k("b",o[0],!1,!0),k("a",o[0],!1,!0),k("b",a[0],!1,!0),k("a",a[0],!1,!0)),t.container.append(o.add(a))}}),x(m+i,function(){t._preloadTimeout&&clearTimeout(t._preloadTimeout),t._preloadTimeout=setTimeout(function(){t.preloadNearbyImages(),t._preloadTimeout=null},16)}),x(l+i,function(){o.off(i),t.wrap.off("click"+i),t.arrowLeft&&r&&t.arrowLeft.add(t.arrowRight).destroyMfpFastClick(),t.arrowRight=t.arrowLeft=null}),void 0):!1},next:function(){t.direction=!0,t.index=K(t.index+1),t.updateItemHTML()},prev:function(){t.direction=!1,t.index=K(t.index-1),t.updateItemHTML()},goTo:function(e){t.direction=e>=t.index,t.index=e,t.updateItemHTML()},preloadNearbyImages:function(){var e,n=t.st.gallery.preload,i=Math.min(n[0],t.items.length),o=Math.min(n[1],t.items.length);for(e=1;(t.direction?o:i)>=e;e++)t._preloadItem(t.index+e);for(e=1;(t.direction?i:o)>=e;e++)t._preloadItem(t.index-e)},_preloadItem:function(n){if(n=K(n),!t.items[n].preloaded){var i=t.items[n];i.parsed||(i=t.parseEl(n)),T("LazyLoad",i),"image"===i.type&&(i.img=e('').on("load.mfploader",function(){i.hasSize=!0}).on("error.mfploader",function(){i.hasSize=!0,i.loadError=!0,T("LazyLoadError",i)}).attr("src",i.src)),i.preloaded=!0}}}});var U="retina";e.magnificPopup.registerModule(U,{options:{replaceSrc:function(e){return e.src.replace(/\.\w+$/,function(e){return"@2x"+e})},ratio:1},proto:{initRetina:function(){if(window.devicePixelRatio>1){var e=t.st.retina,n=e.ratio;n=isNaN(n)?n():n,n>1&&(x("ImageHasSize."+U,function(e,t){t.img.css({"max-width":t.img[0].naturalWidth/n,width:"100%"})}),x("ElementParse."+U,function(t,i){i.src=e.replaceSrc(i,n)}))}}}}),function(){var t=1e3,n="ontouchstart"in window,i=function(){I.off("touchmove"+r+" touchend"+r)},o="mfpFastClick",r="."+o;e.fn.mfpFastClick=function(o){return e(this).each(function(){var a,s=e(this);if(n){var l,c,d,u,p,f;s.on("touchstart"+r,function(e){u=!1,f=1,p=e.originalEvent?e.originalEvent.touches[0]:e.touches[0],c=p.clientX,d=p.clientY,I.on("touchmove"+r,function(e){p=e.originalEvent?e.originalEvent.touches:e.touches,f=p.length,p=p[0],(Math.abs(p.clientX-c)>10||Math.abs(p.clientY-d)>10)&&(u=!0,i())}).on("touchend"+r,function(e){i(),u||f>1||(a=!0,e.preventDefault(),clearTimeout(l),l=setTimeout(function(){a=!1},t),o())})})}s.on("click"+r,function(){a||o()})})},e.fn.destroyMfpFastClick=function(){e(this).off("touchstart"+r+" click"+r),n&&I.off("touchmove"+r+" touchend"+r)}}(),_()}); \ No newline at end of file diff --git a/Monitor/wwwroot/assets/plugins/masonry/dist/masonry.pkgd.js b/Monitor/wwwroot/assets/plugins/masonry/dist/masonry.pkgd.js new file mode 100644 index 0000000..5a5b66c --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/masonry/dist/masonry.pkgd.js @@ -0,0 +1,3189 @@ +/*! + * Masonry PACKAGED v3.3.1 + * Cascading grid layout library + * http://masonry.desandro.com + * MIT License + * by David DeSandro + */ + +/** + * Bridget makes jQuery widgets + * v1.1.0 + * MIT license + */ + +( function( window ) { + + + +// -------------------------- utils -------------------------- // + +var slice = Array.prototype.slice; + +function noop() {} + +// -------------------------- definition -------------------------- // + +function defineBridget( $ ) { + +// bail if no jQuery +if ( !$ ) { + return; +} + +// -------------------------- addOptionMethod -------------------------- // + +/** + * adds option method -> $().plugin('option', {...}) + * @param {Function} PluginClass - constructor class + */ +function addOptionMethod( PluginClass ) { + // don't overwrite original option method + if ( PluginClass.prototype.option ) { + return; + } + + // option setter + PluginClass.prototype.option = function( opts ) { + // bail out if not an object + if ( !$.isPlainObject( opts ) ){ + return; + } + this.options = $.extend( true, this.options, opts ); + }; +} + +// -------------------------- plugin bridge -------------------------- // + +// helper function for logging errors +// $.error breaks jQuery chaining +var logError = typeof console === 'undefined' ? noop : + function( message ) { + console.error( message ); + }; + +/** + * jQuery plugin bridge, access methods like $elem.plugin('method') + * @param {String} namespace - plugin name + * @param {Function} PluginClass - constructor class + */ +function bridge( namespace, PluginClass ) { + // add to jQuery fn namespace + $.fn[ namespace ] = function( options ) { + if ( typeof options === 'string' ) { + // call plugin method when first argument is a string + // get arguments for method + var args = slice.call( arguments, 1 ); + + for ( var i=0, len = this.length; i < len; i++ ) { + var elem = this[i]; + var instance = $.data( elem, namespace ); + if ( !instance ) { + logError( "cannot call methods on " + namespace + " prior to initialization; " + + "attempted to call '" + options + "'" ); + continue; + } + if ( !$.isFunction( instance[options] ) || options.charAt(0) === '_' ) { + logError( "no such method '" + options + "' for " + namespace + " instance" ); + continue; + } + + // trigger method with arguments + var returnValue = instance[ options ].apply( instance, args ); + + // break look and return first value if provided + if ( returnValue !== undefined ) { + return returnValue; + } + } + // return this if no return value + return this; + } else { + return this.each( function() { + var instance = $.data( this, namespace ); + if ( instance ) { + // apply options & init + instance.option( options ); + instance._init(); + } else { + // initialize new instance + instance = new PluginClass( this, options ); + $.data( this, namespace, instance ); + } + }); + } + }; + +} + +// -------------------------- bridget -------------------------- // + +/** + * converts a Prototypical class into a proper jQuery plugin + * the class must have a ._init method + * @param {String} namespace - plugin name, used in $().pluginName + * @param {Function} PluginClass - constructor class + */ +$.bridget = function( namespace, PluginClass ) { + addOptionMethod( PluginClass ); + bridge( namespace, PluginClass ); +}; + +return $.bridget; + +} + +// transport +if ( typeof define === 'function' && define.amd ) { + // AMD + define( 'jquery-bridget/jquery.bridget',[ 'jquery' ], defineBridget ); +} else if ( typeof exports === 'object' ) { + defineBridget( require('jquery') ); +} else { + // get jquery from browser global + defineBridget( window.jQuery ); +} + +})( window ); + +/*! + * eventie v1.0.6 + * event binding helper + * eventie.bind( elem, 'click', myFn ) + * eventie.unbind( elem, 'click', myFn ) + * MIT license + */ + +/*jshint browser: true, undef: true, unused: true */ +/*global define: false, module: false */ + +( function( window ) { + + + +var docElem = document.documentElement; + +var bind = function() {}; + +function getIEEvent( obj ) { + var event = window.event; + // add event.target + event.target = event.target || event.srcElement || obj; + return event; +} + +if ( docElem.addEventListener ) { + bind = function( obj, type, fn ) { + obj.addEventListener( type, fn, false ); + }; +} else if ( docElem.attachEvent ) { + bind = function( obj, type, fn ) { + obj[ type + fn ] = fn.handleEvent ? + function() { + var event = getIEEvent( obj ); + fn.handleEvent.call( fn, event ); + } : + function() { + var event = getIEEvent( obj ); + fn.call( obj, event ); + }; + obj.attachEvent( "on" + type, obj[ type + fn ] ); + }; +} + +var unbind = function() {}; + +if ( docElem.removeEventListener ) { + unbind = function( obj, type, fn ) { + obj.removeEventListener( type, fn, false ); + }; +} else if ( docElem.detachEvent ) { + unbind = function( obj, type, fn ) { + obj.detachEvent( "on" + type, obj[ type + fn ] ); + try { + delete obj[ type + fn ]; + } catch ( err ) { + // can't delete window object properties + obj[ type + fn ] = undefined; + } + }; +} + +var eventie = { + bind: bind, + unbind: unbind +}; + +// ----- module definition ----- // + +if ( typeof define === 'function' && define.amd ) { + // AMD + define( 'eventie/eventie',eventie ); +} else if ( typeof exports === 'object' ) { + // CommonJS + module.exports = eventie; +} else { + // browser global + window.eventie = eventie; +} + +})( window ); + +/*! + * EventEmitter v4.2.11 - git.io/ee + * Unlicense - http://unlicense.org/ + * Oliver Caldwell - http://oli.me.uk/ + * @preserve + */ + +;(function () { + + + /** + * Class for managing events. + * Can be extended to provide event functionality in other classes. + * + * @class EventEmitter Manages event registering and emitting. + */ + function EventEmitter() {} + + // Shortcuts to improve speed and size + var proto = EventEmitter.prototype; + var exports = this; + var originalGlobalValue = exports.EventEmitter; + + /** + * Finds the index of the listener for the event in its storage array. + * + * @param {Function[]} listeners Array of listeners to search through. + * @param {Function} listener Method to look for. + * @return {Number} Index of the specified listener, -1 if not found + * @api private + */ + function indexOfListener(listeners, listener) { + var i = listeners.length; + while (i--) { + if (listeners[i].listener === listener) { + return i; + } + } + + return -1; + } + + /** + * Alias a method while keeping the context correct, to allow for overwriting of target method. + * + * @param {String} name The name of the target method. + * @return {Function} The aliased method + * @api private + */ + function alias(name) { + return function aliasClosure() { + return this[name].apply(this, arguments); + }; + } + + /** + * Returns the listener array for the specified event. + * Will initialise the event object and listener arrays if required. + * Will return an object if you use a regex search. The object contains keys for each matched event. So /ba[rz]/ might return an object containing bar and baz. But only if you have either defined them with defineEvent or added some listeners to them. + * Each property in the object response is an array of listener functions. + * + * @param {String|RegExp} evt Name of the event to return the listeners from. + * @return {Function[]|Object} All listener functions for the event. + */ + proto.getListeners = function getListeners(evt) { + var events = this._getEvents(); + var response; + var key; + + // Return a concatenated array of all matching events if + // the selector is a regular expression. + if (evt instanceof RegExp) { + response = {}; + for (key in events) { + if (events.hasOwnProperty(key) && evt.test(key)) { + response[key] = events[key]; + } + } + } + else { + response = events[evt] || (events[evt] = []); + } + + return response; + }; + + /** + * Takes a list of listener objects and flattens it into a list of listener functions. + * + * @param {Object[]} listeners Raw listener objects. + * @return {Function[]} Just the listener functions. + */ + proto.flattenListeners = function flattenListeners(listeners) { + var flatListeners = []; + var i; + + for (i = 0; i < listeners.length; i += 1) { + flatListeners.push(listeners[i].listener); + } + + return flatListeners; + }; + + /** + * Fetches the requested listeners via getListeners but will always return the results inside an object. This is mainly for internal use but others may find it useful. + * + * @param {String|RegExp} evt Name of the event to return the listeners from. + * @return {Object} All listener functions for an event in an object. + */ + proto.getListenersAsObject = function getListenersAsObject(evt) { + var listeners = this.getListeners(evt); + var response; + + if (listeners instanceof Array) { + response = {}; + response[evt] = listeners; + } + + return response || listeners; + }; + + /** + * Adds a listener function to the specified event. + * The listener will not be added if it is a duplicate. + * If the listener returns true then it will be removed after it is called. + * If you pass a regular expression as the event name then the listener will be added to all events that match it. + * + * @param {String|RegExp} evt Name of the event to attach the listener to. + * @param {Function} listener Method to be called when the event is emitted. If the function returns true then it will be removed after calling. + * @return {Object} Current instance of EventEmitter for chaining. + */ + proto.addListener = function addListener(evt, listener) { + var listeners = this.getListenersAsObject(evt); + var listenerIsWrapped = typeof listener === 'object'; + var key; + + for (key in listeners) { + if (listeners.hasOwnProperty(key) && indexOfListener(listeners[key], listener) === -1) { + listeners[key].push(listenerIsWrapped ? listener : { + listener: listener, + once: false + }); + } + } + + return this; + }; + + /** + * Alias of addListener + */ + proto.on = alias('addListener'); + + /** + * Semi-alias of addListener. It will add a listener that will be + * automatically removed after its first execution. + * + * @param {String|RegExp} evt Name of the event to attach the listener to. + * @param {Function} listener Method to be called when the event is emitted. If the function returns true then it will be removed after calling. + * @return {Object} Current instance of EventEmitter for chaining. + */ + proto.addOnceListener = function addOnceListener(evt, listener) { + return this.addListener(evt, { + listener: listener, + once: true + }); + }; + + /** + * Alias of addOnceListener. + */ + proto.once = alias('addOnceListener'); + + /** + * Defines an event name. This is required if you want to use a regex to add a listener to multiple events at once. If you don't do this then how do you expect it to know what event to add to? Should it just add to every possible match for a regex? No. That is scary and bad. + * You need to tell it what event names should be matched by a regex. + * + * @param {String} evt Name of the event to create. + * @return {Object} Current instance of EventEmitter for chaining. + */ + proto.defineEvent = function defineEvent(evt) { + this.getListeners(evt); + return this; + }; + + /** + * Uses defineEvent to define multiple events. + * + * @param {String[]} evts An array of event names to define. + * @return {Object} Current instance of EventEmitter for chaining. + */ + proto.defineEvents = function defineEvents(evts) { + for (var i = 0; i < evts.length; i += 1) { + this.defineEvent(evts[i]); + } + return this; + }; + + /** + * Removes a listener function from the specified event. + * When passed a regular expression as the event name, it will remove the listener from all events that match it. + * + * @param {String|RegExp} evt Name of the event to remove the listener from. + * @param {Function} listener Method to remove from the event. + * @return {Object} Current instance of EventEmitter for chaining. + */ + proto.removeListener = function removeListener(evt, listener) { + var listeners = this.getListenersAsObject(evt); + var index; + var key; + + for (key in listeners) { + if (listeners.hasOwnProperty(key)) { + index = indexOfListener(listeners[key], listener); + + if (index !== -1) { + listeners[key].splice(index, 1); + } + } + } + + return this; + }; + + /** + * Alias of removeListener + */ + proto.off = alias('removeListener'); + + /** + * Adds listeners in bulk using the manipulateListeners method. + * If you pass an object as the second argument you can add to multiple events at once. The object should contain key value pairs of events and listeners or listener arrays. You can also pass it an event name and an array of listeners to be added. + * You can also pass it a regular expression to add the array of listeners to all events that match it. + * Yeah, this function does quite a bit. That's probably a bad thing. + * + * @param {String|Object|RegExp} evt An event name if you will pass an array of listeners next. An object if you wish to add to multiple events at once. + * @param {Function[]} [listeners] An optional array of listener functions to add. + * @return {Object} Current instance of EventEmitter for chaining. + */ + proto.addListeners = function addListeners(evt, listeners) { + // Pass through to manipulateListeners + return this.manipulateListeners(false, evt, listeners); + }; + + /** + * Removes listeners in bulk using the manipulateListeners method. + * If you pass an object as the second argument you can remove from multiple events at once. The object should contain key value pairs of events and listeners or listener arrays. + * You can also pass it an event name and an array of listeners to be removed. + * You can also pass it a regular expression to remove the listeners from all events that match it. + * + * @param {String|Object|RegExp} evt An event name if you will pass an array of listeners next. An object if you wish to remove from multiple events at once. + * @param {Function[]} [listeners] An optional array of listener functions to remove. + * @return {Object} Current instance of EventEmitter for chaining. + */ + proto.removeListeners = function removeListeners(evt, listeners) { + // Pass through to manipulateListeners + return this.manipulateListeners(true, evt, listeners); + }; + + /** + * Edits listeners in bulk. The addListeners and removeListeners methods both use this to do their job. You should really use those instead, this is a little lower level. + * The first argument will determine if the listeners are removed (true) or added (false). + * If you pass an object as the second argument you can add/remove from multiple events at once. The object should contain key value pairs of events and listeners or listener arrays. + * You can also pass it an event name and an array of listeners to be added/removed. + * You can also pass it a regular expression to manipulate the listeners of all events that match it. + * + * @param {Boolean} remove True if you want to remove listeners, false if you want to add. + * @param {String|Object|RegExp} evt An event name if you will pass an array of listeners next. An object if you wish to add/remove from multiple events at once. + * @param {Function[]} [listeners] An optional array of listener functions to add/remove. + * @return {Object} Current instance of EventEmitter for chaining. + */ + proto.manipulateListeners = function manipulateListeners(remove, evt, listeners) { + var i; + var value; + var single = remove ? this.removeListener : this.addListener; + var multiple = remove ? this.removeListeners : this.addListeners; + + // If evt is an object then pass each of its properties to this method + if (typeof evt === 'object' && !(evt instanceof RegExp)) { + for (i in evt) { + if (evt.hasOwnProperty(i) && (value = evt[i])) { + // Pass the single listener straight through to the singular method + if (typeof value === 'function') { + single.call(this, i, value); + } + else { + // Otherwise pass back to the multiple function + multiple.call(this, i, value); + } + } + } + } + else { + // So evt must be a string + // And listeners must be an array of listeners + // Loop over it and pass each one to the multiple method + i = listeners.length; + while (i--) { + single.call(this, evt, listeners[i]); + } + } + + return this; + }; + + /** + * Removes all listeners from a specified event. + * If you do not specify an event then all listeners will be removed. + * That means every event will be emptied. + * You can also pass a regex to remove all events that match it. + * + * @param {String|RegExp} [evt] Optional name of the event to remove all listeners for. Will remove from every event if not passed. + * @return {Object} Current instance of EventEmitter for chaining. + */ + proto.removeEvent = function removeEvent(evt) { + var type = typeof evt; + var events = this._getEvents(); + var key; + + // Remove different things depending on the state of evt + if (type === 'string') { + // Remove all listeners for the specified event + delete events[evt]; + } + else if (evt instanceof RegExp) { + // Remove all events matching the regex. + for (key in events) { + if (events.hasOwnProperty(key) && evt.test(key)) { + delete events[key]; + } + } + } + else { + // Remove all listeners in all events + delete this._events; + } + + return this; + }; + + /** + * Alias of removeEvent. + * + * Added to mirror the node API. + */ + proto.removeAllListeners = alias('removeEvent'); + + /** + * Emits an event of your choice. + * When emitted, every listener attached to that event will be executed. + * If you pass the optional argument array then those arguments will be passed to every listener upon execution. + * Because it uses `apply`, your array of arguments will be passed as if you wrote them out separately. + * So they will not arrive within the array on the other side, they will be separate. + * You can also pass a regular expression to emit to all events that match it. + * + * @param {String|RegExp} evt Name of the event to emit and execute listeners for. + * @param {Array} [args] Optional array of arguments to be passed to each listener. + * @return {Object} Current instance of EventEmitter for chaining. + */ + proto.emitEvent = function emitEvent(evt, args) { + var listeners = this.getListenersAsObject(evt); + var listener; + var i; + var key; + var response; + + for (key in listeners) { + if (listeners.hasOwnProperty(key)) { + i = listeners[key].length; + + while (i--) { + // If the listener returns true then it shall be removed from the event + // The function is executed either with a basic call or an apply if there is an args array + listener = listeners[key][i]; + + if (listener.once === true) { + this.removeListener(evt, listener.listener); + } + + response = listener.listener.apply(this, args || []); + + if (response === this._getOnceReturnValue()) { + this.removeListener(evt, listener.listener); + } + } + } + } + + return this; + }; + + /** + * Alias of emitEvent + */ + proto.trigger = alias('emitEvent'); + + /** + * Subtly different from emitEvent in that it will pass its arguments on to the listeners, as opposed to taking a single array of arguments to pass on. + * As with emitEvent, you can pass a regex in place of the event name to emit to all events that match it. + * + * @param {String|RegExp} evt Name of the event to emit and execute listeners for. + * @param {...*} Optional additional arguments to be passed to each listener. + * @return {Object} Current instance of EventEmitter for chaining. + */ + proto.emit = function emit(evt) { + var args = Array.prototype.slice.call(arguments, 1); + return this.emitEvent(evt, args); + }; + + /** + * Sets the current value to check against when executing listeners. If a + * listeners return value matches the one set here then it will be removed + * after execution. This value defaults to true. + * + * @param {*} value The new value to check for when executing listeners. + * @return {Object} Current instance of EventEmitter for chaining. + */ + proto.setOnceReturnValue = function setOnceReturnValue(value) { + this._onceReturnValue = value; + return this; + }; + + /** + * Fetches the current value to check against when executing listeners. If + * the listeners return value matches this one then it should be removed + * automatically. It will return true by default. + * + * @return {*|Boolean} The current value to check for or the default, true. + * @api private + */ + proto._getOnceReturnValue = function _getOnceReturnValue() { + if (this.hasOwnProperty('_onceReturnValue')) { + return this._onceReturnValue; + } + else { + return true; + } + }; + + /** + * Fetches the events object and creates one if required. + * + * @return {Object} The events storage object. + * @api private + */ + proto._getEvents = function _getEvents() { + return this._events || (this._events = {}); + }; + + /** + * Reverts the global {@link EventEmitter} to its previous value and returns a reference to this version. + * + * @return {Function} Non conflicting EventEmitter class. + */ + EventEmitter.noConflict = function noConflict() { + exports.EventEmitter = originalGlobalValue; + return EventEmitter; + }; + + // Expose the class either via AMD, CommonJS or the global object + if (typeof define === 'function' && define.amd) { + define('eventEmitter/EventEmitter',[],function () { + return EventEmitter; + }); + } + else if (typeof module === 'object' && module.exports){ + module.exports = EventEmitter; + } + else { + exports.EventEmitter = EventEmitter; + } +}.call(this)); + +/*! + * getStyleProperty v1.0.4 + * original by kangax + * http://perfectionkills.com/feature-testing-css-properties/ + * MIT license + */ + +/*jshint browser: true, strict: true, undef: true */ +/*global define: false, exports: false, module: false */ + +( function( window ) { + + + +var prefixes = 'Webkit Moz ms Ms O'.split(' '); +var docElemStyle = document.documentElement.style; + +function getStyleProperty( propName ) { + if ( !propName ) { + return; + } + + // test standard property first + if ( typeof docElemStyle[ propName ] === 'string' ) { + return propName; + } + + // capitalize + propName = propName.charAt(0).toUpperCase() + propName.slice(1); + + // test vendor specific properties + var prefixed; + for ( var i=0, len = prefixes.length; i < len; i++ ) { + prefixed = prefixes[i] + propName; + if ( typeof docElemStyle[ prefixed ] === 'string' ) { + return prefixed; + } + } +} + +// transport +if ( typeof define === 'function' && define.amd ) { + // AMD + define( 'get-style-property/get-style-property',[],function() { + return getStyleProperty; + }); +} else if ( typeof exports === 'object' ) { + // CommonJS for Component + module.exports = getStyleProperty; +} else { + // browser global + window.getStyleProperty = getStyleProperty; +} + +})( window ); + +/*! + * getSize v1.2.2 + * measure size of elements + * MIT license + */ + +/*jshint browser: true, strict: true, undef: true, unused: true */ +/*global define: false, exports: false, require: false, module: false, console: false */ + +( function( window, undefined ) { + + + +// -------------------------- helpers -------------------------- // + +// get a number from a string, not a percentage +function getStyleSize( value ) { + var num = parseFloat( value ); + // not a percent like '100%', and a number + var isValid = value.indexOf('%') === -1 && !isNaN( num ); + return isValid && num; +} + +function noop() {} + +var logError = typeof console === 'undefined' ? noop : + function( message ) { + console.error( message ); + }; + +// -------------------------- measurements -------------------------- // + +var measurements = [ + 'paddingLeft', + 'paddingRight', + 'paddingTop', + 'paddingBottom', + 'marginLeft', + 'marginRight', + 'marginTop', + 'marginBottom', + 'borderLeftWidth', + 'borderRightWidth', + 'borderTopWidth', + 'borderBottomWidth' +]; + +function getZeroSize() { + var size = { + width: 0, + height: 0, + innerWidth: 0, + innerHeight: 0, + outerWidth: 0, + outerHeight: 0 + }; + for ( var i=0, len = measurements.length; i < len; i++ ) { + var measurement = measurements[i]; + size[ measurement ] = 0; + } + return size; +} + + + +function defineGetSize( getStyleProperty ) { + +// -------------------------- setup -------------------------- // + +var isSetup = false; + +var getStyle, boxSizingProp, isBoxSizeOuter; + +/** + * setup vars and functions + * do it on initial getSize(), rather than on script load + * For Firefox bug https://bugzilla.mozilla.org/show_bug.cgi?id=548397 + */ +function setup() { + // setup once + if ( isSetup ) { + return; + } + isSetup = true; + + var getComputedStyle = window.getComputedStyle; + getStyle = ( function() { + var getStyleFn = getComputedStyle ? + function( elem ) { + return getComputedStyle( elem, null ); + } : + function( elem ) { + return elem.currentStyle; + }; + + return function getStyle( elem ) { + var style = getStyleFn( elem ); + if ( !style ) { + logError( 'Style returned ' + style + + '. Are you running this code in a hidden iframe on Firefox? ' + + 'See http://bit.ly/getsizebug1' ); + } + return style; + }; + })(); + + // -------------------------- box sizing -------------------------- // + + boxSizingProp = getStyleProperty('boxSizing'); + + /** + * WebKit measures the outer-width on style.width on border-box elems + * IE & Firefox measures the inner-width + */ + if ( boxSizingProp ) { + var div = document.createElement('div'); + div.style.width = '200px'; + div.style.padding = '1px 2px 3px 4px'; + div.style.borderStyle = 'solid'; + div.style.borderWidth = '1px 2px 3px 4px'; + div.style[ boxSizingProp ] = 'border-box'; + + var body = document.body || document.documentElement; + body.appendChild( div ); + var style = getStyle( div ); + + isBoxSizeOuter = getStyleSize( style.width ) === 200; + body.removeChild( div ); + } + +} + +// -------------------------- getSize -------------------------- // + +function getSize( elem ) { + setup(); + + // use querySeletor if elem is string + if ( typeof elem === 'string' ) { + elem = document.querySelector( elem ); + } + + // do not proceed on non-objects + if ( !elem || typeof elem !== 'object' || !elem.nodeType ) { + return; + } + + var style = getStyle( elem ); + + // if hidden, everything is 0 + if ( style.display === 'none' ) { + return getZeroSize(); + } + + var size = {}; + size.width = elem.offsetWidth; + size.height = elem.offsetHeight; + + var isBorderBox = size.isBorderBox = !!( boxSizingProp && + style[ boxSizingProp ] && style[ boxSizingProp ] === 'border-box' ); + + // get all measurements + for ( var i=0, len = measurements.length; i < len; i++ ) { + var measurement = measurements[i]; + var value = style[ measurement ]; + value = mungeNonPixel( elem, value ); + var num = parseFloat( value ); + // any 'auto', 'medium' value will be 0 + size[ measurement ] = !isNaN( num ) ? num : 0; + } + + var paddingWidth = size.paddingLeft + size.paddingRight; + var paddingHeight = size.paddingTop + size.paddingBottom; + var marginWidth = size.marginLeft + size.marginRight; + var marginHeight = size.marginTop + size.marginBottom; + var borderWidth = size.borderLeftWidth + size.borderRightWidth; + var borderHeight = size.borderTopWidth + size.borderBottomWidth; + + var isBorderBoxSizeOuter = isBorderBox && isBoxSizeOuter; + + // overwrite width and height if we can get it from style + var styleWidth = getStyleSize( style.width ); + if ( styleWidth !== false ) { + size.width = styleWidth + + // add padding and border unless it's already including it + ( isBorderBoxSizeOuter ? 0 : paddingWidth + borderWidth ); + } + + var styleHeight = getStyleSize( style.height ); + if ( styleHeight !== false ) { + size.height = styleHeight + + // add padding and border unless it's already including it + ( isBorderBoxSizeOuter ? 0 : paddingHeight + borderHeight ); + } + + size.innerWidth = size.width - ( paddingWidth + borderWidth ); + size.innerHeight = size.height - ( paddingHeight + borderHeight ); + + size.outerWidth = size.width + marginWidth; + size.outerHeight = size.height + marginHeight; + + return size; +} + +// IE8 returns percent values, not pixels +// taken from jQuery's curCSS +function mungeNonPixel( elem, value ) { + // IE8 and has percent value + if ( window.getComputedStyle || value.indexOf('%') === -1 ) { + return value; + } + var style = elem.style; + // Remember the original values + var left = style.left; + var rs = elem.runtimeStyle; + var rsLeft = rs && rs.left; + + // Put in the new values to get a computed value out + if ( rsLeft ) { + rs.left = elem.currentStyle.left; + } + style.left = value; + value = style.pixelLeft; + + // Revert the changed values + style.left = left; + if ( rsLeft ) { + rs.left = rsLeft; + } + + return value; +} + +return getSize; + +} + +// transport +if ( typeof define === 'function' && define.amd ) { + // AMD for RequireJS + define( 'get-size/get-size',[ 'get-style-property/get-style-property' ], defineGetSize ); +} else if ( typeof exports === 'object' ) { + // CommonJS for Component + module.exports = defineGetSize( require('desandro-get-style-property') ); +} else { + // browser global + window.getSize = defineGetSize( window.getStyleProperty ); +} + +})( window ); + +/*! + * docReady v1.0.4 + * Cross browser DOMContentLoaded event emitter + * MIT license + */ + +/*jshint browser: true, strict: true, undef: true, unused: true*/ +/*global define: false, require: false, module: false */ + +( function( window ) { + + + +var document = window.document; +// collection of functions to be triggered on ready +var queue = []; + +function docReady( fn ) { + // throw out non-functions + if ( typeof fn !== 'function' ) { + return; + } + + if ( docReady.isReady ) { + // ready now, hit it + fn(); + } else { + // queue function when ready + queue.push( fn ); + } +} + +docReady.isReady = false; + +// triggered on various doc ready events +function onReady( event ) { + // bail if already triggered or IE8 document is not ready just yet + var isIE8NotReady = event.type === 'readystatechange' && document.readyState !== 'complete'; + if ( docReady.isReady || isIE8NotReady ) { + return; + } + + trigger(); +} + +function trigger() { + docReady.isReady = true; + // process queue + for ( var i=0, len = queue.length; i < len; i++ ) { + var fn = queue[i]; + fn(); + } +} + +function defineDocReady( eventie ) { + // trigger ready if page is ready + if ( document.readyState === 'complete' ) { + trigger(); + } else { + // listen for events + eventie.bind( document, 'DOMContentLoaded', onReady ); + eventie.bind( document, 'readystatechange', onReady ); + eventie.bind( window, 'load', onReady ); + } + + return docReady; +} + +// transport +if ( typeof define === 'function' && define.amd ) { + // AMD + define( 'doc-ready/doc-ready',[ 'eventie/eventie' ], defineDocReady ); +} else if ( typeof exports === 'object' ) { + module.exports = defineDocReady( require('eventie') ); +} else { + // browser global + window.docReady = defineDocReady( window.eventie ); +} + +})( window ); + +/** + * matchesSelector v1.0.3 + * matchesSelector( element, '.selector' ) + * MIT license + */ + +/*jshint browser: true, strict: true, undef: true, unused: true */ +/*global define: false, module: false */ + +( function( ElemProto ) { + + + + var matchesMethod = ( function() { + // check for the standard method name first + if ( ElemProto.matches ) { + return 'matches'; + } + // check un-prefixed + if ( ElemProto.matchesSelector ) { + return 'matchesSelector'; + } + // check vendor prefixes + var prefixes = [ 'webkit', 'moz', 'ms', 'o' ]; + + for ( var i=0, len = prefixes.length; i < len; i++ ) { + var prefix = prefixes[i]; + var method = prefix + 'MatchesSelector'; + if ( ElemProto[ method ] ) { + return method; + } + } + })(); + + // ----- match ----- // + + function match( elem, selector ) { + return elem[ matchesMethod ]( selector ); + } + + // ----- appendToFragment ----- // + + function checkParent( elem ) { + // not needed if already has parent + if ( elem.parentNode ) { + return; + } + var fragment = document.createDocumentFragment(); + fragment.appendChild( elem ); + } + + // ----- query ----- // + + // fall back to using QSA + // thx @jonathantneal https://gist.github.com/3062955 + function query( elem, selector ) { + // append to fragment if no parent + checkParent( elem ); + + // match elem with all selected elems of parent + var elems = elem.parentNode.querySelectorAll( selector ); + for ( var i=0, len = elems.length; i < len; i++ ) { + // return true if match + if ( elems[i] === elem ) { + return true; + } + } + // otherwise return false + return false; + } + + // ----- matchChild ----- // + + function matchChild( elem, selector ) { + checkParent( elem ); + return match( elem, selector ); + } + + // ----- matchesSelector ----- // + + var matchesSelector; + + if ( matchesMethod ) { + // IE9 supports matchesSelector, but doesn't work on orphaned elems + // check for that + var div = document.createElement('div'); + var supportsOrphans = match( div, 'div' ); + matchesSelector = supportsOrphans ? match : matchChild; + } else { + matchesSelector = query; + } + + // transport + if ( typeof define === 'function' && define.amd ) { + // AMD + define( 'matches-selector/matches-selector',[],function() { + return matchesSelector; + }); + } else if ( typeof exports === 'object' ) { + module.exports = matchesSelector; + } + else { + // browser global + window.matchesSelector = matchesSelector; + } + +})( Element.prototype ); + +/** + * Fizzy UI utils v1.0.1 + * MIT license + */ + +/*jshint browser: true, undef: true, unused: true, strict: true */ + +( function( window, factory ) { + /*global define: false, module: false, require: false */ + + // universal module definition + + if ( typeof define == 'function' && define.amd ) { + // AMD + define( 'fizzy-ui-utils/utils',[ + 'doc-ready/doc-ready', + 'matches-selector/matches-selector' + ], function( docReady, matchesSelector ) { + return factory( window, docReady, matchesSelector ); + }); + } else if ( typeof exports == 'object' ) { + // CommonJS + module.exports = factory( + window, + require('doc-ready'), + require('desandro-matches-selector') + ); + } else { + // browser global + window.fizzyUIUtils = factory( + window, + window.docReady, + window.matchesSelector + ); + } + +}( window, function factory( window, docReady, matchesSelector ) { + + + +var utils = {}; + +// ----- extend ----- // + +// extends objects +utils.extend = function( a, b ) { + for ( var prop in b ) { + a[ prop ] = b[ prop ]; + } + return a; +}; + +// ----- modulo ----- // + +utils.modulo = function( num, div ) { + return ( ( num % div ) + div ) % div; +}; + +// ----- isArray ----- // + +var objToString = Object.prototype.toString; +utils.isArray = function( obj ) { + return objToString.call( obj ) == '[object Array]'; +}; + +// ----- makeArray ----- // + +// turn element or nodeList into an array +utils.makeArray = function( obj ) { + var ary = []; + if ( utils.isArray( obj ) ) { + // use object if already an array + ary = obj; + } else if ( obj && typeof obj.length == 'number' ) { + // convert nodeList to array + for ( var i=0, len = obj.length; i < len; i++ ) { + ary.push( obj[i] ); + } + } else { + // array of single index + ary.push( obj ); + } + return ary; +}; + +// ----- indexOf ----- // + +// index of helper cause IE8 +utils.indexOf = Array.prototype.indexOf ? function( ary, obj ) { + return ary.indexOf( obj ); + } : function( ary, obj ) { + for ( var i=0, len = ary.length; i < len; i++ ) { + if ( ary[i] === obj ) { + return i; + } + } + return -1; + }; + +// ----- removeFrom ----- // + +utils.removeFrom = function( ary, obj ) { + var index = utils.indexOf( ary, obj ); + if ( index != -1 ) { + ary.splice( index, 1 ); + } +}; + +// ----- isElement ----- // + +// http://stackoverflow.com/a/384380/182183 +utils.isElement = ( typeof HTMLElement == 'function' || typeof HTMLElement == 'object' ) ? + function isElementDOM2( obj ) { + return obj instanceof HTMLElement; + } : + function isElementQuirky( obj ) { + return obj && typeof obj == 'object' && + obj.nodeType == 1 && typeof obj.nodeName == 'string'; + }; + +// ----- setText ----- // + +utils.setText = ( function() { + var setTextProperty; + function setText( elem, text ) { + // only check setTextProperty once + setTextProperty = setTextProperty || ( document.documentElement.textContent !== undefined ? 'textContent' : 'innerText' ); + elem[ setTextProperty ] = text; + } + return setText; +})(); + +// ----- getParent ----- // + +utils.getParent = function( elem, selector ) { + while ( elem != document.body ) { + elem = elem.parentNode; + if ( matchesSelector( elem, selector ) ) { + return elem; + } + } +}; + +// ----- getQueryElement ----- // + +// use element as selector string +utils.getQueryElement = function( elem ) { + if ( typeof elem == 'string' ) { + return document.querySelector( elem ); + } + return elem; +}; + +// ----- handleEvent ----- // + +// enable .ontype to trigger from .addEventListener( elem, 'type' ) +utils.handleEvent = function( event ) { + var method = 'on' + event.type; + if ( this[ method ] ) { + this[ method ]( event ); + } +}; + +// ----- filterFindElements ----- // + +utils.filterFindElements = function( elems, selector ) { + // make array of elems + elems = utils.makeArray( elems ); + var ffElems = []; + + for ( var i=0, len = elems.length; i < len; i++ ) { + var elem = elems[i]; + // check that elem is an actual element + if ( !utils.isElement( elem ) ) { + continue; + } + // filter & find items if we have a selector + if ( selector ) { + // filter siblings + if ( matchesSelector( elem, selector ) ) { + ffElems.push( elem ); + } + // find children + var childElems = elem.querySelectorAll( selector ); + // concat childElems to filterFound array + for ( var j=0, jLen = childElems.length; j < jLen; j++ ) { + ffElems.push( childElems[j] ); + } + } else { + ffElems.push( elem ); + } + } + + return ffElems; +}; + +// ----- debounceMethod ----- // + +utils.debounceMethod = function( _class, methodName, threshold ) { + // original method + var method = _class.prototype[ methodName ]; + var timeoutName = methodName + 'Timeout'; + + _class.prototype[ methodName ] = function() { + var timeout = this[ timeoutName ]; + if ( timeout ) { + clearTimeout( timeout ); + } + var args = arguments; + + var _this = this; + this[ timeoutName ] = setTimeout( function() { + method.apply( _this, args ); + delete _this[ timeoutName ]; + }, threshold || 100 ); + }; +}; + +// ----- htmlInit ----- // + +// http://jamesroberts.name/blog/2010/02/22/string-functions-for-javascript-trim-to-camel-case-to-dashed-and-to-underscore/ +utils.toDashed = function( str ) { + return str.replace( /(.)([A-Z])/g, function( match, $1, $2 ) { + return $1 + '-' + $2; + }).toLowerCase(); +}; + +var console = window.console; +/** + * allow user to initialize classes via .js-namespace class + * htmlInit( Widget, 'widgetName' ) + * options are parsed from data-namespace-option attribute + */ +utils.htmlInit = function( WidgetClass, namespace ) { + docReady( function() { + var dashedNamespace = utils.toDashed( namespace ); + var elems = document.querySelectorAll( '.js-' + dashedNamespace ); + var dataAttr = 'data-' + dashedNamespace + '-options'; + + for ( var i=0, len = elems.length; i < len; i++ ) { + var elem = elems[i]; + var attr = elem.getAttribute( dataAttr ); + var options; + try { + options = attr && JSON.parse( attr ); + } catch ( error ) { + // log error, do not initialize + if ( console ) { + console.error( 'Error parsing ' + dataAttr + ' on ' + + elem.nodeName.toLowerCase() + ( elem.id ? '#' + elem.id : '' ) + ': ' + + error ); + } + continue; + } + // initialize + var instance = new WidgetClass( elem, options ); + // make available via $().data('layoutname') + var jQuery = window.jQuery; + if ( jQuery ) { + jQuery.data( elem, namespace, instance ); + } + } + }); +}; + +// ----- ----- // + +return utils; + +})); + +/** + * Outlayer Item + */ + +( function( window, factory ) { + + // universal module definition + if ( typeof define === 'function' && define.amd ) { + // AMD + define( 'outlayer/item',[ + 'eventEmitter/EventEmitter', + 'get-size/get-size', + 'get-style-property/get-style-property', + 'fizzy-ui-utils/utils' + ], + function( EventEmitter, getSize, getStyleProperty, utils ) { + return factory( window, EventEmitter, getSize, getStyleProperty, utils ); + } + ); + } else if (typeof exports === 'object') { + // CommonJS + module.exports = factory( + window, + require('wolfy87-eventemitter'), + require('get-size'), + require('desandro-get-style-property'), + require('fizzy-ui-utils') + ); + } else { + // browser global + window.Outlayer = {}; + window.Outlayer.Item = factory( + window, + window.EventEmitter, + window.getSize, + window.getStyleProperty, + window.fizzyUIUtils + ); + } + +}( window, function factory( window, EventEmitter, getSize, getStyleProperty, utils ) { + + +// ----- helpers ----- // + +var getComputedStyle = window.getComputedStyle; +var getStyle = getComputedStyle ? + function( elem ) { + return getComputedStyle( elem, null ); + } : + function( elem ) { + return elem.currentStyle; + }; + + +function isEmptyObj( obj ) { + for ( var prop in obj ) { + return false; + } + prop = null; + return true; +} + +// -------------------------- CSS3 support -------------------------- // + +var transitionProperty = getStyleProperty('transition'); +var transformProperty = getStyleProperty('transform'); +var supportsCSS3 = transitionProperty && transformProperty; +var is3d = !!getStyleProperty('perspective'); + +var transitionEndEvent = { + WebkitTransition: 'webkitTransitionEnd', + MozTransition: 'transitionend', + OTransition: 'otransitionend', + transition: 'transitionend' +}[ transitionProperty ]; + +// properties that could have vendor prefix +var prefixableProperties = [ + 'transform', + 'transition', + 'transitionDuration', + 'transitionProperty' +]; + +// cache all vendor properties +var vendorProperties = ( function() { + var cache = {}; + for ( var i=0, len = prefixableProperties.length; i < len; i++ ) { + var prop = prefixableProperties[i]; + var supportedProp = getStyleProperty( prop ); + if ( supportedProp && supportedProp !== prop ) { + cache[ prop ] = supportedProp; + } + } + return cache; +})(); + +// -------------------------- Item -------------------------- // + +function Item( element, layout ) { + if ( !element ) { + return; + } + + this.element = element; + // parent layout class, i.e. Masonry, Isotope, or Packery + this.layout = layout; + this.position = { + x: 0, + y: 0 + }; + + this._create(); +} + +// inherit EventEmitter +utils.extend( Item.prototype, EventEmitter.prototype ); + +Item.prototype._create = function() { + // transition objects + this._transn = { + ingProperties: {}, + clean: {}, + onEnd: {} + }; + + this.css({ + position: 'absolute' + }); +}; + +// trigger specified handler for event type +Item.prototype.handleEvent = function( event ) { + var method = 'on' + event.type; + if ( this[ method ] ) { + this[ method ]( event ); + } +}; + +Item.prototype.getSize = function() { + this.size = getSize( this.element ); +}; + +/** + * apply CSS styles to element + * @param {Object} style + */ +Item.prototype.css = function( style ) { + var elemStyle = this.element.style; + + for ( var prop in style ) { + // use vendor property if available + var supportedProp = vendorProperties[ prop ] || prop; + elemStyle[ supportedProp ] = style[ prop ]; + } +}; + + // measure position, and sets it +Item.prototype.getPosition = function() { + var style = getStyle( this.element ); + var layoutOptions = this.layout.options; + var isOriginLeft = layoutOptions.isOriginLeft; + var isOriginTop = layoutOptions.isOriginTop; + var xValue = style[ isOriginLeft ? 'left' : 'right' ]; + var yValue = style[ isOriginTop ? 'top' : 'bottom' ]; + var x = parseInt( xValue, 10 ); + var y = parseInt( yValue, 10 ); + // convert percent to pixels + var layoutSize = this.layout.size; + x = xValue.indexOf('%') != -1 ? ( x / 100 ) * layoutSize.width : x; + y = yValue.indexOf('%') != -1 ? ( y / 100 ) * layoutSize.height : y; + + // clean up 'auto' or other non-integer values + x = isNaN( x ) ? 0 : x; + y = isNaN( y ) ? 0 : y; + // remove padding from measurement + x -= isOriginLeft ? layoutSize.paddingLeft : layoutSize.paddingRight; + y -= isOriginTop ? layoutSize.paddingTop : layoutSize.paddingBottom; + + this.position.x = x; + this.position.y = y; +}; + +// set settled position, apply padding +Item.prototype.layoutPosition = function() { + var layoutSize = this.layout.size; + var layoutOptions = this.layout.options; + var style = {}; + + // x + var xPadding = layoutOptions.isOriginLeft ? 'paddingLeft' : 'paddingRight'; + var xProperty = layoutOptions.isOriginLeft ? 'left' : 'right'; + var xResetProperty = layoutOptions.isOriginLeft ? 'right' : 'left'; + + var x = this.position.x + layoutSize[ xPadding ]; + // set in percentage or pixels + style[ xProperty ] = this.getXValue( x ); + // reset other property + style[ xResetProperty ] = ''; + + // y + var yPadding = layoutOptions.isOriginTop ? 'paddingTop' : 'paddingBottom'; + var yProperty = layoutOptions.isOriginTop ? 'top' : 'bottom'; + var yResetProperty = layoutOptions.isOriginTop ? 'bottom' : 'top'; + + var y = this.position.y + layoutSize[ yPadding ]; + // set in percentage or pixels + style[ yProperty ] = this.getYValue( y ); + // reset other property + style[ yResetProperty ] = ''; + + this.css( style ); + this.emitEvent( 'layout', [ this ] ); +}; + +Item.prototype.getXValue = function( x ) { + var layoutOptions = this.layout.options; + return layoutOptions.percentPosition && !layoutOptions.isHorizontal ? + ( ( x / this.layout.size.width ) * 100 ) + '%' : x + 'px'; +}; + +Item.prototype.getYValue = function( y ) { + var layoutOptions = this.layout.options; + return layoutOptions.percentPosition && layoutOptions.isHorizontal ? + ( ( y / this.layout.size.height ) * 100 ) + '%' : y + 'px'; +}; + + +Item.prototype._transitionTo = function( x, y ) { + this.getPosition(); + // get current x & y from top/left + var curX = this.position.x; + var curY = this.position.y; + + var compareX = parseInt( x, 10 ); + var compareY = parseInt( y, 10 ); + var didNotMove = compareX === this.position.x && compareY === this.position.y; + + // save end position + this.setPosition( x, y ); + + // if did not move and not transitioning, just go to layout + if ( didNotMove && !this.isTransitioning ) { + this.layoutPosition(); + return; + } + + var transX = x - curX; + var transY = y - curY; + var transitionStyle = {}; + transitionStyle.transform = this.getTranslate( transX, transY ); + + this.transition({ + to: transitionStyle, + onTransitionEnd: { + transform: this.layoutPosition + }, + isCleaning: true + }); +}; + +Item.prototype.getTranslate = function( x, y ) { + // flip cooridinates if origin on right or bottom + var layoutOptions = this.layout.options; + x = layoutOptions.isOriginLeft ? x : -x; + y = layoutOptions.isOriginTop ? y : -y; + x = this.getXValue( x ); + y = this.getYValue( y ); + + if ( is3d ) { + return 'translate3d(' + x + ', ' + y + ', 0)'; + } + + return 'translate(' + x + ', ' + y + ')'; +}; + +// non transition + transform support +Item.prototype.goTo = function( x, y ) { + this.setPosition( x, y ); + this.layoutPosition(); +}; + +// use transition and transforms if supported +Item.prototype.moveTo = supportsCSS3 ? + Item.prototype._transitionTo : Item.prototype.goTo; + +Item.prototype.setPosition = function( x, y ) { + this.position.x = parseInt( x, 10 ); + this.position.y = parseInt( y, 10 ); +}; + +// ----- transition ----- // + +/** + * @param {Object} style - CSS + * @param {Function} onTransitionEnd + */ + +// non transition, just trigger callback +Item.prototype._nonTransition = function( args ) { + this.css( args.to ); + if ( args.isCleaning ) { + this._removeStyles( args.to ); + } + for ( var prop in args.onTransitionEnd ) { + args.onTransitionEnd[ prop ].call( this ); + } +}; + +/** + * proper transition + * @param {Object} args - arguments + * @param {Object} to - style to transition to + * @param {Object} from - style to start transition from + * @param {Boolean} isCleaning - removes transition styles after transition + * @param {Function} onTransitionEnd - callback + */ +Item.prototype._transition = function( args ) { + // redirect to nonTransition if no transition duration + if ( !parseFloat( this.layout.options.transitionDuration ) ) { + this._nonTransition( args ); + return; + } + + var _transition = this._transn; + // keep track of onTransitionEnd callback by css property + for ( var prop in args.onTransitionEnd ) { + _transition.onEnd[ prop ] = args.onTransitionEnd[ prop ]; + } + // keep track of properties that are transitioning + for ( prop in args.to ) { + _transition.ingProperties[ prop ] = true; + // keep track of properties to clean up when transition is done + if ( args.isCleaning ) { + _transition.clean[ prop ] = true; + } + } + + // set from styles + if ( args.from ) { + this.css( args.from ); + // force redraw. http://blog.alexmaccaw.com/css-transitions + var h = this.element.offsetHeight; + // hack for JSHint to hush about unused var + h = null; + } + // enable transition + this.enableTransition( args.to ); + // set styles that are transitioning + this.css( args.to ); + + this.isTransitioning = true; + +}; + +// dash before all cap letters, including first for +// WebkitTransform => -webkit-transform +function toDashedAll( str ) { + return str.replace( /([A-Z])/g, function( $1 ) { + return '-' + $1.toLowerCase(); + }); +} + +var transitionProps = 'opacity,' + + toDashedAll( vendorProperties.transform || 'transform' ); + +Item.prototype.enableTransition = function(/* style */) { + // HACK changing transitionProperty during a transition + // will cause transition to jump + if ( this.isTransitioning ) { + return; + } + + // make `transition: foo, bar, baz` from style object + // HACK un-comment this when enableTransition can work + // while a transition is happening + // var transitionValues = []; + // for ( var prop in style ) { + // // dash-ify camelCased properties like WebkitTransition + // prop = vendorProperties[ prop ] || prop; + // transitionValues.push( toDashedAll( prop ) ); + // } + // enable transition styles + this.css({ + transitionProperty: transitionProps, + transitionDuration: this.layout.options.transitionDuration + }); + // listen for transition end event + this.element.addEventListener( transitionEndEvent, this, false ); +}; + +Item.prototype.transition = Item.prototype[ transitionProperty ? '_transition' : '_nonTransition' ]; + +// ----- events ----- // + +Item.prototype.onwebkitTransitionEnd = function( event ) { + this.ontransitionend( event ); +}; + +Item.prototype.onotransitionend = function( event ) { + this.ontransitionend( event ); +}; + +// properties that I munge to make my life easier +var dashedVendorProperties = { + '-webkit-transform': 'transform', + '-moz-transform': 'transform', + '-o-transform': 'transform' +}; + +Item.prototype.ontransitionend = function( event ) { + // disregard bubbled events from children + if ( event.target !== this.element ) { + return; + } + var _transition = this._transn; + // get property name of transitioned property, convert to prefix-free + var propertyName = dashedVendorProperties[ event.propertyName ] || event.propertyName; + + // remove property that has completed transitioning + delete _transition.ingProperties[ propertyName ]; + // check if any properties are still transitioning + if ( isEmptyObj( _transition.ingProperties ) ) { + // all properties have completed transitioning + this.disableTransition(); + } + // clean style + if ( propertyName in _transition.clean ) { + // clean up style + this.element.style[ event.propertyName ] = ''; + delete _transition.clean[ propertyName ]; + } + // trigger onTransitionEnd callback + if ( propertyName in _transition.onEnd ) { + var onTransitionEnd = _transition.onEnd[ propertyName ]; + onTransitionEnd.call( this ); + delete _transition.onEnd[ propertyName ]; + } + + this.emitEvent( 'transitionEnd', [ this ] ); +}; + +Item.prototype.disableTransition = function() { + this.removeTransitionStyles(); + this.element.removeEventListener( transitionEndEvent, this, false ); + this.isTransitioning = false; +}; + +/** + * removes style property from element + * @param {Object} style +**/ +Item.prototype._removeStyles = function( style ) { + // clean up transition styles + var cleanStyle = {}; + for ( var prop in style ) { + cleanStyle[ prop ] = ''; + } + this.css( cleanStyle ); +}; + +var cleanTransitionStyle = { + transitionProperty: '', + transitionDuration: '' +}; + +Item.prototype.removeTransitionStyles = function() { + // remove transition + this.css( cleanTransitionStyle ); +}; + +// ----- show/hide/remove ----- // + +// remove element from DOM +Item.prototype.removeElem = function() { + this.element.parentNode.removeChild( this.element ); + // remove display: none + this.css({ display: '' }); + this.emitEvent( 'remove', [ this ] ); +}; + +Item.prototype.remove = function() { + // just remove element if no transition support or no transition + if ( !transitionProperty || !parseFloat( this.layout.options.transitionDuration ) ) { + this.removeElem(); + return; + } + + // start transition + var _this = this; + this.once( 'transitionEnd', function() { + _this.removeElem(); + }); + this.hide(); +}; + +Item.prototype.reveal = function() { + delete this.isHidden; + // remove display: none + this.css({ display: '' }); + + var options = this.layout.options; + + var onTransitionEnd = {}; + var transitionEndProperty = this.getHideRevealTransitionEndProperty('visibleStyle'); + onTransitionEnd[ transitionEndProperty ] = this.onRevealTransitionEnd; + + this.transition({ + from: options.hiddenStyle, + to: options.visibleStyle, + isCleaning: true, + onTransitionEnd: onTransitionEnd + }); +}; + +Item.prototype.onRevealTransitionEnd = function() { + // check if still visible + // during transition, item may have been hidden + if ( !this.isHidden ) { + this.emitEvent('reveal'); + } +}; + +/** + * get style property use for hide/reveal transition end + * @param {String} styleProperty - hiddenStyle/visibleStyle + * @returns {String} + */ +Item.prototype.getHideRevealTransitionEndProperty = function( styleProperty ) { + var optionStyle = this.layout.options[ styleProperty ]; + // use opacity + if ( optionStyle.opacity ) { + return 'opacity'; + } + // get first property + for ( var prop in optionStyle ) { + return prop; + } +}; + +Item.prototype.hide = function() { + // set flag + this.isHidden = true; + // remove display: none + this.css({ display: '' }); + + var options = this.layout.options; + + var onTransitionEnd = {}; + var transitionEndProperty = this.getHideRevealTransitionEndProperty('hiddenStyle'); + onTransitionEnd[ transitionEndProperty ] = this.onHideTransitionEnd; + + this.transition({ + from: options.visibleStyle, + to: options.hiddenStyle, + // keep hidden stuff hidden + isCleaning: true, + onTransitionEnd: onTransitionEnd + }); +}; + +Item.prototype.onHideTransitionEnd = function() { + // check if still hidden + // during transition, item may have been un-hidden + if ( this.isHidden ) { + this.css({ display: 'none' }); + this.emitEvent('hide'); + } +}; + +Item.prototype.destroy = function() { + this.css({ + position: '', + left: '', + right: '', + top: '', + bottom: '', + transition: '', + transform: '' + }); +}; + +return Item; + +})); + +/*! + * Outlayer v1.4.1 + * the brains and guts of a layout library + * MIT license + */ + +( function( window, factory ) { + + // universal module definition + + if ( typeof define == 'function' && define.amd ) { + // AMD + define( 'outlayer/outlayer',[ + 'eventie/eventie', + 'eventEmitter/EventEmitter', + 'get-size/get-size', + 'fizzy-ui-utils/utils', + './item' + ], + function( eventie, EventEmitter, getSize, utils, Item ) { + return factory( window, eventie, EventEmitter, getSize, utils, Item); + } + ); + } else if ( typeof exports == 'object' ) { + // CommonJS + module.exports = factory( + window, + require('eventie'), + require('wolfy87-eventemitter'), + require('get-size'), + require('fizzy-ui-utils'), + require('./item') + ); + } else { + // browser global + window.Outlayer = factory( + window, + window.eventie, + window.EventEmitter, + window.getSize, + window.fizzyUIUtils, + window.Outlayer.Item + ); + } + +}( window, function factory( window, eventie, EventEmitter, getSize, utils, Item ) { + + +// ----- vars ----- // + +var console = window.console; +var jQuery = window.jQuery; +var noop = function() {}; + +// -------------------------- Outlayer -------------------------- // + +// globally unique identifiers +var GUID = 0; +// internal store of all Outlayer intances +var instances = {}; + + +/** + * @param {Element, String} element + * @param {Object} options + * @constructor + */ +function Outlayer( element, options ) { + var queryElement = utils.getQueryElement( element ); + if ( !queryElement ) { + if ( console ) { + console.error( 'Bad element for ' + this.constructor.namespace + + ': ' + ( queryElement || element ) ); + } + return; + } + this.element = queryElement; + // add jQuery + if ( jQuery ) { + this.$element = jQuery( this.element ); + } + + // options + this.options = utils.extend( {}, this.constructor.defaults ); + this.option( options ); + + // add id for Outlayer.getFromElement + var id = ++GUID; + this.element.outlayerGUID = id; // expando + instances[ id ] = this; // associate via id + + // kick it off + this._create(); + + if ( this.options.isInitLayout ) { + this.layout(); + } +} + +// settings are for internal use only +Outlayer.namespace = 'outlayer'; +Outlayer.Item = Item; + +// default options +Outlayer.defaults = { + containerStyle: { + position: 'relative' + }, + isInitLayout: true, + isOriginLeft: true, + isOriginTop: true, + isResizeBound: true, + isResizingContainer: true, + // item options + transitionDuration: '0.4s', + hiddenStyle: { + opacity: 0, + transform: 'scale(0.001)' + }, + visibleStyle: { + opacity: 1, + transform: 'scale(1)' + } +}; + +// inherit EventEmitter +utils.extend( Outlayer.prototype, EventEmitter.prototype ); + +/** + * set options + * @param {Object} opts + */ +Outlayer.prototype.option = function( opts ) { + utils.extend( this.options, opts ); +}; + +Outlayer.prototype._create = function() { + // get items from children + this.reloadItems(); + // elements that affect layout, but are not laid out + this.stamps = []; + this.stamp( this.options.stamp ); + // set container style + utils.extend( this.element.style, this.options.containerStyle ); + + // bind resize method + if ( this.options.isResizeBound ) { + this.bindResize(); + } +}; + +// goes through all children again and gets bricks in proper order +Outlayer.prototype.reloadItems = function() { + // collection of item elements + this.items = this._itemize( this.element.children ); +}; + + +/** + * turn elements into Outlayer.Items to be used in layout + * @param {Array or NodeList or HTMLElement} elems + * @returns {Array} items - collection of new Outlayer Items + */ +Outlayer.prototype._itemize = function( elems ) { + + var itemElems = this._filterFindItemElements( elems ); + var Item = this.constructor.Item; + + // create new Outlayer Items for collection + var items = []; + for ( var i=0, len = itemElems.length; i < len; i++ ) { + var elem = itemElems[i]; + var item = new Item( elem, this ); + items.push( item ); + } + + return items; +}; + +/** + * get item elements to be used in layout + * @param {Array or NodeList or HTMLElement} elems + * @returns {Array} items - item elements + */ +Outlayer.prototype._filterFindItemElements = function( elems ) { + return utils.filterFindElements( elems, this.options.itemSelector ); +}; + +/** + * getter method for getting item elements + * @returns {Array} elems - collection of item elements + */ +Outlayer.prototype.getItemElements = function() { + var elems = []; + for ( var i=0, len = this.items.length; i < len; i++ ) { + elems.push( this.items[i].element ); + } + return elems; +}; + +// ----- init & layout ----- // + +/** + * lays out all items + */ +Outlayer.prototype.layout = function() { + this._resetLayout(); + this._manageStamps(); + + // don't animate first layout + var isInstant = this.options.isLayoutInstant !== undefined ? + this.options.isLayoutInstant : !this._isLayoutInited; + this.layoutItems( this.items, isInstant ); + + // flag for initalized + this._isLayoutInited = true; +}; + +// _init is alias for layout +Outlayer.prototype._init = Outlayer.prototype.layout; + +/** + * logic before any new layout + */ +Outlayer.prototype._resetLayout = function() { + this.getSize(); +}; + + +Outlayer.prototype.getSize = function() { + this.size = getSize( this.element ); +}; + +/** + * get measurement from option, for columnWidth, rowHeight, gutter + * if option is String -> get element from selector string, & get size of element + * if option is Element -> get size of element + * else use option as a number + * + * @param {String} measurement + * @param {String} size - width or height + * @private + */ +Outlayer.prototype._getMeasurement = function( measurement, size ) { + var option = this.options[ measurement ]; + var elem; + if ( !option ) { + // default to 0 + this[ measurement ] = 0; + } else { + // use option as an element + if ( typeof option === 'string' ) { + elem = this.element.querySelector( option ); + } else if ( utils.isElement( option ) ) { + elem = option; + } + // use size of element, if element + this[ measurement ] = elem ? getSize( elem )[ size ] : option; + } +}; + +/** + * layout a collection of item elements + * @api public + */ +Outlayer.prototype.layoutItems = function( items, isInstant ) { + items = this._getItemsForLayout( items ); + + this._layoutItems( items, isInstant ); + + this._postLayout(); +}; + +/** + * get the items to be laid out + * you may want to skip over some items + * @param {Array} items + * @returns {Array} items + */ +Outlayer.prototype._getItemsForLayout = function( items ) { + var layoutItems = []; + for ( var i=0, len = items.length; i < len; i++ ) { + var item = items[i]; + if ( !item.isIgnored ) { + layoutItems.push( item ); + } + } + return layoutItems; +}; + +/** + * layout items + * @param {Array} items + * @param {Boolean} isInstant + */ +Outlayer.prototype._layoutItems = function( items, isInstant ) { + this._emitCompleteOnItems( 'layout', items ); + + if ( !items || !items.length ) { + // no items, emit event with empty array + return; + } + + var queue = []; + + for ( var i=0, len = items.length; i < len; i++ ) { + var item = items[i]; + // get x/y object from method + var position = this._getItemLayoutPosition( item ); + // enqueue + position.item = item; + position.isInstant = isInstant || item.isLayoutInstant; + queue.push( position ); + } + + this._processLayoutQueue( queue ); +}; + +/** + * get item layout position + * @param {Outlayer.Item} item + * @returns {Object} x and y position + */ +Outlayer.prototype._getItemLayoutPosition = function( /* item */ ) { + return { + x: 0, + y: 0 + }; +}; + +/** + * iterate over array and position each item + * Reason being - separating this logic prevents 'layout invalidation' + * thx @paul_irish + * @param {Array} queue + */ +Outlayer.prototype._processLayoutQueue = function( queue ) { + for ( var i=0, len = queue.length; i < len; i++ ) { + var obj = queue[i]; + this._positionItem( obj.item, obj.x, obj.y, obj.isInstant ); + } +}; + +/** + * Sets position of item in DOM + * @param {Outlayer.Item} item + * @param {Number} x - horizontal position + * @param {Number} y - vertical position + * @param {Boolean} isInstant - disables transitions + */ +Outlayer.prototype._positionItem = function( item, x, y, isInstant ) { + if ( isInstant ) { + // if not transition, just set CSS + item.goTo( x, y ); + } else { + item.moveTo( x, y ); + } +}; + +/** + * Any logic you want to do after each layout, + * i.e. size the container + */ +Outlayer.prototype._postLayout = function() { + this.resizeContainer(); +}; + +Outlayer.prototype.resizeContainer = function() { + if ( !this.options.isResizingContainer ) { + return; + } + var size = this._getContainerSize(); + if ( size ) { + this._setContainerMeasure( size.width, true ); + this._setContainerMeasure( size.height, false ); + } +}; + +/** + * Sets width or height of container if returned + * @returns {Object} size + * @param {Number} width + * @param {Number} height + */ +Outlayer.prototype._getContainerSize = noop; + +/** + * @param {Number} measure - size of width or height + * @param {Boolean} isWidth + */ +Outlayer.prototype._setContainerMeasure = function( measure, isWidth ) { + if ( measure === undefined ) { + return; + } + + var elemSize = this.size; + // add padding and border width if border box + if ( elemSize.isBorderBox ) { + measure += isWidth ? elemSize.paddingLeft + elemSize.paddingRight + + elemSize.borderLeftWidth + elemSize.borderRightWidth : + elemSize.paddingBottom + elemSize.paddingTop + + elemSize.borderTopWidth + elemSize.borderBottomWidth; + } + + measure = Math.max( measure, 0 ); + this.element.style[ isWidth ? 'width' : 'height' ] = measure + 'px'; +}; + +/** + * emit eventComplete on a collection of items events + * @param {String} eventName + * @param {Array} items - Outlayer.Items + */ +Outlayer.prototype._emitCompleteOnItems = function( eventName, items ) { + var _this = this; + function onComplete() { + _this.dispatchEvent( eventName + 'Complete', null, [ items ] ); + } + + var count = items.length; + if ( !items || !count ) { + onComplete(); + return; + } + + var doneCount = 0; + function tick() { + doneCount++; + if ( doneCount === count ) { + onComplete(); + } + } + + // bind callback + for ( var i=0, len = items.length; i < len; i++ ) { + var item = items[i]; + item.once( eventName, tick ); + } +}; + +/** + * emits events via eventEmitter and jQuery events + * @param {String} type - name of event + * @param {Event} event - original event + * @param {Array} args - extra arguments + */ +Outlayer.prototype.dispatchEvent = function( type, event, args ) { + // add original event to arguments + var emitArgs = event ? [ event ].concat( args ) : args; + this.emitEvent( type, emitArgs ); + + if ( jQuery ) { + // set this.$element + this.$element = this.$element || jQuery( this.element ); + if ( event ) { + // create jQuery event + var $event = jQuery.Event( event ); + $event.type = type; + this.$element.trigger( $event, args ); + } else { + // just trigger with type if no event available + this.$element.trigger( type, args ); + } + } +}; + +// -------------------------- ignore & stamps -------------------------- // + + +/** + * keep item in collection, but do not lay it out + * ignored items do not get skipped in layout + * @param {Element} elem + */ +Outlayer.prototype.ignore = function( elem ) { + var item = this.getItem( elem ); + if ( item ) { + item.isIgnored = true; + } +}; + +/** + * return item to layout collection + * @param {Element} elem + */ +Outlayer.prototype.unignore = function( elem ) { + var item = this.getItem( elem ); + if ( item ) { + delete item.isIgnored; + } +}; + +/** + * adds elements to stamps + * @param {NodeList, Array, Element, or String} elems + */ +Outlayer.prototype.stamp = function( elems ) { + elems = this._find( elems ); + if ( !elems ) { + return; + } + + this.stamps = this.stamps.concat( elems ); + // ignore + for ( var i=0, len = elems.length; i < len; i++ ) { + var elem = elems[i]; + this.ignore( elem ); + } +}; + +/** + * removes elements to stamps + * @param {NodeList, Array, or Element} elems + */ +Outlayer.prototype.unstamp = function( elems ) { + elems = this._find( elems ); + if ( !elems ){ + return; + } + + for ( var i=0, len = elems.length; i < len; i++ ) { + var elem = elems[i]; + // filter out removed stamp elements + utils.removeFrom( this.stamps, elem ); + this.unignore( elem ); + } + +}; + +/** + * finds child elements + * @param {NodeList, Array, Element, or String} elems + * @returns {Array} elems + */ +Outlayer.prototype._find = function( elems ) { + if ( !elems ) { + return; + } + // if string, use argument as selector string + if ( typeof elems === 'string' ) { + elems = this.element.querySelectorAll( elems ); + } + elems = utils.makeArray( elems ); + return elems; +}; + +Outlayer.prototype._manageStamps = function() { + if ( !this.stamps || !this.stamps.length ) { + return; + } + + this._getBoundingRect(); + + for ( var i=0, len = this.stamps.length; i < len; i++ ) { + var stamp = this.stamps[i]; + this._manageStamp( stamp ); + } +}; + +// update boundingLeft / Top +Outlayer.prototype._getBoundingRect = function() { + // get bounding rect for container element + var boundingRect = this.element.getBoundingClientRect(); + var size = this.size; + this._boundingRect = { + left: boundingRect.left + size.paddingLeft + size.borderLeftWidth, + top: boundingRect.top + size.paddingTop + size.borderTopWidth, + right: boundingRect.right - ( size.paddingRight + size.borderRightWidth ), + bottom: boundingRect.bottom - ( size.paddingBottom + size.borderBottomWidth ) + }; +}; + +/** + * @param {Element} stamp +**/ +Outlayer.prototype._manageStamp = noop; + +/** + * get x/y position of element relative to container element + * @param {Element} elem + * @returns {Object} offset - has left, top, right, bottom + */ +Outlayer.prototype._getElementOffset = function( elem ) { + var boundingRect = elem.getBoundingClientRect(); + var thisRect = this._boundingRect; + var size = getSize( elem ); + var offset = { + left: boundingRect.left - thisRect.left - size.marginLeft, + top: boundingRect.top - thisRect.top - size.marginTop, + right: thisRect.right - boundingRect.right - size.marginRight, + bottom: thisRect.bottom - boundingRect.bottom - size.marginBottom + }; + return offset; +}; + +// -------------------------- resize -------------------------- // + +// enable event handlers for listeners +// i.e. resize -> onresize +Outlayer.prototype.handleEvent = function( event ) { + var method = 'on' + event.type; + if ( this[ method ] ) { + this[ method ]( event ); + } +}; + +/** + * Bind layout to window resizing + */ +Outlayer.prototype.bindResize = function() { + // bind just one listener + if ( this.isResizeBound ) { + return; + } + eventie.bind( window, 'resize', this ); + this.isResizeBound = true; +}; + +/** + * Unbind layout to window resizing + */ +Outlayer.prototype.unbindResize = function() { + if ( this.isResizeBound ) { + eventie.unbind( window, 'resize', this ); + } + this.isResizeBound = false; +}; + +// original debounce by John Hann +// http://unscriptable.com/index.php/2009/03/20/debouncing-javascript-methods/ + +// this fires every resize +Outlayer.prototype.onresize = function() { + if ( this.resizeTimeout ) { + clearTimeout( this.resizeTimeout ); + } + + var _this = this; + function delayed() { + _this.resize(); + delete _this.resizeTimeout; + } + + this.resizeTimeout = setTimeout( delayed, 100 ); +}; + +// debounced, layout on resize +Outlayer.prototype.resize = function() { + // don't trigger if size did not change + // or if resize was unbound. See #9 + if ( !this.isResizeBound || !this.needsResizeLayout() ) { + return; + } + + this.layout(); +}; + +/** + * check if layout is needed post layout + * @returns Boolean + */ +Outlayer.prototype.needsResizeLayout = function() { + var size = getSize( this.element ); + // check that this.size and size are there + // IE8 triggers resize on body size change, so they might not be + var hasSizes = this.size && size; + return hasSizes && size.innerWidth !== this.size.innerWidth; +}; + +// -------------------------- methods -------------------------- // + +/** + * add items to Outlayer instance + * @param {Array or NodeList or Element} elems + * @returns {Array} items - Outlayer.Items +**/ +Outlayer.prototype.addItems = function( elems ) { + var items = this._itemize( elems ); + // add items to collection + if ( items.length ) { + this.items = this.items.concat( items ); + } + return items; +}; + +/** + * Layout newly-appended item elements + * @param {Array or NodeList or Element} elems + */ +Outlayer.prototype.appended = function( elems ) { + var items = this.addItems( elems ); + if ( !items.length ) { + return; + } + // layout and reveal just the new items + this.layoutItems( items, true ); + this.reveal( items ); +}; + +/** + * Layout prepended elements + * @param {Array or NodeList or Element} elems + */ +Outlayer.prototype.prepended = function( elems ) { + var items = this._itemize( elems ); + if ( !items.length ) { + return; + } + // add items to beginning of collection + var previousItems = this.items.slice(0); + this.items = items.concat( previousItems ); + // start new layout + this._resetLayout(); + this._manageStamps(); + // layout new stuff without transition + this.layoutItems( items, true ); + this.reveal( items ); + // layout previous items + this.layoutItems( previousItems ); +}; + +/** + * reveal a collection of items + * @param {Array of Outlayer.Items} items + */ +Outlayer.prototype.reveal = function( items ) { + this._emitCompleteOnItems( 'reveal', items ); + + var len = items && items.length; + for ( var i=0; len && i < len; i++ ) { + var item = items[i]; + item.reveal(); + } +}; + +/** + * hide a collection of items + * @param {Array of Outlayer.Items} items + */ +Outlayer.prototype.hide = function( items ) { + this._emitCompleteOnItems( 'hide', items ); + + var len = items && items.length; + for ( var i=0; len && i < len; i++ ) { + var item = items[i]; + item.hide(); + } +}; + +/** + * reveal item elements + * @param {Array}, {Element}, {NodeList} items + */ +Outlayer.prototype.revealItemElements = function( elems ) { + var items = this.getItems( elems ); + this.reveal( items ); +}; + +/** + * hide item elements + * @param {Array}, {Element}, {NodeList} items + */ +Outlayer.prototype.hideItemElements = function( elems ) { + var items = this.getItems( elems ); + this.hide( items ); +}; + +/** + * get Outlayer.Item, given an Element + * @param {Element} elem + * @param {Function} callback + * @returns {Outlayer.Item} item + */ +Outlayer.prototype.getItem = function( elem ) { + // loop through items to get the one that matches + for ( var i=0, len = this.items.length; i < len; i++ ) { + var item = this.items[i]; + if ( item.element === elem ) { + // return item + return item; + } + } +}; + +/** + * get collection of Outlayer.Items, given Elements + * @param {Array} elems + * @returns {Array} items - Outlayer.Items + */ +Outlayer.prototype.getItems = function( elems ) { + elems = utils.makeArray( elems ); + var items = []; + for ( var i=0, len = elems.length; i < len; i++ ) { + var elem = elems[i]; + var item = this.getItem( elem ); + if ( item ) { + items.push( item ); + } + } + + return items; +}; + +/** + * remove element(s) from instance and DOM + * @param {Array or NodeList or Element} elems + */ +Outlayer.prototype.remove = function( elems ) { + var removeItems = this.getItems( elems ); + + this._emitCompleteOnItems( 'remove', removeItems ); + + // bail if no items to remove + if ( !removeItems || !removeItems.length ) { + return; + } + + for ( var i=0, len = removeItems.length; i < len; i++ ) { + var item = removeItems[i]; + item.remove(); + // remove item from collection + utils.removeFrom( this.items, item ); + } +}; + +// ----- destroy ----- // + +// remove and disable Outlayer instance +Outlayer.prototype.destroy = function() { + // clean up dynamic styles + var style = this.element.style; + style.height = ''; + style.position = ''; + style.width = ''; + // destroy items + for ( var i=0, len = this.items.length; i < len; i++ ) { + var item = this.items[i]; + item.destroy(); + } + + this.unbindResize(); + + var id = this.element.outlayerGUID; + delete instances[ id ]; // remove reference to instance by id + delete this.element.outlayerGUID; + // remove data for jQuery + if ( jQuery ) { + jQuery.removeData( this.element, this.constructor.namespace ); + } + +}; + +// -------------------------- data -------------------------- // + +/** + * get Outlayer instance from element + * @param {Element} elem + * @returns {Outlayer} + */ +Outlayer.data = function( elem ) { + elem = utils.getQueryElement( elem ); + var id = elem && elem.outlayerGUID; + return id && instances[ id ]; +}; + + +// -------------------------- create Outlayer class -------------------------- // + +/** + * create a layout class + * @param {String} namespace + */ +Outlayer.create = function( namespace, options ) { + // sub-class Outlayer + function Layout() { + Outlayer.apply( this, arguments ); + } + // inherit Outlayer prototype, use Object.create if there + if ( Object.create ) { + Layout.prototype = Object.create( Outlayer.prototype ); + } else { + utils.extend( Layout.prototype, Outlayer.prototype ); + } + // set contructor, used for namespace and Item + Layout.prototype.constructor = Layout; + + Layout.defaults = utils.extend( {}, Outlayer.defaults ); + // apply new options + utils.extend( Layout.defaults, options ); + // keep prototype.settings for backwards compatibility (Packery v1.2.0) + Layout.prototype.settings = {}; + + Layout.namespace = namespace; + + Layout.data = Outlayer.data; + + // sub-class Item + Layout.Item = function LayoutItem() { + Item.apply( this, arguments ); + }; + + Layout.Item.prototype = new Item(); + + // -------------------------- declarative -------------------------- // + + utils.htmlInit( Layout, namespace ); + + // -------------------------- jQuery bridge -------------------------- // + + // make into jQuery plugin + if ( jQuery && jQuery.bridget ) { + jQuery.bridget( namespace, Layout ); + } + + return Layout; +}; + +// ----- fin ----- // + +// back in global +Outlayer.Item = Item; + +return Outlayer; + +})); + + +/*! + * Masonry v3.3.1 + * Cascading grid layout library + * http://masonry.desandro.com + * MIT License + * by David DeSandro + */ + +( function( window, factory ) { + + // universal module definition + if ( typeof define === 'function' && define.amd ) { + // AMD + define( [ + 'outlayer/outlayer', + 'get-size/get-size', + 'fizzy-ui-utils/utils' + ], + factory ); + } else if ( typeof exports === 'object' ) { + // CommonJS + module.exports = factory( + require('outlayer'), + require('get-size'), + require('fizzy-ui-utils') + ); + } else { + // browser global + window.Masonry = factory( + window.Outlayer, + window.getSize, + window.fizzyUIUtils + ); + } + +}( window, function factory( Outlayer, getSize, utils ) { + + + +// -------------------------- masonryDefinition -------------------------- // + + // create an Outlayer layout class + var Masonry = Outlayer.create('masonry'); + + Masonry.prototype._resetLayout = function() { + this.getSize(); + this._getMeasurement( 'columnWidth', 'outerWidth' ); + this._getMeasurement( 'gutter', 'outerWidth' ); + this.measureColumns(); + + // reset column Y + var i = this.cols; + this.colYs = []; + while (i--) { + this.colYs.push( 0 ); + } + + this.maxY = 0; + }; + + Masonry.prototype.measureColumns = function() { + this.getContainerWidth(); + // if columnWidth is 0, default to outerWidth of first item + if ( !this.columnWidth ) { + var firstItem = this.items[0]; + var firstItemElem = firstItem && firstItem.element; + // columnWidth fall back to item of first element + this.columnWidth = firstItemElem && getSize( firstItemElem ).outerWidth || + // if first elem has no width, default to size of container + this.containerWidth; + } + + var columnWidth = this.columnWidth += this.gutter; + + // calculate columns + var containerWidth = this.containerWidth + this.gutter; + var cols = containerWidth / columnWidth; + // fix rounding errors, typically with gutters + var excess = columnWidth - containerWidth % columnWidth; + // if overshoot is less than a pixel, round up, otherwise floor it + var mathMethod = excess && excess < 1 ? 'round' : 'floor'; + cols = Math[ mathMethod ]( cols ); + this.cols = Math.max( cols, 1 ); + }; + + Masonry.prototype.getContainerWidth = function() { + // container is parent if fit width + var container = this.options.isFitWidth ? this.element.parentNode : this.element; + // check that this.size and size are there + // IE8 triggers resize on body size change, so they might not be + var size = getSize( container ); + this.containerWidth = size && size.innerWidth; + }; + + Masonry.prototype._getItemLayoutPosition = function( item ) { + item.getSize(); + // how many columns does this brick span + var remainder = item.size.outerWidth % this.columnWidth; + var mathMethod = remainder && remainder < 1 ? 'round' : 'ceil'; + // round if off by 1 pixel, otherwise use ceil + var colSpan = Math[ mathMethod ]( item.size.outerWidth / this.columnWidth ); + colSpan = Math.min( colSpan, this.cols ); + + var colGroup = this._getColGroup( colSpan ); + // get the minimum Y value from the columns + var minimumY = Math.min.apply( Math, colGroup ); + var shortColIndex = utils.indexOf( colGroup, minimumY ); + + // position the brick + var position = { + x: this.columnWidth * shortColIndex, + y: minimumY + }; + + // apply setHeight to necessary columns + var setHeight = minimumY + item.size.outerHeight; + var setSpan = this.cols + 1 - colGroup.length; + for ( var i = 0; i < setSpan; i++ ) { + this.colYs[ shortColIndex + i ] = setHeight; + } + + return position; + }; + + /** + * @param {Number} colSpan - number of columns the element spans + * @returns {Array} colGroup + */ + Masonry.prototype._getColGroup = function( colSpan ) { + if ( colSpan < 2 ) { + // if brick spans only one column, use all the column Ys + return this.colYs; + } + + var colGroup = []; + // how many different places could this brick fit horizontally + var groupCount = this.cols + 1 - colSpan; + // for each group potential horizontal position + for ( var i = 0; i < groupCount; i++ ) { + // make an array of colY values for that one group + var groupColYs = this.colYs.slice( i, i + colSpan ); + // and get the max value of the array + colGroup[i] = Math.max.apply( Math, groupColYs ); + } + return colGroup; + }; + + Masonry.prototype._manageStamp = function( stamp ) { + var stampSize = getSize( stamp ); + var offset = this._getElementOffset( stamp ); + // get the columns that this stamp affects + var firstX = this.options.isOriginLeft ? offset.left : offset.right; + var lastX = firstX + stampSize.outerWidth; + var firstCol = Math.floor( firstX / this.columnWidth ); + firstCol = Math.max( 0, firstCol ); + var lastCol = Math.floor( lastX / this.columnWidth ); + // lastCol should not go over if multiple of columnWidth #425 + lastCol -= lastX % this.columnWidth ? 0 : 1; + lastCol = Math.min( this.cols - 1, lastCol ); + // set colYs to bottom of the stamp + var stampMaxY = ( this.options.isOriginTop ? offset.top : offset.bottom ) + + stampSize.outerHeight; + for ( var i = firstCol; i <= lastCol; i++ ) { + this.colYs[i] = Math.max( stampMaxY, this.colYs[i] ); + } + }; + + Masonry.prototype._getContainerSize = function() { + this.maxY = Math.max.apply( Math, this.colYs ); + var size = { + height: this.maxY + }; + + if ( this.options.isFitWidth ) { + size.width = this._getContainerFitWidth(); + } + + return size; + }; + + Masonry.prototype._getContainerFitWidth = function() { + var unusedCols = 0; + // count unused columns + var i = this.cols; + while ( --i ) { + if ( this.colYs[i] !== 0 ) { + break; + } + unusedCols++; + } + // fit container to columns that have been used + return ( this.cols - unusedCols ) * this.columnWidth - this.gutter; + }; + + Masonry.prototype.needsResizeLayout = function() { + var previousWidth = this.containerWidth; + this.getContainerWidth(); + return previousWidth !== this.containerWidth; + }; + + return Masonry; + +})); + diff --git a/Monitor/wwwroot/assets/plugins/masonry/dist/masonry.pkgd.min.js b/Monitor/wwwroot/assets/plugins/masonry/dist/masonry.pkgd.min.js new file mode 100644 index 0000000..09b8a4d --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/masonry/dist/masonry.pkgd.min.js @@ -0,0 +1,9 @@ +/*! + * Masonry PACKAGED v3.3.1 + * Cascading grid layout library + * http://masonry.desandro.com + * MIT License + * by David DeSandro + */ + +!function(a){function b(){}function c(a){function c(b){b.prototype.option||(b.prototype.option=function(b){a.isPlainObject(b)&&(this.options=a.extend(!0,this.options,b))})}function e(b,c){a.fn[b]=function(e){if("string"==typeof e){for(var g=d.call(arguments,1),h=0,i=this.length;i>h;h++){var j=this[h],k=a.data(j,b);if(k)if(a.isFunction(k[e])&&"_"!==e.charAt(0)){var l=k[e].apply(k,g);if(void 0!==l)return l}else f("no such method '"+e+"' for "+b+" instance");else f("cannot call methods on "+b+" prior to initialization; attempted to call '"+e+"'")}return this}return this.each(function(){var d=a.data(this,b);d?(d.option(e),d._init()):(d=new c(this,e),a.data(this,b,d))})}}if(a){var f="undefined"==typeof console?b:function(a){console.error(a)};return a.bridget=function(a,b){c(b),e(a,b)},a.bridget}}var d=Array.prototype.slice;"function"==typeof define&&define.amd?define("jquery-bridget/jquery.bridget",["jquery"],c):c("object"==typeof exports?require("jquery"):a.jQuery)}(window),function(a){function b(b){var c=a.event;return c.target=c.target||c.srcElement||b,c}var c=document.documentElement,d=function(){};c.addEventListener?d=function(a,b,c){a.addEventListener(b,c,!1)}:c.attachEvent&&(d=function(a,c,d){a[c+d]=d.handleEvent?function(){var c=b(a);d.handleEvent.call(d,c)}:function(){var c=b(a);d.call(a,c)},a.attachEvent("on"+c,a[c+d])});var e=function(){};c.removeEventListener?e=function(a,b,c){a.removeEventListener(b,c,!1)}:c.detachEvent&&(e=function(a,b,c){a.detachEvent("on"+b,a[b+c]);try{delete a[b+c]}catch(d){a[b+c]=void 0}});var f={bind:d,unbind:e};"function"==typeof define&&define.amd?define("eventie/eventie",f):"object"==typeof exports?module.exports=f:a.eventie=f}(window),function(){function a(){}function b(a,b){for(var c=a.length;c--;)if(a[c].listener===b)return c;return-1}function c(a){return function(){return this[a].apply(this,arguments)}}var d=a.prototype,e=this,f=e.EventEmitter;d.getListeners=function(a){var b,c,d=this._getEvents();if(a instanceof RegExp){b={};for(c in d)d.hasOwnProperty(c)&&a.test(c)&&(b[c]=d[c])}else b=d[a]||(d[a]=[]);return b},d.flattenListeners=function(a){var b,c=[];for(b=0;be;e++)if(b=c[e]+a,"string"==typeof d[b])return b}}var c="Webkit Moz ms Ms O".split(" "),d=document.documentElement.style;"function"==typeof define&&define.amd?define("get-style-property/get-style-property",[],function(){return b}):"object"==typeof exports?module.exports=b:a.getStyleProperty=b}(window),function(a){function b(a){var b=parseFloat(a),c=-1===a.indexOf("%")&&!isNaN(b);return c&&b}function c(){}function d(){for(var a={width:0,height:0,innerWidth:0,innerHeight:0,outerWidth:0,outerHeight:0},b=0,c=g.length;c>b;b++){var d=g[b];a[d]=0}return a}function e(c){function e(){if(!m){m=!0;var d=a.getComputedStyle;if(j=function(){var a=d?function(a){return d(a,null)}:function(a){return a.currentStyle};return function(b){var c=a(b);return c||f("Style returned "+c+". Are you running this code in a hidden iframe on Firefox? See http://bit.ly/getsizebug1"),c}}(),k=c("boxSizing")){var e=document.createElement("div");e.style.width="200px",e.style.padding="1px 2px 3px 4px",e.style.borderStyle="solid",e.style.borderWidth="1px 2px 3px 4px",e.style[k]="border-box";var g=document.body||document.documentElement;g.appendChild(e);var h=j(e);l=200===b(h.width),g.removeChild(e)}}}function h(a){if(e(),"string"==typeof a&&(a=document.querySelector(a)),a&&"object"==typeof a&&a.nodeType){var c=j(a);if("none"===c.display)return d();var f={};f.width=a.offsetWidth,f.height=a.offsetHeight;for(var h=f.isBorderBox=!(!k||!c[k]||"border-box"!==c[k]),m=0,n=g.length;n>m;m++){var o=g[m],p=c[o];p=i(a,p);var q=parseFloat(p);f[o]=isNaN(q)?0:q}var r=f.paddingLeft+f.paddingRight,s=f.paddingTop+f.paddingBottom,t=f.marginLeft+f.marginRight,u=f.marginTop+f.marginBottom,v=f.borderLeftWidth+f.borderRightWidth,w=f.borderTopWidth+f.borderBottomWidth,x=h&&l,y=b(c.width);y!==!1&&(f.width=y+(x?0:r+v));var z=b(c.height);return z!==!1&&(f.height=z+(x?0:s+w)),f.innerWidth=f.width-(r+v),f.innerHeight=f.height-(s+w),f.outerWidth=f.width+t,f.outerHeight=f.height+u,f}}function i(b,c){if(a.getComputedStyle||-1===c.indexOf("%"))return c;var d=b.style,e=d.left,f=b.runtimeStyle,g=f&&f.left;return g&&(f.left=b.currentStyle.left),d.left=c,c=d.pixelLeft,d.left=e,g&&(f.left=g),c}var j,k,l,m=!1;return h}var f="undefined"==typeof console?c:function(a){console.error(a)},g=["paddingLeft","paddingRight","paddingTop","paddingBottom","marginLeft","marginRight","marginTop","marginBottom","borderLeftWidth","borderRightWidth","borderTopWidth","borderBottomWidth"];"function"==typeof define&&define.amd?define("get-size/get-size",["get-style-property/get-style-property"],e):"object"==typeof exports?module.exports=e(require("desandro-get-style-property")):a.getSize=e(a.getStyleProperty)}(window),function(a){function b(a){"function"==typeof a&&(b.isReady?a():g.push(a))}function c(a){var c="readystatechange"===a.type&&"complete"!==f.readyState;b.isReady||c||d()}function d(){b.isReady=!0;for(var a=0,c=g.length;c>a;a++){var d=g[a];d()}}function e(e){return"complete"===f.readyState?d():(e.bind(f,"DOMContentLoaded",c),e.bind(f,"readystatechange",c),e.bind(a,"load",c)),b}var f=a.document,g=[];b.isReady=!1,"function"==typeof define&&define.amd?define("doc-ready/doc-ready",["eventie/eventie"],e):"object"==typeof exports?module.exports=e(require("eventie")):a.docReady=e(a.eventie)}(window),function(a){function b(a,b){return a[g](b)}function c(a){if(!a.parentNode){var b=document.createDocumentFragment();b.appendChild(a)}}function d(a,b){c(a);for(var d=a.parentNode.querySelectorAll(b),e=0,f=d.length;f>e;e++)if(d[e]===a)return!0;return!1}function e(a,d){return c(a),b(a,d)}var f,g=function(){if(a.matches)return"matches";if(a.matchesSelector)return"matchesSelector";for(var b=["webkit","moz","ms","o"],c=0,d=b.length;d>c;c++){var e=b[c],f=e+"MatchesSelector";if(a[f])return f}}();if(g){var h=document.createElement("div"),i=b(h,"div");f=i?b:e}else f=d;"function"==typeof define&&define.amd?define("matches-selector/matches-selector",[],function(){return f}):"object"==typeof exports?module.exports=f:window.matchesSelector=f}(Element.prototype),function(a,b){"function"==typeof define&&define.amd?define("fizzy-ui-utils/utils",["doc-ready/doc-ready","matches-selector/matches-selector"],function(c,d){return b(a,c,d)}):"object"==typeof exports?module.exports=b(a,require("doc-ready"),require("desandro-matches-selector")):a.fizzyUIUtils=b(a,a.docReady,a.matchesSelector)}(window,function(a,b,c){var d={};d.extend=function(a,b){for(var c in b)a[c]=b[c];return a},d.modulo=function(a,b){return(a%b+b)%b};var e=Object.prototype.toString;d.isArray=function(a){return"[object Array]"==e.call(a)},d.makeArray=function(a){var b=[];if(d.isArray(a))b=a;else if(a&&"number"==typeof a.length)for(var c=0,e=a.length;e>c;c++)b.push(a[c]);else b.push(a);return b},d.indexOf=Array.prototype.indexOf?function(a,b){return a.indexOf(b)}:function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},d.removeFrom=function(a,b){var c=d.indexOf(a,b);-1!=c&&a.splice(c,1)},d.isElement="function"==typeof HTMLElement||"object"==typeof HTMLElement?function(a){return a instanceof HTMLElement}:function(a){return a&&"object"==typeof a&&1==a.nodeType&&"string"==typeof a.nodeName},d.setText=function(){function a(a,c){b=b||(void 0!==document.documentElement.textContent?"textContent":"innerText"),a[b]=c}var b;return a}(),d.getParent=function(a,b){for(;a!=document.body;)if(a=a.parentNode,c(a,b))return a},d.getQueryElement=function(a){return"string"==typeof a?document.querySelector(a):a},d.handleEvent=function(a){var b="on"+a.type;this[b]&&this[b](a)},d.filterFindElements=function(a,b){a=d.makeArray(a);for(var e=[],f=0,g=a.length;g>f;f++){var h=a[f];if(d.isElement(h))if(b){c(h,b)&&e.push(h);for(var i=h.querySelectorAll(b),j=0,k=i.length;k>j;j++)e.push(i[j])}else e.push(h)}return e},d.debounceMethod=function(a,b,c){var d=a.prototype[b],e=b+"Timeout";a.prototype[b]=function(){var a=this[e];a&&clearTimeout(a);var b=arguments,f=this;this[e]=setTimeout(function(){d.apply(f,b),delete f[e]},c||100)}},d.toDashed=function(a){return a.replace(/(.)([A-Z])/g,function(a,b,c){return b+"-"+c}).toLowerCase()};var f=a.console;return d.htmlInit=function(c,e){b(function(){for(var b=d.toDashed(e),g=document.querySelectorAll(".js-"+b),h="data-"+b+"-options",i=0,j=g.length;j>i;i++){var k,l=g[i],m=l.getAttribute(h);try{k=m&&JSON.parse(m)}catch(n){f&&f.error("Error parsing "+h+" on "+l.nodeName.toLowerCase()+(l.id?"#"+l.id:"")+": "+n);continue}var o=new c(l,k),p=a.jQuery;p&&p.data(l,e,o)}})},d}),function(a,b){"function"==typeof define&&define.amd?define("outlayer/item",["eventEmitter/EventEmitter","get-size/get-size","get-style-property/get-style-property","fizzy-ui-utils/utils"],function(c,d,e,f){return b(a,c,d,e,f)}):"object"==typeof exports?module.exports=b(a,require("wolfy87-eventemitter"),require("get-size"),require("desandro-get-style-property"),require("fizzy-ui-utils")):(a.Outlayer={},a.Outlayer.Item=b(a,a.EventEmitter,a.getSize,a.getStyleProperty,a.fizzyUIUtils))}(window,function(a,b,c,d,e){function f(a){for(var b in a)return!1;return b=null,!0}function g(a,b){a&&(this.element=a,this.layout=b,this.position={x:0,y:0},this._create())}function h(a){return a.replace(/([A-Z])/g,function(a){return"-"+a.toLowerCase()})}var i=a.getComputedStyle,j=i?function(a){return i(a,null)}:function(a){return a.currentStyle},k=d("transition"),l=d("transform"),m=k&&l,n=!!d("perspective"),o={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"otransitionend",transition:"transitionend"}[k],p=["transform","transition","transitionDuration","transitionProperty"],q=function(){for(var a={},b=0,c=p.length;c>b;b++){var e=p[b],f=d(e);f&&f!==e&&(a[e]=f)}return a}();e.extend(g.prototype,b.prototype),g.prototype._create=function(){this._transn={ingProperties:{},clean:{},onEnd:{}},this.css({position:"absolute"})},g.prototype.handleEvent=function(a){var b="on"+a.type;this[b]&&this[b](a)},g.prototype.getSize=function(){this.size=c(this.element)},g.prototype.css=function(a){var b=this.element.style;for(var c in a){var d=q[c]||c;b[d]=a[c]}},g.prototype.getPosition=function(){var a=j(this.element),b=this.layout.options,c=b.isOriginLeft,d=b.isOriginTop,e=a[c?"left":"right"],f=a[d?"top":"bottom"],g=parseInt(e,10),h=parseInt(f,10),i=this.layout.size;g=-1!=e.indexOf("%")?g/100*i.width:g,h=-1!=f.indexOf("%")?h/100*i.height:h,g=isNaN(g)?0:g,h=isNaN(h)?0:h,g-=c?i.paddingLeft:i.paddingRight,h-=d?i.paddingTop:i.paddingBottom,this.position.x=g,this.position.y=h},g.prototype.layoutPosition=function(){var a=this.layout.size,b=this.layout.options,c={},d=b.isOriginLeft?"paddingLeft":"paddingRight",e=b.isOriginLeft?"left":"right",f=b.isOriginLeft?"right":"left",g=this.position.x+a[d];c[e]=this.getXValue(g),c[f]="";var h=b.isOriginTop?"paddingTop":"paddingBottom",i=b.isOriginTop?"top":"bottom",j=b.isOriginTop?"bottom":"top",k=this.position.y+a[h];c[i]=this.getYValue(k),c[j]="",this.css(c),this.emitEvent("layout",[this])},g.prototype.getXValue=function(a){var b=this.layout.options;return b.percentPosition&&!b.isHorizontal?a/this.layout.size.width*100+"%":a+"px"},g.prototype.getYValue=function(a){var b=this.layout.options;return b.percentPosition&&b.isHorizontal?a/this.layout.size.height*100+"%":a+"px"},g.prototype._transitionTo=function(a,b){this.getPosition();var c=this.position.x,d=this.position.y,e=parseInt(a,10),f=parseInt(b,10),g=e===this.position.x&&f===this.position.y;if(this.setPosition(a,b),g&&!this.isTransitioning)return void this.layoutPosition();var h=a-c,i=b-d,j={};j.transform=this.getTranslate(h,i),this.transition({to:j,onTransitionEnd:{transform:this.layoutPosition},isCleaning:!0})},g.prototype.getTranslate=function(a,b){var c=this.layout.options;return a=c.isOriginLeft?a:-a,b=c.isOriginTop?b:-b,a=this.getXValue(a),b=this.getYValue(b),n?"translate3d("+a+", "+b+", 0)":"translate("+a+", "+b+")"},g.prototype.goTo=function(a,b){this.setPosition(a,b),this.layoutPosition()},g.prototype.moveTo=m?g.prototype._transitionTo:g.prototype.goTo,g.prototype.setPosition=function(a,b){this.position.x=parseInt(a,10),this.position.y=parseInt(b,10)},g.prototype._nonTransition=function(a){this.css(a.to),a.isCleaning&&this._removeStyles(a.to);for(var b in a.onTransitionEnd)a.onTransitionEnd[b].call(this)},g.prototype._transition=function(a){if(!parseFloat(this.layout.options.transitionDuration))return void this._nonTransition(a);var b=this._transn;for(var c in a.onTransitionEnd)b.onEnd[c]=a.onTransitionEnd[c];for(c in a.to)b.ingProperties[c]=!0,a.isCleaning&&(b.clean[c]=!0);if(a.from){this.css(a.from);var d=this.element.offsetHeight;d=null}this.enableTransition(a.to),this.css(a.to),this.isTransitioning=!0};var r="opacity,"+h(q.transform||"transform");g.prototype.enableTransition=function(){this.isTransitioning||(this.css({transitionProperty:r,transitionDuration:this.layout.options.transitionDuration}),this.element.addEventListener(o,this,!1))},g.prototype.transition=g.prototype[k?"_transition":"_nonTransition"],g.prototype.onwebkitTransitionEnd=function(a){this.ontransitionend(a)},g.prototype.onotransitionend=function(a){this.ontransitionend(a)};var s={"-webkit-transform":"transform","-moz-transform":"transform","-o-transform":"transform"};g.prototype.ontransitionend=function(a){if(a.target===this.element){var b=this._transn,c=s[a.propertyName]||a.propertyName;if(delete b.ingProperties[c],f(b.ingProperties)&&this.disableTransition(),c in b.clean&&(this.element.style[a.propertyName]="",delete b.clean[c]),c in b.onEnd){var d=b.onEnd[c];d.call(this),delete b.onEnd[c]}this.emitEvent("transitionEnd",[this])}},g.prototype.disableTransition=function(){this.removeTransitionStyles(),this.element.removeEventListener(o,this,!1),this.isTransitioning=!1},g.prototype._removeStyles=function(a){var b={};for(var c in a)b[c]="";this.css(b)};var t={transitionProperty:"",transitionDuration:""};return g.prototype.removeTransitionStyles=function(){this.css(t)},g.prototype.removeElem=function(){this.element.parentNode.removeChild(this.element),this.css({display:""}),this.emitEvent("remove",[this])},g.prototype.remove=function(){if(!k||!parseFloat(this.layout.options.transitionDuration))return void this.removeElem();var a=this;this.once("transitionEnd",function(){a.removeElem()}),this.hide()},g.prototype.reveal=function(){delete this.isHidden,this.css({display:""});var a=this.layout.options,b={},c=this.getHideRevealTransitionEndProperty("visibleStyle");b[c]=this.onRevealTransitionEnd,this.transition({from:a.hiddenStyle,to:a.visibleStyle,isCleaning:!0,onTransitionEnd:b})},g.prototype.onRevealTransitionEnd=function(){this.isHidden||this.emitEvent("reveal")},g.prototype.getHideRevealTransitionEndProperty=function(a){var b=this.layout.options[a];if(b.opacity)return"opacity";for(var c in b)return c},g.prototype.hide=function(){this.isHidden=!0,this.css({display:""});var a=this.layout.options,b={},c=this.getHideRevealTransitionEndProperty("hiddenStyle");b[c]=this.onHideTransitionEnd,this.transition({from:a.visibleStyle,to:a.hiddenStyle,isCleaning:!0,onTransitionEnd:b})},g.prototype.onHideTransitionEnd=function(){this.isHidden&&(this.css({display:"none"}),this.emitEvent("hide"))},g.prototype.destroy=function(){this.css({position:"",left:"",right:"",top:"",bottom:"",transition:"",transform:""})},g}),function(a,b){"function"==typeof define&&define.amd?define("outlayer/outlayer",["eventie/eventie","eventEmitter/EventEmitter","get-size/get-size","fizzy-ui-utils/utils","./item"],function(c,d,e,f,g){return b(a,c,d,e,f,g)}):"object"==typeof exports?module.exports=b(a,require("eventie"),require("wolfy87-eventemitter"),require("get-size"),require("fizzy-ui-utils"),require("./item")):a.Outlayer=b(a,a.eventie,a.EventEmitter,a.getSize,a.fizzyUIUtils,a.Outlayer.Item)}(window,function(a,b,c,d,e,f){function g(a,b){var c=e.getQueryElement(a);if(!c)return void(h&&h.error("Bad element for "+this.constructor.namespace+": "+(c||a)));this.element=c,i&&(this.$element=i(this.element)),this.options=e.extend({},this.constructor.defaults),this.option(b);var d=++k;this.element.outlayerGUID=d,l[d]=this,this._create(),this.options.isInitLayout&&this.layout()}var h=a.console,i=a.jQuery,j=function(){},k=0,l={};return g.namespace="outlayer",g.Item=f,g.defaults={containerStyle:{position:"relative"},isInitLayout:!0,isOriginLeft:!0,isOriginTop:!0,isResizeBound:!0,isResizingContainer:!0,transitionDuration:"0.4s",hiddenStyle:{opacity:0,transform:"scale(0.001)"},visibleStyle:{opacity:1,transform:"scale(1)"}},e.extend(g.prototype,c.prototype),g.prototype.option=function(a){e.extend(this.options,a)},g.prototype._create=function(){this.reloadItems(),this.stamps=[],this.stamp(this.options.stamp),e.extend(this.element.style,this.options.containerStyle),this.options.isResizeBound&&this.bindResize()},g.prototype.reloadItems=function(){this.items=this._itemize(this.element.children)},g.prototype._itemize=function(a){for(var b=this._filterFindItemElements(a),c=this.constructor.Item,d=[],e=0,f=b.length;f>e;e++){var g=b[e],h=new c(g,this);d.push(h)}return d},g.prototype._filterFindItemElements=function(a){return e.filterFindElements(a,this.options.itemSelector)},g.prototype.getItemElements=function(){for(var a=[],b=0,c=this.items.length;c>b;b++)a.push(this.items[b].element);return a},g.prototype.layout=function(){this._resetLayout(),this._manageStamps();var a=void 0!==this.options.isLayoutInstant?this.options.isLayoutInstant:!this._isLayoutInited;this.layoutItems(this.items,a),this._isLayoutInited=!0},g.prototype._init=g.prototype.layout,g.prototype._resetLayout=function(){this.getSize()},g.prototype.getSize=function(){this.size=d(this.element)},g.prototype._getMeasurement=function(a,b){var c,f=this.options[a];f?("string"==typeof f?c=this.element.querySelector(f):e.isElement(f)&&(c=f),this[a]=c?d(c)[b]:f):this[a]=0},g.prototype.layoutItems=function(a,b){a=this._getItemsForLayout(a),this._layoutItems(a,b),this._postLayout()},g.prototype._getItemsForLayout=function(a){for(var b=[],c=0,d=a.length;d>c;c++){var e=a[c];e.isIgnored||b.push(e)}return b},g.prototype._layoutItems=function(a,b){if(this._emitCompleteOnItems("layout",a),a&&a.length){for(var c=[],d=0,e=a.length;e>d;d++){var f=a[d],g=this._getItemLayoutPosition(f);g.item=f,g.isInstant=b||f.isLayoutInstant,c.push(g)}this._processLayoutQueue(c)}},g.prototype._getItemLayoutPosition=function(){return{x:0,y:0}},g.prototype._processLayoutQueue=function(a){for(var b=0,c=a.length;c>b;b++){var d=a[b];this._positionItem(d.item,d.x,d.y,d.isInstant)}},g.prototype._positionItem=function(a,b,c,d){d?a.goTo(b,c):a.moveTo(b,c)},g.prototype._postLayout=function(){this.resizeContainer()},g.prototype.resizeContainer=function(){if(this.options.isResizingContainer){var a=this._getContainerSize();a&&(this._setContainerMeasure(a.width,!0),this._setContainerMeasure(a.height,!1))}},g.prototype._getContainerSize=j,g.prototype._setContainerMeasure=function(a,b){if(void 0!==a){var c=this.size;c.isBorderBox&&(a+=b?c.paddingLeft+c.paddingRight+c.borderLeftWidth+c.borderRightWidth:c.paddingBottom+c.paddingTop+c.borderTopWidth+c.borderBottomWidth),a=Math.max(a,0),this.element.style[b?"width":"height"]=a+"px"}},g.prototype._emitCompleteOnItems=function(a,b){function c(){e.dispatchEvent(a+"Complete",null,[b])}function d(){g++,g===f&&c()}var e=this,f=b.length;if(!b||!f)return void c();for(var g=0,h=0,i=b.length;i>h;h++){var j=b[h];j.once(a,d)}},g.prototype.dispatchEvent=function(a,b,c){var d=b?[b].concat(c):c;if(this.emitEvent(a,d),i)if(this.$element=this.$element||i(this.element),b){var e=i.Event(b);e.type=a,this.$element.trigger(e,c)}else this.$element.trigger(a,c)},g.prototype.ignore=function(a){var b=this.getItem(a);b&&(b.isIgnored=!0)},g.prototype.unignore=function(a){var b=this.getItem(a);b&&delete b.isIgnored},g.prototype.stamp=function(a){if(a=this._find(a)){this.stamps=this.stamps.concat(a);for(var b=0,c=a.length;c>b;b++){var d=a[b];this.ignore(d)}}},g.prototype.unstamp=function(a){if(a=this._find(a))for(var b=0,c=a.length;c>b;b++){var d=a[b];e.removeFrom(this.stamps,d),this.unignore(d)}},g.prototype._find=function(a){return a?("string"==typeof a&&(a=this.element.querySelectorAll(a)),a=e.makeArray(a)):void 0},g.prototype._manageStamps=function(){if(this.stamps&&this.stamps.length){this._getBoundingRect();for(var a=0,b=this.stamps.length;b>a;a++){var c=this.stamps[a];this._manageStamp(c)}}},g.prototype._getBoundingRect=function(){var a=this.element.getBoundingClientRect(),b=this.size;this._boundingRect={left:a.left+b.paddingLeft+b.borderLeftWidth,top:a.top+b.paddingTop+b.borderTopWidth,right:a.right-(b.paddingRight+b.borderRightWidth),bottom:a.bottom-(b.paddingBottom+b.borderBottomWidth)}},g.prototype._manageStamp=j,g.prototype._getElementOffset=function(a){var b=a.getBoundingClientRect(),c=this._boundingRect,e=d(a),f={left:b.left-c.left-e.marginLeft,top:b.top-c.top-e.marginTop,right:c.right-b.right-e.marginRight,bottom:c.bottom-b.bottom-e.marginBottom};return f},g.prototype.handleEvent=function(a){var b="on"+a.type;this[b]&&this[b](a)},g.prototype.bindResize=function(){this.isResizeBound||(b.bind(a,"resize",this),this.isResizeBound=!0)},g.prototype.unbindResize=function(){this.isResizeBound&&b.unbind(a,"resize",this),this.isResizeBound=!1},g.prototype.onresize=function(){function a(){b.resize(),delete b.resizeTimeout}this.resizeTimeout&&clearTimeout(this.resizeTimeout);var b=this;this.resizeTimeout=setTimeout(a,100)},g.prototype.resize=function(){this.isResizeBound&&this.needsResizeLayout()&&this.layout()},g.prototype.needsResizeLayout=function(){var a=d(this.element),b=this.size&&a;return b&&a.innerWidth!==this.size.innerWidth},g.prototype.addItems=function(a){var b=this._itemize(a);return b.length&&(this.items=this.items.concat(b)),b},g.prototype.appended=function(a){var b=this.addItems(a);b.length&&(this.layoutItems(b,!0),this.reveal(b))},g.prototype.prepended=function(a){var b=this._itemize(a);if(b.length){var c=this.items.slice(0);this.items=b.concat(c),this._resetLayout(),this._manageStamps(),this.layoutItems(b,!0),this.reveal(b),this.layoutItems(c)}},g.prototype.reveal=function(a){this._emitCompleteOnItems("reveal",a);for(var b=a&&a.length,c=0;b&&b>c;c++){var d=a[c];d.reveal()}},g.prototype.hide=function(a){this._emitCompleteOnItems("hide",a);for(var b=a&&a.length,c=0;b&&b>c;c++){var d=a[c];d.hide()}},g.prototype.revealItemElements=function(a){var b=this.getItems(a);this.reveal(b)},g.prototype.hideItemElements=function(a){var b=this.getItems(a);this.hide(b)},g.prototype.getItem=function(a){for(var b=0,c=this.items.length;c>b;b++){var d=this.items[b];if(d.element===a)return d}},g.prototype.getItems=function(a){a=e.makeArray(a);for(var b=[],c=0,d=a.length;d>c;c++){var f=a[c],g=this.getItem(f);g&&b.push(g)}return b},g.prototype.remove=function(a){var b=this.getItems(a);if(this._emitCompleteOnItems("remove",b),b&&b.length)for(var c=0,d=b.length;d>c;c++){var f=b[c];f.remove(),e.removeFrom(this.items,f)}},g.prototype.destroy=function(){var a=this.element.style;a.height="",a.position="",a.width="";for(var b=0,c=this.items.length;c>b;b++){var d=this.items[b];d.destroy()}this.unbindResize();var e=this.element.outlayerGUID;delete l[e],delete this.element.outlayerGUID,i&&i.removeData(this.element,this.constructor.namespace)},g.data=function(a){a=e.getQueryElement(a);var b=a&&a.outlayerGUID;return b&&l[b]},g.create=function(a,b){function c(){g.apply(this,arguments)}return Object.create?c.prototype=Object.create(g.prototype):e.extend(c.prototype,g.prototype),c.prototype.constructor=c,c.defaults=e.extend({},g.defaults),e.extend(c.defaults,b),c.prototype.settings={},c.namespace=a,c.data=g.data,c.Item=function(){f.apply(this,arguments)},c.Item.prototype=new f,e.htmlInit(c,a),i&&i.bridget&&i.bridget(a,c),c},g.Item=f,g}),function(a,b){"function"==typeof define&&define.amd?define(["outlayer/outlayer","get-size/get-size","fizzy-ui-utils/utils"],b):"object"==typeof exports?module.exports=b(require("outlayer"),require("get-size"),require("fizzy-ui-utils")):a.Masonry=b(a.Outlayer,a.getSize,a.fizzyUIUtils)}(window,function(a,b,c){var d=a.create("masonry");return d.prototype._resetLayout=function(){this.getSize(),this._getMeasurement("columnWidth","outerWidth"),this._getMeasurement("gutter","outerWidth"),this.measureColumns();var a=this.cols;for(this.colYs=[];a--;)this.colYs.push(0);this.maxY=0},d.prototype.measureColumns=function(){if(this.getContainerWidth(),!this.columnWidth){var a=this.items[0],c=a&&a.element;this.columnWidth=c&&b(c).outerWidth||this.containerWidth}var d=this.columnWidth+=this.gutter,e=this.containerWidth+this.gutter,f=e/d,g=d-e%d,h=g&&1>g?"round":"floor";f=Math[h](f),this.cols=Math.max(f,1)},d.prototype.getContainerWidth=function(){var a=this.options.isFitWidth?this.element.parentNode:this.element,c=b(a);this.containerWidth=c&&c.innerWidth},d.prototype._getItemLayoutPosition=function(a){a.getSize();var b=a.size.outerWidth%this.columnWidth,d=b&&1>b?"round":"ceil",e=Math[d](a.size.outerWidth/this.columnWidth);e=Math.min(e,this.cols);for(var f=this._getColGroup(e),g=Math.min.apply(Math,f),h=c.indexOf(f,g),i={x:this.columnWidth*h,y:g},j=g+a.size.outerHeight,k=this.cols+1-f.length,l=0;k>l;l++)this.colYs[h+l]=j;return i},d.prototype._getColGroup=function(a){if(2>a)return this.colYs;for(var b=[],c=this.cols+1-a,d=0;c>d;d++){var e=this.colYs.slice(d,d+a);b[d]=Math.max.apply(Math,e)}return b},d.prototype._manageStamp=function(a){var c=b(a),d=this._getElementOffset(a),e=this.options.isOriginLeft?d.left:d.right,f=e+c.outerWidth,g=Math.floor(e/this.columnWidth);g=Math.max(0,g);var h=Math.floor(f/this.columnWidth);h-=f%this.columnWidth?0:1,h=Math.min(this.cols-1,h);for(var i=(this.options.isOriginTop?d.top:d.bottom)+c.outerHeight,j=g;h>=j;j++)this.colYs[j]=Math.max(i,this.colYs[j])},d.prototype._getContainerSize=function(){this.maxY=Math.max.apply(Math,this.colYs);var a={height:this.maxY};return this.options.isFitWidth&&(a.width=this._getContainerFitWidth()),a},d.prototype._getContainerFitWidth=function(){for(var a=0,b=this.cols;--b&&0===this.colYs[b];)a++;return(this.cols-a)*this.columnWidth-this.gutter},d.prototype.needsResizeLayout=function(){var a=this.containerWidth;return this.getContainerWidth(),a!==this.containerWidth},d}); \ No newline at end of file diff --git a/Monitor/wwwroot/assets/plugins/masonry/masonry.js b/Monitor/wwwroot/assets/plugins/masonry/masonry.js new file mode 100644 index 0000000..ebfd171 --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/masonry/masonry.js @@ -0,0 +1,203 @@ +/*! + * Masonry v3.3.1 + * Cascading grid layout library + * http://masonry.desandro.com + * MIT License + * by David DeSandro + */ + +( function( window, factory ) { + 'use strict'; + // universal module definition + if ( typeof define === 'function' && define.amd ) { + // AMD + define( [ + 'outlayer/outlayer', + 'get-size/get-size', + 'fizzy-ui-utils/utils' + ], + factory ); + } else if ( typeof exports === 'object' ) { + // CommonJS + module.exports = factory( + require('outlayer'), + require('get-size'), + require('fizzy-ui-utils') + ); + } else { + // browser global + window.Masonry = factory( + window.Outlayer, + window.getSize, + window.fizzyUIUtils + ); + } + +}( window, function factory( Outlayer, getSize, utils ) { + +'use strict'; + +// -------------------------- masonryDefinition -------------------------- // + + // create an Outlayer layout class + var Masonry = Outlayer.create('masonry'); + + Masonry.prototype._resetLayout = function() { + this.getSize(); + this._getMeasurement( 'columnWidth', 'outerWidth' ); + this._getMeasurement( 'gutter', 'outerWidth' ); + this.measureColumns(); + + // reset column Y + var i = this.cols; + this.colYs = []; + while (i--) { + this.colYs.push( 0 ); + } + + this.maxY = 0; + }; + + Masonry.prototype.measureColumns = function() { + this.getContainerWidth(); + // if columnWidth is 0, default to outerWidth of first item + if ( !this.columnWidth ) { + var firstItem = this.items[0]; + var firstItemElem = firstItem && firstItem.element; + // columnWidth fall back to item of first element + this.columnWidth = firstItemElem && getSize( firstItemElem ).outerWidth || + // if first elem has no width, default to size of container + this.containerWidth; + } + + var columnWidth = this.columnWidth += this.gutter; + + // calculate columns + var containerWidth = this.containerWidth + this.gutter; + var cols = containerWidth / columnWidth; + // fix rounding errors, typically with gutters + var excess = columnWidth - containerWidth % columnWidth; + // if overshoot is less than a pixel, round up, otherwise floor it + var mathMethod = excess && excess < 1 ? 'round' : 'floor'; + cols = Math[ mathMethod ]( cols ); + this.cols = Math.max( cols, 1 ); + }; + + Masonry.prototype.getContainerWidth = function() { + // container is parent if fit width + var container = this.options.isFitWidth ? this.element.parentNode : this.element; + // check that this.size and size are there + // IE8 triggers resize on body size change, so they might not be + var size = getSize( container ); + this.containerWidth = size && size.innerWidth; + }; + + Masonry.prototype._getItemLayoutPosition = function( item ) { + item.getSize(); + // how many columns does this brick span + var remainder = item.size.outerWidth % this.columnWidth; + var mathMethod = remainder && remainder < 1 ? 'round' : 'ceil'; + // round if off by 1 pixel, otherwise use ceil + var colSpan = Math[ mathMethod ]( item.size.outerWidth / this.columnWidth ); + colSpan = Math.min( colSpan, this.cols ); + + var colGroup = this._getColGroup( colSpan ); + // get the minimum Y value from the columns + var minimumY = Math.min.apply( Math, colGroup ); + var shortColIndex = utils.indexOf( colGroup, minimumY ); + + // position the brick + var position = { + x: this.columnWidth * shortColIndex, + y: minimumY + }; + + // apply setHeight to necessary columns + var setHeight = minimumY + item.size.outerHeight; + var setSpan = this.cols + 1 - colGroup.length; + for ( var i = 0; i < setSpan; i++ ) { + this.colYs[ shortColIndex + i ] = setHeight; + } + + return position; + }; + + /** + * @param {Number} colSpan - number of columns the element spans + * @returns {Array} colGroup + */ + Masonry.prototype._getColGroup = function( colSpan ) { + if ( colSpan < 2 ) { + // if brick spans only one column, use all the column Ys + return this.colYs; + } + + var colGroup = []; + // how many different places could this brick fit horizontally + var groupCount = this.cols + 1 - colSpan; + // for each group potential horizontal position + for ( var i = 0; i < groupCount; i++ ) { + // make an array of colY values for that one group + var groupColYs = this.colYs.slice( i, i + colSpan ); + // and get the max value of the array + colGroup[i] = Math.max.apply( Math, groupColYs ); + } + return colGroup; + }; + + Masonry.prototype._manageStamp = function( stamp ) { + var stampSize = getSize( stamp ); + var offset = this._getElementOffset( stamp ); + // get the columns that this stamp affects + var firstX = this.options.isOriginLeft ? offset.left : offset.right; + var lastX = firstX + stampSize.outerWidth; + var firstCol = Math.floor( firstX / this.columnWidth ); + firstCol = Math.max( 0, firstCol ); + var lastCol = Math.floor( lastX / this.columnWidth ); + // lastCol should not go over if multiple of columnWidth #425 + lastCol -= lastX % this.columnWidth ? 0 : 1; + lastCol = Math.min( this.cols - 1, lastCol ); + // set colYs to bottom of the stamp + var stampMaxY = ( this.options.isOriginTop ? offset.top : offset.bottom ) + + stampSize.outerHeight; + for ( var i = firstCol; i <= lastCol; i++ ) { + this.colYs[i] = Math.max( stampMaxY, this.colYs[i] ); + } + }; + + Masonry.prototype._getContainerSize = function() { + this.maxY = Math.max.apply( Math, this.colYs ); + var size = { + height: this.maxY + }; + + if ( this.options.isFitWidth ) { + size.width = this._getContainerFitWidth(); + } + + return size; + }; + + Masonry.prototype._getContainerFitWidth = function() { + var unusedCols = 0; + // count unused columns + var i = this.cols; + while ( --i ) { + if ( this.colYs[i] !== 0 ) { + break; + } + unusedCols++; + } + // fit container to columns that have been used + return ( this.cols - unusedCols ) * this.columnWidth - this.gutter; + }; + + Masonry.prototype.needsResizeLayout = function() { + var previousWidth = this.containerWidth; + this.getContainerWidth(); + return previousWidth !== this.containerWidth; + }; + + return Masonry; + +})); diff --git a/Monitor/wwwroot/assets/plugins/masonry/sandbox/basic.html b/Monitor/wwwroot/assets/plugins/masonry/sandbox/basic.html new file mode 100644 index 0000000..55f9c5c --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/masonry/sandbox/basic.html @@ -0,0 +1,62 @@ + + + + + + basic + + + + + + +

      basic

      + +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      + + + + + + + + + + + + + + + + + + diff --git a/Monitor/wwwroot/assets/plugins/masonry/sandbox/bottom-up.html b/Monitor/wwwroot/assets/plugins/masonry/sandbox/bottom-up.html new file mode 100644 index 0000000..5ee641a --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/masonry/sandbox/bottom-up.html @@ -0,0 +1,119 @@ + + + + + + bottom up + + + + + + + + +

      bottom up

      + +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      + +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      + + + + + + + + + + + + + + + + + + diff --git a/Monitor/wwwroot/assets/plugins/masonry/sandbox/browserify/index.html b/Monitor/wwwroot/assets/plugins/masonry/sandbox/browserify/index.html new file mode 100644 index 0000000..a3aa64c --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/masonry/sandbox/browserify/index.html @@ -0,0 +1,42 @@ + + + + + + browserify + + + + + + +

      browserify

      + +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      + + + + + diff --git a/Monitor/wwwroot/assets/plugins/masonry/sandbox/browserify/main.js b/Monitor/wwwroot/assets/plugins/masonry/sandbox/browserify/main.js new file mode 100644 index 0000000..2baca7d --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/masonry/sandbox/browserify/main.js @@ -0,0 +1,19 @@ +// vanilla js + +var Masonry = require('../../masonry'); + +new Masonry( '#basic', { + columnWidth: 60 +}); + +// jquery + +// var $ = require('jquery'); +// var jQBridget = require('jquery-bridget'); +// var Masonry = require('../../masonry'); +// +// $.bridget( 'masonry', Masonry ); +// +// $('#basic').masonry({ +// columnWidth: 60 +// }); diff --git a/Monitor/wwwroot/assets/plugins/masonry/sandbox/element-sizing.html b/Monitor/wwwroot/assets/plugins/masonry/sandbox/element-sizing.html new file mode 100644 index 0000000..acbce99 --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/masonry/sandbox/element-sizing.html @@ -0,0 +1,69 @@ + + + + + + element sizing + + + + + + +

      element sizing

      + +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      + + + + + + + + + + + + + + + + + + diff --git a/Monitor/wwwroot/assets/plugins/masonry/sandbox/fit-width.html b/Monitor/wwwroot/assets/plugins/masonry/sandbox/fit-width.html new file mode 100644 index 0000000..fc74f57 --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/masonry/sandbox/fit-width.html @@ -0,0 +1,68 @@ + + + + + + fit width + + + + + + + + +

      fit width

      + +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      + + + + + + + + + + + + + + + + + + diff --git a/Monitor/wwwroot/assets/plugins/masonry/sandbox/fluid.html b/Monitor/wwwroot/assets/plugins/masonry/sandbox/fluid.html new file mode 100644 index 0000000..a4e1eb1 --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/masonry/sandbox/fluid.html @@ -0,0 +1,89 @@ + + + + + + fluid + + + + + + +

      basic

      + +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      + + + + + + + + + + + + + + + + + + + diff --git a/Monitor/wwwroot/assets/plugins/masonry/sandbox/jquery.html b/Monitor/wwwroot/assets/plugins/masonry/sandbox/jquery.html new file mode 100644 index 0000000..82fbaf6 --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/masonry/sandbox/jquery.html @@ -0,0 +1,64 @@ + + + + + + jQuery + + + + + + +

      jQuery

      + +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      + + + + + + + + + + + + + + + + + + + diff --git a/Monitor/wwwroot/assets/plugins/masonry/sandbox/require-js/index.html b/Monitor/wwwroot/assets/plugins/masonry/sandbox/require-js/index.html new file mode 100644 index 0000000..3246194 --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/masonry/sandbox/require-js/index.html @@ -0,0 +1,41 @@ + + + + + + require js + + + + + + + +

      require js

      + +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      + + + diff --git a/Monitor/wwwroot/assets/plugins/masonry/sandbox/require-js/main.js b/Monitor/wwwroot/assets/plugins/masonry/sandbox/require-js/main.js new file mode 100644 index 0000000..b329acf --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/masonry/sandbox/require-js/main.js @@ -0,0 +1,69 @@ +/*global requirejs: false*/ + +// -------------------------- pkgd -------------------------- // + +/* +requirejs( [ '../../dist/masonry.pkgd' ], function( Masonry ) { + new Masonry( document.querySelector('#basic') ); +}); +// */ + +// -------------------------- bower -------------------------- // + +/* +requirejs.config({ + baseUrl: '../bower_components' +}); + +requirejs( [ '../masonry' ], function( Masonry ) { + new Masonry( document.querySelector('#basic') ); +}); +// */ + +// -------------------------- pkgd & jQuery -------------------------- // + +// /* +requirejs.config({ + paths: { + jquery: '../../bower_components/jquery/dist/jquery' + } +}); + +requirejs( [ 'require', 'jquery', '../../dist/masonry.pkgd' ], + function( require, $, Masonry ) { + require( [ + 'jquery-bridget/jquery.bridget' + ], + function() { + $.bridget( 'masonry', Masonry ); + $('#basic').masonry({ + columnWidth: 60 + }); + } + ); +}); +// */ + +// -------------------------- bower & jQuery -------------------------- // + +/* +requirejs.config({ + baseUrl: '../bower_components', + paths: { + jquery: 'jquery/dist/jquery' + } +}); + +requirejs( [ + 'jquery', + '../masonry', + 'jquery-bridget/jquery.bridget' + ], + function( $, Masonry ) { + $.bridget( 'masonry', Masonry ); + $('#basic').masonry({ + columnWidth: 60 + }); + } +); +// */ \ No newline at end of file diff --git a/Monitor/wwwroot/assets/plugins/masonry/sandbox/right-to-left.html b/Monitor/wwwroot/assets/plugins/masonry/sandbox/right-to-left.html new file mode 100644 index 0000000..8dd6a4f --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/masonry/sandbox/right-to-left.html @@ -0,0 +1,120 @@ + + + + + + right to left + + + + + + + + +

      right to left

      + +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      + +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      + + + + + + + + + + + + + + + + + + diff --git a/Monitor/wwwroot/assets/plugins/masonry/sandbox/sandbox.css b/Monitor/wwwroot/assets/plugins/masonry/sandbox/sandbox.css new file mode 100644 index 0000000..2d88f22 --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/masonry/sandbox/sandbox.css @@ -0,0 +1,33 @@ +* { + box-sizing: border-box; +} + +.container { + background: #EEE; + width: 50%; + margin-bottom: 20px; +} + +.item { + width: 60px; + height: 60px; + float: left; + border: 1px solid; + background: #09F; +} + +.item.w2 { width: 120px; } +.item.w3 { width: 180px; } +.item.w4 { width: 240px; } + +.item.h2 { height: 100px; } +.item.h3 { height: 160px; } +.item.h4 { height: 220px; } +.item.h5 { height: 280px; } + +.stamp { + background: red; + opacity: 0.75; + position: absolute; + border: 1px solid; +} diff --git a/Monitor/wwwroot/assets/plugins/masonry/sandbox/stamps.html b/Monitor/wwwroot/assets/plugins/masonry/sandbox/stamps.html new file mode 100644 index 0000000..3a9a328 --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/masonry/sandbox/stamps.html @@ -0,0 +1,124 @@ + + + + + + stamps + + + + + + + + + +

      stamps

      + +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      + +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      + + + + + + + + + + + + + + + + + + diff --git a/Monitor/wwwroot/assets/plugins/matches-selector/matches-selector.js b/Monitor/wwwroot/assets/plugins/matches-selector/matches-selector.js new file mode 100644 index 0000000..8624982 --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/matches-selector/matches-selector.js @@ -0,0 +1,107 @@ +/** + * matchesSelector v1.0.3 + * matchesSelector( element, '.selector' ) + * MIT license + */ + +/*jshint browser: true, strict: true, undef: true, unused: true */ +/*global define: false, module: false */ + +( function( ElemProto ) { + + 'use strict'; + + var matchesMethod = ( function() { + // check for the standard method name first + if ( ElemProto.matches ) { + return 'matches'; + } + // check un-prefixed + if ( ElemProto.matchesSelector ) { + return 'matchesSelector'; + } + // check vendor prefixes + var prefixes = [ 'webkit', 'moz', 'ms', 'o' ]; + + for ( var i=0, len = prefixes.length; i < len; i++ ) { + var prefix = prefixes[i]; + var method = prefix + 'MatchesSelector'; + if ( ElemProto[ method ] ) { + return method; + } + } + })(); + + // ----- match ----- // + + function match( elem, selector ) { + return elem[ matchesMethod ]( selector ); + } + + // ----- appendToFragment ----- // + + function checkParent( elem ) { + // not needed if already has parent + if ( elem.parentNode ) { + return; + } + var fragment = document.createDocumentFragment(); + fragment.appendChild( elem ); + } + + // ----- query ----- // + + // fall back to using QSA + // thx @jonathantneal https://gist.github.com/3062955 + function query( elem, selector ) { + // append to fragment if no parent + checkParent( elem ); + + // match elem with all selected elems of parent + var elems = elem.parentNode.querySelectorAll( selector ); + for ( var i=0, len = elems.length; i < len; i++ ) { + // return true if match + if ( elems[i] === elem ) { + return true; + } + } + // otherwise return false + return false; + } + + // ----- matchChild ----- // + + function matchChild( elem, selector ) { + checkParent( elem ); + return match( elem, selector ); + } + + // ----- matchesSelector ----- // + + var matchesSelector; + + if ( matchesMethod ) { + // IE9 supports matchesSelector, but doesn't work on orphaned elems + // check for that + var div = document.createElement('div'); + var supportsOrphans = match( div, 'div' ); + matchesSelector = supportsOrphans ? match : matchChild; + } else { + matchesSelector = query; + } + + // transport + if ( typeof define === 'function' && define.amd ) { + // AMD + define( function() { + return matchesSelector; + }); + } else if ( typeof exports === 'object' ) { + module.exports = matchesSelector; + } + else { + // browser global + window.matchesSelector = matchesSelector; + } + +})( Element.prototype ); diff --git a/Monitor/wwwroot/assets/plugins/mjolnic-bootstrap-colorpicker/dist/css/bootstrap-colorpicker.css b/Monitor/wwwroot/assets/plugins/mjolnic-bootstrap-colorpicker/dist/css/bootstrap-colorpicker.css new file mode 100644 index 0000000..432c50f --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/mjolnic-bootstrap-colorpicker/dist/css/bootstrap-colorpicker.css @@ -0,0 +1,251 @@ +/*! + * Bootstrap Colorpicker + * http://mjolnic.github.io/bootstrap-colorpicker/ + * + * Originally written by (c) 2012 Stefan Petre + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0.txt + * + */ + +.colorpicker-saturation { + float: left; + width: 100px; + height: 100px; + cursor: crosshair; + background-image: url("../img/bootstrap-colorpicker/saturation.png"); +} + +.colorpicker-saturation i { + position: absolute; + top: 0; + left: 0; + display: block; + width: 5px; + height: 5px; + margin: -4px 0 0 -4px; + border: 1px solid #000; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} + +.colorpicker-saturation i b { + display: block; + width: 5px; + height: 5px; + border: 1px solid #fff; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} + +.colorpicker-hue, +.colorpicker-alpha { + float: left; + width: 15px; + height: 100px; + margin-bottom: 4px; + margin-left: 4px; + cursor: row-resize; +} + +.colorpicker-hue i, +.colorpicker-alpha i { + position: absolute; + top: 0; + left: 0; + display: block; + width: 100%; + height: 1px; + margin-top: -1px; + background: #000; + border-top: 1px solid #fff; +} + +.colorpicker-hue { + background-image: url("../img/bootstrap-colorpicker/hue.png"); +} + +.colorpicker-alpha { + display: none; + background-image: url("../img/bootstrap-colorpicker/alpha.png"); +} + +.colorpicker-saturation, +.colorpicker-hue, +.colorpicker-alpha { + background-size: contain; +} + +.colorpicker { + top: 0; + left: 0; + z-index: 2500; + min-width: 130px; + padding: 4px; + margin-top: 1px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + *zoom: 1; +} + +.colorpicker:before, +.colorpicker:after { + display: table; + line-height: 0; + content: ""; +} + +.colorpicker:after { + clear: both; +} + +.colorpicker:before { + position: absolute; + top: -7px; + left: 6px; + display: inline-block; + border-right: 7px solid transparent; + border-bottom: 7px solid #ccc; + border-left: 7px solid transparent; + border-bottom-color: rgba(0, 0, 0, 0.2); + content: ''; +} + +.colorpicker:after { + position: absolute; + top: -6px; + left: 7px; + display: inline-block; + border-right: 6px solid transparent; + border-bottom: 6px solid #ffffff; + border-left: 6px solid transparent; + content: ''; +} + +.colorpicker div { + position: relative; +} + +.colorpicker.colorpicker-with-alpha { + min-width: 140px; +} + +.colorpicker.colorpicker-with-alpha .colorpicker-alpha { + display: block; +} + +.colorpicker-color { + height: 10px; + margin-top: 5px; + clear: both; + background-image: url("../img/bootstrap-colorpicker/alpha.png"); + background-position: 0 100%; +} + +.colorpicker-color div { + height: 10px; +} + +.colorpicker-selectors { + display: none; + height: 10px; + margin-top: 5px; + clear: both; +} + +.colorpicker-selectors i { + float: left; + width: 10px; + height: 10px; + cursor: pointer; +} + +.colorpicker-selectors i + i { + margin-left: 3px; +} + +.colorpicker-element .input-group-addon i, +.colorpicker-element .add-on i { + display: inline-block; + width: 16px; + height: 16px; + vertical-align: text-top; + cursor: pointer; +} + +.colorpicker.colorpicker-inline { + position: relative; + z-index: auto; + display: inline-block; + float: none; +} + +.colorpicker.colorpicker-horizontal { + width: 110px; + height: auto; + min-width: 110px; +} + +.colorpicker.colorpicker-horizontal .colorpicker-saturation { + margin-bottom: 4px; +} + +.colorpicker.colorpicker-horizontal .colorpicker-color { + width: 100px; +} + +.colorpicker.colorpicker-horizontal .colorpicker-hue, +.colorpicker.colorpicker-horizontal .colorpicker-alpha { + float: left; + width: 100px; + height: 15px; + margin-bottom: 4px; + margin-left: 0; + cursor: col-resize; +} + +.colorpicker.colorpicker-horizontal .colorpicker-hue i, +.colorpicker.colorpicker-horizontal .colorpicker-alpha i { + position: absolute; + top: 0; + left: 0; + display: block; + width: 1px; + height: 15px; + margin-top: 0; + background: #ffffff; + border: none; +} + +.colorpicker.colorpicker-horizontal .colorpicker-hue { + background-image: url("../img/bootstrap-colorpicker/hue-horizontal.png"); +} + +.colorpicker.colorpicker-horizontal .colorpicker-alpha { + background-image: url("../img/bootstrap-colorpicker/alpha-horizontal.png"); +} + +.colorpicker.colorpicker-hidden { + display: none; +} + +.colorpicker.colorpicker-visible { + display: block; +} + +.colorpicker-inline.colorpicker-visible { + display: inline-block; +} + +.colorpicker-right:before { + right: 6px; + left: auto; +} + +.colorpicker-right:after { + right: 7px; + left: auto; +} \ No newline at end of file diff --git a/Monitor/wwwroot/assets/plugins/mjolnic-bootstrap-colorpicker/dist/css/bootstrap-colorpicker.min.css b/Monitor/wwwroot/assets/plugins/mjolnic-bootstrap-colorpicker/dist/css/bootstrap-colorpicker.min.css new file mode 100644 index 0000000..14a9ee9 --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/mjolnic-bootstrap-colorpicker/dist/css/bootstrap-colorpicker.min.css @@ -0,0 +1,9 @@ +/*! + * Bootstrap Colorpicker + * http://mjolnic.github.io/bootstrap-colorpicker/ + * + * Originally written by (c) 2012 Stefan Petre + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0.txt + * + */.colorpicker-saturation{float:left;width:100px;height:100px;cursor:crosshair;background-image:url("../img/bootstrap-colorpicker/saturation.png")}.colorpicker-saturation i{position:absolute;top:0;left:0;display:block;width:5px;height:5px;margin:-4px 0 0 -4px;border:1px solid #000;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.colorpicker-saturation i b{display:block;width:5px;height:5px;border:1px solid #fff;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.colorpicker-hue,.colorpicker-alpha{float:left;width:15px;height:100px;margin-bottom:4px;margin-left:4px;cursor:row-resize}.colorpicker-hue i,.colorpicker-alpha i{position:absolute;top:0;left:0;display:block;width:100%;height:1px;margin-top:-1px;background:#000;border-top:1px solid #fff}.colorpicker-hue{background-image:url("../img/bootstrap-colorpicker/hue.png")}.colorpicker-alpha{display:none;background-image:url("../img/bootstrap-colorpicker/alpha.png")}.colorpicker-saturation,.colorpicker-hue,.colorpicker-alpha{background-size:contain}.colorpicker{top:0;left:0;z-index:2500;min-width:130px;padding:4px;margin-top:1px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*zoom:1}.colorpicker:before,.colorpicker:after{display:table;line-height:0;content:""}.colorpicker:after{clear:both}.colorpicker:before{position:absolute;top:-7px;left:6px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,0.2);content:''}.colorpicker:after{position:absolute;top:-6px;left:7px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.colorpicker div{position:relative}.colorpicker.colorpicker-with-alpha{min-width:140px}.colorpicker.colorpicker-with-alpha .colorpicker-alpha{display:block}.colorpicker-color{height:10px;margin-top:5px;clear:both;background-image:url("../img/bootstrap-colorpicker/alpha.png");background-position:0 100%}.colorpicker-color div{height:10px}.colorpicker-selectors{display:none;height:10px;margin-top:5px;clear:both}.colorpicker-selectors i{float:left;width:10px;height:10px;cursor:pointer}.colorpicker-selectors i+i{margin-left:3px}.colorpicker-element .input-group-addon i,.colorpicker-element .add-on i{display:inline-block;width:16px;height:16px;vertical-align:text-top;cursor:pointer}.colorpicker.colorpicker-inline{position:relative;z-index:auto;display:inline-block;float:none}.colorpicker.colorpicker-horizontal{width:110px;height:auto;min-width:110px}.colorpicker.colorpicker-horizontal .colorpicker-saturation{margin-bottom:4px}.colorpicker.colorpicker-horizontal .colorpicker-color{width:100px}.colorpicker.colorpicker-horizontal .colorpicker-hue,.colorpicker.colorpicker-horizontal .colorpicker-alpha{float:left;width:100px;height:15px;margin-bottom:4px;margin-left:0;cursor:col-resize}.colorpicker.colorpicker-horizontal .colorpicker-hue i,.colorpicker.colorpicker-horizontal .colorpicker-alpha i{position:absolute;top:0;left:0;display:block;width:1px;height:15px;margin-top:0;background:#fff;border:0}.colorpicker.colorpicker-horizontal .colorpicker-hue{background-image:url("../img/bootstrap-colorpicker/hue-horizontal.png")}.colorpicker.colorpicker-horizontal .colorpicker-alpha{background-image:url("../img/bootstrap-colorpicker/alpha-horizontal.png")}.colorpicker.colorpicker-hidden{display:none}.colorpicker.colorpicker-visible{display:block}.colorpicker-inline.colorpicker-visible{display:inline-block}.colorpicker-right:before{right:6px;left:auto}.colorpicker-right:after{right:7px;left:auto} \ No newline at end of file diff --git a/Monitor/wwwroot/assets/plugins/mjolnic-bootstrap-colorpicker/dist/img/bootstrap-colorpicker/alpha-horizontal.png b/Monitor/wwwroot/assets/plugins/mjolnic-bootstrap-colorpicker/dist/img/bootstrap-colorpicker/alpha-horizontal.png new file mode 100644 index 0000000..d0a65c0 Binary files /dev/null and b/Monitor/wwwroot/assets/plugins/mjolnic-bootstrap-colorpicker/dist/img/bootstrap-colorpicker/alpha-horizontal.png differ diff --git a/Monitor/wwwroot/assets/plugins/mjolnic-bootstrap-colorpicker/dist/img/bootstrap-colorpicker/alpha.png b/Monitor/wwwroot/assets/plugins/mjolnic-bootstrap-colorpicker/dist/img/bootstrap-colorpicker/alpha.png new file mode 100644 index 0000000..38043f1 Binary files /dev/null and b/Monitor/wwwroot/assets/plugins/mjolnic-bootstrap-colorpicker/dist/img/bootstrap-colorpicker/alpha.png differ diff --git a/Monitor/wwwroot/assets/plugins/mjolnic-bootstrap-colorpicker/dist/img/bootstrap-colorpicker/hue-horizontal.png b/Monitor/wwwroot/assets/plugins/mjolnic-bootstrap-colorpicker/dist/img/bootstrap-colorpicker/hue-horizontal.png new file mode 100644 index 0000000..a0d9add Binary files /dev/null and b/Monitor/wwwroot/assets/plugins/mjolnic-bootstrap-colorpicker/dist/img/bootstrap-colorpicker/hue-horizontal.png differ diff --git a/Monitor/wwwroot/assets/plugins/mjolnic-bootstrap-colorpicker/dist/img/bootstrap-colorpicker/hue.png b/Monitor/wwwroot/assets/plugins/mjolnic-bootstrap-colorpicker/dist/img/bootstrap-colorpicker/hue.png new file mode 100644 index 0000000..d89560e Binary files /dev/null and b/Monitor/wwwroot/assets/plugins/mjolnic-bootstrap-colorpicker/dist/img/bootstrap-colorpicker/hue.png differ diff --git a/Monitor/wwwroot/assets/plugins/mjolnic-bootstrap-colorpicker/dist/img/bootstrap-colorpicker/saturation.png b/Monitor/wwwroot/assets/plugins/mjolnic-bootstrap-colorpicker/dist/img/bootstrap-colorpicker/saturation.png new file mode 100644 index 0000000..594ae50 Binary files /dev/null and b/Monitor/wwwroot/assets/plugins/mjolnic-bootstrap-colorpicker/dist/img/bootstrap-colorpicker/saturation.png differ diff --git a/Monitor/wwwroot/assets/plugins/mjolnic-bootstrap-colorpicker/dist/js/bootstrap-colorpicker.js b/Monitor/wwwroot/assets/plugins/mjolnic-bootstrap-colorpicker/dist/js/bootstrap-colorpicker.js new file mode 100644 index 0000000..ff7927a --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/mjolnic-bootstrap-colorpicker/dist/js/bootstrap-colorpicker.js @@ -0,0 +1,1079 @@ +/*! + * Bootstrap Colorpicker + * http://mjolnic.github.io/bootstrap-colorpicker/ + * + * Originally written by (c) 2012 Stefan Petre + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0.txt + * + * @todo Update DOCS + */ + +(function(factory) { + "use strict"; + if (typeof exports === 'object') { + module.exports = factory(window.jQuery); + } else if (typeof define === 'function' && define.amd) { + define(['jquery'], factory); + } else if (window.jQuery && !window.jQuery.fn.colorpicker) { + factory(window.jQuery); + } + } + (function($) { + 'use strict'; + + // Color object + var Color = function(val, customColors) { + this.value = { + h: 0, + s: 0, + b: 0, + a: 1 + }; + this.origFormat = null; // original string format + if (customColors) { + $.extend(this.colors, customColors); + } + if (val) { + if (val.toLowerCase !== undefined) { + // cast to string + val = val + ''; + this.setColor(val); + } else if (val.h !== undefined) { + this.value = val; + } + } + }; + + Color.prototype = { + constructor: Color, + // 140 predefined colors from the HTML Colors spec + colors: { + "aliceblue": "#f0f8ff", + "antiquewhite": "#faebd7", + "aqua": "#00ffff", + "aquamarine": "#7fffd4", + "azure": "#f0ffff", + "beige": "#f5f5dc", + "bisque": "#ffe4c4", + "black": "#000000", + "blanchedalmond": "#ffebcd", + "blue": "#0000ff", + "blueviolet": "#8a2be2", + "brown": "#a52a2a", + "burlywood": "#deb887", + "cadetblue": "#5f9ea0", + "chartreuse": "#7fff00", + "chocolate": "#d2691e", + "coral": "#ff7f50", + "cornflowerblue": "#6495ed", + "cornsilk": "#fff8dc", + "crimson": "#dc143c", + "cyan": "#00ffff", + "darkblue": "#00008b", + "darkcyan": "#008b8b", + "darkgoldenrod": "#b8860b", + "darkgray": "#a9a9a9", + "darkgreen": "#006400", + "darkkhaki": "#bdb76b", + "darkmagenta": "#8b008b", + "darkolivegreen": "#556b2f", + "darkorange": "#ff8c00", + "darkorchid": "#9932cc", + "darkred": "#8b0000", + "darksalmon": "#e9967a", + "darkseagreen": "#8fbc8f", + "darkslateblue": "#483d8b", + "darkslategray": "#2f4f4f", + "darkturquoise": "#00ced1", + "darkviolet": "#9400d3", + "deeppink": "#ff1493", + "deepskyblue": "#00bfff", + "dimgray": "#696969", + "dodgerblue": "#1e90ff", + "firebrick": "#b22222", + "floralwhite": "#fffaf0", + "forestgreen": "#228b22", + "fuchsia": "#ff00ff", + "gainsboro": "#dcdcdc", + "ghostwhite": "#f8f8ff", + "gold": "#ffd700", + "goldenrod": "#daa520", + "gray": "#808080", + "green": "#008000", + "greenyellow": "#adff2f", + "honeydew": "#f0fff0", + "hotpink": "#ff69b4", + "indianred": "#cd5c5c", + "indigo": "#4b0082", + "ivory": "#fffff0", + "khaki": "#f0e68c", + "lavender": "#e6e6fa", + "lavenderblush": "#fff0f5", + "lawngreen": "#7cfc00", + "lemonchiffon": "#fffacd", + "lightblue": "#add8e6", + "lightcoral": "#f08080", + "lightcyan": "#e0ffff", + "lightgoldenrodyellow": "#fafad2", + "lightgrey": "#d3d3d3", + "lightgreen": "#90ee90", + "lightpink": "#ffb6c1", + "lightsalmon": "#ffa07a", + "lightseagreen": "#20b2aa", + "lightskyblue": "#87cefa", + "lightslategray": "#778899", + "lightsteelblue": "#b0c4de", + "lightyellow": "#ffffe0", + "lime": "#00ff00", + "limegreen": "#32cd32", + "linen": "#faf0e6", + "magenta": "#ff00ff", + "maroon": "#800000", + "mediumaquamarine": "#66cdaa", + "mediumblue": "#0000cd", + "mediumorchid": "#ba55d3", + "mediumpurple": "#9370d8", + "mediumseagreen": "#3cb371", + "mediumslateblue": "#7b68ee", + "mediumspringgreen": "#00fa9a", + "mediumturquoise": "#48d1cc", + "mediumvioletred": "#c71585", + "midnightblue": "#191970", + "mintcream": "#f5fffa", + "mistyrose": "#ffe4e1", + "moccasin": "#ffe4b5", + "navajowhite": "#ffdead", + "navy": "#000080", + "oldlace": "#fdf5e6", + "olive": "#808000", + "olivedrab": "#6b8e23", + "orange": "#ffa500", + "orangered": "#ff4500", + "orchid": "#da70d6", + "palegoldenrod": "#eee8aa", + "palegreen": "#98fb98", + "paleturquoise": "#afeeee", + "palevioletred": "#d87093", + "papayawhip": "#ffefd5", + "peachpuff": "#ffdab9", + "peru": "#cd853f", + "pink": "#ffc0cb", + "plum": "#dda0dd", + "powderblue": "#b0e0e6", + "purple": "#800080", + "red": "#ff0000", + "rosybrown": "#bc8f8f", + "royalblue": "#4169e1", + "saddlebrown": "#8b4513", + "salmon": "#fa8072", + "sandybrown": "#f4a460", + "seagreen": "#2e8b57", + "seashell": "#fff5ee", + "sienna": "#a0522d", + "silver": "#c0c0c0", + "skyblue": "#87ceeb", + "slateblue": "#6a5acd", + "slategray": "#708090", + "snow": "#fffafa", + "springgreen": "#00ff7f", + "steelblue": "#4682b4", + "tan": "#d2b48c", + "teal": "#008080", + "thistle": "#d8bfd8", + "tomato": "#ff6347", + "turquoise": "#40e0d0", + "violet": "#ee82ee", + "wheat": "#f5deb3", + "white": "#ffffff", + "whitesmoke": "#f5f5f5", + "yellow": "#ffff00", + "yellowgreen": "#9acd32", + "transparent": "transparent" + }, + _sanitizeNumber: function(val) { + if (typeof val === 'number') { + return val; + } + if (isNaN(val) || (val === null) || (val === '') || (val === undefined)) { + return 1; + } + if (val.toLowerCase !== undefined) { + return parseFloat(val); + } + return 1; + }, + isTransparent: function(strVal) { + if (!strVal) { + return false; + } + strVal = strVal.toLowerCase().trim(); + return (strVal === 'transparent') || (strVal.match(/#?00000000/)) || (strVal.match(/(rgba|hsla)\(0,0,0,0?\.?0\)/)); + }, + rgbaIsTransparent: function(rgba) { + return ((rgba.r === 0) && (rgba.g === 0) && (rgba.b === 0) && (rgba.a === 0)); + }, + //parse a string to HSB + setColor: function(strVal) { + strVal = strVal.toLowerCase().trim(); + if (strVal) { + if (this.isTransparent(strVal)) { + this.value = { + h: 0, + s: 0, + b: 0, + a: 0 + }; + } else { + this.value = this.stringToHSB(strVal) || { + h: 0, + s: 0, + b: 0, + a: 1 + }; // if parser fails, defaults to black + } + } + }, + stringToHSB: function(strVal) { + strVal = strVal.toLowerCase(); + var alias; + if (typeof this.colors[strVal] !== 'undefined') { + strVal = this.colors[strVal]; + alias = 'alias'; + } + var that = this, + result = false; + $.each(this.stringParsers, function(i, parser) { + var match = parser.re.exec(strVal), + values = match && parser.parse.apply(that, [match]), + format = alias || parser.format || 'rgba'; + if (values) { + if (format.match(/hsla?/)) { + result = that.RGBtoHSB.apply(that, that.HSLtoRGB.apply(that, values)); + } else { + result = that.RGBtoHSB.apply(that, values); + } + that.origFormat = format; + return false; + } + return true; + }); + return result; + }, + setHue: function(h) { + this.value.h = 1 - h; + }, + setSaturation: function(s) { + this.value.s = s; + }, + setBrightness: function(b) { + this.value.b = 1 - b; + }, + setAlpha: function(a) { + this.value.a = parseInt((1 - a) * 100, 10) / 100; + }, + toRGB: function(h, s, b, a) { + if (!h) { + h = this.value.h; + s = this.value.s; + b = this.value.b; + } + h *= 360; + var R, G, B, X, C; + h = (h % 360) / 60; + C = b * s; + X = C * (1 - Math.abs(h % 2 - 1)); + R = G = B = b - C; + + h = ~~h; + R += [C, X, 0, 0, X, C][h]; + G += [X, C, C, X, 0, 0][h]; + B += [0, 0, X, C, C, X][h]; + return { + r: Math.round(R * 255), + g: Math.round(G * 255), + b: Math.round(B * 255), + a: a || this.value.a + }; + }, + toHex: function(h, s, b, a) { + var rgb = this.toRGB(h, s, b, a); + if (this.rgbaIsTransparent(rgb)) { + return 'transparent'; + } + return '#' + ((1 << 24) | (parseInt(rgb.r) << 16) | (parseInt(rgb.g) << 8) | parseInt(rgb.b)).toString(16).substr(1); + }, + toHSL: function(h, s, b, a) { + h = h || this.value.h; + s = s || this.value.s; + b = b || this.value.b; + a = a || this.value.a; + + var H = h, + L = (2 - s) * b, + S = s * b; + if (L > 0 && L <= 1) { + S /= L; + } else { + S /= 2 - L; + } + L /= 2; + if (S > 1) { + S = 1; + } + return { + h: isNaN(H) ? 0 : H, + s: isNaN(S) ? 0 : S, + l: isNaN(L) ? 0 : L, + a: isNaN(a) ? 0 : a + }; + }, + toAlias: function(r, g, b, a) { + var rgb = this.toHex(r, g, b, a); + for (var alias in this.colors) { + if (this.colors[alias] === rgb) { + return alias; + } + } + return false; + }, + RGBtoHSB: function(r, g, b, a) { + r /= 255; + g /= 255; + b /= 255; + + var H, S, V, C; + V = Math.max(r, g, b); + C = V - Math.min(r, g, b); + H = (C === 0 ? null : + V === r ? (g - b) / C : + V === g ? (b - r) / C + 2 : + (r - g) / C + 4 + ); + H = ((H + 360) % 6) * 60 / 360; + S = C === 0 ? 0 : C / V; + return { + h: this._sanitizeNumber(H), + s: S, + b: V, + a: this._sanitizeNumber(a) + }; + }, + HueToRGB: function(p, q, h) { + if (h < 0) { + h += 1; + } else if (h > 1) { + h -= 1; + } + if ((h * 6) < 1) { + return p + (q - p) * h * 6; + } else if ((h * 2) < 1) { + return q; + } else if ((h * 3) < 2) { + return p + (q - p) * ((2 / 3) - h) * 6; + } else { + return p; + } + }, + HSLtoRGB: function(h, s, l, a) { + if (s < 0) { + s = 0; + } + var q; + if (l <= 0.5) { + q = l * (1 + s); + } else { + q = l + s - (l * s); + } + + var p = 2 * l - q; + + var tr = h + (1 / 3); + var tg = h; + var tb = h - (1 / 3); + + var r = Math.round(this.HueToRGB(p, q, tr) * 255); + var g = Math.round(this.HueToRGB(p, q, tg) * 255); + var b = Math.round(this.HueToRGB(p, q, tb) * 255); + return [r, g, b, this._sanitizeNumber(a)]; + }, + toString: function(format) { + format = format || 'rgba'; + var c = false; + switch (format) { + case 'rgb': + { + c = this.toRGB(); + if (this.rgbaIsTransparent(c)) { + return 'transparent'; + } + return 'rgb(' + c.r + ',' + c.g + ',' + c.b + ')'; + } + break; + case 'rgba': + { + c = this.toRGB(); + return 'rgba(' + c.r + ',' + c.g + ',' + c.b + ',' + c.a + ')'; + } + break; + case 'hsl': + { + c = this.toHSL(); + return 'hsl(' + Math.round(c.h * 360) + ',' + Math.round(c.s * 100) + '%,' + Math.round(c.l * 100) + '%)'; + } + break; + case 'hsla': + { + c = this.toHSL(); + return 'hsla(' + Math.round(c.h * 360) + ',' + Math.round(c.s * 100) + '%,' + Math.round(c.l * 100) + '%,' + c.a + ')'; + } + break; + case 'hex': + { + return this.toHex(); + } + break; + case 'alias': + return this.toAlias() || this.toHex(); + default: + { + return c; + } + break; + } + }, + // a set of RE's that can match strings and generate color tuples. + // from John Resig color plugin + // https://github.com/jquery/jquery-color/ + stringParsers: [{ + re: /rgb\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*?\)/, + format: 'rgb', + parse: function(execResult) { + return [ + execResult[1], + execResult[2], + execResult[3], + 1 + ]; + } + }, { + re: /rgb\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*?\)/, + format: 'rgb', + parse: function(execResult) { + return [ + 2.55 * execResult[1], + 2.55 * execResult[2], + 2.55 * execResult[3], + 1 + ]; + } + }, { + re: /rgba\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/, + format: 'rgba', + parse: function(execResult) { + return [ + execResult[1], + execResult[2], + execResult[3], + execResult[4] + ]; + } + }, { + re: /rgba\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/, + format: 'rgba', + parse: function(execResult) { + return [ + 2.55 * execResult[1], + 2.55 * execResult[2], + 2.55 * execResult[3], + execResult[4] + ]; + } + }, { + re: /hsl\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*?\)/, + format: 'hsl', + parse: function(execResult) { + return [ + execResult[1] / 360, + execResult[2] / 100, + execResult[3] / 100, + execResult[4] + ]; + } + }, { + re: /hsla\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/, + format: 'hsla', + parse: function(execResult) { + return [ + execResult[1] / 360, + execResult[2] / 100, + execResult[3] / 100, + execResult[4] + ]; + } + }, { + re: /#?([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/, + format: 'hex', + parse: function(execResult) { + return [ + parseInt(execResult[1], 16), + parseInt(execResult[2], 16), + parseInt(execResult[3], 16), + 1 + ]; + } + }, { + re: /#?([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/, + format: 'hex', + parse: function(execResult) { + return [ + parseInt(execResult[1] + execResult[1], 16), + parseInt(execResult[2] + execResult[2], 16), + parseInt(execResult[3] + execResult[3], 16), + 1 + ]; + } + }], + colorNameToHex: function(name) { + if (typeof this.colors[name.toLowerCase()] !== 'undefined') { + return this.colors[name.toLowerCase()]; + } + return false; + } + }; + + + var defaults = { + horizontal: false, // horizontal mode layout ? + inline: false, //forces to show the colorpicker as an inline element + color: false, //forces a color + format: false, //forces a format + input: 'input', // children input selector + container: false, // container selector + component: '.add-on, .input-group-addon', // children component selector + sliders: { + saturation: { + maxLeft: 100, + maxTop: 100, + callLeft: 'setSaturation', + callTop: 'setBrightness' + }, + hue: { + maxLeft: 0, + maxTop: 100, + callLeft: false, + callTop: 'setHue' + }, + alpha: { + maxLeft: 0, + maxTop: 100, + callLeft: false, + callTop: 'setAlpha' + } + }, + slidersHorz: { + saturation: { + maxLeft: 100, + maxTop: 100, + callLeft: 'setSaturation', + callTop: 'setBrightness' + }, + hue: { + maxLeft: 100, + maxTop: 0, + callLeft: 'setHue', + callTop: false + }, + alpha: { + maxLeft: 100, + maxTop: 0, + callLeft: 'setAlpha', + callTop: false + } + }, + template: '
    • %s

    • ', url, escape(suite.title)); + + // container + stack[0].appendChild(el); + stack.unshift(document.createElement('ul')); + el.appendChild(stack[0]); + }); + + runner.on('suite end', function(suite){ + if (suite.root) return; + stack.shift(); + }); + + runner.on('fail', function(test, err){ + if ('hook' == test.type) runner.emit('test end', test); + }); + + runner.on('test end', function(test){ + // TODO: add to stats + var percent = stats.tests / this.total * 100 | 0; + if (progress) progress.update(percent).draw(ctx); + + // update stats + var ms = new Date - stats.start; + text(passes, stats.passes); + text(failures, stats.failures); + text(duration, (ms / 1000).toFixed(2)); + + // test + if ('passed' == test.state) { + var url = self.testURL(test); + var el = fragment('
    • %e%ems

    • ', test.speed, test.title, test.duration, url); + } else if (test.pending) { + var el = fragment('
    • %e

    • ', test.title); + } else { + var el = fragment('
    • %e

    • ', test.title, encodeURIComponent(test.fullTitle())); + var str = test.err.stack || test.err.toString(); + + // FF / Opera do not add the message + if (!~str.indexOf(test.err.message)) { + str = test.err.message + '\n' + str; + } + + // <=IE7 stringifies to [Object Error]. Since it can be overloaded, we + // check for the result of the stringifying. + if ('[object Error]' == str) str = test.err.message; + + // Safari doesn't give you a stack. Let's at least provide a source line. + if (!test.err.stack && test.err.sourceURL && test.err.line !== undefined) { + str += "\n(" + test.err.sourceURL + ":" + test.err.line + ")"; + } + + el.appendChild(fragment('
      %e
      ', str)); + } + + // toggle code + // TODO: defer + if (!test.pending) { + var h2 = el.getElementsByTagName('h2')[0]; + + on(h2, 'click', function(){ + pre.style.display = 'none' == pre.style.display + ? 'block' + : 'none'; + }); + + var pre = fragment('
      %e
      ', utils.clean(test.fn.toString())); + el.appendChild(pre); + pre.style.display = 'none'; + } + + // Don't call .appendChild if #mocha-report was already .shift()'ed off the stack. + if (stack[0]) stack[0].appendChild(el); + }); +} + +/** + * Provide suite URL + * + * @param {Object} [suite] + */ + +HTML.prototype.suiteURL = function(suite){ + return '?grep=' + encodeURIComponent(suite.fullTitle()); +}; + +/** + * Provide test URL + * + * @param {Object} [test] + */ + +HTML.prototype.testURL = function(test){ + return '?grep=' + encodeURIComponent(test.fullTitle()); +}; + +/** + * Display error `msg`. + */ + +function error(msg) { + document.body.appendChild(fragment('
      %s
      ', msg)); +} + +/** + * Return a DOM fragment from `html`. + */ + +function fragment(html) { + var args = arguments + , div = document.createElement('div') + , i = 1; + + div.innerHTML = html.replace(/%([se])/g, function(_, type){ + switch (type) { + case 's': return String(args[i++]); + case 'e': return escape(args[i++]); + } + }); + + return div.firstChild; +} + +/** + * Check for suites that do not have elements + * with `classname`, and hide them. + */ + +function hideSuitesWithout(classname) { + var suites = document.getElementsByClassName('suite'); + for (var i = 0; i < suites.length; i++) { + var els = suites[i].getElementsByClassName(classname); + if (0 == els.length) suites[i].className += ' hidden'; + } +} + +/** + * Unhide .hidden suites. + */ + +function unhide() { + var els = document.getElementsByClassName('suite hidden'); + for (var i = 0; i < els.length; ++i) { + els[i].className = els[i].className.replace('suite hidden', 'suite'); + } +} + +/** + * Set `el` text to `str`. + */ + +function text(el, str) { + if (el.textContent) { + el.textContent = str; + } else { + el.innerText = str; + } +} + +/** + * Listen on `event` with callback `fn`. + */ + +function on(el, event, fn) { + if (el.addEventListener) { + el.addEventListener(event, fn, false); + } else { + el.attachEvent('on' + event, fn); + } +} + +}); // module: reporters/html.js + +require.register("reporters/index.js", function(module, exports, require){ + +exports.Base = require('./base'); +exports.Dot = require('./dot'); +exports.Doc = require('./doc'); +exports.TAP = require('./tap'); +exports.JSON = require('./json'); +exports.HTML = require('./html'); +exports.List = require('./list'); +exports.Min = require('./min'); +exports.Spec = require('./spec'); +exports.Nyan = require('./nyan'); +exports.XUnit = require('./xunit'); +exports.Markdown = require('./markdown'); +exports.Progress = require('./progress'); +exports.Landing = require('./landing'); +exports.JSONCov = require('./json-cov'); +exports.HTMLCov = require('./html-cov'); +exports.JSONStream = require('./json-stream'); + +}); // module: reporters/index.js + +require.register("reporters/json-cov.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var Base = require('./base'); + +/** + * Expose `JSONCov`. + */ + +exports = module.exports = JSONCov; + +/** + * Initialize a new `JsCoverage` reporter. + * + * @param {Runner} runner + * @param {Boolean} output + * @api public + */ + +function JSONCov(runner, output) { + var self = this + , output = 1 == arguments.length ? true : output; + + Base.call(this, runner); + + var tests = [] + , failures = [] + , passes = []; + + runner.on('test end', function(test){ + tests.push(test); + }); + + runner.on('pass', function(test){ + passes.push(test); + }); + + runner.on('fail', function(test){ + failures.push(test); + }); + + runner.on('end', function(){ + var cov = global._$jscoverage || {}; + var result = self.cov = map(cov); + result.stats = self.stats; + result.tests = tests.map(clean); + result.failures = failures.map(clean); + result.passes = passes.map(clean); + if (!output) return; + process.stdout.write(JSON.stringify(result, null, 2 )); + }); +} + +/** + * Map jscoverage data to a JSON structure + * suitable for reporting. + * + * @param {Object} cov + * @return {Object} + * @api private + */ + +function map(cov) { + var ret = { + instrumentation: 'node-jscoverage' + , sloc: 0 + , hits: 0 + , misses: 0 + , coverage: 0 + , files: [] + }; + + for (var filename in cov) { + var data = coverage(filename, cov[filename]); + ret.files.push(data); + ret.hits += data.hits; + ret.misses += data.misses; + ret.sloc += data.sloc; + } + + ret.files.sort(function(a, b) { + return a.filename.localeCompare(b.filename); + }); + + if (ret.sloc > 0) { + ret.coverage = (ret.hits / ret.sloc) * 100; + } + + return ret; +}; + +/** + * Map jscoverage data for a single source file + * to a JSON structure suitable for reporting. + * + * @param {String} filename name of the source file + * @param {Object} data jscoverage coverage data + * @return {Object} + * @api private + */ + +function coverage(filename, data) { + var ret = { + filename: filename, + coverage: 0, + hits: 0, + misses: 0, + sloc: 0, + source: {} + }; + + data.source.forEach(function(line, num){ + num++; + + if (data[num] === 0) { + ret.misses++; + ret.sloc++; + } else if (data[num] !== undefined) { + ret.hits++; + ret.sloc++; + } + + ret.source[num] = { + source: line + , coverage: data[num] === undefined + ? '' + : data[num] + }; + }); + + ret.coverage = ret.hits / ret.sloc * 100; + + return ret; +} + +/** + * Return a plain-object representation of `test` + * free of cyclic properties etc. + * + * @param {Object} test + * @return {Object} + * @api private + */ + +function clean(test) { + return { + title: test.title + , fullTitle: test.fullTitle() + , duration: test.duration + } +} + +}); // module: reporters/json-cov.js + +require.register("reporters/json-stream.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var Base = require('./base') + , color = Base.color; + +/** + * Expose `List`. + */ + +exports = module.exports = List; + +/** + * Initialize a new `List` test reporter. + * + * @param {Runner} runner + * @api public + */ + +function List(runner) { + Base.call(this, runner); + + var self = this + , stats = this.stats + , total = runner.total; + + runner.on('start', function(){ + console.log(JSON.stringify(['start', { total: total }])); + }); + + runner.on('pass', function(test){ + console.log(JSON.stringify(['pass', clean(test)])); + }); + + runner.on('fail', function(test, err){ + console.log(JSON.stringify(['fail', clean(test)])); + }); + + runner.on('end', function(){ + process.stdout.write(JSON.stringify(['end', self.stats])); + }); +} + +/** + * Return a plain-object representation of `test` + * free of cyclic properties etc. + * + * @param {Object} test + * @return {Object} + * @api private + */ + +function clean(test) { + return { + title: test.title + , fullTitle: test.fullTitle() + , duration: test.duration + } +} +}); // module: reporters/json-stream.js + +require.register("reporters/json.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var Base = require('./base') + , cursor = Base.cursor + , color = Base.color; + +/** + * Expose `JSON`. + */ + +exports = module.exports = JSONReporter; + +/** + * Initialize a new `JSON` reporter. + * + * @param {Runner} runner + * @api public + */ + +function JSONReporter(runner) { + var self = this; + Base.call(this, runner); + + var tests = [] + , failures = [] + , passes = []; + + runner.on('test end', function(test){ + tests.push(test); + }); + + runner.on('pass', function(test){ + passes.push(test); + }); + + runner.on('fail', function(test){ + failures.push(test); + }); + + runner.on('end', function(){ + var obj = { + stats: self.stats + , tests: tests.map(clean) + , failures: failures.map(clean) + , passes: passes.map(clean) + }; + + process.stdout.write(JSON.stringify(obj, null, 2)); + }); +} + +/** + * Return a plain-object representation of `test` + * free of cyclic properties etc. + * + * @param {Object} test + * @return {Object} + * @api private + */ + +function clean(test) { + return { + title: test.title + , fullTitle: test.fullTitle() + , duration: test.duration + } +} +}); // module: reporters/json.js + +require.register("reporters/landing.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var Base = require('./base') + , cursor = Base.cursor + , color = Base.color; + +/** + * Expose `Landing`. + */ + +exports = module.exports = Landing; + +/** + * Airplane color. + */ + +Base.colors.plane = 0; + +/** + * Airplane crash color. + */ + +Base.colors['plane crash'] = 31; + +/** + * Runway color. + */ + +Base.colors.runway = 90; + +/** + * Initialize a new `Landing` reporter. + * + * @param {Runner} runner + * @api public + */ + +function Landing(runner) { + Base.call(this, runner); + + var self = this + , stats = this.stats + , width = Base.window.width * .75 | 0 + , total = runner.total + , stream = process.stdout + , plane = color('plane', '✈') + , crashed = -1 + , n = 0; + + function runway() { + var buf = Array(width).join('-'); + return ' ' + color('runway', buf); + } + + runner.on('start', function(){ + stream.write('\n '); + cursor.hide(); + }); + + runner.on('test end', function(test){ + // check if the plane crashed + var col = -1 == crashed + ? width * ++n / total | 0 + : crashed; + + // show the crash + if ('failed' == test.state) { + plane = color('plane crash', '✈'); + crashed = col; + } + + // render landing strip + stream.write('\u001b[4F\n\n'); + stream.write(runway()); + stream.write('\n '); + stream.write(color('runway', Array(col).join('⋅'))); + stream.write(plane) + stream.write(color('runway', Array(width - col).join('⋅') + '\n')); + stream.write(runway()); + stream.write('\u001b[0m'); + }); + + runner.on('end', function(){ + cursor.show(); + console.log(); + self.epilogue(); + }); +} + +/** + * Inherit from `Base.prototype`. + */ + +function F(){}; +F.prototype = Base.prototype; +Landing.prototype = new F; +Landing.prototype.constructor = Landing; + +}); // module: reporters/landing.js + +require.register("reporters/list.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var Base = require('./base') + , cursor = Base.cursor + , color = Base.color; + +/** + * Expose `List`. + */ + +exports = module.exports = List; + +/** + * Initialize a new `List` test reporter. + * + * @param {Runner} runner + * @api public + */ + +function List(runner) { + Base.call(this, runner); + + var self = this + , stats = this.stats + , n = 0; + + runner.on('start', function(){ + console.log(); + }); + + runner.on('test', function(test){ + process.stdout.write(color('pass', ' ' + test.fullTitle() + ': ')); + }); + + runner.on('pending', function(test){ + var fmt = color('checkmark', ' -') + + color('pending', ' %s'); + console.log(fmt, test.fullTitle()); + }); + + runner.on('pass', function(test){ + var fmt = color('checkmark', ' '+Base.symbols.dot) + + color('pass', ' %s: ') + + color(test.speed, '%dms'); + cursor.CR(); + console.log(fmt, test.fullTitle(), test.duration); + }); + + runner.on('fail', function(test, err){ + cursor.CR(); + console.log(color('fail', ' %d) %s'), ++n, test.fullTitle()); + }); + + runner.on('end', self.epilogue.bind(self)); +} + +/** + * Inherit from `Base.prototype`. + */ + +function F(){}; +F.prototype = Base.prototype; +List.prototype = new F; +List.prototype.constructor = List; + + +}); // module: reporters/list.js + +require.register("reporters/markdown.js", function(module, exports, require){ +/** + * Module dependencies. + */ + +var Base = require('./base') + , utils = require('../utils'); + +/** + * Expose `Markdown`. + */ + +exports = module.exports = Markdown; + +/** + * Initialize a new `Markdown` reporter. + * + * @param {Runner} runner + * @api public + */ + +function Markdown(runner) { + Base.call(this, runner); + + var self = this + , stats = this.stats + , level = 0 + , buf = ''; + + function title(str) { + return Array(level).join('#') + ' ' + str; + } + + function indent() { + return Array(level).join(' '); + } + + function mapTOC(suite, obj) { + var ret = obj; + obj = obj[suite.title] = obj[suite.title] || { suite: suite }; + suite.suites.forEach(function(suite){ + mapTOC(suite, obj); + }); + return ret; + } + + function stringifyTOC(obj, level) { + ++level; + var buf = ''; + var link; + for (var key in obj) { + if ('suite' == key) continue; + if (key) link = ' - [' + key + '](#' + utils.slug(obj[key].suite.fullTitle()) + ')\n'; + if (key) buf += Array(level).join(' ') + link; + buf += stringifyTOC(obj[key], level); + } + --level; + return buf; + } + + function generateTOC(suite) { + var obj = mapTOC(suite, {}); + return stringifyTOC(obj, 0); + } + + generateTOC(runner.suite); + + runner.on('suite', function(suite){ + ++level; + var slug = utils.slug(suite.fullTitle()); + buf += '' + '\n'; + buf += title(suite.title) + '\n'; + }); + + runner.on('suite end', function(suite){ + --level; + }); + + runner.on('pass', function(test){ + var code = utils.clean(test.fn.toString()); + buf += test.title + '.\n'; + buf += '\n```js\n'; + buf += code + '\n'; + buf += '```\n\n'; + }); + + runner.on('end', function(){ + process.stdout.write('# TOC\n'); + process.stdout.write(generateTOC(runner.suite)); + process.stdout.write(buf); + }); +} +}); // module: reporters/markdown.js + +require.register("reporters/min.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var Base = require('./base'); + +/** + * Expose `Min`. + */ + +exports = module.exports = Min; + +/** + * Initialize a new `Min` minimal test reporter (best used with --watch). + * + * @param {Runner} runner + * @api public + */ + +function Min(runner) { + Base.call(this, runner); + + runner.on('start', function(){ + // clear screen + process.stdout.write('\u001b[2J'); + // set cursor position + process.stdout.write('\u001b[1;3H'); + }); + + runner.on('end', this.epilogue.bind(this)); +} + +/** + * Inherit from `Base.prototype`. + */ + +function F(){}; +F.prototype = Base.prototype; +Min.prototype = new F; +Min.prototype.constructor = Min; + + +}); // module: reporters/min.js + +require.register("reporters/nyan.js", function(module, exports, require){ +/** + * Module dependencies. + */ + +var Base = require('./base') + , color = Base.color; + +/** + * Expose `Dot`. + */ + +exports = module.exports = NyanCat; + +/** + * Initialize a new `Dot` matrix test reporter. + * + * @param {Runner} runner + * @api public + */ + +function NyanCat(runner) { + Base.call(this, runner); + var self = this + , stats = this.stats + , width = Base.window.width * .75 | 0 + , rainbowColors = this.rainbowColors = self.generateColors() + , colorIndex = this.colorIndex = 0 + , numerOfLines = this.numberOfLines = 4 + , trajectories = this.trajectories = [[], [], [], []] + , nyanCatWidth = this.nyanCatWidth = 11 + , trajectoryWidthMax = this.trajectoryWidthMax = (width - nyanCatWidth) + , scoreboardWidth = this.scoreboardWidth = 5 + , tick = this.tick = 0 + , n = 0; + + runner.on('start', function(){ + Base.cursor.hide(); + self.draw(); + }); + + runner.on('pending', function(test){ + self.draw(); + }); + + runner.on('pass', function(test){ + self.draw(); + }); + + runner.on('fail', function(test, err){ + self.draw(); + }); + + runner.on('end', function(){ + Base.cursor.show(); + for (var i = 0; i < self.numberOfLines; i++) write('\n'); + self.epilogue(); + }); +} + +/** + * Draw the nyan cat + * + * @api private + */ + +NyanCat.prototype.draw = function(){ + this.appendRainbow(); + this.drawScoreboard(); + this.drawRainbow(); + this.drawNyanCat(); + this.tick = !this.tick; +}; + +/** + * Draw the "scoreboard" showing the number + * of passes, failures and pending tests. + * + * @api private + */ + +NyanCat.prototype.drawScoreboard = function(){ + var stats = this.stats; + var colors = Base.colors; + + function draw(color, n) { + write(' '); + write('\u001b[' + color + 'm' + n + '\u001b[0m'); + write('\n'); + } + + draw(colors.green, stats.passes); + draw(colors.fail, stats.failures); + draw(colors.pending, stats.pending); + write('\n'); + + this.cursorUp(this.numberOfLines); +}; + +/** + * Append the rainbow. + * + * @api private + */ + +NyanCat.prototype.appendRainbow = function(){ + var segment = this.tick ? '_' : '-'; + var rainbowified = this.rainbowify(segment); + + for (var index = 0; index < this.numberOfLines; index++) { + var trajectory = this.trajectories[index]; + if (trajectory.length >= this.trajectoryWidthMax) trajectory.shift(); + trajectory.push(rainbowified); + } +}; + +/** + * Draw the rainbow. + * + * @api private + */ + +NyanCat.prototype.drawRainbow = function(){ + var self = this; + + this.trajectories.forEach(function(line, index) { + write('\u001b[' + self.scoreboardWidth + 'C'); + write(line.join('')); + write('\n'); + }); + + this.cursorUp(this.numberOfLines); +}; + +/** + * Draw the nyan cat + * + * @api private + */ + +NyanCat.prototype.drawNyanCat = function() { + var self = this; + var startWidth = this.scoreboardWidth + this.trajectories[0].length; + var color = '\u001b[' + startWidth + 'C'; + var padding = ''; + + write(color); + write('_,------,'); + write('\n'); + + write(color); + padding = self.tick ? ' ' : ' '; + write('_|' + padding + '/\\_/\\ '); + write('\n'); + + write(color); + padding = self.tick ? '_' : '__'; + var tail = self.tick ? '~' : '^'; + var face; + write(tail + '|' + padding + this.face() + ' '); + write('\n'); + + write(color); + padding = self.tick ? ' ' : ' '; + write(padding + '"" "" '); + write('\n'); + + this.cursorUp(this.numberOfLines); +}; + +/** + * Draw nyan cat face. + * + * @return {String} + * @api private + */ + +NyanCat.prototype.face = function() { + var stats = this.stats; + if (stats.failures) { + return '( x .x)'; + } else if (stats.pending) { + return '( o .o)'; + } else if(stats.passes) { + return '( ^ .^)'; + } else { + return '( - .-)'; + } +} + +/** + * Move cursor up `n`. + * + * @param {Number} n + * @api private + */ + +NyanCat.prototype.cursorUp = function(n) { + write('\u001b[' + n + 'A'); +}; + +/** + * Move cursor down `n`. + * + * @param {Number} n + * @api private + */ + +NyanCat.prototype.cursorDown = function(n) { + write('\u001b[' + n + 'B'); +}; + +/** + * Generate rainbow colors. + * + * @return {Array} + * @api private + */ + +NyanCat.prototype.generateColors = function(){ + var colors = []; + + for (var i = 0; i < (6 * 7); i++) { + var pi3 = Math.floor(Math.PI / 3); + var n = (i * (1.0 / 6)); + var r = Math.floor(3 * Math.sin(n) + 3); + var g = Math.floor(3 * Math.sin(n + 2 * pi3) + 3); + var b = Math.floor(3 * Math.sin(n + 4 * pi3) + 3); + colors.push(36 * r + 6 * g + b + 16); + } + + return colors; +}; + +/** + * Apply rainbow to the given `str`. + * + * @param {String} str + * @return {String} + * @api private + */ + +NyanCat.prototype.rainbowify = function(str){ + var color = this.rainbowColors[this.colorIndex % this.rainbowColors.length]; + this.colorIndex += 1; + return '\u001b[38;5;' + color + 'm' + str + '\u001b[0m'; +}; + +/** + * Stdout helper. + */ + +function write(string) { + process.stdout.write(string); +} + +/** + * Inherit from `Base.prototype`. + */ + +function F(){}; +F.prototype = Base.prototype; +NyanCat.prototype = new F; +NyanCat.prototype.constructor = NyanCat; + + +}); // module: reporters/nyan.js + +require.register("reporters/progress.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var Base = require('./base') + , cursor = Base.cursor + , color = Base.color; + +/** + * Expose `Progress`. + */ + +exports = module.exports = Progress; + +/** + * General progress bar color. + */ + +Base.colors.progress = 90; + +/** + * Initialize a new `Progress` bar test reporter. + * + * @param {Runner} runner + * @param {Object} options + * @api public + */ + +function Progress(runner, options) { + Base.call(this, runner); + + var self = this + , options = options || {} + , stats = this.stats + , width = Base.window.width * .50 | 0 + , total = runner.total + , complete = 0 + , max = Math.max; + + // default chars + options.open = options.open || '['; + options.complete = options.complete || '▬'; + options.incomplete = options.incomplete || Base.symbols.dot; + options.close = options.close || ']'; + options.verbose = false; + + // tests started + runner.on('start', function(){ + console.log(); + cursor.hide(); + }); + + // tests complete + runner.on('test end', function(){ + complete++; + var incomplete = total - complete + , percent = complete / total + , n = width * percent | 0 + , i = width - n; + + cursor.CR(); + process.stdout.write('\u001b[J'); + process.stdout.write(color('progress', ' ' + options.open)); + process.stdout.write(Array(n).join(options.complete)); + process.stdout.write(Array(i).join(options.incomplete)); + process.stdout.write(color('progress', options.close)); + if (options.verbose) { + process.stdout.write(color('progress', ' ' + complete + ' of ' + total)); + } + }); + + // tests are complete, output some stats + // and the failures if any + runner.on('end', function(){ + cursor.show(); + console.log(); + self.epilogue(); + }); +} + +/** + * Inherit from `Base.prototype`. + */ + +function F(){}; +F.prototype = Base.prototype; +Progress.prototype = new F; +Progress.prototype.constructor = Progress; + + +}); // module: reporters/progress.js + +require.register("reporters/spec.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var Base = require('./base') + , cursor = Base.cursor + , color = Base.color; + +/** + * Expose `Spec`. + */ + +exports = module.exports = Spec; + +/** + * Initialize a new `Spec` test reporter. + * + * @param {Runner} runner + * @api public + */ + +function Spec(runner) { + Base.call(this, runner); + + var self = this + , stats = this.stats + , indents = 0 + , n = 0; + + function indent() { + return Array(indents).join(' ') + } + + runner.on('start', function(){ + console.log(); + }); + + runner.on('suite', function(suite){ + ++indents; + console.log(color('suite', '%s%s'), indent(), suite.title); + }); + + runner.on('suite end', function(suite){ + --indents; + if (1 == indents) console.log(); + }); + + runner.on('pending', function(test){ + var fmt = indent() + color('pending', ' - %s'); + console.log(fmt, test.title); + }); + + runner.on('pass', function(test){ + if ('fast' == test.speed) { + var fmt = indent() + + color('checkmark', ' ' + Base.symbols.ok) + + color('pass', ' %s '); + cursor.CR(); + console.log(fmt, test.title); + } else { + var fmt = indent() + + color('checkmark', ' ' + Base.symbols.ok) + + color('pass', ' %s ') + + color(test.speed, '(%dms)'); + cursor.CR(); + console.log(fmt, test.title, test.duration); + } + }); + + runner.on('fail', function(test, err){ + cursor.CR(); + console.log(indent() + color('fail', ' %d) %s'), ++n, test.title); + }); + + runner.on('end', self.epilogue.bind(self)); +} + +/** + * Inherit from `Base.prototype`. + */ + +function F(){}; +F.prototype = Base.prototype; +Spec.prototype = new F; +Spec.prototype.constructor = Spec; + + +}); // module: reporters/spec.js + +require.register("reporters/tap.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var Base = require('./base') + , cursor = Base.cursor + , color = Base.color; + +/** + * Expose `TAP`. + */ + +exports = module.exports = TAP; + +/** + * Initialize a new `TAP` reporter. + * + * @param {Runner} runner + * @api public + */ + +function TAP(runner) { + Base.call(this, runner); + + var self = this + , stats = this.stats + , n = 1 + , passes = 0 + , failures = 0; + + runner.on('start', function(){ + var total = runner.grepTotal(runner.suite); + console.log('%d..%d', 1, total); + }); + + runner.on('test end', function(){ + ++n; + }); + + runner.on('pending', function(test){ + console.log('ok %d %s # SKIP -', n, title(test)); + }); + + runner.on('pass', function(test){ + passes++; + console.log('ok %d %s', n, title(test)); + }); + + runner.on('fail', function(test, err){ + failures++; + console.log('not ok %d %s', n, title(test)); + if (err.stack) console.log(err.stack.replace(/^/gm, ' ')); + }); + + runner.on('end', function(){ + console.log('# tests ' + (passes + failures)); + console.log('# pass ' + passes); + console.log('# fail ' + failures); + }); +} + +/** + * Return a TAP-safe title of `test` + * + * @param {Object} test + * @return {String} + * @api private + */ + +function title(test) { + return test.fullTitle().replace(/#/g, ''); +} + +}); // module: reporters/tap.js + +require.register("reporters/xunit.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var Base = require('./base') + , utils = require('../utils') + , escape = utils.escape; + +/** + * Save timer references to avoid Sinon interfering (see GH-237). + */ + +var Date = global.Date + , setTimeout = global.setTimeout + , setInterval = global.setInterval + , clearTimeout = global.clearTimeout + , clearInterval = global.clearInterval; + +/** + * Expose `XUnit`. + */ + +exports = module.exports = XUnit; + +/** + * Initialize a new `XUnit` reporter. + * + * @param {Runner} runner + * @api public + */ + +function XUnit(runner) { + Base.call(this, runner); + var stats = this.stats + , tests = [] + , self = this; + + runner.on('pending', function(test){ + tests.push(test); + }); + + runner.on('pass', function(test){ + tests.push(test); + }); + + runner.on('fail', function(test){ + tests.push(test); + }); + + runner.on('end', function(){ + console.log(tag('testsuite', { + name: 'Mocha Tests' + , tests: stats.tests + , failures: stats.failures + , errors: stats.failures + , skipped: stats.tests - stats.failures - stats.passes + , timestamp: (new Date).toUTCString() + , time: (stats.duration / 1000) || 0 + }, false)); + + tests.forEach(test); + console.log(''); + }); +} + +/** + * Inherit from `Base.prototype`. + */ + +function F(){}; +F.prototype = Base.prototype; +XUnit.prototype = new F; +XUnit.prototype.constructor = XUnit; + + +/** + * Output tag for the given `test.` + */ + +function test(test) { + var attrs = { + classname: test.parent.fullTitle() + , name: test.title + , time: (test.duration / 1000) || 0 + }; + + if ('failed' == test.state) { + var err = test.err; + attrs.message = escape(err.message); + console.log(tag('testcase', attrs, false, tag('failure', attrs, false, cdata(err.stack)))); + } else if (test.pending) { + console.log(tag('testcase', attrs, false, tag('skipped', {}, true))); + } else { + console.log(tag('testcase', attrs, true) ); + } +} + +/** + * HTML tag helper. + */ + +function tag(name, attrs, close, content) { + var end = close ? '/>' : '>' + , pairs = [] + , tag; + + for (var key in attrs) { + pairs.push(key + '="' + escape(attrs[key]) + '"'); + } + + tag = '<' + name + (pairs.length ? ' ' + pairs.join(' ') : '') + end; + if (content) tag += content + ''; +} + +}); // module: reporters/xunit.js + +require.register("runnable.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var EventEmitter = require('browser/events').EventEmitter + , debug = require('browser/debug')('mocha:runnable') + , milliseconds = require('./ms'); + +/** + * Save timer references to avoid Sinon interfering (see GH-237). + */ + +var Date = global.Date + , setTimeout = global.setTimeout + , setInterval = global.setInterval + , clearTimeout = global.clearTimeout + , clearInterval = global.clearInterval; + +/** + * Object#toString(). + */ + +var toString = Object.prototype.toString; + +/** + * Expose `Runnable`. + */ + +module.exports = Runnable; + +/** + * Initialize a new `Runnable` with the given `title` and callback `fn`. + * + * @param {String} title + * @param {Function} fn + * @api private + */ + +function Runnable(title, fn) { + this.title = title; + this.fn = fn; + this.async = fn && fn.length; + this.sync = ! this.async; + this._timeout = 2000; + this._slow = 75; + this.timedOut = false; +} + +/** + * Inherit from `EventEmitter.prototype`. + */ + +function F(){}; +F.prototype = EventEmitter.prototype; +Runnable.prototype = new F; +Runnable.prototype.constructor = Runnable; + + +/** + * Set & get timeout `ms`. + * + * @param {Number|String} ms + * @return {Runnable|Number} ms or self + * @api private + */ + +Runnable.prototype.timeout = function(ms){ + if (0 == arguments.length) return this._timeout; + if ('string' == typeof ms) ms = milliseconds(ms); + debug('timeout %d', ms); + this._timeout = ms; + if (this.timer) this.resetTimeout(); + return this; +}; + +/** + * Set & get slow `ms`. + * + * @param {Number|String} ms + * @return {Runnable|Number} ms or self + * @api private + */ + +Runnable.prototype.slow = function(ms){ + if (0 === arguments.length) return this._slow; + if ('string' == typeof ms) ms = milliseconds(ms); + debug('timeout %d', ms); + this._slow = ms; + return this; +}; + +/** + * Return the full title generated by recursively + * concatenating the parent's full title. + * + * @return {String} + * @api public + */ + +Runnable.prototype.fullTitle = function(){ + return this.parent.fullTitle() + ' ' + this.title; +}; + +/** + * Clear the timeout. + * + * @api private + */ + +Runnable.prototype.clearTimeout = function(){ + clearTimeout(this.timer); +}; + +/** + * Inspect the runnable void of private properties. + * + * @return {String} + * @api private + */ + +Runnable.prototype.inspect = function(){ + return JSON.stringify(this, function(key, val){ + if ('_' == key[0]) return; + if ('parent' == key) return '#'; + if ('ctx' == key) return '#'; + return val; + }, 2); +}; + +/** + * Reset the timeout. + * + * @api private + */ + +Runnable.prototype.resetTimeout = function(){ + var self = this; + var ms = this.timeout() || 1e9; + + this.clearTimeout(); + this.timer = setTimeout(function(){ + self.callback(new Error('timeout of ' + ms + 'ms exceeded')); + self.timedOut = true; + }, ms); +}; + +/** + * Whitelist these globals for this test run + * + * @api private + */ +Runnable.prototype.globals = function(arr){ + var self = this; + this._allowedGlobals = arr; +}; + +/** + * Run the test and invoke `fn(err)`. + * + * @param {Function} fn + * @api private + */ + +Runnable.prototype.run = function(fn){ + var self = this + , ms = this.timeout() + , start = new Date + , ctx = this.ctx + , finished + , emitted; + + if (ctx) ctx.runnable(this); + + // timeout + if (this.async) { + if (ms) { + this.timer = setTimeout(function(){ + done(new Error('timeout of ' + ms + 'ms exceeded')); + self.timedOut = true; + }, ms); + } + } + + // called multiple times + function multiple(err) { + if (emitted) return; + emitted = true; + self.emit('error', err || new Error('done() called multiple times')); + } + + // finished + function done(err) { + if (self.timedOut) return; + if (finished) return multiple(err); + self.clearTimeout(); + self.duration = new Date - start; + finished = true; + fn(err); + } + + // for .resetTimeout() + this.callback = done; + + // async + if (this.async) { + try { + this.fn.call(ctx, function(err){ + if (err instanceof Error || toString.call(err) === "[object Error]") return done(err); + if (null != err) return done(new Error('done() invoked with non-Error: ' + err)); + done(); + }); + } catch (err) { + done(err); + } + return; + } + + if (this.asyncOnly) { + return done(new Error('--async-only option in use without declaring `done()`')); + } + + // sync + try { + if (!this.pending) this.fn.call(ctx); + this.duration = new Date - start; + fn(); + } catch (err) { + fn(err); + } +}; + +}); // module: runnable.js + +require.register("runner.js", function(module, exports, require){ +/** + * Module dependencies. + */ + +var EventEmitter = require('browser/events').EventEmitter + , debug = require('browser/debug')('mocha:runner') + , Test = require('./test') + , utils = require('./utils') + , filter = utils.filter + , keys = utils.keys; + +/** + * Non-enumerable globals. + */ + +var globals = [ + 'setTimeout', + 'clearTimeout', + 'setInterval', + 'clearInterval', + 'XMLHttpRequest', + 'Date' +]; + +/** + * Expose `Runner`. + */ + +module.exports = Runner; + +/** + * Initialize a `Runner` for the given `suite`. + * + * Events: + * + * - `start` execution started + * - `end` execution complete + * - `suite` (suite) test suite execution started + * - `suite end` (suite) all tests (and sub-suites) have finished + * - `test` (test) test execution started + * - `test end` (test) test completed + * - `hook` (hook) hook execution started + * - `hook end` (hook) hook complete + * - `pass` (test) test passed + * - `fail` (test, err) test failed + * - `pending` (test) test pending + * + * @api public + */ + +function Runner(suite) { + var self = this; + this._globals = []; + this._abort = false; + this.suite = suite; + this.total = suite.total(); + this.failures = 0; + this.on('test end', function(test){ self.checkGlobals(test); }); + this.on('hook end', function(hook){ self.checkGlobals(hook); }); + this.grep(/.*/); + this.globals(this.globalProps().concat(extraGlobals())); +} + +/** + * Wrapper for setImmediate, process.nextTick, or browser polyfill. + * + * @param {Function} fn + * @api private + */ + +Runner.immediately = global.setImmediate || process.nextTick; + +/** + * Inherit from `EventEmitter.prototype`. + */ + +function F(){}; +F.prototype = EventEmitter.prototype; +Runner.prototype = new F; +Runner.prototype.constructor = Runner; + + +/** + * Run tests with full titles matching `re`. Updates runner.total + * with number of tests matched. + * + * @param {RegExp} re + * @param {Boolean} invert + * @return {Runner} for chaining + * @api public + */ + +Runner.prototype.grep = function(re, invert){ + debug('grep %s', re); + this._grep = re; + this._invert = invert; + this.total = this.grepTotal(this.suite); + return this; +}; + +/** + * Returns the number of tests matching the grep search for the + * given suite. + * + * @param {Suite} suite + * @return {Number} + * @api public + */ + +Runner.prototype.grepTotal = function(suite) { + var self = this; + var total = 0; + + suite.eachTest(function(test){ + var match = self._grep.test(test.fullTitle()); + if (self._invert) match = !match; + if (match) total++; + }); + + return total; +}; + +/** + * Return a list of global properties. + * + * @return {Array} + * @api private + */ + +Runner.prototype.globalProps = function() { + var props = utils.keys(global); + + // non-enumerables + for (var i = 0; i < globals.length; ++i) { + if (~utils.indexOf(props, globals[i])) continue; + props.push(globals[i]); + } + + return props; +}; + +/** + * Allow the given `arr` of globals. + * + * @param {Array} arr + * @return {Runner} for chaining + * @api public + */ + +Runner.prototype.globals = function(arr){ + if (0 == arguments.length) return this._globals; + debug('globals %j', arr); + this._globals = this._globals.concat(arr); + return this; +}; + +/** + * Check for global variable leaks. + * + * @api private + */ + +Runner.prototype.checkGlobals = function(test){ + if (this.ignoreLeaks) return; + var ok = this._globals; + + var globals = this.globalProps(); + var isNode = process.kill; + var leaks; + + if (test) { + ok = ok.concat(test._allowedGlobals || []); + } + + if(this.prevGlobalsLength == globals.length) return; + this.prevGlobalsLength = globals.length; + + leaks = filterLeaks(ok, globals); + this._globals = this._globals.concat(leaks); + + if (leaks.length > 1) { + this.fail(test, new Error('global leaks detected: ' + leaks.join(', ') + '')); + } else if (leaks.length) { + this.fail(test, new Error('global leak detected: ' + leaks[0])); + } +}; + +/** + * Fail the given `test`. + * + * @param {Test} test + * @param {Error} err + * @api private + */ + +Runner.prototype.fail = function(test, err){ + ++this.failures; + test.state = 'failed'; + + if ('string' == typeof err) { + err = new Error('the string "' + err + '" was thrown, throw an Error :)'); + } + + this.emit('fail', test, err); +}; + +/** + * Fail the given `hook` with `err`. + * + * Hook failures work in the following pattern: + * - If bail, then exit + * - Failed `before` hook skips all tests in a suite and subsuites, + * but jumps to corresponding `after` hook + * - Failed `before each` hook skips remaining tests in a + * suite and jumps to corresponding `after each` hook, + * which is run only once + * - Failed `after` hook does not alter + * execution order + * - Failed `after each` hook skips remaining tests in a + * suite and subsuites, but executes other `after each` + * hooks + * + * @param {Hook} hook + * @param {Error} err + * @api private + */ + +Runner.prototype.failHook = function(hook, err){ + this.fail(hook, err); + if (this.suite.bail()) { + this.emit('end'); + } +}; + +/** + * Run hook `name` callbacks and then invoke `fn()`. + * + * @param {String} name + * @param {Function} function + * @api private + */ + +Runner.prototype.hook = function(name, fn){ + var suite = this.suite + , hooks = suite['_' + name] + , self = this + , timer; + + function next(i) { + var hook = hooks[i]; + if (!hook) return fn(); + if (self.failures && suite.bail()) return fn(); + self.currentRunnable = hook; + + hook.ctx.currentTest = self.test; + + self.emit('hook', hook); + + hook.on('error', function(err){ + self.failHook(hook, err); + }); + + hook.run(function(err){ + hook.removeAllListeners('error'); + var testError = hook.error(); + if (testError) self.fail(self.test, testError); + if (err) { + self.failHook(hook, err); + + // stop executing hooks, notify callee of hook err + return fn(err); + } + self.emit('hook end', hook); + delete hook.ctx.currentTest; + next(++i); + }); + } + + Runner.immediately(function(){ + next(0); + }); +}; + +/** + * Run hook `name` for the given array of `suites` + * in order, and callback `fn(err, errSuite)`. + * + * @param {String} name + * @param {Array} suites + * @param {Function} fn + * @api private + */ + +Runner.prototype.hooks = function(name, suites, fn){ + var self = this + , orig = this.suite; + + function next(suite) { + self.suite = suite; + + if (!suite) { + self.suite = orig; + return fn(); + } + + self.hook(name, function(err){ + if (err) { + var errSuite = self.suite; + self.suite = orig; + return fn(err, errSuite); + } + + next(suites.pop()); + }); + } + + next(suites.pop()); +}; + +/** + * Run hooks from the top level down. + * + * @param {String} name + * @param {Function} fn + * @api private + */ + +Runner.prototype.hookUp = function(name, fn){ + var suites = [this.suite].concat(this.parents()).reverse(); + this.hooks(name, suites, fn); +}; + +/** + * Run hooks from the bottom up. + * + * @param {String} name + * @param {Function} fn + * @api private + */ + +Runner.prototype.hookDown = function(name, fn){ + var suites = [this.suite].concat(this.parents()); + this.hooks(name, suites, fn); +}; + +/** + * Return an array of parent Suites from + * closest to furthest. + * + * @return {Array} + * @api private + */ + +Runner.prototype.parents = function(){ + var suite = this.suite + , suites = []; + while (suite = suite.parent) suites.push(suite); + return suites; +}; + +/** + * Run the current test and callback `fn(err)`. + * + * @param {Function} fn + * @api private + */ + +Runner.prototype.runTest = function(fn){ + var test = this.test + , self = this; + + if (this.asyncOnly) test.asyncOnly = true; + + try { + test.on('error', function(err){ + self.fail(test, err); + }); + test.run(fn); + } catch (err) { + fn(err); + } +}; + +/** + * Run tests in the given `suite` and invoke + * the callback `fn()` when complete. + * + * @param {Suite} suite + * @param {Function} fn + * @api private + */ + +Runner.prototype.runTests = function(suite, fn){ + var self = this + , tests = suite.tests.slice() + , test; + + + function hookErr(err, errSuite, after) { + // before/after Each hook for errSuite failed: + var orig = self.suite; + + // for failed 'after each' hook start from errSuite parent, + // otherwise start from errSuite itself + self.suite = after ? errSuite.parent : errSuite; + + if (self.suite) { + // call hookUp afterEach + self.hookUp('afterEach', function(err2, errSuite2) { + self.suite = orig; + // some hooks may fail even now + if (err2) return hookErr(err2, errSuite2, true); + // report error suite + fn(errSuite); + }); + } else { + // there is no need calling other 'after each' hooks + self.suite = orig; + fn(errSuite); + } + } + + function next(err, errSuite) { + // if we bail after first err + if (self.failures && suite._bail) return fn(); + + if (self._abort) return fn(); + + if (err) return hookErr(err, errSuite, true); + + // next test + test = tests.shift(); + + // all done + if (!test) return fn(); + + // grep + var match = self._grep.test(test.fullTitle()); + if (self._invert) match = !match; + if (!match) return next(); + + // pending + if (test.pending) { + self.emit('pending', test); + self.emit('test end', test); + return next(); + } + + // execute test and hook(s) + self.emit('test', self.test = test); + self.hookDown('beforeEach', function(err, errSuite){ + + if (err) return hookErr(err, errSuite, false); + + self.currentRunnable = self.test; + self.runTest(function(err){ + test = self.test; + + if (err) { + self.fail(test, err); + self.emit('test end', test); + return self.hookUp('afterEach', next); + } + + test.state = 'passed'; + self.emit('pass', test); + self.emit('test end', test); + self.hookUp('afterEach', next); + }); + }); + } + + this.next = next; + next(); +}; + +/** + * Run the given `suite` and invoke the + * callback `fn()` when complete. + * + * @param {Suite} suite + * @param {Function} fn + * @api private + */ + +Runner.prototype.runSuite = function(suite, fn){ + var total = this.grepTotal(suite) + , self = this + , i = 0; + + debug('run suite %s', suite.fullTitle()); + + if (!total) return fn(); + + this.emit('suite', this.suite = suite); + + function next(errSuite) { + if (errSuite) { + // current suite failed on a hook from errSuite + if (errSuite == suite) { + // if errSuite is current suite + // continue to the next sibling suite + return done(); + } else { + // errSuite is among the parents of current suite + // stop execution of errSuite and all sub-suites + return done(errSuite); + } + } + + if (self._abort) return done(); + + var curr = suite.suites[i++]; + if (!curr) return done(); + self.runSuite(curr, next); + } + + function done(errSuite) { + self.suite = suite; + self.hook('afterAll', function(){ + self.emit('suite end', suite); + fn(errSuite); + }); + } + + this.hook('beforeAll', function(err){ + if (err) return done(); + self.runTests(suite, next); + }); +}; + +/** + * Handle uncaught exceptions. + * + * @param {Error} err + * @api private + */ + +Runner.prototype.uncaught = function(err){ + debug('uncaught exception %s', err.message); + var runnable = this.currentRunnable; + if (!runnable || 'failed' == runnable.state) return; + runnable.clearTimeout(); + err.uncaught = true; + this.fail(runnable, err); + + // recover from test + if ('test' == runnable.type) { + this.emit('test end', runnable); + this.hookUp('afterEach', this.next); + return; + } + + // bail on hooks + this.emit('end'); +}; + +/** + * Run the root suite and invoke `fn(failures)` + * on completion. + * + * @param {Function} fn + * @return {Runner} for chaining + * @api public + */ + +Runner.prototype.run = function(fn){ + var self = this + , fn = fn || function(){}; + + function uncaught(err){ + self.uncaught(err); + } + + debug('start'); + + // callback + this.on('end', function(){ + debug('end'); + process.removeListener('uncaughtException', uncaught); + fn(self.failures); + }); + + // run suites + this.emit('start'); + this.runSuite(this.suite, function(){ + debug('finished running'); + self.emit('end'); + }); + + // uncaught exception + process.on('uncaughtException', uncaught); + + return this; +}; + +/** + * Cleanly abort execution + * + * @return {Runner} for chaining + * @api public + */ +Runner.prototype.abort = function(){ + debug('aborting'); + this._abort = true; +} + +/** + * Filter leaks with the given globals flagged as `ok`. + * + * @param {Array} ok + * @param {Array} globals + * @return {Array} + * @api private + */ + +function filterLeaks(ok, globals) { + return filter(globals, function(key){ + // Firefox and Chrome exposes iframes as index inside the window object + if (/^d+/.test(key)) return false; + + // in firefox + // if runner runs in an iframe, this iframe's window.getInterface method not init at first + // it is assigned in some seconds + if (global.navigator && /^getInterface/.test(key)) return false; + + // an iframe could be approached by window[iframeIndex] + // in ie6,7,8 and opera, iframeIndex is enumerable, this could cause leak + if (global.navigator && /^\d+/.test(key)) return false; + + // Opera and IE expose global variables for HTML element IDs (issue #243) + if (/^mocha-/.test(key)) return false; + + var matched = filter(ok, function(ok){ + if (~ok.indexOf('*')) return 0 == key.indexOf(ok.split('*')[0]); + return key == ok; + }); + return matched.length == 0 && (!global.navigator || 'onerror' !== key); + }); +} + +/** + * Array of globals dependent on the environment. + * + * @return {Array} + * @api private + */ + + function extraGlobals() { + if (typeof(process) === 'object' && + typeof(process.version) === 'string') { + + var nodeVersion = process.version.split('.').reduce(function(a, v) { + return a << 8 | v; + }); + + // 'errno' was renamed to process._errno in v0.9.11. + + if (nodeVersion < 0x00090B) { + return ['errno']; + } + } + + return []; + } + +}); // module: runner.js + +require.register("suite.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var EventEmitter = require('browser/events').EventEmitter + , debug = require('browser/debug')('mocha:suite') + , milliseconds = require('./ms') + , utils = require('./utils') + , Hook = require('./hook'); + +/** + * Expose `Suite`. + */ + +exports = module.exports = Suite; + +/** + * Create a new `Suite` with the given `title` + * and parent `Suite`. When a suite with the + * same title is already present, that suite + * is returned to provide nicer reporter + * and more flexible meta-testing. + * + * @param {Suite} parent + * @param {String} title + * @return {Suite} + * @api public + */ + +exports.create = function(parent, title){ + var suite = new Suite(title, parent.ctx); + suite.parent = parent; + if (parent.pending) suite.pending = true; + title = suite.fullTitle(); + parent.addSuite(suite); + return suite; +}; + +/** + * Initialize a new `Suite` with the given + * `title` and `ctx`. + * + * @param {String} title + * @param {Context} ctx + * @api private + */ + +function Suite(title, ctx) { + this.title = title; + this.ctx = ctx; + this.suites = []; + this.tests = []; + this.pending = false; + this._beforeEach = []; + this._beforeAll = []; + this._afterEach = []; + this._afterAll = []; + this.root = !title; + this._timeout = 2000; + this._slow = 75; + this._bail = false; +} + +/** + * Inherit from `EventEmitter.prototype`. + */ + +function F(){}; +F.prototype = EventEmitter.prototype; +Suite.prototype = new F; +Suite.prototype.constructor = Suite; + + +/** + * Return a clone of this `Suite`. + * + * @return {Suite} + * @api private + */ + +Suite.prototype.clone = function(){ + var suite = new Suite(this.title); + debug('clone'); + suite.ctx = this.ctx; + suite.timeout(this.timeout()); + suite.slow(this.slow()); + suite.bail(this.bail()); + return suite; +}; + +/** + * Set timeout `ms` or short-hand such as "2s". + * + * @param {Number|String} ms + * @return {Suite|Number} for chaining + * @api private + */ + +Suite.prototype.timeout = function(ms){ + if (0 == arguments.length) return this._timeout; + if ('string' == typeof ms) ms = milliseconds(ms); + debug('timeout %d', ms); + this._timeout = parseInt(ms, 10); + return this; +}; + +/** + * Set slow `ms` or short-hand such as "2s". + * + * @param {Number|String} ms + * @return {Suite|Number} for chaining + * @api private + */ + +Suite.prototype.slow = function(ms){ + if (0 === arguments.length) return this._slow; + if ('string' == typeof ms) ms = milliseconds(ms); + debug('slow %d', ms); + this._slow = ms; + return this; +}; + +/** + * Sets whether to bail after first error. + * + * @parma {Boolean} bail + * @return {Suite|Number} for chaining + * @api private + */ + +Suite.prototype.bail = function(bail){ + if (0 == arguments.length) return this._bail; + debug('bail %s', bail); + this._bail = bail; + return this; +}; + +/** + * Run `fn(test[, done])` before running tests. + * + * @param {Function} fn + * @return {Suite} for chaining + * @api private + */ + +Suite.prototype.beforeAll = function(fn){ + if (this.pending) return this; + var hook = new Hook('"before all" hook', fn); + hook.parent = this; + hook.timeout(this.timeout()); + hook.slow(this.slow()); + hook.ctx = this.ctx; + this._beforeAll.push(hook); + this.emit('beforeAll', hook); + return this; +}; + +/** + * Run `fn(test[, done])` after running tests. + * + * @param {Function} fn + * @return {Suite} for chaining + * @api private + */ + +Suite.prototype.afterAll = function(fn){ + if (this.pending) return this; + var hook = new Hook('"after all" hook', fn); + hook.parent = this; + hook.timeout(this.timeout()); + hook.slow(this.slow()); + hook.ctx = this.ctx; + this._afterAll.push(hook); + this.emit('afterAll', hook); + return this; +}; + +/** + * Run `fn(test[, done])` before each test case. + * + * @param {Function} fn + * @return {Suite} for chaining + * @api private + */ + +Suite.prototype.beforeEach = function(fn){ + if (this.pending) return this; + var hook = new Hook('"before each" hook', fn); + hook.parent = this; + hook.timeout(this.timeout()); + hook.slow(this.slow()); + hook.ctx = this.ctx; + this._beforeEach.push(hook); + this.emit('beforeEach', hook); + return this; +}; + +/** + * Run `fn(test[, done])` after each test case. + * + * @param {Function} fn + * @return {Suite} for chaining + * @api private + */ + +Suite.prototype.afterEach = function(fn){ + if (this.pending) return this; + var hook = new Hook('"after each" hook', fn); + hook.parent = this; + hook.timeout(this.timeout()); + hook.slow(this.slow()); + hook.ctx = this.ctx; + this._afterEach.push(hook); + this.emit('afterEach', hook); + return this; +}; + +/** + * Add a test `suite`. + * + * @param {Suite} suite + * @return {Suite} for chaining + * @api private + */ + +Suite.prototype.addSuite = function(suite){ + suite.parent = this; + suite.timeout(this.timeout()); + suite.slow(this.slow()); + suite.bail(this.bail()); + this.suites.push(suite); + this.emit('suite', suite); + return this; +}; + +/** + * Add a `test` to this suite. + * + * @param {Test} test + * @return {Suite} for chaining + * @api private + */ + +Suite.prototype.addTest = function(test){ + test.parent = this; + test.timeout(this.timeout()); + test.slow(this.slow()); + test.ctx = this.ctx; + this.tests.push(test); + this.emit('test', test); + return this; +}; + +/** + * Return the full title generated by recursively + * concatenating the parent's full title. + * + * @return {String} + * @api public + */ + +Suite.prototype.fullTitle = function(){ + if (this.parent) { + var full = this.parent.fullTitle(); + if (full) return full + ' ' + this.title; + } + return this.title; +}; + +/** + * Return the total number of tests. + * + * @return {Number} + * @api public + */ + +Suite.prototype.total = function(){ + return utils.reduce(this.suites, function(sum, suite){ + return sum + suite.total(); + }, 0) + this.tests.length; +}; + +/** + * Iterates through each suite recursively to find + * all tests. Applies a function in the format + * `fn(test)`. + * + * @param {Function} fn + * @return {Suite} + * @api private + */ + +Suite.prototype.eachTest = function(fn){ + utils.forEach(this.tests, fn); + utils.forEach(this.suites, function(suite){ + suite.eachTest(fn); + }); + return this; +}; + +}); // module: suite.js + +require.register("test.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var Runnable = require('./runnable'); + +/** + * Expose `Test`. + */ + +module.exports = Test; + +/** + * Initialize a new `Test` with the given `title` and callback `fn`. + * + * @param {String} title + * @param {Function} fn + * @api private + */ + +function Test(title, fn) { + Runnable.call(this, title, fn); + this.pending = !fn; + this.type = 'test'; +} + +/** + * Inherit from `Runnable.prototype`. + */ + +function F(){}; +F.prototype = Runnable.prototype; +Test.prototype = new F; +Test.prototype.constructor = Test; + + +}); // module: test.js + +require.register("utils.js", function(module, exports, require){ +/** + * Module dependencies. + */ + +var fs = require('browser/fs') + , path = require('browser/path') + , join = path.join + , debug = require('browser/debug')('mocha:watch'); + +/** + * Ignored directories. + */ + +var ignore = ['node_modules', '.git']; + +/** + * Escape special characters in the given string of html. + * + * @param {String} html + * @return {String} + * @api private + */ + +exports.escape = function(html){ + return String(html) + .replace(/&/g, '&') + .replace(/"/g, '"') + .replace(//g, '>'); +}; + +/** + * Array#forEach (<=IE8) + * + * @param {Array} array + * @param {Function} fn + * @param {Object} scope + * @api private + */ + +exports.forEach = function(arr, fn, scope){ + for (var i = 0, l = arr.length; i < l; i++) + fn.call(scope, arr[i], i); +}; + +/** + * Array#map (<=IE8) + * + * @param {Array} array + * @param {Function} fn + * @param {Object} scope + * @api private + */ + +exports.map = function(arr, fn, scope){ + var result = []; + for (var i = 0, l = arr.length; i < l; i++) + result.push(fn.call(scope, arr[i], i)); + return result; +}; + +/** + * Array#indexOf (<=IE8) + * + * @parma {Array} arr + * @param {Object} obj to find index of + * @param {Number} start + * @api private + */ + +exports.indexOf = function(arr, obj, start){ + for (var i = start || 0, l = arr.length; i < l; i++) { + if (arr[i] === obj) + return i; + } + return -1; +}; + +/** + * Array#reduce (<=IE8) + * + * @param {Array} array + * @param {Function} fn + * @param {Object} initial value + * @api private + */ + +exports.reduce = function(arr, fn, val){ + var rval = val; + + for (var i = 0, l = arr.length; i < l; i++) { + rval = fn(rval, arr[i], i, arr); + } + + return rval; +}; + +/** + * Array#filter (<=IE8) + * + * @param {Array} array + * @param {Function} fn + * @api private + */ + +exports.filter = function(arr, fn){ + var ret = []; + + for (var i = 0, l = arr.length; i < l; i++) { + var val = arr[i]; + if (fn(val, i, arr)) ret.push(val); + } + + return ret; +}; + +/** + * Object.keys (<=IE8) + * + * @param {Object} obj + * @return {Array} keys + * @api private + */ + +exports.keys = Object.keys || function(obj) { + var keys = [] + , has = Object.prototype.hasOwnProperty // for `window` on <=IE8 + + for (var key in obj) { + if (has.call(obj, key)) { + keys.push(key); + } + } + + return keys; +}; + +/** + * Watch the given `files` for changes + * and invoke `fn(file)` on modification. + * + * @param {Array} files + * @param {Function} fn + * @api private + */ + +exports.watch = function(files, fn){ + var options = { interval: 100 }; + files.forEach(function(file){ + debug('file %s', file); + fs.watchFile(file, options, function(curr, prev){ + if (prev.mtime < curr.mtime) fn(file); + }); + }); +}; + +/** + * Ignored files. + */ + +function ignored(path){ + return !~ignore.indexOf(path); +} + +/** + * Lookup files in the given `dir`. + * + * @return {Array} + * @api private + */ + +exports.files = function(dir, ret){ + ret = ret || []; + + fs.readdirSync(dir) + .filter(ignored) + .forEach(function(path){ + path = join(dir, path); + if (fs.statSync(path).isDirectory()) { + exports.files(path, ret); + } else if (path.match(/\.(js|coffee|litcoffee|coffee.md)$/)) { + ret.push(path); + } + }); + + return ret; +}; + +/** + * Compute a slug from the given `str`. + * + * @param {String} str + * @return {String} + * @api private + */ + +exports.slug = function(str){ + return str + .toLowerCase() + .replace(/ +/g, '-') + .replace(/[^-\w]/g, ''); +}; + +/** + * Strip the function definition from `str`, + * and re-indent for pre whitespace. + */ + +exports.clean = function(str) { + str = str + .replace(/\r\n?|[\n\u2028\u2029]/g, "\n").replace(/^\uFEFF/, '') + .replace(/^function *\(.*\) *{/, '') + .replace(/\s+\}$/, ''); + + var spaces = str.match(/^\n?( *)/)[1].length + , tabs = str.match(/^\n?(\t*)/)[1].length + , re = new RegExp('^\n?' + (tabs ? '\t' : ' ') + '{' + (tabs ? tabs : spaces) + '}', 'gm'); + + str = str.replace(re, ''); + + return exports.trim(str); +}; + +/** + * Escape regular expression characters in `str`. + * + * @param {String} str + * @return {String} + * @api private + */ + +exports.escapeRegexp = function(str){ + return str.replace(/[-\\^$*+?.()|[\]{}]/g, "\\$&"); +}; + +/** + * Trim the given `str`. + * + * @param {String} str + * @return {String} + * @api private + */ + +exports.trim = function(str){ + return str.replace(/^\s+|\s+$/g, ''); +}; + +/** + * Parse the given `qs`. + * + * @param {String} qs + * @return {Object} + * @api private + */ + +exports.parseQuery = function(qs){ + return exports.reduce(qs.replace('?', '').split('&'), function(obj, pair){ + var i = pair.indexOf('=') + , key = pair.slice(0, i) + , val = pair.slice(++i); + + obj[key] = decodeURIComponent(val); + return obj; + }, {}); +}; + +/** + * Highlight the given string of `js`. + * + * @param {String} js + * @return {String} + * @api private + */ + +function highlight(js) { + return js + .replace(//g, '>') + .replace(/\/\/(.*)/gm, '//$1') + .replace(/('.*?')/gm, '$1') + .replace(/(\d+\.\d+)/gm, '$1') + .replace(/(\d+)/gm, '$1') + .replace(/\bnew *(\w+)/gm, 'new $1') + .replace(/\b(function|new|throw|return|var|if|else)\b/gm, '$1') +} + +/** + * Highlight the contents of tag `name`. + * + * @param {String} name + * @api private + */ + +exports.highlightTags = function(name) { + var code = document.getElementsByTagName(name); + for (var i = 0, len = code.length; i < len; ++i) { + code[i].innerHTML = highlight(code[i].innerHTML); + } +}; + +}); // module: utils.js +// The global object is "self" in Web Workers. +global = (function() { return this; })(); + +/** + * Save timer references to avoid Sinon interfering (see GH-237). + */ + +var Date = global.Date; +var setTimeout = global.setTimeout; +var setInterval = global.setInterval; +var clearTimeout = global.clearTimeout; +var clearInterval = global.clearInterval; + +/** + * Node shims. + * + * These are meant only to allow + * mocha.js to run untouched, not + * to allow running node code in + * the browser. + */ + +var process = {}; +process.exit = function(status){}; +process.stdout = {}; + +var uncaughtExceptionHandlers = []; + +/** + * Remove uncaughtException listener. + */ + +process.removeListener = function(e, fn){ + if ('uncaughtException' == e) { + global.onerror = function() {}; + var i = Mocha.utils.indexOf(uncaughtExceptionHandlers, fn); + if (i != -1) { uncaughtExceptionHandlers.splice(i, 1); } + } +}; + +/** + * Implements uncaughtException listener. + */ + +process.on = function(e, fn){ + if ('uncaughtException' == e) { + global.onerror = function(err, url, line){ + fn(new Error(err + ' (' + url + ':' + line + ')')); + return true; + }; + uncaughtExceptionHandlers.push(fn); + } +}; + +/** + * Expose mocha. + */ + +var Mocha = global.Mocha = require('mocha'), + mocha = global.mocha = new Mocha({ reporter: 'html' }); + +// The BDD UI is registered by default, but no UI will be functional in the +// browser without an explicit call to the overridden `mocha.ui` (see below). +// Ensure that this default UI does not expose its methods to the global scope. +mocha.suite.removeAllListeners('pre-require'); + +var immediateQueue = [] + , immediateTimeout; + +function timeslice() { + var immediateStart = new Date().getTime(); + while (immediateQueue.length && (new Date().getTime() - immediateStart) < 100) { + immediateQueue.shift()(); + } + if (immediateQueue.length) { + immediateTimeout = setTimeout(timeslice, 0); + } else { + immediateTimeout = null; + } +} + +/** + * High-performance override of Runner.immediately. + */ + +Mocha.Runner.immediately = function(callback) { + immediateQueue.push(callback); + if (!immediateTimeout) { + immediateTimeout = setTimeout(timeslice, 0); + } +}; + +/** + * Function to allow assertion libraries to throw errors directly into mocha. + * This is useful when running tests in a browser because window.onerror will + * only receive the 'message' attribute of the Error. + */ +mocha.throwError = function(err) { + Mocha.utils.forEach(uncaughtExceptionHandlers, function (fn) { + fn(err); + }); + throw err; +}; + +/** + * Override ui to ensure that the ui functions are initialized. + * Normally this would happen in Mocha.prototype.loadFiles. + */ + +mocha.ui = function(ui){ + Mocha.prototype.ui.call(this, ui); + this.suite.emit('pre-require', global, null, this); + return this; +}; + +/** + * Setup mocha with the given setting options. + */ + +mocha.setup = function(opts){ + if ('string' == typeof opts) opts = { ui: opts }; + for (var opt in opts) this[opt](opts[opt]); + return this; +}; + +/** + * Run mocha, returning the Runner. + */ + +mocha.run = function(fn){ + var options = mocha.options; + mocha.globals('location'); + + var query = Mocha.utils.parseQuery(global.location.search || ''); + if (query.grep) mocha.grep(query.grep); + if (query.invert) mocha.invert(); + + return Mocha.prototype.run.call(mocha, function(){ + // The DOM Document is not available in Web Workers. + if (global.document) { + Mocha.utils.highlightTags('code'); + } + if (fn) fn(); + }); +}; + +/** + * Expose the process shim. + */ + +Mocha.process = process; +})(); \ No newline at end of file diff --git a/Monitor/wwwroot/assets/plugins/modal-effect/css/component.css b/Monitor/wwwroot/assets/plugins/modal-effect/css/component.css new file mode 100644 index 0000000..5f237b2 --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/modal-effect/css/component.css @@ -0,0 +1,743 @@ +/* General styles for the modal */ + +/* +Styles for the html/body for special modal where we want 3d effects +Note that we need a container wrapping all content on the page for the +perspective effects (not including the modals and the overlay). +*/ +.md-perspective, +.md-perspective body { + height: 100%; + overflow: hidden; +} + +.md-perspective body { + background: #fff; + -webkit-perspective: 600px; + -moz-perspective: 600px; + perspective: 600px; +} + +.container { + min-height: 100%; +} + +.md-modal { + position: fixed; + top: 50%; + left: 50%; + width: 50%; + max-width: 550px; + min-width: 320px; + height: auto; + z-index: 9999999; + visibility: hidden; + -webkit-transform: translateX(-50%) translateY(-50%); + -moz-transform: translateX(-50%) translateY(-50%); + -ms-transform: translateX(-50%) translateY(-50%); + transform: translateX(-50%) translateY(-50%); +} + +.md-show { + visibility: visible; +} + +.md-overlay { + position: fixed; + width: 100%; + height: 100%; + visibility: hidden; + top: 0; + left: 0; + z-index: 9999995; + opacity: 0; + background: rgba(1,1,1,0.6); + -webkit-transition: all 0.3s; + -moz-transition: all 0.3s; + transition: all 0.3s; +} + +.md-show ~ .md-overlay { + opacity: 1; + visibility: visible; +} + +/* Content styles */ +.md-content { + color: #5b5b5b; + background: #fff; + position: relative; + border-radius: 0px; + margin: 0 auto; + font-family: 'Nunito', sans-serif !important; +} +.md-content .md-close-btn { + position: absolute; + top: 10px; + right: 5px; + z-index: 999999; +} +.md-content .md-close-btn a{ + color: #909090; + cursor: pointer; +} +.md-content .md-close-btn a:hover{ + color: #212121; +} +.md-content .md-close { + font-size: 13px; + font-family: 'Nunito', sans-serif !important; +} + +.md-content h3 { + font-size: 16px; + font-weight: 600; + margin: 0; + padding: 20px; + text-align: center; + background: #fff; + border-radius: 0; + color: #797979; +} + +.md-content > div { + padding: 15px 40px 30px; + margin: 0; + font-weight: 300; + font-size: 14px; +} + +.md-content > div p { + margin: 0; + padding: 10px 0; +} + +.md-content > div ul { + margin: 0; + padding: 0 0 30px 20px; +} + +.md-content > div ul li { + padding: 5px 0; +} + + +/* Individual modal styles with animations/transitions */ + +/* Effect 1: Fade in and scale up */ +.md-effect-1 .md-content { + -webkit-transform: scale(0.7); + -moz-transform: scale(0.7); + -ms-transform: scale(0.7); + transform: scale(0.7); + opacity: 0; + -webkit-transition: all 0.3s; + -moz-transition: all 0.3s; + transition: all 0.3s; +} + +.md-show.md-effect-1 .md-content { + -webkit-transform: scale(1); + -moz-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + opacity: 1; +} + +/* Effect 2: Slide from the right */ +.md-effect-2 .md-content { + -webkit-transform: translateX(20%); + -moz-transform: translateX(20%); + -ms-transform: translateX(20%); + transform: translateX(20%); + opacity: 0; + -webkit-transition: all 0.3s cubic-bezier(0.25, 0.5, 0.5, 0.9); + -moz-transition: all 0.3s cubic-bezier(0.25, 0.5, 0.5, 0.9); + transition: all 0.3s cubic-bezier(0.25, 0.5, 0.5, 0.9); +} + +.md-show.md-effect-2 .md-content { + -webkit-transform: translateX(0); + -moz-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + opacity: 1; +} + +/* Effect 3: Slide from the bottom */ +.md-effect-3 .md-content { + -webkit-transform: translateY(20%); + -moz-transform: translateY(20%); + -ms-transform: translateY(20%); + transform: translateY(20%); + opacity: 0; + -webkit-transition: all 0.3s; + -moz-transition: all 0.3s; + transition: all 0.3s; +} + +.md-show.md-effect-3 .md-content { + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + opacity: 1; +} + +/* Effect 4: Newspaper */ +.md-effect-4 .md-content { + -webkit-transform: scale(0) rotate(720deg); + -moz-transform: scale(0) rotate(720deg); + -ms-transform: scale(0) rotate(720deg); + transform: scale(0) rotate(720deg); + opacity: 0; +} + +.md-show.md-effect-4 ~ .md-overlay, +.md-effect-4 .md-content { + -webkit-transition: all 0.5s; + -moz-transition: all 0.5s; + transition: all 0.5s; +} + +.md-show.md-effect-4 .md-content { + -webkit-transform: scale(1) rotate(0deg); + -moz-transform: scale(1) rotate(0deg); + -ms-transform: scale(1) rotate(0deg); + transform: scale(1) rotate(0deg); + opacity: 1; +} + +/* Effect 5: fall */ +.md-effect-5.md-modal { + -webkit-perspective: 1300px; + -moz-perspective: 1300px; + perspective: 1300px; +} + +.md-effect-5 .md-content { + -webkit-transform-style: preserve-3d; + -moz-transform-style: preserve-3d; + transform-style: preserve-3d; + -webkit-transform: translateZ(600px) rotateX(20deg); + -moz-transform: translateZ(600px) rotateX(20deg); + -ms-transform: translateZ(600px) rotateX(20deg); + transform: translateZ(600px) rotateX(20deg); + opacity: 0; +} + +.md-show.md-effect-5 .md-content { + -webkit-transition: all 0.3s ease-in; + -moz-transition: all 0.3s ease-in; + transition: all 0.3s ease-in; + -webkit-transform: translateZ(0px) rotateX(0deg); + -moz-transform: translateZ(0px) rotateX(0deg); + -ms-transform: translateZ(0px) rotateX(0deg); + transform: translateZ(0px) rotateX(0deg); + opacity: 1; +} + +/* Effect 6: side fall */ +.md-effect-6.md-modal { + -webkit-perspective: 1300px; + -moz-perspective: 1300px; + perspective: 1300px; +} + +.md-effect-6 .md-content { + -webkit-transform-style: preserve-3d; + -moz-transform-style: preserve-3d; + transform-style: preserve-3d; + -webkit-transform: translate(30%) translateZ(600px) rotate(10deg); + -moz-transform: translate(30%) translateZ(600px) rotate(10deg); + -ms-transform: translate(30%) translateZ(600px) rotate(10deg); + transform: translate(30%) translateZ(600px) rotate(10deg); + opacity: 0; +} + +.md-show.md-effect-6 .md-content { + -webkit-transition: all 0.3s ease-in; + -moz-transition: all 0.3s ease-in; + transition: all 0.3s ease-in; + -webkit-transform: translate(0%) translateZ(0) rotate(0deg); + -moz-transform: translate(0%) translateZ(0) rotate(0deg); + -ms-transform: translate(0%) translateZ(0) rotate(0deg); + transform: translate(0%) translateZ(0) rotate(0deg); + opacity: 1; +} + +/* Effect 7: slide and stick to top */ +.md-effect-7{ + top: 0; + -webkit-transform: translateX(-50%); + -moz-transform: translateX(-50%); + -ms-transform: translateX(-50%); + transform: translateX(-50%); +} + +.md-effect-7 .md-content { + -webkit-transform: translateY(-200%); + -moz-transform: translateY(-200%); + -ms-transform: translateY(-200%); + transform: translateY(-200%); + -webkit-transition: all .3s; + -moz-transition: all .3s; + transition: all .3s; + opacity: 0; +} + +.md-show.md-effect-7 .md-content { + -webkit-transform: translateY(0%); + -moz-transform: translateY(0%); + -ms-transform: translateY(0%); + transform: translateY(0%); + border-radius: 0 0 3px 3px; + opacity: 1; +} + +/* Effect 8: 3D flip horizontal */ +.md-effect-8.md-modal { + -webkit-perspective: 1300px; + -moz-perspective: 1300px; + perspective: 1300px; +} + +.md-effect-8 .md-content { + -webkit-transform-style: preserve-3d; + -moz-transform-style: preserve-3d; + transform-style: preserve-3d; + -webkit-transform: rotateY(-70deg); + -moz-transform: rotateY(-70deg); + -ms-transform: rotateY(-70deg); + transform: rotateY(-70deg); + -webkit-transition: all 0.3s; + -moz-transition: all 0.3s; + transition: all 0.3s; + opacity: 0; +} + +.md-show.md-effect-8 .md-content { + -webkit-transform: rotateY(0deg); + -moz-transform: rotateY(0deg); + -ms-transform: rotateY(0deg); + transform: rotateY(0deg); + opacity: 1; +} + +/* Effect 9: 3D flip vertical */ +.md-effect-9.md-modal { + -webkit-perspective: 1300px; + -moz-perspective: 1300px; + perspective: 1300px; +} + +.md-effect-9 .md-content { + -webkit-transform-style: preserve-3d; + -moz-transform-style: preserve-3d; + transform-style: preserve-3d; + -webkit-transform: rotateX(-70deg); + -moz-transform: rotateX(-70deg); + -ms-transform: rotateX(-70deg); + transform: rotateX(-70deg); + -webkit-transition: all 0.3s; + -moz-transition: all 0.3s; + transition: all 0.3s; + opacity: 0; +} + +.md-show.md-effect-9 .md-content { + -webkit-transform: rotateX(0deg); + -moz-transform: rotateX(0deg); + -ms-transform: rotateX(0deg); + transform: rotateX(0deg); + opacity: 1; +} + +/* Effect 10: 3D sign */ +.md-effect-10.md-modal { + -webkit-perspective: 1300px; + -moz-perspective: 1300px; + perspective: 1300px; +} + +.md-effect-10 .md-content { + -webkit-transform-style: preserve-3d; + -moz-transform-style: preserve-3d; + transform-style: preserve-3d; + -webkit-transform: rotateX(-60deg); + -moz-transform: rotateX(-60deg); + -ms-transform: rotateX(-60deg); + transform: rotateX(-60deg); + -webkit-transform-origin: 50% 0; + -moz-transform-origin: 50% 0; + transform-origin: 50% 0; + opacity: 0; + -webkit-transition: all 0.3s; + -moz-transition: all 0.3s; + transition: all 0.3s; +} + +.md-show.md-effect-10 .md-content { + -webkit-transform: rotateX(0deg); + -moz-transform: rotateX(0deg); + -ms-transform: rotateX(0deg); + transform: rotateX(0deg); + opacity: 1; +} + +/* Effect 11: Super scaled */ +.md-effect-11 .md-content { + -webkit-transform: scale(2); + -moz-transform: scale(2); + -ms-transform: scale(2); + transform: scale(2); + opacity: 0; + -webkit-transition: all 0.3s; + -moz-transition: all 0.3s; + transition: all 0.3s; +} + +.md-show.md-effect-11 .md-content { + -webkit-transform: scale(1); + -moz-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + opacity: 1; +} + +/* Effect 12: Just me */ +.md-effect-12 .md-content { + -webkit-transform: scale(0.8); + -moz-transform: scale(0.8); + -ms-transform: scale(0.8); + transform: scale(0.8); + opacity: 0; + -webkit-transition: all 0.3s; + -moz-transition: all 0.3s; + transition: all 0.3s; +} + +.md-show.md-effect-12 ~ .md-overlay { + background: rgba(255,255,255,1); +} + +.md-effect-12 .md-content h3, +.md-effect-12 .md-content { + background: transparent; +} + +.md-show.md-effect-12 .md-content { + -webkit-transform: scale(1); + -moz-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + opacity: 1; +} + +/* Effect 13: 3D slit */ +.md-effect-13.md-modal { + -webkit-perspective: 1300px; + -moz-perspective: 1300px; + perspective: 1300px; +} + +.md-effect-13 .md-content { + -webkit-transform-style: preserve-3d; + -moz-transform-style: preserve-3d; + transform-style: preserve-3d; + -webkit-transform: translateZ(-3000px) rotateY(90deg); + -moz-transform: translateZ(-3000px) rotateY(90deg); + -ms-transform: translateZ(-3000px) rotateY(90deg); + transform: translateZ(-3000px) rotateY(90deg); + opacity: 0; +} + +.md-show.md-effect-13 .md-content { + -webkit-animation: slit .7s forwards ease-out; + -moz-animation: slit .7s forwards ease-out; + animation: slit .7s forwards ease-out; +} + +@-webkit-keyframes slit { + 50% { -webkit-transform: translateZ(-250px) rotateY(89deg); opacity: .5; -webkit-animation-timing-function: ease-out;} + 100% { -webkit-transform: translateZ(0) rotateY(0deg); opacity: 1; } +} + +@-moz-keyframes slit { + 50% { -moz-transform: translateZ(-250px) rotateY(89deg); opacity: .5; -moz-animation-timing-function: ease-out;} + 100% { -moz-transform: translateZ(0) rotateY(0deg); opacity: 1; } +} + +@keyframes slit { + 50% { transform: translateZ(-250px) rotateY(89deg); opacity: 1; animation-timing-function: ease-in;} + 100% { transform: translateZ(0) rotateY(0deg); opacity: 1; } +} + +/* Effect 14: 3D Rotate from bottom */ +.md-effect-14.md-modal { + -webkit-perspective: 1300px; + -moz-perspective: 1300px; + perspective: 1300px; +} + +.md-effect-14 .md-content { + -webkit-transform-style: preserve-3d; + -moz-transform-style: preserve-3d; + transform-style: preserve-3d; + -webkit-transform: translateY(100%) rotateX(90deg); + -moz-transform: translateY(100%) rotateX(90deg); + -ms-transform: translateY(100%) rotateX(90deg); + transform: translateY(100%) rotateX(90deg); + -webkit-transform-origin: 0 100%; + -moz-transform-origin: 0 100%; + transform-origin: 0 100%; + opacity: 0; + -webkit-transition: all 0.3s ease-out; + -moz-transition: all 0.3s ease-out; + transition: all 0.3s ease-out; +} + +.md-show.md-effect-14 .md-content { + -webkit-transform: translateY(0%) rotateX(0deg); + -moz-transform: translateY(0%) rotateX(0deg); + -ms-transform: translateY(0%) rotateX(0deg); + transform: translateY(0%) rotateX(0deg); + opacity: 1; +} + +/* Effect 15: 3D Rotate in from left */ +.md-effect-15.md-modal { + -webkit-perspective: 1300px; + -moz-perspective: 1300px; + perspective: 1300px; +} + +.md-effect-15 .md-content { + -webkit-transform-style: preserve-3d; + -moz-transform-style: preserve-3d; + transform-style: preserve-3d; + -webkit-transform: translateZ(100px) translateX(-30%) rotateY(90deg); + -moz-transform: translateZ(100px) translateX(-30%) rotateY(90deg); + -ms-transform: translateZ(100px) translateX(-30%) rotateY(90deg); + transform: translateZ(100px) translateX(-30%) rotateY(90deg); + -webkit-transform-origin: 0 100%; + -moz-transform-origin: 0 100%; + transform-origin: 0 100%; + opacity: 0; + -webkit-transition: all 0.3s; + -moz-transition: all 0.3s; + transition: all 0.3s; +} + +.md-show.md-effect-15 .md-content { + -webkit-transform: translateZ(0px) translateX(0%) rotateY(0deg); + -moz-transform: translateZ(0px) translateX(0%) rotateY(0deg); + -ms-transform: translateZ(0px) translateX(0%) rotateY(0deg); + transform: translateZ(0px) translateX(0%) rotateY(0deg); + opacity: 1; +} + +/* Effect 16: Blur */ +.md-show.md-effect-16 ~ .md-overlay { + background: rgba(1,1,1,0.6); +} + +.md-show.md-effect-16 ~ .container { + -webkit-filter: blur(3px); + -moz-filter: blur(3px); + filter: blur(3px); +} + +.md-effect-16 .md-content { + -webkit-transform: translateY(-5%); + -moz-transform: translateY(-5%); + -ms-transform: translateY(-5%); + transform: translateY(-5%); + opacity: 0; +} + +.md-show.md-effect-16 ~ .container, +.md-effect-16 .md-content { + -webkit-transition: all 0.3s; + -moz-transition: all 0.3s; + transition: all 0.3s; +} + +.md-show.md-effect-16 .md-content { + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + opacity: 1; +} + +/* Effect 17: Slide in from bottom with perspective on container */ +.md-show.md-effect-17 ~ .container { + height: 100%; + overflow: hidden; + -webkit-transition: -webkit-transform 0.3s; + -moz-transition: -moz-transform 0.3s; + transition: transform 0.3s; +} + +.md-show.md-effect-17 ~ .container, +.md-show.md-effect-17 ~ .md-overlay { + -webkit-transform: rotateX(-2deg); + -moz-transform: rotateX(-2deg); + -ms-transform: rotateX(-2deg); + transform: rotateX(-2deg); + -webkit-transform-origin: 50% 0%; + -moz-transform-origin: 50% 0%; + transform-origin: 50% 0%; + -webkit-transform-style: preserve-3d; + -moz-transform-style: preserve-3d; + transform-style: preserve-3d; +} + +.md-effect-17 .md-content { + opacity: 0; + -webkit-transform: translateY(200%); + -moz-transform: translateY(200%); + -ms-transform: translateY(200%); + transform: translateY(200%); +} + +.md-show.md-effect-17 .md-content { + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + opacity: 1; + -webkit-transition: all 0.3s 0.2s; + -moz-transition: all 0.3s 0.2s; + transition: all 0.3s 0.2s; +} + +/* Effect 18: Slide from right with perspective on container */ +.md-show.md-effect-18 ~ .container { + height: 100%; + overflow: hidden; +} + +.md-show.md-effect-18 ~ .md-overlay { + background: rgba(1,1,1,0.6); + -webkit-transition: all 0.5s; + -moz-transition: all 0.5s; + transition: all 0.5s; +} + +.md-show.md-effect-18 ~ .container, +.md-show.md-effect-18 ~ .md-overlay { + -webkit-transform-style: preserve-3d; + -webkit-transform-origin: 0% 50%; + -webkit-animation: rotateRightSideFirst 0.5s forwards ease-in; + -moz-transform-style: preserve-3d; + -moz-transform-origin: 0% 50%; + -moz-animation: rotateRightSideFirst 0.5s forwards ease-in; + transform-style: preserve-3d; + transform-origin: 0% 50%; + animation: rotateRightSideFirst 0.5s forwards ease-in; +} + +@-webkit-keyframes rotateRightSideFirst { + 50% { -webkit-transform: translateZ(-50px) rotateY(5deg); -webkit-animation-timing-function: ease-out; } + 100% { -webkit-transform: translateZ(-200px); } +} + +@-moz-keyframes rotateRightSideFirst { + 50% { -moz-transform: translateZ(-50px) rotateY(5deg); -moz-animation-timing-function: ease-out; } + 100% { -moz-transform: translateZ(-200px); } +} + +@keyframes rotateRightSideFirst { + 50% { transform: translateZ(-50px) rotateY(5deg); animation-timing-function: ease-out; } + 100% { transform: translateZ(-200px); } +} + +.md-effect-18 .md-content { + -webkit-transform: translateX(200%); + -moz-transform: translateX(200%); + -ms-transform: translateX(200%); + transform: translateX(200%); + opacity: 0; +} + +.md-show.md-effect-18 .md-content { + -webkit-transform: translateX(0); + -moz-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + opacity: 1; + -webkit-transition: all 0.5s 0.1s; + -moz-transition: all 0.5s 0.1s; + transition: all 0.5s 0.1s; +} + +/* Effect 19: Slip in from the top with perspective on container */ +.md-show.md-effect-19 ~ .container { + height: 100%; + overflow: hidden; +} + +.md-show.md-effect-19 ~ .md-overlay { + -webkit-transition: all 0.5s; + -moz-transition: all 0.5s; + transition: all 0.5s; +} + +.md-show.md-effect-19 ~ .container, +.md-show.md-effect-19 ~ .md-overlay { + -webkit-transform-style: preserve-3d; + -webkit-transform-origin: 50% 100%; + -webkit-animation: OpenTop 0.5s forwards ease-in; + -moz-transform-style: preserve-3d; + -moz-transform-origin: 50% 100%; + -moz-animation: OpenTop 0.5s forwards ease-in; + transform-style: preserve-3d; + transform-origin: 50% 100%; + animation: OpenTop 0.5s forwards ease-in; +} + +@-webkit-keyframes OpenTop { + 50% { + -webkit-transform: rotateX(10deg); + -webkit-animation-timing-function: ease-out; + } +} + +@-moz-keyframes OpenTop { + 50% { + -moz-transform: rotateX(10deg); + -moz-animation-timing-function: ease-out; + } +} + +@keyframes OpenTop { + 50% { + transform: rotateX(10deg); + animation-timing-function: ease-out; + } +} + +.md-effect-19 .md-content { + -webkit-transform: translateY(-200%); + -moz-transform: translateY(-200%); + -ms-transform: translateY(-200%); + transform: translateY(-200%); + opacity: 0; +} + +.md-show.md-effect-19 .md-content { + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + opacity: 1; + -webkit-transition: all 0.5s 0.1s; + -moz-transition: all 0.5s 0.1s; + transition: all 0.5s 0.1s; +} + +@media screen and (max-width: 32em) { + body { font-size: 75%; } +} \ No newline at end of file diff --git a/Monitor/wwwroot/assets/plugins/modal-effect/js/classie.js b/Monitor/wwwroot/assets/plugins/modal-effect/js/classie.js new file mode 100644 index 0000000..a967554 --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/modal-effect/js/classie.js @@ -0,0 +1,80 @@ +/*! + * classie - class helper functions + * from bonzo https://github.com/ded/bonzo + * + * classie.has( elem, 'my-class' ) -> true/false + * classie.add( elem, 'my-new-class' ) + * classie.remove( elem, 'my-unwanted-class' ) + * classie.toggle( elem, 'my-class' ) + */ + +/*jshint browser: true, strict: true, undef: true */ +/*global define: false */ + +( function( window ) { + +'use strict'; + +// class helper functions from bonzo https://github.com/ded/bonzo + +function classReg( className ) { + return new RegExp("(^|\\s+)" + className + "(\\s+|$)"); +} + +// classList support for class management +// altho to be fair, the api sucks because it won't accept multiple classes at once +var hasClass, addClass, removeClass; + +if ( 'classList' in document.documentElement ) { + hasClass = function( elem, c ) { + return elem.classList.contains( c ); + }; + addClass = function( elem, c ) { + elem.classList.add( c ); + }; + removeClass = function( elem, c ) { + elem.classList.remove( c ); + }; +} +else { + hasClass = function( elem, c ) { + return classReg( c ).test( elem.className ); + }; + addClass = function( elem, c ) { + if ( !hasClass( elem, c ) ) { + elem.className = elem.className + ' ' + c; + } + }; + removeClass = function( elem, c ) { + elem.className = elem.className.replace( classReg( c ), ' ' ); + }; +} + +function toggleClass( elem, c ) { + var fn = hasClass( elem, c ) ? removeClass : addClass; + fn( elem, c ); +} + +var classie = { + // full names + hasClass: hasClass, + addClass: addClass, + removeClass: removeClass, + toggleClass: toggleClass, + // short names + has: hasClass, + add: addClass, + remove: removeClass, + toggle: toggleClass +}; + +// transport +if ( typeof define === 'function' && define.amd ) { + // AMD + define( classie ); +} else { + // browser global + window.classie = classie; +} + +})( window ); diff --git a/Monitor/wwwroot/assets/plugins/modal-effect/js/modalEffects.js b/Monitor/wwwroot/assets/plugins/modal-effect/js/modalEffects.js new file mode 100644 index 0000000..e92dcca --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/modal-effect/js/modalEffects.js @@ -0,0 +1,57 @@ +/** + * modalEffects.js v1.0.0 + * http://www.codrops.com + * + * Licensed under the MIT license. + * http://www.opensource.org/licenses/mit-license.php + * + * Copyright 2013, Codrops + * http://www.codrops.com + */ +var ModalEffects = (function() { + + function init() { + + var overlay = document.querySelector( '.md-overlay' ); + + [].slice.call( document.querySelectorAll( '.md-trigger' ) ).forEach( function( el, i ) { + + var modal = document.querySelector( '#' + el.getAttribute( 'data-modal' ) ), + close = modal.querySelector( '.md-close' ); + + function removeModal( hasPerspective ) { + classie.remove( modal, 'md-show' ); + + if( hasPerspective ) { + classie.remove( document.documentElement, 'md-perspective' ); + } + } + + function removeModalHandler() { + removeModal( classie.has( el, 'md-setperspective' ) ); + } + + el.addEventListener( 'click', function( ev ) { + classie.add( modal, 'md-show' ); + overlay.removeEventListener( 'click', removeModalHandler ); + overlay.addEventListener( 'click', removeModalHandler ); + + if( classie.has( el, 'md-setperspective' ) ) { + setTimeout( function() { + classie.add( document.documentElement, 'md-perspective' ); + }, 25 ); + } + }); + + close.addEventListener( 'click', function( ev ) { + ev.stopPropagation(); + removeModalHandler(); + }); + + } ); + + } + + init(); + +})(); \ No newline at end of file diff --git a/Monitor/wwwroot/assets/plugins/moment/moment.js b/Monitor/wwwroot/assets/plugins/moment/moment.js new file mode 100644 index 0000000..714b4c4 --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/moment/moment.js @@ -0,0 +1,4195 @@ +//! moment.js +//! version : 2.14.1 +//! authors : Tim Wood, Iskren Chernev, Moment.js contributors +//! license : MIT +//! momentjs.com + +;(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + global.moment = factory() +}(this, function () { 'use strict'; + + var hookCallback; + + function utils_hooks__hooks () { + return hookCallback.apply(null, arguments); + } + + // This is done to register the method called with moment() + // without creating circular dependencies. + function setHookCallback (callback) { + hookCallback = callback; + } + + function isArray(input) { + return input instanceof Array || Object.prototype.toString.call(input) === '[object Array]'; + } + + function isObject(input) { + return Object.prototype.toString.call(input) === '[object Object]'; + } + + function isObjectEmpty(obj) { + var k; + for (k in obj) { + // even if its not own property I'd still call it non-empty + return false; + } + return true; + } + + function isDate(input) { + return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]'; + } + + function map(arr, fn) { + var res = [], i; + for (i = 0; i < arr.length; ++i) { + res.push(fn(arr[i], i)); + } + return res; + } + + function hasOwnProp(a, b) { + return Object.prototype.hasOwnProperty.call(a, b); + } + + function extend(a, b) { + for (var i in b) { + if (hasOwnProp(b, i)) { + a[i] = b[i]; + } + } + + if (hasOwnProp(b, 'toString')) { + a.toString = b.toString; + } + + if (hasOwnProp(b, 'valueOf')) { + a.valueOf = b.valueOf; + } + + return a; + } + + function create_utc__createUTC (input, format, locale, strict) { + return createLocalOrUTC(input, format, locale, strict, true).utc(); + } + + function defaultParsingFlags() { + // We need to deep clone this object. + return { + empty : false, + unusedTokens : [], + unusedInput : [], + overflow : -2, + charsLeftOver : 0, + nullInput : false, + invalidMonth : null, + invalidFormat : false, + userInvalidated : false, + iso : false, + parsedDateParts : [], + meridiem : null + }; + } + + function getParsingFlags(m) { + if (m._pf == null) { + m._pf = defaultParsingFlags(); + } + return m._pf; + } + + var some; + if (Array.prototype.some) { + some = Array.prototype.some; + } else { + some = function (fun) { + var t = Object(this); + var len = t.length >>> 0; + + for (var i = 0; i < len; i++) { + if (i in t && fun.call(this, t[i], i, t)) { + return true; + } + } + + return false; + }; + } + + function valid__isValid(m) { + if (m._isValid == null) { + var flags = getParsingFlags(m); + var parsedParts = some.call(flags.parsedDateParts, function (i) { + return i != null; + }); + m._isValid = !isNaN(m._d.getTime()) && + flags.overflow < 0 && + !flags.empty && + !flags.invalidMonth && + !flags.invalidWeekday && + !flags.nullInput && + !flags.invalidFormat && + !flags.userInvalidated && + (!flags.meridiem || (flags.meridiem && parsedParts)); + + if (m._strict) { + m._isValid = m._isValid && + flags.charsLeftOver === 0 && + flags.unusedTokens.length === 0 && + flags.bigHour === undefined; + } + } + return m._isValid; + } + + function valid__createInvalid (flags) { + var m = create_utc__createUTC(NaN); + if (flags != null) { + extend(getParsingFlags(m), flags); + } + else { + getParsingFlags(m).userInvalidated = true; + } + + return m; + } + + function isUndefined(input) { + return input === void 0; + } + + // Plugins that add properties should also add the key here (null value), + // so we can properly clone ourselves. + var momentProperties = utils_hooks__hooks.momentProperties = []; + + function copyConfig(to, from) { + var i, prop, val; + + if (!isUndefined(from._isAMomentObject)) { + to._isAMomentObject = from._isAMomentObject; + } + if (!isUndefined(from._i)) { + to._i = from._i; + } + if (!isUndefined(from._f)) { + to._f = from._f; + } + if (!isUndefined(from._l)) { + to._l = from._l; + } + if (!isUndefined(from._strict)) { + to._strict = from._strict; + } + if (!isUndefined(from._tzm)) { + to._tzm = from._tzm; + } + if (!isUndefined(from._isUTC)) { + to._isUTC = from._isUTC; + } + if (!isUndefined(from._offset)) { + to._offset = from._offset; + } + if (!isUndefined(from._pf)) { + to._pf = getParsingFlags(from); + } + if (!isUndefined(from._locale)) { + to._locale = from._locale; + } + + if (momentProperties.length > 0) { + for (i in momentProperties) { + prop = momentProperties[i]; + val = from[prop]; + if (!isUndefined(val)) { + to[prop] = val; + } + } + } + + return to; + } + + var updateInProgress = false; + + // Moment prototype object + function Moment(config) { + copyConfig(this, config); + this._d = new Date(config._d != null ? config._d.getTime() : NaN); + // Prevent infinite loop in case updateOffset creates new moment + // objects. + if (updateInProgress === false) { + updateInProgress = true; + utils_hooks__hooks.updateOffset(this); + updateInProgress = false; + } + } + + function isMoment (obj) { + return obj instanceof Moment || (obj != null && obj._isAMomentObject != null); + } + + function absFloor (number) { + if (number < 0) { + // -0 -> 0 + return Math.ceil(number) || 0; + } else { + return Math.floor(number); + } + } + + function toInt(argumentForCoercion) { + var coercedNumber = +argumentForCoercion, + value = 0; + + if (coercedNumber !== 0 && isFinite(coercedNumber)) { + value = absFloor(coercedNumber); + } + + return value; + } + + // compare two arrays, return the number of differences + function compareArrays(array1, array2, dontConvert) { + var len = Math.min(array1.length, array2.length), + lengthDiff = Math.abs(array1.length - array2.length), + diffs = 0, + i; + for (i = 0; i < len; i++) { + if ((dontConvert && array1[i] !== array2[i]) || + (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) { + diffs++; + } + } + return diffs + lengthDiff; + } + + function warn(msg) { + if (utils_hooks__hooks.suppressDeprecationWarnings === false && + (typeof console !== 'undefined') && console.warn) { + console.warn('Deprecation warning: ' + msg); + } + } + + function deprecate(msg, fn) { + var firstTime = true; + + return extend(function () { + if (utils_hooks__hooks.deprecationHandler != null) { + utils_hooks__hooks.deprecationHandler(null, msg); + } + if (firstTime) { + warn(msg + '\nArguments: ' + Array.prototype.slice.call(arguments).join(', ') + '\n' + (new Error()).stack); + firstTime = false; + } + return fn.apply(this, arguments); + }, fn); + } + + var deprecations = {}; + + function deprecateSimple(name, msg) { + if (utils_hooks__hooks.deprecationHandler != null) { + utils_hooks__hooks.deprecationHandler(name, msg); + } + if (!deprecations[name]) { + warn(msg); + deprecations[name] = true; + } + } + + utils_hooks__hooks.suppressDeprecationWarnings = false; + utils_hooks__hooks.deprecationHandler = null; + + function isFunction(input) { + return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]'; + } + + function locale_set__set (config) { + var prop, i; + for (i in config) { + prop = config[i]; + if (isFunction(prop)) { + this[i] = prop; + } else { + this['_' + i] = prop; + } + } + this._config = config; + // Lenient ordinal parsing accepts just a number in addition to + // number + (possibly) stuff coming from _ordinalParseLenient. + this._ordinalParseLenient = new RegExp(this._ordinalParse.source + '|' + (/\d{1,2}/).source); + } + + function mergeConfigs(parentConfig, childConfig) { + var res = extend({}, parentConfig), prop; + for (prop in childConfig) { + if (hasOwnProp(childConfig, prop)) { + if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) { + res[prop] = {}; + extend(res[prop], parentConfig[prop]); + extend(res[prop], childConfig[prop]); + } else if (childConfig[prop] != null) { + res[prop] = childConfig[prop]; + } else { + delete res[prop]; + } + } + } + for (prop in parentConfig) { + if (hasOwnProp(parentConfig, prop) && + !hasOwnProp(childConfig, prop) && + isObject(parentConfig[prop])) { + // make sure changes to properties don't modify parent config + res[prop] = extend({}, res[prop]); + } + } + return res; + } + + function Locale(config) { + if (config != null) { + this.set(config); + } + } + + var keys; + + if (Object.keys) { + keys = Object.keys; + } else { + keys = function (obj) { + var i, res = []; + for (i in obj) { + if (hasOwnProp(obj, i)) { + res.push(i); + } + } + return res; + }; + } + + var defaultCalendar = { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }; + + function locale_calendar__calendar (key, mom, now) { + var output = this._calendar[key] || this._calendar['sameElse']; + return isFunction(output) ? output.call(mom, now) : output; + } + + var defaultLongDateFormat = { + LTS : 'h:mm:ss A', + LT : 'h:mm A', + L : 'MM/DD/YYYY', + LL : 'MMMM D, YYYY', + LLL : 'MMMM D, YYYY h:mm A', + LLLL : 'dddd, MMMM D, YYYY h:mm A' + }; + + function longDateFormat (key) { + var format = this._longDateFormat[key], + formatUpper = this._longDateFormat[key.toUpperCase()]; + + if (format || !formatUpper) { + return format; + } + + this._longDateFormat[key] = formatUpper.replace(/MMMM|MM|DD|dddd/g, function (val) { + return val.slice(1); + }); + + return this._longDateFormat[key]; + } + + var defaultInvalidDate = 'Invalid date'; + + function invalidDate () { + return this._invalidDate; + } + + var defaultOrdinal = '%d'; + var defaultOrdinalParse = /\d{1,2}/; + + function ordinal (number) { + return this._ordinal.replace('%d', number); + } + + var defaultRelativeTime = { + future : 'in %s', + past : '%s ago', + s : 'a few seconds', + m : 'a minute', + mm : '%d minutes', + h : 'an hour', + hh : '%d hours', + d : 'a day', + dd : '%d days', + M : 'a month', + MM : '%d months', + y : 'a year', + yy : '%d years' + }; + + function relative__relativeTime (number, withoutSuffix, string, isFuture) { + var output = this._relativeTime[string]; + return (isFunction(output)) ? + output(number, withoutSuffix, string, isFuture) : + output.replace(/%d/i, number); + } + + function pastFuture (diff, output) { + var format = this._relativeTime[diff > 0 ? 'future' : 'past']; + return isFunction(format) ? format(output) : format.replace(/%s/i, output); + } + + var aliases = {}; + + function addUnitAlias (unit, shorthand) { + var lowerCase = unit.toLowerCase(); + aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit; + } + + function normalizeUnits(units) { + return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined; + } + + function normalizeObjectUnits(inputObject) { + var normalizedInput = {}, + normalizedProp, + prop; + + for (prop in inputObject) { + if (hasOwnProp(inputObject, prop)) { + normalizedProp = normalizeUnits(prop); + if (normalizedProp) { + normalizedInput[normalizedProp] = inputObject[prop]; + } + } + } + + return normalizedInput; + } + + var priorities = {}; + + function addUnitPriority(unit, priority) { + priorities[unit] = priority; + } + + function getPrioritizedUnits(unitsObj) { + var units = []; + for (var u in unitsObj) { + units.push({unit: u, priority: priorities[u]}); + } + units.sort(function (a, b) { + return a.priority - b.priority; + }); + return units; + } + + function makeGetSet (unit, keepTime) { + return function (value) { + if (value != null) { + get_set__set(this, unit, value); + utils_hooks__hooks.updateOffset(this, keepTime); + return this; + } else { + return get_set__get(this, unit); + } + }; + } + + function get_set__get (mom, unit) { + return mom.isValid() ? + mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() : NaN; + } + + function get_set__set (mom, unit, value) { + if (mom.isValid()) { + mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value); + } + } + + // MOMENTS + + function stringGet (units) { + units = normalizeUnits(units); + if (isFunction(this[units])) { + return this[units](); + } + return this; + } + + + function stringSet (units, value) { + if (typeof units === 'object') { + units = normalizeObjectUnits(units); + var prioritized = getPrioritizedUnits(units); + for (var i = 0; i < prioritized.length; i++) { + this[prioritized[i].unit](units[prioritized[i].unit]); + } + } else { + units = normalizeUnits(units); + if (isFunction(this[units])) { + return this[units](value); + } + } + return this; + } + + function zeroFill(number, targetLength, forceSign) { + var absNumber = '' + Math.abs(number), + zerosToFill = targetLength - absNumber.length, + sign = number >= 0; + return (sign ? (forceSign ? '+' : '') : '-') + + Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber; + } + + var formattingTokens = /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g; + + var localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g; + + var formatFunctions = {}; + + var formatTokenFunctions = {}; + + // token: 'M' + // padded: ['MM', 2] + // ordinal: 'Mo' + // callback: function () { this.month() + 1 } + function addFormatToken (token, padded, ordinal, callback) { + var func = callback; + if (typeof callback === 'string') { + func = function () { + return this[callback](); + }; + } + if (token) { + formatTokenFunctions[token] = func; + } + if (padded) { + formatTokenFunctions[padded[0]] = function () { + return zeroFill(func.apply(this, arguments), padded[1], padded[2]); + }; + } + if (ordinal) { + formatTokenFunctions[ordinal] = function () { + return this.localeData().ordinal(func.apply(this, arguments), token); + }; + } + } + + function removeFormattingTokens(input) { + if (input.match(/\[[\s\S]/)) { + return input.replace(/^\[|\]$/g, ''); + } + return input.replace(/\\/g, ''); + } + + function makeFormatFunction(format) { + var array = format.match(formattingTokens), i, length; + + for (i = 0, length = array.length; i < length; i++) { + if (formatTokenFunctions[array[i]]) { + array[i] = formatTokenFunctions[array[i]]; + } else { + array[i] = removeFormattingTokens(array[i]); + } + } + + return function (mom) { + var output = '', i; + for (i = 0; i < length; i++) { + output += array[i] instanceof Function ? array[i].call(mom, format) : array[i]; + } + return output; + }; + } + + // format date using native date object + function formatMoment(m, format) { + if (!m.isValid()) { + return m.localeData().invalidDate(); + } + + format = expandFormat(format, m.localeData()); + formatFunctions[format] = formatFunctions[format] || makeFormatFunction(format); + + return formatFunctions[format](m); + } + + function expandFormat(format, locale) { + var i = 5; + + function replaceLongDateFormatTokens(input) { + return locale.longDateFormat(input) || input; + } + + localFormattingTokens.lastIndex = 0; + while (i >= 0 && localFormattingTokens.test(format)) { + format = format.replace(localFormattingTokens, replaceLongDateFormatTokens); + localFormattingTokens.lastIndex = 0; + i -= 1; + } + + return format; + } + + var match1 = /\d/; // 0 - 9 + var match2 = /\d\d/; // 00 - 99 + var match3 = /\d{3}/; // 000 - 999 + var match4 = /\d{4}/; // 0000 - 9999 + var match6 = /[+-]?\d{6}/; // -999999 - 999999 + var match1to2 = /\d\d?/; // 0 - 99 + var match3to4 = /\d\d\d\d?/; // 999 - 9999 + var match5to6 = /\d\d\d\d\d\d?/; // 99999 - 999999 + var match1to3 = /\d{1,3}/; // 0 - 999 + var match1to4 = /\d{1,4}/; // 0 - 9999 + var match1to6 = /[+-]?\d{1,6}/; // -999999 - 999999 + + var matchUnsigned = /\d+/; // 0 - inf + var matchSigned = /[+-]?\d+/; // -inf - inf + + var matchOffset = /Z|[+-]\d\d:?\d\d/gi; // +00:00 -00:00 +0000 -0000 or Z + var matchShortOffset = /Z|[+-]\d\d(?::?\d\d)?/gi; // +00 -00 +00:00 -00:00 +0000 -0000 or Z + + var matchTimestamp = /[+-]?\d+(\.\d{1,3})?/; // 123456789 123456789.123 + + // any word (or two) characters or numbers including two/three word month in arabic. + // includes scottish gaelic two word and hyphenated months + var matchWord = /[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i; + + + var regexes = {}; + + function addRegexToken (token, regex, strictRegex) { + regexes[token] = isFunction(regex) ? regex : function (isStrict, localeData) { + return (isStrict && strictRegex) ? strictRegex : regex; + }; + } + + function getParseRegexForToken (token, config) { + if (!hasOwnProp(regexes, token)) { + return new RegExp(unescapeFormat(token)); + } + + return regexes[token](config._strict, config._locale); + } + + // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript + function unescapeFormat(s) { + return regexEscape(s.replace('\\', '').replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) { + return p1 || p2 || p3 || p4; + })); + } + + function regexEscape(s) { + return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); + } + + var tokens = {}; + + function addParseToken (token, callback) { + var i, func = callback; + if (typeof token === 'string') { + token = [token]; + } + if (typeof callback === 'number') { + func = function (input, array) { + array[callback] = toInt(input); + }; + } + for (i = 0; i < token.length; i++) { + tokens[token[i]] = func; + } + } + + function addWeekParseToken (token, callback) { + addParseToken(token, function (input, array, config, token) { + config._w = config._w || {}; + callback(input, config._w, config, token); + }); + } + + function addTimeToArrayFromToken(token, input, config) { + if (input != null && hasOwnProp(tokens, token)) { + tokens[token](input, config._a, config, token); + } + } + + var YEAR = 0; + var MONTH = 1; + var DATE = 2; + var HOUR = 3; + var MINUTE = 4; + var SECOND = 5; + var MILLISECOND = 6; + var WEEK = 7; + var WEEKDAY = 8; + + var indexOf; + + if (Array.prototype.indexOf) { + indexOf = Array.prototype.indexOf; + } else { + indexOf = function (o) { + // I know + var i; + for (i = 0; i < this.length; ++i) { + if (this[i] === o) { + return i; + } + } + return -1; + }; + } + + function daysInMonth(year, month) { + return new Date(Date.UTC(year, month + 1, 0)).getUTCDate(); + } + + // FORMATTING + + addFormatToken('M', ['MM', 2], 'Mo', function () { + return this.month() + 1; + }); + + addFormatToken('MMM', 0, 0, function (format) { + return this.localeData().monthsShort(this, format); + }); + + addFormatToken('MMMM', 0, 0, function (format) { + return this.localeData().months(this, format); + }); + + // ALIASES + + addUnitAlias('month', 'M'); + + // PRIORITY + + addUnitPriority('month', 8); + + // PARSING + + addRegexToken('M', match1to2); + addRegexToken('MM', match1to2, match2); + addRegexToken('MMM', function (isStrict, locale) { + return locale.monthsShortRegex(isStrict); + }); + addRegexToken('MMMM', function (isStrict, locale) { + return locale.monthsRegex(isStrict); + }); + + addParseToken(['M', 'MM'], function (input, array) { + array[MONTH] = toInt(input) - 1; + }); + + addParseToken(['MMM', 'MMMM'], function (input, array, config, token) { + var month = config._locale.monthsParse(input, token, config._strict); + // if we didn't find a month name, mark the date as invalid. + if (month != null) { + array[MONTH] = month; + } else { + getParsingFlags(config).invalidMonth = input; + } + }); + + // LOCALES + + var MONTHS_IN_FORMAT = /D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/; + var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'); + function localeMonths (m, format) { + return isArray(this._months) ? this._months[m.month()] : + this._months[(this._months.isFormat || MONTHS_IN_FORMAT).test(format) ? 'format' : 'standalone'][m.month()]; + } + + var defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'); + function localeMonthsShort (m, format) { + return isArray(this._monthsShort) ? this._monthsShort[m.month()] : + this._monthsShort[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()]; + } + + function units_month__handleStrictParse(monthName, format, strict) { + var i, ii, mom, llc = monthName.toLocaleLowerCase(); + if (!this._monthsParse) { + // this is not used + this._monthsParse = []; + this._longMonthsParse = []; + this._shortMonthsParse = []; + for (i = 0; i < 12; ++i) { + mom = create_utc__createUTC([2000, i]); + this._shortMonthsParse[i] = this.monthsShort(mom, '').toLocaleLowerCase(); + this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase(); + } + } + + if (strict) { + if (format === 'MMM') { + ii = indexOf.call(this._shortMonthsParse, llc); + return ii !== -1 ? ii : null; + } else { + ii = indexOf.call(this._longMonthsParse, llc); + return ii !== -1 ? ii : null; + } + } else { + if (format === 'MMM') { + ii = indexOf.call(this._shortMonthsParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._longMonthsParse, llc); + return ii !== -1 ? ii : null; + } else { + ii = indexOf.call(this._longMonthsParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._shortMonthsParse, llc); + return ii !== -1 ? ii : null; + } + } + } + + function localeMonthsParse (monthName, format, strict) { + var i, mom, regex; + + if (this._monthsParseExact) { + return units_month__handleStrictParse.call(this, monthName, format, strict); + } + + if (!this._monthsParse) { + this._monthsParse = []; + this._longMonthsParse = []; + this._shortMonthsParse = []; + } + + // TODO: add sorting + // Sorting makes sure if one month (or abbr) is a prefix of another + // see sorting in computeMonthsParse + for (i = 0; i < 12; i++) { + // make the regex if we don't have it already + mom = create_utc__createUTC([2000, i]); + if (strict && !this._longMonthsParse[i]) { + this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i'); + this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i'); + } + if (!strict && !this._monthsParse[i]) { + regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, ''); + this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i'); + } + // test the regex + if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) { + return i; + } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) { + return i; + } else if (!strict && this._monthsParse[i].test(monthName)) { + return i; + } + } + } + + // MOMENTS + + function setMonth (mom, value) { + var dayOfMonth; + + if (!mom.isValid()) { + // No op + return mom; + } + + if (typeof value === 'string') { + if (/^\d+$/.test(value)) { + value = toInt(value); + } else { + value = mom.localeData().monthsParse(value); + // TODO: Another silent failure? + if (typeof value !== 'number') { + return mom; + } + } + } + + dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value)); + mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth); + return mom; + } + + function getSetMonth (value) { + if (value != null) { + setMonth(this, value); + utils_hooks__hooks.updateOffset(this, true); + return this; + } else { + return get_set__get(this, 'Month'); + } + } + + function getDaysInMonth () { + return daysInMonth(this.year(), this.month()); + } + + var defaultMonthsShortRegex = matchWord; + function monthsShortRegex (isStrict) { + if (this._monthsParseExact) { + if (!hasOwnProp(this, '_monthsRegex')) { + computeMonthsParse.call(this); + } + if (isStrict) { + return this._monthsShortStrictRegex; + } else { + return this._monthsShortRegex; + } + } else { + if (!hasOwnProp(this, '_monthsShortRegex')) { + this._monthsShortRegex = defaultMonthsShortRegex; + } + return this._monthsShortStrictRegex && isStrict ? + this._monthsShortStrictRegex : this._monthsShortRegex; + } + } + + var defaultMonthsRegex = matchWord; + function monthsRegex (isStrict) { + if (this._monthsParseExact) { + if (!hasOwnProp(this, '_monthsRegex')) { + computeMonthsParse.call(this); + } + if (isStrict) { + return this._monthsStrictRegex; + } else { + return this._monthsRegex; + } + } else { + if (!hasOwnProp(this, '_monthsRegex')) { + this._monthsRegex = defaultMonthsRegex; + } + return this._monthsStrictRegex && isStrict ? + this._monthsStrictRegex : this._monthsRegex; + } + } + + function computeMonthsParse () { + function cmpLenRev(a, b) { + return b.length - a.length; + } + + var shortPieces = [], longPieces = [], mixedPieces = [], + i, mom; + for (i = 0; i < 12; i++) { + // make the regex if we don't have it already + mom = create_utc__createUTC([2000, i]); + shortPieces.push(this.monthsShort(mom, '')); + longPieces.push(this.months(mom, '')); + mixedPieces.push(this.months(mom, '')); + mixedPieces.push(this.monthsShort(mom, '')); + } + // Sorting makes sure if one month (or abbr) is a prefix of another it + // will match the longer piece. + shortPieces.sort(cmpLenRev); + longPieces.sort(cmpLenRev); + mixedPieces.sort(cmpLenRev); + for (i = 0; i < 12; i++) { + shortPieces[i] = regexEscape(shortPieces[i]); + longPieces[i] = regexEscape(longPieces[i]); + } + for (i = 0; i < 24; i++) { + mixedPieces[i] = regexEscape(mixedPieces[i]); + } + + this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); + this._monthsShortRegex = this._monthsRegex; + this._monthsStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i'); + this._monthsShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i'); + } + + // FORMATTING + + addFormatToken('Y', 0, 0, function () { + var y = this.year(); + return y <= 9999 ? '' + y : '+' + y; + }); + + addFormatToken(0, ['YY', 2], 0, function () { + return this.year() % 100; + }); + + addFormatToken(0, ['YYYY', 4], 0, 'year'); + addFormatToken(0, ['YYYYY', 5], 0, 'year'); + addFormatToken(0, ['YYYYYY', 6, true], 0, 'year'); + + // ALIASES + + addUnitAlias('year', 'y'); + + // PRIORITIES + + addUnitPriority('year', 1); + + // PARSING + + addRegexToken('Y', matchSigned); + addRegexToken('YY', match1to2, match2); + addRegexToken('YYYY', match1to4, match4); + addRegexToken('YYYYY', match1to6, match6); + addRegexToken('YYYYYY', match1to6, match6); + + addParseToken(['YYYYY', 'YYYYYY'], YEAR); + addParseToken('YYYY', function (input, array) { + array[YEAR] = input.length === 2 ? utils_hooks__hooks.parseTwoDigitYear(input) : toInt(input); + }); + addParseToken('YY', function (input, array) { + array[YEAR] = utils_hooks__hooks.parseTwoDigitYear(input); + }); + addParseToken('Y', function (input, array) { + array[YEAR] = parseInt(input, 10); + }); + + // HELPERS + + function daysInYear(year) { + return isLeapYear(year) ? 366 : 365; + } + + function isLeapYear(year) { + return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0; + } + + // HOOKS + + utils_hooks__hooks.parseTwoDigitYear = function (input) { + return toInt(input) + (toInt(input) > 68 ? 1900 : 2000); + }; + + // MOMENTS + + var getSetYear = makeGetSet('FullYear', true); + + function getIsLeapYear () { + return isLeapYear(this.year()); + } + + function createDate (y, m, d, h, M, s, ms) { + //can't just apply() to create a date: + //http://stackoverflow.com/questions/181348/instantiating-a-javascript-object-by-calling-prototype-constructor-apply + var date = new Date(y, m, d, h, M, s, ms); + + //the date constructor remaps years 0-99 to 1900-1999 + if (y < 100 && y >= 0 && isFinite(date.getFullYear())) { + date.setFullYear(y); + } + return date; + } + + function createUTCDate (y) { + var date = new Date(Date.UTC.apply(null, arguments)); + + //the Date.UTC function remaps years 0-99 to 1900-1999 + if (y < 100 && y >= 0 && isFinite(date.getUTCFullYear())) { + date.setUTCFullYear(y); + } + return date; + } + + // start-of-first-week - start-of-year + function firstWeekOffset(year, dow, doy) { + var // first-week day -- which january is always in the first week (4 for iso, 1 for other) + fwd = 7 + dow - doy, + // first-week day local weekday -- which local weekday is fwd + fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7; + + return -fwdlw + fwd - 1; + } + + //http://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday + function dayOfYearFromWeeks(year, week, weekday, dow, doy) { + var localWeekday = (7 + weekday - dow) % 7, + weekOffset = firstWeekOffset(year, dow, doy), + dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset, + resYear, resDayOfYear; + + if (dayOfYear <= 0) { + resYear = year - 1; + resDayOfYear = daysInYear(resYear) + dayOfYear; + } else if (dayOfYear > daysInYear(year)) { + resYear = year + 1; + resDayOfYear = dayOfYear - daysInYear(year); + } else { + resYear = year; + resDayOfYear = dayOfYear; + } + + return { + year: resYear, + dayOfYear: resDayOfYear + }; + } + + function weekOfYear(mom, dow, doy) { + var weekOffset = firstWeekOffset(mom.year(), dow, doy), + week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1, + resWeek, resYear; + + if (week < 1) { + resYear = mom.year() - 1; + resWeek = week + weeksInYear(resYear, dow, doy); + } else if (week > weeksInYear(mom.year(), dow, doy)) { + resWeek = week - weeksInYear(mom.year(), dow, doy); + resYear = mom.year() + 1; + } else { + resYear = mom.year(); + resWeek = week; + } + + return { + week: resWeek, + year: resYear + }; + } + + function weeksInYear(year, dow, doy) { + var weekOffset = firstWeekOffset(year, dow, doy), + weekOffsetNext = firstWeekOffset(year + 1, dow, doy); + return (daysInYear(year) - weekOffset + weekOffsetNext) / 7; + } + + // FORMATTING + + addFormatToken('w', ['ww', 2], 'wo', 'week'); + addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek'); + + // ALIASES + + addUnitAlias('week', 'w'); + addUnitAlias('isoWeek', 'W'); + + // PRIORITIES + + addUnitPriority('week', 5); + addUnitPriority('isoWeek', 5); + + // PARSING + + addRegexToken('w', match1to2); + addRegexToken('ww', match1to2, match2); + addRegexToken('W', match1to2); + addRegexToken('WW', match1to2, match2); + + addWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) { + week[token.substr(0, 1)] = toInt(input); + }); + + // HELPERS + + // LOCALES + + function localeWeek (mom) { + return weekOfYear(mom, this._week.dow, this._week.doy).week; + } + + var defaultLocaleWeek = { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + }; + + function localeFirstDayOfWeek () { + return this._week.dow; + } + + function localeFirstDayOfYear () { + return this._week.doy; + } + + // MOMENTS + + function getSetWeek (input) { + var week = this.localeData().week(this); + return input == null ? week : this.add((input - week) * 7, 'd'); + } + + function getSetISOWeek (input) { + var week = weekOfYear(this, 1, 4).week; + return input == null ? week : this.add((input - week) * 7, 'd'); + } + + // FORMATTING + + addFormatToken('d', 0, 'do', 'day'); + + addFormatToken('dd', 0, 0, function (format) { + return this.localeData().weekdaysMin(this, format); + }); + + addFormatToken('ddd', 0, 0, function (format) { + return this.localeData().weekdaysShort(this, format); + }); + + addFormatToken('dddd', 0, 0, function (format) { + return this.localeData().weekdays(this, format); + }); + + addFormatToken('e', 0, 0, 'weekday'); + addFormatToken('E', 0, 0, 'isoWeekday'); + + // ALIASES + + addUnitAlias('day', 'd'); + addUnitAlias('weekday', 'e'); + addUnitAlias('isoWeekday', 'E'); + + // PRIORITY + addUnitPriority('day', 11); + addUnitPriority('weekday', 11); + addUnitPriority('isoWeekday', 11); + + // PARSING + + addRegexToken('d', match1to2); + addRegexToken('e', match1to2); + addRegexToken('E', match1to2); + addRegexToken('dd', function (isStrict, locale) { + return locale.weekdaysMinRegex(isStrict); + }); + addRegexToken('ddd', function (isStrict, locale) { + return locale.weekdaysShortRegex(isStrict); + }); + addRegexToken('dddd', function (isStrict, locale) { + return locale.weekdaysRegex(isStrict); + }); + + addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) { + var weekday = config._locale.weekdaysParse(input, token, config._strict); + // if we didn't get a weekday name, mark the date as invalid + if (weekday != null) { + week.d = weekday; + } else { + getParsingFlags(config).invalidWeekday = input; + } + }); + + addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) { + week[token] = toInt(input); + }); + + // HELPERS + + function parseWeekday(input, locale) { + if (typeof input !== 'string') { + return input; + } + + if (!isNaN(input)) { + return parseInt(input, 10); + } + + input = locale.weekdaysParse(input); + if (typeof input === 'number') { + return input; + } + + return null; + } + + function parseIsoWeekday(input, locale) { + if (typeof input === 'string') { + return locale.weekdaysParse(input) % 7 || 7; + } + return isNaN(input) ? null : input; + } + + // LOCALES + + var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'); + function localeWeekdays (m, format) { + return isArray(this._weekdays) ? this._weekdays[m.day()] : + this._weekdays[this._weekdays.isFormat.test(format) ? 'format' : 'standalone'][m.day()]; + } + + var defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'); + function localeWeekdaysShort (m) { + return this._weekdaysShort[m.day()]; + } + + var defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'); + function localeWeekdaysMin (m) { + return this._weekdaysMin[m.day()]; + } + + function day_of_week__handleStrictParse(weekdayName, format, strict) { + var i, ii, mom, llc = weekdayName.toLocaleLowerCase(); + if (!this._weekdaysParse) { + this._weekdaysParse = []; + this._shortWeekdaysParse = []; + this._minWeekdaysParse = []; + + for (i = 0; i < 7; ++i) { + mom = create_utc__createUTC([2000, 1]).day(i); + this._minWeekdaysParse[i] = this.weekdaysMin(mom, '').toLocaleLowerCase(); + this._shortWeekdaysParse[i] = this.weekdaysShort(mom, '').toLocaleLowerCase(); + this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase(); + } + } + + if (strict) { + if (format === 'dddd') { + ii = indexOf.call(this._weekdaysParse, llc); + return ii !== -1 ? ii : null; + } else if (format === 'ddd') { + ii = indexOf.call(this._shortWeekdaysParse, llc); + return ii !== -1 ? ii : null; + } else { + ii = indexOf.call(this._minWeekdaysParse, llc); + return ii !== -1 ? ii : null; + } + } else { + if (format === 'dddd') { + ii = indexOf.call(this._weekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._shortWeekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._minWeekdaysParse, llc); + return ii !== -1 ? ii : null; + } else if (format === 'ddd') { + ii = indexOf.call(this._shortWeekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._weekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._minWeekdaysParse, llc); + return ii !== -1 ? ii : null; + } else { + ii = indexOf.call(this._minWeekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._weekdaysParse, llc); + if (ii !== -1) { + return ii; + } + ii = indexOf.call(this._shortWeekdaysParse, llc); + return ii !== -1 ? ii : null; + } + } + } + + function localeWeekdaysParse (weekdayName, format, strict) { + var i, mom, regex; + + if (this._weekdaysParseExact) { + return day_of_week__handleStrictParse.call(this, weekdayName, format, strict); + } + + if (!this._weekdaysParse) { + this._weekdaysParse = []; + this._minWeekdaysParse = []; + this._shortWeekdaysParse = []; + this._fullWeekdaysParse = []; + } + + for (i = 0; i < 7; i++) { + // make the regex if we don't have it already + + mom = create_utc__createUTC([2000, 1]).day(i); + if (strict && !this._fullWeekdaysParse[i]) { + this._fullWeekdaysParse[i] = new RegExp('^' + this.weekdays(mom, '').replace('.', '\.?') + '$', 'i'); + this._shortWeekdaysParse[i] = new RegExp('^' + this.weekdaysShort(mom, '').replace('.', '\.?') + '$', 'i'); + this._minWeekdaysParse[i] = new RegExp('^' + this.weekdaysMin(mom, '').replace('.', '\.?') + '$', 'i'); + } + if (!this._weekdaysParse[i]) { + regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, ''); + this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i'); + } + // test the regex + if (strict && format === 'dddd' && this._fullWeekdaysParse[i].test(weekdayName)) { + return i; + } else if (strict && format === 'ddd' && this._shortWeekdaysParse[i].test(weekdayName)) { + return i; + } else if (strict && format === 'dd' && this._minWeekdaysParse[i].test(weekdayName)) { + return i; + } else if (!strict && this._weekdaysParse[i].test(weekdayName)) { + return i; + } + } + } + + // MOMENTS + + function getSetDayOfWeek (input) { + if (!this.isValid()) { + return input != null ? this : NaN; + } + var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay(); + if (input != null) { + input = parseWeekday(input, this.localeData()); + return this.add(input - day, 'd'); + } else { + return day; + } + } + + function getSetLocaleDayOfWeek (input) { + if (!this.isValid()) { + return input != null ? this : NaN; + } + var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7; + return input == null ? weekday : this.add(input - weekday, 'd'); + } + + function getSetISODayOfWeek (input) { + if (!this.isValid()) { + return input != null ? this : NaN; + } + + // behaves the same as moment#day except + // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6) + // as a setter, sunday should belong to the previous week. + + if (input != null) { + var weekday = parseIsoWeekday(input, this.localeData()); + return this.day(this.day() % 7 ? weekday : weekday - 7); + } else { + return this.day() || 7; + } + } + + var defaultWeekdaysRegex = matchWord; + function weekdaysRegex (isStrict) { + if (this._weekdaysParseExact) { + if (!hasOwnProp(this, '_weekdaysRegex')) { + computeWeekdaysParse.call(this); + } + if (isStrict) { + return this._weekdaysStrictRegex; + } else { + return this._weekdaysRegex; + } + } else { + if (!hasOwnProp(this, '_weekdaysRegex')) { + this._weekdaysRegex = defaultWeekdaysRegex; + } + return this._weekdaysStrictRegex && isStrict ? + this._weekdaysStrictRegex : this._weekdaysRegex; + } + } + + var defaultWeekdaysShortRegex = matchWord; + function weekdaysShortRegex (isStrict) { + if (this._weekdaysParseExact) { + if (!hasOwnProp(this, '_weekdaysRegex')) { + computeWeekdaysParse.call(this); + } + if (isStrict) { + return this._weekdaysShortStrictRegex; + } else { + return this._weekdaysShortRegex; + } + } else { + if (!hasOwnProp(this, '_weekdaysShortRegex')) { + this._weekdaysShortRegex = defaultWeekdaysShortRegex; + } + return this._weekdaysShortStrictRegex && isStrict ? + this._weekdaysShortStrictRegex : this._weekdaysShortRegex; + } + } + + var defaultWeekdaysMinRegex = matchWord; + function weekdaysMinRegex (isStrict) { + if (this._weekdaysParseExact) { + if (!hasOwnProp(this, '_weekdaysRegex')) { + computeWeekdaysParse.call(this); + } + if (isStrict) { + return this._weekdaysMinStrictRegex; + } else { + return this._weekdaysMinRegex; + } + } else { + if (!hasOwnProp(this, '_weekdaysMinRegex')) { + this._weekdaysMinRegex = defaultWeekdaysMinRegex; + } + return this._weekdaysMinStrictRegex && isStrict ? + this._weekdaysMinStrictRegex : this._weekdaysMinRegex; + } + } + + + function computeWeekdaysParse () { + function cmpLenRev(a, b) { + return b.length - a.length; + } + + var minPieces = [], shortPieces = [], longPieces = [], mixedPieces = [], + i, mom, minp, shortp, longp; + for (i = 0; i < 7; i++) { + // make the regex if we don't have it already + mom = create_utc__createUTC([2000, 1]).day(i); + minp = this.weekdaysMin(mom, ''); + shortp = this.weekdaysShort(mom, ''); + longp = this.weekdays(mom, ''); + minPieces.push(minp); + shortPieces.push(shortp); + longPieces.push(longp); + mixedPieces.push(minp); + mixedPieces.push(shortp); + mixedPieces.push(longp); + } + // Sorting makes sure if one weekday (or abbr) is a prefix of another it + // will match the longer piece. + minPieces.sort(cmpLenRev); + shortPieces.sort(cmpLenRev); + longPieces.sort(cmpLenRev); + mixedPieces.sort(cmpLenRev); + for (i = 0; i < 7; i++) { + shortPieces[i] = regexEscape(shortPieces[i]); + longPieces[i] = regexEscape(longPieces[i]); + mixedPieces[i] = regexEscape(mixedPieces[i]); + } + + this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); + this._weekdaysShortRegex = this._weekdaysRegex; + this._weekdaysMinRegex = this._weekdaysRegex; + + this._weekdaysStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i'); + this._weekdaysShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i'); + this._weekdaysMinStrictRegex = new RegExp('^(' + minPieces.join('|') + ')', 'i'); + } + + // FORMATTING + + function hFormat() { + return this.hours() % 12 || 12; + } + + function kFormat() { + return this.hours() || 24; + } + + addFormatToken('H', ['HH', 2], 0, 'hour'); + addFormatToken('h', ['hh', 2], 0, hFormat); + addFormatToken('k', ['kk', 2], 0, kFormat); + + addFormatToken('hmm', 0, 0, function () { + return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2); + }); + + addFormatToken('hmmss', 0, 0, function () { + return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) + + zeroFill(this.seconds(), 2); + }); + + addFormatToken('Hmm', 0, 0, function () { + return '' + this.hours() + zeroFill(this.minutes(), 2); + }); + + addFormatToken('Hmmss', 0, 0, function () { + return '' + this.hours() + zeroFill(this.minutes(), 2) + + zeroFill(this.seconds(), 2); + }); + + function meridiem (token, lowercase) { + addFormatToken(token, 0, 0, function () { + return this.localeData().meridiem(this.hours(), this.minutes(), lowercase); + }); + } + + meridiem('a', true); + meridiem('A', false); + + // ALIASES + + addUnitAlias('hour', 'h'); + + // PRIORITY + addUnitPriority('hour', 13); + + // PARSING + + function matchMeridiem (isStrict, locale) { + return locale._meridiemParse; + } + + addRegexToken('a', matchMeridiem); + addRegexToken('A', matchMeridiem); + addRegexToken('H', match1to2); + addRegexToken('h', match1to2); + addRegexToken('HH', match1to2, match2); + addRegexToken('hh', match1to2, match2); + + addRegexToken('hmm', match3to4); + addRegexToken('hmmss', match5to6); + addRegexToken('Hmm', match3to4); + addRegexToken('Hmmss', match5to6); + + addParseToken(['H', 'HH'], HOUR); + addParseToken(['a', 'A'], function (input, array, config) { + config._isPm = config._locale.isPM(input); + config._meridiem = input; + }); + addParseToken(['h', 'hh'], function (input, array, config) { + array[HOUR] = toInt(input); + getParsingFlags(config).bigHour = true; + }); + addParseToken('hmm', function (input, array, config) { + var pos = input.length - 2; + array[HOUR] = toInt(input.substr(0, pos)); + array[MINUTE] = toInt(input.substr(pos)); + getParsingFlags(config).bigHour = true; + }); + addParseToken('hmmss', function (input, array, config) { + var pos1 = input.length - 4; + var pos2 = input.length - 2; + array[HOUR] = toInt(input.substr(0, pos1)); + array[MINUTE] = toInt(input.substr(pos1, 2)); + array[SECOND] = toInt(input.substr(pos2)); + getParsingFlags(config).bigHour = true; + }); + addParseToken('Hmm', function (input, array, config) { + var pos = input.length - 2; + array[HOUR] = toInt(input.substr(0, pos)); + array[MINUTE] = toInt(input.substr(pos)); + }); + addParseToken('Hmmss', function (input, array, config) { + var pos1 = input.length - 4; + var pos2 = input.length - 2; + array[HOUR] = toInt(input.substr(0, pos1)); + array[MINUTE] = toInt(input.substr(pos1, 2)); + array[SECOND] = toInt(input.substr(pos2)); + }); + + // LOCALES + + function localeIsPM (input) { + // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays + // Using charAt should be more compatible. + return ((input + '').toLowerCase().charAt(0) === 'p'); + } + + var defaultLocaleMeridiemParse = /[ap]\.?m?\.?/i; + function localeMeridiem (hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'pm' : 'PM'; + } else { + return isLower ? 'am' : 'AM'; + } + } + + + // MOMENTS + + // Setting the hour should keep the time, because the user explicitly + // specified which hour he wants. So trying to maintain the same hour (in + // a new timezone) makes sense. Adding/subtracting hours does not follow + // this rule. + var getSetHour = makeGetSet('Hours', true); + + var baseConfig = { + calendar: defaultCalendar, + longDateFormat: defaultLongDateFormat, + invalidDate: defaultInvalidDate, + ordinal: defaultOrdinal, + ordinalParse: defaultOrdinalParse, + relativeTime: defaultRelativeTime, + + months: defaultLocaleMonths, + monthsShort: defaultLocaleMonthsShort, + + week: defaultLocaleWeek, + + weekdays: defaultLocaleWeekdays, + weekdaysMin: defaultLocaleWeekdaysMin, + weekdaysShort: defaultLocaleWeekdaysShort, + + meridiemParse: defaultLocaleMeridiemParse + }; + + // internal storage for locale config files + var locales = {}; + var globalLocale; + + function normalizeLocale(key) { + return key ? key.toLowerCase().replace('_', '-') : key; + } + + // pick the locale from the array + // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each + // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root + function chooseLocale(names) { + var i = 0, j, next, locale, split; + + while (i < names.length) { + split = normalizeLocale(names[i]).split('-'); + j = split.length; + next = normalizeLocale(names[i + 1]); + next = next ? next.split('-') : null; + while (j > 0) { + locale = loadLocale(split.slice(0, j).join('-')); + if (locale) { + return locale; + } + if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) { + //the next array item is better than a shallower substring of this one + break; + } + j--; + } + i++; + } + return null; + } + + function loadLocale(name) { + var oldLocale = null; + // TODO: Find a better way to register and load all the locales in Node + if (!locales[name] && (typeof module !== 'undefined') && + module && module.exports) { + try { + oldLocale = globalLocale._abbr; + require('./locale/' + name); + // because defineLocale currently also sets the global locale, we + // want to undo that for lazy loaded locales + locale_locales__getSetGlobalLocale(oldLocale); + } catch (e) { } + } + return locales[name]; + } + + // This function will load locale and then set the global locale. If + // no arguments are passed in, it will simply return the current global + // locale key. + function locale_locales__getSetGlobalLocale (key, values) { + var data; + if (key) { + if (isUndefined(values)) { + data = locale_locales__getLocale(key); + } + else { + data = defineLocale(key, values); + } + + if (data) { + // moment.duration._locale = moment._locale = data; + globalLocale = data; + } + } + + return globalLocale._abbr; + } + + function defineLocale (name, config) { + if (config !== null) { + var parentConfig = baseConfig; + config.abbr = name; + if (locales[name] != null) { + deprecateSimple('defineLocaleOverride', + 'use moment.updateLocale(localeName, config) to change ' + + 'an existing locale. moment.defineLocale(localeName, ' + + 'config) should only be used for creating a new locale ' + + 'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.'); + parentConfig = locales[name]._config; + } else if (config.parentLocale != null) { + if (locales[config.parentLocale] != null) { + parentConfig = locales[config.parentLocale]._config; + } else { + // treat as if there is no base config + deprecateSimple('parentLocaleUndefined', + 'specified parentLocale is not defined yet. See http://momentjs.com/guides/#/warnings/parent-locale/'); + } + } + locales[name] = new Locale(mergeConfigs(parentConfig, config)); + + // backwards compat for now: also set the locale + locale_locales__getSetGlobalLocale(name); + + return locales[name]; + } else { + // useful for testing + delete locales[name]; + return null; + } + } + + function updateLocale(name, config) { + if (config != null) { + var locale, parentConfig = baseConfig; + // MERGE + if (locales[name] != null) { + parentConfig = locales[name]._config; + } + config = mergeConfigs(parentConfig, config); + locale = new Locale(config); + locale.parentLocale = locales[name]; + locales[name] = locale; + + // backwards compat for now: also set the locale + locale_locales__getSetGlobalLocale(name); + } else { + // pass null for config to unupdate, useful for tests + if (locales[name] != null) { + if (locales[name].parentLocale != null) { + locales[name] = locales[name].parentLocale; + } else if (locales[name] != null) { + delete locales[name]; + } + } + } + return locales[name]; + } + + // returns locale data + function locale_locales__getLocale (key) { + var locale; + + if (key && key._locale && key._locale._abbr) { + key = key._locale._abbr; + } + + if (!key) { + return globalLocale; + } + + if (!isArray(key)) { + //short-circuit everything else + locale = loadLocale(key); + if (locale) { + return locale; + } + key = [key]; + } + + return chooseLocale(key); + } + + function locale_locales__listLocales() { + return keys(locales); + } + + function checkOverflow (m) { + var overflow; + var a = m._a; + + if (a && getParsingFlags(m).overflow === -2) { + overflow = + a[MONTH] < 0 || a[MONTH] > 11 ? MONTH : + a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH]) ? DATE : + a[HOUR] < 0 || a[HOUR] > 24 || (a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0)) ? HOUR : + a[MINUTE] < 0 || a[MINUTE] > 59 ? MINUTE : + a[SECOND] < 0 || a[SECOND] > 59 ? SECOND : + a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND : + -1; + + if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) { + overflow = DATE; + } + if (getParsingFlags(m)._overflowWeeks && overflow === -1) { + overflow = WEEK; + } + if (getParsingFlags(m)._overflowWeekday && overflow === -1) { + overflow = WEEKDAY; + } + + getParsingFlags(m).overflow = overflow; + } + + return m; + } + + // iso 8601 regex + // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00) + var extendedIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?/; + var basicIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?/; + + var tzRegex = /Z|[+-]\d\d(?::?\d\d)?/; + + var isoDates = [ + ['YYYYYY-MM-DD', /[+-]\d{6}-\d\d-\d\d/], + ['YYYY-MM-DD', /\d{4}-\d\d-\d\d/], + ['GGGG-[W]WW-E', /\d{4}-W\d\d-\d/], + ['GGGG-[W]WW', /\d{4}-W\d\d/, false], + ['YYYY-DDD', /\d{4}-\d{3}/], + ['YYYY-MM', /\d{4}-\d\d/, false], + ['YYYYYYMMDD', /[+-]\d{10}/], + ['YYYYMMDD', /\d{8}/], + // YYYYMM is NOT allowed by the standard + ['GGGG[W]WWE', /\d{4}W\d{3}/], + ['GGGG[W]WW', /\d{4}W\d{2}/, false], + ['YYYYDDD', /\d{7}/] + ]; + + // iso time formats and regexes + var isoTimes = [ + ['HH:mm:ss.SSSS', /\d\d:\d\d:\d\d\.\d+/], + ['HH:mm:ss,SSSS', /\d\d:\d\d:\d\d,\d+/], + ['HH:mm:ss', /\d\d:\d\d:\d\d/], + ['HH:mm', /\d\d:\d\d/], + ['HHmmss.SSSS', /\d\d\d\d\d\d\.\d+/], + ['HHmmss,SSSS', /\d\d\d\d\d\d,\d+/], + ['HHmmss', /\d\d\d\d\d\d/], + ['HHmm', /\d\d\d\d/], + ['HH', /\d\d/] + ]; + + var aspNetJsonRegex = /^\/?Date\((\-?\d+)/i; + + // date from iso format + function configFromISO(config) { + var i, l, + string = config._i, + match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string), + allowTime, dateFormat, timeFormat, tzFormat; + + if (match) { + getParsingFlags(config).iso = true; + + for (i = 0, l = isoDates.length; i < l; i++) { + if (isoDates[i][1].exec(match[1])) { + dateFormat = isoDates[i][0]; + allowTime = isoDates[i][2] !== false; + break; + } + } + if (dateFormat == null) { + config._isValid = false; + return; + } + if (match[3]) { + for (i = 0, l = isoTimes.length; i < l; i++) { + if (isoTimes[i][1].exec(match[3])) { + // match[2] should be 'T' or space + timeFormat = (match[2] || ' ') + isoTimes[i][0]; + break; + } + } + if (timeFormat == null) { + config._isValid = false; + return; + } + } + if (!allowTime && timeFormat != null) { + config._isValid = false; + return; + } + if (match[4]) { + if (tzRegex.exec(match[4])) { + tzFormat = 'Z'; + } else { + config._isValid = false; + return; + } + } + config._f = dateFormat + (timeFormat || '') + (tzFormat || ''); + configFromStringAndFormat(config); + } else { + config._isValid = false; + } + } + + // date from iso format or fallback + function configFromString(config) { + var matched = aspNetJsonRegex.exec(config._i); + + if (matched !== null) { + config._d = new Date(+matched[1]); + return; + } + + configFromISO(config); + if (config._isValid === false) { + delete config._isValid; + utils_hooks__hooks.createFromInputFallback(config); + } + } + + utils_hooks__hooks.createFromInputFallback = deprecate( + 'moment construction falls back to js Date. This is ' + + 'discouraged and will be removed in upcoming major ' + + 'release. Please refer to ' + + 'http://momentjs.com/guides/#/warnings/js-date/ for more info.', + function (config) { + config._d = new Date(config._i + (config._useUTC ? ' UTC' : '')); + } + ); + + // Pick the first defined of two or three arguments. + function defaults(a, b, c) { + if (a != null) { + return a; + } + if (b != null) { + return b; + } + return c; + } + + function currentDateArray(config) { + // hooks is actually the exported moment object + var nowValue = new Date(utils_hooks__hooks.now()); + if (config._useUTC) { + return [nowValue.getUTCFullYear(), nowValue.getUTCMonth(), nowValue.getUTCDate()]; + } + return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()]; + } + + // convert an array to a date. + // the array should mirror the parameters below + // note: all values past the year are optional and will default to the lowest possible value. + // [year, month, day , hour, minute, second, millisecond] + function configFromArray (config) { + var i, date, input = [], currentDate, yearToUse; + + if (config._d) { + return; + } + + currentDate = currentDateArray(config); + + //compute day of the year from weeks and weekdays + if (config._w && config._a[DATE] == null && config._a[MONTH] == null) { + dayOfYearFromWeekInfo(config); + } + + //if the day of the year is set, figure out what it is + if (config._dayOfYear) { + yearToUse = defaults(config._a[YEAR], currentDate[YEAR]); + + if (config._dayOfYear > daysInYear(yearToUse)) { + getParsingFlags(config)._overflowDayOfYear = true; + } + + date = createUTCDate(yearToUse, 0, config._dayOfYear); + config._a[MONTH] = date.getUTCMonth(); + config._a[DATE] = date.getUTCDate(); + } + + // Default to current date. + // * if no year, month, day of month are given, default to today + // * if day of month is given, default month and year + // * if month is given, default only year + // * if year is given, don't default anything + for (i = 0; i < 3 && config._a[i] == null; ++i) { + config._a[i] = input[i] = currentDate[i]; + } + + // Zero out whatever was not defaulted, including time + for (; i < 7; i++) { + config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i]; + } + + // Check for 24:00:00.000 + if (config._a[HOUR] === 24 && + config._a[MINUTE] === 0 && + config._a[SECOND] === 0 && + config._a[MILLISECOND] === 0) { + config._nextDay = true; + config._a[HOUR] = 0; + } + + config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input); + // Apply timezone offset from input. The actual utcOffset can be changed + // with parseZone. + if (config._tzm != null) { + config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); + } + + if (config._nextDay) { + config._a[HOUR] = 24; + } + } + + function dayOfYearFromWeekInfo(config) { + var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow; + + w = config._w; + if (w.GG != null || w.W != null || w.E != null) { + dow = 1; + doy = 4; + + // TODO: We need to take the current isoWeekYear, but that depends on + // how we interpret now (local, utc, fixed offset). So create + // a now version of current config (take local/utc/offset flags, and + // create now). + weekYear = defaults(w.GG, config._a[YEAR], weekOfYear(local__createLocal(), 1, 4).year); + week = defaults(w.W, 1); + weekday = defaults(w.E, 1); + if (weekday < 1 || weekday > 7) { + weekdayOverflow = true; + } + } else { + dow = config._locale._week.dow; + doy = config._locale._week.doy; + + weekYear = defaults(w.gg, config._a[YEAR], weekOfYear(local__createLocal(), dow, doy).year); + week = defaults(w.w, 1); + + if (w.d != null) { + // weekday -- low day numbers are considered next week + weekday = w.d; + if (weekday < 0 || weekday > 6) { + weekdayOverflow = true; + } + } else if (w.e != null) { + // local weekday -- counting starts from begining of week + weekday = w.e + dow; + if (w.e < 0 || w.e > 6) { + weekdayOverflow = true; + } + } else { + // default to begining of week + weekday = dow; + } + } + if (week < 1 || week > weeksInYear(weekYear, dow, doy)) { + getParsingFlags(config)._overflowWeeks = true; + } else if (weekdayOverflow != null) { + getParsingFlags(config)._overflowWeekday = true; + } else { + temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy); + config._a[YEAR] = temp.year; + config._dayOfYear = temp.dayOfYear; + } + } + + // constant that refers to the ISO standard + utils_hooks__hooks.ISO_8601 = function () {}; + + // date from string and format string + function configFromStringAndFormat(config) { + // TODO: Move this to another part of the creation flow to prevent circular deps + if (config._f === utils_hooks__hooks.ISO_8601) { + configFromISO(config); + return; + } + + config._a = []; + getParsingFlags(config).empty = true; + + // This array is used to make a Date, either with `new Date` or `Date.UTC` + var string = '' + config._i, + i, parsedInput, tokens, token, skipped, + stringLength = string.length, + totalParsedInputLength = 0; + + tokens = expandFormat(config._f, config._locale).match(formattingTokens) || []; + + for (i = 0; i < tokens.length; i++) { + token = tokens[i]; + parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0]; + // console.log('token', token, 'parsedInput', parsedInput, + // 'regex', getParseRegexForToken(token, config)); + if (parsedInput) { + skipped = string.substr(0, string.indexOf(parsedInput)); + if (skipped.length > 0) { + getParsingFlags(config).unusedInput.push(skipped); + } + string = string.slice(string.indexOf(parsedInput) + parsedInput.length); + totalParsedInputLength += parsedInput.length; + } + // don't parse if it's not a known token + if (formatTokenFunctions[token]) { + if (parsedInput) { + getParsingFlags(config).empty = false; + } + else { + getParsingFlags(config).unusedTokens.push(token); + } + addTimeToArrayFromToken(token, parsedInput, config); + } + else if (config._strict && !parsedInput) { + getParsingFlags(config).unusedTokens.push(token); + } + } + + // add remaining unparsed input length to the string + getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength; + if (string.length > 0) { + getParsingFlags(config).unusedInput.push(string); + } + + // clear _12h flag if hour is <= 12 + if (config._a[HOUR] <= 12 && + getParsingFlags(config).bigHour === true && + config._a[HOUR] > 0) { + getParsingFlags(config).bigHour = undefined; + } + + getParsingFlags(config).parsedDateParts = config._a.slice(0); + getParsingFlags(config).meridiem = config._meridiem; + // handle meridiem + config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], config._meridiem); + + configFromArray(config); + checkOverflow(config); + } + + + function meridiemFixWrap (locale, hour, meridiem) { + var isPm; + + if (meridiem == null) { + // nothing to do + return hour; + } + if (locale.meridiemHour != null) { + return locale.meridiemHour(hour, meridiem); + } else if (locale.isPM != null) { + // Fallback + isPm = locale.isPM(meridiem); + if (isPm && hour < 12) { + hour += 12; + } + if (!isPm && hour === 12) { + hour = 0; + } + return hour; + } else { + // this is not supposed to happen + return hour; + } + } + + // date from string and array of format strings + function configFromStringAndArray(config) { + var tempConfig, + bestMoment, + + scoreToBeat, + i, + currentScore; + + if (config._f.length === 0) { + getParsingFlags(config).invalidFormat = true; + config._d = new Date(NaN); + return; + } + + for (i = 0; i < config._f.length; i++) { + currentScore = 0; + tempConfig = copyConfig({}, config); + if (config._useUTC != null) { + tempConfig._useUTC = config._useUTC; + } + tempConfig._f = config._f[i]; + configFromStringAndFormat(tempConfig); + + if (!valid__isValid(tempConfig)) { + continue; + } + + // if there is any input that was not parsed add a penalty for that format + currentScore += getParsingFlags(tempConfig).charsLeftOver; + + //or tokens + currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10; + + getParsingFlags(tempConfig).score = currentScore; + + if (scoreToBeat == null || currentScore < scoreToBeat) { + scoreToBeat = currentScore; + bestMoment = tempConfig; + } + } + + extend(config, bestMoment || tempConfig); + } + + function configFromObject(config) { + if (config._d) { + return; + } + + var i = normalizeObjectUnits(config._i); + config._a = map([i.year, i.month, i.day || i.date, i.hour, i.minute, i.second, i.millisecond], function (obj) { + return obj && parseInt(obj, 10); + }); + + configFromArray(config); + } + + function createFromConfig (config) { + var res = new Moment(checkOverflow(prepareConfig(config))); + if (res._nextDay) { + // Adding is smart enough around DST + res.add(1, 'd'); + res._nextDay = undefined; + } + + return res; + } + + function prepareConfig (config) { + var input = config._i, + format = config._f; + + config._locale = config._locale || locale_locales__getLocale(config._l); + + if (input === null || (format === undefined && input === '')) { + return valid__createInvalid({nullInput: true}); + } + + if (typeof input === 'string') { + config._i = input = config._locale.preparse(input); + } + + if (isMoment(input)) { + return new Moment(checkOverflow(input)); + } else if (isArray(format)) { + configFromStringAndArray(config); + } else if (isDate(input)) { + config._d = input; + } else if (format) { + configFromStringAndFormat(config); + } else { + configFromInput(config); + } + + if (!valid__isValid(config)) { + config._d = null; + } + + return config; + } + + function configFromInput(config) { + var input = config._i; + if (input === undefined) { + config._d = new Date(utils_hooks__hooks.now()); + } else if (isDate(input)) { + config._d = new Date(input.valueOf()); + } else if (typeof input === 'string') { + configFromString(config); + } else if (isArray(input)) { + config._a = map(input.slice(0), function (obj) { + return parseInt(obj, 10); + }); + configFromArray(config); + } else if (typeof(input) === 'object') { + configFromObject(config); + } else if (typeof(input) === 'number') { + // from milliseconds + config._d = new Date(input); + } else { + utils_hooks__hooks.createFromInputFallback(config); + } + } + + function createLocalOrUTC (input, format, locale, strict, isUTC) { + var c = {}; + + if (typeof(locale) === 'boolean') { + strict = locale; + locale = undefined; + } + + if ((isObject(input) && isObjectEmpty(input)) || + (isArray(input) && input.length === 0)) { + input = undefined; + } + // object construction must be done this way. + // https://github.com/moment/moment/issues/1423 + c._isAMomentObject = true; + c._useUTC = c._isUTC = isUTC; + c._l = locale; + c._i = input; + c._f = format; + c._strict = strict; + + return createFromConfig(c); + } + + function local__createLocal (input, format, locale, strict) { + return createLocalOrUTC(input, format, locale, strict, false); + } + + var prototypeMin = deprecate( + 'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/', + function () { + var other = local__createLocal.apply(null, arguments); + if (this.isValid() && other.isValid()) { + return other < this ? this : other; + } else { + return valid__createInvalid(); + } + } + ); + + var prototypeMax = deprecate( + 'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/', + function () { + var other = local__createLocal.apply(null, arguments); + if (this.isValid() && other.isValid()) { + return other > this ? this : other; + } else { + return valid__createInvalid(); + } + } + ); + + // Pick a moment m from moments so that m[fn](other) is true for all + // other. This relies on the function fn to be transitive. + // + // moments should either be an array of moment objects or an array, whose + // first element is an array of moment objects. + function pickBy(fn, moments) { + var res, i; + if (moments.length === 1 && isArray(moments[0])) { + moments = moments[0]; + } + if (!moments.length) { + return local__createLocal(); + } + res = moments[0]; + for (i = 1; i < moments.length; ++i) { + if (!moments[i].isValid() || moments[i][fn](res)) { + res = moments[i]; + } + } + return res; + } + + // TODO: Use [].sort instead? + function min () { + var args = [].slice.call(arguments, 0); + + return pickBy('isBefore', args); + } + + function max () { + var args = [].slice.call(arguments, 0); + + return pickBy('isAfter', args); + } + + var now = function () { + return Date.now ? Date.now() : +(new Date()); + }; + + function Duration (duration) { + var normalizedInput = normalizeObjectUnits(duration), + years = normalizedInput.year || 0, + quarters = normalizedInput.quarter || 0, + months = normalizedInput.month || 0, + weeks = normalizedInput.week || 0, + days = normalizedInput.day || 0, + hours = normalizedInput.hour || 0, + minutes = normalizedInput.minute || 0, + seconds = normalizedInput.second || 0, + milliseconds = normalizedInput.millisecond || 0; + + // representation for dateAddRemove + this._milliseconds = +milliseconds + + seconds * 1e3 + // 1000 + minutes * 6e4 + // 1000 * 60 + hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978 + // Because of dateAddRemove treats 24 hours as different from a + // day when working around DST, we need to store them separately + this._days = +days + + weeks * 7; + // It is impossible translate months into days without knowing + // which months you are are talking about, so we have to store + // it separately. + this._months = +months + + quarters * 3 + + years * 12; + + this._data = {}; + + this._locale = locale_locales__getLocale(); + + this._bubble(); + } + + function isDuration (obj) { + return obj instanceof Duration; + } + + // FORMATTING + + function offset (token, separator) { + addFormatToken(token, 0, 0, function () { + var offset = this.utcOffset(); + var sign = '+'; + if (offset < 0) { + offset = -offset; + sign = '-'; + } + return sign + zeroFill(~~(offset / 60), 2) + separator + zeroFill(~~(offset) % 60, 2); + }); + } + + offset('Z', ':'); + offset('ZZ', ''); + + // PARSING + + addRegexToken('Z', matchShortOffset); + addRegexToken('ZZ', matchShortOffset); + addParseToken(['Z', 'ZZ'], function (input, array, config) { + config._useUTC = true; + config._tzm = offsetFromString(matchShortOffset, input); + }); + + // HELPERS + + // timezone chunker + // '+10:00' > ['10', '00'] + // '-1530' > ['-15', '30'] + var chunkOffset = /([\+\-]|\d\d)/gi; + + function offsetFromString(matcher, string) { + var matches = ((string || '').match(matcher) || []); + var chunk = matches[matches.length - 1] || []; + var parts = (chunk + '').match(chunkOffset) || ['-', 0, 0]; + var minutes = +(parts[1] * 60) + toInt(parts[2]); + + return parts[0] === '+' ? minutes : -minutes; + } + + // Return a moment from input, that is local/utc/zone equivalent to model. + function cloneWithOffset(input, model) { + var res, diff; + if (model._isUTC) { + res = model.clone(); + diff = (isMoment(input) || isDate(input) ? input.valueOf() : local__createLocal(input).valueOf()) - res.valueOf(); + // Use low-level api, because this fn is low-level api. + res._d.setTime(res._d.valueOf() + diff); + utils_hooks__hooks.updateOffset(res, false); + return res; + } else { + return local__createLocal(input).local(); + } + } + + function getDateOffset (m) { + // On Firefox.24 Date#getTimezoneOffset returns a floating point. + // https://github.com/moment/moment/pull/1871 + return -Math.round(m._d.getTimezoneOffset() / 15) * 15; + } + + // HOOKS + + // This function will be called whenever a moment is mutated. + // It is intended to keep the offset in sync with the timezone. + utils_hooks__hooks.updateOffset = function () {}; + + // MOMENTS + + // keepLocalTime = true means only change the timezone, without + // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]--> + // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset + // +0200, so we adjust the time as needed, to be valid. + // + // Keeping the time actually adds/subtracts (one hour) + // from the actual represented time. That is why we call updateOffset + // a second time. In case it wants us to change the offset again + // _changeInProgress == true case, then we have to adjust, because + // there is no such time in the given timezone. + function getSetOffset (input, keepLocalTime) { + var offset = this._offset || 0, + localAdjust; + if (!this.isValid()) { + return input != null ? this : NaN; + } + if (input != null) { + if (typeof input === 'string') { + input = offsetFromString(matchShortOffset, input); + } else if (Math.abs(input) < 16) { + input = input * 60; + } + if (!this._isUTC && keepLocalTime) { + localAdjust = getDateOffset(this); + } + this._offset = input; + this._isUTC = true; + if (localAdjust != null) { + this.add(localAdjust, 'm'); + } + if (offset !== input) { + if (!keepLocalTime || this._changeInProgress) { + add_subtract__addSubtract(this, create__createDuration(input - offset, 'm'), 1, false); + } else if (!this._changeInProgress) { + this._changeInProgress = true; + utils_hooks__hooks.updateOffset(this, true); + this._changeInProgress = null; + } + } + return this; + } else { + return this._isUTC ? offset : getDateOffset(this); + } + } + + function getSetZone (input, keepLocalTime) { + if (input != null) { + if (typeof input !== 'string') { + input = -input; + } + + this.utcOffset(input, keepLocalTime); + + return this; + } else { + return -this.utcOffset(); + } + } + + function setOffsetToUTC (keepLocalTime) { + return this.utcOffset(0, keepLocalTime); + } + + function setOffsetToLocal (keepLocalTime) { + if (this._isUTC) { + this.utcOffset(0, keepLocalTime); + this._isUTC = false; + + if (keepLocalTime) { + this.subtract(getDateOffset(this), 'm'); + } + } + return this; + } + + function setOffsetToParsedOffset () { + if (this._tzm) { + this.utcOffset(this._tzm); + } else if (typeof this._i === 'string') { + this.utcOffset(offsetFromString(matchOffset, this._i)); + } + return this; + } + + function hasAlignedHourOffset (input) { + if (!this.isValid()) { + return false; + } + input = input ? local__createLocal(input).utcOffset() : 0; + + return (this.utcOffset() - input) % 60 === 0; + } + + function isDaylightSavingTime () { + return ( + this.utcOffset() > this.clone().month(0).utcOffset() || + this.utcOffset() > this.clone().month(5).utcOffset() + ); + } + + function isDaylightSavingTimeShifted () { + if (!isUndefined(this._isDSTShifted)) { + return this._isDSTShifted; + } + + var c = {}; + + copyConfig(c, this); + c = prepareConfig(c); + + if (c._a) { + var other = c._isUTC ? create_utc__createUTC(c._a) : local__createLocal(c._a); + this._isDSTShifted = this.isValid() && + compareArrays(c._a, other.toArray()) > 0; + } else { + this._isDSTShifted = false; + } + + return this._isDSTShifted; + } + + function isLocal () { + return this.isValid() ? !this._isUTC : false; + } + + function isUtcOffset () { + return this.isValid() ? this._isUTC : false; + } + + function isUtc () { + return this.isValid() ? this._isUTC && this._offset === 0 : false; + } + + // ASP.NET json date format regex + var aspNetRegex = /^(\-)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?\d*)?$/; + + // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html + // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere + // and further modified to allow for strings containing both week and day + var isoRegex = /^(-)?P(?:(-?[0-9,.]*)Y)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)W)?(?:(-?[0-9,.]*)D)?(?:T(?:(-?[0-9,.]*)H)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)S)?)?$/; + + function create__createDuration (input, key) { + var duration = input, + // matching against regexp is expensive, do it on demand + match = null, + sign, + ret, + diffRes; + + if (isDuration(input)) { + duration = { + ms : input._milliseconds, + d : input._days, + M : input._months + }; + } else if (typeof input === 'number') { + duration = {}; + if (key) { + duration[key] = input; + } else { + duration.milliseconds = input; + } + } else if (!!(match = aspNetRegex.exec(input))) { + sign = (match[1] === '-') ? -1 : 1; + duration = { + y : 0, + d : toInt(match[DATE]) * sign, + h : toInt(match[HOUR]) * sign, + m : toInt(match[MINUTE]) * sign, + s : toInt(match[SECOND]) * sign, + ms : toInt(match[MILLISECOND]) * sign + }; + } else if (!!(match = isoRegex.exec(input))) { + sign = (match[1] === '-') ? -1 : 1; + duration = { + y : parseIso(match[2], sign), + M : parseIso(match[3], sign), + w : parseIso(match[4], sign), + d : parseIso(match[5], sign), + h : parseIso(match[6], sign), + m : parseIso(match[7], sign), + s : parseIso(match[8], sign) + }; + } else if (duration == null) {// checks for null or undefined + duration = {}; + } else if (typeof duration === 'object' && ('from' in duration || 'to' in duration)) { + diffRes = momentsDifference(local__createLocal(duration.from), local__createLocal(duration.to)); + + duration = {}; + duration.ms = diffRes.milliseconds; + duration.M = diffRes.months; + } + + ret = new Duration(duration); + + if (isDuration(input) && hasOwnProp(input, '_locale')) { + ret._locale = input._locale; + } + + return ret; + } + + create__createDuration.fn = Duration.prototype; + + function parseIso (inp, sign) { + // We'd normally use ~~inp for this, but unfortunately it also + // converts floats to ints. + // inp may be undefined, so careful calling replace on it. + var res = inp && parseFloat(inp.replace(',', '.')); + // apply sign while we're at it + return (isNaN(res) ? 0 : res) * sign; + } + + function positiveMomentsDifference(base, other) { + var res = {milliseconds: 0, months: 0}; + + res.months = other.month() - base.month() + + (other.year() - base.year()) * 12; + if (base.clone().add(res.months, 'M').isAfter(other)) { + --res.months; + } + + res.milliseconds = +other - +(base.clone().add(res.months, 'M')); + + return res; + } + + function momentsDifference(base, other) { + var res; + if (!(base.isValid() && other.isValid())) { + return {milliseconds: 0, months: 0}; + } + + other = cloneWithOffset(other, base); + if (base.isBefore(other)) { + res = positiveMomentsDifference(base, other); + } else { + res = positiveMomentsDifference(other, base); + res.milliseconds = -res.milliseconds; + res.months = -res.months; + } + + return res; + } + + function absRound (number) { + if (number < 0) { + return Math.round(-1 * number) * -1; + } else { + return Math.round(number); + } + } + + // TODO: remove 'name' arg after deprecation is removed + function createAdder(direction, name) { + return function (val, period) { + var dur, tmp; + //invert the arguments, but complain about it + if (period !== null && !isNaN(+period)) { + deprecateSimple(name, 'moment().' + name + '(period, number) is deprecated. Please use moment().' + name + '(number, period). ' + + 'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.'); + tmp = val; val = period; period = tmp; + } + + val = typeof val === 'string' ? +val : val; + dur = create__createDuration(val, period); + add_subtract__addSubtract(this, dur, direction); + return this; + }; + } + + function add_subtract__addSubtract (mom, duration, isAdding, updateOffset) { + var milliseconds = duration._milliseconds, + days = absRound(duration._days), + months = absRound(duration._months); + + if (!mom.isValid()) { + // No op + return; + } + + updateOffset = updateOffset == null ? true : updateOffset; + + if (milliseconds) { + mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding); + } + if (days) { + get_set__set(mom, 'Date', get_set__get(mom, 'Date') + days * isAdding); + } + if (months) { + setMonth(mom, get_set__get(mom, 'Month') + months * isAdding); + } + if (updateOffset) { + utils_hooks__hooks.updateOffset(mom, days || months); + } + } + + var add_subtract__add = createAdder(1, 'add'); + var add_subtract__subtract = createAdder(-1, 'subtract'); + + function getCalendarFormat(myMoment, now) { + var diff = myMoment.diff(now, 'days', true); + return diff < -6 ? 'sameElse' : + diff < -1 ? 'lastWeek' : + diff < 0 ? 'lastDay' : + diff < 1 ? 'sameDay' : + diff < 2 ? 'nextDay' : + diff < 7 ? 'nextWeek' : 'sameElse'; + } + + function moment_calendar__calendar (time, formats) { + // We want to compare the start of today, vs this. + // Getting start-of-today depends on whether we're local/utc/offset or not. + var now = time || local__createLocal(), + sod = cloneWithOffset(now, this).startOf('day'), + format = utils_hooks__hooks.calendarFormat(this, sod) || 'sameElse'; + + var output = formats && (isFunction(formats[format]) ? formats[format].call(this, now) : formats[format]); + + return this.format(output || this.localeData().calendar(format, this, local__createLocal(now))); + } + + function clone () { + return new Moment(this); + } + + function isAfter (input, units) { + var localInput = isMoment(input) ? input : local__createLocal(input); + if (!(this.isValid() && localInput.isValid())) { + return false; + } + units = normalizeUnits(!isUndefined(units) ? units : 'millisecond'); + if (units === 'millisecond') { + return this.valueOf() > localInput.valueOf(); + } else { + return localInput.valueOf() < this.clone().startOf(units).valueOf(); + } + } + + function isBefore (input, units) { + var localInput = isMoment(input) ? input : local__createLocal(input); + if (!(this.isValid() && localInput.isValid())) { + return false; + } + units = normalizeUnits(!isUndefined(units) ? units : 'millisecond'); + if (units === 'millisecond') { + return this.valueOf() < localInput.valueOf(); + } else { + return this.clone().endOf(units).valueOf() < localInput.valueOf(); + } + } + + function isBetween (from, to, units, inclusivity) { + inclusivity = inclusivity || '()'; + return (inclusivity[0] === '(' ? this.isAfter(from, units) : !this.isBefore(from, units)) && + (inclusivity[1] === ')' ? this.isBefore(to, units) : !this.isAfter(to, units)); + } + + function isSame (input, units) { + var localInput = isMoment(input) ? input : local__createLocal(input), + inputMs; + if (!(this.isValid() && localInput.isValid())) { + return false; + } + units = normalizeUnits(units || 'millisecond'); + if (units === 'millisecond') { + return this.valueOf() === localInput.valueOf(); + } else { + inputMs = localInput.valueOf(); + return this.clone().startOf(units).valueOf() <= inputMs && inputMs <= this.clone().endOf(units).valueOf(); + } + } + + function isSameOrAfter (input, units) { + return this.isSame(input, units) || this.isAfter(input,units); + } + + function isSameOrBefore (input, units) { + return this.isSame(input, units) || this.isBefore(input,units); + } + + function diff (input, units, asFloat) { + var that, + zoneDelta, + delta, output; + + if (!this.isValid()) { + return NaN; + } + + that = cloneWithOffset(input, this); + + if (!that.isValid()) { + return NaN; + } + + zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4; + + units = normalizeUnits(units); + + if (units === 'year' || units === 'month' || units === 'quarter') { + output = monthDiff(this, that); + if (units === 'quarter') { + output = output / 3; + } else if (units === 'year') { + output = output / 12; + } + } else { + delta = this - that; + output = units === 'second' ? delta / 1e3 : // 1000 + units === 'minute' ? delta / 6e4 : // 1000 * 60 + units === 'hour' ? delta / 36e5 : // 1000 * 60 * 60 + units === 'day' ? (delta - zoneDelta) / 864e5 : // 1000 * 60 * 60 * 24, negate dst + units === 'week' ? (delta - zoneDelta) / 6048e5 : // 1000 * 60 * 60 * 24 * 7, negate dst + delta; + } + return asFloat ? output : absFloor(output); + } + + function monthDiff (a, b) { + // difference in months + var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()), + // b is in (anchor - 1 month, anchor + 1 month) + anchor = a.clone().add(wholeMonthDiff, 'months'), + anchor2, adjust; + + if (b - anchor < 0) { + anchor2 = a.clone().add(wholeMonthDiff - 1, 'months'); + // linear across the month + adjust = (b - anchor) / (anchor - anchor2); + } else { + anchor2 = a.clone().add(wholeMonthDiff + 1, 'months'); + // linear across the month + adjust = (b - anchor) / (anchor2 - anchor); + } + + //check for negative zero, return zero if negative zero + return -(wholeMonthDiff + adjust) || 0; + } + + utils_hooks__hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ'; + utils_hooks__hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]'; + + function toString () { + return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ'); + } + + function moment_format__toISOString () { + var m = this.clone().utc(); + if (0 < m.year() && m.year() <= 9999) { + if (isFunction(Date.prototype.toISOString)) { + // native implementation is ~50x faster, use it when we can + return this.toDate().toISOString(); + } else { + return formatMoment(m, 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]'); + } + } else { + return formatMoment(m, 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]'); + } + } + + function format (inputString) { + if (!inputString) { + inputString = this.isUtc() ? utils_hooks__hooks.defaultFormatUtc : utils_hooks__hooks.defaultFormat; + } + var output = formatMoment(this, inputString); + return this.localeData().postformat(output); + } + + function from (time, withoutSuffix) { + if (this.isValid() && + ((isMoment(time) && time.isValid()) || + local__createLocal(time).isValid())) { + return create__createDuration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix); + } else { + return this.localeData().invalidDate(); + } + } + + function fromNow (withoutSuffix) { + return this.from(local__createLocal(), withoutSuffix); + } + + function to (time, withoutSuffix) { + if (this.isValid() && + ((isMoment(time) && time.isValid()) || + local__createLocal(time).isValid())) { + return create__createDuration({from: this, to: time}).locale(this.locale()).humanize(!withoutSuffix); + } else { + return this.localeData().invalidDate(); + } + } + + function toNow (withoutSuffix) { + return this.to(local__createLocal(), withoutSuffix); + } + + // If passed a locale key, it will set the locale for this + // instance. Otherwise, it will return the locale configuration + // variables for this instance. + function locale (key) { + var newLocaleData; + + if (key === undefined) { + return this._locale._abbr; + } else { + newLocaleData = locale_locales__getLocale(key); + if (newLocaleData != null) { + this._locale = newLocaleData; + } + return this; + } + } + + var lang = deprecate( + 'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.', + function (key) { + if (key === undefined) { + return this.localeData(); + } else { + return this.locale(key); + } + } + ); + + function localeData () { + return this._locale; + } + + function startOf (units) { + units = normalizeUnits(units); + // the following switch intentionally omits break keywords + // to utilize falling through the cases. + switch (units) { + case 'year': + this.month(0); + /* falls through */ + case 'quarter': + case 'month': + this.date(1); + /* falls through */ + case 'week': + case 'isoWeek': + case 'day': + case 'date': + this.hours(0); + /* falls through */ + case 'hour': + this.minutes(0); + /* falls through */ + case 'minute': + this.seconds(0); + /* falls through */ + case 'second': + this.milliseconds(0); + } + + // weeks are a special case + if (units === 'week') { + this.weekday(0); + } + if (units === 'isoWeek') { + this.isoWeekday(1); + } + + // quarters are also special + if (units === 'quarter') { + this.month(Math.floor(this.month() / 3) * 3); + } + + return this; + } + + function endOf (units) { + units = normalizeUnits(units); + if (units === undefined || units === 'millisecond') { + return this; + } + + // 'date' is an alias for 'day', so it should be considered as such. + if (units === 'date') { + units = 'day'; + } + + return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms'); + } + + function to_type__valueOf () { + return this._d.valueOf() - ((this._offset || 0) * 60000); + } + + function unix () { + return Math.floor(this.valueOf() / 1000); + } + + function toDate () { + return new Date(this.valueOf()); + } + + function toArray () { + var m = this; + return [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond()]; + } + + function toObject () { + var m = this; + return { + years: m.year(), + months: m.month(), + date: m.date(), + hours: m.hours(), + minutes: m.minutes(), + seconds: m.seconds(), + milliseconds: m.milliseconds() + }; + } + + function toJSON () { + // new Date(NaN).toJSON() === null + return this.isValid() ? this.toISOString() : null; + } + + function moment_valid__isValid () { + return valid__isValid(this); + } + + function parsingFlags () { + return extend({}, getParsingFlags(this)); + } + + function invalidAt () { + return getParsingFlags(this).overflow; + } + + function creationData() { + return { + input: this._i, + format: this._f, + locale: this._locale, + isUTC: this._isUTC, + strict: this._strict + }; + } + + // FORMATTING + + addFormatToken(0, ['gg', 2], 0, function () { + return this.weekYear() % 100; + }); + + addFormatToken(0, ['GG', 2], 0, function () { + return this.isoWeekYear() % 100; + }); + + function addWeekYearFormatToken (token, getter) { + addFormatToken(0, [token, token.length], 0, getter); + } + + addWeekYearFormatToken('gggg', 'weekYear'); + addWeekYearFormatToken('ggggg', 'weekYear'); + addWeekYearFormatToken('GGGG', 'isoWeekYear'); + addWeekYearFormatToken('GGGGG', 'isoWeekYear'); + + // ALIASES + + addUnitAlias('weekYear', 'gg'); + addUnitAlias('isoWeekYear', 'GG'); + + // PRIORITY + + addUnitPriority('weekYear', 1); + addUnitPriority('isoWeekYear', 1); + + + // PARSING + + addRegexToken('G', matchSigned); + addRegexToken('g', matchSigned); + addRegexToken('GG', match1to2, match2); + addRegexToken('gg', match1to2, match2); + addRegexToken('GGGG', match1to4, match4); + addRegexToken('gggg', match1to4, match4); + addRegexToken('GGGGG', match1to6, match6); + addRegexToken('ggggg', match1to6, match6); + + addWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (input, week, config, token) { + week[token.substr(0, 2)] = toInt(input); + }); + + addWeekParseToken(['gg', 'GG'], function (input, week, config, token) { + week[token] = utils_hooks__hooks.parseTwoDigitYear(input); + }); + + // MOMENTS + + function getSetWeekYear (input) { + return getSetWeekYearHelper.call(this, + input, + this.week(), + this.weekday(), + this.localeData()._week.dow, + this.localeData()._week.doy); + } + + function getSetISOWeekYear (input) { + return getSetWeekYearHelper.call(this, + input, this.isoWeek(), this.isoWeekday(), 1, 4); + } + + function getISOWeeksInYear () { + return weeksInYear(this.year(), 1, 4); + } + + function getWeeksInYear () { + var weekInfo = this.localeData()._week; + return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy); + } + + function getSetWeekYearHelper(input, week, weekday, dow, doy) { + var weeksTarget; + if (input == null) { + return weekOfYear(this, dow, doy).year; + } else { + weeksTarget = weeksInYear(input, dow, doy); + if (week > weeksTarget) { + week = weeksTarget; + } + return setWeekAll.call(this, input, week, weekday, dow, doy); + } + } + + function setWeekAll(weekYear, week, weekday, dow, doy) { + var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy), + date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear); + + this.year(date.getUTCFullYear()); + this.month(date.getUTCMonth()); + this.date(date.getUTCDate()); + return this; + } + + // FORMATTING + + addFormatToken('Q', 0, 'Qo', 'quarter'); + + // ALIASES + + addUnitAlias('quarter', 'Q'); + + // PRIORITY + + addUnitPriority('quarter', 7); + + // PARSING + + addRegexToken('Q', match1); + addParseToken('Q', function (input, array) { + array[MONTH] = (toInt(input) - 1) * 3; + }); + + // MOMENTS + + function getSetQuarter (input) { + return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3); + } + + // FORMATTING + + addFormatToken('D', ['DD', 2], 'Do', 'date'); + + // ALIASES + + addUnitAlias('date', 'D'); + + // PRIOROITY + addUnitPriority('date', 9); + + // PARSING + + addRegexToken('D', match1to2); + addRegexToken('DD', match1to2, match2); + addRegexToken('Do', function (isStrict, locale) { + return isStrict ? locale._ordinalParse : locale._ordinalParseLenient; + }); + + addParseToken(['D', 'DD'], DATE); + addParseToken('Do', function (input, array) { + array[DATE] = toInt(input.match(match1to2)[0], 10); + }); + + // MOMENTS + + var getSetDayOfMonth = makeGetSet('Date', true); + + // FORMATTING + + addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear'); + + // ALIASES + + addUnitAlias('dayOfYear', 'DDD'); + + // PRIORITY + addUnitPriority('dayOfYear', 4); + + // PARSING + + addRegexToken('DDD', match1to3); + addRegexToken('DDDD', match3); + addParseToken(['DDD', 'DDDD'], function (input, array, config) { + config._dayOfYear = toInt(input); + }); + + // HELPERS + + // MOMENTS + + function getSetDayOfYear (input) { + var dayOfYear = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 1; + return input == null ? dayOfYear : this.add((input - dayOfYear), 'd'); + } + + // FORMATTING + + addFormatToken('m', ['mm', 2], 0, 'minute'); + + // ALIASES + + addUnitAlias('minute', 'm'); + + // PRIORITY + + addUnitPriority('minute', 14); + + // PARSING + + addRegexToken('m', match1to2); + addRegexToken('mm', match1to2, match2); + addParseToken(['m', 'mm'], MINUTE); + + // MOMENTS + + var getSetMinute = makeGetSet('Minutes', false); + + // FORMATTING + + addFormatToken('s', ['ss', 2], 0, 'second'); + + // ALIASES + + addUnitAlias('second', 's'); + + // PRIORITY + + addUnitPriority('second', 15); + + // PARSING + + addRegexToken('s', match1to2); + addRegexToken('ss', match1to2, match2); + addParseToken(['s', 'ss'], SECOND); + + // MOMENTS + + var getSetSecond = makeGetSet('Seconds', false); + + // FORMATTING + + addFormatToken('S', 0, 0, function () { + return ~~(this.millisecond() / 100); + }); + + addFormatToken(0, ['SS', 2], 0, function () { + return ~~(this.millisecond() / 10); + }); + + addFormatToken(0, ['SSS', 3], 0, 'millisecond'); + addFormatToken(0, ['SSSS', 4], 0, function () { + return this.millisecond() * 10; + }); + addFormatToken(0, ['SSSSS', 5], 0, function () { + return this.millisecond() * 100; + }); + addFormatToken(0, ['SSSSSS', 6], 0, function () { + return this.millisecond() * 1000; + }); + addFormatToken(0, ['SSSSSSS', 7], 0, function () { + return this.millisecond() * 10000; + }); + addFormatToken(0, ['SSSSSSSS', 8], 0, function () { + return this.millisecond() * 100000; + }); + addFormatToken(0, ['SSSSSSSSS', 9], 0, function () { + return this.millisecond() * 1000000; + }); + + + // ALIASES + + addUnitAlias('millisecond', 'ms'); + + // PRIORITY + + addUnitPriority('millisecond', 16); + + // PARSING + + addRegexToken('S', match1to3, match1); + addRegexToken('SS', match1to3, match2); + addRegexToken('SSS', match1to3, match3); + + var token; + for (token = 'SSSS'; token.length <= 9; token += 'S') { + addRegexToken(token, matchUnsigned); + } + + function parseMs(input, array) { + array[MILLISECOND] = toInt(('0.' + input) * 1000); + } + + for (token = 'S'; token.length <= 9; token += 'S') { + addParseToken(token, parseMs); + } + // MOMENTS + + var getSetMillisecond = makeGetSet('Milliseconds', false); + + // FORMATTING + + addFormatToken('z', 0, 0, 'zoneAbbr'); + addFormatToken('zz', 0, 0, 'zoneName'); + + // MOMENTS + + function getZoneAbbr () { + return this._isUTC ? 'UTC' : ''; + } + + function getZoneName () { + return this._isUTC ? 'Coordinated Universal Time' : ''; + } + + var momentPrototype__proto = Moment.prototype; + + momentPrototype__proto.add = add_subtract__add; + momentPrototype__proto.calendar = moment_calendar__calendar; + momentPrototype__proto.clone = clone; + momentPrototype__proto.diff = diff; + momentPrototype__proto.endOf = endOf; + momentPrototype__proto.format = format; + momentPrototype__proto.from = from; + momentPrototype__proto.fromNow = fromNow; + momentPrototype__proto.to = to; + momentPrototype__proto.toNow = toNow; + momentPrototype__proto.get = stringGet; + momentPrototype__proto.invalidAt = invalidAt; + momentPrototype__proto.isAfter = isAfter; + momentPrototype__proto.isBefore = isBefore; + momentPrototype__proto.isBetween = isBetween; + momentPrototype__proto.isSame = isSame; + momentPrototype__proto.isSameOrAfter = isSameOrAfter; + momentPrototype__proto.isSameOrBefore = isSameOrBefore; + momentPrototype__proto.isValid = moment_valid__isValid; + momentPrototype__proto.lang = lang; + momentPrototype__proto.locale = locale; + momentPrototype__proto.localeData = localeData; + momentPrototype__proto.max = prototypeMax; + momentPrototype__proto.min = prototypeMin; + momentPrototype__proto.parsingFlags = parsingFlags; + momentPrototype__proto.set = stringSet; + momentPrototype__proto.startOf = startOf; + momentPrototype__proto.subtract = add_subtract__subtract; + momentPrototype__proto.toArray = toArray; + momentPrototype__proto.toObject = toObject; + momentPrototype__proto.toDate = toDate; + momentPrototype__proto.toISOString = moment_format__toISOString; + momentPrototype__proto.toJSON = toJSON; + momentPrototype__proto.toString = toString; + momentPrototype__proto.unix = unix; + momentPrototype__proto.valueOf = to_type__valueOf; + momentPrototype__proto.creationData = creationData; + + // Year + momentPrototype__proto.year = getSetYear; + momentPrototype__proto.isLeapYear = getIsLeapYear; + + // Week Year + momentPrototype__proto.weekYear = getSetWeekYear; + momentPrototype__proto.isoWeekYear = getSetISOWeekYear; + + // Quarter + momentPrototype__proto.quarter = momentPrototype__proto.quarters = getSetQuarter; + + // Month + momentPrototype__proto.month = getSetMonth; + momentPrototype__proto.daysInMonth = getDaysInMonth; + + // Week + momentPrototype__proto.week = momentPrototype__proto.weeks = getSetWeek; + momentPrototype__proto.isoWeek = momentPrototype__proto.isoWeeks = getSetISOWeek; + momentPrototype__proto.weeksInYear = getWeeksInYear; + momentPrototype__proto.isoWeeksInYear = getISOWeeksInYear; + + // Day + momentPrototype__proto.date = getSetDayOfMonth; + momentPrototype__proto.day = momentPrototype__proto.days = getSetDayOfWeek; + momentPrototype__proto.weekday = getSetLocaleDayOfWeek; + momentPrototype__proto.isoWeekday = getSetISODayOfWeek; + momentPrototype__proto.dayOfYear = getSetDayOfYear; + + // Hour + momentPrototype__proto.hour = momentPrototype__proto.hours = getSetHour; + + // Minute + momentPrototype__proto.minute = momentPrototype__proto.minutes = getSetMinute; + + // Second + momentPrototype__proto.second = momentPrototype__proto.seconds = getSetSecond; + + // Millisecond + momentPrototype__proto.millisecond = momentPrototype__proto.milliseconds = getSetMillisecond; + + // Offset + momentPrototype__proto.utcOffset = getSetOffset; + momentPrototype__proto.utc = setOffsetToUTC; + momentPrototype__proto.local = setOffsetToLocal; + momentPrototype__proto.parseZone = setOffsetToParsedOffset; + momentPrototype__proto.hasAlignedHourOffset = hasAlignedHourOffset; + momentPrototype__proto.isDST = isDaylightSavingTime; + momentPrototype__proto.isLocal = isLocal; + momentPrototype__proto.isUtcOffset = isUtcOffset; + momentPrototype__proto.isUtc = isUtc; + momentPrototype__proto.isUTC = isUtc; + + // Timezone + momentPrototype__proto.zoneAbbr = getZoneAbbr; + momentPrototype__proto.zoneName = getZoneName; + + // Deprecations + momentPrototype__proto.dates = deprecate('dates accessor is deprecated. Use date instead.', getSetDayOfMonth); + momentPrototype__proto.months = deprecate('months accessor is deprecated. Use month instead', getSetMonth); + momentPrototype__proto.years = deprecate('years accessor is deprecated. Use year instead', getSetYear); + momentPrototype__proto.zone = deprecate('moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/', getSetZone); + momentPrototype__proto.isDSTShifted = deprecate('isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information', isDaylightSavingTimeShifted); + + var momentPrototype = momentPrototype__proto; + + function moment__createUnix (input) { + return local__createLocal(input * 1000); + } + + function moment__createInZone () { + return local__createLocal.apply(null, arguments).parseZone(); + } + + function preParsePostFormat (string) { + return string; + } + + var prototype__proto = Locale.prototype; + + prototype__proto.calendar = locale_calendar__calendar; + prototype__proto.longDateFormat = longDateFormat; + prototype__proto.invalidDate = invalidDate; + prototype__proto.ordinal = ordinal; + prototype__proto.preparse = preParsePostFormat; + prototype__proto.postformat = preParsePostFormat; + prototype__proto.relativeTime = relative__relativeTime; + prototype__proto.pastFuture = pastFuture; + prototype__proto.set = locale_set__set; + + // Month + prototype__proto.months = localeMonths; + prototype__proto.monthsShort = localeMonthsShort; + prototype__proto.monthsParse = localeMonthsParse; + prototype__proto.monthsRegex = monthsRegex; + prototype__proto.monthsShortRegex = monthsShortRegex; + + // Week + prototype__proto.week = localeWeek; + prototype__proto.firstDayOfYear = localeFirstDayOfYear; + prototype__proto.firstDayOfWeek = localeFirstDayOfWeek; + + // Day of Week + prototype__proto.weekdays = localeWeekdays; + prototype__proto.weekdaysMin = localeWeekdaysMin; + prototype__proto.weekdaysShort = localeWeekdaysShort; + prototype__proto.weekdaysParse = localeWeekdaysParse; + + prototype__proto.weekdaysRegex = weekdaysRegex; + prototype__proto.weekdaysShortRegex = weekdaysShortRegex; + prototype__proto.weekdaysMinRegex = weekdaysMinRegex; + + // Hours + prototype__proto.isPM = localeIsPM; + prototype__proto.meridiem = localeMeridiem; + + function lists__get (format, index, field, setter) { + var locale = locale_locales__getLocale(); + var utc = create_utc__createUTC().set(setter, index); + return locale[field](utc, format); + } + + function listMonthsImpl (format, index, field) { + if (typeof format === 'number') { + index = format; + format = undefined; + } + + format = format || ''; + + if (index != null) { + return lists__get(format, index, field, 'month'); + } + + var i; + var out = []; + for (i = 0; i < 12; i++) { + out[i] = lists__get(format, i, field, 'month'); + } + return out; + } + + // () + // (5) + // (fmt, 5) + // (fmt) + // (true) + // (true, 5) + // (true, fmt, 5) + // (true, fmt) + function listWeekdaysImpl (localeSorted, format, index, field) { + if (typeof localeSorted === 'boolean') { + if (typeof format === 'number') { + index = format; + format = undefined; + } + + format = format || ''; + } else { + format = localeSorted; + index = format; + localeSorted = false; + + if (typeof format === 'number') { + index = format; + format = undefined; + } + + format = format || ''; + } + + var locale = locale_locales__getLocale(), + shift = localeSorted ? locale._week.dow : 0; + + if (index != null) { + return lists__get(format, (index + shift) % 7, field, 'day'); + } + + var i; + var out = []; + for (i = 0; i < 7; i++) { + out[i] = lists__get(format, (i + shift) % 7, field, 'day'); + } + return out; + } + + function lists__listMonths (format, index) { + return listMonthsImpl(format, index, 'months'); + } + + function lists__listMonthsShort (format, index) { + return listMonthsImpl(format, index, 'monthsShort'); + } + + function lists__listWeekdays (localeSorted, format, index) { + return listWeekdaysImpl(localeSorted, format, index, 'weekdays'); + } + + function lists__listWeekdaysShort (localeSorted, format, index) { + return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort'); + } + + function lists__listWeekdaysMin (localeSorted, format, index) { + return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin'); + } + + locale_locales__getSetGlobalLocale('en', { + ordinalParse: /\d{1,2}(th|st|nd|rd)/, + ordinal : function (number) { + var b = number % 10, + output = (toInt(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + } + }); + + // Side effect imports + utils_hooks__hooks.lang = deprecate('moment.lang is deprecated. Use moment.locale instead.', locale_locales__getSetGlobalLocale); + utils_hooks__hooks.langData = deprecate('moment.langData is deprecated. Use moment.localeData instead.', locale_locales__getLocale); + + var mathAbs = Math.abs; + + function duration_abs__abs () { + var data = this._data; + + this._milliseconds = mathAbs(this._milliseconds); + this._days = mathAbs(this._days); + this._months = mathAbs(this._months); + + data.milliseconds = mathAbs(data.milliseconds); + data.seconds = mathAbs(data.seconds); + data.minutes = mathAbs(data.minutes); + data.hours = mathAbs(data.hours); + data.months = mathAbs(data.months); + data.years = mathAbs(data.years); + + return this; + } + + function duration_add_subtract__addSubtract (duration, input, value, direction) { + var other = create__createDuration(input, value); + + duration._milliseconds += direction * other._milliseconds; + duration._days += direction * other._days; + duration._months += direction * other._months; + + return duration._bubble(); + } + + // supports only 2.0-style add(1, 's') or add(duration) + function duration_add_subtract__add (input, value) { + return duration_add_subtract__addSubtract(this, input, value, 1); + } + + // supports only 2.0-style subtract(1, 's') or subtract(duration) + function duration_add_subtract__subtract (input, value) { + return duration_add_subtract__addSubtract(this, input, value, -1); + } + + function absCeil (number) { + if (number < 0) { + return Math.floor(number); + } else { + return Math.ceil(number); + } + } + + function bubble () { + var milliseconds = this._milliseconds; + var days = this._days; + var months = this._months; + var data = this._data; + var seconds, minutes, hours, years, monthsFromDays; + + // if we have a mix of positive and negative values, bubble down first + // check: https://github.com/moment/moment/issues/2166 + if (!((milliseconds >= 0 && days >= 0 && months >= 0) || + (milliseconds <= 0 && days <= 0 && months <= 0))) { + milliseconds += absCeil(monthsToDays(months) + days) * 864e5; + days = 0; + months = 0; + } + + // The following code bubbles up values, see the tests for + // examples of what that means. + data.milliseconds = milliseconds % 1000; + + seconds = absFloor(milliseconds / 1000); + data.seconds = seconds % 60; + + minutes = absFloor(seconds / 60); + data.minutes = minutes % 60; + + hours = absFloor(minutes / 60); + data.hours = hours % 24; + + days += absFloor(hours / 24); + + // convert days to months + monthsFromDays = absFloor(daysToMonths(days)); + months += monthsFromDays; + days -= absCeil(monthsToDays(monthsFromDays)); + + // 12 months -> 1 year + years = absFloor(months / 12); + months %= 12; + + data.days = days; + data.months = months; + data.years = years; + + return this; + } + + function daysToMonths (days) { + // 400 years have 146097 days (taking into account leap year rules) + // 400 years have 12 months === 4800 + return days * 4800 / 146097; + } + + function monthsToDays (months) { + // the reverse of daysToMonths + return months * 146097 / 4800; + } + + function as (units) { + var days; + var months; + var milliseconds = this._milliseconds; + + units = normalizeUnits(units); + + if (units === 'month' || units === 'year') { + days = this._days + milliseconds / 864e5; + months = this._months + daysToMonths(days); + return units === 'month' ? months : months / 12; + } else { + // handle milliseconds separately because of floating point math errors (issue #1867) + days = this._days + Math.round(monthsToDays(this._months)); + switch (units) { + case 'week' : return days / 7 + milliseconds / 6048e5; + case 'day' : return days + milliseconds / 864e5; + case 'hour' : return days * 24 + milliseconds / 36e5; + case 'minute' : return days * 1440 + milliseconds / 6e4; + case 'second' : return days * 86400 + milliseconds / 1000; + // Math.floor prevents floating point math errors here + case 'millisecond': return Math.floor(days * 864e5) + milliseconds; + default: throw new Error('Unknown unit ' + units); + } + } + } + + // TODO: Use this.as('ms')? + function duration_as__valueOf () { + return ( + this._milliseconds + + this._days * 864e5 + + (this._months % 12) * 2592e6 + + toInt(this._months / 12) * 31536e6 + ); + } + + function makeAs (alias) { + return function () { + return this.as(alias); + }; + } + + var asMilliseconds = makeAs('ms'); + var asSeconds = makeAs('s'); + var asMinutes = makeAs('m'); + var asHours = makeAs('h'); + var asDays = makeAs('d'); + var asWeeks = makeAs('w'); + var asMonths = makeAs('M'); + var asYears = makeAs('y'); + + function duration_get__get (units) { + units = normalizeUnits(units); + return this[units + 's'](); + } + + function makeGetter(name) { + return function () { + return this._data[name]; + }; + } + + var milliseconds = makeGetter('milliseconds'); + var seconds = makeGetter('seconds'); + var minutes = makeGetter('minutes'); + var hours = makeGetter('hours'); + var days = makeGetter('days'); + var months = makeGetter('months'); + var years = makeGetter('years'); + + function weeks () { + return absFloor(this.days() / 7); + } + + var round = Math.round; + var thresholds = { + s: 45, // seconds to minute + m: 45, // minutes to hour + h: 22, // hours to day + d: 26, // days to month + M: 11 // months to year + }; + + // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize + function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) { + return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture); + } + + function duration_humanize__relativeTime (posNegDuration, withoutSuffix, locale) { + var duration = create__createDuration(posNegDuration).abs(); + var seconds = round(duration.as('s')); + var minutes = round(duration.as('m')); + var hours = round(duration.as('h')); + var days = round(duration.as('d')); + var months = round(duration.as('M')); + var years = round(duration.as('y')); + + var a = seconds < thresholds.s && ['s', seconds] || + minutes <= 1 && ['m'] || + minutes < thresholds.m && ['mm', minutes] || + hours <= 1 && ['h'] || + hours < thresholds.h && ['hh', hours] || + days <= 1 && ['d'] || + days < thresholds.d && ['dd', days] || + months <= 1 && ['M'] || + months < thresholds.M && ['MM', months] || + years <= 1 && ['y'] || ['yy', years]; + + a[2] = withoutSuffix; + a[3] = +posNegDuration > 0; + a[4] = locale; + return substituteTimeAgo.apply(null, a); + } + + // This function allows you to set the rounding function for relative time strings + function duration_humanize__getSetRelativeTimeRounding (roundingFunction) { + if (roundingFunction === undefined) { + return round; + } + if (typeof(roundingFunction) === 'function') { + round = roundingFunction; + return true; + } + return false; + } + + // This function allows you to set a threshold for relative time strings + function duration_humanize__getSetRelativeTimeThreshold (threshold, limit) { + if (thresholds[threshold] === undefined) { + return false; + } + if (limit === undefined) { + return thresholds[threshold]; + } + thresholds[threshold] = limit; + return true; + } + + function humanize (withSuffix) { + var locale = this.localeData(); + var output = duration_humanize__relativeTime(this, !withSuffix, locale); + + if (withSuffix) { + output = locale.pastFuture(+this, output); + } + + return locale.postformat(output); + } + + var iso_string__abs = Math.abs; + + function iso_string__toISOString() { + // for ISO strings we do not use the normal bubbling rules: + // * milliseconds bubble up until they become hours + // * days do not bubble at all + // * months bubble up until they become years + // This is because there is no context-free conversion between hours and days + // (think of clock changes) + // and also not between days and months (28-31 days per month) + var seconds = iso_string__abs(this._milliseconds) / 1000; + var days = iso_string__abs(this._days); + var months = iso_string__abs(this._months); + var minutes, hours, years; + + // 3600 seconds -> 60 minutes -> 1 hour + minutes = absFloor(seconds / 60); + hours = absFloor(minutes / 60); + seconds %= 60; + minutes %= 60; + + // 12 months -> 1 year + years = absFloor(months / 12); + months %= 12; + + + // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js + var Y = years; + var M = months; + var D = days; + var h = hours; + var m = minutes; + var s = seconds; + var total = this.asSeconds(); + + if (!total) { + // this is the same as C#'s (Noda) and python (isodate)... + // but not other JS (goog.date) + return 'P0D'; + } + + return (total < 0 ? '-' : '') + + 'P' + + (Y ? Y + 'Y' : '') + + (M ? M + 'M' : '') + + (D ? D + 'D' : '') + + ((h || m || s) ? 'T' : '') + + (h ? h + 'H' : '') + + (m ? m + 'M' : '') + + (s ? s + 'S' : ''); + } + + var duration_prototype__proto = Duration.prototype; + + duration_prototype__proto.abs = duration_abs__abs; + duration_prototype__proto.add = duration_add_subtract__add; + duration_prototype__proto.subtract = duration_add_subtract__subtract; + duration_prototype__proto.as = as; + duration_prototype__proto.asMilliseconds = asMilliseconds; + duration_prototype__proto.asSeconds = asSeconds; + duration_prototype__proto.asMinutes = asMinutes; + duration_prototype__proto.asHours = asHours; + duration_prototype__proto.asDays = asDays; + duration_prototype__proto.asWeeks = asWeeks; + duration_prototype__proto.asMonths = asMonths; + duration_prototype__proto.asYears = asYears; + duration_prototype__proto.valueOf = duration_as__valueOf; + duration_prototype__proto._bubble = bubble; + duration_prototype__proto.get = duration_get__get; + duration_prototype__proto.milliseconds = milliseconds; + duration_prototype__proto.seconds = seconds; + duration_prototype__proto.minutes = minutes; + duration_prototype__proto.hours = hours; + duration_prototype__proto.days = days; + duration_prototype__proto.weeks = weeks; + duration_prototype__proto.months = months; + duration_prototype__proto.years = years; + duration_prototype__proto.humanize = humanize; + duration_prototype__proto.toISOString = iso_string__toISOString; + duration_prototype__proto.toString = iso_string__toISOString; + duration_prototype__proto.toJSON = iso_string__toISOString; + duration_prototype__proto.locale = locale; + duration_prototype__proto.localeData = localeData; + + // Deprecations + duration_prototype__proto.toIsoString = deprecate('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', iso_string__toISOString); + duration_prototype__proto.lang = lang; + + // Side effect imports + + // FORMATTING + + addFormatToken('X', 0, 0, 'unix'); + addFormatToken('x', 0, 0, 'valueOf'); + + // PARSING + + addRegexToken('x', matchSigned); + addRegexToken('X', matchTimestamp); + addParseToken('X', function (input, array, config) { + config._d = new Date(parseFloat(input, 10) * 1000); + }); + addParseToken('x', function (input, array, config) { + config._d = new Date(toInt(input)); + }); + + // Side effect imports + + + utils_hooks__hooks.version = '2.14.1'; + + setHookCallback(local__createLocal); + + utils_hooks__hooks.fn = momentPrototype; + utils_hooks__hooks.min = min; + utils_hooks__hooks.max = max; + utils_hooks__hooks.now = now; + utils_hooks__hooks.utc = create_utc__createUTC; + utils_hooks__hooks.unix = moment__createUnix; + utils_hooks__hooks.months = lists__listMonths; + utils_hooks__hooks.isDate = isDate; + utils_hooks__hooks.locale = locale_locales__getSetGlobalLocale; + utils_hooks__hooks.invalid = valid__createInvalid; + utils_hooks__hooks.duration = create__createDuration; + utils_hooks__hooks.isMoment = isMoment; + utils_hooks__hooks.weekdays = lists__listWeekdays; + utils_hooks__hooks.parseZone = moment__createInZone; + utils_hooks__hooks.localeData = locale_locales__getLocale; + utils_hooks__hooks.isDuration = isDuration; + utils_hooks__hooks.monthsShort = lists__listMonthsShort; + utils_hooks__hooks.weekdaysMin = lists__listWeekdaysMin; + utils_hooks__hooks.defineLocale = defineLocale; + utils_hooks__hooks.updateLocale = updateLocale; + utils_hooks__hooks.locales = locale_locales__listLocales; + utils_hooks__hooks.weekdaysShort = lists__listWeekdaysShort; + utils_hooks__hooks.normalizeUnits = normalizeUnits; + utils_hooks__hooks.relativeTimeRounding = duration_humanize__getSetRelativeTimeRounding; + utils_hooks__hooks.relativeTimeThreshold = duration_humanize__getSetRelativeTimeThreshold; + utils_hooks__hooks.calendarFormat = getCalendarFormat; + utils_hooks__hooks.prototype = momentPrototype; + + var _moment = utils_hooks__hooks; + + return _moment; + +})); \ No newline at end of file diff --git a/Monitor/wwwroot/assets/plugins/morris/morris.css b/Monitor/wwwroot/assets/plugins/morris/morris.css new file mode 100644 index 0000000..209f091 --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/morris/morris.css @@ -0,0 +1,2 @@ +.morris-hover{position:absolute;z-index:1000}.morris-hover.morris-default-style{border-radius:10px;padding:6px;color:#666;background:rgba(255,255,255,0.8);border:solid 2px rgba(230,230,230,0.8);font-family:sans-serif;font-size:12px;text-align:center}.morris-hover.morris-default-style .morris-hover-row-label{font-weight:bold;margin:0.25em 0} +.morris-hover.morris-default-style .morris-hover-point{white-space:nowrap;margin:0.1em 0} diff --git a/Monitor/wwwroot/assets/plugins/morris/morris.min.js b/Monitor/wwwroot/assets/plugins/morris/morris.min.js new file mode 100644 index 0000000..c3bda2f --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/morris/morris.min.js @@ -0,0 +1,7 @@ +/* @license +morris.js v0.5.0 +Copyright 2014 Olly Smith All rights reserved. +Licensed under the BSD-2-Clause License. +*/ +(function(){var a,b,c,d,e=[].slice,f=function(a,b){return function(){return a.apply(b,arguments)}},g={}.hasOwnProperty,h=function(a,b){function c(){this.constructor=a}for(var d in b)g.call(b,d)&&(a[d]=b[d]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},i=[].indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(b in this&&this[b]===a)return b;return-1};b=window.Morris={},a=jQuery,b.EventEmitter=function(){function a(){}return a.prototype.on=function(a,b){return null==this.handlers&&(this.handlers={}),null==this.handlers[a]&&(this.handlers[a]=[]),this.handlers[a].push(b),this},a.prototype.fire=function(){var a,b,c,d,f,g,h;if(c=arguments[0],a=2<=arguments.length?e.call(arguments,1):[],null!=this.handlers&&null!=this.handlers[c]){for(g=this.handlers[c],h=[],d=0,f=g.length;f>d;d++)b=g[d],h.push(b.apply(null,a));return h}},a}(),b.commas=function(a){var b,c,d,e;return null!=a?(d=0>a?"-":"",b=Math.abs(a),c=Math.floor(b).toFixed(0),d+=c.replace(/(?=(?:\d{3})+$)(?!^)/g,","),e=b.toString(),e.length>c.length&&(d+=e.slice(c.length)),d):"-"},b.pad2=function(a){return(10>a?"0":"")+a},b.Grid=function(c){function d(b){this.resizeHandler=f(this.resizeHandler,this);var c=this;if(this.el="string"==typeof b.element?a(document.getElementById(b.element)):a(b.element),null==this.el||0===this.el.length)throw new Error("Graph container element not found");"static"===this.el.css("position")&&this.el.css("position","relative"),this.options=a.extend({},this.gridDefaults,this.defaults||{},b),"string"==typeof this.options.units&&(this.options.postUnits=b.units),this.raphael=new Raphael(this.el[0]),this.elementWidth=null,this.elementHeight=null,this.dirty=!1,this.selectFrom=null,this.init&&this.init(),this.setData(this.options.data),this.el.bind("mousemove",function(a){var b,d,e,f,g;return d=c.el.offset(),g=a.pageX-d.left,c.selectFrom?(b=c.data[c.hitTest(Math.min(g,c.selectFrom))]._x,e=c.data[c.hitTest(Math.max(g,c.selectFrom))]._x,f=e-b,c.selectionRect.attr({x:b,width:f})):c.fire("hovermove",g,a.pageY-d.top)}),this.el.bind("mouseleave",function(){return c.selectFrom&&(c.selectionRect.hide(),c.selectFrom=null),c.fire("hoverout")}),this.el.bind("touchstart touchmove touchend",function(a){var b,d;return d=a.originalEvent.touches[0]||a.originalEvent.changedTouches[0],b=c.el.offset(),c.fire("hovermove",d.pageX-b.left,d.pageY-b.top)}),this.el.bind("click",function(a){var b;return b=c.el.offset(),c.fire("gridclick",a.pageX-b.left,a.pageY-b.top)}),this.options.rangeSelect&&(this.selectionRect=this.raphael.rect(0,0,0,this.el.innerHeight()).attr({fill:this.options.rangeSelectColor,stroke:!1}).toBack().hide(),this.el.bind("mousedown",function(a){var b;return b=c.el.offset(),c.startRange(a.pageX-b.left)}),this.el.bind("mouseup",function(a){var b;return b=c.el.offset(),c.endRange(a.pageX-b.left),c.fire("hovermove",a.pageX-b.left,a.pageY-b.top)})),this.options.resize&&a(window).bind("resize",function(){return null!=c.timeoutId&&window.clearTimeout(c.timeoutId),c.timeoutId=window.setTimeout(c.resizeHandler,100)}),this.el.css("-webkit-tap-highlight-color","rgba(0,0,0,0)"),this.postInit&&this.postInit()}return h(d,c),d.prototype.gridDefaults={dateFormat:null,axes:!0,grid:!0,gridLineColor:"#aaa",gridStrokeWidth:.5,gridTextColor:"#888",gridTextSize:12,gridTextFamily:"sans-serif",gridTextWeight:"normal",hideHover:!1,yLabelFormat:null,xLabelAngle:0,numLines:5,padding:25,parseTime:!0,postUnits:"",preUnits:"",ymax:"auto",ymin:"auto 0",goals:[],goalStrokeWidth:1,goalLineColors:["#666633","#999966","#cc6666","#663333"],events:[],eventStrokeWidth:1,eventLineColors:["#005a04","#ccffbb","#3a5f0b","#005502"],rangeSelect:null,rangeSelectColor:"#eef",resize:!1},d.prototype.setData=function(a,c){var d,e,f,g,h,i,j,k,l,m,n,o,p,q,r;return null==c&&(c=!0),this.options.data=a,null==a||0===a.length?(this.data=[],this.raphael.clear(),null!=this.hover&&this.hover.hide(),void 0):(o=this.cumulative?0:null,p=this.cumulative?0:null,this.options.goals.length>0&&(h=Math.min.apply(Math,this.options.goals),g=Math.max.apply(Math,this.options.goals),p=null!=p?Math.min(p,h):h,o=null!=o?Math.max(o,g):g),this.data=function(){var c,d,g;for(g=[],f=c=0,d=a.length;d>c;f=++c)j=a[f],i={src:j},i.label=j[this.options.xkey],this.options.parseTime?(i.x=b.parseDate(i.label),this.options.dateFormat?i.label=this.options.dateFormat(i.x):"number"==typeof i.label&&(i.label=new Date(i.label).toString())):(i.x=f,this.options.xLabelFormat&&(i.label=this.options.xLabelFormat(i))),l=0,i.y=function(){var a,b,c,d;for(c=this.options.ykeys,d=[],e=a=0,b=c.length;b>a;e=++a)n=c[e],q=j[n],"string"==typeof q&&(q=parseFloat(q)),null!=q&&"number"!=typeof q&&(q=null),null!=q&&(this.cumulative?l+=q:null!=o?(o=Math.max(q,o),p=Math.min(q,p)):o=p=q),this.cumulative&&null!=l&&(o=Math.max(l,o),p=Math.min(l,p)),d.push(q);return d}.call(this),g.push(i);return g}.call(this),this.options.parseTime&&(this.data=this.data.sort(function(a,b){return(a.x>b.x)-(b.x>a.x)})),this.xmin=this.data[0].x,this.xmax=this.data[this.data.length-1].x,this.events=[],this.options.events.length>0&&(this.events=this.options.parseTime?function(){var a,c,e,f;for(e=this.options.events,f=[],a=0,c=e.length;c>a;a++)d=e[a],f.push(b.parseDate(d));return f}.call(this):this.options.events,this.xmax=Math.max(this.xmax,Math.max.apply(Math,this.events)),this.xmin=Math.min(this.xmin,Math.min.apply(Math,this.events))),this.xmin===this.xmax&&(this.xmin-=1,this.xmax+=1),this.ymin=this.yboundary("min",p),this.ymax=this.yboundary("max",o),this.ymin===this.ymax&&(p&&(this.ymin-=1),this.ymax+=1),((r=this.options.axes)===!0||"both"===r||"y"===r||this.options.grid===!0)&&(this.options.ymax===this.gridDefaults.ymax&&this.options.ymin===this.gridDefaults.ymin?(this.grid=this.autoGridLines(this.ymin,this.ymax,this.options.numLines),this.ymin=Math.min(this.ymin,this.grid[0]),this.ymax=Math.max(this.ymax,this.grid[this.grid.length-1])):(k=(this.ymax-this.ymin)/(this.options.numLines-1),this.grid=function(){var a,b,c,d;for(d=[],m=a=b=this.ymin,c=this.ymax;k>0?c>=a:a>=c;m=a+=k)d.push(m);return d}.call(this))),this.dirty=!0,c?this.redraw():void 0)},d.prototype.yboundary=function(a,b){var c,d;return c=this.options["y"+a],"string"==typeof c?"auto"===c.slice(0,4)?c.length>5?(d=parseInt(c.slice(5),10),null==b?d:Math[a](b,d)):null!=b?b:0:parseInt(c,10):c},d.prototype.autoGridLines=function(a,b,c){var d,e,f,g,h,i,j,k,l;return h=b-a,l=Math.floor(Math.log(h)/Math.log(10)),j=Math.pow(10,l),e=Math.floor(a/j)*j,d=Math.ceil(b/j)*j,i=(d-e)/(c-1),1===j&&i>1&&Math.ceil(i)!==i&&(i=Math.ceil(i),d=e+i*(c-1)),0>e&&d>0&&(e=Math.floor(a/i)*i,d=Math.ceil(b/i)*i),1>i?(g=Math.floor(Math.log(i)/Math.log(10)),f=function(){var a,b;for(b=[],k=a=e;i>0?d>=a:a>=d;k=a+=i)b.push(parseFloat(k.toFixed(1-g)));return b}()):f=function(){var a,b;for(b=[],k=a=e;i>0?d>=a:a>=d;k=a+=i)b.push(k);return b}(),f},d.prototype._calc=function(){var a,b,c,d,e,f,g,h;return e=this.el.width(),c=this.el.height(),(this.elementWidth!==e||this.elementHeight!==c||this.dirty)&&(this.elementWidth=e,this.elementHeight=c,this.dirty=!1,this.left=this.options.padding,this.right=this.elementWidth-this.options.padding,this.top=this.options.padding,this.bottom=this.elementHeight-this.options.padding,((g=this.options.axes)===!0||"both"===g||"y"===g)&&(f=function(){var a,c,d,e;for(d=this.grid,e=[],a=0,c=d.length;c>a;a++)b=d[a],e.push(this.measureText(this.yAxisFormat(b)).width);return e}.call(this),this.left+=Math.max.apply(Math,f)),((h=this.options.axes)===!0||"both"===h||"x"===h)&&(a=function(){var a,b,c;for(c=[],d=a=0,b=this.data.length;b>=0?b>a:a>b;d=b>=0?++a:--a)c.push(this.measureText(this.data[d].text,-this.options.xLabelAngle).height);return c}.call(this),this.bottom-=Math.max.apply(Math,a)),this.width=Math.max(1,this.right-this.left),this.height=Math.max(1,this.bottom-this.top),this.dx=this.width/(this.xmax-this.xmin),this.dy=this.height/(this.ymax-this.ymin),this.calc)?this.calc():void 0},d.prototype.transY=function(a){return this.bottom-(a-this.ymin)*this.dy},d.prototype.transX=function(a){return 1===this.data.length?(this.left+this.right)/2:this.left+(a-this.xmin)*this.dx},d.prototype.redraw=function(){return this.raphael.clear(),this._calc(),this.drawGrid(),this.drawGoals(),this.drawEvents(),this.draw?this.draw():void 0},d.prototype.measureText=function(a,b){var c,d;return null==b&&(b=0),d=this.raphael.text(100,100,a).attr("font-size",this.options.gridTextSize).attr("font-family",this.options.gridTextFamily).attr("font-weight",this.options.gridTextWeight).rotate(b),c=d.getBBox(),d.remove(),c},d.prototype.yAxisFormat=function(a){return this.yLabelFormat(a)},d.prototype.yLabelFormat=function(a){return"function"==typeof this.options.yLabelFormat?this.options.yLabelFormat(a):""+this.options.preUnits+b.commas(a)+this.options.postUnits},d.prototype.drawGrid=function(){var a,b,c,d,e,f,g,h;if(this.options.grid!==!1||(e=this.options.axes)===!0||"both"===e||"y"===e){for(f=this.grid,h=[],c=0,d=f.length;d>c;c++)a=f[c],b=this.transY(a),((g=this.options.axes)===!0||"both"===g||"y"===g)&&this.drawYAxisLabel(this.left-this.options.padding/2,b,this.yAxisFormat(a)),this.options.grid?h.push(this.drawGridLine("M"+this.left+","+b+"H"+(this.left+this.width))):h.push(void 0);return h}},d.prototype.drawGoals=function(){var a,b,c,d,e,f,g;for(f=this.options.goals,g=[],c=d=0,e=f.length;e>d;c=++d)b=f[c],a=this.options.goalLineColors[c%this.options.goalLineColors.length],g.push(this.drawGoal(b,a));return g},d.prototype.drawEvents=function(){var a,b,c,d,e,f,g;for(f=this.events,g=[],c=d=0,e=f.length;e>d;c=++d)b=f[c],a=this.options.eventLineColors[c%this.options.eventLineColors.length],g.push(this.drawEvent(b,a));return g},d.prototype.drawGoal=function(a,b){return this.raphael.path("M"+this.left+","+this.transY(a)+"H"+this.right).attr("stroke",b).attr("stroke-width",this.options.goalStrokeWidth)},d.prototype.drawEvent=function(a,b){return this.raphael.path("M"+this.transX(a)+","+this.bottom+"V"+this.top).attr("stroke",b).attr("stroke-width",this.options.eventStrokeWidth)},d.prototype.drawYAxisLabel=function(a,b,c){return this.raphael.text(a,b,c).attr("font-size",this.options.gridTextSize).attr("font-family",this.options.gridTextFamily).attr("font-weight",this.options.gridTextWeight).attr("fill",this.options.gridTextColor).attr("text-anchor","end")},d.prototype.drawGridLine=function(a){return this.raphael.path(a).attr("stroke",this.options.gridLineColor).attr("stroke-width",this.options.gridStrokeWidth)},d.prototype.startRange=function(a){return this.hover.hide(),this.selectFrom=a,this.selectionRect.attr({x:a,width:0}).show()},d.prototype.endRange=function(a){var b,c;return this.selectFrom?(c=Math.min(this.selectFrom,a),b=Math.max(this.selectFrom,a),this.options.rangeSelect.call(this.el,{start:this.data[this.hitTest(c)].x,end:this.data[this.hitTest(b)].x}),this.selectFrom=null):void 0},d.prototype.resizeHandler=function(){return this.timeoutId=null,this.raphael.setSize(this.el.width(),this.el.height()),this.redraw()},d}(b.EventEmitter),b.parseDate=function(a){var b,c,d,e,f,g,h,i,j,k,l;return"number"==typeof a?a:(c=a.match(/^(\d+) Q(\d)$/),e=a.match(/^(\d+)-(\d+)$/),f=a.match(/^(\d+)-(\d+)-(\d+)$/),h=a.match(/^(\d+) W(\d+)$/),i=a.match(/^(\d+)-(\d+)-(\d+)[ T](\d+):(\d+)(Z|([+-])(\d\d):?(\d\d))?$/),j=a.match(/^(\d+)-(\d+)-(\d+)[ T](\d+):(\d+):(\d+(\.\d+)?)(Z|([+-])(\d\d):?(\d\d))?$/),c?new Date(parseInt(c[1],10),3*parseInt(c[2],10)-1,1).getTime():e?new Date(parseInt(e[1],10),parseInt(e[2],10)-1,1).getTime():f?new Date(parseInt(f[1],10),parseInt(f[2],10)-1,parseInt(f[3],10)).getTime():h?(k=new Date(parseInt(h[1],10),0,1),4!==k.getDay()&&k.setMonth(0,1+(4-k.getDay()+7)%7),k.getTime()+6048e5*parseInt(h[2],10)):i?i[6]?(g=0,"Z"!==i[6]&&(g=60*parseInt(i[8],10)+parseInt(i[9],10),"+"===i[7]&&(g=0-g)),Date.UTC(parseInt(i[1],10),parseInt(i[2],10)-1,parseInt(i[3],10),parseInt(i[4],10),parseInt(i[5],10)+g)):new Date(parseInt(i[1],10),parseInt(i[2],10)-1,parseInt(i[3],10),parseInt(i[4],10),parseInt(i[5],10)).getTime():j?(l=parseFloat(j[6]),b=Math.floor(l),d=Math.round(1e3*(l-b)),j[8]?(g=0,"Z"!==j[8]&&(g=60*parseInt(j[10],10)+parseInt(j[11],10),"+"===j[9]&&(g=0-g)),Date.UTC(parseInt(j[1],10),parseInt(j[2],10)-1,parseInt(j[3],10),parseInt(j[4],10),parseInt(j[5],10)+g,b,d)):new Date(parseInt(j[1],10),parseInt(j[2],10)-1,parseInt(j[3],10),parseInt(j[4],10),parseInt(j[5],10),b,d).getTime()):new Date(parseInt(a,10),0,1).getTime())},b.Hover=function(){function c(c){null==c&&(c={}),this.options=a.extend({},b.Hover.defaults,c),this.el=a("
      "),this.el.hide(),this.options.parent.append(this.el)}return c.defaults={"class":"morris-hover morris-default-style"},c.prototype.update=function(a,b,c){return a?(this.html(a),this.show(),this.moveTo(b,c)):this.hide()},c.prototype.html=function(a){return this.el.html(a)},c.prototype.moveTo=function(a,b){var c,d,e,f,g,h;return g=this.options.parent.innerWidth(),f=this.options.parent.innerHeight(),d=this.el.outerWidth(),c=this.el.outerHeight(),e=Math.min(Math.max(0,a-d/2),g-d),null!=b?(h=b-c-10,0>h&&(h=b+10,h+c>f&&(h=f/2-c/2))):h=f/2-c/2,this.el.css({left:e+"px",top:parseInt(h)+"px"})},c.prototype.show=function(){return this.el.show()},c.prototype.hide=function(){return this.el.hide()},c}(),b.Line=function(a){function c(a){return this.hilight=f(this.hilight,this),this.onHoverOut=f(this.onHoverOut,this),this.onHoverMove=f(this.onHoverMove,this),this.onGridClick=f(this.onGridClick,this),this instanceof b.Line?(c.__super__.constructor.call(this,a),void 0):new b.Line(a)}return h(c,a),c.prototype.init=function(){return"always"!==this.options.hideHover?(this.hover=new b.Hover({parent:this.el}),this.on("hovermove",this.onHoverMove),this.on("hoverout",this.onHoverOut),this.on("gridclick",this.onGridClick)):void 0},c.prototype.defaults={lineWidth:3,pointSize:4,lineColors:["#0b62a4","#7A92A3","#4da74d","#afd8f8","#edc240","#cb4b4b","#9440ed"],pointStrokeWidths:[1],pointStrokeColors:["#ffffff"],pointFillColors:[],smooth:!0,xLabels:"auto",xLabelFormat:null,xLabelMargin:24,hideHover:!1},c.prototype.calc=function(){return this.calcPoints(),this.generatePaths()},c.prototype.calcPoints=function(){var a,b,c,d,e,f;for(e=this.data,f=[],c=0,d=e.length;d>c;c++)a=e[c],a._x=this.transX(a.x),a._y=function(){var c,d,e,f;for(e=a.y,f=[],c=0,d=e.length;d>c;c++)b=e[c],null!=b?f.push(this.transY(b)):f.push(b);return f}.call(this),f.push(a._ymax=Math.min.apply(Math,[this.bottom].concat(function(){var c,d,e,f;for(e=a._y,f=[],c=0,d=e.length;d>c;c++)b=e[c],null!=b&&f.push(b);return f}())));return f},c.prototype.hitTest=function(a){var b,c,d,e,f;if(0===this.data.length)return null;for(f=this.data.slice(1),b=d=0,e=f.length;e>d&&(c=f[b],!(a<(c._x+this.data[b]._x)/2));b=++d);return b},c.prototype.onGridClick=function(a,b){var c;return c=this.hitTest(a),this.fire("click",c,this.data[c].src,a,b)},c.prototype.onHoverMove=function(a){var b;return b=this.hitTest(a),this.displayHoverForRow(b)},c.prototype.onHoverOut=function(){return this.options.hideHover!==!1?this.displayHoverForRow(null):void 0},c.prototype.displayHoverForRow=function(a){var b;return null!=a?((b=this.hover).update.apply(b,this.hoverContentForRow(a)),this.hilight(a)):(this.hover.hide(),this.hilight())},c.prototype.hoverContentForRow=function(a){var b,c,d,e,f,g,h;for(d=this.data[a],b="
      "+d.label+"
      ",h=d.y,c=f=0,g=h.length;g>f;c=++f)e=h[c],b+="
      \n "+this.options.labels[c]+":\n "+this.yLabelFormat(e)+"\n
      ";return"function"==typeof this.options.hoverCallback&&(b=this.options.hoverCallback(a,this.options,b,d.src)),[b,d._x,d._ymax]},c.prototype.generatePaths=function(){var a,c,d,e;return this.paths=function(){var f,g,h,j;for(j=[],c=f=0,g=this.options.ykeys.length;g>=0?g>f:f>g;c=g>=0?++f:--f)e="boolean"==typeof this.options.smooth?this.options.smooth:(h=this.options.ykeys[c],i.call(this.options.smooth,h)>=0),a=function(){var a,b,e,f;for(e=this.data,f=[],a=0,b=e.length;b>a;a++)d=e[a],void 0!==d._y[c]&&f.push({x:d._x,y:d._y[c]});return f}.call(this),a.length>1?j.push(b.Line.createPath(a,e,this.bottom)):j.push(null);return j}.call(this)},c.prototype.draw=function(){var a;return((a=this.options.axes)===!0||"both"===a||"x"===a)&&this.drawXAxis(),this.drawSeries(),this.options.hideHover===!1?this.displayHoverForRow(this.data.length-1):void 0},c.prototype.drawXAxis=function(){var a,c,d,e,f,g,h,i,j,k,l=this;for(h=this.bottom+this.options.padding/2,f=null,e=null,a=function(a,b){var c,d,g,i,j;return c=l.drawXAxisLabel(l.transX(b),h,a),j=c.getBBox(),c.transform("r"+-l.options.xLabelAngle),d=c.getBBox(),c.transform("t0,"+d.height/2+"..."),0!==l.options.xLabelAngle&&(i=-.5*j.width*Math.cos(l.options.xLabelAngle*Math.PI/180),c.transform("t"+i+",0...")),d=c.getBBox(),(null==f||f>=d.x+d.width||null!=e&&e>=d.x)&&d.x>=0&&d.x+d.widtha;a++)g=c[a],d.push([g.label,g.x]);return d}.call(this),d.reverse(),k=[],i=0,j=d.length;j>i;i++)c=d[i],k.push(a(c[0],c[1]));return k},c.prototype.drawSeries=function(){var a,b,c,d,e,f;for(this.seriesPoints=[],a=b=d=this.options.ykeys.length-1;0>=d?0>=b:b>=0;a=0>=d?++b:--b)this._drawLineFor(a);for(f=[],a=c=e=this.options.ykeys.length-1;0>=e?0>=c:c>=0;a=0>=e?++c:--c)f.push(this._drawPointFor(a));return f},c.prototype._drawPointFor=function(a){var b,c,d,e,f,g;for(this.seriesPoints[a]=[],f=this.data,g=[],d=0,e=f.length;e>d;d++)c=f[d],b=null,null!=c._y[a]&&(b=this.drawLinePoint(c._x,c._y[a],this.colorFor(c,a,"point"),a)),g.push(this.seriesPoints[a].push(b));return g},c.prototype._drawLineFor=function(a){var b;return b=this.paths[a],null!==b?this.drawLinePath(b,this.colorFor(null,a,"line"),a):void 0},c.createPath=function(a,c,d){var e,f,g,h,i,j,k,l,m,n,o,p,q,r;for(k="",c&&(g=b.Line.gradients(a)),l={y:null},h=q=0,r=a.length;r>q;h=++q)e=a[h],null!=e.y&&(null!=l.y?c?(f=g[h],j=g[h-1],i=(e.x-l.x)/4,m=l.x+i,o=Math.min(d,l.y+i*j),n=e.x-i,p=Math.min(d,e.y-i*f),k+="C"+m+","+o+","+n+","+p+","+e.x+","+e.y):k+="L"+e.x+","+e.y:c&&null==g[h]||(k+="M"+e.x+","+e.y)),l=e;return k},c.gradients=function(a){var b,c,d,e,f,g,h,i;for(c=function(a,b){return(a.y-b.y)/(a.x-b.x)},i=[],d=g=0,h=a.length;h>g;d=++g)b=a[d],null!=b.y?(e=a[d+1]||{y:null},f=a[d-1]||{y:null},null!=f.y&&null!=e.y?i.push(c(f,e)):null!=f.y?i.push(c(f,b)):null!=e.y?i.push(c(b,e)):i.push(null)):i.push(null);return i},c.prototype.hilight=function(a){var b,c,d,e,f;if(null!==this.prevHilight&&this.prevHilight!==a)for(b=c=0,e=this.seriesPoints.length-1;e>=0?e>=c:c>=e;b=e>=0?++c:--c)this.seriesPoints[b][this.prevHilight]&&this.seriesPoints[b][this.prevHilight].animate(this.pointShrinkSeries(b));if(null!==a&&this.prevHilight!==a)for(b=d=0,f=this.seriesPoints.length-1;f>=0?f>=d:d>=f;b=f>=0?++d:--d)this.seriesPoints[b][a]&&this.seriesPoints[b][a].animate(this.pointGrowSeries(b));return this.prevHilight=a},c.prototype.colorFor=function(a,b,c){return"function"==typeof this.options.lineColors?this.options.lineColors.call(this,a,b,c):"point"===c?this.options.pointFillColors[b%this.options.pointFillColors.length]||this.options.lineColors[b%this.options.lineColors.length]:this.options.lineColors[b%this.options.lineColors.length]},c.prototype.drawXAxisLabel=function(a,b,c){return this.raphael.text(a,b,c).attr("font-size",this.options.gridTextSize).attr("font-family",this.options.gridTextFamily).attr("font-weight",this.options.gridTextWeight).attr("fill",this.options.gridTextColor)},c.prototype.drawLinePath=function(a,b,c){return this.raphael.path(a).attr("stroke",b).attr("stroke-width",this.lineWidthForSeries(c))},c.prototype.drawLinePoint=function(a,b,c,d){return this.raphael.circle(a,b,this.pointSizeForSeries(d)).attr("fill",c).attr("stroke-width",this.pointStrokeWidthForSeries(d)).attr("stroke",this.pointStrokeColorForSeries(d))},c.prototype.pointStrokeWidthForSeries=function(a){return this.options.pointStrokeWidths[a%this.options.pointStrokeWidths.length]},c.prototype.pointStrokeColorForSeries=function(a){return this.options.pointStrokeColors[a%this.options.pointStrokeColors.length]},c.prototype.lineWidthForSeries=function(a){return this.options.lineWidth instanceof Array?this.options.lineWidth[a%this.options.lineWidth.length]:this.options.lineWidth},c.prototype.pointSizeForSeries=function(a){return this.options.pointSize instanceof Array?this.options.pointSize[a%this.options.pointSize.length]:this.options.pointSize},c.prototype.pointGrowSeries=function(a){return Raphael.animation({r:this.pointSizeForSeries(a)+3},25,"linear")},c.prototype.pointShrinkSeries=function(a){return Raphael.animation({r:this.pointSizeForSeries(a)},25,"linear")},c}(b.Grid),b.labelSeries=function(c,d,e,f,g){var h,i,j,k,l,m,n,o,p,q,r;if(j=200*(d-c)/e,i=new Date(c),n=b.LABEL_SPECS[f],void 0===n)for(r=b.AUTO_LABEL_ORDER,p=0,q=r.length;q>p;p++)if(k=r[p],m=b.LABEL_SPECS[k],j>=m.span){n=m;break}for(void 0===n&&(n=b.LABEL_SPECS.second),g&&(n=a.extend({},n,{fmt:g})),h=n.start(i),l=[];(o=h.getTime())<=d;)o>=c&&l.push([n.fmt(h),o]),n.incr(h);return l},c=function(a){return{span:60*a*1e3,start:function(a){return new Date(a.getFullYear(),a.getMonth(),a.getDate(),a.getHours())},fmt:function(a){return""+b.pad2(a.getHours())+":"+b.pad2(a.getMinutes())},incr:function(b){return b.setUTCMinutes(b.getUTCMinutes()+a)}}},d=function(a){return{span:1e3*a,start:function(a){return new Date(a.getFullYear(),a.getMonth(),a.getDate(),a.getHours(),a.getMinutes())},fmt:function(a){return""+b.pad2(a.getHours())+":"+b.pad2(a.getMinutes())+":"+b.pad2(a.getSeconds())},incr:function(b){return b.setUTCSeconds(b.getUTCSeconds()+a)}}},b.LABEL_SPECS={decade:{span:1728e8,start:function(a){return new Date(a.getFullYear()-a.getFullYear()%10,0,1)},fmt:function(a){return""+a.getFullYear()},incr:function(a){return a.setFullYear(a.getFullYear()+10)}},year:{span:1728e7,start:function(a){return new Date(a.getFullYear(),0,1)},fmt:function(a){return""+a.getFullYear()},incr:function(a){return a.setFullYear(a.getFullYear()+1)}},month:{span:24192e5,start:function(a){return new Date(a.getFullYear(),a.getMonth(),1)},fmt:function(a){return""+a.getFullYear()+"-"+b.pad2(a.getMonth()+1)},incr:function(a){return a.setMonth(a.getMonth()+1)}},week:{span:6048e5,start:function(a){return new Date(a.getFullYear(),a.getMonth(),a.getDate())},fmt:function(a){return""+a.getFullYear()+"-"+b.pad2(a.getMonth()+1)+"-"+b.pad2(a.getDate())},incr:function(a){return a.setDate(a.getDate()+7)}},day:{span:864e5,start:function(a){return new Date(a.getFullYear(),a.getMonth(),a.getDate())},fmt:function(a){return""+a.getFullYear()+"-"+b.pad2(a.getMonth()+1)+"-"+b.pad2(a.getDate())},incr:function(a){return a.setDate(a.getDate()+1)}},hour:c(60),"30min":c(30),"15min":c(15),"10min":c(10),"5min":c(5),minute:c(1),"30sec":d(30),"15sec":d(15),"10sec":d(10),"5sec":d(5),second:d(1)},b.AUTO_LABEL_ORDER=["decade","year","month","week","day","hour","30min","15min","10min","5min","minute","30sec","15sec","10sec","5sec","second"],b.Area=function(c){function d(c){var f;return this instanceof b.Area?(f=a.extend({},e,c),this.cumulative=!f.behaveLikeLine,"auto"===f.fillOpacity&&(f.fillOpacity=f.behaveLikeLine?.8:1),d.__super__.constructor.call(this,f),void 0):new b.Area(c)}var e;return h(d,c),e={fillOpacity:"auto",behaveLikeLine:!1},d.prototype.calcPoints=function(){var a,b,c,d,e,f,g;for(f=this.data,g=[],d=0,e=f.length;e>d;d++)a=f[d],a._x=this.transX(a.x),b=0,a._y=function(){var d,e,f,g;for(f=a.y,g=[],d=0,e=f.length;e>d;d++)c=f[d],this.options.behaveLikeLine?g.push(this.transY(c)):(b+=c||0,g.push(this.transY(b)));return g}.call(this),g.push(a._ymax=Math.max.apply(Math,a._y));return g},d.prototype.drawSeries=function(){var a,b,c,d,e,f,g,h;for(this.seriesPoints=[],b=this.options.behaveLikeLine?function(){f=[];for(var a=0,b=this.options.ykeys.length-1;b>=0?b>=a:a>=b;b>=0?a++:a--)f.push(a);return f}.apply(this):function(){g=[];for(var a=e=this.options.ykeys.length-1;0>=e?0>=a:a>=0;0>=e?a++:a--)g.push(a);return g}.apply(this),h=[],c=0,d=b.length;d>c;c++)a=b[c],this._drawFillFor(a),this._drawLineFor(a),h.push(this._drawPointFor(a));return h},d.prototype._drawFillFor=function(a){var b;return b=this.paths[a],null!==b?(b+="L"+this.transX(this.xmax)+","+this.bottom+"L"+this.transX(this.xmin)+","+this.bottom+"Z",this.drawFilledPath(b,this.fillForSeries(a))):void 0},d.prototype.fillForSeries=function(a){var b;return b=Raphael.rgb2hsl(this.colorFor(this.data[a],a,"line")),Raphael.hsl(b.h,this.options.behaveLikeLine?.9*b.s:.75*b.s,Math.min(.98,this.options.behaveLikeLine?1.2*b.l:1.25*b.l))},d.prototype.drawFilledPath=function(a,b){return this.raphael.path(a).attr("fill",b).attr("fill-opacity",this.options.fillOpacity).attr("stroke","none")},d}(b.Line),b.Bar=function(c){function d(c){return this.onHoverOut=f(this.onHoverOut,this),this.onHoverMove=f(this.onHoverMove,this),this.onGridClick=f(this.onGridClick,this),this instanceof b.Bar?(d.__super__.constructor.call(this,a.extend({},c,{parseTime:!1})),void 0):new b.Bar(c)}return h(d,c),d.prototype.init=function(){return this.cumulative=this.options.stacked,"always"!==this.options.hideHover?(this.hover=new b.Hover({parent:this.el}),this.on("hovermove",this.onHoverMove),this.on("hoverout",this.onHoverOut),this.on("gridclick",this.onGridClick)):void 0},d.prototype.defaults={barSizeRatio:.75,barGap:3,barColors:["#0b62a4","#7a92a3","#4da74d","#afd8f8","#edc240","#cb4b4b","#9440ed"],barOpacity:1,barRadius:[0,0,0,0],xLabelMargin:50},d.prototype.calc=function(){var a;return this.calcBars(),this.options.hideHover===!1?(a=this.hover).update.apply(a,this.hoverContentForRow(this.data.length-1)):void 0},d.prototype.calcBars=function(){var a,b,c,d,e,f,g;for(f=this.data,g=[],a=d=0,e=f.length;e>d;a=++d)b=f[a],b._x=this.left+this.width*(a+.5)/this.data.length,g.push(b._y=function(){var a,d,e,f;for(e=b.y,f=[],a=0,d=e.length;d>a;a++)c=e[a],null!=c?f.push(this.transY(c)):f.push(null);return f}.call(this));return g},d.prototype.draw=function(){var a;return((a=this.options.axes)===!0||"both"===a||"x"===a)&&this.drawXAxis(),this.drawSeries()},d.prototype.drawXAxis=function(){var a,b,c,d,e,f,g,h,i,j,k,l,m;for(j=this.bottom+(this.options.xAxisLabelTopPadding||this.options.padding/2),g=null,f=null,m=[],a=k=0,l=this.data.length;l>=0?l>k:k>l;a=l>=0?++k:--k)h=this.data[this.data.length-1-a],b=this.drawXAxisLabel(h._x,j,h.label),i=b.getBBox(),b.transform("r"+-this.options.xLabelAngle),c=b.getBBox(),b.transform("t0,"+c.height/2+"..."),0!==this.options.xLabelAngle&&(e=-.5*i.width*Math.cos(this.options.xLabelAngle*Math.PI/180),b.transform("t"+e+",0...")),(null==g||g>=c.x+c.width||null!=f&&f>=c.x)&&c.x>=0&&c.x+c.width=0?this.transY(0):null,this.bars=function(){var h,l,p,q;for(p=this.data,q=[],d=h=0,l=p.length;l>h;d=++h)i=p[d],e=0,q.push(function(){var h,l,p,q;for(p=i._y,q=[],j=h=0,l=p.length;l>h;j=++h)n=p[j],null!==n?(o?(m=Math.min(n,o),b=Math.max(n,o)):(m=n,b=this.bottom),f=this.left+d*c+g,this.options.stacked||(f+=j*(a+this.options.barGap)),k=b-m,this.options.verticalGridCondition&&this.options.verticalGridCondition(i.x)&&this.drawBar(this.left+d*c,this.top,c,Math.abs(this.top-this.bottom),this.options.verticalGridColor,this.options.verticalGridOpacity,this.options.barRadius),this.options.stacked&&(m-=e),this.drawBar(f,m,a,k,this.colorFor(i,j,"bar"),this.options.barOpacity,this.options.barRadius),q.push(e+=k)):q.push(null);return q}.call(this));return q}.call(this)},d.prototype.colorFor=function(a,b,c){var d,e;return"function"==typeof this.options.barColors?(d={x:a.x,y:a.y[b],label:a.label},e={index:b,key:this.options.ykeys[b],label:this.options.labels[b]},this.options.barColors.call(this,d,e,c)):this.options.barColors[b%this.options.barColors.length]},d.prototype.hitTest=function(a){return 0===this.data.length?null:(a=Math.max(Math.min(a,this.right),this.left),Math.min(this.data.length-1,Math.floor((a-this.left)/(this.width/this.data.length))))},d.prototype.onGridClick=function(a,b){var c;return c=this.hitTest(a),this.fire("click",c,this.data[c].src,a,b)},d.prototype.onHoverMove=function(a){var b,c;return b=this.hitTest(a),(c=this.hover).update.apply(c,this.hoverContentForRow(b))},d.prototype.onHoverOut=function(){return this.options.hideHover!==!1?this.hover.hide():void 0},d.prototype.hoverContentForRow=function(a){var b,c,d,e,f,g,h,i;for(d=this.data[a],b="
      "+d.label+"
      ",i=d.y,c=g=0,h=i.length;h>g;c=++g)f=i[c],b+="
      \n "+this.options.labels[c]+":\n "+this.yLabelFormat(f)+"\n
      ";return"function"==typeof this.options.hoverCallback&&(b=this.options.hoverCallback(a,this.options,b,d.src)),e=this.left+(a+.5)*this.width/this.data.length,[b,e]},d.prototype.drawXAxisLabel=function(a,b,c){var d;return d=this.raphael.text(a,b,c).attr("font-size",this.options.gridTextSize).attr("font-family",this.options.gridTextFamily).attr("font-weight",this.options.gridTextWeight).attr("fill",this.options.gridTextColor)},d.prototype.drawBar=function(a,b,c,d,e,f,g){var h,i;return h=Math.max.apply(Math,g),i=0===h||h>d?this.raphael.rect(a,b,c,d):this.raphael.path(this.roundedRect(a,b,c,d,g)),i.attr("fill",e).attr("fill-opacity",f).attr("stroke","none")},d.prototype.roundedRect=function(a,b,c,d,e){return null==e&&(e=[0,0,0,0]),["M",a,e[0]+b,"Q",a,b,a+e[0],b,"L",a+c-e[1],b,"Q",a+c,b,a+c,b+e[1],"L",a+c,b+d-e[2],"Q",a+c,b+d,a+c-e[2],b+d,"L",a+e[3],b+d,"Q",a,b+d,a,b+d-e[3],"Z"]},d}(b.Grid),b.Donut=function(c){function d(c){this.resizeHandler=f(this.resizeHandler,this),this.select=f(this.select,this),this.click=f(this.click,this);var d=this;if(!(this instanceof b.Donut))return new b.Donut(c);if(this.options=a.extend({},this.defaults,c),this.el="string"==typeof c.element?a(document.getElementById(c.element)):a(c.element),null===this.el||0===this.el.length)throw new Error("Graph placeholder not found.");void 0!==c.data&&0!==c.data.length&&(this.raphael=new Raphael(this.el[0]),this.options.resize&&a(window).bind("resize",function(){return null!=d.timeoutId&&window.clearTimeout(d.timeoutId),d.timeoutId=window.setTimeout(d.resizeHandler,100)}),this.setData(c.data))}return h(d,c),d.prototype.defaults={colors:["#0B62A4","#3980B5","#679DC6","#95BBD7","#B0CCE1","#095791","#095085","#083E67","#052C48","#042135"],backgroundColor:"#FFFFFF",labelColor:"#000000",formatter:b.commas,resize:!1},d.prototype.redraw=function(){var a,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x;for(this.raphael.clear(),c=this.el.width()/2,d=this.el.height()/2,n=(Math.min(c,d)-10)/3,l=0,u=this.values,o=0,r=u.length;r>o;o++)m=u[o],l+=m;for(i=5/(2*n),a=1.9999*Math.PI-i*this.data.length,g=0,f=0,this.segments=[],v=this.values,e=p=0,s=v.length;s>p;e=++p)m=v[e],j=g+i+a*(m/l),k=new b.DonutSegment(c,d,2*n,n,g,j,this.data[e].color||this.options.colors[f%this.options.colors.length],this.options.backgroundColor,f,this.raphael),k.render(),this.segments.push(k),k.on("hover",this.select),k.on("click",this.click),g=j,f+=1;for(this.text1=this.drawEmptyDonutLabel(c,d-10,this.options.labelColor,15,800),this.text2=this.drawEmptyDonutLabel(c,d+10,this.options.labelColor,14),h=Math.max.apply(Math,this.values),f=0,w=this.values,x=[],q=0,t=w.length;t>q;q++){if(m=w[q],m===h){this.select(f); +break}x.push(f+=1)}return x},d.prototype.setData=function(a){var b;return this.data=a,this.values=function(){var a,c,d,e;for(d=this.data,e=[],a=0,c=d.length;c>a;a++)b=d[a],e.push(parseFloat(b.value));return e}.call(this),this.redraw()},d.prototype.click=function(a){return this.fire("click",a,this.data[a])},d.prototype.select=function(a){var b,c,d,e,f,g;for(g=this.segments,e=0,f=g.length;f>e;e++)c=g[e],c.deselect();return d=this.segments[a],d.select(),b=this.data[a],this.setLabels(b.label,this.options.formatter(b.value,b))},d.prototype.setLabels=function(a,b){var c,d,e,f,g,h,i,j;return c=2*(Math.min(this.el.width()/2,this.el.height()/2)-10)/3,f=1.8*c,e=c/2,d=c/3,this.text1.attr({text:a,transform:""}),g=this.text1.getBBox(),h=Math.min(f/g.width,e/g.height),this.text1.attr({transform:"S"+h+","+h+","+(g.x+g.width/2)+","+(g.y+g.height)}),this.text2.attr({text:b,transform:""}),i=this.text2.getBBox(),j=Math.min(f/i.width,d/i.height),this.text2.attr({transform:"S"+j+","+j+","+(i.x+i.width/2)+","+i.y})},d.prototype.drawEmptyDonutLabel=function(a,b,c,d,e){var f;return f=this.raphael.text(a,b,"").attr("font-size",d).attr("fill",c),null!=e&&f.attr("font-weight",e),f},d.prototype.resizeHandler=function(){return this.timeoutId=null,this.raphael.setSize(this.el.width(),this.el.height()),this.redraw()},d}(b.EventEmitter),b.DonutSegment=function(a){function b(a,b,c,d,e,g,h,i,j,k){this.cx=a,this.cy=b,this.inner=c,this.outer=d,this.color=h,this.backgroundColor=i,this.index=j,this.raphael=k,this.deselect=f(this.deselect,this),this.select=f(this.select,this),this.sin_p0=Math.sin(e),this.cos_p0=Math.cos(e),this.sin_p1=Math.sin(g),this.cos_p1=Math.cos(g),this.is_long=g-e>Math.PI?1:0,this.path=this.calcSegment(this.inner+3,this.inner+this.outer-5),this.selectedPath=this.calcSegment(this.inner+3,this.inner+this.outer),this.hilight=this.calcArc(this.inner)}return h(b,a),b.prototype.calcArcPoints=function(a){return[this.cx+a*this.sin_p0,this.cy+a*this.cos_p0,this.cx+a*this.sin_p1,this.cy+a*this.cos_p1]},b.prototype.calcSegment=function(a,b){var c,d,e,f,g,h,i,j,k,l;return k=this.calcArcPoints(a),c=k[0],e=k[1],d=k[2],f=k[3],l=this.calcArcPoints(b),g=l[0],i=l[1],h=l[2],j=l[3],"M"+c+","+e+("A"+a+","+a+",0,"+this.is_long+",0,"+d+","+f)+("L"+h+","+j)+("A"+b+","+b+",0,"+this.is_long+",1,"+g+","+i)+"Z"},b.prototype.calcArc=function(a){var b,c,d,e,f;return f=this.calcArcPoints(a),b=f[0],d=f[1],c=f[2],e=f[3],"M"+b+","+d+("A"+a+","+a+",0,"+this.is_long+",0,"+c+","+e)},b.prototype.render=function(){var a=this;return this.arc=this.drawDonutArc(this.hilight,this.color),this.seg=this.drawDonutSegment(this.path,this.color,this.backgroundColor,function(){return a.fire("hover",a.index)},function(){return a.fire("click",a.index)})},b.prototype.drawDonutArc=function(a,b){return this.raphael.path(a).attr({stroke:b,"stroke-width":2,opacity:0})},b.prototype.drawDonutSegment=function(a,b,c,d,e){return this.raphael.path(a).attr({fill:b,stroke:c,"stroke-width":3}).hover(d).click(e)},b.prototype.select=function(){return this.selected?void 0:(this.seg.animate({path:this.selectedPath},150,"<>"),this.arc.animate({opacity:1},150,"<>"),this.selected=!0)},b.prototype.deselect=function(){return this.selected?(this.seg.animate({path:this.path},150,"<>"),this.arc.animate({opacity:0},150,"<>"),this.selected=!1):void 0},b}(b.EventEmitter)}).call(this); \ No newline at end of file diff --git a/Monitor/wwwroot/assets/plugins/multiselect/css/multi-select.css b/Monitor/wwwroot/assets/plugins/multiselect/css/multi-select.css new file mode 100644 index 0000000..290fc37 --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/multiselect/css/multi-select.css @@ -0,0 +1,93 @@ +.ms-container{ + background: transparent url('../img/switch.png') no-repeat 50% 50%; + width: 370px; +} + +.ms-container:after{ + content: "."; + display: block; + height: 0; + line-height: 0; + font-size: 0; + clear: both; + min-height: 0; + visibility: hidden; +} + +.ms-container .ms-selectable, .ms-container .ms-selection{ + background: #fff; + color: #555555; + float: left; + width: 45%; +} +.ms-container .ms-selection{ + float: right; +} + +.ms-container .ms-list{ + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -webkit-transition: border linear 0.2s, box-shadow linear 0.2s; + -moz-transition: border linear 0.2s, box-shadow linear 0.2s; + -ms-transition: border linear 0.2s, box-shadow linear 0.2s; + -o-transition: border linear 0.2s, box-shadow linear 0.2s; + transition: border linear 0.2s, box-shadow linear 0.2s; + border: 1px solid #ccc; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + position: relative; + height: 200px; + padding: 0; + overflow-y: auto; +} + +.ms-container .ms-list.ms-focus{ + border-color: rgba(82, 168, 236, 0.8); + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); + outline: 0; + outline: thin dotted \9; +} + +.ms-container ul{ + margin: 0; + list-style-type: none; + padding: 0; +} + +.ms-container .ms-optgroup-container{ + width: 100%; +} + +.ms-container .ms-optgroup-label{ + margin: 0; + padding: 5px 0px 0px 5px; + cursor: pointer; + color: #999; +} + +.ms-container .ms-selectable li.ms-elem-selectable, +.ms-container .ms-selection li.ms-elem-selection{ + border-bottom: 1px #eee solid; + padding: 2px 10px; + color: #555; + font-size: 14px; +} + +.ms-container .ms-selectable li.ms-hover, +.ms-container .ms-selection li.ms-hover{ + cursor: pointer; + color: #fff; + text-decoration: none; + background-color: #08c; +} + +.ms-container .ms-selectable li.disabled, +.ms-container .ms-selection li.disabled{ + background-color: #eee; + color: #aaa; + cursor: text; +} \ No newline at end of file diff --git a/Monitor/wwwroot/assets/plugins/multiselect/img/switch.png b/Monitor/wwwroot/assets/plugins/multiselect/img/switch.png new file mode 100644 index 0000000..7accb6a Binary files /dev/null and b/Monitor/wwwroot/assets/plugins/multiselect/img/switch.png differ diff --git a/Monitor/wwwroot/assets/plugins/multiselect/js/jquery.multi-select.js b/Monitor/wwwroot/assets/plugins/multiselect/js/jquery.multi-select.js new file mode 100644 index 0000000..1c2b124 --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/multiselect/js/jquery.multi-select.js @@ -0,0 +1,528 @@ +/* +* MultiSelect v0.9.12 +* Copyright (c) 2012 Louis Cuny +* +* This program is free software. It comes without any warranty, to +* the extent permitted by applicable law. You can redistribute it +* and/or modify it under the terms of the Do What The Fuck You Want +* To Public License, Version 2, as published by Sam Hocevar. See +* http://sam.zoy.org/wtfpl/COPYING for more details. +*/ + +!function ($) { + + "use strict"; + + + /* MULTISELECT CLASS DEFINITION + * ====================== */ + + var MultiSelect = function (element, options) { + this.options = options; + this.$element = $(element); + this.$container = $('
      ', { 'class': "ms-container" }); + this.$selectableContainer = $('
      ', { 'class': 'ms-selectable' }); + this.$selectionContainer = $('
      ', { 'class': 'ms-selection' }); + this.$selectableUl = $('
        ', { 'class': "ms-list", 'tabindex' : '-1' }); + this.$selectionUl = $('
          ', { 'class': "ms-list", 'tabindex' : '-1' }); + this.scrollTo = 0; + this.elemsSelector = 'li:visible:not(.ms-optgroup-label,.ms-optgroup-container,.'+options.disabledClass+')'; + }; + + MultiSelect.prototype = { + constructor: MultiSelect, + + init: function(){ + var that = this, + ms = this.$element; + + if (ms.next('.ms-container').length === 0){ + ms.css({ position: 'absolute', left: '-9999px' }); + ms.attr('id', ms.attr('id') ? ms.attr('id') : Math.ceil(Math.random()*1000)+'multiselect'); + this.$container.attr('id', 'ms-'+ms.attr('id')); + this.$container.addClass(that.options.cssClass); + ms.find('option').each(function(){ + that.generateLisFromOption(this); + }); + + this.$selectionUl.find('.ms-optgroup-label').hide(); + + if (that.options.selectableHeader){ + that.$selectableContainer.append(that.options.selectableHeader); + } + that.$selectableContainer.append(that.$selectableUl); + if (that.options.selectableFooter){ + that.$selectableContainer.append(that.options.selectableFooter); + } + + if (that.options.selectionHeader){ + that.$selectionContainer.append(that.options.selectionHeader); + } + that.$selectionContainer.append(that.$selectionUl); + if (that.options.selectionFooter){ + that.$selectionContainer.append(that.options.selectionFooter); + } + + that.$container.append(that.$selectableContainer); + that.$container.append(that.$selectionContainer); + ms.after(that.$container); + + that.activeMouse(that.$selectableUl); + that.activeKeyboard(that.$selectableUl); + + var action = that.options.dblClick ? 'dblclick' : 'click'; + + that.$selectableUl.on(action, '.ms-elem-selectable', function(){ + that.select($(this).data('ms-value')); + }); + that.$selectionUl.on(action, '.ms-elem-selection', function(){ + that.deselect($(this).data('ms-value')); + }); + + that.activeMouse(that.$selectionUl); + that.activeKeyboard(that.$selectionUl); + + ms.on('focus', function(){ + that.$selectableUl.focus(); + }) + } + + var selectedValues = ms.find('option:selected').map(function(){ return $(this).val(); }).get(); + that.select(selectedValues, 'init'); + + if (typeof that.options.afterInit === 'function') { + that.options.afterInit.call(this, this.$container); + } + }, + + 'generateLisFromOption' : function(option, index, $container){ + var that = this, + ms = that.$element, + attributes = "", + $option = $(option); + + for (var cpt = 0; cpt < option.attributes.length; cpt++){ + var attr = option.attributes[cpt]; + + if(attr.name !== 'value' && attr.name !== 'disabled'){ + attributes += attr.name+'="'+attr.value+'" '; + } + } + var selectableLi = $('
        • '+that.escapeHTML($option.text())+'
        • '), + selectedLi = selectableLi.clone(), + value = $option.val(), + elementId = that.sanitize(value); + + selectableLi + .data('ms-value', value) + .addClass('ms-elem-selectable') + .attr('id', elementId+'-selectable'); + + selectedLi + .data('ms-value', value) + .addClass('ms-elem-selection') + .attr('id', elementId+'-selection') + .hide(); + + if ($option.prop('disabled') || ms.prop('disabled')){ + selectedLi.addClass(that.options.disabledClass); + selectableLi.addClass(that.options.disabledClass); + } + + var $optgroup = $option.parent('optgroup'); + + if ($optgroup.length > 0){ + var optgroupLabel = $optgroup.attr('label'), + optgroupId = that.sanitize(optgroupLabel), + $selectableOptgroup = that.$selectableUl.find('#optgroup-selectable-'+optgroupId), + $selectionOptgroup = that.$selectionUl.find('#optgroup-selection-'+optgroupId); + + if ($selectableOptgroup.length === 0){ + var optgroupContainerTpl = '
        • ', + optgroupTpl = '
          • '+optgroupLabel+'
          '; + + $selectableOptgroup = $(optgroupContainerTpl); + $selectionOptgroup = $(optgroupContainerTpl); + $selectableOptgroup.attr('id', 'optgroup-selectable-'+optgroupId); + $selectionOptgroup.attr('id', 'optgroup-selection-'+optgroupId); + $selectableOptgroup.append($(optgroupTpl)); + $selectionOptgroup.append($(optgroupTpl)); + if (that.options.selectableOptgroup){ + $selectableOptgroup.find('.ms-optgroup-label').on('click', function(){ + var values = $optgroup.children(':not(:selected, :disabled)').map(function(){ return $(this).val() }).get(); + that.select(values); + }); + $selectionOptgroup.find('.ms-optgroup-label').on('click', function(){ + var values = $optgroup.children(':selected:not(:disabled)').map(function(){ return $(this).val() }).get(); + that.deselect(values); + }); + } + that.$selectableUl.append($selectableOptgroup); + that.$selectionUl.append($selectionOptgroup); + } + index = index == undefined ? $selectableOptgroup.find('ul').children().length : index + 1; + selectableLi.insertAt(index, $selectableOptgroup.children()); + selectedLi.insertAt(index, $selectionOptgroup.children()); + } else { + index = index == undefined ? that.$selectableUl.children().length : index; + + selectableLi.insertAt(index, that.$selectableUl); + selectedLi.insertAt(index, that.$selectionUl); + } + }, + + 'addOption' : function(options){ + var that = this; + + if (options.value) options = [options]; + $.each(options, function(index, option){ + if (option.value && that.$element.find("option[value='"+option.value+"']").length === 0){ + var $option = $(''), + index = parseInt((typeof option.index === 'undefined' ? that.$element.children().length : option.index)), + $container = option.nested == undefined ? that.$element : $("optgroup[label='"+option.nested+"']") + + $option.insertAt(index, $container); + that.generateLisFromOption($option.get(0), index, option.nested); + } + }) + }, + + 'escapeHTML' : function(text){ + return $("
          ").text(text).html(); + }, + + 'activeKeyboard' : function($list){ + var that = this; + + $list.on('focus', function(){ + $(this).addClass('ms-focus'); + }) + .on('blur', function(){ + $(this).removeClass('ms-focus'); + }) + .on('keydown', function(e){ + switch (e.which) { + case 40: + case 38: + e.preventDefault(); + e.stopPropagation(); + that.moveHighlight($(this), (e.which === 38) ? -1 : 1); + return; + case 37: + case 39: + e.preventDefault(); + e.stopPropagation(); + that.switchList($list); + return; + case 9: + if(that.$element.is('[tabindex]')){ + e.preventDefault(); + var tabindex = parseInt(that.$element.attr('tabindex'), 10); + tabindex = (e.shiftKey) ? tabindex-1 : tabindex+1; + $('[tabindex="'+(tabindex)+'"]').focus(); + return; + }else{ + if(e.shiftKey){ + that.$element.trigger('focus'); + } + } + } + if($.inArray(e.which, that.options.keySelect) > -1){ + e.preventDefault(); + e.stopPropagation(); + that.selectHighlighted($list); + return; + } + }); + }, + + 'moveHighlight': function($list, direction){ + var $elems = $list.find(this.elemsSelector), + $currElem = $elems.filter('.ms-hover'), + $nextElem = null, + elemHeight = $elems.first().outerHeight(), + containerHeight = $list.height(), + containerSelector = '#'+this.$container.prop('id'); + + $elems.removeClass('ms-hover'); + if (direction === 1){ // DOWN + + $nextElem = $currElem.nextAll(this.elemsSelector).first(); + if ($nextElem.length === 0){ + var $optgroupUl = $currElem.parent(); + + if ($optgroupUl.hasClass('ms-optgroup')){ + var $optgroupLi = $optgroupUl.parent(), + $nextOptgroupLi = $optgroupLi.next(':visible'); + + if ($nextOptgroupLi.length > 0){ + $nextElem = $nextOptgroupLi.find(this.elemsSelector).first(); + } else { + $nextElem = $elems.first(); + } + } else { + $nextElem = $elems.first(); + } + } + } else if (direction === -1){ // UP + + $nextElem = $currElem.prevAll(this.elemsSelector).first(); + if ($nextElem.length === 0){ + var $optgroupUl = $currElem.parent(); + + if ($optgroupUl.hasClass('ms-optgroup')){ + var $optgroupLi = $optgroupUl.parent(), + $prevOptgroupLi = $optgroupLi.prev(':visible'); + + if ($prevOptgroupLi.length > 0){ + $nextElem = $prevOptgroupLi.find(this.elemsSelector).last(); + } else { + $nextElem = $elems.last(); + } + } else { + $nextElem = $elems.last(); + } + } + } + if ($nextElem.length > 0){ + $nextElem.addClass('ms-hover'); + var scrollTo = $list.scrollTop() + $nextElem.position().top - + containerHeight / 2 + elemHeight / 2; + + $list.scrollTop(scrollTo); + } + }, + + 'selectHighlighted' : function($list){ + var $elems = $list.find(this.elemsSelector), + $highlightedElem = $elems.filter('.ms-hover').first(); + + if ($highlightedElem.length > 0){ + if ($list.parent().hasClass('ms-selectable')){ + this.select($highlightedElem.data('ms-value')); + } else { + this.deselect($highlightedElem.data('ms-value')); + } + $elems.removeClass('ms-hover'); + } + }, + + 'switchList' : function($list){ + $list.blur(); + this.$container.find(this.elemsSelector).removeClass('ms-hover'); + if ($list.parent().hasClass('ms-selectable')){ + this.$selectionUl.focus(); + } else { + this.$selectableUl.focus(); + } + }, + + 'activeMouse' : function($list){ + var that = this; + + $('body').on('mouseenter', that.elemsSelector, function(){ + $(this).parents('.ms-container').find(that.elemsSelector).removeClass('ms-hover'); + $(this).addClass('ms-hover'); + }); + }, + + 'refresh' : function() { + this.destroy(); + this.$element.multiSelect(this.options); + }, + + 'destroy' : function(){ + $("#ms-"+this.$element.attr("id")).remove(); + this.$element.css('position', '').css('left', '') + this.$element.removeData('multiselect'); + }, + + 'select' : function(value, method){ + if (typeof value === 'string'){ value = [value]; } + + var that = this, + ms = this.$element, + msIds = $.map(value, function(val){ return(that.sanitize(val)); }), + selectables = this.$selectableUl.find('#' + msIds.join('-selectable, #')+'-selectable').filter(':not(.'+that.options.disabledClass+')'), + selections = this.$selectionUl.find('#' + msIds.join('-selection, #') + '-selection').filter(':not(.'+that.options.disabledClass+')'), + options = ms.find('option:not(:disabled)').filter(function(){ return($.inArray(this.value, value) > -1); }); + + if (method === 'init'){ + selectables = this.$selectableUl.find('#' + msIds.join('-selectable, #')+'-selectable'), + selections = this.$selectionUl.find('#' + msIds.join('-selection, #') + '-selection'); + } + + if (selectables.length > 0){ + selectables.addClass('ms-selected').hide(); + selections.addClass('ms-selected').show(); + + options.prop('selected', true); + + that.$container.find(that.elemsSelector).removeClass('ms-hover'); + + var selectableOptgroups = that.$selectableUl.children('.ms-optgroup-container'); + if (selectableOptgroups.length > 0){ + selectableOptgroups.each(function(){ + var selectablesLi = $(this).find('.ms-elem-selectable'); + if (selectablesLi.length === selectablesLi.filter('.ms-selected').length){ + $(this).find('.ms-optgroup-label').hide(); + } + }); + + var selectionOptgroups = that.$selectionUl.children('.ms-optgroup-container'); + selectionOptgroups.each(function(){ + var selectionsLi = $(this).find('.ms-elem-selection'); + if (selectionsLi.filter('.ms-selected').length > 0){ + $(this).find('.ms-optgroup-label').show(); + } + }); + } else { + if (that.options.keepOrder && method !== 'init'){ + var selectionLiLast = that.$selectionUl.find('.ms-selected'); + if((selectionLiLast.length > 1) && (selectionLiLast.last().get(0) != selections.get(0))) { + selections.insertAfter(selectionLiLast.last()); + } + } + } + if (method !== 'init'){ + ms.trigger('change'); + if (typeof that.options.afterSelect === 'function') { + that.options.afterSelect.call(this, value); + } + } + } + }, + + 'deselect' : function(value){ + if (typeof value === 'string'){ value = [value]; } + + var that = this, + ms = this.$element, + msIds = $.map(value, function(val){ return(that.sanitize(val)); }), + selectables = this.$selectableUl.find('#' + msIds.join('-selectable, #')+'-selectable'), + selections = this.$selectionUl.find('#' + msIds.join('-selection, #')+'-selection').filter('.ms-selected').filter(':not(.'+that.options.disabledClass+')'), + options = ms.find('option').filter(function(){ return($.inArray(this.value, value) > -1); }); + + if (selections.length > 0){ + selectables.removeClass('ms-selected').show(); + selections.removeClass('ms-selected').hide(); + options.prop('selected', false); + + that.$container.find(that.elemsSelector).removeClass('ms-hover'); + + var selectableOptgroups = that.$selectableUl.children('.ms-optgroup-container'); + if (selectableOptgroups.length > 0){ + selectableOptgroups.each(function(){ + var selectablesLi = $(this).find('.ms-elem-selectable'); + if (selectablesLi.filter(':not(.ms-selected)').length > 0){ + $(this).find('.ms-optgroup-label').show(); + } + }); + + var selectionOptgroups = that.$selectionUl.children('.ms-optgroup-container'); + selectionOptgroups.each(function(){ + var selectionsLi = $(this).find('.ms-elem-selection'); + if (selectionsLi.filter('.ms-selected').length === 0){ + $(this).find('.ms-optgroup-label').hide(); + } + }); + } + ms.trigger('change'); + if (typeof that.options.afterDeselect === 'function') { + that.options.afterDeselect.call(this, value); + } + } + }, + + 'select_all' : function(){ + var ms = this.$element, + values = ms.val(); + + ms.find('option:not(":disabled")').prop('selected', true); + this.$selectableUl.find('.ms-elem-selectable').filter(':not(.'+this.options.disabledClass+')').addClass('ms-selected').hide(); + this.$selectionUl.find('.ms-optgroup-label').show(); + this.$selectableUl.find('.ms-optgroup-label').hide(); + this.$selectionUl.find('.ms-elem-selection').filter(':not(.'+this.options.disabledClass+')').addClass('ms-selected').show(); + this.$selectionUl.focus(); + ms.trigger('change'); + if (typeof this.options.afterSelect === 'function') { + var selectedValues = $.grep(ms.val(), function(item){ + return $.inArray(item, values) < 0; + }); + this.options.afterSelect.call(this, selectedValues); + } + }, + + 'deselect_all' : function(){ + var ms = this.$element, + values = ms.val(); + + ms.find('option').prop('selected', false); + this.$selectableUl.find('.ms-elem-selectable').removeClass('ms-selected').show(); + this.$selectionUl.find('.ms-optgroup-label').hide(); + this.$selectableUl.find('.ms-optgroup-label').show(); + this.$selectionUl.find('.ms-elem-selection').removeClass('ms-selected').hide(); + this.$selectableUl.focus(); + ms.trigger('change'); + if (typeof this.options.afterDeselect === 'function') { + this.options.afterDeselect.call(this, values); + } + }, + + sanitize: function(value){ + var hash = 0, i, character; + if (value.length == 0) return hash; + var ls = 0; + for (i = 0, ls = value.length; i < ls; i++) { + character = value.charCodeAt(i); + hash = ((hash<<5)-hash)+character; + hash |= 0; // Convert to 32bit integer + } + return hash; + } + }; + + /* MULTISELECT PLUGIN DEFINITION + * ======================= */ + + $.fn.multiSelect = function () { + var option = arguments[0], + args = arguments; + + return this.each(function () { + var $this = $(this), + data = $this.data('multiselect'), + options = $.extend({}, $.fn.multiSelect.defaults, $this.data(), typeof option === 'object' && option); + + if (!data){ $this.data('multiselect', (data = new MultiSelect(this, options))); } + + if (typeof option === 'string'){ + data[option](args[1]); + } else { + data.init(); + } + }); + }; + + $.fn.multiSelect.defaults = { + keySelect: [32], + selectableOptgroup: false, + disabledClass : 'disabled', + dblClick : false, + keepOrder: false, + cssClass: '' + }; + + $.fn.multiSelect.Constructor = MultiSelect; + + $.fn.insertAt = function(index, $parent) { + return this.each(function() { + if (index === 0) { + $parent.prepend(this); + } else { + $parent.children().eq(index - 1).after(this); + } + }); +} + +}(window.jQuery); diff --git a/Monitor/wwwroot/assets/plugins/nestable/jquery.nestable.css b/Monitor/wwwroot/assets/plugins/nestable/jquery.nestable.css new file mode 100644 index 0000000..f9d5d55 --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/nestable/jquery.nestable.css @@ -0,0 +1,74 @@ +/** + * Nestable + */ + +.dd { position: relative; display: block; margin: 0; padding: 0; max-width: 600px; list-style: none; font-size: 13px; line-height: 20px; } + +.dd-list { display: block; position: relative; margin: 0; padding: 0; list-style: none; } +.dd-list .dd-list { padding-left: 30px; } +.dd-collapsed .dd-list { display: none; } + +.dd-item, +.dd-empty, +.dd-placeholder { display: block; position: relative; margin: 0; padding: 0; min-height: 20px; font-size: 13px; line-height: 20px; } + +.dd-handle { display: block; height: 30px; margin: 5px 0; padding: 5px 10px; cursor: move; color: #979898; text-decoration: none; font-weight: bold; border: 1px solid #e5e5e5; + background: #fafafa; + /*background: -webkit-linear-gradient(top, #fafafa 0%, #eee 100%);*/ + /*background: -moz-linear-gradient(top, #fafafa 0%, #eee 100%);*/ + /*background: linear-gradient(top, #fafafa 0%, #eee 100%);*/ + + box-sizing: border-box; -moz-box-sizing: border-box; +} +.dd-handle:hover { color: #317eeb; background: #fff; } + +.dd-item > button { display: block; position: relative; cursor: pointer; float: left; width: 25px; height: 20px; margin: 5px 0; padding: 0; text-indent: 100%; white-space: nowrap; overflow: hidden; border: 0; background: transparent; font-size: 12px; line-height: 1; text-align: center; font-weight: bold; } +.dd-item > button:before { content: '+'; display: block; position: absolute; width: 100%; text-align: center; text-indent: 0; } +.dd-item > button[data-action="collapse"]:before { content: '-'; } + +.dd-placeholder, +.dd-empty { margin: 5px 0; padding: 0; min-height: 30px; background: #f2fbff; border: 1px dashed #b6bcbf; box-sizing: border-box; -moz-box-sizing: border-box; } +.dd-empty { border: 1px dashed #bbb; min-height: 100px; background-color: #e5e5e5; + background-image: -webkit-linear-gradient(45deg, #fff 25%, transparent 25%, transparent 75%, #fff 75%, #fff), + -webkit-linear-gradient(45deg, #fff 25%, transparent 25%, transparent 75%, #fff 75%, #fff); + background-image: -moz-linear-gradient(45deg, #fff 25%, transparent 25%, transparent 75%, #fff 75%, #fff), + -moz-linear-gradient(45deg, #fff 25%, transparent 25%, transparent 75%, #fff 75%, #fff); + background-image: linear-gradient(45deg, #fff 25%, transparent 25%, transparent 75%, #fff 75%, #fff), + linear-gradient(45deg, #fff 25%, transparent 25%, transparent 75%, #fff 75%, #fff); + background-size: 60px 60px; + background-position: 0 0, 30px 30px; +} + +.dd-dragel { position: absolute; pointer-events: none; z-index: 9999; } +.dd-dragel > .dd-item .dd-handle { margin-top: 0; } +.dd-dragel .dd-handle { + -webkit-box-shadow: 2px 4px 6px 0 rgba(0,0,0,.1); + box-shadow: 2px 4px 6px 0 rgba(0,0,0,.1); +} + + +.dd3-content { display: block; height: 30px; margin: 5px 0; padding: 5px 10px 5px 40px; color: #979898; text-decoration: none; font-weight: bold; border: 1px solid #e5e5e5; + background: #fafafa; + /*background: -webkit-linear-gradient(top, #fafafa 0%, #eee 100%);*/ + /*background: -moz-linear-gradient(top, #fafafa 0%, #eee 100%);*/ + /*background: linear-gradient(top, #fafafa 0%, #eee 100%);*/ + + box-sizing: border-box; -moz-box-sizing: border-box; +} +.dd3-content:hover { color: #317eeb; background: #fff; } + +.dd-dragel > .dd3-item > .dd3-content { margin: 0; } + +.dd3-item > button { margin-left: 30px; } + +.dd3-handle { position: absolute; margin: 0; left: 0; top: 0; cursor: pointer; width: 30px; text-indent: 100%; white-space: nowrap; overflow: hidden; + border: 1px solid #ccc; + background: #d5d5d5; + /*background: -webkit-linear-gradient(top, #ddd 0%, #bbb 100%);*/ + /*background: -moz-linear-gradient(top, #ddd 0%, #bbb 100%);*/ + /*background: linear-gradient(top, #ddd 0%, #bbb 100%);*/ + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.dd3-handle:before { content: "\f0c9";font-family: FontAwesome; display: block; position: absolute; left: 0; top: 3px; width: 100%; text-align: center; text-indent: 0; color: #fff; font-size: 14px; font-weight: normal; } +.dd3-handle:hover { background: #404040; border:1px solid #404040; } \ No newline at end of file diff --git a/Monitor/wwwroot/assets/plugins/nestable/jquery.nestable.js b/Monitor/wwwroot/assets/plugins/nestable/jquery.nestable.js new file mode 100644 index 0000000..c23d6b4 --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/nestable/jquery.nestable.js @@ -0,0 +1,485 @@ +/*! + * Nestable jQuery Plugin - Copyright (c) 2012 David Bushell - http://dbushell.com/ + * Dual-licensed under the BSD or MIT licenses + */ +;(function($, window, document, undefined) +{ + var hasTouch = 'ontouchstart' in window; + + /** + * Detect CSS pointer-events property + * events are normally disabled on the dragging element to avoid conflicts + * https://github.com/ausi/Feature-detection-technique-for-pointer-events/blob/master/modernizr-pointerevents.js + */ + var hasPointerEvents = (function() + { + var el = document.createElement('div'), + docEl = document.documentElement; + if (!('pointerEvents' in el.style)) { + return false; + } + el.style.pointerEvents = 'auto'; + el.style.pointerEvents = 'x'; + docEl.appendChild(el); + var supports = window.getComputedStyle && window.getComputedStyle(el, '').pointerEvents === 'auto'; + docEl.removeChild(el); + return !!supports; + })(); + + var eStart = hasTouch ? 'touchstart' : 'mousedown', + eMove = hasTouch ? 'touchmove' : 'mousemove', + eEnd = hasTouch ? 'touchend' : 'mouseup'; + eCancel = hasTouch ? 'touchcancel' : 'mouseup'; + + var defaults = { + listNodeName : 'ol', + itemNodeName : 'li', + rootClass : 'dd', + listClass : 'dd-list', + itemClass : 'dd-item', + dragClass : 'dd-dragel', + handleClass : 'dd-handle', + collapsedClass : 'dd-collapsed', + placeClass : 'dd-placeholder', + noDragClass : 'dd-nodrag', + emptyClass : 'dd-empty', + expandBtnHTML : '', + collapseBtnHTML : '', + group : 0, + maxDepth : 5, + threshold : 20 + }; + + function Plugin(element, options) + { + this.w = $(window); + this.el = $(element); + this.options = $.extend({}, defaults, options); + this.init(); + } + + Plugin.prototype = { + + init: function() + { + var list = this; + + list.reset(); + + list.el.data('nestable-group', this.options.group); + + list.placeEl = $('
          '); + + $.each(this.el.find(list.options.itemNodeName), function(k, el) { + list.setParent($(el)); + }); + + list.el.on('click', 'button', function(e) { + if (list.dragEl || (!hasTouch && e.button !== 0)) { + return; + } + var target = $(e.currentTarget), + action = target.data('action'), + item = target.parent(list.options.itemNodeName); + if (action === 'collapse') { + list.collapseItem(item); + } + if (action === 'expand') { + list.expandItem(item); + } + }); + + var onStartEvent = function(e) + { + var handle = $(e.target); + if (!handle.hasClass(list.options.handleClass)) { + if (handle.closest('.' + list.options.noDragClass).length) { + return; + } + handle = handle.closest('.' + list.options.handleClass); + } + if (!handle.length || list.dragEl || (!hasTouch && e.button !== 0) || (hasTouch && e.touches.length !== 1)) { + return; + } + e.preventDefault(); + list.dragStart(hasTouch ? e.touches[0] : e); + }; + + var onMoveEvent = function(e) + { + if (list.dragEl) { + e.preventDefault(); + list.dragMove(hasTouch ? e.touches[0] : e); + } + }; + + var onEndEvent = function(e) + { + if (list.dragEl) { + e.preventDefault(); + list.dragStop(hasTouch ? e.touches[0] : e); + } + }; + + if (hasTouch) { + list.el[0].addEventListener(eStart, onStartEvent, false); + window.addEventListener(eMove, onMoveEvent, false); + window.addEventListener(eEnd, onEndEvent, false); + window.addEventListener(eCancel, onEndEvent, false); + } else { + list.el.on(eStart, onStartEvent); + list.w.on(eMove, onMoveEvent); + list.w.on(eEnd, onEndEvent); + } + + }, + + serialize: function() + { + var data, + depth = 0, + list = this; + step = function(level, depth) + { + var array = [ ], + items = level.children(list.options.itemNodeName); + items.each(function() + { + var li = $(this), + item = $.extend({}, li.data()), + sub = li.children(list.options.listNodeName); + if (sub.length) { + item.children = step(sub, depth + 1); + } + array.push(item); + }); + return array; + }; + data = step(list.el.find(list.options.listNodeName).first(), depth); + return data; + }, + + serialise: function() + { + return this.serialize(); + }, + + reset: function() + { + this.mouse = { + offsetX : 0, + offsetY : 0, + startX : 0, + startY : 0, + lastX : 0, + lastY : 0, + nowX : 0, + nowY : 0, + distX : 0, + distY : 0, + dirAx : 0, + dirX : 0, + dirY : 0, + lastDirX : 0, + lastDirY : 0, + distAxX : 0, + distAxY : 0 + }; + this.moving = false; + this.dragEl = null; + this.dragRootEl = null; + this.dragDepth = 0; + this.hasNewRoot = false; + this.pointEl = null; + }, + + expandItem: function(li) + { + li.removeClass(this.options.collapsedClass); + li.children('[data-action="expand"]').hide(); + li.children('[data-action="collapse"]').show(); + li.children(this.options.listNodeName).show(); + }, + + collapseItem: function(li) + { + var lists = li.children(this.options.listNodeName); + if (lists.length) { + li.addClass(this.options.collapsedClass); + li.children('[data-action="collapse"]').hide(); + li.children('[data-action="expand"]').show(); + li.children(this.options.listNodeName).hide(); + } + }, + + expandAll: function() + { + var list = this; + list.el.find(list.options.itemNodeName).each(function() { + list.expandItem($(this)); + }); + }, + + collapseAll: function() + { + var list = this; + list.el.find(list.options.itemNodeName).each(function() { + list.collapseItem($(this)); + }); + }, + + setParent: function(li) + { + if (li.children(this.options.listNodeName).length) { + li.prepend($(this.options.expandBtnHTML)); + li.prepend($(this.options.collapseBtnHTML)); + } + li.children('[data-action="expand"]').hide(); + }, + + unsetParent: function(li) + { + li.removeClass(this.options.collapsedClass); + li.children('[data-action]').remove(); + li.children(this.options.listNodeName).remove(); + }, + + dragStart: function(e) + { + var mouse = this.mouse, + target = $(e.target), + dragItem = target.closest(this.options.itemNodeName); + + this.placeEl.css('height', dragItem.height()); + + mouse.offsetX = e.offsetX !== undefined ? e.offsetX : e.pageX - target.offset().left; + mouse.offsetY = e.offsetY !== undefined ? e.offsetY : e.pageY - target.offset().top; + mouse.startX = mouse.lastX = e.pageX; + mouse.startY = mouse.lastY = e.pageY; + + this.dragRootEl = this.el; + + this.dragEl = $(document.createElement(this.options.listNodeName)).addClass(this.options.listClass + ' ' + this.options.dragClass); + this.dragEl.css('width', dragItem.width()); + + // fix for zepto.js + //dragItem.after(this.placeEl).detach().appendTo(this.dragEl); + dragItem.after(this.placeEl); + dragItem[0].parentNode.removeChild(dragItem[0]); + dragItem.appendTo(this.dragEl); + + $(document.body).append(this.dragEl); + this.dragEl.css({ + 'left' : e.pageX - mouse.offsetX, + 'top' : e.pageY - mouse.offsetY + }); + // total depth of dragging item + var i, depth, + items = this.dragEl.find(this.options.itemNodeName); + for (i = 0; i < items.length; i++) { + depth = $(items[i]).parents(this.options.listNodeName).length; + if (depth > this.dragDepth) { + this.dragDepth = depth; + } + } + }, + + dragStop: function(e) + { + // fix for zepto.js + //this.placeEl.replaceWith(this.dragEl.children(this.options.itemNodeName + ':first').detach()); + var el = this.dragEl.children(this.options.itemNodeName).first(); + el[0].parentNode.removeChild(el[0]); + this.placeEl.replaceWith(el); + + this.dragEl.remove(); + this.el.trigger('change'); + if (this.hasNewRoot) { + this.dragRootEl.trigger('change'); + } + this.reset(); + }, + + dragMove: function(e) + { + var list, parent, prev, next, depth, + opt = this.options, + mouse = this.mouse; + + this.dragEl.css({ + 'left' : e.pageX - mouse.offsetX, + 'top' : e.pageY - mouse.offsetY + }); + + // mouse position last events + mouse.lastX = mouse.nowX; + mouse.lastY = mouse.nowY; + // mouse position this events + mouse.nowX = e.pageX; + mouse.nowY = e.pageY; + // distance mouse moved between events + mouse.distX = mouse.nowX - mouse.lastX; + mouse.distY = mouse.nowY - mouse.lastY; + // direction mouse was moving + mouse.lastDirX = mouse.dirX; + mouse.lastDirY = mouse.dirY; + // direction mouse is now moving (on both axis) + mouse.dirX = mouse.distX === 0 ? 0 : mouse.distX > 0 ? 1 : -1; + mouse.dirY = mouse.distY === 0 ? 0 : mouse.distY > 0 ? 1 : -1; + // axis mouse is now moving on + var newAx = Math.abs(mouse.distX) > Math.abs(mouse.distY) ? 1 : 0; + + // do nothing on first move + if (!mouse.moving) { + mouse.dirAx = newAx; + mouse.moving = true; + return; + } + + // calc distance moved on this axis (and direction) + if (mouse.dirAx !== newAx) { + mouse.distAxX = 0; + mouse.distAxY = 0; + } else { + mouse.distAxX += Math.abs(mouse.distX); + if (mouse.dirX !== 0 && mouse.dirX !== mouse.lastDirX) { + mouse.distAxX = 0; + } + mouse.distAxY += Math.abs(mouse.distY); + if (mouse.dirY !== 0 && mouse.dirY !== mouse.lastDirY) { + mouse.distAxY = 0; + } + } + mouse.dirAx = newAx; + + /** + * move horizontal + */ + if (mouse.dirAx && mouse.distAxX >= opt.threshold) { + // reset move distance on x-axis for new phase + mouse.distAxX = 0; + prev = this.placeEl.prev(opt.itemNodeName); + // increase horizontal level if previous sibling exists and is not collapsed + if (mouse.distX > 0 && prev.length && !prev.hasClass(opt.collapsedClass)) { + // cannot increase level when item above is collapsed + list = prev.find(opt.listNodeName).last(); + // check if depth limit has reached + depth = this.placeEl.parents(opt.listNodeName).length; + if (depth + this.dragDepth <= opt.maxDepth) { + // create new sub-level if one doesn't exist + if (!list.length) { + list = $('<' + opt.listNodeName + '/>').addClass(opt.listClass); + list.append(this.placeEl); + prev.append(list); + this.setParent(prev); + } else { + // else append to next level up + list = prev.children(opt.listNodeName).last(); + list.append(this.placeEl); + } + } + } + // decrease horizontal level + if (mouse.distX < 0) { + // we can't decrease a level if an item preceeds the current one + next = this.placeEl.next(opt.itemNodeName); + if (!next.length) { + parent = this.placeEl.parent(); + this.placeEl.closest(opt.itemNodeName).after(this.placeEl); + if (!parent.children().length) { + this.unsetParent(parent.parent()); + } + } + } + } + + var isEmpty = false; + + // find list item under cursor + if (!hasPointerEvents) { + this.dragEl[0].style.visibility = 'hidden'; + } + this.pointEl = $(document.elementFromPoint(e.pageX - document.body.scrollLeft, e.pageY - (window.pageYOffset || document.documentElement.scrollTop))); + if (!hasPointerEvents) { + this.dragEl[0].style.visibility = 'visible'; + } + if (this.pointEl.hasClass(opt.handleClass)) { + this.pointEl = this.pointEl.parent(opt.itemNodeName); + } + if (this.pointEl.hasClass(opt.emptyClass)) { + isEmpty = true; + } + else if (!this.pointEl.length || !this.pointEl.hasClass(opt.itemClass)) { + return; + } + + // find parent list of item under cursor + var pointElRoot = this.pointEl.closest('.' + opt.rootClass), + isNewRoot = this.dragRootEl.data('nestable-id') !== pointElRoot.data('nestable-id'); + + /** + * move vertical + */ + if (!mouse.dirAx || isNewRoot || isEmpty) { + // check if groups match if dragging over new root + if (isNewRoot && opt.group !== pointElRoot.data('nestable-group')) { + return; + } + // check depth limit + depth = this.dragDepth - 1 + this.pointEl.parents(opt.listNodeName).length; + if (depth > opt.maxDepth) { + return; + } + var before = e.pageY < (this.pointEl.offset().top + this.pointEl.height() / 2); + parent = this.placeEl.parent(); + // if empty create new list to replace empty placeholder + if (isEmpty) { + list = $(document.createElement(opt.listNodeName)).addClass(opt.listClass); + list.append(this.placeEl); + this.pointEl.replaceWith(list); + } + else if (before) { + this.pointEl.before(this.placeEl); + } + else { + this.pointEl.after(this.placeEl); + } + if (!parent.children().length) { + this.unsetParent(parent.parent()); + } + if (!this.dragRootEl.find(opt.itemNodeName).length) { + this.dragRootEl.append('
          '); + } + // parent root list has changed + if (isNewRoot) { + this.dragRootEl = pointElRoot; + this.hasNewRoot = this.el[0] !== this.dragRootEl[0]; + } + } + } + + }; + + $.fn.nestable = function(params) + { + var lists = this, + retval = this; + + lists.each(function() + { + var plugin = $(this).data("nestable"); + + if (!plugin) { + $(this).data("nestable", new Plugin(this, params)); + $(this).data("nestable-id", new Date().getTime()); + } else { + if (typeof params === 'string' && typeof plugin[params] === 'function') { + retval = plugin[params](); + } + } + }); + + return retval || lists; + }; + +})(window.jQuery || window.Zepto, window, document); \ No newline at end of file diff --git a/Monitor/wwwroot/assets/plugins/notifications/notification.css b/Monitor/wwwroot/assets/plugins/notifications/notification.css new file mode 100644 index 0000000..1de6c5c --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/notifications/notification.css @@ -0,0 +1,56 @@ +.notifyjs-metro-base { + position: relative; + min-height: 52px; + min-width: 250px; + color:#444; + border-radius: 3px; + -webkit-border-radius: 3px; + box-shadow: 0px 1px 0px rgba(0, 0, 0, 0.2); + -webkit-animation: dropdownOpen 0.3s ease-out; + -o-animation: dropdownOpen 0.3s ease-out; + animation: dropdownOpen 0.3s ease-out; +} + +.notifyjs-metro-base .image { + display: table; + position: absolute; + height: auto; + width: auto; + left: 25px; + top: 50%; + font-size: 24px; + -moz-transform: translate(-50%, -50%); + -ms-transform: translate(-50%, -50%); + -o-transform: translate(-50%, -50%); + -webkit-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); +} + +.notifyjs-metro-base .text-wrapper { + display: inline-block; + vertical-align: top; + text-align: left; + margin: 10px 10px 10px 52px; + clear: both; + +} + +.notifyjs-metro-base .title { + font-size: 15px; + line-height: 20px; + margin-bottom: 5px; + font-weight: bold; +} + +.notifyjs-metro-base .text { + font-size: 12px; + font-weight: normal; + max-width: 360px; + vertical-align: middle; + +} +.notifyjs-metro-cool { + color: #fafafa !important; + background-color: #4A525F; + border: 1px solid #4A525F; +} \ No newline at end of file diff --git a/Monitor/wwwroot/assets/plugins/notifications/notify-metro.js b/Monitor/wwwroot/assets/plugins/notifications/notify-metro.js new file mode 100644 index 0000000..c56b3d1 --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/notifications/notify-metro.js @@ -0,0 +1,51 @@ +$.notify.addStyle("metro", { + html: + "
          " + + "
          " + + "
          " + + "
          " + + "
          " + + "
          " + + "
          ", + classes: { + default: { + "color": "#fafafa !important", + "background-color": "#ABB7B7", + "border": "1px solid #ABB7B7" + }, + error: { + "color": "#fafafa !important", + "background-color": "#f05050", + "border": "1px solid #ef5350" + }, + custom: { + "color": "#fafafa !important", + "background-color": "#5fbeaa", + "border": "1px solid #5fbeaa" + }, + success: { + "color": "#fafafa !important", + "background-color": "#81c868", + "border": "1px solid #33b86c" + }, + info: { + "color": "#fafafa !important", + "background-color": "#34d3eb", + "border": "1px solid #29b6f6" + }, + warning: { + "color": "#fafafa !important", + "background-color": "#ffbd4a", + "border": "1px solid #ffd740" + }, + black: { + "color": "#fafafa !important", + "background-color": "#4c5667", + "border": "1px solid #212121" + }, + white: { + "background-color": "#e6eaed", + "border": "1px solid #ddd" + } + } +}); \ No newline at end of file diff --git a/Monitor/wwwroot/assets/plugins/notifications/notify.min.js b/Monitor/wwwroot/assets/plugins/notifications/notify.min.js new file mode 100644 index 0000000..bafa7af --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/notifications/notify.min.js @@ -0,0 +1,5 @@ +/** Notify.js - v0.3.1 - 2014/02/06 + * http://notifyjs.com/ + * Copyright (c) 2014 Jaime Pillora - MIT + */ +(function(t,i,n,e){"use strict";var o,r,s,a,l,h,c,p,u,d,f,A,m,w,g,y,b,v,x,C,S,E,M,k,H,D,F,T=[].indexOf||function(t){for(var i=0,n=this.length;n>i;i++)if(i in this&&this[i]===t)return i;return-1};S="notify",C=S+"js",s=S+"!blank",M={t:"top",m:"middle",b:"bottom",l:"left",c:"center",r:"right"},m=["l","c","r"],F=["t","m","b"],b=["t","b","l","r"],v={t:"b",m:null,b:"t",l:"r",c:null,r:"l"},x=function(t){var i;return i=[],n.each(t.split(/\W+/),function(t,n){var o;return o=n.toLowerCase().charAt(0),M[o]?i.push(o):e}),i},D={},a={name:"core",html:'
          \n
          \n
          \n
          ',css:"."+C+"-corner {\n position: fixed;\n margin: 5px;\n z-index: 1050;\n}\n\n."+C+"-corner ."+C+"-wrapper,\n."+C+"-corner ."+C+"-container {\n position: relative;\n display: block;\n height: inherit;\n width: inherit;\n margin: 3px;\n}\n\n."+C+"-wrapper {\n z-index: 1;\n position: absolute;\n display: inline-block;\n height: 0;\n width: 0;\n}\n\n."+C+"-container {\n display: none;\n z-index: 1;\n position: absolute;\n cursor: pointer;\n}\n\n[data-notify-text],[data-notify-html] {\n position: relative;\n}\n\n."+C+"-arrow {\n position: absolute;\n z-index: 2;\n width: 0;\n height: 0;\n}"},H={"border-radius":["-webkit-","-moz-"]},f=function(t){return D[t]},r=function(i,e){var o,r,s,a;if(!i)throw"Missing Style name";if(!e)throw"Missing Style definition";if(!e.html)throw"Missing Style HTML";return(null!=(a=D[i])?a.cssElem:void 0)&&(t.console&&console.warn(""+S+": overwriting style '"+i+"'"),D[i].cssElem.remove()),e.name=i,D[i]=e,o="",e.classes&&n.each(e.classes,function(t,i){return o+="."+C+"-"+e.name+"-"+t+" {\n",n.each(i,function(t,i){return H[t]&&n.each(H[t],function(n,e){return o+=" "+e+t+": "+i+";\n"}),o+=" "+t+": "+i+";\n"}),o+="}\n"}),e.css&&(o+="/* styles for "+e.name+" */\n"+e.css),o&&(e.cssElem=y(o),e.cssElem.attr("id","notify-"+e.name)),s={},r=n(e.html),u("html",r,s),u("text",r,s),e.fields=s},y=function(t){var i;i=l("style"),i.attr("type","text/css"),n("head").append(i);try{i.html(t)}catch(e){i[0].styleSheet.cssText=t}return i},u=function(t,i,e){var o;return"html"!==t&&(t="text"),o="data-notify-"+t,p(i,"["+o+"]").each(function(){var i;return i=n(this).attr(o),i||(i=s),e[i]=t})},p=function(t,i){return t.is(i)?t:t.find(i)},E={clickToHide:!0,autoHide:!0,autoHideDelay:5e3,arrowShow:!0,arrowSize:5,breakNewLines:!0,elementPosition:"bottom",globalPosition:"top right",style:"bootstrap",className:"error",showAnimation:"slideDown",showDuration:400,hideAnimation:"slideUp",hideDuration:200,gap:5},g=function(t,i){var e;return e=function(){},e.prototype=t,n.extend(!0,new e,i)},h=function(t){return n.extend(E,t)},l=function(t){return n("<"+t+">")},A={},d=function(t){var i;return t.is("[type=radio]")&&(i=t.parents("form:first").find("[type=radio]").filter(function(i,e){return n(e).attr("name")===t.attr("name")}),t=i.first()),t},w=function(t,i,n){var o,r;if("string"==typeof n)n=parseInt(n,10);else if("number"!=typeof n)return;if(!isNaN(n))return o=M[v[i.charAt(0)]],r=i,t[o]!==e&&(i=M[o.charAt(0)],n=-n),t[i]===e?t[i]=n:t[i]+=n,null},k=function(t,i,n){if("l"===t||"t"===t)return 0;if("c"===t||"m"===t)return n/2-i/2;if("r"===t||"b"===t)return n-i;throw"Invalid alignment"},c=function(t){return c.e=c.e||l("div"),c.e.text(t).html()},o=function(){function t(t,i,e){"string"==typeof e&&(e={className:e}),this.options=g(E,n.isPlainObject(e)?e:{}),this.loadHTML(),this.wrapper=n(a.html),this.wrapper.data(C,this),this.arrow=this.wrapper.find("."+C+"-arrow"),this.container=this.wrapper.find("."+C+"-container"),this.container.append(this.userContainer),t&&t.length&&(this.elementType=t.attr("type"),this.originalElement=t,this.elem=d(t),this.elem.data(C,this),this.elem.before(this.wrapper)),this.container.hide(),this.run(i)}return t.prototype.loadHTML=function(){var t;return t=this.getStyle(),this.userContainer=n(t.html),this.userFields=t.fields},t.prototype.show=function(t,i){var n,o,r,s,a,l=this;if(o=function(){return t||l.elem||l.destroy(),i?i():e},a=this.container.parent().parents(":hidden").length>0,r=this.container.add(this.arrow),n=[],a&&t)s="show";else if(a&&!t)s="hide";else if(!a&&t)s=this.options.showAnimation,n.push(this.options.showDuration);else{if(a||t)return o();s=this.options.hideAnimation,n.push(this.options.hideDuration)}return n.push(o),r[s].apply(r,n)},t.prototype.setGlobalPosition=function(){var t,i,e,o,r,s,a,h;return h=this.getPosition(),a=h[0],s=h[1],r=M[a],t=M[s],o=a+"|"+s,i=A[o],i||(i=A[o]=l("div"),e={},e[r]=0,"middle"===t?e.top="45%":"center"===t?e.left="45%":e[t]=0,i.css(e).addClass(""+C+"-corner"),n("body").append(i)),i.prepend(this.wrapper)},t.prototype.setElementPosition=function(){var t,i,o,r,s,a,l,h,c,p,u,d,f,A,g,y,x,C,S,E,H,D,z,Q,B,R,N,P,U;for(z=this.getPosition(),E=z[0],C=z[1],S=z[2],u=this.elem.position(),h=this.elem.outerHeight(),d=this.elem.outerWidth(),c=this.elem.innerHeight(),p=this.elem.innerWidth(),Q=this.wrapper.position(),s=this.container.height(),a=this.container.width(),A=M[E],y=v[E],x=M[y],l={},l[x]="b"===E?h:"r"===E?d:0,w(l,"top",u.top-Q.top),w(l,"left",u.left-Q.left),U=["top","left"],B=0,N=U.length;N>B;B++)H=U[B],g=parseInt(this.elem.css("margin-"+H),10),g&&w(l,H,g);if(f=Math.max(0,this.options.gap-(this.options.arrowShow?o:0)),w(l,x,f),this.options.arrowShow){for(o=this.options.arrowSize,i=n.extend({},l),t=this.userContainer.css("border-color")||this.userContainer.css("background-color")||"white",R=0,P=b.length;P>R;R++)H=b[R],D=M[H],H!==y&&(r=D===A?t:"transparent",i["border-"+D]=""+o+"px solid "+r);w(l,M[y],o),T.call(b,C)>=0&&w(i,M[C],2*o)}else this.arrow.hide();return T.call(F,E)>=0?(w(l,"left",k(C,a,d)),i&&w(i,"left",k(C,o,p))):T.call(m,E)>=0&&(w(l,"top",k(C,s,h)),i&&w(i,"top",k(C,o,c))),this.container.is(":visible")&&(l.display="block"),this.container.removeAttr("style").css(l),i?this.arrow.removeAttr("style").css(i):e},t.prototype.getPosition=function(){var t,i,n,e,o,r,s,a;if(i=this.options.position||(this.elem?this.options.elementPosition:this.options.globalPosition),t=x(i),0===t.length&&(t[0]="b"),n=t[0],0>T.call(b,n))throw"Must be one of ["+b+"]";return(1===t.length||(e=t[0],T.call(F,e)>=0&&(o=t[1],0>T.call(m,o)))||(r=t[0],T.call(m,r)>=0&&(s=t[1],0>T.call(F,s))))&&(t[1]=(a=t[0],T.call(m,a)>=0?"m":"l")),2===t.length&&(t[2]=t[1]),t},t.prototype.getStyle=function(t){var i;if(t||(t=this.options.style),t||(t="default"),i=D[t],!i)throw"Missing style: "+t;return i},t.prototype.updateClasses=function(){var t,i;return t=["base"],n.isArray(this.options.className)?t=t.concat(this.options.className):this.options.className&&t.push(this.options.className),i=this.getStyle(),t=n.map(t,function(t){return""+C+"-"+i.name+"-"+t}).join(" "),this.userContainer.attr("class",t)},t.prototype.run=function(t,i){var o,r,a,l,h,u=this;if(n.isPlainObject(i)?n.extend(this.options,i):"string"===n.type(i)&&(this.options.className=i),this.container&&!t)return this.show(!1),e;if(this.container||t){r={},n.isPlainObject(t)?r=t:r[s]=t;for(a in r)o=r[a],l=this.userFields[a],l&&("text"===l&&(o=c(o),this.options.breakNewLines&&(o=o.replace(/\n/g,"
          "))),h=a===s?"":"="+a,p(this.userContainer,"[data-notify-"+l+h+"]").html(o));return this.updateClasses(),this.elem?this.setElementPosition():this.setGlobalPosition(),this.show(!0),this.options.autoHide?(clearTimeout(this.autohideTimer),this.autohideTimer=setTimeout(function(){return u.show(!1)},this.options.autoHideDelay)):e}},t.prototype.destroy=function(){return this.wrapper.remove()},t}(),n[S]=function(t,i,e){return t&&t.nodeName||t.jquery?n(t)[S](i,e):(e=i,i=t,new o(null,i,e)),t},n.fn[S]=function(t,i){return n(this).each(function(){var e;return e=d(n(this)).data(C),e?e.run(t,i):new o(n(this),t,i)}),this},n.extend(n[S],{defaults:h,addStyle:r,pluginOptions:E,getStyle:f,insertCSS:y}),n(function(){return y(a.css).attr("id","core-notify"),n(i).on("click notify-hide","."+C+"-wrapper",function(t){var i;return i=n(this).data(C),i&&(i.options.clickToHide||"notify-hide"===t.type)?i.show(!1):e})})})(window,document,jQuery),$.notify.addStyle("bootstrap",{html:"
          \n\n
          ",classes:{base:{"font-weight":"bold",padding:"8px 15px 8px 14px","text-shadow":"0 1px 0 rgba(255, 255, 255, 0.5)","background-color":"#fcf8e3",border:"1px solid #fbeed5","border-radius":"4px","white-space":"nowrap","padding-left":"25px","background-repeat":"no-repeat","background-position":"3px 7px"},error:{color:"#B94A48","background-color":"#F2DEDE","border-color":"#EED3D7","background-image":"url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAtRJREFUeNqkVc1u00AQHq+dOD+0poIQfkIjalW0SEGqRMuRnHos3DjwAH0ArlyQeANOOSMeAA5VjyBxKBQhgSpVUKKQNGloFdw4cWw2jtfMOna6JOUArDTazXi/b3dm55socPqQhFka++aHBsI8GsopRJERNFlY88FCEk9Yiwf8RhgRyaHFQpPHCDmZG5oX2ui2yilkcTT1AcDsbYC1NMAyOi7zTX2Agx7A9luAl88BauiiQ/cJaZQfIpAlngDcvZZMrl8vFPK5+XktrWlx3/ehZ5r9+t6e+WVnp1pxnNIjgBe4/6dAysQc8dsmHwPcW9C0h3fW1hans1ltwJhy0GxK7XZbUlMp5Ww2eyan6+ft/f2FAqXGK4CvQk5HueFz7D6GOZtIrK+srupdx1GRBBqNBtzc2AiMr7nPplRdKhb1q6q6zjFhrklEFOUutoQ50xcX86ZlqaZpQrfbBdu2R6/G19zX6XSgh6RX5ubyHCM8nqSID6ICrGiZjGYYxojEsiw4PDwMSL5VKsC8Yf4VRYFzMzMaxwjlJSlCyAQ9l0CW44PBADzXhe7xMdi9HtTrdYjFYkDQL0cn4Xdq2/EAE+InCnvADTf2eah4Sx9vExQjkqXT6aAERICMewd/UAp/IeYANM2joxt+q5VI+ieq2i0Wg3l6DNzHwTERPgo1ko7XBXj3vdlsT2F+UuhIhYkp7u7CarkcrFOCtR3H5JiwbAIeImjT/YQKKBtGjRFCU5IUgFRe7fF4cCNVIPMYo3VKqxwjyNAXNepuopyqnld602qVsfRpEkkz+GFL1wPj6ySXBpJtWVa5xlhpcyhBNwpZHmtX8AGgfIExo0ZpzkWVTBGiXCSEaHh62/PoR0p/vHaczxXGnj4bSo+G78lELU80h1uogBwWLf5YlsPmgDEd4M236xjm+8nm4IuE/9u+/PH2JXZfbwz4zw1WbO+SQPpXfwG/BBgAhCNZiSb/pOQAAAAASUVORK5CYII=)"},success:{color:"#468847","background-color":"#DFF0D8","border-color":"#D6E9C6","background-image":"url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAutJREFUeNq0lctPE0Ecx38zu/RFS1EryqtgJFA08YCiMZIAQQ4eRG8eDGdPJiYeTIwHTfwPiAcvXIwXLwoXPaDxkWgQ6islKlJLSQWLUraPLTv7Gme32zoF9KSTfLO7v53vZ3d/M7/fIth+IO6INt2jjoA7bjHCJoAlzCRw59YwHYjBnfMPqAKWQYKjGkfCJqAF0xwZjipQtA3MxeSG87VhOOYegVrUCy7UZM9S6TLIdAamySTclZdYhFhRHloGYg7mgZv1Zzztvgud7V1tbQ2twYA34LJmF4p5dXF1KTufnE+SxeJtuCZNsLDCQU0+RyKTF27Unw101l8e6hns3u0PBalORVVVkcaEKBJDgV3+cGM4tKKmI+ohlIGnygKX00rSBfszz/n2uXv81wd6+rt1orsZCHRdr1Imk2F2Kob3hutSxW8thsd8AXNaln9D7CTfA6O+0UgkMuwVvEFFUbbAcrkcTA8+AtOk8E6KiQiDmMFSDqZItAzEVQviRkdDdaFgPp8HSZKAEAL5Qh7Sq2lIJBJwv2scUqkUnKoZgNhcDKhKg5aH+1IkcouCAdFGAQsuWZYhOjwFHQ96oagWgRoUov1T9kRBEODAwxM2QtEUl+Wp+Ln9VRo6BcMw4ErHRYjH4/B26AlQoQQTRdHWwcd9AH57+UAXddvDD37DmrBBV34WfqiXPl61g+vr6xA9zsGeM9gOdsNXkgpEtTwVvwOklXLKm6+/p5ezwk4B+j6droBs2CsGa/gNs6RIxazl4Tc25mpTgw/apPR1LYlNRFAzgsOxkyXYLIM1V8NMwyAkJSctD1eGVKiq5wWjSPdjmeTkiKvVW4f2YPHWl3GAVq6ymcyCTgovM3FzyRiDe2TaKcEKsLpJvNHjZgPNqEtyi6mZIm4SRFyLMUsONSSdkPeFtY1n0mczoY3BHTLhwPRy9/lzcziCw9ACI+yql0VLzcGAZbYSM5CCSZg1/9oc/nn7+i8N9p/8An4JMADxhH+xHfuiKwAAAABJRU5ErkJggg==)"},info:{color:"#3A87AD","background-color":"#D9EDF7","border-color":"#BCE8F1","background-image":"url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3QYFAhkSsdes/QAAA8dJREFUOMvVlGtMW2UYx//POaWHXg6lLaW0ypAtw1UCgbniNOLcVOLmAjHZolOYlxmTGXVZdAnRfXQm+7SoU4mXaOaiZsEpC9FkiQs6Z6bdCnNYruM6KNBw6YWewzl9z+sHImEWv+vz7XmT95f/+3/+7wP814v+efDOV3/SoX3lHAA+6ODeUFfMfjOWMADgdk+eEKz0pF7aQdMAcOKLLjrcVMVX3xdWN29/GhYP7SvnP0cWfS8caSkfHZsPE9Fgnt02JNutQ0QYHB2dDz9/pKX8QjjuO9xUxd/66HdxTeCHZ3rojQObGQBcuNjfplkD3b19Y/6MrimSaKgSMmpGU5WevmE/swa6Oy73tQHA0Rdr2Mmv/6A1n9w9suQ7097Z9lM4FlTgTDrzZTu4StXVfpiI48rVcUDM5cmEksrFnHxfpTtU/3BFQzCQF/2bYVoNbH7zmItbSoMj40JSzmMyX5qDvriA7QdrIIpA+3cdsMpu0nXI8cV0MtKXCPZev+gCEM1S2NHPvWfP/hL+7FSr3+0p5RBEyhEN5JCKYr8XnASMT0xBNyzQGQeI8fjsGD39RMPk7se2bd5ZtTyoFYXftF6y37gx7NeUtJJOTFlAHDZLDuILU3j3+H5oOrD3yWbIztugaAzgnBKJuBLpGfQrS8wO4FZgV+c1IxaLgWVU0tMLEETCos4xMzEIv9cJXQcyagIwigDGwJgOAtHAwAhisQUjy0ORGERiELgG4iakkzo4MYAxcM5hAMi1WWG1yYCJIcMUaBkVRLdGeSU2995TLWzcUAzONJ7J6FBVBYIggMzmFbvdBV44Corg8vjhzC+EJEl8U1kJtgYrhCzgc/vvTwXKSib1paRFVRVORDAJAsw5FuTaJEhWM2SHB3mOAlhkNxwuLzeJsGwqWzf5TFNdKgtY5qHp6ZFf67Y/sAVadCaVY5YACDDb3Oi4NIjLnWMw2QthCBIsVhsUTU9tvXsjeq9+X1d75/KEs4LNOfcdf/+HthMnvwxOD0wmHaXr7ZItn2wuH2SnBzbZAbPJwpPx+VQuzcm7dgRCB57a1uBzUDRL4bfnI0RE0eaXd9W89mpjqHZnUI5Hh2l2dkZZUhOqpi2qSmpOmZ64Tuu9qlz/SEXo6MEHa3wOip46F1n7633eekV8ds8Wxjn37Wl63VVa+ej5oeEZ/82ZBETJjpJ1Rbij2D3Z/1trXUvLsblCK0XfOx0SX2kMsn9dX+d+7Kf6h8o4AIykuffjT8L20LU+w4AZd5VvEPY+XpWqLV327HR7DzXuDnD8r+ovkBehJ8i+y8YAAAAASUVORK5CYII=)"},warn:{color:"#C09853","background-color":"#FCF8E3","border-color":"#FBEED5","background-image":"url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAMAAAC6V+0/AAABJlBMVEXr6eb/2oD/wi7/xjr/0mP/ykf/tQD/vBj/3o7/uQ//vyL/twebhgD/4pzX1K3z8e349vK6tHCilCWbiQymn0jGworr6dXQza3HxcKkn1vWvV/5uRfk4dXZ1bD18+/52YebiAmyr5S9mhCzrWq5t6ufjRH54aLs0oS+qD751XqPhAybhwXsujG3sm+Zk0PTwG6Shg+PhhObhwOPgQL4zV2nlyrf27uLfgCPhRHu7OmLgAafkyiWkD3l49ibiAfTs0C+lgCniwD4sgDJxqOilzDWowWFfAH08uebig6qpFHBvH/aw26FfQTQzsvy8OyEfz20r3jAvaKbhgG9q0nc2LbZxXanoUu/u5WSggCtp1anpJKdmFz/zlX/1nGJiYmuq5Dx7+sAAADoPUZSAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfdBgUBGhh4aah5AAAAlklEQVQY02NgoBIIE8EUcwn1FkIXM1Tj5dDUQhPU502Mi7XXQxGz5uVIjGOJUUUW81HnYEyMi2HVcUOICQZzMMYmxrEyMylJwgUt5BljWRLjmJm4pI1hYp5SQLGYxDgmLnZOVxuooClIDKgXKMbN5ggV1ACLJcaBxNgcoiGCBiZwdWxOETBDrTyEFey0jYJ4eHjMGWgEAIpRFRCUt08qAAAAAElFTkSuQmCC)"}}}); \ No newline at end of file diff --git a/Monitor/wwwroot/assets/plugins/notifyjs/js/notify.js b/Monitor/wwwroot/assets/plugins/notifyjs/js/notify.js new file mode 100644 index 0000000..3971640 --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/notifyjs/js/notify.js @@ -0,0 +1,625 @@ +/* Notify.js - http://notifyjs.com/ Copyright (c) 2015 MIT */ +(function (factory) { + // UMD start + // https://github.com/umdjs/umd/blob/master/jqueryPluginCommonjs.js + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(['jquery'], factory); + } else if (typeof module === 'object' && module.exports) { + // Node/CommonJS + module.exports = function( root, jQuery ) { + if ( jQuery === undefined ) { + // require('jQuery') returns a factory that requires window to + // build a jQuery instance, we normalize how we use modules + // that require this pattern but the window provided is a noop + // if it's defined (how jquery works) + if ( typeof window !== 'undefined' ) { + jQuery = require('jquery'); + } + else { + jQuery = require('jquery')(root); + } + } + factory(jQuery); + return jQuery; + }; + } else { + // Browser globals + factory(jQuery); + } +}(function ($) { + //IE8 indexOf polyfill + var indexOf = [].indexOf || function(item) { + for (var i = 0, l = this.length; i < l; i++) { + if (i in this && this[i] === item) { + return i; + } + } + return -1; + }; + + var pluginName = "notify"; + var pluginClassName = pluginName + "js"; + var blankFieldName = pluginName + "!blank"; + + var positions = { + t: "top", + m: "middle", + b: "bottom", + l: "left", + c: "center", + r: "right" + }; + var hAligns = ["l", "c", "r"]; + var vAligns = ["t", "m", "b"]; + var mainPositions = ["t", "b", "l", "r"]; + var opposites = { + t: "b", + m: null, + b: "t", + l: "r", + c: null, + r: "l" + }; + + var parsePosition = function(str) { + var pos; + pos = []; + $.each(str.split(/\W+/), function(i, word) { + var w; + w = word.toLowerCase().charAt(0); + if (positions[w]) { + return pos.push(w); + } + }); + return pos; + }; + + var styles = {}; + + var coreStyle = { + name: "core", + html: "
          \n
          \n
          \n
          ", + css: "." + pluginClassName + "-corner {\n position: fixed;\n margin: 5px;\n z-index: 1050;\n}\n\n." + pluginClassName + "-corner ." + pluginClassName + "-wrapper,\n." + pluginClassName + "-corner ." + pluginClassName + "-container {\n position: relative;\n display: block;\n height: inherit;\n width: inherit;\n margin: 3px;\n}\n\n." + pluginClassName + "-wrapper {\n z-index: 1;\n position: absolute;\n display: inline-block;\n height: 0;\n width: 0;\n}\n\n." + pluginClassName + "-container {\n display: none;\n z-index: 1;\n position: absolute;\n}\n\n." + pluginClassName + "-hidable {\n cursor: pointer;\n}\n\n[data-notify-text],[data-notify-html] {\n position: relative;\n}\n\n." + pluginClassName + "-arrow {\n position: absolute;\n z-index: 2;\n width: 0;\n height: 0;\n}" + }; + + var stylePrefixes = { + "border-radius": ["-webkit-", "-moz-"] + }; + + var getStyle = function(name) { + return styles[name]; + }; + + var removeStyle = function(name) { + if (!name) { + throw "Missing Style name"; + } + if (styles[name]) { + delete styles[name]; + } + }; + + var addStyle = function(name, def) { + if (!name) { + throw "Missing Style name"; + } + if (!def) { + throw "Missing Style definition"; + } + if (!def.html) { + throw "Missing Style HTML"; + } + //remove existing style + var existing = styles[name]; + if (existing && existing.cssElem) { + if (window.console) { + console.warn(pluginName + ": overwriting style '" + name + "'"); + } + styles[name].cssElem.remove(); + } + def.name = name; + styles[name] = def; + var cssText = ""; + if (def.classes) { + $.each(def.classes, function(className, props) { + cssText += "." + pluginClassName + "-" + def.name + "-" + className + " {\n"; + $.each(props, function(name, val) { + if (stylePrefixes[name]) { + $.each(stylePrefixes[name], function(i, prefix) { + return cssText += " " + prefix + name + ": " + val + ";\n"; + }); + } + return cssText += " " + name + ": " + val + ";\n"; + }); + return cssText += "}\n"; + }); + } + if (def.css) { + cssText += "/* styles for " + def.name + " */\n" + def.css; + } + if (cssText) { + def.cssElem = insertCSS(cssText); + def.cssElem.attr("id", "notify-" + def.name); + } + var fields = {}; + var elem = $(def.html); + findFields("html", elem, fields); + findFields("text", elem, fields); + def.fields = fields; + }; + + var insertCSS = function(cssText) { + var e, elem, error; + elem = createElem("style"); + elem.attr("type", 'text/css'); + $("head").append(elem); + try { + elem.html(cssText); + } catch (_) { + elem[0].styleSheet.cssText = cssText; + } + return elem; + }; + + var findFields = function(type, elem, fields) { + var attr; + if (type !== "html") { + type = "text"; + } + attr = "data-notify-" + type; + return find(elem, "[" + attr + "]").each(function() { + var name; + name = $(this).attr(attr); + if (!name) { + name = blankFieldName; + } + fields[name] = type; + }); + }; + + var find = function(elem, selector) { + if (elem.is(selector)) { + return elem; + } else { + return elem.find(selector); + } + }; + + var pluginOptions = { + clickToHide: true, + autoHide: true, + autoHideDelay: 5000, + arrowShow: true, + arrowSize: 5, + breakNewLines: true, + elementPosition: "bottom", + globalPosition: "top right", + style: "bootstrap", + className: "error", + showAnimation: "slideDown", + showDuration: 400, + hideAnimation: "slideUp", + hideDuration: 200, + gap: 5 + }; + + var inherit = function(a, b) { + var F; + F = function() {}; + F.prototype = a; + return $.extend(true, new F(), b); + }; + + var defaults = function(opts) { + return $.extend(pluginOptions, opts); + }; + + var createElem = function(tag) { + return $("<" + tag + ">"); + }; + + var globalAnchors = {}; + + var getAnchorElement = function(element) { + var radios; + if (element.is('[type=radio]')) { + radios = element.parents('form:first').find('[type=radio]').filter(function(i, e) { + return $(e).attr("name") === element.attr("name"); + }); + element = radios.first(); + } + return element; + }; + + var incr = function(obj, pos, val) { + var opp, temp; + if (typeof val === "string") { + val = parseInt(val, 10); + } else if (typeof val !== "number") { + return; + } + if (isNaN(val)) { + return; + } + opp = positions[opposites[pos.charAt(0)]]; + temp = pos; + if (obj[opp] !== undefined) { + pos = positions[opp.charAt(0)]; + val = -val; + } + if (obj[pos] === undefined) { + obj[pos] = val; + } else { + obj[pos] += val; + } + return null; + }; + + var realign = function(alignment, inner, outer) { + if (alignment === "l" || alignment === "t") { + return 0; + } else if (alignment === "c" || alignment === "m") { + return outer / 2 - inner / 2; + } else if (alignment === "r" || alignment === "b") { + return outer - inner; + } + throw "Invalid alignment"; + }; + + var encode = function(text) { + encode.e = encode.e || createElem("div"); + return encode.e.text(text).html(); + }; + + function Notification(elem, data, options) { + if (typeof options === "string") { + options = { + className: options + }; + } + this.options = inherit(pluginOptions, $.isPlainObject(options) ? options : {}); + this.loadHTML(); + this.wrapper = $(coreStyle.html); + if (this.options.clickToHide) { + this.wrapper.addClass(pluginClassName + "-hidable"); + } + this.wrapper.data(pluginClassName, this); + this.arrow = this.wrapper.find("." + pluginClassName + "-arrow"); + this.container = this.wrapper.find("." + pluginClassName + "-container"); + this.container.append(this.userContainer); + if (elem && elem.length) { + this.elementType = elem.attr("type"); + this.originalElement = elem; + this.elem = getAnchorElement(elem); + this.elem.data(pluginClassName, this); + this.elem.before(this.wrapper); + } + this.container.hide(); + this.run(data); + } + + Notification.prototype.loadHTML = function() { + var style; + style = this.getStyle(); + this.userContainer = $(style.html); + this.userFields = style.fields; + }; + + Notification.prototype.show = function(show, userCallback) { + var args, callback, elems, fn, hidden; + callback = (function(_this) { + return function() { + if (!show && !_this.elem) { + _this.destroy(); + } + if (userCallback) { + return userCallback(); + } + }; + })(this); + hidden = this.container.parent().parents(':hidden').length > 0; + elems = this.container.add(this.arrow); + args = []; + if (hidden && show) { + fn = "show"; + } else if (hidden && !show) { + fn = "hide"; + } else if (!hidden && show) { + fn = this.options.showAnimation; + args.push(this.options.showDuration); + } else if (!hidden && !show) { + fn = this.options.hideAnimation; + args.push(this.options.hideDuration); + } else { + return callback(); + } + args.push(callback); + return elems[fn].apply(elems, args); + }; + + Notification.prototype.setGlobalPosition = function() { + var p = this.getPosition(); + var pMain = p[0]; + var pAlign = p[1]; + var main = positions[pMain]; + var align = positions[pAlign]; + var key = pMain + "|" + pAlign; + var anchor = globalAnchors[key]; + if (!anchor || !document.contains(anchor[0])) { + anchor = globalAnchors[key] = createElem("div"); + var css = {}; + css[main] = 0; + if (align === "middle") { + css.top = '45%'; + } else if (align === "center") { + css.left = '45%'; + } else { + css[align] = 0; + } + anchor.css(css).addClass(pluginClassName + "-corner"); + $("body").append(anchor); + } + return anchor.prepend(this.wrapper); + }; + + Notification.prototype.setElementPosition = function() { + var arrowColor, arrowCss, arrowSize, color, contH, contW, css, elemH, elemIH, elemIW, elemPos, elemW, gap, j, k, len, len1, mainFull, margin, opp, oppFull, pAlign, pArrow, pMain, pos, posFull, position, ref, wrapPos; + position = this.getPosition(); + pMain = position[0]; + pAlign = position[1]; + pArrow = position[2]; + elemPos = this.elem.position(); + elemH = this.elem.outerHeight(); + elemW = this.elem.outerWidth(); + elemIH = this.elem.innerHeight(); + elemIW = this.elem.innerWidth(); + wrapPos = this.wrapper.position(); + contH = this.container.height(); + contW = this.container.width(); + mainFull = positions[pMain]; + opp = opposites[pMain]; + oppFull = positions[opp]; + css = {}; + css[oppFull] = pMain === "b" ? elemH : pMain === "r" ? elemW : 0; + incr(css, "top", elemPos.top - wrapPos.top); + incr(css, "left", elemPos.left - wrapPos.left); + ref = ["top", "left"]; + for (j = 0, len = ref.length; j < len; j++) { + pos = ref[j]; + margin = parseInt(this.elem.css("margin-" + pos), 10); + if (margin) { + incr(css, pos, margin); + } + } + gap = Math.max(0, this.options.gap - (this.options.arrowShow ? arrowSize : 0)); + incr(css, oppFull, gap); + if (!this.options.arrowShow) { + this.arrow.hide(); + } else { + arrowSize = this.options.arrowSize; + arrowCss = $.extend({}, css); + arrowColor = this.userContainer.css("border-color") || this.userContainer.css("border-top-color") || this.userContainer.css("background-color") || "white"; + for (k = 0, len1 = mainPositions.length; k < len1; k++) { + pos = mainPositions[k]; + posFull = positions[pos]; + if (pos === opp) { + continue; + } + color = posFull === mainFull ? arrowColor : "transparent"; + arrowCss["border-" + posFull] = arrowSize + "px solid " + color; + } + incr(css, positions[opp], arrowSize); + if (indexOf.call(mainPositions, pAlign) >= 0) { + incr(arrowCss, positions[pAlign], arrowSize * 2); + } + } + if (indexOf.call(vAligns, pMain) >= 0) { + incr(css, "left", realign(pAlign, contW, elemW)); + if (arrowCss) { + incr(arrowCss, "left", realign(pAlign, arrowSize, elemIW)); + } + } else if (indexOf.call(hAligns, pMain) >= 0) { + incr(css, "top", realign(pAlign, contH, elemH)); + if (arrowCss) { + incr(arrowCss, "top", realign(pAlign, arrowSize, elemIH)); + } + } + if (this.container.is(":visible")) { + css.display = "block"; + } + this.container.removeAttr("style").css(css); + if (arrowCss) { + return this.arrow.removeAttr("style").css(arrowCss); + } + }; + + Notification.prototype.getPosition = function() { + var pos, ref, ref1, ref2, ref3, ref4, ref5, text; + text = this.options.position || (this.elem ? this.options.elementPosition : this.options.globalPosition); + pos = parsePosition(text); + if (pos.length === 0) { + pos[0] = "b"; + } + if (ref = pos[0], indexOf.call(mainPositions, ref) < 0) { + throw "Must be one of [" + mainPositions + "]"; + } + if (pos.length === 1 || ((ref1 = pos[0], indexOf.call(vAligns, ref1) >= 0) && (ref2 = pos[1], indexOf.call(hAligns, ref2) < 0)) || ((ref3 = pos[0], indexOf.call(hAligns, ref3) >= 0) && (ref4 = pos[1], indexOf.call(vAligns, ref4) < 0))) { + pos[1] = (ref5 = pos[0], indexOf.call(hAligns, ref5) >= 0) ? "m" : "l"; + } + if (pos.length === 2) { + pos[2] = pos[1]; + } + return pos; + }; + + Notification.prototype.getStyle = function(name) { + var style; + if (!name) { + name = this.options.style; + } + if (!name) { + name = "default"; + } + style = styles[name]; + if (!style) { + throw "Missing style: " + name; + } + return style; + }; + + Notification.prototype.updateClasses = function() { + var classes, style; + classes = ["base"]; + if ($.isArray(this.options.className)) { + classes = classes.concat(this.options.className); + } else if (this.options.className) { + classes.push(this.options.className); + } + style = this.getStyle(); + classes = $.map(classes, function(n) { + return pluginClassName + "-" + style.name + "-" + n; + }).join(" "); + return this.userContainer.attr("class", classes); + }; + + Notification.prototype.run = function(data, options) { + var d, datas, name, type, value; + if ($.isPlainObject(options)) { + $.extend(this.options, options); + } else if ($.type(options) === "string") { + this.options.className = options; + } + if (this.container && !data) { + this.show(false); + return; + } else if (!this.container && !data) { + return; + } + datas = {}; + if ($.isPlainObject(data)) { + datas = data; + } else { + datas[blankFieldName] = data; + } + for (name in datas) { + d = datas[name]; + type = this.userFields[name]; + if (!type) { + continue; + } + if (type === "text") { + d = encode(d); + if (this.options.breakNewLines) { + d = d.replace(/\n/g, '
          '); + } + } + value = name === blankFieldName ? '' : '=' + name; + find(this.userContainer, "[data-notify-" + type + value + "]").html(d); + } + this.updateClasses(); + if (this.elem) { + this.setElementPosition(); + } else { + this.setGlobalPosition(); + } + this.show(true); + if (this.options.autoHide) { + clearTimeout(this.autohideTimer); + this.autohideTimer = setTimeout(this.show.bind(this, false), this.options.autoHideDelay); + } + }; + + Notification.prototype.destroy = function() { + this.wrapper.data(pluginClassName, null); + this.wrapper.remove(); + }; + + $[pluginName] = function(elem, data, options) { + if ((elem && elem.nodeName) || elem.jquery) { + $(elem)[pluginName](data, options); + } else { + options = data; + data = elem; + new Notification(null, data, options); + } + return elem; + }; + + $.fn[pluginName] = function(data, options) { + $(this).each(function() { + var prev = getAnchorElement($(this)).data(pluginClassName); + if (prev) { + prev.destroy(); + } + var curr = new Notification($(this), data, options); + }); + return this; + }; + + $.extend($[pluginName], { + defaults: defaults, + addStyle: addStyle, + removeStyle: removeStyle, + pluginOptions: pluginOptions, + getStyle: getStyle, + insertCSS: insertCSS + }); + + //always include the default bootstrap style + addStyle("bootstrap", { + html: "
          \n\n
          ", + classes: { + base: { + "font-weight": "bold", + "padding": "8px 15px 8px 14px", + "text-shadow": "0 1px 0 rgba(255, 255, 255, 0.5)", + "background-color": "#fcf8e3", + "border": "1px solid #fbeed5", + "border-radius": "4px", + "white-space": "nowrap", + "padding-left": "25px", + "background-repeat": "no-repeat", + "background-position": "3px 7px" + }, + error: { + "color": "#B94A48", + "background-color": "#F2DEDE", + "border-color": "#EED3D7", + "background-image": "url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAtRJREFUeNqkVc1u00AQHq+dOD+0poIQfkIjalW0SEGqRMuRnHos3DjwAH0ArlyQeANOOSMeAA5VjyBxKBQhgSpVUKKQNGloFdw4cWw2jtfMOna6JOUArDTazXi/b3dm55socPqQhFka++aHBsI8GsopRJERNFlY88FCEk9Yiwf8RhgRyaHFQpPHCDmZG5oX2ui2yilkcTT1AcDsbYC1NMAyOi7zTX2Agx7A9luAl88BauiiQ/cJaZQfIpAlngDcvZZMrl8vFPK5+XktrWlx3/ehZ5r9+t6e+WVnp1pxnNIjgBe4/6dAysQc8dsmHwPcW9C0h3fW1hans1ltwJhy0GxK7XZbUlMp5Ww2eyan6+ft/f2FAqXGK4CvQk5HueFz7D6GOZtIrK+srupdx1GRBBqNBtzc2AiMr7nPplRdKhb1q6q6zjFhrklEFOUutoQ50xcX86ZlqaZpQrfbBdu2R6/G19zX6XSgh6RX5ubyHCM8nqSID6ICrGiZjGYYxojEsiw4PDwMSL5VKsC8Yf4VRYFzMzMaxwjlJSlCyAQ9l0CW44PBADzXhe7xMdi9HtTrdYjFYkDQL0cn4Xdq2/EAE+InCnvADTf2eah4Sx9vExQjkqXT6aAERICMewd/UAp/IeYANM2joxt+q5VI+ieq2i0Wg3l6DNzHwTERPgo1ko7XBXj3vdlsT2F+UuhIhYkp7u7CarkcrFOCtR3H5JiwbAIeImjT/YQKKBtGjRFCU5IUgFRe7fF4cCNVIPMYo3VKqxwjyNAXNepuopyqnld602qVsfRpEkkz+GFL1wPj6ySXBpJtWVa5xlhpcyhBNwpZHmtX8AGgfIExo0ZpzkWVTBGiXCSEaHh62/PoR0p/vHaczxXGnj4bSo+G78lELU80h1uogBwWLf5YlsPmgDEd4M236xjm+8nm4IuE/9u+/PH2JXZfbwz4zw1WbO+SQPpXfwG/BBgAhCNZiSb/pOQAAAAASUVORK5CYII=)" + }, + success: { + "color": "#468847", + "background-color": "#DFF0D8", + "border-color": "#D6E9C6", + "background-image": "url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAutJREFUeNq0lctPE0Ecx38zu/RFS1EryqtgJFA08YCiMZIAQQ4eRG8eDGdPJiYeTIwHTfwPiAcvXIwXLwoXPaDxkWgQ6islKlJLSQWLUraPLTv7Gme32zoF9KSTfLO7v53vZ3d/M7/fIth+IO6INt2jjoA7bjHCJoAlzCRw59YwHYjBnfMPqAKWQYKjGkfCJqAF0xwZjipQtA3MxeSG87VhOOYegVrUCy7UZM9S6TLIdAamySTclZdYhFhRHloGYg7mgZv1Zzztvgud7V1tbQ2twYA34LJmF4p5dXF1KTufnE+SxeJtuCZNsLDCQU0+RyKTF27Unw101l8e6hns3u0PBalORVVVkcaEKBJDgV3+cGM4tKKmI+ohlIGnygKX00rSBfszz/n2uXv81wd6+rt1orsZCHRdr1Imk2F2Kob3hutSxW8thsd8AXNaln9D7CTfA6O+0UgkMuwVvEFFUbbAcrkcTA8+AtOk8E6KiQiDmMFSDqZItAzEVQviRkdDdaFgPp8HSZKAEAL5Qh7Sq2lIJBJwv2scUqkUnKoZgNhcDKhKg5aH+1IkcouCAdFGAQsuWZYhOjwFHQ96oagWgRoUov1T9kRBEODAwxM2QtEUl+Wp+Ln9VRo6BcMw4ErHRYjH4/B26AlQoQQTRdHWwcd9AH57+UAXddvDD37DmrBBV34WfqiXPl61g+vr6xA9zsGeM9gOdsNXkgpEtTwVvwOklXLKm6+/p5ezwk4B+j6droBs2CsGa/gNs6RIxazl4Tc25mpTgw/apPR1LYlNRFAzgsOxkyXYLIM1V8NMwyAkJSctD1eGVKiq5wWjSPdjmeTkiKvVW4f2YPHWl3GAVq6ymcyCTgovM3FzyRiDe2TaKcEKsLpJvNHjZgPNqEtyi6mZIm4SRFyLMUsONSSdkPeFtY1n0mczoY3BHTLhwPRy9/lzcziCw9ACI+yql0VLzcGAZbYSM5CCSZg1/9oc/nn7+i8N9p/8An4JMADxhH+xHfuiKwAAAABJRU5ErkJggg==)" + }, + info: { + "color": "#3A87AD", + "background-color": "#D9EDF7", + "border-color": "#BCE8F1", + "background-image": "url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3QYFAhkSsdes/QAAA8dJREFUOMvVlGtMW2UYx//POaWHXg6lLaW0ypAtw1UCgbniNOLcVOLmAjHZolOYlxmTGXVZdAnRfXQm+7SoU4mXaOaiZsEpC9FkiQs6Z6bdCnNYruM6KNBw6YWewzl9z+sHImEWv+vz7XmT95f/+3/+7wP814v+efDOV3/SoX3lHAA+6ODeUFfMfjOWMADgdk+eEKz0pF7aQdMAcOKLLjrcVMVX3xdWN29/GhYP7SvnP0cWfS8caSkfHZsPE9Fgnt02JNutQ0QYHB2dDz9/pKX8QjjuO9xUxd/66HdxTeCHZ3rojQObGQBcuNjfplkD3b19Y/6MrimSaKgSMmpGU5WevmE/swa6Oy73tQHA0Rdr2Mmv/6A1n9w9suQ7097Z9lM4FlTgTDrzZTu4StXVfpiI48rVcUDM5cmEksrFnHxfpTtU/3BFQzCQF/2bYVoNbH7zmItbSoMj40JSzmMyX5qDvriA7QdrIIpA+3cdsMpu0nXI8cV0MtKXCPZev+gCEM1S2NHPvWfP/hL+7FSr3+0p5RBEyhEN5JCKYr8XnASMT0xBNyzQGQeI8fjsGD39RMPk7se2bd5ZtTyoFYXftF6y37gx7NeUtJJOTFlAHDZLDuILU3j3+H5oOrD3yWbIztugaAzgnBKJuBLpGfQrS8wO4FZgV+c1IxaLgWVU0tMLEETCos4xMzEIv9cJXQcyagIwigDGwJgOAtHAwAhisQUjy0ORGERiELgG4iakkzo4MYAxcM5hAMi1WWG1yYCJIcMUaBkVRLdGeSU2995TLWzcUAzONJ7J6FBVBYIggMzmFbvdBV44Corg8vjhzC+EJEl8U1kJtgYrhCzgc/vvTwXKSib1paRFVRVORDAJAsw5FuTaJEhWM2SHB3mOAlhkNxwuLzeJsGwqWzf5TFNdKgtY5qHp6ZFf67Y/sAVadCaVY5YACDDb3Oi4NIjLnWMw2QthCBIsVhsUTU9tvXsjeq9+X1d75/KEs4LNOfcdf/+HthMnvwxOD0wmHaXr7ZItn2wuH2SnBzbZAbPJwpPx+VQuzcm7dgRCB57a1uBzUDRL4bfnI0RE0eaXd9W89mpjqHZnUI5Hh2l2dkZZUhOqpi2qSmpOmZ64Tuu9qlz/SEXo6MEHa3wOip46F1n7633eekV8ds8Wxjn37Wl63VVa+ej5oeEZ/82ZBETJjpJ1Rbij2D3Z/1trXUvLsblCK0XfOx0SX2kMsn9dX+d+7Kf6h8o4AIykuffjT8L20LU+w4AZd5VvEPY+XpWqLV327HR7DzXuDnD8r+ovkBehJ8i+y8YAAAAASUVORK5CYII=)" + }, + warn: { + "color": "#C09853", + "background-color": "#FCF8E3", + "border-color": "#FBEED5", + "background-image": "url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAMAAAC6V+0/AAABJlBMVEXr6eb/2oD/wi7/xjr/0mP/ykf/tQD/vBj/3o7/uQ//vyL/twebhgD/4pzX1K3z8e349vK6tHCilCWbiQymn0jGworr6dXQza3HxcKkn1vWvV/5uRfk4dXZ1bD18+/52YebiAmyr5S9mhCzrWq5t6ufjRH54aLs0oS+qD751XqPhAybhwXsujG3sm+Zk0PTwG6Shg+PhhObhwOPgQL4zV2nlyrf27uLfgCPhRHu7OmLgAafkyiWkD3l49ibiAfTs0C+lgCniwD4sgDJxqOilzDWowWFfAH08uebig6qpFHBvH/aw26FfQTQzsvy8OyEfz20r3jAvaKbhgG9q0nc2LbZxXanoUu/u5WSggCtp1anpJKdmFz/zlX/1nGJiYmuq5Dx7+sAAADoPUZSAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfdBgUBGhh4aah5AAAAlklEQVQY02NgoBIIE8EUcwn1FkIXM1Tj5dDUQhPU502Mi7XXQxGz5uVIjGOJUUUW81HnYEyMi2HVcUOICQZzMMYmxrEyMylJwgUt5BljWRLjmJm4pI1hYp5SQLGYxDgmLnZOVxuooClIDKgXKMbN5ggV1ACLJcaBxNgcoiGCBiZwdWxOETBDrTyEFey0jYJ4eHjMGWgEAIpRFRCUt08qAAAAAElFTkSuQmCC)" + } + } + }); + + $(function() { + insertCSS(coreStyle.css).attr("id", "core-notify"); + $(document).on("click", "." + pluginClassName + "-hidable", function(e) { + $(this).trigger("notify-hide"); + }); + $(document).on("notify-hide", "." + pluginClassName + "-wrapper", function(e) { + var elem = $(this).data(pluginClassName); + if(elem) { + elem.show(false); + } + }); + }); + +})); diff --git a/Monitor/wwwroot/assets/plugins/nvd3/nv.d3.min.css b/Monitor/wwwroot/assets/plugins/nvd3/nv.d3.min.css new file mode 100644 index 0000000..b8a5c0f --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/nvd3/nv.d3.min.css @@ -0,0 +1,2 @@ +.nvd3 .nv-axis line,.nvd3 .nv-axis path{fill:none;shape-rendering:crispEdges}.nv-brush .extent,.nvd3 .background path,.nvd3 .nv-axis line,.nvd3 .nv-axis path{shape-rendering:crispEdges}.nv-distx,.nv-disty,.nv-noninteractive,.nvd3 .nv-axis,.nvd3.nv-pie .nv-label,.nvd3.nv-sparklineplus g.nv-hoverValue{pointer-events:none}.nvd3 .nv-axis{opacity:1}.nvd3 .nv-axis.nv-disabled,.nvd3 .nv-controlsWrap .nv-legend .nv-check-box .nv-check{opacity:0}.nvd3 .nv-axis path{stroke:#000;stroke-opacity:.75}.nvd3 .nv-axis path.domain{stroke-opacity:.75}.nvd3 .nv-axis.nv-x path.domain{stroke-opacity:0}.nvd3 .nv-axis line{stroke:#e5e5e5}.nvd3 .nv-axis .zero line, .nvd3 .nv-axis line.zero{stroke-opacity:.75}.nvd3 .nv-axis .nv-axisMaxMin text{font-weight:700}.nvd3 .x .nv-axis .nv-axisMaxMin text,.nvd3 .x2 .nv-axis .nv-axisMaxMin text,.nvd3 .x3 .nv-axis .nv-axisMaxMin text{text-anchor:middle}.nvd3 .nv-bars rect{fill-opacity:.75;transition:fill-opacity 250ms linear}.nvd3 .nv-bars rect.hover{fill-opacity:1}.nvd3 .nv-bars .hover rect{fill:#add8e6}.nvd3 .nv-bars text{fill:transparent}.nvd3 .nv-bars .hover text{fill:rgba(0,0,0,1)}.nvd3 .nv-discretebar .nv-groups rect,.nvd3 .nv-multibar .nv-groups rect,.nvd3 .nv-multibarHorizontal .nv-groups rect{stroke-opacity:0;transition:fill-opacity 250ms linear}.with-transitions .nv-candlestickBar .nv-ticks .nv-tick,.with-transitions .nvd3 .nv-groups .nv-point{transition:stroke-width 250ms linear,stroke-opacity 250ms linear}.nvd3 .nv-candlestickBar .nv-ticks rect:hover,.nvd3 .nv-discretebar .nv-groups rect:hover,.nvd3 .nv-multibar .nv-groups rect:hover,.nvd3 .nv-multibarHorizontal .nv-groups rect:hover{fill-opacity:1}.nvd3 .nv-discretebar .nv-groups text,.nvd3 .nv-multibarHorizontal .nv-groups text{font-weight:700;fill:rgba(0,0,0,1);stroke:transparent}.nvd3 .nv-boxplot circle{fill-opacity:.5}.nvd3 .nv-boxplot circle:hover,.nvd3 .nv-boxplot rect:hover{fill-opacity:1}.nvd3 line.nv-boxplot-median{stroke:#000}.nv-boxplot-tick:hover{stroke-width:2.5px}.nvd3.nv-bullet{font:10px sans-serif}.nvd3.nv-bullet .nv-measure{fill-opacity:.8}.nvd3.nv-bullet .nv-measure:hover{fill-opacity:1}.nvd3.nv-bullet .nv-marker{stroke:#000;stroke-width:2px}.nvd3.nv-bullet .nv-markerTriangle{stroke:#000;fill:#fff;stroke-width:1.5px}.nvd3.nv-bullet .nv-markerLine{stroke:#000;stroke-width:1.5px}.nvd3.nv-bullet .nv-tick line{stroke:#666;stroke-width:.5px}.nvd3.nv-bullet .nv-range.nv-s0{fill:#eee}.nvd3.nv-bullet .nv-range.nv-s1{fill:#ddd}.nvd3.nv-bullet .nv-range.nv-s2{fill:#ccc}.nvd3.nv-bullet .nv-title{font-size:14px;font-weight:700}.nvd3.nv-bullet .nv-subtitle{fill:#999}.nvd3.nv-bullet .nv-range{fill:#bababa;fill-opacity:.4}.nvd3.nv-bullet .nv-range:hover{fill-opacity:.7}.nvd3.nv-candlestickBar .nv-ticks .nv-tick{stroke-width:1px}.nvd3.nv-candlestickBar .nv-ticks .nv-tick.hover{stroke-width:2px}.nvd3.nv-candlestickBar .nv-ticks .nv-tick.positive rect{stroke:#2ca02c;fill:#2ca02c}.nvd3.nv-candlestickBar .nv-ticks .nv-tick.negative rect{stroke:#d62728;fill:#d62728}.nvd3.nv-candlestickBar .nv-ticks line{stroke:#333}.nv-force-node{stroke:#fff;stroke-width:1.5px}.nv-force-link{stroke:#999;stroke-opacity:.6}.nv-force-node text{stroke-width:0}.nvd3 .nv-check-box .nv-box{fill-opacity:0;stroke-width:2}.nvd3 .nv-check-box .nv-check{fill-opacity:0;stroke-width:4}.nvd3 .nv-series.nv-disabled .nv-check-box .nv-check{fill-opacity:0;stroke-opacity:0}.nvd3.nv-linePlusBar .nv-bar rect{fill-opacity:.75}.nvd3.nv-linePlusBar .nv-bar rect:hover{fill-opacity:1}.nvd3 .nv-groups path.nv-line{fill:none}.nvd3 .nv-groups path.nv-area{stroke:none}.nvd3.nv-line .nvd3.nv-scatter .nv-groups .nv-point{fill-opacity:0;stroke-opacity:0}.nvd3.nv-scatter.nv-single-point .nv-groups .nv-point{fill-opacity:.5!important;stroke-opacity:.5!important}.nvd3 .nv-groups .nv-point.hover,.nvd3.nv-scatter .nv-groups .nv-point.hover{stroke-width:7px;fill-opacity:.95!important;stroke-opacity:.95!important}.nvd3 .nv-point-paths path{stroke:#aaa;stroke-opacity:0;fill:#eee;fill-opacity:0}.nvd3 .nv-indexLine{cursor:ew-resize}svg.nvd3-svg{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:block;width:100%;height:100%}.nvtooltip.with-3d-shadow,.with-3d-shadow .nvtooltip{box-shadow:0 5px 10px rgba(0,0,0,.2);border-radius:5px}.nvd3 text{font:400 12px Arial,sans-serif}.nvd3 .title{font:700 14px Arial,sans-serif}.nvd3 .nv-background{fill:#fff;fill-opacity:0}.nvd3.nv-noData{font-size:18px;font-weight:700}.nv-brush .extent{fill-opacity:.125}.nv-brush .resize path{fill:#eee;stroke:#666}.nvd3 .nv-legend .nv-series{cursor:pointer}.nvd3 .nv-legend .nv-disabled circle{fill-opacity:0}.nvd3 .nv-brush .extent{fill-opacity:0!important}.nvd3 .nv-brushBackground rect{stroke:#000;stroke-width:.4;fill:#fff;fill-opacity:.7}@media print{.nvd3 text{stroke-width:0;fill-opacity:1}}.nvd3.nv-ohlcBar .nv-ticks .nv-tick{stroke-width:1px}.nvd3.nv-ohlcBar .nv-ticks .nv-tick.hover{stroke-width:2px}.nvd3.nv-ohlcBar .nv-ticks .nv-tick.positive{stroke:#2ca02c}.nvd3.nv-ohlcBar .nv-ticks .nv-tick.negative{stroke:#d62728}.nvd3 .background path{fill:none;stroke:#EEE;stroke-opacity:.4}.nvd3 .foreground path{fill:none;stroke-opacity:.7}.nvd3 .nv-parallelCoordinates-brush .extent{fill:#fff;fill-opacity:.6;stroke:gray;shape-rendering:crispEdges}.nvd3 .nv-parallelCoordinates .hover{fill-opacity:1;stroke-width:3px}.nvd3 .missingValuesline line{fill:none;stroke:#000;stroke-width:1;stroke-opacity:1;stroke-dasharray:5,5}.nvd3.nv-pie .nv-pie-title{font-size:24px;fill:rgba(19,196,249,.59)}.nvd3.nv-pie .nv-slice text{stroke:#000;stroke-width:0}.nvd3.nv-pie path{transition:fill-opacity 250ms linear,stroke-width 250ms linear,stroke-opacity 250ms linear;stroke:#fff;stroke-width:1px;stroke-opacity:1;fill-opacity:.7}.nvd3.nv-pie .hover path{fill-opacity:1}.nvd3.nv-pie .nv-label rect{fill-opacity:0;stroke-opacity:0}.nvd3 .nv-groups .nv-point.hover{stroke-width:20px;stroke-opacity:.5}.nvd3 .nv-scatter .nv-point.hover{fill-opacity:1}.nvd3.nv-sparkline path{fill:none}.nvd3.nv-sparklineplus .nv-hoverValue line{stroke:#333;stroke-width:1.5px}.nvd3.nv-sparklineplus,.nvd3.nv-sparklineplus g{pointer-events:all}.nvd3 .nv-interactiveGuideLine,.nvtooltip{pointer-events:none}.nvd3 .nv-hoverArea{fill-opacity:0;stroke-opacity:0}.nvd3.nv-sparklineplus .nv-xValue,.nvd3.nv-sparklineplus .nv-yValue{stroke-width:0;font-size:.9em;font-weight:400}.nvd3.nv-sparklineplus .nv-yValue{stroke:#f66}.nvd3.nv-sparklineplus .nv-maxValue{stroke:#2ca02c;fill:#2ca02c}.nvd3.nv-sparklineplus .nv-minValue{stroke:#d62728;fill:#d62728}.nvd3.nv-sparklineplus .nv-currentValue{font-weight:700;font-size:1.1em}.nvtooltip h3,.nvtooltip table td.key{font-weight:400}.nvd3.nv-stackedarea path.nv-area{fill-opacity:.7;stroke-opacity:0;transition:fill-opacity 250ms linear,stroke-opacity 250ms linear}.nvd3.nv-stackedarea path.nv-area.hover{fill-opacity:.9}.nvd3.nv-stackedarea .nv-groups .nv-point{stroke-opacity:0;fill-opacity:0}.nvtooltip{position:absolute;color:rgba(0,0,0,1);padding:1px;z-index:10000;display:block;font-family:Arial,sans-serif;font-size:13px;text-align:left;white-space:nowrap;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background:rgba(255,255,255,.8);border:1px solid rgba(0,0,0,.5);border-radius:4px}.nvtooltip h3,.nvtooltip p{margin:0;text-align:center}.nvtooltip.with-transitions,.with-transitions .nvtooltip{transition:opacity 50ms linear;transition-delay:200ms}.nvtooltip.x-nvtooltip,.nvtooltip.y-nvtooltip{padding:8px}.nvtooltip h3{padding:4px 14px;line-height:18px;background-color:rgba(247,247,247,.75);color:rgba(0,0,0,1);border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.nvtooltip p{padding:5px 14px}.nvtooltip span{display:inline-block;margin:2px 0}.nvtooltip table{margin:6px;border-spacing:0}.nvtooltip table td{padding:2px 9px 2px 0;vertical-align:middle}.nvtooltip table td.key.total{font-weight:700}.nvtooltip table td.value{text-align:right;font-weight:700}.nvtooltip table td.percent{color:#a9a9a9}.nvtooltip table tr.highlight td{padding:1px 9px 1px 0;border-bottom-style:solid;border-bottom-width:1px;border-top-style:solid;border-top-width:1px}.nvtooltip table td.legend-color-guide div{vertical-align:middle;width:12px;height:12px;border:1px solid #999}.nvtooltip .footer{padding:3px;text-align:center}.nvtooltip-pending-removal{pointer-events:none;display:none}.nvd3 line.nv-guideline{stroke:#ccc} +/*# sourceMappingURL=nv.d3.min.css.map */ \ No newline at end of file diff --git a/Monitor/wwwroot/assets/plugins/nvd3/nv.d3.min.js b/Monitor/wwwroot/assets/plugins/nvd3/nv.d3.min.js new file mode 100644 index 0000000..fb1fae5 --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/nvd3/nv.d3.min.js @@ -0,0 +1,11 @@ +/* nvd3 version 1.8.6 (https://github.com/novus/nvd3) 2017-08-23 */ + +!function(){var a={};a.dev=!1,a.tooltip=a.tooltip||{},a.utils=a.utils||{},a.models=a.models||{},a.charts={},a.logs={},a.dom={},"undefined"!=typeof module&&"undefined"!=typeof exports&&"undefined"==typeof d3&&(d3=require("d3")),a.dispatch=d3.dispatch("render_start","render_end"),Function.prototype.bind||(Function.prototype.bind=function(a){if("function"!=typeof this)throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable");var b=Array.prototype.slice.call(arguments,1),c=this,d=function(){},e=function(){return c.apply(this instanceof d&&a?this:a,b.concat(Array.prototype.slice.call(arguments)))};return d.prototype=this.prototype,e.prototype=new d,e}),a.dev&&(a.dispatch.on("render_start",function(b){a.logs.startTime=+new Date}),a.dispatch.on("render_end",function(b){a.logs.endTime=+new Date,a.logs.totalTime=a.logs.endTime-a.logs.startTime,a.log("total",a.logs.totalTime)})),a.log=function(){if(a.dev&&window.console&&console.log&&console.log.apply)console.log.apply(console,arguments);else if(a.dev&&window.console&&"function"==typeof console.log&&Function.prototype.bind){var b=Function.prototype.bind.call(console.log,console);b.apply(console,arguments)}return arguments[arguments.length-1]},a.deprecated=function(a,b){console&&console.warn&&console.warn("nvd3 warning: `"+a+"` has been deprecated. ",b||"")},a.render=function(b){b=b||1,a.render.active=!0,a.dispatch.render_start();var c=function(){for(var d,e,f=0;b>f&&(e=a.render.queue[f]);f++)d=e.generate(),typeof e.callback==typeof Function&&e.callback(d);a.render.queue.splice(0,f),a.render.queue.length?setTimeout(c):(a.dispatch.render_end(),a.render.active=!1)};setTimeout(c)},a.render.active=!1,a.render.queue=[],a.addGraph=function(b){typeof arguments[0]==typeof Function&&(b={generate:arguments[0],callback:arguments[1]}),a.render.queue.push(b),a.render.active||a.render()},"undefined"!=typeof module&&"undefined"!=typeof exports&&(module.exports=a),"undefined"!=typeof window&&(window.nv=a),a.dom.write=function(a){return void 0!==window.fastdom?fastdom.mutate(a):a()},a.dom.read=function(a){return void 0!==window.fastdom?fastdom.measure(a):a()},a.interactiveGuideline=function(){"use strict";function b(l){l.each(function(l){function m(){var a=d3.event.clientX-this.getBoundingClientRect().left,d=d3.event.clientY-this.getBoundingClientRect().top,e=!0,h=!1;if(k&&(a=d3.event.offsetX,d=d3.event.offsetY,"svg"!==d3.event.target.tagName&&(e=!1),d3.event.target.className.baseVal.match("nv-legend")&&(h=!0)),e&&(a-=c.left,d-=c.top),"mouseout"===d3.event.type||0>a||0>d||a>o||d>p||d3.event.relatedTarget&&void 0===d3.event.relatedTarget.ownerSVGElement||h){if(k&&d3.event.relatedTarget&&void 0===d3.event.relatedTarget.ownerSVGElement&&(void 0===d3.event.relatedTarget.className||d3.event.relatedTarget.className.match(j.nvPointerEventsClass)))return;return g.elementMouseout({mouseX:a,mouseY:d}),b.renderGuideLine(null),void j.hidden(!0)}j.hidden(!1);var i="function"==typeof f.rangeBands,l=void 0;if(i){var m=d3.bisect(f.range(),a)-1;if(!(f.range()[m]+f.rangeBand()>=a))return g.elementMouseout({mouseX:a,mouseY:d}),b.renderGuideLine(null),void j.hidden(!0);l=f.domain()[d3.bisect(f.range(),a)-1]}else l=f.invert(a);g.elementMousemove({mouseX:a,mouseY:d,pointXValue:l}),"dblclick"===d3.event.type&&g.elementDblclick({mouseX:a,mouseY:d,pointXValue:l}),"click"===d3.event.type&&g.elementClick({mouseX:a,mouseY:d,pointXValue:l}),"mousedown"===d3.event.type&&g.elementMouseDown({mouseX:a,mouseY:d,pointXValue:l}),"mouseup"===d3.event.type&&g.elementMouseUp({mouseX:a,mouseY:d,pointXValue:l})}var n=d3.select(this),o=d||960,p=e||400,q=n.selectAll("g.nv-wrap.nv-interactiveLineLayer").data([l]),r=q.enter().append("g").attr("class"," nv-wrap nv-interactiveLineLayer");r.append("g").attr("class","nv-interactiveGuideLine"),i&&(i.on("touchmove",m).on("mousemove",m,!0).on("mouseout",m,!0).on("mousedown",m,!0).on("mouseup",m,!0).on("dblclick",m).on("click",m),b.guideLine=null,b.renderGuideLine=function(c){h&&(b.guideLine&&b.guideLine.attr("x1")===c||a.dom.write(function(){var b=q.select(".nv-interactiveGuideLine").selectAll("line").data(null!=c?[a.utils.NaNtoZero(c)]:[],String);b.enter().append("line").attr("class","nv-guideline").attr("x1",function(a){return a}).attr("x2",function(a){return a}).attr("y1",p).attr("y2",0),b.exit().remove()}))})})}var c={left:0,top:0},d=null,e=null,f=d3.scale.linear(),g=d3.dispatch("elementMousemove","elementMouseout","elementClick","elementDblclick","elementMouseDown","elementMouseUp"),h=!0,i=null,j=a.models.tooltip(),k=window.ActiveXObject;return j.duration(0).hideDelay(0).hidden(!1),b.dispatch=g,b.tooltip=j,b.margin=function(a){return arguments.length?(c.top="undefined"!=typeof a.top?a.top:c.top,c.left="undefined"!=typeof a.left?a.left:c.left,b):c},b.width=function(a){return arguments.length?(d=a,b):d},b.height=function(a){return arguments.length?(e=a,b):e},b.xScale=function(a){return arguments.length?(f=a,b):f},b.showGuideLine=function(a){return arguments.length?(h=a,b):h},b.svgContainer=function(a){return arguments.length?(i=a,b):i},b},a.interactiveBisect=function(a,b,c){"use strict";if(!(a instanceof Array))return null;var d;d="function"!=typeof c?function(a){return a.x}:c;var e=function(a,b){return d(a)-b},f=d3.bisector(e).left,g=d3.max([0,f(a,b)-1]),h=d(a[g]);if("undefined"==typeof h&&(h=g),h===b)return g;var i=d3.min([g+1,a.length-1]),j=d(a[i]);return"undefined"==typeof j&&(j=i),Math.abs(j-b)>=Math.abs(h-b)?g:i},a.nearestValueIndex=function(a,b,c){"use strict";var d=1/0,e=null;return a.forEach(function(a,f){var g=Math.abs(b-a);null!=a&&d>=g&&c>g&&(d=g,e=f)}),e},a.models.tooltip=function(){"use strict";function b(){if(!l||!l.node()){var a=[1];l=d3.select(document.body).select("#"+d).data(a),l.enter().append("div").attr("class","nvtooltip "+(i?i:"xy-tooltip")).attr("id",d).style("top",0).style("left",0).style("opacity",0).style("position","fixed").selectAll("div, table, td, tr").classed(q,!0).classed(q,!0),l.exit().remove()}}function c(){return n&&w(e)?(a.dom.write(function(){b();var a=u(e,l.node());a&&(l.node().innerHTML=a),y()}),c):void 0}var d="nvtooltip-"+Math.floor(1e5*Math.random()),e=null,f="w",g=25,h=0,i=null,j=!0,k=200,l=null,m={left:null,top:null},n=!0,o=100,p=!0,q="nv-pointer-events-none",r=function(a,b,c){return a},s=function(a){return a},t=function(a,b){return a},u=function(a,b){if(null===a)return"";var c=d3.select(document.createElement("table"));if(p){var d=c.selectAll("thead").data([a]).enter().append("thead");d.append("tr").append("td").attr("colspan",3).append("strong").classed("x-value",!0).html(s(a.value))}var e=c.selectAll("tbody").data([a]).enter().append("tbody"),f=e.selectAll("tr").data(function(a){return a.series}).enter().append("tr").classed("highlight",function(a){return a.highlight});f.append("td").classed("legend-color-guide",!0).append("div").style("background-color",function(a){return a.color}),f.append("td").classed("key",!0).classed("total",function(a){return!!a.total}).html(function(a,b){return t(a.key,b)}),f.append("td").classed("value",!0).html(function(a,b){return r(a.value,b,a)}),f.filter(function(a,b){return void 0!==a.percent}).append("td").classed("percent",!0).html(function(a,b){return"("+d3.format("%")(a.percent)+")"}),f.selectAll("td").each(function(a){if(a.highlight){var b=d3.scale.linear().domain([0,1]).range(["#fff",a.color]),c=.6;d3.select(this).style("border-bottom-color",b(c)).style("border-top-color",b(c))}});var g=c.node().outerHTML;return void 0!==a.footer&&(g+=""),g},v=function(){var a={left:null!==d3.event?d3.event.clientX:0,top:null!==d3.event?d3.event.clientY:0};if("none"!=getComputedStyle(document.body).transform){var b=document.body.getBoundingClientRect();a.left-=b.left,a.top-=b.top}return a},w=function(b){if(b&&b.series){if(a.utils.isArray(b.series))return!0;if(a.utils.isObject(b.series))return b.series=[b.series],!0}return!1},x=function(a){var b,c,d,e=l.node().offsetHeight,h=l.node().offsetWidth,i=document.documentElement.clientWidth,j=document.documentElement.clientHeight;switch(f){case"e":b=-h-g,c=-(e/2),a.left+b<0&&(b=g),(d=a.top+c)<0&&(c-=d),(d=a.top+c+e)>j&&(c-=d-j);break;case"w":b=g,c=-(e/2),a.left+b+h>i&&(b=-h-g),(d=a.top+c)<0&&(c-=d),(d=a.top+c+e)>j&&(c-=d-j);break;case"n":b=-(h/2)-5,c=g,a.top+c+e>j&&(c=-e-g),(d=a.left+b)<0&&(b-=d),(d=a.left+b+h)>i&&(b-=d-i);break;case"s":b=-(h/2),c=-e-g,a.top+c<0&&(c=g),(d=a.left+b)<0&&(b-=d),(d=a.left+b+h)>i&&(b-=d-i);break;case"center":b=-(h/2),c=-(e/2);break;default:b=0,c=0}return{left:b,top:c}},y=function(){a.dom.read(function(){var a=v(),b=x(a),c=a.left+b.left,d=a.top+b.top;if(j)l.interrupt().transition().delay(k).duration(0).style("opacity",0);else{var e="translate("+m.left+"px, "+m.top+"px)",f="translate("+Math.round(c)+"px, "+Math.round(d)+"px)",g=d3.interpolateString(e,f),h=l.style("opacity")<.1;l.interrupt().transition().duration(h?0:o).styleTween("transform",function(a){return g},"important").styleTween("-webkit-transform",function(a){return g}).style("-ms-transform",f).style("opacity",1)}m.left=c,m.top=d})};return c.nvPointerEventsClass=q,c.options=a.utils.optionsFunc.bind(c),c._options=Object.create({},{duration:{get:function(){return o},set:function(a){o=a}},gravity:{get:function(){return f},set:function(a){f=a}},distance:{get:function(){return g},set:function(a){g=a}},snapDistance:{get:function(){return h},set:function(a){h=a}},classes:{get:function(){return i},set:function(a){i=a}},enabled:{get:function(){return n},set:function(a){n=a}},hideDelay:{get:function(){return k},set:function(a){k=a}},contentGenerator:{get:function(){return u},set:function(a){u=a}},valueFormatter:{get:function(){return r},set:function(a){r=a}},headerFormatter:{get:function(){return s},set:function(a){s=a}},keyFormatter:{get:function(){return t},set:function(a){t=a}},headerEnabled:{get:function(){return p},set:function(a){p=a}},position:{get:function(){return v},set:function(a){v=a}},chartContainer:{get:function(){return document.body},set:function(b){a.deprecated("chartContainer","feature removed after 1.8.3")}},fixedTop:{get:function(){return null},set:function(b){a.deprecated("fixedTop","feature removed after 1.8.1")}},offset:{get:function(){return{left:0,top:0}},set:function(b){a.deprecated("offset","use chart.tooltip.distance() instead")}},hidden:{get:function(){return j},set:function(a){j!=a&&(j=!!a,c())}},data:{get:function(){return e},set:function(a){a.point&&(a.value=a.point.x,a.series=a.series||{},a.series.value=a.point.y,a.series.color=a.point.color||a.series.color),e=a}},node:{get:function(){return l.node()},set:function(a){}},id:{get:function(){return d},set:function(a){}}}),a.utils.initOptions(c),c},a.utils.windowSize=function(){var a={width:640,height:480};return window.innerWidth&&window.innerHeight?(a.width=window.innerWidth,a.height=window.innerHeight,a):"CSS1Compat"==document.compatMode&&document.documentElement&&document.documentElement.offsetWidth?(a.width=document.documentElement.offsetWidth,a.height=document.documentElement.offsetHeight,a):document.body&&document.body.offsetWidth?(a.width=document.body.offsetWidth,a.height=document.body.offsetHeight,a):a},a.utils.isArray=Array.isArray,a.utils.isObject=function(a){return null!==a&&"object"==typeof a},a.utils.isFunction=function(a){return"function"==typeof a},a.utils.isDate=function(a){return"[object Date]"===toString.call(a)},a.utils.isNumber=function(a){return!isNaN(a)&&"number"==typeof a},a.utils.windowResize=function(b){return window.addEventListener?window.addEventListener("resize",b):a.log("ERROR: Failed to bind to window.resize with: ",b),{callback:b,clear:function(){window.removeEventListener("resize",b)}}},a.utils.getColor=function(b){if(void 0===b)return a.utils.defaultColor();if(a.utils.isArray(b)){var c=d3.scale.ordinal().range(b);return function(a,b){var d=void 0===b?a:b;return a.color||c(d)}}return b},a.utils.defaultColor=function(){return a.utils.getColor(d3.scale.category20().range())},a.utils.customTheme=function(b,c,d){c=c||function(a){return a.key},d=d||d3.scale.category20().range();var e=d.length;return function(f,g){var h=c(f);return a.utils.isFunction(b[h])?b[h]():void 0!==b[h]?b[h]:(e||(e=d.length),e-=1,d[e])}},a.utils.pjax=function(b,c){var d=function(d){d3.html(d,function(d){var e=d3.select(c).node();e.parentNode.replaceChild(d3.select(d).select(c).node(),e),a.utils.pjax(b,c)})};d3.selectAll(b).on("click",function(){history.pushState(this.href,this.textContent,this.href),d(this.href),d3.event.preventDefault()}),d3.select(window).on("popstate",function(){d3.event.state&&d(d3.event.state)})},a.utils.calcApproxTextWidth=function(b){if(a.utils.isFunction(b.style)&&a.utils.isFunction(b.text)){var c=parseInt(b.style("font-size").replace("px",""),10),d=b.text().length;return a.utils.NaNtoZero(d*c*.5)}return 0},a.utils.NaNtoZero=function(b){return!a.utils.isNumber(b)||isNaN(b)||null===b||b===1/0||b===-(1/0)?0:b},d3.selection.prototype.watchTransition=function(a){var b=[this].concat([].slice.call(arguments,1));return a.transition.apply(a,b)},a.utils.renderWatch=function(b,c){if(!(this instanceof a.utils.renderWatch))return new a.utils.renderWatch(b,c);var d=void 0!==c?c:250,e=[],f=this;this.models=function(a){return a=[].slice.call(arguments,0),a.forEach(function(a){a.__rendered=!1,function(a){a.dispatch.on("renderEnd",function(b){a.__rendered=!0,f.renderEnd("model")})}(a),e.indexOf(a)<0&&e.push(a)}),this},this.reset=function(a){void 0!==a&&(d=a),e=[]},this.transition=function(a,b,c){if(b=arguments.length>1?[].slice.call(arguments,1):[],c=b.length>1?b.pop():void 0!==d?d:250,a.__rendered=!1,e.indexOf(a)<0&&e.push(a),0===c)return a.__rendered=!0,a.delay=function(){return this},a.duration=function(){return this},a;0===a.length?a.__rendered=!0:a.every(function(a){return!a.length})?a.__rendered=!0:a.__rendered=!1;var g=0;return a.transition().duration(c).each(function(){++g}).each("end",function(c,d){0===--g&&(a.__rendered=!0,f.renderEnd.apply(this,b))})},this.renderEnd=function(){e.every(function(a){return a.__rendered})&&(e.forEach(function(a){a.__rendered=!1}),b.renderEnd.apply(this,arguments))}},a.utils.deepExtend=function(b){var c=arguments.length>1?[].slice.call(arguments,1):[];c.forEach(function(c){for(var d in c){var e=a.utils.isArray(b[d]),f=a.utils.isObject(b[d]),g=a.utils.isObject(c[d]);f&&!e&&g?a.utils.deepExtend(b[d],c[d]):b[d]=c[d]}})},a.utils.state=function(){if(!(this instanceof a.utils.state))return new a.utils.state;var b={},c=function(){},d=function(){return{}},e=null,f=null;this.dispatch=d3.dispatch("change","set"),this.dispatch.on("set",function(a){c(a,!0)}),this.getter=function(a){return d=a,this},this.setter=function(a,b){return b||(b=function(){}),c=function(c,d){a(c),d&&b()},this},this.init=function(b){e=e||{},a.utils.deepExtend(e,b)};var g=function(){var a=d();if(JSON.stringify(a)===JSON.stringify(b))return!1;for(var c in a)void 0===b[c]&&(b[c]={}),b[c]=a[c],f=!0;return!0};this.update=function(){e&&(c(e,!1),e=null),g.call(this)&&this.dispatch.change(b)}},a.utils.optionsFunc=function(b){return b&&d3.map(b).forEach(function(b,c){a.utils.isFunction(this[b])&&this[b](c)}.bind(this)),this},a.utils.calcTicksX=function(b,c){var d=1,e=0;for(e;ed?f:d}return a.log("Requested number of ticks: ",b),a.log("Calculated max values to be: ",d),b=b>d?b=d-1:b,b=1>b?1:b,b=Math.floor(b),a.log("Calculating tick count as: ",b),b},a.utils.calcTicksY=function(b,c){return a.utils.calcTicksX(b,c)},a.utils.initOption=function(a,b){a._calls&&a._calls[b]?a[b]=a._calls[b]:(a[b]=function(c){return arguments.length?(a._overrides[b]=!0,a._options[b]=c,a):a._options[b]},a["_"+b]=function(c){return arguments.length?(a._overrides[b]||(a._options[b]=c),a):a._options[b]})},a.utils.initOptions=function(b){b._overrides=b._overrides||{};var c=Object.getOwnPropertyNames(b._options||{}),d=Object.getOwnPropertyNames(b._calls||{});c=c.concat(d);for(var e in c)a.utils.initOption(b,c[e])},a.utils.inheritOptionsD3=function(a,b,c){a._d3options=c.concat(a._d3options||[]),a._d3options=(a._d3options||[]).filter(function(a,b,c){return c.indexOf(a)===b}),c.unshift(b),c.unshift(a),d3.rebind.apply(this,c)},a.utils.arrayUnique=function(a){return a.sort().filter(function(b,c){return!c||b!=a[c-1]})},a.utils.symbolMap=d3.map(),a.utils.symbol=function(){function b(b,e){var f=c.call(this,b,e),g=d.call(this,b,e);return-1!==d3.svg.symbolTypes.indexOf(f)?d3.svg.symbol().type(f).size(g)():a.utils.symbolMap.get(f)(g)}var c,d=64;return b.type=function(a){return arguments.length?(c=d3.functor(a),b):c},b.size=function(a){return arguments.length?(d=d3.functor(a),b):d},b},a.utils.inheritOptions=function(b,c){var d=Object.getOwnPropertyNames(c._options||{}),e=Object.getOwnPropertyNames(c._calls||{}),f=c._inherited||[],g=c._d3options||[],h=d.concat(e).concat(f).concat(g);h.unshift(c),h.unshift(b),d3.rebind.apply(this,h),b._inherited=a.utils.arrayUnique(d.concat(e).concat(f).concat(d).concat(b._inherited||[])),b._d3options=a.utils.arrayUnique(g.concat(b._d3options||[]))},a.utils.initSVG=function(a){a.classed({"nvd3-svg":!0})},a.utils.sanitizeHeight=function(a,b){return a||parseInt(b.style("height"),10)||400},a.utils.sanitizeWidth=function(a,b){return a||parseInt(b.style("width"),10)||960},a.utils.availableHeight=function(b,c,d){return Math.max(0,a.utils.sanitizeHeight(b,c)-d.top-d.bottom)},a.utils.availableWidth=function(b,c,d){return Math.max(0,a.utils.sanitizeWidth(b,c)-d.left-d.right)},a.utils.noData=function(b,c){var d=b.options(),e=d.margin(),f=d.noData(),g=null==f?["No Data Available."]:[f],h=a.utils.availableHeight(null,c,e),i=a.utils.availableWidth(null,c,e),j=e.left+i/2,k=e.top+h/2;c.selectAll("g").remove();var l=c.selectAll(".nv-noData").data(g);l.enter().append("text").attr("class","nvd3 nv-noData").attr("dy","-.7em").style("text-anchor","middle"),l.attr("x",j).attr("y",k).text(function(a){return a})},a.utils.wrapTicks=function(a,b){a.each(function(){for(var a,c=d3.select(this),d=c.text().split(/\s+/).reverse(),e=[],f=0,g=1.1,h=c.attr("y"),i=parseFloat(c.attr("dy")),j=c.text(null).append("tspan").attr("x",0).attr("y",h).attr("dy",i+"em");a=d.pop();)e.push(a),j.text(e.join(" ")),j.node().getComputedTextLength()>b&&(e.pop(),j.text(e.join(" ")),e=[a],j=c.append("tspan").attr("x",0).attr("y",h).attr("dy",++f*g+i+"em").text(a))})},a.utils.arrayEquals=function(b,c){if(b===c)return!0;if(!b||!c)return!1;if(b.length!=c.length)return!1;for(var d=0,e=b.length;e>d;d++)if(b[d]instanceof Array&&c[d]instanceof Array){if(!a.arrayEquals(b[d],c[d]))return!1}else if(b[d]!=c[d])return!1;return!0},a.utils.pointIsInArc=function(a,b,c){var d=c.innerRadius()(b),e=c.outerRadius()(b),f=c.startAngle()(b),g=c.endAngle()(b),h=a.x*a.x+a.y*a.y,i=Math.atan2(a.x,-a.y);return i=0>i?i+2*Math.PI:i,h>=d*d&&e*e>=h&&i>=f&&g>=i},a.models.axis=function(){"use strict";function b(h){return u.reset(),h.each(function(b){var h=d3.select(this);a.utils.initSVG(h);var r=h.selectAll("g.nv-wrap.nv-axis").data([b]),s=r.enter().append("g").attr("class","nvd3 nv-wrap nv-axis"),v=(s.append("g"),r.select("g"));null!==o?d.ticks(o):("top"==d.orient()||"bottom"==d.orient())&&d.ticks(Math.abs(e.range()[1]-e.range()[0])/100),v.watchTransition(u,"axis").call(d),t=t||d.scale();var w=d.tickFormat();null==w&&(w=t.tickFormat());var x=v.selectAll("text.nv-axislabel").data([i||null]);x.exit().remove(),void 0!==q&&v.selectAll("g").select("text").style("font-size",q);var y,z,A;switch(d.orient()){case"top":x.enter().append("text").attr("class","nv-axislabel"),A=0,1===e.range().length?A=n?2*e.range()[0]+e.rangeBand():0:2===e.range().length?A=n?e.range()[0]+e.range()[1]+e.rangeBand():e.range()[1]:e.range().length>2&&(A=e.range()[e.range().length-1]+(e.range()[1]-e.range()[0])),x.attr("text-anchor","middle").attr("y",0).attr("x",A/2),j&&(z=r.selectAll("g.nv-axisMaxMin").data(e.domain()),z.enter().append("g").attr("class",function(a,b){return["nv-axisMaxMin","nv-axisMaxMin-x",0==b?"nv-axisMin-x":"nv-axisMax-x"].join(" ")}).append("text"),z.exit().remove(),z.attr("transform",function(b,c){return"translate("+a.utils.NaNtoZero(e(b))+",0)"}).select("text").attr("dy","-0.5em").attr("y",-d.tickPadding()).attr("text-anchor","middle").text(function(a,b){var d=c||w,e=d(a);return(""+e).match("NaN")?"":e}),z.watchTransition(u,"min-max top").attr("transform",function(b,c){return"translate("+a.utils.NaNtoZero(e.range()[c])+",0)"}));break;case"bottom":y=p+36;var B=30,C=0,D=v.selectAll("g").select("text"),E="";if(k%360){D.attr("transform",""),D.each(function(a,b){var c=this.getBoundingClientRect(),d=c.width;C=c.height,d>B&&(B=d)}),E="rotate("+k+" 0,"+(C/2+d.tickPadding())+")";var F=Math.abs(Math.sin(k*Math.PI/180));y=(F?F*B:B)+30,D.attr("transform",E).style("text-anchor",k%360>0?"start":"end")}else m?D.attr("transform",function(a,b){return"translate(0,"+(b%2==0?"0":"12")+")"}):D.attr("transform","translate(0,0)");x.enter().append("text").attr("class","nv-axislabel"),A=0,1===e.range().length?A=n?2*e.range()[0]+e.rangeBand():0:2===e.range().length?A=n?e.range()[0]+e.range()[1]+e.rangeBand():e.range()[1]:e.range().length>2&&(A=e.range()[e.range().length-1]+(e.range()[1]-e.range()[0])),x.attr("text-anchor","middle").attr("y",y).attr("x",A/2),j&&(z=r.selectAll("g.nv-axisMaxMin").data([e.domain()[0],e.domain()[e.domain().length-1]]),z.enter().append("g").attr("class",function(a,b){return["nv-axisMaxMin","nv-axisMaxMin-x",0==b?"nv-axisMin-x":"nv-axisMax-x"].join(" ")}).append("text"),z.exit().remove(),z.attr("transform",function(b,c){return"translate("+a.utils.NaNtoZero(e(b)+(n?e.rangeBand()/2:0))+",0)"}).select("text").attr("dy",".71em").attr("y",d.tickPadding()).attr("transform",E).style("text-anchor",k?k%360>0?"start":"end":"middle").text(function(a,b){var d=c||w,e=d(a);return(""+e).match("NaN")?"":e}),z.watchTransition(u,"min-max bottom").attr("transform",function(b,c){return"translate("+a.utils.NaNtoZero(e(b)+(n?e.rangeBand()/2:0))+",0)"}));break;case"right":x.enter().append("text").attr("class","nv-axislabel"),x.style("text-anchor",l?"middle":"begin").attr("transform",l?"rotate(90)":"").attr("y",l?-Math.max(f.right,g)+12-(p||0):-10).attr("x",l?d3.max(e.range())/2:d.tickPadding()),j&&(z=r.selectAll("g.nv-axisMaxMin").data(e.domain()),z.enter().append("g").attr("class",function(a,b){return["nv-axisMaxMin","nv-axisMaxMin-y",0==b?"nv-axisMin-y":"nv-axisMax-y"].join(" ")}).append("text").style("opacity",0),z.exit().remove(),z.attr("transform",function(b,c){return"translate(0,"+a.utils.NaNtoZero(e(b))+")"}).select("text").attr("dy",".32em").attr("y",0).attr("x",d.tickPadding()).style("text-anchor","start").text(function(a,b){var d=c||w,e=d(a);return(""+e).match("NaN")?"":e}),z.watchTransition(u,"min-max right").attr("transform",function(b,c){return"translate(0,"+a.utils.NaNtoZero(e.range()[c])+")"}).select("text").style("opacity",1));break;case"left":x.enter().append("text").attr("class","nv-axislabel"),x.style("text-anchor",l?"middle":"end").attr("transform",l?"rotate(-90)":"").attr("y",l?-Math.max(f.left,g)+25-(p||0):-10).attr("x",l?-d3.max(e.range())/2:-d.tickPadding()),j&&(z=r.selectAll("g.nv-axisMaxMin").data(e.domain()),z.enter().append("g").attr("class",function(a,b){return["nv-axisMaxMin","nv-axisMaxMin-y",0==b?"nv-axisMin-y":"nv-axisMax-y"].join(" ")}).append("text").style("opacity",0),z.exit().remove(),z.attr("transform",function(b,c){return"translate(0,"+a.utils.NaNtoZero(t(b))+")"}).select("text").attr("dy",".32em").attr("y",0).attr("x",-d.tickPadding()).attr("text-anchor","end").text(function(a,b){var d=c||w,e=d(a);return(""+e).match("NaN")?"":e}),z.watchTransition(u,"min-max right").attr("transform",function(b,c){return"translate(0,"+a.utils.NaNtoZero(e.range()[c])+")"}).select("text").style("opacity",1))}if(x.text(function(a){return a}),!j||"left"!==d.orient()&&"right"!==d.orient()||(v.selectAll("g").each(function(a,b){d3.select(this).select("text").attr("opacity",1),(e(a)e.range()[0]-10)&&((a>1e-10||-1e-10>a)&&d3.select(this).attr("opacity",0),d3.select(this).select("text").attr("opacity",0))}),e.domain()[0]==e.domain()[1]&&0==e.domain()[0]&&r.selectAll("g.nv-axisMaxMin").style("opacity",function(a,b){return b?0:1})),j&&("top"===d.orient()||"bottom"===d.orient())){var G=[];r.selectAll("g.nv-axisMaxMin").each(function(a,b){try{b?G.push(e(a)-this.getBoundingClientRect().width-4):G.push(e(a)+this.getBoundingClientRect().width+4)}catch(c){b?G.push(e(a)-4):G.push(e(a)+4)}}),v.selectAll("g").each(function(a,b){(e(a)G[1])&&(a>1e-10||-1e-10>a?d3.select(this).remove():d3.select(this).select("text").remove())})}v.selectAll(".tick").filter(function(a){return!parseFloat(Math.round(1e5*a)/1e6)&&void 0!==a}).classed("zero",!0),t=e.copy()}),u.renderEnd("axis immediate"),b}var c,d=d3.svg.axis(),e=d3.scale.linear(),f={top:0,right:0,bottom:0,left:0},g=75,h=60,i=null,j=!0,k=0,l=!0,m=!1,n=!1,o=null,p=0,q=void 0,r=250,s=d3.dispatch("renderEnd");d.scale(e).orient("bottom").tickFormat(function(a){return a});var t,u=a.utils.renderWatch(s,r);return b.axis=d,b.dispatch=s,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{axisLabelDistance:{get:function(){return p},set:function(a){p=a}},staggerLabels:{get:function(){return m},set:function(a){m=a}},rotateLabels:{get:function(){return k},set:function(a){k=a}},rotateYLabel:{get:function(){return l},set:function(a){l=a}},showMaxMin:{get:function(){return j},set:function(a){j=a}},axisLabel:{get:function(){return i},set:function(a){i=a}},height:{get:function(){return h},set:function(a){h=a}},ticks:{get:function(){return o},set:function(a){o=a}},width:{get:function(){return g},set:function(a){g=a}},fontSize:{get:function(){return q},set:function(a){q=a}},tickFormatMaxMin:{get:function(){return c},set:function(a){c=a}},margin:{get:function(){return f},set:function(a){f.top=void 0!==a.top?a.top:f.top,f.right=void 0!==a.right?a.right:f.right,f.bottom=void 0!==a.bottom?a.bottom:f.bottom,f.left=void 0!==a.left?a.left:f.left}},duration:{get:function(){return r},set:function(a){r=a,u.reset(r)}},scale:{get:function(){return e},set:function(c){e=c,d.scale(e),n="function"==typeof e.rangeBands,a.utils.inheritOptionsD3(b,e,["domain","range","rangeBand","rangeBands"])}}}),a.utils.initOptions(b),a.utils.inheritOptionsD3(b,d,["orient","tickValues","tickSubdivide","tickSize","tickPadding","tickFormat"]),a.utils.inheritOptionsD3(b,e,["domain","range","rangeBand","rangeBands"]),b},a.models.boxPlot=function(){"use strict";function b(l){return E.reset(),l.each(function(b){var l=j-i.left-i.right,F=k-i.top-i.bottom;A=d3.select(this),a.utils.initSVG(A),m.domain(c||b.map(function(a,b){return o(a,b)})).rangeBands(d||[0,l],.1);var G=[];if(!e){var H,I,J=[];b.forEach(function(a,b){var c=p(a),d=r(a),e=s(a),f=t(a),g=v(a);g&&g.forEach(function(a,b){J.push(w(a,b,void 0))}),e&&J.push(e),c&&J.push(c),d&&J.push(d),f&&J.push(f)}),H=d3.min(J),I=d3.max(J),G=[H,I]}n.domain(e||G),n.range(f||[F,0]),g=g||m,h=h||n.copy().range([n(0),n(0)]);var K=A.selectAll("g.nv-wrap").data([b]);K.enter().append("g").attr("class","nvd3 nv-wrap");K.attr("transform","translate("+i.left+","+i.top+")");var L=K.selectAll(".nv-boxplot").data(function(a){return a}),M=L.enter().append("g").style("stroke-opacity",1e-6).style("fill-opacity",1e-6);L.attr("class","nv-boxplot").attr("transform",function(a,b,c){return"translate("+(m(o(a,b))+.05*m.rangeBand())+", 0)"}).classed("hover",function(a){return a.hover}),L.watchTransition(E,"nv-boxplot: boxplots").style("stroke-opacity",1).style("fill-opacity",.75).delay(function(a,c){return c*C/b.length}).attr("transform",function(a,b){return"translate("+(m(o(a,b))+.05*m.rangeBand())+", 0)"}),L.exit().remove(),M.each(function(a,b){var c=d3.select(this);[s,t].forEach(function(d){if(void 0!==d(a)&&null!==d(a)){var e=d===s?"low":"high";c.append("line").style("stroke",u(a)||z(a,b)).attr("class","nv-boxplot-whisker nv-boxplot-"+e),c.append("line").style("stroke",u(a)||z(a,b)).attr("class","nv-boxplot-tick nv-boxplot-"+e)}})});var N=function(){return null===D?.9*m.rangeBand():Math.min(75,.9*m.rangeBand())},O=function(){return.45*m.rangeBand()-N()/2},P=function(){return.45*m.rangeBand()+N()/2};[s,t].forEach(function(a){var b=a===s?"low":"high",c=a===s?p:r;L.select("line.nv-boxplot-whisker.nv-boxplot-"+b).watchTransition(E,"nv-boxplot: boxplots").attr("x1",.45*m.rangeBand()).attr("y1",function(b,c){return n(a(b))}).attr("x2",.45*m.rangeBand()).attr("y2",function(a,b){return n(c(a))}),L.select("line.nv-boxplot-tick.nv-boxplot-"+b).watchTransition(E,"nv-boxplot: boxplots").attr("x1",O).attr("y1",function(b,c){return n(a(b))}).attr("x2",P).attr("y2",function(b,c){return n(a(b))})}),[s,t].forEach(function(a){var b=a===s?"low":"high";M.selectAll(".nv-boxplot-"+b).on("mouseover",function(b,c,d){d3.select(this).classed("hover",!0),B.elementMouseover({series:{key:a(b),color:u(b)||z(b,d)},e:d3.event})}).on("mouseout",function(b,c,d){d3.select(this).classed("hover",!1),B.elementMouseout({series:{key:a(b),color:u(b)||z(b,d)},e:d3.event})}).on("mousemove",function(a,b){B.elementMousemove({e:d3.event})})}),M.append("rect").attr("class","nv-boxplot-box").on("mouseover",function(a,b){d3.select(this).classed("hover",!0),B.elementMouseover({key:o(a),value:o(a),series:[{key:"Q3",value:r(a),color:u(a)||z(a,b)},{key:"Q2",value:q(a),color:u(a)||z(a,b)},{key:"Q1",value:p(a),color:u(a)||z(a,b)}],data:a,index:b,e:d3.event})}).on("mouseout",function(a,b){d3.select(this).classed("hover",!1),B.elementMouseout({key:o(a),value:o(a),series:[{key:"Q3",value:r(a),color:u(a)||z(a,b)},{key:"Q2",value:q(a),color:u(a)||z(a,b)},{key:"Q1",value:p(a),color:u(a)||z(a,b)}],data:a,index:b,e:d3.event})}).on("mousemove",function(a,b){B.elementMousemove({e:d3.event})}),L.select("rect.nv-boxplot-box").watchTransition(E,"nv-boxplot: boxes").attr("y",function(a,b){return n(r(a))}).attr("width",N).attr("x",O).attr("height",function(a,b){return Math.abs(n(r(a))-n(p(a)))||1}).style("fill",function(a,b){return u(a)||z(a,b)}).style("stroke",function(a,b){return u(a)||z(a,b)}),M.append("line").attr("class","nv-boxplot-median"),L.select("line.nv-boxplot-median").watchTransition(E,"nv-boxplot: boxplots line").attr("x1",O).attr("y1",function(a,b){return n(q(a))}).attr("x2",P).attr("y2",function(a,b){return n(q(a))});var Q=L.selectAll(".nv-boxplot-outlier").data(function(a){return v(a)||[]});Q.enter().append("circle").style("fill",function(a,b,c){return y(a,b,c)||z(a,c)}).style("stroke",function(a,b,c){return y(a,b,c)||z(a,c)}).style("z-index",9e3).on("mouseover",function(a,b,c){d3.select(this).classed("hover",!0),B.elementMouseover({series:{key:x(a,b,c),color:y(a,b,c)||z(a,c)},e:d3.event})}).on("mouseout",function(a,b,c){d3.select(this).classed("hover",!1),B.elementMouseout({series:{key:x(a,b,c),color:y(a,b,c)||z(a,c)},e:d3.event})}).on("mousemove",function(a,b){B.elementMousemove({e:d3.event})}),Q.attr("class","nv-boxplot-outlier"),Q.watchTransition(E,"nv-boxplot: nv-boxplot-outlier").attr("cx",.45*m.rangeBand()).attr("cy",function(a,b,c){return n(w(a,b,c))}).attr("r","3"),Q.exit().remove(),g=m.copy(),h=n.copy()}),E.renderEnd("nv-boxplot immediate"),b}var c,d,e,f,g,h,i={top:0,right:0,bottom:0,left:0},j=960,k=500,l=Math.floor(1e4*Math.random()),m=d3.scale.ordinal(),n=d3.scale.linear(),o=function(a){return a.label},p=function(a){return a.values.Q1},q=function(a){return a.values.Q2},r=function(a){return a.values.Q3},s=function(a){return a.values.whisker_low},t=function(a){return a.values.whisker_high},u=function(a){return a.color},v=function(a){return a.values.outliers},w=function(a,b,c){return a},x=function(a,b,c){return a},y=function(a,b,c){return void 0},z=a.utils.defaultColor(),A=null,B=d3.dispatch("elementMouseover","elementMouseout","elementMousemove","renderEnd"),C=250,D=null,E=a.utils.renderWatch(B,C);return b.dispatch=B,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return j},set:function(a){j=a}},height:{get:function(){return k},set:function(a){ +k=a}},maxBoxWidth:{get:function(){return D},set:function(a){D=a}},x:{get:function(){return o},set:function(a){o=a}},q1:{get:function(){return p},set:function(a){p=a}},q2:{get:function(){return q},set:function(a){q=a}},q3:{get:function(){return r},set:function(a){r=a}},wl:{get:function(){return s},set:function(a){s=a}},wh:{get:function(){return t},set:function(a){t=a}},itemColor:{get:function(){return u},set:function(a){u=a}},outliers:{get:function(){return v},set:function(a){v=a}},outlierValue:{get:function(){return w},set:function(a){w=a}},outlierLabel:{get:function(){return x},set:function(a){x=a}},outlierColor:{get:function(){return y},set:function(a){y=a}},xScale:{get:function(){return m},set:function(a){m=a}},yScale:{get:function(){return n},set:function(a){n=a}},xDomain:{get:function(){return c},set:function(a){c=a}},yDomain:{get:function(){return e},set:function(a){e=a}},xRange:{get:function(){return d},set:function(a){d=a}},yRange:{get:function(){return f},set:function(a){f=a}},id:{get:function(){return l},set:function(a){l=a}},y:{get:function(){return console.warn("BoxPlot 'y' chart option is deprecated. Please use model overrides instead."),{}},set:function(a){console.warn("BoxPlot 'y' chart option is deprecated. Please use model overrides instead.")}},margin:{get:function(){return i},set:function(a){i.top=void 0!==a.top?a.top:i.top,i.right=void 0!==a.right?a.right:i.right,i.bottom=void 0!==a.bottom?a.bottom:i.bottom,i.left=void 0!==a.left?a.left:i.left}},color:{get:function(){return z},set:function(b){z=a.utils.getColor(b)}},duration:{get:function(){return C},set:function(a){C=a,E.reset(C)}}}),a.utils.initOptions(b),b},a.models.boxPlotChart=function(){"use strict";function b(k){return t.reset(),t.models(e),l&&t.models(f),m&&t.models(g),k.each(function(k){var p=d3.select(this);a.utils.initSVG(p);var t=(i||parseInt(p.style("width"))||960)-h.left-h.right,u=(j||parseInt(p.style("height"))||400)-h.top-h.bottom;if(b.update=function(){r.beforeUpdate(),p.transition().duration(s).call(b)},b.container=this,!k||!k.length){var v=p.selectAll(".nv-noData").data([q]);return v.enter().append("text").attr("class","nvd3 nv-noData").attr("dy","-.7em").style("text-anchor","middle"),v.attr("x",h.left+t/2).attr("y",h.top+u/2).text(function(a){return a}),b}p.selectAll(".nv-noData").remove(),c=e.xScale(),d=e.yScale().clamp(!0);var w=p.selectAll("g.nv-wrap.nv-boxPlotWithAxes").data([k]),x=w.enter().append("g").attr("class","nvd3 nv-wrap nv-boxPlotWithAxes").append("g"),y=x.append("defs"),z=w.select("g");x.append("g").attr("class","nv-x nv-axis"),x.append("g").attr("class","nv-y nv-axis").append("g").attr("class","nv-zeroLine").append("line"),x.append("g").attr("class","nv-barsWrap"),z.attr("transform","translate("+h.left+","+h.top+")"),n&&z.select(".nv-y.nv-axis").attr("transform","translate("+t+",0)"),e.width(t).height(u);var A=z.select(".nv-barsWrap").datum(k.filter(function(a){return!a.disabled}));if(A.transition().call(e),y.append("clipPath").attr("id","nv-x-label-clip-"+e.id()).append("rect"),z.select("#nv-x-label-clip-"+e.id()+" rect").attr("width",c.rangeBand()*(o?2:1)).attr("height",16).attr("x",-c.rangeBand()/(o?1:2)),l){f.scale(c).ticks(a.utils.calcTicksX(t/100,k)).tickSize(-u,0),z.select(".nv-x.nv-axis").attr("transform","translate(0,"+d.range()[0]+")"),z.select(".nv-x.nv-axis").call(f);var B=z.select(".nv-x.nv-axis").selectAll("g");o&&B.selectAll("text").attr("transform",function(a,b,c){return"translate(0,"+(c%2===0?"5":"17")+")"})}m&&(g.scale(d).ticks(Math.floor(u/36)).tickSize(-t,0),z.select(".nv-y.nv-axis").call(g)),z.select(".nv-zeroLine line").attr("x1",0).attr("x2",t).attr("y1",d(0)).attr("y2",d(0))}),t.renderEnd("nv-boxplot chart immediate"),b}var c,d,e=a.models.boxPlot(),f=a.models.axis(),g=a.models.axis(),h={top:15,right:10,bottom:50,left:60},i=null,j=null,k=a.utils.getColor(),l=!0,m=!0,n=!1,o=!1,p=a.models.tooltip(),q="No Data Available.",r=d3.dispatch("beforeUpdate","renderEnd"),s=250;f.orient("bottom").showMaxMin(!1).tickFormat(function(a){return a}),g.orient(n?"right":"left").tickFormat(d3.format(",.1f")),p.duration(0);var t=a.utils.renderWatch(r,s);return e.dispatch.on("elementMouseover.tooltip",function(a){p.data(a).hidden(!1)}),e.dispatch.on("elementMouseout.tooltip",function(a){p.data(a).hidden(!0)}),e.dispatch.on("elementMousemove.tooltip",function(a){p()}),b.dispatch=r,b.boxplot=e,b.xAxis=f,b.yAxis=g,b.tooltip=p,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return i},set:function(a){i=a}},height:{get:function(){return j},set:function(a){j=a}},staggerLabels:{get:function(){return o},set:function(a){o=a}},showXAxis:{get:function(){return l},set:function(a){l=a}},showYAxis:{get:function(){return m},set:function(a){m=a}},tooltipContent:{get:function(){return p},set:function(a){p=a}},noData:{get:function(){return q},set:function(a){q=a}},margin:{get:function(){return h},set:function(a){h.top=void 0!==a.top?a.top:h.top,h.right=void 0!==a.right?a.right:h.right,h.bottom=void 0!==a.bottom?a.bottom:h.bottom,h.left=void 0!==a.left?a.left:h.left}},duration:{get:function(){return s},set:function(a){s=a,t.reset(s),e.duration(s),f.duration(s),g.duration(s)}},color:{get:function(){return k},set:function(b){k=a.utils.getColor(b),e.color(k)}},rightAlignYAxis:{get:function(){return n},set:function(a){n=a,g.orient(a?"right":"left")}}}),a.utils.inheritOptions(b,e),a.utils.initOptions(b),b},a.models.bullet=function(){"use strict";function b(a,b){var c=a.slice();a.sort(function(a,d){var e=c.indexOf(a),f=c.indexOf(d);return d3.descending(b[e],b[f])})}function c(e){return e.each(function(c,e){var s=p-d.left-d.right,y=q-d.top-d.bottom;r=d3.select(this),a.utils.initSVG(r);var z=g.call(this,c,e).slice(),A=h.call(this,c,e).slice(),B=i.call(this,c,e).slice(),C=j.call(this,c,e).slice(),D=k.call(this,c,e).slice(),E=l.call(this,c,e).slice(),F=m.call(this,c,e).slice(),G=n.call(this,c,e).slice();b(D,z),b(E,A),b(F,B),b(G,C),z.sort(d3.descending),A.sort(d3.descending),B.sort(d3.descending),C.sort(d3.descending);var H=d3.scale.linear().domain(d3.extent(d3.merge([o,z]))).range(f?[s,0]:[0,s]);this.__chart__||d3.scale.linear().domain([0,1/0]).range(H.range());this.__chart__=H;for(var I=(d3.min(z),d3.max(z),z[1],r.selectAll("g.nv-wrap.nv-bullet").data([c])),J=I.enter().append("g").attr("class","nvd3 nv-wrap nv-bullet"),K=J.append("g"),L=I.select("g"),e=0,M=z.length;M>e;e++){var N="nv-range nv-range"+e;2>=e&&(N=N+" nv-range"+w[e]),K.append("rect").attr("class",N)}K.append("rect").attr("class","nv-measure"),I.attr("transform","translate("+d.left+","+d.top+")");for(var O=function(a){return Math.abs(H(a)-H(0))},P=function(a){return H(0>a?a:0)},e=0,M=z.length;M>e;e++){var Q=z[e];L.select("rect.nv-range"+e).datum(Q).attr("height",y).transition().duration(x).attr("width",O(Q)).attr("x",P(Q))}L.select("rect.nv-measure").style("fill",t).attr("height",y/3).attr("y",y/3).on("mouseover",function(){u.elementMouseover({value:C[0],label:G[0]||"Current",color:d3.select(this).style("fill")})}).on("mousemove",function(){u.elementMousemove({value:C[0],label:G[0]||"Current",color:d3.select(this).style("fill")})}).on("mouseout",function(){u.elementMouseout({value:C[0],label:G[0]||"Current",color:d3.select(this).style("fill")})}).transition().duration(x).attr("width",0>C?H(0)-H(C[0]):H(C[0])-H(0)).attr("x",P(C));var R=y/6,S=A.map(function(a,b){return{value:a,label:E[b]}});K.selectAll("path.nv-markerTriangle").data(S).enter().append("path").attr("class","nv-markerTriangle").attr("d","M0,"+R+"L"+R+","+-R+" "+-R+","+-R+"Z").on("mouseover",function(a){u.elementMouseover({value:a.value,label:a.label||"Previous",color:d3.select(this).style("fill"),pos:[H(a.value),y/2]})}).on("mousemove",function(a){u.elementMousemove({value:a.value,label:a.label||"Previous",color:d3.select(this).style("fill")})}).on("mouseout",function(a,b){u.elementMouseout({value:a.value,label:a.label||"Previous",color:d3.select(this).style("fill")})}),L.selectAll("path.nv-markerTriangle").data(S).transition().duration(x).attr("transform",function(a){return"translate("+H(a.value)+","+y/2+")"});var T=B.map(function(a,b){return{value:a,label:F[b]}});K.selectAll("line.nv-markerLine").data(T).enter().append("line").attr("cursor","").attr("class","nv-markerLine").attr("x1",function(a){return H(a.value)}).attr("y1","2").attr("x2",function(a){return H(a.value)}).attr("y2",y-2).on("mouseover",function(a){u.elementMouseover({value:a.value,label:a.label||"Previous",color:d3.select(this).style("fill"),pos:[H(a.value),y/2]})}).on("mousemove",function(a){u.elementMousemove({value:a.value,label:a.label||"Previous",color:d3.select(this).style("fill")})}).on("mouseout",function(a,b){u.elementMouseout({value:a.value,label:a.label||"Previous",color:d3.select(this).style("fill")})}),L.selectAll("line.nv-markerLine").data(T).transition().duration(x).attr("x1",function(a){return H(a.value)}).attr("x2",function(a){return H(a.value)}),I.selectAll(".nv-range").on("mouseover",function(a,b){var c=D[b]||v[b];u.elementMouseover({value:a,label:c,color:d3.select(this).style("fill")})}).on("mousemove",function(){u.elementMousemove({value:C[0],label:G[0]||"Previous",color:d3.select(this).style("fill")})}).on("mouseout",function(a,b){var c=D[b]||v[b];u.elementMouseout({value:a,label:c,color:d3.select(this).style("fill")})})}),c}var d={top:0,right:0,bottom:0,left:0},e="left",f=!1,g=function(a){return a.ranges},h=function(a){return a.markers?a.markers:[]},i=function(a){return a.markerLines?a.markerLines:[0]},j=function(a){return a.measures},k=function(a){return a.rangeLabels?a.rangeLabels:[]},l=function(a){return a.markerLabels?a.markerLabels:[]},m=function(a){return a.markerLineLabels?a.markerLineLabels:[]},n=function(a){return a.measureLabels?a.measureLabels:[]},o=[0],p=380,q=30,r=null,s=null,t=a.utils.getColor(["#1f77b4"]),u=d3.dispatch("elementMouseover","elementMouseout","elementMousemove"),v=["Maximum","Mean","Minimum"],w=["Max","Avg","Min"],x=1e3;return c.dispatch=u,c.options=a.utils.optionsFunc.bind(c),c._options=Object.create({},{ranges:{get:function(){return g},set:function(a){g=a}},markers:{get:function(){return h},set:function(a){h=a}},measures:{get:function(){return j},set:function(a){j=a}},forceX:{get:function(){return o},set:function(a){o=a}},width:{get:function(){return p},set:function(a){p=a}},height:{get:function(){return q},set:function(a){q=a}},tickFormat:{get:function(){return s},set:function(a){s=a}},duration:{get:function(){return x},set:function(a){x=a}},margin:{get:function(){return d},set:function(a){d.top=void 0!==a.top?a.top:d.top,d.right=void 0!==a.right?a.right:d.right,d.bottom=void 0!==a.bottom?a.bottom:d.bottom,d.left=void 0!==a.left?a.left:d.left}},orient:{get:function(){return e},set:function(a){e=a,f="right"==e||"bottom"==e}},color:{get:function(){return t},set:function(b){t=a.utils.getColor(b)}}}),a.utils.initOptions(c),c},a.models.bulletChart=function(){"use strict";function b(d){return d.each(function(e,o){var p=d3.select(this);a.utils.initSVG(p);var q=a.utils.availableWidth(k,p,g),r=l-g.top-g.bottom;if(b.update=function(){b(d)},b.container=this,!e||!h.call(this,e,o))return a.utils.noData(b,p),b;p.selectAll(".nv-noData").remove();var s=h.call(this,e,o).slice().sort(d3.descending),t=i.call(this,e,o).slice().sort(d3.descending),u=j.call(this,e,o).slice().sort(d3.descending),v=p.selectAll("g.nv-wrap.nv-bulletChart").data([e]),w=v.enter().append("g").attr("class","nvd3 nv-wrap nv-bulletChart"),x=w.append("g"),y=v.select("g");x.append("g").attr("class","nv-bulletWrap"),x.append("g").attr("class","nv-titles"),v.attr("transform","translate("+g.left+","+g.top+")");var z=d3.scale.linear().domain([0,Math.max(s[0],t[0]||0,u[0])]).range(f?[q,0]:[0,q]),A=this.__chart__||d3.scale.linear().domain([0,1/0]).range(z.range());this.__chart__=z;var B=x.select(".nv-titles").append("g").attr("text-anchor","end").attr("transform","translate(-6,"+(l-g.top-g.bottom)/2+")");B.append("text").attr("class","nv-title").text(function(a){return a.title}),B.append("text").attr("class","nv-subtitle").attr("dy","1em").text(function(a){return a.subtitle}),c.width(q).height(r);var C=y.select(".nv-bulletWrap");d3.transition(C).call(c);var D=m||z.tickFormat(q/100),E=y.selectAll("g.nv-tick").data(z.ticks(n?n:q/50),function(a){return this.textContent||D(a)}),F=E.enter().append("g").attr("class","nv-tick").attr("transform",function(a){return"translate("+A(a)+",0)"}).style("opacity",1e-6);F.append("line").attr("y1",r).attr("y2",7*r/6),F.append("text").attr("text-anchor","middle").attr("dy","1em").attr("y",7*r/6).text(D);var G=d3.transition(E).transition().duration(c.duration()).attr("transform",function(a){return"translate("+z(a)+",0)"}).style("opacity",1);G.select("line").attr("y1",r).attr("y2",7*r/6),G.select("text").attr("y",7*r/6),d3.transition(E.exit()).transition().duration(c.duration()).attr("transform",function(a){return"translate("+z(a)+",0)"}).style("opacity",1e-6).remove()}),d3.timer.flush(),b}var c=a.models.bullet(),d=a.models.tooltip(),e="left",f=!1,g={top:5,right:40,bottom:20,left:120},h=function(a){return a.ranges},i=function(a){return a.markers?a.markers:[]},j=function(a){return a.measures},k=null,l=55,m=null,n=null,o=null,p=d3.dispatch();return d.duration(0).headerEnabled(!1),c.dispatch.on("elementMouseover.tooltip",function(a){a.series={key:a.label,value:a.value,color:a.color},d.data(a).hidden(!1)}),c.dispatch.on("elementMouseout.tooltip",function(a){d.hidden(!0)}),c.dispatch.on("elementMousemove.tooltip",function(a){d()}),b.bullet=c,b.dispatch=p,b.tooltip=d,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{ranges:{get:function(){return h},set:function(a){h=a}},markers:{get:function(){return i},set:function(a){i=a}},measures:{get:function(){return j},set:function(a){j=a}},width:{get:function(){return k},set:function(a){k=a}},height:{get:function(){return l},set:function(a){l=a}},tickFormat:{get:function(){return m},set:function(a){m=a}},ticks:{get:function(){return n},set:function(a){n=a}},noData:{get:function(){return o},set:function(a){o=a}},margin:{get:function(){return g},set:function(a){g.top=void 0!==a.top?a.top:g.top,g.right=void 0!==a.right?a.right:g.right,g.bottom=void 0!==a.bottom?a.bottom:g.bottom,g.left=void 0!==a.left?a.left:g.left}},orient:{get:function(){return e},set:function(a){e=a,f="right"==e||"bottom"==e}}}),a.utils.inheritOptions(b,c),a.utils.initOptions(b),b},a.models.candlestickBar=function(){"use strict";function b(x){return x.each(function(b){c=d3.select(this);var x=a.utils.availableWidth(i,c,h),y=a.utils.availableHeight(j,c,h);a.utils.initSVG(c);var A=x/b[0].values.length*.45;l.domain(d||d3.extent(b[0].values.map(n).concat(t))),v?l.range(f||[.5*x/b[0].values.length,x*(b[0].values.length-.5)/b[0].values.length]):l.range(f||[5+A/2,x-A/2-5]),m.domain(e||[d3.min(b[0].values.map(s).concat(u)),d3.max(b[0].values.map(r).concat(u))]).range(g||[y,0]),l.domain()[0]===l.domain()[1]&&(l.domain()[0]?l.domain([l.domain()[0]-.01*l.domain()[0],l.domain()[1]+.01*l.domain()[1]]):l.domain([-1,1])),m.domain()[0]===m.domain()[1]&&(m.domain()[0]?m.domain([m.domain()[0]+.01*m.domain()[0],m.domain()[1]-.01*m.domain()[1]]):m.domain([-1,1]));var B=d3.select(this).selectAll("g.nv-wrap.nv-candlestickBar").data([b[0].values]),C=B.enter().append("g").attr("class","nvd3 nv-wrap nv-candlestickBar"),D=C.append("defs"),E=C.append("g"),F=B.select("g");E.append("g").attr("class","nv-ticks"),B.attr("transform","translate("+h.left+","+h.top+")"),c.on("click",function(a,b){z.chartClick({data:a,index:b,pos:d3.event,id:k})}),D.append("clipPath").attr("id","nv-chart-clip-path-"+k).append("rect"),B.select("#nv-chart-clip-path-"+k+" rect").attr("width",x).attr("height",y),F.attr("clip-path",w?"url(#nv-chart-clip-path-"+k+")":"");var G=B.select(".nv-ticks").selectAll(".nv-tick").data(function(a){return a});G.exit().remove();var H=G.enter().append("g");G.attr("class",function(a,b,c){return(p(a,b)>q(a,b)?"nv-tick negative":"nv-tick positive")+" nv-tick-"+c+"-"+b});H.append("line").attr("class","nv-candlestick-lines").attr("transform",function(a,b){return"translate("+l(n(a,b))+",0)"}).attr("x1",0).attr("y1",function(a,b){return m(r(a,b))}).attr("x2",0).attr("y2",function(a,b){return m(s(a,b))}),H.append("rect").attr("class","nv-candlestick-rects nv-bars").attr("transform",function(a,b){return"translate("+(l(n(a,b))-A/2)+","+(m(o(a,b))-(p(a,b)>q(a,b)?m(q(a,b))-m(p(a,b)):0))+")"}).attr("x",0).attr("y",0).attr("width",A).attr("height",function(a,b){var c=p(a,b),d=q(a,b);return c>d?m(d)-m(c):m(c)-m(d)});G.select(".nv-candlestick-lines").transition().attr("transform",function(a,b){return"translate("+l(n(a,b))+",0)"}).attr("x1",0).attr("y1",function(a,b){return m(r(a,b))}).attr("x2",0).attr("y2",function(a,b){return m(s(a,b))}),G.select(".nv-candlestick-rects").transition().attr("transform",function(a,b){return"translate("+(l(n(a,b))-A/2)+","+(m(o(a,b))-(p(a,b)>q(a,b)?m(q(a,b))-m(p(a,b)):0))+")"}).attr("x",0).attr("y",0).attr("width",A).attr("height",function(a,b){var c=p(a,b),d=q(a,b);return c>d?m(d)-m(c):m(c)-m(d)})}),b}var c,d,e,f,g,h={top:0,right:0,bottom:0,left:0},i=null,j=null,k=Math.floor(1e4*Math.random()),l=d3.scale.linear(),m=d3.scale.linear(),n=function(a){return a.x},o=function(a){return a.y},p=function(a){return a.open},q=function(a){return a.close},r=function(a){return a.high},s=function(a){return a.low},t=[],u=[],v=!1,w=!0,x=a.utils.defaultColor(),y=!1,z=d3.dispatch("stateChange","changeState","renderEnd","chartClick","elementClick","elementDblClick","elementMouseover","elementMouseout","elementMousemove");return b.highlightPoint=function(a,d){b.clearHighlights(),c.select(".nv-candlestickBar .nv-tick-0-"+a).classed("hover",d)},b.clearHighlights=function(){c.select(".nv-candlestickBar .nv-tick.hover").classed("hover",!1)},b.dispatch=z,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return i},set:function(a){i=a}},height:{get:function(){return j},set:function(a){j=a}},xScale:{get:function(){return l},set:function(a){l=a}},yScale:{get:function(){return m},set:function(a){m=a}},xDomain:{get:function(){return d},set:function(a){d=a}},yDomain:{get:function(){return e},set:function(a){e=a}},xRange:{get:function(){return f},set:function(a){f=a}},yRange:{get:function(){return g},set:function(a){g=a}},forceX:{get:function(){return t},set:function(a){t=a}},forceY:{get:function(){return u},set:function(a){u=a}},padData:{get:function(){return v},set:function(a){v=a}},clipEdge:{get:function(){return w},set:function(a){w=a}},id:{get:function(){return k},set:function(a){k=a}},interactive:{get:function(){return y},set:function(a){y=a}},x:{get:function(){return n},set:function(a){n=a}},y:{get:function(){return o},set:function(a){o=a}},open:{get:function(){return p()},set:function(a){p=a}},close:{get:function(){return q()},set:function(a){q=a}},high:{get:function(){return r},set:function(a){r=a}},low:{get:function(){return s},set:function(a){s=a}},margin:{get:function(){return h},set:function(a){h.top=void 0!=a.top?a.top:h.top,h.right=void 0!=a.right?a.right:h.right,h.bottom=void 0!=a.bottom?a.bottom:h.bottom,h.left=void 0!=a.left?a.left:h.left}},color:{get:function(){return x},set:function(b){x=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.cumulativeLineChart=function(){"use strict";function b(m){return K.reset(),K.models(g),t&&K.models(h),u&&K.models(i),m.each(function(m){function C(a,c){d3.select(b.container).style("cursor","ew-resize")}function G(a,b){J.x=d3.event.x,J.i=Math.round(I.invert(J.x)),N()}function K(a,c){d3.select(b.container).style("cursor","auto"),A.index=J.i,E.stateChange(A)}function N(){ba.data([J]);var a=b.duration();b.duration(0),b.update(),b.duration(a)}var O=d3.select(this);a.utils.initSVG(O),O.classed("nv-chart-"+z,!0);var P=a.utils.availableWidth(q,O,n),Q=a.utils.availableHeight(r,O,n);if(b.update=function(){0===F?O.call(b):O.transition().duration(F).call(b)},b.container=this,A.setter(M(m),b.update).getter(L(m)).update(),A.disabled=m.map(function(a){return!!a.disabled}),!B){var R;B={};for(R in A)A[R]instanceof Array?B[R]=A[R].slice(0):B[R]=A[R]}var S=d3.behavior.drag().on("dragstart",C).on("drag",G).on("dragend",K);if(!(m&&m.length&&m.filter(function(a){return a.values.length}).length))return a.utils.noData(b,O),b;O.selectAll(".nv-noData").remove(),e=g.xScale(),f=g.yScale(),I.domain([0,m[0].values.length-1]).range([0,P]).clamp(!0);var m=c(J.i,m);"undefined"==typeof H&&(H=d(m)),y?g.yDomain(null):(g.yDomain(H),g.clipEdge(!0));var T=x?"none":"all",U=O.selectAll("g.nv-wrap.nv-cumulativeLine").data([m]),V=U.enter().append("g").attr("class","nvd3 nv-wrap nv-cumulativeLine").append("g"),W=U.select("g");if(V.append("g").attr("class","nv-interactive"),V.append("g").attr("class","nv-x nv-axis").style("pointer-events","none"),V.append("g").attr("class","nv-y nv-axis"),V.append("g").attr("class","nv-background"),V.append("g").attr("class","nv-linesWrap").style("pointer-events",T),V.append("g").attr("class","nv-avgLinesWrap").style("pointer-events","none"),V.append("g").attr("class","nv-legendWrap"),V.append("g").attr("class","nv-controlsWrap"),s?(j.width(P),W.select(".nv-legendWrap").datum(m).call(j),o||j.height()===n.top||(n.top=j.height(),Q=a.utils.availableHeight(r,O,n)),W.select(".nv-legendWrap").attr("transform","translate(0,"+-n.top+")")):W.select(".nv-legendWrap").selectAll("*").remove(),w){var X=[{key:"Re-scale y-axis",disabled:!y}];k.width(140).color(["#444","#444","#444"]).rightAlign(!1).margin({top:5,right:0,bottom:5,left:20}),W.select(".nv-controlsWrap").datum(X).attr("transform","translate(0,"+-n.top+")").call(k)}else W.select(".nv-controlsWrap").selectAll("*").remove();U.attr("transform","translate("+n.left+","+n.top+")"),v&&W.select(".nv-y.nv-axis").attr("transform","translate("+P+",0)");var Y=m.filter(function(a){return a.tempDisabled});U.select(".tempDisabled").remove(),Y.length&&U.append("text").attr("class","tempDisabled").attr("x",P/2).attr("y","-.71em").style("text-anchor","end").text(Y.map(function(a){return a.key}).join(", ")+" values cannot be calculated for this time period."),x&&(l.width(P).height(Q).margin({left:n.left,top:n.top}).svgContainer(O).xScale(e),U.select(".nv-interactive").call(l)),V.select(".nv-background").append("rect"),W.select(".nv-background rect").attr("width",P).attr("height",Q),g.y(function(a){return a.display.y}).width(P).height(Q).color(m.map(function(a,b){return a.color||p(a,b)}).filter(function(a,b){return!m[b].disabled&&!m[b].tempDisabled}));var Z=W.select(".nv-linesWrap").datum(m.filter(function(a){return!a.disabled&&!a.tempDisabled}));Z.call(g),m.forEach(function(a,b){a.seriesIndex=b});var $=m.filter(function(a){return!a.disabled&&!!D(a)}),_=W.select(".nv-avgLinesWrap").selectAll("line").data($,function(a){return a.key}),aa=function(a){var b=f(D(a));return 0>b?0:b>Q?Q:b};_.enter().append("line").style("stroke-width",2).style("stroke-dasharray","10,10").style("stroke",function(a,b){return g.color()(a,a.seriesIndex)}).attr("x1",0).attr("x2",P).attr("y1",aa).attr("y2",aa),_.style("stroke-opacity",function(a){var b=f(D(a));return 0>b||b>Q?0:1}).attr("x1",0).attr("x2",P).attr("y1",aa).attr("y2",aa),_.exit().remove();var ba=Z.selectAll(".nv-indexLine").data([J]);ba.enter().append("rect").attr("class","nv-indexLine").attr("width",3).attr("x",-2).attr("fill","red").attr("fill-opacity",.5).style("pointer-events","all").call(S),ba.attr("transform",function(a){return"translate("+I(a.i)+",0)"}).attr("height",Q),t&&(h.scale(e)._ticks(a.utils.calcTicksX(P/70,m)).tickSize(-Q,0),W.select(".nv-x.nv-axis").attr("transform","translate(0,"+f.range()[0]+")"),W.select(".nv-x.nv-axis").call(h)),u&&(i.scale(f)._ticks(a.utils.calcTicksY(Q/36,m)).tickSize(-P,0),W.select(".nv-y.nv-axis").call(i)),W.select(".nv-background rect").on("click",function(){J.x=d3.mouse(this)[0],J.i=Math.round(I.invert(J.x)),A.index=J.i,E.stateChange(A),N()}),g.dispatch.on("elementClick",function(a){J.i=a.pointIndex,J.x=I(J.i),A.index=J.i,E.stateChange(A),N()}),k.dispatch.on("legendClick",function(a,c){a.disabled=!a.disabled,y=!a.disabled,A.rescaleY=y,y||(H=d(m)),E.stateChange(A),b.update()}),j.dispatch.on("stateChange",function(a){for(var c in a)A[c]=a[c];E.stateChange(A),b.update()}),l.dispatch.on("elementMousemove",function(c){g.clearHighlights();var d,e,f,j=[];if(m.filter(function(a,b){return a.seriesIndex=b,!(a.disabled||a.tempDisabled)}).forEach(function(h,i){e=a.interactiveBisect(h.values,c.pointXValue,b.x()),g.highlightPoint(i,e,!0);var k=h.values[e];"undefined"!=typeof k&&("undefined"==typeof d&&(d=k),"undefined"==typeof f&&(f=b.xScale()(b.x()(k,e))),j.push({key:h.key,value:b.y()(k,e),color:p(h,h.seriesIndex)}))}),j.length>2){var k=b.yScale().invert(c.mouseY),n=Math.abs(b.yScale().domain()[0]-b.yScale().domain()[1]),o=.03*n,q=a.nearestValueIndex(j.map(function(a){return a.value}),k,o);null!==q&&(j[q].highlight=!0)}var r=h.tickFormat()(b.x()(d,e),e);l.tooltip.valueFormatter(function(a,b){return i.tickFormat()(a)}).data({value:r,series:j})(),l.renderGuideLine(f)}),l.dispatch.on("elementMouseout",function(a){g.clearHighlights()}),E.on("changeState",function(a){"undefined"!=typeof a.disabled&&(m.forEach(function(b,c){b.disabled=a.disabled[c]}),A.disabled=a.disabled),"undefined"!=typeof a.index&&(J.i=a.index,J.x=I(J.i),A.index=a.index,ba.data([J])),"undefined"!=typeof a.rescaleY&&(y=a.rescaleY),b.update()})}),K.renderEnd("cumulativeLineChart immediate"),b}function c(a,b){return N||(N=g.y()),b.map(function(b,c){if(!b.values)return b;var d=b.values[a];if(null==d)return b;var e=N(d,a);return Math.abs(e)<1e-5&&!G?(b.tempDisabled=!0,b):(b.tempDisabled=!1,b.values=b.values.map(function(a,b){return a.display={y:(N(a,b)-e)/e},a}),b)})}function d(a){var b=a.filter(function(a){return!(a.disabled||a.tempDisabled)}).map(function(a,b){return d3.extent(a.values,function(a){return a.display.y})});return[d3.min(b,function(a){return a[0]}),d3.max(b,function(a){return a[1]})]}var e,f,g=a.models.line(),h=a.models.axis(),i=a.models.axis(),j=a.models.legend(),k=a.models.legend(),l=a.interactiveGuideline(),m=a.models.tooltip(),n={top:30,right:30,bottom:50,left:60},o=null,p=a.utils.defaultColor(),q=null,r=null,s=!0,t=!0,u=!0,v=!1,w=!0,x=!1,y=!0,z=g.id(),A=a.utils.state(),B=null,C=null,D=function(a){return a.average},E=d3.dispatch("stateChange","changeState","renderEnd"),F=250,G=!1;A.index=0,A.rescaleY=y,h.orient("bottom").tickPadding(7),i.orient(v?"right":"left"),m.valueFormatter(function(a,b){return i.tickFormat()(a,b)}).headerFormatter(function(a,b){return h.tickFormat()(a,b)}),k.updateState(!1);var H,I=d3.scale.linear(),J={i:0,x:0},K=a.utils.renderWatch(E,F),L=function(a){return function(){return{active:a.map(function(a){return!a.disabled}),index:J.i,rescaleY:y}}},M=function(a){return function(b){void 0!==b.index&&(J.i=b.index),void 0!==b.rescaleY&&(y=b.rescaleY),void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}};g.dispatch.on("elementMouseover.tooltip",function(a){var c={x:b.x()(a.point),y:b.y()(a.point),color:a.point.color};a.point=c,m.data(a).hidden(!1)}),g.dispatch.on("elementMouseout.tooltip",function(a){m.hidden(!0)});var N=null;return b.dispatch=E,b.lines=g,b.legend=j,b.controls=k,b.xAxis=h,b.yAxis=i,b.interactiveLayer=l,b.state=A,b.tooltip=m,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return q},set:function(a){q=a}},height:{get:function(){return r},set:function(a){r=a}},showControls:{get:function(){return w},set:function(a){w=a}},showLegend:{get:function(){return s},set:function(a){s=a}},average:{get:function(){return D},set:function(a){D=a}},defaultState:{get:function(){return B},set:function(a){B=a}},noData:{get:function(){return C},set:function(a){C=a}},showXAxis:{get:function(){return t},set:function(a){t=a}},showYAxis:{get:function(){return u},set:function(a){u=a}},noErrorCheck:{get:function(){return G},set:function(a){G=a}},rescaleY:{get:function(){return y},set:function(a){y=a,b.state.rescaleY=a}},margin:{get:function(){return n},set:function(a){void 0!==a.top&&(n.top=a.top,o=a.top),n.right=void 0!==a.right?a.right:n.right,n.bottom=void 0!==a.bottom?a.bottom:n.bottom,n.left=void 0!==a.left?a.left:n.left}},color:{get:function(){return p},set:function(b){p=a.utils.getColor(b),j.color(p)}},useInteractiveGuideline:{get:function(){return x},set:function(a){x=a,a===!0&&(b.interactive(!1),b.useVoronoi(!1))}},rightAlignYAxis:{get:function(){return v},set:function(a){v=a,i.orient(a?"right":"left")}},duration:{get:function(){return F},set:function(a){F=a,g.duration(F),h.duration(F),i.duration(F),K.reset(F)}}}),a.utils.inheritOptions(b,g),a.utils.initOptions(b),b},a.models.discreteBar=function(){"use strict";function b(m){return y.reset(),m.each(function(b){var m=k-j.left-j.right,x=l-j.top-j.bottom;c=d3.select(this),a.utils.initSVG(c),b.forEach(function(a,b){a.values.forEach(function(a){a.series=b})});var z=d&&e?[]:b.map(function(a){return a.values.map(function(a,b){return{x:p(a,b),y:q(a,b),y0:a.y0}})});n.domain(d||d3.merge(z).map(function(a){return a.x})).rangeBands(f||[0,m],.1),o.domain(e||d3.extent(d3.merge(z).map(function(a){return a.y}).concat(r))),t?o.range(g||[x-(o.domain()[0]<0?12:0),o.domain()[1]>0?12:0]):o.range(g||[x,0]),h=h||n,i=i||o.copy().range([o(0),o(0)]);var A=c.selectAll("g.nv-wrap.nv-discretebar").data([b]),B=A.enter().append("g").attr("class","nvd3 nv-wrap nv-discretebar"),C=B.append("g");A.select("g");C.append("g").attr("class","nv-groups"),A.attr("transform","translate("+j.left+","+j.top+")");var D=A.select(".nv-groups").selectAll(".nv-group").data(function(a){return a},function(a){return a.key});D.enter().append("g").style("stroke-opacity",1e-6).style("fill-opacity",1e-6),D.exit().watchTransition(y,"discreteBar: exit groups").style("stroke-opacity",1e-6).style("fill-opacity",1e-6).remove(),D.attr("class",function(a,b){return"nv-group nv-series-"+b}).classed("hover",function(a){return a.hover}),D.watchTransition(y,"discreteBar: groups").style("stroke-opacity",1).style("fill-opacity",.75);var E=D.selectAll("g.nv-bar").data(function(a){return a.values});E.exit().remove();var F=E.enter().append("g").attr("transform",function(a,b,c){return"translate("+(n(p(a,b))+.05*n.rangeBand())+", "+o(0)+")"}).on("mouseover",function(a,b){d3.select(this).classed("hover",!0),v.elementMouseover({data:a,index:b,color:d3.select(this).style("fill")})}).on("mouseout",function(a,b){d3.select(this).classed("hover",!1),v.elementMouseout({data:a,index:b,color:d3.select(this).style("fill")})}).on("mousemove",function(a,b){v.elementMousemove({data:a,index:b,color:d3.select(this).style("fill")})}).on("click",function(a,b){var c=this;v.elementClick({data:a,index:b,color:d3.select(this).style("fill"),event:d3.event,element:c}),d3.event.stopPropagation()}).on("dblclick",function(a,b){v.elementDblClick({data:a,index:b,color:d3.select(this).style("fill")}),d3.event.stopPropagation()});F.append("rect").attr("height",0).attr("width",.9*n.rangeBand()/b.length),t?(F.append("text").attr("text-anchor","middle"),E.select("text").text(function(a,b){return u(q(a,b))}).watchTransition(y,"discreteBar: bars text").attr("x",.9*n.rangeBand()/2).attr("y",function(a,b){return q(a,b)<0?o(q(a,b))-o(0)+12:-4})):E.selectAll("text").remove(),E.attr("class",function(a,b){return q(a,b)<0?"nv-bar negative":"nv-bar positive"}).style("fill",function(a,b){return a.color||s(a,b)}).style("stroke",function(a,b){return a.color||s(a,b)}).select("rect").attr("class",w).watchTransition(y,"discreteBar: bars rect").attr("width",.9*n.rangeBand()/b.length),E.watchTransition(y,"discreteBar: bars").attr("transform",function(a,b){var c=n(p(a,b))+.05*n.rangeBand(),d=q(a,b)<0?o(0):o(0)-o(q(a,b))<1?o(0)-1:o(q(a,b));return"translate("+c+", "+d+")"}).select("rect").attr("height",function(a,b){return Math.max(Math.abs(o(q(a,b))-o(0)),1)}),h=n.copy(),i=o.copy()}),y.renderEnd("discreteBar immediate"),b}var c,d,e,f,g,h,i,j={top:0,right:0,bottom:0,left:0},k=960,l=500,m=Math.floor(1e4*Math.random()),n=d3.scale.ordinal(),o=d3.scale.linear(),p=function(a){ +return a.x},q=function(a){return a.y},r=[0],s=a.utils.defaultColor(),t=!1,u=d3.format(",.2f"),v=d3.dispatch("chartClick","elementClick","elementDblClick","elementMouseover","elementMouseout","elementMousemove","renderEnd"),w="discreteBar",x=250,y=a.utils.renderWatch(v,x);return b.dispatch=v,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return k},set:function(a){k=a}},height:{get:function(){return l},set:function(a){l=a}},forceY:{get:function(){return r},set:function(a){r=a}},showValues:{get:function(){return t},set:function(a){t=a}},x:{get:function(){return p},set:function(a){p=a}},y:{get:function(){return q},set:function(a){q=a}},xScale:{get:function(){return n},set:function(a){n=a}},yScale:{get:function(){return o},set:function(a){o=a}},xDomain:{get:function(){return d},set:function(a){d=a}},yDomain:{get:function(){return e},set:function(a){e=a}},xRange:{get:function(){return f},set:function(a){f=a}},yRange:{get:function(){return g},set:function(a){g=a}},valueFormat:{get:function(){return u},set:function(a){u=a}},id:{get:function(){return m},set:function(a){m=a}},rectClass:{get:function(){return w},set:function(a){w=a}},margin:{get:function(){return j},set:function(a){j.top=void 0!==a.top?a.top:j.top,j.right=void 0!==a.right?a.right:j.right,j.bottom=void 0!==a.bottom?a.bottom:j.bottom,j.left=void 0!==a.left?a.left:j.left}},color:{get:function(){return s},set:function(b){s=a.utils.getColor(b)}},duration:{get:function(){return x},set:function(a){x=a,y.reset(x)}}}),a.utils.initOptions(b),b},a.models.discreteBarChart=function(){"use strict";function b(i){return y.reset(),y.models(e),p&&y.models(f),q&&y.models(g),i.each(function(i){var n=d3.select(this);a.utils.initSVG(n);var v=a.utils.availableWidth(l,n,j),y=a.utils.availableHeight(m,n,j);if(b.update=function(){w.beforeUpdate(),n.transition().duration(x).call(b)},b.container=this,!(i&&i.length&&i.filter(function(a){return a.values.length}).length))return a.utils.noData(b,n),b;n.selectAll(".nv-noData").remove(),c=e.xScale(),d=e.yScale().clamp(!0);var z=n.selectAll("g.nv-wrap.nv-discreteBarWithAxes").data([i]),A=z.enter().append("g").attr("class","nvd3 nv-wrap nv-discreteBarWithAxes").append("g"),B=A.append("defs"),C=z.select("g");A.append("g").attr("class","nv-x nv-axis"),A.append("g").attr("class","nv-y nv-axis").append("g").attr("class","nv-zeroLine").append("line"),A.append("g").attr("class","nv-barsWrap"),A.append("g").attr("class","nv-legendWrap"),C.attr("transform","translate("+j.left+","+j.top+")"),o?(h.width(v),C.select(".nv-legendWrap").datum(i).call(h),k||h.height()===j.top||(j.top=h.height(),y=a.utils.availableHeight(m,n,j)),z.select(".nv-legendWrap").attr("transform","translate(0,"+-j.top+")")):C.select(".nv-legendWrap").selectAll("*").remove(),r&&C.select(".nv-y.nv-axis").attr("transform","translate("+v+",0)"),e.width(v).height(y);var D=C.select(".nv-barsWrap").datum(i.filter(function(a){return!a.disabled}));if(D.transition().call(e),B.append("clipPath").attr("id","nv-x-label-clip-"+e.id()).append("rect"),C.select("#nv-x-label-clip-"+e.id()+" rect").attr("width",c.rangeBand()*(s?2:1)).attr("height",16).attr("x",-c.rangeBand()/(s?1:2)),p){f.scale(c)._ticks(a.utils.calcTicksX(v/100,i)).tickSize(-y,0),C.select(".nv-x.nv-axis").attr("transform","translate(0,"+(d.range()[0]+(e.showValues()&&d.domain()[0]<0?16:0))+")"),C.select(".nv-x.nv-axis").call(f);var E=C.select(".nv-x.nv-axis").selectAll("g");s&&E.selectAll("text").attr("transform",function(a,b,c){return"translate(0,"+(c%2==0?"5":"17")+")"}),u&&E.selectAll(".tick text").attr("transform","rotate("+u+" 0,0)").style("text-anchor",u>0?"start":"end"),t&&C.selectAll(".tick text").call(a.utils.wrapTicks,b.xAxis.rangeBand())}q&&(g.scale(d)._ticks(a.utils.calcTicksY(y/36,i)).tickSize(-v,0),C.select(".nv-y.nv-axis").call(g)),C.select(".nv-zeroLine line").attr("x1",0).attr("x2",r?-v:v).attr("y1",d(0)).attr("y2",d(0))}),y.renderEnd("discreteBar chart immediate"),b}var c,d,e=a.models.discreteBar(),f=a.models.axis(),g=a.models.axis(),h=a.models.legend(),i=a.models.tooltip(),j={top:15,right:10,bottom:50,left:60},k=null,l=null,m=null,n=a.utils.getColor(),o=!1,p=!0,q=!0,r=!1,s=!1,t=!1,u=0,v=null,w=d3.dispatch("beforeUpdate","renderEnd"),x=250;f.orient("bottom").showMaxMin(!1).tickFormat(function(a){return a}),g.orient(r?"right":"left").tickFormat(d3.format(",.1f")),i.duration(0).headerEnabled(!1).valueFormatter(function(a,b){return g.tickFormat()(a,b)}).keyFormatter(function(a,b){return f.tickFormat()(a,b)});var y=a.utils.renderWatch(w,x);return e.dispatch.on("elementMouseover.tooltip",function(a){a.series={key:b.x()(a.data),value:b.y()(a.data),color:a.color},i.data(a).hidden(!1)}),e.dispatch.on("elementMouseout.tooltip",function(a){i.hidden(!0)}),e.dispatch.on("elementMousemove.tooltip",function(a){i()}),b.dispatch=w,b.discretebar=e,b.legend=h,b.xAxis=f,b.yAxis=g,b.tooltip=i,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return l},set:function(a){l=a}},height:{get:function(){return m},set:function(a){m=a}},showLegend:{get:function(){return o},set:function(a){o=a}},staggerLabels:{get:function(){return s},set:function(a){s=a}},rotateLabels:{get:function(){return u},set:function(a){u=a}},wrapLabels:{get:function(){return t},set:function(a){t=!!a}},showXAxis:{get:function(){return p},set:function(a){p=a}},showYAxis:{get:function(){return q},set:function(a){q=a}},noData:{get:function(){return v},set:function(a){v=a}},margin:{get:function(){return j},set:function(a){void 0!==a.top&&(j.top=a.top,k=a.top),j.right=void 0!==a.right?a.right:j.right,j.bottom=void 0!==a.bottom?a.bottom:j.bottom,j.left=void 0!==a.left?a.left:j.left}},duration:{get:function(){return x},set:function(a){x=a,y.reset(x),e.duration(x),f.duration(x),g.duration(x)}},color:{get:function(){return n},set:function(b){n=a.utils.getColor(b),e.color(n),h.color(n)}},rightAlignYAxis:{get:function(){return r},set:function(a){r=a,g.orient(a?"right":"left")}}}),a.utils.inheritOptions(b,e),a.utils.initOptions(b),b},a.models.distribution=function(){"use strict";function b(k){return m.reset(),k.each(function(b){var k=(e-("x"===g?d.left+d.right:d.top+d.bottom),"x"==g?"y":"x"),l=d3.select(this);a.utils.initSVG(l),c=c||j;var n=l.selectAll("g.nv-distribution").data([b]),o=n.enter().append("g").attr("class","nvd3 nv-distribution"),p=(o.append("g"),n.select("g"));n.attr("transform","translate("+d.left+","+d.top+")");var q=p.selectAll("g.nv-dist").data(function(a){return a},function(a){return a.key});q.enter().append("g"),q.attr("class",function(a,b){return"nv-dist nv-series-"+b}).style("stroke",function(a,b){return i(a,b)});var r=q.selectAll("line.nv-dist"+g).data(function(a){return a.values});r.enter().append("line").attr(g+"1",function(a,b){return c(h(a,b))}).attr(g+"2",function(a,b){return c(h(a,b))}),m.transition(q.exit().selectAll("line.nv-dist"+g),"dist exit").attr(g+"1",function(a,b){return j(h(a,b))}).attr(g+"2",function(a,b){return j(h(a,b))}).style("stroke-opacity",0).remove(),r.attr("class",function(a,b){return"nv-dist"+g+" nv-dist"+g+"-"+b}).attr(k+"1",0).attr(k+"2",f),m.transition(r,"dist").attr(g+"1",function(a,b){return j(h(a,b))}).attr(g+"2",function(a,b){return j(h(a,b))}),c=j.copy()}),m.renderEnd("distribution immediate"),b}var c,d={top:0,right:0,bottom:0,left:0},e=400,f=8,g="x",h=function(a){return a[g]},i=a.utils.defaultColor(),j=d3.scale.linear(),k=250,l=d3.dispatch("renderEnd"),m=a.utils.renderWatch(l,k);return b.options=a.utils.optionsFunc.bind(b),b.dispatch=l,b.margin=function(a){return arguments.length?(d.top="undefined"!=typeof a.top?a.top:d.top,d.right="undefined"!=typeof a.right?a.right:d.right,d.bottom="undefined"!=typeof a.bottom?a.bottom:d.bottom,d.left="undefined"!=typeof a.left?a.left:d.left,b):d},b.width=function(a){return arguments.length?(e=a,b):e},b.axis=function(a){return arguments.length?(g=a,b):g},b.size=function(a){return arguments.length?(f=a,b):f},b.getData=function(a){return arguments.length?(h=d3.functor(a),b):h},b.scale=function(a){return arguments.length?(j=a,b):j},b.color=function(c){return arguments.length?(i=a.utils.getColor(c),b):i},b.duration=function(a){return arguments.length?(k=a,m.reset(k),b):k},b},a.models.focus=function(b){"use strict";function c(u){return t.reset(),t.models(b),m&&t.models(f),n&&t.models(g),u.each(function(t){function u(a){var b=+("e"==a),c=b?1:-1,d=z/3;return"M"+.5*c+","+d+"A6,6 0 0 "+b+" "+6.5*c+","+(d+6)+"V"+(2*d-6)+"A6,6 0 0 "+b+" "+.5*c+","+2*d+"ZM"+2.5*c+","+(d+8)+"V"+(2*d-8)+"M"+4.5*c+","+(d+8)+"V"+(2*d-8)}function v(){h.empty()||h.extent(p),E.data([h.empty()?d.domain():p]).each(function(a,b){var c=d(a[0])-d.range()[0],e=y-d(a[1]);d3.select(this).select(".left").attr("width",0>c?0:c),d3.select(this).select(".right").attr("x",d(a[1])).attr("width",0>e?0:e)})}function w(a){p=h.empty()?null:h.extent();var b=h.empty()?d.domain():h.extent();r.brush({extent:b,brush:h}),v(),a&&r.onBrush(b)}var x=d3.select(this);a.utils.initSVG(x);var y=a.utils.availableWidth(k,x,i),z=l-i.top-i.bottom;c.update=function(){0===q?x.call(c):x.transition().duration(q).call(c)},c.container=this,d=b.xScale(),e=b.yScale();var A=x.selectAll("g.nv-focus").data([t]),B=A.enter().append("g").attr("class","nvd3 nv-focus").append("g"),C=A.select("g");A.attr("transform","translate("+i.left+","+i.top+")"),B.append("g").attr("class","nv-background").append("rect"),B.append("g").attr("class","nv-x nv-axis"),B.append("g").attr("class","nv-y nv-axis"),B.append("g").attr("class","nv-contentWrap"),B.append("g").attr("class","nv-brushBackground"),B.append("g").attr("class","nv-x nv-brush"),o&&C.select(".nv-y.nv-axis").attr("transform","translate("+y+",0)"),C.select(".nv-background rect").attr("width",y).attr("height",z),b.width(y).height(z).color(t.map(function(a,b){return a.color||j(a,b)}).filter(function(a,b){return!t[b].disabled}));var D=C.select(".nv-contentWrap").datum(t.filter(function(a){return!a.disabled}));d3.transition(D).call(b),h.x(d).on("brush",function(){w(s)}),h.on("brushend",function(){s||r.onBrush(h.empty()?d.domain():h.extent())}),p&&h.extent(p);var E=C.select(".nv-brushBackground").selectAll("g").data([p||h.extent()]),F=E.enter().append("g");F.append("rect").attr("class","left").attr("x",0).attr("y",0).attr("height",z),F.append("rect").attr("class","right").attr("x",0).attr("y",0).attr("height",z);var G=C.select(".nv-x.nv-brush").call(h);G.selectAll("rect").attr("height",z),G.selectAll(".resize").append("path").attr("d",u),w(!0),C.select(".nv-background rect").attr("width",y).attr("height",z),m&&(f.scale(d)._ticks(a.utils.calcTicksX(y/100,t)).tickSize(-z,0),C.select(".nv-x.nv-axis").attr("transform","translate(0,"+e.range()[0]+")"),d3.transition(C.select(".nv-x.nv-axis")).call(f)),n&&(g.scale(e)._ticks(a.utils.calcTicksY(z/36,t)).tickSize(-y,0),d3.transition(C.select(".nv-y.nv-axis")).call(g)),C.select(".nv-x.nv-axis").attr("transform","translate(0,"+e.range()[0]+")")}),t.renderEnd("focus immediate"),c}var d,e,b=b||a.models.line(),f=a.models.axis(),g=a.models.axis(),h=d3.svg.brush(),i={top:10,right:0,bottom:30,left:0},j=a.utils.defaultColor(),k=null,l=70,m=!0,n=!1,o=!1,p=null,q=250,r=d3.dispatch("brush","onBrush","renderEnd"),s=!0;b.interactive(!1),b.pointActive(function(a){return!1});var t=a.utils.renderWatch(r,q);return c.dispatch=r,c.content=b,c.brush=h,c.xAxis=f,c.yAxis=g,c.options=a.utils.optionsFunc.bind(c),c._options=Object.create({},{width:{get:function(){return k},set:function(a){k=a}},height:{get:function(){return l},set:function(a){l=a}},showXAxis:{get:function(){return m},set:function(a){m=a}},showYAxis:{get:function(){return n},set:function(a){n=a}},brushExtent:{get:function(){return p},set:function(a){p=a}},syncBrushing:{get:function(){return s},set:function(a){s=a}},margin:{get:function(){return i},set:function(a){i.top=void 0!==a.top?a.top:i.top,i.right=void 0!==a.right?a.right:i.right,i.bottom=void 0!==a.bottom?a.bottom:i.bottom,i.left=void 0!==a.left?a.left:i.left}},duration:{get:function(){return q},set:function(a){q=a,t.reset(q),b.duration(q),f.duration(q),g.duration(q)}},color:{get:function(){return j},set:function(c){j=a.utils.getColor(c),b.color(j)}},interpolate:{get:function(){return b.interpolate()},set:function(a){b.interpolate(a)}},xTickFormat:{get:function(){return f.tickFormat()},set:function(a){f.tickFormat(a)}},yTickFormat:{get:function(){return g.tickFormat()},set:function(a){g.tickFormat(a)}},x:{get:function(){return b.x()},set:function(a){b.x(a)}},y:{get:function(){return b.y()},set:function(a){b.y(a)}},rightAlignYAxis:{get:function(){return o},set:function(a){o=a,g.orient(o?"right":"left")}}}),a.utils.inheritOptions(c,b),a.utils.initOptions(c),c},a.models.forceDirectedGraph=function(){"use strict";function b(g){return w.reset(),g.each(function(g){f=d3.select(this),a.utils.initSVG(f);var j=a.utils.availableWidth(d,f,c),u=a.utils.availableHeight(e,f,c);if(f.attr("width",j).attr("height",u),!(g&&g.links&&g.nodes))return a.utils.noData(b,f),b;f.selectAll(".nv-noData").remove(),f.selectAll("*").remove();var v=new Set;g.nodes.forEach(function(a){var b=Object.keys(a);b.forEach(function(a){v.add(a)})});var w=d3.layout.force().nodes(g.nodes).links(g.links).size([j,u]).linkStrength(k).friction(l).linkDistance(m).charge(n).gravity(o).theta(p).alpha(q).start(),x=f.selectAll(".link").data(g.links).enter().append("line").attr("class","nv-force-link").style("stroke-width",function(a){return Math.sqrt(a.value)}),y=f.selectAll(".node").data(g.nodes).enter().append("g").attr("class","nv-force-node").call(w.drag);y.append("circle").attr("r",r).style("fill",function(a){return h(a)}).on("mouseover",function(a){f.select(".nv-series-"+a.seriesIndex+" .nv-distx-"+a.pointIndex).attr("y1",a.py),f.select(".nv-series-"+a.seriesIndex+" .nv-disty-"+a.pointIndex).attr("x2",a.px);var b=h(a);a.series=[],v.forEach(function(c){a.series.push({color:b,key:c,value:a[c]})}),i.data(a).hidden(!1)}).on("mouseout",function(a){i.hidden(!0)}),i.headerFormatter(function(a){return"Node"}),t(x),s(y),w.on("tick",function(){x.attr("x1",function(a){return a.source.x}).attr("y1",function(a){return a.source.y}).attr("x2",function(a){return a.target.x}).attr("y2",function(a){return a.target.y}),y.attr("transform",function(a){return"translate("+a.x+", "+a.y+")"})})}),b}var c={top:2,right:0,bottom:2,left:0},d=400,e=32,f=null,g=d3.dispatch("renderEnd"),h=a.utils.getColor(["#000"]),i=a.models.tooltip(),j=null,k=.1,l=.9,m=30,n=-120,o=.1,p=.8,q=.1,r=5,s=function(a){},t=function(a){},u=d3.functor(0),v=d3.functor(0),w=a.utils.renderWatch(g);return b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return d},set:function(a){d=a}},height:{get:function(){return e},set:function(a){e=a}},linkStrength:{get:function(){return k},set:function(a){k=a}},friction:{get:function(){return l},set:function(a){l=a}},linkDist:{get:function(){return m},set:function(a){m=a}},charge:{get:function(){return n},set:function(a){n=a}},gravity:{get:function(){return o},set:function(a){o=a}},theta:{get:function(){return p},set:function(a){p=a}},alpha:{get:function(){return q},set:function(a){q=a}},radius:{get:function(){return r},set:function(a){r=a}},x:{get:function(){return u},set:function(a){u=d3.functor(a)}},y:{get:function(){return v},set:function(a){v=d3.functor(a)}},margin:{get:function(){return c},set:function(a){c.top=void 0!==a.top?a.top:c.top,c.right=void 0!==a.right?a.right:c.right,c.bottom=void 0!==a.bottom?a.bottom:c.bottom,c.left=void 0!==a.left?a.left:c.left}},color:{get:function(){return h},set:function(b){h=a.utils.getColor(b)}},noData:{get:function(){return j},set:function(a){j=a}},nodeExtras:{get:function(){return s},set:function(a){s=a}},linkExtras:{get:function(){return t},set:function(a){t=a}}}),b.dispatch=g,b.tooltip=i,a.utils.initOptions(b),b},a.models.furiousLegend=function(){"use strict";function b(r){function s(a,b){return"furious"!=q?"#000":o?a.disengaged?h(a,b):"#fff":o?void 0:a.disabled?h(a,b):"#fff"}function t(a,b){return o&&"furious"==q?a.disengaged?"#fff":h(a,b):a.disabled?"#fff":h(a,b)}return r.each(function(b){var r=d-c.left-c.right,u=d3.select(this);a.utils.initSVG(u);var v=u.selectAll("g.nv-legend").data([b]),w=(v.enter().append("g").attr("class","nvd3 nv-legend").append("g"),v.select("g"));v.attr("transform","translate("+c.left+","+c.top+")");var x,y=w.selectAll(".nv-series").data(function(a){return"furious"!=q?a:a.filter(function(a){return o?!0:!a.disengaged})}),z=y.enter().append("g").attr("class","nv-series");if("classic"==q)z.append("circle").style("stroke-width",2).attr("class","nv-legend-symbol").attr("r",5),x=y.select("circle");else if("furious"==q){z.append("rect").style("stroke-width",2).attr("class","nv-legend-symbol").attr("rx",3).attr("ry",3),x=y.select("rect"),z.append("g").attr("class","nv-check-box").property("innerHTML",'').attr("transform","translate(-10,-8)scale(0.5)");var A=y.select(".nv-check-box");A.each(function(a,b){d3.select(this).selectAll("path").attr("stroke",s(a,b))})}z.append("text").attr("text-anchor","start").attr("class","nv-legend-text").attr("dy",".32em").attr("dx","8");var B=y.select("text.nv-legend-text");y.on("mouseover",function(a,b){p.legendMouseover(a,b)}).on("mouseout",function(a,b){p.legendMouseout(a,b)}).on("click",function(a,b){p.legendClick(a,b);var c=y.data();if(m){if("classic"==q)n?(c.forEach(function(a){a.disabled=!0}),a.disabled=!1):(a.disabled=!a.disabled,c.every(function(a){return a.disabled})&&c.forEach(function(a){a.disabled=!1}));else if("furious"==q)if(o)a.disengaged=!a.disengaged,a.userDisabled=void 0==a.userDisabled?!!a.disabled:a.userDisabled,a.disabled=a.disengaged||a.userDisabled;else if(!o){a.disabled=!a.disabled,a.userDisabled=a.disabled;var d=c.filter(function(a){return!a.disengaged});d.every(function(a){return a.userDisabled})&&c.forEach(function(a){a.disabled=a.userDisabled=!1})}p.stateChange({disabled:c.map(function(a){return!!a.disabled}),disengaged:c.map(function(a){return!!a.disengaged})})}}).on("dblclick",function(a,b){if(("furious"!=q||!o)&&(p.legendDblclick(a,b),m)){var c=y.data();c.forEach(function(a){a.disabled=!0,"furious"==q&&(a.userDisabled=a.disabled)}),a.disabled=!1,"furious"==q&&(a.userDisabled=a.disabled),p.stateChange({disabled:c.map(function(a){return!!a.disabled})})}}),y.classed("nv-disabled",function(a){return a.userDisabled}),y.exit().remove(),B.attr("fill",s).text(function(a){return g(f(a))});var C;switch(q){case"furious":C=23;break;case"classic":C=20}if(j){var D=[];y.each(function(b,c){var d;if(g(f(b))&&g(f(b)).length>i){var e=g(f(b)).substring(0,i);d=d3.select(this).select("text").text(e+"..."),d3.select(this).append("svg:title").text(g(f(b)))}else d=d3.select(this).select("text");var h;try{if(h=d.node().getComputedTextLength(),0>=h)throw Error()}catch(j){h=a.utils.calcApproxTextWidth(d)}D.push(h+k)});for(var E=0,F=0,G=[];r>F&&Er&&E>1;){G=[],E--;for(var H=0;H(G[H%E]||0)&&(G[H%E]=D[H]);F=G.reduce(function(a,b,c,d){return a+b})}for(var I=[],J=0,K=0;E>J;J++)I[J]=K,K+=G[J];y.attr("transform",function(a,b){return"translate("+I[b%E]+","+(5+Math.floor(b/E)*C)+")"}),l?w.attr("transform","translate("+(d-c.right-F)+","+c.top+")"):w.attr("transform","translate(0,"+c.top+")"),e=c.top+c.bottom+Math.ceil(D.length/E)*C}else{var L,M=5,N=5,O=0;y.attr("transform",function(a,b){var e=d3.select(this).select("text").node().getComputedTextLength()+k;return L=N,dO&&(O=N),"translate("+L+","+M+")"}),w.attr("transform","translate("+(d-c.right-O)+","+c.top+")"),e=c.top+c.bottom+M+15}"furious"==q&&x.attr("width",function(a,b){return B[0][b].getComputedTextLength()+27}).attr("height",18).attr("y",-9).attr("x",-15),x.style("fill",t).style("stroke",function(a,b){return a.color||h(a,b)})}),b}var c={top:5,right:0,bottom:5,left:0},d=400,e=20,f=function(a){return a.key},g=function(a){return a},h=a.utils.getColor(),i=20,j=!0,k=28,l=!0,m=!0,n=!1,o=!1,p=d3.dispatch("legendClick","legendDblclick","legendMouseover","legendMouseout","stateChange"),q="classic";return b.dispatch=p,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return d},set:function(a){d=a}},height:{get:function(){return e},set:function(a){e=a}},key:{get:function(){return f},set:function(a){f=a}},keyFormatter:{get:function(){return g},set:function(a){g=a}},align:{get:function(){return j},set:function(a){j=a}},rightAlign:{get:function(){return l},set:function(a){l=a}},maxKeyLength:{get:function(){return i},set:function(a){i=a}},padding:{get:function(){return k},set:function(a){k=a}},updateState:{get:function(){return m},set:function(a){m=a}},radioButtonMode:{get:function(){return n},set:function(a){n=a}},expanded:{get:function(){return o},set:function(a){o=a}},vers:{get:function(){return q},set:function(a){q=a}},margin:{get:function(){return c},set:function(a){c.top=void 0!==a.top?a.top:c.top,c.right=void 0!==a.right?a.right:c.right,c.bottom=void 0!==a.bottom?a.bottom:c.bottom,c.left=void 0!==a.left?a.left:c.left}},color:{get:function(){return h},set:function(b){h=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.historicalBar=function(){"use strict";function b(x){return x.each(function(b){w.reset(),k=d3.select(this);var x=a.utils.availableWidth(h,k,g),y=a.utils.availableHeight(i,k,g);a.utils.initSVG(k),l.domain(c||d3.extent(b[0].values.map(n).concat(p))),r?l.range(e||[.5*x/b[0].values.length,x*(b[0].values.length-.5)/b[0].values.length]):l.range(e||[0,x]),m.domain(d||d3.extent(b[0].values.map(o).concat(q))).range(f||[y,0]),l.domain()[0]===l.domain()[1]&&(l.domain()[0]?l.domain([l.domain()[0]-.01*l.domain()[0],l.domain()[1]+.01*l.domain()[1]]):l.domain([-1,1])),m.domain()[0]===m.domain()[1]&&(m.domain()[0]?m.domain([m.domain()[0]+.01*m.domain()[0],m.domain()[1]-.01*m.domain()[1]]):m.domain([-1,1]));var z=k.selectAll("g.nv-wrap.nv-historicalBar-"+j).data([b[0].values]),A=z.enter().append("g").attr("class","nvd3 nv-wrap nv-historicalBar-"+j),B=A.append("defs"),C=A.append("g"),D=z.select("g");C.append("g").attr("class","nv-bars"),z.attr("transform","translate("+g.left+","+g.top+")"),k.on("click",function(a,b){u.chartClick({data:a,index:b,pos:d3.event,id:j})}),B.append("clipPath").attr("id","nv-chart-clip-path-"+j).append("rect"),z.select("#nv-chart-clip-path-"+j+" rect").attr("width",x).attr("height",y),D.attr("clip-path",s?"url(#nv-chart-clip-path-"+j+")":"");var E=z.select(".nv-bars").selectAll(".nv-bar").data(function(a){return a},function(a,b){return n(a,b)});E.exit().remove(),E.enter().append("rect").attr("x",0).attr("y",function(b,c){return a.utils.NaNtoZero(m(Math.max(0,o(b,c))))}).attr("height",function(b,c){return a.utils.NaNtoZero(Math.abs(m(o(b,c))-m(0)))}).attr("transform",function(a,c){return"translate("+(l(n(a,c))-x/b[0].values.length*.45)+",0)"}).on("mouseover",function(a,b){v&&(d3.select(this).classed("hover",!0),u.elementMouseover({data:a,index:b,color:d3.select(this).style("fill")}))}).on("mouseout",function(a,b){v&&(d3.select(this).classed("hover",!1),u.elementMouseout({data:a,index:b,color:d3.select(this).style("fill")}))}).on("mousemove",function(a,b){v&&u.elementMousemove({data:a,index:b,color:d3.select(this).style("fill")})}).on("click",function(a,b){if(v){var c=this;u.elementClick({data:a,index:b,color:d3.select(this).style("fill"),event:d3.event,element:c}),d3.event.stopPropagation()}}).on("dblclick",function(a,b){v&&(u.elementDblClick({data:a,index:b,color:d3.select(this).style("fill")}),d3.event.stopPropagation())}),E.attr("fill",function(a,b){return t(a,b)}).attr("class",function(a,b,c){return(o(a,b)<0?"nv-bar negative":"nv-bar positive")+" nv-bar-"+c+"-"+b}).watchTransition(w,"bars").attr("transform",function(a,c){return"translate("+(l(n(a,c))-x/b[0].values.length*.45)+",0)"}).attr("width",x/b[0].values.length*.9),E.watchTransition(w,"bars").attr("y",function(b,c){var d=o(b,c)<0?m(0):m(0)-m(o(b,c))<1?m(0)-1:m(o(b,c));return a.utils.NaNtoZero(d)}).attr("height",function(b,c){return a.utils.NaNtoZero(Math.max(Math.abs(m(o(b,c))-m(0)),1))})}),w.renderEnd("historicalBar immediate"),b}var c,d,e,f,g={top:0,right:0,bottom:0,left:0},h=null,i=null,j=Math.floor(1e4*Math.random()),k=null,l=d3.scale.linear(),m=d3.scale.linear(),n=function(a){return a.x},o=function(a){return a.y},p=[],q=[0],r=!1,s=!0,t=a.utils.defaultColor(),u=d3.dispatch("chartClick","elementClick","elementDblClick","elementMouseover","elementMouseout","elementMousemove","renderEnd"),v=!0,w=a.utils.renderWatch(u,0);return b.highlightPoint=function(a,b){k.select(".nv-bars .nv-bar-0-"+a).classed("hover",b)},b.clearHighlights=function(){k.select(".nv-bars .nv-bar.hover").classed("hover",!1)},b.dispatch=u,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return h},set:function(a){h=a}},height:{get:function(){return i},set:function(a){i=a}},forceX:{get:function(){return p},set:function(a){p=a}},forceY:{get:function(){return q},set:function(a){q=a}},padData:{get:function(){return r},set:function(a){r=a}},x:{get:function(){return n},set:function(a){n=a}},y:{get:function(){return o},set:function(a){o=a}},xScale:{get:function(){return l},set:function(a){l=a}},yScale:{get:function(){return m},set:function(a){m=a}},xDomain:{get:function(){return c},set:function(a){c=a}},yDomain:{get:function(){return d},set:function(a){d=a}},xRange:{get:function(){return e},set:function(a){e=a}},yRange:{get:function(){return f},set:function(a){f=a}},clipEdge:{get:function(){return s},set:function(a){s=a}},id:{get:function(){return j},set:function(a){j=a}},interactive:{get:function(){return v},set:function(a){v=a}},margin:{get:function(){return g},set:function(a){g.top=void 0!==a.top?a.top:g.top,g.right=void 0!==a.right?a.right:g.right,g.bottom=void 0!==a.bottom?a.bottom:g.bottom,g.left=void 0!==a.left?a.left:g.left}},color:{get:function(){return t},set:function(b){t=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.historicalBarChart=function(b){"use strict";function c(b){return b.each(function(k){A.reset(),A.models(f),r&&A.models(g),s&&A.models(h);var x=d3.select(this);a.utils.initSVG(x);var B=a.utils.availableWidth(o,x,l),C=a.utils.availableHeight(p,x,l);if(c.update=function(){x.transition().duration(z).call(c)},c.container=this,v.disabled=k.map(function(a){return!!a.disabled}),!w){var D;w={};for(D in v)v[D]instanceof Array?w[D]=v[D].slice(0):w[D]=v[D]}if(!(k&&k.length&&k.filter(function(a){return a.values.length}).length))return a.utils.noData(c,x),c;x.selectAll(".nv-noData").remove(),d=f.xScale(),e=f.yScale();var E=x.selectAll("g.nv-wrap.nv-historicalBarChart").data([k]),F=E.enter().append("g").attr("class","nvd3 nv-wrap nv-historicalBarChart").append("g"),G=E.select("g");F.append("g").attr("class","nv-x nv-axis"),F.append("g").attr("class","nv-y nv-axis"),F.append("g").attr("class","nv-barsWrap"),F.append("g").attr("class","nv-legendWrap"),F.append("g").attr("class","nv-interactive"),q?(i.width(B),G.select(".nv-legendWrap").datum(k).call(i),m||i.height()===l.top||(l.top=i.height(),C=a.utils.availableHeight(p,x,l)),E.select(".nv-legendWrap").attr("transform","translate(0,"+-l.top+")")):G.select(".nv-legendWrap").selectAll("*").remove(),E.attr("transform","translate("+l.left+","+l.top+")"),t&&G.select(".nv-y.nv-axis").attr("transform","translate("+B+",0)"),u&&(j.width(B).height(C).margin({left:l.left,top:l.top}).svgContainer(x).xScale(d),E.select(".nv-interactive").call(j)),f.width(B).height(C).color(k.map(function(a,b){return a.color||n(a,b)}).filter(function(a,b){return!k[b].disabled}));var H=G.select(".nv-barsWrap").datum(k.filter(function(a){return!a.disabled}));H.transition().call(f),r&&(g.scale(d)._ticks(a.utils.calcTicksX(B/100,k)).tickSize(-C,0),G.select(".nv-x.nv-axis").attr("transform","translate(0,"+e.range()[0]+")"),G.select(".nv-x.nv-axis").transition().call(g)),s&&(h.scale(e)._ticks(a.utils.calcTicksY(C/36,k)).tickSize(-B,0),G.select(".nv-y.nv-axis").transition().call(h)),j.dispatch.on("elementMousemove",function(b){f.clearHighlights();var d,e,i,l=[];k.filter(function(a,b){return a.seriesIndex=b,!a.disabled}).forEach(function(g,h){e=a.interactiveBisect(g.values,b.pointXValue,c.x()),f.highlightPoint(e,!0);var j=g.values[e];void 0!==j&&(void 0===d&&(d=j),void 0===i&&(i=c.xScale()(c.x()(j,e))),l.push({key:g.key,value:c.y()(j,e),color:n(g,g.seriesIndex),data:g.values[e]}))});var m=g.tickFormat()(c.x()(d,e));j.tooltip.valueFormatter(function(a,b){return h.tickFormat()(a)}).data({value:m,index:e,series:l})(),j.renderGuideLine(i)}),j.dispatch.on("elementMouseout",function(a){y.tooltipHide(),f.clearHighlights()}),i.dispatch.on("legendClick",function(a,d){a.disabled=!a.disabled,k.filter(function(a){return!a.disabled}).length||k.map(function(a){return a.disabled=!1,E.selectAll(".nv-series").classed("disabled",!1),a}),v.disabled=k.map(function(a){return!!a.disabled}),y.stateChange(v),b.transition().call(c)}),i.dispatch.on("legendDblclick",function(a){k.forEach(function(a){a.disabled=!0}),a.disabled=!1,v.disabled=k.map(function(a){return!!a.disabled}),y.stateChange(v),c.update()}),y.on("changeState",function(a){"undefined"!=typeof a.disabled&&(k.forEach(function(b,c){b.disabled=a.disabled[c]}),v.disabled=a.disabled),c.update()})}),A.renderEnd("historicalBarChart immediate"),c}var d,e,f=b||a.models.historicalBar(),g=a.models.axis(),h=a.models.axis(),i=a.models.legend(),j=a.interactiveGuideline(),k=a.models.tooltip(),l={top:30,right:90,bottom:50,left:90},m=null,n=a.utils.defaultColor(),o=null,p=null,q=!1,r=!0,s=!0,t=!1,u=!1,v={},w=null,x=null,y=d3.dispatch("tooltipHide","stateChange","changeState","renderEnd"),z=250;g.orient("bottom").tickPadding(7),h.orient(t?"right":"left"),k.duration(0).headerEnabled(!1).valueFormatter(function(a,b){return h.tickFormat()(a,b)}).headerFormatter(function(a,b){return g.tickFormat()(a,b)});var A=a.utils.renderWatch(y,0);return f.dispatch.on("elementMouseover.tooltip",function(a){a.series={key:c.x()(a.data),value:c.y()(a.data),color:a.color},k.data(a).hidden(!1)}),f.dispatch.on("elementMouseout.tooltip",function(a){k.hidden(!0)}),f.dispatch.on("elementMousemove.tooltip",function(a){k()}),c.dispatch=y,c.bars=f,c.legend=i,c.xAxis=g,c.yAxis=h,c.interactiveLayer=j,c.tooltip=k,c.options=a.utils.optionsFunc.bind(c),c._options=Object.create({},{width:{get:function(){return o},set:function(a){o=a}},height:{get:function(){return p},set:function(a){p=a}},showLegend:{get:function(){return q},set:function(a){q=a}},showXAxis:{get:function(){return r},set:function(a){r=a}},showYAxis:{get:function(){return s},set:function(a){s=a}},defaultState:{get:function(){return w},set:function(a){w=a}},noData:{get:function(){return x},set:function(a){x=a}},margin:{get:function(){return l},set:function(a){void 0!==a.top&&(l.top=a.top,m=a.top),l.right=void 0!==a.right?a.right:l.right,l.bottom=void 0!==a.bottom?a.bottom:l.bottom,l.left=void 0!==a.left?a.left:l.left}},color:{get:function(){return n},set:function(b){n=a.utils.getColor(b),i.color(n),f.color(n)}},duration:{get:function(){return z},set:function(a){z=a,A.reset(z),h.duration(z),g.duration(z)}},rightAlignYAxis:{get:function(){return t},set:function(a){t=a,h.orient(a?"right":"left")}},useInteractiveGuideline:{get:function(){return u},set:function(a){u=a,a===!0&&c.interactive(!1)}}}),a.utils.inheritOptions(c,f),a.utils.initOptions(c),c},a.models.ohlcBarChart=function(){var b=a.models.historicalBarChart(a.models.ohlcBar());return b.useInteractiveGuideline(!0),b.interactiveLayer.tooltip.contentGenerator(function(a){var c=a.series[0].data,d=c.open'+a.value+"
          open:"+b.yAxis.tickFormat()(c.open)+"
          close:"+b.yAxis.tickFormat()(c.close)+"
          high"+b.yAxis.tickFormat()(c.high)+"
          low:"+b.yAxis.tickFormat()(c.low)+"
          "; +}),b},a.models.candlestickBarChart=function(){var b=a.models.historicalBarChart(a.models.candlestickBar());return b.useInteractiveGuideline(!0),b.interactiveLayer.tooltip.contentGenerator(function(a){var c=a.series[0].data,d=c.open'+a.value+"
          open:"+b.yAxis.tickFormat()(c.open)+"
          close:"+b.yAxis.tickFormat()(c.close)+"
          high"+b.yAxis.tickFormat()(c.high)+"
          low:"+b.yAxis.tickFormat()(c.low)+"
          "}),b},a.models.legend=function(){"use strict";function b(s){function t(a,b){return"furious"!=r?"#000":p?a.disengaged?"#000":"#fff":p?void 0:(a.color||(a.color=h(a,b)),a.disabled?a.color:"#fff")}function u(a,b){return p&&"furious"==r&&a.disengaged?"#eee":a.color||h(a,b)}function v(a,b){return p&&"furious"==r?1:a.disabled?0:1}return s.each(function(b){var h=d-c.left-c.right,s=d3.select(this);a.utils.initSVG(s);var w=s.selectAll("g.nv-legend").data([b]),x=w.enter().append("g").attr("class","nvd3 nv-legend").append("g"),y=w.select("g");l?w.attr("transform","translate("+-c.right+","+c.top+")"):w.attr("transform","translate("+c.left+","+c.top+")");var z,A,B=y.selectAll(".nv-series").data(function(a){return"furious"!=r?a:a.filter(function(a){return p?!0:!a.disengaged})}),C=B.enter().append("g").attr("class","nv-series");switch(r){case"furious":A=23;break;case"classic":A=20}if("classic"==r)C.append("circle").style("stroke-width",2).attr("class","nv-legend-symbol").attr("r",5),z=B.select(".nv-legend-symbol");else if("furious"==r){C.append("rect").style("stroke-width",2).attr("class","nv-legend-symbol").attr("rx",3).attr("ry",3),z=B.select(".nv-legend-symbol"),C.append("g").attr("class","nv-check-box").property("innerHTML",'').attr("transform","translate(-10,-8)scale(0.5)");var D=B.select(".nv-check-box");D.each(function(a,b){d3.select(this).selectAll("path").attr("stroke",t(a,b))})}C.append("text").attr("text-anchor","start").attr("class","nv-legend-text").attr("dy",".32em").attr("dx","8");var E=B.select("text.nv-legend-text");B.on("mouseover",function(a,b){q.legendMouseover(a,b)}).on("mouseout",function(a,b){q.legendMouseout(a,b)}).on("click",function(a,b){q.legendClick(a,b);var c=B.data();if(m){if("classic"==r)o?(c.forEach(function(a){a.disabled=!0}),a.disabled=!1):(a.disabled=!a.disabled,c.every(function(a){return a.disabled})&&c.forEach(function(a){a.disabled=!1}));else if("furious"==r)if(p)a.disengaged=!a.disengaged,a.userDisabled=void 0==a.userDisabled?!!a.disabled:a.userDisabled,a.disabled=a.disengaged||a.userDisabled;else if(!p){a.disabled=!a.disabled,a.userDisabled=a.disabled;var d=c.filter(function(a){return!a.disengaged});d.every(function(a){return a.userDisabled})&&c.forEach(function(a){a.disabled=a.userDisabled=!1})}q.stateChange({disabled:c.map(function(a){return!!a.disabled}),disengaged:c.map(function(a){return!!a.disengaged})})}}).on("dblclick",function(a,b){if(n){if("furious"==r&&p)return;if(q.legendDblclick(a,b),m){var c=B.data();c.forEach(function(a){a.disabled=!0,"furious"==r&&(a.userDisabled=a.disabled)}),a.disabled=!1,"furious"==r&&(a.userDisabled=a.disabled),q.stateChange({disabled:c.map(function(a){return!!a.disabled})})}}}),B.classed("nv-disabled",function(a){return a.userDisabled}),B.exit().remove(),E.attr("fill",t).text(function(a){return g(f(a))});var F=0;if(j){var G=[];B.each(function(b,c){var d;if(g(f(b))&&g(f(b)).length>i){var e=g(f(b)).substring(0,i);d=d3.select(this).select("text").text(e+"..."),d3.select(this).append("svg:title").text(g(f(b)))}else d=d3.select(this).select("text");var h;try{if(h=d.node().getComputedTextLength(),0>=h)throw Error()}catch(j){h=a.utils.calcApproxTextWidth(d)}G.push(h+k)});var H=0,I=[];for(F=0;h>F&&Hh&&H>1;){I=[],H--;for(var J=0;J(I[J%H]||0)&&(I[J%H]=G[J]);F=I.reduce(function(a,b,c,d){return a+b})}for(var K=[],L=0,M=0;H>L;L++)K[L]=M,M+=I[L];B.attr("transform",function(a,b){return"translate("+K[b%H]+","+(5+Math.floor(b/H)*A)+")"}),l?y.attr("transform","translate("+(d-c.right-F)+","+c.top+")"):y.attr("transform","translate(0,"+c.top+")"),e=c.top+c.bottom+Math.ceil(G.length/H)*A}else{var N,O=5,P=5,Q=0;B.attr("transform",function(a,b){var e=d3.select(this).select("text").node().getComputedTextLength()+k;return N=P,dQ&&(Q=P),N+Q>F&&(F=N+Q),"translate("+N+","+O+")"}),y.attr("transform","translate("+(d-c.right-Q)+","+c.top+")"),e=c.top+c.bottom+O+15}if("furious"==r){z.attr("width",function(a,b){return E[0][b].getComputedTextLength()+27}).attr("height",18).attr("y",-9).attr("x",-15),x.insert("rect",":first-child").attr("class","nv-legend-bg").attr("fill","#eee").attr("opacity",0);var R=y.select(".nv-legend-bg");R.transition().duration(300).attr("x",-A).attr("width",F+A-12).attr("height",e+10).attr("y",-c.top-10).attr("opacity",p?1:0)}z.style("fill",u).style("fill-opacity",v).style("stroke",u)}),b}var c={top:5,right:0,bottom:5,left:0},d=400,e=20,f=function(a){return a.key},g=function(a){return a},h=a.utils.getColor(),i=20,j=!0,k=32,l=!0,m=!0,n=!0,o=!1,p=!1,q=d3.dispatch("legendClick","legendDblclick","legendMouseover","legendMouseout","stateChange"),r="classic";return b.dispatch=q,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return d},set:function(a){d=a}},height:{get:function(){return e},set:function(a){e=a}},key:{get:function(){return f},set:function(a){f=a}},keyFormatter:{get:function(){return g},set:function(a){g=a}},align:{get:function(){return j},set:function(a){j=a}},maxKeyLength:{get:function(){return i},set:function(a){i=a}},rightAlign:{get:function(){return l},set:function(a){l=a}},padding:{get:function(){return k},set:function(a){k=a}},updateState:{get:function(){return m},set:function(a){m=a}},enableDoubleClick:{get:function(){return n},set:function(a){n=a}},radioButtonMode:{get:function(){return o},set:function(a){o=a}},expanded:{get:function(){return p},set:function(a){p=a}},vers:{get:function(){return r},set:function(a){r=a}},margin:{get:function(){return c},set:function(a){c.top=void 0!==a.top?a.top:c.top,c.right=void 0!==a.right?a.right:c.right,c.bottom=void 0!==a.bottom?a.bottom:c.bottom,c.left=void 0!==a.left?a.left:c.left}},color:{get:function(){return h},set:function(b){h=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.line=function(){"use strict";function b(r){return v.reset(),v.models(e),r.each(function(b){i=d3.select(this);var r=a.utils.availableWidth(g,i,f),s=a.utils.availableHeight(h,i,f);a.utils.initSVG(i),c=e.xScale(),d=e.yScale(),t=t||c,u=u||d;var w=i.selectAll("g.nv-wrap.nv-line").data([b]),x=w.enter().append("g").attr("class","nvd3 nv-wrap nv-line"),y=x.append("defs"),z=x.append("g"),A=w.select("g");z.append("g").attr("class","nv-groups"),z.append("g").attr("class","nv-scatterWrap"),w.attr("transform","translate("+f.left+","+f.top+")"),e.width(r).height(s);var B=w.select(".nv-scatterWrap");B.call(e),y.append("clipPath").attr("id","nv-edge-clip-"+e.id()).append("rect"),w.select("#nv-edge-clip-"+e.id()+" rect").attr("width",r).attr("height",s>0?s:0),A.attr("clip-path",p?"url(#nv-edge-clip-"+e.id()+")":""),B.attr("clip-path",p?"url(#nv-edge-clip-"+e.id()+")":"");var C=w.select(".nv-groups").selectAll(".nv-group").data(function(a){return a},function(a){return a.key});C.enter().append("g").style("stroke-opacity",1e-6).style("stroke-width",function(a){return a.strokeWidth||j}).style("fill-opacity",1e-6),C.exit().remove(),C.attr("class",function(a,b){return(a.classed||"")+" nv-group nv-series-"+b}).classed("hover",function(a){return a.hover}).style("fill",function(a,b){return k(a,b)}).style("stroke",function(a,b){return k(a,b)}),C.watchTransition(v,"line: groups").style("stroke-opacity",1).style("fill-opacity",function(a){return a.fillOpacity||.5});var D=C.selectAll("path.nv-area").data(function(a){return o(a)?[a]:[]});D.enter().append("path").attr("class","nv-area").attr("d",function(b){return d3.svg.area().interpolate(q).defined(n).x(function(b,c){return a.utils.NaNtoZero(t(l(b,c)))}).y0(function(b,c){return a.utils.NaNtoZero(u(m(b,c)))}).y1(function(a,b){return u(d.domain()[0]<=0?d.domain()[1]>=0?0:d.domain()[1]:d.domain()[0])}).apply(this,[b.values])}),C.exit().selectAll("path.nv-area").remove(),D.watchTransition(v,"line: areaPaths").attr("d",function(b){return d3.svg.area().interpolate(q).defined(n).x(function(b,d){return a.utils.NaNtoZero(c(l(b,d)))}).y0(function(b,c){return a.utils.NaNtoZero(d(m(b,c)))}).y1(function(a,b){return d(d.domain()[0]<=0?d.domain()[1]>=0?0:d.domain()[1]:d.domain()[0])}).apply(this,[b.values])});var E=C.selectAll("path.nv-line").data(function(a){return[a.values]});E.enter().append("path").attr("class","nv-line").attr("d",d3.svg.line().interpolate(q).defined(n).x(function(b,c){return a.utils.NaNtoZero(t(l(b,c)))}).y(function(b,c){return a.utils.NaNtoZero(u(m(b,c)))})),E.watchTransition(v,"line: linePaths").attr("d",d3.svg.line().interpolate(q).defined(n).x(function(b,d){return a.utils.NaNtoZero(c(l(b,d)))}).y(function(b,c){return a.utils.NaNtoZero(d(m(b,c)))})),t=c.copy(),u=d.copy()}),v.renderEnd("line immediate"),b}var c,d,e=a.models.scatter(),f={top:0,right:0,bottom:0,left:0},g=960,h=500,i=null,j=1.5,k=a.utils.defaultColor(),l=function(a){return a.x},m=function(a){return a.y},n=function(a,b){return!isNaN(m(a,b))&&null!==m(a,b)},o=function(a){return a.area},p=!1,q="linear",r=250,s=d3.dispatch("elementClick","elementMouseover","elementMouseout","renderEnd");e.pointSize(16).pointDomain([16,256]);var t,u,v=a.utils.renderWatch(s,r);return b.dispatch=s,b.scatter=e,e.dispatch.on("elementClick",function(){s.elementClick.apply(this,arguments)}),e.dispatch.on("elementMouseover",function(){s.elementMouseover.apply(this,arguments)}),e.dispatch.on("elementMouseout",function(){s.elementMouseout.apply(this,arguments)}),b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return g},set:function(a){g=a}},height:{get:function(){return h},set:function(a){h=a}},defined:{get:function(){return n},set:function(a){n=a}},interpolate:{get:function(){return q},set:function(a){q=a}},clipEdge:{get:function(){return p},set:function(a){p=a}},margin:{get:function(){return f},set:function(a){f.top=void 0!==a.top?a.top:f.top,f.right=void 0!==a.right?a.right:f.right,f.bottom=void 0!==a.bottom?a.bottom:f.bottom,f.left=void 0!==a.left?a.left:f.left}},duration:{get:function(){return r},set:function(a){r=a,v.reset(r),e.duration(r)}},isArea:{get:function(){return o},set:function(a){o=d3.functor(a)}},x:{get:function(){return l},set:function(a){l=a,e.x(a)}},y:{get:function(){return m},set:function(a){m=a,e.y(a)}},color:{get:function(){return k},set:function(b){k=a.utils.getColor(b),e.color(k)}}}),a.utils.inheritOptions(b,e),a.utils.initOptions(b),b},a.models.lineChart=function(){"use strict";function b(j){return C.reset(),C.models(e),s&&C.models(f),t&&C.models(g),j.each(function(j){function z(){s&&M.select(".nv-focus .nv-x.nv-axis").transition().duration(B).call(f)}function C(){t&&M.select(".nv-focus .nv-y.nv-axis").transition().duration(B).call(g)}function F(a){var b=M.select(".nv-focus .nv-linesWrap").datum(j.filter(function(a){return!a.disabled}).map(function(b,c){return{key:b.key,area:b.area,classed:b.classed,values:b.values.filter(function(b,c){return e.x()(b,c)>=a[0]&&e.x()(b,c)<=a[1]}),disableTooltip:b.disableTooltip}}));b.transition().duration(B).call(e),z(),C()}var G=d3.select(this);a.utils.initSVG(G);var H=a.utils.availableWidth(o,G,l),I=a.utils.availableHeight(p,G,l)-(w?k.height():0);if(b.update=function(){0===B?G.call(b):G.transition().duration(B).call(b)},b.container=this,x.setter(E(j),b.update).getter(D(j)).update(),x.disabled=j.map(function(a){return!!a.disabled}),!y){var J;y={};for(J in x)x[J]instanceof Array?y[J]=x[J].slice(0):y[J]=x[J]}if(!(j&&j.length&&j.filter(function(a){return a.values.length}).length))return a.utils.noData(b,G),b;G.selectAll(".nv-noData").remove(),k.dispatch.on("onBrush",function(a){F(a)}),c=e.xScale(),d=e.yScale();var K=G.selectAll("g.nv-wrap.nv-lineChart").data([j]),L=K.enter().append("g").attr("class","nvd3 nv-wrap nv-lineChart").append("g"),M=K.select("g");L.append("g").attr("class","nv-legendWrap");var N=L.append("g").attr("class","nv-focus");N.append("g").attr("class","nv-background").append("rect"),N.append("g").attr("class","nv-x nv-axis"),N.append("g").attr("class","nv-y nv-axis"),N.append("g").attr("class","nv-linesWrap"),N.append("g").attr("class","nv-interactive");L.append("g").attr("class","nv-focusWrap");q?(h.width(H),M.select(".nv-legendWrap").datum(j).call(h),"bottom"===r?(l.bottom=f.height()+h.height(),I=a.utils.availableHeight(p,G,l),M.select(".nv-legendWrap").attr("transform","translate(0,"+(I+f.height())+")")):"top"===r&&(m||h.height()===l.top||(l.top=h.height(),I=a.utils.availableHeight(p,G,l)-(w?k.height():0)),K.select(".nv-legendWrap").attr("transform","translate(0,"+-l.top+")"))):M.select(".nv-legendWrap").selectAll("*").remove(),K.attr("transform","translate("+l.left+","+l.top+")"),u&&M.select(".nv-y.nv-axis").attr("transform","translate("+H+",0)"),v&&(i.width(H).height(I).margin({left:l.left,top:l.top}).svgContainer(G).xScale(c),K.select(".nv-interactive").call(i)),M.select(".nv-focus .nv-background rect").attr("width",H).attr("height",I),e.width(H).height(I).color(j.map(function(a,b){return a.color||n(a,b)}).filter(function(a,b){return!j[b].disabled}));var O=M.select(".nv-linesWrap").datum(j.filter(function(a){return!a.disabled}));if(s&&f.scale(c)._ticks(a.utils.calcTicksX(H/100,j)).tickSize(-I,0),t&&g.scale(d)._ticks(a.utils.calcTicksY(I/36,j)).tickSize(-H,0),M.select(".nv-focus .nv-x.nv-axis").attr("transform","translate(0,"+I+")"),w||null!==k.brush.extent()){k.width(H),M.select(".nv-focusWrap").style("display",w?"initial":"none").attr("transform","translate(0,"+(I+l.bottom+k.margin().top)+")").call(k);var P=k.brush.empty()?k.xDomain():k.brush.extent();null!==P&&F(P)}else O.call(e),z(),C();h.dispatch.on("stateChange",function(a){for(var c in a)x[c]=a[c];A.stateChange(x),b.update()}),i.dispatch.on("elementMousemove",function(d){e.clearHighlights();var f,h,l,m=[];if(j.filter(function(a,b){return a.seriesIndex=b,!a.disabled&&!a.disableTooltip}).forEach(function(g,i){var j=null!==k.brush.extent()?k.brush.empty()?k.xScale().domain():k.brush.extent():c.domain(),o=g.values.filter(function(a,b){return j[0]<=j[1]?e.x()(a,b)>=j[0]&&e.x()(a,b)<=j[1]:e.x()(a,b)>=j[1]&&e.x()(a,b)<=j[0]});h=a.interactiveBisect(o,d.pointXValue,e.x());var p=o[h],q=b.y()(p,h);null!==q&&e.highlightPoint(i,h,!0),void 0!==p&&(void 0===f&&(f=p),void 0===l&&(l=b.xScale()(b.x()(p,h))),m.push({key:g.key,value:q,color:n(g,g.seriesIndex),data:p}))}),m.length>2){var o=b.yScale().invert(d.mouseY),p=Math.abs(b.yScale().domain()[0]-b.yScale().domain()[1]),q=.03*p,r=a.nearestValueIndex(m.map(function(a){return a.value}),o,q);null!==r&&(m[r].highlight=!0)}var s=function(a,b){return null==a?"N/A":g.tickFormat()(a)};i.tooltip.valueFormatter(i.tooltip.valueFormatter()||s).data({value:b.x()(f,h),index:h,series:m})(),i.renderGuideLine(l)}),i.dispatch.on("elementClick",function(c){var d,f=[];j.filter(function(a,b){return a.seriesIndex=b,!a.disabled}).forEach(function(e){var g=a.interactiveBisect(e.values,c.pointXValue,b.x()),h=e.values[g];if("undefined"!=typeof h){"undefined"==typeof d&&(d=b.xScale()(b.x()(h,g)));var i=b.yScale()(b.y()(h,g));f.push({point:h,pointIndex:g,pos:[d,i],seriesIndex:e.seriesIndex,series:e})}}),e.dispatch.elementClick(f)}),i.dispatch.on("elementMouseout",function(a){e.clearHighlights()}),A.on("changeState",function(a){"undefined"!=typeof a.disabled&&j.length===a.disabled.length&&(j.forEach(function(b,c){b.disabled=a.disabled[c]}),x.disabled=a.disabled),b.update()})}),C.renderEnd("lineChart immediate"),b}var c,d,e=a.models.line(),f=a.models.axis(),g=a.models.axis(),h=a.models.legend(),i=a.interactiveGuideline(),j=a.models.tooltip(),k=a.models.focus(a.models.line()),l={top:30,right:20,bottom:50,left:60},m=null,n=a.utils.defaultColor(),o=null,p=null,q=!0,r="top",s=!0,t=!0,u=!1,v=!1,w=!1,x=a.utils.state(),y=null,z=null,A=d3.dispatch("stateChange","changeState","renderEnd"),B=250;f.orient("bottom").tickPadding(7),g.orient(u?"right":"left"),e.clipEdge(!0).duration(0),j.valueFormatter(function(a,b){return g.tickFormat()(a,b)}).headerFormatter(function(a,b){return f.tickFormat()(a,b)}),i.tooltip.valueFormatter(function(a,b){return g.tickFormat()(a,b)}).headerFormatter(function(a,b){return f.tickFormat()(a,b)});var C=a.utils.renderWatch(A,B),D=function(a){return function(){return{active:a.map(function(a){return!a.disabled})}}},E=function(a){return function(b){void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}};return e.dispatch.on("elementMouseover.tooltip",function(a){a.series.disableTooltip||j.data(a).hidden(!1)}),e.dispatch.on("elementMouseout.tooltip",function(a){j.hidden(!0)}),b.dispatch=A,b.lines=e,b.legend=h,b.focus=k,b.xAxis=f,b.x2Axis=k.xAxis,b.yAxis=g,b.y2Axis=k.yAxis,b.interactiveLayer=i,b.tooltip=j,b.state=x,b.dispatch=A,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return o},set:function(a){o=a}},height:{get:function(){return p},set:function(a){p=a}},showLegend:{get:function(){return q},set:function(a){q=a}},legendPosition:{get:function(){return r},set:function(a){r=a}},showXAxis:{get:function(){return s},set:function(a){s=a}},showYAxis:{get:function(){return t},set:function(a){t=a}},defaultState:{get:function(){return y},set:function(a){y=a}},noData:{get:function(){return z},set:function(a){z=a}},focusEnable:{get:function(){return w},set:function(a){w=a}},focusHeight:{get:function(){return k.height()},set:function(a){k.height(a)}},focusShowAxisX:{get:function(){return k.showXAxis()},set:function(a){k.showXAxis(a)}},focusShowAxisY:{get:function(){return k.showYAxis()},set:function(a){k.showYAxis(a)}},brushExtent:{get:function(){return k.brushExtent()},set:function(a){k.brushExtent(a)}},focusMargin:{get:function(){return k.margin},set:function(a){void 0!==a.top&&(l.top=a.top,m=a.top),k.margin.right=void 0!==a.right?a.right:k.margin.right,k.margin.bottom=void 0!==a.bottom?a.bottom:k.margin.bottom,k.margin.left=void 0!==a.left?a.left:k.margin.left}},margin:{get:function(){return l},set:function(a){l.top=void 0!==a.top?a.top:l.top,l.right=void 0!==a.right?a.right:l.right,l.bottom=void 0!==a.bottom?a.bottom:l.bottom,l.left=void 0!==a.left?a.left:l.left}},duration:{get:function(){return B},set:function(a){B=a,C.reset(B),e.duration(B),k.duration(B),f.duration(B),g.duration(B)}},color:{get:function(){return n},set:function(b){n=a.utils.getColor(b),h.color(n),e.color(n),k.color(n)}},interpolate:{get:function(){return e.interpolate()},set:function(a){e.interpolate(a),k.interpolate(a)}},xTickFormat:{get:function(){return f.tickFormat()},set:function(a){f.tickFormat(a),k.xTickFormat(a)}},yTickFormat:{get:function(){return g.tickFormat()},set:function(a){g.tickFormat(a),k.yTickFormat(a)}},x:{get:function(){return e.x()},set:function(a){e.x(a),k.x(a)}},y:{get:function(){return e.y()},set:function(a){e.y(a),k.y(a)}},rightAlignYAxis:{get:function(){return u},set:function(a){u=a,g.orient(u?"right":"left")}},useInteractiveGuideline:{get:function(){return v},set:function(a){v=a,v&&(e.interactive(!1),e.useVoronoi(!1))}}}),a.utils.inheritOptions(b,e),a.utils.initOptions(b),b},a.models.lineWithFocusChart=function(){return a.models.lineChart().margin({bottom:30}).focusEnable(!0)},a.models.linePlusBarChart=function(){"use strict";function b(v){return v.each(function(v){function K(a){var b=+("e"==a),c=b?1:-1,d=$/3;return"M"+.5*c+","+d+"A6,6 0 0 "+b+" "+6.5*c+","+(d+6)+"V"+(2*d-6)+"A6,6 0 0 "+b+" "+.5*c+","+2*d+"ZM"+2.5*c+","+(d+8)+"V"+(2*d-8)+"M"+4.5*c+","+(d+8)+"V"+(2*d-8)}function S(){u.empty()||u.extent(J),na.data([u.empty()?e.domain():J]).each(function(a,b){var c=e(a[0])-e.range()[0],d=e.range()[1]-e(a[1]);d3.select(this).select(".left").attr("width",0>c?0:c),d3.select(this).select(".right").attr("x",e(a[1])).attr("width",0>d?0:d)})}function T(){J=u.empty()?null:u.extent(),c=u.empty()?e.domain():u.extent(),L.brush({extent:c,brush:u}),S(),l.width(Y).height(Z).color(v.map(function(a,b){return a.color||D(a,b)}).filter(function(a,b){return!v[b].disabled&&v[b].bar})),j.width(Y).height(Z).color(v.map(function(a,b){return a.color||D(a,b)}).filter(function(a,b){return!v[b].disabled&&!v[b].bar}));var b=ga.select(".nv-focus .nv-barsWrap").datum(aa.length?aa.map(function(a,b){return{key:a.key,values:a.values.filter(function(a,b){return l.x()(a,b)>=c[0]&&l.x()(a,b)<=c[1]})}}):[{values:[]}]),h=ga.select(".nv-focus .nv-linesWrap").datum(W(ba)?[{values:[]}]:ba.filter(function(a){return!a.disabled}).map(function(a,b){return{area:a.area,fillOpacity:a.fillOpacity,strokeWidth:a.strokeWidth,key:a.key,values:a.values.filter(function(a,b){return j.x()(a,b)>=c[0]&&j.x()(a,b)<=c[1]})}}));d=aa.length&&!R?l.xScale():j.xScale(),n.scale(d)._ticks(a.utils.calcTicksX(Y/100,v)).tickSize(-Z,0),n.domain([Math.ceil(c[0]),Math.floor(c[1])]),ga.select(".nv-x.nv-axis").transition().duration(M).call(n),b.transition().duration(M).call(l),h.transition().duration(M).call(j),ga.select(".nv-focus .nv-x.nv-axis").attr("transform","translate(0,"+f.range()[0]+")"),p.scale(f)._ticks(a.utils.calcTicksY(Z/36,v)).tickSize(-Y,0),q.scale(g)._ticks(a.utils.calcTicksY(Z/36,v)),R?q.tickSize(ba.length?0:-Y,0):q.tickSize(aa.length?0:-Y,0);var i=aa.length?1:0,k=ba.length&&!W(ba)?1:0,m=R?k:i,o=R?i:k;ga.select(".nv-focus .nv-y1.nv-axis").style("opacity",m),ga.select(".nv-focus .nv-y2.nv-axis").style("opacity",o).attr("transform","translate("+d.range()[1]+",0)"),ga.select(".nv-focus .nv-y1.nv-axis").transition().duration(M).call(p),ga.select(".nv-focus .nv-y2.nv-axis").transition().duration(M).call(q)}var X=d3.select(this);a.utils.initSVG(X);var Y=a.utils.availableWidth(z,X,w),Z=a.utils.availableHeight(A,X,w)-(F?I:0),$=I-y.top-y.bottom;if(b.update=function(){X.transition().duration(M).call(b)},b.container=this,N.setter(V(v),b.update).getter(U(v)).update(),N.disabled=v.map(function(a){return!!a.disabled}),!O){var _;O={};for(_ in N)N[_]instanceof Array?O[_]=N[_].slice(0):O[_]=N[_]}if(!(v&&v.length&&v.filter(function(a){return a.values.length}).length))return a.utils.noData(b,X),b;X.selectAll(".nv-noData").remove();var aa=v.filter(function(a){return!a.disabled&&a.bar}),ba=v.filter(function(a){return!a.bar});d=aa.length&&!R?l.xScale():j.xScale(),e=o.scale(),f=R?j.yScale():l.yScale(),g=R?l.yScale():j.yScale(),h=R?k.yScale():m.yScale(),i=R?m.yScale():k.yScale();var ca=v.filter(function(a){return!a.disabled&&(R?!a.bar:a.bar)}).map(function(a){return a.values.map(function(a,b){return{x:B(a,b),y:C(a,b)}})}),da=v.filter(function(a){return!a.disabled&&(R?a.bar:!a.bar)}).map(function(a){return a.values.map(function(a,b){return{x:B(a,b),y:C(a,b)}})});d.range([0,Y]),e.domain(d3.extent(d3.merge(ca.concat(da)),function(a){return a.x})).range([0,Y]);var ea=X.selectAll("g.nv-wrap.nv-linePlusBar").data([v]),fa=ea.enter().append("g").attr("class","nvd3 nv-wrap nv-linePlusBar").append("g"),ga=ea.select("g");fa.append("g").attr("class","nv-legendWrap");var ha=fa.append("g").attr("class","nv-focus");ha.append("g").attr("class","nv-x nv-axis"),ha.append("g").attr("class","nv-y1 nv-axis"),ha.append("g").attr("class","nv-y2 nv-axis"),ha.append("g").attr("class","nv-barsWrap"),ha.append("g").attr("class","nv-linesWrap");var ia=fa.append("g").attr("class","nv-context");if(ia.append("g").attr("class","nv-x nv-axis"),ia.append("g").attr("class","nv-y1 nv-axis"),ia.append("g").attr("class","nv-y2 nv-axis"),ia.append("g").attr("class","nv-barsWrap"),ia.append("g").attr("class","nv-linesWrap"),ia.append("g").attr("class","nv-brushBackground"),ia.append("g").attr("class","nv-x nv-brush"),E){var ja=t.align()?Y/2:Y,ka=t.align()?ja:0;t.width(ja),ga.select(".nv-legendWrap").datum(v.map(function(a){return a.originalKey=void 0===a.originalKey?a.key:a.originalKey,R?a.key=a.originalKey+(a.bar?Q:P):a.key=a.originalKey+(a.bar?P:Q),a})).call(t),x||t.height()===w.top||(w.top=t.height(),Z=a.utils.availableHeight(A,X,w)-I),ga.select(".nv-legendWrap").attr("transform","translate("+ka+","+-w.top+")")}else ga.select(".nv-legendWrap").selectAll("*").remove();ea.attr("transform","translate("+w.left+","+w.top+")"),ga.select(".nv-context").style("display",F?"initial":"none"),m.width(Y).height($).color(v.map(function(a,b){return a.color||D(a,b)}).filter(function(a,b){return!v[b].disabled&&v[b].bar})),k.width(Y).height($).color(v.map(function(a,b){return a.color||D(a,b)}).filter(function(a,b){return!v[b].disabled&&!v[b].bar}));var la=ga.select(".nv-context .nv-barsWrap").datum(aa.length?aa:[{values:[]}]),ma=ga.select(".nv-context .nv-linesWrap").datum(W(ba)?[{values:[]}]:ba.filter(function(a){return!a.disabled}));ga.select(".nv-context").attr("transform","translate(0,"+(Z+w.bottom+y.top)+")"),la.transition().call(m),ma.transition().call(k),H&&(o._ticks(a.utils.calcTicksX(Y/100,v)).tickSize(-$,0),ga.select(".nv-context .nv-x.nv-axis").attr("transform","translate(0,"+h.range()[0]+")"),ga.select(".nv-context .nv-x.nv-axis").transition().call(o)),G&&(r.scale(h)._ticks($/36).tickSize(-Y,0),s.scale(i)._ticks($/36).tickSize(aa.length?0:-Y,0),ga.select(".nv-context .nv-y3.nv-axis").style("opacity",aa.length?1:0).attr("transform","translate(0,"+e.range()[0]+")"),ga.select(".nv-context .nv-y2.nv-axis").style("opacity",ba.length?1:0).attr("transform","translate("+e.range()[1]+",0)"),ga.select(".nv-context .nv-y1.nv-axis").transition().call(r),ga.select(".nv-context .nv-y2.nv-axis").transition().call(s)),u.x(e).on("brush",T),J&&u.extent(J);var na=ga.select(".nv-brushBackground").selectAll("g").data([J||u.extent()]),oa=na.enter().append("g");oa.append("rect").attr("class","left").attr("x",0).attr("y",0).attr("height",$),oa.append("rect").attr("class","right").attr("x",0).attr("y",0).attr("height",$);var pa=ga.select(".nv-x.nv-brush").call(u);pa.selectAll("rect").attr("height",$),pa.selectAll(".resize").append("path").attr("d",K),t.dispatch.on("stateChange",function(a){for(var c in a)N[c]=a[c];L.stateChange(N),b.update()}),L.on("changeState",function(a){"undefined"!=typeof a.disabled&&(v.forEach(function(b,c){b.disabled=a.disabled[c]}),N.disabled=a.disabled),b.update()}),T()}),b}var c,d,e,f,g,h,i,j=a.models.line(),k=a.models.line(),l=a.models.historicalBar(),m=a.models.historicalBar(),n=a.models.axis(),o=a.models.axis(),p=a.models.axis(),q=a.models.axis(),r=a.models.axis(),s=a.models.axis(),t=a.models.legend(),u=d3.svg.brush(),v=a.models.tooltip(),w={top:30,right:30,bottom:30,left:60},x=null,y={top:0,right:30,bottom:20,left:60},z=null,A=null,B=function(a){return a.x},C=function(a){return a.y},D=a.utils.defaultColor(),E=!0,F=!0,G=!1,H=!0,I=50,J=null,K=null,L=d3.dispatch("brush","stateChange","changeState"),M=0,N=a.utils.state(),O=null,P=" (left axis)",Q=" (right axis)",R=!1;j.clipEdge(!0),k.interactive(!1),k.pointActive(function(a){return!1}),n.orient("bottom").tickPadding(5),p.orient("left"),q.orient("right"),o.orient("bottom").tickPadding(5),r.orient("left"),s.orient("right"),v.headerEnabled(!0).headerFormatter(function(a,b){return n.tickFormat()(a,b)});var S=function(){return R?{main:q,focus:s}:{main:p,focus:r}},T=function(){return R?{main:p,focus:r}:{main:q,focus:s}},U=function(a){return function(){return{active:a.map(function(a){return!a.disabled})}}},V=function(a){return function(b){void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}},W=function(a){return a.every(function(a){return a.disabled})};return j.dispatch.on("elementMouseover.tooltip",function(a){v.duration(100).valueFormatter(function(a,b){return T().main.tickFormat()(a,b)}).data(a).hidden(!1)}),j.dispatch.on("elementMouseout.tooltip",function(a){v.hidden(!0)}),l.dispatch.on("elementMouseover.tooltip",function(a){a.value=b.x()(a.data),a.series={value:b.y()(a.data),color:a.color},v.duration(0).valueFormatter(function(a,b){return S().main.tickFormat()(a,b)}).data(a).hidden(!1)}),l.dispatch.on("elementMouseout.tooltip",function(a){v.hidden(!0)}),l.dispatch.on("elementMousemove.tooltip",function(a){v()}),b.dispatch=L,b.legend=t,b.lines=j,b.lines2=k,b.bars=l,b.bars2=m,b.xAxis=n,b.x2Axis=o,b.y1Axis=p,b.y2Axis=q,b.y3Axis=r,b.y4Axis=s,b.tooltip=v,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return z},set:function(a){z=a}},height:{get:function(){return A},set:function(a){A=a}},showLegend:{get:function(){return E},set:function(a){E=a}},brushExtent:{get:function(){return J},set:function(a){J=a}},noData:{get:function(){return K},set:function(a){K=a}},focusEnable:{get:function(){return F},set:function(a){F=a}},focusHeight:{get:function(){return I},set:function(a){I=a}},focusShowAxisX:{get:function(){return H},set:function(a){H=a}},focusShowAxisY:{get:function(){return G},set:function(a){G=a}},legendLeftAxisHint:{get:function(){return P},set:function(a){P=a}},legendRightAxisHint:{get:function(){return Q},set:function(a){Q=a}},margin:{get:function(){return w},set:function(a){void 0!==a.top&&(w.top=a.top,x=a.top),w.right=void 0!==a.right?a.right:w.right,w.bottom=void 0!==a.bottom?a.bottom:w.bottom,w.left=void 0!==a.left?a.left:w.left}},focusMargin:{get:function(){return y},set:function(a){y.top=void 0!==a.top?a.top:y.top,y.right=void 0!==a.right?a.right:y.right,y.bottom=void 0!==a.bottom?a.bottom:y.bottom,y.left=void 0!==a.left?a.left:y.left}},duration:{get:function(){return M},set:function(a){M=a}},color:{get:function(){return D},set:function(b){D=a.utils.getColor(b),t.color(D)}},x:{get:function(){return B},set:function(a){B=a,j.x(a),k.x(a),l.x(a),m.x(a)}},y:{get:function(){return C},set:function(a){C=a,j.y(a),k.y(a),l.y(a),m.y(a)}},switchYAxisOrder:{get:function(){return R},set:function(a){if(R!==a){var b=p;p=q,q=b;var c=r;r=s,s=c}R=a,p.orient("left"),q.orient("right"),r.orient("left"),s.orient("right")}}}),a.utils.inheritOptions(b,j),a.utils.initOptions(b),b},a.models.multiBar=function(){"use strict";function b(F){return D.reset(),F.each(function(b){var F=k-j.left-j.right,G=l-j.top-j.bottom;p=d3.select(this),a.utils.initSVG(p);var H=0;if(x&&b.length&&(x=[{values:b[0].values.map(function(a){return{x:a.x,y:0,series:a.series,size:.01}})}]),u){var I=d3.layout.stack().offset(v).values(function(a){return a.values}).y(r)(!b.length&&x?x:b);I.forEach(function(a,c){a.nonStackable?(b[c].nonStackableSeries=H++,I[c]=b[c]):c>0&&I[c-1].nonStackable&&I[c].values.map(function(a,b){a.y0-=I[c-1].values[b].y,a.y1=a.y0+a.y})}),b=I}b.forEach(function(a,b){a.values.forEach(function(c){c.series=b,c.key=a.key})}),u&&b.length>0&&b[0].values.map(function(a,c){var d=0,e=0;b.map(function(a,f){if(!b[f].nonStackable){var g=a.values[c];g.size=Math.abs(g.y),g.y<0?(g.y1=e,e-=g.size):(g.y1=g.size+d,d+=g.size)}})});var J=d&&e?[]:b.map(function(a,b){return a.values.map(function(a,c){return{x:q(a,c),y:r(a,c),y0:a.y0,y1:a.y1,idx:b}})});m.domain(d||d3.merge(J).map(function(a){return a.x})).rangeBands(f||[0,F],A),n.domain(e||d3.extent(d3.merge(J).map(function(a){var c=a.y;return u&&!b[a.idx].nonStackable&&(c=a.y>0?a.y1:a.y1+a.y),c}).concat(s))).range(g||[G,0]),m.domain()[0]===m.domain()[1]&&(m.domain()[0]?m.domain([m.domain()[0]-.01*m.domain()[0],m.domain()[1]+.01*m.domain()[1]]):m.domain([-1,1])),n.domain()[0]===n.domain()[1]&&(n.domain()[0]?n.domain([n.domain()[0]+.01*n.domain()[0],n.domain()[1]-.01*n.domain()[1]]):n.domain([-1,1])),h=h||m,i=i||n;var K=p.selectAll("g.nv-wrap.nv-multibar").data([b]),L=K.enter().append("g").attr("class","nvd3 nv-wrap nv-multibar"),M=L.append("defs"),N=L.append("g"),O=K.select("g");N.append("g").attr("class","nv-groups"),K.attr("transform","translate("+j.left+","+j.top+")"),M.append("clipPath").attr("id","nv-edge-clip-"+o).append("rect"), +K.select("#nv-edge-clip-"+o+" rect").attr("width",F).attr("height",G),O.attr("clip-path",t?"url(#nv-edge-clip-"+o+")":"");var P=K.select(".nv-groups").selectAll(".nv-group").data(function(a){return a},function(a,b){return b});P.enter().append("g").style("stroke-opacity",1e-6).style("fill-opacity",1e-6);var Q=D.transition(P.exit().selectAll("rect.nv-bar"),"multibarExit",Math.min(100,z)).attr("y",function(a,c,d){var e=i(0)||0;return u&&b[a.series]&&!b[a.series].nonStackable&&(e=i(a.y0)),e}).attr("height",0).remove();Q.delay&&Q.delay(function(a,b){var c=b*(z/(E+1))-b;return c}),P.attr("class",function(a,b){return"nv-group nv-series-"+b}).classed("hover",function(a){return a.hover}).style("fill",function(a,b){return w(a,b)}).style("stroke",function(a,b){return w(a,b)}),P.style("stroke-opacity",1).style("fill-opacity",B);var R=P.selectAll("rect.nv-bar").data(function(a){return x&&!b.length?x.values:a.values});R.exit().remove();R.enter().append("rect").attr("class",function(a,b){return r(a,b)<0?"nv-bar negative":"nv-bar positive"}).attr("x",function(a,c,d){return u&&!b[d].nonStackable?0:d*m.rangeBand()/b.length}).attr("y",function(a,c,d){return i(u&&!b[d].nonStackable?a.y0:0)||0}).attr("height",0).attr("width",function(a,c,d){return m.rangeBand()/(u&&!b[d].nonStackable?1:b.length)}).attr("transform",function(a,b){return"translate("+m(q(a,b))+",0)"});R.style("fill",function(a,b,c){return w(a,c,b)}).style("stroke",function(a,b,c){return w(a,c,b)}).on("mouseover",function(a,c,d){d3.select(this).classed("hover",!0),C.elementMouseover({data:a,index:c,series:b[d],color:d3.select(this).style("fill")})}).on("mouseout",function(a,c,d){d3.select(this).classed("hover",!1),C.elementMouseout({data:a,index:c,series:b[d],color:d3.select(this).style("fill")})}).on("mousemove",function(a,c,d){C.elementMousemove({data:a,index:c,series:b[d],color:d3.select(this).style("fill")})}).on("click",function(a,c,d){var e=this;C.elementClick({data:a,index:c,series:b[d],color:d3.select(this).style("fill"),event:d3.event,element:e}),d3.event.stopPropagation()}).on("dblclick",function(a,c,d){C.elementDblClick({data:a,index:c,series:b[d],color:d3.select(this).style("fill")}),d3.event.stopPropagation()}),R.attr("class",function(a,b){return r(a,b)<0?"nv-bar negative":"nv-bar positive"}).attr("transform",function(a,b){return"translate("+m(q(a,b))+",0)"}),y&&(c||(c=b.map(function(){return!0})),R.style("fill",function(a,b,d){return d3.rgb(y(a,b)).darker(c.map(function(a,b){return b}).filter(function(a,b){return!c[b]})[d]).toString()}).style("stroke",function(a,b,d){return d3.rgb(y(a,b)).darker(c.map(function(a,b){return b}).filter(function(a,b){return!c[b]})[d]).toString()}));var S=R.watchTransition(D,"multibar",Math.min(250,z)).delay(function(a,c){return c*z/b[0].values.length});u?S.attr("y",function(a,c,d){var e=0;return e=b[d].nonStackable?r(a,c)<0?n(0):n(0)-n(r(a,c))<-1?n(0)-1:n(r(a,c))||0:n(a.y1)}).attr("height",function(a,c,d){return b[d].nonStackable?Math.max(Math.abs(n(r(a,c))-n(0)),0)||0:Math.max(Math.abs(n(a.y+a.y0)-n(a.y0)),0)}).attr("x",function(a,c,d){var e=0;return b[d].nonStackable&&(e=a.series*m.rangeBand()/b.length,b.length!==H&&(e=b[d].nonStackableSeries*m.rangeBand()/(2*H))),e}).attr("width",function(a,c,d){if(b[d].nonStackable){var e=m.rangeBand()/H;return b.length!==H&&(e=m.rangeBand()/(2*H)),e}return m.rangeBand()}):S.attr("x",function(a,c){return a.series*m.rangeBand()/b.length}).attr("width",m.rangeBand()/b.length).attr("y",function(a,b){return r(a,b)<0?n(0):n(0)-n(r(a,b))<1?n(0)-1:n(r(a,b))||0}).attr("height",function(a,b){return Math.max(Math.abs(n(r(a,b))-n(0)),1)||0}),h=m.copy(),i=n.copy(),b[0]&&b[0].values&&(E=b[0].values.length)}),D.renderEnd("multibar immediate"),b}var c,d,e,f,g,h,i,j={top:0,right:0,bottom:0,left:0},k=960,l=500,m=d3.scale.ordinal(),n=d3.scale.linear(),o=Math.floor(1e4*Math.random()),p=null,q=function(a){return a.x},r=function(a){return a.y},s=[0],t=!0,u=!1,v="zero",w=a.utils.defaultColor(),x=!1,y=null,z=500,A=.1,B=.75,C=d3.dispatch("chartClick","elementClick","elementDblClick","elementMouseover","elementMouseout","elementMousemove","renderEnd"),D=a.utils.renderWatch(C,z),E=0;return b.dispatch=C,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return k},set:function(a){k=a}},height:{get:function(){return l},set:function(a){l=a}},x:{get:function(){return q},set:function(a){q=a}},y:{get:function(){return r},set:function(a){r=a}},xScale:{get:function(){return m},set:function(a){m=a}},yScale:{get:function(){return n},set:function(a){n=a}},xDomain:{get:function(){return d},set:function(a){d=a}},yDomain:{get:function(){return e},set:function(a){e=a}},xRange:{get:function(){return f},set:function(a){f=a}},yRange:{get:function(){return g},set:function(a){g=a}},forceY:{get:function(){return s},set:function(a){s=a}},stacked:{get:function(){return u},set:function(a){u=a}},stackOffset:{get:function(){return v},set:function(a){v=a}},clipEdge:{get:function(){return t},set:function(a){t=a}},disabled:{get:function(){return c},set:function(a){c=a}},id:{get:function(){return o},set:function(a){o=a}},hideable:{get:function(){return x},set:function(a){x=a}},groupSpacing:{get:function(){return A},set:function(a){A=a}},fillOpacity:{get:function(){return B},set:function(a){B=a}},margin:{get:function(){return j},set:function(a){j.top=void 0!==a.top?a.top:j.top,j.right=void 0!==a.right?a.right:j.right,j.bottom=void 0!==a.bottom?a.bottom:j.bottom,j.left=void 0!==a.left?a.left:j.left}},duration:{get:function(){return z},set:function(a){z=a,D.reset(z)}},color:{get:function(){return w},set:function(b){w=a.utils.getColor(b)}},barColor:{get:function(){return y},set:function(b){y=b?a.utils.getColor(b):null}}}),a.utils.initOptions(b),b},a.models.multiBarChart=function(){"use strict";function b(D){return I.reset(),I.models(e),u&&I.models(f),v&&I.models(g),D.each(function(D){var I=d3.select(this);a.utils.initSVG(I);var M=a.utils.availableWidth(n,I,l),N=a.utils.availableHeight(o,I,l);if(b.update=function(){0===G?I.call(b):I.transition().duration(G).call(b)},b.container=this,B.setter(L(D),b.update).getter(K(D)).update(),B.disabled=D.map(function(a){return!!a.disabled}),!C){var O;C={};for(O in B)B[O]instanceof Array?C[O]=B[O].slice(0):C[O]=B[O]}if(!(D&&D.length&&D.filter(function(a){return a.values.length}).length))return a.utils.noData(b,I),b;I.selectAll(".nv-noData").remove(),c=e.xScale(),d=e.yScale();var P=I.selectAll("g.nv-wrap.nv-multiBarWithLegend").data([D]),Q=P.enter().append("g").attr("class","nvd3 nv-wrap nv-multiBarWithLegend").append("g"),R=P.select("g");if(Q.append("g").attr("class","nv-x nv-axis"),Q.append("g").attr("class","nv-y nv-axis"),Q.append("g").attr("class","nv-barsWrap"),Q.append("g").attr("class","nv-legendWrap"),Q.append("g").attr("class","nv-controlsWrap"),Q.append("g").attr("class","nv-interactive"),s?"bottom"===t?(i.width(M-l.right),R.select(".nv-legendWrap").datum(D).call(i),l.bottom=f.height()+i.height(),N=a.utils.availableHeight(o,I,l),R.select(".nv-legendWrap").attr("transform","translate(0,"+(N+f.height())+")")):(i.width(M-F()),R.select(".nv-legendWrap").datum(D).call(i),m||i.height()===l.top||(l.top=i.height(),N=a.utils.availableHeight(o,I,l)),R.select(".nv-legendWrap").attr("transform","translate("+F()+","+-l.top+")")):R.select(".nv-legendWrap").selectAll("*").remove(),q){var S=[{key:r.grouped||"Grouped",disabled:e.stacked()},{key:r.stacked||"Stacked",disabled:!e.stacked()}];j.width(F()).color(["#444","#444","#444"]),R.select(".nv-controlsWrap").datum(S).attr("transform","translate(0,"+-l.top+")").call(j)}else R.select(".nv-controlsWrap").selectAll("*").remove();P.attr("transform","translate("+l.left+","+l.top+")"),w&&R.select(".nv-y.nv-axis").attr("transform","translate("+M+",0)"),e.disabled(D.map(function(a){return a.disabled})).width(M).height(N).color(D.map(function(a,b){return a.color||p(a,b)}).filter(function(a,b){return!D[b].disabled}));var T=R.select(".nv-barsWrap").datum(D.filter(function(a){return!a.disabled}));if(T.call(e),u){f.scale(c)._ticks(a.utils.calcTicksX(M/100,D)).tickSize(-N,0),R.select(".nv-x.nv-axis").attr("transform","translate(0,"+d.range()[0]+")"),R.select(".nv-x.nv-axis").call(f);var U=R.select(".nv-x.nv-axis > g").selectAll("g");if(U.selectAll("line, text").style("opacity",1),y){var V=function(a,b){return"translate("+a+","+b+")"},W=5,X=17;U.selectAll("text").attr("transform",function(a,b,c){return V(0,c%2==0?W:X)});var Y=d3.selectAll(".nv-x.nv-axis .nv-wrap g g text")[0].length;R.selectAll(".nv-x.nv-axis .nv-axisMaxMin text").attr("transform",function(a,b){return V(0,0===b||Y%2!==0?X:W)})}z&&R.selectAll(".tick text").call(a.utils.wrapTicks,b.xAxis.rangeBand()),x&&U.filter(function(a,b){return b%Math.ceil(D[0].values.length/(M/100))!==0}).selectAll("text, line").style("opacity",0),A&&U.selectAll(".tick text").attr("transform","rotate("+A+" 0,0)").style("text-anchor",A>0?"start":"end"),R.select(".nv-x.nv-axis").selectAll("g.nv-axisMaxMin text").style("opacity",1)}v&&(g.scale(d)._ticks(a.utils.calcTicksY(N/36,D)).tickSize(-M,0),R.select(".nv-y.nv-axis").call(g)),H&&(h.width(M).height(N).margin({left:l.left,top:l.top}).svgContainer(I).xScale(c),P.select(".nv-interactive").call(h)),i.dispatch.on("stateChange",function(a){for(var c in a)B[c]=a[c];E.stateChange(B),b.update()}),j.dispatch.on("legendClick",function(a,c){if(a.disabled){switch(S=S.map(function(a){return a.disabled=!0,a}),a.disabled=!1,a.key){case"Grouped":case r.grouped:e.stacked(!1);break;case"Stacked":case r.stacked:e.stacked(!0)}B.stacked=e.stacked(),E.stateChange(B),b.update()}}),E.on("changeState",function(a){"undefined"!=typeof a.disabled&&(D.forEach(function(b,c){b.disabled=a.disabled[c]}),B.disabled=a.disabled),"undefined"!=typeof a.stacked&&(e.stacked(a.stacked),B.stacked=a.stacked,J=a.stacked),b.update()}),H?(h.dispatch.on("elementMousemove",function(a){if(void 0!=a.pointXValue){var d,e,f,g,i=[];D.filter(function(a,b){return a.seriesIndex=b,!a.disabled}).forEach(function(h,j){e=c.domain().indexOf(a.pointXValue);var k=h.values[e];void 0!==k&&(g=k.x,void 0===d&&(d=k),void 0===f&&(f=a.mouseX),i.push({key:h.key,value:b.y()(k,e),color:p(h,h.seriesIndex),data:h.values[e]}))}),h.tooltip.data({value:g,index:e,series:i})(),h.renderGuideLine(f)}}),h.dispatch.on("elementMouseout",function(a){h.tooltip.hidden(!0)})):(e.dispatch.on("elementMouseover.tooltip",function(a){a.value=b.x()(a.data),a.series={key:a.data.key,value:b.y()(a.data),color:a.color},k.data(a).hidden(!1)}),e.dispatch.on("elementMouseout.tooltip",function(a){k.hidden(!0)}),e.dispatch.on("elementMousemove.tooltip",function(a){k()}))}),I.renderEnd("multibarchart immediate"),b}var c,d,e=a.models.multiBar(),f=a.models.axis(),g=a.models.axis(),h=a.interactiveGuideline(),i=a.models.legend(),j=a.models.legend(),k=a.models.tooltip(),l={top:30,right:20,bottom:50,left:60},m=null,n=null,o=null,p=a.utils.defaultColor(),q=!0,r={},s=!0,t=null,u=!0,v=!0,w=!1,x=!0,y=!1,z=!1,A=0,B=a.utils.state(),C=null,D=null,E=d3.dispatch("stateChange","changeState","renderEnd"),F=function(){return q?180:0},G=250,H=!1;B.stacked=!1,e.stacked(!1),f.orient("bottom").tickPadding(7).showMaxMin(!1).tickFormat(function(a){return a}),g.orient(w?"right":"left").tickFormat(d3.format(",.1f")),k.duration(0).valueFormatter(function(a,b){return g.tickFormat()(a,b)}).headerFormatter(function(a,b){return f.tickFormat()(a,b)}),h.tooltip.valueFormatter(function(a,b){return null==a?"N/A":g.tickFormat()(a,b)}).headerFormatter(function(a,b){return f.tickFormat()(a,b)}),h.tooltip.valueFormatter(function(a,b){return null==a?"N/A":g.tickFormat()(a,b)}).headerFormatter(function(a,b){return f.tickFormat()(a,b)}),h.tooltip.duration(0).valueFormatter(function(a,b){return g.tickFormat()(a,b)}).headerFormatter(function(a,b){return f.tickFormat()(a,b)}),j.updateState(!1);var I=a.utils.renderWatch(E),J=!1,K=function(a){return function(){return{active:a.map(function(a){return!a.disabled}),stacked:J}}},L=function(a){return function(b){void 0!==b.stacked&&(J=b.stacked),void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}};return b.dispatch=E,b.multibar=e,b.legend=i,b.controls=j,b.xAxis=f,b.yAxis=g,b.state=B,b.tooltip=k,b.interactiveLayer=h,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return n},set:function(a){n=a}},height:{get:function(){return o},set:function(a){o=a}},showLegend:{get:function(){return s},set:function(a){s=a}},legendPosition:{get:function(){return t},set:function(a){t=a}},showControls:{get:function(){return q},set:function(a){q=a}},controlLabels:{get:function(){return r},set:function(a){r=a}},showXAxis:{get:function(){return u},set:function(a){u=a}},showYAxis:{get:function(){return v},set:function(a){v=a}},defaultState:{get:function(){return C},set:function(a){C=a}},noData:{get:function(){return D},set:function(a){D=a}},reduceXTicks:{get:function(){return x},set:function(a){x=a}},rotateLabels:{get:function(){return A},set:function(a){A=a}},staggerLabels:{get:function(){return y},set:function(a){y=a}},wrapLabels:{get:function(){return z},set:function(a){z=!!a}},margin:{get:function(){return l},set:function(a){void 0!==a.top&&(l.top=a.top,m=a.top),l.right=void 0!==a.right?a.right:l.right,l.bottom=void 0!==a.bottom?a.bottom:l.bottom,l.left=void 0!==a.left?a.left:l.left}},duration:{get:function(){return G},set:function(a){G=a,e.duration(G),f.duration(G),g.duration(G),I.reset(G)}},color:{get:function(){return p},set:function(b){p=a.utils.getColor(b),i.color(p)}},rightAlignYAxis:{get:function(){return w},set:function(a){w=a,g.orient(w?"right":"left")}},useInteractiveGuideline:{get:function(){return H},set:function(a){H=a}},barColor:{get:function(){return e.barColor},set:function(a){e.barColor(a),i.color(function(a,b){return d3.rgb("#ccc").darker(1.5*b).toString()})}}}),a.utils.inheritOptions(b,e),a.utils.initOptions(b),b},a.models.multiBarHorizontal=function(){"use strict";function b(m){return F.reset(),m.each(function(b){var m=k-j.left-j.right,D=l-j.top-j.bottom;n=d3.select(this),a.utils.initSVG(n),w&&(b=d3.layout.stack().offset("zero").values(function(a){return a.values}).y(r)(b)),b.forEach(function(a,b){a.values.forEach(function(c){c.series=b,c.key=a.key})}),w&&b[0].values.map(function(a,c){var d=0,e=0;b.map(function(a){var b=a.values[c];b.size=Math.abs(b.y),b.y<0?(b.y1=e-b.size,e-=b.size):(b.y1=d,d+=b.size)})});var G=d&&e?[]:b.map(function(a){return a.values.map(function(a,b){return{x:q(a,b),y:r(a,b),y0:a.y0,y1:a.y1}})});o.domain(d||d3.merge(G).map(function(a){return a.x})).rangeBands(f||[0,D],A),p.domain(e||d3.extent(d3.merge(G).map(function(a){return w?a.y>0?a.y1+a.y:a.y1:a.y}).concat(t))),x&&!w?p.range(g||[p.domain()[0]<0?z:0,m-(p.domain()[1]>0?z:0)]):p.range(g||[0,m]),h=h||o,i=i||d3.scale.linear().domain(p.domain()).range([p(0),p(0)]);var H=d3.select(this).selectAll("g.nv-wrap.nv-multibarHorizontal").data([b]),I=H.enter().append("g").attr("class","nvd3 nv-wrap nv-multibarHorizontal"),J=(I.append("defs"),I.append("g"));H.select("g");J.append("g").attr("class","nv-groups"),H.attr("transform","translate("+j.left+","+j.top+")");var K=H.select(".nv-groups").selectAll(".nv-group").data(function(a){return a},function(a,b){return b});K.enter().append("g").style("stroke-opacity",1e-6).style("fill-opacity",1e-6),K.exit().watchTransition(F,"multibarhorizontal: exit groups").style("stroke-opacity",1e-6).style("fill-opacity",1e-6).remove(),K.attr("class",function(a,b){return"nv-group nv-series-"+b}).classed("hover",function(a){return a.hover}).style("fill",function(a,b){return u(a,b)}).style("stroke",function(a,b){return u(a,b)}),K.watchTransition(F,"multibarhorizontal: groups").style("stroke-opacity",1).style("fill-opacity",B);var L=K.selectAll("g.nv-bar").data(function(a){return a.values});L.exit().remove();var M=L.enter().append("g").attr("transform",function(a,c,d){return"translate("+i(w?a.y0:0)+","+(w?0:d*o.rangeBand()/b.length+o(q(a,c)))+")"});M.append("rect").attr("width",0).attr("height",o.rangeBand()/(w?1:b.length)),L.on("mouseover",function(a,b){d3.select(this).classed("hover",!0),E.elementMouseover({data:a,index:b,color:d3.select(this).style("fill")})}).on("mouseout",function(a,b){d3.select(this).classed("hover",!1),E.elementMouseout({data:a,index:b,color:d3.select(this).style("fill")})}).on("mouseout",function(a,b){E.elementMouseout({data:a,index:b,color:d3.select(this).style("fill")})}).on("mousemove",function(a,b){E.elementMousemove({data:a,index:b,color:d3.select(this).style("fill")})}).on("click",function(a,b){var c=this;E.elementClick({data:a,index:b,color:d3.select(this).style("fill"),event:d3.event,element:c}),d3.event.stopPropagation()}).on("dblclick",function(a,b){E.elementDblClick({data:a,index:b,color:d3.select(this).style("fill")}),d3.event.stopPropagation()}),s(b[0],0)&&(M.append("polyline"),L.select("polyline").attr("fill","none").attr("points",function(a,c){var d=s(a,c),e=.8*o.rangeBand()/(2*(w?1:b.length));d=d.length?d:[-Math.abs(d),Math.abs(d)],d=d.map(function(b){return p(b+(r(a,c)<0?0:r(a,c)))-p(0)});var f=[[d[0],-e],[d[0],e],[d[0],0],[d[1],0],[d[1],-e],[d[1],e]];return f.map(function(a){return a.join(",")}).join(" ")}).attr("transform",function(a,c){var d=o.rangeBand()/(2*(w?1:b.length));return"translate(0, "+d+")"})),M.append("text"),x&&!w?(L.select("text").attr("text-anchor",function(a,b){return r(a,b)<0?"end":"start"}).attr("y",o.rangeBand()/(2*b.length)).attr("dy",".32em").text(function(a,b){var c=C(r(a,b)),d=s(a,b);return void 0===d?c:d.length?c+"+"+C(Math.abs(d[1]))+"-"+C(Math.abs(d[0])):c+"±"+C(Math.abs(d))}),L.watchTransition(F,"multibarhorizontal: bars").select("text").attr("x",function(a,b){return r(a,b)<0?-4:p(r(a,b))-p(0)+4})):L.selectAll("text").text(""),y&&!w?(M.append("text").classed("nv-bar-label",!0),L.select("text.nv-bar-label").attr("text-anchor",function(a,b){return r(a,b)<0?"start":"end"}).attr("y",o.rangeBand()/(2*b.length)).attr("dy",".32em").text(function(a,b){return q(a,b)}),L.watchTransition(F,"multibarhorizontal: bars").select("text.nv-bar-label").attr("x",function(a,b){return r(a,b)<0?p(0)-p(r(a,b))+4:-4})):L.selectAll("text.nv-bar-label").text(""),L.attr("class",function(a,b){return r(a,b)<0?"nv-bar negative":"nv-bar positive"}),v&&(c||(c=b.map(function(){return!0})),L.style("fill",function(a,b,d){return d3.rgb(v(a,b)).darker(c.map(function(a,b){return b}).filter(function(a,b){return!c[b]})[d]).toString()}).style("stroke",function(a,b,d){return d3.rgb(v(a,b)).darker(c.map(function(a,b){return b}).filter(function(a,b){return!c[b]})[d]).toString()})),w?L.watchTransition(F,"multibarhorizontal: bars").attr("transform",function(a,b){return"translate("+p(a.y1)+","+o(q(a,b))+")"}).select("rect").attr("width",function(a,b){return Math.abs(p(r(a,b)+a.y0)-p(a.y0))||0}).attr("height",o.rangeBand()):L.watchTransition(F,"multibarhorizontal: bars").attr("transform",function(a,c){return"translate("+p(r(a,c)<0?r(a,c):0)+","+(a.series*o.rangeBand()/b.length+o(q(a,c)))+")"}).select("rect").attr("height",o.rangeBand()/b.length).attr("width",function(a,b){return Math.max(Math.abs(p(r(a,b))-p(0)),1)||0}),h=o.copy(),i=p.copy()}),F.renderEnd("multibarHorizontal immediate"),b}var c,d,e,f,g,h,i,j={top:0,right:0,bottom:0,left:0},k=960,l=500,m=Math.floor(1e4*Math.random()),n=null,o=d3.scale.ordinal(),p=d3.scale.linear(),q=function(a){return a.x},r=function(a){return a.y},s=function(a){return a.yErr},t=[0],u=a.utils.defaultColor(),v=null,w=!1,x=!1,y=!1,z=60,A=.1,B=.75,C=d3.format(",.2f"),D=250,E=d3.dispatch("chartClick","elementClick","elementDblClick","elementMouseover","elementMouseout","elementMousemove","renderEnd"),F=a.utils.renderWatch(E,D);return b.dispatch=E,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return k},set:function(a){k=a}},height:{get:function(){return l},set:function(a){l=a}},x:{get:function(){return q},set:function(a){q=a}},y:{get:function(){return r},set:function(a){r=a}},yErr:{get:function(){return s},set:function(a){s=a}},xScale:{get:function(){return o},set:function(a){o=a}},yScale:{get:function(){return p},set:function(a){p=a}},xDomain:{get:function(){return d},set:function(a){d=a}},yDomain:{get:function(){return e},set:function(a){e=a}},xRange:{get:function(){return f},set:function(a){f=a}},yRange:{get:function(){return g},set:function(a){g=a}},forceY:{get:function(){return t},set:function(a){t=a}},stacked:{get:function(){return w},set:function(a){w=a}},showValues:{get:function(){return x},set:function(a){x=a}},disabled:{get:function(){return c},set:function(a){c=a}},id:{get:function(){return m},set:function(a){m=a}},valueFormat:{get:function(){return C},set:function(a){C=a}},valuePadding:{get:function(){return z},set:function(a){z=a}},groupSpacing:{get:function(){return A},set:function(a){A=a}},fillOpacity:{get:function(){return B},set:function(a){B=a}},margin:{get:function(){return j},set:function(a){j.top=void 0!==a.top?a.top:j.top,j.right=void 0!==a.right?a.right:j.right,j.bottom=void 0!==a.bottom?a.bottom:j.bottom,j.left=void 0!==a.left?a.left:j.left}},duration:{get:function(){return D},set:function(a){D=a,F.reset(D)}},color:{get:function(){return u},set:function(b){u=a.utils.getColor(b)}},barColor:{get:function(){return v},set:function(b){v=b?a.utils.getColor(b):null}}}),a.utils.initOptions(b),b},a.models.multiBarHorizontalChart=function(){"use strict";function b(j){return F.reset(),F.models(e),u&&F.models(f),v&&F.models(g),j.each(function(j){var z=d3.select(this);a.utils.initSVG(z);var F=a.utils.availableWidth(m,z,k),G=a.utils.availableHeight(n,z,k);if(b.update=function(){z.transition().duration(C).call(b)},b.container=this,w=e.stacked(),x.setter(E(j),b.update).getter(D(j)).update(),x.disabled=j.map(function(a){return!!a.disabled}),!y){var H;y={};for(H in x)x[H]instanceof Array?y[H]=x[H].slice(0):y[H]=x[H]}if(!(j&&j.length&&j.filter(function(a){return a.values.length}).length))return a.utils.noData(b,z),b;z.selectAll(".nv-noData").remove(),c=e.xScale(),d=e.yScale().clamp(!0);var I=z.selectAll("g.nv-wrap.nv-multiBarHorizontalChart").data([j]),J=I.enter().append("g").attr("class","nvd3 nv-wrap nv-multiBarHorizontalChart").append("g"),K=I.select("g");if(J.append("g").attr("class","nv-x nv-axis"),J.append("g").attr("class","nv-y nv-axis").append("g").attr("class","nv-zeroLine").append("line"),J.append("g").attr("class","nv-barsWrap"),J.append("g").attr("class","nv-legendWrap"),J.append("g").attr("class","nv-controlsWrap"),s?(h.width(F-B()),K.select(".nv-legendWrap").datum(j).call(h),"bottom"===t?(k.bottom=f.height()+h.height(),G=a.utils.availableHeight(n,z,k),K.select(".nv-legendWrap").attr("transform","translate("+B()+","+(G+f.height())+")")):"top"===t&&(l||h.height()===k.top||(k.top=h.height(),G=a.utils.availableHeight(n,z,k)),K.select(".nv-legendWrap").attr("transform","translate("+B()+","+-k.top+")"))):K.select(".nv-legendWrap").selectAll("*").remove(),p){var L=[{key:r.grouped||"Grouped",disabled:e.stacked()},{key:r.stacked||"Stacked",disabled:!e.stacked()}];i.width(B()).color(["#444","#444","#444"]),"bottom"===q?(k.bottom=f.height()+h.height(),G=a.utils.availableHeight(n,z,k),K.select(".nv-controlsWrap").datum(L).attr("transform","translate(0,"+(G+f.height())+")").call(i)):"top"===q&&K.select(".nv-controlsWrap").datum(L).attr("transform","translate(0,"+-k.top+")").call(i)}else K.select(".nv-controlsWrap").selectAll("*").remove();I.attr("transform","translate("+k.left+","+k.top+")"),e.disabled(j.map(function(a){return a.disabled})).width(F).height(G).color(j.map(function(a,b){return a.color||o(a,b)}).filter(function(a,b){return!j[b].disabled}));var M=K.select(".nv-barsWrap").datum(j.filter(function(a){return!a.disabled}));if(M.transition().call(e),u){f.scale(c)._ticks(a.utils.calcTicksY(G/24,j)).tickSize(-F,0),K.select(".nv-x.nv-axis").call(f);var N=K.select(".nv-x.nv-axis").selectAll("g");N.selectAll("line, text")}v&&(g.scale(d)._ticks(a.utils.calcTicksX(F/100,j)).tickSize(-G,0),K.select(".nv-y.nv-axis").attr("transform","translate(0,"+G+")"),K.select(".nv-y.nv-axis").call(g)),K.select(".nv-zeroLine line").attr("x1",d(0)).attr("x2",d(0)).attr("y1",0).attr("y2",-G),h.dispatch.on("stateChange",function(a){for(var c in a)x[c]=a[c];A.stateChange(x),b.update()}),i.dispatch.on("legendClick",function(a,c){if(a.disabled){switch(L=L.map(function(a){return a.disabled=!0,a}),a.disabled=!1,a.key){case"Grouped":case r.grouped:e.stacked(!1);break;case"Stacked":case r.stacked:e.stacked(!0)}x.stacked=e.stacked(),A.stateChange(x),w=e.stacked(),b.update()}}),A.on("changeState",function(a){"undefined"!=typeof a.disabled&&(j.forEach(function(b,c){b.disabled=a.disabled[c]}),x.disabled=a.disabled),"undefined"!=typeof a.stacked&&(e.stacked(a.stacked),x.stacked=a.stacked,w=a.stacked),b.update()})}),F.renderEnd("multibar horizontal chart immediate"),b}var c,d,e=a.models.multiBarHorizontal(),f=a.models.axis(),g=a.models.axis(),h=a.models.legend().height(30),i=a.models.legend().height(30),j=a.models.tooltip(),k={top:30,right:20,bottom:50,left:60},l=null,m=null,n=null,o=a.utils.defaultColor(),p=!0,q="top",r={},s=!0,t="top",u=!0,v=!0,w=!1,x=a.utils.state(),y=null,z=null,A=d3.dispatch("stateChange","changeState","renderEnd"),B=function(){return p?180:0},C=250;x.stacked=!1,e.stacked(w),f.orient("left").tickPadding(5).showMaxMin(!1).tickFormat(function(a){return a}),g.orient("bottom").tickFormat(d3.format(",.1f")),j.duration(0).valueFormatter(function(a,b){return g.tickFormat()(a,b)}).headerFormatter(function(a,b){return f.tickFormat()(a,b)}),i.updateState(!1);var D=function(a){return function(){return{active:a.map(function(a){return!a.disabled}),stacked:w}}},E=function(a){return function(b){void 0!==b.stacked&&(w=b.stacked),void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}},F=a.utils.renderWatch(A,C);return e.dispatch.on("elementMouseover.tooltip",function(a){a.value=b.x()(a.data),a.series={key:a.data.key,value:b.y()(a.data),color:a.color},j.data(a).hidden(!1)}),e.dispatch.on("elementMouseout.tooltip",function(a){j.hidden(!0)}),e.dispatch.on("elementMousemove.tooltip",function(a){j()}),b.dispatch=A,b.multibar=e,b.legend=h,b.controls=i,b.xAxis=f,b.yAxis=g,b.state=x,b.tooltip=j,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return m},set:function(a){m=a}},height:{get:function(){return n},set:function(a){n=a}},showLegend:{get:function(){return s},set:function(a){s=a}},legendPosition:{get:function(){return t},set:function(a){t=a}},controlsPosition:{get:function(){return q},set:function(a){q=a}},showControls:{get:function(){return p},set:function(a){p=a}},controlLabels:{get:function(){return r},set:function(a){r=a}},showXAxis:{get:function(){return u},set:function(a){u=a}},showYAxis:{get:function(){return v},set:function(a){v=a}},defaultState:{get:function(){return y},set:function(a){y=a}},noData:{get:function(){return z},set:function(a){z=a}},margin:{get:function(){return k},set:function(a){void 0!==a.top&&(k.top=a.top,l=a.top),k.right=void 0!==a.right?a.right:k.right,k.bottom=void 0!==a.bottom?a.bottom:k.bottom,k.left=void 0!==a.left?a.left:k.left}},duration:{get:function(){return C},set:function(a){C=a,F.reset(C),e.duration(C),f.duration(C),g.duration(C)}},color:{get:function(){return o},set:function(b){o=a.utils.getColor(b),h.color(o)}},barColor:{get:function(){return e.barColor},set:function(a){e.barColor(a),h.color(function(a,b){return d3.rgb("#ccc").darker(1.5*b).toString()})}}}),a.utils.inheritOptions(b,e),a.utils.initOptions(b),b},a.models.multiChart=function(){"use strict";function b(k){return k.each(function(k){function o(a){var b=2===a.series.yAxis?G:F;a.value=a.point.x,a.series={value:a.point.y,color:a.point.color,key:a.series.key},I.duration(0).headerFormatter(function(a,b){return E.tickFormat()(a,b)}).valueFormatter(function(a,c){return b.tickFormat()(a,c)}).data(a).hidden(!1)}function s(a){var b=2===a.series.yAxis?G:F;a.value=a.point.x,a.series={value:a.point.y,color:a.point.color,key:a.series.key},I.duration(100).headerFormatter(function(a,b){return E.tickFormat()(a,b)}).valueFormatter(function(a,c){return b.tickFormat()(a,c)}).data(a).hidden(!1)}function J(a){var b=2===a.series.yAxis?G:F;a.point.x=C.x()(a.point),a.point.y=C.y()(a.point),I.duration(0).headerFormatter(function(a,b){return E.tickFormat()(a,b)}).valueFormatter(function(a,c){return b.tickFormat()(a,c)}).data(a).hidden(!1)}function L(a){var b=2===a.series.yAxis?G:F;a.value=A.x()(a.data),a.series={value:A.y()(a.data),color:a.color,key:a.data.key},I.duration(0).headerFormatter(function(a,b){return E.tickFormat()(a,b)}).valueFormatter(function(a,c){return b.tickFormat()(a,c)}).data(a).hidden(!1)}function M(){for(var a=0,b=K.length;b>a;a++){var c=K[a];try{c.clearHighlights()}catch(d){}}}function N(a,b,c){for(var d=0,e=K.length;e>d;d++){var f=K[d];try{f.highlightPoint(a,b,c)}catch(g){}}}var O=d3.select(this);a.utils.initSVG(O),b.update=function(){O.transition().call(b)},b.container=this;var P=a.utils.availableWidth(h,O,e),Q=a.utils.availableHeight(i,O,e),R=k.filter(function(a){return"line"==a.type&&1==a.yAxis}),S=k.filter(function(a){return"line"==a.type&&2==a.yAxis}),T=k.filter(function(a){return"scatter"==a.type&&1==a.yAxis}),U=k.filter(function(a){return"scatter"==a.type&&2==a.yAxis}),V=k.filter(function(a){return"bar"==a.type&&1==a.yAxis}),W=k.filter(function(a){return"bar"==a.type&&2==a.yAxis}),X=k.filter(function(a){return"area"==a.type&&1==a.yAxis}),Y=k.filter(function(a){return"area"==a.type&&2==a.yAxis});if(!(k&&k.length&&k.filter(function(a){return a.values.length}).length))return a.utils.noData(b,O),b;O.selectAll(".nv-noData").remove();var Z=k.filter(function(a){return!a.disabled&&1==a.yAxis}).map(function(a){return a.values.map(function(a,b){return{x:l(a),y:m(a)}})}),$=k.filter(function(a){return!a.disabled&&2==a.yAxis}).map(function(a){return a.values.map(function(a,b){return{x:l(a),y:m(a)}})});t.domain(d3.extent(d3.merge(Z.concat($)),function(a){return a.x})).range([0,P]);var _=O.selectAll("g.wrap.multiChart").data([k]),aa=_.enter().append("g").attr("class","wrap nvd3 multiChart").append("g");aa.append("g").attr("class","nv-x nv-axis"),aa.append("g").attr("class","nv-y1 nv-axis"),aa.append("g").attr("class","nv-y2 nv-axis"),aa.append("g").attr("class","stack1Wrap"),aa.append("g").attr("class","stack2Wrap"),aa.append("g").attr("class","bars1Wrap"),aa.append("g").attr("class","bars2Wrap"),aa.append("g").attr("class","scatters1Wrap"),aa.append("g").attr("class","scatters2Wrap"),aa.append("g").attr("class","lines1Wrap"),aa.append("g").attr("class","lines2Wrap"),aa.append("g").attr("class","legendWrap"),aa.append("g").attr("class","nv-interactive");var ba=_.select("g"),ca=k.map(function(a,b){return k[b].color||g(a,b)});if(j){var da=H.align()?P/2:P,ea=H.align()?da:0;H.width(da),H.color(ca),ba.select(".legendWrap").datum(k.map(function(a){return a.originalKey=void 0===a.originalKey?a.key:a.originalKey,a.key=a.originalKey+(1==a.yAxis?"":r),a})).call(H),f||H.height()===e.top||(e.top=H.height(),Q=a.utils.availableHeight(i,O,e)),ba.select(".legendWrap").attr("transform","translate("+ea+","+-e.top+")")}else ba.select(".legendWrap").selectAll("*").remove();w.width(P).height(Q).interpolate(n).color(ca.filter(function(a,b){return!k[b].disabled&&1==k[b].yAxis&&"line"==k[b].type})),x.width(P).height(Q).interpolate(n).color(ca.filter(function(a,b){return!k[b].disabled&&2==k[b].yAxis&&"line"==k[b].type})),y.width(P).height(Q).color(ca.filter(function(a,b){return!k[b].disabled&&1==k[b].yAxis&&"scatter"==k[b].type})),z.width(P).height(Q).color(ca.filter(function(a,b){return!k[b].disabled&&2==k[b].yAxis&&"scatter"==k[b].type})),A.width(P).height(Q).color(ca.filter(function(a,b){return!k[b].disabled&&1==k[b].yAxis&&"bar"==k[b].type})),B.width(P).height(Q).color(ca.filter(function(a,b){return!k[b].disabled&&2==k[b].yAxis&&"bar"==k[b].type})),C.width(P).height(Q).interpolate(n).color(ca.filter(function(a,b){return!k[b].disabled&&1==k[b].yAxis&&"area"==k[b].type})),D.width(P).height(Q).interpolate(n).color(ca.filter(function(a,b){ +return!k[b].disabled&&2==k[b].yAxis&&"area"==k[b].type})),ba.attr("transform","translate("+e.left+","+e.top+")");var fa=ba.select(".lines1Wrap").datum(R.filter(function(a){return!a.disabled})),ga=ba.select(".scatters1Wrap").datum(T.filter(function(a){return!a.disabled})),ha=ba.select(".bars1Wrap").datum(V.filter(function(a){return!a.disabled})),ia=ba.select(".stack1Wrap").datum(X.filter(function(a){return!a.disabled})),ja=ba.select(".lines2Wrap").datum(S.filter(function(a){return!a.disabled})),ka=ba.select(".scatters2Wrap").datum(U.filter(function(a){return!a.disabled})),la=ba.select(".bars2Wrap").datum(W.filter(function(a){return!a.disabled})),ma=ba.select(".stack2Wrap").datum(Y.filter(function(a){return!a.disabled})),na=[];if(A.stacked()&&V.length){var na=V.filter(function(a){return!a.disabled}).map(function(a){return a.values});na.length>0&&(na=na.reduce(function(a,b){return a.map(function(a,c){return{x:a.x,y:a.y+b[c].y}})}))}V.length&&na.push({x:0,y:0});var oa=[];if(B.stacked()&&W.length){var oa=W.filter(function(a){return!a.disabled}).map(function(a){return a.values});oa.length>0&&(oa=oa.reduce(function(a,b){return a.map(function(a,c){return{x:a.x,y:a.y+b[c].y}})}))}W.length&&oa.push({x:0,y:0}),u.domain(c||d3.extent(d3.merge(Z).concat(na),function(a){return a.y})).range([0,Q]),v.domain(d||d3.extent(d3.merge($).concat(oa),function(a){return a.y})).range([0,Q]),w.yDomain(u.domain()),y.yDomain(u.domain()),A.yDomain(u.domain()),C.yDomain(u.domain()),x.yDomain(v.domain()),z.yDomain(v.domain()),B.yDomain(v.domain()),D.yDomain(v.domain()),X.length&&d3.transition(ia).call(C),Y.length&&d3.transition(ma).call(D),V.length&&d3.transition(ha).call(A),W.length&&d3.transition(la).call(B),R.length&&d3.transition(fa).call(w),S.length&&d3.transition(ja).call(x),T.length&&d3.transition(ga).call(y),U.length&&d3.transition(ka).call(z),E._ticks(a.utils.calcTicksX(P/100,k)).tickSize(-Q,0),ba.select(".nv-x.nv-axis").attr("transform","translate(0,"+Q+")"),d3.transition(ba.select(".nv-x.nv-axis")).call(E),F._ticks(a.utils.calcTicksY(Q/36,k)).tickSize(-P,0),d3.transition(ba.select(".nv-y1.nv-axis")).call(F),G._ticks(a.utils.calcTicksY(Q/36,k)).tickSize(-P,0),d3.transition(ba.select(".nv-y2.nv-axis")).call(G),ba.select(".nv-y1.nv-axis").classed("nv-disabled",Z.length?!1:!0).attr("transform","translate("+t.range()[0]+",0)"),ba.select(".nv-y2.nv-axis").classed("nv-disabled",$.length?!1:!0).attr("transform","translate("+t.range()[1]+",0)"),H.dispatch.on("stateChange",function(a){b.update()}),q&&(p.width(P).height(Q).margin({left:e.left,top:e.top}).svgContainer(O).xScale(t),_.select(".nv-interactive").call(p)),q?(p.dispatch.on("elementMousemove",function(c){M();var d,e,f,h=[];k.filter(function(a,b){return a.seriesIndex=b,!a.disabled}).forEach(function(i,j){var k=t.domain(),l=i.values.filter(function(a,c){return b.x()(a,c)>=k[0]&&b.x()(a,c)<=k[1]});e=a.interactiveBisect(l,c.pointXValue,b.x());var m=l[e],n=b.y()(m,e);null!==n&&N(j,e,!0),void 0!==m&&(void 0===d&&(d=m),void 0===f&&(f=t(b.x()(m,e))),h.push({key:i.key,value:n,color:g(i,i.seriesIndex),data:m,yAxis:2==i.yAxis?G:F}))});var i=function(a,b){var c=h[b].yAxis;return null==a?"N/A":c.tickFormat()(a)};p.tooltip.headerFormatter(function(a,b){return E.tickFormat()(a,b)}).valueFormatter(p.tooltip.valueFormatter()||i).data({value:b.x()(d,e),index:e,series:h})(),p.renderGuideLine(f)}),p.dispatch.on("elementMouseout",function(a){M()})):(w.dispatch.on("elementMouseover.tooltip",o),x.dispatch.on("elementMouseover.tooltip",o),w.dispatch.on("elementMouseout.tooltip",function(a){I.hidden(!0)}),x.dispatch.on("elementMouseout.tooltip",function(a){I.hidden(!0)}),y.dispatch.on("elementMouseover.tooltip",s),z.dispatch.on("elementMouseover.tooltip",s),y.dispatch.on("elementMouseout.tooltip",function(a){I.hidden(!0)}),z.dispatch.on("elementMouseout.tooltip",function(a){I.hidden(!0)}),C.dispatch.on("elementMouseover.tooltip",J),D.dispatch.on("elementMouseover.tooltip",J),C.dispatch.on("elementMouseout.tooltip",function(a){I.hidden(!0)}),D.dispatch.on("elementMouseout.tooltip",function(a){I.hidden(!0)}),A.dispatch.on("elementMouseover.tooltip",L),B.dispatch.on("elementMouseover.tooltip",L),A.dispatch.on("elementMouseout.tooltip",function(a){I.hidden(!0)}),B.dispatch.on("elementMouseout.tooltip",function(a){I.hidden(!0)}),A.dispatch.on("elementMousemove.tooltip",function(a){I()}),B.dispatch.on("elementMousemove.tooltip",function(a){I()}))}),b}var c,d,e={top:30,right:20,bottom:50,left:60},f=null,g=a.utils.defaultColor(),h=null,i=null,j=!0,k=null,l=function(a){return a.x},m=function(a){return a.y},n="linear",o=!0,p=a.interactiveGuideline(),q=!1,r=" (right axis)",s=250,t=d3.scale.linear(),u=d3.scale.linear(),v=d3.scale.linear(),w=a.models.line().yScale(u).duration(s),x=a.models.line().yScale(v).duration(s),y=a.models.scatter().yScale(u).duration(s),z=a.models.scatter().yScale(v).duration(s),A=a.models.multiBar().stacked(!1).yScale(u).duration(s),B=a.models.multiBar().stacked(!1).yScale(v).duration(s),C=a.models.stackedArea().yScale(u).duration(s),D=a.models.stackedArea().yScale(v).duration(s),E=a.models.axis().scale(t).orient("bottom").tickPadding(5).duration(s),F=a.models.axis().scale(u).orient("left").duration(s),G=a.models.axis().scale(v).orient("right").duration(s),H=a.models.legend().height(30),I=a.models.tooltip(),J=d3.dispatch(),K=[w,x,y,z,A,B,C,D];return b.dispatch=J,b.legend=H,b.lines1=w,b.lines2=x,b.scatters1=y,b.scatters2=z,b.bars1=A,b.bars2=B,b.stack1=C,b.stack2=D,b.xAxis=E,b.yAxis1=F,b.yAxis2=G,b.tooltip=I,b.interactiveLayer=p,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return h},set:function(a){h=a}},height:{get:function(){return i},set:function(a){i=a}},showLegend:{get:function(){return j},set:function(a){j=a}},yDomain1:{get:function(){return c},set:function(a){c=a}},yDomain2:{get:function(){return d},set:function(a){d=a}},noData:{get:function(){return k},set:function(a){k=a}},interpolate:{get:function(){return n},set:function(a){n=a}},legendRightAxisHint:{get:function(){return r},set:function(a){r=a}},margin:{get:function(){return e},set:function(a){void 0!==a.top&&(e.top=a.top,f=a.top),e.right=void 0!==a.right?a.right:e.right,e.bottom=void 0!==a.bottom?a.bottom:e.bottom,e.left=void 0!==a.left?a.left:e.left}},color:{get:function(){return g},set:function(b){g=a.utils.getColor(b)}},x:{get:function(){return l},set:function(a){l=a,w.x(a),x.x(a),y.x(a),z.x(a),A.x(a),B.x(a),C.x(a),D.x(a)}},y:{get:function(){return m},set:function(a){m=a,w.y(a),x.y(a),y.y(a),z.y(a),C.y(a),D.y(a),A.y(a),B.y(a)}},useVoronoi:{get:function(){return o},set:function(a){o=a,w.useVoronoi(a),x.useVoronoi(a),C.useVoronoi(a),D.useVoronoi(a)}},useInteractiveGuideline:{get:function(){return q},set:function(a){q=a,q&&(w.interactive(!1),w.useVoronoi(!1),x.interactive(!1),x.useVoronoi(!1),C.interactive(!1),C.useVoronoi(!1),D.interactive(!1),D.useVoronoi(!1),y.interactive(!1),z.interactive(!1))}},duration:{get:function(){return s},set:function(a){s=a,[w,x,C,D,y,z,E,F,G].forEach(function(a){a.duration(s)})}}}),a.utils.initOptions(b),b},a.models.ohlcBar=function(){"use strict";function b(y){return y.each(function(b){k=d3.select(this);var y=a.utils.availableWidth(h,k,g),A=a.utils.availableHeight(i,k,g);a.utils.initSVG(k);var B=y/b[0].values.length*.9;l.domain(c||d3.extent(b[0].values.map(n).concat(t))),v?l.range(e||[.5*y/b[0].values.length,y*(b[0].values.length-.5)/b[0].values.length]):l.range(e||[5+B/2,y-B/2-5]),m.domain(d||[d3.min(b[0].values.map(s).concat(u)),d3.max(b[0].values.map(r).concat(u))]).range(f||[A,0]),l.domain()[0]===l.domain()[1]&&(l.domain()[0]?l.domain([l.domain()[0]-.01*l.domain()[0],l.domain()[1]+.01*l.domain()[1]]):l.domain([-1,1])),m.domain()[0]===m.domain()[1]&&(m.domain()[0]?m.domain([m.domain()[0]+.01*m.domain()[0],m.domain()[1]-.01*m.domain()[1]]):m.domain([-1,1]));var C=d3.select(this).selectAll("g.nv-wrap.nv-ohlcBar").data([b[0].values]),D=C.enter().append("g").attr("class","nvd3 nv-wrap nv-ohlcBar"),E=D.append("defs"),F=D.append("g"),G=C.select("g");F.append("g").attr("class","nv-ticks"),C.attr("transform","translate("+g.left+","+g.top+")"),k.on("click",function(a,b){z.chartClick({data:a,index:b,pos:d3.event,id:j})}),E.append("clipPath").attr("id","nv-chart-clip-path-"+j).append("rect"),C.select("#nv-chart-clip-path-"+j+" rect").attr("width",y).attr("height",A),G.attr("clip-path",w?"url(#nv-chart-clip-path-"+j+")":"");var H=C.select(".nv-ticks").selectAll(".nv-tick").data(function(a){return a});H.exit().remove(),H.enter().append("path").attr("class",function(a,b,c){return(p(a,b)>q(a,b)?"nv-tick negative":"nv-tick positive")+" nv-tick-"+c+"-"+b}).attr("d",function(a,b){return"m0,0l0,"+(m(p(a,b))-m(r(a,b)))+"l"+-B/2+",0l"+B/2+",0l0,"+(m(s(a,b))-m(p(a,b)))+"l0,"+(m(q(a,b))-m(s(a,b)))+"l"+B/2+",0l"+-B/2+",0z"}).attr("transform",function(a,b){return"translate("+l(n(a,b))+","+m(r(a,b))+")"}).attr("fill",function(a,b){return x[0]}).attr("stroke",function(a,b){return x[0]}).attr("x",0).attr("y",function(a,b){return m(Math.max(0,o(a,b)))}).attr("height",function(a,b){return Math.abs(m(o(a,b))-m(0))}),H.attr("class",function(a,b,c){return(p(a,b)>q(a,b)?"nv-tick negative":"nv-tick positive")+" nv-tick-"+c+"-"+b}),d3.transition(H).attr("transform",function(a,b){return"translate("+l(n(a,b))+","+m(r(a,b))+")"}).attr("d",function(a,c){var d=y/b[0].values.length*.9;return"m0,0l0,"+(m(p(a,c))-m(r(a,c)))+"l"+-d/2+",0l"+d/2+",0l0,"+(m(s(a,c))-m(p(a,c)))+"l0,"+(m(q(a,c))-m(s(a,c)))+"l"+d/2+",0l"+-d/2+",0z"})}),b}var c,d,e,f,g={top:0,right:0,bottom:0,left:0},h=null,i=null,j=Math.floor(1e4*Math.random()),k=null,l=d3.scale.linear(),m=d3.scale.linear(),n=function(a){return a.x},o=function(a){return a.y},p=function(a){return a.open},q=function(a){return a.close},r=function(a){return a.high},s=function(a){return a.low},t=[],u=[],v=!1,w=!0,x=a.utils.defaultColor(),y=!1,z=d3.dispatch("stateChange","changeState","renderEnd","chartClick","elementClick","elementDblClick","elementMouseover","elementMouseout","elementMousemove");return b.highlightPoint=function(a,c){b.clearHighlights(),k.select(".nv-ohlcBar .nv-tick-0-"+a).classed("hover",c)},b.clearHighlights=function(){k.select(".nv-ohlcBar .nv-tick.hover").classed("hover",!1)},b.dispatch=z,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return h},set:function(a){h=a}},height:{get:function(){return i},set:function(a){i=a}},xScale:{get:function(){return l},set:function(a){l=a}},yScale:{get:function(){return m},set:function(a){m=a}},xDomain:{get:function(){return c},set:function(a){c=a}},yDomain:{get:function(){return d},set:function(a){d=a}},xRange:{get:function(){return e},set:function(a){e=a}},yRange:{get:function(){return f},set:function(a){f=a}},forceX:{get:function(){return t},set:function(a){t=a}},forceY:{get:function(){return u},set:function(a){u=a}},padData:{get:function(){return v},set:function(a){v=a}},clipEdge:{get:function(){return w},set:function(a){w=a}},id:{get:function(){return j},set:function(a){j=a}},interactive:{get:function(){return y},set:function(a){y=a}},x:{get:function(){return n},set:function(a){n=a}},y:{get:function(){return o},set:function(a){o=a}},open:{get:function(){return p()},set:function(a){p=a}},close:{get:function(){return q()},set:function(a){q=a}},high:{get:function(){return r},set:function(a){r=a}},low:{get:function(){return s},set:function(a){s=a}},margin:{get:function(){return g},set:function(a){g.top=void 0!=a.top?a.top:g.top,g.right=void 0!=a.right?a.right:g.right,g.bottom=void 0!=a.bottom?a.bottom:g.bottom,g.left=void 0!=a.left?a.left:g.left}},color:{get:function(){return x},set:function(b){x=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.parallelCoordinates=function(){"use strict";function b(B){return A.reset(),B.each(function(b){function A(a){return x(o.map(function(b){if(isNaN(a.values[b.key])||isNaN(parseFloat(a.values[b.key]))||O){var c=l[b.key].domain(),d=l[b.key].range(),e=c[0]-(c[1]-c[0])/9;if(v.indexOf(b.key)<0){var f=d3.scale.linear().domain([e,c[1]]).range([j-12,d[1]]);l[b.key].brush.y(f),v.push(b.key)}if(isNaN(a.values[b.key])||isNaN(parseFloat(a.values[b.key])))return[k(b.key),l[b.key](e)]}return void 0!==U&&(v.length>0||O?(U.style("display","inline"),V.style("display","inline")):(U.style("display","none"),V.style("display","none"))),[k(b.key),l[b.key](a.values[b.key])]}))}function B(a){s.forEach(function(b){var c=l[b.dimension].brush.y().domain();b.hasOnlyNaN&&(b.extent[1]=(l[b.dimension].domain()[1]-c[0])*(b.extent[1]-b.extent[0])/(N[b.dimension]-b.extent[0])+c[0]),b.hasNaN&&(b.extent[0]=c[0]),a&&l[b.dimension].brush.extent(b.extent)}),e.select(".nv-brushBackground").each(function(a){d3.select(this).call(l[a.key].brush)}).selectAll("rect").attr("x",-8).attr("width",16),F()}function C(){q===!1&&(q=!0,B(!0))}function D(){$=p.filter(function(a){return!l[a].brush.empty()}),_=$.map(function(a){return l[a].brush.extent()}),s=[],$.forEach(function(a,b){s[b]={dimension:a,extent:_[b],hasNaN:!1,hasOnlyNaN:!1}}),t=[],c.style("display",function(a){var b=$.every(function(b,c){return(isNaN(a.values[b])||isNaN(parseFloat(a.values[b])))&&_[c][0]==l[b].brush.y().domain()[0]?!0:_[c][0]<=a.values[b]&&a.values[b]<=_[c][1]&&!isNaN(parseFloat(a.values[b]))});return b&&t.push(a),b?null:"none"}),F(),z.brush({filters:s,active:t})}function E(){var a=$.length>0?!0:!1;s.forEach(function(a){a.extent[0]===l[a.dimension].brush.y().domain()[0]&&v.indexOf(a.dimension)>=0&&(a.hasNaN=!0),a.extent[1]l[a.key].domain()[0]&&(P[a.key]=[c[0].extent[1]]),c[0].extent[0]>=l[a.key].domain()[0]&&P[a.key].push(c[0].extent[0])),d3.select(this).call(y.scale(l[a.key]).tickFormat(a.format).tickValues(P[a.key]))})}function G(a){u[a.key]=this.parentNode.__origin__=k(a.key),d.attr("visibility","hidden")}function H(a){u[a.key]=Math.min(i,Math.max(0,this.parentNode.__origin__+=d3.event.x)),c.attr("d",A),o.sort(function(a,b){return J(a.key)-J(b.key)}),o.forEach(function(a,b){return a.currentPosition=b}),k.domain(o.map(function(a){return a.key})),e.attr("transform",function(a){return"translate("+J(a.key)+")"})}function I(a,b){delete this.parentNode.__origin__,delete u[a.key],d3.select(this.parentNode).attr("transform","translate("+k(a.key)+")"),c.attr("d",A),d.attr("d",A).attr("visibility",null),z.dimensionsOrder(o)}function J(a){var b=u[a];return null==b?k(a):b}var K=d3.select(this);if(i=a.utils.availableWidth(g,K,f),j=a.utils.availableHeight(h,K,f),a.utils.initSVG(K),void 0===b[0].values){var L=[];b.forEach(function(a){var b={},c=Object.keys(a);c.forEach(function(c){"name"!==c&&(b[c]=a[c])}),L.push({key:a.name,values:b})}),b=L}var M=b.map(function(a){return a.values});0===t.length&&(t=b),p=n.sort(function(a,b){return a.currentPosition-b.currentPosition}).map(function(a){return a.key}),o=n.filter(function(a){return!a.disabled}),k.rangePoints([0,i],1).domain(o.map(function(a){return a.key}));var N={},O=!1,P=[];p.forEach(function(a){var b=d3.extent(M,function(b){return+b[a]}),c=b[0],d=b[1],e=!1;(isNaN(c)||isNaN(d))&&(e=!0,c=0,d=0),c===d&&(c-=1,d+=1);var f=s.filter(function(b){return b.dimension==a});0!==f.length&&(e?(c=l[a].domain()[0],d=l[a].domain()[1]):!f[0].hasOnlyNaN&&q?(c=c>f[0].extent[0]?f[0].extent[0]:c,d=d0||!a.utils.arrayEquals(t,aa))&&z.activeChanged(t)}),b}var c,d,e,f={top:30,right:0,bottom:10,left:0},g=null,h=null,i=null,j=null,k=d3.scale.ordinal(),l={},m="undefined values",n=[],o=[],p=[],q=!0,r=a.utils.defaultColor(),s=[],t=[],u=[],v=[],w=1,x=d3.svg.line(),y=d3.svg.axis(),z=d3.dispatch("brushstart","brush","brushEnd","dimensionsOrder","stateChange","elementClick","elementMouseover","elementMouseout","elementMousemove","renderEnd","activeChanged"),A=a.utils.renderWatch(z);return b.dispatch=z,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return g},set:function(a){g=a}},height:{get:function(){return h},set:function(a){h=a}},dimensionData:{get:function(){return n},set:function(a){n=a}},displayBrush:{get:function(){return q},set:function(a){q=a}},filters:{get:function(){return s},set:function(a){s=a}},active:{get:function(){return t},set:function(a){t=a}},lineTension:{get:function(){return w},set:function(a){w=a}},undefinedValuesLabel:{get:function(){return m},set:function(a){m=a}},dimensions:{get:function(){return n.map(function(a){return a.key})},set:function(b){a.deprecated("dimensions","use dimensionData instead"),0===n.length?b.forEach(function(a){n.push({key:a})}):b.forEach(function(a,b){n[b].key=a})}},dimensionNames:{get:function(){return n.map(function(a){return a.key})},set:function(b){a.deprecated("dimensionNames","use dimensionData instead"),p=[],0===n.length?b.forEach(function(a){n.push({key:a})}):b.forEach(function(a,b){n[b].key=a})}},dimensionFormats:{get:function(){return n.map(function(a){return a.format})},set:function(b){a.deprecated("dimensionFormats","use dimensionData instead"),0===n.length?b.forEach(function(a){n.push({format:a})}):b.forEach(function(a,b){n[b].format=a})}},margin:{get:function(){return f},set:function(a){f.top=void 0!==a.top?a.top:f.top,f.right=void 0!==a.right?a.right:f.right,f.bottom=void 0!==a.bottom?a.bottom:f.bottom,f.left=void 0!==a.left?a.left:f.left}},color:{get:function(){return r},set:function(b){r=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.parallelCoordinatesChart=function(){"use strict";function b(e){return s.reset(),s.models(c),e.each(function(e){var k=d3.select(this);a.utils.initSVG(k);var p=a.utils.availableWidth(h,k,f),q=a.utils.availableHeight(i,k,f);if(b.update=function(){k.call(b)},b.container=this,l.setter(u(m),b.update).getter(t(m)).update(),l.disabled=m.map(function(a){return!!a.disabled}),m=m.map(function(a){return a.disabled=!!a.disabled,a}),m.forEach(function(a,b){a.originalPosition=isNaN(a.originalPosition)?b:a.originalPosition,a.currentPosition=isNaN(a.currentPosition)?b:a.currentPosition}),!o){var s;o={};for(s in l)l[s]instanceof Array?o[s]=l[s].slice(0):o[s]=l[s]}if(!e||!e.length)return a.utils.noData(b,k),b;k.selectAll(".nv-noData").remove();var v=k.selectAll("g.nv-wrap.nv-parallelCoordinatesChart").data([e]),w=v.enter().append("g").attr("class","nvd3 nv-wrap nv-parallelCoordinatesChart").append("g"),x=v.select("g");w.append("g").attr("class","nv-parallelCoordinatesWrap"),w.append("g").attr("class","nv-legendWrap"),x.select("rect").attr("width",p).attr("height",q>0?q:0),j?(d.width(p).color(function(a){return"rgb(188,190,192)"}),x.select(".nv-legendWrap").datum(m.sort(function(a,b){return a.originalPosition-b.originalPosition})).call(d),g||d.height()===f.top||(f.top=d.height(),q=a.utils.availableHeight(i,k,f)),v.select(".nv-legendWrap").attr("transform","translate( 0 ,"+-f.top+")")):x.select(".nv-legendWrap").selectAll("*").remove(),v.attr("transform","translate("+f.left+","+f.top+")"),c.width(p).height(q).dimensionData(m).displayBrush(n);var y=x.select(".nv-parallelCoordinatesWrap ").datum(e);y.transition().call(c),c.dispatch.on("brushEnd",function(a,b){b?(n=!0,r.brushEnd(a)):n=!1}),d.dispatch.on("stateChange",function(a){for(var c in a)l[c]=a[c];r.stateChange(l),b.update()}),c.dispatch.on("dimensionsOrder",function(a){m.sort(function(a,b){return a.currentPosition-b.currentPosition});var b=!1;m.forEach(function(a,c){a.currentPosition=c,a.currentPosition!==a.originalPosition&&(b=!0)}),r.dimensionsOrder(m,b)}),r.on("changeState",function(a){"undefined"!=typeof a.disabled&&(m.forEach(function(b,c){b.disabled=a.disabled[c]}),l.disabled=a.disabled),b.update()})}),s.renderEnd("parraleleCoordinateChart immediate"),b}var c=a.models.parallelCoordinates(),d=a.models.legend(),e=a.models.tooltip(),f=(a.models.tooltip(),{top:0,right:0,bottom:0,left:0}),g=null,h=null,i=null,j=!0,k=a.utils.defaultColor(),l=a.utils.state(),m=[],n=!0,o=null,p=null,q="undefined",r=d3.dispatch("dimensionsOrder","brushEnd","stateChange","changeState","renderEnd"),s=a.utils.renderWatch(r),t=function(a){return function(){return{active:a.map(function(a){return!a.disabled})}}},u=function(a){return function(b){void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}};return e.contentGenerator(function(a){var b='";return 0!==a.series.length&&(b+='',a.series.forEach(function(a){b=b+'"}),b+=""),b+="
          '+a.key+"
          '+a.key+''+a.value+"
          "}),c.dispatch.on("elementMouseover.tooltip",function(a){var b={key:a.label,color:a.color,series:[]};a.values&&(Object.keys(a.values).forEach(function(c){var d=a.dimensions.filter(function(a){return a.key===c})[0];if(d){var e;e=isNaN(a.values[c])||isNaN(parseFloat(a.values[c]))?q:d.format(a.values[c]),b.series.push({idx:d.currentPosition,key:c,value:e,color:d.color})}}),b.series.sort(function(a,b){return a.idx-b.idx})),e.data(b).hidden(!1)}),c.dispatch.on("elementMouseout.tooltip",function(a){e.hidden(!0)}),c.dispatch.on("elementMousemove.tooltip",function(){e()}),b.dispatch=r,b.parallelCoordinates=c,b.legend=d,b.tooltip=e,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return h},set:function(a){h=a}},height:{get:function(){return i},set:function(a){i=a}},showLegend:{get:function(){return j},set:function(a){j=a}},defaultState:{get:function(){return o},set:function(a){o=a}},dimensionData:{get:function(){return m},set:function(a){m=a}},displayBrush:{get:function(){return n},set:function(a){n=a}},noData:{get:function(){return p},set:function(a){p=a}},nanValue:{get:function(){return q},set:function(a){q=a}},margin:{get:function(){return f},set:function(a){void 0!==a.top&&(f.top=a.top,g=a.top),f.right=void 0!==a.right?a.right:f.right,f.bottom=void 0!==a.bottom?a.bottom:f.bottom,f.left=void 0!==a.left?a.left:f.left}},color:{get:function(){return k},set:function(b){k=a.utils.getColor(b),d.color(k),c.color(k)}}}),a.utils.inheritOptions(b,c),a.utils.initOptions(b),b},a.models.pie=function(){"use strict";function b(G){return F.reset(),G.each(function(b){function G(a,b){a.endAngle=isNaN(a.endAngle)?0:a.endAngle,a.startAngle=isNaN(a.startAngle)?0:a.startAngle,q||(a.innerRadius=0);var c=d3.interpolate(this._current,a);return this._current=c(0),function(a){return D[b](c(a))}}var H=d-c.left-c.right,I=e-c.top-c.bottom,J=Math.min(H,I)/2,K=[],L=[];if(i=d3.select(this),0===B.length)for(var M=J-J/10,N=z*J,O=0;O=o){var f=ca(d);_[f]&&(d[1]-=aa),_[ca(d)]=!0}return"translate("+d+")"}),Y.select(".nv-label text").style("text-anchor",function(a,b){return u?(a.startAngle+a.endAngle)/2c)return"";if("function"==typeof n)d=n(a,b,{key:f(a.data),value:g(a.data),percent:k(c)});else switch(n){case"key":d=f(a.data);break;case"value":d=k(g(a.data));break;case"percent":d=d3.format("%")(c)}return d}),p&&Y.each(function(b,c){if(this.getBBox){var d=this.getBBox(),e=$[c].centroid(b),f={x:e[0]+d.x,y:e[1]+d.y},g={x:f.x+d.width,y:f.y},h={x:f.x,y:f.y+d.height},i={x:f.x+d.width,y:f.y+d.height};b.visible=a.utils.pointIsInArc(f,b,U)&&a.utils.pointIsInArc(g,b,U)&&a.utils.pointIsInArc(h,b,U)&&a.utils.pointIsInArc(i,b,U)}}).style("display",function(a){return a.visible?null:"none"})}}),F.renderEnd("pie immediate"),b}var c={top:0,right:0,bottom:0,left:0},d=500,e=500,f=function(a){return a.x},g=function(a){return a.y},h=Math.floor(1e4*Math.random()),i=null,j=a.utils.defaultColor(),k=d3.format(",.2f"),l=!0,m=!1,n="key",o=.02,p=!1,q=!1,r=!1,s=!0,t=0,u=!1,v=!1,w=!1,x=!1,y=0,z=.5,A=250,B=[],C=d3.dispatch("chartClick","elementClick","elementDblClick","elementMouseover","elementMouseout","elementMousemove","renderEnd"),D=[],E=[],F=a.utils.renderWatch(C);return b.dispatch=C,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{arcsRadius:{get:function(){return B},set:function(a){B=a}},width:{get:function(){return d},set:function(a){d=a}},height:{get:function(){return e},set:function(a){e=a}},showLabels:{get:function(){return l},set:function(a){l=a}},title:{get:function(){return r},set:function(a){r=a}},titleOffset:{get:function(){return t},set:function(a){t=a}},labelThreshold:{get:function(){return o},set:function(a){o=a}},hideOverlapLabels:{get:function(){ +return p},set:function(a){p=a}},valueFormat:{get:function(){return k},set:function(a){k=a}},x:{get:function(){return f},set:function(a){f=a}},id:{get:function(){return h},set:function(a){h=a}},endAngle:{get:function(){return x},set:function(a){x=a}},startAngle:{get:function(){return v},set:function(a){v=a}},padAngle:{get:function(){return w},set:function(a){w=a}},cornerRadius:{get:function(){return y},set:function(a){y=a}},donutRatio:{get:function(){return z},set:function(a){z=a}},labelsOutside:{get:function(){return m},set:function(a){m=a}},labelSunbeamLayout:{get:function(){return u},set:function(a){u=a}},donut:{get:function(){return q},set:function(a){q=a}},growOnHover:{get:function(){return s},set:function(a){s=a}},pieLabelsOutside:{get:function(){return m},set:function(b){m=b,a.deprecated("pieLabelsOutside","use labelsOutside instead")}},donutLabelsOutside:{get:function(){return m},set:function(b){m=b,a.deprecated("donutLabelsOutside","use labelsOutside instead")}},labelFormat:{get:function(){return k},set:function(b){k=b,a.deprecated("labelFormat","use valueFormat instead")}},margin:{get:function(){return c},set:function(a){c.top="undefined"!=typeof a.top?a.top:c.top,c.right="undefined"!=typeof a.right?a.right:c.right,c.bottom="undefined"!=typeof a.bottom?a.bottom:c.bottom,c.left="undefined"!=typeof a.left?a.left:c.left}},duration:{get:function(){return A},set:function(a){A=a,F.reset(A)}},y:{get:function(){return g},set:function(a){g=d3.functor(a)}},color:{get:function(){return j},set:function(b){j=a.utils.getColor(b)}},labelType:{get:function(){return n},set:function(a){n=a||"key"}}}),a.utils.initOptions(b),b},a.models.pieChart=function(){"use strict";function b(e){return s.reset(),s.models(c),e.each(function(e){var j=d3.select(this);a.utils.initSVG(j);var m=a.utils.availableWidth(h,j,f),p=a.utils.availableHeight(i,j,f);if(b.update=function(){j.transition().call(b)},b.container=this,n.setter(u(e),b.update).getter(t(e)).update(),n.disabled=e.map(function(a){return!!a.disabled}),!o){var q;o={};for(q in n)n[q]instanceof Array?o[q]=n[q].slice(0):o[q]=n[q]}if(!e||!e.length)return a.utils.noData(b,j),b;j.selectAll(".nv-noData").remove();var s=j.selectAll("g.nv-wrap.nv-pieChart").data([e]),v=s.enter().append("g").attr("class","nvd3 nv-wrap nv-pieChart").append("g"),w=s.select("g");if(v.append("g").attr("class","nv-pieWrap"),v.append("g").attr("class","nv-legendWrap"),k)if("top"===l)d.width(m).key(c.x()),s.select(".nv-legendWrap").datum(e).call(d),g||d.height()===f.top||(f.top=d.height(),p=a.utils.availableHeight(i,j,f)),s.select(".nv-legendWrap").attr("transform","translate(0,"+-f.top+")");else if("right"===l){var x=a.models.legend().width();x>m/2&&(x=m/2),d.height(p).key(c.x()),d.width(x),m-=d.width(),s.select(".nv-legendWrap").datum(e).call(d).attr("transform","translate("+m+",0)")}else"bottom"===l&&(d.width(m).key(c.x()),s.select(".nv-legendWrap").datum(e).call(d),f.bottom=d.height(),p=a.utils.availableHeight(i,j,f),s.select(".nv-legendWrap").attr("transform","translate(0,"+p+")"));else w.select(".nv-legendWrap").selectAll("*").remove();s.attr("transform","translate("+f.left+","+f.top+")"),c.width(m).height(p);var y=w.select(".nv-pieWrap").datum([e]);d3.transition(y).call(c),d.dispatch.on("stateChange",function(a){for(var c in a)n[c]=a[c];r.stateChange(n),b.update()}),r.on("changeState",function(a){"undefined"!=typeof a.disabled&&(e.forEach(function(b,c){b.disabled=a.disabled[c]}),n.disabled=a.disabled),b.update()})}),s.renderEnd("pieChart immediate"),b}var c=a.models.pie(),d=a.models.legend(),e=a.models.tooltip(),f={top:30,right:20,bottom:20,left:20},g=null,h=null,i=null,j=!1,k=!0,l="top",m=a.utils.defaultColor(),n=a.utils.state(),o=null,p=null,q=250,r=d3.dispatch("stateChange","changeState","renderEnd");e.duration(0).headerEnabled(!1).valueFormatter(function(a,b){return c.valueFormat()(a,b)});var s=a.utils.renderWatch(r),t=function(a){return function(){return{active:a.map(function(a){return!a.disabled})}}},u=function(a){return function(b){void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}};return c.dispatch.on("elementMouseover.tooltip",function(a){a.series={key:b.x()(a.data),value:b.y()(a.data),color:a.color,percent:a.percent},j||(delete a.percent,delete a.series.percent),e.data(a).hidden(!1)}),c.dispatch.on("elementMouseout.tooltip",function(a){e.hidden(!0)}),c.dispatch.on("elementMousemove.tooltip",function(a){e()}),b.legend=d,b.dispatch=r,b.pie=c,b.tooltip=e,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return h},set:function(a){h=a}},height:{get:function(){return i},set:function(a){i=a}},noData:{get:function(){return p},set:function(a){p=a}},showTooltipPercent:{get:function(){return j},set:function(a){j=a}},showLegend:{get:function(){return k},set:function(a){k=a}},legendPosition:{get:function(){return l},set:function(a){l=a}},defaultState:{get:function(){return o},set:function(a){o=a}},color:{get:function(){return m},set:function(a){m=a,d.color(m),c.color(m)}},duration:{get:function(){return q},set:function(a){q=a,s.reset(q),c.duration(q)}},margin:{get:function(){return f},set:function(a){void 0!==a.top&&(f.top=a.top,g=a.top),f.right=void 0!==a.right?a.right:f.right,f.bottom=void 0!==a.bottom?a.bottom:f.bottom,f.left=void 0!==a.left?a.left:f.left}}}),a.utils.inheritOptions(b,c),a.utils.initOptions(b),b},a.models.sankey=function(){"use strict";function b(){n.forEach(function(a){a.sourceLinks=[],a.targetLinks=[]}),o.forEach(function(a){var b=a.source,c=a.target;"number"==typeof b&&(b=a.source=n[a.source]),"number"==typeof c&&(c=a.target=n[a.target]),b.sourceLinks.push(a),c.targetLinks.push(a)})}function c(){n.forEach(function(a){a.value=Math.max(d3.sum(a.sourceLinks,i),d3.sum(a.targetLinks,i))})}function d(){for(var a,b=n,c=0;b.length&&cd;++d)b=a[d],c=e-b.y,c>0&&(b.y+=c),e=b.y+b.dy+l;if(c=e-l-m[1],c>0)for(e=b.y-=c,d=g-2;d>=0;--d)b=a[d],c=b.y+b.dy+l-e,c>0&&(b.y-=c),e=b.y})}function f(a,b){return a.y-b.y}var g=d3.nest().key(function(a){return a.x}).sortKeys(d3.ascending).entries(n).map(function(a){return a.values});b(),e(),h();for(var j=1;a>0;--a)d(j*=.99),e(),h(),c(j),e(),h()}function h(){function a(a,b){return a.source.y-b.source.y}function b(a,b){return a.target.y-b.target.y}n.forEach(function(c){c.sourceLinks.sort(b),c.targetLinks.sort(a)}),n.forEach(function(a){var b=0,c=0;a.sourceLinks.forEach(function(a){a.sy=b,b+=a.dy}),a.targetLinks.forEach(function(a){a.ty=c,c+=a.dy})})}function i(a){return a.value}var j={},k=24,l=8,m=[1,1],n=[],o=[],p=!0,q=function(a){b(),c(),d(),g(a)},r=function(){h()},s=function(){function a(a){var c=a.source.x+a.source.dx,d=a.target.x,e=d3.interpolateNumber(c,d),f=e(b),g=e(1-b),h=a.source.y+a.sy+a.dy/2,i=a.target.y+a.ty+a.dy/2,j="M"+c+","+h+"C"+f+","+h+" "+g+","+i+" "+d+","+i;return j}var b=.5;return a.curvature=function(c){return arguments.length?(b=+c,a):b},a},t=function(a){return a.y+a.dy/2};return j.options=a.utils.optionsFunc.bind(j),j._options=Object.create({},{nodeWidth:{get:function(){return k},set:function(a){k=+a}},nodePadding:{get:function(){return l},set:function(a){l=a}},nodes:{get:function(){return n},set:function(a){n=a}},links:{get:function(){return o},set:function(a){o=a}},size:{get:function(){return m},set:function(a){m=a}},sinksRight:{get:function(){return p},set:function(a){p=a}},layout:{get:function(){q(32)},set:function(a){q(a)}},relayout:{get:function(){r()},set:function(a){}},center:{get:function(){return t()},set:function(a){"function"==typeof a&&(t=a)}},link:{get:function(){return s()},set:function(a){return"function"==typeof a&&(s=a),s()}}}),a.utils.initOptions(j),j},a.models.sankeyChart=function(){"use strict";function b(a){return a.each(function(b){function c(a){d3.select(this).attr("transform","translate("+a.x+","+(a.y=Math.max(0,Math.min(f-a.dy,d3.event.y)))+")"),d.relayout(),t.attr("d",s)}var i={nodes:[{node:1,name:"Test 1"},{node:2,name:"Test 2"},{node:3,name:"Test 3"},{node:4,name:"Test 4"},{node:5,name:"Test 5"},{node:6,name:"Test 6"}],links:[{source:0,target:1,value:2295},{source:0,target:5,value:1199},{source:1,target:2,value:1119},{source:1,target:5,value:1176},{source:2,target:3,value:487},{source:2,target:5,value:632},{source:3,target:4,value:301},{source:3,target:5,value:186}]},k=!1,l=!1;if(("object"==typeof b.nodes&&b.nodes.length)>=0&&("object"==typeof b.links&&b.links.length)>=0&&(k=!0),b.nodes&&b.nodes.length>0&&b.links&&b.links.length>0&&(l=!0),!k)return console.error("NVD3 Sankey chart error:","invalid data format for",b),console.info("Valid data format is: ",i,JSON.stringify(i)),r(a,"Error loading chart, data is invalid"),!1;if(!l)return r(a,"No data available"),!1;var m=a.append("svg").attr("width",e).attr("height",f).append("g").attr("class","nvd3 nv-wrap nv-sankeyChart");d.nodeWidth(g).nodePadding(h).size([e,f]);var s=d.link();d.nodes(b.nodes).links(b.links).layout(32).center(j);var t=m.append("g").selectAll(".link").data(b.links).enter().append("path").attr("class","link").attr("d",s).style("stroke-width",function(a){return Math.max(1,a.dy)}).sort(function(a,b){return b.dy-a.dy});t.append("title").text(n);var u=m.append("g").selectAll(".node").data(b.nodes).enter().append("g").attr("class","node").attr("transform",function(a){return"translate("+a.x+","+a.y+")"}).call(d3.behavior.drag().origin(function(a){return a}).on("dragstart",function(){this.parentNode.appendChild(this)}).on("drag",c));u.append("rect").attr("height",function(a){return a.dy}).attr("width",d.nodeWidth()).style("fill",o).style("stroke",p).append("title").text(q),u.append("text").attr("x",-6).attr("y",function(a){return a.dy/2}).attr("dy",".35em").attr("text-anchor","end").attr("transform",null).text(function(a){return a.name}).filter(function(a){return a.x0?aa+20:0),la.attr("clip-path",I?"url(#nv-edge-clip-"+s+")":""),Y=!0;var ma=ha.select(".nv-groups").selectAll(".nv-group").data(function(a){return a},function(a){return a.key});ma.enter().append("g").style("stroke-opacity",1e-6).style("fill-opacity",1e-6),ma.exit().remove(),ma.attr("class",function(a,b){return(a.classed||"")+" nv-group nv-series-"+b}).classed("nv-noninteractive",!E).classed("hover",function(a){return a.hover}),ma.watchTransition(Z,"scatter: groups").style("fill",function(a,b){return q(a,b)}).style("stroke",function(a,b){return a.pointBorderColor||r||q(a,b)}).style("stroke-opacity",1).style("fill-opacity",.5);var na=ma.selectAll("path.nv-point").data(function(a){return a.values.map(function(a,b){return[a,b]}).filter(function(a,b){return F(a[0],b)})});if(na.enter().append("path").attr("class",function(a){return"nv-point nv-point-"+a[1]}).style("fill",function(a){return a.color}).style("stroke",function(a){return a.color}).attr("transform",function(b){return"translate("+a.utils.NaNtoZero(f(x(b[0],b[1])))+","+a.utils.NaNtoZero(g(y(b[0],b[1])))+")"}).attr("d",a.utils.symbol().type(function(a){return A(a[0])}).size(function(a){return w(z(a[0],a[1]))})),na.exit().each(c).remove(),ma.exit().selectAll("path.nv-point").watchTransition(Z,"scatter exit").attr("transform",function(b){return"translate("+a.utils.NaNtoZero(u(x(b[0],b[1])))+","+a.utils.NaNtoZero(v(y(b[0],b[1])))+")"}).remove(),na.filter(function(a){return d(a,"x",x,"y",y)||ea||fa||ga}).watchTransition(Z,"scatter points").attr("transform",function(b){return"translate("+a.utils.NaNtoZero(u(x(b[0],b[1])))+","+a.utils.NaNtoZero(v(y(b[0],b[1])))+")"}),na.filter(function(a){return d(a,"shape",A,"size",z)||ea||fa||ga}).watchTransition(Z,"scatter points").attr("d",a.utils.symbol().type(function(a){return A(a[0])}).size(function(a){return w(z(a[0],a[1]))})),X){var oa=ma.selectAll(".nv-label").data(function(a){return a.values.map(function(a,b){return[a,b]}).filter(function(a,b){return F(a[0],b)})});oa.enter().append("text").style("fill",function(a,b){return a.color}).style("stroke-opacity",0).style("fill-opacity",1).attr("transform",function(b){var c=a.utils.NaNtoZero(f(x(b[0],b[1])))+Math.sqrt(w(z(b[0],b[1]))/Math.PI)+2;return"translate("+c+","+a.utils.NaNtoZero(g(y(b[0],b[1])))+")"}).text(function(a,b){return a[0].label}),oa.exit().remove(),ma.exit().selectAll("path.nv-label").watchTransition(Z,"scatter exit").attr("transform",function(b){var c=a.utils.NaNtoZero(u(x(b[0],b[1])))+Math.sqrt(w(z(b[0],b[1]))/Math.PI)+2;return"translate("+c+","+a.utils.NaNtoZero(v(y(b[0],b[1])))+")"}).remove(),oa.each(function(a){d3.select(this).classed("nv-label",!0).classed("nv-label-"+a[1],!1).classed("hover",!1)}),oa.watchTransition(Z,"scatter labels").attr("transform",function(b){var c=a.utils.NaNtoZero(u(x(b[0],b[1])))+Math.sqrt(w(z(b[0],b[1]))/Math.PI)+2;return"translate("+c+","+a.utils.NaNtoZero(v(y(b[0],b[1])))+")"})}W?(clearTimeout(m),m=setTimeout(V,W)):V(),f=u.copy(),g=v.copy(),h=w.copy(),k=o,l=p}),Z.renderEnd("scatter immediate"),e}var f,g,h,i,j,k,l,m,n={top:0,right:0,bottom:0,left:0},o=null,p=null,q=a.utils.defaultColor(),r=null,s=Math.floor(1e5*Math.random()),t=null,u=d3.scale.linear(),v=d3.scale.linear(),w=d3.scale.linear(),x=function(a){return a.x},y=function(a){return a.y},z=function(a){return a.size||1},A=function(a){return a.shape||"circle"},B=[],C=[],D=[],E=!0,F=function(a){return!a.notActive},G=!1,H=.1,I=!1,J=!0,K=!1,L=function(){return 25},M=null,N=null,O=null,P=null,Q=null,R=null,S=!1,T=d3.dispatch("elementClick","elementDblClick","elementMouseover","elementMouseout","renderEnd"),U=!0,V=250,W=300,X=!1,Y=!1,Z=a.utils.renderWatch(T,V),$=[16,256],_={};return e.dispatch=T,e.options=a.utils.optionsFunc.bind(e),e._calls=new function(){this.clearHighlights=function(){return a.dom.write(function(){t.selectAll(".nv-point.hover").classed("hover",!1)}),null},this.highlightPoint=function(b,c,d){a.dom.write(function(){t.select(".nv-groups").selectAll(".nv-series-"+b).selectAll(".nv-point-"+c).classed("hover",d)})}},T.on("elementMouseover.point",function(a){E&&e._calls.highlightPoint(a.seriesIndex,a.pointIndex,!0)}),T.on("elementMouseout.point",function(a){E&&e._calls.highlightPoint(a.seriesIndex,a.pointIndex,!1)}),e._options=Object.create({},{width:{get:function(){return o},set:function(a){o=a}},height:{get:function(){return p},set:function(a){p=a}},xScale:{get:function(){return u},set:function(a){u=a}},yScale:{get:function(){return v},set:function(a){v=a}},pointScale:{get:function(){return w},set:function(a){w=a}},xDomain:{get:function(){return M},set:function(a){M=a}},yDomain:{get:function(){return N},set:function(a){N=a}},pointDomain:{get:function(){return Q},set:function(a){Q=a}},xRange:{get:function(){return O},set:function(a){O=a}},yRange:{get:function(){return P},set:function(a){P=a}},pointRange:{get:function(){return R},set:function(a){R=a}},forceX:{get:function(){return B},set:function(a){B=a}},forceY:{get:function(){return C},set:function(a){C=a}},forcePoint:{get:function(){return D},set:function(a){D=a}},interactive:{get:function(){return E},set:function(a){E=a}},pointActive:{get:function(){return F},set:function(a){F=a}},padDataOuter:{get:function(){return H},set:function(a){H=a}},padData:{get:function(){return G},set:function(a){G=a}},clipEdge:{get:function(){return I},set:function(a){I=a}},clipVoronoi:{get:function(){return J},set:function(a){J=a}},clipRadius:{get:function(){return L},set:function(a){L=a}},showVoronoi:{get:function(){return K},set:function(a){K=a}},id:{get:function(){return s},set:function(a){s=a}},interactiveUpdateDelay:{get:function(){return W},set:function(a){W=a}},showLabels:{get:function(){return X},set:function(a){X=a}},pointBorderColor:{get:function(){return r},set:function(a){r=a}},x:{get:function(){return x},set:function(a){x=d3.functor(a)}},y:{get:function(){return y},set:function(a){y=d3.functor(a)}},pointSize:{get:function(){return z},set:function(a){z=d3.functor(a)}},pointShape:{get:function(){return A},set:function(a){A=d3.functor(a)}},margin:{get:function(){return n},set:function(a){n.top=void 0!==a.top?a.top:n.top,n.right=void 0!==a.right?a.right:n.right,n.bottom=void 0!==a.bottom?a.bottom:n.bottom,n.left=void 0!==a.left?a.left:n.left}},duration:{get:function(){return V},set:function(a){V=a,Z.reset(V)}},color:{get:function(){return q},set:function(b){q=a.utils.getColor(b)}},useVoronoi:{get:function(){return U},set:function(a){U=a,U===!1&&(J=!1)}}}),a.utils.initOptions(e),e},a.models.scatterChart=function(){"use strict";function b(A){return F.reset(),F.models(c),u&&F.models(d),v&&F.models(e),r&&F.models(g),s&&F.models(h),A.each(function(A){n=d3.select(this),a.utils.initSVG(n);var I=a.utils.availableWidth(l,n,j),J=a.utils.availableHeight(m,n,j);if(b.update=function(){0===B?n.call(b):n.transition().duration(B).call(b)},b.container=this,x.setter(H(A),b.update).getter(G(A)).update(),x.disabled=A.map(function(a){return!!a.disabled}),!y){var K;y={};for(K in x)x[K]instanceof Array?y[K]=x[K].slice(0):y[K]=x[K]}if(!(A&&A.length&&A.filter(function(a){return a.values.length}).length))return a.utils.noData(b,n),F.renderEnd("scatter immediate"),b;n.selectAll(".nv-noData").remove(),p=c.xScale(),q=c.yScale();var L=n.selectAll("g.nv-wrap.nv-scatterChart").data([A]),M=L.enter().append("g").attr("class","nvd3 nv-wrap nv-scatterChart nv-chart-"+c.id()),N=M.append("g"),O=L.select("g");if(N.append("rect").attr("class","nvd3 nv-background").style("pointer-events","none"),N.append("g").attr("class","nv-x nv-axis"),N.append("g").attr("class","nv-y nv-axis"),N.append("g").attr("class","nv-scatterWrap"),N.append("g").attr("class","nv-regressionLinesWrap"),N.append("g").attr("class","nv-distWrap"),N.append("g").attr("class","nv-legendWrap"),w&&O.select(".nv-y.nv-axis").attr("transform","translate("+I+",0)"),t){var P=I;f.width(P),L.select(".nv-legendWrap").datum(A).call(f),k||f.height()===j.top||(j.top=f.height(),J=a.utils.availableHeight(m,n,j)),L.select(".nv-legendWrap").attr("transform","translate(0,"+-j.top+")")}else O.select(".nv-legendWrap").selectAll("*").remove();L.attr("transform","translate("+j.left+","+j.top+")"),c.width(I).height(J).color(A.map(function(a,b){return a.color=a.color||o(a,b),a.color}).filter(function(a,b){return!A[b].disabled})).showLabels(C),L.select(".nv-scatterWrap").datum(A.filter(function(a){return!a.disabled})).call(c),L.select(".nv-regressionLinesWrap").attr("clip-path","url(#nv-edge-clip-"+c.id()+")");var Q=L.select(".nv-regressionLinesWrap").selectAll(".nv-regLines").data(function(a){return a});Q.enter().append("g").attr("class","nv-regLines");var R=Q.selectAll(".nv-regLine").data(function(a){return[a]});R.enter().append("line").attr("class","nv-regLine").style("stroke-opacity",0),R.filter(function(a){return a.intercept&&a.slope}).watchTransition(F,"scatterPlusLineChart: regline").attr("x1",p.range()[0]).attr("x2",p.range()[1]).attr("y1",function(a,b){return q(p.domain()[0]*a.slope+a.intercept)}).attr("y2",function(a,b){return q(p.domain()[1]*a.slope+a.intercept)}).style("stroke",function(a,b,c){return o(a,c)}).style("stroke-opacity",function(a,b){return a.disabled||"undefined"==typeof a.slope||"undefined"==typeof a.intercept?0:1}),u&&(d.scale(p)._ticks(a.utils.calcTicksX(I/100,A)).tickSize(-J,0),O.select(".nv-x.nv-axis").attr("transform","translate(0,"+q.range()[0]+")").call(d)),v&&(e.scale(q)._ticks(a.utils.calcTicksY(J/36,A)).tickSize(-I,0),O.select(".nv-y.nv-axis").call(e)),r&&(g.getData(c.x()).scale(p).width(I).color(A.map(function(a,b){return a.color||o(a,b)}).filter(function(a,b){return!A[b].disabled})),N.select(".nv-distWrap").append("g").attr("class","nv-distributionX"),O.select(".nv-distributionX").attr("transform","translate(0,"+q.range()[0]+")").datum(A.filter(function(a){return!a.disabled})).call(g)),s&&(h.getData(c.y()).scale(q).width(J).color(A.map(function(a,b){return a.color||o(a,b)}).filter(function(a,b){return!A[b].disabled})),N.select(".nv-distWrap").append("g").attr("class","nv-distributionY"),O.select(".nv-distributionY").attr("transform","translate("+(w?I:-h.size())+",0)").datum(A.filter(function(a){return!a.disabled})).call(h)),f.dispatch.on("stateChange",function(a){for(var c in a)x[c]=a[c];z.stateChange(x),b.update()}),z.on("changeState",function(a){"undefined"!=typeof a.disabled&&(A.forEach(function(b,c){b.disabled=a.disabled[c]}),x.disabled=a.disabled),b.update()}),c.dispatch.on("elementMouseout.tooltip",function(a){i.hidden(!0),n.select(".nv-chart-"+c.id()+" .nv-series-"+a.seriesIndex+" .nv-distx-"+a.pointIndex).attr("y1",0),n.select(".nv-chart-"+c.id()+" .nv-series-"+a.seriesIndex+" .nv-disty-"+a.pointIndex).attr("x2",h.size())}),c.dispatch.on("elementMouseover.tooltip",function(a){n.select(".nv-series-"+a.seriesIndex+" .nv-distx-"+a.pointIndex).attr("y1",a.relativePos[1]-J),n.select(".nv-series-"+a.seriesIndex+" .nv-disty-"+a.pointIndex).attr("x2",a.relativePos[0]+g.size()),i.data(a).hidden(!1)}),D=p.copy(),E=q.copy()}),F.renderEnd("scatter with line immediate"),b}var c=a.models.scatter(),d=a.models.axis(),e=a.models.axis(),f=a.models.legend(),g=a.models.distribution(),h=a.models.distribution(),i=a.models.tooltip(),j={top:30,right:20,bottom:50,left:75},k=null,l=null,m=null,n=null,o=a.utils.defaultColor(),p=c.xScale(),q=c.yScale(),r=!1,s=!1,t=!0,u=!0,v=!0,w=!1,x=a.utils.state(),y=null,z=d3.dispatch("stateChange","changeState","renderEnd"),A=null,B=250,C=!1;c.xScale(p).yScale(q),d.orient("bottom").tickPadding(10),e.orient(w?"right":"left").tickPadding(10),g.axis("x"),h.axis("y"),i.headerFormatter(function(a,b){return d.tickFormat()(a,b)}).valueFormatter(function(a,b){return e.tickFormat()(a,b)});var D,E,F=a.utils.renderWatch(z,B),G=function(a){return function(){return{active:a.map(function(a){return!a.disabled})}}},H=function(a){return function(b){void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}};return b.dispatch=z,b.scatter=c,b.legend=f,b.xAxis=d,b.yAxis=e,b.distX=g,b.distY=h,b.tooltip=i,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return l},set:function(a){l=a}},height:{get:function(){return m},set:function(a){m=a}},container:{get:function(){return n},set:function(a){n=a}},showDistX:{get:function(){return r},set:function(a){r=a}},showDistY:{get:function(){return s},set:function(a){s=a}},showLegend:{get:function(){return t},set:function(a){t=a}},showXAxis:{get:function(){return u},set:function(a){u=a}},showYAxis:{get:function(){return v},set:function(a){v=a}},defaultState:{get:function(){return y},set:function(a){y=a}},noData:{get:function(){return A},set:function(a){A=a}},duration:{get:function(){return B},set:function(a){B=a}},showLabels:{get:function(){return C},set:function(a){C=a}},margin:{get:function(){return j},set:function(a){void 0!==a.top&&(j.top=a.top,k=a.top),j.right=void 0!==a.right?a.right:j.right,j.bottom=void 0!==a.bottom?a.bottom:j.bottom,j.left=void 0!==a.left?a.left:j.left}},rightAlignYAxis:{get:function(){return w},set:function(a){w=a,e.orient(a?"right":"left")}},color:{get:function(){return o},set:function(b){o=a.utils.getColor(b),f.color(o),g.color(o),h.color(o)}}}),a.utils.inheritOptions(b,c),a.utils.initOptions(b),b},a.models.sparkline=function(){"use strict";function b(k){return t.reset(),k.each(function(b){var k=h-g.left-g.right,s=i-g.top-g.bottom;j=d3.select(this),a.utils.initSVG(j),l.domain(c||d3.extent(b,n)).range(e||[0,k]),m.domain(d||d3.extent(b,o)).range(f||[s,0]);var t=j.selectAll("g.nv-wrap.nv-sparkline").data([b]),u=t.enter().append("g").attr("class","nvd3 nv-wrap nv-sparkline");u.append("g"),t.select("g");t.attr("transform","translate("+g.left+","+g.top+")");var v=t.selectAll("path").data(function(a){return[a]});v.enter().append("path"), +v.exit().remove(),v.style("stroke",function(a,b){return a.color||p(a,b)}).attr("d",d3.svg.line().x(function(a,b){return l(n(a,b))}).y(function(a,b){return m(o(a,b))}));var w=t.selectAll("circle.nv-point").data(function(a){function b(b){if(-1!=b){var c=a[b];return c.pointIndex=b,c}return null}var c=a.map(function(a,b){return o(a,b)}),d=b(c.lastIndexOf(m.domain()[1])),e=b(c.indexOf(m.domain()[0])),f=b(c.length-1);return[q?e:null,q?d:null,r?f:null].filter(function(a){return null!=a})});w.enter().append("circle"),w.exit().remove(),w.attr("cx",function(a,b){return l(n(a,a.pointIndex))}).attr("cy",function(a,b){return m(o(a,a.pointIndex))}).attr("r",2).attr("class",function(a,b){return n(a,a.pointIndex)==l.domain()[1]?"nv-point nv-currentValue":o(a,a.pointIndex)==m.domain()[0]?"nv-point nv-minValue":"nv-point nv-maxValue"})}),t.renderEnd("sparkline immediate"),b}var c,d,e,f,g={top:2,right:0,bottom:2,left:0},h=400,i=32,j=null,k=!0,l=d3.scale.linear(),m=d3.scale.linear(),n=function(a){return a.x},o=function(a){return a.y},p=a.utils.getColor(["#000"]),q=!0,r=!0,s=d3.dispatch("renderEnd"),t=a.utils.renderWatch(s);return b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return h},set:function(a){h=a}},height:{get:function(){return i},set:function(a){i=a}},xDomain:{get:function(){return c},set:function(a){c=a}},yDomain:{get:function(){return d},set:function(a){d=a}},xRange:{get:function(){return e},set:function(a){e=a}},yRange:{get:function(){return f},set:function(a){f=a}},xScale:{get:function(){return l},set:function(a){l=a}},yScale:{get:function(){return m},set:function(a){m=a}},animate:{get:function(){return k},set:function(a){k=a}},showMinMaxPoints:{get:function(){return q},set:function(a){q=a}},showCurrentPoint:{get:function(){return r},set:function(a){r=a}},x:{get:function(){return n},set:function(a){n=d3.functor(a)}},y:{get:function(){return o},set:function(a){o=d3.functor(a)}},margin:{get:function(){return g},set:function(a){g.top=void 0!==a.top?a.top:g.top,g.right=void 0!==a.right?a.right:g.right,g.bottom=void 0!==a.bottom?a.bottom:g.bottom,g.left=void 0!==a.left?a.left:g.left}},color:{get:function(){return p},set:function(b){p=a.utils.getColor(b)}}}),b.dispatch=s,a.utils.initOptions(b),b},a.models.sparklinePlus=function(){"use strict";function b(p){return r.reset(),r.models(e),p.each(function(p){function q(){if(!j){var a=z.selectAll(".nv-hoverValue").data(i),b=a.enter().append("g").attr("class","nv-hoverValue").style("stroke-opacity",0).style("fill-opacity",0);a.exit().transition().duration(250).style("stroke-opacity",0).style("fill-opacity",0).remove(),a.attr("transform",function(a){return"translate("+c(e.x()(p[a],a))+",0)"}).transition().duration(250).style("stroke-opacity",1).style("fill-opacity",1),i.length&&(b.append("line").attr("x1",0).attr("y1",-f.top).attr("x2",0).attr("y2",u),b.append("text").attr("class","nv-xValue").attr("x",-6).attr("y",-f.top).attr("text-anchor","end").attr("dy",".9em"),z.select(".nv-hoverValue .nv-xValue").text(k(e.x()(p[i[0]],i[0]))),b.append("text").attr("class","nv-yValue").attr("x",6).attr("y",-f.top).attr("text-anchor","start").attr("dy",".9em"),z.select(".nv-hoverValue .nv-yValue").text(l(e.y()(p[i[0]],i[0]))))}}function r(){function a(a,b){for(var c=Math.abs(e.x()(a[0],0)-b),d=0,f=0;fc;++c){for(b=0,d=0;bb;b++)a[b][c][1]/=d;else for(b=0;e>b;b++)a[b][c][1]=0}for(c=0;f>c;++c)g[c]=0;return g}}),v.renderEnd("stackedArea immediate"),b}var c,d,e={top:0,right:0,bottom:0,left:0},f=960,g=500,h=a.utils.defaultColor(),i=Math.floor(1e5*Math.random()),j=null,k=function(a){return a.x},l=function(a){return a.y},m=function(a,b){return!isNaN(l(a,b))&&null!==l(a,b)},n="stack",o="zero",p="default",q="linear",r=!1,s=a.models.scatter(),t=250,u=d3.dispatch("areaClick","areaMouseover","areaMouseout","renderEnd","elementClick","elementMouseover","elementMouseout");s.pointSize(2.2).pointDomain([2.2,2.2]);var v=a.utils.renderWatch(u,t);return b.dispatch=u,b.scatter=s,s.dispatch.on("elementClick",function(){u.elementClick.apply(this,arguments)}),s.dispatch.on("elementMouseover",function(){u.elementMouseover.apply(this,arguments)}),s.dispatch.on("elementMouseout",function(){u.elementMouseout.apply(this,arguments)}),b.interpolate=function(a){return arguments.length?(q=a,b):q},b.duration=function(a){return arguments.length?(t=a,v.reset(t),s.duration(t),b):t},b.dispatch=u,b.scatter=s,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return f},set:function(a){f=a}},height:{get:function(){return g},set:function(a){g=a}},defined:{get:function(){return m},set:function(a){m=a}},clipEdge:{get:function(){return r},set:function(a){r=a}},offset:{get:function(){return o},set:function(a){o=a}},order:{get:function(){return p},set:function(a){p=a}},interpolate:{get:function(){return q},set:function(a){q=a}},x:{get:function(){return k},set:function(a){k=d3.functor(a)}},y:{get:function(){return l},set:function(a){l=d3.functor(a)}},margin:{get:function(){return e},set:function(a){e.top=void 0!==a.top?a.top:e.top,e.right=void 0!==a.right?a.right:e.right,e.bottom=void 0!==a.bottom?a.bottom:e.bottom,e.left=void 0!==a.left?a.left:e.left}},color:{get:function(){return h},set:function(b){h=a.utils.getColor(b)}},style:{get:function(){return n},set:function(a){switch(n=a){case"stack":b.offset("zero"),b.order("default");break;case"stream":b.offset("wiggle"),b.order("inside-out");break;case"stream-center":b.offset("silhouette"),b.order("inside-out");break;case"expand":b.offset("expand"),b.order("default");break;case"stack_percent":b.offset(b.d3_stackedOffset_stackPercent),b.order("default")}}},duration:{get:function(){return t},set:function(a){t=a,v.reset(t),s.duration(t)}}}),a.utils.inheritOptions(b,s),a.utils.initOptions(b),b},a.models.stackedAreaChart=function(){"use strict";function b(k){return L.reset(),L.models(e),u&&L.models(f),v&&L.models(g),k.each(function(k){function D(){u&&X.select(".nv-focus .nv-x.nv-axis").attr("transform","translate(0,"+T+")").transition().duration(I).call(f)}function L(){if(v){if("expand"===e.style()||"stack_percent"===e.style()){var a=g.tickFormat();J&&a===P||(J=a),g.tickFormat(P)}else J&&(g.tickFormat(J),J=null);X.select(".nv-focus .nv-y.nv-axis").transition().duration(0).call(g)}}function Q(a){var b=X.select(".nv-focus .nv-stackedWrap").datum(k.filter(function(a){return!a.disabled}).map(function(b,c){return{key:b.key,area:b.area,classed:b.classed,values:b.values.filter(function(b,c){return e.x()(b,c)>=a[0]&&e.x()(b,c)<=a[1]}),disableTooltip:b.disableTooltip}}));b.transition().duration(I).call(e),D(),L()}var R=d3.select(this);a.utils.initSVG(R);var S=a.utils.availableWidth(o,R,m),T=a.utils.availableHeight(p,R,m)-(x?l.height():0);if(b.update=function(){R.transition().duration(I).call(b)},b.container=this,B.setter(O(k),b.update).getter(N(k)).update(),B.disabled=k.map(function(a){return!!a.disabled}),!C){var U;C={};for(U in B)B[U]instanceof Array?C[U]=B[U].slice(0):C[U]=B[U]}if(!(k&&k.length&&k.filter(function(a){return a.values.length}).length))return a.utils.noData(b,R),b;R.selectAll(".nv-noData").remove(),c=e.xScale(),d=e.yScale();var V=R.selectAll("g.nv-wrap.nv-stackedAreaChart").data([k]),W=V.enter().append("g").attr("class","nvd3 nv-wrap nv-stackedAreaChart").append("g"),X=V.select("g");W.append("g").attr("class","nv-legendWrap"),W.append("g").attr("class","nv-controlsWrap");var Y=W.append("g").attr("class","nv-focus");Y.append("g").attr("class","nv-background").append("rect"),Y.append("g").attr("class","nv-x nv-axis"),Y.append("g").attr("class","nv-y nv-axis"),Y.append("g").attr("class","nv-stackedWrap"),Y.append("g").attr("class","nv-interactive");W.append("g").attr("class","nv-focusWrap");if(s){var Z=r&&"top"===t?S-F:S;if(h.width(Z),X.select(".nv-legendWrap").datum(k).call(h),"bottom"===t){var $=(u?12:0)+10;m.bottom=Math.max(h.height()+$,m.bottom),T=a.utils.availableHeight(p,R,m)-(x?l.height():0);var _=T+$;X.select(".nv-legendWrap").attr("transform","translate(0,"+_+")")}else"top"===t&&(n||m.top==h.height()||(m.top=h.height(),T=a.utils.availableHeight(p,R,m)-(x?l.height():0)),X.select(".nv-legendWrap").attr("transform","translate("+(S-Z)+","+-m.top+")"))}else X.select(".nv-legendWrap").selectAll("*").remove();if(r){var aa=[{key:H.stacked||"Stacked",metaKey:"Stacked",disabled:"stack"!=e.style(),style:"stack"},{key:H.stream||"Stream",metaKey:"Stream",disabled:"stream"!=e.style(),style:"stream"},{key:H.expanded||"Expanded",metaKey:"Expanded",disabled:"expand"!=e.style(),style:"expand"},{key:H.stack_percent||"Stack %",metaKey:"Stack_Percent",disabled:"stack_percent"!=e.style(),style:"stack_percent"}];F=G.length/3*260,aa=aa.filter(function(a){return-1!==G.indexOf(a.metaKey)}),i.width(F).color(["#444","#444","#444"]),X.select(".nv-controlsWrap").datum(aa).call(i);var ba=Math.max(i.height(),s&&"top"===t?h.height():0);m.top!=ba&&(m.top=ba,T=a.utils.availableHeight(p,R,m)-(x?l.height():0)),X.select(".nv-controlsWrap").attr("transform","translate(0,"+-m.top+")")}else X.select(".nv-controlsWrap").selectAll("*").remove();V.attr("transform","translate("+m.left+","+m.top+")"),w&&X.select(".nv-y.nv-axis").attr("transform","translate("+S+",0)"),y&&(j.width(S).height(T).margin({left:m.left,top:m.top}).svgContainer(R).xScale(c),V.select(".nv-interactive").call(j)),X.select(".nv-focus .nv-background rect").attr("width",S).attr("height",T),e.width(S).height(T).color(k.map(function(a,b){return a.color||q(a,b)}).filter(function(a,b){return!k[b].disabled}));var ca=X.select(".nv-focus .nv-stackedWrap").datum(k.filter(function(a){return!a.disabled}));if(u&&f.scale(c)._ticks(a.utils.calcTicksX(S/100,k)).tickSize(-T,0),v){var da;da="wiggle"===e.offset()?0:a.utils.calcTicksY(T/36,k),g.scale(d)._ticks(da).tickSize(-S,0)}if(x){l.width(S),X.select(".nv-focusWrap").attr("transform","translate(0,"+(T+m.bottom+l.margin().top)+")").datum(k.filter(function(a){return!a.disabled})).call(l);var ea=l.brush.empty()?l.xDomain():l.brush.extent();null!==ea&&Q(ea)}else ca.transition().call(e),D(),L();e.dispatch.on("areaClick.toggle",function(a){1===k.filter(function(a){return!a.disabled}).length?k.forEach(function(a){a.disabled=!1}):k.forEach(function(b,c){b.disabled=c!=a.seriesIndex}),B.disabled=k.map(function(a){return!!a.disabled}),E.stateChange(B),b.update()}),h.dispatch.on("stateChange",function(a){for(var c in a)B[c]=a[c];E.stateChange(B),b.update()}),i.dispatch.on("legendClick",function(a,c){a.disabled&&(aa=aa.map(function(a){return a.disabled=!0,a}),a.disabled=!1,e.style(a.style),B.style=e.style(),E.stateChange(B),b.update())}),j.dispatch.on("elementMousemove",function(c){e.clearHighlights();var d,f,g,h=[],i=0,l=!0,m=!1;if(k.filter(function(a,b){return a.seriesIndex=b,!a.disabled}).forEach(function(j,n){f=a.interactiveBisect(j.values,c.pointXValue,b.x());var o=j.values[f],p=b.y()(o,f);if(null!=p&&p>0&&(e.highlightPoint(n,f,!0),m=!0),n!==k.length-1||m||e.highlightPoint(n,f,!0),"undefined"!=typeof o){"undefined"==typeof d&&(d=o),"undefined"==typeof g&&(g=b.xScale()(b.x()(o,f)));var r="expand"==e.style()?o.display.y:b.y()(o,f);h.push({key:j.key,value:r,color:q(j,j.seriesIndex),point:o}),z&&"expand"!=e.style()&&null!=r&&(i+=r,l=!1)}}),h.reverse(),h.length>2){var n=b.yScale().invert(c.mouseY),o=null;h.forEach(function(a,b){n=Math.abs(n);var c=Math.abs(a.point.display.y0),d=Math.abs(a.point.display.y);return n>=c&&d+c>=n?void(o=b):void 0}),null!=o&&(h[o].highlight=!0)}z&&"expand"!=e.style()&&h.length>=2&&!l&&h.push({key:A,value:i,total:!0});var p=b.x()(d,f),r=j.tooltip.valueFormatter();"expand"===e.style()||"stack_percent"===e.style()?(K||(K=r),r=d3.format(".1%")):K&&(r=K,K=null),j.tooltip.valueFormatter(r).data({value:p,series:h})(),j.renderGuideLine(g)}),j.dispatch.on("elementMouseout",function(a){e.clearHighlights()}),l.dispatch.on("onBrush",function(a){Q(a)}),E.on("changeState",function(a){"undefined"!=typeof a.disabled&&k.length===a.disabled.length&&(k.forEach(function(b,c){b.disabled=a.disabled[c]}),B.disabled=a.disabled),"undefined"!=typeof a.style&&(e.style(a.style),M=a.style),b.update()})}),L.renderEnd("stacked Area chart immediate"),b}var c,d,e=a.models.stackedArea(),f=a.models.axis(),g=a.models.axis(),h=a.models.legend(),i=a.models.legend(),j=a.interactiveGuideline(),k=a.models.tooltip(),l=a.models.focus(a.models.stackedArea()),m={top:10,right:25,bottom:50,left:60},n=null,o=null,p=null,q=a.utils.defaultColor(),r=!0,s=!0,t="top",u=!0,v=!0,w=!1,x=!1,y=!1,z=!0,A="TOTAL",B=a.utils.state(),C=null,D=null,E=d3.dispatch("stateChange","changeState","renderEnd"),F=250,G=["Stacked","Stream","Expanded"],H={},I=250;B.style=e.style(),f.orient("bottom").tickPadding(7),g.orient(w?"right":"left"),k.headerFormatter(function(a,b){return f.tickFormat()(a,b)}).valueFormatter(function(a,b){return g.tickFormat()(a,b)}),j.tooltip.headerFormatter(function(a,b){return f.tickFormat()(a,b)}).valueFormatter(function(a,b){return null==a?"N/A":g.tickFormat()(a,b)});var J=null,K=null;i.updateState(!1);var L=a.utils.renderWatch(E),M=e.style(),N=function(a){return function(){return{active:a.map(function(a){return!a.disabled}),style:e.style()}}},O=function(a){return function(b){void 0!==b.style&&(M=b.style),void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}},P=d3.format("%");return e.dispatch.on("elementMouseover.tooltip",function(a){a.point.x=e.x()(a.point),a.point.y=e.y()(a.point),k.data(a).hidden(!1)}),e.dispatch.on("elementMouseout.tooltip",function(a){k.hidden(!0)}),b.dispatch=E,b.stacked=e,b.legend=h,b.controls=i,b.xAxis=f,b.x2Axis=l.xAxis,b.yAxis=g,b.y2Axis=l.yAxis,b.interactiveLayer=j,b.tooltip=k,b.focus=l,b.dispatch=E,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return o},set:function(a){o=a}},height:{get:function(){return p},set:function(a){p=a}},showLegend:{get:function(){return s},set:function(a){s=a}},legendPosition:{get:function(){return t},set:function(a){t=a}},showXAxis:{get:function(){return u},set:function(a){u=a}},showYAxis:{get:function(){return v},set:function(a){v=a}},defaultState:{get:function(){return C},set:function(a){C=a}},noData:{get:function(){return D},set:function(a){D=a}},showControls:{get:function(){return r},set:function(a){r=a}},controlLabels:{get:function(){return H},set:function(a){H=a}},controlOptions:{get:function(){return G},set:function(a){G=a}},showTotalInTooltip:{get:function(){return z},set:function(a){z=a}},totalLabel:{get:function(){return A},set:function(a){A=a}},focusEnable:{get:function(){return x},set:function(a){x=a}},focusHeight:{get:function(){return l.height()},set:function(a){l.height(a)}},brushExtent:{get:function(){return l.brushExtent()},set:function(a){l.brushExtent(a)}},margin:{get:function(){return m},set:function(a){void 0!==a.top&&(m.top=a.top,n=a.top),m.right=void 0!==a.right?a.right:m.right,m.bottom=void 0!==a.bottom?a.bottom:m.bottom,m.left=void 0!==a.left?a.left:m.left}},focusMargin:{get:function(){return l.margin},set:function(a){l.margin.top=void 0!==a.top?a.top:l.margin.top,l.margin.right=void 0!==a.right?a.right:l.margin.right,l.margin.bottom=void 0!==a.bottom?a.bottom:l.margin.bottom,l.margin.left=void 0!==a.left?a.left:l.margin.left}},duration:{get:function(){return I},set:function(a){I=a,L.reset(I),e.duration(I),f.duration(I),g.duration(I)}},color:{get:function(){return q},set:function(b){q=a.utils.getColor(b),h.color(q),e.color(q),l.color(q)}},x:{get:function(){return e.x()},set:function(a){e.x(a),l.x(a)}},y:{get:function(){return e.y()},set:function(a){e.y(a),l.y(a)}},rightAlignYAxis:{get:function(){return w},set:function(a){w=a,g.orient(w?"right":"left")}},useInteractiveGuideline:{get:function(){return y},set:function(a){y=!!a,b.interactive(!a),b.useVoronoi(!a),e.scatter.interactive(!a)}}}),a.utils.inheritOptions(b,e),a.utils.initOptions(b),b},a.models.stackedAreaWithFocusChart=function(){return a.models.stackedAreaChart().margin({bottom:30}).focusEnable(!0)},a.models.sunburst=function(){"use strict";function b(a){var b=c(a);return b>90?180:0}function c(a){var b=Math.max(0,Math.min(2*Math.PI,F(a.x))),c=Math.max(0,Math.min(2*Math.PI,F(a.x+a.dx))),d=(b+c)/2*(180/Math.PI)-90;return d}function d(a){var b=Math.max(0,Math.min(2*Math.PI,F(a.x))),c=Math.max(0,Math.min(2*Math.PI,F(a.x+a.dx)));return(c-b)/(2*Math.PI)}function e(a){var b=Math.max(0,Math.min(2*Math.PI,F(a.x))),c=Math.max(0,Math.min(2*Math.PI,F(a.x+a.dx))),d=c-b;return d>z}function f(a,b){var c=d3.interpolate(F.domain(),[l.x,l.x+l.dx]),d=d3.interpolate(G.domain(),[l.y,1]),e=d3.interpolate(G.range(),[l.y?20:0,o]);return 0===b?function(){return J(a)}:function(b){return F.domain(c(b)),G.domain(d(b)).range(e(b)),J(a)}}function g(a){var b=d3.interpolate({x:a.x0,dx:a.dx0,y:a.y0,dy:a.dy0},a);return function(c){var d=b(c);return a.x0=d.x,a.dx0=d.dx,a.y0=d.y,a.dy0=d.dy,J(d)}}function h(a){var b=B(a);I[b]||(I[b]={});var c=I[b];c.dx=a.dx,c.x=a.x,c.dy=a.dy,c.y=a.y}function i(a){a.forEach(function(a){var b=B(a),c=I[b];c?(a.dx0=c.dx,a.x0=c.x,a.dy0=c.dy,a.y0=c.y):(a.dx0=a.dx,a.x0=a.x,a.dy0=a.dy,a.y0=a.y),h(a)})}function j(a){var d=v.selectAll("text"),g=v.selectAll("path");d.transition().attr("opacity",0),l=a,g.transition().duration(D).attrTween("d",f).each("end",function(d){if(d.x>=a.x&&d.x=a.depth){var f=d3.select(this.parentNode),g=f.select("text");g.transition().duration(D).text(function(a){return y(a)}).attr("opacity",function(a){return e(a)?1:0}).attr("transform",function(){var e=this.getBBox().width;if(0===d.depth)return"translate("+e/2*-1+",0)";if(d.depth===a.depth)return"translate("+(G(d.y)+5)+",0)";var f=c(d),g=b(d);return 0===g?"rotate("+f+")translate("+(G(d.y)+5)+",0)":"rotate("+f+")translate("+(G(d.y)+e+5)+",0)rotate("+g+")"})}})}function k(f){return K.reset(),f.each(function(f){v=d3.select(this),m=a.utils.availableWidth(q,v,p),n=a.utils.availableHeight(r,v,p),o=Math.min(m,n)/2,G.range([0,o]);var h=v.select("g.nvd3.nv-wrap.nv-sunburst");h[0][0]?h.attr("transform","translate("+(m/2+p.left+p.right)+","+(n/2+p.top+p.bottom)+")"):h=v.append("g").attr("class","nvd3 nv-wrap nv-sunburst nv-chart-"+u).attr("transform","translate("+(m/2+p.left+p.right)+","+(n/2+p.top+p.bottom)+")"),v.on("click",function(a,b){E.chartClick({data:a,index:b,pos:d3.event,id:u})}),H.value(t[s]||t.count);var k=H.nodes(f[0]).reverse();i(k);var l=h.selectAll(".arc-container").data(k,B),z=l.enter().append("g").attr("class","arc-container");z.append("path").attr("d",J).style("fill",function(a){return a.color?a.color:w(C?(a.children?a:a.parent).name:a.name)}).style("stroke","#FFF").on("click",function(a,b){j(a),E.elementClick({data:a,index:b})}).on("mouseover",function(a,b){d3.select(this).classed("hover",!0).style("opacity",.8),E.elementMouseover({data:a,color:d3.select(this).style("fill"),percent:d(a)})}).on("mouseout",function(a,b){d3.select(this).classed("hover",!1).style("opacity",1),E.elementMouseout({data:a})}).on("mousemove",function(a,b){E.elementMousemove({data:a})}),l.each(function(a){d3.select(this).select("path").transition().duration(D).attrTween("d",g)}),x&&(l.selectAll("text").remove(),l.append("text").text(function(a){return y(a)}).transition().duration(D).attr("opacity",function(a){return e(a)?1:0}).attr("transform",function(a){var d=this.getBBox().width;if(0===a.depth)return"rotate(0)translate("+d/2*-1+",0)";var e=c(a),f=b(a);return 0===f?"rotate("+e+")translate("+(G(a.y)+5)+",0)":"rotate("+e+")translate("+(G(a.y)+d+5)+",0)rotate("+f+")"})),j(k[k.length-1]),l.exit().transition().duration(D).attr("opacity",0).each("end",function(a){var b=B(a);I[b]=void 0}).remove()}),K.renderEnd("sunburst immediate"),k}var l,m,n,o,p={top:0,right:0,bottom:0,left:0},q=600,r=600,s="count",t={count:function(a){return 1},value:function(a){return a.value||a.size},size:function(a){return a.value||a.size}},u=Math.floor(1e4*Math.random()),v=null,w=a.utils.defaultColor(),x=!1,y=function(a){return"count"===s?a.name+" #"+a.value:a.name+" "+(a.value||a.size)},z=.02,A=function(a,b){return a.name>b.name},B=function(a,b){return void 0!==a.parent?a.name+"-"+a.parent.name+"-"+b:a.name},C=!0,D=500,E=d3.dispatch("chartClick","elementClick","elementDblClick","elementMousemove","elementMouseover","elementMouseout","renderEnd"),F=d3.scale.linear().range([0,2*Math.PI]),G=d3.scale.sqrt(),H=d3.layout.partition().sort(A),I={},J=d3.svg.arc().startAngle(function(a){return Math.max(0,Math.min(2*Math.PI,F(a.x)))}).endAngle(function(a){return Math.max(0,Math.min(2*Math.PI,F(a.x+a.dx)))}).innerRadius(function(a){return Math.max(0,G(a.y))}).outerRadius(function(a){return Math.max(0,G(a.y+a.dy))}),K=a.utils.renderWatch(E);return k.dispatch=E,k.options=a.utils.optionsFunc.bind(k),k._options=Object.create({},{width:{get:function(){return q},set:function(a){q=a}},height:{get:function(){return r},set:function(a){r=a}},mode:{get:function(){return s},set:function(a){s=a}},id:{get:function(){return u},set:function(a){u=a}},duration:{get:function(){return D},set:function(a){D=a}},groupColorByParent:{get:function(){return C},set:function(a){C=!!a}},showLabels:{get:function(){return x},set:function(a){x=!!a}},labelFormat:{get:function(){return y},set:function(a){y=a}},labelThreshold:{get:function(){return z},set:function(a){z=a}},sort:{get:function(){return A},set:function(a){A=a}},key:{get:function(){return B},set:function(a){B=a}},margin:{get:function(){return p},set:function(a){p.top=void 0!=a.top?a.top:p.top,p.right=void 0!=a.right?a.right:p.right,p.bottom=void 0!=a.bottom?a.bottom:p.bottom,p.left=void 0!=a.left?a.left:p.left}},color:{get:function(){return w},set:function(b){w=a.utils.getColor(b)}}}),a.utils.initOptions(k),k},a.models.sunburstChart=function(){"use strict";function b(d){return n.reset(),n.models(c),d.each(function(d){var h=d3.select(this);a.utils.initSVG(h);var i=a.utils.availableWidth(f,h,e),j=a.utils.availableHeight(g,h,e);return b.update=function(){0===l?h.call(b):h.transition().duration(l).call(b)},b.container=h,d&&d.length?(h.selectAll(".nv-noData").remove(),c.width(i).height(j).margin(e),void h.call(c)):(a.utils.noData(b,h),b)}),n.renderEnd("sunburstChart immediate"),b}var c=a.models.sunburst(),d=a.models.tooltip(),e={top:30,right:20,bottom:20,left:20},f=null,g=null,h=a.utils.defaultColor(),i=!1,j=(Math.round(1e5*Math.random()),null),k=null,l=250,m=d3.dispatch("stateChange","changeState","renderEnd"),n=a.utils.renderWatch(m);return d.duration(0).headerEnabled(!1).valueFormatter(function(a){return a}),c.dispatch.on("elementMouseover.tooltip",function(a){a.series={key:a.data.name,value:a.data.value||a.data.size,color:a.color,percent:a.percent},i||(delete a.percent,delete a.series.percent),d.data(a).hidden(!1)}),c.dispatch.on("elementMouseout.tooltip",function(a){d.hidden(!0)}),c.dispatch.on("elementMousemove.tooltip",function(a){d()}),b.dispatch=m,b.sunburst=c,b.tooltip=d,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{noData:{get:function(){return k},set:function(a){k=a}},defaultState:{get:function(){return j},set:function(a){j=a}},showTooltipPercent:{get:function(){return i},set:function(a){i=a}},color:{get:function(){return h},set:function(a){h=a,c.color(h)}},duration:{get:function(){return l},set:function(a){l=a,n.reset(l),c.duration(l)}},margin:{get:function(){return e},set:function(a){e.top=void 0!==a.top?a.top:e.top,e.right=void 0!==a.right?a.right:e.right,e.bottom=void 0!==a.bottom?a.bottom:e.bottom,e.left=void 0!==a.left?a.left:e.left,c.margin(e)}}}),a.utils.inheritOptions(b,c),a.utils.initOptions(b),b},a.version="1.8.6"}(); +//# sourceMappingURL=nv.d3.min.js.map \ No newline at end of file diff --git a/Monitor/wwwroot/assets/plugins/outlayer/item.js b/Monitor/wwwroot/assets/plugins/outlayer/item.js new file mode 100644 index 0000000..1c29f08 --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/outlayer/item.js @@ -0,0 +1,586 @@ +/** + * Outlayer Item + */ + +( function( window, factory ) { + 'use strict'; + // universal module definition + if ( typeof define === 'function' && define.amd ) { + // AMD + define( [ + 'eventEmitter/EventEmitter', + 'get-size/get-size', + 'get-style-property/get-style-property', + 'fizzy-ui-utils/utils' + ], + function( EventEmitter, getSize, getStyleProperty, utils ) { + return factory( window, EventEmitter, getSize, getStyleProperty, utils ); + } + ); + } else if (typeof exports === 'object') { + // CommonJS + module.exports = factory( + window, + require('wolfy87-eventemitter'), + require('get-size'), + require('desandro-get-style-property'), + require('fizzy-ui-utils') + ); + } else { + // browser global + window.Outlayer = {}; + window.Outlayer.Item = factory( + window, + window.EventEmitter, + window.getSize, + window.getStyleProperty, + window.fizzyUIUtils + ); + } + +}( window, function factory( window, EventEmitter, getSize, getStyleProperty, utils ) { +'use strict'; + +// ----- helpers ----- // + +var getComputedStyle = window.getComputedStyle; +var getStyle = getComputedStyle ? + function( elem ) { + return getComputedStyle( elem, null ); + } : + function( elem ) { + return elem.currentStyle; + }; + + +function isEmptyObj( obj ) { + for ( var prop in obj ) { + return false; + } + prop = null; + return true; +} + +// -------------------------- CSS3 support -------------------------- // + +var transitionProperty = getStyleProperty('transition'); +var transformProperty = getStyleProperty('transform'); +var supportsCSS3 = transitionProperty && transformProperty; +var is3d = !!getStyleProperty('perspective'); + +var transitionEndEvent = { + WebkitTransition: 'webkitTransitionEnd', + MozTransition: 'transitionend', + OTransition: 'otransitionend', + transition: 'transitionend' +}[ transitionProperty ]; + +// properties that could have vendor prefix +var prefixableProperties = [ + 'transform', + 'transition', + 'transitionDuration', + 'transitionProperty' +]; + +// cache all vendor properties +var vendorProperties = ( function() { + var cache = {}; + for ( var i=0, len = prefixableProperties.length; i < len; i++ ) { + var prop = prefixableProperties[i]; + var supportedProp = getStyleProperty( prop ); + if ( supportedProp && supportedProp !== prop ) { + cache[ prop ] = supportedProp; + } + } + return cache; +})(); + +// -------------------------- Item -------------------------- // + +function Item( element, layout ) { + if ( !element ) { + return; + } + + this.element = element; + // parent layout class, i.e. Masonry, Isotope, or Packery + this.layout = layout; + this.position = { + x: 0, + y: 0 + }; + + this._create(); +} + +// inherit EventEmitter +utils.extend( Item.prototype, EventEmitter.prototype ); + +Item.prototype._create = function() { + // transition objects + this._transn = { + ingProperties: {}, + clean: {}, + onEnd: {} + }; + + this.css({ + position: 'absolute' + }); +}; + +// trigger specified handler for event type +Item.prototype.handleEvent = function( event ) { + var method = 'on' + event.type; + if ( this[ method ] ) { + this[ method ]( event ); + } +}; + +Item.prototype.getSize = function() { + this.size = getSize( this.element ); +}; + +/** + * apply CSS styles to element + * @param {Object} style + */ +Item.prototype.css = function( style ) { + var elemStyle = this.element.style; + + for ( var prop in style ) { + // use vendor property if available + var supportedProp = vendorProperties[ prop ] || prop; + elemStyle[ supportedProp ] = style[ prop ]; + } +}; + + // measure position, and sets it +Item.prototype.getPosition = function() { + var style = getStyle( this.element ); + var layoutOptions = this.layout.options; + var isOriginLeft = layoutOptions.isOriginLeft; + var isOriginTop = layoutOptions.isOriginTop; + var xValue = style[ isOriginLeft ? 'left' : 'right' ]; + var yValue = style[ isOriginTop ? 'top' : 'bottom' ]; + var x = parseInt( xValue, 10 ); + var y = parseInt( yValue, 10 ); + // convert percent to pixels + var layoutSize = this.layout.size; + x = xValue.indexOf('%') != -1 ? ( x / 100 ) * layoutSize.width : x; + y = yValue.indexOf('%') != -1 ? ( y / 100 ) * layoutSize.height : y; + + // clean up 'auto' or other non-integer values + x = isNaN( x ) ? 0 : x; + y = isNaN( y ) ? 0 : y; + // remove padding from measurement + x -= isOriginLeft ? layoutSize.paddingLeft : layoutSize.paddingRight; + y -= isOriginTop ? layoutSize.paddingTop : layoutSize.paddingBottom; + + this.position.x = x; + this.position.y = y; +}; + +// set settled position, apply padding +Item.prototype.layoutPosition = function() { + var layoutSize = this.layout.size; + var layoutOptions = this.layout.options; + var style = {}; + + // x + var xPadding = layoutOptions.isOriginLeft ? 'paddingLeft' : 'paddingRight'; + var xProperty = layoutOptions.isOriginLeft ? 'left' : 'right'; + var xResetProperty = layoutOptions.isOriginLeft ? 'right' : 'left'; + + var x = this.position.x + layoutSize[ xPadding ]; + // set in percentage or pixels + style[ xProperty ] = this.getXValue( x ); + // reset other property + style[ xResetProperty ] = ''; + + // y + var yPadding = layoutOptions.isOriginTop ? 'paddingTop' : 'paddingBottom'; + var yProperty = layoutOptions.isOriginTop ? 'top' : 'bottom'; + var yResetProperty = layoutOptions.isOriginTop ? 'bottom' : 'top'; + + var y = this.position.y + layoutSize[ yPadding ]; + // set in percentage or pixels + style[ yProperty ] = this.getYValue( y ); + // reset other property + style[ yResetProperty ] = ''; + + this.css( style ); + this.emitEvent( 'layout', [ this ] ); +}; + +Item.prototype.getXValue = function( x ) { + var layoutOptions = this.layout.options; + return layoutOptions.percentPosition && !layoutOptions.isHorizontal ? + ( ( x / this.layout.size.width ) * 100 ) + '%' : x + 'px'; +}; + +Item.prototype.getYValue = function( y ) { + var layoutOptions = this.layout.options; + return layoutOptions.percentPosition && layoutOptions.isHorizontal ? + ( ( y / this.layout.size.height ) * 100 ) + '%' : y + 'px'; +}; + + +Item.prototype._transitionTo = function( x, y ) { + this.getPosition(); + // get current x & y from top/left + var curX = this.position.x; + var curY = this.position.y; + + var compareX = parseInt( x, 10 ); + var compareY = parseInt( y, 10 ); + var didNotMove = compareX === this.position.x && compareY === this.position.y; + + // save end position + this.setPosition( x, y ); + + // if did not move and not transitioning, just go to layout + if ( didNotMove && !this.isTransitioning ) { + this.layoutPosition(); + return; + } + + var transX = x - curX; + var transY = y - curY; + var transitionStyle = {}; + transitionStyle.transform = this.getTranslate( transX, transY ); + + this.transition({ + to: transitionStyle, + onTransitionEnd: { + transform: this.layoutPosition + }, + isCleaning: true + }); +}; + +Item.prototype.getTranslate = function( x, y ) { + // flip cooridinates if origin on right or bottom + var layoutOptions = this.layout.options; + x = layoutOptions.isOriginLeft ? x : -x; + y = layoutOptions.isOriginTop ? y : -y; + x = this.getXValue( x ); + y = this.getYValue( y ); + + if ( is3d ) { + return 'translate3d(' + x + ', ' + y + ', 0)'; + } + + return 'translate(' + x + ', ' + y + ')'; +}; + +// non transition + transform support +Item.prototype.goTo = function( x, y ) { + this.setPosition( x, y ); + this.layoutPosition(); +}; + +// use transition and transforms if supported +Item.prototype.moveTo = supportsCSS3 ? + Item.prototype._transitionTo : Item.prototype.goTo; + +Item.prototype.setPosition = function( x, y ) { + this.position.x = parseInt( x, 10 ); + this.position.y = parseInt( y, 10 ); +}; + +// ----- transition ----- // + +/** + * @param {Object} style - CSS + * @param {Function} onTransitionEnd + */ + +// non transition, just trigger callback +Item.prototype._nonTransition = function( args ) { + this.css( args.to ); + if ( args.isCleaning ) { + this._removeStyles( args.to ); + } + for ( var prop in args.onTransitionEnd ) { + args.onTransitionEnd[ prop ].call( this ); + } +}; + +/** + * proper transition + * @param {Object} args - arguments + * @param {Object} to - style to transition to + * @param {Object} from - style to start transition from + * @param {Boolean} isCleaning - removes transition styles after transition + * @param {Function} onTransitionEnd - callback + */ +Item.prototype._transition = function( args ) { + // redirect to nonTransition if no transition duration + if ( !parseFloat( this.layout.options.transitionDuration ) ) { + this._nonTransition( args ); + return; + } + + var _transition = this._transn; + // keep track of onTransitionEnd callback by css property + for ( var prop in args.onTransitionEnd ) { + _transition.onEnd[ prop ] = args.onTransitionEnd[ prop ]; + } + // keep track of properties that are transitioning + for ( prop in args.to ) { + _transition.ingProperties[ prop ] = true; + // keep track of properties to clean up when transition is done + if ( args.isCleaning ) { + _transition.clean[ prop ] = true; + } + } + + // set from styles + if ( args.from ) { + this.css( args.from ); + // force redraw. http://blog.alexmaccaw.com/css-transitions + var h = this.element.offsetHeight; + // hack for JSHint to hush about unused var + h = null; + } + // enable transition + this.enableTransition( args.to ); + // set styles that are transitioning + this.css( args.to ); + + this.isTransitioning = true; + +}; + +// dash before all cap letters, including first for +// WebkitTransform => -webkit-transform +function toDashedAll( str ) { + return str.replace( /([A-Z])/g, function( $1 ) { + return '-' + $1.toLowerCase(); + }); +} + +var transitionProps = 'opacity,' + + toDashedAll( vendorProperties.transform || 'transform' ); + +Item.prototype.enableTransition = function(/* style */) { + // HACK changing transitionProperty during a transition + // will cause transition to jump + if ( this.isTransitioning ) { + return; + } + + // make `transition: foo, bar, baz` from style object + // HACK un-comment this when enableTransition can work + // while a transition is happening + // var transitionValues = []; + // for ( var prop in style ) { + // // dash-ify camelCased properties like WebkitTransition + // prop = vendorProperties[ prop ] || prop; + // transitionValues.push( toDashedAll( prop ) ); + // } + // enable transition styles + this.css({ + transitionProperty: transitionProps, + transitionDuration: this.layout.options.transitionDuration + }); + // listen for transition end event + this.element.addEventListener( transitionEndEvent, this, false ); +}; + +Item.prototype.transition = Item.prototype[ transitionProperty ? '_transition' : '_nonTransition' ]; + +// ----- events ----- // + +Item.prototype.onwebkitTransitionEnd = function( event ) { + this.ontransitionend( event ); +}; + +Item.prototype.onotransitionend = function( event ) { + this.ontransitionend( event ); +}; + +// properties that I munge to make my life easier +var dashedVendorProperties = { + '-webkit-transform': 'transform', + '-moz-transform': 'transform', + '-o-transform': 'transform' +}; + +Item.prototype.ontransitionend = function( event ) { + // disregard bubbled events from children + if ( event.target !== this.element ) { + return; + } + var _transition = this._transn; + // get property name of transitioned property, convert to prefix-free + var propertyName = dashedVendorProperties[ event.propertyName ] || event.propertyName; + + // remove property that has completed transitioning + delete _transition.ingProperties[ propertyName ]; + // check if any properties are still transitioning + if ( isEmptyObj( _transition.ingProperties ) ) { + // all properties have completed transitioning + this.disableTransition(); + } + // clean style + if ( propertyName in _transition.clean ) { + // clean up style + this.element.style[ event.propertyName ] = ''; + delete _transition.clean[ propertyName ]; + } + // trigger onTransitionEnd callback + if ( propertyName in _transition.onEnd ) { + var onTransitionEnd = _transition.onEnd[ propertyName ]; + onTransitionEnd.call( this ); + delete _transition.onEnd[ propertyName ]; + } + + this.emitEvent( 'transitionEnd', [ this ] ); +}; + +Item.prototype.disableTransition = function() { + this.removeTransitionStyles(); + this.element.removeEventListener( transitionEndEvent, this, false ); + this.isTransitioning = false; +}; + +/** + * removes style property from element + * @param {Object} style +**/ +Item.prototype._removeStyles = function( style ) { + // clean up transition styles + var cleanStyle = {}; + for ( var prop in style ) { + cleanStyle[ prop ] = ''; + } + this.css( cleanStyle ); +}; + +var cleanTransitionStyle = { + transitionProperty: '', + transitionDuration: '' +}; + +Item.prototype.removeTransitionStyles = function() { + // remove transition + this.css( cleanTransitionStyle ); +}; + +// ----- show/hide/remove ----- // + +// remove element from DOM +Item.prototype.removeElem = function() { + this.element.parentNode.removeChild( this.element ); + // remove display: none + this.css({ display: '' }); + this.emitEvent( 'remove', [ this ] ); +}; + +Item.prototype.remove = function() { + // just remove element if no transition support or no transition + if ( !transitionProperty || !parseFloat( this.layout.options.transitionDuration ) ) { + this.removeElem(); + return; + } + + // start transition + var _this = this; + this.once( 'transitionEnd', function() { + _this.removeElem(); + }); + this.hide(); +}; + +Item.prototype.reveal = function() { + delete this.isHidden; + // remove display: none + this.css({ display: '' }); + + var options = this.layout.options; + + var onTransitionEnd = {}; + var transitionEndProperty = this.getHideRevealTransitionEndProperty('visibleStyle'); + onTransitionEnd[ transitionEndProperty ] = this.onRevealTransitionEnd; + + this.transition({ + from: options.hiddenStyle, + to: options.visibleStyle, + isCleaning: true, + onTransitionEnd: onTransitionEnd + }); +}; + +Item.prototype.onRevealTransitionEnd = function() { + // check if still visible + // during transition, item may have been hidden + if ( !this.isHidden ) { + this.emitEvent('reveal'); + } +}; + +/** + * get style property use for hide/reveal transition end + * @param {String} styleProperty - hiddenStyle/visibleStyle + * @returns {String} + */ +Item.prototype.getHideRevealTransitionEndProperty = function( styleProperty ) { + var optionStyle = this.layout.options[ styleProperty ]; + // use opacity + if ( optionStyle.opacity ) { + return 'opacity'; + } + // get first property + for ( var prop in optionStyle ) { + return prop; + } +}; + +Item.prototype.hide = function() { + // set flag + this.isHidden = true; + // remove display: none + this.css({ display: '' }); + + var options = this.layout.options; + + var onTransitionEnd = {}; + var transitionEndProperty = this.getHideRevealTransitionEndProperty('hiddenStyle'); + onTransitionEnd[ transitionEndProperty ] = this.onHideTransitionEnd; + + this.transition({ + from: options.visibleStyle, + to: options.hiddenStyle, + // keep hidden stuff hidden + isCleaning: true, + onTransitionEnd: onTransitionEnd + }); +}; + +Item.prototype.onHideTransitionEnd = function() { + // check if still hidden + // during transition, item may have been un-hidden + if ( this.isHidden ) { + this.css({ display: 'none' }); + this.emitEvent('hide'); + } +}; + +Item.prototype.destroy = function() { + this.css({ + position: '', + left: '', + right: '', + top: '', + bottom: '', + transition: '', + transform: '' + }); +}; + +return Item; + +})); diff --git a/Monitor/wwwroot/assets/plugins/outlayer/outlayer.js b/Monitor/wwwroot/assets/plugins/outlayer/outlayer.js new file mode 100644 index 0000000..a42395c --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/outlayer/outlayer.js @@ -0,0 +1,926 @@ +/*! + * Outlayer v1.4.1 + * the brains and guts of a layout library + * MIT license + */ + +( function( window, factory ) { + 'use strict'; + // universal module definition + + if ( typeof define == 'function' && define.amd ) { + // AMD + define( [ + 'eventie/eventie', + 'eventEmitter/EventEmitter', + 'get-size/get-size', + 'fizzy-ui-utils/utils', + './item' + ], + function( eventie, EventEmitter, getSize, utils, Item ) { + return factory( window, eventie, EventEmitter, getSize, utils, Item); + } + ); + } else if ( typeof exports == 'object' ) { + // CommonJS + module.exports = factory( + window, + require('eventie'), + require('wolfy87-eventemitter'), + require('get-size'), + require('fizzy-ui-utils'), + require('./item') + ); + } else { + // browser global + window.Outlayer = factory( + window, + window.eventie, + window.EventEmitter, + window.getSize, + window.fizzyUIUtils, + window.Outlayer.Item + ); + } + +}( window, function factory( window, eventie, EventEmitter, getSize, utils, Item ) { +'use strict'; + +// ----- vars ----- // + +var console = window.console; +var jQuery = window.jQuery; +var noop = function() {}; + +// -------------------------- Outlayer -------------------------- // + +// globally unique identifiers +var GUID = 0; +// internal store of all Outlayer intances +var instances = {}; + + +/** + * @param {Element, String} element + * @param {Object} options + * @constructor + */ +function Outlayer( element, options ) { + var queryElement = utils.getQueryElement( element ); + if ( !queryElement ) { + if ( console ) { + console.error( 'Bad element for ' + this.constructor.namespace + + ': ' + ( queryElement || element ) ); + } + return; + } + this.element = queryElement; + // add jQuery + if ( jQuery ) { + this.$element = jQuery( this.element ); + } + + // options + this.options = utils.extend( {}, this.constructor.defaults ); + this.option( options ); + + // add id for Outlayer.getFromElement + var id = ++GUID; + this.element.outlayerGUID = id; // expando + instances[ id ] = this; // associate via id + + // kick it off + this._create(); + + if ( this.options.isInitLayout ) { + this.layout(); + } +} + +// settings are for internal use only +Outlayer.namespace = 'outlayer'; +Outlayer.Item = Item; + +// default options +Outlayer.defaults = { + containerStyle: { + position: 'relative' + }, + isInitLayout: true, + isOriginLeft: true, + isOriginTop: true, + isResizeBound: true, + isResizingContainer: true, + // item options + transitionDuration: '0.4s', + hiddenStyle: { + opacity: 0, + transform: 'scale(0.001)' + }, + visibleStyle: { + opacity: 1, + transform: 'scale(1)' + } +}; + +// inherit EventEmitter +utils.extend( Outlayer.prototype, EventEmitter.prototype ); + +/** + * set options + * @param {Object} opts + */ +Outlayer.prototype.option = function( opts ) { + utils.extend( this.options, opts ); +}; + +Outlayer.prototype._create = function() { + // get items from children + this.reloadItems(); + // elements that affect layout, but are not laid out + this.stamps = []; + this.stamp( this.options.stamp ); + // set container style + utils.extend( this.element.style, this.options.containerStyle ); + + // bind resize method + if ( this.options.isResizeBound ) { + this.bindResize(); + } +}; + +// goes through all children again and gets bricks in proper order +Outlayer.prototype.reloadItems = function() { + // collection of item elements + this.items = this._itemize( this.element.children ); +}; + + +/** + * turn elements into Outlayer.Items to be used in layout + * @param {Array or NodeList or HTMLElement} elems + * @returns {Array} items - collection of new Outlayer Items + */ +Outlayer.prototype._itemize = function( elems ) { + + var itemElems = this._filterFindItemElements( elems ); + var Item = this.constructor.Item; + + // create new Outlayer Items for collection + var items = []; + for ( var i=0, len = itemElems.length; i < len; i++ ) { + var elem = itemElems[i]; + var item = new Item( elem, this ); + items.push( item ); + } + + return items; +}; + +/** + * get item elements to be used in layout + * @param {Array or NodeList or HTMLElement} elems + * @returns {Array} items - item elements + */ +Outlayer.prototype._filterFindItemElements = function( elems ) { + return utils.filterFindElements( elems, this.options.itemSelector ); +}; + +/** + * getter method for getting item elements + * @returns {Array} elems - collection of item elements + */ +Outlayer.prototype.getItemElements = function() { + var elems = []; + for ( var i=0, len = this.items.length; i < len; i++ ) { + elems.push( this.items[i].element ); + } + return elems; +}; + +// ----- init & layout ----- // + +/** + * lays out all items + */ +Outlayer.prototype.layout = function() { + this._resetLayout(); + this._manageStamps(); + + // don't animate first layout + var isInstant = this.options.isLayoutInstant !== undefined ? + this.options.isLayoutInstant : !this._isLayoutInited; + this.layoutItems( this.items, isInstant ); + + // flag for initalized + this._isLayoutInited = true; +}; + +// _init is alias for layout +Outlayer.prototype._init = Outlayer.prototype.layout; + +/** + * logic before any new layout + */ +Outlayer.prototype._resetLayout = function() { + this.getSize(); +}; + + +Outlayer.prototype.getSize = function() { + this.size = getSize( this.element ); +}; + +/** + * get measurement from option, for columnWidth, rowHeight, gutter + * if option is String -> get element from selector string, & get size of element + * if option is Element -> get size of element + * else use option as a number + * + * @param {String} measurement + * @param {String} size - width or height + * @private + */ +Outlayer.prototype._getMeasurement = function( measurement, size ) { + var option = this.options[ measurement ]; + var elem; + if ( !option ) { + // default to 0 + this[ measurement ] = 0; + } else { + // use option as an element + if ( typeof option === 'string' ) { + elem = this.element.querySelector( option ); + } else if ( utils.isElement( option ) ) { + elem = option; + } + // use size of element, if element + this[ measurement ] = elem ? getSize( elem )[ size ] : option; + } +}; + +/** + * layout a collection of item elements + * @api public + */ +Outlayer.prototype.layoutItems = function( items, isInstant ) { + items = this._getItemsForLayout( items ); + + this._layoutItems( items, isInstant ); + + this._postLayout(); +}; + +/** + * get the items to be laid out + * you may want to skip over some items + * @param {Array} items + * @returns {Array} items + */ +Outlayer.prototype._getItemsForLayout = function( items ) { + var layoutItems = []; + for ( var i=0, len = items.length; i < len; i++ ) { + var item = items[i]; + if ( !item.isIgnored ) { + layoutItems.push( item ); + } + } + return layoutItems; +}; + +/** + * layout items + * @param {Array} items + * @param {Boolean} isInstant + */ +Outlayer.prototype._layoutItems = function( items, isInstant ) { + this._emitCompleteOnItems( 'layout', items ); + + if ( !items || !items.length ) { + // no items, emit event with empty array + return; + } + + var queue = []; + + for ( var i=0, len = items.length; i < len; i++ ) { + var item = items[i]; + // get x/y object from method + var position = this._getItemLayoutPosition( item ); + // enqueue + position.item = item; + position.isInstant = isInstant || item.isLayoutInstant; + queue.push( position ); + } + + this._processLayoutQueue( queue ); +}; + +/** + * get item layout position + * @param {Outlayer.Item} item + * @returns {Object} x and y position + */ +Outlayer.prototype._getItemLayoutPosition = function( /* item */ ) { + return { + x: 0, + y: 0 + }; +}; + +/** + * iterate over array and position each item + * Reason being - separating this logic prevents 'layout invalidation' + * thx @paul_irish + * @param {Array} queue + */ +Outlayer.prototype._processLayoutQueue = function( queue ) { + for ( var i=0, len = queue.length; i < len; i++ ) { + var obj = queue[i]; + this._positionItem( obj.item, obj.x, obj.y, obj.isInstant ); + } +}; + +/** + * Sets position of item in DOM + * @param {Outlayer.Item} item + * @param {Number} x - horizontal position + * @param {Number} y - vertical position + * @param {Boolean} isInstant - disables transitions + */ +Outlayer.prototype._positionItem = function( item, x, y, isInstant ) { + if ( isInstant ) { + // if not transition, just set CSS + item.goTo( x, y ); + } else { + item.moveTo( x, y ); + } +}; + +/** + * Any logic you want to do after each layout, + * i.e. size the container + */ +Outlayer.prototype._postLayout = function() { + this.resizeContainer(); +}; + +Outlayer.prototype.resizeContainer = function() { + if ( !this.options.isResizingContainer ) { + return; + } + var size = this._getContainerSize(); + if ( size ) { + this._setContainerMeasure( size.width, true ); + this._setContainerMeasure( size.height, false ); + } +}; + +/** + * Sets width or height of container if returned + * @returns {Object} size + * @param {Number} width + * @param {Number} height + */ +Outlayer.prototype._getContainerSize = noop; + +/** + * @param {Number} measure - size of width or height + * @param {Boolean} isWidth + */ +Outlayer.prototype._setContainerMeasure = function( measure, isWidth ) { + if ( measure === undefined ) { + return; + } + + var elemSize = this.size; + // add padding and border width if border box + if ( elemSize.isBorderBox ) { + measure += isWidth ? elemSize.paddingLeft + elemSize.paddingRight + + elemSize.borderLeftWidth + elemSize.borderRightWidth : + elemSize.paddingBottom + elemSize.paddingTop + + elemSize.borderTopWidth + elemSize.borderBottomWidth; + } + + measure = Math.max( measure, 0 ); + this.element.style[ isWidth ? 'width' : 'height' ] = measure + 'px'; +}; + +/** + * emit eventComplete on a collection of items events + * @param {String} eventName + * @param {Array} items - Outlayer.Items + */ +Outlayer.prototype._emitCompleteOnItems = function( eventName, items ) { + var _this = this; + function onComplete() { + _this.dispatchEvent( eventName + 'Complete', null, [ items ] ); + } + + var count = items.length; + if ( !items || !count ) { + onComplete(); + return; + } + + var doneCount = 0; + function tick() { + doneCount++; + if ( doneCount === count ) { + onComplete(); + } + } + + // bind callback + for ( var i=0, len = items.length; i < len; i++ ) { + var item = items[i]; + item.once( eventName, tick ); + } +}; + +/** + * emits events via eventEmitter and jQuery events + * @param {String} type - name of event + * @param {Event} event - original event + * @param {Array} args - extra arguments + */ +Outlayer.prototype.dispatchEvent = function( type, event, args ) { + // add original event to arguments + var emitArgs = event ? [ event ].concat( args ) : args; + this.emitEvent( type, emitArgs ); + + if ( jQuery ) { + // set this.$element + this.$element = this.$element || jQuery( this.element ); + if ( event ) { + // create jQuery event + var $event = jQuery.Event( event ); + $event.type = type; + this.$element.trigger( $event, args ); + } else { + // just trigger with type if no event available + this.$element.trigger( type, args ); + } + } +}; + +// -------------------------- ignore & stamps -------------------------- // + + +/** + * keep item in collection, but do not lay it out + * ignored items do not get skipped in layout + * @param {Element} elem + */ +Outlayer.prototype.ignore = function( elem ) { + var item = this.getItem( elem ); + if ( item ) { + item.isIgnored = true; + } +}; + +/** + * return item to layout collection + * @param {Element} elem + */ +Outlayer.prototype.unignore = function( elem ) { + var item = this.getItem( elem ); + if ( item ) { + delete item.isIgnored; + } +}; + +/** + * adds elements to stamps + * @param {NodeList, Array, Element, or String} elems + */ +Outlayer.prototype.stamp = function( elems ) { + elems = this._find( elems ); + if ( !elems ) { + return; + } + + this.stamps = this.stamps.concat( elems ); + // ignore + for ( var i=0, len = elems.length; i < len; i++ ) { + var elem = elems[i]; + this.ignore( elem ); + } +}; + +/** + * removes elements to stamps + * @param {NodeList, Array, or Element} elems + */ +Outlayer.prototype.unstamp = function( elems ) { + elems = this._find( elems ); + if ( !elems ){ + return; + } + + for ( var i=0, len = elems.length; i < len; i++ ) { + var elem = elems[i]; + // filter out removed stamp elements + utils.removeFrom( this.stamps, elem ); + this.unignore( elem ); + } + +}; + +/** + * finds child elements + * @param {NodeList, Array, Element, or String} elems + * @returns {Array} elems + */ +Outlayer.prototype._find = function( elems ) { + if ( !elems ) { + return; + } + // if string, use argument as selector string + if ( typeof elems === 'string' ) { + elems = this.element.querySelectorAll( elems ); + } + elems = utils.makeArray( elems ); + return elems; +}; + +Outlayer.prototype._manageStamps = function() { + if ( !this.stamps || !this.stamps.length ) { + return; + } + + this._getBoundingRect(); + + for ( var i=0, len = this.stamps.length; i < len; i++ ) { + var stamp = this.stamps[i]; + this._manageStamp( stamp ); + } +}; + +// update boundingLeft / Top +Outlayer.prototype._getBoundingRect = function() { + // get bounding rect for container element + var boundingRect = this.element.getBoundingClientRect(); + var size = this.size; + this._boundingRect = { + left: boundingRect.left + size.paddingLeft + size.borderLeftWidth, + top: boundingRect.top + size.paddingTop + size.borderTopWidth, + right: boundingRect.right - ( size.paddingRight + size.borderRightWidth ), + bottom: boundingRect.bottom - ( size.paddingBottom + size.borderBottomWidth ) + }; +}; + +/** + * @param {Element} stamp +**/ +Outlayer.prototype._manageStamp = noop; + +/** + * get x/y position of element relative to container element + * @param {Element} elem + * @returns {Object} offset - has left, top, right, bottom + */ +Outlayer.prototype._getElementOffset = function( elem ) { + var boundingRect = elem.getBoundingClientRect(); + var thisRect = this._boundingRect; + var size = getSize( elem ); + var offset = { + left: boundingRect.left - thisRect.left - size.marginLeft, + top: boundingRect.top - thisRect.top - size.marginTop, + right: thisRect.right - boundingRect.right - size.marginRight, + bottom: thisRect.bottom - boundingRect.bottom - size.marginBottom + }; + return offset; +}; + +// -------------------------- resize -------------------------- // + +// enable event handlers for listeners +// i.e. resize -> onresize +Outlayer.prototype.handleEvent = function( event ) { + var method = 'on' + event.type; + if ( this[ method ] ) { + this[ method ]( event ); + } +}; + +/** + * Bind layout to window resizing + */ +Outlayer.prototype.bindResize = function() { + // bind just one listener + if ( this.isResizeBound ) { + return; + } + eventie.bind( window, 'resize', this ); + this.isResizeBound = true; +}; + +/** + * Unbind layout to window resizing + */ +Outlayer.prototype.unbindResize = function() { + if ( this.isResizeBound ) { + eventie.unbind( window, 'resize', this ); + } + this.isResizeBound = false; +}; + +// original debounce by John Hann +// http://unscriptable.com/index.php/2009/03/20/debouncing-javascript-methods/ + +// this fires every resize +Outlayer.prototype.onresize = function() { + if ( this.resizeTimeout ) { + clearTimeout( this.resizeTimeout ); + } + + var _this = this; + function delayed() { + _this.resize(); + delete _this.resizeTimeout; + } + + this.resizeTimeout = setTimeout( delayed, 100 ); +}; + +// debounced, layout on resize +Outlayer.prototype.resize = function() { + // don't trigger if size did not change + // or if resize was unbound. See #9 + if ( !this.isResizeBound || !this.needsResizeLayout() ) { + return; + } + + this.layout(); +}; + +/** + * check if layout is needed post layout + * @returns Boolean + */ +Outlayer.prototype.needsResizeLayout = function() { + var size = getSize( this.element ); + // check that this.size and size are there + // IE8 triggers resize on body size change, so they might not be + var hasSizes = this.size && size; + return hasSizes && size.innerWidth !== this.size.innerWidth; +}; + +// -------------------------- methods -------------------------- // + +/** + * add items to Outlayer instance + * @param {Array or NodeList or Element} elems + * @returns {Array} items - Outlayer.Items +**/ +Outlayer.prototype.addItems = function( elems ) { + var items = this._itemize( elems ); + // add items to collection + if ( items.length ) { + this.items = this.items.concat( items ); + } + return items; +}; + +/** + * Layout newly-appended item elements + * @param {Array or NodeList or Element} elems + */ +Outlayer.prototype.appended = function( elems ) { + var items = this.addItems( elems ); + if ( !items.length ) { + return; + } + // layout and reveal just the new items + this.layoutItems( items, true ); + this.reveal( items ); +}; + +/** + * Layout prepended elements + * @param {Array or NodeList or Element} elems + */ +Outlayer.prototype.prepended = function( elems ) { + var items = this._itemize( elems ); + if ( !items.length ) { + return; + } + // add items to beginning of collection + var previousItems = this.items.slice(0); + this.items = items.concat( previousItems ); + // start new layout + this._resetLayout(); + this._manageStamps(); + // layout new stuff without transition + this.layoutItems( items, true ); + this.reveal( items ); + // layout previous items + this.layoutItems( previousItems ); +}; + +/** + * reveal a collection of items + * @param {Array of Outlayer.Items} items + */ +Outlayer.prototype.reveal = function( items ) { + this._emitCompleteOnItems( 'reveal', items ); + + var len = items && items.length; + for ( var i=0; len && i < len; i++ ) { + var item = items[i]; + item.reveal(); + } +}; + +/** + * hide a collection of items + * @param {Array of Outlayer.Items} items + */ +Outlayer.prototype.hide = function( items ) { + this._emitCompleteOnItems( 'hide', items ); + + var len = items && items.length; + for ( var i=0; len && i < len; i++ ) { + var item = items[i]; + item.hide(); + } +}; + +/** + * reveal item elements + * @param {Array}, {Element}, {NodeList} items + */ +Outlayer.prototype.revealItemElements = function( elems ) { + var items = this.getItems( elems ); + this.reveal( items ); +}; + +/** + * hide item elements + * @param {Array}, {Element}, {NodeList} items + */ +Outlayer.prototype.hideItemElements = function( elems ) { + var items = this.getItems( elems ); + this.hide( items ); +}; + +/** + * get Outlayer.Item, given an Element + * @param {Element} elem + * @param {Function} callback + * @returns {Outlayer.Item} item + */ +Outlayer.prototype.getItem = function( elem ) { + // loop through items to get the one that matches + for ( var i=0, len = this.items.length; i < len; i++ ) { + var item = this.items[i]; + if ( item.element === elem ) { + // return item + return item; + } + } +}; + +/** + * get collection of Outlayer.Items, given Elements + * @param {Array} elems + * @returns {Array} items - Outlayer.Items + */ +Outlayer.prototype.getItems = function( elems ) { + elems = utils.makeArray( elems ); + var items = []; + for ( var i=0, len = elems.length; i < len; i++ ) { + var elem = elems[i]; + var item = this.getItem( elem ); + if ( item ) { + items.push( item ); + } + } + + return items; +}; + +/** + * remove element(s) from instance and DOM + * @param {Array or NodeList or Element} elems + */ +Outlayer.prototype.remove = function( elems ) { + var removeItems = this.getItems( elems ); + + this._emitCompleteOnItems( 'remove', removeItems ); + + // bail if no items to remove + if ( !removeItems || !removeItems.length ) { + return; + } + + for ( var i=0, len = removeItems.length; i < len; i++ ) { + var item = removeItems[i]; + item.remove(); + // remove item from collection + utils.removeFrom( this.items, item ); + } +}; + +// ----- destroy ----- // + +// remove and disable Outlayer instance +Outlayer.prototype.destroy = function() { + // clean up dynamic styles + var style = this.element.style; + style.height = ''; + style.position = ''; + style.width = ''; + // destroy items + for ( var i=0, len = this.items.length; i < len; i++ ) { + var item = this.items[i]; + item.destroy(); + } + + this.unbindResize(); + + var id = this.element.outlayerGUID; + delete instances[ id ]; // remove reference to instance by id + delete this.element.outlayerGUID; + // remove data for jQuery + if ( jQuery ) { + jQuery.removeData( this.element, this.constructor.namespace ); + } + +}; + +// -------------------------- data -------------------------- // + +/** + * get Outlayer instance from element + * @param {Element} elem + * @returns {Outlayer} + */ +Outlayer.data = function( elem ) { + elem = utils.getQueryElement( elem ); + var id = elem && elem.outlayerGUID; + return id && instances[ id ]; +}; + + +// -------------------------- create Outlayer class -------------------------- // + +/** + * create a layout class + * @param {String} namespace + */ +Outlayer.create = function( namespace, options ) { + // sub-class Outlayer + function Layout() { + Outlayer.apply( this, arguments ); + } + // inherit Outlayer prototype, use Object.create if there + if ( Object.create ) { + Layout.prototype = Object.create( Outlayer.prototype ); + } else { + utils.extend( Layout.prototype, Outlayer.prototype ); + } + // set contructor, used for namespace and Item + Layout.prototype.constructor = Layout; + + Layout.defaults = utils.extend( {}, Outlayer.defaults ); + // apply new options + utils.extend( Layout.defaults, options ); + // keep prototype.settings for backwards compatibility (Packery v1.2.0) + Layout.prototype.settings = {}; + + Layout.namespace = namespace; + + Layout.data = Outlayer.data; + + // sub-class Item + Layout.Item = function LayoutItem() { + Item.apply( this, arguments ); + }; + + Layout.Item.prototype = new Item(); + + // -------------------------- declarative -------------------------- // + + utils.htmlInit( Layout, namespace ); + + // -------------------------- jQuery bridge -------------------------- // + + // make into jQuery plugin + if ( jQuery && jQuery.bridget ) { + jQuery.bridget( namespace, Layout ); + } + + return Layout; +}; + +// ----- fin ----- // + +// back in global +Outlayer.Item = Item; + +return Outlayer; + +})); + diff --git a/Monitor/wwwroot/assets/plugins/owl.carousel/dist/LICENSE b/Monitor/wwwroot/assets/plugins/owl.carousel/dist/LICENSE new file mode 100644 index 0000000..699398c --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/owl.carousel/dist/LICENSE @@ -0,0 +1,23 @@ +Copyright (c) 2014 Owl +Modified work Copyright 2016 David Deutsch + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/Monitor/wwwroot/assets/plugins/owl.carousel/dist/README.md b/Monitor/wwwroot/assets/plugins/owl.carousel/dist/README.md new file mode 100644 index 0000000..dd9df7a --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/owl.carousel/dist/README.md @@ -0,0 +1,106 @@ +# OwlCarousel2 is currently being transferred to a new owner + +Stay tuned while the new owner sorts through some stuff. (Oh, hi, I'm [David](https://github.com/daviddeutsch)!) + +## Owl Carousel 2 + +Touch enabled [jQuery](https://jquery.com/) plugin that lets you create a beautiful, responsive carousel slider. **To get started, check out https://owlcarousel2.github.io/OwlCarousel2/.** + +## Quick start + +### Install + +This package can be installed with: + +- [npm](https://www.npmjs.com/package/owl.carousel): `npm install --save owl.carousel` +- [bower](http://bower.io/search/?q=owl.carousel): `bower install --save owl.carousel` + +Or download the [latest release](https://github.com/OwlCarousel2/OwlCarousel2/releases). + +### Load + +#### Webpack + +Load the required stylesheet and JS: + +```js +import 'owl.carousel/dist/assets/owl.carousel.css'; +import $ from 'jquery'; +import 'imports?jQuery=jquery!owl.carousel'; +``` + +#### Static HTML + +Put the required stylesheet at the [top](https://developer.yahoo.com/performance/rules.html#css_top) of your markup: + +```html + +``` + +```html + +``` + +**NOTE:** If you want to use the default navigation styles, you will also need to include `owl.theme.default.css`. + + +Put the script at the [bottom](https://developer.yahoo.com/performance/rules.html#js_bottom) of your markup right after jQuery: + +```html + + +``` + +```html + + +``` + +### Usage + +Wrap your items (`div`, `a`, `img`, `span`, `li` etc.) with a container element (`div`, `ul` etc.). Only the class `owl-carousel` is mandatory to apply proper styles: + +```html + +``` +**NOTE:** The `owl-theme` class is optional, but without it, you will need to style navigation features on your own. + + +Call the [plugin](https://learn.jquery.com/plugins/) function and your carousel is ready. + +```javascript +$(document).ready(function(){ + $('.owl-carousel').owlCarousel(); +}); +``` + +## Documentation + +The documentation, included in this repo in the root directory, is built with [Assemble](http://assemble.io/) and publicly available at https://owlcarousel2.github.io/OwlCarousel2/. The documentation may also be run locally. + +## Building + +This package comes with [Grunt](http://gruntjs.com/) and [Bower](http://bower.io/). The following tasks are available: + + * `default` compiles the CSS and JS into `/dist` and builds the doc. + * `dist` compiles the CSS and JS into `/dist` only. + * `watch` watches source files and builds them automatically whenever you save. + * `test` runs [JSHint](http://www.jshint.com/) and [QUnit](http://qunitjs.com/) tests headlessly in [PhantomJS](http://phantomjs.org/). + +To define which plugins are build into the distribution just edit `/_config.json` to fit your needs. + +## Contributing + +Please read [CONTRIBUTING.md](CONTRIBUTING.md). + +## License + +The code and the documentation are released under the [MIT License](LICENSE). diff --git a/Monitor/wwwroot/assets/plugins/owl.carousel/dist/assets/ajax-loader.gif b/Monitor/wwwroot/assets/plugins/owl.carousel/dist/assets/ajax-loader.gif new file mode 100644 index 0000000..d3962f9 Binary files /dev/null and b/Monitor/wwwroot/assets/plugins/owl.carousel/dist/assets/ajax-loader.gif differ diff --git a/Monitor/wwwroot/assets/plugins/owl.carousel/dist/assets/owl.carousel.css b/Monitor/wwwroot/assets/plugins/owl.carousel/dist/assets/owl.carousel.css new file mode 100644 index 0000000..9197373 --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/owl.carousel/dist/assets/owl.carousel.css @@ -0,0 +1,170 @@ +/** + * Owl Carousel v2.2.1 + * Copyright 2013-2017 David Deutsch + * Licensed under () + */ +/* + * Owl Carousel - Core + */ +.owl-carousel { + display: none; + width: 100%; + -webkit-tap-highlight-color: transparent; + /* position relative and z-index fix webkit rendering fonts issue */ + position: relative; + z-index: 1; } + .owl-carousel .owl-stage { + position: relative; + -ms-touch-action: pan-Y; + -moz-backface-visibility: hidden; + /* fix firefox animation glitch */ } + .owl-carousel .owl-stage:after { + content: "."; + display: block; + clear: both; + visibility: hidden; + line-height: 0; + height: 0; } + .owl-carousel .owl-stage-outer { + position: relative; + overflow: hidden; + /* fix for flashing background */ + -webkit-transform: translate3d(0px, 0px, 0px); } + .owl-carousel .owl-wrapper, + .owl-carousel .owl-item { + -webkit-backface-visibility: hidden; + -moz-backface-visibility: hidden; + -ms-backface-visibility: hidden; + -webkit-transform: translate3d(0, 0, 0); + -moz-transform: translate3d(0, 0, 0); + -ms-transform: translate3d(0, 0, 0); } + .owl-carousel .owl-item { + position: relative; + min-height: 1px; + float: left; + -webkit-backface-visibility: hidden; + -webkit-tap-highlight-color: transparent; + -webkit-touch-callout: none; } + .owl-carousel .owl-item img { + display: block; + width: 100%; } + .owl-carousel .owl-nav.disabled, + .owl-carousel .owl-dots.disabled { + display: none; } + .owl-carousel .owl-nav .owl-prev, + .owl-carousel .owl-nav .owl-next, + .owl-carousel .owl-dot { + cursor: pointer; + cursor: hand; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; } + .owl-carousel.owl-loaded { + display: block; } + .owl-carousel.owl-loading { + opacity: 0; + display: block; } + .owl-carousel.owl-hidden { + opacity: 0; } + .owl-carousel.owl-refresh .owl-item { + visibility: hidden; } + .owl-carousel.owl-drag .owl-item { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; } + .owl-carousel.owl-grab { + cursor: move; + cursor: grab; } + .owl-carousel.owl-rtl { + direction: rtl; } + .owl-carousel.owl-rtl .owl-item { + float: right; } + +/* No Js */ +.no-js .owl-carousel { + display: block; } + +/* + * Owl Carousel - Animate Plugin + */ +.owl-carousel .animated { + animation-duration: 1000ms; + animation-fill-mode: both; } + +.owl-carousel .owl-animated-in { + z-index: 0; } + +.owl-carousel .owl-animated-out { + z-index: 1; } + +.owl-carousel .fadeOut { + animation-name: fadeOut; } + +@keyframes fadeOut { + 0% { + opacity: 1; } + 100% { + opacity: 0; } } + +/* + * Owl Carousel - Auto Height Plugin + */ +.owl-height { + transition: height 500ms ease-in-out; } + +/* + * Owl Carousel - Lazy Load Plugin + */ +.owl-carousel .owl-item .owl-lazy { + opacity: 0; + transition: opacity 400ms ease; } + +.owl-carousel .owl-item img.owl-lazy { + transform-style: preserve-3d; } + +/* + * Owl Carousel - Video Plugin + */ +.owl-carousel .owl-video-wrapper { + position: relative; + height: 100%; + background: #000; } + +.owl-carousel .owl-video-play-icon { + position: absolute; + height: 80px; + width: 80px; + left: 50%; + top: 50%; + margin-left: -40px; + margin-top: -40px; + background: url("owl.video.play.png") no-repeat; + cursor: pointer; + z-index: 1; + -webkit-backface-visibility: hidden; + transition: transform 100ms ease; } + +.owl-carousel .owl-video-play-icon:hover { + -ms-transform: scale(1.3, 1.3); + transform: scale(1.3, 1.3); } + +.owl-carousel .owl-video-playing .owl-video-tn, +.owl-carousel .owl-video-playing .owl-video-play-icon { + display: none; } + +.owl-carousel .owl-video-tn { + opacity: 0; + height: 100%; + background-position: center center; + background-repeat: no-repeat; + background-size: contain; + transition: opacity 400ms ease; } + +.owl-carousel .owl-video-frame { + position: relative; + z-index: 1; + height: 100%; + width: 100%; } diff --git a/Monitor/wwwroot/assets/plugins/owl.carousel/dist/assets/owl.carousel.min.css b/Monitor/wwwroot/assets/plugins/owl.carousel/dist/assets/owl.carousel.min.css new file mode 100644 index 0000000..1ece042 --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/owl.carousel/dist/assets/owl.carousel.min.css @@ -0,0 +1,6 @@ +/** + * Owl Carousel v2.2.1 + * Copyright 2013-2017 David Deutsch + * Licensed under () + */ +.owl-carousel,.owl-carousel .owl-item{-webkit-tap-highlight-color:transparent;position:relative}.owl-carousel{display:none;width:100%;z-index:1}.owl-carousel .owl-stage{position:relative;-ms-touch-action:pan-Y;-moz-backface-visibility:hidden}.owl-carousel .owl-stage:after{content:".";display:block;clear:both;visibility:hidden;line-height:0;height:0}.owl-carousel .owl-stage-outer{position:relative;overflow:hidden;-webkit-transform:translate3d(0,0,0)}.owl-carousel .owl-item,.owl-carousel .owl-wrapper{-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0)}.owl-carousel .owl-item{min-height:1px;float:left;-webkit-backface-visibility:hidden;-webkit-touch-callout:none}.owl-carousel .owl-item img{display:block;width:100%}.owl-carousel .owl-dots.disabled,.owl-carousel .owl-nav.disabled{display:none}.no-js .owl-carousel,.owl-carousel.owl-loaded{display:block}.owl-carousel .owl-dot,.owl-carousel .owl-nav .owl-next,.owl-carousel .owl-nav .owl-prev{cursor:pointer;cursor:hand;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.owl-carousel.owl-loading{opacity:0;display:block}.owl-carousel.owl-hidden{opacity:0}.owl-carousel.owl-refresh .owl-item{visibility:hidden}.owl-carousel.owl-drag .owl-item{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.owl-carousel.owl-grab{cursor:move;cursor:grab}.owl-carousel.owl-rtl{direction:rtl}.owl-carousel.owl-rtl .owl-item{float:right}.owl-carousel .animated{animation-duration:1s;animation-fill-mode:both}.owl-carousel .owl-animated-in{z-index:0}.owl-carousel .owl-animated-out{z-index:1}.owl-carousel .fadeOut{animation-name:fadeOut}@keyframes fadeOut{0%{opacity:1}100%{opacity:0}}.owl-height{transition:height .5s ease-in-out}.owl-carousel .owl-item .owl-lazy{opacity:0;transition:opacity .4s ease}.owl-carousel .owl-item img.owl-lazy{transform-style:preserve-3d}.owl-carousel .owl-video-wrapper{position:relative;height:100%;background:#000}.owl-carousel .owl-video-play-icon{position:absolute;height:80px;width:80px;left:50%;top:50%;margin-left:-40px;margin-top:-40px;background:url(owl.video.play.png) no-repeat;cursor:pointer;z-index:1;-webkit-backface-visibility:hidden;transition:transform .1s ease}.owl-carousel .owl-video-play-icon:hover{-ms-transform:scale(1.3,1.3);transform:scale(1.3,1.3)}.owl-carousel .owl-video-playing .owl-video-play-icon,.owl-carousel .owl-video-playing .owl-video-tn{display:none}.owl-carousel .owl-video-tn{opacity:0;height:100%;background-position:center center;background-repeat:no-repeat;background-size:contain;transition:opacity .4s ease}.owl-carousel .owl-video-frame{position:relative;z-index:1;height:100%;width:100%} \ No newline at end of file diff --git a/Monitor/wwwroot/assets/plugins/owl.carousel/dist/assets/owl.theme.default.css b/Monitor/wwwroot/assets/plugins/owl.carousel/dist/assets/owl.theme.default.css new file mode 100644 index 0000000..413b8a4 --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/owl.carousel/dist/assets/owl.theme.default.css @@ -0,0 +1,50 @@ +/** + * Owl Carousel v2.2.1 + * Copyright 2013-2017 David Deutsch + * Licensed under () + */ +/* + * Default theme - Owl Carousel CSS File + */ +.owl-theme .owl-nav { + margin-top: 10px; + text-align: center; + -webkit-tap-highlight-color: transparent; } + .owl-theme .owl-nav [class*='owl-'] { + color: #FFF; + font-size: 14px; + margin: 5px; + padding: 4px 7px; + background: #D6D6D6; + display: inline-block; + cursor: pointer; + border-radius: 3px; } + .owl-theme .owl-nav [class*='owl-']:hover { + background: #869791; + color: #FFF; + text-decoration: none; } + .owl-theme .owl-nav .disabled { + opacity: 0.5; + cursor: default; } + +.owl-theme .owl-nav.disabled + .owl-dots { + margin-top: 10px; } + +.owl-theme .owl-dots { + text-align: center; + -webkit-tap-highlight-color: transparent; } + .owl-theme .owl-dots .owl-dot { + display: inline-block; + zoom: 1; + *display: inline; } + .owl-theme .owl-dots .owl-dot span { + width: 10px; + height: 10px; + margin: 5px 7px; + background: #D6D6D6; + display: block; + -webkit-backface-visibility: visible; + transition: opacity 200ms ease; + border-radius: 30px; } + .owl-theme .owl-dots .owl-dot.active span, .owl-theme .owl-dots .owl-dot:hover span { + background: #869791; } diff --git a/Monitor/wwwroot/assets/plugins/owl.carousel/dist/assets/owl.theme.default.min.css b/Monitor/wwwroot/assets/plugins/owl.carousel/dist/assets/owl.theme.default.min.css new file mode 100644 index 0000000..5983603 --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/owl.carousel/dist/assets/owl.theme.default.min.css @@ -0,0 +1,6 @@ +/** + * Owl Carousel v2.2.1 + * Copyright 2013-2017 David Deutsch + * Licensed under () + */ +.owl-theme .owl-dots,.owl-theme .owl-nav{text-align:center;-webkit-tap-highlight-color:transparent}.owl-theme .owl-nav{margin-top:10px}.owl-theme .owl-nav [class*=owl-]{color:#FFF;font-size:14px;margin:5px;padding:4px 7px;background:#D6D6D6;display:inline-block;cursor:pointer;border-radius:3px}.owl-theme .owl-nav [class*=owl-]:hover{background:#869791;color:#FFF;text-decoration:none}.owl-theme .owl-nav .disabled{opacity:.5;cursor:default}.owl-theme .owl-nav.disabled+.owl-dots{margin-top:10px}.owl-theme .owl-dots .owl-dot{display:inline-block;zoom:1}.owl-theme .owl-dots .owl-dot span{width:10px;height:10px;margin:5px 7px;background:#D6D6D6;display:block;-webkit-backface-visibility:visible;transition:opacity .2s ease;border-radius:30px}.owl-theme .owl-dots .owl-dot.active span,.owl-theme .owl-dots .owl-dot:hover span{background:#869791} \ No newline at end of file diff --git a/Monitor/wwwroot/assets/plugins/owl.carousel/dist/assets/owl.theme.green.css b/Monitor/wwwroot/assets/plugins/owl.carousel/dist/assets/owl.theme.green.css new file mode 100644 index 0000000..74b25ca --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/owl.carousel/dist/assets/owl.theme.green.css @@ -0,0 +1,50 @@ +/** + * Owl Carousel v2.2.1 + * Copyright 2013-2017 David Deutsch + * Licensed under () + */ +/* + * Green theme - Owl Carousel CSS File + */ +.owl-theme .owl-nav { + margin-top: 10px; + text-align: center; + -webkit-tap-highlight-color: transparent; } + .owl-theme .owl-nav [class*='owl-'] { + color: #FFF; + font-size: 14px; + margin: 5px; + padding: 4px 7px; + background: #D6D6D6; + display: inline-block; + cursor: pointer; + border-radius: 3px; } + .owl-theme .owl-nav [class*='owl-']:hover { + background: #4DC7A0; + color: #FFF; + text-decoration: none; } + .owl-theme .owl-nav .disabled { + opacity: 0.5; + cursor: default; } + +.owl-theme .owl-nav.disabled + .owl-dots { + margin-top: 10px; } + +.owl-theme .owl-dots { + text-align: center; + -webkit-tap-highlight-color: transparent; } + .owl-theme .owl-dots .owl-dot { + display: inline-block; + zoom: 1; + *display: inline; } + .owl-theme .owl-dots .owl-dot span { + width: 10px; + height: 10px; + margin: 5px 7px; + background: #D6D6D6; + display: block; + -webkit-backface-visibility: visible; + transition: opacity 200ms ease; + border-radius: 30px; } + .owl-theme .owl-dots .owl-dot.active span, .owl-theme .owl-dots .owl-dot:hover span { + background: #4DC7A0; } diff --git a/Monitor/wwwroot/assets/plugins/owl.carousel/dist/assets/owl.theme.green.min.css b/Monitor/wwwroot/assets/plugins/owl.carousel/dist/assets/owl.theme.green.min.css new file mode 100644 index 0000000..1410c68 --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/owl.carousel/dist/assets/owl.theme.green.min.css @@ -0,0 +1,6 @@ +/** + * Owl Carousel v2.2.1 + * Copyright 2013-2017 David Deutsch + * Licensed under () + */ +.owl-theme .owl-dots,.owl-theme .owl-nav{text-align:center;-webkit-tap-highlight-color:transparent}.owl-theme .owl-nav{margin-top:10px}.owl-theme .owl-nav [class*=owl-]{color:#FFF;font-size:14px;margin:5px;padding:4px 7px;background:#D6D6D6;display:inline-block;cursor:pointer;border-radius:3px}.owl-theme .owl-nav [class*=owl-]:hover{background:#4DC7A0;color:#FFF;text-decoration:none}.owl-theme .owl-nav .disabled{opacity:.5;cursor:default}.owl-theme .owl-nav.disabled+.owl-dots{margin-top:10px}.owl-theme .owl-dots .owl-dot{display:inline-block;zoom:1}.owl-theme .owl-dots .owl-dot span{width:10px;height:10px;margin:5px 7px;background:#D6D6D6;display:block;-webkit-backface-visibility:visible;transition:opacity .2s ease;border-radius:30px}.owl-theme .owl-dots .owl-dot.active span,.owl-theme .owl-dots .owl-dot:hover span{background:#4DC7A0} \ No newline at end of file diff --git a/Monitor/wwwroot/assets/plugins/owl.carousel/dist/assets/owl.video.play.png b/Monitor/wwwroot/assets/plugins/owl.carousel/dist/assets/owl.video.play.png new file mode 100644 index 0000000..5d0218d Binary files /dev/null and b/Monitor/wwwroot/assets/plugins/owl.carousel/dist/assets/owl.video.play.png differ diff --git a/Monitor/wwwroot/assets/plugins/owl.carousel/dist/owl.carousel.js b/Monitor/wwwroot/assets/plugins/owl.carousel/dist/owl.carousel.js new file mode 100644 index 0000000..c1d3ea7 --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/owl.carousel/dist/owl.carousel.js @@ -0,0 +1,3275 @@ +/** + * Owl Carousel v2.2.1 + * Copyright 2013-2017 David Deutsch + * Licensed under () + */ +/** + * Owl carousel + * @version 2.1.6 + * @author Bartosz Wojciechowski + * @author David Deutsch + * @license The MIT License (MIT) + * @todo Lazy Load Icon + * @todo prevent animationend bubling + * @todo itemsScaleUp + * @todo Test Zepto + * @todo stagePadding calculate wrong active classes + */ +;(function($, window, document, undefined) { + + /** + * Creates a carousel. + * @class The Owl Carousel. + * @public + * @param {HTMLElement|jQuery} element - The element to create the carousel for. + * @param {Object} [options] - The options + */ + function Owl(element, options) { + + /** + * Current settings for the carousel. + * @public + */ + this.settings = null; + + /** + * Current options set by the caller including defaults. + * @public + */ + this.options = $.extend({}, Owl.Defaults, options); + + /** + * Plugin element. + * @public + */ + this.$element = $(element); + + /** + * Proxied event handlers. + * @protected + */ + this._handlers = {}; + + /** + * References to the running plugins of this carousel. + * @protected + */ + this._plugins = {}; + + /** + * Currently suppressed events to prevent them from beeing retriggered. + * @protected + */ + this._supress = {}; + + /** + * Absolute current position. + * @protected + */ + this._current = null; + + /** + * Animation speed in milliseconds. + * @protected + */ + this._speed = null; + + /** + * Coordinates of all items in pixel. + * @todo The name of this member is missleading. + * @protected + */ + this._coordinates = []; + + /** + * Current breakpoint. + * @todo Real media queries would be nice. + * @protected + */ + this._breakpoint = null; + + /** + * Current width of the plugin element. + */ + this._width = null; + + /** + * All real items. + * @protected + */ + this._items = []; + + /** + * All cloned items. + * @protected + */ + this._clones = []; + + /** + * Merge values of all items. + * @todo Maybe this could be part of a plugin. + * @protected + */ + this._mergers = []; + + /** + * Widths of all items. + */ + this._widths = []; + + /** + * Invalidated parts within the update process. + * @protected + */ + this._invalidated = {}; + + /** + * Ordered list of workers for the update process. + * @protected + */ + this._pipe = []; + + /** + * Current state information for the drag operation. + * @todo #261 + * @protected + */ + this._drag = { + time: null, + target: null, + pointer: null, + stage: { + start: null, + current: null + }, + direction: null + }; + + /** + * Current state information and their tags. + * @type {Object} + * @protected + */ + this._states = { + current: {}, + tags: { + 'initializing': [ 'busy' ], + 'animating': [ 'busy' ], + 'dragging': [ 'interacting' ] + } + }; + + $.each([ 'onResize', 'onThrottledResize' ], $.proxy(function(i, handler) { + this._handlers[handler] = $.proxy(this[handler], this); + }, this)); + + $.each(Owl.Plugins, $.proxy(function(key, plugin) { + this._plugins[key.charAt(0).toLowerCase() + key.slice(1)] + = new plugin(this); + }, this)); + + $.each(Owl.Workers, $.proxy(function(priority, worker) { + this._pipe.push({ + 'filter': worker.filter, + 'run': $.proxy(worker.run, this) + }); + }, this)); + + this.setup(); + this.initialize(); + } + + /** + * Default options for the carousel. + * @public + */ + Owl.Defaults = { + items: 3, + loop: false, + center: false, + rewind: false, + + mouseDrag: true, + touchDrag: true, + pullDrag: true, + freeDrag: false, + + margin: 0, + stagePadding: 0, + + merge: false, + mergeFit: true, + autoWidth: false, + + startPosition: 0, + rtl: false, + + smartSpeed: 250, + fluidSpeed: false, + dragEndSpeed: false, + + responsive: {}, + responsiveRefreshRate: 200, + responsiveBaseElement: window, + + fallbackEasing: 'swing', + + info: false, + + nestedItemSelector: false, + itemElement: 'div', + stageElement: 'div', + + refreshClass: 'owl-refresh', + loadedClass: 'owl-loaded', + loadingClass: 'owl-loading', + rtlClass: 'owl-rtl', + responsiveClass: 'owl-responsive', + dragClass: 'owl-drag', + itemClass: 'owl-item', + stageClass: 'owl-stage', + stageOuterClass: 'owl-stage-outer', + grabClass: 'owl-grab' + }; + + /** + * Enumeration for width. + * @public + * @readonly + * @enum {String} + */ + Owl.Width = { + Default: 'default', + Inner: 'inner', + Outer: 'outer' + }; + + /** + * Enumeration for types. + * @public + * @readonly + * @enum {String} + */ + Owl.Type = { + Event: 'event', + State: 'state' + }; + + /** + * Contains all registered plugins. + * @public + */ + Owl.Plugins = {}; + + /** + * List of workers involved in the update process. + */ + Owl.Workers = [ { + filter: [ 'width', 'settings' ], + run: function() { + this._width = this.$element.width(); + } + }, { + filter: [ 'width', 'items', 'settings' ], + run: function(cache) { + cache.current = this._items && this._items[this.relative(this._current)]; + } + }, { + filter: [ 'items', 'settings' ], + run: function() { + this.$stage.children('.cloned').remove(); + } + }, { + filter: [ 'width', 'items', 'settings' ], + run: function(cache) { + var margin = this.settings.margin || '', + grid = !this.settings.autoWidth, + rtl = this.settings.rtl, + css = { + 'width': 'auto', + 'margin-left': rtl ? margin : '', + 'margin-right': rtl ? '' : margin + }; + + !grid && this.$stage.children().css(css); + + cache.css = css; + } + }, { + filter: [ 'width', 'items', 'settings' ], + run: function(cache) { + var width = (this.width() / this.settings.items).toFixed(3) - this.settings.margin, + merge = null, + iterator = this._items.length, + grid = !this.settings.autoWidth, + widths = []; + + cache.items = { + merge: false, + width: width + }; + + while (iterator--) { + merge = this._mergers[iterator]; + merge = this.settings.mergeFit && Math.min(merge, this.settings.items) || merge; + + cache.items.merge = merge > 1 || cache.items.merge; + + widths[iterator] = !grid ? this._items[iterator].width() : width * merge; + } + + this._widths = widths; + } + }, { + filter: [ 'items', 'settings' ], + run: function() { + var clones = [], + items = this._items, + settings = this.settings, + // TODO: Should be computed from number of min width items in stage + view = Math.max(settings.items * 2, 4), + size = Math.ceil(items.length / 2) * 2, + repeat = settings.loop && items.length ? settings.rewind ? view : Math.max(view, size) : 0, + append = '', + prepend = ''; + + repeat /= 2; + + while (repeat--) { + // Switch to only using appended clones + clones.push(this.normalize(clones.length / 2, true)); + append = append + items[clones[clones.length - 1]][0].outerHTML; + clones.push(this.normalize(items.length - 1 - (clones.length - 1) / 2, true)); + prepend = items[clones[clones.length - 1]][0].outerHTML + prepend; + } + + this._clones = clones; + + $(append).addClass('cloned').appendTo(this.$stage); + $(prepend).addClass('cloned').prependTo(this.$stage); + } + }, { + filter: [ 'width', 'items', 'settings' ], + run: function() { + var rtl = this.settings.rtl ? 1 : -1, + size = this._clones.length + this._items.length, + iterator = -1, + previous = 0, + current = 0, + coordinates = []; + + while (++iterator < size) { + previous = coordinates[iterator - 1] || 0; + current = this._widths[this.relative(iterator)] + this.settings.margin; + coordinates.push(previous + current * rtl); + } + + this._coordinates = coordinates; + } + }, { + filter: [ 'width', 'items', 'settings' ], + run: function() { + var padding = this.settings.stagePadding, + coordinates = this._coordinates, + css = { + 'width': Math.ceil(Math.abs(coordinates[coordinates.length - 1])) + padding * 2, + 'padding-left': padding || '', + 'padding-right': padding || '' + }; + + this.$stage.css(css); + } + }, { + filter: [ 'width', 'items', 'settings' ], + run: function(cache) { + var iterator = this._coordinates.length, + grid = !this.settings.autoWidth, + items = this.$stage.children(); + + if (grid && cache.items.merge) { + while (iterator--) { + cache.css.width = this._widths[this.relative(iterator)]; + items.eq(iterator).css(cache.css); + } + } else if (grid) { + cache.css.width = cache.items.width; + items.css(cache.css); + } + } + }, { + filter: [ 'items' ], + run: function() { + this._coordinates.length < 1 && this.$stage.removeAttr('style'); + } + }, { + filter: [ 'width', 'items', 'settings' ], + run: function(cache) { + cache.current = cache.current ? this.$stage.children().index(cache.current) : 0; + cache.current = Math.max(this.minimum(), Math.min(this.maximum(), cache.current)); + this.reset(cache.current); + } + }, { + filter: [ 'position' ], + run: function() { + this.animate(this.coordinates(this._current)); + } + }, { + filter: [ 'width', 'position', 'items', 'settings' ], + run: function() { + var rtl = this.settings.rtl ? 1 : -1, + padding = this.settings.stagePadding * 2, + begin = this.coordinates(this.current()) + padding, + end = begin + this.width() * rtl, + inner, outer, matches = [], i, n; + + for (i = 0, n = this._coordinates.length; i < n; i++) { + inner = this._coordinates[i - 1] || 0; + outer = Math.abs(this._coordinates[i]) + padding * rtl; + + if ((this.op(inner, '<=', begin) && (this.op(inner, '>', end))) + || (this.op(outer, '<', begin) && this.op(outer, '>', end))) { + matches.push(i); + } + } + + this.$stage.children('.active').removeClass('active'); + this.$stage.children(':eq(' + matches.join('), :eq(') + ')').addClass('active'); + + if (this.settings.center) { + this.$stage.children('.center').removeClass('center'); + this.$stage.children().eq(this.current()).addClass('center'); + } + } + } ]; + + /** + * Initializes the carousel. + * @protected + */ + Owl.prototype.initialize = function() { + this.enter('initializing'); + this.trigger('initialize'); + + this.$element.toggleClass(this.settings.rtlClass, this.settings.rtl); + + if (this.settings.autoWidth && !this.is('pre-loading')) { + var imgs, nestedSelector, width; + imgs = this.$element.find('img'); + nestedSelector = this.settings.nestedItemSelector ? '.' + this.settings.nestedItemSelector : undefined; + width = this.$element.children(nestedSelector).width(); + + if (imgs.length && width <= 0) { + this.preloadAutoWidthImages(imgs); + } + } + + this.$element.addClass(this.options.loadingClass); + + // create stage + this.$stage = $('<' + this.settings.stageElement + ' class="' + this.settings.stageClass + '"/>') + .wrap('
          '); + + // append stage + this.$element.append(this.$stage.parent()); + + // append content + this.replace(this.$element.children().not(this.$stage.parent())); + + // check visibility + if (this.$element.is(':visible')) { + // update view + this.refresh(); + } else { + // invalidate width + this.invalidate('width'); + } + + this.$element + .removeClass(this.options.loadingClass) + .addClass(this.options.loadedClass); + + // register event handlers + this.registerEventHandlers(); + + this.leave('initializing'); + this.trigger('initialized'); + }; + + /** + * Setups the current settings. + * @todo Remove responsive classes. Why should adaptive designs be brought into IE8? + * @todo Support for media queries by using `matchMedia` would be nice. + * @public + */ + Owl.prototype.setup = function() { + var viewport = this.viewport(), + overwrites = this.options.responsive, + match = -1, + settings = null; + + if (!overwrites) { + settings = $.extend({}, this.options); + } else { + $.each(overwrites, function(breakpoint) { + if (breakpoint <= viewport && breakpoint > match) { + match = Number(breakpoint); + } + }); + + settings = $.extend({}, this.options, overwrites[match]); + if (typeof settings.stagePadding === 'function') { + settings.stagePadding = settings.stagePadding(); + } + delete settings.responsive; + + // responsive class + if (settings.responsiveClass) { + this.$element.attr('class', + this.$element.attr('class').replace(new RegExp('(' + this.options.responsiveClass + '-)\\S+\\s', 'g'), '$1' + match) + ); + } + } + + this.trigger('change', { property: { name: 'settings', value: settings } }); + this._breakpoint = match; + this.settings = settings; + this.invalidate('settings'); + this.trigger('changed', { property: { name: 'settings', value: this.settings } }); + }; + + /** + * Updates option logic if necessery. + * @protected + */ + Owl.prototype.optionsLogic = function() { + if (this.settings.autoWidth) { + this.settings.stagePadding = false; + this.settings.merge = false; + } + }; + + /** + * Prepares an item before add. + * @todo Rename event parameter `content` to `item`. + * @protected + * @returns {jQuery|HTMLElement} - The item container. + */ + Owl.prototype.prepare = function(item) { + var event = this.trigger('prepare', { content: item }); + + if (!event.data) { + event.data = $('<' + this.settings.itemElement + '/>') + .addClass(this.options.itemClass).append(item) + } + + this.trigger('prepared', { content: event.data }); + + return event.data; + }; + + /** + * Updates the view. + * @public + */ + Owl.prototype.update = function() { + var i = 0, + n = this._pipe.length, + filter = $.proxy(function(p) { return this[p] }, this._invalidated), + cache = {}; + + while (i < n) { + if (this._invalidated.all || $.grep(this._pipe[i].filter, filter).length > 0) { + this._pipe[i].run(cache); + } + i++; + } + + this._invalidated = {}; + + !this.is('valid') && this.enter('valid'); + }; + + /** + * Gets the width of the view. + * @public + * @param {Owl.Width} [dimension=Owl.Width.Default] - The dimension to return. + * @returns {Number} - The width of the view in pixel. + */ + Owl.prototype.width = function(dimension) { + dimension = dimension || Owl.Width.Default; + switch (dimension) { + case Owl.Width.Inner: + case Owl.Width.Outer: + return this._width; + default: + return this._width - this.settings.stagePadding * 2 + this.settings.margin; + } + }; + + /** + * Refreshes the carousel primarily for adaptive purposes. + * @public + */ + Owl.prototype.refresh = function() { + this.enter('refreshing'); + this.trigger('refresh'); + + this.setup(); + + this.optionsLogic(); + + this.$element.addClass(this.options.refreshClass); + + this.update(); + + this.$element.removeClass(this.options.refreshClass); + + this.leave('refreshing'); + this.trigger('refreshed'); + }; + + /** + * Checks window `resize` event. + * @protected + */ + Owl.prototype.onThrottledResize = function() { + window.clearTimeout(this.resizeTimer); + this.resizeTimer = window.setTimeout(this._handlers.onResize, this.settings.responsiveRefreshRate); + }; + + /** + * Checks window `resize` event. + * @protected + */ + Owl.prototype.onResize = function() { + if (!this._items.length) { + return false; + } + + if (this._width === this.$element.width()) { + return false; + } + + if (!this.$element.is(':visible')) { + return false; + } + + this.enter('resizing'); + + if (this.trigger('resize').isDefaultPrevented()) { + this.leave('resizing'); + return false; + } + + this.invalidate('width'); + + this.refresh(); + + this.leave('resizing'); + this.trigger('resized'); + }; + + /** + * Registers event handlers. + * @todo Check `msPointerEnabled` + * @todo #261 + * @protected + */ + Owl.prototype.registerEventHandlers = function() { + if ($.support.transition) { + this.$stage.on($.support.transition.end + '.owl.core', $.proxy(this.onTransitionEnd, this)); + } + + if (this.settings.responsive !== false) { + this.on(window, 'resize', this._handlers.onThrottledResize); + } + + if (this.settings.mouseDrag) { + this.$element.addClass(this.options.dragClass); + this.$stage.on('mousedown.owl.core', $.proxy(this.onDragStart, this)); + this.$stage.on('dragstart.owl.core selectstart.owl.core', function() { return false }); + } + + if (this.settings.touchDrag){ + this.$stage.on('touchstart.owl.core', $.proxy(this.onDragStart, this)); + this.$stage.on('touchcancel.owl.core', $.proxy(this.onDragEnd, this)); + } + }; + + /** + * Handles `touchstart` and `mousedown` events. + * @todo Horizontal swipe threshold as option + * @todo #261 + * @protected + * @param {Event} event - The event arguments. + */ + Owl.prototype.onDragStart = function(event) { + var stage = null; + + if (event.which === 3) { + return; + } + + if ($.support.transform) { + stage = this.$stage.css('transform').replace(/.*\(|\)| /g, '').split(','); + stage = { + x: stage[stage.length === 16 ? 12 : 4], + y: stage[stage.length === 16 ? 13 : 5] + }; + } else { + stage = this.$stage.position(); + stage = { + x: this.settings.rtl ? + stage.left + this.$stage.width() - this.width() + this.settings.margin : + stage.left, + y: stage.top + }; + } + + if (this.is('animating')) { + $.support.transform ? this.animate(stage.x) : this.$stage.stop() + this.invalidate('position'); + } + + this.$element.toggleClass(this.options.grabClass, event.type === 'mousedown'); + + this.speed(0); + + this._drag.time = new Date().getTime(); + this._drag.target = $(event.target); + this._drag.stage.start = stage; + this._drag.stage.current = stage; + this._drag.pointer = this.pointer(event); + + $(document).on('mouseup.owl.core touchend.owl.core', $.proxy(this.onDragEnd, this)); + + $(document).one('mousemove.owl.core touchmove.owl.core', $.proxy(function(event) { + var delta = this.difference(this._drag.pointer, this.pointer(event)); + + $(document).on('mousemove.owl.core touchmove.owl.core', $.proxy(this.onDragMove, this)); + + if (Math.abs(delta.x) < Math.abs(delta.y) && this.is('valid')) { + return; + } + + event.preventDefault(); + + this.enter('dragging'); + this.trigger('drag'); + }, this)); + }; + + /** + * Handles the `touchmove` and `mousemove` events. + * @todo #261 + * @protected + * @param {Event} event - The event arguments. + */ + Owl.prototype.onDragMove = function(event) { + var minimum = null, + maximum = null, + pull = null, + delta = this.difference(this._drag.pointer, this.pointer(event)), + stage = this.difference(this._drag.stage.start, delta); + + if (!this.is('dragging')) { + return; + } + + event.preventDefault(); + + if (this.settings.loop) { + minimum = this.coordinates(this.minimum()); + maximum = this.coordinates(this.maximum() + 1) - minimum; + stage.x = (((stage.x - minimum) % maximum + maximum) % maximum) + minimum; + } else { + minimum = this.settings.rtl ? this.coordinates(this.maximum()) : this.coordinates(this.minimum()); + maximum = this.settings.rtl ? this.coordinates(this.minimum()) : this.coordinates(this.maximum()); + pull = this.settings.pullDrag ? -1 * delta.x / 5 : 0; + stage.x = Math.max(Math.min(stage.x, minimum + pull), maximum + pull); + } + + this._drag.stage.current = stage; + + this.animate(stage.x); + }; + + /** + * Handles the `touchend` and `mouseup` events. + * @todo #261 + * @todo Threshold for click event + * @protected + * @param {Event} event - The event arguments. + */ + Owl.prototype.onDragEnd = function(event) { + var delta = this.difference(this._drag.pointer, this.pointer(event)), + stage = this._drag.stage.current, + direction = delta.x > 0 ^ this.settings.rtl ? 'left' : 'right'; + + $(document).off('.owl.core'); + + this.$element.removeClass(this.options.grabClass); + + if (delta.x !== 0 && this.is('dragging') || !this.is('valid')) { + this.speed(this.settings.dragEndSpeed || this.settings.smartSpeed); + this.current(this.closest(stage.x, delta.x !== 0 ? direction : this._drag.direction)); + this.invalidate('position'); + this.update(); + + this._drag.direction = direction; + + if (Math.abs(delta.x) > 3 || new Date().getTime() - this._drag.time > 300) { + this._drag.target.one('click.owl.core', function() { return false; }); + } + } + + if (!this.is('dragging')) { + return; + } + + this.leave('dragging'); + this.trigger('dragged'); + }; + + /** + * Gets absolute position of the closest item for a coordinate. + * @todo Setting `freeDrag` makes `closest` not reusable. See #165. + * @protected + * @param {Number} coordinate - The coordinate in pixel. + * @param {String} direction - The direction to check for the closest item. Ether `left` or `right`. + * @return {Number} - The absolute position of the closest item. + */ + Owl.prototype.closest = function(coordinate, direction) { + var position = -1, + pull = 30, + width = this.width(), + coordinates = this.coordinates(); + + if (!this.settings.freeDrag) { + // check closest item + $.each(coordinates, $.proxy(function(index, value) { + // on a left pull, check on current index + if (direction === 'left' && coordinate > value - pull && coordinate < value + pull) { + position = index; + // on a right pull, check on previous index + // to do so, subtract width from value and set position = index + 1 + } else if (direction === 'right' && coordinate > value - width - pull && coordinate < value - width + pull) { + position = index + 1; + } else if (this.op(coordinate, '<', value) + && this.op(coordinate, '>', coordinates[index + 1] || value - width)) { + position = direction === 'left' ? index + 1 : index; + } + return position === -1; + }, this)); + } + + if (!this.settings.loop) { + // non loop boundries + if (this.op(coordinate, '>', coordinates[this.minimum()])) { + position = coordinate = this.minimum(); + } else if (this.op(coordinate, '<', coordinates[this.maximum()])) { + position = coordinate = this.maximum(); + } + } + + return position; + }; + + /** + * Animates the stage. + * @todo #270 + * @public + * @param {Number} coordinate - The coordinate in pixels. + */ + Owl.prototype.animate = function(coordinate) { + var animate = this.speed() > 0; + + this.is('animating') && this.onTransitionEnd(); + + if (animate) { + this.enter('animating'); + this.trigger('translate'); + } + + if ($.support.transform3d && $.support.transition) { + this.$stage.css({ + transform: 'translate3d(' + coordinate + 'px,0px,0px)', + transition: (this.speed() / 1000) + 's' + }); + } else if (animate) { + this.$stage.animate({ + left: coordinate + 'px' + }, this.speed(), this.settings.fallbackEasing, $.proxy(this.onTransitionEnd, this)); + } else { + this.$stage.css({ + left: coordinate + 'px' + }); + } + }; + + /** + * Checks whether the carousel is in a specific state or not. + * @param {String} state - The state to check. + * @returns {Boolean} - The flag which indicates if the carousel is busy. + */ + Owl.prototype.is = function(state) { + return this._states.current[state] && this._states.current[state] > 0; + }; + + /** + * Sets the absolute position of the current item. + * @public + * @param {Number} [position] - The new absolute position or nothing to leave it unchanged. + * @returns {Number} - The absolute position of the current item. + */ + Owl.prototype.current = function(position) { + if (position === undefined) { + return this._current; + } + + if (this._items.length === 0) { + return undefined; + } + + position = this.normalize(position); + + if (this._current !== position) { + var event = this.trigger('change', { property: { name: 'position', value: position } }); + + if (event.data !== undefined) { + position = this.normalize(event.data); + } + + this._current = position; + + this.invalidate('position'); + + this.trigger('changed', { property: { name: 'position', value: this._current } }); + } + + return this._current; + }; + + /** + * Invalidates the given part of the update routine. + * @param {String} [part] - The part to invalidate. + * @returns {Array.} - The invalidated parts. + */ + Owl.prototype.invalidate = function(part) { + if ($.type(part) === 'string') { + this._invalidated[part] = true; + this.is('valid') && this.leave('valid'); + } + return $.map(this._invalidated, function(v, i) { return i }); + }; + + /** + * Resets the absolute position of the current item. + * @public + * @param {Number} position - The absolute position of the new item. + */ + Owl.prototype.reset = function(position) { + position = this.normalize(position); + + if (position === undefined) { + return; + } + + this._speed = 0; + this._current = position; + + this.suppress([ 'translate', 'translated' ]); + + this.animate(this.coordinates(position)); + + this.release([ 'translate', 'translated' ]); + }; + + /** + * Normalizes an absolute or a relative position of an item. + * @public + * @param {Number} position - The absolute or relative position to normalize. + * @param {Boolean} [relative=false] - Whether the given position is relative or not. + * @returns {Number} - The normalized position. + */ + Owl.prototype.normalize = function(position, relative) { + var n = this._items.length, + m = relative ? 0 : this._clones.length; + + if (!this.isNumeric(position) || n < 1) { + position = undefined; + } else if (position < 0 || position >= n + m) { + position = ((position - m / 2) % n + n) % n + m / 2; + } + + return position; + }; + + /** + * Converts an absolute position of an item into a relative one. + * @public + * @param {Number} position - The absolute position to convert. + * @returns {Number} - The converted position. + */ + Owl.prototype.relative = function(position) { + position -= this._clones.length / 2; + return this.normalize(position, true); + }; + + /** + * Gets the maximum position for the current item. + * @public + * @param {Boolean} [relative=false] - Whether to return an absolute position or a relative position. + * @returns {Number} + */ + Owl.prototype.maximum = function(relative) { + var settings = this.settings, + maximum = this._coordinates.length, + iterator, + reciprocalItemsWidth, + elementWidth; + + if (settings.loop) { + maximum = this._clones.length / 2 + this._items.length - 1; + } else if (settings.autoWidth || settings.merge) { + iterator = this._items.length; + reciprocalItemsWidth = this._items[--iterator].width(); + elementWidth = this.$element.width(); + while (iterator--) { + reciprocalItemsWidth += this._items[iterator].width() + this.settings.margin; + if (reciprocalItemsWidth > elementWidth) { + break; + } + } + maximum = iterator + 1; + } else if (settings.center) { + maximum = this._items.length - 1; + } else { + maximum = this._items.length - settings.items; + } + + if (relative) { + maximum -= this._clones.length / 2; + } + + return Math.max(maximum, 0); + }; + + /** + * Gets the minimum position for the current item. + * @public + * @param {Boolean} [relative=false] - Whether to return an absolute position or a relative position. + * @returns {Number} + */ + Owl.prototype.minimum = function(relative) { + return relative ? 0 : this._clones.length / 2; + }; + + /** + * Gets an item at the specified relative position. + * @public + * @param {Number} [position] - The relative position of the item. + * @return {jQuery|Array.} - The item at the given position or all items if no position was given. + */ + Owl.prototype.items = function(position) { + if (position === undefined) { + return this._items.slice(); + } + + position = this.normalize(position, true); + return this._items[position]; + }; + + /** + * Gets an item at the specified relative position. + * @public + * @param {Number} [position] - The relative position of the item. + * @return {jQuery|Array.} - The item at the given position or all items if no position was given. + */ + Owl.prototype.mergers = function(position) { + if (position === undefined) { + return this._mergers.slice(); + } + + position = this.normalize(position, true); + return this._mergers[position]; + }; + + /** + * Gets the absolute positions of clones for an item. + * @public + * @param {Number} [position] - The relative position of the item. + * @returns {Array.} - The absolute positions of clones for the item or all if no position was given. + */ + Owl.prototype.clones = function(position) { + var odd = this._clones.length / 2, + even = odd + this._items.length, + map = function(index) { return index % 2 === 0 ? even + index / 2 : odd - (index + 1) / 2 }; + + if (position === undefined) { + return $.map(this._clones, function(v, i) { return map(i) }); + } + + return $.map(this._clones, function(v, i) { return v === position ? map(i) : null }); + }; + + /** + * Sets the current animation speed. + * @public + * @param {Number} [speed] - The animation speed in milliseconds or nothing to leave it unchanged. + * @returns {Number} - The current animation speed in milliseconds. + */ + Owl.prototype.speed = function(speed) { + if (speed !== undefined) { + this._speed = speed; + } + + return this._speed; + }; + + /** + * Gets the coordinate of an item. + * @todo The name of this method is missleanding. + * @public + * @param {Number} position - The absolute position of the item within `minimum()` and `maximum()`. + * @returns {Number|Array.} - The coordinate of the item in pixel or all coordinates. + */ + Owl.prototype.coordinates = function(position) { + var multiplier = 1, + newPosition = position - 1, + coordinate; + + if (position === undefined) { + return $.map(this._coordinates, $.proxy(function(coordinate, index) { + return this.coordinates(index); + }, this)); + } + + if (this.settings.center) { + if (this.settings.rtl) { + multiplier = -1; + newPosition = position + 1; + } + + coordinate = this._coordinates[position]; + coordinate += (this.width() - coordinate + (this._coordinates[newPosition] || 0)) / 2 * multiplier; + } else { + coordinate = this._coordinates[newPosition] || 0; + } + + coordinate = Math.ceil(coordinate); + + return coordinate; + }; + + /** + * Calculates the speed for a translation. + * @protected + * @param {Number} from - The absolute position of the start item. + * @param {Number} to - The absolute position of the target item. + * @param {Number} [factor=undefined] - The time factor in milliseconds. + * @returns {Number} - The time in milliseconds for the translation. + */ + Owl.prototype.duration = function(from, to, factor) { + if (factor === 0) { + return 0; + } + + return Math.min(Math.max(Math.abs(to - from), 1), 6) * Math.abs((factor || this.settings.smartSpeed)); + }; + + /** + * Slides to the specified item. + * @public + * @param {Number} position - The position of the item. + * @param {Number} [speed] - The time in milliseconds for the transition. + */ + Owl.prototype.to = function(position, speed) { + var current = this.current(), + revert = null, + distance = position - this.relative(current), + direction = (distance > 0) - (distance < 0), + items = this._items.length, + minimum = this.minimum(), + maximum = this.maximum(); + + if (this.settings.loop) { + if (!this.settings.rewind && Math.abs(distance) > items / 2) { + distance += direction * -1 * items; + } + + position = current + distance; + revert = ((position - minimum) % items + items) % items + minimum; + + if (revert !== position && revert - distance <= maximum && revert - distance > 0) { + current = revert - distance; + position = revert; + this.reset(current); + } + } else if (this.settings.rewind) { + maximum += 1; + position = (position % maximum + maximum) % maximum; + } else { + position = Math.max(minimum, Math.min(maximum, position)); + } + + this.speed(this.duration(current, position, speed)); + this.current(position); + + if (this.$element.is(':visible')) { + this.update(); + } + }; + + /** + * Slides to the next item. + * @public + * @param {Number} [speed] - The time in milliseconds for the transition. + */ + Owl.prototype.next = function(speed) { + speed = speed || false; + this.to(this.relative(this.current()) + 1, speed); + }; + + /** + * Slides to the previous item. + * @public + * @param {Number} [speed] - The time in milliseconds for the transition. + */ + Owl.prototype.prev = function(speed) { + speed = speed || false; + this.to(this.relative(this.current()) - 1, speed); + }; + + /** + * Handles the end of an animation. + * @protected + * @param {Event} event - The event arguments. + */ + Owl.prototype.onTransitionEnd = function(event) { + + // if css2 animation then event object is undefined + if (event !== undefined) { + event.stopPropagation(); + + // Catch only owl-stage transitionEnd event + if ((event.target || event.srcElement || event.originalTarget) !== this.$stage.get(0)) { + return false; + } + } + + this.leave('animating'); + this.trigger('translated'); + }; + + /** + * Gets viewport width. + * @protected + * @return {Number} - The width in pixel. + */ + Owl.prototype.viewport = function() { + var width; + if (this.options.responsiveBaseElement !== window) { + width = $(this.options.responsiveBaseElement).width(); + } else if (window.innerWidth) { + width = window.innerWidth; + } else if (document.documentElement && document.documentElement.clientWidth) { + width = document.documentElement.clientWidth; + } else { + console.warn('Can not detect viewport width.'); + } + return width; + }; + + /** + * Replaces the current content. + * @public + * @param {HTMLElement|jQuery|String} content - The new content. + */ + Owl.prototype.replace = function(content) { + this.$stage.empty(); + this._items = []; + + if (content) { + content = (content instanceof jQuery) ? content : $(content); + } + + if (this.settings.nestedItemSelector) { + content = content.find('.' + this.settings.nestedItemSelector); + } + + content.filter(function() { + return this.nodeType === 1; + }).each($.proxy(function(index, item) { + item = this.prepare(item); + this.$stage.append(item); + this._items.push(item); + this._mergers.push(item.find('[data-merge]').addBack('[data-merge]').attr('data-merge') * 1 || 1); + }, this)); + + this.reset(this.isNumeric(this.settings.startPosition) ? this.settings.startPosition : 0); + + this.invalidate('items'); + }; + + /** + * Adds an item. + * @todo Use `item` instead of `content` for the event arguments. + * @public + * @param {HTMLElement|jQuery|String} content - The item content to add. + * @param {Number} [position] - The relative position at which to insert the item otherwise the item will be added to the end. + */ + Owl.prototype.add = function(content, position) { + var current = this.relative(this._current); + + position = position === undefined ? this._items.length : this.normalize(position, true); + content = content instanceof jQuery ? content : $(content); + + this.trigger('add', { content: content, position: position }); + + content = this.prepare(content); + + if (this._items.length === 0 || position === this._items.length) { + this._items.length === 0 && this.$stage.append(content); + this._items.length !== 0 && this._items[position - 1].after(content); + this._items.push(content); + this._mergers.push(content.find('[data-merge]').addBack('[data-merge]').attr('data-merge') * 1 || 1); + } else { + this._items[position].before(content); + this._items.splice(position, 0, content); + this._mergers.splice(position, 0, content.find('[data-merge]').addBack('[data-merge]').attr('data-merge') * 1 || 1); + } + + this._items[current] && this.reset(this._items[current].index()); + + this.invalidate('items'); + + this.trigger('added', { content: content, position: position }); + }; + + /** + * Removes an item by its position. + * @todo Use `item` instead of `content` for the event arguments. + * @public + * @param {Number} position - The relative position of the item to remove. + */ + Owl.prototype.remove = function(position) { + position = this.normalize(position, true); + + if (position === undefined) { + return; + } + + this.trigger('remove', { content: this._items[position], position: position }); + + this._items[position].remove(); + this._items.splice(position, 1); + this._mergers.splice(position, 1); + + this.invalidate('items'); + + this.trigger('removed', { content: null, position: position }); + }; + + /** + * Preloads images with auto width. + * @todo Replace by a more generic approach + * @protected + */ + Owl.prototype.preloadAutoWidthImages = function(images) { + images.each($.proxy(function(i, element) { + this.enter('pre-loading'); + element = $(element); + $(new Image()).one('load', $.proxy(function(e) { + element.attr('src', e.target.src); + element.css('opacity', 1); + this.leave('pre-loading'); + !this.is('pre-loading') && !this.is('initializing') && this.refresh(); + }, this)).attr('src', element.attr('src') || element.attr('data-src') || element.attr('data-src-retina')); + }, this)); + }; + + /** + * Destroys the carousel. + * @public + */ + Owl.prototype.destroy = function() { + + this.$element.off('.owl.core'); + this.$stage.off('.owl.core'); + $(document).off('.owl.core'); + + if (this.settings.responsive !== false) { + window.clearTimeout(this.resizeTimer); + this.off(window, 'resize', this._handlers.onThrottledResize); + } + + for (var i in this._plugins) { + this._plugins[i].destroy(); + } + + this.$stage.children('.cloned').remove(); + + this.$stage.unwrap(); + this.$stage.children().contents().unwrap(); + this.$stage.children().unwrap(); + + this.$element + .removeClass(this.options.refreshClass) + .removeClass(this.options.loadingClass) + .removeClass(this.options.loadedClass) + .removeClass(this.options.rtlClass) + .removeClass(this.options.dragClass) + .removeClass(this.options.grabClass) + .attr('class', this.$element.attr('class').replace(new RegExp(this.options.responsiveClass + '-\\S+\\s', 'g'), '')) + .removeData('owl.carousel'); + }; + + /** + * Operators to calculate right-to-left and left-to-right. + * @protected + * @param {Number} [a] - The left side operand. + * @param {String} [o] - The operator. + * @param {Number} [b] - The right side operand. + */ + Owl.prototype.op = function(a, o, b) { + var rtl = this.settings.rtl; + switch (o) { + case '<': + return rtl ? a > b : a < b; + case '>': + return rtl ? a < b : a > b; + case '>=': + return rtl ? a <= b : a >= b; + case '<=': + return rtl ? a >= b : a <= b; + default: + break; + } + }; + + /** + * Attaches to an internal event. + * @protected + * @param {HTMLElement} element - The event source. + * @param {String} event - The event name. + * @param {Function} listener - The event handler to attach. + * @param {Boolean} capture - Wether the event should be handled at the capturing phase or not. + */ + Owl.prototype.on = function(element, event, listener, capture) { + if (element.addEventListener) { + element.addEventListener(event, listener, capture); + } else if (element.attachEvent) { + element.attachEvent('on' + event, listener); + } + }; + + /** + * Detaches from an internal event. + * @protected + * @param {HTMLElement} element - The event source. + * @param {String} event - The event name. + * @param {Function} listener - The attached event handler to detach. + * @param {Boolean} capture - Wether the attached event handler was registered as a capturing listener or not. + */ + Owl.prototype.off = function(element, event, listener, capture) { + if (element.removeEventListener) { + element.removeEventListener(event, listener, capture); + } else if (element.detachEvent) { + element.detachEvent('on' + event, listener); + } + }; + + /** + * Triggers a public event. + * @todo Remove `status`, `relatedTarget` should be used instead. + * @protected + * @param {String} name - The event name. + * @param {*} [data=null] - The event data. + * @param {String} [namespace=carousel] - The event namespace. + * @param {String} [state] - The state which is associated with the event. + * @param {Boolean} [enter=false] - Indicates if the call enters the specified state or not. + * @returns {Event} - The event arguments. + */ + Owl.prototype.trigger = function(name, data, namespace, state, enter) { + var status = { + item: { count: this._items.length, index: this.current() } + }, handler = $.camelCase( + $.grep([ 'on', name, namespace ], function(v) { return v }) + .join('-').toLowerCase() + ), event = $.Event( + [ name, 'owl', namespace || 'carousel' ].join('.').toLowerCase(), + $.extend({ relatedTarget: this }, status, data) + ); + + if (!this._supress[name]) { + $.each(this._plugins, function(name, plugin) { + if (plugin.onTrigger) { + plugin.onTrigger(event); + } + }); + + this.register({ type: Owl.Type.Event, name: name }); + this.$element.trigger(event); + + if (this.settings && typeof this.settings[handler] === 'function') { + this.settings[handler].call(this, event); + } + } + + return event; + }; + + /** + * Enters a state. + * @param name - The state name. + */ + Owl.prototype.enter = function(name) { + $.each([ name ].concat(this._states.tags[name] || []), $.proxy(function(i, name) { + if (this._states.current[name] === undefined) { + this._states.current[name] = 0; + } + + this._states.current[name]++; + }, this)); + }; + + /** + * Leaves a state. + * @param name - The state name. + */ + Owl.prototype.leave = function(name) { + $.each([ name ].concat(this._states.tags[name] || []), $.proxy(function(i, name) { + this._states.current[name]--; + }, this)); + }; + + /** + * Registers an event or state. + * @public + * @param {Object} object - The event or state to register. + */ + Owl.prototype.register = function(object) { + if (object.type === Owl.Type.Event) { + if (!$.event.special[object.name]) { + $.event.special[object.name] = {}; + } + + if (!$.event.special[object.name].owl) { + var _default = $.event.special[object.name]._default; + $.event.special[object.name]._default = function(e) { + if (_default && _default.apply && (!e.namespace || e.namespace.indexOf('owl') === -1)) { + return _default.apply(this, arguments); + } + return e.namespace && e.namespace.indexOf('owl') > -1; + }; + $.event.special[object.name].owl = true; + } + } else if (object.type === Owl.Type.State) { + if (!this._states.tags[object.name]) { + this._states.tags[object.name] = object.tags; + } else { + this._states.tags[object.name] = this._states.tags[object.name].concat(object.tags); + } + + this._states.tags[object.name] = $.grep(this._states.tags[object.name], $.proxy(function(tag, i) { + return $.inArray(tag, this._states.tags[object.name]) === i; + }, this)); + } + }; + + /** + * Suppresses events. + * @protected + * @param {Array.} events - The events to suppress. + */ + Owl.prototype.suppress = function(events) { + $.each(events, $.proxy(function(index, event) { + this._supress[event] = true; + }, this)); + }; + + /** + * Releases suppressed events. + * @protected + * @param {Array.} events - The events to release. + */ + Owl.prototype.release = function(events) { + $.each(events, $.proxy(function(index, event) { + delete this._supress[event]; + }, this)); + }; + + /** + * Gets unified pointer coordinates from event. + * @todo #261 + * @protected + * @param {Event} - The `mousedown` or `touchstart` event. + * @returns {Object} - Contains `x` and `y` coordinates of current pointer position. + */ + Owl.prototype.pointer = function(event) { + var result = { x: null, y: null }; + + event = event.originalEvent || event || window.event; + + event = event.touches && event.touches.length ? + event.touches[0] : event.changedTouches && event.changedTouches.length ? + event.changedTouches[0] : event; + + if (event.pageX) { + result.x = event.pageX; + result.y = event.pageY; + } else { + result.x = event.clientX; + result.y = event.clientY; + } + + return result; + }; + + /** + * Determines if the input is a Number or something that can be coerced to a Number + * @protected + * @param {Number|String|Object|Array|Boolean|RegExp|Function|Symbol} - The input to be tested + * @returns {Boolean} - An indication if the input is a Number or can be coerced to a Number + */ + Owl.prototype.isNumeric = function(number) { + return !isNaN(parseFloat(number)); + }; + + /** + * Gets the difference of two vectors. + * @todo #261 + * @protected + * @param {Object} - The first vector. + * @param {Object} - The second vector. + * @returns {Object} - The difference. + */ + Owl.prototype.difference = function(first, second) { + return { + x: first.x - second.x, + y: first.y - second.y + }; + }; + + /** + * The jQuery Plugin for the Owl Carousel + * @todo Navigation plugin `next` and `prev` + * @public + */ + $.fn.owlCarousel = function(option) { + var args = Array.prototype.slice.call(arguments, 1); + + return this.each(function() { + var $this = $(this), + data = $this.data('owl.carousel'); + + if (!data) { + data = new Owl(this, typeof option == 'object' && option); + $this.data('owl.carousel', data); + + $.each([ + 'next', 'prev', 'to', 'destroy', 'refresh', 'replace', 'add', 'remove' + ], function(i, event) { + data.register({ type: Owl.Type.Event, name: event }); + data.$element.on(event + '.owl.carousel.core', $.proxy(function(e) { + if (e.namespace && e.relatedTarget !== this) { + this.suppress([ event ]); + data[event].apply(this, [].slice.call(arguments, 1)); + this.release([ event ]); + } + }, data)); + }); + } + + if (typeof option == 'string' && option.charAt(0) !== '_') { + data[option].apply(data, args); + } + }); + }; + + /** + * The constructor for the jQuery Plugin + * @public + */ + $.fn.owlCarousel.Constructor = Owl; + +})(window.Zepto || window.jQuery, window, document); + +/** + * AutoRefresh Plugin + * @version 2.1.0 + * @author Artus Kolanowski + * @author David Deutsch + * @license The MIT License (MIT) + */ +;(function($, window, document, undefined) { + + /** + * Creates the auto refresh plugin. + * @class The Auto Refresh Plugin + * @param {Owl} carousel - The Owl Carousel + */ + var AutoRefresh = function(carousel) { + /** + * Reference to the core. + * @protected + * @type {Owl} + */ + this._core = carousel; + + /** + * Refresh interval. + * @protected + * @type {number} + */ + this._interval = null; + + /** + * Whether the element is currently visible or not. + * @protected + * @type {Boolean} + */ + this._visible = null; + + /** + * All event handlers. + * @protected + * @type {Object} + */ + this._handlers = { + 'initialized.owl.carousel': $.proxy(function(e) { + if (e.namespace && this._core.settings.autoRefresh) { + this.watch(); + } + }, this) + }; + + // set default options + this._core.options = $.extend({}, AutoRefresh.Defaults, this._core.options); + + // register event handlers + this._core.$element.on(this._handlers); + }; + + /** + * Default options. + * @public + */ + AutoRefresh.Defaults = { + autoRefresh: true, + autoRefreshInterval: 500 + }; + + /** + * Watches the element. + */ + AutoRefresh.prototype.watch = function() { + if (this._interval) { + return; + } + + this._visible = this._core.$element.is(':visible'); + this._interval = window.setInterval($.proxy(this.refresh, this), this._core.settings.autoRefreshInterval); + }; + + /** + * Refreshes the element. + */ + AutoRefresh.prototype.refresh = function() { + if (this._core.$element.is(':visible') === this._visible) { + return; + } + + this._visible = !this._visible; + + this._core.$element.toggleClass('owl-hidden', !this._visible); + + this._visible && (this._core.invalidate('width') && this._core.refresh()); + }; + + /** + * Destroys the plugin. + */ + AutoRefresh.prototype.destroy = function() { + var handler, property; + + window.clearInterval(this._interval); + + for (handler in this._handlers) { + this._core.$element.off(handler, this._handlers[handler]); + } + for (property in Object.getOwnPropertyNames(this)) { + typeof this[property] != 'function' && (this[property] = null); + } + }; + + $.fn.owlCarousel.Constructor.Plugins.AutoRefresh = AutoRefresh; + +})(window.Zepto || window.jQuery, window, document); + +/** + * Lazy Plugin + * @version 2.1.0 + * @author Bartosz Wojciechowski + * @author David Deutsch + * @license The MIT License (MIT) + */ +;(function($, window, document, undefined) { + + /** + * Creates the lazy plugin. + * @class The Lazy Plugin + * @param {Owl} carousel - The Owl Carousel + */ + var Lazy = function(carousel) { + + /** + * Reference to the core. + * @protected + * @type {Owl} + */ + this._core = carousel; + + /** + * Already loaded items. + * @protected + * @type {Array.} + */ + this._loaded = []; + + /** + * Event handlers. + * @protected + * @type {Object} + */ + this._handlers = { + 'initialized.owl.carousel change.owl.carousel resized.owl.carousel': $.proxy(function(e) { + if (!e.namespace) { + return; + } + + if (!this._core.settings || !this._core.settings.lazyLoad) { + return; + } + + if ((e.property && e.property.name == 'position') || e.type == 'initialized') { + var settings = this._core.settings, + n = (settings.center && Math.ceil(settings.items / 2) || settings.items), + i = ((settings.center && n * -1) || 0), + position = (e.property && e.property.value !== undefined ? e.property.value : this._core.current()) + i, + clones = this._core.clones().length, + load = $.proxy(function(i, v) { this.load(v) }, this); + + while (i++ < n) { + this.load(clones / 2 + this._core.relative(position)); + clones && $.each(this._core.clones(this._core.relative(position)), load); + position++; + } + } + }, this) + }; + + // set the default options + this._core.options = $.extend({}, Lazy.Defaults, this._core.options); + + // register event handler + this._core.$element.on(this._handlers); + }; + + /** + * Default options. + * @public + */ + Lazy.Defaults = { + lazyLoad: false + }; + + /** + * Loads all resources of an item at the specified position. + * @param {Number} position - The absolute position of the item. + * @protected + */ + Lazy.prototype.load = function(position) { + var $item = this._core.$stage.children().eq(position), + $elements = $item && $item.find('.owl-lazy'); + + if (!$elements || $.inArray($item.get(0), this._loaded) > -1) { + return; + } + + $elements.each($.proxy(function(index, element) { + var $element = $(element), image, + url = (window.devicePixelRatio > 1 && $element.attr('data-src-retina')) || $element.attr('data-src'); + + this._core.trigger('load', { element: $element, url: url }, 'lazy'); + + if ($element.is('img')) { + $element.one('load.owl.lazy', $.proxy(function() { + $element.css('opacity', 1); + this._core.trigger('loaded', { element: $element, url: url }, 'lazy'); + }, this)).attr('src', url); + } else { + image = new Image(); + image.onload = $.proxy(function() { + $element.css({ + 'background-image': 'url("' + url + '")', + 'opacity': '1' + }); + this._core.trigger('loaded', { element: $element, url: url }, 'lazy'); + }, this); + image.src = url; + } + }, this)); + + this._loaded.push($item.get(0)); + }; + + /** + * Destroys the plugin. + * @public + */ + Lazy.prototype.destroy = function() { + var handler, property; + + for (handler in this.handlers) { + this._core.$element.off(handler, this.handlers[handler]); + } + for (property in Object.getOwnPropertyNames(this)) { + typeof this[property] != 'function' && (this[property] = null); + } + }; + + $.fn.owlCarousel.Constructor.Plugins.Lazy = Lazy; + +})(window.Zepto || window.jQuery, window, document); + +/** + * AutoHeight Plugin + * @version 2.1.0 + * @author Bartosz Wojciechowski + * @author David Deutsch + * @license The MIT License (MIT) + */ +;(function($, window, document, undefined) { + + /** + * Creates the auto height plugin. + * @class The Auto Height Plugin + * @param {Owl} carousel - The Owl Carousel + */ + var AutoHeight = function(carousel) { + /** + * Reference to the core. + * @protected + * @type {Owl} + */ + this._core = carousel; + + /** + * All event handlers. + * @protected + * @type {Object} + */ + this._handlers = { + 'initialized.owl.carousel refreshed.owl.carousel': $.proxy(function(e) { + if (e.namespace && this._core.settings.autoHeight) { + this.update(); + } + }, this), + 'changed.owl.carousel': $.proxy(function(e) { + if (e.namespace && this._core.settings.autoHeight && e.property.name == 'position'){ + this.update(); + } + }, this), + 'loaded.owl.lazy': $.proxy(function(e) { + if (e.namespace && this._core.settings.autoHeight + && e.element.closest('.' + this._core.settings.itemClass).index() === this._core.current()) { + this.update(); + } + }, this) + }; + + // set default options + this._core.options = $.extend({}, AutoHeight.Defaults, this._core.options); + + // register event handlers + this._core.$element.on(this._handlers); + }; + + /** + * Default options. + * @public + */ + AutoHeight.Defaults = { + autoHeight: false, + autoHeightClass: 'owl-height' + }; + + /** + * Updates the view. + */ + AutoHeight.prototype.update = function() { + var start = this._core._current, + end = start + this._core.settings.items, + visible = this._core.$stage.children().toArray().slice(start, end), + heights = [], + maxheight = 0; + + $.each(visible, function(index, item) { + heights.push($(item).height()); + }); + + maxheight = Math.max.apply(null, heights); + + this._core.$stage.parent() + .height(maxheight) + .addClass(this._core.settings.autoHeightClass); + }; + + AutoHeight.prototype.destroy = function() { + var handler, property; + + for (handler in this._handlers) { + this._core.$element.off(handler, this._handlers[handler]); + } + for (property in Object.getOwnPropertyNames(this)) { + typeof this[property] != 'function' && (this[property] = null); + } + }; + + $.fn.owlCarousel.Constructor.Plugins.AutoHeight = AutoHeight; + +})(window.Zepto || window.jQuery, window, document); + +/** + * Video Plugin + * @version 2.1.0 + * @author Bartosz Wojciechowski + * @author David Deutsch + * @license The MIT License (MIT) + */ +;(function($, window, document, undefined) { + + /** + * Creates the video plugin. + * @class The Video Plugin + * @param {Owl} carousel - The Owl Carousel + */ + var Video = function(carousel) { + /** + * Reference to the core. + * @protected + * @type {Owl} + */ + this._core = carousel; + + /** + * Cache all video URLs. + * @protected + * @type {Object} + */ + this._videos = {}; + + /** + * Current playing item. + * @protected + * @type {jQuery} + */ + this._playing = null; + + /** + * All event handlers. + * @todo The cloned content removale is too late + * @protected + * @type {Object} + */ + this._handlers = { + 'initialized.owl.carousel': $.proxy(function(e) { + if (e.namespace) { + this._core.register({ type: 'state', name: 'playing', tags: [ 'interacting' ] }); + } + }, this), + 'resize.owl.carousel': $.proxy(function(e) { + if (e.namespace && this._core.settings.video && this.isInFullScreen()) { + e.preventDefault(); + } + }, this), + 'refreshed.owl.carousel': $.proxy(function(e) { + if (e.namespace && this._core.is('resizing')) { + this._core.$stage.find('.cloned .owl-video-frame').remove(); + } + }, this), + 'changed.owl.carousel': $.proxy(function(e) { + if (e.namespace && e.property.name === 'position' && this._playing) { + this.stop(); + } + }, this), + 'prepared.owl.carousel': $.proxy(function(e) { + if (!e.namespace) { + return; + } + + var $element = $(e.content).find('.owl-video'); + + if ($element.length) { + $element.css('display', 'none'); + this.fetch($element, $(e.content)); + } + }, this) + }; + + // set default options + this._core.options = $.extend({}, Video.Defaults, this._core.options); + + // register event handlers + this._core.$element.on(this._handlers); + + this._core.$element.on('click.owl.video', '.owl-video-play-icon', $.proxy(function(e) { + this.play(e); + }, this)); + }; + + /** + * Default options. + * @public + */ + Video.Defaults = { + video: false, + videoHeight: false, + videoWidth: false + }; + + /** + * Gets the video ID and the type (YouTube/Vimeo/vzaar only). + * @protected + * @param {jQuery} target - The target containing the video data. + * @param {jQuery} item - The item containing the video. + */ + Video.prototype.fetch = function(target, item) { + var type = (function() { + if (target.attr('data-vimeo-id')) { + return 'vimeo'; + } else if (target.attr('data-vzaar-id')) { + return 'vzaar' + } else { + return 'youtube'; + } + })(), + id = target.attr('data-vimeo-id') || target.attr('data-youtube-id') || target.attr('data-vzaar-id'), + width = target.attr('data-width') || this._core.settings.videoWidth, + height = target.attr('data-height') || this._core.settings.videoHeight, + url = target.attr('href'); + + if (url) { + + /* + Parses the id's out of the following urls (and probably more): + https://www.youtube.com/watch?v=:id + https://youtu.be/:id + https://vimeo.com/:id + https://vimeo.com/channels/:channel/:id + https://vimeo.com/groups/:group/videos/:id + https://app.vzaar.com/videos/:id + + Visual example: https://regexper.com/#(http%3A%7Chttps%3A%7C)%5C%2F%5C%2F(player.%7Cwww.%7Capp.)%3F(vimeo%5C.com%7Cyoutu(be%5C.com%7C%5C.be%7Cbe%5C.googleapis%5C.com)%7Cvzaar%5C.com)%5C%2F(video%5C%2F%7Cvideos%5C%2F%7Cembed%5C%2F%7Cchannels%5C%2F.%2B%5C%2F%7Cgroups%5C%2F.%2B%5C%2F%7Cwatch%5C%3Fv%3D%7Cv%5C%2F)%3F(%5BA-Za-z0-9._%25-%5D*)(%5C%26%5CS%2B)%3F + */ + + id = url.match(/(http:|https:|)\/\/(player.|www.|app.)?(vimeo\.com|youtu(be\.com|\.be|be\.googleapis\.com)|vzaar\.com)\/(video\/|videos\/|embed\/|channels\/.+\/|groups\/.+\/|watch\?v=|v\/)?([A-Za-z0-9._%-]*)(\&\S+)?/); + + if (id[3].indexOf('youtu') > -1) { + type = 'youtube'; + } else if (id[3].indexOf('vimeo') > -1) { + type = 'vimeo'; + } else if (id[3].indexOf('vzaar') > -1) { + type = 'vzaar'; + } else { + throw new Error('Video URL not supported.'); + } + id = id[6]; + } else { + throw new Error('Missing video URL.'); + } + + this._videos[url] = { + type: type, + id: id, + width: width, + height: height + }; + + item.attr('data-video', url); + + this.thumbnail(target, this._videos[url]); + }; + + /** + * Creates video thumbnail. + * @protected + * @param {jQuery} target - The target containing the video data. + * @param {Object} info - The video info object. + * @see `fetch` + */ + Video.prototype.thumbnail = function(target, video) { + var tnLink, + icon, + path, + dimensions = video.width && video.height ? 'style="width:' + video.width + 'px;height:' + video.height + 'px;"' : '', + customTn = target.find('img'), + srcType = 'src', + lazyClass = '', + settings = this._core.settings, + create = function(path) { + icon = '
          '; + + if (settings.lazyLoad) { + tnLink = '
          '; + } else { + tnLink = '
          '; + } + target.after(tnLink); + target.after(icon); + }; + + // wrap video content into owl-video-wrapper div + target.wrap('
          '); + + if (this._core.settings.lazyLoad) { + srcType = 'data-src'; + lazyClass = 'owl-lazy'; + } + + // custom thumbnail + if (customTn.length) { + create(customTn.attr(srcType)); + customTn.remove(); + return false; + } + + if (video.type === 'youtube') { + path = "//img.youtube.com/vi/" + video.id + "/hqdefault.jpg"; + create(path); + } else if (video.type === 'vimeo') { + $.ajax({ + type: 'GET', + url: '//vimeo.com/api/v2/video/' + video.id + '.json', + jsonp: 'callback', + dataType: 'jsonp', + success: function(data) { + path = data[0].thumbnail_large; + create(path); + } + }); + } else if (video.type === 'vzaar') { + $.ajax({ + type: 'GET', + url: '//vzaar.com/api/videos/' + video.id + '.json', + jsonp: 'callback', + dataType: 'jsonp', + success: function(data) { + path = data.framegrab_url; + create(path); + } + }); + } + }; + + /** + * Stops the current video. + * @public + */ + Video.prototype.stop = function() { + this._core.trigger('stop', null, 'video'); + this._playing.find('.owl-video-frame').remove(); + this._playing.removeClass('owl-video-playing'); + this._playing = null; + this._core.leave('playing'); + this._core.trigger('stopped', null, 'video'); + }; + + /** + * Starts the current video. + * @public + * @param {Event} event - The event arguments. + */ + Video.prototype.play = function(event) { + var target = $(event.target), + item = target.closest('.' + this._core.settings.itemClass), + video = this._videos[item.attr('data-video')], + width = video.width || '100%', + height = video.height || this._core.$stage.height(), + html; + + if (this._playing) { + return; + } + + this._core.enter('playing'); + this._core.trigger('play', null, 'video'); + + item = this._core.items(this._core.relative(item.index())); + + this._core.reset(item.index()); + + if (video.type === 'youtube') { + html = ''; + } else if (video.type === 'vimeo') { + html = ''; + } else if (video.type === 'vzaar') { + html = ''; + } + + $('
          ' + html + '
          ').insertAfter(item.find('.owl-video')); + + this._playing = item.addClass('owl-video-playing'); + }; + + /** + * Checks whether an video is currently in full screen mode or not. + * @todo Bad style because looks like a readonly method but changes members. + * @protected + * @returns {Boolean} + */ + Video.prototype.isInFullScreen = function() { + var element = document.fullscreenElement || document.mozFullScreenElement || + document.webkitFullscreenElement; + + return element && $(element).parent().hasClass('owl-video-frame'); + }; + + /** + * Destroys the plugin. + */ + Video.prototype.destroy = function() { + var handler, property; + + this._core.$element.off('click.owl.video'); + + for (handler in this._handlers) { + this._core.$element.off(handler, this._handlers[handler]); + } + for (property in Object.getOwnPropertyNames(this)) { + typeof this[property] != 'function' && (this[property] = null); + } + }; + + $.fn.owlCarousel.Constructor.Plugins.Video = Video; + +})(window.Zepto || window.jQuery, window, document); + +/** + * Animate Plugin + * @version 2.1.0 + * @author Bartosz Wojciechowski + * @author David Deutsch + * @license The MIT License (MIT) + */ +;(function($, window, document, undefined) { + + /** + * Creates the animate plugin. + * @class The Navigation Plugin + * @param {Owl} scope - The Owl Carousel + */ + var Animate = function(scope) { + this.core = scope; + this.core.options = $.extend({}, Animate.Defaults, this.core.options); + this.swapping = true; + this.previous = undefined; + this.next = undefined; + + this.handlers = { + 'change.owl.carousel': $.proxy(function(e) { + if (e.namespace && e.property.name == 'position') { + this.previous = this.core.current(); + this.next = e.property.value; + } + }, this), + 'drag.owl.carousel dragged.owl.carousel translated.owl.carousel': $.proxy(function(e) { + if (e.namespace) { + this.swapping = e.type == 'translated'; + } + }, this), + 'translate.owl.carousel': $.proxy(function(e) { + if (e.namespace && this.swapping && (this.core.options.animateOut || this.core.options.animateIn)) { + this.swap(); + } + }, this) + }; + + this.core.$element.on(this.handlers); + }; + + /** + * Default options. + * @public + */ + Animate.Defaults = { + animateOut: false, + animateIn: false + }; + + /** + * Toggles the animation classes whenever an translations starts. + * @protected + * @returns {Boolean|undefined} + */ + Animate.prototype.swap = function() { + + if (this.core.settings.items !== 1) { + return; + } + + if (!$.support.animation || !$.support.transition) { + return; + } + + this.core.speed(0); + + var left, + clear = $.proxy(this.clear, this), + previous = this.core.$stage.children().eq(this.previous), + next = this.core.$stage.children().eq(this.next), + incoming = this.core.settings.animateIn, + outgoing = this.core.settings.animateOut; + + if (this.core.current() === this.previous) { + return; + } + + if (outgoing) { + left = this.core.coordinates(this.previous) - this.core.coordinates(this.next); + previous.one($.support.animation.end, clear) + .css( { 'left': left + 'px' } ) + .addClass('animated owl-animated-out') + .addClass(outgoing); + } + + if (incoming) { + next.one($.support.animation.end, clear) + .addClass('animated owl-animated-in') + .addClass(incoming); + } + }; + + Animate.prototype.clear = function(e) { + $(e.target).css( { 'left': '' } ) + .removeClass('animated owl-animated-out owl-animated-in') + .removeClass(this.core.settings.animateIn) + .removeClass(this.core.settings.animateOut); + this.core.onTransitionEnd(); + }; + + /** + * Destroys the plugin. + * @public + */ + Animate.prototype.destroy = function() { + var handler, property; + + for (handler in this.handlers) { + this.core.$element.off(handler, this.handlers[handler]); + } + for (property in Object.getOwnPropertyNames(this)) { + typeof this[property] != 'function' && (this[property] = null); + } + }; + + $.fn.owlCarousel.Constructor.Plugins.Animate = Animate; + +})(window.Zepto || window.jQuery, window, document); + +/** + * Autoplay Plugin + * @version 2.1.0 + * @author Bartosz Wojciechowski + * @author Artus Kolanowski + * @author David Deutsch + * @license The MIT License (MIT) + */ +;(function($, window, document, undefined) { + + /** + * Creates the autoplay plugin. + * @class The Autoplay Plugin + * @param {Owl} scope - The Owl Carousel + */ + var Autoplay = function(carousel) { + /** + * Reference to the core. + * @protected + * @type {Owl} + */ + this._core = carousel; + + /** + * The autoplay timeout. + * @type {Timeout} + */ + this._timeout = null; + + /** + * Indicates whenever the autoplay is paused. + * @type {Boolean} + */ + this._paused = false; + + /** + * All event handlers. + * @protected + * @type {Object} + */ + this._handlers = { + 'changed.owl.carousel': $.proxy(function(e) { + if (e.namespace && e.property.name === 'settings') { + if (this._core.settings.autoplay) { + this.play(); + } else { + this.stop(); + } + } else if (e.namespace && e.property.name === 'position') { + //console.log('play?', e); + if (this._core.settings.autoplay) { + this._setAutoPlayInterval(); + } + } + }, this), + 'initialized.owl.carousel': $.proxy(function(e) { + if (e.namespace && this._core.settings.autoplay) { + this.play(); + } + }, this), + 'play.owl.autoplay': $.proxy(function(e, t, s) { + if (e.namespace) { + this.play(t, s); + } + }, this), + 'stop.owl.autoplay': $.proxy(function(e) { + if (e.namespace) { + this.stop(); + } + }, this), + 'mouseover.owl.autoplay': $.proxy(function() { + if (this._core.settings.autoplayHoverPause && this._core.is('rotating')) { + this.pause(); + } + }, this), + 'mouseleave.owl.autoplay': $.proxy(function() { + if (this._core.settings.autoplayHoverPause && this._core.is('rotating')) { + this.play(); + } + }, this), + 'touchstart.owl.core': $.proxy(function() { + if (this._core.settings.autoplayHoverPause && this._core.is('rotating')) { + this.pause(); + } + }, this), + 'touchend.owl.core': $.proxy(function() { + if (this._core.settings.autoplayHoverPause) { + this.play(); + } + }, this) + }; + + // register event handlers + this._core.$element.on(this._handlers); + + // set default options + this._core.options = $.extend({}, Autoplay.Defaults, this._core.options); + }; + + /** + * Default options. + * @public + */ + Autoplay.Defaults = { + autoplay: false, + autoplayTimeout: 5000, + autoplayHoverPause: false, + autoplaySpeed: false + }; + + /** + * Starts the autoplay. + * @public + * @param {Number} [timeout] - The interval before the next animation starts. + * @param {Number} [speed] - The animation speed for the animations. + */ + Autoplay.prototype.play = function(timeout, speed) { + this._paused = false; + + if (this._core.is('rotating')) { + return; + } + + this._core.enter('rotating'); + + this._setAutoPlayInterval(); + }; + + /** + * Gets a new timeout + * @private + * @param {Number} [timeout] - The interval before the next animation starts. + * @param {Number} [speed] - The animation speed for the animations. + * @return {Timeout} + */ + Autoplay.prototype._getNextTimeout = function(timeout, speed) { + if ( this._timeout ) { + window.clearTimeout(this._timeout); + } + return window.setTimeout($.proxy(function() { + if (this._paused || this._core.is('busy') || this._core.is('interacting') || document.hidden) { + return; + } + this._core.next(speed || this._core.settings.autoplaySpeed); + }, this), timeout || this._core.settings.autoplayTimeout); + }; + + /** + * Sets autoplay in motion. + * @private + */ + Autoplay.prototype._setAutoPlayInterval = function() { + this._timeout = this._getNextTimeout(); + }; + + /** + * Stops the autoplay. + * @public + */ + Autoplay.prototype.stop = function() { + if (!this._core.is('rotating')) { + return; + } + + window.clearTimeout(this._timeout); + this._core.leave('rotating'); + }; + + /** + * Stops the autoplay. + * @public + */ + Autoplay.prototype.pause = function() { + if (!this._core.is('rotating')) { + return; + } + + this._paused = true; + }; + + /** + * Destroys the plugin. + */ + Autoplay.prototype.destroy = function() { + var handler, property; + + this.stop(); + + for (handler in this._handlers) { + this._core.$element.off(handler, this._handlers[handler]); + } + for (property in Object.getOwnPropertyNames(this)) { + typeof this[property] != 'function' && (this[property] = null); + } + }; + + $.fn.owlCarousel.Constructor.Plugins.autoplay = Autoplay; + +})(window.Zepto || window.jQuery, window, document); + +/** + * Navigation Plugin + * @version 2.1.0 + * @author Artus Kolanowski + * @author David Deutsch + * @license The MIT License (MIT) + */ +;(function($, window, document, undefined) { + 'use strict'; + + /** + * Creates the navigation plugin. + * @class The Navigation Plugin + * @param {Owl} carousel - The Owl Carousel. + */ + var Navigation = function(carousel) { + /** + * Reference to the core. + * @protected + * @type {Owl} + */ + this._core = carousel; + + /** + * Indicates whether the plugin is initialized or not. + * @protected + * @type {Boolean} + */ + this._initialized = false; + + /** + * The current paging indexes. + * @protected + * @type {Array} + */ + this._pages = []; + + /** + * All DOM elements of the user interface. + * @protected + * @type {Object} + */ + this._controls = {}; + + /** + * Markup for an indicator. + * @protected + * @type {Array.} + */ + this._templates = []; + + /** + * The carousel element. + * @type {jQuery} + */ + this.$element = this._core.$element; + + /** + * Overridden methods of the carousel. + * @protected + * @type {Object} + */ + this._overrides = { + next: this._core.next, + prev: this._core.prev, + to: this._core.to + }; + + /** + * All event handlers. + * @protected + * @type {Object} + */ + this._handlers = { + 'prepared.owl.carousel': $.proxy(function(e) { + if (e.namespace && this._core.settings.dotsData) { + this._templates.push('
          ' + + $(e.content).find('[data-dot]').addBack('[data-dot]').attr('data-dot') + '
          '); + } + }, this), + 'added.owl.carousel': $.proxy(function(e) { + if (e.namespace && this._core.settings.dotsData) { + this._templates.splice(e.position, 0, this._templates.pop()); + } + }, this), + 'remove.owl.carousel': $.proxy(function(e) { + if (e.namespace && this._core.settings.dotsData) { + this._templates.splice(e.position, 1); + } + }, this), + 'changed.owl.carousel': $.proxy(function(e) { + if (e.namespace && e.property.name == 'position') { + this.draw(); + } + }, this), + 'initialized.owl.carousel': $.proxy(function(e) { + if (e.namespace && !this._initialized) { + this._core.trigger('initialize', null, 'navigation'); + this.initialize(); + this.update(); + this.draw(); + this._initialized = true; + this._core.trigger('initialized', null, 'navigation'); + } + }, this), + 'refreshed.owl.carousel': $.proxy(function(e) { + if (e.namespace && this._initialized) { + this._core.trigger('refresh', null, 'navigation'); + this.update(); + this.draw(); + this._core.trigger('refreshed', null, 'navigation'); + } + }, this) + }; + + // set default options + this._core.options = $.extend({}, Navigation.Defaults, this._core.options); + + // register event handlers + this.$element.on(this._handlers); + }; + + /** + * Default options. + * @public + * @todo Rename `slideBy` to `navBy` + */ + Navigation.Defaults = { + nav: false, + navText: [ 'prev', 'next' ], + navSpeed: false, + navElement: 'div', + navContainer: false, + navContainerClass: 'owl-nav', + navClass: [ 'owl-prev', 'owl-next' ], + slideBy: 1, + dotClass: 'owl-dot', + dotsClass: 'owl-dots', + dots: true, + dotsEach: false, + dotsData: false, + dotsSpeed: false, + dotsContainer: false + }; + + /** + * Initializes the layout of the plugin and extends the carousel. + * @protected + */ + Navigation.prototype.initialize = function() { + var override, + settings = this._core.settings; + + // create DOM structure for relative navigation + this._controls.$relative = (settings.navContainer ? $(settings.navContainer) + : $('
          ').addClass(settings.navContainerClass).appendTo(this.$element)).addClass('disabled'); + + this._controls.$previous = $('<' + settings.navElement + '>') + .addClass(settings.navClass[0]) + .html(settings.navText[0]) + .prependTo(this._controls.$relative) + .on('click', $.proxy(function(e) { + this.prev(settings.navSpeed); + }, this)); + this._controls.$next = $('<' + settings.navElement + '>') + .addClass(settings.navClass[1]) + .html(settings.navText[1]) + .appendTo(this._controls.$relative) + .on('click', $.proxy(function(e) { + this.next(settings.navSpeed); + }, this)); + + // create DOM structure for absolute navigation + if (!settings.dotsData) { + this._templates = [ $('
          ') + .addClass(settings.dotClass) + .append($('')) + .prop('outerHTML') ]; + } + + this._controls.$absolute = (settings.dotsContainer ? $(settings.dotsContainer) + : $('
          ').addClass(settings.dotsClass).appendTo(this.$element)).addClass('disabled'); + + this._controls.$absolute.on('click', 'div', $.proxy(function(e) { + var index = $(e.target).parent().is(this._controls.$absolute) + ? $(e.target).index() : $(e.target).parent().index(); + + e.preventDefault(); + + this.to(index, settings.dotsSpeed); + }, this)); + + // override public methods of the carousel + for (override in this._overrides) { + this._core[override] = $.proxy(this[override], this); + } + }; + + /** + * Destroys the plugin. + * @protected + */ + Navigation.prototype.destroy = function() { + var handler, control, property, override; + + for (handler in this._handlers) { + this.$element.off(handler, this._handlers[handler]); + } + for (control in this._controls) { + this._controls[control].remove(); + } + for (override in this.overides) { + this._core[override] = this._overrides[override]; + } + for (property in Object.getOwnPropertyNames(this)) { + typeof this[property] != 'function' && (this[property] = null); + } + }; + + /** + * Updates the internal state. + * @protected + */ + Navigation.prototype.update = function() { + var i, j, k, + lower = this._core.clones().length / 2, + upper = lower + this._core.items().length, + maximum = this._core.maximum(true), + settings = this._core.settings, + size = settings.center || settings.autoWidth || settings.dotsData + ? 1 : settings.dotsEach || settings.items; + + if (settings.slideBy !== 'page') { + settings.slideBy = Math.min(settings.slideBy, settings.items); + } + + if (settings.dots || settings.slideBy == 'page') { + this._pages = []; + + for (i = lower, j = 0, k = 0; i < upper; i++) { + if (j >= size || j === 0) { + this._pages.push({ + start: Math.min(maximum, i - lower), + end: i - lower + size - 1 + }); + if (Math.min(maximum, i - lower) === maximum) { + break; + } + j = 0, ++k; + } + j += this._core.mergers(this._core.relative(i)); + } + } + }; + + /** + * Draws the user interface. + * @todo The option `dotsData` wont work. + * @protected + */ + Navigation.prototype.draw = function() { + var difference, + settings = this._core.settings, + disabled = this._core.items().length <= settings.items, + index = this._core.relative(this._core.current()), + loop = settings.loop || settings.rewind; + + this._controls.$relative.toggleClass('disabled', !settings.nav || disabled); + + if (settings.nav) { + this._controls.$previous.toggleClass('disabled', !loop && index <= this._core.minimum(true)); + this._controls.$next.toggleClass('disabled', !loop && index >= this._core.maximum(true)); + } + + this._controls.$absolute.toggleClass('disabled', !settings.dots || disabled); + + if (settings.dots) { + difference = this._pages.length - this._controls.$absolute.children().length; + + if (settings.dotsData && difference !== 0) { + this._controls.$absolute.html(this._templates.join('')); + } else if (difference > 0) { + this._controls.$absolute.append(new Array(difference + 1).join(this._templates[0])); + } else if (difference < 0) { + this._controls.$absolute.children().slice(difference).remove(); + } + + this._controls.$absolute.find('.active').removeClass('active'); + this._controls.$absolute.children().eq($.inArray(this.current(), this._pages)).addClass('active'); + } + }; + + /** + * Extends event data. + * @protected + * @param {Event} event - The event object which gets thrown. + */ + Navigation.prototype.onTrigger = function(event) { + var settings = this._core.settings; + + event.page = { + index: $.inArray(this.current(), this._pages), + count: this._pages.length, + size: settings && (settings.center || settings.autoWidth || settings.dotsData + ? 1 : settings.dotsEach || settings.items) + }; + }; + + /** + * Gets the current page position of the carousel. + * @protected + * @returns {Number} + */ + Navigation.prototype.current = function() { + var current = this._core.relative(this._core.current()); + return $.grep(this._pages, $.proxy(function(page, index) { + return page.start <= current && page.end >= current; + }, this)).pop(); + }; + + /** + * Gets the current succesor/predecessor position. + * @protected + * @returns {Number} + */ + Navigation.prototype.getPosition = function(successor) { + var position, length, + settings = this._core.settings; + + if (settings.slideBy == 'page') { + position = $.inArray(this.current(), this._pages); + length = this._pages.length; + successor ? ++position : --position; + position = this._pages[((position % length) + length) % length].start; + } else { + position = this._core.relative(this._core.current()); + length = this._core.items().length; + successor ? position += settings.slideBy : position -= settings.slideBy; + } + + return position; + }; + + /** + * Slides to the next item or page. + * @public + * @param {Number} [speed=false] - The time in milliseconds for the transition. + */ + Navigation.prototype.next = function(speed) { + $.proxy(this._overrides.to, this._core)(this.getPosition(true), speed); + }; + + /** + * Slides to the previous item or page. + * @public + * @param {Number} [speed=false] - The time in milliseconds for the transition. + */ + Navigation.prototype.prev = function(speed) { + $.proxy(this._overrides.to, this._core)(this.getPosition(false), speed); + }; + + /** + * Slides to the specified item or page. + * @public + * @param {Number} position - The position of the item or page. + * @param {Number} [speed] - The time in milliseconds for the transition. + * @param {Boolean} [standard=false] - Whether to use the standard behaviour or not. + */ + Navigation.prototype.to = function(position, speed, standard) { + var length; + + if (!standard && this._pages.length) { + length = this._pages.length; + $.proxy(this._overrides.to, this._core)(this._pages[((position % length) + length) % length].start, speed); + } else { + $.proxy(this._overrides.to, this._core)(position, speed); + } + }; + + $.fn.owlCarousel.Constructor.Plugins.Navigation = Navigation; + +})(window.Zepto || window.jQuery, window, document); + +/** + * Hash Plugin + * @version 2.1.0 + * @author Artus Kolanowski + * @author David Deutsch + * @license The MIT License (MIT) + */ +;(function($, window, document, undefined) { + 'use strict'; + + /** + * Creates the hash plugin. + * @class The Hash Plugin + * @param {Owl} carousel - The Owl Carousel + */ + var Hash = function(carousel) { + /** + * Reference to the core. + * @protected + * @type {Owl} + */ + this._core = carousel; + + /** + * Hash index for the items. + * @protected + * @type {Object} + */ + this._hashes = {}; + + /** + * The carousel element. + * @type {jQuery} + */ + this.$element = this._core.$element; + + /** + * All event handlers. + * @protected + * @type {Object} + */ + this._handlers = { + 'initialized.owl.carousel': $.proxy(function(e) { + if (e.namespace && this._core.settings.startPosition === 'URLHash') { + $(window).trigger('hashchange.owl.navigation'); + } + }, this), + 'prepared.owl.carousel': $.proxy(function(e) { + if (e.namespace) { + var hash = $(e.content).find('[data-hash]').addBack('[data-hash]').attr('data-hash'); + + if (!hash) { + return; + } + + this._hashes[hash] = e.content; + } + }, this), + 'changed.owl.carousel': $.proxy(function(e) { + if (e.namespace && e.property.name === 'position') { + var current = this._core.items(this._core.relative(this._core.current())), + hash = $.map(this._hashes, function(item, hash) { + return item === current ? hash : null; + }).join(); + + if (!hash || window.location.hash.slice(1) === hash) { + return; + } + + window.location.hash = hash; + } + }, this) + }; + + // set default options + this._core.options = $.extend({}, Hash.Defaults, this._core.options); + + // register the event handlers + this.$element.on(this._handlers); + + // register event listener for hash navigation + $(window).on('hashchange.owl.navigation', $.proxy(function(e) { + var hash = window.location.hash.substring(1), + items = this._core.$stage.children(), + position = this._hashes[hash] && items.index(this._hashes[hash]); + + if (position === undefined || position === this._core.current()) { + return; + } + + this._core.to(this._core.relative(position), false, true); + }, this)); + }; + + /** + * Default options. + * @public + */ + Hash.Defaults = { + URLhashListener: false + }; + + /** + * Destroys the plugin. + * @public + */ + Hash.prototype.destroy = function() { + var handler, property; + + $(window).off('hashchange.owl.navigation'); + + for (handler in this._handlers) { + this._core.$element.off(handler, this._handlers[handler]); + } + for (property in Object.getOwnPropertyNames(this)) { + typeof this[property] != 'function' && (this[property] = null); + } + }; + + $.fn.owlCarousel.Constructor.Plugins.Hash = Hash; + +})(window.Zepto || window.jQuery, window, document); + +/** + * Support Plugin + * + * @version 2.1.0 + * @author Vivid Planet Software GmbH + * @author Artus Kolanowski + * @author David Deutsch + * @license The MIT License (MIT) + */ +;(function($, window, document, undefined) { + + var style = $('').get(0).style, + prefixes = 'Webkit Moz O ms'.split(' '), + events = { + transition: { + end: { + WebkitTransition: 'webkitTransitionEnd', + MozTransition: 'transitionend', + OTransition: 'oTransitionEnd', + transition: 'transitionend' + } + }, + animation: { + end: { + WebkitAnimation: 'webkitAnimationEnd', + MozAnimation: 'animationend', + OAnimation: 'oAnimationEnd', + animation: 'animationend' + } + } + }, + tests = { + csstransforms: function() { + return !!test('transform'); + }, + csstransforms3d: function() { + return !!test('perspective'); + }, + csstransitions: function() { + return !!test('transition'); + }, + cssanimations: function() { + return !!test('animation'); + } + }; + + function test(property, prefixed) { + var result = false, + upper = property.charAt(0).toUpperCase() + property.slice(1); + + $.each((property + ' ' + prefixes.join(upper + ' ') + upper).split(' '), function(i, property) { + if (style[property] !== undefined) { + result = prefixed ? property : true; + return false; + } + }); + + return result; + } + + function prefixed(property) { + return test(property, true); + } + + if (tests.csstransitions()) { + /* jshint -W053 */ + $.support.transition = new String(prefixed('transition')) + $.support.transition.end = events.transition.end[ $.support.transition ]; + } + + if (tests.cssanimations()) { + /* jshint -W053 */ + $.support.animation = new String(prefixed('animation')) + $.support.animation.end = events.animation.end[ $.support.animation ]; + } + + if (tests.csstransforms()) { + /* jshint -W053 */ + $.support.transform = new String(prefixed('transform')); + $.support.transform3d = tests.csstransforms3d(); + } + +})(window.Zepto || window.jQuery, window, document); diff --git a/Monitor/wwwroot/assets/plugins/owl.carousel/dist/owl.carousel.min.js b/Monitor/wwwroot/assets/plugins/owl.carousel/dist/owl.carousel.min.js new file mode 100644 index 0000000..9b9566f --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/owl.carousel/dist/owl.carousel.min.js @@ -0,0 +1,7 @@ +/** + * Owl Carousel v2.2.1 + * Copyright 2013-2017 David Deutsch + * Licensed under () + */ +!function(a,b,c,d){function e(b,c){this.settings=null,this.options=a.extend({},e.Defaults,c),this.$element=a(b),this._handlers={},this._plugins={},this._supress={},this._current=null,this._speed=null,this._coordinates=[],this._breakpoint=null,this._width=null,this._items=[],this._clones=[],this._mergers=[],this._widths=[],this._invalidated={},this._pipe=[],this._drag={time:null,target:null,pointer:null,stage:{start:null,current:null},direction:null},this._states={current:{},tags:{initializing:["busy"],animating:["busy"],dragging:["interacting"]}},a.each(["onResize","onThrottledResize"],a.proxy(function(b,c){this._handlers[c]=a.proxy(this[c],this)},this)),a.each(e.Plugins,a.proxy(function(a,b){this._plugins[a.charAt(0).toLowerCase()+a.slice(1)]=new b(this)},this)),a.each(e.Workers,a.proxy(function(b,c){this._pipe.push({filter:c.filter,run:a.proxy(c.run,this)})},this)),this.setup(),this.initialize()}e.Defaults={items:3,loop:!1,center:!1,rewind:!1,mouseDrag:!0,touchDrag:!0,pullDrag:!0,freeDrag:!1,margin:0,stagePadding:0,merge:!1,mergeFit:!0,autoWidth:!1,startPosition:0,rtl:!1,smartSpeed:250,fluidSpeed:!1,dragEndSpeed:!1,responsive:{},responsiveRefreshRate:200,responsiveBaseElement:b,fallbackEasing:"swing",info:!1,nestedItemSelector:!1,itemElement:"div",stageElement:"div",refreshClass:"owl-refresh",loadedClass:"owl-loaded",loadingClass:"owl-loading",rtlClass:"owl-rtl",responsiveClass:"owl-responsive",dragClass:"owl-drag",itemClass:"owl-item",stageClass:"owl-stage",stageOuterClass:"owl-stage-outer",grabClass:"owl-grab"},e.Width={Default:"default",Inner:"inner",Outer:"outer"},e.Type={Event:"event",State:"state"},e.Plugins={},e.Workers=[{filter:["width","settings"],run:function(){this._width=this.$element.width()}},{filter:["width","items","settings"],run:function(a){a.current=this._items&&this._items[this.relative(this._current)]}},{filter:["items","settings"],run:function(){this.$stage.children(".cloned").remove()}},{filter:["width","items","settings"],run:function(a){var b=this.settings.margin||"",c=!this.settings.autoWidth,d=this.settings.rtl,e={width:"auto","margin-left":d?b:"","margin-right":d?"":b};!c&&this.$stage.children().css(e),a.css=e}},{filter:["width","items","settings"],run:function(a){var b=(this.width()/this.settings.items).toFixed(3)-this.settings.margin,c=null,d=this._items.length,e=!this.settings.autoWidth,f=[];for(a.items={merge:!1,width:b};d--;)c=this._mergers[d],c=this.settings.mergeFit&&Math.min(c,this.settings.items)||c,a.items.merge=c>1||a.items.merge,f[d]=e?b*c:this._items[d].width();this._widths=f}},{filter:["items","settings"],run:function(){var b=[],c=this._items,d=this.settings,e=Math.max(2*d.items,4),f=2*Math.ceil(c.length/2),g=d.loop&&c.length?d.rewind?e:Math.max(e,f):0,h="",i="";for(g/=2;g--;)b.push(this.normalize(b.length/2,!0)),h+=c[b[b.length-1]][0].outerHTML,b.push(this.normalize(c.length-1-(b.length-1)/2,!0)),i=c[b[b.length-1]][0].outerHTML+i;this._clones=b,a(h).addClass("cloned").appendTo(this.$stage),a(i).addClass("cloned").prependTo(this.$stage)}},{filter:["width","items","settings"],run:function(){for(var a=this.settings.rtl?1:-1,b=this._clones.length+this._items.length,c=-1,d=0,e=0,f=[];++c",h)||this.op(b,"<",g)&&this.op(b,">",h))&&i.push(c);this.$stage.children(".active").removeClass("active"),this.$stage.children(":eq("+i.join("), :eq(")+")").addClass("active"),this.settings.center&&(this.$stage.children(".center").removeClass("center"),this.$stage.children().eq(this.current()).addClass("center"))}}],e.prototype.initialize=function(){if(this.enter("initializing"),this.trigger("initialize"),this.$element.toggleClass(this.settings.rtlClass,this.settings.rtl),this.settings.autoWidth&&!this.is("pre-loading")){var b,c,e;b=this.$element.find("img"),c=this.settings.nestedItemSelector?"."+this.settings.nestedItemSelector:d,e=this.$element.children(c).width(),b.length&&e<=0&&this.preloadAutoWidthImages(b)}this.$element.addClass(this.options.loadingClass),this.$stage=a("<"+this.settings.stageElement+' class="'+this.settings.stageClass+'"/>').wrap('
          '),this.$element.append(this.$stage.parent()),this.replace(this.$element.children().not(this.$stage.parent())),this.$element.is(":visible")?this.refresh():this.invalidate("width"),this.$element.removeClass(this.options.loadingClass).addClass(this.options.loadedClass),this.registerEventHandlers(),this.leave("initializing"),this.trigger("initialized")},e.prototype.setup=function(){var b=this.viewport(),c=this.options.responsive,d=-1,e=null;c?(a.each(c,function(a){a<=b&&a>d&&(d=Number(a))}),e=a.extend({},this.options,c[d]),"function"==typeof e.stagePadding&&(e.stagePadding=e.stagePadding()),delete e.responsive,e.responsiveClass&&this.$element.attr("class",this.$element.attr("class").replace(new RegExp("("+this.options.responsiveClass+"-)\\S+\\s","g"),"$1"+d))):e=a.extend({},this.options),this.trigger("change",{property:{name:"settings",value:e}}),this._breakpoint=d,this.settings=e,this.invalidate("settings"),this.trigger("changed",{property:{name:"settings",value:this.settings}})},e.prototype.optionsLogic=function(){this.settings.autoWidth&&(this.settings.stagePadding=!1,this.settings.merge=!1)},e.prototype.prepare=function(b){var c=this.trigger("prepare",{content:b});return c.data||(c.data=a("<"+this.settings.itemElement+"/>").addClass(this.options.itemClass).append(b)),this.trigger("prepared",{content:c.data}),c.data},e.prototype.update=function(){for(var b=0,c=this._pipe.length,d=a.proxy(function(a){return this[a]},this._invalidated),e={};b0)&&this._pipe[b].run(e),b++;this._invalidated={},!this.is("valid")&&this.enter("valid")},e.prototype.width=function(a){switch(a=a||e.Width.Default){case e.Width.Inner:case e.Width.Outer:return this._width;default:return this._width-2*this.settings.stagePadding+this.settings.margin}},e.prototype.refresh=function(){this.enter("refreshing"),this.trigger("refresh"),this.setup(),this.optionsLogic(),this.$element.addClass(this.options.refreshClass),this.update(),this.$element.removeClass(this.options.refreshClass),this.leave("refreshing"),this.trigger("refreshed")},e.prototype.onThrottledResize=function(){b.clearTimeout(this.resizeTimer),this.resizeTimer=b.setTimeout(this._handlers.onResize,this.settings.responsiveRefreshRate)},e.prototype.onResize=function(){return!!this._items.length&&(this._width!==this.$element.width()&&(!!this.$element.is(":visible")&&(this.enter("resizing"),this.trigger("resize").isDefaultPrevented()?(this.leave("resizing"),!1):(this.invalidate("width"),this.refresh(),this.leave("resizing"),void this.trigger("resized")))))},e.prototype.registerEventHandlers=function(){a.support.transition&&this.$stage.on(a.support.transition.end+".owl.core",a.proxy(this.onTransitionEnd,this)),this.settings.responsive!==!1&&this.on(b,"resize",this._handlers.onThrottledResize),this.settings.mouseDrag&&(this.$element.addClass(this.options.dragClass),this.$stage.on("mousedown.owl.core",a.proxy(this.onDragStart,this)),this.$stage.on("dragstart.owl.core selectstart.owl.core",function(){return!1})),this.settings.touchDrag&&(this.$stage.on("touchstart.owl.core",a.proxy(this.onDragStart,this)),this.$stage.on("touchcancel.owl.core",a.proxy(this.onDragEnd,this)))},e.prototype.onDragStart=function(b){var d=null;3!==b.which&&(a.support.transform?(d=this.$stage.css("transform").replace(/.*\(|\)| /g,"").split(","),d={x:d[16===d.length?12:4],y:d[16===d.length?13:5]}):(d=this.$stage.position(),d={x:this.settings.rtl?d.left+this.$stage.width()-this.width()+this.settings.margin:d.left,y:d.top}),this.is("animating")&&(a.support.transform?this.animate(d.x):this.$stage.stop(),this.invalidate("position")),this.$element.toggleClass(this.options.grabClass,"mousedown"===b.type),this.speed(0),this._drag.time=(new Date).getTime(),this._drag.target=a(b.target),this._drag.stage.start=d,this._drag.stage.current=d,this._drag.pointer=this.pointer(b),a(c).on("mouseup.owl.core touchend.owl.core",a.proxy(this.onDragEnd,this)),a(c).one("mousemove.owl.core touchmove.owl.core",a.proxy(function(b){var d=this.difference(this._drag.pointer,this.pointer(b));a(c).on("mousemove.owl.core touchmove.owl.core",a.proxy(this.onDragMove,this)),Math.abs(d.x)0^this.settings.rtl?"left":"right";a(c).off(".owl.core"),this.$element.removeClass(this.options.grabClass),(0!==d.x&&this.is("dragging")||!this.is("valid"))&&(this.speed(this.settings.dragEndSpeed||this.settings.smartSpeed),this.current(this.closest(e.x,0!==d.x?f:this._drag.direction)),this.invalidate("position"),this.update(),this._drag.direction=f,(Math.abs(d.x)>3||(new Date).getTime()-this._drag.time>300)&&this._drag.target.one("click.owl.core",function(){return!1})),this.is("dragging")&&(this.leave("dragging"),this.trigger("dragged"))},e.prototype.closest=function(b,c){var d=-1,e=30,f=this.width(),g=this.coordinates();return this.settings.freeDrag||a.each(g,a.proxy(function(a,h){return"left"===c&&b>h-e&&bh-f-e&&b",g[a+1]||h-f)&&(d="left"===c?a+1:a),d===-1},this)),this.settings.loop||(this.op(b,">",g[this.minimum()])?d=b=this.minimum():this.op(b,"<",g[this.maximum()])&&(d=b=this.maximum())),d},e.prototype.animate=function(b){var c=this.speed()>0;this.is("animating")&&this.onTransitionEnd(),c&&(this.enter("animating"),this.trigger("translate")),a.support.transform3d&&a.support.transition?this.$stage.css({transform:"translate3d("+b+"px,0px,0px)",transition:this.speed()/1e3+"s"}):c?this.$stage.animate({left:b+"px"},this.speed(),this.settings.fallbackEasing,a.proxy(this.onTransitionEnd,this)):this.$stage.css({left:b+"px"})},e.prototype.is=function(a){return this._states.current[a]&&this._states.current[a]>0},e.prototype.current=function(a){if(a===d)return this._current;if(0===this._items.length)return d;if(a=this.normalize(a),this._current!==a){var b=this.trigger("change",{property:{name:"position",value:a}});b.data!==d&&(a=this.normalize(b.data)),this._current=a,this.invalidate("position"),this.trigger("changed",{property:{name:"position",value:this._current}})}return this._current},e.prototype.invalidate=function(b){return"string"===a.type(b)&&(this._invalidated[b]=!0,this.is("valid")&&this.leave("valid")),a.map(this._invalidated,function(a,b){return b})},e.prototype.reset=function(a){a=this.normalize(a),a!==d&&(this._speed=0,this._current=a,this.suppress(["translate","translated"]),this.animate(this.coordinates(a)),this.release(["translate","translated"]))},e.prototype.normalize=function(a,b){var c=this._items.length,e=b?0:this._clones.length;return!this.isNumeric(a)||c<1?a=d:(a<0||a>=c+e)&&(a=((a-e/2)%c+c)%c+e/2),a},e.prototype.relative=function(a){return a-=this._clones.length/2,this.normalize(a,!0)},e.prototype.maximum=function(a){var b,c,d,e=this.settings,f=this._coordinates.length;if(e.loop)f=this._clones.length/2+this._items.length-1;else if(e.autoWidth||e.merge){for(b=this._items.length,c=this._items[--b].width(),d=this.$element.width();b--&&(c+=this._items[b].width()+this.settings.margin,!(c>d)););f=b+1}else f=e.center?this._items.length-1:this._items.length-e.items;return a&&(f-=this._clones.length/2),Math.max(f,0)},e.prototype.minimum=function(a){return a?0:this._clones.length/2},e.prototype.items=function(a){return a===d?this._items.slice():(a=this.normalize(a,!0),this._items[a])},e.prototype.mergers=function(a){return a===d?this._mergers.slice():(a=this.normalize(a,!0),this._mergers[a])},e.prototype.clones=function(b){var c=this._clones.length/2,e=c+this._items.length,f=function(a){return a%2===0?e+a/2:c-(a+1)/2};return b===d?a.map(this._clones,function(a,b){return f(b)}):a.map(this._clones,function(a,c){return a===b?f(c):null})},e.prototype.speed=function(a){return a!==d&&(this._speed=a),this._speed},e.prototype.coordinates=function(b){var c,e=1,f=b-1;return b===d?a.map(this._coordinates,a.proxy(function(a,b){return this.coordinates(b)},this)):(this.settings.center?(this.settings.rtl&&(e=-1,f=b+1),c=this._coordinates[b],c+=(this.width()-c+(this._coordinates[f]||0))/2*e):c=this._coordinates[f]||0,c=Math.ceil(c))},e.prototype.duration=function(a,b,c){return 0===c?0:Math.min(Math.max(Math.abs(b-a),1),6)*Math.abs(c||this.settings.smartSpeed)},e.prototype.to=function(a,b){var c=this.current(),d=null,e=a-this.relative(c),f=(e>0)-(e<0),g=this._items.length,h=this.minimum(),i=this.maximum();this.settings.loop?(!this.settings.rewind&&Math.abs(e)>g/2&&(e+=f*-1*g),a=c+e,d=((a-h)%g+g)%g+h,d!==a&&d-e<=i&&d-e>0&&(c=d-e,a=d,this.reset(c))):this.settings.rewind?(i+=1,a=(a%i+i)%i):a=Math.max(h,Math.min(i,a)),this.speed(this.duration(c,a,b)),this.current(a),this.$element.is(":visible")&&this.update()},e.prototype.next=function(a){a=a||!1,this.to(this.relative(this.current())+1,a)},e.prototype.prev=function(a){a=a||!1,this.to(this.relative(this.current())-1,a)},e.prototype.onTransitionEnd=function(a){if(a!==d&&(a.stopPropagation(),(a.target||a.srcElement||a.originalTarget)!==this.$stage.get(0)))return!1;this.leave("animating"),this.trigger("translated")},e.prototype.viewport=function(){var d;return this.options.responsiveBaseElement!==b?d=a(this.options.responsiveBaseElement).width():b.innerWidth?d=b.innerWidth:c.documentElement&&c.documentElement.clientWidth?d=c.documentElement.clientWidth:console.warn("Can not detect viewport width."),d},e.prototype.replace=function(b){this.$stage.empty(),this._items=[],b&&(b=b instanceof jQuery?b:a(b)),this.settings.nestedItemSelector&&(b=b.find("."+this.settings.nestedItemSelector)),b.filter(function(){return 1===this.nodeType}).each(a.proxy(function(a,b){b=this.prepare(b),this.$stage.append(b),this._items.push(b),this._mergers.push(1*b.find("[data-merge]").addBack("[data-merge]").attr("data-merge")||1)},this)),this.reset(this.isNumeric(this.settings.startPosition)?this.settings.startPosition:0),this.invalidate("items")},e.prototype.add=function(b,c){var e=this.relative(this._current);c=c===d?this._items.length:this.normalize(c,!0),b=b instanceof jQuery?b:a(b),this.trigger("add",{content:b,position:c}),b=this.prepare(b),0===this._items.length||c===this._items.length?(0===this._items.length&&this.$stage.append(b),0!==this._items.length&&this._items[c-1].after(b),this._items.push(b),this._mergers.push(1*b.find("[data-merge]").addBack("[data-merge]").attr("data-merge")||1)):(this._items[c].before(b),this._items.splice(c,0,b),this._mergers.splice(c,0,1*b.find("[data-merge]").addBack("[data-merge]").attr("data-merge")||1)),this._items[e]&&this.reset(this._items[e].index()),this.invalidate("items"),this.trigger("added",{content:b,position:c})},e.prototype.remove=function(a){a=this.normalize(a,!0),a!==d&&(this.trigger("remove",{content:this._items[a],position:a}),this._items[a].remove(),this._items.splice(a,1),this._mergers.splice(a,1),this.invalidate("items"),this.trigger("removed",{content:null,position:a}))},e.prototype.preloadAutoWidthImages=function(b){b.each(a.proxy(function(b,c){this.enter("pre-loading"),c=a(c),a(new Image).one("load",a.proxy(function(a){c.attr("src",a.target.src),c.css("opacity",1),this.leave("pre-loading"),!this.is("pre-loading")&&!this.is("initializing")&&this.refresh()},this)).attr("src",c.attr("src")||c.attr("data-src")||c.attr("data-src-retina"))},this))},e.prototype.destroy=function(){this.$element.off(".owl.core"),this.$stage.off(".owl.core"),a(c).off(".owl.core"),this.settings.responsive!==!1&&(b.clearTimeout(this.resizeTimer),this.off(b,"resize",this._handlers.onThrottledResize));for(var d in this._plugins)this._plugins[d].destroy();this.$stage.children(".cloned").remove(),this.$stage.unwrap(),this.$stage.children().contents().unwrap(),this.$stage.children().unwrap(),this.$element.removeClass(this.options.refreshClass).removeClass(this.options.loadingClass).removeClass(this.options.loadedClass).removeClass(this.options.rtlClass).removeClass(this.options.dragClass).removeClass(this.options.grabClass).attr("class",this.$element.attr("class").replace(new RegExp(this.options.responsiveClass+"-\\S+\\s","g"),"")).removeData("owl.carousel")},e.prototype.op=function(a,b,c){var d=this.settings.rtl;switch(b){case"<":return d?a>c:a":return d?ac;case">=":return d?a<=c:a>=c;case"<=":return d?a>=c:a<=c}},e.prototype.on=function(a,b,c,d){a.addEventListener?a.addEventListener(b,c,d):a.attachEvent&&a.attachEvent("on"+b,c)},e.prototype.off=function(a,b,c,d){a.removeEventListener?a.removeEventListener(b,c,d):a.detachEvent&&a.detachEvent("on"+b,c)},e.prototype.trigger=function(b,c,d,f,g){var h={item:{count:this._items.length,index:this.current()}},i=a.camelCase(a.grep(["on",b,d],function(a){return a}).join("-").toLowerCase()),j=a.Event([b,"owl",d||"carousel"].join(".").toLowerCase(),a.extend({relatedTarget:this},h,c));return this._supress[b]||(a.each(this._plugins,function(a,b){b.onTrigger&&b.onTrigger(j)}),this.register({type:e.Type.Event,name:b}),this.$element.trigger(j),this.settings&&"function"==typeof this.settings[i]&&this.settings[i].call(this,j)),j},e.prototype.enter=function(b){a.each([b].concat(this._states.tags[b]||[]),a.proxy(function(a,b){this._states.current[b]===d&&(this._states.current[b]=0),this._states.current[b]++},this))},e.prototype.leave=function(b){a.each([b].concat(this._states.tags[b]||[]),a.proxy(function(a,b){this._states.current[b]--},this))},e.prototype.register=function(b){if(b.type===e.Type.Event){if(a.event.special[b.name]||(a.event.special[b.name]={}),!a.event.special[b.name].owl){var c=a.event.special[b.name]._default;a.event.special[b.name]._default=function(a){return!c||!c.apply||a.namespace&&a.namespace.indexOf("owl")!==-1?a.namespace&&a.namespace.indexOf("owl")>-1:c.apply(this,arguments)},a.event.special[b.name].owl=!0}}else b.type===e.Type.State&&(this._states.tags[b.name]?this._states.tags[b.name]=this._states.tags[b.name].concat(b.tags):this._states.tags[b.name]=b.tags,this._states.tags[b.name]=a.grep(this._states.tags[b.name],a.proxy(function(c,d){return a.inArray(c,this._states.tags[b.name])===d},this)))},e.prototype.suppress=function(b){a.each(b,a.proxy(function(a,b){this._supress[b]=!0},this))},e.prototype.release=function(b){a.each(b,a.proxy(function(a,b){delete this._supress[b]},this))},e.prototype.pointer=function(a){var c={x:null,y:null};return a=a.originalEvent||a||b.event,a=a.touches&&a.touches.length?a.touches[0]:a.changedTouches&&a.changedTouches.length?a.changedTouches[0]:a,a.pageX?(c.x=a.pageX,c.y=a.pageY):(c.x=a.clientX,c.y=a.clientY),c},e.prototype.isNumeric=function(a){return!isNaN(parseFloat(a))},e.prototype.difference=function(a,b){return{x:a.x-b.x,y:a.y-b.y}},a.fn.owlCarousel=function(b){var c=Array.prototype.slice.call(arguments,1);return this.each(function(){var d=a(this),f=d.data("owl.carousel");f||(f=new e(this,"object"==typeof b&&b),d.data("owl.carousel",f),a.each(["next","prev","to","destroy","refresh","replace","add","remove"],function(b,c){f.register({type:e.Type.Event,name:c}),f.$element.on(c+".owl.carousel.core",a.proxy(function(a){a.namespace&&a.relatedTarget!==this&&(this.suppress([c]),f[c].apply(this,[].slice.call(arguments,1)),this.release([c]))},f))})),"string"==typeof b&&"_"!==b.charAt(0)&&f[b].apply(f,c)})},a.fn.owlCarousel.Constructor=e}(window.Zepto||window.jQuery,window,document),function(a,b,c,d){var e=function(b){this._core=b,this._interval=null,this._visible=null,this._handlers={"initialized.owl.carousel":a.proxy(function(a){a.namespace&&this._core.settings.autoRefresh&&this.watch()},this)},this._core.options=a.extend({},e.Defaults,this._core.options),this._core.$element.on(this._handlers)};e.Defaults={autoRefresh:!0,autoRefreshInterval:500},e.prototype.watch=function(){this._interval||(this._visible=this._core.$element.is(":visible"),this._interval=b.setInterval(a.proxy(this.refresh,this),this._core.settings.autoRefreshInterval))},e.prototype.refresh=function(){this._core.$element.is(":visible")!==this._visible&&(this._visible=!this._visible,this._core.$element.toggleClass("owl-hidden",!this._visible),this._visible&&this._core.invalidate("width")&&this._core.refresh())},e.prototype.destroy=function(){var a,c;b.clearInterval(this._interval);for(a in this._handlers)this._core.$element.off(a,this._handlers[a]);for(c in Object.getOwnPropertyNames(this))"function"!=typeof this[c]&&(this[c]=null)},a.fn.owlCarousel.Constructor.Plugins.AutoRefresh=e}(window.Zepto||window.jQuery,window,document),function(a,b,c,d){var e=function(b){this._core=b,this._loaded=[],this._handlers={"initialized.owl.carousel change.owl.carousel resized.owl.carousel":a.proxy(function(b){if(b.namespace&&this._core.settings&&this._core.settings.lazyLoad&&(b.property&&"position"==b.property.name||"initialized"==b.type))for(var c=this._core.settings,e=c.center&&Math.ceil(c.items/2)||c.items,f=c.center&&e*-1||0,g=(b.property&&b.property.value!==d?b.property.value:this._core.current())+f,h=this._core.clones().length,i=a.proxy(function(a,b){this.load(b)},this);f++-1||(e.each(a.proxy(function(c,d){var e,f=a(d),g=b.devicePixelRatio>1&&f.attr("data-src-retina")||f.attr("data-src");this._core.trigger("load",{element:f,url:g},"lazy"),f.is("img")?f.one("load.owl.lazy",a.proxy(function(){f.css("opacity",1),this._core.trigger("loaded",{element:f,url:g},"lazy")},this)).attr("src",g):(e=new Image,e.onload=a.proxy(function(){f.css({"background-image":'url("'+g+'")',opacity:"1"}),this._core.trigger("loaded",{element:f,url:g},"lazy")},this),e.src=g)},this)),this._loaded.push(d.get(0)))},e.prototype.destroy=function(){var a,b;for(a in this.handlers)this._core.$element.off(a,this.handlers[a]);for(b in Object.getOwnPropertyNames(this))"function"!=typeof this[b]&&(this[b]=null)},a.fn.owlCarousel.Constructor.Plugins.Lazy=e}(window.Zepto||window.jQuery,window,document),function(a,b,c,d){var e=function(b){this._core=b,this._handlers={"initialized.owl.carousel refreshed.owl.carousel":a.proxy(function(a){a.namespace&&this._core.settings.autoHeight&&this.update()},this),"changed.owl.carousel":a.proxy(function(a){a.namespace&&this._core.settings.autoHeight&&"position"==a.property.name&&this.update()},this),"loaded.owl.lazy":a.proxy(function(a){a.namespace&&this._core.settings.autoHeight&&a.element.closest("."+this._core.settings.itemClass).index()===this._core.current()&&this.update()},this)},this._core.options=a.extend({},e.Defaults,this._core.options),this._core.$element.on(this._handlers)};e.Defaults={autoHeight:!1,autoHeightClass:"owl-height"},e.prototype.update=function(){var b=this._core._current,c=b+this._core.settings.items,d=this._core.$stage.children().toArray().slice(b,c),e=[],f=0;a.each(d,function(b,c){e.push(a(c).height())}),f=Math.max.apply(null,e),this._core.$stage.parent().height(f).addClass(this._core.settings.autoHeightClass)},e.prototype.destroy=function(){var a,b;for(a in this._handlers)this._core.$element.off(a,this._handlers[a]);for(b in Object.getOwnPropertyNames(this))"function"!=typeof this[b]&&(this[b]=null)},a.fn.owlCarousel.Constructor.Plugins.AutoHeight=e}(window.Zepto||window.jQuery,window,document),function(a,b,c,d){var e=function(b){this._core=b,this._videos={},this._playing=null,this._handlers={"initialized.owl.carousel":a.proxy(function(a){a.namespace&&this._core.register({type:"state",name:"playing",tags:["interacting"]})},this),"resize.owl.carousel":a.proxy(function(a){a.namespace&&this._core.settings.video&&this.isInFullScreen()&&a.preventDefault()},this),"refreshed.owl.carousel":a.proxy(function(a){a.namespace&&this._core.is("resizing")&&this._core.$stage.find(".cloned .owl-video-frame").remove()},this),"changed.owl.carousel":a.proxy(function(a){a.namespace&&"position"===a.property.name&&this._playing&&this.stop()},this),"prepared.owl.carousel":a.proxy(function(b){if(b.namespace){var c=a(b.content).find(".owl-video");c.length&&(c.css("display","none"),this.fetch(c,a(b.content)))}},this)},this._core.options=a.extend({},e.Defaults,this._core.options),this._core.$element.on(this._handlers),this._core.$element.on("click.owl.video",".owl-video-play-icon",a.proxy(function(a){this.play(a)},this))};e.Defaults={video:!1,videoHeight:!1,videoWidth:!1},e.prototype.fetch=function(a,b){var c=function(){return a.attr("data-vimeo-id")?"vimeo":a.attr("data-vzaar-id")?"vzaar":"youtube"}(),d=a.attr("data-vimeo-id")||a.attr("data-youtube-id")||a.attr("data-vzaar-id"),e=a.attr("data-width")||this._core.settings.videoWidth,f=a.attr("data-height")||this._core.settings.videoHeight,g=a.attr("href");if(!g)throw new Error("Missing video URL.");if(d=g.match(/(http:|https:|)\/\/(player.|www.|app.)?(vimeo\.com|youtu(be\.com|\.be|be\.googleapis\.com)|vzaar\.com)\/(video\/|videos\/|embed\/|channels\/.+\/|groups\/.+\/|watch\?v=|v\/)?([A-Za-z0-9._%-]*)(\&\S+)?/),d[3].indexOf("youtu")>-1)c="youtube";else if(d[3].indexOf("vimeo")>-1)c="vimeo";else{if(!(d[3].indexOf("vzaar")>-1))throw new Error("Video URL not supported.");c="vzaar"}d=d[6],this._videos[g]={type:c,id:d,width:e,height:f},b.attr("data-video",g),this.thumbnail(a,this._videos[g])},e.prototype.thumbnail=function(b,c){var d,e,f,g=c.width&&c.height?'style="width:'+c.width+"px;height:"+c.height+'px;"':"",h=b.find("img"),i="src",j="",k=this._core.settings,l=function(a){e='
          ',d=k.lazyLoad?'
          ':'
          ',b.after(d),b.after(e)};if(b.wrap('
          "),this._core.settings.lazyLoad&&(i="data-src",j="owl-lazy"),h.length)return l(h.attr(i)),h.remove(),!1;"youtube"===c.type?(f="//img.youtube.com/vi/"+c.id+"/hqdefault.jpg",l(f)):"vimeo"===c.type?a.ajax({type:"GET",url:"//vimeo.com/api/v2/video/"+c.id+".json",jsonp:"callback",dataType:"jsonp",success:function(a){f=a[0].thumbnail_large,l(f)}}):"vzaar"===c.type&&a.ajax({type:"GET",url:"//vzaar.com/api/videos/"+c.id+".json",jsonp:"callback",dataType:"jsonp",success:function(a){f=a.framegrab_url,l(f)}})},e.prototype.stop=function(){this._core.trigger("stop",null,"video"),this._playing.find(".owl-video-frame").remove(),this._playing.removeClass("owl-video-playing"),this._playing=null,this._core.leave("playing"),this._core.trigger("stopped",null,"video")},e.prototype.play=function(b){var c,d=a(b.target),e=d.closest("."+this._core.settings.itemClass),f=this._videos[e.attr("data-video")],g=f.width||"100%",h=f.height||this._core.$stage.height();this._playing||(this._core.enter("playing"),this._core.trigger("play",null,"video"),e=this._core.items(this._core.relative(e.index())),this._core.reset(e.index()),"youtube"===f.type?c='':"vimeo"===f.type?c='':"vzaar"===f.type&&(c=''),a('
          '+c+"
          ").insertAfter(e.find(".owl-video")),this._playing=e.addClass("owl-video-playing"))},e.prototype.isInFullScreen=function(){var b=c.fullscreenElement||c.mozFullScreenElement||c.webkitFullscreenElement;return b&&a(b).parent().hasClass("owl-video-frame")},e.prototype.destroy=function(){var a,b;this._core.$element.off("click.owl.video");for(a in this._handlers)this._core.$element.off(a,this._handlers[a]);for(b in Object.getOwnPropertyNames(this))"function"!=typeof this[b]&&(this[b]=null)},a.fn.owlCarousel.Constructor.Plugins.Video=e}(window.Zepto||window.jQuery,window,document),function(a,b,c,d){var e=function(b){this.core=b,this.core.options=a.extend({},e.Defaults,this.core.options),this.swapping=!0,this.previous=d,this.next=d,this.handlers={"change.owl.carousel":a.proxy(function(a){a.namespace&&"position"==a.property.name&&(this.previous=this.core.current(),this.next=a.property.value)},this),"drag.owl.carousel dragged.owl.carousel translated.owl.carousel":a.proxy(function(a){a.namespace&&(this.swapping="translated"==a.type)},this),"translate.owl.carousel":a.proxy(function(a){a.namespace&&this.swapping&&(this.core.options.animateOut||this.core.options.animateIn)&&this.swap()},this)},this.core.$element.on(this.handlers)};e.Defaults={animateOut:!1,animateIn:!1},e.prototype.swap=function(){if(1===this.core.settings.items&&a.support.animation&&a.support.transition){this.core.speed(0);var b,c=a.proxy(this.clear,this),d=this.core.$stage.children().eq(this.previous),e=this.core.$stage.children().eq(this.next),f=this.core.settings.animateIn,g=this.core.settings.animateOut;this.core.current()!==this.previous&&(g&&(b=this.core.coordinates(this.previous)-this.core.coordinates(this.next),d.one(a.support.animation.end,c).css({left:b+"px"}).addClass("animated owl-animated-out").addClass(g)),f&&e.one(a.support.animation.end,c).addClass("animated owl-animated-in").addClass(f))}},e.prototype.clear=function(b){a(b.target).css({left:""}).removeClass("animated owl-animated-out owl-animated-in").removeClass(this.core.settings.animateIn).removeClass(this.core.settings.animateOut),this.core.onTransitionEnd()},e.prototype.destroy=function(){var a,b;for(a in this.handlers)this.core.$element.off(a,this.handlers[a]);for(b in Object.getOwnPropertyNames(this))"function"!=typeof this[b]&&(this[b]=null)}, +a.fn.owlCarousel.Constructor.Plugins.Animate=e}(window.Zepto||window.jQuery,window,document),function(a,b,c,d){var e=function(b){this._core=b,this._timeout=null,this._paused=!1,this._handlers={"changed.owl.carousel":a.proxy(function(a){a.namespace&&"settings"===a.property.name?this._core.settings.autoplay?this.play():this.stop():a.namespace&&"position"===a.property.name&&this._core.settings.autoplay&&this._setAutoPlayInterval()},this),"initialized.owl.carousel":a.proxy(function(a){a.namespace&&this._core.settings.autoplay&&this.play()},this),"play.owl.autoplay":a.proxy(function(a,b,c){a.namespace&&this.play(b,c)},this),"stop.owl.autoplay":a.proxy(function(a){a.namespace&&this.stop()},this),"mouseover.owl.autoplay":a.proxy(function(){this._core.settings.autoplayHoverPause&&this._core.is("rotating")&&this.pause()},this),"mouseleave.owl.autoplay":a.proxy(function(){this._core.settings.autoplayHoverPause&&this._core.is("rotating")&&this.play()},this),"touchstart.owl.core":a.proxy(function(){this._core.settings.autoplayHoverPause&&this._core.is("rotating")&&this.pause()},this),"touchend.owl.core":a.proxy(function(){this._core.settings.autoplayHoverPause&&this.play()},this)},this._core.$element.on(this._handlers),this._core.options=a.extend({},e.Defaults,this._core.options)};e.Defaults={autoplay:!1,autoplayTimeout:5e3,autoplayHoverPause:!1,autoplaySpeed:!1},e.prototype.play=function(a,b){this._paused=!1,this._core.is("rotating")||(this._core.enter("rotating"),this._setAutoPlayInterval())},e.prototype._getNextTimeout=function(d,e){return this._timeout&&b.clearTimeout(this._timeout),b.setTimeout(a.proxy(function(){this._paused||this._core.is("busy")||this._core.is("interacting")||c.hidden||this._core.next(e||this._core.settings.autoplaySpeed)},this),d||this._core.settings.autoplayTimeout)},e.prototype._setAutoPlayInterval=function(){this._timeout=this._getNextTimeout()},e.prototype.stop=function(){this._core.is("rotating")&&(b.clearTimeout(this._timeout),this._core.leave("rotating"))},e.prototype.pause=function(){this._core.is("rotating")&&(this._paused=!0)},e.prototype.destroy=function(){var a,b;this.stop();for(a in this._handlers)this._core.$element.off(a,this._handlers[a]);for(b in Object.getOwnPropertyNames(this))"function"!=typeof this[b]&&(this[b]=null)},a.fn.owlCarousel.Constructor.Plugins.autoplay=e}(window.Zepto||window.jQuery,window,document),function(a,b,c,d){"use strict";var e=function(b){this._core=b,this._initialized=!1,this._pages=[],this._controls={},this._templates=[],this.$element=this._core.$element,this._overrides={next:this._core.next,prev:this._core.prev,to:this._core.to},this._handlers={"prepared.owl.carousel":a.proxy(function(b){b.namespace&&this._core.settings.dotsData&&this._templates.push('
          '+a(b.content).find("[data-dot]").addBack("[data-dot]").attr("data-dot")+"
          ")},this),"added.owl.carousel":a.proxy(function(a){a.namespace&&this._core.settings.dotsData&&this._templates.splice(a.position,0,this._templates.pop())},this),"remove.owl.carousel":a.proxy(function(a){a.namespace&&this._core.settings.dotsData&&this._templates.splice(a.position,1)},this),"changed.owl.carousel":a.proxy(function(a){a.namespace&&"position"==a.property.name&&this.draw()},this),"initialized.owl.carousel":a.proxy(function(a){a.namespace&&!this._initialized&&(this._core.trigger("initialize",null,"navigation"),this.initialize(),this.update(),this.draw(),this._initialized=!0,this._core.trigger("initialized",null,"navigation"))},this),"refreshed.owl.carousel":a.proxy(function(a){a.namespace&&this._initialized&&(this._core.trigger("refresh",null,"navigation"),this.update(),this.draw(),this._core.trigger("refreshed",null,"navigation"))},this)},this._core.options=a.extend({},e.Defaults,this._core.options),this.$element.on(this._handlers)};e.Defaults={nav:!1,navText:["prev","next"],navSpeed:!1,navElement:"div",navContainer:!1,navContainerClass:"owl-nav",navClass:["owl-prev","owl-next"],slideBy:1,dotClass:"owl-dot",dotsClass:"owl-dots",dots:!0,dotsEach:!1,dotsData:!1,dotsSpeed:!1,dotsContainer:!1},e.prototype.initialize=function(){var b,c=this._core.settings;this._controls.$relative=(c.navContainer?a(c.navContainer):a("
          ").addClass(c.navContainerClass).appendTo(this.$element)).addClass("disabled"),this._controls.$previous=a("<"+c.navElement+">").addClass(c.navClass[0]).html(c.navText[0]).prependTo(this._controls.$relative).on("click",a.proxy(function(a){this.prev(c.navSpeed)},this)),this._controls.$next=a("<"+c.navElement+">").addClass(c.navClass[1]).html(c.navText[1]).appendTo(this._controls.$relative).on("click",a.proxy(function(a){this.next(c.navSpeed)},this)),c.dotsData||(this._templates=[a("
          ").addClass(c.dotClass).append(a("")).prop("outerHTML")]),this._controls.$absolute=(c.dotsContainer?a(c.dotsContainer):a("
          ").addClass(c.dotsClass).appendTo(this.$element)).addClass("disabled"),this._controls.$absolute.on("click","div",a.proxy(function(b){var d=a(b.target).parent().is(this._controls.$absolute)?a(b.target).index():a(b.target).parent().index();b.preventDefault(),this.to(d,c.dotsSpeed)},this));for(b in this._overrides)this._core[b]=a.proxy(this[b],this)},e.prototype.destroy=function(){var a,b,c,d;for(a in this._handlers)this.$element.off(a,this._handlers[a]);for(b in this._controls)this._controls[b].remove();for(d in this.overides)this._core[d]=this._overrides[d];for(c in Object.getOwnPropertyNames(this))"function"!=typeof this[c]&&(this[c]=null)},e.prototype.update=function(){var a,b,c,d=this._core.clones().length/2,e=d+this._core.items().length,f=this._core.maximum(!0),g=this._core.settings,h=g.center||g.autoWidth||g.dotsData?1:g.dotsEach||g.items;if("page"!==g.slideBy&&(g.slideBy=Math.min(g.slideBy,g.items)),g.dots||"page"==g.slideBy)for(this._pages=[],a=d,b=0,c=0;a=h||0===b){if(this._pages.push({start:Math.min(f,a-d),end:a-d+h-1}),Math.min(f,a-d)===f)break;b=0,++c}b+=this._core.mergers(this._core.relative(a))}},e.prototype.draw=function(){var b,c=this._core.settings,d=this._core.items().length<=c.items,e=this._core.relative(this._core.current()),f=c.loop||c.rewind;this._controls.$relative.toggleClass("disabled",!c.nav||d),c.nav&&(this._controls.$previous.toggleClass("disabled",!f&&e<=this._core.minimum(!0)),this._controls.$next.toggleClass("disabled",!f&&e>=this._core.maximum(!0))),this._controls.$absolute.toggleClass("disabled",!c.dots||d),c.dots&&(b=this._pages.length-this._controls.$absolute.children().length,c.dotsData&&0!==b?this._controls.$absolute.html(this._templates.join("")):b>0?this._controls.$absolute.append(new Array(b+1).join(this._templates[0])):b<0&&this._controls.$absolute.children().slice(b).remove(),this._controls.$absolute.find(".active").removeClass("active"),this._controls.$absolute.children().eq(a.inArray(this.current(),this._pages)).addClass("active"))},e.prototype.onTrigger=function(b){var c=this._core.settings;b.page={index:a.inArray(this.current(),this._pages),count:this._pages.length,size:c&&(c.center||c.autoWidth||c.dotsData?1:c.dotsEach||c.items)}},e.prototype.current=function(){var b=this._core.relative(this._core.current());return a.grep(this._pages,a.proxy(function(a,c){return a.start<=b&&a.end>=b},this)).pop()},e.prototype.getPosition=function(b){var c,d,e=this._core.settings;return"page"==e.slideBy?(c=a.inArray(this.current(),this._pages),d=this._pages.length,b?++c:--c,c=this._pages[(c%d+d)%d].start):(c=this._core.relative(this._core.current()),d=this._core.items().length,b?c+=e.slideBy:c-=e.slideBy),c},e.prototype.next=function(b){a.proxy(this._overrides.to,this._core)(this.getPosition(!0),b)},e.prototype.prev=function(b){a.proxy(this._overrides.to,this._core)(this.getPosition(!1),b)},e.prototype.to=function(b,c,d){var e;!d&&this._pages.length?(e=this._pages.length,a.proxy(this._overrides.to,this._core)(this._pages[(b%e+e)%e].start,c)):a.proxy(this._overrides.to,this._core)(b,c)},a.fn.owlCarousel.Constructor.Plugins.Navigation=e}(window.Zepto||window.jQuery,window,document),function(a,b,c,d){"use strict";var e=function(c){this._core=c,this._hashes={},this.$element=this._core.$element,this._handlers={"initialized.owl.carousel":a.proxy(function(c){c.namespace&&"URLHash"===this._core.settings.startPosition&&a(b).trigger("hashchange.owl.navigation")},this),"prepared.owl.carousel":a.proxy(function(b){if(b.namespace){var c=a(b.content).find("[data-hash]").addBack("[data-hash]").attr("data-hash");if(!c)return;this._hashes[c]=b.content}},this),"changed.owl.carousel":a.proxy(function(c){if(c.namespace&&"position"===c.property.name){var d=this._core.items(this._core.relative(this._core.current())),e=a.map(this._hashes,function(a,b){return a===d?b:null}).join();if(!e||b.location.hash.slice(1)===e)return;b.location.hash=e}},this)},this._core.options=a.extend({},e.Defaults,this._core.options),this.$element.on(this._handlers),a(b).on("hashchange.owl.navigation",a.proxy(function(a){var c=b.location.hash.substring(1),e=this._core.$stage.children(),f=this._hashes[c]&&e.index(this._hashes[c]);f!==d&&f!==this._core.current()&&this._core.to(this._core.relative(f),!1,!0)},this))};e.Defaults={URLhashListener:!1},e.prototype.destroy=function(){var c,d;a(b).off("hashchange.owl.navigation");for(c in this._handlers)this._core.$element.off(c,this._handlers[c]);for(d in Object.getOwnPropertyNames(this))"function"!=typeof this[d]&&(this[d]=null)},a.fn.owlCarousel.Constructor.Plugins.Hash=e}(window.Zepto||window.jQuery,window,document),function(a,b,c,d){function e(b,c){var e=!1,f=b.charAt(0).toUpperCase()+b.slice(1);return a.each((b+" "+h.join(f+" ")+f).split(" "),function(a,b){if(g[b]!==d)return e=!c||b,!1}),e}function f(a){return e(a,!0)}var g=a("").get(0).style,h="Webkit Moz O ms".split(" "),i={transition:{end:{WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd",transition:"transitionend"}},animation:{end:{WebkitAnimation:"webkitAnimationEnd",MozAnimation:"animationend",OAnimation:"oAnimationEnd",animation:"animationend"}}},j={csstransforms:function(){return!!e("transform")},csstransforms3d:function(){return!!e("perspective")},csstransitions:function(){return!!e("transition")},cssanimations:function(){return!!e("animation")}};j.csstransitions()&&(a.support.transition=new String(f("transition")),a.support.transition.end=i.transition.end[a.support.transition]),j.cssanimations()&&(a.support.animation=new String(f("animation")),a.support.animation.end=i.animation.end[a.support.animation]),j.csstransforms()&&(a.support.transform=new String(f("transform")),a.support.transform3d=j.csstransforms3d())}(window.Zepto||window.jQuery,window,document); \ No newline at end of file diff --git a/Monitor/wwwroot/assets/plugins/owl.carousel/src/css/owl.carousel.css b/Monitor/wwwroot/assets/plugins/owl.carousel/src/css/owl.carousel.css new file mode 100644 index 0000000..22fdcc4 --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/owl.carousel/src/css/owl.carousel.css @@ -0,0 +1,156 @@ +/* + * Owl Carousel - Core + */ +.owl-carousel { + display: none; + width: 100%; + -webkit-tap-highlight-color: transparent; + /* position relative and z-index fix webkit rendering fonts issue */ + position: relative; + z-index: 1; } + .owl-carousel .owl-stage { + position: relative; + -ms-touch-action: pan-Y; + -moz-backface-visibility: hidden; + /* fix firefox animation glitch */ } + .owl-carousel .owl-stage:after { + content: "."; + display: block; + clear: both; + visibility: hidden; + line-height: 0; + height: 0; } + .owl-carousel .owl-stage-outer { + position: relative; + overflow: hidden; + /* fix for flashing background */ + -webkit-transform: translate3d(0px, 0px, 0px); } + .owl-carousel .owl-wrapper, + .owl-carousel .owl-item { + -webkit-backface-visibility: hidden; + -moz-backface-visibility: hidden; + -ms-backface-visibility: hidden; + -webkit-transform: translate3d(0, 0, 0); + -moz-transform: translate3d(0, 0, 0); + -ms-transform: translate3d(0, 0, 0); } + .owl-carousel .owl-item { + position: relative; + min-height: 1px; + float: left; + -webkit-backface-visibility: hidden; + -webkit-tap-highlight-color: transparent; + -webkit-touch-callout: none; } + .owl-carousel .owl-item img { + display: block; + width: 100%; } + .owl-carousel .owl-nav.disabled, + .owl-carousel .owl-dots.disabled { + display: none; } + .owl-carousel .owl-nav .owl-prev, + .owl-carousel .owl-nav .owl-next, + .owl-carousel .owl-dot { + cursor: pointer; + cursor: hand; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; } + .owl-carousel.owl-loaded { + display: block; } + .owl-carousel.owl-loading { + opacity: 0; + display: block; } + .owl-carousel.owl-hidden { + opacity: 0; } + .owl-carousel.owl-refresh .owl-item { + visibility: hidden; } + .owl-carousel.owl-drag .owl-item { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; } + .owl-carousel.owl-grab { + cursor: move; + cursor: grab; } + .owl-carousel.owl-rtl { + direction: rtl; } + .owl-carousel.owl-rtl .owl-item { + float: right; } + +/* No Js */ +.no-js .owl-carousel { + display: block; } + +/* + * Owl Carousel - Animate Plugin + */ +.owl-carousel .animated { + animation-duration: 1000ms; + animation-fill-mode: both; } +.owl-carousel .owl-animated-in { + z-index: 0; } +.owl-carousel .owl-animated-out { + z-index: 1; } +.owl-carousel .fadeOut { + animation-name: fadeOut; } + +@keyframes fadeOut { + 0% { + opacity: 1; } + 100% { + opacity: 0; } } +/* + * Owl Carousel - Auto Height Plugin + */ +.owl-height { + transition: height 500ms ease-in-out; } + +/* + * Owl Carousel - Lazy Load Plugin + */ +.owl-carousel .owl-item .owl-lazy { + opacity: 0; + transition: opacity 400ms ease; } +.owl-carousel .owl-item img.owl-lazy { + transform-style: preserve-3d; } + +/* + * Owl Carousel - Video Plugin + */ +.owl-carousel .owl-video-wrapper { + position: relative; + height: 100%; + background: #000; } +.owl-carousel .owl-video-play-icon { + position: absolute; + height: 80px; + width: 80px; + left: 50%; + top: 50%; + margin-left: -40px; + margin-top: -40px; + background: url("owl.video.play.png") no-repeat; + cursor: pointer; + z-index: 1; + -webkit-backface-visibility: hidden; + transition: transform 100ms ease; } +.owl-carousel .owl-video-play-icon:hover { + transform: scale(1.3, 1.3); } +.owl-carousel .owl-video-playing .owl-video-tn, +.owl-carousel .owl-video-playing .owl-video-play-icon { + display: none; } +.owl-carousel .owl-video-tn { + opacity: 0; + height: 100%; + background-position: center center; + background-repeat: no-repeat; + background-size: contain; + transition: opacity 400ms ease; } +.owl-carousel .owl-video-frame { + position: relative; + z-index: 1; + height: 100%; + width: 100%; } + +/*# sourceMappingURL=owl.carousel.css.map */ diff --git a/Monitor/wwwroot/assets/plugins/owl.carousel/src/css/owl.carousel.css.map b/Monitor/wwwroot/assets/plugins/owl.carousel/src/css/owl.carousel.css.map new file mode 100644 index 0000000..f02b446 --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/owl.carousel/src/css/owl.carousel.css.map @@ -0,0 +1,7 @@ +{ +"version": 3, +"mappings": "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", +"sources": ["../scss/_core.scss","../scss/_animate.scss","../scss/_autoheight.scss","../scss/_lazyload.scss","../scss/_video.scss"], +"names": [], +"file": "owl.carousel.css" +} \ No newline at end of file diff --git a/Monitor/wwwroot/assets/plugins/owl.carousel/src/css/owl.theme.default.css b/Monitor/wwwroot/assets/plugins/owl.carousel/src/css/owl.theme.default.css new file mode 100644 index 0000000..c858285 --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/owl.carousel/src/css/owl.theme.default.css @@ -0,0 +1,45 @@ +/* + * Default theme - Owl Carousel CSS File + */ +.owl-theme .owl-nav { + margin-top: 10px; + text-align: center; + -webkit-tap-highlight-color: transparent; } + .owl-theme .owl-nav [class*='owl-'] { + color: #FFF; + font-size: 14px; + margin: 5px; + padding: 4px 7px; + background: #D6D6D6; + display: inline-block; + cursor: pointer; + border-radius: 3px; } + .owl-theme .owl-nav [class*='owl-']:hover { + background: #869791; + color: #FFF; + text-decoration: none; } + .owl-theme .owl-nav .disabled { + opacity: 0.5; + cursor: default; } +.owl-theme .owl-nav.disabled + .owl-dots { + margin-top: 10px; } +.owl-theme .owl-dots { + text-align: center; + -webkit-tap-highlight-color: transparent; } + .owl-theme .owl-dots .owl-dot { + display: inline-block; + zoom: 1; + *display: inline; } + .owl-theme .owl-dots .owl-dot span { + width: 10px; + height: 10px; + margin: 5px 7px; + background: #D6D6D6; + display: block; + -webkit-backface-visibility: visible; + transition: opacity 200ms ease; + border-radius: 30px; } + .owl-theme .owl-dots .owl-dot.active span, .owl-theme .owl-dots .owl-dot:hover span { + background: #869791; } + +/*# sourceMappingURL=owl.theme.default.css.map */ diff --git a/Monitor/wwwroot/assets/plugins/owl.carousel/src/css/owl.theme.default.css.map b/Monitor/wwwroot/assets/plugins/owl.carousel/src/css/owl.theme.default.css.map new file mode 100644 index 0000000..1a5324d --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/owl.carousel/src/css/owl.theme.default.css.map @@ -0,0 +1,7 @@ +{ +"version": 3, +"mappings": "AAAA;;GAEG;ACCF,mBAAS;EACR,UAAU,EAAE,IAAI;EAChB,UAAU,EAAE,MAAM;EAClB,2BAA2B,EAAE,WAAW;EAExC,mCAAgB;IACf,KAAK,EDEW,IAAY;ICD5B,SAAS,EDEM,IAAI;ICDnB,MAAM,EDGO,GAAG;ICFhB,OAAO,EDGO,OAAQ;ICFtB,UAAU,EDaK,OAAW;ICZ1B,OAAO,EAAE,YAAY;IACrB,MAAM,EAAE,OAAO;IACf,aAAa,EAAE,GAAG;IAElB,yCAAQ;MACP,UAAU,EDQU,OAAW;MCP/B,KAAK,EDTU,IAAY;MCU3B,eAAe,EAAE,IAAI;EAGvB,6BAAU;IACT,OAAO,EDPc,GAAG;ICQxB,MAAM,EAAE,OAAO;AAKjB,wCAA8B;EAC7B,UAAU,EAAE,IAAI;AAGjB,oBAAU;EACT,UAAU,EAAE,MAAM;EAClB,2BAA2B,EAAE,WAAW;EAExC,6BAAS;IACR,OAAO,EAAE,YAAY;IACrB,IAAI,EAAE,CAAC;IACP,QAAQ,EAAE,MAAM;IAEhB,kCAAK;MACJ,KAAK,EDvBM,IAAI;MCwBf,MAAM,EDvBK,IAAI;MCwBf,MAAM,EDtBM,OAAQ;MCuBpB,UAAU,EDtBI,OAAW;MCuBzB,OAAO,EAAE,KAAK;MACd,2BAA2B,EAAE,OAAO;MACpC,UAAU,EAAE,kBAAkB;MAC9B,aAAa,EAAE,IAAI;IAKnB,mFAAK;MACJ,UAAU,ED/BS,OAAW", +"sources": ["../scss/_theme.default.scss","../scss/_theme.scss"], +"names": [], +"file": "owl.theme.default.css" +} \ No newline at end of file diff --git a/Monitor/wwwroot/assets/plugins/owl.carousel/src/css/owl.theme.green.css b/Monitor/wwwroot/assets/plugins/owl.carousel/src/css/owl.theme.green.css new file mode 100644 index 0000000..33da03b --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/owl.carousel/src/css/owl.theme.green.css @@ -0,0 +1,45 @@ +/* + * Green theme - Owl Carousel CSS File + */ +.owl-theme .owl-nav { + margin-top: 10px; + text-align: center; + -webkit-tap-highlight-color: transparent; } + .owl-theme .owl-nav [class*='owl-'] { + color: #FFF; + font-size: 14px; + margin: 5px; + padding: 4px 7px; + background: #D6D6D6; + display: inline-block; + cursor: pointer; + border-radius: 3px; } + .owl-theme .owl-nav [class*='owl-']:hover { + background: #4DC7A0; + color: #FFF; + text-decoration: none; } + .owl-theme .owl-nav .disabled { + opacity: 0.5; + cursor: default; } +.owl-theme .owl-nav.disabled + .owl-dots { + margin-top: 10px; } +.owl-theme .owl-dots { + text-align: center; + -webkit-tap-highlight-color: transparent; } + .owl-theme .owl-dots .owl-dot { + display: inline-block; + zoom: 1; + *display: inline; } + .owl-theme .owl-dots .owl-dot span { + width: 10px; + height: 10px; + margin: 5px 7px; + background: #D6D6D6; + display: block; + -webkit-backface-visibility: visible; + transition: opacity 200ms ease; + border-radius: 30px; } + .owl-theme .owl-dots .owl-dot.active span, .owl-theme .owl-dots .owl-dot:hover span { + background: #4DC7A0; } + +/*# sourceMappingURL=owl.theme.green.css.map */ diff --git a/Monitor/wwwroot/assets/plugins/owl.carousel/src/css/owl.theme.green.css.map b/Monitor/wwwroot/assets/plugins/owl.carousel/src/css/owl.theme.green.css.map new file mode 100644 index 0000000..00b0ca0 --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/owl.carousel/src/css/owl.theme.green.css.map @@ -0,0 +1,7 @@ +{ +"version": 3, +"mappings": "AAAA;;GAEG;ACCF,mBAAS;EACR,UAAU,EAAE,IAAI;EAChB,UAAU,EAAE,MAAM;EAClB,2BAA2B,EAAE,WAAW;EAExC,mCAAgB;IACf,KAAK,EDEW,IAAY;ICD5B,SAAS,EDEM,IAAI;ICDnB,MAAM,EDGO,GAAG;ICFhB,OAAO,EDGO,OAAQ;ICFtB,UAAU,EDaK,OAAW;ICZ1B,OAAO,EAAE,YAAY;IACrB,MAAM,EAAE,OAAO;IACf,aAAa,EAAE,GAAG;IAElB,yCAAQ;MACP,UAAU,EDQU,OAAW;MCP/B,KAAK,EDTU,IAAY;MCU3B,eAAe,EAAE,IAAI;EAGvB,6BAAU;IACT,OAAO,EDPc,GAAG;ICQxB,MAAM,EAAE,OAAO;AAKjB,wCAA8B;EAC7B,UAAU,EAAE,IAAI;AAGjB,oBAAU;EACT,UAAU,EAAE,MAAM;EAClB,2BAA2B,EAAE,WAAW;EAExC,6BAAS;IACR,OAAO,EAAE,YAAY;IACrB,IAAI,EAAE,CAAC;IACP,QAAQ,EAAE,MAAM;IAEhB,kCAAK;MACJ,KAAK,EDvBM,IAAI;MCwBf,MAAM,EDvBK,IAAI;MCwBf,MAAM,EDtBM,OAAQ;MCuBpB,UAAU,EDtBI,OAAW;MCuBzB,OAAO,EAAE,KAAK;MACd,2BAA2B,EAAE,OAAO;MACpC,UAAU,EAAE,kBAAkB;MAC9B,aAAa,EAAE,IAAI;IAKnB,mFAAK;MACJ,UAAU,ED/BS,OAAW", +"sources": ["../scss/_theme.green.scss","../scss/_theme.scss"], +"names": [], +"file": "owl.theme.green.css" +} \ No newline at end of file diff --git a/Monitor/wwwroot/assets/plugins/owl.carousel/src/img/ajax-loader.gif b/Monitor/wwwroot/assets/plugins/owl.carousel/src/img/ajax-loader.gif new file mode 100644 index 0000000..d3962f9 Binary files /dev/null and b/Monitor/wwwroot/assets/plugins/owl.carousel/src/img/ajax-loader.gif differ diff --git a/Monitor/wwwroot/assets/plugins/owl.carousel/src/img/owl.video.play.png b/Monitor/wwwroot/assets/plugins/owl.carousel/src/img/owl.video.play.png new file mode 100644 index 0000000..5d0218d Binary files /dev/null and b/Monitor/wwwroot/assets/plugins/owl.carousel/src/img/owl.video.play.png differ diff --git a/Monitor/wwwroot/assets/plugins/owl.carousel/src/js/.jscsrc b/Monitor/wwwroot/assets/plugins/owl.carousel/src/js/.jscsrc new file mode 100644 index 0000000..e77bac6 --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/owl.carousel/src/js/.jscsrc @@ -0,0 +1,47 @@ +{ + "requireCurlyBraces": [ "if", "else", "for", "while", "do" ], + "requireSpaceAfterKeywords": [ "if", "else", "for", "while", "do", "switch", "return" ], + "disallowKeywords": [ "with" ], + "disallowKeywordsOnNewLine": [ "else" ], + + "requireSpacesInFunctionExpression": { + "beforeOpeningCurlyBrace": true + }, + "disallowSpacesInFunctionExpression": { + "beforeOpeningRoundBrace": true + }, + + "disallowSpaceAfterObjectKeys": true, + + "requireMultipleVarDecl": "onevar", + "disallowMixedSpacesAndTabs": "smart", + "disallowTrailingWhitespace": true, + + "requireSpacesInsideObjectBrackets": "all", + "requireSpacesInsideArrayBrackets": "all", + + "requireSpacesInConditionalExpression": true, + "requireSpaceBeforeBinaryOperators": [ + "=", "+=", "-=", "*=", "/=", "%=", "<<=", ">>=", ">>>=", + "&=", "|=", "^=", "+=", + + "+", "-", "*", "/", "%", "<<", ">>", ">>>", "&", + "|", "^", "&&", "||", "===", "==", ">=", + "<=", "<", ">", "!=", "!==" + ], + "requireSpaceAfterBinaryOperators": [ + "=", "+=", "-=", "*=", "/=", "%=", "<<=", ">>=", ">>>=", + "&=", "|=", "^=", "+=", + + "+", "-", "*", "/", "%", "<<", ">>", ">>>", "&", + "|", "^", "&&", "||", "===", "==", ">=", + "<=", "<", ">", "!=", "!==" + ], + "disallowSpaceAfterPrefixUnaryOperators": [ "++", "--" ], + "disallowSpaceBeforePostfixUnaryOperators": [ "++", "--" ], + "disallowSpaceBeforeBinaryOperators": [ ",", ":" ], + + "disallowMultipleLineBreaks": true, + "requireLineFeedAtFileEnd": true, + "validateLineBreaks": "LF" +} diff --git a/Monitor/wwwroot/assets/plugins/owl.carousel/src/js/.jshintrc b/Monitor/wwwroot/assets/plugins/owl.carousel/src/js/.jshintrc new file mode 100644 index 0000000..897327a --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/owl.carousel/src/js/.jshintrc @@ -0,0 +1,13 @@ +{ + "asi" : true, + "boss" : true, + "browser" : true, + "debug" : true, + "devel" : true, + "eqeqeq" : false, + "eqnull" : true, + "expr" : true, + "laxbreak" : true, + "unused" : false, + "validthis": true +} diff --git a/Monitor/wwwroot/assets/plugins/owl.carousel/src/js/owl.animate.js b/Monitor/wwwroot/assets/plugins/owl.carousel/src/js/owl.animate.js new file mode 100644 index 0000000..11a1456 --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/owl.carousel/src/js/owl.animate.js @@ -0,0 +1,121 @@ +/** + * Animate Plugin + * @version 2.1.0 + * @author Bartosz Wojciechowski + * @author David Deutsch + * @license The MIT License (MIT) + */ +;(function($, window, document, undefined) { + + /** + * Creates the animate plugin. + * @class The Navigation Plugin + * @param {Owl} scope - The Owl Carousel + */ + var Animate = function(scope) { + this.core = scope; + this.core.options = $.extend({}, Animate.Defaults, this.core.options); + this.swapping = true; + this.previous = undefined; + this.next = undefined; + + this.handlers = { + 'change.owl.carousel': $.proxy(function(e) { + if (e.namespace && e.property.name == 'position') { + this.previous = this.core.current(); + this.next = e.property.value; + } + }, this), + 'drag.owl.carousel dragged.owl.carousel translated.owl.carousel': $.proxy(function(e) { + if (e.namespace) { + this.swapping = e.type == 'translated'; + } + }, this), + 'translate.owl.carousel': $.proxy(function(e) { + if (e.namespace && this.swapping && (this.core.options.animateOut || this.core.options.animateIn)) { + this.swap(); + } + }, this) + }; + + this.core.$element.on(this.handlers); + }; + + /** + * Default options. + * @public + */ + Animate.Defaults = { + animateOut: false, + animateIn: false + }; + + /** + * Toggles the animation classes whenever an translations starts. + * @protected + * @returns {Boolean|undefined} + */ + Animate.prototype.swap = function() { + + if (this.core.settings.items !== 1) { + return; + } + + if (!$.support.animation || !$.support.transition) { + return; + } + + this.core.speed(0); + + var left, + clear = $.proxy(this.clear, this), + previous = this.core.$stage.children().eq(this.previous), + next = this.core.$stage.children().eq(this.next), + incoming = this.core.settings.animateIn, + outgoing = this.core.settings.animateOut; + + if (this.core.current() === this.previous) { + return; + } + + if (outgoing) { + left = this.core.coordinates(this.previous) - this.core.coordinates(this.next); + previous.one($.support.animation.end, clear) + .css( { 'left': left + 'px' } ) + .addClass('animated owl-animated-out') + .addClass(outgoing); + } + + if (incoming) { + next.one($.support.animation.end, clear) + .addClass('animated owl-animated-in') + .addClass(incoming); + } + }; + + Animate.prototype.clear = function(e) { + $(e.target).css( { 'left': '' } ) + .removeClass('animated owl-animated-out owl-animated-in') + .removeClass(this.core.settings.animateIn) + .removeClass(this.core.settings.animateOut); + this.core.onTransitionEnd(); + }; + + /** + * Destroys the plugin. + * @public + */ + Animate.prototype.destroy = function() { + var handler, property; + + for (handler in this.handlers) { + this.core.$element.off(handler, this.handlers[handler]); + } + for (property in Object.getOwnPropertyNames(this)) { + typeof this[property] != 'function' && (this[property] = null); + } + }; + + $.fn.owlCarousel.Constructor.Plugins.Animate = Animate; + +})(window.Zepto || window.jQuery, window, document); diff --git a/Monitor/wwwroot/assets/plugins/owl.carousel/src/js/owl.autoheight.js b/Monitor/wwwroot/assets/plugins/owl.carousel/src/js/owl.autoheight.js new file mode 100644 index 0000000..9136daf --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/owl.carousel/src/js/owl.autoheight.js @@ -0,0 +1,97 @@ +/** + * AutoHeight Plugin + * @version 2.1.0 + * @author Bartosz Wojciechowski + * @author David Deutsch + * @license The MIT License (MIT) + */ +;(function($, window, document, undefined) { + + /** + * Creates the auto height plugin. + * @class The Auto Height Plugin + * @param {Owl} carousel - The Owl Carousel + */ + var AutoHeight = function(carousel) { + /** + * Reference to the core. + * @protected + * @type {Owl} + */ + this._core = carousel; + + /** + * All event handlers. + * @protected + * @type {Object} + */ + this._handlers = { + 'initialized.owl.carousel refreshed.owl.carousel': $.proxy(function(e) { + if (e.namespace && this._core.settings.autoHeight) { + this.update(); + } + }, this), + 'changed.owl.carousel': $.proxy(function(e) { + if (e.namespace && this._core.settings.autoHeight && e.property.name == 'position'){ + this.update(); + } + }, this), + 'loaded.owl.lazy': $.proxy(function(e) { + if (e.namespace && this._core.settings.autoHeight + && e.element.closest('.' + this._core.settings.itemClass).index() === this._core.current()) { + this.update(); + } + }, this) + }; + + // set default options + this._core.options = $.extend({}, AutoHeight.Defaults, this._core.options); + + // register event handlers + this._core.$element.on(this._handlers); + }; + + /** + * Default options. + * @public + */ + AutoHeight.Defaults = { + autoHeight: false, + autoHeightClass: 'owl-height' + }; + + /** + * Updates the view. + */ + AutoHeight.prototype.update = function() { + var start = this._core._current, + end = start + this._core.settings.items, + visible = this._core.$stage.children().toArray().slice(start, end), + heights = [], + maxheight = 0; + + $.each(visible, function(index, item) { + heights.push($(item).height()); + }); + + maxheight = Math.max.apply(null, heights); + + this._core.$stage.parent() + .height(maxheight) + .addClass(this._core.settings.autoHeightClass); + }; + + AutoHeight.prototype.destroy = function() { + var handler, property; + + for (handler in this._handlers) { + this._core.$element.off(handler, this._handlers[handler]); + } + for (property in Object.getOwnPropertyNames(this)) { + typeof this[property] != 'function' && (this[property] = null); + } + }; + + $.fn.owlCarousel.Constructor.Plugins.AutoHeight = AutoHeight; + +})(window.Zepto || window.jQuery, window, document); diff --git a/Monitor/wwwroot/assets/plugins/owl.carousel/src/js/owl.autoplay.js b/Monitor/wwwroot/assets/plugins/owl.carousel/src/js/owl.autoplay.js new file mode 100644 index 0000000..c7a10eb --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/owl.carousel/src/js/owl.autoplay.js @@ -0,0 +1,199 @@ +/** + * Autoplay Plugin + * @version 2.1.0 + * @author Bartosz Wojciechowski + * @author Artus Kolanowski + * @author David Deutsch + * @license The MIT License (MIT) + */ +;(function($, window, document, undefined) { + + /** + * Creates the autoplay plugin. + * @class The Autoplay Plugin + * @param {Owl} scope - The Owl Carousel + */ + var Autoplay = function(carousel) { + /** + * Reference to the core. + * @protected + * @type {Owl} + */ + this._core = carousel; + + /** + * The autoplay timeout. + * @type {Timeout} + */ + this._timeout = null; + + /** + * Indicates whenever the autoplay is paused. + * @type {Boolean} + */ + this._paused = false; + + /** + * All event handlers. + * @protected + * @type {Object} + */ + this._handlers = { + 'changed.owl.carousel': $.proxy(function(e) { + if (e.namespace && e.property.name === 'settings') { + if (this._core.settings.autoplay) { + this.play(); + } else { + this.stop(); + } + } else if (e.namespace && e.property.name === 'position') { + //console.log('play?', e); + if (this._core.settings.autoplay) { + this._setAutoPlayInterval(); + } + } + }, this), + 'initialized.owl.carousel': $.proxy(function(e) { + if (e.namespace && this._core.settings.autoplay) { + this.play(); + } + }, this), + 'play.owl.autoplay': $.proxy(function(e, t, s) { + if (e.namespace) { + this.play(t, s); + } + }, this), + 'stop.owl.autoplay': $.proxy(function(e) { + if (e.namespace) { + this.stop(); + } + }, this), + 'mouseover.owl.autoplay': $.proxy(function() { + if (this._core.settings.autoplayHoverPause && this._core.is('rotating')) { + this.pause(); + } + }, this), + 'mouseleave.owl.autoplay': $.proxy(function() { + if (this._core.settings.autoplayHoverPause && this._core.is('rotating')) { + this.play(); + } + }, this), + 'touchstart.owl.core': $.proxy(function() { + if (this._core.settings.autoplayHoverPause && this._core.is('rotating')) { + this.pause(); + } + }, this), + 'touchend.owl.core': $.proxy(function() { + if (this._core.settings.autoplayHoverPause) { + this.play(); + } + }, this) + }; + + // register event handlers + this._core.$element.on(this._handlers); + + // set default options + this._core.options = $.extend({}, Autoplay.Defaults, this._core.options); + }; + + /** + * Default options. + * @public + */ + Autoplay.Defaults = { + autoplay: false, + autoplayTimeout: 5000, + autoplayHoverPause: false, + autoplaySpeed: false + }; + + /** + * Starts the autoplay. + * @public + * @param {Number} [timeout] - The interval before the next animation starts. + * @param {Number} [speed] - The animation speed for the animations. + */ + Autoplay.prototype.play = function(timeout, speed) { + this._paused = false; + + if (this._core.is('rotating')) { + return; + } + + this._core.enter('rotating'); + + this._setAutoPlayInterval(); + }; + + /** + * Gets a new timeout + * @private + * @param {Number} [timeout] - The interval before the next animation starts. + * @param {Number} [speed] - The animation speed for the animations. + * @return {Timeout} + */ + Autoplay.prototype._getNextTimeout = function(timeout, speed) { + if ( this._timeout ) { + window.clearTimeout(this._timeout); + } + return window.setTimeout($.proxy(function() { + if (this._paused || this._core.is('busy') || this._core.is('interacting') || document.hidden) { + return; + } + this._core.next(speed || this._core.settings.autoplaySpeed); + }, this), timeout || this._core.settings.autoplayTimeout); + }; + + /** + * Sets autoplay in motion. + * @private + */ + Autoplay.prototype._setAutoPlayInterval = function() { + this._timeout = this._getNextTimeout(); + }; + + /** + * Stops the autoplay. + * @public + */ + Autoplay.prototype.stop = function() { + if (!this._core.is('rotating')) { + return; + } + + window.clearTimeout(this._timeout); + this._core.leave('rotating'); + }; + + /** + * Stops the autoplay. + * @public + */ + Autoplay.prototype.pause = function() { + if (!this._core.is('rotating')) { + return; + } + + this._paused = true; + }; + + /** + * Destroys the plugin. + */ + Autoplay.prototype.destroy = function() { + var handler, property; + + this.stop(); + + for (handler in this._handlers) { + this._core.$element.off(handler, this._handlers[handler]); + } + for (property in Object.getOwnPropertyNames(this)) { + typeof this[property] != 'function' && (this[property] = null); + } + }; + + $.fn.owlCarousel.Constructor.Plugins.autoplay = Autoplay; + +})(window.Zepto || window.jQuery, window, document); diff --git a/Monitor/wwwroot/assets/plugins/owl.carousel/src/js/owl.autorefresh.js b/Monitor/wwwroot/assets/plugins/owl.carousel/src/js/owl.autorefresh.js new file mode 100644 index 0000000..22cead3 --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/owl.carousel/src/js/owl.autorefresh.js @@ -0,0 +1,111 @@ +/** + * AutoRefresh Plugin + * @version 2.1.0 + * @author Artus Kolanowski + * @author David Deutsch + * @license The MIT License (MIT) + */ +;(function($, window, document, undefined) { + + /** + * Creates the auto refresh plugin. + * @class The Auto Refresh Plugin + * @param {Owl} carousel - The Owl Carousel + */ + var AutoRefresh = function(carousel) { + /** + * Reference to the core. + * @protected + * @type {Owl} + */ + this._core = carousel; + + /** + * Refresh interval. + * @protected + * @type {number} + */ + this._interval = null; + + /** + * Whether the element is currently visible or not. + * @protected + * @type {Boolean} + */ + this._visible = null; + + /** + * All event handlers. + * @protected + * @type {Object} + */ + this._handlers = { + 'initialized.owl.carousel': $.proxy(function(e) { + if (e.namespace && this._core.settings.autoRefresh) { + this.watch(); + } + }, this) + }; + + // set default options + this._core.options = $.extend({}, AutoRefresh.Defaults, this._core.options); + + // register event handlers + this._core.$element.on(this._handlers); + }; + + /** + * Default options. + * @public + */ + AutoRefresh.Defaults = { + autoRefresh: true, + autoRefreshInterval: 500 + }; + + /** + * Watches the element. + */ + AutoRefresh.prototype.watch = function() { + if (this._interval) { + return; + } + + this._visible = this._core.$element.is(':visible'); + this._interval = window.setInterval($.proxy(this.refresh, this), this._core.settings.autoRefreshInterval); + }; + + /** + * Refreshes the element. + */ + AutoRefresh.prototype.refresh = function() { + if (this._core.$element.is(':visible') === this._visible) { + return; + } + + this._visible = !this._visible; + + this._core.$element.toggleClass('owl-hidden', !this._visible); + + this._visible && (this._core.invalidate('width') && this._core.refresh()); + }; + + /** + * Destroys the plugin. + */ + AutoRefresh.prototype.destroy = function() { + var handler, property; + + window.clearInterval(this._interval); + + for (handler in this._handlers) { + this._core.$element.off(handler, this._handlers[handler]); + } + for (property in Object.getOwnPropertyNames(this)) { + typeof this[property] != 'function' && (this[property] = null); + } + }; + + $.fn.owlCarousel.Constructor.Plugins.AutoRefresh = AutoRefresh; + +})(window.Zepto || window.jQuery, window, document); diff --git a/Monitor/wwwroot/assets/plugins/owl.carousel/src/js/owl.carousel.js b/Monitor/wwwroot/assets/plugins/owl.carousel/src/js/owl.carousel.js new file mode 100644 index 0000000..cb4666e --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/owl.carousel/src/js/owl.carousel.js @@ -0,0 +1,1692 @@ +/** + * Owl carousel + * @version 2.1.6 + * @author Bartosz Wojciechowski + * @author David Deutsch + * @license The MIT License (MIT) + * @todo Lazy Load Icon + * @todo prevent animationend bubling + * @todo itemsScaleUp + * @todo Test Zepto + * @todo stagePadding calculate wrong active classes + */ +;(function($, window, document, undefined) { + + /** + * Creates a carousel. + * @class The Owl Carousel. + * @public + * @param {HTMLElement|jQuery} element - The element to create the carousel for. + * @param {Object} [options] - The options + */ + function Owl(element, options) { + + /** + * Current settings for the carousel. + * @public + */ + this.settings = null; + + /** + * Current options set by the caller including defaults. + * @public + */ + this.options = $.extend({}, Owl.Defaults, options); + + /** + * Plugin element. + * @public + */ + this.$element = $(element); + + /** + * Proxied event handlers. + * @protected + */ + this._handlers = {}; + + /** + * References to the running plugins of this carousel. + * @protected + */ + this._plugins = {}; + + /** + * Currently suppressed events to prevent them from beeing retriggered. + * @protected + */ + this._supress = {}; + + /** + * Absolute current position. + * @protected + */ + this._current = null; + + /** + * Animation speed in milliseconds. + * @protected + */ + this._speed = null; + + /** + * Coordinates of all items in pixel. + * @todo The name of this member is missleading. + * @protected + */ + this._coordinates = []; + + /** + * Current breakpoint. + * @todo Real media queries would be nice. + * @protected + */ + this._breakpoint = null; + + /** + * Current width of the plugin element. + */ + this._width = null; + + /** + * All real items. + * @protected + */ + this._items = []; + + /** + * All cloned items. + * @protected + */ + this._clones = []; + + /** + * Merge values of all items. + * @todo Maybe this could be part of a plugin. + * @protected + */ + this._mergers = []; + + /** + * Widths of all items. + */ + this._widths = []; + + /** + * Invalidated parts within the update process. + * @protected + */ + this._invalidated = {}; + + /** + * Ordered list of workers for the update process. + * @protected + */ + this._pipe = []; + + /** + * Current state information for the drag operation. + * @todo #261 + * @protected + */ + this._drag = { + time: null, + target: null, + pointer: null, + stage: { + start: null, + current: null + }, + direction: null + }; + + /** + * Current state information and their tags. + * @type {Object} + * @protected + */ + this._states = { + current: {}, + tags: { + 'initializing': [ 'busy' ], + 'animating': [ 'busy' ], + 'dragging': [ 'interacting' ] + } + }; + + $.each([ 'onResize', 'onThrottledResize' ], $.proxy(function(i, handler) { + this._handlers[handler] = $.proxy(this[handler], this); + }, this)); + + $.each(Owl.Plugins, $.proxy(function(key, plugin) { + this._plugins[key.charAt(0).toLowerCase() + key.slice(1)] + = new plugin(this); + }, this)); + + $.each(Owl.Workers, $.proxy(function(priority, worker) { + this._pipe.push({ + 'filter': worker.filter, + 'run': $.proxy(worker.run, this) + }); + }, this)); + + this.setup(); + this.initialize(); + } + + /** + * Default options for the carousel. + * @public + */ + Owl.Defaults = { + items: 3, + loop: false, + center: false, + rewind: false, + + mouseDrag: true, + touchDrag: true, + pullDrag: true, + freeDrag: false, + + margin: 0, + stagePadding: 0, + + merge: false, + mergeFit: true, + autoWidth: false, + + startPosition: 0, + rtl: false, + + smartSpeed: 250, + fluidSpeed: false, + dragEndSpeed: false, + + responsive: {}, + responsiveRefreshRate: 200, + responsiveBaseElement: window, + + fallbackEasing: 'swing', + + info: false, + + nestedItemSelector: false, + itemElement: 'div', + stageElement: 'div', + + refreshClass: 'owl-refresh', + loadedClass: 'owl-loaded', + loadingClass: 'owl-loading', + rtlClass: 'owl-rtl', + responsiveClass: 'owl-responsive', + dragClass: 'owl-drag', + itemClass: 'owl-item', + stageClass: 'owl-stage', + stageOuterClass: 'owl-stage-outer', + grabClass: 'owl-grab' + }; + + /** + * Enumeration for width. + * @public + * @readonly + * @enum {String} + */ + Owl.Width = { + Default: 'default', + Inner: 'inner', + Outer: 'outer' + }; + + /** + * Enumeration for types. + * @public + * @readonly + * @enum {String} + */ + Owl.Type = { + Event: 'event', + State: 'state' + }; + + /** + * Contains all registered plugins. + * @public + */ + Owl.Plugins = {}; + + /** + * List of workers involved in the update process. + */ + Owl.Workers = [ { + filter: [ 'width', 'settings' ], + run: function() { + this._width = this.$element.width(); + } + }, { + filter: [ 'width', 'items', 'settings' ], + run: function(cache) { + cache.current = this._items && this._items[this.relative(this._current)]; + } + }, { + filter: [ 'items', 'settings' ], + run: function() { + this.$stage.children('.cloned').remove(); + } + }, { + filter: [ 'width', 'items', 'settings' ], + run: function(cache) { + var margin = this.settings.margin || '', + grid = !this.settings.autoWidth, + rtl = this.settings.rtl, + css = { + 'width': 'auto', + 'margin-left': rtl ? margin : '', + 'margin-right': rtl ? '' : margin + }; + + !grid && this.$stage.children().css(css); + + cache.css = css; + } + }, { + filter: [ 'width', 'items', 'settings' ], + run: function(cache) { + var width = (this.width() / this.settings.items).toFixed(3) - this.settings.margin, + merge = null, + iterator = this._items.length, + grid = !this.settings.autoWidth, + widths = []; + + cache.items = { + merge: false, + width: width + }; + + while (iterator--) { + merge = this._mergers[iterator]; + merge = this.settings.mergeFit && Math.min(merge, this.settings.items) || merge; + + cache.items.merge = merge > 1 || cache.items.merge; + + widths[iterator] = !grid ? this._items[iterator].width() : width * merge; + } + + this._widths = widths; + } + }, { + filter: [ 'items', 'settings' ], + run: function() { + var clones = [], + items = this._items, + settings = this.settings, + // TODO: Should be computed from number of min width items in stage + view = Math.max(settings.items * 2, 4), + size = Math.ceil(items.length / 2) * 2, + repeat = settings.loop && items.length ? settings.rewind ? view : Math.max(view, size) : 0, + append = '', + prepend = ''; + + repeat /= 2; + + while (repeat--) { + // Switch to only using appended clones + clones.push(this.normalize(clones.length / 2, true)); + append = append + items[clones[clones.length - 1]][0].outerHTML; + clones.push(this.normalize(items.length - 1 - (clones.length - 1) / 2, true)); + prepend = items[clones[clones.length - 1]][0].outerHTML + prepend; + } + + this._clones = clones; + + $(append).addClass('cloned').appendTo(this.$stage); + $(prepend).addClass('cloned').prependTo(this.$stage); + } + }, { + filter: [ 'width', 'items', 'settings' ], + run: function() { + var rtl = this.settings.rtl ? 1 : -1, + size = this._clones.length + this._items.length, + iterator = -1, + previous = 0, + current = 0, + coordinates = []; + + while (++iterator < size) { + previous = coordinates[iterator - 1] || 0; + current = this._widths[this.relative(iterator)] + this.settings.margin; + coordinates.push(previous + current * rtl); + } + + this._coordinates = coordinates; + } + }, { + filter: [ 'width', 'items', 'settings' ], + run: function() { + var padding = this.settings.stagePadding, + coordinates = this._coordinates, + css = { + 'width': Math.ceil(Math.abs(coordinates[coordinates.length - 1])) + padding * 2, + 'padding-left': padding || '', + 'padding-right': padding || '' + }; + + this.$stage.css(css); + } + }, { + filter: [ 'width', 'items', 'settings' ], + run: function(cache) { + var iterator = this._coordinates.length, + grid = !this.settings.autoWidth, + items = this.$stage.children(); + + if (grid && cache.items.merge) { + while (iterator--) { + cache.css.width = this._widths[this.relative(iterator)]; + items.eq(iterator).css(cache.css); + } + } else if (grid) { + cache.css.width = cache.items.width; + items.css(cache.css); + } + } + }, { + filter: [ 'items' ], + run: function() { + this._coordinates.length < 1 && this.$stage.removeAttr('style'); + } + }, { + filter: [ 'width', 'items', 'settings' ], + run: function(cache) { + cache.current = cache.current ? this.$stage.children().index(cache.current) : 0; + cache.current = Math.max(this.minimum(), Math.min(this.maximum(), cache.current)); + this.reset(cache.current); + } + }, { + filter: [ 'position' ], + run: function() { + this.animate(this.coordinates(this._current)); + } + }, { + filter: [ 'width', 'position', 'items', 'settings' ], + run: function() { + var rtl = this.settings.rtl ? 1 : -1, + padding = this.settings.stagePadding * 2, + begin = this.coordinates(this.current()) + padding, + end = begin + this.width() * rtl, + inner, outer, matches = [], i, n; + + for (i = 0, n = this._coordinates.length; i < n; i++) { + inner = this._coordinates[i - 1] || 0; + outer = Math.abs(this._coordinates[i]) + padding * rtl; + + if ((this.op(inner, '<=', begin) && (this.op(inner, '>', end))) + || (this.op(outer, '<', begin) && this.op(outer, '>', end))) { + matches.push(i); + } + } + + this.$stage.children('.active').removeClass('active'); + this.$stage.children(':eq(' + matches.join('), :eq(') + ')').addClass('active'); + + if (this.settings.center) { + this.$stage.children('.center').removeClass('center'); + this.$stage.children().eq(this.current()).addClass('center'); + } + } + } ]; + + /** + * Initializes the carousel. + * @protected + */ + Owl.prototype.initialize = function() { + this.enter('initializing'); + this.trigger('initialize'); + + this.$element.toggleClass(this.settings.rtlClass, this.settings.rtl); + + if (this.settings.autoWidth && !this.is('pre-loading')) { + var imgs, nestedSelector, width; + imgs = this.$element.find('img'); + nestedSelector = this.settings.nestedItemSelector ? '.' + this.settings.nestedItemSelector : undefined; + width = this.$element.children(nestedSelector).width(); + + if (imgs.length && width <= 0) { + this.preloadAutoWidthImages(imgs); + } + } + + this.$element.addClass(this.options.loadingClass); + + // create stage + this.$stage = $('<' + this.settings.stageElement + ' class="' + this.settings.stageClass + '"/>') + .wrap('
          '); + + // append stage + this.$element.append(this.$stage.parent()); + + // append content + this.replace(this.$element.children().not(this.$stage.parent())); + + // check visibility + if (this.$element.is(':visible')) { + // update view + this.refresh(); + } else { + // invalidate width + this.invalidate('width'); + } + + this.$element + .removeClass(this.options.loadingClass) + .addClass(this.options.loadedClass); + + // register event handlers + this.registerEventHandlers(); + + this.leave('initializing'); + this.trigger('initialized'); + }; + + /** + * Setups the current settings. + * @todo Remove responsive classes. Why should adaptive designs be brought into IE8? + * @todo Support for media queries by using `matchMedia` would be nice. + * @public + */ + Owl.prototype.setup = function() { + var viewport = this.viewport(), + overwrites = this.options.responsive, + match = -1, + settings = null; + + if (!overwrites) { + settings = $.extend({}, this.options); + } else { + $.each(overwrites, function(breakpoint) { + if (breakpoint <= viewport && breakpoint > match) { + match = Number(breakpoint); + } + }); + + settings = $.extend({}, this.options, overwrites[match]); + if (typeof settings.stagePadding === 'function') { + settings.stagePadding = settings.stagePadding(); + } + delete settings.responsive; + + // responsive class + if (settings.responsiveClass) { + this.$element.attr('class', + this.$element.attr('class').replace(new RegExp('(' + this.options.responsiveClass + '-)\\S+\\s', 'g'), '$1' + match) + ); + } + } + + this.trigger('change', { property: { name: 'settings', value: settings } }); + this._breakpoint = match; + this.settings = settings; + this.invalidate('settings'); + this.trigger('changed', { property: { name: 'settings', value: this.settings } }); + }; + + /** + * Updates option logic if necessery. + * @protected + */ + Owl.prototype.optionsLogic = function() { + if (this.settings.autoWidth) { + this.settings.stagePadding = false; + this.settings.merge = false; + } + }; + + /** + * Prepares an item before add. + * @todo Rename event parameter `content` to `item`. + * @protected + * @returns {jQuery|HTMLElement} - The item container. + */ + Owl.prototype.prepare = function(item) { + var event = this.trigger('prepare', { content: item }); + + if (!event.data) { + event.data = $('<' + this.settings.itemElement + '/>') + .addClass(this.options.itemClass).append(item) + } + + this.trigger('prepared', { content: event.data }); + + return event.data; + }; + + /** + * Updates the view. + * @public + */ + Owl.prototype.update = function() { + var i = 0, + n = this._pipe.length, + filter = $.proxy(function(p) { return this[p] }, this._invalidated), + cache = {}; + + while (i < n) { + if (this._invalidated.all || $.grep(this._pipe[i].filter, filter).length > 0) { + this._pipe[i].run(cache); + } + i++; + } + + this._invalidated = {}; + + !this.is('valid') && this.enter('valid'); + }; + + /** + * Gets the width of the view. + * @public + * @param {Owl.Width} [dimension=Owl.Width.Default] - The dimension to return. + * @returns {Number} - The width of the view in pixel. + */ + Owl.prototype.width = function(dimension) { + dimension = dimension || Owl.Width.Default; + switch (dimension) { + case Owl.Width.Inner: + case Owl.Width.Outer: + return this._width; + default: + return this._width - this.settings.stagePadding * 2 + this.settings.margin; + } + }; + + /** + * Refreshes the carousel primarily for adaptive purposes. + * @public + */ + Owl.prototype.refresh = function() { + this.enter('refreshing'); + this.trigger('refresh'); + + this.setup(); + + this.optionsLogic(); + + this.$element.addClass(this.options.refreshClass); + + this.update(); + + this.$element.removeClass(this.options.refreshClass); + + this.leave('refreshing'); + this.trigger('refreshed'); + }; + + /** + * Checks window `resize` event. + * @protected + */ + Owl.prototype.onThrottledResize = function() { + window.clearTimeout(this.resizeTimer); + this.resizeTimer = window.setTimeout(this._handlers.onResize, this.settings.responsiveRefreshRate); + }; + + /** + * Checks window `resize` event. + * @protected + */ + Owl.prototype.onResize = function() { + if (!this._items.length) { + return false; + } + + if (this._width === this.$element.width()) { + return false; + } + + if (!this.$element.is(':visible')) { + return false; + } + + this.enter('resizing'); + + if (this.trigger('resize').isDefaultPrevented()) { + this.leave('resizing'); + return false; + } + + this.invalidate('width'); + + this.refresh(); + + this.leave('resizing'); + this.trigger('resized'); + }; + + /** + * Registers event handlers. + * @todo Check `msPointerEnabled` + * @todo #261 + * @protected + */ + Owl.prototype.registerEventHandlers = function() { + if ($.support.transition) { + this.$stage.on($.support.transition.end + '.owl.core', $.proxy(this.onTransitionEnd, this)); + } + + if (this.settings.responsive !== false) { + this.on(window, 'resize', this._handlers.onThrottledResize); + } + + if (this.settings.mouseDrag) { + this.$element.addClass(this.options.dragClass); + this.$stage.on('mousedown.owl.core', $.proxy(this.onDragStart, this)); + this.$stage.on('dragstart.owl.core selectstart.owl.core', function() { return false }); + } + + if (this.settings.touchDrag){ + this.$stage.on('touchstart.owl.core', $.proxy(this.onDragStart, this)); + this.$stage.on('touchcancel.owl.core', $.proxy(this.onDragEnd, this)); + } + }; + + /** + * Handles `touchstart` and `mousedown` events. + * @todo Horizontal swipe threshold as option + * @todo #261 + * @protected + * @param {Event} event - The event arguments. + */ + Owl.prototype.onDragStart = function(event) { + var stage = null; + + if (event.which === 3) { + return; + } + + if ($.support.transform) { + stage = this.$stage.css('transform').replace(/.*\(|\)| /g, '').split(','); + stage = { + x: stage[stage.length === 16 ? 12 : 4], + y: stage[stage.length === 16 ? 13 : 5] + }; + } else { + stage = this.$stage.position(); + stage = { + x: this.settings.rtl ? + stage.left + this.$stage.width() - this.width() + this.settings.margin : + stage.left, + y: stage.top + }; + } + + if (this.is('animating')) { + $.support.transform ? this.animate(stage.x) : this.$stage.stop() + this.invalidate('position'); + } + + this.$element.toggleClass(this.options.grabClass, event.type === 'mousedown'); + + this.speed(0); + + this._drag.time = new Date().getTime(); + this._drag.target = $(event.target); + this._drag.stage.start = stage; + this._drag.stage.current = stage; + this._drag.pointer = this.pointer(event); + + $(document).on('mouseup.owl.core touchend.owl.core', $.proxy(this.onDragEnd, this)); + + $(document).one('mousemove.owl.core touchmove.owl.core', $.proxy(function(event) { + var delta = this.difference(this._drag.pointer, this.pointer(event)); + + $(document).on('mousemove.owl.core touchmove.owl.core', $.proxy(this.onDragMove, this)); + + if (Math.abs(delta.x) < Math.abs(delta.y) && this.is('valid')) { + return; + } + + event.preventDefault(); + + this.enter('dragging'); + this.trigger('drag'); + }, this)); + }; + + /** + * Handles the `touchmove` and `mousemove` events. + * @todo #261 + * @protected + * @param {Event} event - The event arguments. + */ + Owl.prototype.onDragMove = function(event) { + var minimum = null, + maximum = null, + pull = null, + delta = this.difference(this._drag.pointer, this.pointer(event)), + stage = this.difference(this._drag.stage.start, delta); + + if (!this.is('dragging')) { + return; + } + + event.preventDefault(); + + if (this.settings.loop) { + minimum = this.coordinates(this.minimum()); + maximum = this.coordinates(this.maximum() + 1) - minimum; + stage.x = (((stage.x - minimum) % maximum + maximum) % maximum) + minimum; + } else { + minimum = this.settings.rtl ? this.coordinates(this.maximum()) : this.coordinates(this.minimum()); + maximum = this.settings.rtl ? this.coordinates(this.minimum()) : this.coordinates(this.maximum()); + pull = this.settings.pullDrag ? -1 * delta.x / 5 : 0; + stage.x = Math.max(Math.min(stage.x, minimum + pull), maximum + pull); + } + + this._drag.stage.current = stage; + + this.animate(stage.x); + }; + + /** + * Handles the `touchend` and `mouseup` events. + * @todo #261 + * @todo Threshold for click event + * @protected + * @param {Event} event - The event arguments. + */ + Owl.prototype.onDragEnd = function(event) { + var delta = this.difference(this._drag.pointer, this.pointer(event)), + stage = this._drag.stage.current, + direction = delta.x > 0 ^ this.settings.rtl ? 'left' : 'right'; + + $(document).off('.owl.core'); + + this.$element.removeClass(this.options.grabClass); + + if (delta.x !== 0 && this.is('dragging') || !this.is('valid')) { + this.speed(this.settings.dragEndSpeed || this.settings.smartSpeed); + this.current(this.closest(stage.x, delta.x !== 0 ? direction : this._drag.direction)); + this.invalidate('position'); + this.update(); + + this._drag.direction = direction; + + if (Math.abs(delta.x) > 3 || new Date().getTime() - this._drag.time > 300) { + this._drag.target.one('click.owl.core', function() { return false; }); + } + } + + if (!this.is('dragging')) { + return; + } + + this.leave('dragging'); + this.trigger('dragged'); + }; + + /** + * Gets absolute position of the closest item for a coordinate. + * @todo Setting `freeDrag` makes `closest` not reusable. See #165. + * @protected + * @param {Number} coordinate - The coordinate in pixel. + * @param {String} direction - The direction to check for the closest item. Ether `left` or `right`. + * @return {Number} - The absolute position of the closest item. + */ + Owl.prototype.closest = function(coordinate, direction) { + var position = -1, + pull = 30, + width = this.width(), + coordinates = this.coordinates(); + + if (!this.settings.freeDrag) { + // check closest item + $.each(coordinates, $.proxy(function(index, value) { + // on a left pull, check on current index + if (direction === 'left' && coordinate > value - pull && coordinate < value + pull) { + position = index; + // on a right pull, check on previous index + // to do so, subtract width from value and set position = index + 1 + } else if (direction === 'right' && coordinate > value - width - pull && coordinate < value - width + pull) { + position = index + 1; + } else if (this.op(coordinate, '<', value) + && this.op(coordinate, '>', coordinates[index + 1] || value - width)) { + position = direction === 'left' ? index + 1 : index; + } + return position === -1; + }, this)); + } + + if (!this.settings.loop) { + // non loop boundries + if (this.op(coordinate, '>', coordinates[this.minimum()])) { + position = coordinate = this.minimum(); + } else if (this.op(coordinate, '<', coordinates[this.maximum()])) { + position = coordinate = this.maximum(); + } + } + + return position; + }; + + /** + * Animates the stage. + * @todo #270 + * @public + * @param {Number} coordinate - The coordinate in pixels. + */ + Owl.prototype.animate = function(coordinate) { + var animate = this.speed() > 0; + + this.is('animating') && this.onTransitionEnd(); + + if (animate) { + this.enter('animating'); + this.trigger('translate'); + } + + if ($.support.transform3d && $.support.transition) { + this.$stage.css({ + transform: 'translate3d(' + coordinate + 'px,0px,0px)', + transition: (this.speed() / 1000) + 's' + }); + } else if (animate) { + this.$stage.animate({ + left: coordinate + 'px' + }, this.speed(), this.settings.fallbackEasing, $.proxy(this.onTransitionEnd, this)); + } else { + this.$stage.css({ + left: coordinate + 'px' + }); + } + }; + + /** + * Checks whether the carousel is in a specific state or not. + * @param {String} state - The state to check. + * @returns {Boolean} - The flag which indicates if the carousel is busy. + */ + Owl.prototype.is = function(state) { + return this._states.current[state] && this._states.current[state] > 0; + }; + + /** + * Sets the absolute position of the current item. + * @public + * @param {Number} [position] - The new absolute position or nothing to leave it unchanged. + * @returns {Number} - The absolute position of the current item. + */ + Owl.prototype.current = function(position) { + if (position === undefined) { + return this._current; + } + + if (this._items.length === 0) { + return undefined; + } + + position = this.normalize(position); + + if (this._current !== position) { + var event = this.trigger('change', { property: { name: 'position', value: position } }); + + if (event.data !== undefined) { + position = this.normalize(event.data); + } + + this._current = position; + + this.invalidate('position'); + + this.trigger('changed', { property: { name: 'position', value: this._current } }); + } + + return this._current; + }; + + /** + * Invalidates the given part of the update routine. + * @param {String} [part] - The part to invalidate. + * @returns {Array.} - The invalidated parts. + */ + Owl.prototype.invalidate = function(part) { + if ($.type(part) === 'string') { + this._invalidated[part] = true; + this.is('valid') && this.leave('valid'); + } + return $.map(this._invalidated, function(v, i) { return i }); + }; + + /** + * Resets the absolute position of the current item. + * @public + * @param {Number} position - The absolute position of the new item. + */ + Owl.prototype.reset = function(position) { + position = this.normalize(position); + + if (position === undefined) { + return; + } + + this._speed = 0; + this._current = position; + + this.suppress([ 'translate', 'translated' ]); + + this.animate(this.coordinates(position)); + + this.release([ 'translate', 'translated' ]); + }; + + /** + * Normalizes an absolute or a relative position of an item. + * @public + * @param {Number} position - The absolute or relative position to normalize. + * @param {Boolean} [relative=false] - Whether the given position is relative or not. + * @returns {Number} - The normalized position. + */ + Owl.prototype.normalize = function(position, relative) { + var n = this._items.length, + m = relative ? 0 : this._clones.length; + + if (!this.isNumeric(position) || n < 1) { + position = undefined; + } else if (position < 0 || position >= n + m) { + position = ((position - m / 2) % n + n) % n + m / 2; + } + + return position; + }; + + /** + * Converts an absolute position of an item into a relative one. + * @public + * @param {Number} position - The absolute position to convert. + * @returns {Number} - The converted position. + */ + Owl.prototype.relative = function(position) { + position -= this._clones.length / 2; + return this.normalize(position, true); + }; + + /** + * Gets the maximum position for the current item. + * @public + * @param {Boolean} [relative=false] - Whether to return an absolute position or a relative position. + * @returns {Number} + */ + Owl.prototype.maximum = function(relative) { + var settings = this.settings, + maximum = this._coordinates.length, + iterator, + reciprocalItemsWidth, + elementWidth; + + if (settings.loop) { + maximum = this._clones.length / 2 + this._items.length - 1; + } else if (settings.autoWidth || settings.merge) { + iterator = this._items.length; + reciprocalItemsWidth = this._items[--iterator].width(); + elementWidth = this.$element.width(); + while (iterator--) { + reciprocalItemsWidth += this._items[iterator].width() + this.settings.margin; + if (reciprocalItemsWidth > elementWidth) { + break; + } + } + maximum = iterator + 1; + } else if (settings.center) { + maximum = this._items.length - 1; + } else { + maximum = this._items.length - settings.items; + } + + if (relative) { + maximum -= this._clones.length / 2; + } + + return Math.max(maximum, 0); + }; + + /** + * Gets the minimum position for the current item. + * @public + * @param {Boolean} [relative=false] - Whether to return an absolute position or a relative position. + * @returns {Number} + */ + Owl.prototype.minimum = function(relative) { + return relative ? 0 : this._clones.length / 2; + }; + + /** + * Gets an item at the specified relative position. + * @public + * @param {Number} [position] - The relative position of the item. + * @return {jQuery|Array.} - The item at the given position or all items if no position was given. + */ + Owl.prototype.items = function(position) { + if (position === undefined) { + return this._items.slice(); + } + + position = this.normalize(position, true); + return this._items[position]; + }; + + /** + * Gets an item at the specified relative position. + * @public + * @param {Number} [position] - The relative position of the item. + * @return {jQuery|Array.} - The item at the given position or all items if no position was given. + */ + Owl.prototype.mergers = function(position) { + if (position === undefined) { + return this._mergers.slice(); + } + + position = this.normalize(position, true); + return this._mergers[position]; + }; + + /** + * Gets the absolute positions of clones for an item. + * @public + * @param {Number} [position] - The relative position of the item. + * @returns {Array.} - The absolute positions of clones for the item or all if no position was given. + */ + Owl.prototype.clones = function(position) { + var odd = this._clones.length / 2, + even = odd + this._items.length, + map = function(index) { return index % 2 === 0 ? even + index / 2 : odd - (index + 1) / 2 }; + + if (position === undefined) { + return $.map(this._clones, function(v, i) { return map(i) }); + } + + return $.map(this._clones, function(v, i) { return v === position ? map(i) : null }); + }; + + /** + * Sets the current animation speed. + * @public + * @param {Number} [speed] - The animation speed in milliseconds or nothing to leave it unchanged. + * @returns {Number} - The current animation speed in milliseconds. + */ + Owl.prototype.speed = function(speed) { + if (speed !== undefined) { + this._speed = speed; + } + + return this._speed; + }; + + /** + * Gets the coordinate of an item. + * @todo The name of this method is missleanding. + * @public + * @param {Number} position - The absolute position of the item within `minimum()` and `maximum()`. + * @returns {Number|Array.} - The coordinate of the item in pixel or all coordinates. + */ + Owl.prototype.coordinates = function(position) { + var multiplier = 1, + newPosition = position - 1, + coordinate; + + if (position === undefined) { + return $.map(this._coordinates, $.proxy(function(coordinate, index) { + return this.coordinates(index); + }, this)); + } + + if (this.settings.center) { + if (this.settings.rtl) { + multiplier = -1; + newPosition = position + 1; + } + + coordinate = this._coordinates[position]; + coordinate += (this.width() - coordinate + (this._coordinates[newPosition] || 0)) / 2 * multiplier; + } else { + coordinate = this._coordinates[newPosition] || 0; + } + + coordinate = Math.ceil(coordinate); + + return coordinate; + }; + + /** + * Calculates the speed for a translation. + * @protected + * @param {Number} from - The absolute position of the start item. + * @param {Number} to - The absolute position of the target item. + * @param {Number} [factor=undefined] - The time factor in milliseconds. + * @returns {Number} - The time in milliseconds for the translation. + */ + Owl.prototype.duration = function(from, to, factor) { + if (factor === 0) { + return 0; + } + + return Math.min(Math.max(Math.abs(to - from), 1), 6) * Math.abs((factor || this.settings.smartSpeed)); + }; + + /** + * Slides to the specified item. + * @public + * @param {Number} position - The position of the item. + * @param {Number} [speed] - The time in milliseconds for the transition. + */ + Owl.prototype.to = function(position, speed) { + var current = this.current(), + revert = null, + distance = position - this.relative(current), + direction = (distance > 0) - (distance < 0), + items = this._items.length, + minimum = this.minimum(), + maximum = this.maximum(); + + if (this.settings.loop) { + if (!this.settings.rewind && Math.abs(distance) > items / 2) { + distance += direction * -1 * items; + } + + position = current + distance; + revert = ((position - minimum) % items + items) % items + minimum; + + if (revert !== position && revert - distance <= maximum && revert - distance > 0) { + current = revert - distance; + position = revert; + this.reset(current); + } + } else if (this.settings.rewind) { + maximum += 1; + position = (position % maximum + maximum) % maximum; + } else { + position = Math.max(minimum, Math.min(maximum, position)); + } + + this.speed(this.duration(current, position, speed)); + this.current(position); + + if (this.$element.is(':visible')) { + this.update(); + } + }; + + /** + * Slides to the next item. + * @public + * @param {Number} [speed] - The time in milliseconds for the transition. + */ + Owl.prototype.next = function(speed) { + speed = speed || false; + this.to(this.relative(this.current()) + 1, speed); + }; + + /** + * Slides to the previous item. + * @public + * @param {Number} [speed] - The time in milliseconds for the transition. + */ + Owl.prototype.prev = function(speed) { + speed = speed || false; + this.to(this.relative(this.current()) - 1, speed); + }; + + /** + * Handles the end of an animation. + * @protected + * @param {Event} event - The event arguments. + */ + Owl.prototype.onTransitionEnd = function(event) { + + // if css2 animation then event object is undefined + if (event !== undefined) { + event.stopPropagation(); + + // Catch only owl-stage transitionEnd event + if ((event.target || event.srcElement || event.originalTarget) !== this.$stage.get(0)) { + return false; + } + } + + this.leave('animating'); + this.trigger('translated'); + }; + + /** + * Gets viewport width. + * @protected + * @return {Number} - The width in pixel. + */ + Owl.prototype.viewport = function() { + var width; + if (this.options.responsiveBaseElement !== window) { + width = $(this.options.responsiveBaseElement).width(); + } else if (window.innerWidth) { + width = window.innerWidth; + } else if (document.documentElement && document.documentElement.clientWidth) { + width = document.documentElement.clientWidth; + } else { + console.warn('Can not detect viewport width.'); + } + return width; + }; + + /** + * Replaces the current content. + * @public + * @param {HTMLElement|jQuery|String} content - The new content. + */ + Owl.prototype.replace = function(content) { + this.$stage.empty(); + this._items = []; + + if (content) { + content = (content instanceof jQuery) ? content : $(content); + } + + if (this.settings.nestedItemSelector) { + content = content.find('.' + this.settings.nestedItemSelector); + } + + content.filter(function() { + return this.nodeType === 1; + }).each($.proxy(function(index, item) { + item = this.prepare(item); + this.$stage.append(item); + this._items.push(item); + this._mergers.push(item.find('[data-merge]').addBack('[data-merge]').attr('data-merge') * 1 || 1); + }, this)); + + this.reset(this.isNumeric(this.settings.startPosition) ? this.settings.startPosition : 0); + + this.invalidate('items'); + }; + + /** + * Adds an item. + * @todo Use `item` instead of `content` for the event arguments. + * @public + * @param {HTMLElement|jQuery|String} content - The item content to add. + * @param {Number} [position] - The relative position at which to insert the item otherwise the item will be added to the end. + */ + Owl.prototype.add = function(content, position) { + var current = this.relative(this._current); + + position = position === undefined ? this._items.length : this.normalize(position, true); + content = content instanceof jQuery ? content : $(content); + + this.trigger('add', { content: content, position: position }); + + content = this.prepare(content); + + if (this._items.length === 0 || position === this._items.length) { + this._items.length === 0 && this.$stage.append(content); + this._items.length !== 0 && this._items[position - 1].after(content); + this._items.push(content); + this._mergers.push(content.find('[data-merge]').addBack('[data-merge]').attr('data-merge') * 1 || 1); + } else { + this._items[position].before(content); + this._items.splice(position, 0, content); + this._mergers.splice(position, 0, content.find('[data-merge]').addBack('[data-merge]').attr('data-merge') * 1 || 1); + } + + this._items[current] && this.reset(this._items[current].index()); + + this.invalidate('items'); + + this.trigger('added', { content: content, position: position }); + }; + + /** + * Removes an item by its position. + * @todo Use `item` instead of `content` for the event arguments. + * @public + * @param {Number} position - The relative position of the item to remove. + */ + Owl.prototype.remove = function(position) { + position = this.normalize(position, true); + + if (position === undefined) { + return; + } + + this.trigger('remove', { content: this._items[position], position: position }); + + this._items[position].remove(); + this._items.splice(position, 1); + this._mergers.splice(position, 1); + + this.invalidate('items'); + + this.trigger('removed', { content: null, position: position }); + }; + + /** + * Preloads images with auto width. + * @todo Replace by a more generic approach + * @protected + */ + Owl.prototype.preloadAutoWidthImages = function(images) { + images.each($.proxy(function(i, element) { + this.enter('pre-loading'); + element = $(element); + $(new Image()).one('load', $.proxy(function(e) { + element.attr('src', e.target.src); + element.css('opacity', 1); + this.leave('pre-loading'); + !this.is('pre-loading') && !this.is('initializing') && this.refresh(); + }, this)).attr('src', element.attr('src') || element.attr('data-src') || element.attr('data-src-retina')); + }, this)); + }; + + /** + * Destroys the carousel. + * @public + */ + Owl.prototype.destroy = function() { + + this.$element.off('.owl.core'); + this.$stage.off('.owl.core'); + $(document).off('.owl.core'); + + if (this.settings.responsive !== false) { + window.clearTimeout(this.resizeTimer); + this.off(window, 'resize', this._handlers.onThrottledResize); + } + + for (var i in this._plugins) { + this._plugins[i].destroy(); + } + + this.$stage.children('.cloned').remove(); + + this.$stage.unwrap(); + this.$stage.children().contents().unwrap(); + this.$stage.children().unwrap(); + + this.$element + .removeClass(this.options.refreshClass) + .removeClass(this.options.loadingClass) + .removeClass(this.options.loadedClass) + .removeClass(this.options.rtlClass) + .removeClass(this.options.dragClass) + .removeClass(this.options.grabClass) + .attr('class', this.$element.attr('class').replace(new RegExp(this.options.responsiveClass + '-\\S+\\s', 'g'), '')) + .removeData('owl.carousel'); + }; + + /** + * Operators to calculate right-to-left and left-to-right. + * @protected + * @param {Number} [a] - The left side operand. + * @param {String} [o] - The operator. + * @param {Number} [b] - The right side operand. + */ + Owl.prototype.op = function(a, o, b) { + var rtl = this.settings.rtl; + switch (o) { + case '<': + return rtl ? a > b : a < b; + case '>': + return rtl ? a < b : a > b; + case '>=': + return rtl ? a <= b : a >= b; + case '<=': + return rtl ? a >= b : a <= b; + default: + break; + } + }; + + /** + * Attaches to an internal event. + * @protected + * @param {HTMLElement} element - The event source. + * @param {String} event - The event name. + * @param {Function} listener - The event handler to attach. + * @param {Boolean} capture - Wether the event should be handled at the capturing phase or not. + */ + Owl.prototype.on = function(element, event, listener, capture) { + if (element.addEventListener) { + element.addEventListener(event, listener, capture); + } else if (element.attachEvent) { + element.attachEvent('on' + event, listener); + } + }; + + /** + * Detaches from an internal event. + * @protected + * @param {HTMLElement} element - The event source. + * @param {String} event - The event name. + * @param {Function} listener - The attached event handler to detach. + * @param {Boolean} capture - Wether the attached event handler was registered as a capturing listener or not. + */ + Owl.prototype.off = function(element, event, listener, capture) { + if (element.removeEventListener) { + element.removeEventListener(event, listener, capture); + } else if (element.detachEvent) { + element.detachEvent('on' + event, listener); + } + }; + + /** + * Triggers a public event. + * @todo Remove `status`, `relatedTarget` should be used instead. + * @protected + * @param {String} name - The event name. + * @param {*} [data=null] - The event data. + * @param {String} [namespace=carousel] - The event namespace. + * @param {String} [state] - The state which is associated with the event. + * @param {Boolean} [enter=false] - Indicates if the call enters the specified state or not. + * @returns {Event} - The event arguments. + */ + Owl.prototype.trigger = function(name, data, namespace, state, enter) { + var status = { + item: { count: this._items.length, index: this.current() } + }, handler = $.camelCase( + $.grep([ 'on', name, namespace ], function(v) { return v }) + .join('-').toLowerCase() + ), event = $.Event( + [ name, 'owl', namespace || 'carousel' ].join('.').toLowerCase(), + $.extend({ relatedTarget: this }, status, data) + ); + + if (!this._supress[name]) { + $.each(this._plugins, function(name, plugin) { + if (plugin.onTrigger) { + plugin.onTrigger(event); + } + }); + + this.register({ type: Owl.Type.Event, name: name }); + this.$element.trigger(event); + + if (this.settings && typeof this.settings[handler] === 'function') { + this.settings[handler].call(this, event); + } + } + + return event; + }; + + /** + * Enters a state. + * @param name - The state name. + */ + Owl.prototype.enter = function(name) { + $.each([ name ].concat(this._states.tags[name] || []), $.proxy(function(i, name) { + if (this._states.current[name] === undefined) { + this._states.current[name] = 0; + } + + this._states.current[name]++; + }, this)); + }; + + /** + * Leaves a state. + * @param name - The state name. + */ + Owl.prototype.leave = function(name) { + $.each([ name ].concat(this._states.tags[name] || []), $.proxy(function(i, name) { + this._states.current[name]--; + }, this)); + }; + + /** + * Registers an event or state. + * @public + * @param {Object} object - The event or state to register. + */ + Owl.prototype.register = function(object) { + if (object.type === Owl.Type.Event) { + if (!$.event.special[object.name]) { + $.event.special[object.name] = {}; + } + + if (!$.event.special[object.name].owl) { + var _default = $.event.special[object.name]._default; + $.event.special[object.name]._default = function(e) { + if (_default && _default.apply && (!e.namespace || e.namespace.indexOf('owl') === -1)) { + return _default.apply(this, arguments); + } + return e.namespace && e.namespace.indexOf('owl') > -1; + }; + $.event.special[object.name].owl = true; + } + } else if (object.type === Owl.Type.State) { + if (!this._states.tags[object.name]) { + this._states.tags[object.name] = object.tags; + } else { + this._states.tags[object.name] = this._states.tags[object.name].concat(object.tags); + } + + this._states.tags[object.name] = $.grep(this._states.tags[object.name], $.proxy(function(tag, i) { + return $.inArray(tag, this._states.tags[object.name]) === i; + }, this)); + } + }; + + /** + * Suppresses events. + * @protected + * @param {Array.} events - The events to suppress. + */ + Owl.prototype.suppress = function(events) { + $.each(events, $.proxy(function(index, event) { + this._supress[event] = true; + }, this)); + }; + + /** + * Releases suppressed events. + * @protected + * @param {Array.} events - The events to release. + */ + Owl.prototype.release = function(events) { + $.each(events, $.proxy(function(index, event) { + delete this._supress[event]; + }, this)); + }; + + /** + * Gets unified pointer coordinates from event. + * @todo #261 + * @protected + * @param {Event} - The `mousedown` or `touchstart` event. + * @returns {Object} - Contains `x` and `y` coordinates of current pointer position. + */ + Owl.prototype.pointer = function(event) { + var result = { x: null, y: null }; + + event = event.originalEvent || event || window.event; + + event = event.touches && event.touches.length ? + event.touches[0] : event.changedTouches && event.changedTouches.length ? + event.changedTouches[0] : event; + + if (event.pageX) { + result.x = event.pageX; + result.y = event.pageY; + } else { + result.x = event.clientX; + result.y = event.clientY; + } + + return result; + }; + + /** + * Determines if the input is a Number or something that can be coerced to a Number + * @protected + * @param {Number|String|Object|Array|Boolean|RegExp|Function|Symbol} - The input to be tested + * @returns {Boolean} - An indication if the input is a Number or can be coerced to a Number + */ + Owl.prototype.isNumeric = function(number) { + return !isNaN(parseFloat(number)); + }; + + /** + * Gets the difference of two vectors. + * @todo #261 + * @protected + * @param {Object} - The first vector. + * @param {Object} - The second vector. + * @returns {Object} - The difference. + */ + Owl.prototype.difference = function(first, second) { + return { + x: first.x - second.x, + y: first.y - second.y + }; + }; + + /** + * The jQuery Plugin for the Owl Carousel + * @todo Navigation plugin `next` and `prev` + * @public + */ + $.fn.owlCarousel = function(option) { + var args = Array.prototype.slice.call(arguments, 1); + + return this.each(function() { + var $this = $(this), + data = $this.data('owl.carousel'); + + if (!data) { + data = new Owl(this, typeof option == 'object' && option); + $this.data('owl.carousel', data); + + $.each([ + 'next', 'prev', 'to', 'destroy', 'refresh', 'replace', 'add', 'remove' + ], function(i, event) { + data.register({ type: Owl.Type.Event, name: event }); + data.$element.on(event + '.owl.carousel.core', $.proxy(function(e) { + if (e.namespace && e.relatedTarget !== this) { + this.suppress([ event ]); + data[event].apply(this, [].slice.call(arguments, 1)); + this.release([ event ]); + } + }, data)); + }); + } + + if (typeof option == 'string' && option.charAt(0) !== '_') { + data[option].apply(data, args); + } + }); + }; + + /** + * The constructor for the jQuery Plugin + * @public + */ + $.fn.owlCarousel.Constructor = Owl; + +})(window.Zepto || window.jQuery, window, document); diff --git a/Monitor/wwwroot/assets/plugins/owl.carousel/src/js/owl.hash.js b/Monitor/wwwroot/assets/plugins/owl.carousel/src/js/owl.hash.js new file mode 100644 index 0000000..3e88716 --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/owl.carousel/src/js/owl.hash.js @@ -0,0 +1,122 @@ +/** + * Hash Plugin + * @version 2.1.0 + * @author Artus Kolanowski + * @author David Deutsch + * @license The MIT License (MIT) + */ +;(function($, window, document, undefined) { + 'use strict'; + + /** + * Creates the hash plugin. + * @class The Hash Plugin + * @param {Owl} carousel - The Owl Carousel + */ + var Hash = function(carousel) { + /** + * Reference to the core. + * @protected + * @type {Owl} + */ + this._core = carousel; + + /** + * Hash index for the items. + * @protected + * @type {Object} + */ + this._hashes = {}; + + /** + * The carousel element. + * @type {jQuery} + */ + this.$element = this._core.$element; + + /** + * All event handlers. + * @protected + * @type {Object} + */ + this._handlers = { + 'initialized.owl.carousel': $.proxy(function(e) { + if (e.namespace && this._core.settings.startPosition === 'URLHash') { + $(window).trigger('hashchange.owl.navigation'); + } + }, this), + 'prepared.owl.carousel': $.proxy(function(e) { + if (e.namespace) { + var hash = $(e.content).find('[data-hash]').addBack('[data-hash]').attr('data-hash'); + + if (!hash) { + return; + } + + this._hashes[hash] = e.content; + } + }, this), + 'changed.owl.carousel': $.proxy(function(e) { + if (e.namespace && e.property.name === 'position') { + var current = this._core.items(this._core.relative(this._core.current())), + hash = $.map(this._hashes, function(item, hash) { + return item === current ? hash : null; + }).join(); + + if (!hash || window.location.hash.slice(1) === hash) { + return; + } + + window.location.hash = hash; + } + }, this) + }; + + // set default options + this._core.options = $.extend({}, Hash.Defaults, this._core.options); + + // register the event handlers + this.$element.on(this._handlers); + + // register event listener for hash navigation + $(window).on('hashchange.owl.navigation', $.proxy(function(e) { + var hash = window.location.hash.substring(1), + items = this._core.$stage.children(), + position = this._hashes[hash] && items.index(this._hashes[hash]); + + if (position === undefined || position === this._core.current()) { + return; + } + + this._core.to(this._core.relative(position), false, true); + }, this)); + }; + + /** + * Default options. + * @public + */ + Hash.Defaults = { + URLhashListener: false + }; + + /** + * Destroys the plugin. + * @public + */ + Hash.prototype.destroy = function() { + var handler, property; + + $(window).off('hashchange.owl.navigation'); + + for (handler in this._handlers) { + this._core.$element.off(handler, this._handlers[handler]); + } + for (property in Object.getOwnPropertyNames(this)) { + typeof this[property] != 'function' && (this[property] = null); + } + }; + + $.fn.owlCarousel.Constructor.Plugins.Hash = Hash; + +})(window.Zepto || window.jQuery, window, document); diff --git a/Monitor/wwwroot/assets/plugins/owl.carousel/src/js/owl.lazyload.js b/Monitor/wwwroot/assets/plugins/owl.carousel/src/js/owl.lazyload.js new file mode 100644 index 0000000..c9012dd --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/owl.carousel/src/js/owl.lazyload.js @@ -0,0 +1,135 @@ +/** + * Lazy Plugin + * @version 2.1.0 + * @author Bartosz Wojciechowski + * @author David Deutsch + * @license The MIT License (MIT) + */ +;(function($, window, document, undefined) { + + /** + * Creates the lazy plugin. + * @class The Lazy Plugin + * @param {Owl} carousel - The Owl Carousel + */ + var Lazy = function(carousel) { + + /** + * Reference to the core. + * @protected + * @type {Owl} + */ + this._core = carousel; + + /** + * Already loaded items. + * @protected + * @type {Array.} + */ + this._loaded = []; + + /** + * Event handlers. + * @protected + * @type {Object} + */ + this._handlers = { + 'initialized.owl.carousel change.owl.carousel resized.owl.carousel': $.proxy(function(e) { + if (!e.namespace) { + return; + } + + if (!this._core.settings || !this._core.settings.lazyLoad) { + return; + } + + if ((e.property && e.property.name == 'position') || e.type == 'initialized') { + var settings = this._core.settings, + n = (settings.center && Math.ceil(settings.items / 2) || settings.items), + i = ((settings.center && n * -1) || 0), + position = (e.property && e.property.value !== undefined ? e.property.value : this._core.current()) + i, + clones = this._core.clones().length, + load = $.proxy(function(i, v) { this.load(v) }, this); + + while (i++ < n) { + this.load(clones / 2 + this._core.relative(position)); + clones && $.each(this._core.clones(this._core.relative(position)), load); + position++; + } + } + }, this) + }; + + // set the default options + this._core.options = $.extend({}, Lazy.Defaults, this._core.options); + + // register event handler + this._core.$element.on(this._handlers); + }; + + /** + * Default options. + * @public + */ + Lazy.Defaults = { + lazyLoad: false + }; + + /** + * Loads all resources of an item at the specified position. + * @param {Number} position - The absolute position of the item. + * @protected + */ + Lazy.prototype.load = function(position) { + var $item = this._core.$stage.children().eq(position), + $elements = $item && $item.find('.owl-lazy'); + + if (!$elements || $.inArray($item.get(0), this._loaded) > -1) { + return; + } + + $elements.each($.proxy(function(index, element) { + var $element = $(element), image, + url = (window.devicePixelRatio > 1 && $element.attr('data-src-retina')) || $element.attr('data-src'); + + this._core.trigger('load', { element: $element, url: url }, 'lazy'); + + if ($element.is('img')) { + $element.one('load.owl.lazy', $.proxy(function() { + $element.css('opacity', 1); + this._core.trigger('loaded', { element: $element, url: url }, 'lazy'); + }, this)).attr('src', url); + } else { + image = new Image(); + image.onload = $.proxy(function() { + $element.css({ + 'background-image': 'url("' + url + '")', + 'opacity': '1' + }); + this._core.trigger('loaded', { element: $element, url: url }, 'lazy'); + }, this); + image.src = url; + } + }, this)); + + this._loaded.push($item.get(0)); + }; + + /** + * Destroys the plugin. + * @public + */ + Lazy.prototype.destroy = function() { + var handler, property; + + for (handler in this.handlers) { + this._core.$element.off(handler, this.handlers[handler]); + } + for (property in Object.getOwnPropertyNames(this)) { + typeof this[property] != 'function' && (this[property] = null); + } + }; + + $.fn.owlCarousel.Constructor.Plugins.Lazy = Lazy; + +})(window.Zepto || window.jQuery, window, document); diff --git a/Monitor/wwwroot/assets/plugins/owl.carousel/src/js/owl.navigation.js b/Monitor/wwwroot/assets/plugins/owl.carousel/src/js/owl.navigation.js new file mode 100644 index 0000000..d9dd8f9 --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/owl.carousel/src/js/owl.navigation.js @@ -0,0 +1,382 @@ +/** + * Navigation Plugin + * @version 2.1.0 + * @author Artus Kolanowski + * @author David Deutsch + * @license The MIT License (MIT) + */ +;(function($, window, document, undefined) { + 'use strict'; + + /** + * Creates the navigation plugin. + * @class The Navigation Plugin + * @param {Owl} carousel - The Owl Carousel. + */ + var Navigation = function(carousel) { + /** + * Reference to the core. + * @protected + * @type {Owl} + */ + this._core = carousel; + + /** + * Indicates whether the plugin is initialized or not. + * @protected + * @type {Boolean} + */ + this._initialized = false; + + /** + * The current paging indexes. + * @protected + * @type {Array} + */ + this._pages = []; + + /** + * All DOM elements of the user interface. + * @protected + * @type {Object} + */ + this._controls = {}; + + /** + * Markup for an indicator. + * @protected + * @type {Array.} + */ + this._templates = []; + + /** + * The carousel element. + * @type {jQuery} + */ + this.$element = this._core.$element; + + /** + * Overridden methods of the carousel. + * @protected + * @type {Object} + */ + this._overrides = { + next: this._core.next, + prev: this._core.prev, + to: this._core.to + }; + + /** + * All event handlers. + * @protected + * @type {Object} + */ + this._handlers = { + 'prepared.owl.carousel': $.proxy(function(e) { + if (e.namespace && this._core.settings.dotsData) { + this._templates.push('
          ' + + $(e.content).find('[data-dot]').addBack('[data-dot]').attr('data-dot') + '
          '); + } + }, this), + 'added.owl.carousel': $.proxy(function(e) { + if (e.namespace && this._core.settings.dotsData) { + this._templates.splice(e.position, 0, this._templates.pop()); + } + }, this), + 'remove.owl.carousel': $.proxy(function(e) { + if (e.namespace && this._core.settings.dotsData) { + this._templates.splice(e.position, 1); + } + }, this), + 'changed.owl.carousel': $.proxy(function(e) { + if (e.namespace && e.property.name == 'position') { + this.draw(); + } + }, this), + 'initialized.owl.carousel': $.proxy(function(e) { + if (e.namespace && !this._initialized) { + this._core.trigger('initialize', null, 'navigation'); + this.initialize(); + this.update(); + this.draw(); + this._initialized = true; + this._core.trigger('initialized', null, 'navigation'); + } + }, this), + 'refreshed.owl.carousel': $.proxy(function(e) { + if (e.namespace && this._initialized) { + this._core.trigger('refresh', null, 'navigation'); + this.update(); + this.draw(); + this._core.trigger('refreshed', null, 'navigation'); + } + }, this) + }; + + // set default options + this._core.options = $.extend({}, Navigation.Defaults, this._core.options); + + // register event handlers + this.$element.on(this._handlers); + }; + + /** + * Default options. + * @public + * @todo Rename `slideBy` to `navBy` + */ + Navigation.Defaults = { + nav: false, + navText: [ 'prev', 'next' ], + navSpeed: false, + navElement: 'div', + navContainer: false, + navContainerClass: 'owl-nav', + navClass: [ 'owl-prev', 'owl-next' ], + slideBy: 1, + dotClass: 'owl-dot', + dotsClass: 'owl-dots', + dots: true, + dotsEach: false, + dotsData: false, + dotsSpeed: false, + dotsContainer: false + }; + + /** + * Initializes the layout of the plugin and extends the carousel. + * @protected + */ + Navigation.prototype.initialize = function() { + var override, + settings = this._core.settings; + + // create DOM structure for relative navigation + this._controls.$relative = (settings.navContainer ? $(settings.navContainer) + : $('
          ').addClass(settings.navContainerClass).appendTo(this.$element)).addClass('disabled'); + + this._controls.$previous = $('<' + settings.navElement + '>') + .addClass(settings.navClass[0]) + .html(settings.navText[0]) + .prependTo(this._controls.$relative) + .on('click', $.proxy(function(e) { + this.prev(settings.navSpeed); + }, this)); + this._controls.$next = $('<' + settings.navElement + '>') + .addClass(settings.navClass[1]) + .html(settings.navText[1]) + .appendTo(this._controls.$relative) + .on('click', $.proxy(function(e) { + this.next(settings.navSpeed); + }, this)); + + // create DOM structure for absolute navigation + if (!settings.dotsData) { + this._templates = [ $('
          ') + .addClass(settings.dotClass) + .append($('')) + .prop('outerHTML') ]; + } + + this._controls.$absolute = (settings.dotsContainer ? $(settings.dotsContainer) + : $('
          ').addClass(settings.dotsClass).appendTo(this.$element)).addClass('disabled'); + + this._controls.$absolute.on('click', 'div', $.proxy(function(e) { + var index = $(e.target).parent().is(this._controls.$absolute) + ? $(e.target).index() : $(e.target).parent().index(); + + e.preventDefault(); + + this.to(index, settings.dotsSpeed); + }, this)); + + // override public methods of the carousel + for (override in this._overrides) { + this._core[override] = $.proxy(this[override], this); + } + }; + + /** + * Destroys the plugin. + * @protected + */ + Navigation.prototype.destroy = function() { + var handler, control, property, override; + + for (handler in this._handlers) { + this.$element.off(handler, this._handlers[handler]); + } + for (control in this._controls) { + this._controls[control].remove(); + } + for (override in this.overides) { + this._core[override] = this._overrides[override]; + } + for (property in Object.getOwnPropertyNames(this)) { + typeof this[property] != 'function' && (this[property] = null); + } + }; + + /** + * Updates the internal state. + * @protected + */ + Navigation.prototype.update = function() { + var i, j, k, + lower = this._core.clones().length / 2, + upper = lower + this._core.items().length, + maximum = this._core.maximum(true), + settings = this._core.settings, + size = settings.center || settings.autoWidth || settings.dotsData + ? 1 : settings.dotsEach || settings.items; + + if (settings.slideBy !== 'page') { + settings.slideBy = Math.min(settings.slideBy, settings.items); + } + + if (settings.dots || settings.slideBy == 'page') { + this._pages = []; + + for (i = lower, j = 0, k = 0; i < upper; i++) { + if (j >= size || j === 0) { + this._pages.push({ + start: Math.min(maximum, i - lower), + end: i - lower + size - 1 + }); + if (Math.min(maximum, i - lower) === maximum) { + break; + } + j = 0, ++k; + } + j += this._core.mergers(this._core.relative(i)); + } + } + }; + + /** + * Draws the user interface. + * @todo The option `dotsData` wont work. + * @protected + */ + Navigation.prototype.draw = function() { + var difference, + settings = this._core.settings, + disabled = this._core.items().length <= settings.items, + index = this._core.relative(this._core.current()), + loop = settings.loop || settings.rewind; + + this._controls.$relative.toggleClass('disabled', !settings.nav || disabled); + + if (settings.nav) { + this._controls.$previous.toggleClass('disabled', !loop && index <= this._core.minimum(true)); + this._controls.$next.toggleClass('disabled', !loop && index >= this._core.maximum(true)); + } + + this._controls.$absolute.toggleClass('disabled', !settings.dots || disabled); + + if (settings.dots) { + difference = this._pages.length - this._controls.$absolute.children().length; + + if (settings.dotsData && difference !== 0) { + this._controls.$absolute.html(this._templates.join('')); + } else if (difference > 0) { + this._controls.$absolute.append(new Array(difference + 1).join(this._templates[0])); + } else if (difference < 0) { + this._controls.$absolute.children().slice(difference).remove(); + } + + this._controls.$absolute.find('.active').removeClass('active'); + this._controls.$absolute.children().eq($.inArray(this.current(), this._pages)).addClass('active'); + } + }; + + /** + * Extends event data. + * @protected + * @param {Event} event - The event object which gets thrown. + */ + Navigation.prototype.onTrigger = function(event) { + var settings = this._core.settings; + + event.page = { + index: $.inArray(this.current(), this._pages), + count: this._pages.length, + size: settings && (settings.center || settings.autoWidth || settings.dotsData + ? 1 : settings.dotsEach || settings.items) + }; + }; + + /** + * Gets the current page position of the carousel. + * @protected + * @returns {Number} + */ + Navigation.prototype.current = function() { + var current = this._core.relative(this._core.current()); + return $.grep(this._pages, $.proxy(function(page, index) { + return page.start <= current && page.end >= current; + }, this)).pop(); + }; + + /** + * Gets the current succesor/predecessor position. + * @protected + * @returns {Number} + */ + Navigation.prototype.getPosition = function(successor) { + var position, length, + settings = this._core.settings; + + if (settings.slideBy == 'page') { + position = $.inArray(this.current(), this._pages); + length = this._pages.length; + successor ? ++position : --position; + position = this._pages[((position % length) + length) % length].start; + } else { + position = this._core.relative(this._core.current()); + length = this._core.items().length; + successor ? position += settings.slideBy : position -= settings.slideBy; + } + + return position; + }; + + /** + * Slides to the next item or page. + * @public + * @param {Number} [speed=false] - The time in milliseconds for the transition. + */ + Navigation.prototype.next = function(speed) { + $.proxy(this._overrides.to, this._core)(this.getPosition(true), speed); + }; + + /** + * Slides to the previous item or page. + * @public + * @param {Number} [speed=false] - The time in milliseconds for the transition. + */ + Navigation.prototype.prev = function(speed) { + $.proxy(this._overrides.to, this._core)(this.getPosition(false), speed); + }; + + /** + * Slides to the specified item or page. + * @public + * @param {Number} position - The position of the item or page. + * @param {Number} [speed] - The time in milliseconds for the transition. + * @param {Boolean} [standard=false] - Whether to use the standard behaviour or not. + */ + Navigation.prototype.to = function(position, speed, standard) { + var length; + + if (!standard && this._pages.length) { + length = this._pages.length; + $.proxy(this._overrides.to, this._core)(this._pages[((position % length) + length) % length].start, speed); + } else { + $.proxy(this._overrides.to, this._core)(position, speed); + } + }; + + $.fn.owlCarousel.Constructor.Plugins.Navigation = Navigation; + +})(window.Zepto || window.jQuery, window, document); diff --git a/Monitor/wwwroot/assets/plugins/owl.carousel/src/js/owl.support.js b/Monitor/wwwroot/assets/plugins/owl.carousel/src/js/owl.support.js new file mode 100644 index 0000000..779d6c9 --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/owl.carousel/src/js/owl.support.js @@ -0,0 +1,83 @@ +/** + * Support Plugin + * + * @version 2.1.0 + * @author Vivid Planet Software GmbH + * @author Artus Kolanowski + * @author David Deutsch + * @license The MIT License (MIT) + */ +;(function($, window, document, undefined) { + + var style = $('').get(0).style, + prefixes = 'Webkit Moz O ms'.split(' '), + events = { + transition: { + end: { + WebkitTransition: 'webkitTransitionEnd', + MozTransition: 'transitionend', + OTransition: 'oTransitionEnd', + transition: 'transitionend' + } + }, + animation: { + end: { + WebkitAnimation: 'webkitAnimationEnd', + MozAnimation: 'animationend', + OAnimation: 'oAnimationEnd', + animation: 'animationend' + } + } + }, + tests = { + csstransforms: function() { + return !!test('transform'); + }, + csstransforms3d: function() { + return !!test('perspective'); + }, + csstransitions: function() { + return !!test('transition'); + }, + cssanimations: function() { + return !!test('animation'); + } + }; + + function test(property, prefixed) { + var result = false, + upper = property.charAt(0).toUpperCase() + property.slice(1); + + $.each((property + ' ' + prefixes.join(upper + ' ') + upper).split(' '), function(i, property) { + if (style[property] !== undefined) { + result = prefixed ? property : true; + return false; + } + }); + + return result; + } + + function prefixed(property) { + return test(property, true); + } + + if (tests.csstransitions()) { + /* jshint -W053 */ + $.support.transition = new String(prefixed('transition')) + $.support.transition.end = events.transition.end[ $.support.transition ]; + } + + if (tests.cssanimations()) { + /* jshint -W053 */ + $.support.animation = new String(prefixed('animation')) + $.support.animation.end = events.animation.end[ $.support.animation ]; + } + + if (tests.csstransforms()) { + /* jshint -W053 */ + $.support.transform = new String(prefixed('transform')); + $.support.transform3d = tests.csstransforms3d(); + } + +})(window.Zepto || window.jQuery, window, document); diff --git a/Monitor/wwwroot/assets/plugins/owl.carousel/src/js/owl.support.modernizr.js b/Monitor/wwwroot/assets/plugins/owl.carousel/src/js/owl.support.modernizr.js new file mode 100644 index 0000000..53c4925 --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/owl.carousel/src/js/owl.support.modernizr.js @@ -0,0 +1,66 @@ +/** + * Modernizr Support Plugin + * + * @version 2.1.0 + * @author Vivid Planet Software GmbH + * @author Artus Kolanowski + * @author David Deutsch + * @license The MIT License (MIT) + */ +;(function($, Modernizr, window, document, undefined) { + + var events = { + transition: { + end: { + WebkitTransition: 'webkitTransitionEnd', + MozTransition: 'transitionend', + OTransition: 'oTransitionEnd', + transition: 'transitionend' + } + }, + animation: { + end: { + WebkitAnimation: 'webkitAnimationEnd', + MozAnimation: 'animationend', + OAnimation: 'oAnimationEnd', + animation: 'animationend' + } + } + }; + + if (!Modernizr) { + throw new Error('Modernizr is not loaded.'); + } + + $.each([ 'cssanimations', 'csstransitions', 'csstransforms', 'csstransforms3d', 'prefixed' ], function(i, property) { + if (typeof Modernizr[property] == 'undefined') { + throw new Error([ 'Modernizr "', property, '" is not loaded.' ].join('')); + } + }); + + if (Modernizr.csstransitions) { + /* jshint -W053 */ + $.support.transition = new String(Modernizr.prefixed('transition')) + $.support.transition.end = events.transition.end[ $.support.transition ]; + // fix transitionend support detection, which does not work properly for older Android versions, + // as it does not give the prefixed event name. here we use Modernizr to ensure the correct event. + // see: + // https://github.com/Modernizr/Modernizr/issues/897 + // https://github.com/niksy/modernizr-detects/commit/05d148fc4f3813b1412c836325a9ca78c7a63f4d + if (/Android 4\.[123]/.test(navigator.userAgent)) { + $.support.transition.end = 'webkitTransitionEnd'; + } + } + + if (Modernizr.cssanimations) { + /* jshint -W053 */ + $.support.animation = new String(Modernizr.prefixed('animation')) + $.support.animation.end = events.animation.end[ $.support.animation ]; + } + + if (Modernizr.csstransforms) { + /* jshint -W053 */ + $.support.transform = new String(Modernizr.prefixed('transform')); + $.support.transform3d = Modernizr.csstransforms3d; + } +})(window.Zepto || window.jQuery, window.Modernizr, window, document); diff --git a/Monitor/wwwroot/assets/plugins/owl.carousel/src/js/owl.video.js b/Monitor/wwwroot/assets/plugins/owl.carousel/src/js/owl.video.js new file mode 100644 index 0000000..7b38d34 --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/owl.carousel/src/js/owl.video.js @@ -0,0 +1,319 @@ +/** + * Video Plugin + * @version 2.1.0 + * @author Bartosz Wojciechowski + * @author David Deutsch + * @license The MIT License (MIT) + */ +;(function($, window, document, undefined) { + + /** + * Creates the video plugin. + * @class The Video Plugin + * @param {Owl} carousel - The Owl Carousel + */ + var Video = function(carousel) { + /** + * Reference to the core. + * @protected + * @type {Owl} + */ + this._core = carousel; + + /** + * Cache all video URLs. + * @protected + * @type {Object} + */ + this._videos = {}; + + /** + * Current playing item. + * @protected + * @type {jQuery} + */ + this._playing = null; + + /** + * All event handlers. + * @todo The cloned content removale is too late + * @protected + * @type {Object} + */ + this._handlers = { + 'initialized.owl.carousel': $.proxy(function(e) { + if (e.namespace) { + this._core.register({ type: 'state', name: 'playing', tags: [ 'interacting' ] }); + } + }, this), + 'resize.owl.carousel': $.proxy(function(e) { + if (e.namespace && this._core.settings.video && this.isInFullScreen()) { + e.preventDefault(); + } + }, this), + 'refreshed.owl.carousel': $.proxy(function(e) { + if (e.namespace && this._core.is('resizing')) { + this._core.$stage.find('.cloned .owl-video-frame').remove(); + } + }, this), + 'changed.owl.carousel': $.proxy(function(e) { + if (e.namespace && e.property.name === 'position' && this._playing) { + this.stop(); + } + }, this), + 'prepared.owl.carousel': $.proxy(function(e) { + if (!e.namespace) { + return; + } + + var $element = $(e.content).find('.owl-video'); + + if ($element.length) { + $element.css('display', 'none'); + this.fetch($element, $(e.content)); + } + }, this) + }; + + // set default options + this._core.options = $.extend({}, Video.Defaults, this._core.options); + + // register event handlers + this._core.$element.on(this._handlers); + + this._core.$element.on('click.owl.video', '.owl-video-play-icon', $.proxy(function(e) { + this.play(e); + }, this)); + }; + + /** + * Default options. + * @public + */ + Video.Defaults = { + video: false, + videoHeight: false, + videoWidth: false + }; + + /** + * Gets the video ID and the type (YouTube/Vimeo/vzaar only). + * @protected + * @param {jQuery} target - The target containing the video data. + * @param {jQuery} item - The item containing the video. + */ + Video.prototype.fetch = function(target, item) { + var type = (function() { + if (target.attr('data-vimeo-id')) { + return 'vimeo'; + } else if (target.attr('data-vzaar-id')) { + return 'vzaar' + } else { + return 'youtube'; + } + })(), + id = target.attr('data-vimeo-id') || target.attr('data-youtube-id') || target.attr('data-vzaar-id'), + width = target.attr('data-width') || this._core.settings.videoWidth, + height = target.attr('data-height') || this._core.settings.videoHeight, + url = target.attr('href'); + + if (url) { + + /* + Parses the id's out of the following urls (and probably more): + https://www.youtube.com/watch?v=:id + https://youtu.be/:id + https://vimeo.com/:id + https://vimeo.com/channels/:channel/:id + https://vimeo.com/groups/:group/videos/:id + https://app.vzaar.com/videos/:id + + Visual example: https://regexper.com/#(http%3A%7Chttps%3A%7C)%5C%2F%5C%2F(player.%7Cwww.%7Capp.)%3F(vimeo%5C.com%7Cyoutu(be%5C.com%7C%5C.be%7Cbe%5C.googleapis%5C.com)%7Cvzaar%5C.com)%5C%2F(video%5C%2F%7Cvideos%5C%2F%7Cembed%5C%2F%7Cchannels%5C%2F.%2B%5C%2F%7Cgroups%5C%2F.%2B%5C%2F%7Cwatch%5C%3Fv%3D%7Cv%5C%2F)%3F(%5BA-Za-z0-9._%25-%5D*)(%5C%26%5CS%2B)%3F + */ + + id = url.match(/(http:|https:|)\/\/(player.|www.|app.)?(vimeo\.com|youtu(be\.com|\.be|be\.googleapis\.com)|vzaar\.com)\/(video\/|videos\/|embed\/|channels\/.+\/|groups\/.+\/|watch\?v=|v\/)?([A-Za-z0-9._%-]*)(\&\S+)?/); + + if (id[3].indexOf('youtu') > -1) { + type = 'youtube'; + } else if (id[3].indexOf('vimeo') > -1) { + type = 'vimeo'; + } else if (id[3].indexOf('vzaar') > -1) { + type = 'vzaar'; + } else { + throw new Error('Video URL not supported.'); + } + id = id[6]; + } else { + throw new Error('Missing video URL.'); + } + + this._videos[url] = { + type: type, + id: id, + width: width, + height: height + }; + + item.attr('data-video', url); + + this.thumbnail(target, this._videos[url]); + }; + + /** + * Creates video thumbnail. + * @protected + * @param {jQuery} target - The target containing the video data. + * @param {Object} info - The video info object. + * @see `fetch` + */ + Video.prototype.thumbnail = function(target, video) { + var tnLink, + icon, + path, + dimensions = video.width && video.height ? 'style="width:' + video.width + 'px;height:' + video.height + 'px;"' : '', + customTn = target.find('img'), + srcType = 'src', + lazyClass = '', + settings = this._core.settings, + create = function(path) { + icon = '
          '; + + if (settings.lazyLoad) { + tnLink = '
          '; + } else { + tnLink = '
          '; + } + target.after(tnLink); + target.after(icon); + }; + + // wrap video content into owl-video-wrapper div + target.wrap('
          '); + + if (this._core.settings.lazyLoad) { + srcType = 'data-src'; + lazyClass = 'owl-lazy'; + } + + // custom thumbnail + if (customTn.length) { + create(customTn.attr(srcType)); + customTn.remove(); + return false; + } + + if (video.type === 'youtube') { + path = "//img.youtube.com/vi/" + video.id + "/hqdefault.jpg"; + create(path); + } else if (video.type === 'vimeo') { + $.ajax({ + type: 'GET', + url: '//vimeo.com/api/v2/video/' + video.id + '.json', + jsonp: 'callback', + dataType: 'jsonp', + success: function(data) { + path = data[0].thumbnail_large; + create(path); + } + }); + } else if (video.type === 'vzaar') { + $.ajax({ + type: 'GET', + url: '//vzaar.com/api/videos/' + video.id + '.json', + jsonp: 'callback', + dataType: 'jsonp', + success: function(data) { + path = data.framegrab_url; + create(path); + } + }); + } + }; + + /** + * Stops the current video. + * @public + */ + Video.prototype.stop = function() { + this._core.trigger('stop', null, 'video'); + this._playing.find('.owl-video-frame').remove(); + this._playing.removeClass('owl-video-playing'); + this._playing = null; + this._core.leave('playing'); + this._core.trigger('stopped', null, 'video'); + }; + + /** + * Starts the current video. + * @public + * @param {Event} event - The event arguments. + */ + Video.prototype.play = function(event) { + var target = $(event.target), + item = target.closest('.' + this._core.settings.itemClass), + video = this._videos[item.attr('data-video')], + width = video.width || '100%', + height = video.height || this._core.$stage.height(), + html; + + if (this._playing) { + return; + } + + this._core.enter('playing'); + this._core.trigger('play', null, 'video'); + + item = this._core.items(this._core.relative(item.index())); + + this._core.reset(item.index()); + + if (video.type === 'youtube') { + html = ''; + } else if (video.type === 'vimeo') { + html = ''; + } else if (video.type === 'vzaar') { + html = ''; + } + + $('
          ' + html + '
          ').insertAfter(item.find('.owl-video')); + + this._playing = item.addClass('owl-video-playing'); + }; + + /** + * Checks whether an video is currently in full screen mode or not. + * @todo Bad style because looks like a readonly method but changes members. + * @protected + * @returns {Boolean} + */ + Video.prototype.isInFullScreen = function() { + var element = document.fullscreenElement || document.mozFullScreenElement || + document.webkitFullscreenElement; + + return element && $(element).parent().hasClass('owl-video-frame'); + }; + + /** + * Destroys the plugin. + */ + Video.prototype.destroy = function() { + var handler, property; + + this._core.$element.off('click.owl.video'); + + for (handler in this._handlers) { + this._core.$element.off(handler, this._handlers[handler]); + } + for (property in Object.getOwnPropertyNames(this)) { + typeof this[property] != 'function' && (this[property] = null); + } + }; + + $.fn.owlCarousel.Constructor.Plugins.Video = Video; + +})(window.Zepto || window.jQuery, window, document); diff --git a/Monitor/wwwroot/assets/plugins/owl.carousel/src/scss/_animate.scss b/Monitor/wwwroot/assets/plugins/owl.carousel/src/scss/_animate.scss new file mode 100644 index 0000000..696d93c --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/owl.carousel/src/scss/_animate.scss @@ -0,0 +1,28 @@ +/* + * Owl Carousel - Animate Plugin + */ +.owl-carousel{ + .animated { + animation-duration: 1000ms; + animation-fill-mode: both; + } + .owl-animated-in { + z-index: 0; + } + .owl-animated-out { + z-index: 1; + } + .fadeOut { + animation-name: fadeOut; + } +} + +@keyframes fadeOut { + 0% { + opacity: 1; + } + + 100% { + opacity: 0; + } +} diff --git a/Monitor/wwwroot/assets/plugins/owl.carousel/src/scss/_autoheight.scss b/Monitor/wwwroot/assets/plugins/owl.carousel/src/scss/_autoheight.scss new file mode 100644 index 0000000..7852c3f --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/owl.carousel/src/scss/_autoheight.scss @@ -0,0 +1,7 @@ +/* + * Owl Carousel - Auto Height Plugin + */ + +.owl-height { + transition: height 500ms ease-in-out; +} diff --git a/Monitor/wwwroot/assets/plugins/owl.carousel/src/scss/_core.scss b/Monitor/wwwroot/assets/plugins/owl.carousel/src/scss/_core.scss new file mode 100644 index 0000000..6924a3a --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/owl.carousel/src/scss/_core.scss @@ -0,0 +1,115 @@ +/* + * Owl Carousel - Core + */ +.owl-carousel { + display: none; + width: 100%; + -webkit-tap-highlight-color: transparent; + /* position relative and z-index fix webkit rendering fonts issue */ + position: relative; + z-index: 1; + + .owl-stage { + position: relative; + -ms-touch-action: pan-Y; + -moz-backface-visibility: hidden; /* fix firefox animation glitch */ + } + + .owl-stage:after { + content: "."; + display: block; + clear: both; + visibility: hidden; + line-height: 0; + height: 0; + } + + .owl-stage-outer { + position: relative; + overflow: hidden; + /* fix for flashing background */ + -webkit-transform: translate3d(0px, 0px, 0px); + } + + .owl-wrapper, + .owl-item{ + -webkit-backface-visibility: hidden; + -moz-backface-visibility: hidden; + -ms-backface-visibility: hidden; + -webkit-transform: translate3d(0,0,0); + -moz-transform: translate3d(0,0,0); + -ms-transform: translate3d(0,0,0); + } + + .owl-item { + position: relative; + min-height: 1px; + float: left; + -webkit-backface-visibility: hidden; + -webkit-tap-highlight-color: transparent; + -webkit-touch-callout: none; + } + .owl-item img { + display: block; + width: 100%; + } + + .owl-nav.disabled, + .owl-dots.disabled { + display: none; + } + + .owl-nav .owl-prev, + .owl-nav .owl-next, + .owl-dot { + cursor: pointer; + cursor: hand; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + } + + &.owl-loaded { + display: block; + } + + &.owl-loading { + opacity: 0; + display: block; + } + + &.owl-hidden { + opacity: 0; + } + + &.owl-refresh .owl-item { + visibility: hidden; + } + + &.owl-drag .owl-item { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + } + + &.owl-grab { + cursor: move; + cursor: grab; + } + + &.owl-rtl { + direction: rtl; + } + + &.owl-rtl .owl-item { + float: right; + } +} + +/* No Js */ +.no-js .owl-carousel { + display: block; +} diff --git a/Monitor/wwwroot/assets/plugins/owl.carousel/src/scss/_lazyload.scss b/Monitor/wwwroot/assets/plugins/owl.carousel/src/scss/_lazyload.scss new file mode 100644 index 0000000..4f19e07 --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/owl.carousel/src/scss/_lazyload.scss @@ -0,0 +1,17 @@ +/* + * Owl Carousel - Lazy Load Plugin + */ + +.owl-carousel { + .owl-item { + .owl-lazy { + opacity: 0; + transition: opacity 400ms ease; + } + + img.owl-lazy { + transform-style: preserve-3d; + } + } +} + diff --git a/Monitor/wwwroot/assets/plugins/owl.carousel/src/scss/_theme.default.scss b/Monitor/wwwroot/assets/plugins/owl.carousel/src/scss/_theme.default.scss new file mode 100644 index 0000000..942a15e --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/owl.carousel/src/scss/_theme.default.scss @@ -0,0 +1,30 @@ +/* + * Default theme - Owl Carousel CSS File + */ + +$color-base: #869791 !default; +$color-white: #FFF !default; +$color-gray: #D6D6D6 !default; + +//nav + +$nav-color: $color-white !default; +$nav-color-hover: $color-white !default; +$nav-font-size: 14px !default; +$nav-rounded: 3px !default; +$nav-margin: 5px !default; +$nav-padding: 4px 7px !default; +$nav-background: $color-gray !default; +$nav-background-hover: $color-base !default; +$nav-disabled-opacity: 0.5 !default; + +//dots + +$dot-width: 10px !default; +$dot-height: 10px !default; +$dot-rounded: 30px !default; +$dot-margin: 5px 7px !default; +$dot-background: $color-gray !default; +$dot-background-active: $color-base !default; + +@import 'theme'; diff --git a/Monitor/wwwroot/assets/plugins/owl.carousel/src/scss/_theme.green.scss b/Monitor/wwwroot/assets/plugins/owl.carousel/src/scss/_theme.green.scss new file mode 100644 index 0000000..d2518ce --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/owl.carousel/src/scss/_theme.green.scss @@ -0,0 +1,30 @@ +/* + * Green theme - Owl Carousel CSS File + */ + +$color-base: #4DC7A0 !default; +$color-white: #FFF !default; +$color-gray: #D6D6D6 !default; + +//nav + +$nav-color: $color-white !default; +$nav-color-hover: $color-white !default; +$nav-font-size: 14px !default; +$nav-rounded: 3px !default; +$nav-margin: 5px !default; +$nav-padding: 4px 7px !default; +$nav-background: $color-gray !default; +$nav-background-hover: $color-base !default; +$nav-disabled-opacity: 0.5 !default; + +//dots + +$dot-width: 10px !default; +$dot-height: 10px !default; +$dot-rounded: 30px !default; +$dot-margin: 5px 7px !default; +$dot-background: $color-gray !default; +$dot-background-active: $color-base !default; + +@import 'theme'; diff --git a/Monitor/wwwroot/assets/plugins/owl.carousel/src/scss/_theme.scss b/Monitor/wwwroot/assets/plugins/owl.carousel/src/scss/_theme.scss new file mode 100644 index 0000000..f6d89da --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/owl.carousel/src/scss/_theme.scss @@ -0,0 +1,64 @@ + +.owl-theme { + // Styling Next and Prev buttons + .owl-nav { + margin-top: 10px; + text-align: center; + -webkit-tap-highlight-color: transparent; + + [class*='owl-'] { + color: $nav-color; + font-size: $nav-font-size; + margin: $nav-margin; + padding: $nav-padding; + background: $nav-background; + display: inline-block; + cursor: pointer; + border-radius: 3px; + + &:hover { + background: $nav-background-hover; + color:$nav-color-hover; + text-decoration: none; + } + } + .disabled { + opacity: $nav-disabled-opacity; + cursor: default; + } + } + + // Styling dots + .owl-nav.disabled + .owl-dots { + margin-top: 10px; + } + + .owl-dots { + text-align: center; + -webkit-tap-highlight-color: transparent; + + .owl-dot { + display: inline-block; + zoom: 1; + *display: inline; + + span { + width: $dot-width; + height: $dot-height; + margin: $dot-margin; + background: $dot-background; + display: block; + -webkit-backface-visibility: visible; + transition: opacity 200ms ease; + border-radius: 30px; + } + + &.active, + &:hover { + span { + background: $dot-background-active; + } + } + } + } +} diff --git a/Monitor/wwwroot/assets/plugins/owl.carousel/src/scss/_video.scss b/Monitor/wwwroot/assets/plugins/owl.carousel/src/scss/_video.scss new file mode 100644 index 0000000..29b6717 --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/owl.carousel/src/scss/_video.scss @@ -0,0 +1,51 @@ +/* + * Owl Carousel - Video Plugin + */ + +.owl-carousel{ + .owl-video-wrapper { + position: relative; + height: 100%; + background: #000; + } + + .owl-video-play-icon { + position: absolute; + height: 80px; + width: 80px; + left: 50%; + top: 50%; + margin-left: -40px; + margin-top: -40px; + background: url("owl.video.play.png") no-repeat; + cursor: pointer; + z-index: 1; + -webkit-backface-visibility: hidden; + transition: transform 100ms ease; + } + + .owl-video-play-icon:hover { + transform: scale(1.3, 1.3); + } + + .owl-video-playing .owl-video-tn, + .owl-video-playing .owl-video-play-icon { + display: none; + } + + .owl-video-tn { + opacity: 0; + height: 100%; + background-position: center center; + background-repeat: no-repeat; + background-size: contain; + transition: opacity 400ms ease; + } + + .owl-video-frame { + position: relative; + z-index: 1; + height: 100%; + width: 100%; + } +} diff --git a/Monitor/wwwroot/assets/plugins/owl.carousel/src/scss/owl.carousel.scss b/Monitor/wwwroot/assets/plugins/owl.carousel/src/scss/owl.carousel.scss new file mode 100644 index 0000000..114dcd6 --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/owl.carousel/src/scss/owl.carousel.scss @@ -0,0 +1,5 @@ +@import 'core'; +@import 'animate'; +@import 'autoheight'; +@import 'lazyload'; +@import 'video'; diff --git a/Monitor/wwwroot/assets/plugins/owl.carousel/src/scss/owl.theme.default.scss b/Monitor/wwwroot/assets/plugins/owl.carousel/src/scss/owl.theme.default.scss new file mode 100644 index 0000000..9b56aae --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/owl.carousel/src/scss/owl.theme.default.scss @@ -0,0 +1 @@ +@import "theme.default"; \ No newline at end of file diff --git a/Monitor/wwwroot/assets/plugins/owl.carousel/src/scss/owl.theme.green.scss b/Monitor/wwwroot/assets/plugins/owl.carousel/src/scss/owl.theme.green.scss new file mode 100644 index 0000000..8873d50 --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/owl.carousel/src/scss/owl.theme.green.scss @@ -0,0 +1 @@ +@import "theme.green"; \ No newline at end of file diff --git a/Monitor/wwwroot/assets/plugins/parsleyjs/parsley.min.js b/Monitor/wwwroot/assets/plugins/parsleyjs/parsley.min.js new file mode 100644 index 0000000..b528b04 --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/parsleyjs/parsley.min.js @@ -0,0 +1,18 @@ +/*! +* Parsley.js +* Version 2.4.3 - built Sat, Jun 18th 2016, 9:01 pm +* http://parsleyjs.org +* Guillaume Potier - +* Marc-Andre Lafortune - +* MIT Licensed +*/ +function _toConsumableArray(e){if(Array.isArray(e)){for(var t=0,i=Array(e.length);t + * @license MIT + */ +function n(){var t=this,i=window||global;e.extend(this,{isNativeEvent:function(e){return e.originalEvent&&e.originalEvent.isTrusted!==!1},fakeInputEvent:function(i){t.isNativeEvent(i)&&e(i.target).trigger("input")},misbehaves:function(i){t.isNativeEvent(i)&&(t.behavesOk(i),e(document).on("change.inputevent",i.data.selector,t.fakeInputEvent),t.fakeInputEvent(i))},behavesOk:function(i){t.isNativeEvent(i)&&e(document).off("input.inputevent",i.data.selector,t.behavesOk).off("change.inputevent",i.data.selector,t.misbehaves)},install:function(){if(!i.inputEventPatched){i.inputEventPatched="0.0.3";for(var n=["select",'input[type="checkbox"]','input[type="radio"]','input[type="file"]'],r=0;r1)throw Error("Second argument not supported");if("object"!=typeof t)throw TypeError("Argument must be an object");e.prototype=t;var i=new e;return e.prototype=null,i}}()},o=a,l={namespace:"data-parsley-",inputs:"input, textarea, select",excluded:"input[type=button], input[type=submit], input[type=reset], input[type=hidden]",priorityEnabled:!0,multiple:null,group:null,uiEnabled:!0,validationThreshold:3,focus:"first",trigger:!1,triggerAfterFailure:"input",errorClass:"parsley-error",successClass:"parsley-success",classHandler:function(e){},errorsContainer:function(e){},errorsWrapper:'
            ',errorTemplate:"
          • "},u=function(){this.__id__=o.generateID()};u.prototype={asyncSupport:!0,_pipeAccordingToValidationResult:function(){var t=this,i=function(){var i=e.Deferred();return!0!==t.validationResult&&i.reject(),i.resolve().promise()};return[i,i]},actualizeOptions:function(){return o.attr(this.$element,this.options.namespace,this.domOptions),this.parent&&this.parent.actualizeOptions&&this.parent.actualizeOptions(),this},_resetOptions:function(e){this.domOptions=o.objectCreate(this.parent.options),this.options=o.objectCreate(this.domOptions);for(var t in e)e.hasOwnProperty(t)&&(this.options[t]=e[t]);this.actualizeOptions()},_listeners:null,on:function(e,t){this._listeners=this._listeners||{};var i=this._listeners[e]=this._listeners[e]||[];return i.push(t),this},subscribe:function(t,i){e.listenTo(this,t.toLowerCase(),i)},off:function(e,t){var i=this._listeners&&this._listeners[e];if(i)if(t)for(var n=i.length;n--;)i[n]===t&&i.splice(n,1);else delete this._listeners[e];return this},unsubscribe:function(t,i){e.unsubscribeTo(this,t.toLowerCase())},trigger:function(e,t,i){t=t||this;var n,r=this._listeners&&this._listeners[e];if(r)for(var s=r.length;s--;)if(n=r[s].call(t,t,i),n===!1)return n;return this.parent?this.parent.trigger(e,t,i):!0},reset:function(){if("ParsleyForm"!==this.__class__)return this._resetUI(),this._trigger("reset");for(var e=0;e3&&(i=[].slice.call(arguments,1,-1)),this.fn.call(this,t,i);if(e.isArray(t)){if(!this.validateMultiple)throw"Validator `"+this.name+"` does not handle multiple values";return this.validateMultiple.apply(this,arguments)}if(this.validateNumber)return isNaN(t)?!1:(arguments[0]=parseFloat(arguments[0]),this.validateNumber.apply(this,arguments));if(this.validateString)return this.validateString.apply(this,arguments);throw"Validator `"+this.name+"` only handles multiple values"},parseRequirements:function(t,i){if("string"!=typeof t)return e.isArray(t)?t:[t];var n=this.requirementType;if(e.isArray(n)){for(var r=h(t,n.length),s=0;s0},validateString:function(e){return/\S/.test(e)},priority:512},type:{validateString:function(e,t){var i=arguments.length<=2||void 0===arguments[2]?{}:arguments[2],n=i.step,r=void 0===n?"1":n,s=i.base,a=void 0===s?0:s,o=g[t];if(!o)throw new Error("validator type `"+t+"` is not supported");if(!o.test(e))return!1;if("number"===t&&!/^any$/i.test(r||"")){var l=Number(e),u=Math.max(v(r),v(a));if(v(l)>u)return!1;var d=function(e){return Math.round(e*Math.pow(10,u))};if((d(l)-d(a))%d(r)!=0)return!1}return!0},requirementType:{"":"string",step:"string",base:"number"},priority:256},pattern:{validateString:function(e,t){return t.test(e)},requirementType:"regexp",priority:64},minlength:{validateString:function(e,t){return e.length>=t},requirementType:"integer",priority:30},maxlength:{validateString:function(e,t){return e.length<=t},requirementType:"integer",priority:30},length:{validateString:function(e,t,i){return e.length>=t&&e.length<=i},requirementType:["integer","integer"],priority:30},mincheck:{validateMultiple:function(e,t){return e.length>=t},requirementType:"integer",priority:30},maxcheck:{validateMultiple:function(e,t){return e.length<=t},requirementType:"integer",priority:30},check:{validateMultiple:function(e,t,i){return e.length>=t&&e.length<=i},requirementType:["integer","integer"],priority:30},min:{validateNumber:function(e,t){return e>=t},requirementType:"number",priority:30},max:{validateNumber:function(e,t){return t>=e},requirementType:"number",priority:30},range:{validateNumber:function(e,t,i){return e>=t&&i>=e},requirementType:["number","number"],priority:30},equalto:{validateString:function(t,i){var n=e(i);return n.length?t===n.val():t===i},priority:256}}};var y={},_=function k(e,t,i){for(var n=[],r=[],s=0;s0&&"undefined"==typeof t.options.noFocus&&(this._focusedField=t.$element,"first"===this.options.focus))break}return null===this._focusedField?null:this._focusedField.focus()},_destroyUI:function(){this.$element.off(".Parsley")}},y.Field={_reflowUI:function(){if(this._buildUI(),this._ui){var e=_(this.validationResult,this._ui.lastValidationResult);this._ui.lastValidationResult=this.validationResult,this._manageStatusClass(),this._manageErrorsMessages(e),this._actualizeTriggers(),!e.kept.length&&!e.added.length||this._failedOnce||(this._failedOnce=!0,this._actualizeTriggers())}},getErrorsMessages:function(){if(!0===this.validationResult)return[];for(var e=[],t=0;t0?this._errorClass():this._resetClass()},_manageErrorsMessages:function(t){if("undefined"==typeof this.options.errorsMessagesDisabled){if("undefined"!=typeof this.options.errorMessage)return t.added.length||t.kept.length?(this._insertErrorWrapper(),0===this._ui.$errorsWrapper.find(".parsley-custom-error-message").length&&this._ui.$errorsWrapper.append(e(this.options.errorTemplate).addClass("parsley-custom-error-message")),this._ui.$errorsWrapper.addClass("filled").find(".parsley-custom-error-message").html(this.options.errorMessage)):this._ui.$errorsWrapper.removeClass("filled").find(".parsley-custom-error-message").remove();for(var i=0;i').appendTo(this.$element)),i.attr({name:t.attr("name"),value:t.attr("value")})}this.$element.trigger(e.extend(e.Event("submit"),{parsley:!0}))}},validate:function(t){if(arguments.length>=1&&!e.isPlainObject(t)){o.warnOnce("Calling validate on a parsley form without passing arguments as an object is deprecated.");var i=_slice.call(arguments),n=i[0],r=i[1],s=i[2];t={group:n,force:r,event:s}}return b[this.whenValidate(t).state()]},whenValidate:function(){var t,i=this,n=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],r=n.group,s=n.force,a=n.event;this.submitEvent=a,a&&(this.submitEvent=e.extend({},a,{preventDefault:function(){o.warnOnce("Using `this.submitEvent.preventDefault()` is deprecated; instead, call `this.validationResult = false`"),i.validationResult=!1}})),this.validationResult=!0,this._trigger("validate"),this._refreshFields();var l=this._withoutReactualizingFormOptions(function(){return e.map(i.fields,function(e){return e.whenValidate({force:s,group:r})})});return(t=o.all(l).done(function(){i._trigger("success")}).fail(function(){i.validationResult=!1,i.focus(),i._trigger("error")}).always(function(){i._trigger("validated")})).pipe.apply(t,_toConsumableArray(this._pipeAccordingToValidationResult()))},isValid:function(t){if(arguments.length>=1&&!e.isPlainObject(t)){o.warnOnce("Calling isValid on a parsley form without passing arguments as an object is deprecated.");var i=_slice.call(arguments),n=i[0],r=i[1];t={group:n,force:r}}return b[this.whenValid(t).state()]},whenValid:function(){var t=this,i=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],n=i.group,r=i.force;this._refreshFields();var s=this._withoutReactualizingFormOptions(function(){return e.map(t.fields,function(e){return e.whenValid({group:n,force:r})})});return o.all(s)},_refreshFields:function(){return this.actualizeOptions()._bindFields()},_bindFields:function(){var t=this,i=this.fields;return this.fields=[],this.fieldsMappedById={},this._withoutReactualizingFormOptions(function(){t.$element.find(t.options.inputs).not(t.options.excluded).each(function(e,i){var n=new window.Parsley.Factory(i,{},t);"ParsleyField"!==n.__class__&&"ParsleyFieldMultiple"!==n.__class__||!0===n.options.excluded||"undefined"==typeof t.fieldsMappedById[n.__class__+"-"+n.__id__]&&(t.fieldsMappedById[n.__class__+"-"+n.__id__]=n,t.fields.push(n))}),e.each(o.difference(i,t.fields),function(e,t){t._trigger("reset")})}),this},_withoutReactualizingFormOptions:function(e){var t=this.actualizeOptions;this.actualizeOptions=function(){return this};var i=e();return this.actualizeOptions=t,i},_trigger:function(e){return this.trigger("form:"+e)}};var F=function(t,i,n,r,s){if(!/ParsleyField/.test(t.__class__))throw new Error("ParsleyField or ParsleyFieldMultiple instance expected");var a=window.Parsley._validatorRegistry.validators[i],o=new f(a);e.extend(this,{validator:o,name:i,requirements:n,priority:r||t.options[i+"Priority"]||o.priority,isDomConstraint:!0===s}),this._parseRequirements(t.options)},C=function(e){var t=e[0].toUpperCase();return t+e.slice(1)};F.prototype={validate:function(e,t){var i;return(i=this.validator).validate.apply(i,[e].concat(_toConsumableArray(this.requirementList),[t]))},_parseRequirements:function(e){var t=this;this.requirementList=this.validator.parseRequirements(this.requirements,function(i){return e[t.name+C(i)]})}};var $=function(t,i,n,r){this.__class__="ParsleyField",this.$element=e(t),"undefined"!=typeof r&&(this.parent=r),this.options=n,this.domOptions=i,this.constraints=[],this.constraintsByName={},this.validationResult=!0,this._bindConstraints()},x={pending:null,resolved:!0,rejected:!1};$.prototype={validate:function(t){arguments.length>=1&&!e.isPlainObject(t)&&(o.warnOnce("Calling validate on a parsley field without passing arguments as an object is deprecated."),t={options:t});var i=this.whenValidate(t);if(!i)return!0;switch(i.state()){case"pending":return null;case"resolved":return!0;case"rejected":return this.validationResult}},whenValidate:function(){var e,t=this,i=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],n=i.force,r=i.group;return this.refreshConstraints(),!r||this._isInGroup(r)?(this.value=this.getValue(),this._trigger("validate"),(e=this.whenValid({force:n,value:this.value,_refreshed:!0}).always(function(){t._reflowUI()}).done(function(){t._trigger("success")}).fail(function(){t._trigger("error")}).always(function(){t._trigger("validated")})).pipe.apply(e,_toConsumableArray(this._pipeAccordingToValidationResult()))):void 0},hasConstraints:function(){return 0!==this.constraints.length},needsValidation:function(e){return"undefined"==typeof e&&(e=this.getValue()),!(!e.length&&!this._isRequired()&&"undefined"==typeof this.options.validateIfEmpty)},_isInGroup:function(t){return e.isArray(this.options.group)?-1!==e.inArray(t,this.options.group):this.options.group===t},isValid:function(t){if(arguments.length>=1&&!e.isPlainObject(t)){o.warnOnce("Calling isValid on a parsley field without passing arguments as an object is deprecated.");var i=_slice.call(arguments),n=i[0],r=i[1];t={force:n,value:r}}var s=this.whenValid(t);return s?x[s.state()]:!0},whenValid:function(){var t=this,i=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],n=i.force,r=void 0===n?!1:n,s=i.value,a=i.group,l=i._refreshed;if(l||this.refreshConstraints(),!a||this._isInGroup(a)){if(this.validationResult=!0,!this.hasConstraints())return e.when();if("undefined"!=typeof s&&null!==s||(s=this.getValue()),!this.needsValidation(s)&&!0!==r)return e.when();var u=this._getGroupedConstraints(),d=[];return e.each(u,function(i,n){var r=o.all(e.map(n,function(e){return t._validateConstraint(s,e)}));return d.push(r),"rejected"===r.state()?!1:void 0}),o.all(d)}},_validateConstraint:function(t,i){var n=this,r=i.validate(t,this);return!1===r&&(r=e.Deferred().reject()),o.all([r]).fail(function(e){n.validationResult instanceof Array||(n.validationResult=[]),n.validationResult.push({assert:i,errorMessage:"string"==typeof e&&e})})},getValue:function(){var e;return e="function"==typeof this.options.value?this.options.value(this):"undefined"!=typeof this.options.value?this.options.value:this.$element.val(),"undefined"==typeof e||null===e?"":this._handleWhitespace(e)},refreshConstraints:function(){return this.actualizeOptions()._bindConstraints()},addConstraint:function(e,t,i,n){if(window.Parsley._validatorRegistry.validators[e]){var r=new F(this,e,t,i,n);"undefined"!==this.constraintsByName[r.name]&&this.removeConstraint(r.name),this.constraints.push(r),this.constraintsByName[r.name]=r}return this},removeConstraint:function(e){for(var t=0;t1){var i=[];return this.each(function(){i.push(e(this).parsley(t))}),i}return e(this).length?new V(this,t):void o.warn("You must bind Parsley on an existing element.")},"undefined"==typeof window.ParsleyExtend&&(window.ParsleyExtend={}),O.options=e.extend(o.objectCreate(l),window.ParsleyConfig),window.ParsleyConfig=O.options,window.Parsley=window.psly=O,window.ParsleyUtils=o;var A=window.Parsley._validatorRegistry=new m(window.ParsleyConfig.validators,window.ParsleyConfig.i18n);window.ParsleyValidator={},e.each("setLocale addCatalog addMessage addMessages getErrorMessage formatMessage addValidator updateValidator removeValidator".split(" "),function(t,i){window.Parsley[i]=e.proxy(A,i),window.ParsleyValidator[i]=function(){var e;return o.warnOnce("Accessing the method '"+i+"' through ParsleyValidator is deprecated. Simply call 'window.Parsley."+i+"(...)'"),(e=window.Parsley)[i].apply(e,arguments)}}),window.Parsley.UI=y,window.ParsleyUI={removeError:function(e,t,i){var n=!0!==i;return o.warnOnce("Accessing ParsleyUI is deprecated. Call 'removeError' on the instance directly. Please comment in issue 1073 as to your need to call this method."),e.removeError(t,{updateClass:n})},getErrorsMessages:function(e){return o.warnOnce("Accessing ParsleyUI is deprecated. Call 'getErrorsMessages' on the instance directly."),e.getErrorsMessages()}},e.each("addError updateError".split(" "),function(e,t){window.ParsleyUI[t]=function(e,i,n,r,s){var a=!0!==s;return o.warnOnce("Accessing ParsleyUI is deprecated. Call '"+t+"' on the instance directly. Please comment in issue 1073 as to your need to call this method."),e[t](i,{message:n,assert:r,updateClass:a})}}),!1!==window.ParsleyConfig.autoBind&&e(function(){e("[data-parsley-validate]").length&&e("[data-parsley-validate]").parsley()});var R=e({}),T=function(){o.warnOnce("Parsley's pubsub module is deprecated; use the 'on' and 'off' methods on parsley instances or window.Parsley")},q="parsley:";e.listen=function(e,n){var r;if(T(),"object"==typeof arguments[1]&&"function"==typeof arguments[2]&&(r=arguments[1],n=arguments[2]),"function"!=typeof n)throw new Error("Wrong parameters");window.Parsley.on(i(e),t(n,r))},e.listenTo=function(e,n,r){if(T(),!(e instanceof E||e instanceof w))throw new Error("Must give Parsley instance");if("string"!=typeof n||"function"!=typeof r)throw new Error("Wrong parameters");e.on(i(n),t(r))},e.unsubscribe=function(e,t){if(T(),"string"!=typeof e||"function"!=typeof t)throw new Error("Wrong arguments");window.Parsley.off(i(e),t.parsleyAdaptedCallback)},e.unsubscribeTo=function(e,t){if(T(),!(e instanceof E||e instanceof w))throw new Error("Must give Parsley instance");e.off(i(t))},e.unsubscribeAll=function(t){T(),window.Parsley.off(i(t)),e("form,input,textarea,select").each(function(){var n=e(this).data("Parsley");n&&n.off(i(t))})},e.emit=function(e,t){var n;T();var r=t instanceof E||t instanceof w,s=Array.prototype.slice.call(arguments,r?2:1);s.unshift(i(e)),r||(t=window.Parsley),(n=t).trigger.apply(n,_toConsumableArray(s))};e.extend(!0,O,{asyncValidators:{"default":{fn:function(e){return e.status>=200&&e.status<300},url:!1},reverse:{fn:function(e){return e.status<200||e.status>=300},url:!1}},addAsyncValidator:function(e,t,i,n){return O.asyncValidators[e]={fn:t,url:i||!1,options:n||{}},this}}),O.addValidator("remote",{requirementType:{"":"string",validator:"string",reverse:"boolean",options:"object"},validateString:function(t,i,n,r){var s,a,o={},l=n.validator||(!0===n.reverse?"reverse":"default");if("undefined"==typeof O.asyncValidators[l])throw new Error("Calling an undefined async validator: `"+l+"`");i=O.asyncValidators[l].url||i,i.indexOf("{value}")>-1?i=i.replace("{value}",encodeURIComponent(t)):o[r.$element.attr("name")||r.$element.attr("id")]=t;var u=e.extend(!0,n.options||{},O.asyncValidators[l].options);s=e.extend(!0,{},{url:i,data:o,type:"GET"},u),r.trigger("field:ajaxoptions",r,s),a=e.param(s),"undefined"==typeof O._remoteCache&&(O._remoteCache={});var d=O._remoteCache[a]=O._remoteCache[a]||e.ajax(s),h=function(){var t=O.asyncValidators[l].fn.call(r,d,i,n);return t||(t=e.Deferred().reject()),e.when(t)};return d.then(h,h)},priority:-1}),O.on("form:submit",function(){O._remoteCache={}}),window.ParsleyExtend.addAsyncValidator=function(){return ParsleyUtils.warnOnce("Accessing the method `addAsyncValidator` through an instance is deprecated. Simply call `Parsley.addAsyncValidator(...)`"),O.addAsyncValidator.apply(O,arguments)},O.addMessages("en",{defaultMessage:"This value seems to be invalid.",type:{email:"This value should be a valid email.",url:"This value should be a valid url.",number:"This value should be a valid number.",integer:"This value should be a valid integer.",digits:"This value should be digits.",alphanum:"This value should be alphanumeric."},notblank:"This value should not be blank.",required:"This value is required.",pattern:"This value seems to be invalid.",min:"This value should be greater than or equal to %s.",max:"This value should be lower than or equal to %s.",range:"This value should be between %s and %s.",minlength:"This value is too short. It should have %s characters or more.",maxlength:"This value is too long. It should have %s characters or fewer.",length:"This value length is invalid. It should be between %s and %s characters long.",mincheck:"You must select at least %s choices.",maxcheck:"You must select %s choices or fewer.",check:"You must select between %s and %s choices.",equalto:"This value should be the same."}),O.setLocale("en");var D=new n;D.install();var I=O;return I}); +//# sourceMappingURL=parsley.min.js.map diff --git a/Monitor/wwwroot/assets/plugins/peity/jquery.peity.js b/Monitor/wwwroot/assets/plugins/peity/jquery.peity.js new file mode 100644 index 0000000..8c4c9a5 --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/peity/jquery.peity.js @@ -0,0 +1,383 @@ +// Peity jQuery plugin version 3.2.0 +// (c) 2015 Ben Pickles +// +// http://benpickles.github.io/peity +// +// Released under MIT license. +(function($, document, Math, undefined) { + var peity = $.fn.peity = function(type, options) { + if (svgSupported) { + this.each(function() { + var $this = $(this) + var chart = $this.data('_peity') + + if (chart) { + if (type) chart.type = type + $.extend(chart.opts, options) + } else { + chart = new Peity( + $this, + type, + $.extend({}, + peity.defaults[type], + $this.data('peity'), + options) + ) + + $this + .change(function() { chart.draw() }) + .data('_peity', chart) + } + + chart.draw() + }); + } + + return this; + }; + + var Peity = function($el, type, opts) { + this.$el = $el + this.type = type + this.opts = opts + } + + var PeityPrototype = Peity.prototype + + var svgElement = PeityPrototype.svgElement = function(tag, attrs) { + return $( + document.createElementNS('http://www.w3.org/2000/svg', tag) + ).attr(attrs) + } + + // https://gist.github.com/madrobby/3201472 + var svgSupported = 'createElementNS' in document && svgElement('svg', {})[0].createSVGRect + + PeityPrototype.draw = function() { + var opts = this.opts + peity.graphers[this.type].call(this, opts) + if (opts.after) opts.after.call(this, opts) + } + + PeityPrototype.fill = function() { + var fill = this.opts.fill + + return $.isFunction(fill) + ? fill + : function(_, i) { return fill[i % fill.length] } + } + + PeityPrototype.prepare = function(width, height) { + if (!this.$svg) { + this.$el.hide().after( + this.$svg = svgElement('svg', { + "class": "peity" + }) + ) + } + + return this.$svg + .empty() + .data('peity', this) + .attr({ + height: height, + width: width + }) + } + + PeityPrototype.values = function() { + return $.map(this.$el.text().split(this.opts.delimiter), function(value) { + return parseFloat(value) + }) + } + + peity.defaults = {} + peity.graphers = {} + + peity.register = function(type, defaults, grapher) { + this.defaults[type] = defaults + this.graphers[type] = grapher + } + + peity.register( + 'pie', + { + fill: ['#ff9900', '#fff4dd', '#ffc66e'], + radius: 8 + }, + function(opts) { + if (!opts.delimiter) { + var delimiter = this.$el.text().match(/[^0-9\.]/) + opts.delimiter = delimiter ? delimiter[0] : "," + } + + var values = $.map(this.values(), function(n) { + return n > 0 ? n : 0 + }) + + if (opts.delimiter == "/") { + var v1 = values[0] + var v2 = values[1] + values = [v1, Math.max(0, v2 - v1)] + } + + var i = 0 + var length = values.length + var sum = 0 + + for (; i < length; i++) { + sum += values[i] + } + + if (!sum) { + length = 2 + sum = 1 + values = [0, 1] + } + + var diameter = opts.radius * 2 + + var $svg = this.prepare( + opts.width || diameter, + opts.height || diameter + ) + + var width = $svg.width() + , height = $svg.height() + , cx = width / 2 + , cy = height / 2 + + var radius = Math.min(cx, cy) + , innerRadius = opts.innerRadius + + if (this.type == 'donut' && !innerRadius) { + innerRadius = radius * 0.5 + } + + var pi = Math.PI + var fill = this.fill() + + var scale = this.scale = function(value, radius) { + var radians = value / sum * pi * 2 - pi / 2 + + return [ + radius * Math.cos(radians) + cx, + radius * Math.sin(radians) + cy + ] + } + + var cumulative = 0 + + for (i = 0; i < length; i++) { + var value = values[i] + , portion = value / sum + , $node + + if (portion == 0) continue + + if (portion == 1) { + if (innerRadius) { + var x2 = cx - 0.01 + , y1 = cy - radius + , y2 = cy - innerRadius + + $node = svgElement('path', { + d: [ + 'M', cx, y1, + 'A', radius, radius, 0, 1, 1, x2, y1, + 'L', x2, y2, + 'A', innerRadius, innerRadius, 0, 1, 0, cx, y2 + ].join(' ') + }) + } else { + $node = svgElement('circle', { + cx: cx, + cy: cy, + r: radius + }) + } + } else { + var cumulativePlusValue = cumulative + value + + var d = ['M'].concat( + scale(cumulative, radius), + 'A', radius, radius, 0, portion > 0.5 ? 1 : 0, 1, + scale(cumulativePlusValue, radius), + 'L' + ) + + if (innerRadius) { + d = d.concat( + scale(cumulativePlusValue, innerRadius), + 'A', innerRadius, innerRadius, 0, portion > 0.5 ? 1 : 0, 0, + scale(cumulative, innerRadius) + ) + } else { + d.push(cx, cy) + } + + cumulative += value + + $node = svgElement('path', { + d: d.join(" ") + }) + } + + $node.attr('fill', fill.call(this, value, i, values)) + + $svg.append($node) + } + } + ) + + peity.register( + 'donut', + $.extend(true, {}, peity.defaults.pie), + function(opts) { + peity.graphers.pie.call(this, opts) + } + ) + + peity.register( + "line", + { + delimiter: ",", + fill: "#c6d9fd", + height: 16, + min: 0, + stroke: "#4d89f9", + strokeWidth: 1, + width: 32 + }, + function(opts) { + var values = this.values() + if (values.length == 1) values.push(values[0]) + var max = Math.max.apply(Math, opts.max == undefined ? values : values.concat(opts.max)) + , min = Math.min.apply(Math, opts.min == undefined ? values : values.concat(opts.min)) + + var $svg = this.prepare(opts.width, opts.height) + , strokeWidth = opts.strokeWidth + , width = $svg.width() + , height = $svg.height() - strokeWidth + , diff = max - min + + var xScale = this.x = function(input) { + return input * (width / (values.length - 1)) + } + + var yScale = this.y = function(input) { + var y = height + + if (diff) { + y -= ((input - min) / diff) * height + } + + return y + strokeWidth / 2 + } + + var zero = yScale(Math.max(min, 0)) + , coords = [0, zero] + + for (var i = 0; i < values.length; i++) { + coords.push( + xScale(i), + yScale(values[i]) + ) + } + + coords.push(width, zero) + + if (opts.fill) { + $svg.append( + svgElement('polygon', { + fill: opts.fill, + points: coords.join(' ') + }) + ) + } + + if (strokeWidth) { + $svg.append( + svgElement('polyline', { + fill: 'none', + points: coords.slice(2, coords.length - 2).join(' '), + stroke: opts.stroke, + 'stroke-width': strokeWidth, + 'stroke-linecap': 'square' + }) + ) + } + } + ); + + peity.register( + 'bar', + { + delimiter: ",", + fill: ["#4D89F9"], + height: 16, + min: 0, + padding: 0.1, + width: 32 + }, + function(opts) { + var values = this.values() + , max = Math.max.apply(Math, opts.max == undefined ? values : values.concat(opts.max)) + , min = Math.min.apply(Math, opts.min == undefined ? values : values.concat(opts.min)) + + var $svg = this.prepare(opts.width, opts.height) + , width = $svg.width() + , height = $svg.height() + , diff = max - min + , padding = opts.padding + , fill = this.fill() + + var xScale = this.x = function(input) { + return input * width / values.length + } + + var yScale = this.y = function(input) { + return height - ( + diff + ? ((input - min) / diff) * height + : 1 + ) + } + + for (var i = 0; i < values.length; i++) { + var x = xScale(i + padding) + , w = xScale(i + 1 - padding) - x + , value = values[i] + , valueY = yScale(value) + , y1 = valueY + , y2 = valueY + , h + + if (!diff) { + h = 1 + } else if (value < 0) { + y1 = yScale(Math.min(max, 0)) + } else { + y2 = yScale(Math.max(min, 0)) + } + + h = y2 - y1 + + if (h == 0) { + h = 1 + if (max > 0 && diff) y1-- + } + + $svg.append( + svgElement('rect', { + fill: fill.call(this, value, i, values), + x: x, + y: y1, + width: w, + height: h + }) + ) + } + } + ); +})(jQuery, document, Math); diff --git a/Monitor/wwwroot/assets/plugins/peity/jquery.peity.min.js b/Monitor/wwwroot/assets/plugins/peity/jquery.peity.min.js new file mode 100644 index 0000000..3d0166e --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/peity/jquery.peity.min.js @@ -0,0 +1,13 @@ +// Peity jQuery plugin version 3.2.0 +// (c) 2015 Ben Pickles +// +// http://benpickles.github.io/peity +// +// Released under MIT license. +(function(k,w,h,v){var d=k.fn.peity=function(a,b){y&&this.each(function(){var e=k(this),c=e.data("_peity");c?(a&&(c.type=a),k.extend(c.opts,b)):(c=new x(e,a,k.extend({},d.defaults[a],e.data("peity"),b)),e.change(function(){c.draw()}).data("_peity",c));c.draw()});return this},x=function(a,b,e){this.$el=a;this.type=b;this.opts=e},o=x.prototype,q=o.svgElement=function(a,b){return k(w.createElementNS("http://www.w3.org/2000/svg",a)).attr(b)},y="createElementNS"in w&&q("svg",{})[0].createSVGRect;o.draw= +function(){var a=this.opts;d.graphers[this.type].call(this,a);a.after&&a.after.call(this,a)};o.fill=function(){var a=this.opts.fill;return k.isFunction(a)?a:function(b,e){return a[e%a.length]}};o.prepare=function(a,b){this.$svg||this.$el.hide().after(this.$svg=q("svg",{"class":"peity"}));return this.$svg.empty().data("peity",this).attr({height:b,width:a})};o.values=function(){return k.map(this.$el.text().split(this.opts.delimiter),function(a){return parseFloat(a)})};d.defaults={};d.graphers={};d.register= +function(a,b,e){this.defaults[a]=b;this.graphers[a]=e};d.register("pie",{fill:["#ff9900","#fff4dd","#ffc66e"],radius:8},function(a){if(!a.delimiter){var b=this.$el.text().match(/[^0-9\.]/);a.delimiter=b?b[0]:","}b=k.map(this.values(),function(a){return 0i?n=s(h.min(e,0)):p=s(h.max(c,0)):o=1;o=p-n;0==o&&(o=1,0 img { + display: inline-block; + position: absolute; + top: 0; + left: 0; + border-radius: 50%; + text-align: center; + font-weight: bold; + color: #a1a2a3; +} +.radial-bar:after { + content: attr(data-label); + background-color: #f0f0f0; + z-index: 101; +} +.radial-bar > img { + z-index: 102; +} +.radial-bar:after, +.radial-bar > img { + width: 56px; + height: 56px; + margin-left: 12px; + margin-top: 12px; + line-height: 56px; +} + +.radial-bar.radial-bar-0 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(90deg, #5d9cec 50%, #fafafa 50%, #fafafa); +} +.radial-bar.radial-bar-5 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(108deg, #5d9cec 50%, #fafafa 50%, #fafafa); +} +.radial-bar.radial-bar-10 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(126deg, #5d9cec 50%, #fafafa 50%, #fafafa); +} +.radial-bar.radial-bar-15 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(144deg, #5d9cec 50%, #fafafa 50%, #fafafa); +} +.radial-bar.radial-bar-20 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(162deg, #5d9cec 50%, #fafafa 50%, #fafafa); +} +.radial-bar.radial-bar-25 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(180deg, #5d9cec 50%, #fafafa 50%, #fafafa); +} +.radial-bar.radial-bar-30 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(198deg, #5d9cec 50%, #fafafa 50%, #fafafa); +} +.radial-bar.radial-bar-35 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(216deg, #5d9cec 50%, #fafafa 50%, #fafafa); +} +.radial-bar.radial-bar-40 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(234deg, #5d9cec 50%, #fafafa 50%, #fafafa); +} +.radial-bar.radial-bar-45 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(252deg, #5d9cec 50%, #fafafa 50%, #fafafa); +} +.radial-bar.radial-bar-50 { + background-image: linear-gradient(270deg, #5d9cec 50%, transparent 50%, transparent), linear-gradient(270deg, #5d9cec 50%, #fafafa 50%, #fafafa); +} +.radial-bar.radial-bar-55 { + background-image: linear-gradient(288deg, #5d9cec 50%, transparent 50%, transparent), linear-gradient(270deg, #5d9cec 50%, #fafafa 50%, #fafafa); +} +.radial-bar.radial-bar-60 { + background-image: linear-gradient(306deg, #5d9cec 50%, transparent 50%, transparent), linear-gradient(270deg, #5d9cec 50%, #fafafa 50%, #fafafa); +} +.radial-bar.radial-bar-65 { + background-image: linear-gradient(324deg, #5d9cec 50%, transparent 50%, transparent), linear-gradient(270deg, #5d9cec 50%, #fafafa 50%, #fafafa); +} +.radial-bar.radial-bar-70 { + background-image: linear-gradient(342deg, #5d9cec 50%, transparent 50%, transparent), linear-gradient(270deg, #5d9cec 50%, #fafafa 50%, #fafafa); +} +.radial-bar.radial-bar-75 { + background-image: linear-gradient(360deg, #5d9cec 50%, transparent 50%, transparent), linear-gradient(270deg, #5d9cec 50%, #fafafa 50%, #fafafa); +} +.radial-bar.radial-bar-80 { + background-image: linear-gradient(378deg, #5d9cec 50%, transparent 50%, transparent), linear-gradient(270deg, #5d9cec 50%, #fafafa 50%, #fafafa); +} +.radial-bar.radial-bar-85 { + background-image: linear-gradient(396deg, #5d9cec 50%, transparent 50%, transparent), linear-gradient(270deg, #5d9cec 50%, #fafafa 50%, #fafafa); +} +.radial-bar.radial-bar-90 { + background-image: linear-gradient(414deg, #5d9cec 50%, transparent 50%, transparent), linear-gradient(270deg, #5d9cec 50%, #fafafa 50%, #fafafa); +} +.radial-bar.radial-bar-95 { + background-image: linear-gradient(432deg, #5d9cec 50%, transparent 50%, transparent), linear-gradient(270deg, #5d9cec 50%, #fafafa 50%, #fafafa); +} +.radial-bar.radial-bar-100 { + background-image: linear-gradient(450deg, #5d9cec 50%, transparent 50%, transparent), linear-gradient(270deg, #5d9cec 50%, #fafafa 50%, #fafafa); +} +.radial-bar-primary.radial-bar-0 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(90deg, #5d9cec 50%, #fafafa 50%, #fafafa); +} +.radial-bar-primary.radial-bar-5 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(108deg, #5d9cec 50%, #fafafa 50%, #fafafa); +} +.radial-bar-primary.radial-bar-10 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(126deg, #5d9cec 50%, #fafafa 50%, #fafafa); +} +.radial-bar-primary.radial-bar-15 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(144deg, #5d9cec 50%, #fafafa 50%, #fafafa); +} +.radial-bar-primary.radial-bar-20 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(162deg, #5d9cec 50%, #fafafa 50%, #fafafa); +} +.radial-bar-primary.radial-bar-25 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(180deg, #5d9cec 50%, #fafafa 50%, #fafafa); +} +.radial-bar-primary.radial-bar-30 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(198deg, #5d9cec 50%, #fafafa 50%, #fafafa); +} +.radial-bar-primary.radial-bar-35 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(216deg, #5d9cec 50%, #fafafa 50%, #fafafa); +} +.radial-bar-primary.radial-bar-40 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(234deg, #5d9cec 50%, #fafafa 50%, #fafafa); +} +.radial-bar-primary.radial-bar-45 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(252deg, #5d9cec 50%, #fafafa 50%, #fafafa); +} +.radial-bar-primary.radial-bar-50 { + background-image: linear-gradient(270deg, #5d9cec 50%, transparent 50%, transparent), linear-gradient(270deg, #5d9cec 50%, #fafafa 50%, #fafafa); +} +.radial-bar-primary.radial-bar-55 { + background-image: linear-gradient(288deg, #5d9cec 50%, transparent 50%, transparent), linear-gradient(270deg, #5d9cec 50%, #fafafa 50%, #fafafa); +} +.radial-bar-primary.radial-bar-60 { + background-image: linear-gradient(306deg, #5d9cec 50%, transparent 50%, transparent), linear-gradient(270deg, #5d9cec 50%, #fafafa 50%, #fafafa); +} +.radial-bar-primary.radial-bar-65 { + background-image: linear-gradient(324deg, #5d9cec 50%, transparent 50%, transparent), linear-gradient(270deg, #5d9cec 50%, #fafafa 50%, #fafafa); +} +.radial-bar-primary.radial-bar-70 { + background-image: linear-gradient(342deg, #5d9cec 50%, transparent 50%, transparent), linear-gradient(270deg, #5d9cec 50%, #fafafa 50%, #fafafa); +} +.radial-bar-primary.radial-bar-75 { + background-image: linear-gradient(360deg, #5d9cec 50%, transparent 50%, transparent), linear-gradient(270deg, #5d9cec 50%, #fafafa 50%, #fafafa); +} +.radial-bar-primary.radial-bar-80 { + background-image: linear-gradient(378deg, #5d9cec 50%, transparent 50%, transparent), linear-gradient(270deg, #5d9cec 50%, #fafafa 50%, #fafafa); +} +.radial-bar-primary.radial-bar-85 { + background-image: linear-gradient(396deg, #5d9cec 50%, transparent 50%, transparent), linear-gradient(270deg, #5d9cec 50%, #fafafa 50%, #fafafa); +} +.radial-bar-primary.radial-bar-90 { + background-image: linear-gradient(414deg, #5d9cec 50%, transparent 50%, transparent), linear-gradient(270deg, #5d9cec 50%, #fafafa 50%, #fafafa); +} +.radial-bar-primary.radial-bar-95 { + background-image: linear-gradient(432deg, #5d9cec 50%, transparent 50%, transparent), linear-gradient(270deg, #5d9cec 50%, #fafafa 50%, #fafafa); +} +.radial-bar-primary.radial-bar-100 { + background-image: linear-gradient(450deg, #5d9cec 50%, transparent 50%, transparent), linear-gradient(270deg, #5d9cec 50%, #fafafa 50%, #fafafa); +} +.radial-bar-success.radial-bar-0 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(90deg, #81c868 50%, #fafafa 50%, #fafafa); +} +.radial-bar-success.radial-bar-5 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(108deg, #81c868 50%, #fafafa 50%, #fafafa); +} +.radial-bar-success.radial-bar-10 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(126deg, #81c868 50%, #fafafa 50%, #fafafa); +} +.radial-bar-success.radial-bar-15 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(144deg, #81c868 50%, #fafafa 50%, #fafafa); +} +.radial-bar-success.radial-bar-20 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(162deg, #81c868 50%, #fafafa 50%, #fafafa); +} +.radial-bar-success.radial-bar-25 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(180deg, #81c868 50%, #fafafa 50%, #fafafa); +} +.radial-bar-success.radial-bar-30 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(198deg, #81c868 50%, #fafafa 50%, #fafafa); +} +.radial-bar-success.radial-bar-35 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(216deg, #81c868 50%, #fafafa 50%, #fafafa); +} +.radial-bar-success.radial-bar-40 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(234deg, #81c868 50%, #fafafa 50%, #fafafa); +} +.radial-bar-success.radial-bar-45 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(252deg, #81c868 50%, #fafafa 50%, #fafafa); +} +.radial-bar-success.radial-bar-50 { + background-image: linear-gradient(270deg, #81c868 50%, transparent 50%, transparent), linear-gradient(270deg, #81c868 50%, #fafafa 50%, #fafafa); +} +.radial-bar-success.radial-bar-55 { + background-image: linear-gradient(288deg, #81c868 50%, transparent 50%, transparent), linear-gradient(270deg, #81c868 50%, #fafafa 50%, #fafafa); +} +.radial-bar-success.radial-bar-60 { + background-image: linear-gradient(306deg, #81c868 50%, transparent 50%, transparent), linear-gradient(270deg, #81c868 50%, #fafafa 50%, #fafafa); +} +.radial-bar-success.radial-bar-65 { + background-image: linear-gradient(324deg, #81c868 50%, transparent 50%, transparent), linear-gradient(270deg, #81c868 50%, #fafafa 50%, #fafafa); +} +.radial-bar-success.radial-bar-70 { + background-image: linear-gradient(342deg, #81c868 50%, transparent 50%, transparent), linear-gradient(270deg, #81c868 50%, #fafafa 50%, #fafafa); +} +.radial-bar-success.radial-bar-75 { + background-image: linear-gradient(360deg, #81c868 50%, transparent 50%, transparent), linear-gradient(270deg, #81c868 50%, #fafafa 50%, #fafafa); +} +.radial-bar-success.radial-bar-80 { + background-image: linear-gradient(378deg, #81c868 50%, transparent 50%, transparent), linear-gradient(270deg, #81c868 50%, #fafafa 50%, #fafafa); +} +.radial-bar-success.radial-bar-85 { + background-image: linear-gradient(396deg, #81c868 50%, transparent 50%, transparent), linear-gradient(270deg, #81c868 50%, #fafafa 50%, #fafafa); +} +.radial-bar-success.radial-bar-90 { + background-image: linear-gradient(414deg, #81c868 50%, transparent 50%, transparent), linear-gradient(270deg, #81c868 50%, #fafafa 50%, #fafafa); +} +.radial-bar-success.radial-bar-95 { + background-image: linear-gradient(432deg, #81c868 50%, transparent 50%, transparent), linear-gradient(270deg, #81c868 50%, #fafafa 50%, #fafafa); +} +.radial-bar-success.radial-bar-100 { + background-image: linear-gradient(450deg, #81c868 50%, transparent 50%, transparent), linear-gradient(270deg, #81c868 50%, #fafafa 50%, #fafafa); +} +.radial-bar-info.radial-bar-0 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(90deg, #34d3eb 50%, #fafafa 50%, #fafafa); +} +.radial-bar-info.radial-bar-5 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(108deg, #34d3eb 50%, #fafafa 50%, #fafafa); +} +.radial-bar-info.radial-bar-10 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(126deg, #34d3eb 50%, #fafafa 50%, #fafafa); +} +.radial-bar-info.radial-bar-15 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(144deg, #34d3eb 50%, #fafafa 50%, #fafafa); +} +.radial-bar-info.radial-bar-20 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(162deg, #34d3eb 50%, #fafafa 50%, #fafafa); +} +.radial-bar-info.radial-bar-25 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(180deg, #34d3eb 50%, #fafafa 50%, #fafafa); +} +.radial-bar-info.radial-bar-30 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(198deg, #34d3eb 50%, #fafafa 50%, #fafafa); +} +.radial-bar-info.radial-bar-35 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(216deg, #34d3eb 50%, #fafafa 50%, #fafafa); +} +.radial-bar-info.radial-bar-40 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(234deg, #34d3eb 50%, #fafafa 50%, #fafafa); +} +.radial-bar-info.radial-bar-45 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(252deg, #34d3eb 50%, #fafafa 50%, #fafafa); +} +.radial-bar-info.radial-bar-50 { + background-image: linear-gradient(270deg, #34d3eb 50%, transparent 50%, transparent), linear-gradient(270deg, #34d3eb 50%, #fafafa 50%, #fafafa); +} +.radial-bar-info.radial-bar-55 { + background-image: linear-gradient(288deg, #34d3eb 50%, transparent 50%, transparent), linear-gradient(270deg, #34d3eb 50%, #fafafa 50%, #fafafa); +} +.radial-bar-info.radial-bar-60 { + background-image: linear-gradient(306deg, #34d3eb 50%, transparent 50%, transparent), linear-gradient(270deg, #34d3eb 50%, #fafafa 50%, #fafafa); +} +.radial-bar-info.radial-bar-65 { + background-image: linear-gradient(324deg, #34d3eb 50%, transparent 50%, transparent), linear-gradient(270deg, #34d3eb 50%, #fafafa 50%, #fafafa); +} +.radial-bar-info.radial-bar-70 { + background-image: linear-gradient(342deg, #34d3eb 50%, transparent 50%, transparent), linear-gradient(270deg, #34d3eb 50%, #fafafa 50%, #fafafa); +} +.radial-bar-info.radial-bar-75 { + background-image: linear-gradient(360deg, #34d3eb 50%, transparent 50%, transparent), linear-gradient(270deg, #34d3eb 50%, #fafafa 50%, #fafafa); +} +.radial-bar-info.radial-bar-80 { + background-image: linear-gradient(378deg, #34d3eb 50%, transparent 50%, transparent), linear-gradient(270deg, #34d3eb 50%, #fafafa 50%, #fafafa); +} +.radial-bar-info.radial-bar-85 { + background-image: linear-gradient(396deg, #34d3eb 50%, transparent 50%, transparent), linear-gradient(270deg, #34d3eb 50%, #fafafa 50%, #fafafa); +} +.radial-bar-info.radial-bar-90 { + background-image: linear-gradient(414deg, #34d3eb 50%, transparent 50%, transparent), linear-gradient(270deg, #34d3eb 50%, #fafafa 50%, #fafafa); +} +.radial-bar-info.radial-bar-95 { + background-image: linear-gradient(432deg, #34d3eb 50%, transparent 50%, transparent), linear-gradient(270deg, #34d3eb 50%, #fafafa 50%, #fafafa); +} +.radial-bar-info.radial-bar-100 { + background-image: linear-gradient(450deg, #34d3eb 50%, transparent 50%, transparent), linear-gradient(270deg, #34d3eb 50%, #fafafa 50%, #fafafa); +} +.radial-bar-warning.radial-bar-0 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(90deg, #ffbd4a 50%, #fafafa 50%, #fafafa); +} +.radial-bar-warning.radial-bar-5 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(108deg, #ffbd4a 50%, #fafafa 50%, #fafafa); +} +.radial-bar-warning.radial-bar-10 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(126deg, #ffbd4a 50%, #fafafa 50%, #fafafa); +} +.radial-bar-warning.radial-bar-15 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(144deg, #ffbd4a 50%, #fafafa 50%, #fafafa); +} +.radial-bar-warning.radial-bar-20 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(162deg, #ffbd4a 50%, #fafafa 50%, #fafafa); +} +.radial-bar-warning.radial-bar-25 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(180deg, #ffbd4a 50%, #fafafa 50%, #fafafa); +} +.radial-bar-warning.radial-bar-30 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(198deg, #ffbd4a 50%, #fafafa 50%, #fafafa); +} +.radial-bar-warning.radial-bar-35 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(216deg, #ffbd4a 50%, #fafafa 50%, #fafafa); +} +.radial-bar-warning.radial-bar-40 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(234deg, #ffbd4a 50%, #fafafa 50%, #fafafa); +} +.radial-bar-warning.radial-bar-45 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(252deg, #ffbd4a 50%, #fafafa 50%, #fafafa); +} +.radial-bar-warning.radial-bar-50 { + background-image: linear-gradient(270deg, #ffbd4a 50%, transparent 50%, transparent), linear-gradient(270deg, #ffbd4a 50%, #fafafa 50%, #fafafa); +} +.radial-bar-warning.radial-bar-55 { + background-image: linear-gradient(288deg, #ffbd4a 50%, transparent 50%, transparent), linear-gradient(270deg, #ffbd4a 50%, #fafafa 50%, #fafafa); +} +.radial-bar-warning.radial-bar-60 { + background-image: linear-gradient(306deg, #ffbd4a 50%, transparent 50%, transparent), linear-gradient(270deg, #ffbd4a 50%, #fafafa 50%, #fafafa); +} +.radial-bar-warning.radial-bar-65 { + background-image: linear-gradient(324deg, #ffbd4a 50%, transparent 50%, transparent), linear-gradient(270deg, #ffbd4a 50%, #fafafa 50%, #fafafa); +} +.radial-bar-warning.radial-bar-70 { + background-image: linear-gradient(342deg, #ffbd4a 50%, transparent 50%, transparent), linear-gradient(270deg, #ffbd4a 50%, #fafafa 50%, #fafafa); +} +.radial-bar-warning.radial-bar-75 { + background-image: linear-gradient(360deg, #ffbd4a 50%, transparent 50%, transparent), linear-gradient(270deg, #ffbd4a 50%, #fafafa 50%, #fafafa); +} +.radial-bar-warning.radial-bar-80 { + background-image: linear-gradient(378deg, #ffbd4a 50%, transparent 50%, transparent), linear-gradient(270deg, #ffbd4a 50%, #fafafa 50%, #fafafa); +} +.radial-bar-warning.radial-bar-85 { + background-image: linear-gradient(396deg, #ffbd4a 50%, transparent 50%, transparent), linear-gradient(270deg, #ffbd4a 50%, #fafafa 50%, #fafafa); +} +.radial-bar-warning.radial-bar-90 { + background-image: linear-gradient(414deg, #ffbd4a 50%, transparent 50%, transparent), linear-gradient(270deg, #ffbd4a 50%, #fafafa 50%, #fafafa); +} +.radial-bar-warning.radial-bar-95 { + background-image: linear-gradient(432deg, #ffbd4a 50%, transparent 50%, transparent), linear-gradient(270deg, #ffbd4a 50%, #fafafa 50%, #fafafa); +} +.radial-bar-warning.radial-bar-100 { + background-image: linear-gradient(450deg, #ffbd4a 50%, transparent 50%, transparent), linear-gradient(270deg, #ffbd4a 50%, #fafafa 50%, #fafafa); +} +.radial-bar-danger.radial-bar-0 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(90deg, #f05050 50%, #fafafa 50%, #fafafa); +} +.radial-bar-danger.radial-bar-5 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(108deg, #f05050 50%, #fafafa 50%, #fafafa); +} +.radial-bar-danger.radial-bar-10 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(126deg, #f05050 50%, #fafafa 50%, #fafafa); +} +.radial-bar-danger.radial-bar-15 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(144deg, #f05050 50%, #fafafa 50%, #fafafa); +} +.radial-bar-danger.radial-bar-20 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(162deg, #f05050 50%, #fafafa 50%, #fafafa); +} +.radial-bar-danger.radial-bar-25 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(180deg, #f05050 50%, #fafafa 50%, #fafafa); +} +.radial-bar-danger.radial-bar-30 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(198deg, #f05050 50%, #fafafa 50%, #fafafa); +} +.radial-bar-danger.radial-bar-35 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(216deg, #f05050 50%, #fafafa 50%, #fafafa); +} +.radial-bar-danger.radial-bar-40 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(234deg, #f05050 50%, #fafafa 50%, #fafafa); +} +.radial-bar-danger.radial-bar-45 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(252deg, #f05050 50%, #fafafa 50%, #fafafa); +} +.radial-bar-danger.radial-bar-50 { + background-image: linear-gradient(270deg, #f05050 50%, transparent 50%, transparent), linear-gradient(270deg, #f05050 50%, #fafafa 50%, #fafafa); +} +.radial-bar-danger.radial-bar-55 { + background-image: linear-gradient(288deg, #f05050 50%, transparent 50%, transparent), linear-gradient(270deg, #f05050 50%, #fafafa 50%, #fafafa); +} +.radial-bar-danger.radial-bar-60 { + background-image: linear-gradient(306deg, #f05050 50%, transparent 50%, transparent), linear-gradient(270deg, #f05050 50%, #fafafa 50%, #fafafa); +} +.radial-bar-danger.radial-bar-65 { + background-image: linear-gradient(324deg, #f05050 50%, transparent 50%, transparent), linear-gradient(270deg, #f05050 50%, #fafafa 50%, #fafafa); +} +.radial-bar-danger.radial-bar-70 { + background-image: linear-gradient(342deg, #f05050 50%, transparent 50%, transparent), linear-gradient(270deg, #f05050 50%, #fafafa 50%, #fafafa); +} +.radial-bar-danger.radial-bar-75 { + background-image: linear-gradient(360deg, #f05050 50%, transparent 50%, transparent), linear-gradient(270deg, #f05050 50%, #fafafa 50%, #fafafa); +} +.radial-bar-danger.radial-bar-80 { + background-image: linear-gradient(378deg, #f05050 50%, transparent 50%, transparent), linear-gradient(270deg, #f05050 50%, #fafafa 50%, #fafafa); +} +.radial-bar-danger.radial-bar-85 { + background-image: linear-gradient(396deg, #f05050 50%, transparent 50%, transparent), linear-gradient(270deg, #f05050 50%, #fafafa 50%, #fafafa); +} +.radial-bar-danger.radial-bar-90 { + background-image: linear-gradient(414deg, #f05050 50%, transparent 50%, transparent), linear-gradient(270deg, #f05050 50%, #fafafa 50%, #fafafa); +} +.radial-bar-danger.radial-bar-95 { + background-image: linear-gradient(432deg, #f05050 50%, transparent 50%, transparent), linear-gradient(270deg, #f05050 50%, #fafafa 50%, #fafafa); +} +.radial-bar-danger.radial-bar-100 { + background-image: linear-gradient(450deg, #f05050 50%, transparent 50%, transparent), linear-gradient(270deg, #f05050 50%, #fafafa 50%, #fafafa); +} + + +/* -- Radial Default -- */ +.radial-bar-default.radial-bar-0 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(90deg, #5fbeaa 50%, #fafafa 50%, #fafafa); +} +.radial-bar-default.radial-bar-5 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(108deg, #5fbeaa 50%, #fafafa 50%, #fafafa); +} +.radial-bar-default.radial-bar-10 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(126deg, #5fbeaa 50%, #fafafa 50%, #fafafa); +} +.radial-bar-default.radial-bar-15 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(144deg, #5fbeaa 50%, #fafafa 50%, #fafafa); +} +.radial-bar-default.radial-bar-20 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(162deg, #5fbeaa 50%, #fafafa 50%, #fafafa); +} +.radial-bar-default.radial-bar-25 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(180deg, #5fbeaa 50%, #fafafa 50%, #fafafa); +} +.radial-bar-default.radial-bar-30 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(198deg, #5fbeaa 50%, #fafafa 50%, #fafafa); +} +.radial-bar-default.radial-bar-35 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(216deg, #5fbeaa 50%, #fafafa 50%, #fafafa); +} +.radial-bar-default.radial-bar-40 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(234deg, #5fbeaa 50%, #fafafa 50%, #fafafa); +} +.radial-bar-default.radial-bar-45 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(252deg, #5fbeaa 50%, #fafafa 50%, #fafafa); +} +.radial-bar-default.radial-bar-50 { + background-image: linear-gradient(270deg, #5fbeaa 50%, transparent 50%, transparent), linear-gradient(270deg, #5fbeaa 50%, #fafafa 50%, #fafafa); +} +.radial-bar-default.radial-bar-55 { + background-image: linear-gradient(288deg, #5fbeaa 50%, transparent 50%, transparent), linear-gradient(270deg, #5fbeaa 50%, #fafafa 50%, #fafafa); +} +.radial-bar-default.radial-bar-60 { + background-image: linear-gradient(306deg, #5fbeaa 50%, transparent 50%, transparent), linear-gradient(270deg, #5fbeaa 50%, #fafafa 50%, #fafafa); +} +.radial-bar-default.radial-bar-65 { + background-image: linear-gradient(324deg, #5fbeaa 50%, transparent 50%, transparent), linear-gradient(270deg, #5fbeaa 50%, #fafafa 50%, #fafafa); +} +.radial-bar-default.radial-bar-70 { + background-image: linear-gradient(342deg, #5fbeaa 50%, transparent 50%, transparent), linear-gradient(270deg, #5fbeaa 50%, #fafafa 50%, #fafafa); +} +.radial-bar-default.radial-bar-75 { + background-image: linear-gradient(360deg, #5fbeaa 50%, transparent 50%, transparent), linear-gradient(270deg, #5fbeaa 50%, #fafafa 50%, #fafafa); +} +.radial-bar-default.radial-bar-80 { + background-image: linear-gradient(378deg, #5fbeaa 50%, transparent 50%, transparent), linear-gradient(270deg, #5fbeaa 50%, #fafafa 50%, #fafafa); +} +.radial-bar-default.radial-bar-85 { + background-image: linear-gradient(396deg, #5fbeaa 50%, transparent 50%, transparent), linear-gradient(270deg, #5fbeaa 50%, #fafafa 50%, #fafafa); +} +.radial-bar-default.radial-bar-90 { + background-image: linear-gradient(414deg, #5fbeaa 50%, transparent 50%, transparent), linear-gradient(270deg, #5fbeaa 50%, #fafafa 50%, #fafafa); +} +.radial-bar-default.radial-bar-95 { + background-image: linear-gradient(432deg, #5fbeaa 50%, transparent 50%, transparent), linear-gradient(270deg, #5fbeaa 50%, #fafafa 50%, #fafafa); +} +.radial-bar-default.radial-bar-100 { + background-image: linear-gradient(450deg, #5fbeaa 50%, transparent 50%, transparent), linear-gradient(270deg, #5fbeaa 50%, #fafafa 50%, #fafafa); +} + + + +/* -- Radial Pink -- */ +.radial-bar-pink.radial-bar-0 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(90deg, #fb6d9d 50%, #fafafa 50%, #fafafa); +} +.radial-bar-pink.radial-bar-5 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(108deg, #fb6d9d 50%, #fafafa 50%, #fafafa); +} +.radial-bar-pink.radial-bar-10 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(126deg, #fb6d9d 50%, #fafafa 50%, #fafafa); +} +.radial-bar-pink.radial-bar-15 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(144deg, #fb6d9d 50%, #fafafa 50%, #fafafa); +} +.radial-bar-pink.radial-bar-20 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(162deg, #fb6d9d 50%, #fafafa 50%, #fafafa); +} +.radial-bar-pink.radial-bar-25 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(180deg, #fb6d9d 50%, #fafafa 50%, #fafafa); +} +.radial-bar-pink.radial-bar-30 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(198deg, #fb6d9d 50%, #fafafa 50%, #fafafa); +} +.radial-bar-pink.radial-bar-35 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(216deg, #fb6d9d 50%, #fafafa 50%, #fafafa); +} +.radial-bar-pink.radial-bar-40 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(234deg, #fb6d9d 50%, #fafafa 50%, #fafafa); +} +.radial-bar-pink.radial-bar-45 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(252deg, #fb6d9d 50%, #fafafa 50%, #fafafa); +} +.radial-bar-pink.radial-bar-50 { + background-image: linear-gradient(270deg, #fb6d9d 50%, transparent 50%, transparent), linear-gradient(270deg, #fb6d9d 50%, #fafafa 50%, #fafafa); +} +.radial-bar-pink.radial-bar-55 { + background-image: linear-gradient(288deg, #fb6d9d 50%, transparent 50%, transparent), linear-gradient(270deg, #fb6d9d 50%, #fafafa 50%, #fafafa); +} +.radial-bar-pink.radial-bar-60 { + background-image: linear-gradient(306deg, #fb6d9d 50%, transparent 50%, transparent), linear-gradient(270deg, #fb6d9d 50%, #fafafa 50%, #fafafa); +} +.radial-bar-pink.radial-bar-65 { + background-image: linear-gradient(324deg, #fb6d9d 50%, transparent 50%, transparent), linear-gradient(270deg, #fb6d9d 50%, #fafafa 50%, #fafafa); +} +.radial-bar-pink.radial-bar-70 { + background-image: linear-gradient(342deg, #fb6d9d 50%, transparent 50%, transparent), linear-gradient(270deg, #fb6d9d 50%, #fafafa 50%, #fafafa); +} +.radial-bar-pink.radial-bar-75 { + background-image: linear-gradient(360deg, #fb6d9d 50%, transparent 50%, transparent), linear-gradient(270deg, #fb6d9d 50%, #fafafa 50%, #fafafa); +} +.radial-bar-pink.radial-bar-80 { + background-image: linear-gradient(378deg, #fb6d9d 50%, transparent 50%, transparent), linear-gradient(270deg, #fb6d9d 50%, #fafafa 50%, #fafafa); +} +.radial-bar-pink.radial-bar-85 { + background-image: linear-gradient(396deg, #fb6d9d 50%, transparent 50%, transparent), linear-gradient(270deg, #fb6d9d 50%, #fafafa 50%, #fafafa); +} +.radial-bar-pink.radial-bar-90 { + background-image: linear-gradient(414deg, #fb6d9d 50%, transparent 50%, transparent), linear-gradient(270deg, #fb6d9d 50%, #fafafa 50%, #fafafa); +} +.radial-bar-pink.radial-bar-95 { + background-image: linear-gradient(432deg, #fb6d9d 50%, transparent 50%, transparent), linear-gradient(270deg, #fb6d9d 50%, #fafafa 50%, #fafafa); +} +.radial-bar-pink.radial-bar-100 { + background-image: linear-gradient(450deg, #5fbeaa 50%, transparent 50%, transparent), linear-gradient(270deg, #fb6d9d 50%, #fafafa 50%, #fafafa); +} + + + +/* -- Radial Purple -- */ +.radial-bar-purple.radial-bar-0 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(90deg, #7266ba 50%, #fafafa 50%, #fafafa); +} +.radial-bar-purple.radial-bar-5 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(108deg, #7266ba 50%, #fafafa 50%, #fafafa); +} +.radial-bar-purple.radial-bar-10 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(126deg, #7266ba 50%, #fafafa 50%, #fafafa); +} +.radial-bar-purple.radial-bar-15 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(144deg, #7266ba 50%, #fafafa 50%, #fafafa); +} +.radial-bar-purple.radial-bar-20 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(162deg, #7266ba 50%, #fafafa 50%, #fafafa); +} +.radial-bar-purple.radial-bar-25 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(180deg, #7266ba 50%, #fafafa 50%, #fafafa); +} +.radial-bar-purple.radial-bar-30 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(198deg, #7266ba 50%, #fafafa 50%, #fafafa); +} +.radial-bar-purple.radial-bar-35 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(216deg, #7266ba 50%, #fafafa 50%, #fafafa); +} +.radial-bar-purple.radial-bar-40 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(234deg, #7266ba 50%, #fafafa 50%, #fafafa); +} +.radial-bar-purple.radial-bar-45 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(252deg, #7266ba 50%, #fafafa 50%, #fafafa); +} +.radial-bar-purple.radial-bar-50 { + background-image: linear-gradient(270deg, #7266ba 50%, transparent 50%, transparent), linear-gradient(270deg, #7266ba 50%, #fafafa 50%, #fafafa); +} +.radial-bar-purple.radial-bar-55 { + background-image: linear-gradient(288deg, #7266ba 50%, transparent 50%, transparent), linear-gradient(270deg, #7266ba 50%, #fafafa 50%, #fafafa); +} +.radial-bar-purple.radial-bar-60 { + background-image: linear-gradient(306deg, #7266ba 50%, transparent 50%, transparent), linear-gradient(270deg, #7266ba 50%, #fafafa 50%, #fafafa); +} +.radial-bar-purple.radial-bar-65 { + background-image: linear-gradient(324deg, #7266ba 50%, transparent 50%, transparent), linear-gradient(270deg, #7266ba 50%, #fafafa 50%, #fafafa); +} +.radial-bar-purple.radial-bar-70 { + background-image: linear-gradient(342deg, #7266ba 50%, transparent 50%, transparent), linear-gradient(270deg, #7266ba 50%, #fafafa 50%, #fafafa); +} +.radial-bar-purple.radial-bar-75 { + background-image: linear-gradient(360deg, #7266ba 50%, transparent 50%, transparent), linear-gradient(270deg, #7266ba 50%, #fafafa 50%, #fafafa); +} +.radial-bar-purple.radial-bar-80 { + background-image: linear-gradient(378deg, #7266ba 50%, transparent 50%, transparent), linear-gradient(270deg, #7266ba 50%, #fafafa 50%, #fafafa); +} +.radial-bar-purple.radial-bar-85 { + background-image: linear-gradient(396deg, #7266ba 50%, transparent 50%, transparent), linear-gradient(270deg, #7266ba 50%, #fafafa 50%, #fafafa); +} +.radial-bar-purple.radial-bar-90 { + background-image: linear-gradient(414deg, #7266ba 50%, transparent 50%, transparent), linear-gradient(270deg, #7266ba 50%, #fafafa 50%, #fafafa); +} +.radial-bar-purple.radial-bar-95 { + background-image: linear-gradient(432deg, #7266ba 50%, transparent 50%, transparent), linear-gradient(270deg, #7266ba 50%, #fafafa 50%, #fafafa); +} +.radial-bar-purple.radial-bar-100 { + background-image: linear-gradient(450deg, #7266ba 50%, transparent 50%, transparent), linear-gradient(270deg, #7266ba 50%, #fafafa 50%, #fafafa); +} + + + +/* -- Radial Inverse -- */ +.radial-bar-inverse.radial-bar-0 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(90deg, #4c5667 50%, #fafafa 50%, #fafafa); +} +.radial-bar-inverse.radial-bar-5 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(108deg, #4c5667 50%, #fafafa 50%, #fafafa); +} +.radial-bar-inverse.radial-bar-10 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(126deg, #4c5667 50%, #fafafa 50%, #fafafa); +} +.radial-bar-inverse.radial-bar-15 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(144deg, #4c5667 50%, #fafafa 50%, #fafafa); +} +.radial-bar-inverse.radial-bar-20 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(162deg, #4c5667 50%, #fafafa 50%, #fafafa); +} +.radial-bar-inverse.radial-bar-25 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(180deg, #4c5667 50%, #fafafa 50%, #fafafa); +} +.radial-bar-inverse.radial-bar-30 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(198deg, #4c5667 50%, #fafafa 50%, #fafafa); +} +.radial-bar-inverse.radial-bar-35 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(216deg, #4c5667 50%, #fafafa 50%, #fafafa); +} +.radial-bar-inverse.radial-bar-40 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(234deg, #4c5667 50%, #fafafa 50%, #fafafa); +} +.radial-bar-inverse.radial-bar-45 { + background-image: linear-gradient(90deg, #fafafa 50%, transparent 50%, transparent), linear-gradient(252deg, #4c5667 50%, #fafafa 50%, #fafafa); +} +.radial-bar-inverse.radial-bar-50 { + background-image: linear-gradient(270deg, #4c5667 50%, transparent 50%, transparent), linear-gradient(270deg, #4c5667 50%, #fafafa 50%, #fafafa); +} +.radial-bar-inverse.radial-bar-55 { + background-image: linear-gradient(288deg, #4c5667 50%, transparent 50%, transparent), linear-gradient(270deg, #4c5667 50%, #fafafa 50%, #fafafa); +} +.radial-bar-inverse.radial-bar-60 { + background-image: linear-gradient(306deg, #4c5667 50%, transparent 50%, transparent), linear-gradient(270deg, #4c5667 50%, #fafafa 50%, #fafafa); +} +.radial-bar-inverse.radial-bar-65 { + background-image: linear-gradient(324deg, #4c5667 50%, transparent 50%, transparent), linear-gradient(270deg, #4c5667 50%, #fafafa 50%, #fafafa); +} +.radial-bar-inverse.radial-bar-70 { + background-image: linear-gradient(342deg, #4c5667 50%, transparent 50%, transparent), linear-gradient(270deg, #4c5667 50%, #fafafa 50%, #fafafa); +} +.radial-bar-inverse.radial-bar-75 { + background-image: linear-gradient(360deg, #4c5667 50%, transparent 50%, transparent), linear-gradient(270deg, #4c5667 50%, #fafafa 50%, #fafafa); +} +.radial-bar-inverse.radial-bar-80 { + background-image: linear-gradient(378deg, #4c5667 50%, transparent 50%, transparent), linear-gradient(270deg, #4c5667 50%, #fafafa 50%, #fafafa); +} +.radial-bar-inverse.radial-bar-85 { + background-image: linear-gradient(396deg, #4c5667 50%, transparent 50%, transparent), linear-gradient(270deg, #4c5667 50%, #fafafa 50%, #fafafa); +} +.radial-bar-inverse.radial-bar-90 { + background-image: linear-gradient(414deg, #4c5667 50%, transparent 50%, transparent), linear-gradient(270deg, #4c5667 50%, #fafafa 50%, #fafafa); +} +.radial-bar-inverse.radial-bar-95 { + background-image: linear-gradient(432deg, #4c5667 50%, transparent 50%, transparent), linear-gradient(270deg, #4c5667 50%, #fafafa 50%, #fafafa); +} +.radial-bar-inverse.radial-bar-100 { + background-image: linear-gradient(450deg, #4c5667 50%, transparent 50%, transparent), linear-gradient(270deg, #4c5667 50%, #fafafa 50%, #fafafa); +} + +.radial-bar-lg { + width: 100px; + height: 100px; + font-size: 20px; +} +.radial-bar-lg:after, +.radial-bar-lg > img { + width: 70px; + height: 70px; + margin-left: 15px; + margin-top: 15px; + line-height: 70px; +} +.radial-bar-sm { + width: 50px; + height: 50px; + font-size: 12px; +} +.radial-bar-sm:after, +.radial-bar-sm > img { + width: 35px; + height: 35px; + margin-left: 7.5px; + margin-top: 7.5px; + line-height: 35px; +} +.radial-bar-xs { + width: 30px; + height: 30px; + font-size: 8px; +} +.radial-bar-xs:after, +.radial-bar-xs > img { + width: 20px; + height: 20px; + margin-left: 5.5px; + margin-top: 4.5px; + line-height: 21px; +} + +.radial-bar { + background-clip: content-box; +} \ No newline at end of file diff --git a/Monitor/wwwroot/assets/plugins/raphael/raphael-min.js b/Monitor/wwwroot/assets/plugins/raphael/raphael-min.js new file mode 100644 index 0000000..1f8a305 --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/raphael/raphael-min.js @@ -0,0 +1,11 @@ +// ┌────────────────────────────────────────────────────────────────────┐ \\ +// │ Raphaël 2.1.4 - JavaScript Vector Library │ \\ +// ├────────────────────────────────────────────────────────────────────┤ \\ +// │ Copyright © 2008-2012 Dmitry Baranovskiy (http://raphaeljs.com) │ \\ +// │ Copyright © 2008-2012 Sencha Labs (http://sencha.com) │ \\ +// ├────────────────────────────────────────────────────────────────────┤ \\ +// │ Licensed under the MIT (http://raphaeljs.com/license.html) license.│ \\ +// └────────────────────────────────────────────────────────────────────┘ \\ +!function(a){var b,c,d="0.4.2",e="hasOwnProperty",f=/[\.\/]/,g="*",h=function(){},i=function(a,b){return a-b},j={n:{}},k=function(a,d){a=String(a);var e,f=c,g=Array.prototype.slice.call(arguments,2),h=k.listeners(a),j=0,l=[],m={},n=[],o=b;b=a,c=0;for(var p=0,q=h.length;q>p;p++)"zIndex"in h[p]&&(l.push(h[p].zIndex),h[p].zIndex<0&&(m[h[p].zIndex]=h[p]));for(l.sort(i);l[j]<0;)if(e=m[l[j++]],n.push(e.apply(d,g)),c)return c=f,n;for(p=0;q>p;p++)if(e=h[p],"zIndex"in e)if(e.zIndex==l[j]){if(n.push(e.apply(d,g)),c)break;do if(j++,e=m[l[j]],e&&n.push(e.apply(d,g)),c)break;while(e)}else m[e.zIndex]=e;else if(n.push(e.apply(d,g)),c)break;return c=f,b=o,n.length?n:null};k._events=j,k.listeners=function(a){var b,c,d,e,h,i,k,l,m=a.split(f),n=j,o=[n],p=[];for(e=0,h=m.length;h>e;e++){for(l=[],i=0,k=o.length;k>i;i++)for(n=o[i].n,c=[n[m[e]],n[g]],d=2;d--;)b=c[d],b&&(l.push(b),p=p.concat(b.f||[]));o=l}return p},k.on=function(a,b){if(a=String(a),"function"!=typeof b)return function(){};for(var c=a.split(f),d=j,e=0,g=c.length;g>e;e++)d=d.n,d=d.hasOwnProperty(c[e])&&d[c[e]]||(d[c[e]]={n:{}});for(d.f=d.f||[],e=0,g=d.f.length;g>e;e++)if(d.f[e]==b)return h;return d.f.push(b),function(a){+a==+a&&(b.zIndex=+a)}},k.f=function(a){var b=[].slice.call(arguments,1);return function(){k.apply(null,[a,null].concat(b).concat([].slice.call(arguments,0)))}},k.stop=function(){c=1},k.nt=function(a){return a?new RegExp("(?:\\.|\\/|^)"+a+"(?:\\.|\\/|$)").test(b):b},k.nts=function(){return b.split(f)},k.off=k.unbind=function(a,b){if(!a)return void(k._events=j={n:{}});var c,d,h,i,l,m,n,o=a.split(f),p=[j];for(i=0,l=o.length;l>i;i++)for(m=0;mi;i++)for(c=p[i];c.n;){if(b){if(c.f){for(m=0,n=c.f.length;n>m;m++)if(c.f[m]==b){c.f.splice(m,1);break}!c.f.length&&delete c.f}for(d in c.n)if(c.n[e](d)&&c.n[d].f){var q=c.n[d].f;for(m=0,n=q.length;n>m;m++)if(q[m]==b){q.splice(m,1);break}!q.length&&delete c.n[d].f}}else{delete c.f;for(d in c.n)c.n[e](d)&&c.n[d].f&&delete c.n[d].f}c=c.n}},k.once=function(a,b){var c=function(){return k.unbind(a,c),b.apply(this,arguments)};return k.on(a,c)},k.version=d,k.toString=function(){return"You are running Eve "+d},"undefined"!=typeof module&&module.exports?module.exports=k:"undefined"!=typeof define?define("eve",[],function(){return k}):a.eve=k}(window||this),function(a,b){"function"==typeof define&&define.amd?define(["eve"],function(c){return b(a,c)}):b(a,a.eve||"function"==typeof require&&require("eve"))}(this,function(a,b){function c(a){if(c.is(a,"function"))return u?a():b.on("raphael.DOMload",a);if(c.is(a,V))return c._engine.create[D](c,a.splice(0,3+c.is(a[0],T))).add(a);var d=Array.prototype.slice.call(arguments,0);if(c.is(d[d.length-1],"function")){var e=d.pop();return u?e.call(c._engine.create[D](c,d)):b.on("raphael.DOMload",function(){e.call(c._engine.create[D](c,d))})}return c._engine.create[D](c,arguments)}function d(a){if("function"==typeof a||Object(a)!==a)return a;var b=new a.constructor;for(var c in a)a[z](c)&&(b[c]=d(a[c]));return b}function e(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return a.push(a.splice(c,1)[0])}function f(a,b,c){function d(){var f=Array.prototype.slice.call(arguments,0),g=f.join("␀"),h=d.cache=d.cache||{},i=d.count=d.count||[];return h[z](g)?(e(i,g),c?c(h[g]):h[g]):(i.length>=1e3&&delete h[i.shift()],i.push(g),h[g]=a[D](b,f),c?c(h[g]):h[g])}return d}function g(){return this.hex}function h(a,b){for(var c=[],d=0,e=a.length;e-2*!b>d;d+=2){var f=[{x:+a[d-2],y:+a[d-1]},{x:+a[d],y:+a[d+1]},{x:+a[d+2],y:+a[d+3]},{x:+a[d+4],y:+a[d+5]}];b?d?e-4==d?f[3]={x:+a[0],y:+a[1]}:e-2==d&&(f[2]={x:+a[0],y:+a[1]},f[3]={x:+a[2],y:+a[3]}):f[0]={x:+a[e-2],y:+a[e-1]}:e-4==d?f[3]=f[2]:d||(f[0]={x:+a[d],y:+a[d+1]}),c.push(["C",(-f[0].x+6*f[1].x+f[2].x)/6,(-f[0].y+6*f[1].y+f[2].y)/6,(f[1].x+6*f[2].x-f[3].x)/6,(f[1].y+6*f[2].y-f[3].y)/6,f[2].x,f[2].y])}return c}function i(a,b,c,d,e){var f=-3*b+9*c-9*d+3*e,g=a*f+6*b-12*c+6*d;return a*g-3*b+3*c}function j(a,b,c,d,e,f,g,h,j){null==j&&(j=1),j=j>1?1:0>j?0:j;for(var k=j/2,l=12,m=[-.1252,.1252,-.3678,.3678,-.5873,.5873,-.7699,.7699,-.9041,.9041,-.9816,.9816],n=[.2491,.2491,.2335,.2335,.2032,.2032,.1601,.1601,.1069,.1069,.0472,.0472],o=0,p=0;l>p;p++){var q=k*m[p]+k,r=i(q,a,c,e,g),s=i(q,b,d,f,h),t=r*r+s*s;o+=n[p]*N.sqrt(t)}return k*o}function k(a,b,c,d,e,f,g,h,i){if(!(0>i||j(a,b,c,d,e,f,g,h)o;)m/=2,n+=(i>k?1:-1)*m,k=j(a,b,c,d,e,f,g,h,n);return n}}function l(a,b,c,d,e,f,g,h){if(!(O(a,c)O(e,g)||O(b,d)O(f,h))){var i=(a*d-b*c)*(e-g)-(a-c)*(e*h-f*g),j=(a*d-b*c)*(f-h)-(b-d)*(e*h-f*g),k=(a-c)*(f-h)-(b-d)*(e-g);if(k){var l=i/k,m=j/k,n=+l.toFixed(2),o=+m.toFixed(2);if(!(n<+P(a,c).toFixed(2)||n>+O(a,c).toFixed(2)||n<+P(e,g).toFixed(2)||n>+O(e,g).toFixed(2)||o<+P(b,d).toFixed(2)||o>+O(b,d).toFixed(2)||o<+P(f,h).toFixed(2)||o>+O(f,h).toFixed(2)))return{x:l,y:m}}}}function m(a,b,d){var e=c.bezierBBox(a),f=c.bezierBBox(b);if(!c.isBBoxIntersect(e,f))return d?0:[];for(var g=j.apply(0,a),h=j.apply(0,b),i=O(~~(g/5),1),k=O(~~(h/5),1),m=[],n=[],o={},p=d?0:[],q=0;i+1>q;q++){var r=c.findDotsAtSegment.apply(c,a.concat(q/i));m.push({x:r.x,y:r.y,t:q/i})}for(q=0;k+1>q;q++)r=c.findDotsAtSegment.apply(c,b.concat(q/k)),n.push({x:r.x,y:r.y,t:q/k});for(q=0;i>q;q++)for(var s=0;k>s;s++){var t=m[q],u=m[q+1],v=n[s],w=n[s+1],x=Q(u.x-t.x)<.001?"y":"x",y=Q(w.x-v.x)<.001?"y":"x",z=l(t.x,t.y,u.x,u.y,v.x,v.y,w.x,w.y);if(z){if(o[z.x.toFixed(4)]==z.y.toFixed(4))continue;o[z.x.toFixed(4)]=z.y.toFixed(4);var A=t.t+Q((z[x]-t[x])/(u[x]-t[x]))*(u.t-t.t),B=v.t+Q((z[y]-v[y])/(w[y]-v[y]))*(w.t-v.t);A>=0&&1.001>=A&&B>=0&&1.001>=B&&(d?p++:p.push({x:z.x,y:z.y,t1:P(A,1),t2:P(B,1)}))}}return p}function n(a,b,d){a=c._path2curve(a),b=c._path2curve(b);for(var e,f,g,h,i,j,k,l,n,o,p=d?0:[],q=0,r=a.length;r>q;q++){var s=a[q];if("M"==s[0])e=i=s[1],f=j=s[2];else{"C"==s[0]?(n=[e,f].concat(s.slice(1)),e=n[6],f=n[7]):(n=[e,f,e,f,i,j,i,j],e=i,f=j);for(var t=0,u=b.length;u>t;t++){var v=b[t];if("M"==v[0])g=k=v[1],h=l=v[2];else{"C"==v[0]?(o=[g,h].concat(v.slice(1)),g=o[6],h=o[7]):(o=[g,h,g,h,k,l,k,l],g=k,h=l);var w=m(n,o,d);if(d)p+=w;else{for(var x=0,y=w.length;y>x;x++)w[x].segment1=q,w[x].segment2=t,w[x].bez1=n,w[x].bez2=o;p=p.concat(w)}}}}}return p}function o(a,b,c,d,e,f){null!=a?(this.a=+a,this.b=+b,this.c=+c,this.d=+d,this.e=+e,this.f=+f):(this.a=1,this.b=0,this.c=0,this.d=1,this.e=0,this.f=0)}function p(){return this.x+H+this.y+H+this.width+" × "+this.height}function q(a,b,c,d,e,f){function g(a){return((l*a+k)*a+j)*a}function h(a,b){var c=i(a,b);return((o*c+n)*c+m)*c}function i(a,b){var c,d,e,f,h,i;for(e=a,i=0;8>i;i++){if(f=g(e)-a,Q(f)e)return c;if(e>d)return d;for(;d>c;){if(f=g(e),Q(f-a)f?c=e:d=e,e=(d-c)/2+c}return e}var j=3*b,k=3*(d-b)-j,l=1-j-k,m=3*c,n=3*(e-c)-m,o=1-m-n;return h(a,1/(200*f))}function r(a,b){var c=[],d={};if(this.ms=b,this.times=1,a){for(var e in a)a[z](e)&&(d[_(e)]=a[e],c.push(_(e)));c.sort(lb)}this.anim=d,this.top=c[c.length-1],this.percents=c}function s(a,d,e,f,g,h){e=_(e);var i,j,k,l,m,n,p=a.ms,r={},s={},t={};if(f)for(v=0,x=ic.length;x>v;v++){var u=ic[v];if(u.el.id==d.id&&u.anim==a){u.percent!=e?(ic.splice(v,1),k=1):j=u,d.attr(u.totalOrigin);break}}else f=+s;for(var v=0,x=a.percents.length;x>v;v++){if(a.percents[v]==e||a.percents[v]>f*a.top){e=a.percents[v],m=a.percents[v-1]||0,p=p/a.top*(e-m),l=a.percents[v+1],i=a.anim[e];break}f&&d.attr(a.anim[a.percents[v]])}if(i){if(j)j.initstatus=f,j.start=new Date-j.ms*f;else{for(var y in i)if(i[z](y)&&(db[z](y)||d.paper.customAttributes[z](y)))switch(r[y]=d.attr(y),null==r[y]&&(r[y]=cb[y]),s[y]=i[y],db[y]){case T:t[y]=(s[y]-r[y])/p;break;case"colour":r[y]=c.getRGB(r[y]);var A=c.getRGB(s[y]);t[y]={r:(A.r-r[y].r)/p,g:(A.g-r[y].g)/p,b:(A.b-r[y].b)/p};break;case"path":var B=Kb(r[y],s[y]),C=B[1];for(r[y]=B[0],t[y]=[],v=0,x=r[y].length;x>v;v++){t[y][v]=[0];for(var D=1,F=r[y][v].length;F>D;D++)t[y][v][D]=(C[v][D]-r[y][v][D])/p}break;case"transform":var G=d._,H=Pb(G[y],s[y]);if(H)for(r[y]=H.from,s[y]=H.to,t[y]=[],t[y].real=!0,v=0,x=r[y].length;x>v;v++)for(t[y][v]=[r[y][v][0]],D=1,F=r[y][v].length;F>D;D++)t[y][v][D]=(s[y][v][D]-r[y][v][D])/p;else{var K=d.matrix||new o,L={_:{transform:G.transform},getBBox:function(){return d.getBBox(1)}};r[y]=[K.a,K.b,K.c,K.d,K.e,K.f],Nb(L,s[y]),s[y]=L._.transform,t[y]=[(L.matrix.a-K.a)/p,(L.matrix.b-K.b)/p,(L.matrix.c-K.c)/p,(L.matrix.d-K.d)/p,(L.matrix.e-K.e)/p,(L.matrix.f-K.f)/p]}break;case"csv":var M=I(i[y])[J](w),N=I(r[y])[J](w);if("clip-rect"==y)for(r[y]=N,t[y]=[],v=N.length;v--;)t[y][v]=(M[v]-r[y][v])/p;s[y]=M;break;default:for(M=[][E](i[y]),N=[][E](r[y]),t[y]=[],v=d.paper.customAttributes[y].length;v--;)t[y][v]=((M[v]||0)-(N[v]||0))/p}var O=i.easing,P=c.easing_formulas[O];if(!P)if(P=I(O).match(Z),P&&5==P.length){var Q=P;P=function(a){return q(a,+Q[1],+Q[2],+Q[3],+Q[4],p)}}else P=nb;if(n=i.start||a.start||+new Date,u={anim:a,percent:e,timestamp:n,start:n+(a.del||0),status:0,initstatus:f||0,stop:!1,ms:p,easing:P,from:r,diff:t,to:s,el:d,callback:i.callback,prev:m,next:l,repeat:h||a.times,origin:d.attr(),totalOrigin:g},ic.push(u),f&&!j&&!k&&(u.stop=!0,u.start=new Date-p*f,1==ic.length))return kc();k&&(u.start=new Date-u.ms*f),1==ic.length&&jc(kc)}b("raphael.anim.start."+d.id,d,a)}}function t(a){for(var b=0;be;e++)for(i=a[e],f=1,h=i.length;h>f;f+=2)c=b.x(i[f],i[f+1]),d=b.y(i[f],i[f+1]),i[f]=c,i[f+1]=d;return a};if(c._g=A,c.type=A.win.SVGAngle||A.doc.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure","1.1")?"SVG":"VML","VML"==c.type){var sb,tb=A.doc.createElement("div");if(tb.innerHTML='',sb=tb.firstChild,sb.style.behavior="url(#default#VML)",!sb||"object"!=typeof sb.adj)return c.type=G;tb=null}c.svg=!(c.vml="VML"==c.type),c._Paper=C,c.fn=v=C.prototype=c.prototype,c._id=0,c._oid=0,c.is=function(a,b){return b=M.call(b),"finite"==b?!Y[z](+a):"array"==b?a instanceof Array:"null"==b&&null===a||b==typeof a&&null!==a||"object"==b&&a===Object(a)||"array"==b&&Array.isArray&&Array.isArray(a)||W.call(a).slice(8,-1).toLowerCase()==b},c.angle=function(a,b,d,e,f,g){if(null==f){var h=a-d,i=b-e;return h||i?(180+180*N.atan2(-i,-h)/S+360)%360:0}return c.angle(a,b,f,g)-c.angle(d,e,f,g)},c.rad=function(a){return a%360*S/180},c.deg=function(a){return Math.round(180*a/S%360*1e3)/1e3},c.snapTo=function(a,b,d){if(d=c.is(d,"finite")?d:10,c.is(a,V)){for(var e=a.length;e--;)if(Q(a[e]-b)<=d)return a[e]}else{a=+a;var f=b%a;if(d>f)return b-f;if(f>a-d)return b-f+a}return b};c.createUUID=function(a,b){return function(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(a,b).toUpperCase()}}(/[xy]/g,function(a){var b=16*N.random()|0,c="x"==a?b:3&b|8;return c.toString(16)});c.setWindow=function(a){b("raphael.setWindow",c,A.win,a),A.win=a,A.doc=A.win.document,c._engine.initWin&&c._engine.initWin(A.win)};var ub=function(a){if(c.vml){var b,d=/^\s+|\s+$/g;try{var e=new ActiveXObject("htmlfile");e.write(""),e.close(),b=e.body}catch(g){b=createPopup().document.body}var h=b.createTextRange();ub=f(function(a){try{b.style.color=I(a).replace(d,G);var c=h.queryCommandValue("ForeColor");return c=(255&c)<<16|65280&c|(16711680&c)>>>16,"#"+("000000"+c.toString(16)).slice(-6)}catch(e){return"none"}})}else{var i=A.doc.createElement("i");i.title="Raphaël Colour Picker",i.style.display="none",A.doc.body.appendChild(i),ub=f(function(a){return i.style.color=a,A.doc.defaultView.getComputedStyle(i,G).getPropertyValue("color")})}return ub(a)},vb=function(){return"hsb("+[this.h,this.s,this.b]+")"},wb=function(){return"hsl("+[this.h,this.s,this.l]+")"},xb=function(){return this.hex},yb=function(a,b,d){if(null==b&&c.is(a,"object")&&"r"in a&&"g"in a&&"b"in a&&(d=a.b,b=a.g,a=a.r),null==b&&c.is(a,U)){var e=c.getRGB(a);a=e.r,b=e.g,d=e.b}return(a>1||b>1||d>1)&&(a/=255,b/=255,d/=255),[a,b,d]},zb=function(a,b,d,e){a*=255,b*=255,d*=255;var f={r:a,g:b,b:d,hex:c.rgb(a,b,d),toString:xb};return c.is(e,"finite")&&(f.opacity=e),f};c.color=function(a){var b;return c.is(a,"object")&&"h"in a&&"s"in a&&"b"in a?(b=c.hsb2rgb(a),a.r=b.r,a.g=b.g,a.b=b.b,a.hex=b.hex):c.is(a,"object")&&"h"in a&&"s"in a&&"l"in a?(b=c.hsl2rgb(a),a.r=b.r,a.g=b.g,a.b=b.b,a.hex=b.hex):(c.is(a,"string")&&(a=c.getRGB(a)),c.is(a,"object")&&"r"in a&&"g"in a&&"b"in a?(b=c.rgb2hsl(a),a.h=b.h,a.s=b.s,a.l=b.l,b=c.rgb2hsb(a),a.v=b.b):(a={hex:"none"},a.r=a.g=a.b=a.h=a.s=a.v=a.l=-1)),a.toString=xb,a},c.hsb2rgb=function(a,b,c,d){this.is(a,"object")&&"h"in a&&"s"in a&&"b"in a&&(c=a.b,b=a.s,d=a.o,a=a.h),a*=360;var e,f,g,h,i;return a=a%360/60,i=c*b,h=i*(1-Q(a%2-1)),e=f=g=c-i,a=~~a,e+=[i,h,0,0,h,i][a],f+=[h,i,i,h,0,0][a],g+=[0,0,h,i,i,h][a],zb(e,f,g,d)},c.hsl2rgb=function(a,b,c,d){this.is(a,"object")&&"h"in a&&"s"in a&&"l"in a&&(c=a.l,b=a.s,a=a.h),(a>1||b>1||c>1)&&(a/=360,b/=100,c/=100),a*=360;var e,f,g,h,i;return a=a%360/60,i=2*b*(.5>c?c:1-c),h=i*(1-Q(a%2-1)),e=f=g=c-i/2,a=~~a,e+=[i,h,0,0,h,i][a],f+=[h,i,i,h,0,0][a],g+=[0,0,h,i,i,h][a],zb(e,f,g,d)},c.rgb2hsb=function(a,b,c){c=yb(a,b,c),a=c[0],b=c[1],c=c[2];var d,e,f,g;return f=O(a,b,c),g=f-P(a,b,c),d=0==g?null:f==a?(b-c)/g:f==b?(c-a)/g+2:(a-b)/g+4,d=(d+360)%6*60/360,e=0==g?0:g/f,{h:d,s:e,b:f,toString:vb}},c.rgb2hsl=function(a,b,c){c=yb(a,b,c),a=c[0],b=c[1],c=c[2];var d,e,f,g,h,i;return g=O(a,b,c),h=P(a,b,c),i=g-h,d=0==i?null:g==a?(b-c)/i:g==b?(c-a)/i+2:(a-b)/i+4,d=(d+360)%6*60/360,f=(g+h)/2,e=0==i?0:.5>f?i/(2*f):i/(2-2*f),{h:d,s:e,l:f,toString:wb}},c._path2string=function(){return this.join(",").replace(gb,"$1")};c._preload=function(a,b){var c=A.doc.createElement("img");c.style.cssText="position:absolute;left:-9999em;top:-9999em",c.onload=function(){b.call(this),this.onload=null,A.doc.body.removeChild(this)},c.onerror=function(){A.doc.body.removeChild(this)},A.doc.body.appendChild(c),c.src=a};c.getRGB=f(function(a){if(!a||(a=I(a)).indexOf("-")+1)return{r:-1,g:-1,b:-1,hex:"none",error:1,toString:g};if("none"==a)return{r:-1,g:-1,b:-1,hex:"none",toString:g};!(fb[z](a.toLowerCase().substring(0,2))||"#"==a.charAt())&&(a=ub(a));var b,d,e,f,h,i,j=a.match(X);return j?(j[2]&&(e=ab(j[2].substring(5),16),d=ab(j[2].substring(3,5),16),b=ab(j[2].substring(1,3),16)),j[3]&&(e=ab((h=j[3].charAt(3))+h,16),d=ab((h=j[3].charAt(2))+h,16),b=ab((h=j[3].charAt(1))+h,16)),j[4]&&(i=j[4][J](eb),b=_(i[0]),"%"==i[0].slice(-1)&&(b*=2.55),d=_(i[1]),"%"==i[1].slice(-1)&&(d*=2.55),e=_(i[2]),"%"==i[2].slice(-1)&&(e*=2.55),"rgba"==j[1].toLowerCase().slice(0,4)&&(f=_(i[3])),i[3]&&"%"==i[3].slice(-1)&&(f/=100)),j[5]?(i=j[5][J](eb),b=_(i[0]),"%"==i[0].slice(-1)&&(b*=2.55),d=_(i[1]),"%"==i[1].slice(-1)&&(d*=2.55),e=_(i[2]),"%"==i[2].slice(-1)&&(e*=2.55),("deg"==i[0].slice(-3)||"°"==i[0].slice(-1))&&(b/=360),"hsba"==j[1].toLowerCase().slice(0,4)&&(f=_(i[3])),i[3]&&"%"==i[3].slice(-1)&&(f/=100),c.hsb2rgb(b,d,e,f)):j[6]?(i=j[6][J](eb),b=_(i[0]),"%"==i[0].slice(-1)&&(b*=2.55),d=_(i[1]),"%"==i[1].slice(-1)&&(d*=2.55),e=_(i[2]),"%"==i[2].slice(-1)&&(e*=2.55),("deg"==i[0].slice(-3)||"°"==i[0].slice(-1))&&(b/=360),"hsla"==j[1].toLowerCase().slice(0,4)&&(f=_(i[3])),i[3]&&"%"==i[3].slice(-1)&&(f/=100),c.hsl2rgb(b,d,e,f)):(j={r:b,g:d,b:e,toString:g},j.hex="#"+(16777216|e|d<<8|b<<16).toString(16).slice(1),c.is(f,"finite")&&(j.opacity=f),j)):{r:-1,g:-1,b:-1,hex:"none",error:1,toString:g}},c),c.hsb=f(function(a,b,d){return c.hsb2rgb(a,b,d).hex}),c.hsl=f(function(a,b,d){return c.hsl2rgb(a,b,d).hex}),c.rgb=f(function(a,b,c){return"#"+(16777216|c|b<<8|a<<16).toString(16).slice(1)}),c.getColor=function(a){var b=this.getColor.start=this.getColor.start||{h:0,s:1,b:a||.75},c=this.hsb2rgb(b.h,b.s,b.b);return b.h+=.075,b.h>1&&(b.h=0,b.s-=.2,b.s<=0&&(this.getColor.start={h:0,s:1,b:b.b})),c.hex},c.getColor.reset=function(){delete this.start},c.parsePathString=function(a){if(!a)return null;var b=Ab(a);if(b.arr)return Cb(b.arr);var d={a:7,c:6,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,z:0},e=[];return c.is(a,V)&&c.is(a[0],V)&&(e=Cb(a)),e.length||I(a).replace(hb,function(a,b,c){var f=[],g=b.toLowerCase();if(c.replace(jb,function(a,b){b&&f.push(+b)}),"m"==g&&f.length>2&&(e.push([b][E](f.splice(0,2))),g="l",b="m"==b?"l":"L"),"r"==g)e.push([b][E](f));else for(;f.length>=d[g]&&(e.push([b][E](f.splice(0,d[g]))),d[g]););}),e.toString=c._path2string,b.arr=Cb(e),e},c.parseTransformString=f(function(a){if(!a)return null;var b=[];return c.is(a,V)&&c.is(a[0],V)&&(b=Cb(a)),b.length||I(a).replace(ib,function(a,c,d){{var e=[];M.call(c)}d.replace(jb,function(a,b){b&&e.push(+b)}),b.push([c][E](e))}),b.toString=c._path2string,b});var Ab=function(a){var b=Ab.ps=Ab.ps||{};return b[a]?b[a].sleep=100:b[a]={sleep:100},setTimeout(function(){for(var c in b)b[z](c)&&c!=a&&(b[c].sleep--,!b[c].sleep&&delete b[c])}),b[a]};c.findDotsAtSegment=function(a,b,c,d,e,f,g,h,i){var j=1-i,k=R(j,3),l=R(j,2),m=i*i,n=m*i,o=k*a+3*l*i*c+3*j*i*i*e+n*g,p=k*b+3*l*i*d+3*j*i*i*f+n*h,q=a+2*i*(c-a)+m*(e-2*c+a),r=b+2*i*(d-b)+m*(f-2*d+b),s=c+2*i*(e-c)+m*(g-2*e+c),t=d+2*i*(f-d)+m*(h-2*f+d),u=j*a+i*c,v=j*b+i*d,w=j*e+i*g,x=j*f+i*h,y=90-180*N.atan2(q-s,r-t)/S;return(q>s||t>r)&&(y+=180),{x:o,y:p,m:{x:q,y:r},n:{x:s,y:t},start:{x:u,y:v},end:{x:w,y:x},alpha:y}},c.bezierBBox=function(a,b,d,e,f,g,h,i){c.is(a,"array")||(a=[a,b,d,e,f,g,h,i]);var j=Jb.apply(null,a);return{x:j.min.x,y:j.min.y,x2:j.max.x,y2:j.max.y,width:j.max.x-j.min.x,height:j.max.y-j.min.y}},c.isPointInsideBBox=function(a,b,c){return b>=a.x&&b<=a.x2&&c>=a.y&&c<=a.y2},c.isBBoxIntersect=function(a,b){var d=c.isPointInsideBBox;return d(b,a.x,a.y)||d(b,a.x2,a.y)||d(b,a.x,a.y2)||d(b,a.x2,a.y2)||d(a,b.x,b.y)||d(a,b.x2,b.y)||d(a,b.x,b.y2)||d(a,b.x2,b.y2)||(a.xb.x||b.xa.x)&&(a.yb.y||b.ya.y)},c.pathIntersection=function(a,b){return n(a,b)},c.pathIntersectionNumber=function(a,b){return n(a,b,1)},c.isPointInsidePath=function(a,b,d){var e=c.pathBBox(a);return c.isPointInsideBBox(e,b,d)&&n(a,[["M",b,d],["H",e.x2+10]],1)%2==1},c._removedFactory=function(a){return function(){b("raphael.log",null,"Raphaël: you are calling to method “"+a+"” of removed object",a)}};var Bb=c.pathBBox=function(a){var b=Ab(a);if(b.bbox)return d(b.bbox);if(!a)return{x:0,y:0,width:0,height:0,x2:0,y2:0};a=Kb(a);for(var c,e=0,f=0,g=[],h=[],i=0,j=a.length;j>i;i++)if(c=a[i],"M"==c[0])e=c[1],f=c[2],g.push(e),h.push(f);else{var k=Jb(e,f,c[1],c[2],c[3],c[4],c[5],c[6]);g=g[E](k.min.x,k.max.x),h=h[E](k.min.y,k.max.y),e=c[5],f=c[6]}var l=P[D](0,g),m=P[D](0,h),n=O[D](0,g),o=O[D](0,h),p=n-l,q=o-m,r={x:l,y:m,x2:n,y2:o,width:p,height:q,cx:l+p/2,cy:m+q/2};return b.bbox=d(r),r},Cb=function(a){var b=d(a);return b.toString=c._path2string,b},Db=c._pathToRelative=function(a){var b=Ab(a);if(b.rel)return Cb(b.rel);c.is(a,V)&&c.is(a&&a[0],V)||(a=c.parsePathString(a));var d=[],e=0,f=0,g=0,h=0,i=0;"M"==a[0][0]&&(e=a[0][1],f=a[0][2],g=e,h=f,i++,d.push(["M",e,f]));for(var j=i,k=a.length;k>j;j++){var l=d[j]=[],m=a[j];if(m[0]!=M.call(m[0]))switch(l[0]=M.call(m[0]),l[0]){case"a":l[1]=m[1],l[2]=m[2],l[3]=m[3],l[4]=m[4],l[5]=m[5],l[6]=+(m[6]-e).toFixed(3),l[7]=+(m[7]-f).toFixed(3);break;case"v":l[1]=+(m[1]-f).toFixed(3);break;case"m":g=m[1],h=m[2];default:for(var n=1,o=m.length;o>n;n++)l[n]=+(m[n]-(n%2?e:f)).toFixed(3)}else{l=d[j]=[],"m"==m[0]&&(g=m[1]+e,h=m[2]+f);for(var p=0,q=m.length;q>p;p++)d[j][p]=m[p]}var r=d[j].length;switch(d[j][0]){case"z":e=g,f=h;break;case"h":e+=+d[j][r-1];break;case"v":f+=+d[j][r-1];break;default:e+=+d[j][r-2],f+=+d[j][r-1]}}return d.toString=c._path2string,b.rel=Cb(d),d},Eb=c._pathToAbsolute=function(a){var b=Ab(a);if(b.abs)return Cb(b.abs);if(c.is(a,V)&&c.is(a&&a[0],V)||(a=c.parsePathString(a)),!a||!a.length)return[["M",0,0]];var d=[],e=0,f=0,g=0,i=0,j=0;"M"==a[0][0]&&(e=+a[0][1],f=+a[0][2],g=e,i=f,j++,d[0]=["M",e,f]);for(var k,l,m=3==a.length&&"M"==a[0][0]&&"R"==a[1][0].toUpperCase()&&"Z"==a[2][0].toUpperCase(),n=j,o=a.length;o>n;n++){if(d.push(k=[]),l=a[n],l[0]!=bb.call(l[0]))switch(k[0]=bb.call(l[0]),k[0]){case"A":k[1]=l[1],k[2]=l[2],k[3]=l[3],k[4]=l[4],k[5]=l[5],k[6]=+(l[6]+e),k[7]=+(l[7]+f);break;case"V":k[1]=+l[1]+f;break;case"H":k[1]=+l[1]+e;break;case"R":for(var p=[e,f][E](l.slice(1)),q=2,r=p.length;r>q;q++)p[q]=+p[q]+e,p[++q]=+p[q]+f;d.pop(),d=d[E](h(p,m));break;case"M":g=+l[1]+e,i=+l[2]+f;default:for(q=1,r=l.length;r>q;q++)k[q]=+l[q]+(q%2?e:f)}else if("R"==l[0])p=[e,f][E](l.slice(1)),d.pop(),d=d[E](h(p,m)),k=["R"][E](l.slice(-2));else for(var s=0,t=l.length;t>s;s++)k[s]=l[s];switch(k[0]){case"Z":e=g,f=i;break;case"H":e=k[1];break;case"V":f=k[1];break;case"M":g=k[k.length-2],i=k[k.length-1];default:e=k[k.length-2],f=k[k.length-1]}}return d.toString=c._path2string,b.abs=Cb(d),d},Fb=function(a,b,c,d){return[a,b,c,d,c,d]},Gb=function(a,b,c,d,e,f){var g=1/3,h=2/3;return[g*a+h*c,g*b+h*d,g*e+h*c,g*f+h*d,e,f]},Hb=function(a,b,c,d,e,g,h,i,j,k){var l,m=120*S/180,n=S/180*(+e||0),o=[],p=f(function(a,b,c){var d=a*N.cos(c)-b*N.sin(c),e=a*N.sin(c)+b*N.cos(c);return{x:d,y:e}});if(k)y=k[0],z=k[1],w=k[2],x=k[3];else{l=p(a,b,-n),a=l.x,b=l.y,l=p(i,j,-n),i=l.x,j=l.y;var q=(N.cos(S/180*e),N.sin(S/180*e),(a-i)/2),r=(b-j)/2,s=q*q/(c*c)+r*r/(d*d);s>1&&(s=N.sqrt(s),c=s*c,d=s*d);var t=c*c,u=d*d,v=(g==h?-1:1)*N.sqrt(Q((t*u-t*r*r-u*q*q)/(t*r*r+u*q*q))),w=v*c*r/d+(a+i)/2,x=v*-d*q/c+(b+j)/2,y=N.asin(((b-x)/d).toFixed(9)),z=N.asin(((j-x)/d).toFixed(9));y=w>a?S-y:y,z=w>i?S-z:z,0>y&&(y=2*S+y),0>z&&(z=2*S+z),h&&y>z&&(y-=2*S),!h&&z>y&&(z-=2*S)}var A=z-y;if(Q(A)>m){var B=z,C=i,D=j;z=y+m*(h&&z>y?1:-1),i=w+c*N.cos(z),j=x+d*N.sin(z),o=Hb(i,j,c,d,e,0,h,C,D,[z,B,w,x])}A=z-y;var F=N.cos(y),G=N.sin(y),H=N.cos(z),I=N.sin(z),K=N.tan(A/4),L=4/3*c*K,M=4/3*d*K,O=[a,b],P=[a+L*G,b-M*F],R=[i+L*I,j-M*H],T=[i,j];if(P[0]=2*O[0]-P[0],P[1]=2*O[1]-P[1],k)return[P,R,T][E](o);o=[P,R,T][E](o).join()[J](",");for(var U=[],V=0,W=o.length;W>V;V++)U[V]=V%2?p(o[V-1],o[V],n).y:p(o[V],o[V+1],n).x;return U},Ib=function(a,b,c,d,e,f,g,h,i){var j=1-i;return{x:R(j,3)*a+3*R(j,2)*i*c+3*j*i*i*e+R(i,3)*g,y:R(j,3)*b+3*R(j,2)*i*d+3*j*i*i*f+R(i,3)*h}},Jb=f(function(a,b,c,d,e,f,g,h){var i,j=e-2*c+a-(g-2*e+c),k=2*(c-a)-2*(e-c),l=a-c,m=(-k+N.sqrt(k*k-4*j*l))/2/j,n=(-k-N.sqrt(k*k-4*j*l))/2/j,o=[b,h],p=[a,g];return Q(m)>"1e12"&&(m=.5),Q(n)>"1e12"&&(n=.5),m>0&&1>m&&(i=Ib(a,b,c,d,e,f,g,h,m),p.push(i.x),o.push(i.y)),n>0&&1>n&&(i=Ib(a,b,c,d,e,f,g,h,n),p.push(i.x),o.push(i.y)),j=f-2*d+b-(h-2*f+d),k=2*(d-b)-2*(f-d),l=b-d,m=(-k+N.sqrt(k*k-4*j*l))/2/j,n=(-k-N.sqrt(k*k-4*j*l))/2/j,Q(m)>"1e12"&&(m=.5),Q(n)>"1e12"&&(n=.5),m>0&&1>m&&(i=Ib(a,b,c,d,e,f,g,h,m),p.push(i.x),o.push(i.y)),n>0&&1>n&&(i=Ib(a,b,c,d,e,f,g,h,n),p.push(i.x),o.push(i.y)),{min:{x:P[D](0,p),y:P[D](0,o)},max:{x:O[D](0,p),y:O[D](0,o)}}}),Kb=c._path2curve=f(function(a,b){var c=!b&&Ab(a);if(!b&&c.curve)return Cb(c.curve);for(var d=Eb(a),e=b&&Eb(b),f={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},g={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},h=(function(a,b,c){var d,e,f={T:1,Q:1};if(!a)return["C",b.x,b.y,b.x,b.y,b.x,b.y];switch(!(a[0]in f)&&(b.qx=b.qy=null),a[0]){case"M":b.X=a[1],b.Y=a[2];break;case"A":a=["C"][E](Hb[D](0,[b.x,b.y][E](a.slice(1))));break;case"S":"C"==c||"S"==c?(d=2*b.x-b.bx,e=2*b.y-b.by):(d=b.x,e=b.y),a=["C",d,e][E](a.slice(1));break;case"T":"Q"==c||"T"==c?(b.qx=2*b.x-b.qx,b.qy=2*b.y-b.qy):(b.qx=b.x,b.qy=b.y),a=["C"][E](Gb(b.x,b.y,b.qx,b.qy,a[1],a[2]));break;case"Q":b.qx=a[1],b.qy=a[2],a=["C"][E](Gb(b.x,b.y,a[1],a[2],a[3],a[4]));break;case"L":a=["C"][E](Fb(b.x,b.y,a[1],a[2]));break;case"H":a=["C"][E](Fb(b.x,b.y,a[1],b.y));break;case"V":a=["C"][E](Fb(b.x,b.y,b.x,a[1]));break;case"Z":a=["C"][E](Fb(b.x,b.y,b.X,b.Y))}return a}),i=function(a,b){if(a[b].length>7){a[b].shift();for(var c=a[b];c.length;)k[b]="A",e&&(l[b]="A"),a.splice(b++,0,["C"][E](c.splice(0,6)));a.splice(b,1),p=O(d.length,e&&e.length||0)}},j=function(a,b,c,f,g){a&&b&&"M"==a[g][0]&&"M"!=b[g][0]&&(b.splice(g,0,["M",f.x,f.y]),c.bx=0,c.by=0,c.x=a[g][1],c.y=a[g][2],p=O(d.length,e&&e.length||0))},k=[],l=[],m="",n="",o=0,p=O(d.length,e&&e.length||0);p>o;o++){d[o]&&(m=d[o][0]),"C"!=m&&(k[o]=m,o&&(n=k[o-1])),d[o]=h(d[o],f,n),"A"!=k[o]&&"C"==m&&(k[o]="C"),i(d,o),e&&(e[o]&&(m=e[o][0]),"C"!=m&&(l[o]=m,o&&(n=l[o-1])),e[o]=h(e[o],g,n),"A"!=l[o]&&"C"==m&&(l[o]="C"),i(e,o)),j(d,e,f,g,o),j(e,d,g,f,o);var q=d[o],r=e&&e[o],s=q.length,t=e&&r.length;f.x=q[s-2],f.y=q[s-1],f.bx=_(q[s-4])||f.x,f.by=_(q[s-3])||f.y,g.bx=e&&(_(r[t-4])||g.x),g.by=e&&(_(r[t-3])||g.y),g.x=e&&r[t-2],g.y=e&&r[t-1]}return e||(c.curve=Cb(d)),e?[d,e]:d},null,Cb),Lb=(c._parseDots=f(function(a){for(var b=[],d=0,e=a.length;e>d;d++){var f={},g=a[d].match(/^([^:]*):?([\d\.]*)/);if(f.color=c.getRGB(g[1]),f.color.error)return null;f.color=f.color.hex,g[2]&&(f.offset=g[2]+"%"),b.push(f)}for(d=1,e=b.length-1;e>d;d++)if(!b[d].offset){for(var h=_(b[d-1].offset||0),i=0,j=d+1;e>j;j++)if(b[j].offset){i=b[j].offset;break}i||(i=100,j=e),i=_(i);for(var k=(i-h)/(j-d+1);j>d;d++)h+=k,b[d].offset=h+"%"}return b}),c._tear=function(a,b){a==b.top&&(b.top=a.prev),a==b.bottom&&(b.bottom=a.next),a.next&&(a.next.prev=a.prev),a.prev&&(a.prev.next=a.next)}),Mb=(c._tofront=function(a,b){b.top!==a&&(Lb(a,b),a.next=null,a.prev=b.top,b.top.next=a,b.top=a)},c._toback=function(a,b){b.bottom!==a&&(Lb(a,b),a.next=b.bottom,a.prev=null,b.bottom.prev=a,b.bottom=a)},c._insertafter=function(a,b,c){Lb(a,c),b==c.top&&(c.top=a),b.next&&(b.next.prev=a),a.next=b.next,a.prev=b,b.next=a},c._insertbefore=function(a,b,c){Lb(a,c),b==c.bottom&&(c.bottom=a),b.prev&&(b.prev.next=a),a.prev=b.prev,b.prev=a,a.next=b},c.toMatrix=function(a,b){var c=Bb(a),d={_:{transform:G},getBBox:function(){return c}};return Nb(d,b),d.matrix}),Nb=(c.transformPath=function(a,b){return rb(a,Mb(a,b))},c._extractTransform=function(a,b){if(null==b)return a._.transform;b=I(b).replace(/\.{3}|\u2026/g,a._.transform||G);var d=c.parseTransformString(b),e=0,f=0,g=0,h=1,i=1,j=a._,k=new o;if(j.transform=d||[],d)for(var l=0,m=d.length;m>l;l++){var n,p,q,r,s,t=d[l],u=t.length,v=I(t[0]).toLowerCase(),w=t[0]!=v,x=w?k.invert():0;"t"==v&&3==u?w?(n=x.x(0,0),p=x.y(0,0),q=x.x(t[1],t[2]),r=x.y(t[1],t[2]),k.translate(q-n,r-p)):k.translate(t[1],t[2]):"r"==v?2==u?(s=s||a.getBBox(1),k.rotate(t[1],s.x+s.width/2,s.y+s.height/2),e+=t[1]):4==u&&(w?(q=x.x(t[2],t[3]),r=x.y(t[2],t[3]),k.rotate(t[1],q,r)):k.rotate(t[1],t[2],t[3]),e+=t[1]):"s"==v?2==u||3==u?(s=s||a.getBBox(1),k.scale(t[1],t[u-1],s.x+s.width/2,s.y+s.height/2),h*=t[1],i*=t[u-1]):5==u&&(w?(q=x.x(t[3],t[4]),r=x.y(t[3],t[4]),k.scale(t[1],t[2],q,r)):k.scale(t[1],t[2],t[3],t[4]),h*=t[1],i*=t[2]):"m"==v&&7==u&&k.add(t[1],t[2],t[3],t[4],t[5],t[6]),j.dirtyT=1,a.matrix=k}a.matrix=k,j.sx=h,j.sy=i,j.deg=e,j.dx=f=k.e,j.dy=g=k.f,1==h&&1==i&&!e&&j.bbox?(j.bbox.x+=+f,j.bbox.y+=+g):j.dirtyT=1}),Ob=function(a){var b=a[0];switch(b.toLowerCase()){case"t":return[b,0,0];case"m":return[b,1,0,0,1,0,0];case"r":return 4==a.length?[b,0,a[2],a[3]]:[b,0];case"s":return 5==a.length?[b,1,1,a[3],a[4]]:3==a.length?[b,1,1]:[b,1]}},Pb=c._equaliseTransform=function(a,b){b=I(b).replace(/\.{3}|\u2026/g,a),a=c.parseTransformString(a)||[],b=c.parseTransformString(b)||[]; +for(var d,e,f,g,h=O(a.length,b.length),i=[],j=[],k=0;h>k;k++){if(f=a[k]||Ob(b[k]),g=b[k]||Ob(f),f[0]!=g[0]||"r"==f[0].toLowerCase()&&(f[2]!=g[2]||f[3]!=g[3])||"s"==f[0].toLowerCase()&&(f[3]!=g[3]||f[4]!=g[4]))return;for(i[k]=[],j[k]=[],d=0,e=O(f.length,g.length);e>d;d++)d in f&&(i[k][d]=f[d]),d in g&&(j[k][d]=g[d])}return{from:i,to:j}};c._getContainer=function(a,b,d,e){var f;return f=null!=e||c.is(a,"object")?a:A.doc.getElementById(a),null!=f?f.tagName?null==b?{container:f,width:f.style.pixelWidth||f.offsetWidth,height:f.style.pixelHeight||f.offsetHeight}:{container:f,width:b,height:d}:{container:1,x:a,y:b,width:d,height:e}:void 0},c.pathToRelative=Db,c._engine={},c.path2curve=Kb,c.matrix=function(a,b,c,d,e,f){return new o(a,b,c,d,e,f)},function(a){function b(a){return a[0]*a[0]+a[1]*a[1]}function d(a){var c=N.sqrt(b(a));a[0]&&(a[0]/=c),a[1]&&(a[1]/=c)}a.add=function(a,b,c,d,e,f){var g,h,i,j,k=[[],[],[]],l=[[this.a,this.c,this.e],[this.b,this.d,this.f],[0,0,1]],m=[[a,c,e],[b,d,f],[0,0,1]];for(a&&a instanceof o&&(m=[[a.a,a.c,a.e],[a.b,a.d,a.f],[0,0,1]]),g=0;3>g;g++)for(h=0;3>h;h++){for(j=0,i=0;3>i;i++)j+=l[g][i]*m[i][h];k[g][h]=j}this.a=k[0][0],this.b=k[1][0],this.c=k[0][1],this.d=k[1][1],this.e=k[0][2],this.f=k[1][2]},a.invert=function(){var a=this,b=a.a*a.d-a.b*a.c;return new o(a.d/b,-a.b/b,-a.c/b,a.a/b,(a.c*a.f-a.d*a.e)/b,(a.b*a.e-a.a*a.f)/b)},a.clone=function(){return new o(this.a,this.b,this.c,this.d,this.e,this.f)},a.translate=function(a,b){this.add(1,0,0,1,a,b)},a.scale=function(a,b,c,d){null==b&&(b=a),(c||d)&&this.add(1,0,0,1,c,d),this.add(a,0,0,b,0,0),(c||d)&&this.add(1,0,0,1,-c,-d)},a.rotate=function(a,b,d){a=c.rad(a),b=b||0,d=d||0;var e=+N.cos(a).toFixed(9),f=+N.sin(a).toFixed(9);this.add(e,f,-f,e,b,d),this.add(1,0,0,1,-b,-d)},a.x=function(a,b){return a*this.a+b*this.c+this.e},a.y=function(a,b){return a*this.b+b*this.d+this.f},a.get=function(a){return+this[I.fromCharCode(97+a)].toFixed(4)},a.toString=function(){return c.svg?"matrix("+[this.get(0),this.get(1),this.get(2),this.get(3),this.get(4),this.get(5)].join()+")":[this.get(0),this.get(2),this.get(1),this.get(3),0,0].join()},a.toFilter=function(){return"progid:DXImageTransform.Microsoft.Matrix(M11="+this.get(0)+", M12="+this.get(2)+", M21="+this.get(1)+", M22="+this.get(3)+", Dx="+this.get(4)+", Dy="+this.get(5)+", sizingmethod='auto expand')"},a.offset=function(){return[this.e.toFixed(4),this.f.toFixed(4)]},a.split=function(){var a={};a.dx=this.e,a.dy=this.f;var e=[[this.a,this.c],[this.b,this.d]];a.scalex=N.sqrt(b(e[0])),d(e[0]),a.shear=e[0][0]*e[1][0]+e[0][1]*e[1][1],e[1]=[e[1][0]-e[0][0]*a.shear,e[1][1]-e[0][1]*a.shear],a.scaley=N.sqrt(b(e[1])),d(e[1]),a.shear/=a.scaley;var f=-e[0][1],g=e[1][1];return 0>g?(a.rotate=c.deg(N.acos(g)),0>f&&(a.rotate=360-a.rotate)):a.rotate=c.deg(N.asin(f)),a.isSimple=!(+a.shear.toFixed(9)||a.scalex.toFixed(9)!=a.scaley.toFixed(9)&&a.rotate),a.isSuperSimple=!+a.shear.toFixed(9)&&a.scalex.toFixed(9)==a.scaley.toFixed(9)&&!a.rotate,a.noRotation=!+a.shear.toFixed(9)&&!a.rotate,a},a.toTransformString=function(a){var b=a||this[J]();return b.isSimple?(b.scalex=+b.scalex.toFixed(4),b.scaley=+b.scaley.toFixed(4),b.rotate=+b.rotate.toFixed(4),(b.dx||b.dy?"t"+[b.dx,b.dy]:G)+(1!=b.scalex||1!=b.scaley?"s"+[b.scalex,b.scaley,0,0]:G)+(b.rotate?"r"+[b.rotate,0,0]:G)):"m"+[this.get(0),this.get(1),this.get(2),this.get(3),this.get(4),this.get(5)]}}(o.prototype);var Qb=navigator.userAgent.match(/Version\/(.*?)\s/)||navigator.userAgent.match(/Chrome\/(\d+)/);v.safari="Apple Computer, Inc."==navigator.vendor&&(Qb&&Qb[1]<4||"iP"==navigator.platform.slice(0,2))||"Google Inc."==navigator.vendor&&Qb&&Qb[1]<8?function(){var a=this.rect(-99,-99,this.width+99,this.height+99).attr({stroke:"none"});setTimeout(function(){a.remove()})}:mb;for(var Rb=function(){this.returnValue=!1},Sb=function(){return this.originalEvent.preventDefault()},Tb=function(){this.cancelBubble=!0},Ub=function(){return this.originalEvent.stopPropagation()},Vb=function(a){var b=A.doc.documentElement.scrollTop||A.doc.body.scrollTop,c=A.doc.documentElement.scrollLeft||A.doc.body.scrollLeft;return{x:a.clientX+c,y:a.clientY+b}},Wb=function(){return A.doc.addEventListener?function(a,b,c,d){var e=function(a){var b=Vb(a);return c.call(d,a,b.x,b.y)};if(a.addEventListener(b,e,!1),F&&L[b]){var f=function(b){for(var e=Vb(b),f=b,g=0,h=b.targetTouches&&b.targetTouches.length;h>g;g++)if(b.targetTouches[g].target==a){b=b.targetTouches[g],b.originalEvent=f,b.preventDefault=Sb,b.stopPropagation=Ub;break}return c.call(d,b,e.x,e.y)};a.addEventListener(L[b],f,!1)}return function(){return a.removeEventListener(b,e,!1),F&&L[b]&&a.removeEventListener(L[b],f,!1),!0}}:A.doc.attachEvent?function(a,b,c,d){var e=function(a){a=a||A.win.event;var b=A.doc.documentElement.scrollTop||A.doc.body.scrollTop,e=A.doc.documentElement.scrollLeft||A.doc.body.scrollLeft,f=a.clientX+e,g=a.clientY+b;return a.preventDefault=a.preventDefault||Rb,a.stopPropagation=a.stopPropagation||Tb,c.call(d,a,f,g)};a.attachEvent("on"+b,e);var f=function(){return a.detachEvent("on"+b,e),!0};return f}:void 0}(),Xb=[],Yb=function(a){for(var c,d=a.clientX,e=a.clientY,f=A.doc.documentElement.scrollTop||A.doc.body.scrollTop,g=A.doc.documentElement.scrollLeft||A.doc.body.scrollLeft,h=Xb.length;h--;){if(c=Xb[h],F&&a.touches){for(var i,j=a.touches.length;j--;)if(i=a.touches[j],i.identifier==c.el._drag.id){d=i.clientX,e=i.clientY,(a.originalEvent?a.originalEvent:a).preventDefault();break}}else a.preventDefault();var k,l=c.el.node,m=l.nextSibling,n=l.parentNode,o=l.style.display;A.win.opera&&n.removeChild(l),l.style.display="none",k=c.el.paper.getElementByPoint(d,e),l.style.display=o,A.win.opera&&(m?n.insertBefore(l,m):n.appendChild(l)),k&&b("raphael.drag.over."+c.el.id,c.el,k),d+=g,e+=f,b("raphael.drag.move."+c.el.id,c.move_scope||c.el,d-c.el._drag.x,e-c.el._drag.y,d,e,a)}},Zb=function(a){c.unmousemove(Yb).unmouseup(Zb);for(var d,e=Xb.length;e--;)d=Xb[e],d.el._drag={},b("raphael.drag.end."+d.el.id,d.end_scope||d.start_scope||d.move_scope||d.el,a);Xb=[]},$b=c.el={},_b=K.length;_b--;)!function(a){c[a]=$b[a]=function(b,d){return c.is(b,"function")&&(this.events=this.events||[],this.events.push({name:a,f:b,unbind:Wb(this.shape||this.node||A.doc,a,b,d||this)})),this},c["un"+a]=$b["un"+a]=function(b){for(var d=this.events||[],e=d.length;e--;)d[e].name!=a||!c.is(b,"undefined")&&d[e].f!=b||(d[e].unbind(),d.splice(e,1),!d.length&&delete this.events);return this}}(K[_b]);$b.data=function(a,d){var e=kb[this.id]=kb[this.id]||{};if(0==arguments.length)return e;if(1==arguments.length){if(c.is(a,"object")){for(var f in a)a[z](f)&&this.data(f,a[f]);return this}return b("raphael.data.get."+this.id,this,e[a],a),e[a]}return e[a]=d,b("raphael.data.set."+this.id,this,d,a),this},$b.removeData=function(a){return null==a?kb[this.id]={}:kb[this.id]&&delete kb[this.id][a],this},$b.getData=function(){return d(kb[this.id]||{})},$b.hover=function(a,b,c,d){return this.mouseover(a,c).mouseout(b,d||c)},$b.unhover=function(a,b){return this.unmouseover(a).unmouseout(b)};var ac=[];$b.drag=function(a,d,e,f,g,h){function i(i){(i.originalEvent||i).preventDefault();var j=i.clientX,k=i.clientY,l=A.doc.documentElement.scrollTop||A.doc.body.scrollTop,m=A.doc.documentElement.scrollLeft||A.doc.body.scrollLeft;if(this._drag.id=i.identifier,F&&i.touches)for(var n,o=i.touches.length;o--;)if(n=i.touches[o],this._drag.id=n.identifier,n.identifier==this._drag.id){j=n.clientX,k=n.clientY;break}this._drag.x=j+m,this._drag.y=k+l,!Xb.length&&c.mousemove(Yb).mouseup(Zb),Xb.push({el:this,move_scope:f,start_scope:g,end_scope:h}),d&&b.on("raphael.drag.start."+this.id,d),a&&b.on("raphael.drag.move."+this.id,a),e&&b.on("raphael.drag.end."+this.id,e),b("raphael.drag.start."+this.id,g||f||this,i.clientX+m,i.clientY+l,i)}return this._drag={},ac.push({el:this,start:i}),this.mousedown(i),this},$b.onDragOver=function(a){a?b.on("raphael.drag.over."+this.id,a):b.unbind("raphael.drag.over."+this.id)},$b.undrag=function(){for(var a=ac.length;a--;)ac[a].el==this&&(this.unmousedown(ac[a].start),ac.splice(a,1),b.unbind("raphael.drag.*."+this.id));!ac.length&&c.unmousemove(Yb).unmouseup(Zb),Xb=[]},v.circle=function(a,b,d){var e=c._engine.circle(this,a||0,b||0,d||0);return this.__set__&&this.__set__.push(e),e},v.rect=function(a,b,d,e,f){var g=c._engine.rect(this,a||0,b||0,d||0,e||0,f||0);return this.__set__&&this.__set__.push(g),g},v.ellipse=function(a,b,d,e){var f=c._engine.ellipse(this,a||0,b||0,d||0,e||0);return this.__set__&&this.__set__.push(f),f},v.path=function(a){a&&!c.is(a,U)&&!c.is(a[0],V)&&(a+=G);var b=c._engine.path(c.format[D](c,arguments),this);return this.__set__&&this.__set__.push(b),b},v.image=function(a,b,d,e,f){var g=c._engine.image(this,a||"about:blank",b||0,d||0,e||0,f||0);return this.__set__&&this.__set__.push(g),g},v.text=function(a,b,d){var e=c._engine.text(this,a||0,b||0,I(d));return this.__set__&&this.__set__.push(e),e},v.set=function(a){!c.is(a,"array")&&(a=Array.prototype.splice.call(arguments,0,arguments.length));var b=new mc(a);return this.__set__&&this.__set__.push(b),b.paper=this,b.type="set",b},v.setStart=function(a){this.__set__=a||this.set()},v.setFinish=function(){var a=this.__set__;return delete this.__set__,a},v.getSize=function(){var a=this.canvas.parentNode;return{width:a.offsetWidth,height:a.offsetHeight}},v.setSize=function(a,b){return c._engine.setSize.call(this,a,b)},v.setViewBox=function(a,b,d,e,f){return c._engine.setViewBox.call(this,a,b,d,e,f)},v.top=v.bottom=null,v.raphael=c;var bc=function(a){var b=a.getBoundingClientRect(),c=a.ownerDocument,d=c.body,e=c.documentElement,f=e.clientTop||d.clientTop||0,g=e.clientLeft||d.clientLeft||0,h=b.top+(A.win.pageYOffset||e.scrollTop||d.scrollTop)-f,i=b.left+(A.win.pageXOffset||e.scrollLeft||d.scrollLeft)-g;return{y:h,x:i}};v.getElementByPoint=function(a,b){var c=this,d=c.canvas,e=A.doc.elementFromPoint(a,b);if(A.win.opera&&"svg"==e.tagName){var f=bc(d),g=d.createSVGRect();g.x=a-f.x,g.y=b-f.y,g.width=g.height=1;var h=d.getIntersectionList(g,null);h.length&&(e=h[h.length-1])}if(!e)return null;for(;e.parentNode&&e!=d.parentNode&&!e.raphael;)e=e.parentNode;return e==c.canvas.parentNode&&(e=d),e=e&&e.raphael?c.getById(e.raphaelid):null},v.getElementsByBBox=function(a){var b=this.set();return this.forEach(function(d){c.isBBoxIntersect(d.getBBox(),a)&&b.push(d)}),b},v.getById=function(a){for(var b=this.bottom;b;){if(b.id==a)return b;b=b.next}return null},v.forEach=function(a,b){for(var c=this.bottom;c;){if(a.call(b,c)===!1)return this;c=c.next}return this},v.getElementsByPoint=function(a,b){var c=this.set();return this.forEach(function(d){d.isPointInside(a,b)&&c.push(d)}),c},$b.isPointInside=function(a,b){var d=this.realPath=qb[this.type](this);return this.attr("transform")&&this.attr("transform").length&&(d=c.transformPath(d,this.attr("transform"))),c.isPointInsidePath(d,a,b)},$b.getBBox=function(a){if(this.removed)return{};var b=this._;return a?((b.dirty||!b.bboxwt)&&(this.realPath=qb[this.type](this),b.bboxwt=Bb(this.realPath),b.bboxwt.toString=p,b.dirty=0),b.bboxwt):((b.dirty||b.dirtyT||!b.bbox)&&((b.dirty||!this.realPath)&&(b.bboxwt=0,this.realPath=qb[this.type](this)),b.bbox=Bb(rb(this.realPath,this.matrix)),b.bbox.toString=p,b.dirty=b.dirtyT=0),b.bbox)},$b.clone=function(){if(this.removed)return null;var a=this.paper[this.type]().attr(this.attr());return this.__set__&&this.__set__.push(a),a},$b.glow=function(a){if("text"==this.type)return null;a=a||{};var b={width:(a.width||10)+(+this.attr("stroke-width")||1),fill:a.fill||!1,opacity:a.opacity||.5,offsetx:a.offsetx||0,offsety:a.offsety||0,color:a.color||"#000"},c=b.width/2,d=this.paper,e=d.set(),f=this.realPath||qb[this.type](this);f=this.matrix?rb(f,this.matrix):f;for(var g=1;c+1>g;g++)e.push(d.path(f).attr({stroke:b.color,fill:b.fill?b.color:"none","stroke-linejoin":"round","stroke-linecap":"round","stroke-width":+(b.width/c*g).toFixed(3),opacity:+(b.opacity/c).toFixed(3)}));return e.insertBefore(this).translate(b.offsetx,b.offsety)};var cc=function(a,b,d,e,f,g,h,i,l){return null==l?j(a,b,d,e,f,g,h,i):c.findDotsAtSegment(a,b,d,e,f,g,h,i,k(a,b,d,e,f,g,h,i,l))},dc=function(a,b){return function(d,e,f){d=Kb(d);for(var g,h,i,j,k,l="",m={},n=0,o=0,p=d.length;p>o;o++){if(i=d[o],"M"==i[0])g=+i[1],h=+i[2];else{if(j=cc(g,h,i[1],i[2],i[3],i[4],i[5],i[6]),n+j>e){if(b&&!m.start){if(k=cc(g,h,i[1],i[2],i[3],i[4],i[5],i[6],e-n),l+=["C"+k.start.x,k.start.y,k.m.x,k.m.y,k.x,k.y],f)return l;m.start=l,l=["M"+k.x,k.y+"C"+k.n.x,k.n.y,k.end.x,k.end.y,i[5],i[6]].join(),n+=j,g=+i[5],h=+i[6];continue}if(!a&&!b)return k=cc(g,h,i[1],i[2],i[3],i[4],i[5],i[6],e-n),{x:k.x,y:k.y,alpha:k.alpha}}n+=j,g=+i[5],h=+i[6]}l+=i.shift()+i}return m.end=l,k=a?n:b?m:c.findDotsAtSegment(g,h,i[0],i[1],i[2],i[3],i[4],i[5],1),k.alpha&&(k={x:k.x,y:k.y,alpha:k.alpha}),k}},ec=dc(1),fc=dc(),gc=dc(0,1);c.getTotalLength=ec,c.getPointAtLength=fc,c.getSubpath=function(a,b,c){if(this.getTotalLength(a)-c<1e-6)return gc(a,b).end;var d=gc(a,c,1);return b?gc(d,b).end:d},$b.getTotalLength=function(){var a=this.getPath();if(a)return this.node.getTotalLength?this.node.getTotalLength():ec(a)},$b.getPointAtLength=function(a){var b=this.getPath();if(b)return fc(b,a)},$b.getPath=function(){var a,b=c._getPath[this.type];if("text"!=this.type&&"set"!=this.type)return b&&(a=b(this)),a},$b.getSubpath=function(a,b){var d=this.getPath();if(d)return c.getSubpath(d,a,b)};var hc=c.easing_formulas={linear:function(a){return a},"<":function(a){return R(a,1.7)},">":function(a){return R(a,.48)},"<>":function(a){var b=.48-a/1.04,c=N.sqrt(.1734+b*b),d=c-b,e=R(Q(d),1/3)*(0>d?-1:1),f=-c-b,g=R(Q(f),1/3)*(0>f?-1:1),h=e+g+.5;return 3*(1-h)*h*h+h*h*h},backIn:function(a){var b=1.70158;return a*a*((b+1)*a-b)},backOut:function(a){a-=1;var b=1.70158;return a*a*((b+1)*a+b)+1},elastic:function(a){return a==!!a?a:R(2,-10*a)*N.sin(2*(a-.075)*S/.3)+1},bounce:function(a){var b,c=7.5625,d=2.75;return 1/d>a?b=c*a*a:2/d>a?(a-=1.5/d,b=c*a*a+.75):2.5/d>a?(a-=2.25/d,b=c*a*a+.9375):(a-=2.625/d,b=c*a*a+.984375),b}};hc.easeIn=hc["ease-in"]=hc["<"],hc.easeOut=hc["ease-out"]=hc[">"],hc.easeInOut=hc["ease-in-out"]=hc["<>"],hc["back-in"]=hc.backIn,hc["back-out"]=hc.backOut;var ic=[],jc=a.requestAnimationFrame||a.webkitRequestAnimationFrame||a.mozRequestAnimationFrame||a.oRequestAnimationFrame||a.msRequestAnimationFrame||function(a){setTimeout(a,16)},kc=function(){for(var a=+new Date,d=0;dh))if(i>h){var q=j(h/i);for(var r in k)if(k[z](r)){switch(db[r]){case T:f=+k[r]+q*i*l[r];break;case"colour":f="rgb("+[lc($(k[r].r+q*i*l[r].r)),lc($(k[r].g+q*i*l[r].g)),lc($(k[r].b+q*i*l[r].b))].join(",")+")";break;case"path":f=[];for(var t=0,u=k[r].length;u>t;t++){f[t]=[k[r][t][0]];for(var v=1,w=k[r][t].length;w>v;v++)f[t][v]=+k[r][t][v]+q*i*l[r][t][v];f[t]=f[t].join(H)}f=f.join(H);break;case"transform":if(l[r].real)for(f=[],t=0,u=k[r].length;u>t;t++)for(f[t]=[k[r][t][0]],v=1,w=k[r][t].length;w>v;v++)f[t][v]=k[r][t][v]+q*i*l[r][t][v];else{var x=function(a){return+k[r][a]+q*i*l[r][a]};f=[["m",x(0),x(1),x(2),x(3),x(4),x(5)]]}break;case"csv":if("clip-rect"==r)for(f=[],t=4;t--;)f[t]=+k[r][t]+q*i*l[r][t];break;default:var y=[][E](k[r]);for(f=[],t=n.paper.customAttributes[r].length;t--;)f[t]=+y[t]+q*i*l[r][t]}o[r]=f}n.attr(o),function(a,c,d){setTimeout(function(){b("raphael.anim.frame."+a,c,d)})}(n.id,n,e.anim)}else{if(function(a,d,e){setTimeout(function(){b("raphael.anim.frame."+d.id,d,e),b("raphael.anim.finish."+d.id,d,e),c.is(a,"function")&&a.call(d)})}(e.callback,n,e.anim),n.attr(m),ic.splice(d--,1),e.repeat>1&&!e.next){for(g in m)m[z](g)&&(p[g]=e.totalOrigin[g]);e.el.attr(p),s(e.anim,e.el,e.anim.percents[0],null,e.totalOrigin,e.repeat-1)}e.next&&!e.stop&&s(e.anim,e.el,e.next,null,e.totalOrigin,e.repeat)}}}c.svg&&n&&n.paper&&n.paper.safari(),ic.length&&jc(kc)},lc=function(a){return a>255?255:0>a?0:a};$b.animateWith=function(a,b,d,e,f,g){var h=this;if(h.removed)return g&&g.call(h),h;var i=d instanceof r?d:c.animation(d,e,f,g);s(i,h,i.percents[0],null,h.attr());for(var j=0,k=ic.length;k>j;j++)if(ic[j].anim==b&&ic[j].el==a){ic[k-1].start=ic[j].start;break}return h},$b.onAnimation=function(a){return a?b.on("raphael.anim.frame."+this.id,a):b.unbind("raphael.anim.frame."+this.id),this},r.prototype.delay=function(a){var b=new r(this.anim,this.ms);return b.times=this.times,b.del=+a||0,b},r.prototype.repeat=function(a){var b=new r(this.anim,this.ms);return b.del=this.del,b.times=N.floor(O(a,0))||1,b},c.animation=function(a,b,d,e){if(a instanceof r)return a;(c.is(d,"function")||!d)&&(e=e||d||null,d=null),a=Object(a),b=+b||0;var f,g,h={};for(g in a)a[z](g)&&_(g)!=g&&_(g)+"%"!=g&&(f=!0,h[g]=a[g]);if(f)return d&&(h.easing=d),e&&(h.callback=e),new r({100:h},b);if(e){var i=0;for(var j in a){var k=ab(j);a[z](j)&&k>i&&(i=k)}i+="%",!a[i].callback&&(a[i].callback=e)}return new r(a,b)},$b.animate=function(a,b,d,e){var f=this;if(f.removed)return e&&e.call(f),f;var g=a instanceof r?a:c.animation(a,b,d,e);return s(g,f,g.percents[0],null,f.attr()),f},$b.setTime=function(a,b){return a&&null!=b&&this.status(a,P(b,a.ms)/a.ms),this},$b.status=function(a,b){var c,d,e=[],f=0;if(null!=b)return s(a,this,-1,P(b,1)),this;for(c=ic.length;c>f;f++)if(d=ic[f],d.el.id==this.id&&(!a||d.anim==a)){if(a)return d.status;e.push({anim:d.anim,status:d.status})}return a?0:e},$b.pause=function(a){for(var c=0;cb;b++)!a[b]||a[b].constructor!=$b.constructor&&a[b].constructor!=mc||(this[this.items.length]=this.items[this.items.length]=a[b],this.length++)},nc=mc.prototype;nc.push=function(){for(var a,b,c=0,d=arguments.length;d>c;c++)a=arguments[c],!a||a.constructor!=$b.constructor&&a.constructor!=mc||(b=this.items.length,this[b]=this.items[b]=a,this.length++);return this},nc.pop=function(){return this.length&&delete this[this.length--],this.items.pop()},nc.forEach=function(a,b){for(var c=0,d=this.items.length;d>c;c++)if(a.call(b,this.items[c],c)===!1)return this;return this};for(var oc in $b)$b[z](oc)&&(nc[oc]=function(a){return function(){var b=arguments;return this.forEach(function(c){c[a][D](c,b)})}}(oc));return nc.attr=function(a,b){if(a&&c.is(a,V)&&c.is(a[0],"object"))for(var d=0,e=a.length;e>d;d++)this.items[d].attr(a[d]);else for(var f=0,g=this.items.length;g>f;f++)this.items[f].attr(a,b);return this},nc.clear=function(){for(;this.length;)this.pop()},nc.splice=function(a,b){a=0>a?O(this.length+a,0):a,b=O(0,P(this.length-a,b));var c,d=[],e=[],f=[];for(c=2;cc;c++)e.push(this[a+c]);for(;cc?f[c]:d[c-g];for(c=this.items.length=this.length-=b-g;this[c];)delete this[c++];return new mc(e)},nc.exclude=function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]==a)return this.splice(b,1),!0},nc.animate=function(a,b,d,e){(c.is(d,"function")||!d)&&(e=d||null);var f,g,h=this.items.length,i=h,j=this;if(!h)return this;e&&(g=function(){!--h&&e.call(j)}),d=c.is(d,U)?d:g;var k=c.animation(a,b,d,g);for(f=this.items[--i].animate(k);i--;)this.items[i]&&!this.items[i].removed&&this.items[i].animateWith(f,k,k),this.items[i]&&!this.items[i].removed||h--;return this},nc.insertAfter=function(a){for(var b=this.items.length;b--;)this.items[b].insertAfter(a);return this},nc.getBBox=function(){for(var a=[],b=[],c=[],d=[],e=this.items.length;e--;)if(!this.items[e].removed){var f=this.items[e].getBBox();a.push(f.x),b.push(f.y),c.push(f.x+f.width),d.push(f.y+f.height)}return a=P[D](0,a),b=P[D](0,b),c=O[D](0,c),d=O[D](0,d),{x:a,y:b,x2:c,y2:d,width:c-a,height:d-b}},nc.clone=function(a){a=this.paper.set();for(var b=0,c=this.items.length;c>b;b++)a.push(this.items[b].clone());return a},nc.toString=function(){return"Raphaël‘s set"},nc.glow=function(a){var b=this.paper.set();return this.forEach(function(c){var d=c.glow(a);null!=d&&d.forEach(function(a){b.push(a)})}),b},nc.isPointInside=function(a,b){var c=!1;return this.forEach(function(d){return d.isPointInside(a,b)?(c=!0,!1):void 0}),c},c.registerFont=function(a){if(!a.face)return a;this.fonts=this.fonts||{};var b={w:a.w,face:{},glyphs:{}},c=a.face["font-family"];for(var d in a.face)a.face[z](d)&&(b.face[d]=a.face[d]);if(this.fonts[c]?this.fonts[c].push(b):this.fonts[c]=[b],!a.svg){b.face["units-per-em"]=ab(a.face["units-per-em"],10);for(var e in a.glyphs)if(a.glyphs[z](e)){var f=a.glyphs[e];if(b.glyphs[e]={w:f.w,k:{},d:f.d&&"M"+f.d.replace(/[mlcxtrv]/g,function(a){return{l:"L",c:"C",x:"z",t:"m",r:"l",v:"c"}[a]||"M"})+"z"},f.k)for(var g in f.k)f[z](g)&&(b.glyphs[e].k[g]=f.k[g])}}return a},v.getFont=function(a,b,d,e){if(e=e||"normal",d=d||"normal",b=+b||{normal:400,bold:700,lighter:300,bolder:800}[b]||400,c.fonts){var f=c.fonts[a];if(!f){var g=new RegExp("(^|\\s)"+a.replace(/[^\w\d\s+!~.:_-]/g,G)+"(\\s|$)","i");for(var h in c.fonts)if(c.fonts[z](h)&&g.test(h)){f=c.fonts[h];break}}var i;if(f)for(var j=0,k=f.length;k>j&&(i=f[j],i.face["font-weight"]!=b||i.face["font-style"]!=d&&i.face["font-style"]||i.face["font-stretch"]!=e);j++);return i}},v.print=function(a,b,d,e,f,g,h,i){g=g||"middle",h=O(P(h||0,1),-1),i=O(P(i||1,3),1);var j,k=I(d)[J](G),l=0,m=0,n=G;if(c.is(e,"string")&&(e=this.getFont(e)),e){j=(f||16)/e.face["units-per-em"];for(var o=e.face.bbox[J](w),p=+o[0],q=o[3]-o[1],r=0,s=+o[1]+("baseline"==g?q+ +e.face.descent:q/2),t=0,u=k.length;u>t;t++){if("\n"==k[t])l=0,x=0,m=0,r+=q*i;else{var v=m&&e.glyphs[k[t-1]]||{},x=e.glyphs[k[t]];l+=m?(v.w||e.w)+(v.k&&v.k[k[t]]||0)+e.w*h:0,m=1}x&&x.d&&(n+=c.transformPath(x.d,["t",l*j,r*j,"s",j,j,p,s,"t",(a-p)/j,(b-s)/j]))}}return this.path(n).attr({fill:"#000",stroke:"none"})},v.add=function(a){if(c.is(a,"array"))for(var b,d=this.set(),e=0,f=a.length;f>e;e++)b=a[e]||{},x[z](b.type)&&d.push(this[b.type]().attr(b));return d},c.format=function(a,b){var d=c.is(b,V)?[0][E](b):arguments;return a&&c.is(a,U)&&d.length-1&&(a=a.replace(y,function(a,b){return null==d[++b]?G:d[b]})),a||G},c.fullfill=function(){var a=/\{([^\}]+)\}/g,b=/(?:(?:^|\.)(.+?)(?=\[|\.|$|\()|\[('|")(.+?)\2\])(\(\))?/g,c=function(a,c,d){var e=d;return c.replace(b,function(a,b,c,d,f){b=b||d,e&&(b in e&&(e=e[b]),"function"==typeof e&&f&&(e=e()))}),e=(null==e||e==d?a:e)+""};return function(b,d){return String(b).replace(a,function(a,b){return c(a,b,d)})}}(),c.ninja=function(){return B.was?A.win.Raphael=B.is:delete Raphael,c},c.st=nc,b.on("raphael.DOMload",function(){u=!0}),function(a,b,d){function e(){/in/.test(a.readyState)?setTimeout(e,9):c.eve("raphael.DOMload")}null==a.readyState&&a.addEventListener&&(a.addEventListener(b,d=function(){a.removeEventListener(b,d,!1),a.readyState="complete"},!1),a.readyState="loading"),e()}(document,"DOMContentLoaded"),function(){if(c.svg){var a="hasOwnProperty",b=String,d=parseFloat,e=parseInt,f=Math,g=f.max,h=f.abs,i=f.pow,j=/[, ]+/,k=c.eve,l="",m=" ",n="http://www.w3.org/1999/xlink",o={block:"M5,0 0,2.5 5,5z",classic:"M5,0 0,2.5 5,5 3.5,3 3.5,2z",diamond:"M2.5,0 5,2.5 2.5,5 0,2.5z",open:"M6,1 1,3.5 6,6",oval:"M2.5,0A2.5,2.5,0,0,1,2.5,5 2.5,2.5,0,0,1,2.5,0z"},p={};c.toString=function(){return"Your browser supports SVG.\nYou are running Raphaël "+this.version};var q=function(d,e){if(e){"string"==typeof d&&(d=q(d));for(var f in e)e[a](f)&&("xlink:"==f.substring(0,6)?d.setAttributeNS(n,f.substring(6),b(e[f])):d.setAttribute(f,b(e[f])))}else d=c._g.doc.createElementNS("http://www.w3.org/2000/svg",d),d.style&&(d.style.webkitTapHighlightColor="rgba(0,0,0,0)");return d},r=function(a,e){var j="linear",k=a.id+e,m=.5,n=.5,o=a.node,p=a.paper,r=o.style,s=c._g.doc.getElementById(k);if(!s){if(e=b(e).replace(c._radial_gradient,function(a,b,c){if(j="radial",b&&c){m=d(b),n=d(c);var e=2*(n>.5)-1;i(m-.5,2)+i(n-.5,2)>.25&&(n=f.sqrt(.25-i(m-.5,2))*e+.5)&&.5!=n&&(n=n.toFixed(5)-1e-5*e)}return l}),e=e.split(/\s*\-\s*/),"linear"==j){var t=e.shift();if(t=-d(t),isNaN(t))return null;var u=[0,0,f.cos(c.rad(t)),f.sin(c.rad(t))],v=1/(g(h(u[2]),h(u[3]))||1);u[2]*=v,u[3]*=v,u[2]<0&&(u[0]=-u[2],u[2]=0),u[3]<0&&(u[1]=-u[3],u[3]=0)}var w=c._parseDots(e);if(!w)return null;if(k=k.replace(/[\(\)\s,\xb0#]/g,"_"),a.gradient&&k!=a.gradient.id&&(p.defs.removeChild(a.gradient),delete a.gradient),!a.gradient){s=q(j+"Gradient",{id:k}),a.gradient=s,q(s,"radial"==j?{fx:m,fy:n}:{x1:u[0],y1:u[1],x2:u[2],y2:u[3],gradientTransform:a.matrix.invert()}),p.defs.appendChild(s);for(var x=0,y=w.length;y>x;x++)s.appendChild(q("stop",{offset:w[x].offset?w[x].offset:x?"100%":"0%","stop-color":w[x].color||"#fff"}))}}return q(o,{fill:"url('"+document.location+"#"+k+"')",opacity:1,"fill-opacity":1}),r.fill=l,r.opacity=1,r.fillOpacity=1,1},s=function(a){var b=a.getBBox(1);q(a.pattern,{patternTransform:a.matrix.invert()+" translate("+b.x+","+b.y+")"})},t=function(d,e,f){if("path"==d.type){for(var g,h,i,j,k,m=b(e).toLowerCase().split("-"),n=d.paper,r=f?"end":"start",s=d.node,t=d.attrs,u=t["stroke-width"],v=m.length,w="classic",x=3,y=3,z=5;v--;)switch(m[v]){case"block":case"classic":case"oval":case"diamond":case"open":case"none":w=m[v];break;case"wide":y=5;break;case"narrow":y=2;break;case"long":x=5;break;case"short":x=2}if("open"==w?(x+=2,y+=2,z+=2,i=1,j=f?4:1,k={fill:"none",stroke:t.stroke}):(j=i=x/2,k={fill:t.stroke,stroke:"none"}),d._.arrows?f?(d._.arrows.endPath&&p[d._.arrows.endPath]--,d._.arrows.endMarker&&p[d._.arrows.endMarker]--):(d._.arrows.startPath&&p[d._.arrows.startPath]--,d._.arrows.startMarker&&p[d._.arrows.startMarker]--):d._.arrows={},"none"!=w){var A="raphael-marker-"+w,B="raphael-marker-"+r+w+x+y+"-obj"+d.id;c._g.doc.getElementById(A)?p[A]++:(n.defs.appendChild(q(q("path"),{"stroke-linecap":"round",d:o[w],id:A})),p[A]=1);var C,D=c._g.doc.getElementById(B);D?(p[B]++,C=D.getElementsByTagName("use")[0]):(D=q(q("marker"),{id:B,markerHeight:y,markerWidth:x,orient:"auto",refX:j,refY:y/2}),C=q(q("use"),{"xlink:href":"#"+A,transform:(f?"rotate(180 "+x/2+" "+y/2+") ":l)+"scale("+x/z+","+y/z+")","stroke-width":(1/((x/z+y/z)/2)).toFixed(4)}),D.appendChild(C),n.defs.appendChild(D),p[B]=1),q(C,k);var E=i*("diamond"!=w&&"oval"!=w);f?(g=d._.arrows.startdx*u||0,h=c.getTotalLength(t.path)-E*u):(g=E*u,h=c.getTotalLength(t.path)-(d._.arrows.enddx*u||0)),k={},k["marker-"+r]="url(#"+B+")",(h||g)&&(k.d=c.getSubpath(t.path,g,h)),q(s,k),d._.arrows[r+"Path"]=A,d._.arrows[r+"Marker"]=B,d._.arrows[r+"dx"]=E,d._.arrows[r+"Type"]=w,d._.arrows[r+"String"]=e}else f?(g=d._.arrows.startdx*u||0,h=c.getTotalLength(t.path)-g):(g=0,h=c.getTotalLength(t.path)-(d._.arrows.enddx*u||0)),d._.arrows[r+"Path"]&&q(s,{d:c.getSubpath(t.path,g,h)}),delete d._.arrows[r+"Path"],delete d._.arrows[r+"Marker"],delete d._.arrows[r+"dx"],delete d._.arrows[r+"Type"],delete d._.arrows[r+"String"];for(k in p)if(p[a](k)&&!p[k]){var F=c._g.doc.getElementById(k);F&&F.parentNode.removeChild(F)}}},u={"":[0],none:[0],"-":[3,1],".":[1,1],"-.":[3,1,1,1],"-..":[3,1,1,1,1,1],". ":[1,3],"- ":[4,3],"--":[8,3],"- .":[4,3,1,3],"--.":[8,3,1,3],"--..":[8,3,1,3,1,3]},v=function(a,c,d){if(c=u[b(c).toLowerCase()]){for(var e=a.attrs["stroke-width"]||"1",f={round:e,square:e,butt:0}[a.attrs["stroke-linecap"]||d["stroke-linecap"]]||0,g=[],h=c.length;h--;)g[h]=c[h]*e+(h%2?1:-1)*f;q(a.node,{"stroke-dasharray":g.join(",")})}},w=function(d,f){var i=d.node,k=d.attrs,m=i.style.visibility;i.style.visibility="hidden";for(var o in f)if(f[a](o)){if(!c._availableAttrs[a](o))continue;var p=f[o];switch(k[o]=p,o){case"blur":d.blur(p);break;case"title":var u=i.getElementsByTagName("title");if(u.length&&(u=u[0]))u.firstChild.nodeValue=p;else{u=q("title");var w=c._g.doc.createTextNode(p);u.appendChild(w),i.appendChild(u)}break;case"href":case"target":var x=i.parentNode;if("a"!=x.tagName.toLowerCase()){var z=q("a");x.insertBefore(z,i),z.appendChild(i),x=z}"target"==o?x.setAttributeNS(n,"show","blank"==p?"new":p):x.setAttributeNS(n,o,p);break;case"cursor":i.style.cursor=p;break;case"transform":d.transform(p);break;case"arrow-start":t(d,p);break;case"arrow-end":t(d,p,1);break;case"clip-rect":var A=b(p).split(j);if(4==A.length){d.clip&&d.clip.parentNode.parentNode.removeChild(d.clip.parentNode);var B=q("clipPath"),C=q("rect");B.id=c.createUUID(),q(C,{x:A[0],y:A[1],width:A[2],height:A[3]}),B.appendChild(C),d.paper.defs.appendChild(B),q(i,{"clip-path":"url(#"+B.id+")"}),d.clip=C}if(!p){var D=i.getAttribute("clip-path");if(D){var E=c._g.doc.getElementById(D.replace(/(^url\(#|\)$)/g,l));E&&E.parentNode.removeChild(E),q(i,{"clip-path":l}),delete d.clip}}break;case"path":"path"==d.type&&(q(i,{d:p?k.path=c._pathToAbsolute(p):"M0,0"}),d._.dirty=1,d._.arrows&&("startString"in d._.arrows&&t(d,d._.arrows.startString),"endString"in d._.arrows&&t(d,d._.arrows.endString,1)));break;case"width":if(i.setAttribute(o,p),d._.dirty=1,!k.fx)break;o="x",p=k.x;case"x":k.fx&&(p=-k.x-(k.width||0));case"rx":if("rx"==o&&"rect"==d.type)break;case"cx":i.setAttribute(o,p),d.pattern&&s(d),d._.dirty=1;break;case"height":if(i.setAttribute(o,p),d._.dirty=1,!k.fy)break;o="y",p=k.y;case"y":k.fy&&(p=-k.y-(k.height||0));case"ry":if("ry"==o&&"rect"==d.type)break;case"cy":i.setAttribute(o,p),d.pattern&&s(d),d._.dirty=1;break;case"r":"rect"==d.type?q(i,{rx:p,ry:p}):i.setAttribute(o,p),d._.dirty=1;break;case"src":"image"==d.type&&i.setAttributeNS(n,"href",p);break;case"stroke-width":(1!=d._.sx||1!=d._.sy)&&(p/=g(h(d._.sx),h(d._.sy))||1),i.setAttribute(o,p),k["stroke-dasharray"]&&v(d,k["stroke-dasharray"],f),d._.arrows&&("startString"in d._.arrows&&t(d,d._.arrows.startString),"endString"in d._.arrows&&t(d,d._.arrows.endString,1));break;case"stroke-dasharray":v(d,p,f);break;case"fill":var F=b(p).match(c._ISURL);if(F){B=q("pattern");var G=q("image");B.id=c.createUUID(),q(B,{x:0,y:0,patternUnits:"userSpaceOnUse",height:1,width:1}),q(G,{x:0,y:0,"xlink:href":F[1]}),B.appendChild(G),function(a){c._preload(F[1],function(){var b=this.offsetWidth,c=this.offsetHeight;q(a,{width:b,height:c}),q(G,{width:b,height:c}),d.paper.safari()})}(B),d.paper.defs.appendChild(B),q(i,{fill:"url(#"+B.id+")"}),d.pattern=B,d.pattern&&s(d);break}var H=c.getRGB(p);if(H.error){if(("circle"==d.type||"ellipse"==d.type||"r"!=b(p).charAt())&&r(d,p)){if("opacity"in k||"fill-opacity"in k){var I=c._g.doc.getElementById(i.getAttribute("fill").replace(/^url\(#|\)$/g,l));if(I){var J=I.getElementsByTagName("stop");q(J[J.length-1],{"stop-opacity":("opacity"in k?k.opacity:1)*("fill-opacity"in k?k["fill-opacity"]:1)})}}k.gradient=p,k.fill="none";break}}else delete f.gradient,delete k.gradient,!c.is(k.opacity,"undefined")&&c.is(f.opacity,"undefined")&&q(i,{opacity:k.opacity}),!c.is(k["fill-opacity"],"undefined")&&c.is(f["fill-opacity"],"undefined")&&q(i,{"fill-opacity":k["fill-opacity"]});H[a]("opacity")&&q(i,{"fill-opacity":H.opacity>1?H.opacity/100:H.opacity});case"stroke":H=c.getRGB(p),i.setAttribute(o,H.hex),"stroke"==o&&H[a]("opacity")&&q(i,{"stroke-opacity":H.opacity>1?H.opacity/100:H.opacity}),"stroke"==o&&d._.arrows&&("startString"in d._.arrows&&t(d,d._.arrows.startString),"endString"in d._.arrows&&t(d,d._.arrows.endString,1));break;case"gradient":("circle"==d.type||"ellipse"==d.type||"r"!=b(p).charAt())&&r(d,p);break; +case"opacity":k.gradient&&!k[a]("stroke-opacity")&&q(i,{"stroke-opacity":p>1?p/100:p});case"fill-opacity":if(k.gradient){I=c._g.doc.getElementById(i.getAttribute("fill").replace(/^url\(#|\)$/g,l)),I&&(J=I.getElementsByTagName("stop"),q(J[J.length-1],{"stop-opacity":p}));break}default:"font-size"==o&&(p=e(p,10)+"px");var K=o.replace(/(\-.)/g,function(a){return a.substring(1).toUpperCase()});i.style[K]=p,d._.dirty=1,i.setAttribute(o,p)}}y(d,f),i.style.visibility=m},x=1.2,y=function(d,f){if("text"==d.type&&(f[a]("text")||f[a]("font")||f[a]("font-size")||f[a]("x")||f[a]("y"))){var g=d.attrs,h=d.node,i=h.firstChild?e(c._g.doc.defaultView.getComputedStyle(h.firstChild,l).getPropertyValue("font-size"),10):10;if(f[a]("text")){for(g.text=f.text;h.firstChild;)h.removeChild(h.firstChild);for(var j,k=b(f.text).split("\n"),m=[],n=0,o=k.length;o>n;n++)j=q("tspan"),n&&q(j,{dy:i*x,x:g.x}),j.appendChild(c._g.doc.createTextNode(k[n])),h.appendChild(j),m[n]=j}else for(m=h.getElementsByTagName("tspan"),n=0,o=m.length;o>n;n++)n?q(m[n],{dy:i*x,x:g.x}):q(m[0],{dy:0});q(h,{x:g.x,y:g.y}),d._.dirty=1;var p=d._getBBox(),r=g.y-(p.y+p.height/2);r&&c.is(r,"finite")&&q(m[0],{dy:r})}},z=function(a){return a.parentNode&&"a"===a.parentNode.tagName.toLowerCase()?a.parentNode:a},A=function(a,b){this[0]=this.node=a,a.raphael=!0,this.id=c._oid++,a.raphaelid=this.id,this.matrix=c.matrix(),this.realPath=null,this.paper=b,this.attrs=this.attrs||{},this._={transform:[],sx:1,sy:1,deg:0,dx:0,dy:0,dirty:1},!b.bottom&&(b.bottom=this),this.prev=b.top,b.top&&(b.top.next=this),b.top=this,this.next=null},B=c.el;A.prototype=B,B.constructor=A,c._engine.path=function(a,b){var c=q("path");b.canvas&&b.canvas.appendChild(c);var d=new A(c,b);return d.type="path",w(d,{fill:"none",stroke:"#000",path:a}),d},B.rotate=function(a,c,e){if(this.removed)return this;if(a=b(a).split(j),a.length-1&&(c=d(a[1]),e=d(a[2])),a=d(a[0]),null==e&&(c=e),null==c||null==e){var f=this.getBBox(1);c=f.x+f.width/2,e=f.y+f.height/2}return this.transform(this._.transform.concat([["r",a,c,e]])),this},B.scale=function(a,c,e,f){if(this.removed)return this;if(a=b(a).split(j),a.length-1&&(c=d(a[1]),e=d(a[2]),f=d(a[3])),a=d(a[0]),null==c&&(c=a),null==f&&(e=f),null==e||null==f)var g=this.getBBox(1);return e=null==e?g.x+g.width/2:e,f=null==f?g.y+g.height/2:f,this.transform(this._.transform.concat([["s",a,c,e,f]])),this},B.translate=function(a,c){return this.removed?this:(a=b(a).split(j),a.length-1&&(c=d(a[1])),a=d(a[0])||0,c=+c||0,this.transform(this._.transform.concat([["t",a,c]])),this)},B.transform=function(b){var d=this._;if(null==b)return d.transform;if(c._extractTransform(this,b),this.clip&&q(this.clip,{transform:this.matrix.invert()}),this.pattern&&s(this),this.node&&q(this.node,{transform:this.matrix}),1!=d.sx||1!=d.sy){var e=this.attrs[a]("stroke-width")?this.attrs["stroke-width"]:1;this.attr({"stroke-width":e})}return this},B.hide=function(){return!this.removed&&this.paper.safari(this.node.style.display="none"),this},B.show=function(){return!this.removed&&this.paper.safari(this.node.style.display=""),this},B.remove=function(){var a=z(this.node);if(!this.removed&&a.parentNode){var b=this.paper;b.__set__&&b.__set__.exclude(this),k.unbind("raphael.*.*."+this.id),this.gradient&&b.defs.removeChild(this.gradient),c._tear(this,b),a.parentNode.removeChild(a),this.removeData();for(var d in this)this[d]="function"==typeof this[d]?c._removedFactory(d):null;this.removed=!0}},B._getBBox=function(){if("none"==this.node.style.display){this.show();var a=!0}var b,c=!1;this.paper.canvas.parentElement?b=this.paper.canvas.parentElement.style:this.paper.canvas.parentNode&&(b=this.paper.canvas.parentNode.style),b&&"none"==b.display&&(c=!0,b.display="");var d={};try{d=this.node.getBBox()}catch(e){d={x:this.node.clientLeft,y:this.node.clientTop,width:this.node.clientWidth,height:this.node.clientHeight}}finally{d=d||{},c&&(b.display="none")}return a&&this.hide(),d},B.attr=function(b,d){if(this.removed)return this;if(null==b){var e={};for(var f in this.attrs)this.attrs[a](f)&&(e[f]=this.attrs[f]);return e.gradient&&"none"==e.fill&&(e.fill=e.gradient)&&delete e.gradient,e.transform=this._.transform,e}if(null==d&&c.is(b,"string")){if("fill"==b&&"none"==this.attrs.fill&&this.attrs.gradient)return this.attrs.gradient;if("transform"==b)return this._.transform;for(var g=b.split(j),h={},i=0,l=g.length;l>i;i++)b=g[i],h[b]=b in this.attrs?this.attrs[b]:c.is(this.paper.customAttributes[b],"function")?this.paper.customAttributes[b].def:c._availableAttrs[b];return l-1?h:h[g[0]]}if(null==d&&c.is(b,"array")){for(h={},i=0,l=b.length;l>i;i++)h[b[i]]=this.attr(b[i]);return h}if(null!=d){var m={};m[b]=d}else null!=b&&c.is(b,"object")&&(m=b);for(var n in m)k("raphael.attr."+n+"."+this.id,this,m[n]);for(n in this.paper.customAttributes)if(this.paper.customAttributes[a](n)&&m[a](n)&&c.is(this.paper.customAttributes[n],"function")){var o=this.paper.customAttributes[n].apply(this,[].concat(m[n]));this.attrs[n]=m[n];for(var p in o)o[a](p)&&(m[p]=o[p])}return w(this,m),this},B.toFront=function(){if(this.removed)return this;var a=z(this.node);a.parentNode.appendChild(a);var b=this.paper;return b.top!=this&&c._tofront(this,b),this},B.toBack=function(){if(this.removed)return this;var a=z(this.node),b=a.parentNode;b.insertBefore(a,b.firstChild),c._toback(this,this.paper);this.paper;return this},B.insertAfter=function(a){if(this.removed||!a)return this;var b=z(this.node),d=z(a.node||a[a.length-1].node);return d.nextSibling?d.parentNode.insertBefore(b,d.nextSibling):d.parentNode.appendChild(b),c._insertafter(this,a,this.paper),this},B.insertBefore=function(a){if(this.removed||!a)return this;var b=z(this.node),d=z(a.node||a[0].node);return d.parentNode.insertBefore(b,d),c._insertbefore(this,a,this.paper),this},B.blur=function(a){var b=this;if(0!==+a){var d=q("filter"),e=q("feGaussianBlur");b.attrs.blur=a,d.id=c.createUUID(),q(e,{stdDeviation:+a||1.5}),d.appendChild(e),b.paper.defs.appendChild(d),b._blur=d,q(b.node,{filter:"url(#"+d.id+")"})}else b._blur&&(b._blur.parentNode.removeChild(b._blur),delete b._blur,delete b.attrs.blur),b.node.removeAttribute("filter");return b},c._engine.circle=function(a,b,c,d){var e=q("circle");a.canvas&&a.canvas.appendChild(e);var f=new A(e,a);return f.attrs={cx:b,cy:c,r:d,fill:"none",stroke:"#000"},f.type="circle",q(e,f.attrs),f},c._engine.rect=function(a,b,c,d,e,f){var g=q("rect");a.canvas&&a.canvas.appendChild(g);var h=new A(g,a);return h.attrs={x:b,y:c,width:d,height:e,rx:f||0,ry:f||0,fill:"none",stroke:"#000"},h.type="rect",q(g,h.attrs),h},c._engine.ellipse=function(a,b,c,d,e){var f=q("ellipse");a.canvas&&a.canvas.appendChild(f);var g=new A(f,a);return g.attrs={cx:b,cy:c,rx:d,ry:e,fill:"none",stroke:"#000"},g.type="ellipse",q(f,g.attrs),g},c._engine.image=function(a,b,c,d,e,f){var g=q("image");q(g,{x:c,y:d,width:e,height:f,preserveAspectRatio:"none"}),g.setAttributeNS(n,"href",b),a.canvas&&a.canvas.appendChild(g);var h=new A(g,a);return h.attrs={x:c,y:d,width:e,height:f,src:b},h.type="image",h},c._engine.text=function(a,b,d,e){var f=q("text");a.canvas&&a.canvas.appendChild(f);var g=new A(f,a);return g.attrs={x:b,y:d,"text-anchor":"middle",text:e,"font-family":c._availableAttrs["font-family"],"font-size":c._availableAttrs["font-size"],stroke:"none",fill:"#000"},g.type="text",w(g,g.attrs),g},c._engine.setSize=function(a,b){return this.width=a||this.width,this.height=b||this.height,this.canvas.setAttribute("width",this.width),this.canvas.setAttribute("height",this.height),this._viewBox&&this.setViewBox.apply(this,this._viewBox),this},c._engine.create=function(){var a=c._getContainer.apply(0,arguments),b=a&&a.container,d=a.x,e=a.y,f=a.width,g=a.height;if(!b)throw new Error("SVG container not found.");var h,i=q("svg"),j="overflow:hidden;";return d=d||0,e=e||0,f=f||512,g=g||342,q(i,{height:g,version:1.1,width:f,xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink"}),1==b?(i.style.cssText=j+"position:absolute;left:"+d+"px;top:"+e+"px",c._g.doc.body.appendChild(i),h=1):(i.style.cssText=j+"position:relative",b.firstChild?b.insertBefore(i,b.firstChild):b.appendChild(i)),b=new c._Paper,b.width=f,b.height=g,b.canvas=i,b.clear(),b._left=b._top=0,h&&(b.renderfix=function(){}),b.renderfix(),b},c._engine.setViewBox=function(a,b,c,d,e){k("raphael.setViewBox",this,this._viewBox,[a,b,c,d,e]);var f,h,i=this.getSize(),j=g(c/i.width,d/i.height),l=this.top,n=e?"xMidYMid meet":"xMinYMin";for(null==a?(this._vbSize&&(j=1),delete this._vbSize,f="0 0 "+this.width+m+this.height):(this._vbSize=j,f=a+m+b+m+c+m+d),q(this.canvas,{viewBox:f,preserveAspectRatio:n});j&&l;)h="stroke-width"in l.attrs?l.attrs["stroke-width"]:1,l.attr({"stroke-width":h}),l._.dirty=1,l._.dirtyT=1,l=l.prev;return this._viewBox=[a,b,c,d,!!e],this},c.prototype.renderfix=function(){var a,b=this.canvas,c=b.style;try{a=b.getScreenCTM()||b.createSVGMatrix()}catch(d){a=b.createSVGMatrix()}var e=-a.e%1,f=-a.f%1;(e||f)&&(e&&(this._left=(this._left+e)%1,c.left=this._left+"px"),f&&(this._top=(this._top+f)%1,c.top=this._top+"px"))},c.prototype.clear=function(){c.eve("raphael.clear",this);for(var a=this.canvas;a.firstChild;)a.removeChild(a.firstChild);this.bottom=this.top=null,(this.desc=q("desc")).appendChild(c._g.doc.createTextNode("Created with Raphaël "+c.version)),a.appendChild(this.desc),a.appendChild(this.defs=q("defs"))},c.prototype.remove=function(){k("raphael.remove",this),this.canvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas);for(var a in this)this[a]="function"==typeof this[a]?c._removedFactory(a):null};var C=c.st;for(var D in B)B[a](D)&&!C[a](D)&&(C[D]=function(a){return function(){var b=arguments;return this.forEach(function(c){c[a].apply(c,b)})}}(D))}}(),function(){if(c.vml){var a="hasOwnProperty",b=String,d=parseFloat,e=Math,f=e.round,g=e.max,h=e.min,i=e.abs,j="fill",k=/[, ]+/,l=c.eve,m=" progid:DXImageTransform.Microsoft",n=" ",o="",p={M:"m",L:"l",C:"c",Z:"x",m:"t",l:"r",c:"v",z:"x"},q=/([clmz]),?([^clmz]*)/gi,r=/ progid:\S+Blur\([^\)]+\)/g,s=/-?[^,\s-]+/g,t="position:absolute;left:0;top:0;width:1px;height:1px;behavior:url(#default#VML)",u=21600,v={path:1,rect:1,image:1},w={circle:1,ellipse:1},x=function(a){var d=/[ahqstv]/gi,e=c._pathToAbsolute;if(b(a).match(d)&&(e=c._path2curve),d=/[clmz]/g,e==c._pathToAbsolute&&!b(a).match(d)){var g=b(a).replace(q,function(a,b,c){var d=[],e="m"==b.toLowerCase(),g=p[b];return c.replace(s,function(a){e&&2==d.length&&(g+=d+p["m"==b?"l":"L"],d=[]),d.push(f(a*u))}),g+d});return g}var h,i,j=e(a);g=[];for(var k=0,l=j.length;l>k;k++){h=j[k],i=j[k][0].toLowerCase(),"z"==i&&(i="x");for(var m=1,r=h.length;r>m;m++)i+=f(h[m]*u)+(m!=r-1?",":o);g.push(i)}return g.join(n)},y=function(a,b,d){var e=c.matrix();return e.rotate(-a,.5,.5),{dx:e.x(b,d),dy:e.y(b,d)}},z=function(a,b,c,d,e,f){var g=a._,h=a.matrix,k=g.fillpos,l=a.node,m=l.style,o=1,p="",q=u/b,r=u/c;if(m.visibility="hidden",b&&c){if(l.coordsize=i(q)+n+i(r),m.rotation=f*(0>b*c?-1:1),f){var s=y(f,d,e);d=s.dx,e=s.dy}if(0>b&&(p+="x"),0>c&&(p+=" y")&&(o=-1),m.flip=p,l.coordorigin=d*-q+n+e*-r,k||g.fillsize){var t=l.getElementsByTagName(j);t=t&&t[0],l.removeChild(t),k&&(s=y(f,h.x(k[0],k[1]),h.y(k[0],k[1])),t.position=s.dx*o+n+s.dy*o),g.fillsize&&(t.size=g.fillsize[0]*i(b)+n+g.fillsize[1]*i(c)),l.appendChild(t)}m.visibility="visible"}};c.toString=function(){return"Your browser doesn’t support SVG. Falling down to VML.\nYou are running Raphaël "+this.version};var A=function(a,c,d){for(var e=b(c).toLowerCase().split("-"),f=d?"end":"start",g=e.length,h="classic",i="medium",j="medium";g--;)switch(e[g]){case"block":case"classic":case"oval":case"diamond":case"open":case"none":h=e[g];break;case"wide":case"narrow":j=e[g];break;case"long":case"short":i=e[g]}var k=a.node.getElementsByTagName("stroke")[0];k[f+"arrow"]=h,k[f+"arrowlength"]=i,k[f+"arrowwidth"]=j},B=function(e,i){e.attrs=e.attrs||{};var l=e.node,m=e.attrs,p=l.style,q=v[e.type]&&(i.x!=m.x||i.y!=m.y||i.width!=m.width||i.height!=m.height||i.cx!=m.cx||i.cy!=m.cy||i.rx!=m.rx||i.ry!=m.ry||i.r!=m.r),r=w[e.type]&&(m.cx!=i.cx||m.cy!=i.cy||m.r!=i.r||m.rx!=i.rx||m.ry!=i.ry),s=e;for(var t in i)i[a](t)&&(m[t]=i[t]);if(q&&(m.path=c._getPath[e.type](e),e._.dirty=1),i.href&&(l.href=i.href),i.title&&(l.title=i.title),i.target&&(l.target=i.target),i.cursor&&(p.cursor=i.cursor),"blur"in i&&e.blur(i.blur),(i.path&&"path"==e.type||q)&&(l.path=x(~b(m.path).toLowerCase().indexOf("r")?c._pathToAbsolute(m.path):m.path),e._.dirty=1,"image"==e.type&&(e._.fillpos=[m.x,m.y],e._.fillsize=[m.width,m.height],z(e,1,1,0,0,0))),"transform"in i&&e.transform(i.transform),r){var y=+m.cx,B=+m.cy,D=+m.rx||+m.r||0,E=+m.ry||+m.r||0;l.path=c.format("ar{0},{1},{2},{3},{4},{1},{4},{1}x",f((y-D)*u),f((B-E)*u),f((y+D)*u),f((B+E)*u),f(y*u)),e._.dirty=1}if("clip-rect"in i){var G=b(i["clip-rect"]).split(k);if(4==G.length){G[2]=+G[2]+ +G[0],G[3]=+G[3]+ +G[1];var H=l.clipRect||c._g.doc.createElement("div"),I=H.style;I.clip=c.format("rect({1}px {2}px {3}px {0}px)",G),l.clipRect||(I.position="absolute",I.top=0,I.left=0,I.width=e.paper.width+"px",I.height=e.paper.height+"px",l.parentNode.insertBefore(H,l),H.appendChild(l),l.clipRect=H)}i["clip-rect"]||l.clipRect&&(l.clipRect.style.clip="auto")}if(e.textpath){var J=e.textpath.style;i.font&&(J.font=i.font),i["font-family"]&&(J.fontFamily='"'+i["font-family"].split(",")[0].replace(/^['"]+|['"]+$/g,o)+'"'),i["font-size"]&&(J.fontSize=i["font-size"]),i["font-weight"]&&(J.fontWeight=i["font-weight"]),i["font-style"]&&(J.fontStyle=i["font-style"])}if("arrow-start"in i&&A(s,i["arrow-start"]),"arrow-end"in i&&A(s,i["arrow-end"],1),null!=i.opacity||null!=i["stroke-width"]||null!=i.fill||null!=i.src||null!=i.stroke||null!=i["stroke-width"]||null!=i["stroke-opacity"]||null!=i["fill-opacity"]||null!=i["stroke-dasharray"]||null!=i["stroke-miterlimit"]||null!=i["stroke-linejoin"]||null!=i["stroke-linecap"]){var K=l.getElementsByTagName(j),L=!1;if(K=K&&K[0],!K&&(L=K=F(j)),"image"==e.type&&i.src&&(K.src=i.src),i.fill&&(K.on=!0),(null==K.on||"none"==i.fill||null===i.fill)&&(K.on=!1),K.on&&i.fill){var M=b(i.fill).match(c._ISURL);if(M){K.parentNode==l&&l.removeChild(K),K.rotate=!0,K.src=M[1],K.type="tile";var N=e.getBBox(1);K.position=N.x+n+N.y,e._.fillpos=[N.x,N.y],c._preload(M[1],function(){e._.fillsize=[this.offsetWidth,this.offsetHeight]})}else K.color=c.getRGB(i.fill).hex,K.src=o,K.type="solid",c.getRGB(i.fill).error&&(s.type in{circle:1,ellipse:1}||"r"!=b(i.fill).charAt())&&C(s,i.fill,K)&&(m.fill="none",m.gradient=i.fill,K.rotate=!1)}if("fill-opacity"in i||"opacity"in i){var O=((+m["fill-opacity"]+1||2)-1)*((+m.opacity+1||2)-1)*((+c.getRGB(i.fill).o+1||2)-1);O=h(g(O,0),1),K.opacity=O,K.src&&(K.color="none")}l.appendChild(K);var P=l.getElementsByTagName("stroke")&&l.getElementsByTagName("stroke")[0],Q=!1;!P&&(Q=P=F("stroke")),(i.stroke&&"none"!=i.stroke||i["stroke-width"]||null!=i["stroke-opacity"]||i["stroke-dasharray"]||i["stroke-miterlimit"]||i["stroke-linejoin"]||i["stroke-linecap"])&&(P.on=!0),("none"==i.stroke||null===i.stroke||null==P.on||0==i.stroke||0==i["stroke-width"])&&(P.on=!1);var R=c.getRGB(i.stroke);P.on&&i.stroke&&(P.color=R.hex),O=((+m["stroke-opacity"]+1||2)-1)*((+m.opacity+1||2)-1)*((+R.o+1||2)-1);var S=.75*(d(i["stroke-width"])||1);if(O=h(g(O,0),1),null==i["stroke-width"]&&(S=m["stroke-width"]),i["stroke-width"]&&(P.weight=S),S&&1>S&&(O*=S)&&(P.weight=1),P.opacity=O,i["stroke-linejoin"]&&(P.joinstyle=i["stroke-linejoin"]||"miter"),P.miterlimit=i["stroke-miterlimit"]||8,i["stroke-linecap"]&&(P.endcap="butt"==i["stroke-linecap"]?"flat":"square"==i["stroke-linecap"]?"square":"round"),"stroke-dasharray"in i){var T={"-":"shortdash",".":"shortdot","-.":"shortdashdot","-..":"shortdashdotdot",". ":"dot","- ":"dash","--":"longdash","- .":"dashdot","--.":"longdashdot","--..":"longdashdotdot"};P.dashstyle=T[a](i["stroke-dasharray"])?T[i["stroke-dasharray"]]:o}Q&&l.appendChild(P)}if("text"==s.type){s.paper.canvas.style.display=o;var U=s.paper.span,V=100,W=m.font&&m.font.match(/\d+(?:\.\d*)?(?=px)/);p=U.style,m.font&&(p.font=m.font),m["font-family"]&&(p.fontFamily=m["font-family"]),m["font-weight"]&&(p.fontWeight=m["font-weight"]),m["font-style"]&&(p.fontStyle=m["font-style"]),W=d(m["font-size"]||W&&W[0])||10,p.fontSize=W*V+"px",s.textpath.string&&(U.innerHTML=b(s.textpath.string).replace(/"));var X=U.getBoundingClientRect();s.W=m.w=(X.right-X.left)/V,s.H=m.h=(X.bottom-X.top)/V,s.X=m.x,s.Y=m.y+s.H/2,("x"in i||"y"in i)&&(s.path.v=c.format("m{0},{1}l{2},{1}",f(m.x*u),f(m.y*u),f(m.x*u)+1));for(var Y=["x","y","text","font","font-family","font-weight","font-style","font-size"],Z=0,$=Y.length;$>Z;Z++)if(Y[Z]in i){s._.dirty=1;break}switch(m["text-anchor"]){case"start":s.textpath.style["v-text-align"]="left",s.bbx=s.W/2;break;case"end":s.textpath.style["v-text-align"]="right",s.bbx=-s.W/2;break;default:s.textpath.style["v-text-align"]="center",s.bbx=0}s.textpath.style["v-text-kern"]=!0}},C=function(a,f,g){a.attrs=a.attrs||{};var h=(a.attrs,Math.pow),i="linear",j=".5 .5";if(a.attrs.gradient=f,f=b(f).replace(c._radial_gradient,function(a,b,c){return i="radial",b&&c&&(b=d(b),c=d(c),h(b-.5,2)+h(c-.5,2)>.25&&(c=e.sqrt(.25-h(b-.5,2))*(2*(c>.5)-1)+.5),j=b+n+c),o}),f=f.split(/\s*\-\s*/),"linear"==i){var k=f.shift();if(k=-d(k),isNaN(k))return null}var l=c._parseDots(f);if(!l)return null;if(a=a.shape||a.node,l.length){a.removeChild(g),g.on=!0,g.method="none",g.color=l[0].color,g.color2=l[l.length-1].color;for(var m=[],p=0,q=l.length;q>p;p++)l[p].offset&&m.push(l[p].offset+n+l[p].color);g.colors=m.length?m.join():"0% "+g.color,"radial"==i?(g.type="gradientTitle",g.focus="100%",g.focussize="0 0",g.focusposition=j,g.angle=0):(g.type="gradient",g.angle=(270-k)%360),a.appendChild(g)}return 1},D=function(a,b){this[0]=this.node=a,a.raphael=!0,this.id=c._oid++,a.raphaelid=this.id,this.X=0,this.Y=0,this.attrs={},this.paper=b,this.matrix=c.matrix(),this._={transform:[],sx:1,sy:1,dx:0,dy:0,deg:0,dirty:1,dirtyT:1},!b.bottom&&(b.bottom=this),this.prev=b.top,b.top&&(b.top.next=this),b.top=this,this.next=null},E=c.el;D.prototype=E,E.constructor=D,E.transform=function(a){if(null==a)return this._.transform;var d,e=this.paper._viewBoxShift,f=e?"s"+[e.scale,e.scale]+"-1-1t"+[e.dx,e.dy]:o;e&&(d=a=b(a).replace(/\.{3}|\u2026/g,this._.transform||o)),c._extractTransform(this,f+a);var g,h=this.matrix.clone(),i=this.skew,j=this.node,k=~b(this.attrs.fill).indexOf("-"),l=!b(this.attrs.fill).indexOf("url(");if(h.translate(1,1),l||k||"image"==this.type)if(i.matrix="1 0 0 1",i.offset="0 0",g=h.split(),k&&g.noRotation||!g.isSimple){j.style.filter=h.toFilter();var m=this.getBBox(),p=this.getBBox(1),q=m.x-p.x,r=m.y-p.y;j.coordorigin=q*-u+n+r*-u,z(this,1,1,q,r,0)}else j.style.filter=o,z(this,g.scalex,g.scaley,g.dx,g.dy,g.rotate);else j.style.filter=o,i.matrix=b(h),i.offset=h.offset();return null!==d&&(this._.transform=d,c._extractTransform(this,d)),this},E.rotate=function(a,c,e){if(this.removed)return this;if(null!=a){if(a=b(a).split(k),a.length-1&&(c=d(a[1]),e=d(a[2])),a=d(a[0]),null==e&&(c=e),null==c||null==e){var f=this.getBBox(1);c=f.x+f.width/2,e=f.y+f.height/2}return this._.dirtyT=1,this.transform(this._.transform.concat([["r",a,c,e]])),this}},E.translate=function(a,c){return this.removed?this:(a=b(a).split(k),a.length-1&&(c=d(a[1])),a=d(a[0])||0,c=+c||0,this._.bbox&&(this._.bbox.x+=a,this._.bbox.y+=c),this.transform(this._.transform.concat([["t",a,c]])),this)},E.scale=function(a,c,e,f){if(this.removed)return this;if(a=b(a).split(k),a.length-1&&(c=d(a[1]),e=d(a[2]),f=d(a[3]),isNaN(e)&&(e=null),isNaN(f)&&(f=null)),a=d(a[0]),null==c&&(c=a),null==f&&(e=f),null==e||null==f)var g=this.getBBox(1);return e=null==e?g.x+g.width/2:e,f=null==f?g.y+g.height/2:f,this.transform(this._.transform.concat([["s",a,c,e,f]])),this._.dirtyT=1,this},E.hide=function(){return!this.removed&&(this.node.style.display="none"),this},E.show=function(){return!this.removed&&(this.node.style.display=o),this},E.auxGetBBox=c.el.getBBox,E.getBBox=function(){var a=this.auxGetBBox();if(this.paper&&this.paper._viewBoxShift){var b={},c=1/this.paper._viewBoxShift.scale;return b.x=a.x-this.paper._viewBoxShift.dx,b.x*=c,b.y=a.y-this.paper._viewBoxShift.dy,b.y*=c,b.width=a.width*c,b.height=a.height*c,b.x2=b.x+b.width,b.y2=b.y+b.height,b}return a},E._getBBox=function(){return this.removed?{}:{x:this.X+(this.bbx||0)-this.W/2,y:this.Y-this.H,width:this.W,height:this.H}},E.remove=function(){if(!this.removed&&this.node.parentNode){this.paper.__set__&&this.paper.__set__.exclude(this),c.eve.unbind("raphael.*.*."+this.id),c._tear(this,this.paper),this.node.parentNode.removeChild(this.node),this.shape&&this.shape.parentNode.removeChild(this.shape);for(var a in this)this[a]="function"==typeof this[a]?c._removedFactory(a):null;this.removed=!0}},E.attr=function(b,d){if(this.removed)return this;if(null==b){var e={};for(var f in this.attrs)this.attrs[a](f)&&(e[f]=this.attrs[f]);return e.gradient&&"none"==e.fill&&(e.fill=e.gradient)&&delete e.gradient,e.transform=this._.transform,e}if(null==d&&c.is(b,"string")){if(b==j&&"none"==this.attrs.fill&&this.attrs.gradient)return this.attrs.gradient;for(var g=b.split(k),h={},i=0,m=g.length;m>i;i++)b=g[i],h[b]=b in this.attrs?this.attrs[b]:c.is(this.paper.customAttributes[b],"function")?this.paper.customAttributes[b].def:c._availableAttrs[b];return m-1?h:h[g[0]]}if(this.attrs&&null==d&&c.is(b,"array")){for(h={},i=0,m=b.length;m>i;i++)h[b[i]]=this.attr(b[i]);return h}var n;null!=d&&(n={},n[b]=d),null==d&&c.is(b,"object")&&(n=b);for(var o in n)l("raphael.attr."+o+"."+this.id,this,n[o]);if(n){for(o in this.paper.customAttributes)if(this.paper.customAttributes[a](o)&&n[a](o)&&c.is(this.paper.customAttributes[o],"function")){var p=this.paper.customAttributes[o].apply(this,[].concat(n[o]));this.attrs[o]=n[o];for(var q in p)p[a](q)&&(n[q]=p[q])}n.text&&"text"==this.type&&(this.textpath.string=n.text),B(this,n)}return this},E.toFront=function(){return!this.removed&&this.node.parentNode.appendChild(this.node),this.paper&&this.paper.top!=this&&c._tofront(this,this.paper),this},E.toBack=function(){return this.removed?this:(this.node.parentNode.firstChild!=this.node&&(this.node.parentNode.insertBefore(this.node,this.node.parentNode.firstChild),c._toback(this,this.paper)),this)},E.insertAfter=function(a){return this.removed?this:(a.constructor==c.st.constructor&&(a=a[a.length-1]),a.node.nextSibling?a.node.parentNode.insertBefore(this.node,a.node.nextSibling):a.node.parentNode.appendChild(this.node),c._insertafter(this,a,this.paper),this)},E.insertBefore=function(a){return this.removed?this:(a.constructor==c.st.constructor&&(a=a[0]),a.node.parentNode.insertBefore(this.node,a.node),c._insertbefore(this,a,this.paper),this)},E.blur=function(a){var b=this.node.runtimeStyle,d=b.filter;return d=d.replace(r,o),0!==+a?(this.attrs.blur=a,b.filter=d+n+m+".Blur(pixelradius="+(+a||1.5)+")",b.margin=c.format("-{0}px 0 0 -{0}px",f(+a||1.5))):(b.filter=d,b.margin=0,delete this.attrs.blur),this},c._engine.path=function(a,b){var c=F("shape");c.style.cssText=t,c.coordsize=u+n+u,c.coordorigin=b.coordorigin;var d=new D(c,b),e={fill:"none",stroke:"#000"};a&&(e.path=a),d.type="path",d.path=[],d.Path=o,B(d,e),b.canvas.appendChild(c);var f=F("skew");return f.on=!0,c.appendChild(f),d.skew=f,d.transform(o),d},c._engine.rect=function(a,b,d,e,f,g){var h=c._rectPath(b,d,e,f,g),i=a.path(h),j=i.attrs;return i.X=j.x=b,i.Y=j.y=d,i.W=j.width=e,i.H=j.height=f,j.r=g,j.path=h,i.type="rect",i},c._engine.ellipse=function(a,b,c,d,e){{var f=a.path();f.attrs}return f.X=b-d,f.Y=c-e,f.W=2*d,f.H=2*e,f.type="ellipse",B(f,{cx:b,cy:c,rx:d,ry:e}),f},c._engine.circle=function(a,b,c,d){{var e=a.path();e.attrs}return e.X=b-d,e.Y=c-d,e.W=e.H=2*d,e.type="circle",B(e,{cx:b,cy:c,r:d}),e},c._engine.image=function(a,b,d,e,f,g){var h=c._rectPath(d,e,f,g),i=a.path(h).attr({stroke:"none"}),k=i.attrs,l=i.node,m=l.getElementsByTagName(j)[0];return k.src=b,i.X=k.x=d,i.Y=k.y=e,i.W=k.width=f,i.H=k.height=g,k.path=h,i.type="image",m.parentNode==l&&l.removeChild(m),m.rotate=!0,m.src=b,m.type="tile",i._.fillpos=[d,e],i._.fillsize=[f,g],l.appendChild(m),z(i,1,1,0,0,0),i},c._engine.text=function(a,d,e,g){var h=F("shape"),i=F("path"),j=F("textpath");d=d||0,e=e||0,g=g||"",i.v=c.format("m{0},{1}l{2},{1}",f(d*u),f(e*u),f(d*u)+1),i.textpathok=!0,j.string=b(g),j.on=!0,h.style.cssText=t,h.coordsize=u+n+u,h.coordorigin="0 0";var k=new D(h,a),l={fill:"#000",stroke:"none",font:c._availableAttrs.font,text:g};k.shape=h,k.path=i,k.textpath=j,k.type="text",k.attrs.text=b(g),k.attrs.x=d,k.attrs.y=e,k.attrs.w=1,k.attrs.h=1,B(k,l),h.appendChild(j),h.appendChild(i),a.canvas.appendChild(h);var m=F("skew");return m.on=!0,h.appendChild(m),k.skew=m,k.transform(o),k},c._engine.setSize=function(a,b){var d=this.canvas.style;return this.width=a,this.height=b,a==+a&&(a+="px"),b==+b&&(b+="px"),d.width=a,d.height=b,d.clip="rect(0 "+a+" "+b+" 0)",this._viewBox&&c._engine.setViewBox.apply(this,this._viewBox),this},c._engine.setViewBox=function(a,b,d,e,f){c.eve("raphael.setViewBox",this,this._viewBox,[a,b,d,e,f]);var g,h,i=this.getSize(),j=i.width,k=i.height;return f&&(g=k/e,h=j/d,j>d*g&&(a-=(j-d*g)/2/g),k>e*h&&(b-=(k-e*h)/2/h)),this._viewBox=[a,b,d,e,!!f],this._viewBoxShift={dx:-a,dy:-b,scale:i},this.forEach(function(a){a.transform("...")}),this};var F;c._engine.initWin=function(a){var b=a.document;b.styleSheets.length<31?b.createStyleSheet().addRule(".rvml","behavior:url(#default#VML)"):b.styleSheets[0].addRule(".rvml","behavior:url(#default#VML)");try{!b.namespaces.rvml&&b.namespaces.add("rvml","urn:schemas-microsoft-com:vml"),F=function(a){return b.createElement("')}}catch(c){F=function(a){return b.createElement("<"+a+' xmlns="urn:schemas-microsoft.com:vml" class="rvml">')}}},c._engine.initWin(c._g.win),c._engine.create=function(){var a=c._getContainer.apply(0,arguments),b=a.container,d=a.height,e=a.width,f=a.x,g=a.y;if(!b)throw new Error("VML container not found.");var h=new c._Paper,i=h.canvas=c._g.doc.createElement("div"),j=i.style;return f=f||0,g=g||0,e=e||512,d=d||342,h.width=e,h.height=d,e==+e&&(e+="px"),d==+d&&(d+="px"),h.coordsize=1e3*u+n+1e3*u,h.coordorigin="0 0",h.span=c._g.doc.createElement("span"),h.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;",i.appendChild(h.span),j.cssText=c.format("top:0;left:0;width:{0};height:{1};display:inline-block;position:relative;clip:rect(0 {0} {1} 0);overflow:hidden",e,d),1==b?(c._g.doc.body.appendChild(i),j.left=f+"px",j.top=g+"px",j.position="absolute"):b.firstChild?b.insertBefore(i,b.firstChild):b.appendChild(i),h.renderfix=function(){},h},c.prototype.clear=function(){c.eve("raphael.clear",this),this.canvas.innerHTML=o,this.span=c._g.doc.createElement("span"),this.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;",this.canvas.appendChild(this.span),this.bottom=this.top=null},c.prototype.remove=function(){c.eve("raphael.remove",this),this.canvas.parentNode.removeChild(this.canvas);for(var a in this)this[a]="function"==typeof this[a]?c._removedFactory(a):null;return!0};var G=c.st;for(var H in E)E[a](H)&&!G[a](H)&&(G[H]=function(a){return function(){var b=arguments;return this.forEach(function(c){c[a].apply(c,b)})}}(H))}}(),B.was?A.win.Raphael=c:Raphael=c,"object"==typeof exports&&(module.exports=c),c}); \ No newline at end of file diff --git a/Monitor/wwwroot/assets/plugins/requirejs/require.js b/Monitor/wwwroot/assets/plugins/requirejs/require.js new file mode 100644 index 0000000..5237640 --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/requirejs/require.js @@ -0,0 +1,2103 @@ +/** vim: et:ts=4:sw=4:sts=4 + * @license RequireJS 2.1.20 Copyright (c) 2010-2015, The Dojo Foundation All Rights Reserved. + * Available via the MIT or new BSD license. + * see: http://github.com/jrburke/requirejs for details + */ +//Not using strict: uneven strict support in browsers, #392, and causes +//problems with requirejs.exec()/transpiler plugins that may not be strict. +/*jslint regexp: true, nomen: true, sloppy: true */ +/*global window, navigator, document, importScripts, setTimeout, opera */ + +var requirejs, require, define; +(function (global) { + var req, s, head, baseElement, dataMain, src, + interactiveScript, currentlyAddingScript, mainScript, subPath, + version = '2.1.20', + commentRegExp = /(\/\*([\s\S]*?)\*\/|([^:]|^)\/\/(.*)$)/mg, + cjsRequireRegExp = /[^.]\s*require\s*\(\s*["']([^'"\s]+)["']\s*\)/g, + jsSuffixRegExp = /\.js$/, + currDirRegExp = /^\.\//, + op = Object.prototype, + ostring = op.toString, + hasOwn = op.hasOwnProperty, + ap = Array.prototype, + isBrowser = !!(typeof window !== 'undefined' && typeof navigator !== 'undefined' && window.document), + isWebWorker = !isBrowser && typeof importScripts !== 'undefined', + //PS3 indicates loaded and complete, but need to wait for complete + //specifically. Sequence is 'loading', 'loaded', execution, + // then 'complete'. The UA check is unfortunate, but not sure how + //to feature test w/o causing perf issues. + readyRegExp = isBrowser && navigator.platform === 'PLAYSTATION 3' ? + /^complete$/ : /^(complete|loaded)$/, + defContextName = '_', + //Oh the tragedy, detecting opera. See the usage of isOpera for reason. + isOpera = typeof opera !== 'undefined' && opera.toString() === '[object Opera]', + contexts = {}, + cfg = {}, + globalDefQueue = [], + useInteractive = false; + + function isFunction(it) { + return ostring.call(it) === '[object Function]'; + } + + function isArray(it) { + return ostring.call(it) === '[object Array]'; + } + + /** + * Helper function for iterating over an array. If the func returns + * a true value, it will break out of the loop. + */ + function each(ary, func) { + if (ary) { + var i; + for (i = 0; i < ary.length; i += 1) { + if (ary[i] && func(ary[i], i, ary)) { + break; + } + } + } + } + + /** + * Helper function for iterating over an array backwards. If the func + * returns a true value, it will break out of the loop. + */ + function eachReverse(ary, func) { + if (ary) { + var i; + for (i = ary.length - 1; i > -1; i -= 1) { + if (ary[i] && func(ary[i], i, ary)) { + break; + } + } + } + } + + function hasProp(obj, prop) { + return hasOwn.call(obj, prop); + } + + function getOwn(obj, prop) { + return hasProp(obj, prop) && obj[prop]; + } + + /** + * Cycles over properties in an object and calls a function for each + * property value. If the function returns a truthy value, then the + * iteration is stopped. + */ + function eachProp(obj, func) { + var prop; + for (prop in obj) { + if (hasProp(obj, prop)) { + if (func(obj[prop], prop)) { + break; + } + } + } + } + + /** + * Simple function to mix in properties from source into target, + * but only if target does not already have a property of the same name. + */ + function mixin(target, source, force, deepStringMixin) { + if (source) { + eachProp(source, function (value, prop) { + if (force || !hasProp(target, prop)) { + if (deepStringMixin && typeof value === 'object' && value && + !isArray(value) && !isFunction(value) && + !(value instanceof RegExp)) { + + if (!target[prop]) { + target[prop] = {}; + } + mixin(target[prop], value, force, deepStringMixin); + } else { + target[prop] = value; + } + } + }); + } + return target; + } + + //Similar to Function.prototype.bind, but the 'this' object is specified + //first, since it is easier to read/figure out what 'this' will be. + function bind(obj, fn) { + return function () { + return fn.apply(obj, arguments); + }; + } + + function scripts() { + return document.getElementsByTagName('script'); + } + + function defaultOnError(err) { + throw err; + } + + //Allow getting a global that is expressed in + //dot notation, like 'a.b.c'. + function getGlobal(value) { + if (!value) { + return value; + } + var g = global; + each(value.split('.'), function (part) { + g = g[part]; + }); + return g; + } + + /** + * Constructs an error with a pointer to an URL with more information. + * @param {String} id the error ID that maps to an ID on a web page. + * @param {String} message human readable error. + * @param {Error} [err] the original error, if there is one. + * + * @returns {Error} + */ + function makeError(id, msg, err, requireModules) { + var e = new Error(msg + '\nhttp://requirejs.org/docs/errors.html#' + id); + e.requireType = id; + e.requireModules = requireModules; + if (err) { + e.originalError = err; + } + return e; + } + + if (typeof define !== 'undefined') { + //If a define is already in play via another AMD loader, + //do not overwrite. + return; + } + + if (typeof requirejs !== 'undefined') { + if (isFunction(requirejs)) { + //Do not overwrite an existing requirejs instance. + return; + } + cfg = requirejs; + requirejs = undefined; + } + + //Allow for a require config object + if (typeof require !== 'undefined' && !isFunction(require)) { + //assume it is a config object. + cfg = require; + require = undefined; + } + + function newContext(contextName) { + var inCheckLoaded, Module, context, handlers, + checkLoadedTimeoutId, + config = { + //Defaults. Do not set a default for map + //config to speed up normalize(), which + //will run faster if there is no default. + waitSeconds: 7, + baseUrl: './', + paths: {}, + bundles: {}, + pkgs: {}, + shim: {}, + config: {} + }, + registry = {}, + //registry of just enabled modules, to speed + //cycle breaking code when lots of modules + //are registered, but not activated. + enabledRegistry = {}, + undefEvents = {}, + defQueue = [], + defined = {}, + urlFetched = {}, + bundlesMap = {}, + requireCounter = 1, + unnormalizedCounter = 1; + + /** + * Trims the . and .. from an array of path segments. + * It will keep a leading path segment if a .. will become + * the first path segment, to help with module name lookups, + * which act like paths, but can be remapped. But the end result, + * all paths that use this function should look normalized. + * NOTE: this method MODIFIES the input array. + * @param {Array} ary the array of path segments. + */ + function trimDots(ary) { + var i, part; + for (i = 0; i < ary.length; i++) { + part = ary[i]; + if (part === '.') { + ary.splice(i, 1); + i -= 1; + } else if (part === '..') { + // If at the start, or previous value is still .., + // keep them so that when converted to a path it may + // still work when converted to a path, even though + // as an ID it is less than ideal. In larger point + // releases, may be better to just kick out an error. + if (i === 0 || (i === 1 && ary[2] === '..') || ary[i - 1] === '..') { + continue; + } else if (i > 0) { + ary.splice(i - 1, 2); + i -= 2; + } + } + } + } + + /** + * Given a relative module name, like ./something, normalize it to + * a real name that can be mapped to a path. + * @param {String} name the relative name + * @param {String} baseName a real name that the name arg is relative + * to. + * @param {Boolean} applyMap apply the map config to the value. Should + * only be done if this normalization is for a dependency ID. + * @returns {String} normalized name + */ + function normalize(name, baseName, applyMap) { + var pkgMain, mapValue, nameParts, i, j, nameSegment, lastIndex, + foundMap, foundI, foundStarMap, starI, normalizedBaseParts, + baseParts = (baseName && baseName.split('/')), + map = config.map, + starMap = map && map['*']; + + //Adjust any relative paths. + if (name) { + name = name.split('/'); + lastIndex = name.length - 1; + + // If wanting node ID compatibility, strip .js from end + // of IDs. Have to do this here, and not in nameToUrl + // because node allows either .js or non .js to map + // to same file. + if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) { + name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, ''); + } + + // Starts with a '.' so need the baseName + if (name[0].charAt(0) === '.' && baseParts) { + //Convert baseName to array, and lop off the last part, + //so that . matches that 'directory' and not name of the baseName's + //module. For instance, baseName of 'one/two/three', maps to + //'one/two/three.js', but we want the directory, 'one/two' for + //this normalization. + normalizedBaseParts = baseParts.slice(0, baseParts.length - 1); + name = normalizedBaseParts.concat(name); + } + + trimDots(name); + name = name.join('/'); + } + + //Apply map config if available. + if (applyMap && map && (baseParts || starMap)) { + nameParts = name.split('/'); + + outerLoop: for (i = nameParts.length; i > 0; i -= 1) { + nameSegment = nameParts.slice(0, i).join('/'); + + if (baseParts) { + //Find the longest baseName segment match in the config. + //So, do joins on the biggest to smallest lengths of baseParts. + for (j = baseParts.length; j > 0; j -= 1) { + mapValue = getOwn(map, baseParts.slice(0, j).join('/')); + + //baseName segment has config, find if it has one for + //this name. + if (mapValue) { + mapValue = getOwn(mapValue, nameSegment); + if (mapValue) { + //Match, update name to the new value. + foundMap = mapValue; + foundI = i; + break outerLoop; + } + } + } + } + + //Check for a star map match, but just hold on to it, + //if there is a shorter segment match later in a matching + //config, then favor over this star map. + if (!foundStarMap && starMap && getOwn(starMap, nameSegment)) { + foundStarMap = getOwn(starMap, nameSegment); + starI = i; + } + } + + if (!foundMap && foundStarMap) { + foundMap = foundStarMap; + foundI = starI; + } + + if (foundMap) { + nameParts.splice(0, foundI, foundMap); + name = nameParts.join('/'); + } + } + + // If the name points to a package's name, use + // the package main instead. + pkgMain = getOwn(config.pkgs, name); + + return pkgMain ? pkgMain : name; + } + + function removeScript(name) { + if (isBrowser) { + each(scripts(), function (scriptNode) { + if (scriptNode.getAttribute('data-requiremodule') === name && + scriptNode.getAttribute('data-requirecontext') === context.contextName) { + scriptNode.parentNode.removeChild(scriptNode); + return true; + } + }); + } + } + + function hasPathFallback(id) { + var pathConfig = getOwn(config.paths, id); + if (pathConfig && isArray(pathConfig) && pathConfig.length > 1) { + //Pop off the first array value, since it failed, and + //retry + pathConfig.shift(); + context.require.undef(id); + + //Custom require that does not do map translation, since + //ID is "absolute", already mapped/resolved. + context.makeRequire(null, { + skipMap: true + })([id]); + + return true; + } + } + + //Turns a plugin!resource to [plugin, resource] + //with the plugin being undefined if the name + //did not have a plugin prefix. + function splitPrefix(name) { + var prefix, + index = name ? name.indexOf('!') : -1; + if (index > -1) { + prefix = name.substring(0, index); + name = name.substring(index + 1, name.length); + } + return [prefix, name]; + } + + /** + * Creates a module mapping that includes plugin prefix, module + * name, and path. If parentModuleMap is provided it will + * also normalize the name via require.normalize() + * + * @param {String} name the module name + * @param {String} [parentModuleMap] parent module map + * for the module name, used to resolve relative names. + * @param {Boolean} isNormalized: is the ID already normalized. + * This is true if this call is done for a define() module ID. + * @param {Boolean} applyMap: apply the map config to the ID. + * Should only be true if this map is for a dependency. + * + * @returns {Object} + */ + function makeModuleMap(name, parentModuleMap, isNormalized, applyMap) { + var url, pluginModule, suffix, nameParts, + prefix = null, + parentName = parentModuleMap ? parentModuleMap.name : null, + originalName = name, + isDefine = true, + normalizedName = ''; + + //If no name, then it means it is a require call, generate an + //internal name. + if (!name) { + isDefine = false; + name = '_@r' + (requireCounter += 1); + } + + nameParts = splitPrefix(name); + prefix = nameParts[0]; + name = nameParts[1]; + + if (prefix) { + prefix = normalize(prefix, parentName, applyMap); + pluginModule = getOwn(defined, prefix); + } + + //Account for relative paths if there is a base name. + if (name) { + if (prefix) { + if (pluginModule && pluginModule.normalize) { + //Plugin is loaded, use its normalize method. + normalizedName = pluginModule.normalize(name, function (name) { + return normalize(name, parentName, applyMap); + }); + } else { + // If nested plugin references, then do not try to + // normalize, as it will not normalize correctly. This + // places a restriction on resourceIds, and the longer + // term solution is not to normalize until plugins are + // loaded and all normalizations to allow for async + // loading of a loader plugin. But for now, fixes the + // common uses. Details in #1131 + normalizedName = name.indexOf('!') === -1 ? + normalize(name, parentName, applyMap) : + name; + } + } else { + //A regular module. + normalizedName = normalize(name, parentName, applyMap); + + //Normalized name may be a plugin ID due to map config + //application in normalize. The map config values must + //already be normalized, so do not need to redo that part. + nameParts = splitPrefix(normalizedName); + prefix = nameParts[0]; + normalizedName = nameParts[1]; + isNormalized = true; + + url = context.nameToUrl(normalizedName); + } + } + + //If the id is a plugin id that cannot be determined if it needs + //normalization, stamp it with a unique ID so two matching relative + //ids that may conflict can be separate. + suffix = prefix && !pluginModule && !isNormalized ? + '_unnormalized' + (unnormalizedCounter += 1) : + ''; + + return { + prefix: prefix, + name: normalizedName, + parentMap: parentModuleMap, + unnormalized: !!suffix, + url: url, + originalName: originalName, + isDefine: isDefine, + id: (prefix ? + prefix + '!' + normalizedName : + normalizedName) + suffix + }; + } + + function getModule(depMap) { + var id = depMap.id, + mod = getOwn(registry, id); + + if (!mod) { + mod = registry[id] = new context.Module(depMap); + } + + return mod; + } + + function on(depMap, name, fn) { + var id = depMap.id, + mod = getOwn(registry, id); + + if (hasProp(defined, id) && + (!mod || mod.defineEmitComplete)) { + if (name === 'defined') { + fn(defined[id]); + } + } else { + mod = getModule(depMap); + if (mod.error && name === 'error') { + fn(mod.error); + } else { + mod.on(name, fn); + } + } + } + + function onError(err, errback) { + var ids = err.requireModules, + notified = false; + + if (errback) { + errback(err); + } else { + each(ids, function (id) { + var mod = getOwn(registry, id); + if (mod) { + //Set error on module, so it skips timeout checks. + mod.error = err; + if (mod.events.error) { + notified = true; + mod.emit('error', err); + } + } + }); + + if (!notified) { + req.onError(err); + } + } + } + + /** + * Internal method to transfer globalQueue items to this context's + * defQueue. + */ + function takeGlobalQueue() { + //Push all the globalDefQueue items into the context's defQueue + if (globalDefQueue.length) { + each(globalDefQueue, function(queueItem) { + var id = queueItem[0]; + if (typeof id === 'string') { + context.defQueueMap[id] = true; + } + defQueue.push(queueItem); + }); + globalDefQueue = []; + } + } + + handlers = { + 'require': function (mod) { + if (mod.require) { + return mod.require; + } else { + return (mod.require = context.makeRequire(mod.map)); + } + }, + 'exports': function (mod) { + mod.usingExports = true; + if (mod.map.isDefine) { + if (mod.exports) { + return (defined[mod.map.id] = mod.exports); + } else { + return (mod.exports = defined[mod.map.id] = {}); + } + } + }, + 'module': function (mod) { + if (mod.module) { + return mod.module; + } else { + return (mod.module = { + id: mod.map.id, + uri: mod.map.url, + config: function () { + return getOwn(config.config, mod.map.id) || {}; + }, + exports: mod.exports || (mod.exports = {}) + }); + } + } + }; + + function cleanRegistry(id) { + //Clean up machinery used for waiting modules. + delete registry[id]; + delete enabledRegistry[id]; + } + + function breakCycle(mod, traced, processed) { + var id = mod.map.id; + + if (mod.error) { + mod.emit('error', mod.error); + } else { + traced[id] = true; + each(mod.depMaps, function (depMap, i) { + var depId = depMap.id, + dep = getOwn(registry, depId); + + //Only force things that have not completed + //being defined, so still in the registry, + //and only if it has not been matched up + //in the module already. + if (dep && !mod.depMatched[i] && !processed[depId]) { + if (getOwn(traced, depId)) { + mod.defineDep(i, defined[depId]); + mod.check(); //pass false? + } else { + breakCycle(dep, traced, processed); + } + } + }); + processed[id] = true; + } + } + + function checkLoaded() { + var err, usingPathFallback, + waitInterval = config.waitSeconds * 1000, + //It is possible to disable the wait interval by using waitSeconds of 0. + expired = waitInterval && (context.startTime + waitInterval) < new Date().getTime(), + noLoads = [], + reqCalls = [], + stillLoading = false, + needCycleCheck = true; + + //Do not bother if this call was a result of a cycle break. + if (inCheckLoaded) { + return; + } + + inCheckLoaded = true; + + //Figure out the state of all the modules. + eachProp(enabledRegistry, function (mod) { + var map = mod.map, + modId = map.id; + + //Skip things that are not enabled or in error state. + if (!mod.enabled) { + return; + } + + if (!map.isDefine) { + reqCalls.push(mod); + } + + if (!mod.error) { + //If the module should be executed, and it has not + //been inited and time is up, remember it. + if (!mod.inited && expired) { + if (hasPathFallback(modId)) { + usingPathFallback = true; + stillLoading = true; + } else { + noLoads.push(modId); + removeScript(modId); + } + } else if (!mod.inited && mod.fetched && map.isDefine) { + stillLoading = true; + if (!map.prefix) { + //No reason to keep looking for unfinished + //loading. If the only stillLoading is a + //plugin resource though, keep going, + //because it may be that a plugin resource + //is waiting on a non-plugin cycle. + return (needCycleCheck = false); + } + } + } + }); + + if (expired && noLoads.length) { + //If wait time expired, throw error of unloaded modules. + err = makeError('timeout', 'Load timeout for modules: ' + noLoads, null, noLoads); + err.contextName = context.contextName; + return onError(err); + } + + //Not expired, check for a cycle. + if (needCycleCheck) { + each(reqCalls, function (mod) { + breakCycle(mod, {}, {}); + }); + } + + //If still waiting on loads, and the waiting load is something + //other than a plugin resource, or there are still outstanding + //scripts, then just try back later. + if ((!expired || usingPathFallback) && stillLoading) { + //Something is still waiting to load. Wait for it, but only + //if a timeout is not already in effect. + if ((isBrowser || isWebWorker) && !checkLoadedTimeoutId) { + checkLoadedTimeoutId = setTimeout(function () { + checkLoadedTimeoutId = 0; + checkLoaded(); + }, 50); + } + } + + inCheckLoaded = false; + } + + Module = function (map) { + this.events = getOwn(undefEvents, map.id) || {}; + this.map = map; + this.shim = getOwn(config.shim, map.id); + this.depExports = []; + this.depMaps = []; + this.depMatched = []; + this.pluginMaps = {}; + this.depCount = 0; + + /* this.exports this.factory + this.depMaps = [], + this.enabled, this.fetched + */ + }; + + Module.prototype = { + init: function (depMaps, factory, errback, options) { + options = options || {}; + + //Do not do more inits if already done. Can happen if there + //are multiple define calls for the same module. That is not + //a normal, common case, but it is also not unexpected. + if (this.inited) { + return; + } + + this.factory = factory; + + if (errback) { + //Register for errors on this module. + this.on('error', errback); + } else if (this.events.error) { + //If no errback already, but there are error listeners + //on this module, set up an errback to pass to the deps. + errback = bind(this, function (err) { + this.emit('error', err); + }); + } + + //Do a copy of the dependency array, so that + //source inputs are not modified. For example + //"shim" deps are passed in here directly, and + //doing a direct modification of the depMaps array + //would affect that config. + this.depMaps = depMaps && depMaps.slice(0); + + this.errback = errback; + + //Indicate this module has be initialized + this.inited = true; + + this.ignore = options.ignore; + + //Could have option to init this module in enabled mode, + //or could have been previously marked as enabled. However, + //the dependencies are not known until init is called. So + //if enabled previously, now trigger dependencies as enabled. + if (options.enabled || this.enabled) { + //Enable this module and dependencies. + //Will call this.check() + this.enable(); + } else { + this.check(); + } + }, + + defineDep: function (i, depExports) { + //Because of cycles, defined callback for a given + //export can be called more than once. + if (!this.depMatched[i]) { + this.depMatched[i] = true; + this.depCount -= 1; + this.depExports[i] = depExports; + } + }, + + fetch: function () { + if (this.fetched) { + return; + } + this.fetched = true; + + context.startTime = (new Date()).getTime(); + + var map = this.map; + + //If the manager is for a plugin managed resource, + //ask the plugin to load it now. + if (this.shim) { + context.makeRequire(this.map, { + enableBuildCallback: true + })(this.shim.deps || [], bind(this, function () { + return map.prefix ? this.callPlugin() : this.load(); + })); + } else { + //Regular dependency. + return map.prefix ? this.callPlugin() : this.load(); + } + }, + + load: function () { + var url = this.map.url; + + //Regular dependency. + if (!urlFetched[url]) { + urlFetched[url] = true; + context.load(this.map.id, url); + } + }, + + /** + * Checks if the module is ready to define itself, and if so, + * define it. + */ + check: function () { + if (!this.enabled || this.enabling) { + return; + } + + var err, cjsModule, + id = this.map.id, + depExports = this.depExports, + exports = this.exports, + factory = this.factory; + + if (!this.inited) { + // Only fetch if not already in the defQueue. + if (!hasProp(context.defQueueMap, id)) { + this.fetch(); + } + } else if (this.error) { + this.emit('error', this.error); + } else if (!this.defining) { + //The factory could trigger another require call + //that would result in checking this module to + //define itself again. If already in the process + //of doing that, skip this work. + this.defining = true; + + if (this.depCount < 1 && !this.defined) { + if (isFunction(factory)) { + //If there is an error listener, favor passing + //to that instead of throwing an error. However, + //only do it for define()'d modules. require + //errbacks should not be called for failures in + //their callbacks (#699). However if a global + //onError is set, use that. + if ((this.events.error && this.map.isDefine) || + req.onError !== defaultOnError) { + try { + exports = context.execCb(id, factory, depExports, exports); + } catch (e) { + err = e; + } + } else { + exports = context.execCb(id, factory, depExports, exports); + } + + // Favor return value over exports. If node/cjs in play, + // then will not have a return value anyway. Favor + // module.exports assignment over exports object. + if (this.map.isDefine && exports === undefined) { + cjsModule = this.module; + if (cjsModule) { + exports = cjsModule.exports; + } else if (this.usingExports) { + //exports already set the defined value. + exports = this.exports; + } + } + + if (err) { + err.requireMap = this.map; + err.requireModules = this.map.isDefine ? [this.map.id] : null; + err.requireType = this.map.isDefine ? 'define' : 'require'; + return onError((this.error = err)); + } + + } else { + //Just a literal value + exports = factory; + } + + this.exports = exports; + + if (this.map.isDefine && !this.ignore) { + defined[id] = exports; + + if (req.onResourceLoad) { + req.onResourceLoad(context, this.map, this.depMaps); + } + } + + //Clean up + cleanRegistry(id); + + this.defined = true; + } + + //Finished the define stage. Allow calling check again + //to allow define notifications below in the case of a + //cycle. + this.defining = false; + + if (this.defined && !this.defineEmitted) { + this.defineEmitted = true; + this.emit('defined', this.exports); + this.defineEmitComplete = true; + } + + } + }, + + callPlugin: function () { + var map = this.map, + id = map.id, + //Map already normalized the prefix. + pluginMap = makeModuleMap(map.prefix); + + //Mark this as a dependency for this plugin, so it + //can be traced for cycles. + this.depMaps.push(pluginMap); + + on(pluginMap, 'defined', bind(this, function (plugin) { + var load, normalizedMap, normalizedMod, + bundleId = getOwn(bundlesMap, this.map.id), + name = this.map.name, + parentName = this.map.parentMap ? this.map.parentMap.name : null, + localRequire = context.makeRequire(map.parentMap, { + enableBuildCallback: true + }); + + //If current map is not normalized, wait for that + //normalized name to load instead of continuing. + if (this.map.unnormalized) { + //Normalize the ID if the plugin allows it. + if (plugin.normalize) { + name = plugin.normalize(name, function (name) { + return normalize(name, parentName, true); + }) || ''; + } + + //prefix and name should already be normalized, no need + //for applying map config again either. + normalizedMap = makeModuleMap(map.prefix + '!' + name, + this.map.parentMap); + on(normalizedMap, + 'defined', bind(this, function (value) { + this.init([], function () { return value; }, null, { + enabled: true, + ignore: true + }); + })); + + normalizedMod = getOwn(registry, normalizedMap.id); + if (normalizedMod) { + //Mark this as a dependency for this plugin, so it + //can be traced for cycles. + this.depMaps.push(normalizedMap); + + if (this.events.error) { + normalizedMod.on('error', bind(this, function (err) { + this.emit('error', err); + })); + } + normalizedMod.enable(); + } + + return; + } + + //If a paths config, then just load that file instead to + //resolve the plugin, as it is built into that paths layer. + if (bundleId) { + this.map.url = context.nameToUrl(bundleId); + this.load(); + return; + } + + load = bind(this, function (value) { + this.init([], function () { return value; }, null, { + enabled: true + }); + }); + + load.error = bind(this, function (err) { + this.inited = true; + this.error = err; + err.requireModules = [id]; + + //Remove temp unnormalized modules for this module, + //since they will never be resolved otherwise now. + eachProp(registry, function (mod) { + if (mod.map.id.indexOf(id + '_unnormalized') === 0) { + cleanRegistry(mod.map.id); + } + }); + + onError(err); + }); + + //Allow plugins to load other code without having to know the + //context or how to 'complete' the load. + load.fromText = bind(this, function (text, textAlt) { + /*jslint evil: true */ + var moduleName = map.name, + moduleMap = makeModuleMap(moduleName), + hasInteractive = useInteractive; + + //As of 2.1.0, support just passing the text, to reinforce + //fromText only being called once per resource. Still + //support old style of passing moduleName but discard + //that moduleName in favor of the internal ref. + if (textAlt) { + text = textAlt; + } + + //Turn off interactive script matching for IE for any define + //calls in the text, then turn it back on at the end. + if (hasInteractive) { + useInteractive = false; + } + + //Prime the system by creating a module instance for + //it. + getModule(moduleMap); + + //Transfer any config to this other module. + if (hasProp(config.config, id)) { + config.config[moduleName] = config.config[id]; + } + + try { + req.exec(text); + } catch (e) { + return onError(makeError('fromtexteval', + 'fromText eval for ' + id + + ' failed: ' + e, + e, + [id])); + } + + if (hasInteractive) { + useInteractive = true; + } + + //Mark this as a dependency for the plugin + //resource + this.depMaps.push(moduleMap); + + //Support anonymous modules. + context.completeLoad(moduleName); + + //Bind the value of that module to the value for this + //resource ID. + localRequire([moduleName], load); + }); + + //Use parentName here since the plugin's name is not reliable, + //could be some weird string with no path that actually wants to + //reference the parentName's path. + plugin.load(map.name, localRequire, load, config); + })); + + context.enable(pluginMap, this); + this.pluginMaps[pluginMap.id] = pluginMap; + }, + + enable: function () { + enabledRegistry[this.map.id] = this; + this.enabled = true; + + //Set flag mentioning that the module is enabling, + //so that immediate calls to the defined callbacks + //for dependencies do not trigger inadvertent load + //with the depCount still being zero. + this.enabling = true; + + //Enable each dependency + each(this.depMaps, bind(this, function (depMap, i) { + var id, mod, handler; + + if (typeof depMap === 'string') { + //Dependency needs to be converted to a depMap + //and wired up to this module. + depMap = makeModuleMap(depMap, + (this.map.isDefine ? this.map : this.map.parentMap), + false, + !this.skipMap); + this.depMaps[i] = depMap; + + handler = getOwn(handlers, depMap.id); + + if (handler) { + this.depExports[i] = handler(this); + return; + } + + this.depCount += 1; + + on(depMap, 'defined', bind(this, function (depExports) { + if (this.undefed) { + return; + } + this.defineDep(i, depExports); + this.check(); + })); + + if (this.errback) { + on(depMap, 'error', bind(this, this.errback)); + } else if (this.events.error) { + // No direct errback on this module, but something + // else is listening for errors, so be sure to + // propagate the error correctly. + on(depMap, 'error', bind(this, function(err) { + this.emit('error', err); + })); + } + } + + id = depMap.id; + mod = registry[id]; + + //Skip special modules like 'require', 'exports', 'module' + //Also, don't call enable if it is already enabled, + //important in circular dependency cases. + if (!hasProp(handlers, id) && mod && !mod.enabled) { + context.enable(depMap, this); + } + })); + + //Enable each plugin that is used in + //a dependency + eachProp(this.pluginMaps, bind(this, function (pluginMap) { + var mod = getOwn(registry, pluginMap.id); + if (mod && !mod.enabled) { + context.enable(pluginMap, this); + } + })); + + this.enabling = false; + + this.check(); + }, + + on: function (name, cb) { + var cbs = this.events[name]; + if (!cbs) { + cbs = this.events[name] = []; + } + cbs.push(cb); + }, + + emit: function (name, evt) { + each(this.events[name], function (cb) { + cb(evt); + }); + if (name === 'error') { + //Now that the error handler was triggered, remove + //the listeners, since this broken Module instance + //can stay around for a while in the registry. + delete this.events[name]; + } + } + }; + + function callGetModule(args) { + //Skip modules already defined. + if (!hasProp(defined, args[0])) { + getModule(makeModuleMap(args[0], null, true)).init(args[1], args[2]); + } + } + + function removeListener(node, func, name, ieName) { + //Favor detachEvent because of IE9 + //issue, see attachEvent/addEventListener comment elsewhere + //in this file. + if (node.detachEvent && !isOpera) { + //Probably IE. If not it will throw an error, which will be + //useful to know. + if (ieName) { + node.detachEvent(ieName, func); + } + } else { + node.removeEventListener(name, func, false); + } + } + + /** + * Given an event from a script node, get the requirejs info from it, + * and then removes the event listeners on the node. + * @param {Event} evt + * @returns {Object} + */ + function getScriptData(evt) { + //Using currentTarget instead of target for Firefox 2.0's sake. Not + //all old browsers will be supported, but this one was easy enough + //to support and still makes sense. + var node = evt.currentTarget || evt.srcElement; + + //Remove the listeners once here. + removeListener(node, context.onScriptLoad, 'load', 'onreadystatechange'); + removeListener(node, context.onScriptError, 'error'); + + return { + node: node, + id: node && node.getAttribute('data-requiremodule') + }; + } + + function intakeDefines() { + var args; + + //Any defined modules in the global queue, intake them now. + takeGlobalQueue(); + + //Make sure any remaining defQueue items get properly processed. + while (defQueue.length) { + args = defQueue.shift(); + if (args[0] === null) { + return onError(makeError('mismatch', 'Mismatched anonymous define() module: ' + + args[args.length - 1])); + } else { + //args are id, deps, factory. Should be normalized by the + //define() function. + callGetModule(args); + } + } + context.defQueueMap = {}; + } + + context = { + config: config, + contextName: contextName, + registry: registry, + defined: defined, + urlFetched: urlFetched, + defQueue: defQueue, + defQueueMap: {}, + Module: Module, + makeModuleMap: makeModuleMap, + nextTick: req.nextTick, + onError: onError, + + /** + * Set a configuration for the context. + * @param {Object} cfg config object to integrate. + */ + configure: function (cfg) { + //Make sure the baseUrl ends in a slash. + if (cfg.baseUrl) { + if (cfg.baseUrl.charAt(cfg.baseUrl.length - 1) !== '/') { + cfg.baseUrl += '/'; + } + } + + //Save off the paths since they require special processing, + //they are additive. + var shim = config.shim, + objs = { + paths: true, + bundles: true, + config: true, + map: true + }; + + eachProp(cfg, function (value, prop) { + if (objs[prop]) { + if (!config[prop]) { + config[prop] = {}; + } + mixin(config[prop], value, true, true); + } else { + config[prop] = value; + } + }); + + //Reverse map the bundles + if (cfg.bundles) { + eachProp(cfg.bundles, function (value, prop) { + each(value, function (v) { + if (v !== prop) { + bundlesMap[v] = prop; + } + }); + }); + } + + //Merge shim + if (cfg.shim) { + eachProp(cfg.shim, function (value, id) { + //Normalize the structure + if (isArray(value)) { + value = { + deps: value + }; + } + if ((value.exports || value.init) && !value.exportsFn) { + value.exportsFn = context.makeShimExports(value); + } + shim[id] = value; + }); + config.shim = shim; + } + + //Adjust packages if necessary. + if (cfg.packages) { + each(cfg.packages, function (pkgObj) { + var location, name; + + pkgObj = typeof pkgObj === 'string' ? {name: pkgObj} : pkgObj; + + name = pkgObj.name; + location = pkgObj.location; + if (location) { + config.paths[name] = pkgObj.location; + } + + //Save pointer to main module ID for pkg name. + //Remove leading dot in main, so main paths are normalized, + //and remove any trailing .js, since different package + //envs have different conventions: some use a module name, + //some use a file name. + config.pkgs[name] = pkgObj.name + '/' + (pkgObj.main || 'main') + .replace(currDirRegExp, '') + .replace(jsSuffixRegExp, ''); + }); + } + + //If there are any "waiting to execute" modules in the registry, + //update the maps for them, since their info, like URLs to load, + //may have changed. + eachProp(registry, function (mod, id) { + //If module already has init called, since it is too + //late to modify them, and ignore unnormalized ones + //since they are transient. + if (!mod.inited && !mod.map.unnormalized) { + mod.map = makeModuleMap(id, null, true); + } + }); + + //If a deps array or a config callback is specified, then call + //require with those args. This is useful when require is defined as a + //config object before require.js is loaded. + if (cfg.deps || cfg.callback) { + context.require(cfg.deps || [], cfg.callback); + } + }, + + makeShimExports: function (value) { + function fn() { + var ret; + if (value.init) { + ret = value.init.apply(global, arguments); + } + return ret || (value.exports && getGlobal(value.exports)); + } + return fn; + }, + + makeRequire: function (relMap, options) { + options = options || {}; + + function localRequire(deps, callback, errback) { + var id, map, requireMod; + + if (options.enableBuildCallback && callback && isFunction(callback)) { + callback.__requireJsBuild = true; + } + + if (typeof deps === 'string') { + if (isFunction(callback)) { + //Invalid call + return onError(makeError('requireargs', 'Invalid require call'), errback); + } + + //If require|exports|module are requested, get the + //value for them from the special handlers. Caveat: + //this only works while module is being defined. + if (relMap && hasProp(handlers, deps)) { + return handlers[deps](registry[relMap.id]); + } + + //Synchronous access to one module. If require.get is + //available (as in the Node adapter), prefer that. + if (req.get) { + return req.get(context, deps, relMap, localRequire); + } + + //Normalize module name, if it contains . or .. + map = makeModuleMap(deps, relMap, false, true); + id = map.id; + + if (!hasProp(defined, id)) { + return onError(makeError('notloaded', 'Module name "' + + id + + '" has not been loaded yet for context: ' + + contextName + + (relMap ? '' : '. Use require([])'))); + } + return defined[id]; + } + + //Grab defines waiting in the global queue. + intakeDefines(); + + //Mark all the dependencies as needing to be loaded. + context.nextTick(function () { + //Some defines could have been added since the + //require call, collect them. + intakeDefines(); + + requireMod = getModule(makeModuleMap(null, relMap)); + + //Store if map config should be applied to this require + //call for dependencies. + requireMod.skipMap = options.skipMap; + + requireMod.init(deps, callback, errback, { + enabled: true + }); + + checkLoaded(); + }); + + return localRequire; + } + + mixin(localRequire, { + isBrowser: isBrowser, + + /** + * Converts a module name + .extension into an URL path. + * *Requires* the use of a module name. It does not support using + * plain URLs like nameToUrl. + */ + toUrl: function (moduleNamePlusExt) { + var ext, + index = moduleNamePlusExt.lastIndexOf('.'), + segment = moduleNamePlusExt.split('/')[0], + isRelative = segment === '.' || segment === '..'; + + //Have a file extension alias, and it is not the + //dots from a relative path. + if (index !== -1 && (!isRelative || index > 1)) { + ext = moduleNamePlusExt.substring(index, moduleNamePlusExt.length); + moduleNamePlusExt = moduleNamePlusExt.substring(0, index); + } + + return context.nameToUrl(normalize(moduleNamePlusExt, + relMap && relMap.id, true), ext, true); + }, + + defined: function (id) { + return hasProp(defined, makeModuleMap(id, relMap, false, true).id); + }, + + specified: function (id) { + id = makeModuleMap(id, relMap, false, true).id; + return hasProp(defined, id) || hasProp(registry, id); + } + }); + + //Only allow undef on top level require calls + if (!relMap) { + localRequire.undef = function (id) { + //Bind any waiting define() calls to this context, + //fix for #408 + takeGlobalQueue(); + + var map = makeModuleMap(id, relMap, true), + mod = getOwn(registry, id); + + mod.undefed = true; + removeScript(id); + + delete defined[id]; + delete urlFetched[map.url]; + delete undefEvents[id]; + + //Clean queued defines too. Go backwards + //in array so that the splices do not + //mess up the iteration. + eachReverse(defQueue, function(args, i) { + if (args[0] === id) { + defQueue.splice(i, 1); + } + }); + delete context.defQueueMap[id]; + + if (mod) { + //Hold on to listeners in case the + //module will be attempted to be reloaded + //using a different config. + if (mod.events.defined) { + undefEvents[id] = mod.events; + } + + cleanRegistry(id); + } + }; + } + + return localRequire; + }, + + /** + * Called to enable a module if it is still in the registry + * awaiting enablement. A second arg, parent, the parent module, + * is passed in for context, when this method is overridden by + * the optimizer. Not shown here to keep code compact. + */ + enable: function (depMap) { + var mod = getOwn(registry, depMap.id); + if (mod) { + getModule(depMap).enable(); + } + }, + + /** + * Internal method used by environment adapters to complete a load event. + * A load event could be a script load or just a load pass from a synchronous + * load call. + * @param {String} moduleName the name of the module to potentially complete. + */ + completeLoad: function (moduleName) { + var found, args, mod, + shim = getOwn(config.shim, moduleName) || {}, + shExports = shim.exports; + + takeGlobalQueue(); + + while (defQueue.length) { + args = defQueue.shift(); + if (args[0] === null) { + args[0] = moduleName; + //If already found an anonymous module and bound it + //to this name, then this is some other anon module + //waiting for its completeLoad to fire. + if (found) { + break; + } + found = true; + } else if (args[0] === moduleName) { + //Found matching define call for this script! + found = true; + } + + callGetModule(args); + } + context.defQueueMap = {}; + + //Do this after the cycle of callGetModule in case the result + //of those calls/init calls changes the registry. + mod = getOwn(registry, moduleName); + + if (!found && !hasProp(defined, moduleName) && mod && !mod.inited) { + if (config.enforceDefine && (!shExports || !getGlobal(shExports))) { + if (hasPathFallback(moduleName)) { + return; + } else { + return onError(makeError('nodefine', + 'No define call for ' + moduleName, + null, + [moduleName])); + } + } else { + //A script that does not call define(), so just simulate + //the call for it. + callGetModule([moduleName, (shim.deps || []), shim.exportsFn]); + } + } + + checkLoaded(); + }, + + /** + * Converts a module name to a file path. Supports cases where + * moduleName may actually be just an URL. + * Note that it **does not** call normalize on the moduleName, + * it is assumed to have already been normalized. This is an + * internal API, not a public one. Use toUrl for the public API. + */ + nameToUrl: function (moduleName, ext, skipExt) { + var paths, syms, i, parentModule, url, + parentPath, bundleId, + pkgMain = getOwn(config.pkgs, moduleName); + + if (pkgMain) { + moduleName = pkgMain; + } + + bundleId = getOwn(bundlesMap, moduleName); + + if (bundleId) { + return context.nameToUrl(bundleId, ext, skipExt); + } + + //If a colon is in the URL, it indicates a protocol is used and it is just + //an URL to a file, or if it starts with a slash, contains a query arg (i.e. ?) + //or ends with .js, then assume the user meant to use an url and not a module id. + //The slash is important for protocol-less URLs as well as full paths. + if (req.jsExtRegExp.test(moduleName)) { + //Just a plain path, not module name lookup, so just return it. + //Add extension if it is included. This is a bit wonky, only non-.js things pass + //an extension, this method probably needs to be reworked. + url = moduleName + (ext || ''); + } else { + //A module that needs to be converted to a path. + paths = config.paths; + + syms = moduleName.split('/'); + //For each module name segment, see if there is a path + //registered for it. Start with most specific name + //and work up from it. + for (i = syms.length; i > 0; i -= 1) { + parentModule = syms.slice(0, i).join('/'); + + parentPath = getOwn(paths, parentModule); + if (parentPath) { + //If an array, it means there are a few choices, + //Choose the one that is desired + if (isArray(parentPath)) { + parentPath = parentPath[0]; + } + syms.splice(0, i, parentPath); + break; + } + } + + //Join the path parts together, then figure out if baseUrl is needed. + url = syms.join('/'); + url += (ext || (/^data\:|\?/.test(url) || skipExt ? '' : '.js')); + url = (url.charAt(0) === '/' || url.match(/^[\w\+\.\-]+:/) ? '' : config.baseUrl) + url; + } + + return config.urlArgs ? url + + ((url.indexOf('?') === -1 ? '?' : '&') + + config.urlArgs) : url; + }, + + //Delegates to req.load. Broken out as a separate function to + //allow overriding in the optimizer. + load: function (id, url) { + req.load(context, id, url); + }, + + /** + * Executes a module callback function. Broken out as a separate function + * solely to allow the build system to sequence the files in the built + * layer in the right sequence. + * + * @private + */ + execCb: function (name, callback, args, exports) { + return callback.apply(exports, args); + }, + + /** + * callback for script loads, used to check status of loading. + * + * @param {Event} evt the event from the browser for the script + * that was loaded. + */ + onScriptLoad: function (evt) { + //Using currentTarget instead of target for Firefox 2.0's sake. Not + //all old browsers will be supported, but this one was easy enough + //to support and still makes sense. + if (evt.type === 'load' || + (readyRegExp.test((evt.currentTarget || evt.srcElement).readyState))) { + //Reset interactive script so a script node is not held onto for + //to long. + interactiveScript = null; + + //Pull out the name of the module and the context. + var data = getScriptData(evt); + context.completeLoad(data.id); + } + }, + + /** + * Callback for script errors. + */ + onScriptError: function (evt) { + var data = getScriptData(evt); + if (!hasPathFallback(data.id)) { + return onError(makeError('scripterror', 'Script error for: ' + data.id, evt, [data.id])); + } + } + }; + + context.require = context.makeRequire(); + return context; + } + + /** + * Main entry point. + * + * If the only argument to require is a string, then the module that + * is represented by that string is fetched for the appropriate context. + * + * If the first argument is an array, then it will be treated as an array + * of dependency string names to fetch. An optional function callback can + * be specified to execute when all of those dependencies are available. + * + * Make a local req variable to help Caja compliance (it assumes things + * on a require that are not standardized), and to give a short + * name for minification/local scope use. + */ + req = requirejs = function (deps, callback, errback, optional) { + + //Find the right context, use default + var context, config, + contextName = defContextName; + + // Determine if have config object in the call. + if (!isArray(deps) && typeof deps !== 'string') { + // deps is a config object + config = deps; + if (isArray(callback)) { + // Adjust args if there are dependencies + deps = callback; + callback = errback; + errback = optional; + } else { + deps = []; + } + } + + if (config && config.context) { + contextName = config.context; + } + + context = getOwn(contexts, contextName); + if (!context) { + context = contexts[contextName] = req.s.newContext(contextName); + } + + if (config) { + context.configure(config); + } + + return context.require(deps, callback, errback); + }; + + /** + * Support require.config() to make it easier to cooperate with other + * AMD loaders on globally agreed names. + */ + req.config = function (config) { + return req(config); + }; + + /** + * Execute something after the current tick + * of the event loop. Override for other envs + * that have a better solution than setTimeout. + * @param {Function} fn function to execute later. + */ + req.nextTick = typeof setTimeout !== 'undefined' ? function (fn) { + setTimeout(fn, 4); + } : function (fn) { fn(); }; + + /** + * Export require as a global, but only if it does not already exist. + */ + if (!require) { + require = req; + } + + req.version = version; + + //Used to filter out dependencies that are already paths. + req.jsExtRegExp = /^\/|:|\?|\.js$/; + req.isBrowser = isBrowser; + s = req.s = { + contexts: contexts, + newContext: newContext + }; + + //Create default context. + req({}); + + //Exports some context-sensitive methods on global require. + each([ + 'toUrl', + 'undef', + 'defined', + 'specified' + ], function (prop) { + //Reference from contexts instead of early binding to default context, + //so that during builds, the latest instance of the default context + //with its config gets used. + req[prop] = function () { + var ctx = contexts[defContextName]; + return ctx.require[prop].apply(ctx, arguments); + }; + }); + + if (isBrowser) { + head = s.head = document.getElementsByTagName('head')[0]; + //If BASE tag is in play, using appendChild is a problem for IE6. + //When that browser dies, this can be removed. Details in this jQuery bug: + //http://dev.jquery.com/ticket/2709 + baseElement = document.getElementsByTagName('base')[0]; + if (baseElement) { + head = s.head = baseElement.parentNode; + } + } + + /** + * Any errors that require explicitly generates will be passed to this + * function. Intercept/override it if you want custom error handling. + * @param {Error} err the error object. + */ + req.onError = defaultOnError; + + /** + * Creates the node for the load command. Only used in browser envs. + */ + req.createNode = function (config, moduleName, url) { + var node = config.xhtml ? + document.createElementNS('http://www.w3.org/1999/xhtml', 'html:script') : + document.createElement('script'); + node.type = config.scriptType || 'text/javascript'; + node.charset = 'utf-8'; + node.async = true; + return node; + }; + + /** + * Does the request to load a module for the browser case. + * Make this a separate function to allow other environments + * to override it. + * + * @param {Object} context the require context to find state. + * @param {String} moduleName the name of the module. + * @param {Object} url the URL to the module. + */ + req.load = function (context, moduleName, url) { + var config = (context && context.config) || {}, + node; + if (isBrowser) { + //In the browser so use a script tag + node = req.createNode(config, moduleName, url); + if (config.onNodeCreated) { + config.onNodeCreated(node, config, moduleName, url); + } + + node.setAttribute('data-requirecontext', context.contextName); + node.setAttribute('data-requiremodule', moduleName); + + //Set up load listener. Test attachEvent first because IE9 has + //a subtle issue in its addEventListener and script onload firings + //that do not match the behavior of all other browsers with + //addEventListener support, which fire the onload event for a + //script right after the script execution. See: + //https://connect.microsoft.com/IE/feedback/details/648057/script-onload-event-is-not-fired-immediately-after-script-execution + //UNFORTUNATELY Opera implements attachEvent but does not follow the script + //script execution mode. + if (node.attachEvent && + //Check if node.attachEvent is artificially added by custom script or + //natively supported by browser + //read https://github.com/jrburke/requirejs/issues/187 + //if we can NOT find [native code] then it must NOT natively supported. + //in IE8, node.attachEvent does not have toString() + //Note the test for "[native code" with no closing brace, see: + //https://github.com/jrburke/requirejs/issues/273 + !(node.attachEvent.toString && node.attachEvent.toString().indexOf('[native code') < 0) && + !isOpera) { + //Probably IE. IE (at least 6-8) do not fire + //script onload right after executing the script, so + //we cannot tie the anonymous define call to a name. + //However, IE reports the script as being in 'interactive' + //readyState at the time of the define call. + useInteractive = true; + + node.attachEvent('onreadystatechange', context.onScriptLoad); + //It would be great to add an error handler here to catch + //404s in IE9+. However, onreadystatechange will fire before + //the error handler, so that does not help. If addEventListener + //is used, then IE will fire error before load, but we cannot + //use that pathway given the connect.microsoft.com issue + //mentioned above about not doing the 'script execute, + //then fire the script load event listener before execute + //next script' that other browsers do. + //Best hope: IE10 fixes the issues, + //and then destroys all installs of IE 6-9. + //node.attachEvent('onerror', context.onScriptError); + } else { + node.addEventListener('load', context.onScriptLoad, false); + node.addEventListener('error', context.onScriptError, false); + } + node.src = url; + + //For some cache cases in IE 6-8, the script executes before the end + //of the appendChild execution, so to tie an anonymous define + //call to the module name (which is stored on the node), hold on + //to a reference to this node, but clear after the DOM insertion. + currentlyAddingScript = node; + if (baseElement) { + head.insertBefore(node, baseElement); + } else { + head.appendChild(node); + } + currentlyAddingScript = null; + + return node; + } else if (isWebWorker) { + try { + //In a web worker, use importScripts. This is not a very + //efficient use of importScripts, importScripts will block until + //its script is downloaded and evaluated. However, if web workers + //are in play, the expectation that a build has been done so that + //only one script needs to be loaded anyway. This may need to be + //reevaluated if other use cases become common. + importScripts(url); + + //Account for anonymous modules + context.completeLoad(moduleName); + } catch (e) { + context.onError(makeError('importscripts', + 'importScripts failed for ' + + moduleName + ' at ' + url, + e, + [moduleName])); + } + } + }; + + function getInteractiveScript() { + if (interactiveScript && interactiveScript.readyState === 'interactive') { + return interactiveScript; + } + + eachReverse(scripts(), function (script) { + if (script.readyState === 'interactive') { + return (interactiveScript = script); + } + }); + return interactiveScript; + } + + //Look for a data-main script attribute, which could also adjust the baseUrl. + if (isBrowser && !cfg.skipDataMain) { + //Figure out baseUrl. Get it from the script tag with require.js in it. + eachReverse(scripts(), function (script) { + //Set the 'head' where we can append children by + //using the script's parent. + if (!head) { + head = script.parentNode; + } + + //Look for a data-main attribute to set main script for the page + //to load. If it is there, the path to data main becomes the + //baseUrl, if it is not already set. + dataMain = script.getAttribute('data-main'); + if (dataMain) { + //Preserve dataMain in case it is a path (i.e. contains '?') + mainScript = dataMain; + + //Set final baseUrl if there is not already an explicit one. + if (!cfg.baseUrl) { + //Pull off the directory of data-main for use as the + //baseUrl. + src = mainScript.split('/'); + mainScript = src.pop(); + subPath = src.length ? src.join('/') + '/' : './'; + + cfg.baseUrl = subPath; + } + + //Strip off any trailing .js since mainScript is now + //like a module name. + mainScript = mainScript.replace(jsSuffixRegExp, ''); + + //If mainScript is still a path, fall back to dataMain + if (req.jsExtRegExp.test(mainScript)) { + mainScript = dataMain; + } + + //Put the data-main script in the files to load. + cfg.deps = cfg.deps ? cfg.deps.concat(mainScript) : [mainScript]; + + return true; + } + }); + } + + /** + * The function that handles definitions of modules. Differs from + * require() in that a string for the module should be the first argument, + * and the function to execute after dependencies are loaded should + * return a value to define the module corresponding to the first argument's + * name. + */ + define = function (name, deps, callback) { + var node, context; + + //Allow for anonymous modules + if (typeof name !== 'string') { + //Adjust args appropriately + callback = deps; + deps = name; + name = null; + } + + //This module may not have dependencies + if (!isArray(deps)) { + callback = deps; + deps = null; + } + + //If no name, and callback is a function, then figure out if it a + //CommonJS thing with dependencies. + if (!deps && isFunction(callback)) { + deps = []; + //Remove comments from the callback string, + //look for require calls, and pull them into the dependencies, + //but only if there are function args. + if (callback.length) { + callback + .toString() + .replace(commentRegExp, '') + .replace(cjsRequireRegExp, function (match, dep) { + deps.push(dep); + }); + + //May be a CommonJS thing even without require calls, but still + //could use exports, and module. Avoid doing exports and module + //work though if it just needs require. + //REQUIRES the function to expect the CommonJS variables in the + //order listed below. + deps = (callback.length === 1 ? ['require'] : ['require', 'exports', 'module']).concat(deps); + } + } + + //If in IE 6-8 and hit an anonymous define() call, do the interactive + //work. + if (useInteractive) { + node = currentlyAddingScript || getInteractiveScript(); + if (node) { + if (!name) { + name = node.getAttribute('data-requiremodule'); + } + context = contexts[node.getAttribute('data-requirecontext')]; + } + } + + //Always save off evaluating the def call until the script onload handler. + //This allows multiple modules to be in a file without prematurely + //tracing dependencies, and allows for anonymous module support, + //where the module name is not known until the script onload event + //occurs. If no context, use the global queue, and get it processed + //in the onscript load callback. + if (context) { + context.defQueue.push([name, deps, callback]); + context.defQueueMap[name] = true; + } else { + globalDefQueue.push([name, deps, callback]); + } + }; + + define.amd = { + jQuery: true + }; + + /** + * Executes the text. Normally just uses eval, but can be modified + * to use a better, environment-specific call. Only used for transpiling + * loader plugins, not for plain JS modules. + * @param {String} text the text to execute/evaluate. + */ + req.exec = function (text) { + /*jslint evil: true */ + return eval(text); + }; + + //Set up with config info. + req(cfg); +}(this)); diff --git a/Monitor/wwwroot/assets/plugins/responsive-table/css/rwd-table.min.css b/Monitor/wwwroot/assets/plugins/responsive-table/css/rwd-table.min.css new file mode 100644 index 0000000..6edd2f2 --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/responsive-table/css/rwd-table.min.css @@ -0,0 +1,7 @@ +/*! + * Responsive Tables v5.0.4 (http://gergeo.se/RWD-Table-Patterns) + * This is an awesome solution for responsive tables with complex data. + * Authors: Nadan Gergeo (www.gergeo.se) & Maggie Wachs (www.filamentgroup.com) + * Licensed under MIT (https://github.com/nadangergeo/RWD-Table-Patterns/blob/master/LICENSE-MIT) + */ +.dropdown-menu>li.checkbox-row{padding:5px 20px}.dropdown-menu li.checkbox-row{display:block;clear:both;font-weight:normal;line-height:20px;color:#333;white-space:nowrap}.dropdown-menu li.checkbox-row label{font-weight:normal}.dropdown-menu li.checkbox-row:hover,.dropdown-menu li.checkbox-row input:hover,.dropdown-menu li.checkbox-row label:hover{cursor:pointer}.no-touch .dropdown-menu>.checkbox-row:hover,.no-touch .dropdown-menu>.checkbox-row:active{text-decoration:none;color:#262626;background-color:#f5f5f5}.btn-toolbar{margin-bottom:20px}.lt-ie8 .btn-toolbar{display:none}.table-responsive{border-radius:3px;border:1px solid #ddd;margin-bottom:20px}.table-responsive>.table{margin-bottom:0}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}.table-responsive[data-pattern="priority-columns"]{position:relative;width:100%;margin-bottom:20px;overflow-y:hidden;overflow-x:auto;-ms-overflow-style:-ms-autohiding-scrollbar;border-radius:3px;border:1px solid #ddd;-webkit-overflow-scrolling:touch}.table-responsive[data-pattern="priority-columns"]>.table{margin-bottom:0}.table-responsive[data-pattern="priority-columns"]>.table>thead>tr>th,.table-responsive[data-pattern="priority-columns"]>.table>tbody>tr>th,.table-responsive[data-pattern="priority-columns"]>.table>tfoot>tr>th,.table-responsive[data-pattern="priority-columns"]>.table>thead>tr>td,.table-responsive[data-pattern="priority-columns"]>.table>tbody>tr>td,.table-responsive[data-pattern="priority-columns"]>.table>tfoot>tr>td{white-space:nowrap}.table-responsive[data-pattern="priority-columns"]>.table-bordered{border:0}.table-responsive[data-pattern="priority-columns"]>.table-bordered>thead>tr>th:first-child,.table-responsive[data-pattern="priority-columns"]>.table-bordered>tbody>tr>th:first-child,.table-responsive[data-pattern="priority-columns"]>.table-bordered>tfoot>tr>th:first-child,.table-responsive[data-pattern="priority-columns"]>.table-bordered>thead>tr>td:first-child,.table-responsive[data-pattern="priority-columns"]>.table-bordered>tbody>tr>td:first-child,.table-responsive[data-pattern="priority-columns"]>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive[data-pattern="priority-columns"]>.table-bordered>thead>tr>th:last-child,.table-responsive[data-pattern="priority-columns"]>.table-bordered>tbody>tr>th:last-child,.table-responsive[data-pattern="priority-columns"]>.table-bordered>tfoot>tr>th:last-child,.table-responsive[data-pattern="priority-columns"]>.table-bordered>thead>tr>td:last-child,.table-responsive[data-pattern="priority-columns"]>.table-bordered>tbody>tr>td:last-child,.table-responsive[data-pattern="priority-columns"]>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive[data-pattern="priority-columns"]>.table-bordered>tbody>tr:last-child>th,.table-responsive[data-pattern="priority-columns"]>.table-bordered>tfoot>tr:last-child>th,.table-responsive[data-pattern="priority-columns"]>.table-bordered>tbody>tr:last-child>td,.table-responsive[data-pattern="priority-columns"]>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}.mq.js .table-responsive[data-pattern="priority-columns"] th[data-priority],.mq.js.lt-ie10 .sticky-table-header th[data-priority],.mq.js .table-responsive[data-pattern="priority-columns"] td[data-priority],.mq.js.lt-ie10 .sticky-table-header td[data-priority]{display:none}.lt-ie9.mq.js .table-responsive[data-pattern="priority-columns"] th[data-priority="1"],.lt-ie9.mq.js.lt-ie10 .sticky-table-header th[data-priority="1"],.lt-ie9.mq.js .table-responsive[data-pattern="priority-columns"] td[data-priority="1"],.lt-ie9.mq.js.lt-ie10 .sticky-table-header td[data-priority="1"]{display:inline}.mq.js .table-responsive[data-pattern="priority-columns"] th[data-priority="1"],.mq.js.lt-ie10 .sticky-table-header th[data-priority="1"],.mq.js .table-responsive[data-pattern="priority-columns"] td[data-priority="1"],.mq.js.lt-ie10 .sticky-table-header td[data-priority="1"]{display:table-cell}@media screen and (min-width:480px){.lt-ie9.mq.js .table-responsive[data-pattern="priority-columns"] th[data-priority="2"],.lt-ie9.mq.js.lt-ie10 .sticky-table-header th[data-priority="2"],.lt-ie9.mq.js .table-responsive[data-pattern="priority-columns"] td[data-priority="2"],.lt-ie9.mq.js.lt-ie10 .sticky-table-header td[data-priority="2"]{display:inline}.mq.js .table-responsive[data-pattern="priority-columns"] th[data-priority="2"],.mq.js.lt-ie10 .sticky-table-header th[data-priority="2"],.mq.js .table-responsive[data-pattern="priority-columns"] td[data-priority="2"],.mq.js.lt-ie10 .sticky-table-header td[data-priority="2"]{display:table-cell}}@media screen and (min-width:640px){.lt-ie9.mq.js .table-responsive[data-pattern="priority-columns"] th[data-priority="3"],.lt-ie9.mq.js.lt-ie10 .sticky-table-header th[data-priority="3"],.lt-ie9.mq.js .table-responsive[data-pattern="priority-columns"] td[data-priority="3"],.lt-ie9.mq.js.lt-ie10 .sticky-table-header td[data-priority="3"]{display:inline}.mq.js .table-responsive[data-pattern="priority-columns"] th[data-priority="3"],.mq.js.lt-ie10 .sticky-table-header th[data-priority="3"],.mq.js .table-responsive[data-pattern="priority-columns"] td[data-priority="3"],.mq.js.lt-ie10 .sticky-table-header td[data-priority="3"]{display:table-cell}}@media screen and (min-width:800px){.lt-ie9.mq.js .table-responsive[data-pattern="priority-columns"] th[data-priority="4"],.lt-ie9.mq.js.lt-ie10 .sticky-table-header th[data-priority="4"],.lt-ie9.mq.js .table-responsive[data-pattern="priority-columns"] td[data-priority="4"],.lt-ie9.mq.js.lt-ie10 .sticky-table-header td[data-priority="4"]{display:inline}.mq.js .table-responsive[data-pattern="priority-columns"] th[data-priority="4"],.mq.js.lt-ie10 .sticky-table-header th[data-priority="4"],.mq.js .table-responsive[data-pattern="priority-columns"] td[data-priority="4"],.mq.js.lt-ie10 .sticky-table-header td[data-priority="4"]{display:table-cell}}@media screen and (min-width:960px){.lt-ie9.mq.js .table-responsive[data-pattern="priority-columns"] th[data-priority="5"],.lt-ie9.mq.js.lt-ie10 .sticky-table-header th[data-priority="5"],.lt-ie9.mq.js .table-responsive[data-pattern="priority-columns"] td[data-priority="5"],.lt-ie9.mq.js.lt-ie10 .sticky-table-header td[data-priority="5"]{display:inline}.mq.js .table-responsive[data-pattern="priority-columns"] th[data-priority="5"],.mq.js.lt-ie10 .sticky-table-header th[data-priority="5"],.mq.js .table-responsive[data-pattern="priority-columns"] td[data-priority="5"],.mq.js.lt-ie10 .sticky-table-header td[data-priority="5"]{display:table-cell}}@media screen and (min-width:1120px){.lt-ie9.mq.js .table-responsive[data-pattern="priority-columns"] th[data-priority="6"],.lt-ie9.mq.js.lt-ie10 .sticky-table-header th[data-priority="6"],.lt-ie9.mq.js .table-responsive[data-pattern="priority-columns"] td[data-priority="6"],.lt-ie9.mq.js.lt-ie10 .sticky-table-header td[data-priority="6"]{display:inline}.mq.js .table-responsive[data-pattern="priority-columns"] th[data-priority="6"],.mq.js.lt-ie10 .sticky-table-header th[data-priority="6"],.mq.js .table-responsive[data-pattern="priority-columns"] td[data-priority="6"],.mq.js.lt-ie10 .sticky-table-header td[data-priority="6"]{display:table-cell}}table.table-small-font{font-size:12px;-webkit-text-size-adjust:none;line-height:1.5em}table.focus-on tbody tr:hover{cursor:pointer}table.focus-on tbody tr.unfocused th,table.focus-on tbody tr.unfocused td{color:#999;color:rgba(0,0,0,0.4)}table.focus-on tbody tr.focused th,table.focus-on tbody tr.focused td{background-color:#5bc0de;color:#000}table th.col-hide,table td.col-hide{display:none}table th.col-show,table td.col-show{display:inline}.lt-ie9 table th.col-show,.lt-ie9 table td.col-show{display:table-cell}.lt-ie9 table.display-all th,.lt-ie9 table.display-all td{display:inline !important}table.display-all th,table.display-all td{display:table-cell !important}.sticky-table-header{background-color:#fff;border:none;border-radius:0;border-top:1px solid #ddd;border-bottom:1px solid #ddd;position:absolute;top:0;visibility:hidden;z-index:990;overflow:hidden;min-width:100%}.sticky-table-header.fixed-solution{min-width:0;position:fixed}.lt-ie10 .sticky-table-header.fixed-solution{border-left:1px solid #ddd;border-right:1px solid #ddd;box-sizing:content-box;border-bottom:none}.sticky-table-header.border-radius-fix{border-bottom-left-radius:3px;border-bottom-right-radius:3px}.sticky-table-header>.table{margin-bottom:0}.sticky-table-header>.table>thead>tr>th,.sticky-table-header>.table>tbody>tr>th,.sticky-table-header>.table>tfoot>tr>th,.sticky-table-header>.table>thead>tr>td,.sticky-table-header>.table>tbody>tr>td,.sticky-table-header>.table>tfoot>tr>td{white-space:nowrap}.sticky-table-header>.table-bordered{border:0}.sticky-table-header>.table-bordered>thead>tr>th:first-child,.sticky-table-header>.table-bordered>tbody>tr>th:first-child,.sticky-table-header>.table-bordered>tfoot>tr>th:first-child,.sticky-table-header>.table-bordered>thead>tr>td:first-child,.sticky-table-header>.table-bordered>tbody>tr>td:first-child,.sticky-table-header>.table-bordered>tfoot>tr>td:first-child{border-left:0}.sticky-table-header>.table-bordered>thead>tr>th:last-child,.sticky-table-header>.table-bordered>tbody>tr>th:last-child,.sticky-table-header>.table-bordered>tfoot>tr>th:last-child,.sticky-table-header>.table-bordered>thead>tr>td:last-child,.sticky-table-header>.table-bordered>tbody>tr>td:last-child,.sticky-table-header>.table-bordered>tfoot>tr>td:last-child{border-right:0}.sticky-table-header>.table-bordered>tbody>tr:last-child>th,.sticky-table-header>.table-bordered>tfoot>tr:last-child>th,.sticky-table-header>.table-bordered>tbody>tr:last-child>td,.sticky-table-header>.table-bordered>tfoot>tr:last-child>td{border-bottom:0} \ No newline at end of file diff --git a/Monitor/wwwroot/assets/plugins/responsive-table/js/rwd-table.min.js b/Monitor/wwwroot/assets/plugins/responsive-table/js/rwd-table.min.js new file mode 100644 index 0000000..7a2b528 --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/responsive-table/js/rwd-table.min.js @@ -0,0 +1,7 @@ +/*! + * Responsive Tables v5.0.4 (http://gergeo.se/RWD-Table-Patterns) + * This is an awesome solution for responsive tables with complex data. + * Authors: Nadan Gergeo (www.gergeo.se) & Maggie Wachs (www.filamentgroup.com) + * Licensed under MIT (https://github.com/nadangergeo/RWD-Table-Patterns/blob/master/LICENSE-MIT) + */ +!function(a){"use strict";function b(){return"undefined"!=typeof window.matchMedia||"undefined"!=typeof window.msMatchMedia||"undefined"!=typeof window.styleMedia}function c(){return"ontouchstart"in window}function d(){return!!(navigator.userAgent.match(/iPhone/i)||navigator.userAgent.match(/iPad/i)||navigator.userAgent.match(/iPod/i))}var e=function(b,c){var e=this;if(this.options=c,this.$tableWrapper=null,this.$tableScrollWrapper=a(b),this.$table=a(b).find("table"),1!==this.$table.length)throw new Error("Exactly one table is expected in a .table-responsive div.");this.$tableScrollWrapper.attr("data-pattern",this.options.pattern),this.id=this.$table.prop("id")||this.$tableScrollWrapper.prop("id")||"id"+Math.random().toString(16).slice(2),this.$tableClone=null,this.$stickyTableHeader=null,this.$thead=this.$table.find("thead"),this.$tbody=this.$table.find("tbody"),this.$hdrCells=this.$thead.find("th"),this.$bodyRows=this.$tbody.find("tr"),this.$btnToolbar=null,this.$dropdownGroup=null,this.$dropdownBtn=null,this.$dropdownContainer=null,this.$displayAllBtn=null,this.$focusGroup=null,this.$focusBtn=null,this.displayAllTrigger="display-all-"+this.id+".responsive-table",this.idPrefix=this.id+"-col-",this.iOS=d(),this.wrapTable(),this.createButtonToolbar(),this.setupHdrCells(),this.setupStandardCells(),this.options.stickyTableHeader&&this.createStickyTableHeader(),this.$dropdownContainer.is(":empty")&&this.$dropdownGroup.hide(),a(window).bind("orientationchange resize "+this.displayAllTrigger,function(){e.$dropdownContainer.find("input").trigger("updateCheck"),a.proxy(e.updateSpanningCells(),e)})};e.DEFAULTS={pattern:"priority-columns",stickyTableHeader:!0,fixedNavbar:".navbar-fixed-top",addDisplayAllBtn:!0,addFocusBtn:!0,focusBtnIcon:"glyphicon glyphicon-screenshot"},e.prototype.wrapTable=function(){this.$tableScrollWrapper.wrap('
            '),this.$tableWrapper=this.$tableScrollWrapper.parent()},e.prototype.createButtonToolbar=function(){var b=this;this.$btnToolbar=a('
            '),this.$dropdownGroup=a('').css(l).appendTo(t),o&&m.addClass("mce-visual-caret-before"),d(),c=a.ownerDocument.createRange(),f=g.firstChild,c.setStart(f,0),c.setEnd(f,1),c):(g=e.insertInline(a,o),c=a.ownerDocument.createRange(),s(g.nextSibling)?(c.setStart(g,0),c.setEnd(g,0)):(c.setStart(g,1),c.setEnd(g,1)),c)}function u(){l(),g&&(e.remove(g),g=null),m&&(m.remove(),m=null),clearInterval(p)}function d(){p=a.setInterval(function(){i("div.mce-visual-caret",t).toggleClass("mce-visual-caret-hidden")},500)}function f(){a.clearInterval(p)}function h(){return".mce-visual-caret {position: absolute;background-color: black;background-color: currentcolor;}.mce-visual-caret-hidden {display: none;}*[data-mce-caret] {position: absolute;left: -1000px;right: auto;top: 0;margin: 0;padding: 0;}"}var p,m,g;return{show:c,hide:u,getCss:h,destroy:f}}}),r(Xe,[p,_,W],function(e,t,n){function r(i){function o(t){return e.map(t,function(e){return e=n.clone(e),e.node=i,e})}if(e.isArray(i))return e.reduce(i,function(e,t){return e.concat(r(t))},[]);if(t.isElement(i))return o(i.getClientRects());if(t.isText(i)){var a=i.ownerDocument.createRange();return a.setStart(i,0),a.setEnd(i,i.data.length),o(a.getClientRects())}}return{getClientRects:r}}),r(Ke,[z,p,Xe,U,te,ne,$,W],function(e,t,n,r,i,o,a,s){function l(e,t,n,o){for(;o=i.findNode(o,e,r.isEditableCaretCandidate,t);)if(n(o))return}function c(e,r,i,o,a,s){function c(o){var s,l,c;for(c=n.getClientRects(o),-1==e&&(c=c.reverse()),s=0;s0&&r(l,t.last(f))&&u++,l.line=u,a(l))return!0;f.push(l)}}var u=0,d,f=[],h;return(h=t.last(s.getClientRects()))?(d=s.getNode(),c(d),l(e,o,c,d),f):f}function u(e,t){return t.line>e}function d(e,t){return t.line===e}function f(e,n,r,i){function l(n){return 1==e?t.last(n.getClientRects()):t.last(n.getClientRects())}var c=new o(n),u,d,f,h,p=[],m=0,g,v;1==e?(u=c.next,d=s.isBelow,f=s.isAbove,h=a.after(i)):(u=c.prev,d=s.isAbove,f=s.isBelow,h=a.before(i)),v=l(h);do if(h.isVisible()&&(g=l(h),!f(g,v))){if(p.length>0&&d(g,t.last(p))&&m++,g=s.clone(g),g.position=h,g.line=m,r(g))return p;p.push(g)}while(h=u(h));return p}var h=e.curry,p=h(c,-1,s.isAbove,s.isBelow),m=h(c,1,s.isBelow,s.isAbove);return{upUntil:p,downUntil:m,positionsUntil:f,isAboveLine:h(u),isLine:h(d)}}),r(Ge,[z,p,_,Xe,W,te,U],function(e,t,n,r,i,o,a){function s(e,t){return Math.abs(e.left-t)}function l(e,t){return Math.abs(e.right-t)}function c(e,n){function r(e,t){return e>=t.left&&e<=t.right}return t.reduce(e,function(e,t){var i,o;return i=Math.min(s(e,n),l(e,n)),o=Math.min(s(t,n),l(t,n)),r(n,t)?t:r(n,e)?e:o==i&&m(t.node)?t:i>o?t:e})}function u(e,t,n,r){for(;r=g(r,e,a.isEditableCaretCandidate,t);)if(n(r))return}function d(e,n){function o(e,i){var o;return o=t.filter(r.getClientRects(i),function(t){return!e(t,n)}),a=a.concat(o),0===o.length}var a=[];return a.push(n),u(-1,e,v(o,i.isAbove),n.node),u(1,e,v(o,i.isBelow),n.node),a}function f(e){return t.filter(t.toArray(e.getElementsByTagName("*")),m)}function h(e,t){return{node:e.node,before:s(e,t)=e.top&&i<=e.bottom}),a=c(o,n),a&&(a=c(d(e,a),n),a&&m(a.node))?h(a,n):null}var m=n.isContentEditableFalse,g=o.findNode,v=e.curry;return{findClosestClientRect:c,findLineNodeRects:d,closestCaret:p}}),r(Je,[_,p,z],function(e,t,n){function r(e){function r(e){return i(e)}function a(t){f(e.getBody()).css("cursor",t)}function s(t){return t==g.element||e.dom.isChildOf(t,g.element)?!1:!i(t)}function l(t){var n,r,i,o,s=0,l=0,c,u,d,h;0===t.button&&(n=t.screenX-g.screenX,r=t.screenY-g.screenY,c=Math.max(Math.abs(n),Math.abs(r)),!g.dragging&&c>10&&(g.dragging=!0,a("default"),g.clone=g.element.cloneNode(!0),i=m.getPos(g.element),g.relX=g.clientX-i.x,g.relY=g.clientY-i.y,g.width=g.element.offsetWidth,g.height=g.element.offsetHeight,f(g.clone).css({width:g.width,height:g.height}).removeAttr("data-mce-selected"),g.ghost=f("
            ").css({position:"absolute",opacity:.5,overflow:"hidden",width:g.width,height:g.height}).attr({"data-mce-bogus":"all",unselectable:"on",contenteditable:"false"}).addClass("mce-drag-container mce-reset").append(g.clone).appendTo(e.getBody())[0],o=e.dom.getViewPort(e.getWin()),g.maxX=o.w,g.maxY=o.h),g.dragging&&(e._selectionOverrides.hideFakeCaret(),e.selection.placeCaretAt(t.clientX,t.clientY),u=g.clientX+n-g.relX,d=g.clientY+r+5,u+g.width>g.maxX&&(s=u+g.width-g.maxX),d+g.height>g.maxY&&(l=d+g.height-g.maxY),h="BODY"!=e.getBody().nodeName?e.getBody().getBoundingClientRect():{left:0,top:0},f(g.ghost).css({left:u-h.left,top:d-h.top,width:g.width-s,height:g.height-l})))}function c(t){var n;if(g.dragging&&(e.selection.setRng(e.selection.getSel().getRangeAt(0)),s(e.selection.getNode()))){var r=g.element;if(n=e.fire("drop",{targetClone:r,clientX:t.clientX,clientY:t.clientY}),n.isDefaultPrevented())return;r=n.targetClone,e.undoManager.transact(function(){e.insertContent(m.getOuterHTML(r)),f(g.element).remove()})}d()}function u(a){var s,u;if(d(),0===a.button&&(s=t.find(e.dom.getParents(a.target),n.or(i,o)),r(s))){if(u=e.fire("dragstart",{target:s}),u.isDefaultPrevented())return;e.on("mousemove",l),e.on("mouseup",c),h!=p&&(m.bind(h,"mousemove",l),m.bind(h,"mouseup",c)),g={screenX:a.screenX,screenY:a.screenY,clientX:a.clientX,clientY:a.clientY,element:s +}}}function d(){f(g.ghost).remove(),a(null),e.off("mousemove",l),e.off("mouseup",d),h!=p&&(m.unbind(h,"mousemove",l),m.unbind(h,"mouseup",d)),g={}}var f=e.$,h=document,p=e.getDoc(),m=e.dom,g={};e.on("mousedown",u),e.on("drop",function(t){var n="undefined"!=typeof t.clientX?e.getDoc().elementFromPoint(t.clientX,t.clientY):null;(i(n)||i(e.dom.getContentEditableParent(n)))&&t.preventDefault()})}var i=e.isContentEditableFalse,o=e.isContentEditableTrue;return{init:r}}),r(Qe,[d,ne,$,k,te,Ye,Ke,Ge,_,T,W,I,z,p,u,Je,S],function(e,t,n,r,i,o,a,s,l,c,u,d,f,h,p,m,g){function v(e,t){for(;t=e(t);)if(t.isVisible())return t;return t}function y(c){function y(e){return c.dom.isBlock(e)}function S(e){e&&c.selection.setRng(e)}function k(){return c.selection.getRng()}function T(e,t){c.selection.scrollIntoView(e,t)}function R(e,t,n){var r;return r=c.fire("ShowCaret",{target:t,direction:e,before:n}),r.isDefaultPrevented()?null:(T(t,-1===e),ie.show(n,t))}function A(e){var t;return ie.hide(),t=c.fire("BeforeObjectSelected",{target:e}),t.isDefaultPrevented()?null:B(e)}function B(e){var t=e.ownerDocument.createRange();return t.selectNode(e),t}function D(e,t){var n=i.isInSameBlock(e,t);return!n&&l.isBr(e.getNode())?!0:n}function L(e,t){return t=i.normalizeRange(e,ee,t),-1==e?n.fromRangeStart(t):n.fromRangeEnd(t)}function M(e){return r.isCaretContainerBlock(e.startContainer)}function P(e,t,n,r){var i,o,a,s;return!r.collapsed&&(i=_(r),x(i))?R(e,i,-1==e):(s=M(r),o=L(e,r),n(o)?A(o.getNode(-1==e)):(o=t(o))?n(o)?R(e,o.getNode(-1==e),1==e):(a=t(o),n(a)&&D(o,a)?R(e,a.getNode(-1==e),1==e):s?V(o.toRange()):null):s?r:null)}function H(e,t,n){var r,i,o,l,c,u,d,f,p;if(p=_(n),r=L(e,n),i=t(ee,a.isAboveLine(1),r),o=h.filter(i,a.isLine(1)),c=h.last(r.getClientRects()),E(r)&&(p=r.getNode()),N(r)&&(p=r.getNode(!0)),!c)return null;if(u=c.left,l=s.findClosestClientRect(o,u),l&&x(l.node))return d=Math.abs(u-l.left),f=Math.abs(u-l.right),R(e,l.node,f>d);if(p){var m=a.positionsUntil(e,ee,a.isAboveLine(1),p);if(l=s.findClosestClientRect(h.filter(m,a.isLine(1)),u))return V(l.position.toRange());if(l=h.last(h.filter(m,a.isLine(0))))return V(l.position.toRange())}}function O(t,r){function i(){var t=c.dom.create(c.settings.forced_root_block);return(!e.ie||e.ie>=11)&&(t.innerHTML='
            '),t}var o,a,s;if(r.collapsed&&c.settings.forced_root_block){if(o=c.dom.getParent(r.startContainer,"PRE"),!o)return;a=1==t?ne(n.fromRangeStart(r)):re(n.fromRangeStart(r)),a||(s=i(),1==t?c.$(o).after(s):c.$(o).before(s),c.selection.select(s,!0),c.selection.collapse())}}function I(e,t,n,r){var i;return(i=P(e,t,n,r))?i:(i=O(e,r),i?i:null)}function F(e,t,n){var r;return(r=H(e,t,n))?r:(r=O(e,n),r?r:null)}function z(){return se("*[data-mce-caret]")[0]}function U(e){e=se(e),e.attr("data-mce-caret")&&(ie.hide(),e.removeAttr("data-mce-caret"),e.removeAttr("data-mce-bogus"),e.removeAttr("style"),S(k()),T(e[0]))}function W(e){var t,r;return e=i.normalizeRange(1,ee,e),t=n.fromRangeStart(e),x(t.getNode())?R(1,t.getNode(),!t.isAtEnd()):x(t.getNode(!0))?R(1,t.getNode(!0),!1):(r=c.dom.getParent(t.getNode(),f.or(x,C)),x(r)?R(1,r,!1):(ie.hide(),null))}function V(e){var t;return e&&e.collapsed?(t=W(e),t?t:e):e}function $(e){var t,i,o,a;return x(e)?(x(e.previousSibling)&&(o=e.previousSibling),i=re(n.before(e)),i||(t=ne(n.after(e))),t&&w(t.getNode())&&(a=t.getNode()),r.remove(e.previousSibling),r.remove(e.nextSibling),c.dom.remove(e),J(),c.dom.isEmpty(c.getBody())?(c.setContent(""),void c.focus()):o?n.after(o).toRange():a?n.before(a).toRange():i?i.toRange():t?t.toRange():null):null}function q(e,t,n){var r=c.dom,i,o,a,s;if(-1===e){if(N(n)&&y(n.getNode(!0)))return $(n.getNode(!0))}else if(E(t)&&y(t.getNode()))return $(t.getNode());if(s=c.schema.getTextBlockElements(),i=r.getParent(t.getNode(),r.isBlock),o=r.getParent(n.getNode(),r.isBlock),i===o||!s[i.nodeName]||!s[o.nodeName])return null;for(;a=i.firstChild;)o.appendChild(a);return c.dom.remove(i),n.toRange()}function j(e,t,n,i){var o,a,s,l;return!i.collapsed&&(o=_(i),x(o))?V($(o)):(a=L(e,i),n(a)&&r.isCaretContainerBlock(i.startContainer)?(l=-1==e?te.prev(a):te.next(a),l?V(l.toRange()):i):t(a)?V($(a.getNode(-1==e))):(s=-1==e?te.prev(a):te.next(a),t(s)?-1===e?q(e,a,s):q(e,s,a):void 0))}function Y(){function e(e,t){var n=t(k());n&&!e.isDefaultPrevented()&&(e.preventDefault(),S(n))}function r(e){for(var t=c.getBody();e&&e!=t;){if(C(e)||x(e))return e;e=e.parentNode}return null}function i(e,t,n){return n.collapsed?!1:h.reduce(n.getClientRects(),function(n,r){return n||u.containsXY(r,e,t)},!1)}function o(e){var t=!1;e.on("touchstart",function(){t=!1}),e.on("touchmove",function(){t=!0}),e.on("touchend",function(e){var n=r(e.target);x(n)?t||(e.preventDefault(),G(A(n))):J()})}function l(){var e,t=r(c.selection.getNode());C(t)&&y(t)&&c.dom.isEmpty(t)&&(e=c.dom.create("br",{"data-mce-bogus":"1"}),c.$(t).empty().append(e),c.selection.setRng(n.before(e).toRange()))}function f(e){var t=z();if(t)return"compositionstart"==e.type?(e.preventDefault(),e.stopPropagation(),void U(t)):void(" "!=t.innerHTML&&U(t))}function g(e){var t;switch(e.keyCode){case d.DELETE:t=l();break;case d.BACKSPACE:t=l()}t&&e.preventDefault()}var v=b(I,1,ne,E),w=b(I,-1,re,N),_=b(j,1,E,N),T=b(j,-1,N,E),B=b(F,-1,a.upUntil),D=b(F,1,a.downUntil);c.on("mouseup",function(){var e=k();e.collapsed&&S(W(e))}),c.on("click",function(e){var t;t=r(e.target),t&&x(t)&&e.preventDefault()});var L=function(e){var r=new t(e);if(!e.firstChild)return!1;var i=n.before(e.firstChild),o=r.next(i);return o&&!E(o)&&!N(o)},M=function(e,t){var n=c.dom.getParent(e,c.dom.isBlock),r=c.dom.getParent(t,c.dom.isBlock);return n===r},P=function(e,t){var n=c.dom.getParent(e,c.dom.isBlock),r=c.dom.getParent(t,c.dom.isBlock);return n&&!M(n,r)&&L(n)};o(c),c.on("mousedown",function(e){var t;if(t=r(e.target))x(t)?(e.preventDefault(),G(A(t))):(J(),i(e.clientX,e.clientY,c.selection.getRng())||c.selection.placeCaretAt(e.clientX,e.clientY));else{J(),ie.hide();var n=s.closestCaret(ee,e.clientX,e.clientY);n&&(P(e.target,n.node)||(e.preventDefault(),c.getBody().focus(),S(R(1,n.node,n.before))))}}),c.on("keydown",function(t){if(!d.modifierPressed(t))switch(t.keyCode){case d.RIGHT:e(t,v);break;case d.DOWN:e(t,D);break;case d.LEFT:e(t,w);break;case d.UP:e(t,B);break;case d.DELETE:e(t,_);break;case d.BACKSPACE:e(t,T);break;default:x(c.selection.getNode())&&t.preventDefault()}}),c.on("keyup compositionstart",function(e){f(e),g(e)},!0),c.on("cut",function(){var e=c.selection.getNode();x(e)&&p.setEditorTimeout(c,function(){S(V($(e)))})}),c.on("getSelectionRange",function(e){var t=e.range;if(ae){if(!ae.parentNode)return void(ae=null);t=t.cloneRange(),t.selectNode(ae),e.range=t}}),c.on("setSelectionRange",function(e){var t;t=G(e.range),t&&(e.range=t)}),c.on("focus",function(){p.setEditorTimeout(c,function(){c.selection.setRng(V(c.selection.getRng()))},0)}),m.init(c)}function X(){var e=c.contentStyles,t=".mce-content-body";e.push(ie.getCss()),e.push(t+" .mce-offscreen-selection {position: absolute;left: -9999999999px;width: 100px;height: 100px;}"+t+" *[contentEditable=false] {cursor: default;}"+t+" *[contentEditable=true] {cursor: text;}")}function K(e){return r.isCaretContainer(e.startContainer)||r.isCaretContainer(e.endContainer)}function G(t){var n,r=c.$,i=c.dom,o,a,s,l,u,d,f,h,p;if(!t)return J(),null;if(t.collapsed){if(J(),!K(t)){if(f=L(1,t),x(f.getNode()))return R(1,f.getNode(),!f.isAtEnd());if(x(f.getNode(!0)))return R(1,f.getNode(!0),!1)}return null}return s=t.startContainer,l=t.startOffset,u=t.endOffset,3==s.nodeType&&0==l&&x(s.parentNode)&&(s=s.parentNode,l=i.nodeIndex(s),s=s.parentNode),1!=s.nodeType?(J(),null):(u==l+1&&(n=s.childNodes[l]),x(n)?(h=p=n.cloneNode(!0),d=c.fire("ObjectSelected",{target:n,targetClone:h}),d.isDefaultPrevented()?(J(),null):(h=d.targetClone,o=r("#"+oe),0===o.length&&(o=r('
            ').attr("id",oe),o.appendTo(c.getBody())),t=c.dom.createRng(),h===p&&e.ie?(o.empty().append(g.ZWSP).append(h).append(g.ZWSP),t.setStart(o[0].firstChild,0),t.setEnd(o[0].lastChild,1)):(o.empty().append("\xa0").append(h).append("\xa0"),t.setStart(o[0].firstChild,1),t.setEnd(o[0].lastChild,0)),o.css({top:i.getPos(n,c.getBody()).y}),o[0].focus(),a=c.selection.getSel(),a.removeAllRanges(),a.addRange(t),c.$("*[data-mce-selected]").removeAttr("data-mce-selected"),n.setAttribute("data-mce-selected",1),ae=n,t)):(J(),null))}function J(){ae&&(ae.removeAttribute("data-mce-selected"),c.$("#"+oe).remove(),ae=null)}function Q(){ie.destroy(),ae=null}function Z(){ie.hide()}var ee=c.getBody(),te=new t(ee),ne=b(v,te.next),re=b(v,te.prev),ie=new o(c.getBody(),y),oe="sel-"+c.dom.uniqueId(),ae,se=c.$;return e.ceFalse&&(Y(),X()),{showBlockCaretContainer:U,hideFakeCaret:Z,destroy:Q}}var b=f.curry,C=l.isContentEditableTrue,x=l.isContentEditableFalse,w=l.isElement,N=i.isAfterContentEditableFalse,E=i.isBeforeContentEditableFalse,_=c.getSelectedNode;return y}),r(Ze,[],function(){var e=0,t=function(){var e=function(){return Math.round(4294967295*Math.random()).toString(36)},t=(new Date).getTime();return"s"+t.toString(36)+e()+e()+e()},n=function(n){return n+e++ +t()};return{uuid:n}}),r(et,[w,g,E,R,A,H,P,Y,J,Q,Z,ee,oe,ae,N,f,Ae,Pe,B,L,Oe,d,m,u,Ie,Fe,ze,je,Qe,Ze],function(e,n,r,i,o,a,s,l,c,u,d,f,h,p,m,g,v,y,b,C,x,w,N,E,_,S,k,T,R,A){function B(e,t,i){var o=this,a,s,l;a=o.documentBaseUrl=i.documentBaseURL,s=i.baseURI,l=i.defaultSettings,t=P({id:e,theme:"modern",delta_width:0,delta_height:0,popup_css:"",plugins:"",document_base_url:a,add_form_submit_trigger:!0,submit_patch:!0,add_unload_trigger:!0,convert_urls:!0,relative_urls:!0,remove_script_host:!0,object_resizing:!0,doctype:"",visual:!0,font_size_style_values:"xx-small,x-small,small,medium,large,x-large,xx-large",font_size_legacy_values:"xx-small,small,medium,large,x-large,xx-large,300%",forced_root_block:"p",hidden_input:!0,padd_empty_editor:!0,render_ui:!0,indentation:"30px",inline_styles:!0,convert_fonts_to_spans:!0,indent:"simple",indent_before:"p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,th,ul,ol,li,dl,dt,dd,area,table,thead,tfoot,tbody,tr,section,article,hgroup,aside,figure,figcaption,option,optgroup,datalist",indent_after:"p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,th,ul,ol,li,dl,dt,dd,area,table,thead,tfoot,tbody,tr,section,article,hgroup,aside,figure,figcaption,option,optgroup,datalist",validate:!0,entity_encoding:"named",url_converter:o.convertURL,url_converter_scope:o,ie7_compat:!0},l,t),l&&l.external_plugins&&t.external_plugins&&(t.external_plugins=P({},l.external_plugins,t.external_plugins)),o.settings=t,r.language=t.language||"en",r.languageLoad=t.language_load,r.baseURL=i.baseURL,o.id=t.id=e,o.setDirty(!1),o.plugins={},o.documentBaseURI=new p(t.document_base_url||a,{base_uri:s}),o.baseURI=s,o.contentCSS=[],o.contentStyles=[],o.shortcuts=new k(o),o.loadedCSS={},o.editorCommands=new h(o),t.target&&(o.targetElm=t.target),o.suffix=i.suffix,o.editorManager=i,o.inline=t.inline,o.settings.content_editable=o.inline,t.cache_suffix&&(w.cacheSuffix=t.cache_suffix.replace(/^[\?\&]+/,"")),t.override_viewport===!1&&(w.overrideViewPort=!1),i.fire("SetupEditor",o),o.execCallback("setup",o),o.$=n.overrideDefaults(function(){return{context:o.inline?o.getBody():o.getDoc(),element:o.getBody()}})}var D=e.DOM,L=r.ThemeManager,M=r.PluginManager,P=N.extend,H=N.each,O=N.explode,I=N.inArray,F=N.trim,z=N.resolve,U=g.Event,W=w.gecko,V=w.ie;return B.prototype={render:function(){function e(){D.unbind(window,"ready",e),n.render()}function t(){var e=m.ScriptLoader;if(r.language&&"en"!=r.language&&!r.language_url&&(r.language_url=n.editorManager.baseURL+"/langs/"+r.language+".js"),r.language_url&&e.add(r.language_url),r.theme&&"function"!=typeof r.theme&&"-"!=r.theme.charAt(0)&&!L.urls[r.theme]){var t=r.theme_url;t=t?n.documentBaseURI.toAbsolute(t):"themes/"+r.theme+"/theme"+o+".js",L.load(r.theme,t)}N.isArray(r.plugins)&&(r.plugins=r.plugins.join(" ")),H(r.external_plugins,function(e,t){M.load(t,e),r.plugins+=" "+t}),H(r.plugins.split(/[ ,]/),function(e){if(e=F(e),e&&!M.urls[e])if("-"==e.charAt(0)){e=e.substr(1,e.length);var t=M.dependencies(e);H(t,function(e){var t={prefix:"plugins/",resource:e,suffix:"/plugin"+o+".js"};e=M.createUrl(t,e),M.load(e.resource,e)})}else M.load(e,{prefix:"plugins/",resource:e,suffix:"/plugin"+o+".js"})}),e.loadQueue(function(){n.removed||n.init()})}var n=this,r=n.settings,i=n.id,o=n.suffix;if(!U.domLoaded)return void D.bind(window,"ready",e);if(n.getElement()&&w.contentEditable){r.inline?n.inline=!0:(n.orgVisibility=n.getElement().style.visibility,n.getElement().style.visibility="hidden");var a=n.getElement().form||D.getParent(i,"form");a&&(n.formElement=a,r.hidden_input&&!/TEXTAREA|INPUT/i.test(n.getElement().nodeName)&&(D.insertAfter(D.create("input",{type:"hidden",name:i}),i),n.hasHiddenInput=!0),n.formEventDelegate=function(e){n.fire(e.type,e)},D.bind(a,"submit reset",n.formEventDelegate),n.on("reset",function(){n.setContent(n.startContent,{format:"raw"})}),!r.submit_patch||a.submit.nodeType||a.submit.length||a._mceOldSubmit||(a._mceOldSubmit=a.submit,a.submit=function(){return n.editorManager.triggerSave(),n.setDirty(!1),a._mceOldSubmit(a)})),n.windowManager=new v(n),n.notificationManager=new y(n),"xml"==r.encoding&&n.on("GetContent",function(e){e.save&&(e.content=D.encode(e.content))}),r.add_form_submit_trigger&&n.on("submit",function(){n.initialized&&n.save()}),r.add_unload_trigger&&(n._beforeUnload=function(){!n.initialized||n.destroyed||n.isHidden()||n.save({format:"raw",no_events:!0,set_dirty:!1})},n.editorManager.on("BeforeUnload",n._beforeUnload)),n.editorManager.add(n),t()}},init:function(){function e(n){var r=M.get(n),i,o;if(i=M.urls[n]||t.documentBaseUrl.replace(/\/$/,""),n=F(n),r&&-1===I(m,n)){if(H(M.dependencies(n),function(t){e(t)}),t.plugins[n])return;o=new r(t,i,t.$),t.plugins[n]=o,o.init&&(o.init(t,i),m.push(n))}}var t=this,n=t.settings,r=t.getElement(),i,o,a,s,l,c,u,d,f,h,p,m=[];if(this.editorManager.i18n.setCode(n.language),t.rtl=n.rtl_ui||this.editorManager.i18n.rtl,n.aria_label=n.aria_label||D.getAttrib(r,"aria-label",t.getLang("aria.rich_text_area")),n.theme&&("function"!=typeof n.theme?(n.theme=n.theme.replace(/-/,""),c=L.get(n.theme),t.theme=new c(t,L.urls[n.theme]),t.theme.init&&t.theme.init(t,L.urls[n.theme]||t.documentBaseUrl.replace(/\/$/,""),t.$)):t.theme=n.theme),H(n.plugins.replace(/\-/g,"").split(/[ ,]/),e),n.render_ui&&t.theme&&(t.orgDisplay=r.style.display,"function"!=typeof n.theme?(i=n.width||r.style.width||r.offsetWidth,o=n.height||r.style.height||r.offsetHeight,a=n.min_height||100,h=/^[0-9\.]+(|px)$/i,h.test(""+i)&&(i=Math.max(parseInt(i,10),100)),h.test(""+o)&&(o=Math.max(parseInt(o,10),a)),l=t.theme.renderUI({targetNode:r,width:i,height:o,deltaWidth:n.delta_width,deltaHeight:n.delta_height}),n.content_editable||(o=(l.iframeHeight||o)+("number"==typeof o?l.deltaHeight||0:""),a>o&&(o=a))):(l=n.theme(t,r),l.editorContainer.nodeType&&(l.editorContainer=l.editorContainer.id=l.editorContainer.id||t.id+"_parent"),l.iframeContainer.nodeType&&(l.iframeContainer=l.iframeContainer.id=l.iframeContainer.id||t.id+"_iframecontainer"),o=l.iframeHeight||r.offsetHeight),t.editorContainer=l.editorContainer),n.content_css&&H(O(n.content_css),function(e){t.contentCSS.push(t.documentBaseURI.toAbsolute(e))}),n.content_style&&t.contentStyles.push(n.content_style),n.content_editable)return r=s=l=null,t.initContentBody();if(t.iframeHTML=n.doctype+"",n.document_base_url!=t.documentBaseUrl&&(t.iframeHTML+=''),!w.caretAfter&&n.ie7_compat&&(t.iframeHTML+=''),t.iframeHTML+='',!/#$/.test(document.location.href))for(p=0;p',t.loadedCSS[g]=!0}d=n.body_id||"tinymce",-1!=d.indexOf("=")&&(d=t.getParam("body_id","","hash"),d=d[t.id]||d),f=n.body_class||"",-1!=f.indexOf("=")&&(f=t.getParam("body_class","","hash"),f=f[t.id]||""),n.content_security_policy&&(t.iframeHTML+=''),t.iframeHTML+='
            ';var v='javascript:(function(){document.open();document.domain="'+document.domain+'";var ed = window.parent.tinymce.get("'+t.id+'");document.write(ed.iframeHTML);document.close();ed.initContentBody(true);})()';document.domain!=location.hostname&&w.ie&&w.ie<12&&(u=v);var y=D.create("iframe",{id:t.id+"_ifr",frameBorder:"0",allowTransparency:"true",title:t.editorManager.translate("Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help"),style:{width:"100%",height:o,display:"block"}});if(y.onload=function(){y.onload=null,t.fire("load")},D.setAttrib(y,"src",u||'javascript:""'),t.contentAreaContainer=l.iframeContainer,t.iframeElement=y,s=D.add(l.iframeContainer,y),V)try{t.getDoc()}catch(b){s.src=u=v}l.editorContainer&&(D.get(l.editorContainer).style.display=t.orgDisplay,t.hidden=D.isHidden(l.editorContainer)),t.getElement().style.display="none",D.setAttrib(t.id,"aria-hidden",!0),u||t.initContentBody(),r=s=l=null},initContentBody:function(t){var n=this,r=n.settings,s=n.getElement(),h=n.getDoc(),p,m;r.inline||(n.getElement().style.visibility=n.orgVisibility),t||r.content_editable||(h.open(),h.write(n.iframeHTML),h.close()),r.content_editable&&(n.on("remove",function(){var e=this.getBody();D.removeClass(e,"mce-content-body"),D.removeClass(e,"mce-edit-focus"),D.setAttrib(e,"contentEditable",null)}),D.addClass(s,"mce-content-body"),n.contentDocument=h=r.content_document||document,n.contentWindow=r.content_window||window,n.bodyElement=s,r.content_document=r.content_window=null,r.root_name=s.nodeName.toLowerCase()),p=n.getBody(),p.disabled=!0,n.readonly=r.readonly,n.readonly||(n.inline&&"static"==D.getStyle(p,"position",!0)&&(p.style.position="relative"),p.contentEditable=n.getParam("content_editable_state",!0)),p.disabled=!1,n.editorUpload=new T(n),n.schema=new b(r),n.dom=new e(h,{keep_values:!0,url_converter:n.convertURL,url_converter_scope:n,hex_colors:r.force_hex_style_colors,class_filter:r.class_filter,update_styles:!0,root_element:n.inline?n.getBody():null,collect:r.content_editable,schema:n.schema,onSetAttrib:function(e){n.fire("SetAttrib",e)}}),n.parser=new C(r,n.schema),n.parser.addAttributeFilter("src,href,style,tabindex",function(e,t){for(var r=e.length,i,o=n.dom,a,s;r--;)if(i=e[r],a=i.attr(t),s="data-mce-"+t,!i.attributes.map[s]){if(0===a.indexOf("data:")||0===a.indexOf("blob:"))continue;"style"===t?(a=o.serializeStyle(o.parseStyle(a),i.name),a.length||(a=null),i.attr(s,a),i.attr(t,a)):"tabindex"===t?(i.attr(s,a),i.attr(t,null)):i.attr(s,n.convertURL(a,t,i.name))}}),n.parser.addNodeFilter("script",function(e){for(var t=e.length,n,r;t--;)n=e[t],r=n.attr("type")||"no/type",0!==r.indexOf("mce-")&&n.attr("type","mce-"+r)}),n.parser.addNodeFilter("#cdata",function(e){for(var t=e.length,n;t--;)n=e[t],n.type=8,n.name="#comment",n.value="[CDATA["+n.value+"]]"}),n.parser.addNodeFilter("p,h1,h2,h3,h4,h5,h6,div",function(e){for(var t=e.length,r,i=n.schema.getNonEmptyElements();t--;)r=e[t],r.isEmpty(i)&&(r.append(new o("br",1)).shortEnded=!0)}),n.serializer=new a(r,n),n.selection=new l(n.dom,n.getWin(),n.serializer,n),n.formatter=new c(n),n.undoManager=new u(n),n.forceBlocks=new f(n),n.enterKey=new d(n),n._nodeChangeDispatcher=new i(n),n._selectionOverrides=new R(n),n.fire("PreInit"),r.browser_spellcheck||r.gecko_spellcheck||(h.body.spellcheck=!1,D.setAttrib(p,"spellcheck","false")),n.quirks=new x(n),n.fire("PostRender"),r.directionality&&(p.dir=r.directionality),r.nowrap&&(p.style.whiteSpace="nowrap"),r.protect&&n.on("BeforeSetContent",function(e){H(r.protect,function(t){e.content=e.content.replace(t,function(e){return""})})}),n.on("SetContent",function(){n.addVisual(n.getBody())}),r.padd_empty_editor&&n.on("PostProcess",function(e){e.content=e.content.replace(/^(]*>( | |\s|\u00a0|)<\/p>[\r\n]*|
            [\r\n]*)$/,"")}),n.load({initial:!0,format:"html"}),n.startContent=n.getContent({format:"raw"}),n.initialized=!0,n.bindPendingEventDelegates(),n.fire("init"),n.focus(!0),n.nodeChanged({initial:!0}),n.execCallback("init_instance_callback",n),n.on("compositionstart compositionend",function(e){n.composing="compositionstart"===e.type}),n.contentStyles.length>0&&(m="",H(n.contentStyles,function(e){m+=e+"\r\n"}),n.dom.addStyle(m)),H(n.contentCSS,function(e){n.loadedCSS[e]||(n.dom.loadCSS(e),n.loadedCSS[e]=!0)}),r.auto_focus&&E.setEditorTimeout(n,function(){var e;e=r.auto_focus===!0?n:n.editorManager.get(r.auto_focus),e.destroyed||e.focus()},100),s=h=p=null},focus:function(e){function t(e){return n.dom.getParent(e,function(e){return"true"===n.dom.getContentEditable(e)})}var n=this,r=n.selection,i=n.settings.content_editable,o,a,s=n.getDoc(),l=n.getBody(),c;if(!e){if(o=r.getRng(),o.item&&(a=o.item(0)),n.quirks.refreshContentEditable(),c=t(r.getNode()),n.$.contains(l,c))return c.focus(),r.normalize(),void n.editorManager.setActive(n);if(i||(w.opera||n.getBody().focus(),n.getWin().focus()),W||i){if(l.setActive)try{l.setActive()}catch(u){l.focus()}else l.focus();i&&r.normalize()}a&&a.ownerDocument==s&&(o=s.body.createControlRange(),o.addElement(a),o.select())}n.editorManager.setActive(n)},execCallback:function(e){var t=this,n=t.settings[e],r;if(n)return t.callbackLookup&&(r=t.callbackLookup[e])&&(n=r.func,r=r.scope),"string"==typeof n&&(r=n.replace(/\.\w+$/,""),r=r?z(r):0,n=z(n),t.callbackLookup=t.callbackLookup||{},t.callbackLookup[e]={func:n,scope:r}),n.apply(r||t,Array.prototype.slice.call(arguments,1))},translate:function(e){var t=this.settings.language||"en",n=this.editorManager.i18n;return e?(e=n.data[t+"."+e]||e.replace(/\{\#([^\}]+)\}/g,function(e,r){return n.data[t+"."+r]||"{#"+r+"}"}),this.editorManager.translate(e)):""},getLang:function(e,n){return this.editorManager.i18n.data[(this.settings.language||"en")+"."+e]||(n!==t?n:"{#"+e+"}")},getParam:function(e,t,n){var r=e in this.settings?this.settings[e]:t,i;return"hash"===n?(i={},"string"==typeof r?H(r.indexOf("=")>0?r.split(/[;,](?![^=;,]*(?:[;,]|$))/):r.split(","),function(e){e=e.split("="),e.length>1?i[F(e[0])]=F(e[1]):i[F(e[0])]=F(e)}):i=r,i):r},nodeChanged:function(e){this._nodeChangeDispatcher.nodeChanged(e)},addButton:function(e,t){var n=this;t.cmd&&(t.onclick=function(){n.execCommand(t.cmd)}),t.text||t.icon||(t.icon=e),n.buttons=n.buttons||{},t.tooltip=t.tooltip||t.title,n.buttons[e]=t},addMenuItem:function(e,t){var n=this;t.cmd&&(t.onclick=function(){n.execCommand(t.cmd)}),n.menuItems=n.menuItems||{},n.menuItems[e]=t},addContextToolbar:function(e,t){var n=this,r;n.contextToolbars=n.contextToolbars||[],"string"==typeof e&&(r=e,e=function(e){return n.dom.is(e,r)}),n.contextToolbars.push({id:A.uuid("mcet"),predicate:e,items:t})},addCommand:function(e,t,n){this.editorCommands.addCommand(e,t,n)},addQueryStateHandler:function(e,t,n){this.editorCommands.addQueryStateHandler(e,t,n)},addQueryValueHandler:function(e,t,n){this.editorCommands.addQueryValueHandler(e,t,n)},addShortcut:function(e,t,n,r){this.shortcuts.add(e,t,n,r)},execCommand:function(e,t,n,r){return this.editorCommands.execCommand(e,t,n,r)},queryCommandState:function(e){return this.editorCommands.queryCommandState(e)},queryCommandValue:function(e){return this.editorCommands.queryCommandValue(e)},queryCommandSupported:function(e){return this.editorCommands.queryCommandSupported(e)},show:function(){var e=this;e.hidden&&(e.hidden=!1,e.inline?e.getBody().contentEditable=!0:(D.show(e.getContainer()),D.hide(e.id)),e.load(),e.fire("show"))},hide:function(){var e=this,t=e.getDoc();e.hidden||(V&&t&&!e.inline&&t.execCommand("SelectAll"),e.save(),e.inline?(e.getBody().contentEditable=!1,e==e.editorManager.focusedEditor&&(e.editorManager.focusedEditor=null)):(D.hide(e.getContainer()),D.setStyle(e.id,"display",e.orgDisplay)),e.hidden=!0,e.fire("hide"))},isHidden:function(){return!!this.hidden},setProgressState:function(e,t){this.fire("ProgressState",{state:e,time:t})},load:function(e){var n=this,r=n.getElement(),i;return r?(e=e||{},e.load=!0,i=n.setContent(r.value!==t?r.value:r.innerHTML,e),e.element=r,e.no_events||n.fire("LoadContent",e),e.element=r=null,i):void 0},save:function(e){var t=this,n=t.getElement(),r,i;if(n&&t.initialized)return e=e||{},e.save=!0,e.element=n,r=e.content=t.getContent(e),e.no_events||t.fire("SaveContent",e),"raw"==e.format&&t.fire("RawSaveContent",e),r=e.content,/TEXTAREA|INPUT/i.test(n.nodeName)?n.value=r:(t.inline||(n.innerHTML=r),(i=D.getParent(t.id,"form"))&&H(i.elements,function(e){return e.name==t.id?(e.value=r,!1):void 0})),e.element=n=null,e.set_dirty!==!1&&t.setDirty(!1),r},setContent:function(e,t){var n=this,r=n.getBody(),i,o;return t=t||{},t.format=t.format||"html",t.set=!0,t.content=e,t.no_events||n.fire("BeforeSetContent",t),e=t.content,0===e.length||/^\s+$/.test(e)?(o=V&&11>V?"":'
            ',"TABLE"==r.nodeName?e=""+o+"":/^(UL|OL)$/.test(r.nodeName)&&(e="
          • "+o+"
          • "),i=n.settings.forced_root_block,i&&n.schema.isValidChild(r.nodeName.toLowerCase(),i.toLowerCase())?(e=o,e=n.dom.createHTML(i,n.settings.forced_root_block_attrs,e)):V||e||(e='
            '),n.dom.setHTML(r,e),n.fire("SetContent",t)):("raw"!==t.format&&(e=new s({validate:n.validate},n.schema).serialize(n.parser.parse(e,{isRootContent:!0}))),t.content=F(e),n.dom.setHTML(r,t.content),t.no_events||n.fire("SetContent",t)),t.content},getContent:function(e){var t=this,n,r=t.getBody();return e=e||{},e.format=e.format||"html",e.get=!0,e.getInner=!0,e.no_events||t.fire("BeforeGetContent",e),n="raw"==e.format?t.serializer.getTrimmedContent():"text"==e.format?r.innerText||r.textContent:t.serializer.serialize(r,e),"text"!=e.format?e.content=F(n):e.content=n,e.no_events||t.fire("GetContent",e),e.content},insertContent:function(e,t){t&&(e=P({content:e},t)),this.execCommand("mceInsertContent",!1,e)},isDirty:function(){return!this.isNotDirty},setDirty:function(e){var t=!this.isNotDirty;this.isNotDirty=!e,e&&e!=t&&this.fire("dirty")},setMode:function(e){S.setMode(this,e)},getContainer:function(){var e=this;return e.container||(e.container=D.get(e.editorContainer||e.id+"_parent")),e.container},getContentAreaContainer:function(){return this.contentAreaContainer},getElement:function(){return this.targetElm||(this.targetElm=D.get(this.id)),this.targetElm},getWin:function(){var e=this,t;return e.contentWindow||(t=e.iframeElement,t&&(e.contentWindow=t.contentWindow)),e.contentWindow},getDoc:function(){var e=this,t;return e.contentDocument||(t=e.getWin(),t&&(e.contentDocument=t.document)),e.contentDocument},getBody:function(){return this.bodyElement||this.getDoc().body},convertURL:function(e,t,n){var r=this,i=r.settings;return i.urlconverter_callback?r.execCallback("urlconverter_callback",e,n,!0,t):!i.convert_urls||n&&"LINK"==n.nodeName||0===e.indexOf("file:")||0===e.length?e:i.relative_urls?r.documentBaseURI.toRelative(e):e=r.documentBaseURI.toAbsolute(e,i.remove_script_host)},addVisual:function(e){var n=this,r=n.settings,i=n.dom,o;e=e||n.getBody(),n.hasVisual===t&&(n.hasVisual=r.visual),H(i.select("table,a",e),function(e){var t;switch(e.nodeName){case"TABLE":return o=r.visual_table_class||"mce-item-table",t=i.getAttrib(e,"border"),void(t&&"0"!=t||!n.hasVisual?i.removeClass(e,o):i.addClass(e,o));case"A":return void(i.getAttrib(e,"href",!1)||(t=i.getAttrib(e,"name")||e.id,o=r.visual_anchor_class||"mce-item-anchor",t&&n.hasVisual?i.addClass(e,o):i.removeClass(e,o)))}}),n.fire("VisualAid",{element:e,hasVisual:n.hasVisual})},remove:function(){var e=this;e.removed||(e.save(),e.removed=1,e.unbindAllNativeEvents(),e.hasHiddenInput&&D.remove(e.getElement().nextSibling),e.inline||(V&&10>V&&e.getDoc().execCommand("SelectAll",!1,null),D.setStyle(e.id,"display",e.orgDisplay),e.getBody().onload=null),e.fire("remove"),e.editorManager.remove(e),D.remove(e.getContainer()),e._selectionOverrides.destroy(),e.editorUpload.destroy(),e.destroy())},destroy:function(e){var t=this,n;if(!t.destroyed){if(!e&&!t.removed)return void t.remove();e||(t.editorManager.off("beforeunload",t._beforeUnload),t.theme&&t.theme.destroy&&t.theme.destroy(),t.selection.destroy(),t.dom.destroy()),n=t.formElement,n&&(n._mceOldSubmit&&(n.submit=n._mceOldSubmit,n._mceOldSubmit=null),D.unbind(n,"submit reset",t.formEventDelegate)),t.contentAreaContainer=t.formElement=t.container=t.editorContainer=null,t.bodyElement=t.contentDocument=t.contentWindow=null,t.iframeElement=t.targetElm=null,t.selection&&(t.selection=t.selection.win=t.selection.dom=t.selection.dom.doc=null),t.destroyed=1}},uploadImages:function(e){return this.editorUpload.uploadImages(e)},_scanForImages:function(){return this.editorUpload.scanForImages()}},P(B.prototype,_),B}),r(tt,[],function(){var e={},t="en";return{setCode:function(e){e&&(t=e,this.rtl=this.data[e]?"rtl"===this.data[e]._dir:!1)},getCode:function(){return t},rtl:!1,add:function(t,n){var r=e[t];r||(e[t]=r={});for(var i in n)r[i]=n[i];this.setCode(t)},translate:function(n){var r;if(r=e[t],r||(r={}),"undefined"==typeof n)return n;if("string"!=typeof n&&n.raw)return n.raw;if(n.push){var i=n.slice(1);n=(r[n[0]]||n[0]).replace(/\{([0-9]+)\}/g,function(e,t){return i[t]})}return(r[n]||n).replace(/{context:\w+}$/,"")},data:e}}),r(nt,[w,u,d],function(e,t,n){function r(e){function l(){try{return document.activeElement}catch(e){return document.body}}function c(e,t){if(t&&t.startContainer){if(!e.isChildOf(t.startContainer,e.getRoot())||!e.isChildOf(t.endContainer,e.getRoot()))return;return{startContainer:t.startContainer,startOffset:t.startOffset,endContainer:t.endContainer,endOffset:t.endOffset}}return t}function u(e,t){var n;return t.startContainer?(n=e.getDoc().createRange(),n.setStart(t.startContainer,t.startOffset),n.setEnd(t.endContainer,t.endOffset)):n=t,n}function d(e){return!!s.getParent(e,r.isEditorUIElement)}function f(r){var f=r.editor;f.on("init",function(){(f.inline||n.ie)&&("onbeforedeactivate"in document&&n.ie<9?f.dom.bind(f.getBody(),"beforedeactivate",function(e){if(e.target==f.getBody())try{f.lastRng=f.selection.getRng()}catch(t){}}):f.on("nodechange mouseup keyup",function(e){var t=l();"nodechange"==e.type&&e.selectionChange||(t&&t.id==f.id+"_ifr"&&(t=f.getBody()),f.dom.isChildOf(t,f.getBody())&&(f.lastRng=f.selection.getRng()))}),n.webkit&&!i&&(i=function(){var t=e.activeEditor;if(t&&t.selection){var n=t.selection.getRng();n&&!n.collapsed&&(f.lastRng=n)}},s.bind(document,"selectionchange",i)))}),f.on("setcontent",function(){f.lastRng=null}),f.on("mousedown",function(){f.selection.lastFocusBookmark=null}),f.on("focusin",function(){var t=e.focusedEditor,n;f.selection.lastFocusBookmark&&(n=u(f,f.selection.lastFocusBookmark),f.selection.lastFocusBookmark=null,f.selection.setRng(n)),t!=f&&(t&&t.fire("blur",{focusedEditor:f}),e.setActive(f),e.focusedEditor=f,f.fire("focus",{blurredEditor:t}),f.focus(!0)),f.lastRng=null}),f.on("focusout",function(){t.setEditorTimeout(f,function(){var t=e.focusedEditor;d(l())||t!=f||(f.fire("blur",{focusedEditor:null}),e.focusedEditor=null,f.selection&&(f.selection.lastFocusBookmark=null))})}),o||(o=function(t){var n=e.activeEditor,r;r=t.target,n&&r.ownerDocument==document&&(n.selection&&r!=n.getBody()&&(n.selection.lastFocusBookmark=c(n.dom,n.lastRng)),r==document.body||d(r)||e.focusedEditor!=n||(n.fire("blur",{focusedEditor:null}),e.focusedEditor=null))},s.bind(document,"focusin",o)),f.inline&&!a&&(a=function(t){var n=e.activeEditor,r=n.dom;if(n.inline&&r&&!r.isChildOf(t.target,n.getBody())){var i=n.selection.getRng();i.collapsed||(n.lastRng=i)}},s.bind(document,"mouseup",a))}function h(t){e.focusedEditor==t.editor&&(e.focusedEditor=null),e.activeEditor||(s.unbind(document,"selectionchange",i), +s.unbind(document,"focusin",o),s.unbind(document,"mouseup",a),i=o=a=null)}e.on("AddEditor",f),e.on("RemoveEditor",h)}var i,o,a,s=e.DOM;return r.isEditorUIElement=function(e){return-1!==e.className.toString().indexOf("mce-")},r}),r(rt,[et,g,w,ae,d,m,c,ue,tt,nt],function(e,t,n,r,i,o,a,s,l,c){function u(e){g(C.editors,function(t){"scroll"===e.type?t.fire("ScrollWindow",e):t.fire("ResizeWindow",e)})}function d(e,n){n!==x&&(n?t(window).on("resize scroll",u):t(window).off("resize scroll",u),x=n)}function f(e){var t=C.editors,n;delete t[e.id];for(var r=0;r0&&g(m(t),function(e){var t;(t=p.get(e))?n.push(t):g(document.forms,function(t){g(t.elements,function(t){t.name===e&&(e="mce_editor_"+y++,p.setAttrib(t,"id",e),n.push(t))})})});break;case"textareas":case"specific_textareas":g(p.select("textarea"),function(t){e.editor_deselector&&c(t,e.editor_deselector)||e.editor_selector&&!c(t,e.editor_selector)||n.push(t)})}return n}function d(){function a(t,n,r){var i=new e(t,n,f);m.push(i),i.on("init",function(){++c===y.length&&x(m)}),i.targetElm=i.targetElm||r,i.render()}var c=0,m=[],y;return p.unbind(window,"ready",d),l("onpageload"),y=t.unique(u(n)),n.types?void g(n.types,function(e){o.each(y,function(t){return p.is(t,e.selector)?(a(s(t),v({},n,e),t),!1):!0})}):(o.each(y,function(e){h(f.get(e.id))}),y=o.grep(y,function(e){return!f.get(e.id)}),void g(y,function(e){r(n,e)?i("Could not initialize inline editor on invalid inline target element",e):a(s(e),n,e)}))}var f=this,b,C;C=o.makeMap("area base basefont br col frame hr img input isindex link meta param embed source wbr track colgroup option tbody tfoot thead tr script noscript style textarea video audio iframe object menu"," ");var x=function(e){b=e};return f.settings=n,p.bind(window,"ready",d),new a(function(e){b?e(b):x=function(t){e(t)}})},get:function(e){return arguments.length?e in this.editors?this.editors[e]:null:this.editors},add:function(e){var t=this,n=t.editors;return n[e.id]=e,n.push(e),d(n,!0),t.activeEditor=e,t.fire("AddEditor",{editor:e}),b||(b=function(){t.fire("BeforeUnload")},p.bind(window,"beforeunload",b)),e},createEditor:function(t,n){return this.add(new e(t,n,this))},remove:function(e){var t=this,n,r=t.editors,i;{if(e)return"string"==typeof e?(e=e.selector||e,void g(p.select(e),function(e){i=r[e.id],i&&t.remove(i)})):(i=e,r[i.id]?(f(i)&&t.fire("RemoveEditor",{editor:i}),r.length||p.unbind(window,"beforeunload",b),i.remove(),d(r,r.length>0),i):null);for(n=r.length-1;n>=0;n--)t.remove(r[n])}},execCommand:function(t,n,r){var i=this,o=i.get(r);switch(t){case"mceAddEditor":return i.get(r)||new e(r,i.settings,i).render(),!0;case"mceRemoveEditor":return o&&o.remove(),!0;case"mceToggleEditor":return o?(o.isHidden()?o.show():o.hide(),!0):(i.execCommand("mceAddEditor",0,r),!0)}return i.activeEditor?i.activeEditor.execCommand(t,n,r):!1},triggerSave:function(){g(this.editors,function(e){e.save()})},addI18n:function(e,t){l.add(e,t)},translate:function(e){return l.translate(e)},setActive:function(e){var t=this.activeEditor;this.activeEditor!=e&&(t&&t.fire("deactivate",{relatedTarget:e}),e.fire("activate",{relatedTarget:t})),this.activeEditor=e}},v(C,s),C.setup(),window.tinymce=window.tinyMCE=C,C}),r(it,[rt,m],function(e,t){var n=t.each,r=t.explode;e.on("AddEditor",function(e){var t=e.editor;t.on("preInit",function(){function e(e,t){n(t,function(t,n){t&&s.setStyle(e,n,t)}),s.rename(e,"span")}function i(e){s=t.dom,l.convert_fonts_to_spans&&n(s.select("font,u,strike",e.node),function(e){o[e.nodeName.toLowerCase()](s,e)})}var o,a,s,l=t.settings;l.inline_styles&&(a=r(l.font_size_legacy_values),o={font:function(t,n){e(n,{backgroundColor:n.style.backgroundColor,color:n.color,fontFamily:n.face,fontSize:a[parseInt(n.size,10)-1]})},u:function(n,r){"html4"===t.settings.schema&&e(r,{textDecoration:"underline"})},strike:function(t,n){e(n,{textDecoration:"line-through"})}},t.on("PreProcess SetContent",i))})})}),r(ot,[ue,m],function(e,t){var n={send:function(e){function r(){!e.async||4==i.readyState||o++>1e4?(e.success&&1e4>o&&200==i.status?e.success.call(e.success_scope,""+i.responseText,i,e):e.error&&e.error.call(e.error_scope,o>1e4?"TIMED_OUT":"GENERAL",i,e),i=null):setTimeout(r,10)}var i,o=0;if(e.scope=e.scope||this,e.success_scope=e.success_scope||e.scope,e.error_scope=e.error_scope||e.scope,e.async=e.async!==!1,e.data=e.data||"",n.fire("beforeInitialize",{settings:e}),i=new XMLHttpRequest){if(i.overrideMimeType&&i.overrideMimeType(e.content_type),i.open(e.type||(e.data?"POST":"GET"),e.url,e.async),e.crossDomain&&(i.withCredentials=!0),e.content_type&&i.setRequestHeader("Content-Type",e.content_type),e.requestheaders&&t.each(e.requestheaders,function(e){i.setRequestHeader(e.key,e.value)}),i.setRequestHeader("X-Requested-With","XMLHttpRequest"),i=n.fire("beforeSend",{xhr:i,settings:e}).xhr,i.send(e.data),!e.async)return r();setTimeout(r,10)}}};return t.extend(n,e),n}),r(at,[],function(){function e(t,n){var r,i,o,a;if(n=n||'"',null===t)return"null";if(o=typeof t,"string"==o)return i="\bb t\nn\ff\rr\"\"''\\\\",n+t.replace(/([\u0080-\uFFFF\x00-\x1f\"\'\\])/g,function(e,t){return'"'===n&&"'"===e?e:(r=i.indexOf(t),r+1?"\\"+i.charAt(r+1):(e=t.charCodeAt().toString(16),"\\u"+"0000".substring(e.length)+e))})+n;if("object"==o){if(t.hasOwnProperty&&"[object Array]"===Object.prototype.toString.call(t)){for(r=0,i="[";r0?",":"")+e(t[r],n);return i+"]"}i="{";for(a in t)t.hasOwnProperty(a)&&(i+="function"!=typeof t[a]?(i.length>1?","+n:n)+a+n+":"+e(t[a],n):"");return i+"}"}return""+t}return{serialize:e,parse:function(e){try{return window[String.fromCharCode(101)+"val"]("("+e+")")}catch(t){}}}}),r(st,[at,ot,m],function(e,t,n){function r(e){this.settings=i({},e),this.count=0}var i=n.extend;return r.sendRPC=function(e){return(new r).send(e)},r.prototype={send:function(n){var r=n.error,o=n.success;n=i(this.settings,n),n.success=function(t,i){t=e.parse(t),"undefined"==typeof t&&(t={error:"JSON Parse error."}),t.error?r.call(n.error_scope||n.scope,t.error,i):o.call(n.success_scope||n.scope,t.result)},n.error=function(e,t){r&&r.call(n.error_scope||n.scope,e,t)},n.data=e.serialize({id:n.id||"c"+this.count++,method:n.method,params:n.params}),n.content_type="application/json",t.send(n)}},r}),r(lt,[w],function(e){return{callbacks:{},count:0,send:function(n){var r=this,i=e.DOM,o=n.count!==t?n.count:r.count,a="tinymce_jsonp_"+o;r.callbacks[o]=function(e){i.remove(a),delete r.callbacks[o],n.callback(e)},i.add(i.doc.body,"script",{id:a,src:n.url,type:"text/javascript"}),r.count++}}}),r(ct,[],function(){function e(){s=[];for(var e in a)s.push(e);i.length=s.length}function n(){function n(e){var n,r;return r=e!==t?u+e:i.indexOf(",",u),-1===r||r>i.length?null:(n=i.substring(u,r),u=r+1,n)}var r,i,s,u=0;if(a={},c){o.load(l),i=o.getAttribute(l)||"";do{var d=n();if(null===d)break;if(r=n(parseInt(d,32)||0),null!==r){if(d=n(),null===d)break;s=n(parseInt(d,32)||0),r&&(a[r]=s)}}while(null!==r);e()}}function r(){var t,n="";if(c){for(var r in a)t=a[r],n+=(n?",":"")+r.length.toString(32)+","+r+","+t.length.toString(32)+","+t;o.setAttribute(l,n);try{o.save(l)}catch(i){}e()}}var i,o,a,s,l,c;try{if(window.localStorage)return localStorage}catch(u){}return l="tinymce",o=document.documentElement,c=!!o.addBehavior,c&&o.addBehavior("#default#userData"),i={key:function(e){return s[e]},getItem:function(e){return e in a?a[e]:null},setItem:function(e,t){a[e]=""+t,r()},removeItem:function(e){delete a[e],r()},clear:function(){a={},r()}},n(),i}),r(ut,[w,f,N,E,m,d],function(e,t,n,r,i,o){var a=window.tinymce;return a.DOM=e.DOM,a.ScriptLoader=n.ScriptLoader,a.PluginManager=r.PluginManager,a.ThemeManager=r.ThemeManager,a.dom=a.dom||{},a.dom.Event=t.Event,i.each(i,function(e,t){a[t]=e}),i.each("isOpera isWebKit isIE isGecko isMac".split(" "),function(e){a[e]=o[e.substr(2).toLowerCase()]}),{}}),r(dt,[se,m],function(e,t){return e.extend({Defaults:{firstControlClass:"first",lastControlClass:"last"},init:function(e){this.settings=t.extend({},this.Defaults,e)},preRender:function(e){e.bodyClasses.add(this.settings.containerClass)},applyClasses:function(e){var t=this,n=t.settings,r,i,o,a;r=n.firstControlClass,i=n.lastControlClass,e.each(function(e){e.classes.remove(r).remove(i).add(n.controlClass),e.visible()&&(o||(o=e),a=e)}),o&&o.classes.add(r),a&&a.classes.add(i)},renderHtml:function(e){var t=this,n="";return t.applyClasses(e.items()),e.items().each(function(e){n+=e.renderHtml()}),n},recalc:function(){},postRender:function(){},isNative:function(){return!1}})}),r(ft,[dt],function(e){return e.extend({Defaults:{containerClass:"abs-layout",controlClass:"abs-layout-item"},recalc:function(e){e.items().filter(":visible").each(function(e){var t=e.settings;e.layoutRect({x:t.x,y:t.y,w:t.w,h:t.h}),e.recalc&&e.recalc()})},renderHtml:function(e){return'
            '+this._super(e)}})}),r(ht,[De],function(e){return e.extend({Defaults:{classes:"widget btn",role:"button"},init:function(e){var t=this,n;t._super(e),e=t.settings,n=t.settings.size,t.on("click mousedown",function(e){e.preventDefault()}),t.on("touchstart",function(e){t.fire("click",e),e.preventDefault()}),e.subtype&&t.classes.add(e.subtype),n&&t.classes.add("btn-"+n),e.icon&&t.icon(e.icon)},icon:function(e){return arguments.length?(this.state.set("icon",e),this):this.state.get("icon")},repaint:function(){var e=this.getEl().firstChild,t;e&&(t=e.style,t.width=t.height="100%"),this._super()},renderHtml:function(){var e=this,t=e._id,n=e.classPrefix,r=e.state.get("icon"),i,o=e.state.get("text"),a="";return i=e.settings.image,i?(r="none","string"!=typeof i&&(i=window.getSelection?i[0]:i[1]),i=" style=\"background-image: url('"+i+"')\""):i="",o&&(e.classes.add("btn-has-text"),a=''+e.encode(o)+""),r=e.settings.icon?n+"ico "+n+"i-"+r:"",'
            "},bindStates:function(){function e(e){var i=n("span."+r,t.getEl());e?(i[0]||(n("button:first",t.getEl()).append(''),i=n("span."+r,t.getEl())),i.html(t.encode(e))):i.remove(),t.classes.toggle("btn-has-text",!!e)}var t=this,n=t.$,r=t.classPrefix+"txt";return t.state.on("change:text",function(t){e(t.value)}),t.state.on("change:icon",function(n){var r=n.value,i=t.classPrefix;t.settings.icon=r,r=r?i+"ico "+i+"i-"+t.settings.icon:"";var o=t.getEl().firstChild,a=o.getElementsByTagName("i")[0];r?(a&&a==o.firstChild||(a=document.createElement("i"),o.insertBefore(a,o.firstChild)),a.className=r):a&&o.removeChild(a),e(t.state.get("text"))}),t._super()}})}),r(pt,[xe],function(e){return e.extend({Defaults:{defaultType:"button",role:"group"},renderHtml:function(){var e=this,t=e._layout;return e.classes.add("btn-group"),e.preRender(),t.preRender(e),'
            '+(e.settings.html||"")+t.renderHtml(e)+"
            "}})}),r(mt,[De],function(e){return e.extend({Defaults:{classes:"checkbox",role:"checkbox",checked:!1},init:function(e){var t=this;t._super(e),t.on("click mousedown",function(e){e.preventDefault()}),t.on("click",function(e){e.preventDefault(),t.disabled()||t.checked(!t.checked())}),t.checked(t.settings.checked)},checked:function(e){return arguments.length?(this.state.set("checked",e),this):this.state.get("checked")},value:function(e){return arguments.length?this.checked(e):this.checked()},renderHtml:function(){var e=this,t=e._id,n=e.classPrefix;return'
            '+e.encode(e.state.get("text"))+"
            "},bindStates:function(){function e(e){t.classes.toggle("checked",e),t.aria("checked",e)}var t=this;return t.state.on("change:text",function(e){t.getEl("al").firstChild.data=t.translate(e.value)}),t.state.on("change:checked change:value",function(n){t.fire("change"),e(n.value)}),t.state.on("change:icon",function(e){var n=e.value,r=t.classPrefix;if("undefined"==typeof n)return t.settings.icon;t.settings.icon=n,n=n?r+"ico "+r+"i-"+t.settings.icon:"";var i=t.getEl().firstChild,o=i.getElementsByTagName("i")[0];n?(o&&o==i.firstChild||(o=document.createElement("i"),i.insertBefore(o,i.firstChild)),o.className=n):o&&i.removeChild(o)}),t.state.get("checked")&&e(!0),t._super()}})}),r(gt,[De,be,pe,g],function(e,t,n,r){return e.extend({init:function(e){var t=this;t._super(e),e=t.settings,t.classes.add("combobox"),t.subinput=!0,t.ariaTarget="inp",e.menu=e.menu||e.values,e.menu&&(e.icon="caret"),t.on("click",function(n){var i=n.target,o=t.getEl();if(r.contains(o,i)||i==o)for(;i&&i!=o;)i.id&&-1!=i.id.indexOf("-open")&&(t.fire("action"),e.menu&&(t.showMenu(),n.aria&&t.menu.items()[0].focus())),i=i.parentNode}),t.on("keydown",function(e){"INPUT"==e.target.nodeName&&13==e.keyCode&&t.parents().reverse().each(function(n){var r=t.state.get("value"),i=t.getEl("inp").value;return e.preventDefault(),t.state.set("value",i),r!=i&&t.fire("change"),n.hasEventListeners("submit")&&n.toJSON?(n.fire("submit",{data:n.toJSON()}),!1):void 0})}),t.on("keyup",function(e){"INPUT"==e.target.nodeName&&t.state.set("value",e.target.value)})},showMenu:function(){var e=this,n=e.settings,r;e.menu||(r=n.menu||[],r.length?r={type:"menu",items:r}:r.type=r.type||"menu",e.menu=t.create(r).parent(e).renderTo(e.getContainerElm()),e.fire("createmenu"),e.menu.reflow(),e.menu.on("cancel",function(t){t.control===e.menu&&e.focus()}),e.menu.on("show hide",function(t){t.control.items().each(function(t){t.active(t.value()==e.value())})}).fire("show"),e.menu.on("select",function(t){e.value(t.control.value())}),e.on("focusin",function(t){"INPUT"==t.target.tagName.toUpperCase()&&e.menu.hide()}),e.aria("expanded",!0)),e.menu.show(),e.menu.layoutRect({w:e.layoutRect().w}),e.menu.moveRel(e.getEl(),e.isRtl()?["br-tr","tr-br"]:["bl-tl","tl-bl"])},focus:function(){this.getEl("inp").focus()},repaint:function(){var e=this,t=e.getEl(),i=e.getEl("open"),o=e.layoutRect(),a,s;a=i?o.w-n.getSize(i).width-10:o.w-10;var l=document;return l.all&&(!l.documentMode||l.documentMode<=8)&&(s=e.layoutRect().h-2+"px"),r(t.firstChild).css({width:a,lineHeight:s}),e._super(),e},postRender:function(){var e=this;return r(this.getEl("inp")).on("change",function(t){e.state.set("value",t.target.value),e.fire("change",t)}),e._super()},renderHtml:function(){var e=this,t=e._id,n=e.settings,r=e.classPrefix,i=e.state.get("value")||"",o,a,s="",l="";return"spellcheck"in n&&(l+=' spellcheck="'+n.spellcheck+'"'),n.maxLength&&(l+=' maxlength="'+n.maxLength+'"'),n.size&&(l+=' size="'+n.size+'"'),n.subtype&&(l+=' type="'+n.subtype+'"'),e.disabled()&&(l+=' disabled="disabled"'),o=n.icon,o&&"caret"!=o&&(o=r+"ico "+r+"i-"+n.icon),a=e.state.get("text"),(o||a)&&(s='
            ",e.classes.add("has-open")),'
            '+s+"
            "},value:function(e){return arguments.length?(this.state.set("value",e),this):(this.state.get("rendered")&&this.state.set("value",this.getEl("inp").value),this.state.get("value"))},bindStates:function(){var e=this;return e.state.on("change:value",function(t){e.getEl("inp").value!=t.value&&(e.getEl("inp").value=t.value)}),e.state.on("change:disabled",function(t){e.getEl("inp").disabled=t.value}),e._super()},remove:function(){r(this.getEl("inp")).off(),this._super()}})}),r(vt,[gt],function(e){return e.extend({init:function(e){var t=this;e.spellcheck=!1,e.onaction&&(e.icon="none"),t._super(e),t.classes.add("colorbox"),t.on("change keyup postrender",function(){t.repaintColor(t.value())})},repaintColor:function(e){var t=this.getEl().getElementsByTagName("i")[0];if(t)try{t.style.background=e}catch(n){}},bindStates:function(){var e=this;return e.state.on("change:value",function(t){e.state.get("rendered")&&e.repaintColor(t.value)}),e._super()}})}),r(yt,[ht,ke],function(e,t){return e.extend({showPanel:function(){var e=this,n=e.settings;if(e.active(!0),e.panel)e.panel.show();else{var r=n.panel;r.type&&(r={layout:"grid",items:r}),r.role=r.role||"dialog",r.popover=!0,r.autohide=!0,r.ariaRoot=!0,e.panel=new t(r).on("hide",function(){e.active(!1)}).on("cancel",function(t){t.stopPropagation(),e.focus(),e.hidePanel()}).parent(e).renderTo(e.getContainerElm()),e.panel.fire("show"),e.panel.reflow()}e.panel.moveRel(e.getEl(),n.popoverAlign||(e.isRtl()?["bc-tr","bc-tc"]:["bc-tl","bc-tc"]))},hidePanel:function(){var e=this;e.panel&&e.panel.hide()},postRender:function(){var e=this;return e.aria("haspopup",!0),e.on("click",function(t){t.control===e&&(e.panel&&e.panel.visible()?e.hidePanel():(e.showPanel(),e.panel.focus(!!t.aria)))}),e._super()},remove:function(){return this.panel&&(this.panel.remove(),this.panel=null),this._super()}})}),r(bt,[yt,w],function(e,t){var n=t.DOM;return e.extend({init:function(e){this._super(e),this.classes.add("colorbutton")},color:function(e){return e?(this._color=e,this.getEl("preview").style.backgroundColor=e,this):this._color},resetColor:function(){return this._color=null,this.getEl("preview").style.backgroundColor=null,this},renderHtml:function(){var e=this,t=e._id,n=e.classPrefix,r=e.state.get("text"),i=e.settings.icon?n+"ico "+n+"i-"+e.settings.icon:"",o=e.settings.image?" style=\"background-image: url('"+e.settings.image+"')\"":"",a="";return r&&(e.classes.add("btn-has-text"),a=''+e.encode(r)+""),'
            '},postRender:function(){var e=this,t=e.settings.onclick;return e.on("click",function(r){r.aria&&"down"==r.aria.key||r.control!=e||n.getParent(r.target,"."+e.classPrefix+"open")||(r.stopImmediatePropagation(),t.call(e,r))}),delete e.settings.onclick,e._super()}})}),r(Ct,[],function(){function e(e){function i(e,i,o){var a,s,l,c,u,d;return a=0,s=0,l=0,e/=255,i/=255,o/=255,u=t(e,t(i,o)),d=n(e,n(i,o)),u==d?(l=u,{h:0,s:0,v:100*l}):(c=e==u?i-o:o==u?e-i:o-e,a=e==u?3:o==u?1:5,a=60*(a-c/(d-u)),s=(d-u)/d,l=d,{h:r(a),s:r(100*s),v:r(100*l)})}function o(e,i,o){var a,s,l,c;if(e=(parseInt(e,10)||0)%360,i=parseInt(i,10)/100,o=parseInt(o,10)/100,i=n(0,t(i,1)),o=n(0,t(o,1)),0===i)return void(d=f=h=r(255*o));switch(a=e/60,s=o*i,l=s*(1-Math.abs(a%2-1)),c=o-s,Math.floor(a)){case 0:d=s,f=l,h=0;break;case 1:d=l,f=s,h=0;break;case 2:d=0,f=s,h=l;break;case 3:d=0,f=l,h=s;break;case 4:d=l,f=0,h=s;break;case 5:d=s,f=0,h=l;break;default:d=f=h=0}d=r(255*(d+c)),f=r(255*(f+c)),h=r(255*(h+c))}function a(){function e(e){return e=parseInt(e,10).toString(16),e.length>1?e:"0"+e}return"#"+e(d)+e(f)+e(h)}function s(){return{r:d,g:f,b:h}}function l(){return i(d,f,h)}function c(e){var t;return"object"==typeof e?"r"in e?(d=e.r,f=e.g,h=e.b):"v"in e&&o(e.h,e.s,e.v):(t=/rgb\s*\(\s*([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)[^\)]*\)/gi.exec(e))?(d=parseInt(t[1],10),f=parseInt(t[2],10),h=parseInt(t[3],10)):(t=/#([0-F]{2})([0-F]{2})([0-F]{2})/gi.exec(e))?(d=parseInt(t[1],16),f=parseInt(t[2],16),h=parseInt(t[3],16)):(t=/#([0-F])([0-F])([0-F])/gi.exec(e))&&(d=parseInt(t[1]+t[1],16),f=parseInt(t[2]+t[2],16),h=parseInt(t[3]+t[3],16)),d=0>d?0:d>255?255:d,f=0>f?0:f>255?255:f,h=0>h?0:h>255?255:h,u}var u=this,d=0,f=0,h=0;e&&c(e),u.toRgb=s,u.toHsv=l,u.toHex=a,u.parse=c}var t=Math.min,n=Math.max,r=Math.round;return e}),r(xt,[De,we,pe,Ct],function(e,t,n,r){return e.extend({Defaults:{classes:"widget colorpicker"},init:function(e){this._super(e)},postRender:function(){function e(e,t){var r=n.getPos(e),i,o;return i=t.pageX-r.x,o=t.pageY-r.y,i=Math.max(0,Math.min(i/e.clientWidth,1)),o=Math.max(0,Math.min(o/e.clientHeight,1)),{x:i,y:o}}function i(e,t){var i=(360-e.h)/360;n.css(d,{top:100*i+"%"}),t||n.css(h,{left:e.s+"%",top:100-e.v+"%"}),f.style.background=new r({s:100,v:100,h:e.h}).toHex(),s.color().parse({s:e.s,v:e.v,h:e.h})}function o(t){var n;n=e(f,t),c.s=100*n.x,c.v=100*(1-n.y),i(c),s.fire("change")}function a(t){var n;n=e(u,t),c=l.toHsv(),c.h=360*(1-n.y),i(c,!0),s.fire("change")}var s=this,l=s.color(),c,u,d,f,h;u=s.getEl("h"),d=s.getEl("hp"),f=s.getEl("sv"),h=s.getEl("svp"),s._repaint=function(){c=l.toHsv(),i(c)},s._super(),s._svdraghelper=new t(s._id+"-sv",{start:o,drag:o}),s._hdraghelper=new t(s._id+"-h",{start:a,drag:a}),s._repaint()},rgb:function(){return this.color().toRgb()},value:function(e){var t=this;return arguments.length?(t.color().parse(e),void(t._rendered&&t._repaint())):t.color().toHex()},color:function(){return this._color||(this._color=new r),this._color},renderHtml:function(){function e(){var e,t,n="",i,a;for(i="filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,startColorstr=",a=o.split(","),e=0,t=a.length-1;t>e;e++)n+='
            ';return n}var t=this,n=t._id,r=t.classPrefix,i,o="#ff0000,#ff0080,#ff00ff,#8000ff,#0000ff,#0080ff,#00ffff,#00ff80,#00ff00,#80ff00,#ffff00,#ff8000,#ff0000",a="background: -ms-linear-gradient(top,"+o+");background: linear-gradient(to bottom,"+o+");";return i='
            '+e()+'
            ','
            '+i+"
            "}})}),r(wt,[De],function(e){return e.extend({init:function(e){var t=this;e.delimiter||(e.delimiter="\xbb"),t._super(e),t.classes.add("path"),t.canFocus=!0,t.on("click",function(e){var n,r=e.target;(n=r.getAttribute("data-index"))&&t.fire("select",{value:t.row()[n],index:n})}),t.row(t.settings.row)},focus:function(){var e=this;return e.getEl().firstChild.focus(),e},row:function(e){return arguments.length?(this.state.set("row",e),this):this.state.get("row")},renderHtml:function(){var e=this;return'
            '+e._getDataPathHtml(e.state.get("row"))+"
            "},bindStates:function(){var e=this;return e.state.on("change:row",function(t){e.innerHtml(e._getDataPathHtml(t.value))}),e._super()},_getDataPathHtml:function(e){var t=this,n=e||[],r,i,o="",a=t.classPrefix;for(r=0,i=n.length;i>r;r++)o+=(r>0?'":"")+'
            '+n[r].name+"
            ";return o||(o='
            \xa0
            '),o}})}),r(Nt,[wt],function(e){return e.extend({postRender:function(){function e(e){if(1===e.nodeType){if("BR"==e.nodeName||e.getAttribute("data-mce-bogus"))return!0;if("bookmark"===e.getAttribute("data-mce-type"))return!0}return!1}var t=this,n=t.settings.editor;return n.settings.elementpath!==!1&&(t.on("select",function(e){n.focus(),n.selection.select(this.row()[e.index].element),n.nodeChanged()}),n.on("nodeChange",function(r){for(var i=[],o=r.parents,a=o.length;a--;)if(1==o[a].nodeType&&!e(o[a])){var s=n.fire("ResolveName",{name:o[a].nodeName.toLowerCase(),target:o[a]});if(s.isDefaultPrevented()||i.push({name:s.name,element:o[a]}),s.isPropagationStopped())break}t.row(i)})),t._super()}})}),r(Et,[xe],function(e){return e.extend({Defaults:{layout:"flex",align:"center",defaults:{flex:1}},renderHtml:function(){var e=this,t=e._layout,n=e.classPrefix;return e.classes.add("formitem"),t.preRender(e),'
            '+(e.settings.title?'
            '+e.settings.title+"
            ":"")+'
            '+(e.settings.html||"")+t.renderHtml(e)+"
            "}})}),r(_t,[xe,Et,m],function(e,t,n){return e.extend({Defaults:{containerCls:"form",layout:"flex",direction:"column",align:"stretch",flex:1,padding:20,labelGap:30,spacing:10,callbacks:{submit:function(){this.submit()}}},preRender:function(){var e=this,r=e.items();e.settings.formItemDefaults||(e.settings.formItemDefaults={layout:"flex",autoResize:"overflow",defaults:{flex:1}}),r.each(function(r){var i,o=r.settings.label;o&&(i=new t(n.extend({items:{type:"label",id:r._id+"-l",text:o,flex:0,forId:r._id,disabled:r.disabled()}},e.settings.formItemDefaults)),i.type="formitem",r.aria("labelledby",r._id+"-l"),"undefined"==typeof r.settings.flex&&(r.settings.flex=1),e.replace(r,i),i.add(r))})},submit:function(){return this.fire("submit",{data:this.toJSON()})},postRender:function(){var e=this;e._super(),e.fromJSON(e.settings.data)},bindStates:function(){function e(){var e=0,n=[],r,i,o;if(t.settings.labelGapCalc!==!1)for(o="children"==t.settings.labelGapCalc?t.find("formitem"):t.items(),o.filter("formitem").each(function(t){var r=t.items()[0],i=r.getEl().clientWidth;e=i>e?i:e,n.push(r)}),i=t.settings.labelGap||0,r=n.length;r--;)n[r].settings.minWidth=e+i}var t=this;t._super(),t.on("show",e),e()}})}),r(St,[_t],function(e){return e.extend({Defaults:{containerCls:"fieldset",layout:"flex",direction:"column",align:"stretch",flex:1,padding:"25 15 5 15",labelGap:30,spacing:10,border:1},renderHtml:function(){var e=this,t=e._layout,n=e.classPrefix;return e.preRender(),t.preRender(e),'
            '+(e.settings.title?''+e.settings.title+"":"")+'
            '+(e.settings.html||"")+t.renderHtml(e)+"
            "}})}),r(kt,[gt,m],function(e,t){return e.extend({init:function(e){var n=this,r=tinymce.activeEditor,i=r.settings,o,a,s;e.spellcheck=!1,s=i.file_picker_types||i.file_browser_callback_types,s&&(s=t.makeMap(s,/[, ]/)),s&&!s[e.filetype]||(a=i.file_picker_callback,!a||s&&!s[e.filetype]?(a=i.file_browser_callback,!a||s&&!s[e.filetype]||(o=function(){a(n.getEl("inp").id,n.value(),e.filetype,window)})):o=function(){var i=n.fire("beforecall").meta;i=t.extend({filetype:e.filetype},i),a.call(r,function(e,t){n.value(e).fire("change",{meta:t})},n.value(),i)}),o&&(e.icon="browse",e.onaction=o),n._super(e)}})}),r(Tt,[ft],function(e){return e.extend({recalc:function(e){var t=e.layoutRect(),n=e.paddingBox;e.items().filter(":visible").each(function(e){e.layoutRect({x:n.left,y:n.top,w:t.innerW-n.right-n.left,h:t.innerH-n.top-n.bottom}),e.recalc&&e.recalc()})}})}),r(Rt,[ft],function(e){return e.extend({recalc:function(e){var t,n,r,i,o,a,s,l,c,u,d,f,h,p,m,g,v=[],y,b,C,x,w,N,E,_,S,k,T,R,A,B,D,L,M,P,H,O,I,F,z=Math.max,U=Math.min;for(r=e.items().filter(":visible"),i=e.layoutRect(),o=e.paddingBox,a=e.settings,f=e.isRtl()?a.direction||"row-reversed":a.direction,s=a.align,l=e.isRtl()?a.pack||"end":a.pack,c=a.spacing||0,"row-reversed"!=f&&"column-reverse"!=f||(r=r.set(r.toArray().reverse()),f=f.split("-")[0]),"column"==f?(S="y",E="h",_="minH",k="maxH",R="innerH",T="top",A="deltaH",B="contentH",H="left",M="w",D="x",L="innerW",P="minW",O="right",I="deltaW",F="contentW"):(S="x",E="w",_="minW",k="maxW",R="innerW",T="left",A="deltaW",B="contentW",H="top",M="h",D="y",L="innerH",P="minH",O="bottom",I="deltaH",F="contentH"),d=i[R]-o[T]-o[T],N=u=0,t=0,n=r.length;n>t;t++)h=r[t],p=h.layoutRect(),m=h.settings,g=m.flex,d-=n-1>t?c:0,g>0&&(u+=g,p[k]&&v.push(h),p.flex=g),d-=p[_],y=o[H]+p[P]+o[O],y>N&&(N=y);if(x={},0>d?x[_]=i[_]-d+i[A]:x[_]=i[R]-d+i[A],x[P]=N+i[I],x[B]=i[R]-d,x[F]=N,x.minW=U(x.minW,i.maxW),x.minH=U(x.minH,i.maxH),x.minW=z(x.minW,i.startMinWidth),x.minH=z(x.minH,i.startMinHeight),!i.autoResize||x.minW==i.minW&&x.minH==i.minH){for(C=d/u,t=0,n=v.length;n>t;t++)h=v[t],p=h.layoutRect(),b=p[k],y=p[_]+p.flex*C,y>b?(d-=p[k]-p[_],u-=p.flex,p.flex=0,p.maxFlexSize=b):p.maxFlexSize=0;for(C=d/u,w=o[T],x={},0===u&&("end"==l?w=d+o[T]:"center"==l?(w=Math.round(i[R]/2-(i[R]-d)/2)+o[T],0>w&&(w=o[T])):"justify"==l&&(w=o[T],c=Math.floor(d/(r.length-1)))),x[D]=o[H],t=0,n=r.length;n>t;t++)h=r[t],p=h.layoutRect(),y=p.maxFlexSize||p[_],"center"===s?x[D]=Math.round(i[L]/2-p[M]/2):"stretch"===s?(x[M]=z(p[P]||0,i[L]-o[H]-o[O]),x[D]=o[H]):"end"===s&&(x[D]=i[L]-p[M]-o.top),p.flex>0&&(y+=p.flex*C),x[E]=y,x[S]=w,h.layoutRect(x),h.recalc&&h.recalc(),w+=y+c}else if(x.w=x.minW,x.h=x.minH,e.layoutRect(x),this.recalc(e),null===e._lastRect){var W=e.parent();W&&(W._lastRect=null,W.recalc())}}})}),r(At,[dt],function(e){return e.extend({Defaults:{containerClass:"flow-layout",controlClass:"flow-layout-item",endClass:"break"},recalc:function(e){e.items().filter(":visible").each(function(e){e.recalc&&e.recalc()})},isNative:function(){return!0}})}),r(Bt,[ye,De,ke,m,rt,d],function(e,t,n,r,i,o){function a(e){function t(t,n){return function(){var r=this;e.on("nodeChange",function(i){var o=e.formatter,a=null;s(i.parents,function(e){return s(t,function(t){return n?o.matchNode(e,n,{value:t.value})&&(a=t.value):o.matchNode(e,t.value)&&(a=t.value),a?!1:void 0}),a?!1:void 0}),r.value(a)})}}function r(e){e=e.replace(/;$/,"").split(";");for(var t=e.length;t--;)e[t]=e[t].split("=");return e}function i(){function t(e){var n=[];if(e)return s(e,function(e){var o={text:e.title,icon:e.icon};if(e.items)o.menu=t(e.items);else{ +var a=e.format||"custom"+r++;e.format||(e.name=a,i.push(e)),o.format=a,o.cmd=e.cmd}n.push(o)}),n}function n(){var n;return n=t(e.settings.style_formats_merge?e.settings.style_formats?o.concat(e.settings.style_formats):o:e.settings.style_formats||o)}var r=0,i=[],o=[{title:"Headings",items:[{title:"Heading 1",format:"h1"},{title:"Heading 2",format:"h2"},{title:"Heading 3",format:"h3"},{title:"Heading 4",format:"h4"},{title:"Heading 5",format:"h5"},{title:"Heading 6",format:"h6"}]},{title:"Inline",items:[{title:"Bold",icon:"bold",format:"bold"},{title:"Italic",icon:"italic",format:"italic"},{title:"Underline",icon:"underline",format:"underline"},{title:"Strikethrough",icon:"strikethrough",format:"strikethrough"},{title:"Superscript",icon:"superscript",format:"superscript"},{title:"Subscript",icon:"subscript",format:"subscript"},{title:"Code",icon:"code",format:"code"}]},{title:"Blocks",items:[{title:"Paragraph",format:"p"},{title:"Blockquote",format:"blockquote"},{title:"Div",format:"div"},{title:"Pre",format:"pre"}]},{title:"Alignment",items:[{title:"Left",icon:"alignleft",format:"alignleft"},{title:"Center",icon:"aligncenter",format:"aligncenter"},{title:"Right",icon:"alignright",format:"alignright"},{title:"Justify",icon:"alignjustify",format:"alignjustify"}]}];return e.on("init",function(){s(i,function(t){e.formatter.register(t.name,t)})}),{type:"menu",items:n(),onPostRender:function(t){e.fire("renderFormatsMenu",{control:t.control})},itemDefaults:{preview:!0,textStyle:function(){return this.settings.format?e.formatter.getCssText(this.settings.format):void 0},onPostRender:function(){var t=this;t.parent().on("show",function(){var n,r;n=t.settings.format,n&&(t.disabled(!e.formatter.canApply(n)),t.active(e.formatter.match(n))),r=t.settings.cmd,r&&t.active(e.queryCommandState(r))})},onclick:function(){this.settings.format&&c(this.settings.format),this.settings.cmd&&e.execCommand(this.settings.cmd)}}}}function o(t){return function(){var n=this;e.formatter?e.formatter.formatChanged(t,function(e){n.active(e)}):e.on("init",function(){e.formatter.formatChanged(t,function(e){n.active(e)})})}}function a(t){return function(){function n(){return e.undoManager?e.undoManager[t]():!1}var r=this;t="redo"==t?"hasRedo":"hasUndo",r.disabled(!n()),e.on("Undo Redo AddUndo TypingUndo ClearUndos SwitchMode",function(){r.disabled(e.readonly||!n())})}}function l(){var t=this;e.on("VisualAid",function(e){t.active(e.hasVisual)}),t.active(e.hasVisual)}function c(t){t.control&&(t=t.control.value()),t&&e.execCommand("mceToggleFormat",!1,t)}var u;u=i(),s({bold:"Bold",italic:"Italic",underline:"Underline",strikethrough:"Strikethrough",subscript:"Subscript",superscript:"Superscript"},function(t,n){e.addButton(n,{tooltip:t,onPostRender:o(n),onclick:function(){c(n)}})}),s({outdent:["Decrease indent","Outdent"],indent:["Increase indent","Indent"],cut:["Cut","Cut"],copy:["Copy","Copy"],paste:["Paste","Paste"],help:["Help","mceHelp"],selectall:["Select all","SelectAll"],removeformat:["Clear formatting","RemoveFormat"],visualaid:["Visual aids","mceToggleVisualAid"],newdocument:["New document","mceNewDocument"]},function(t,n){e.addButton(n,{tooltip:t[0],cmd:t[1]})}),s({blockquote:["Blockquote","mceBlockQuote"],numlist:["Numbered list","InsertOrderedList"],bullist:["Bullet list","InsertUnorderedList"],subscript:["Subscript","Subscript"],superscript:["Superscript","Superscript"],alignleft:["Align left","JustifyLeft"],aligncenter:["Align center","JustifyCenter"],alignright:["Align right","JustifyRight"],alignjustify:["Justify","JustifyFull"],alignnone:["No alignment","JustifyNone"]},function(t,n){e.addButton(n,{tooltip:t[0],cmd:t[1],onPostRender:o(n)})}),e.addButton("undo",{tooltip:"Undo",onPostRender:a("undo"),cmd:"undo"}),e.addButton("redo",{tooltip:"Redo",onPostRender:a("redo"),cmd:"redo"}),e.addMenuItem("newdocument",{text:"New document",icon:"newdocument",cmd:"mceNewDocument"}),e.addMenuItem("undo",{text:"Undo",icon:"undo",shortcut:"Meta+Z",onPostRender:a("undo"),cmd:"undo"}),e.addMenuItem("redo",{text:"Redo",icon:"redo",shortcut:"Meta+Y",onPostRender:a("redo"),cmd:"redo"}),e.addMenuItem("visualaid",{text:"Visual aids",selectable:!0,onPostRender:l,cmd:"mceToggleVisualAid"}),e.addButton("remove",{tooltip:"Remove",icon:"remove",cmd:"Delete"}),s({cut:["Cut","Cut","Meta+X"],copy:["Copy","Copy","Meta+C"],paste:["Paste","Paste","Meta+V"],selectall:["Select all","SelectAll","Meta+A"],bold:["Bold","Bold","Meta+B"],italic:["Italic","Italic","Meta+I"],underline:["Underline","Underline"],strikethrough:["Strikethrough","Strikethrough"],subscript:["Subscript","Subscript"],superscript:["Superscript","Superscript"],removeformat:["Clear formatting","RemoveFormat"]},function(t,n){e.addMenuItem(n,{text:t[0],icon:n,shortcut:t[2],cmd:t[1]})}),e.on("mousedown",function(){n.hideAll()}),e.addButton("styleselect",{type:"menubutton",text:"Formats",menu:u}),e.addButton("formatselect",function(){var n=[],i=r(e.settings.block_formats||"Paragraph=p;Heading 1=h1;Heading 2=h2;Heading 3=h3;Heading 4=h4;Heading 5=h5;Heading 6=h6;Preformatted=pre");return s(i,function(t){n.push({text:t[0],value:t[1],textStyle:function(){return e.formatter.getCssText(t[1])}})}),{type:"listbox",text:i[0][0],values:n,fixedWidth:!0,onselect:c,onPostRender:t(n)}}),e.addButton("fontselect",function(){var n="Andale Mono=andale mono,monospace;Arial=arial,helvetica,sans-serif;Arial Black=arial black,sans-serif;Book Antiqua=book antiqua,palatino,serif;Comic Sans MS=comic sans ms,sans-serif;Courier New=courier new,courier,monospace;Georgia=georgia,palatino,serif;Helvetica=helvetica,arial,sans-serif;Impact=impact,sans-serif;Symbol=symbol;Tahoma=tahoma,arial,helvetica,sans-serif;Terminal=terminal,monaco,monospace;Times New Roman=times new roman,times,serif;Trebuchet MS=trebuchet ms,geneva,sans-serif;Verdana=verdana,geneva,sans-serif;Webdings=webdings;Wingdings=wingdings,zapf dingbats",i=[],o=r(e.settings.font_formats||n);return s(o,function(e){i.push({text:{raw:e[0]},value:e[1],textStyle:-1==e[1].indexOf("dings")?"font-family:"+e[1]:""})}),{type:"listbox",text:"Font Family",tooltip:"Font Family",values:i,fixedWidth:!0,onPostRender:t(i,"fontname"),onselect:function(t){t.control.settings.value&&e.execCommand("FontName",!1,t.control.settings.value)}}}),e.addButton("fontsizeselect",function(){var n=[],r="8pt 10pt 12pt 14pt 18pt 24pt 36pt",i=e.settings.fontsize_formats||r;return s(i.split(" "),function(e){var t=e,r=e,i=e.split("=");i.length>1&&(t=i[0],r=i[1]),n.push({text:t,value:r})}),{type:"listbox",text:"Font Sizes",tooltip:"Font Sizes",values:n,fixedWidth:!0,onPostRender:t(n,"fontsize"),onclick:function(t){t.control.settings.value&&e.execCommand("FontSize",!1,t.control.settings.value)}}}),e.addMenuItem("formats",{text:"Formats",menu:u})}var s=r.each;i.on("AddEditor",function(t){t.editor.rtl&&(e.rtl=!0),a(t.editor)}),e.translate=function(e){return i.translate(e)},t.tooltips=!o.iOS}),r(Dt,[ft],function(e){return e.extend({recalc:function(e){var t,n,r,i,o,a,s,l,c,u,d,f,h,p,m,g,v,y,b,C,x,w,N,E=[],_=[],S,k,T,R,A,B;t=e.settings,i=e.items().filter(":visible"),o=e.layoutRect(),r=t.columns||Math.ceil(Math.sqrt(i.length)),n=Math.ceil(i.length/r),y=t.spacingH||t.spacing||0,b=t.spacingV||t.spacing||0,C=t.alignH||t.align,x=t.alignV||t.align,g=e.paddingBox,A="reverseRows"in t?t.reverseRows:e.isRtl(),C&&"string"==typeof C&&(C=[C]),x&&"string"==typeof x&&(x=[x]);for(d=0;r>d;d++)E.push(0);for(f=0;n>f;f++)_.push(0);for(f=0;n>f;f++)for(d=0;r>d&&(u=i[f*r+d],u);d++)c=u.layoutRect(),S=c.minW,k=c.minH,E[d]=S>E[d]?S:E[d],_[f]=k>_[f]?k:_[f];for(T=o.innerW-g.left-g.right,w=0,d=0;r>d;d++)w+=E[d]+(d>0?y:0),T-=(d>0?y:0)+E[d];for(R=o.innerH-g.top-g.bottom,N=0,f=0;n>f;f++)N+=_[f]+(f>0?b:0),R-=(f>0?b:0)+_[f];if(w+=g.left+g.right,N+=g.top+g.bottom,l={},l.minW=w+(o.w-o.innerW),l.minH=N+(o.h-o.innerH),l.contentW=l.minW-o.deltaW,l.contentH=l.minH-o.deltaH,l.minW=Math.min(l.minW,o.maxW),l.minH=Math.min(l.minH,o.maxH),l.minW=Math.max(l.minW,o.startMinWidth),l.minH=Math.max(l.minH,o.startMinHeight),!o.autoResize||l.minW==o.minW&&l.minH==o.minH){o.autoResize&&(l=e.layoutRect(l),l.contentW=l.minW-o.deltaW,l.contentH=l.minH-o.deltaH);var D;D="start"==t.packV?0:R>0?Math.floor(R/n):0;var L=0,M=t.flexWidths;if(M)for(d=0;dd;d++)E[d]+=M?M[d]*P:P;for(p=g.top,f=0;n>f;f++){for(h=g.left,s=_[f]+D,d=0;r>d&&(B=A?f*r+r-1-d:f*r+d,u=i[B],u);d++)m=u.settings,c=u.layoutRect(),a=Math.max(E[d],c.startMinWidth),c.x=h,c.y=p,v=m.alignH||(C?C[d]||C[0]:null),"center"==v?c.x=h+a/2-c.w/2:"right"==v?c.x=h+a-c.w:"stretch"==v&&(c.w=a),v=m.alignV||(x?x[d]||x[0]:null),"center"==v?c.y=p+s/2-c.h/2:"bottom"==v?c.y=p+s-c.h:"stretch"==v&&(c.h=s),u.layoutRect(c),h+=a+y,u.recalc&&u.recalc();p+=s+b}}else if(l.w=l.minW,l.h=l.minH,e.layoutRect(l),this.recalc(e),null===e._lastRect){var H=e.parent();H&&(H._lastRect=null,H.recalc())}}})}),r(Lt,[De,u],function(e,t){return e.extend({renderHtml:function(){var e=this;return e.classes.add("iframe"),e.canFocus=!1,''},src:function(e){this.getEl().src=e},html:function(e,n){var r=this,i=this.getEl().contentWindow.document.body;return i?(i.innerHTML=e,n&&n()):t.setTimeout(function(){r.html(e)}),this}})}),r(Mt,[De],function(e){return e.extend({init:function(e){var t=this;t._super(e),t.classes.add("widget").add("infobox"),t.canFocus=!1},severity:function(e){this.classes.remove("error"),this.classes.remove("warning"),this.classes.remove("success"),this.classes.add(e)},help:function(e){this.state.set("help",e)},renderHtml:function(){var e=this,t=e.classPrefix;return'
            '+e.encode(e.state.get("text"))+'
            '},bindStates:function(){var e=this;return e.state.on("change:text",function(t){e.getEl("body").firstChild.data=e.encode(t.value),e.state.get("rendered")&&e.updateLayoutRect()}),e.state.on("change:help",function(t){e.classes.toggle("has-help",t.value),e.state.get("rendered")&&e.updateLayoutRect()}),e._super()}})}),r(Pt,[De,pe],function(e,t){return e.extend({init:function(e){var t=this;t._super(e),t.classes.add("widget").add("label"),t.canFocus=!1,e.multiline&&t.classes.add("autoscroll"),e.strong&&t.classes.add("strong")},initLayoutRect:function(){var e=this,n=e._super();if(e.settings.multiline){var r=t.getSize(e.getEl());r.width>n.maxW&&(n.minW=n.maxW,e.classes.add("multiline")),e.getEl().style.width=n.minW+"px",n.startMinH=n.h=n.minH=Math.min(n.maxH,t.getSize(e.getEl()).height)}return n},repaint:function(){var e=this;return e.settings.multiline||(e.getEl().style.lineHeight=e.layoutRect().h+"px"),e._super()},severity:function(e){this.classes.remove("error"),this.classes.remove("warning"),this.classes.remove("success"),this.classes.add(e)},renderHtml:function(){var e=this,t,n,r=e.settings.forId;return!r&&(n=e.settings.forName)&&(t=e.getRoot().find("#"+n)[0],t&&(r=t._id)),r?'":''+e.encode(e.state.get("text"))+""},bindStates:function(){var e=this;return e.state.on("change:text",function(t){e.innerHtml(e.encode(t.value)),e.state.get("rendered")&&e.updateLayoutRect()}),e._super()}})}),r(Ht,[xe],function(e){return e.extend({Defaults:{role:"toolbar",layout:"flow"},init:function(e){var t=this;t._super(e),t.classes.add("toolbar")},postRender:function(){var e=this;return e.items().each(function(e){e.classes.add("toolbar-item")}),e._super()}})}),r(Ot,[Ht],function(e){return e.extend({Defaults:{role:"menubar",containerCls:"menubar",ariaRoot:!0,defaults:{type:"menubutton"}}})}),r(It,[ht,be,Ot],function(e,t,n){function r(e,t){for(;e;){if(t===e)return!0;e=e.parentNode}return!1}var i=e.extend({init:function(e){var t=this;t._renderOpen=!0,t._super(e),e=t.settings,t.classes.add("menubtn"),e.fixedWidth&&t.classes.add("fixed-width"),t.aria("haspopup",!0),t.state.set("menu",e.menu||t.render())},showMenu:function(){var e=this,n;return e.menu&&e.menu.visible()?e.hideMenu():(e.menu||(n=e.state.get("menu")||[],n.length?n={type:"menu",items:n}:n.type=n.type||"menu",n.renderTo?e.menu=n.parent(e).show().renderTo():e.menu=t.create(n).parent(e).renderTo(),e.fire("createmenu"),e.menu.reflow(),e.menu.on("cancel",function(t){t.control.parent()===e.menu&&(t.stopPropagation(),e.focus(),e.hideMenu())}),e.menu.on("select",function(){e.focus()}),e.menu.on("show hide",function(t){t.control==e.menu&&e.activeMenu("show"==t.type),e.aria("expanded","show"==t.type)}).fire("show")),e.menu.show(),e.menu.layoutRect({w:e.layoutRect().w}),void e.menu.moveRel(e.getEl(),e.isRtl()?["br-tr","tr-br"]:["bl-tl","tl-bl"]))},hideMenu:function(){var e=this;e.menu&&(e.menu.items().each(function(e){e.hideMenu&&e.hideMenu()}),e.menu.hide())},activeMenu:function(e){this.classes.toggle("active",e)},renderHtml:function(){var e=this,t=e._id,r=e.classPrefix,i=e.settings.icon,o,a=e.state.get("text"),s="";return o=e.settings.image,o?(i="none","string"!=typeof o&&(o=window.getSelection?o[0]:o[1]),o=" style=\"background-image: url('"+o+"')\""):o="",a&&(e.classes.add("btn-has-text"),s=''+e.encode(a)+""),i=e.settings.icon?r+"ico "+r+"i-"+i:"",e.aria("role",e.parent()instanceof n?"menuitem":"button"),'
            '},postRender:function(){var e=this;return e.on("click",function(t){t.control===e&&r(t.target,e.getEl())&&(e.showMenu(),t.aria&&e.menu.items()[0].focus())}),e.on("mouseenter",function(t){var n=t.control,r=e.parent(),o;n&&r&&n instanceof i&&n.parent()==r&&(r.items().filter("MenuButton").each(function(e){e.hideMenu&&e!=n&&(e.menu&&e.menu.visible()&&(o=!0),e.hideMenu())}),o&&(n.focus(),n.showMenu()))}),e._super()},bindStates:function(){var e=this;return e.state.on("change:menu",function(){e.menu&&e.menu.remove(),e.menu=null}),e._super()},remove:function(){this._super(),this.menu&&this.menu.remove()}});return i}),r(Ft,[De,be,d,u],function(e,t,n,r){return e.extend({Defaults:{border:0,role:"menuitem"},init:function(e){var t=this,n;t._super(e),e=t.settings,t.classes.add("menu-item"),e.menu&&t.classes.add("menu-item-expand"),e.preview&&t.classes.add("menu-item-preview"),n=t.state.get("text"),"-"!==n&&"|"!==n||(t.classes.add("menu-item-sep"),t.aria("role","separator"),t.state.set("text","-")),e.selectable&&(t.aria("role","menuitemcheckbox"),t.classes.add("menu-item-checkbox"),e.icon="selected"),e.preview||e.selectable||t.classes.add("menu-item-normal"),t.on("mousedown",function(e){e.preventDefault()}),e.menu&&!e.ariaHideMenu&&t.aria("haspopup",!0)},hasMenus:function(){return!!this.settings.menu},showMenu:function(){var e=this,n=e.settings,r,i=e.parent();if(i.items().each(function(t){t!==e&&t.hideMenu()}),n.menu){r=e.menu,r?r.show():(r=n.menu,r.length?r={type:"menu",items:r}:r.type=r.type||"menu",i.settings.itemDefaults&&(r.itemDefaults=i.settings.itemDefaults),r=e.menu=t.create(r).parent(e).renderTo(),r.reflow(),r.on("cancel",function(t){t.stopPropagation(),e.focus(),r.hide()}),r.on("show hide",function(e){e.control.items().each(function(e){e.active(e.settings.selected)})}).fire("show"),r.on("hide",function(t){t.control===r&&e.classes.remove("selected")}),r.submenu=!0),r._parentMenu=i,r.classes.add("menu-sub");var o=r.testMoveRel(e.getEl(),e.isRtl()?["tl-tr","bl-br","tr-tl","br-bl"]:["tr-tl","br-bl","tl-tr","bl-br"]);r.moveRel(e.getEl(),o),r.rel=o,o="menu-sub-"+o,r.classes.remove(r._lastRel).add(o),r._lastRel=o,e.classes.add("selected"),e.aria("expanded",!0)}},hideMenu:function(){var e=this;return e.menu&&(e.menu.items().each(function(e){e.hideMenu&&e.hideMenu()}),e.menu.hide(),e.aria("expanded",!1)),e},renderHtml:function(){function e(e){var t,r,i={};for(i=n.mac?{alt:"⌥",ctrl:"⌘",shift:"⇧",meta:"⌘"}:{meta:"Ctrl"},e=e.split("+"),t=0;t'+("-"!==a?'\xa0":"")+("-"!==a?''+a+"":"")+(c?'
            '+c+"
            ":"")+(i.menu?'
            ':"")+"
            "},postRender:function(){var e=this,t=e.settings,n=t.textStyle;if("function"==typeof n&&(n=n.call(this)),n){var i=e.getEl("text");i&&i.setAttribute("style",n)}return e.on("mouseenter click",function(n){n.control===e&&(t.menu||"click"!==n.type?(e.showMenu(),n.aria&&e.menu.focus(!0)):(e.fire("select"),r.requestAnimationFrame(function(){e.parent().hideAll()})))}),e._super(),e},hover:function(){var e=this;return e.parent().items().each(function(e){e.classes.remove("selected")}),e.classes.toggle("selected",!0),e},active:function(e){return"undefined"!=typeof e&&this.aria("checked",e),this._super(e)},remove:function(){this._super(),this.menu&&this.menu.remove()}})}),r(zt,[g,ye,u],function(e,t,n){return function(r,i){var o=this,a,s=t.classPrefix,l;o.show=function(t,c){function u(){a&&(e(r).append('
            '),c&&c())}return o.hide(),a=!0,t?l=n.setTimeout(u,t):u(),o},o.hide=function(){var e=r.lastChild;return n.clearTimeout(l),e&&-1!=e.className.indexOf("throbber")&&e.parentNode.removeChild(e),a=!1,o}}}),r(Ut,[ke,Ft,zt,m],function(e,t,n,r){return e.extend({Defaults:{defaultType:"menuitem",border:1,layout:"stack",role:"application",bodyRole:"menu",ariaRoot:!0},init:function(e){var t=this;if(e.autohide=!0,e.constrainToViewport=!0,"function"==typeof e.items&&(e.itemsFactory=e.items,e.items=[]),e.itemDefaults)for(var n=e.items,i=n.length;i--;)n[i]=r.extend({},e.itemDefaults,n[i]);t._super(e),t.classes.add("menu")},repaint:function(){return this.classes.toggle("menu-align",!0),this._super(),this.getEl().style.height="",this.getEl("body").style.height="",this},cancel:function(){var e=this;e.hideAll(),e.fire("select")},load:function(){function e(){t.throbber&&(t.throbber.hide(),t.throbber=null)}var t=this,r,i;i=t.settings.itemsFactory,i&&(t.throbber||(t.throbber=new n(t.getEl("body"),!0),0===t.items().length?(t.throbber.show(),t.fire("loading")):t.throbber.show(100,function(){t.items().remove(),t.fire("loading")}),t.on("hide close",e)),t.requestTime=r=(new Date).getTime(),t.settings.itemsFactory(function(n){return 0===n.length?void t.hide():void(t.requestTime===r&&(t.getEl().style.width="",t.getEl("body").style.width="",e(),t.items().remove(),t.getEl("body").innerHTML="",t.add(n),t.renderNew(),t.fire("loaded")))}))},hideAll:function(){var e=this;return this.find("menuitem").exec("hideMenu"),e._super()},preRender:function(){var e=this;return e.items().each(function(t){var n=t.settings;return n.icon||n.image||n.selectable?(e._hasIcons=!0,!1):void 0}),e.settings.itemsFactory&&e.on("postrender",function(){e.settings.itemsFactory&&e.load()}),e._super()}})}),r(Wt,[It,Ut],function(e,t){return e.extend({init:function(e){function t(r){for(var a=0;a0&&(o=r[0].text,n.state.set("value",r[0].value)),n.state.set("menu",r)),n.state.set("text",e.text||o),n.classes.add("listbox"),n.on("select",function(t){var r=t.control;a&&(t.lastControl=a),e.multiple?r.active(!r.active()):n.value(t.control.value()),a=r})},bindStates:function(){function e(e,n){e instanceof t&&e.items().each(function(e){e.hasMenus()||e.active(e.value()===n)})}function n(e,t){var r;if(e)for(var i=0;i
            '},postRender:function(){var e=this;e._super(),e.resizeDragHelper=new t(this._id,{start:function(){e.fire("ResizeStart")},drag:function(t){"both"!=e.settings.direction&&(t.deltaX=0),e.fire("Resize",t)},stop:function(){e.fire("ResizeEnd")}})},remove:function(){return this.resizeDragHelper&&this.resizeDragHelper.destroy(),this._super()}})}),r(qt,[De],function(e){function t(e){var t="";if(e)for(var n=0;n'+e[n]+"";return t}return e.extend({Defaults:{classes:"selectbox",role:"selectbox",options:[]},init:function(e){var t=this;t._super(e),t.settings.size&&(t.size=t.settings.size),t.settings.options&&(t._options=t.settings.options),t.on("keydown",function(e){var n;13==e.keyCode&&(e.preventDefault(),t.parents().reverse().each(function(e){return e.toJSON?(n=e,!1):void 0}),t.fire("submit",{data:n.toJSON()}))})},options:function(e){return arguments.length?(this.state.set("options",e),this):this.state.get("options")},renderHtml:function(){var e=this,n,r="";return n=t(e._options),e.size&&(r=' size = "'+e.size+'"'),'"},bindStates:function(){var e=this;return e.state.on("change:options",function(n){e.getEl().innerHTML=t(n.value)}),e._super()}})}),r(jt,[De,we,pe],function(e,t,n){function r(e,t,n){return t>e&&(e=t),e>n&&(e=n),e}function i(e,t,n){e.setAttribute("aria-"+t,n)}function o(e,t){var r,o,a,s,l,c;"v"==e.settings.orientation?(s="top",a="height",o="h"):(s="left",a="width",o="w"),c=e.getEl("handle"),r=(e.layoutRect()[o]||100)-n.getSize(c)[a],l=r*((t-e._minValue)/(e._maxValue-e._minValue))+"px",c.style[s]=l,c.style.height=e.layoutRect().h+"px",i(c,"valuenow",t),i(c,"valuetext",""+e.settings.previewFilter(t)),i(c,"valuemin",e._minValue),i(c,"valuemax",e._maxValue)}return e.extend({init:function(e){var t=this;e.previewFilter||(e.previewFilter=function(e){return Math.round(100*e)/100}),t._super(e),t.classes.add("slider"),"v"==e.orientation&&t.classes.add("vertical"),t._minValue=e.minValue||0,t._maxValue=e.maxValue||100,t._initValue=t.state.get("value")},renderHtml:function(){var e=this,t=e._id,n=e.classPrefix;return'
            '},reset:function(){this.value(this._initValue).repaint()},postRender:function(){function e(e,t,n){return(n+e)/(t-e)}function i(e,t,n){return n*(t-e)-e}function o(t,n){function o(o){var a;a=s.value(),a=i(t,n,e(t,n,a)+.05*o),a=r(a,t,n),s.value(a),s.fire("dragstart",{value:a}),s.fire("drag",{value:a}),s.fire("dragend",{value:a})}s.on("keydown",function(e){switch(e.keyCode){case 37:case 38:o(-1);break;case 39:case 40:o(1)}})}function a(e,i,o){var a,l,c,p,m;s._dragHelper=new t(s._id,{handle:s._id+"-handle",start:function(e){a=e[u],l=parseInt(s.getEl("handle").style[d],10),c=(s.layoutRect()[h]||100)-n.getSize(o)[f],s.fire("dragstart",{value:m})},drag:function(t){var n=t[u]-a;p=r(l+n,0,c),o.style[d]=p+"px",m=e+p/c*(i-e),s.value(m),s.tooltip().text(""+s.settings.previewFilter(m)).show().moveRel(o,"bc tc"),s.fire("drag",{value:m})},stop:function(){s.tooltip().hide(),s.fire("dragend",{value:m})}})}var s=this,l,c,u,d,f,h;l=s._minValue,c=s._maxValue,"v"==s.settings.orientation?(u="screenY",d="top",f="height",h="h"):(u="screenX",d="left",f="width",h="w"),s._super(),o(l,c,s.getEl("handle")),a(l,c,s.getEl("handle"))},repaint:function(){this._super(),o(this,this.value())},bindStates:function(){var e=this;return e.state.on("change:value",function(t){o(e,t.value)}),e._super()}})}),r(Yt,[De],function(e){return e.extend({renderHtml:function(){var e=this;return e.classes.add("spacer"),e.canFocus=!1,'
            '}})}),r(Xt,[It,pe,g],function(e,t,n){return e.extend({Defaults:{classes:"widget btn splitbtn",role:"button"},repaint:function(){var e=this,r=e.getEl(),i=e.layoutRect(),o,a;return e._super(),o=r.firstChild,a=r.lastChild,n(o).css({width:i.w-t.getSize(a).width,height:i.h-2}),n(a).css({height:i.h-2}),e},activeMenu:function(e){var t=this;n(t.getEl().lastChild).toggleClass(t.classPrefix+"active",e)},renderHtml:function(){var e=this,t=e._id,n=e.classPrefix,r,i=e.state.get("icon"),o=e.state.get("text"),a="";return r=e.settings.image,r?(i="none","string"!=typeof r&&(r=window.getSelection?r[0]:r[1]),r=" style=\"background-image: url('"+r+"')\""):r="",i=e.settings.icon?n+"ico "+n+"i-"+i:"",o&&(e.classes.add("btn-has-text"),a=''+e.encode(o)+""),'
            '},postRender:function(){var e=this,t=e.settings.onclick;return e.on("click",function(e){var n=e.target;if(e.control==this)for(;n;){if(e.aria&&"down"!=e.aria.key||"BUTTON"==n.nodeName&&-1==n.className.indexOf("open"))return e.stopImmediatePropagation(),void(t&&t.call(this,e));n=n.parentNode}}),delete e.settings.onclick,e._super()}})}),r(Kt,[At],function(e){return e.extend({Defaults:{containerClass:"stack-layout",controlClass:"stack-layout-item",endClass:"break"},isNative:function(){return!0}})}),r(Gt,[Ee,g,pe],function(e,t,n){return e.extend({Defaults:{layout:"absolute",defaults:{type:"panel"}},activateTab:function(e){var n;this.activeTabId&&(n=this.getEl(this.activeTabId),t(n).removeClass(this.classPrefix+"active"),n.setAttribute("aria-selected","false")),this.activeTabId="t"+e,n=this.getEl("t"+e),n.setAttribute("aria-selected","true"),t(n).addClass(this.classPrefix+"active"),this.items()[e].show().fire("showtab"),this.reflow(),this.items().each(function(t,n){e!=n&&t.hide()})},renderHtml:function(){var e=this,t=e._layout,n="",r=e.classPrefix;return e.preRender(),t.preRender(e),e.items().each(function(t,i){var o=e._id+"-t"+i;t.aria("role","tabpanel"),t.aria("labelledby",o),n+='"}),'
            '+n+'
            '+t.renderHtml(e)+"
            "},postRender:function(){var e=this;e._super(),e.settings.activeTab=e.settings.activeTab||0,e.activateTab(e.settings.activeTab),this.on("click",function(t){var n=t.target.parentNode;if(t.target.parentNode.id==e._id+"-head")for(var r=n.childNodes.length;r--;)n.childNodes[r]==t.target&&e.activateTab(r)})},initLayoutRect:function(){var e=this,t,r,i;r=n.getSize(e.getEl("head")).width,r=0>r?0:r,i=0,e.items().each(function(e){r=Math.max(r,e.layoutRect().minW),i=Math.max(i,e.layoutRect().minH)}),e.items().each(function(e){e.settings.x=0,e.settings.y=0,e.settings.w=r,e.settings.h=i,e.layoutRect({x:0,y:0,w:r,h:i})});var o=n.getSize(e.getEl("head")).height;return e.settings.minWidth=r,e.settings.minHeight=i+o,t=e._super(),t.deltaH+=o,t.innerH=t.h-t.deltaH,t}})}),r(Jt,[De,m,pe],function(e,t,n){return e.extend({init:function(e){var t=this;t._super(e),t.classes.add("textbox"),e.multiline?t.classes.add("multiline"):(t.on("keydown",function(e){var n;13==e.keyCode&&(e.preventDefault(),t.parents().reverse().each(function(e){return e.toJSON?(n=e,!1):void 0}),t.fire("submit",{data:n.toJSON()}))}),t.on("keyup",function(e){t.state.set("value",e.target.value)}))},repaint:function(){var e=this,t,n,r,i,o=0,a;t=e.getEl().style,n=e._layoutRect,a=e._lastRepaintRect||{};var s=document;return!e.settings.multiline&&s.all&&(!s.documentMode||s.documentMode<=8)&&(t.lineHeight=n.h-o+"px"),r=e.borderBox,i=r.left+r.right+8,o=r.top+r.bottom+(e.settings.multiline?8:0),n.x!==a.x&&(t.left=n.x+"px",a.x=n.x),n.y!==a.y&&(t.top=n.y+"px",a.y=n.y),n.w!==a.w&&(t.width=n.w-i+"px",a.w=n.w),n.h!==a.h&&(t.height=n.h-o+"px",a.h=n.h),e._lastRepaintRect=a,e.fire("repaint",{},!1),e},renderHtml:function(){var e=this,r=e.settings,i,o;return i={id:e._id,hidefocus:"1"},t.each(["rows","spellcheck","maxLength","size","readonly","min","max","step","list","pattern","placeholder","required","multiple"],function(e){i[e]=r[e]}),e.disabled()&&(i.disabled="disabled"),r.subtype&&(i.type=r.subtype),o=n.create(r.multiline?"textarea":"input",i),o.value=e.state.get("value"),o.className=e.classes,o.outerHTML},value:function(e){return arguments.length?(this.state.set("value",e),this):(this.state.get("rendered")&&this.state.set("value",this.getEl().value),this.state.get("value"))},postRender:function(){var e=this;e.getEl().value=e.state.get("value"),e._super(),e.$el.on("change",function(t){e.state.set("value",t.target.value),e.fire("change",t)})},bindStates:function(){var e=this;return e.state.on("change:value",function(t){e.getEl().value!=t.value&&(e.getEl().value=t.value)}),e.state.on("change:disabled",function(t){e.getEl().disabled=t.value}),e._super()},remove:function(){this.$el.off(),this._super()}})}),r(Qt,[],function(){var e=this||window,t=function(){return e.tinymce};return"function"==typeof e.define&&(e.define.amd||e.define("ephox/tinymce",[],t)),{}}),a([l,c,u,d,f,h,m,g,v,y,C,w,N,E,T,A,B,D,L,M,P,H,I,F,j,Y,J,Q,oe,ae,se,le,ue,fe,he,ve,ye,be,Ce,xe,we,Ne,Ee,_e,Se,ke,Te,Re,Ae,Be,De,Le,Me,Pe,Ie,ze,et,tt,nt,rt,ot,at,st,lt,ct,ut,dt,ft,ht,pt,mt,gt,vt,yt,bt,Ct,xt,wt,Nt,Et,_t,St,kt,Tt,Rt,At,Bt,Dt,Lt,Mt,Pt,Ht,Ot,It,Ft,zt,Ut,Wt,Vt,$t,qt,jt,Yt,Xt,Kt,Gt,Jt])}(this); \ No newline at end of file diff --git a/Monitor/wwwroot/assets/plugins/transitionize/dist/transitionize.js b/Monitor/wwwroot/assets/plugins/transitionize/dist/transitionize.js new file mode 100644 index 0000000..1afdaec --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/transitionize/dist/transitionize.js @@ -0,0 +1,275 @@ +;(function(){ + +/** + * Require the given path. + * + * @param {String} path + * @return {Object} exports + * @api public + */ + +function require(path, parent, orig) { + var resolved = require.resolve(path); + + // lookup failed + if (null == resolved) { + orig = orig || path; + parent = parent || 'root'; + var err = new Error('Failed to require "' + orig + '" from "' + parent + '"'); + err.path = orig; + err.parent = parent; + err.require = true; + throw err; + } + + var module = require.modules[resolved]; + + // perform real require() + // by invoking the module's + // registered function + if (!module._resolving && !module.exports) { + var mod = {}; + mod.exports = {}; + mod.client = mod.component = true; + module._resolving = true; + module.call(this, mod.exports, require.relative(resolved), mod); + delete module._resolving; + module.exports = mod.exports; + } + + return module.exports; +} + +/** + * Registered modules. + */ + +require.modules = {}; + +/** + * Registered aliases. + */ + +require.aliases = {}; + +/** + * Resolve `path`. + * + * Lookup: + * + * - PATH/index.js + * - PATH.js + * - PATH + * + * @param {String} path + * @return {String} path or null + * @api private + */ + +require.resolve = function(path) { + if (path.charAt(0) === '/') path = path.slice(1); + + var paths = [ + path, + path + '.js', + path + '.json', + path + '/index.js', + path + '/index.json' + ]; + + for (var i = 0; i < paths.length; i++) { + var path = paths[i]; + if (require.modules.hasOwnProperty(path)) return path; + if (require.aliases.hasOwnProperty(path)) return require.aliases[path]; + } +}; + +/** + * Normalize `path` relative to the current path. + * + * @param {String} curr + * @param {String} path + * @return {String} + * @api private + */ + +require.normalize = function(curr, path) { + var segs = []; + + if ('.' != path.charAt(0)) return path; + + curr = curr.split('/'); + path = path.split('/'); + + for (var i = 0; i < path.length; ++i) { + if ('..' == path[i]) { + curr.pop(); + } else if ('.' != path[i] && '' != path[i]) { + segs.push(path[i]); + } + } + + return curr.concat(segs).join('/'); +}; + +/** + * Register module at `path` with callback `definition`. + * + * @param {String} path + * @param {Function} definition + * @api private + */ + +require.register = function(path, definition) { + require.modules[path] = definition; +}; + +/** + * Alias a module definition. + * + * @param {String} from + * @param {String} to + * @api private + */ + +require.alias = function(from, to) { + if (!require.modules.hasOwnProperty(from)) { + throw new Error('Failed to alias "' + from + '", it does not exist'); + } + require.aliases[to] = from; +}; + +/** + * Return a require function relative to the `parent` path. + * + * @param {String} parent + * @return {Function} + * @api private + */ + +require.relative = function(parent) { + var p = require.normalize(parent, '..'); + + /** + * lastIndexOf helper. + */ + + function lastIndexOf(arr, obj) { + var i = arr.length; + while (i--) { + if (arr[i] === obj) return i; + } + return -1; + } + + /** + * The relative require() itself. + */ + + function localRequire(path) { + var resolved = localRequire.resolve(path); + return require(resolved, parent, path); + } + + /** + * Resolve relative to the parent. + */ + + localRequire.resolve = function(path) { + var c = path.charAt(0); + if ('/' == c) return path.slice(1); + if ('.' == c) return require.normalize(p, path); + + // resolve deps by returning + // the dep in the nearest "deps" + // directory + var segs = parent.split('/'); + var i = lastIndexOf(segs, 'deps') + 1; + if (!i) i = 0; + path = segs.slice(0, i + 1).join('/') + '/deps/' + path; + return path; + }; + + /** + * Check if module is defined at `path`. + */ + + localRequire.exists = function(path) { + return require.modules.hasOwnProperty(localRequire.resolve(path)); + }; + + return localRequire; +}; +require.register("transitionize/transitionize.js", function(exports, require, module){ + +/** + * Transitionize 0.0.3 + * https://github.com/abpetkov/transitionize + * + * Authored by Alexander Petkov + * https://github.com/abpetkov + * + * Copyright 2013, Alexander Petkov + * License: The MIT License (MIT) + * http://opensource.org/licenses/MIT + * + */ + +/** + * Expose `Transitionize`. + */ + +module.exports = Transitionize; + +/** + * Initialize new Transitionize. + * + * @param {Object} element + * @param {Object} props + * @api public + */ + +function Transitionize(element, props) { + if (!(this instanceof Transitionize)) return new Transitionize(element, props); + + this.element = element; + this.props = props || {}; + this.init(); +} + +/** + * Detect if Safari. + * + * @returns {Boolean} + * @api private + */ + +Transitionize.prototype.isSafari = function() { + return (/Safari/).test(navigator.userAgent) && (/Apple Computer/).test(navigator.vendor); +}; + +/** + * Loop though the object and push the keys and values in an array. + * Apply the CSS3 transition to the element and prefix with -webkit- for Safari. + * + * @api private + */ + +Transitionize.prototype.init = function() { + var transitions = []; + + for (var key in this.props) { + transitions.push(key + ' ' + this.props[key]); + } + + this.element.style.transition = transitions.join(', '); + if (this.isSafari()) this.element.style.webkitTransition = transitions.join(', '); +}; +}); +require.alias("transitionize/transitionize.js", "transitionize/index.js");if (typeof exports == "object") { + module.exports = require("transitionize"); +} else if (typeof define == "function" && define.amd) { + define(function(){ return require("transitionize"); }); +} else { + this["Transitionize"] = require("transitionize"); +}})(); \ No newline at end of file diff --git a/Monitor/wwwroot/assets/plugins/transitionize/dist/transitionize.min.js b/Monitor/wwwroot/assets/plugins/transitionize/dist/transitionize.min.js new file mode 100644 index 0000000..424ffeb --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/transitionize/dist/transitionize.min.js @@ -0,0 +1 @@ +(function(){function require(path,parent,orig){var resolved=require.resolve(path);if(null==resolved){orig=orig||path;parent=parent||"root";var err=new Error('Failed to require "'+orig+'" from "'+parent+'"');err.path=orig;err.parent=parent;err.require=true;throw err}var module=require.modules[resolved];if(!module._resolving&&!module.exports){var mod={};mod.exports={};mod.client=mod.component=true;module._resolving=true;module.call(this,mod.exports,require.relative(resolved),mod);delete module._resolving;module.exports=mod.exports}return module.exports}require.modules={};require.aliases={};require.resolve=function(path){if(path.charAt(0)==="/")path=path.slice(1);var paths=[path,path+".js",path+".json",path+"/index.js",path+"/index.json"];for(var i=0;i + + + Transitionize Example Page + + + + +
            + +
            + + \ No newline at end of file diff --git a/Monitor/wwwroot/assets/plugins/transitionize/transitionize.js b/Monitor/wwwroot/assets/plugins/transitionize/transitionize.js new file mode 100644 index 0000000..445424a --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/transitionize/transitionize.js @@ -0,0 +1,64 @@ + +/** + * Transitionize 0.0.3 + * https://github.com/abpetkov/transitionize + * + * Authored by Alexander Petkov + * https://github.com/abpetkov + * + * Copyright 2013, Alexander Petkov + * License: The MIT License (MIT) + * http://opensource.org/licenses/MIT + * + */ + +/** + * Expose `Transitionize`. + */ + +module.exports = Transitionize; + +/** + * Initialize new Transitionize. + * + * @param {Object} element + * @param {Object} props + * @api public + */ + +function Transitionize(element, props) { + if (!(this instanceof Transitionize)) return new Transitionize(element, props); + + this.element = element; + this.props = props || {}; + this.init(); +} + +/** + * Detect if Safari. + * + * @returns {Boolean} + * @api private + */ + +Transitionize.prototype.isSafari = function() { + return (/Safari/).test(navigator.userAgent) && (/Apple Computer/).test(navigator.vendor); +}; + +/** + * Loop though the object and push the keys and values in an array. + * Apply the CSS3 transition to the element and prefix with -webkit- for Safari. + * + * @api private + */ + +Transitionize.prototype.init = function() { + var transitions = []; + + for (var key in this.props) { + transitions.push(key + ' ' + this.props[key]); + } + + this.element.style.transition = transitions.join(', '); + if (this.isSafari()) this.element.style.webkitTransition = transitions.join(', '); +}; \ No newline at end of file diff --git a/Monitor/wwwroot/assets/plugins/waypoints/lib/jquery.waypoints.min.js b/Monitor/wwwroot/assets/plugins/waypoints/lib/jquery.waypoints.min.js new file mode 100644 index 0000000..20e6f62 --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/waypoints/lib/jquery.waypoints.min.js @@ -0,0 +1,7 @@ +/*! +Waypoints - 4.0.0 +Copyright © 2011-2015 Caleb Troughton +Licensed under the MIT license. +https://github.com/imakewebthings/waypoints/blob/master/licenses.txt +*/ +!function(){"use strict";function t(o){if(!o)throw new Error("No options passed to Waypoint constructor");if(!o.element)throw new Error("No element option passed to Waypoint constructor");if(!o.handler)throw new Error("No handler option passed to Waypoint constructor");this.key="waypoint-"+e,this.options=t.Adapter.extend({},t.defaults,o),this.element=this.options.element,this.adapter=new t.Adapter(this.element),this.callback=o.handler,this.axis=this.options.horizontal?"horizontal":"vertical",this.enabled=this.options.enabled,this.triggerPoint=null,this.group=t.Group.findOrCreate({name:this.options.group,axis:this.axis}),this.context=t.Context.findOrCreateByElement(this.options.context),t.offsetAliases[this.options.offset]&&(this.options.offset=t.offsetAliases[this.options.offset]),this.group.add(this),this.context.add(this),i[this.key]=this,e+=1}var e=0,i={};t.prototype.queueTrigger=function(t){this.group.queueTrigger(this,t)},t.prototype.trigger=function(t){this.enabled&&this.callback&&this.callback.apply(this,t)},t.prototype.destroy=function(){this.context.remove(this),this.group.remove(this),delete i[this.key]},t.prototype.disable=function(){return this.enabled=!1,this},t.prototype.enable=function(){return this.context.refresh(),this.enabled=!0,this},t.prototype.next=function(){return this.group.next(this)},t.prototype.previous=function(){return this.group.previous(this)},t.invokeAll=function(t){var e=[];for(var o in i)e.push(i[o]);for(var n=0,r=e.length;r>n;n++)e[n][t]()},t.destroyAll=function(){t.invokeAll("destroy")},t.disableAll=function(){t.invokeAll("disable")},t.enableAll=function(){t.invokeAll("enable")},t.refreshAll=function(){t.Context.refreshAll()},t.viewportHeight=function(){return window.innerHeight||document.documentElement.clientHeight},t.viewportWidth=function(){return document.documentElement.clientWidth},t.adapters=[],t.defaults={context:window,continuous:!0,enabled:!0,group:"default",horizontal:!1,offset:0},t.offsetAliases={"bottom-in-view":function(){return this.context.innerHeight()-this.adapter.outerHeight()},"right-in-view":function(){return this.context.innerWidth()-this.adapter.outerWidth()}},window.Waypoint=t}(),function(){"use strict";function t(t){window.setTimeout(t,1e3/60)}function e(t){this.element=t,this.Adapter=n.Adapter,this.adapter=new this.Adapter(t),this.key="waypoint-context-"+i,this.didScroll=!1,this.didResize=!1,this.oldScroll={x:this.adapter.scrollLeft(),y:this.adapter.scrollTop()},this.waypoints={vertical:{},horizontal:{}},t.waypointContextKey=this.key,o[t.waypointContextKey]=this,i+=1,this.createThrottledScrollHandler(),this.createThrottledResizeHandler()}var i=0,o={},n=window.Waypoint,r=window.onload;e.prototype.add=function(t){var e=t.options.horizontal?"horizontal":"vertical";this.waypoints[e][t.key]=t,this.refresh()},e.prototype.checkEmpty=function(){var t=this.Adapter.isEmptyObject(this.waypoints.horizontal),e=this.Adapter.isEmptyObject(this.waypoints.vertical);t&&e&&(this.adapter.off(".waypoints"),delete o[this.key])},e.prototype.createThrottledResizeHandler=function(){function t(){e.handleResize(),e.didResize=!1}var e=this;this.adapter.on("resize.waypoints",function(){e.didResize||(e.didResize=!0,n.requestAnimationFrame(t))})},e.prototype.createThrottledScrollHandler=function(){function t(){e.handleScroll(),e.didScroll=!1}var e=this;this.adapter.on("scroll.waypoints",function(){(!e.didScroll||n.isTouch)&&(e.didScroll=!0,n.requestAnimationFrame(t))})},e.prototype.handleResize=function(){n.Context.refreshAll()},e.prototype.handleScroll=function(){var t={},e={horizontal:{newScroll:this.adapter.scrollLeft(),oldScroll:this.oldScroll.x,forward:"right",backward:"left"},vertical:{newScroll:this.adapter.scrollTop(),oldScroll:this.oldScroll.y,forward:"down",backward:"up"}};for(var i in e){var o=e[i],n=o.newScroll>o.oldScroll,r=n?o.forward:o.backward;for(var s in this.waypoints[i]){var a=this.waypoints[i][s],l=o.oldScroll=a.triggerPoint,p=l&&h,u=!l&&!h;(p||u)&&(a.queueTrigger(r),t[a.group.id]=a.group)}}for(var c in t)t[c].flushTriggers();this.oldScroll={x:e.horizontal.newScroll,y:e.vertical.newScroll}},e.prototype.innerHeight=function(){return this.element==this.element.window?n.viewportHeight():this.adapter.innerHeight()},e.prototype.remove=function(t){delete this.waypoints[t.axis][t.key],this.checkEmpty()},e.prototype.innerWidth=function(){return this.element==this.element.window?n.viewportWidth():this.adapter.innerWidth()},e.prototype.destroy=function(){var t=[];for(var e in this.waypoints)for(var i in this.waypoints[e])t.push(this.waypoints[e][i]);for(var o=0,n=t.length;n>o;o++)t[o].destroy()},e.prototype.refresh=function(){var t,e=this.element==this.element.window,i=e?void 0:this.adapter.offset(),o={};this.handleScroll(),t={horizontal:{contextOffset:e?0:i.left,contextScroll:e?0:this.oldScroll.x,contextDimension:this.innerWidth(),oldScroll:this.oldScroll.x,forward:"right",backward:"left",offsetProp:"left"},vertical:{contextOffset:e?0:i.top,contextScroll:e?0:this.oldScroll.y,contextDimension:this.innerHeight(),oldScroll:this.oldScroll.y,forward:"down",backward:"up",offsetProp:"top"}};for(var r in t){var s=t[r];for(var a in this.waypoints[r]){var l,h,p,u,c,d=this.waypoints[r][a],f=d.options.offset,w=d.triggerPoint,y=0,g=null==w;d.element!==d.element.window&&(y=d.adapter.offset()[s.offsetProp]),"function"==typeof f?f=f.apply(d):"string"==typeof f&&(f=parseFloat(f),d.options.offset.indexOf("%")>-1&&(f=Math.ceil(s.contextDimension*f/100))),l=s.contextScroll-s.contextOffset,d.triggerPoint=y+l-f,h=w=s.oldScroll,u=h&&p,c=!h&&!p,!g&&u?(d.queueTrigger(s.backward),o[d.group.id]=d.group):!g&&c?(d.queueTrigger(s.forward),o[d.group.id]=d.group):g&&s.oldScroll>=d.triggerPoint&&(d.queueTrigger(s.forward),o[d.group.id]=d.group)}}return n.requestAnimationFrame(function(){for(var t in o)o[t].flushTriggers()}),this},e.findOrCreateByElement=function(t){return e.findByElement(t)||new e(t)},e.refreshAll=function(){for(var t in o)o[t].refresh()},e.findByElement=function(t){return o[t.waypointContextKey]},window.onload=function(){r&&r(),e.refreshAll()},n.requestAnimationFrame=function(e){var i=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||t;i.call(window,e)},n.Context=e}(),function(){"use strict";function t(t,e){return t.triggerPoint-e.triggerPoint}function e(t,e){return e.triggerPoint-t.triggerPoint}function i(t){this.name=t.name,this.axis=t.axis,this.id=this.name+"-"+this.axis,this.waypoints=[],this.clearTriggerQueues(),o[this.axis][this.name]=this}var o={vertical:{},horizontal:{}},n=window.Waypoint;i.prototype.add=function(t){this.waypoints.push(t)},i.prototype.clearTriggerQueues=function(){this.triggerQueues={up:[],down:[],left:[],right:[]}},i.prototype.flushTriggers=function(){for(var i in this.triggerQueues){var o=this.triggerQueues[i],n="up"===i||"left"===i;o.sort(n?e:t);for(var r=0,s=o.length;s>r;r+=1){var a=o[r];(a.options.continuous||r===o.length-1)&&a.trigger([i])}}this.clearTriggerQueues()},i.prototype.next=function(e){this.waypoints.sort(t);var i=n.Adapter.inArray(e,this.waypoints),o=i===this.waypoints.length-1;return o?null:this.waypoints[i+1]},i.prototype.previous=function(e){this.waypoints.sort(t);var i=n.Adapter.inArray(e,this.waypoints);return i?this.waypoints[i-1]:null},i.prototype.queueTrigger=function(t,e){this.triggerQueues[e].push(t)},i.prototype.remove=function(t){var e=n.Adapter.inArray(t,this.waypoints);e>-1&&this.waypoints.splice(e,1)},i.prototype.first=function(){return this.waypoints[0]},i.prototype.last=function(){return this.waypoints[this.waypoints.length-1]},i.findOrCreate=function(t){return o[t.axis][t.name]||new i(t)},n.Group=i}(),function(){"use strict";function t(t){this.$element=e(t)}var e=window.jQuery,i=window.Waypoint;e.each(["innerHeight","innerWidth","off","offset","on","outerHeight","outerWidth","scrollLeft","scrollTop"],function(e,i){t.prototype[i]=function(){var t=Array.prototype.slice.call(arguments);return this.$element[i].apply(this.$element,t)}}),e.each(["extend","inArray","isEmptyObject"],function(i,o){t[o]=e[o]}),i.adapters.push({name:"jquery",Adapter:t}),i.Adapter=t}(),function(){"use strict";function t(t){return function(){var i=[],o=arguments[0];return t.isFunction(arguments[0])&&(o=t.extend({},arguments[1]),o.handler=arguments[0]),this.each(function(){var n=t.extend({},o,{element:this});"string"==typeof n.context&&(n.context=t(this).closest(n.context)[0]),i.push(new e(n))}),i}}var e=window.Waypoint;window.jQuery&&(window.jQuery.fn.waypoint=t(window.jQuery)),window.Zepto&&(window.Zepto.fn.waypoint=t(window.Zepto))}(); \ No newline at end of file diff --git a/Monitor/wwwroot/assets/plugins/waypoints/lib/shortcuts/infinite.js b/Monitor/wwwroot/assets/plugins/waypoints/lib/shortcuts/infinite.js new file mode 100644 index 0000000..72db624 --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/waypoints/lib/shortcuts/infinite.js @@ -0,0 +1,84 @@ +/*! +Waypoints Infinite Scroll Shortcut - 3.1.1 +Copyright © 2011-2015 Caleb Troughton +Licensed under the MIT license. +https://github.com/imakewebthings/waypoints/blog/master/licenses.txt +*/ +(function() { + 'use strict' + + var $ = window.jQuery + var Waypoint = window.Waypoint + + /* http://imakewebthings.com/waypoints/shortcuts/infinite-scroll */ + function Infinite(options) { + this.options = $.extend({}, Infinite.defaults, options) + this.container = this.options.element + if (this.options.container !== 'auto') { + this.container = this.options.container + } + this.$container = $(this.container) + this.$more = $(this.options.more) + + if (this.$more.length) { + this.setupHandler() + this.waypoint = new Waypoint(this.options) + } + } + + /* Private */ + Infinite.prototype.setupHandler = function() { + this.options.handler = $.proxy(function() { + this.options.onBeforePageLoad() + this.destroy() + this.$container.addClass(this.options.loadingClass) + + $.get($(this.options.more).attr('href'), $.proxy(function(data) { + var $data = $($.parseHTML(data)) + var $newMore = $data.find(this.options.more) + + var $items = $data.find(this.options.items) + if (!$items.length) { + $items = $data.filter(this.options.items) + } + + this.$container.append($items) + this.$container.removeClass(this.options.loadingClass) + + if (!$newMore.length) { + $newMore = $data.filter(this.options.more) + } + if ($newMore.length) { + this.$more.replaceWith($newMore) + this.$more = $newMore + this.waypoint = new Waypoint(this.options) + } + else { + this.$more.remove() + } + + this.options.onAfterPageLoad() + }, this)) + }, this) + } + + /* Public */ + Infinite.prototype.destroy = function() { + if (this.waypoint) { + this.waypoint.destroy() + } + } + + Infinite.defaults = { + container: 'auto', + items: '.infinite-item', + more: '.infinite-more-link', + offset: 'bottom-in-view', + loadingClass: 'infinite-loading', + onBeforePageLoad: $.noop, + onAfterPageLoad: $.noop + } + + Waypoint.Infinite = Infinite +}()) +; \ No newline at end of file diff --git a/Monitor/wwwroot/assets/plugins/waypoints/lib/shortcuts/infinite.min.js b/Monitor/wwwroot/assets/plugins/waypoints/lib/shortcuts/infinite.min.js new file mode 100644 index 0000000..4703115 --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/waypoints/lib/shortcuts/infinite.min.js @@ -0,0 +1,7 @@ +/*! +Waypoints Infinite Scroll Shortcut - 3.1.1 +Copyright © 2011-2015 Caleb Troughton +Licensed under the MIT license. +https://github.com/imakewebthings/waypoints/blog/master/licenses.txt +*/ +!function(){"use strict";function t(n){this.options=i.extend({},t.defaults,n),this.container=this.options.element,"auto"!==this.options.container&&(this.container=this.options.container),this.$container=i(this.container),this.$more=i(this.options.more),this.$more.length&&(this.setupHandler(),this.waypoint=new o(this.options))}var i=window.jQuery,o=window.Waypoint;t.prototype.setupHandler=function(){this.options.handler=i.proxy(function(){this.options.onBeforePageLoad(),this.destroy(),this.$container.addClass(this.options.loadingClass),i.get(i(this.options.more).attr("href"),i.proxy(function(t){var n=i(i.parseHTML(t)),e=n.find(this.options.more),s=n.find(this.options.items);s.length||(s=n.filter(this.options.items)),this.$container.append(s),this.$container.removeClass(this.options.loadingClass),e.length||(e=n.filter(this.options.more)),e.length?(this.$more.replaceWith(e),this.$more=e,this.waypoint=new o(this.options)):this.$more.remove(),this.options.onAfterPageLoad()},this))},this)},t.prototype.destroy=function(){this.waypoint&&this.waypoint.destroy()},t.defaults={container:"auto",items:".infinite-item",more:".infinite-more-link",offset:"bottom-in-view",loadingClass:"infinite-loading",onBeforePageLoad:i.noop,onAfterPageLoad:i.noop},o.Infinite=t}(); \ No newline at end of file diff --git a/Monitor/wwwroot/assets/plugins/waypoints/lib/shortcuts/inview.js b/Monitor/wwwroot/assets/plugins/waypoints/lib/shortcuts/inview.js new file mode 100644 index 0000000..3b5bedc --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/waypoints/lib/shortcuts/inview.js @@ -0,0 +1,103 @@ +/*! +Waypoints Inview Shortcut - 3.1.1 +Copyright © 2011-2015 Caleb Troughton +Licensed under the MIT license. +https://github.com/imakewebthings/waypoints/blog/master/licenses.txt +*/ +(function() { + 'use strict' + + function noop() {} + + var Waypoint = window.Waypoint + + /* http://imakewebthings.com/waypoints/shortcuts/inview */ + function Inview(options) { + this.options = Waypoint.Adapter.extend({}, Inview.defaults, options) + this.axis = this.options.horizontal ? 'horizontal' : 'vertical' + this.waypoints = [] + this.createWaypoints() + } + + /* Private */ + Inview.prototype.createWaypoints = function() { + var configs = { + vertical: [{ + down: 'enter', + up: 'exited', + offset: '100%' + }, { + down: 'entered', + up: 'exit', + offset: 'bottom-in-view' + }, { + down: 'exit', + up: 'entered', + offset: 0 + }, { + down: 'exited', + up: 'enter', + offset: function() { + return -this.adapter.outerHeight() + } + }], + horizontal: [{ + right: 'enter', + left: 'exited', + offset: '100%' + }, { + right: 'entered', + left: 'exit', + offset: 'right-in-view' + }, { + right: 'exit', + left: 'entered', + offset: 0 + }, { + right: 'exited', + left: 'enter', + offset: function() { + return -this.adapter.outerWidth() + } + }] + } + + for (var i = 0, end = configs[this.axis].length; i < end; i++) { + var config = configs[this.axis][i] + this.createWaypoint(config) + } + } + + /* Private */ + Inview.prototype.createWaypoint = function(config) { + var self = this + this.waypoints.push(new Waypoint({ + element: this.options.element, + handler: (function(config) { + return function(direction) { + self.options[config[direction]].call(this, direction) + } + }(config)), + offset: config.offset, + horizontal: this.options.horizontal + })) + } + + /* Public */ + Inview.prototype.destroy = function() { + for (var i = 0, end = this.waypoints.length; i < end; i++) { + this.waypoints[i].destroy() + } + this.waypoints = [] + } + + Inview.defaults = { + enter: noop, + entered: noop, + exit: noop, + exited: noop + } + + Waypoint.Inview = Inview +}()) +; \ No newline at end of file diff --git a/Monitor/wwwroot/assets/plugins/waypoints/lib/shortcuts/inview.min.js b/Monitor/wwwroot/assets/plugins/waypoints/lib/shortcuts/inview.min.js new file mode 100644 index 0000000..41d2ea4 --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/waypoints/lib/shortcuts/inview.min.js @@ -0,0 +1,7 @@ +/*! +Waypoints Inview Shortcut - 3.1.1 +Copyright © 2011-2015 Caleb Troughton +Licensed under the MIT license. +https://github.com/imakewebthings/waypoints/blog/master/licenses.txt +*/ +!function(){"use strict";function t(){}function e(t){this.options=i.Adapter.extend({},e.defaults,t),this.axis=this.options.horizontal?"horizontal":"vertical",this.waypoints=[],this.createWaypoints()}var i=window.Waypoint;e.prototype.createWaypoints=function(){for(var t={vertical:[{down:"enter",up:"exited",offset:"100%"},{down:"entered",up:"exit",offset:"bottom-in-view"},{down:"exit",up:"entered",offset:0},{down:"exited",up:"enter",offset:function(){return-this.adapter.outerHeight()}}],horizontal:[{right:"enter",left:"exited",offset:"100%"},{right:"entered",left:"exit",offset:"right-in-view"},{right:"exit",left:"entered",offset:0},{right:"exited",left:"enter",offset:function(){return-this.adapter.outerWidth()}}]},e=0,i=t[this.axis].length;i>e;e++){var o=t[this.axis][e];this.createWaypoint(o)}},e.prototype.createWaypoint=function(t){var e=this;this.waypoints.push(new i({element:this.options.element,handler:function(t){return function(i){e.options[t[i]].call(this,i)}}(t),offset:t.offset,horizontal:this.options.horizontal}))},e.prototype.destroy=function(){for(var t=0,e=this.waypoints.length;e>t;t++)this.waypoints[t].destroy();this.waypoints=[]},e.defaults={enter:t,entered:t,exit:t,exited:t},i.Inview=e}(); \ No newline at end of file diff --git a/Monitor/wwwroot/assets/plugins/waypoints/lib/shortcuts/sticky.js b/Monitor/wwwroot/assets/plugins/waypoints/lib/shortcuts/sticky.js new file mode 100644 index 0000000..81f0e27 --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/waypoints/lib/shortcuts/sticky.js @@ -0,0 +1,65 @@ +/*! +Waypoints Sticky Element Shortcut - 3.1.1 +Copyright © 2011-2015 Caleb Troughton +Licensed under the MIT license. +https://github.com/imakewebthings/waypoints/blog/master/licenses.txt +*/ +(function() { + 'use strict' + + var $ = window.jQuery + var Waypoint = window.Waypoint + + /* http://imakewebthings.com/waypoints/shortcuts/sticky-elements */ + function Sticky(options) { + this.options = $.extend({}, Waypoint.defaults, Sticky.defaults, options) + this.element = this.options.element + this.$element = $(this.element) + this.createWrapper() + this.createWaypoint() + } + + /* Private */ + Sticky.prototype.createWaypoint = function() { + var originalHandler = this.options.handler + + this.waypoint = new Waypoint($.extend({}, this.options, { + element: this.wrapper, + handler: $.proxy(function(direction) { + var shouldBeStuck = this.options.direction.indexOf(direction) > -1 + var wrapperHeight = shouldBeStuck ? this.$element.outerHeight(true) : '' + + this.$wrapper.height(wrapperHeight) + this.$element.toggleClass(this.options.stuckClass, shouldBeStuck) + + if (originalHandler) { + originalHandler.call(this, direction) + } + }, this) + })) + } + + /* Private */ + Sticky.prototype.createWrapper = function() { + this.$element.wrap(this.options.wrapper) + this.$wrapper = this.$element.parent() + this.wrapper = this.$wrapper[0] + } + + /* Public */ + Sticky.prototype.destroy = function() { + if (this.$element.parent()[0] === this.wrapper) { + this.waypoint.destroy() + this.$element.removeClass(this.options.stuckClass).unwrap() + } + } + + Sticky.defaults = { + wrapper: '
            ', + stuckClass: 'stuck', + direction: 'down right' + } + + Waypoint.Sticky = Sticky +}()) +; \ No newline at end of file diff --git a/Monitor/wwwroot/assets/plugins/waypoints/lib/shortcuts/sticky.min.js b/Monitor/wwwroot/assets/plugins/waypoints/lib/shortcuts/sticky.min.js new file mode 100644 index 0000000..545a9c7 --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/waypoints/lib/shortcuts/sticky.min.js @@ -0,0 +1,7 @@ +/*! +Waypoints Sticky Element Shortcut - 3.1.1 +Copyright © 2011-2015 Caleb Troughton +Licensed under the MIT license. +https://github.com/imakewebthings/waypoints/blog/master/licenses.txt +*/ +!function(){"use strict";function t(s){this.options=e.extend({},i.defaults,t.defaults,s),this.element=this.options.element,this.$element=e(this.element),this.createWrapper(),this.createWaypoint()}var e=window.jQuery,i=window.Waypoint;t.prototype.createWaypoint=function(){var t=this.options.handler;this.waypoint=new i(e.extend({},this.options,{element:this.wrapper,handler:e.proxy(function(e){var i=this.options.direction.indexOf(e)>-1,s=i?this.$element.outerHeight(!0):"";this.$wrapper.height(s),this.$element.toggleClass(this.options.stuckClass,i),t&&t.call(this,e)},this)}))},t.prototype.createWrapper=function(){this.$element.wrap(this.options.wrapper),this.$wrapper=this.$element.parent(),this.wrapper=this.$wrapper[0]},t.prototype.destroy=function(){this.$element.parent()[0]===this.wrapper&&(this.waypoint.destroy(),this.$element.removeClass(this.options.stuckClass).unwrap())},t.defaults={wrapper:'
            ',stuckClass:"stuck",direction:"down right"},i.Sticky=t}(); \ No newline at end of file diff --git a/Monitor/wwwroot/assets/plugins/x-editable/css/bootstrap-editable.css b/Monitor/wwwroot/assets/plugins/x-editable/css/bootstrap-editable.css new file mode 100644 index 0000000..eaef0de --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/x-editable/css/bootstrap-editable.css @@ -0,0 +1,663 @@ +/*! X-editable - v1.5.1 +* In-place editing with Twitter Bootstrap, jQuery UI or pure jQuery +* http://github.com/vitalets/x-editable +* Copyright (c) 2013 Vitaliy Potapov; Licensed MIT */ +.editableform { + margin-bottom: 0; /* overwrites bootstrap margin */ +} + +.editableform .control-group { + margin-bottom: 0; /* overwrites bootstrap margin */ + white-space: nowrap; /* prevent wrapping buttons on new line */ + line-height: 20px; /* overwriting bootstrap line-height. See #133 */ +} + +/* + BS3 width:1005 for inputs breaks editable form in popup + See: https://github.com/vitalets/x-editable/issues/393 +*/ +.editableform .form-control { + width: auto; +} + +.editable-buttons { + display: inline-block; /* should be inline to take effect of parent's white-space: nowrap */ + vertical-align: top; + margin-left: 7px; + /* inline-block emulation for IE7*/ + zoom: 1; + *display: inline; +} + +.editable-buttons.editable-buttons-bottom { + display: block; + margin-top: 7px; + margin-left: 0; +} + +.editable-input { + vertical-align: top; + display: inline-block; /* should be inline to take effect of parent's white-space: nowrap */ + width: auto; /* bootstrap-responsive has width: 100% that breakes layout */ + white-space: normal; /* reset white-space decalred in parent*/ + /* display-inline emulation for IE7*/ + zoom: 1; + *display: inline; +} + +.editable-buttons .editable-cancel { + margin-left: 7px; +} + +/*for jquery-ui buttons need set height to look more pretty*/ +.editable-buttons button.ui-button-icon-only { + height: 24px; + width: 30px; +} + +.editableform-loading { + background: url('../img/loading.gif') center center no-repeat; + height: 25px; + width: auto; + min-width: 25px; +} + +.editable-inline .editableform-loading { + background-position: left 5px; +} + + .editable-error-block { + max-width: 300px; + margin: 5px 0 0 0; + width: auto; + white-space: normal; +} + +/*add padding for jquery ui*/ +.editable-error-block.ui-state-error { + padding: 3px; +} + +.editable-error { + color: red; +} + +/* ---- For specific types ---- */ + +.editableform .editable-date { + padding: 0; + margin: 0; + float: left; +} + +/* move datepicker icon to center of add-on button. See https://github.com/vitalets/x-editable/issues/183 */ +.editable-inline .add-on .icon-th { + margin-top: 3px; + margin-left: 1px; +} + + +/* checklist vertical alignment */ +.editable-checklist label input[type="checkbox"], +.editable-checklist label span { + vertical-align: middle; + margin: 0; +} + +.editable-checklist label { + white-space: nowrap; +} + +/* set exact width of textarea to fit buttons toolbar */ +.editable-wysihtml5 { + width: 566px; + height: 250px; +} + +/* clear button shown as link in date inputs */ +.editable-clear { + clear: both; + font-size: 0.9em; + text-decoration: none; + text-align: right; +} + +/* IOS-style clear button for text inputs */ +.editable-clear-x { + background: url('../img/clear.png') center center no-repeat; + display: block; + width: 13px; + height: 13px; + position: absolute; + opacity: 0.6; + z-index: 100; + + top: 50%; + right: 6px; + margin-top: -6px; + +} + +.editable-clear-x:hover { + opacity: 1; +} + +.editable-pre-wrapped { + white-space: pre-wrap; +} +.editable-container.editable-popup { + max-width: none !important; /* without this rule poshytip/tooltip does not stretch */ +} + +.editable-container.popover { + width: auto; /* without this rule popover does not stretch */ +} + +.editable-container.editable-inline { + display: inline-block; + vertical-align: middle; + width: auto; + /* inline-block emulation for IE7*/ + zoom: 1; + *display: inline; +} + +.editable-container.ui-widget { + font-size: inherit; /* jqueryui widget font 1.1em too big, overwrite it */ + z-index: 9990; /* should be less than select2 dropdown z-index to close dropdown first when click */ +} +.editable-click, +a.editable-click, +a.editable-click:hover { + text-decoration: none; + border-bottom: dashed 1px #0088cc; +} + +.editable-click.editable-disabled, +a.editable-click.editable-disabled, +a.editable-click.editable-disabled:hover { + color: #585858; + cursor: default; + border-bottom: none; +} + +.editable-empty, .editable-empty:hover, .editable-empty:focus{ + font-style: italic; + color: #DD1144; + /* border-bottom: none; */ + text-decoration: none; +} + +.editable-unsaved { + font-weight: bold; +} + +.editable-unsaved:after { +/* content: '*'*/ +} + +.editable-bg-transition { + -webkit-transition: background-color 1400ms ease-out; + -moz-transition: background-color 1400ms ease-out; + -o-transition: background-color 1400ms ease-out; + -ms-transition: background-color 1400ms ease-out; + transition: background-color 1400ms ease-out; +} + +/*see https://github.com/vitalets/x-editable/issues/139 */ +.form-horizontal .editable +{ + padding-top: 5px; + display:inline-block; +} + + +/*! + * Datepicker for Bootstrap + * + * Copyright 2012 Stefan Petre + * Improvements by Andrew Rowls + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + */ +.datepicker { + padding: 4px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + direction: ltr; + /*.dow { + border-top: 1px solid #ddd !important; + }*/ + +} +.datepicker-inline { + width: 220px; +} +.datepicker.datepicker-rtl { + direction: rtl; +} +.datepicker.datepicker-rtl table tr td span { + float: right; +} +.datepicker-dropdown { + top: 0; + left: 0; +} +.datepicker-dropdown:before { + content: ''; + display: inline-block; + border-left: 7px solid transparent; + border-right: 7px solid transparent; + border-bottom: 7px solid #ccc; + border-bottom-color: rgba(0, 0, 0, 0.2); + position: absolute; + top: -7px; + left: 6px; +} +.datepicker-dropdown:after { + content: ''; + display: inline-block; + border-left: 6px solid transparent; + border-right: 6px solid transparent; + border-bottom: 6px solid #ffffff; + position: absolute; + top: -6px; + left: 7px; +} +.datepicker > div { + display: none; +} +.datepicker.days div.datepicker-days { + display: block; +} +.datepicker.months div.datepicker-months { + display: block; +} +.datepicker.years div.datepicker-years { + display: block; +} +.datepicker table { + margin: 0; +} +.datepicker td, +.datepicker th { + text-align: center; + width: 20px; + height: 20px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + border: none; +} +.table-striped .datepicker table tr td, +.table-striped .datepicker table tr th { + background-color: transparent; +} +.datepicker table tr td.day:hover { + background: #eeeeee; + cursor: pointer; +} +.datepicker table tr td.old, +.datepicker table tr td.new { + color: #999999; +} +.datepicker table tr td.disabled, +.datepicker table tr td.disabled:hover { + background: none; + color: #999999; + cursor: default; +} +.datepicker table tr td.today, +.datepicker table tr td.today:hover, +.datepicker table tr td.today.disabled, +.datepicker table tr td.today.disabled:hover { + background-color: #fde19a; + background-image: -moz-linear-gradient(top, #fdd49a, #fdf59a); + background-image: -ms-linear-gradient(top, #fdd49a, #fdf59a); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fdd49a), to(#fdf59a)); + background-image: -webkit-linear-gradient(top, #fdd49a, #fdf59a); + background-image: -o-linear-gradient(top, #fdd49a, #fdf59a); + background-image: linear-gradient(top, #fdd49a, #fdf59a); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fdd49a', endColorstr='#fdf59a', GradientType=0); + border-color: #fdf59a #fdf59a #fbed50; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + color: #000; +} +.datepicker table tr td.today:hover, +.datepicker table tr td.today:hover:hover, +.datepicker table tr td.today.disabled:hover, +.datepicker table tr td.today.disabled:hover:hover, +.datepicker table tr td.today:active, +.datepicker table tr td.today:hover:active, +.datepicker table tr td.today.disabled:active, +.datepicker table tr td.today.disabled:hover:active, +.datepicker table tr td.today.active, +.datepicker table tr td.today:hover.active, +.datepicker table tr td.today.disabled.active, +.datepicker table tr td.today.disabled:hover.active, +.datepicker table tr td.today.disabled, +.datepicker table tr td.today:hover.disabled, +.datepicker table tr td.today.disabled.disabled, +.datepicker table tr td.today.disabled:hover.disabled, +.datepicker table tr td.today[disabled], +.datepicker table tr td.today:hover[disabled], +.datepicker table tr td.today.disabled[disabled], +.datepicker table tr td.today.disabled:hover[disabled] { + background-color: #fdf59a; +} +.datepicker table tr td.today:active, +.datepicker table tr td.today:hover:active, +.datepicker table tr td.today.disabled:active, +.datepicker table tr td.today.disabled:hover:active, +.datepicker table tr td.today.active, +.datepicker table tr td.today:hover.active, +.datepicker table tr td.today.disabled.active, +.datepicker table tr td.today.disabled:hover.active { + background-color: #fbf069 \9; +} +.datepicker table tr td.today:hover:hover { + color: #000; +} +.datepicker table tr td.today.active:hover { + color: #fff; +} +.datepicker table tr td.range, +.datepicker table tr td.range:hover, +.datepicker table tr td.range.disabled, +.datepicker table tr td.range.disabled:hover { + background: #eeeeee; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +.datepicker table tr td.range.today, +.datepicker table tr td.range.today:hover, +.datepicker table tr td.range.today.disabled, +.datepicker table tr td.range.today.disabled:hover { + background-color: #f3d17a; + background-image: -moz-linear-gradient(top, #f3c17a, #f3e97a); + background-image: -ms-linear-gradient(top, #f3c17a, #f3e97a); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f3c17a), to(#f3e97a)); + background-image: -webkit-linear-gradient(top, #f3c17a, #f3e97a); + background-image: -o-linear-gradient(top, #f3c17a, #f3e97a); + background-image: linear-gradient(top, #f3c17a, #f3e97a); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f3c17a', endColorstr='#f3e97a', GradientType=0); + border-color: #f3e97a #f3e97a #edde34; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +.datepicker table tr td.range.today:hover, +.datepicker table tr td.range.today:hover:hover, +.datepicker table tr td.range.today.disabled:hover, +.datepicker table tr td.range.today.disabled:hover:hover, +.datepicker table tr td.range.today:active, +.datepicker table tr td.range.today:hover:active, +.datepicker table tr td.range.today.disabled:active, +.datepicker table tr td.range.today.disabled:hover:active, +.datepicker table tr td.range.today.active, +.datepicker table tr td.range.today:hover.active, +.datepicker table tr td.range.today.disabled.active, +.datepicker table tr td.range.today.disabled:hover.active, +.datepicker table tr td.range.today.disabled, +.datepicker table tr td.range.today:hover.disabled, +.datepicker table tr td.range.today.disabled.disabled, +.datepicker table tr td.range.today.disabled:hover.disabled, +.datepicker table tr td.range.today[disabled], +.datepicker table tr td.range.today:hover[disabled], +.datepicker table tr td.range.today.disabled[disabled], +.datepicker table tr td.range.today.disabled:hover[disabled] { + background-color: #f3e97a; +} +.datepicker table tr td.range.today:active, +.datepicker table tr td.range.today:hover:active, +.datepicker table tr td.range.today.disabled:active, +.datepicker table tr td.range.today.disabled:hover:active, +.datepicker table tr td.range.today.active, +.datepicker table tr td.range.today:hover.active, +.datepicker table tr td.range.today.disabled.active, +.datepicker table tr td.range.today.disabled:hover.active { + background-color: #efe24b \9; +} +.datepicker table tr td.selected, +.datepicker table tr td.selected:hover, +.datepicker table tr td.selected.disabled, +.datepicker table tr td.selected.disabled:hover { + background-color: #9e9e9e; + background-image: -moz-linear-gradient(top, #b3b3b3, #808080); + background-image: -ms-linear-gradient(top, #b3b3b3, #808080); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#b3b3b3), to(#808080)); + background-image: -webkit-linear-gradient(top, #b3b3b3, #808080); + background-image: -o-linear-gradient(top, #b3b3b3, #808080); + background-image: linear-gradient(top, #b3b3b3, #808080); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#b3b3b3', endColorstr='#808080', GradientType=0); + border-color: #808080 #808080 #595959; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} +.datepicker table tr td.selected:hover, +.datepicker table tr td.selected:hover:hover, +.datepicker table tr td.selected.disabled:hover, +.datepicker table tr td.selected.disabled:hover:hover, +.datepicker table tr td.selected:active, +.datepicker table tr td.selected:hover:active, +.datepicker table tr td.selected.disabled:active, +.datepicker table tr td.selected.disabled:hover:active, +.datepicker table tr td.selected.active, +.datepicker table tr td.selected:hover.active, +.datepicker table tr td.selected.disabled.active, +.datepicker table tr td.selected.disabled:hover.active, +.datepicker table tr td.selected.disabled, +.datepicker table tr td.selected:hover.disabled, +.datepicker table tr td.selected.disabled.disabled, +.datepicker table tr td.selected.disabled:hover.disabled, +.datepicker table tr td.selected[disabled], +.datepicker table tr td.selected:hover[disabled], +.datepicker table tr td.selected.disabled[disabled], +.datepicker table tr td.selected.disabled:hover[disabled] { + background-color: #808080; +} +.datepicker table tr td.selected:active, +.datepicker table tr td.selected:hover:active, +.datepicker table tr td.selected.disabled:active, +.datepicker table tr td.selected.disabled:hover:active, +.datepicker table tr td.selected.active, +.datepicker table tr td.selected:hover.active, +.datepicker table tr td.selected.disabled.active, +.datepicker table tr td.selected.disabled:hover.active { + background-color: #666666 \9; +} +.datepicker table tr td.active, +.datepicker table tr td.active:hover, +.datepicker table tr td.active.disabled, +.datepicker table tr td.active.disabled:hover { + background-color: #006dcc; + background-image: -moz-linear-gradient(top, #0088cc, #0044cc); + background-image: -ms-linear-gradient(top, #0088cc, #0044cc); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); + background-image: -webkit-linear-gradient(top, #0088cc, #0044cc); + background-image: -o-linear-gradient(top, #0088cc, #0044cc); + background-image: linear-gradient(top, #0088cc, #0044cc); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0); + border-color: #0044cc #0044cc #002a80; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} +.datepicker table tr td.active:hover, +.datepicker table tr td.active:hover:hover, +.datepicker table tr td.active.disabled:hover, +.datepicker table tr td.active.disabled:hover:hover, +.datepicker table tr td.active:active, +.datepicker table tr td.active:hover:active, +.datepicker table tr td.active.disabled:active, +.datepicker table tr td.active.disabled:hover:active, +.datepicker table tr td.active.active, +.datepicker table tr td.active:hover.active, +.datepicker table tr td.active.disabled.active, +.datepicker table tr td.active.disabled:hover.active, +.datepicker table tr td.active.disabled, +.datepicker table tr td.active:hover.disabled, +.datepicker table tr td.active.disabled.disabled, +.datepicker table tr td.active.disabled:hover.disabled, +.datepicker table tr td.active[disabled], +.datepicker table tr td.active:hover[disabled], +.datepicker table tr td.active.disabled[disabled], +.datepicker table tr td.active.disabled:hover[disabled] { + background-color: #0044cc; +} +.datepicker table tr td.active:active, +.datepicker table tr td.active:hover:active, +.datepicker table tr td.active.disabled:active, +.datepicker table tr td.active.disabled:hover:active, +.datepicker table tr td.active.active, +.datepicker table tr td.active:hover.active, +.datepicker table tr td.active.disabled.active, +.datepicker table tr td.active.disabled:hover.active { + background-color: #003399 \9; +} +.datepicker table tr td span { + display: block; + width: 23%; + height: 54px; + line-height: 54px; + float: left; + margin: 1%; + cursor: pointer; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.datepicker table tr td span:hover { + background: #eeeeee; +} +.datepicker table tr td span.disabled, +.datepicker table tr td span.disabled:hover { + background: none; + color: #999999; + cursor: default; +} +.datepicker table tr td span.active, +.datepicker table tr td span.active:hover, +.datepicker table tr td span.active.disabled, +.datepicker table tr td span.active.disabled:hover { + background-color: #006dcc; + background-image: -moz-linear-gradient(top, #0088cc, #0044cc); + background-image: -ms-linear-gradient(top, #0088cc, #0044cc); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); + background-image: -webkit-linear-gradient(top, #0088cc, #0044cc); + background-image: -o-linear-gradient(top, #0088cc, #0044cc); + background-image: linear-gradient(top, #0088cc, #0044cc); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0); + border-color: #0044cc #0044cc #002a80; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} +.datepicker table tr td span.active:hover, +.datepicker table tr td span.active:hover:hover, +.datepicker table tr td span.active.disabled:hover, +.datepicker table tr td span.active.disabled:hover:hover, +.datepicker table tr td span.active:active, +.datepicker table tr td span.active:hover:active, +.datepicker table tr td span.active.disabled:active, +.datepicker table tr td span.active.disabled:hover:active, +.datepicker table tr td span.active.active, +.datepicker table tr td span.active:hover.active, +.datepicker table tr td span.active.disabled.active, +.datepicker table tr td span.active.disabled:hover.active, +.datepicker table tr td span.active.disabled, +.datepicker table tr td span.active:hover.disabled, +.datepicker table tr td span.active.disabled.disabled, +.datepicker table tr td span.active.disabled:hover.disabled, +.datepicker table tr td span.active[disabled], +.datepicker table tr td span.active:hover[disabled], +.datepicker table tr td span.active.disabled[disabled], +.datepicker table tr td span.active.disabled:hover[disabled] { + background-color: #0044cc; +} +.datepicker table tr td span.active:active, +.datepicker table tr td span.active:hover:active, +.datepicker table tr td span.active.disabled:active, +.datepicker table tr td span.active.disabled:hover:active, +.datepicker table tr td span.active.active, +.datepicker table tr td span.active:hover.active, +.datepicker table tr td span.active.disabled.active, +.datepicker table tr td span.active.disabled:hover.active { + background-color: #003399 \9; +} +.datepicker table tr td span.old, +.datepicker table tr td span.new { + color: #999999; +} +.datepicker th.datepicker-switch { + width: 145px; +} +.datepicker thead tr:first-child th, +.datepicker tfoot tr th { + cursor: pointer; +} +.datepicker thead tr:first-child th:hover, +.datepicker tfoot tr th:hover { + background: #eeeeee; +} +.datepicker .cw { + font-size: 10px; + width: 12px; + padding: 0 2px 0 5px; + vertical-align: middle; +} +.datepicker thead tr:first-child th.cw { + cursor: default; + background-color: transparent; +} +.input-append.date .add-on i, +.input-prepend.date .add-on i { + display: block; + cursor: pointer; + width: 16px; + height: 16px; +} +.input-daterange input { + text-align: center; +} +.input-daterange input:first-child { + -webkit-border-radius: 3px 0 0 3px; + -moz-border-radius: 3px 0 0 3px; + border-radius: 3px 0 0 3px; +} +.input-daterange input:last-child { + -webkit-border-radius: 0 3px 3px 0; + -moz-border-radius: 0 3px 3px 0; + border-radius: 0 3px 3px 0; +} +.input-daterange .add-on { + display: inline-block; + width: auto; + min-width: 16px; + height: 18px; + padding: 4px 5px; + font-weight: normal; + line-height: 18px; + text-align: center; + text-shadow: 0 1px 0 #ffffff; + vertical-align: middle; + background-color: #eeeeee; + border: 1px solid #ccc; + margin-left: -5px; + margin-right: -5px; +} diff --git a/Monitor/wwwroot/assets/plugins/x-editable/img/clear.png b/Monitor/wwwroot/assets/plugins/x-editable/img/clear.png new file mode 100644 index 0000000..580b52a Binary files /dev/null and b/Monitor/wwwroot/assets/plugins/x-editable/img/clear.png differ diff --git a/Monitor/wwwroot/assets/plugins/x-editable/img/loading.gif b/Monitor/wwwroot/assets/plugins/x-editable/img/loading.gif new file mode 100644 index 0000000..5b33f7e Binary files /dev/null and b/Monitor/wwwroot/assets/plugins/x-editable/img/loading.gif differ diff --git a/Monitor/wwwroot/assets/plugins/x-editable/js/bootstrap-editable.js b/Monitor/wwwroot/assets/plugins/x-editable/js/bootstrap-editable.js new file mode 100644 index 0000000..dd81385 --- /dev/null +++ b/Monitor/wwwroot/assets/plugins/x-editable/js/bootstrap-editable.js @@ -0,0 +1,6807 @@ +/*! X-editable - v1.5.1 +* In-place editing with Twitter Bootstrap, jQuery UI or pure jQuery +* http://github.com/vitalets/x-editable +* Copyright (c) 2013 Vitaliy Potapov; Licensed MIT */ +/** +Form with single input element, two buttons and two states: normal/loading. +Applied as jQuery method to DIV tag (not to form tag!). This is because form can be in loading state when spinner shown. +Editableform is linked with one of input types, e.g. 'text', 'select' etc. + +@class editableform +@uses text +@uses textarea +**/ +(function ($) { + "use strict"; + + var EditableForm = function (div, options) { + this.options = $.extend({}, $.fn.editableform.defaults, options); + this.$div = $(div); //div, containing form. Not form tag. Not editable-element. + if(!this.options.scope) { + this.options.scope = this; + } + //nothing shown after init + }; + + EditableForm.prototype = { + constructor: EditableForm, + initInput: function() { //called once + //take input from options (as it is created in editable-element) + this.input = this.options.input; + + //set initial value + //todo: may be add check: typeof str === 'string' ? + this.value = this.input.str2value(this.options.value); + + //prerender: get input.$input + this.input.prerender(); + }, + initTemplate: function() { + this.$form = $($.fn.editableform.template); + }, + initButtons: function() { + var $btn = this.$form.find('.editable-buttons'); + $btn.append($.fn.editableform.buttons); + if(this.options.showbuttons === 'bottom') { + $btn.addClass('editable-buttons-bottom'); + } + }, + /** + Renders editableform + + @method render + **/ + render: function() { + //init loader + this.$loading = $($.fn.editableform.loading); + this.$div.empty().append(this.$loading); + + //init form template and buttons + this.initTemplate(); + if(this.options.showbuttons) { + this.initButtons(); + } else { + this.$form.find('.editable-buttons').remove(); + } + + //show loading state + this.showLoading(); + + //flag showing is form now saving value to server. + //It is needed to wait when closing form. + this.isSaving = false; + + /** + Fired when rendering starts + @event rendering + @param {Object} event event object + **/ + this.$div.triggerHandler('rendering'); + + //init input + this.initInput(); + + //append input to form + this.$form.find('div.editable-input').append(this.input.$tpl); + + //append form to container + this.$div.append(this.$form); + + //render input + $.when(this.input.render()) + .then($.proxy(function () { + //setup input to submit automatically when no buttons shown + if(!this.options.showbuttons) { + this.input.autosubmit(); + } + + //attach 'cancel' handler + this.$form.find('.editable-cancel').click($.proxy(this.cancel, this)); + + if(this.input.error) { + this.error(this.input.error); + this.$form.find('.editable-submit').attr('disabled', true); + this.input.$input.attr('disabled', true); + //prevent form from submitting + this.$form.submit(function(e){ e.preventDefault(); }); + } else { + this.error(false); + this.input.$input.removeAttr('disabled'); + this.$form.find('.editable-submit').removeAttr('disabled'); + var value = (this.value === null || this.value === undefined || this.value === '') ? this.options.defaultValue : this.value; + this.input.value2input(value); + //attach submit handler + this.$form.submit($.proxy(this.submit, this)); + } + + /** + Fired when form is rendered + @event rendered + @param {Object} event event object + **/ + this.$div.triggerHandler('rendered'); + + this.showForm(); + + //call postrender method to perform actions required visibility of form + if(this.input.postrender) { + this.input.postrender(); + } + }, this)); + }, + cancel: function() { + /** + Fired when form was cancelled by user + @event cancel + @param {Object} event event object + **/ + this.$div.triggerHandler('cancel'); + }, + showLoading: function() { + var w, h; + if(this.$form) { + //set loading size equal to form + w = this.$form.outerWidth(); + h = this.$form.outerHeight(); + if(w) { + this.$loading.width(w); + } + if(h) { + this.$loading.height(h); + } + this.$form.hide(); + } else { + //stretch loading to fill container width + w = this.$loading.parent().width(); + if(w) { + this.$loading.width(w); + } + } + this.$loading.show(); + }, + + showForm: function(activate) { + this.$loading.hide(); + this.$form.show(); + if(activate !== false) { + this.input.activate(); + } + /** + Fired when form is shown + @event show + @param {Object} event event object + **/ + this.$div.triggerHandler('show'); + }, + + error: function(msg) { + var $group = this.$form.find('.control-group'), + $block = this.$form.find('.editable-error-block'), + lines; + + if(msg === false) { + $group.removeClass($.fn.editableform.errorGroupClass); + $block.removeClass($.fn.editableform.errorBlockClass).empty().hide(); + } else { + //convert newline to
            for more pretty error display + if(msg) { + lines = (''+msg).split('\n'); + for (var i = 0; i < lines.length; i++) { + lines[i] = $('
            ').text(lines[i]).html(); + } + msg = lines.join('
            '); + } + $group.addClass($.fn.editableform.errorGroupClass); + $block.addClass($.fn.editableform.errorBlockClass).html(msg).show(); + } + }, + + submit: function(e) { + e.stopPropagation(); + e.preventDefault(); + + //get new value from input + var newValue = this.input.input2value(); + + //validation: if validate returns string or truthy value - means error + //if returns object like {newValue: '...'} => submitted value is reassigned to it + var error = this.validate(newValue); + if ($.type(error) === 'object' && error.newValue !== undefined) { + newValue = error.newValue; + this.input.value2input(newValue); + if(typeof error.msg === 'string') { + this.error(error.msg); + this.showForm(); + return; + } + } else if (error) { + this.error(error); + this.showForm(); + return; + } + + //if value not changed --> trigger 'nochange' event and return + /*jslint eqeq: true*/ + if (!this.options.savenochange && this.input.value2str(newValue) == this.input.value2str(this.value)) { + /*jslint eqeq: false*/ + /** + Fired when value not changed but form is submitted. Requires savenochange = false. + @event nochange + @param {Object} event event object + **/ + this.$div.triggerHandler('nochange'); + return; + } + + //convert value for submitting to server + var submitValue = this.input.value2submit(newValue); + + this.isSaving = true; + + //sending data to server + $.when(this.save(submitValue)) + .done($.proxy(function(response) { + this.isSaving = false; + + //run success callback + var res = typeof this.options.success === 'function' ? this.options.success.call(this.options.scope, response, newValue) : null; + + //if success callback returns false --> keep form open and do not activate input + if(res === false) { + this.error(false); + this.showForm(false); + return; + } + + //if success callback returns string --> keep form open, show error and activate input + if(typeof res === 'string') { + this.error(res); + this.showForm(); + return; + } + + //if success callback returns object like {newValue: } --> use that value instead of submitted + //it is usefull if you want to chnage value in url-function + if(res && typeof res === 'object' && res.hasOwnProperty('newValue')) { + newValue = res.newValue; + } + + //clear error message + this.error(false); + this.value = newValue; + /** + Fired when form is submitted + @event save + @param {Object} event event object + @param {Object} params additional params + @param {mixed} params.newValue raw new value + @param {mixed} params.submitValue submitted value as string + @param {Object} params.response ajax response + + @example + $('#form-div').on('save'), function(e, params){ + if(params.newValue === 'username') {...} + }); + **/ + this.$div.triggerHandler('save', {newValue: newValue, submitValue: submitValue, response: response}); + }, this)) + .fail($.proxy(function(xhr) { + this.isSaving = false; + + var msg; + if(typeof this.options.error === 'function') { + msg = this.options.error.call(this.options.scope, xhr, newValue); + } else { + msg = typeof xhr === 'string' ? xhr : xhr.responseText || xhr.statusText || 'Unknown error!'; + } + + this.error(msg); + this.showForm(); + }, this)); + }, + + save: function(submitValue) { + //try parse composite pk defined as json string in data-pk + this.options.pk = $.fn.editableutils.tryParseJson(this.options.pk, true); + + var pk = (typeof this.options.pk === 'function') ? this.options.pk.call(this.options.scope) : this.options.pk, + /* + send on server in following cases: + 1. url is function + 2. url is string AND (pk defined OR send option = always) + */ + send = !!(typeof this.options.url === 'function' || (this.options.url && ((this.options.send === 'always') || (this.options.send === 'auto' && pk !== null && pk !== undefined)))), + params; + + if (send) { //send to server + this.showLoading(); + + //standard params + params = { + name: this.options.name || '', + value: submitValue, + pk: pk + }; + + //additional params + if(typeof this.options.params === 'function') { + params = this.options.params.call(this.options.scope, params); + } else { + //try parse json in single quotes (from data-params attribute) + this.options.params = $.fn.editableutils.tryParseJson(this.options.params, true); + $.extend(params, this.options.params); + } + + if(typeof this.options.url === 'function') { //user's function + return this.options.url.call(this.options.scope, params); + } else { + //send ajax to server and return deferred object + return $.ajax($.extend({ + url : this.options.url, + data : params, + type : 'POST' + }, this.options.ajaxOptions)); + } + } + }, + + validate: function (value) { + if (value === undefined) { + value = this.value; + } + if (typeof this.options.validate === 'function') { + return this.options.validate.call(this.options.scope, value); + } + }, + + option: function(key, value) { + if(key in this.options) { + this.options[key] = value; + } + + if(key === 'value') { + this.setValue(value); + } + + //do not pass option to input as it is passed in editable-element + }, + + setValue: function(value, convertStr) { + if(convertStr) { + this.value = this.input.str2value(value); + } else { + this.value = value; + } + + //if form is visible, update input + if(this.$form && this.$form.is(':visible')) { + this.input.value2input(this.value); + } + } + }; + + /* + Initialize editableform. Applied to jQuery object. + + @method $().editableform(options) + @params {Object} options + @example + var $form = $('<div>').editableform({ + type: 'text', + name: 'username', + url: '/post', + value: 'vitaliy' + }); + + //to display form you should call 'render' method + $form.editableform('render'); + */ + $.fn.editableform = function (option) { + var args = arguments; + return this.each(function () { + var $this = $(this), + data = $this.data('editableform'), + options = typeof option === 'object' && option; + if (!data) { + $this.data('editableform', (data = new EditableForm(this, options))); + } + + if (typeof option === 'string') { //call method + data[option].apply(data, Array.prototype.slice.call(args, 1)); + } + }); + }; + + //keep link to constructor to allow inheritance + $.fn.editableform.Constructor = EditableForm; + + //defaults + $.fn.editableform.defaults = { + /* see also defaults for input */ + + /** + Type of input. Can be text|textarea|select|date|checklist + + @property type + @type string + @default 'text' + **/ + type: 'text', + /** + Url for submit, e.g. '/post' + If function - it will be called instead of ajax. Function should return deferred object to run fail/done callbacks. + + @property url + @type string|function + @default null + @example + url: function(params) { + var d = new $.Deferred; + if(params.value === 'abc') { + return d.reject('error message'); //returning error via deferred object + } else { + //async saving data in js model + someModel.asyncSaveMethod({ + ..., + success: function(){ + d.resolve(); + } + }); + return d.promise(); + } + } + **/ + url:null, + /** + Additional params for submit. If defined as object - it is **appended** to original ajax data (pk, name and value). + If defined as function - returned object **overwrites** original ajax data. + @example + params: function(params) { + //originally params contain pk, name and value + params.a = 1; + return params; + } + + @property params + @type object|function + @default null + **/ + params:null, + /** + Name of field. Will be submitted on server. Can be taken from id attribute + + @property name + @type string + @default null + **/ + name: null, + /** + Primary key of editable object (e.g. record id in database). For composite keys use object, e.g. {id: 1, lang: 'en'}. + Can be calculated dynamically via function. + + @property pk + @type string|object|function + @default null + **/ + pk: null, + /** + Initial value. If not defined - will be taken from element's content. + For __select__ type should be defined (as it is ID of shown text). + + @property value + @type string|object + @default null + **/ + value: null, + /** + Value that will be displayed in input if original field value is empty (`null|undefined|''`). + + @property defaultValue + @type string|object + @default null + @since 1.4.6 + **/ + defaultValue: null, + /** + Strategy for sending data on server. Can be `auto|always|never`. + When 'auto' data will be sent on server **only if pk and url defined**, otherwise new value will be stored locally. + + @property send + @type string + @default 'auto' + **/ + send: 'auto', + /** + Function for client-side validation. If returns string - means validation not passed and string showed as error. + Since 1.5.1 you can modify submitted value by returning object from `validate`: + `{newValue: '...'}` or `{newValue: '...', msg: '...'}` + + @property validate + @type function + @default null + @example + validate: function(value) { + if($.trim(value) == '') { + return 'This field is required'; + } + } + **/ + validate: null, + /** + Success callback. Called when value successfully sent on server and **response status = 200**. + Usefull to work with json response. For example, if your backend response can be {success: true} + or {success: false, msg: "server error"} you can check it inside this callback. + If it returns **string** - means error occured and string is shown as error message. + If it returns **object like** {newValue: <something>} - it overwrites value, submitted by user. + Otherwise newValue simply rendered into element. + + @property success + @type function + @default null + @example + success: function(response, newValue) { + if(!response.success) return response.msg; + } + **/ + success: null, + /** + Error callback. Called when request failed (response status != 200). + Usefull when you want to parse error response and display a custom message. + Must return **string** - the message to be displayed in the error block. + + @property error + @type function + @default null + @since 1.4.4 + @example + error: function(response, newValue) { + if(response.status === 500) { + return 'Service unavailable. Please try later.'; + } else { + return response.responseText; + } + } + **/ + error: null, + /** + Additional options for submit ajax request. + List of values: http://api.jquery.com/jQuery.ajax + + @property ajaxOptions + @type object + @default null + @since 1.1.1 + @example + ajaxOptions: { + type: 'put', + dataType: 'json' + } + **/ + ajaxOptions: null, + /** + Where to show buttons: left(true)|bottom|false + Form without buttons is auto-submitted. + + @property showbuttons + @type boolean|string + @default true + @since 1.1.1 + **/ + showbuttons: true, + /** + Scope for callback methods (success, validate). + If null means editableform instance itself. + + @property scope + @type DOMElement|object + @default null + @since 1.2.0 + @private + **/ + scope: null, + /** + Whether to save or cancel value when it was not changed but form was submitted + + @property savenochange + @type boolean + @default false + @since 1.2.0 + **/ + savenochange: false + }; + + /* + Note: following params could redefined in engine: bootstrap or jqueryui: + Classes 'control-group' and 'editable-error-block' must always present! + */ + $.fn.editableform.template = '
            '+ + '
            ' + + '
            '+ + '
            ' + + '
            ' + + '
            '; + + //loading div + $.fn.editableform.loading = '
            '; + + //buttons + $.fn.editableform.buttons = ''+ + ''; + + //error class attached to control-group + $.fn.editableform.errorGroupClass = null; + + //error class attached to editable-error-block + $.fn.editableform.errorBlockClass = 'editable-error'; + + //engine + $.fn.editableform.engine = 'jquery'; +}(window.jQuery)); + +/** +* EditableForm utilites +*/ +(function ($) { + "use strict"; + + //utils + $.fn.editableutils = { + /** + * classic JS inheritance function + */ + inherit: function (Child, Parent) { + var F = function() { }; + F.prototype = Parent.prototype; + Child.prototype = new F(); + Child.prototype.constructor = Child; + Child.superclass = Parent.prototype; + }, + + /** + * set caret position in input + * see http://stackoverflow.com/questions/499126/jquery-set-cursor-position-in-text-area + */ + setCursorPosition: function(elem, pos) { + if (elem.setSelectionRange) { + elem.setSelectionRange(pos, pos); + } else if (elem.createTextRange) { + var range = elem.createTextRange(); + range.collapse(true); + range.moveEnd('character', pos); + range.moveStart('character', pos); + range.select(); + } + }, + + /** + * function to parse JSON in *single* quotes. (jquery automatically parse only double quotes) + * That allows such code as: + * safe = true --> means no exception will be thrown + * for details see http://stackoverflow.com/questions/7410348/how-to-set-json-format-to-html5-data-attributes-in-the-jquery + */ + tryParseJson: function(s, safe) { + if (typeof s === 'string' && s.length && s.match(/^[\{\[].*[\}\]]$/)) { + if (safe) { + try { + /*jslint evil: true*/ + s = (new Function('return ' + s))(); + /*jslint evil: false*/ + } catch (e) {} finally { + return s; + } + } else { + /*jslint evil: true*/ + s = (new Function('return ' + s))(); + /*jslint evil: false*/ + } + } + return s; + }, + + /** + * slice object by specified keys + */ + sliceObj: function(obj, keys, caseSensitive /* default: false */) { + var key, keyLower, newObj = {}; + + if (!$.isArray(keys) || !keys.length) { + return newObj; + } + + for (var i = 0; i < keys.length; i++) { + key = keys[i]; + if (obj.hasOwnProperty(key)) { + newObj[key] = obj[key]; + } + + if(caseSensitive === true) { + continue; + } + + //when getting data-* attributes via $.data() it's converted to lowercase. + //details: http://stackoverflow.com/questions/7602565/using-data-attributes-with-jquery + //workaround is code below. + keyLower = key.toLowerCase(); + if (obj.hasOwnProperty(keyLower)) { + newObj[key] = obj[keyLower]; + } + } + + return newObj; + }, + + /* + exclude complex objects from $.data() before pass to config + */ + getConfigData: function($element) { + var data = {}; + $.each($element.data(), function(k, v) { + if(typeof v !== 'object' || (v && typeof v === 'object' && (v.constructor === Object || v.constructor === Array))) { + data[k] = v; + } + }); + return data; + }, + + /* + returns keys of object + */ + objectKeys: function(o) { + if (Object.keys) { + return Object.keys(o); + } else { + if (o !== Object(o)) { + throw new TypeError('Object.keys called on a non-object'); + } + var k=[], p; + for (p in o) { + if (Object.prototype.hasOwnProperty.call(o,p)) { + k.push(p); + } + } + return k; + } + + }, + + /** + method to escape html. + **/ + escape: function(str) { + return $('
            ').text(str).html(); + }, + + /* + returns array items from sourceData having value property equal or inArray of 'value' + */ + itemsByValue: function(value, sourceData, valueProp) { + if(!sourceData || value === null) { + return []; + } + + if (typeof(valueProp) !== "function") { + var idKey = valueProp || 'value'; + valueProp = function (e) { return e[idKey]; }; + } + + var isValArray = $.isArray(value), + result = [], + that = this; + + $.each(sourceData, function(i, o) { + if(o.children) { + result = result.concat(that.itemsByValue(value, o.children, valueProp)); + } else { + /*jslint eqeq: true*/ + if(isValArray) { + if($.grep(value, function(v){ return v == (o && typeof o === 'object' ? valueProp(o) : o); }).length) { + result.push(o); + } + } else { + var itemValue = (o && (typeof o === 'object')) ? valueProp(o) : o; + if(value == itemValue) { + result.push(o); + } + } + /*jslint eqeq: false*/ + } + }); + + return result; + }, + + /* + Returns input by options: type, mode. + */ + createInput: function(options) { + var TypeConstructor, typeOptions, input, + type = options.type; + + //`date` is some kind of virtual type that is transformed to one of exact types + //depending on mode and core lib + if(type === 'date') { + //inline + if(options.mode === 'inline') { + if($.fn.editabletypes.datefield) { + type = 'datefield'; + } else if($.fn.editabletypes.dateuifield) { + type = 'dateuifield'; + } + //popup + } else { + if($.fn.editabletypes.date) { + type = 'date'; + } else if($.fn.editabletypes.dateui) { + type = 'dateui'; + } + } + + //if type still `date` and not exist in types, replace with `combodate` that is base input + if(type === 'date' && !$.fn.editabletypes.date) { + type = 'combodate'; + } + } + + //`datetime` should be datetimefield in 'inline' mode + if(type === 'datetime' && options.mode === 'inline') { + type = 'datetimefield'; + } + + //change wysihtml5 to textarea for jquery UI and plain versions + if(type === 'wysihtml5' && !$.fn.editabletypes[type]) { + type = 'textarea'; + } + + //create input of specified type. Input will be used for converting value, not in form + if(typeof $.fn.editabletypes[type] === 'function') { + TypeConstructor = $.fn.editabletypes[type]; + typeOptions = this.sliceObj(options, this.objectKeys(TypeConstructor.defaults)); + input = new TypeConstructor(typeOptions); + return input; + } else { + $.error('Unknown type: '+ type); + return false; + } + }, + + //see http://stackoverflow.com/questions/7264899/detect-css-transitions-using-javascript-and-without-modernizr + supportsTransitions: function () { + var b = document.body || document.documentElement, + s = b.style, + p = 'transition', + v = ['Moz', 'Webkit', 'Khtml', 'O', 'ms']; + + if(typeof s[p] === 'string') { + return true; + } + + // Tests for vendor specific prop + p = p.charAt(0).toUpperCase() + p.substr(1); + for(var i=0; i +This method applied internally in $().editable(). You should subscribe on it's events (save / cancel) to get profit of it.
            +Final realization can be different: bootstrap-popover, jqueryui-tooltip, poshytip, inline-div. It depends on which js file you include.
            +Applied as jQuery method. + +@class editableContainer +@uses editableform +**/ +(function ($) { + "use strict"; + + var Popup = function (element, options) { + this.init(element, options); + }; + + var Inline = function (element, options) { + this.init(element, options); + }; + + //methods + Popup.prototype = { + containerName: null, //method to call container on element + containerDataName: null, //object name in element's .data() + innerCss: null, //tbd in child class + containerClass: 'editable-container editable-popup', //css class applied to container element + defaults: {}, //container itself defaults + + init: function(element, options) { + this.$element = $(element); + //since 1.4.1 container do not use data-* directly as they already merged into options. + this.options = $.extend({}, $.fn.editableContainer.defaults, options); + this.splitOptions(); + + //set scope of form callbacks to element + this.formOptions.scope = this.$element[0]; + + this.initContainer(); + + //flag to hide container, when saving value will finish + this.delayedHide = false; + + //bind 'destroyed' listener to destroy container when element is removed from dom + this.$element.on('destroyed', $.proxy(function(){ + this.destroy(); + }, this)); + + //attach document handler to close containers on click / escape + if(!$(document).data('editable-handlers-attached')) { + //close all on escape + $(document).on('keyup.editable', function (e) { + if (e.which === 27) { + $('.editable-open').editableContainer('hide'); + //todo: return focus on element + } + }); + + //close containers when click outside + //(mousedown could be better than click, it closes everything also on drag drop) + $(document).on('click.editable', function(e) { + var $target = $(e.target), i, + exclude_classes = ['.editable-container', + '.ui-datepicker-header', + '.datepicker', //in inline mode datepicker is rendered into body + '.modal-backdrop', + '.bootstrap-wysihtml5-insert-image-modal', + '.bootstrap-wysihtml5-insert-link-modal' + ]; + + //check if element is detached. It occurs when clicking in bootstrap datepicker + if (!$.contains(document.documentElement, e.target)) { + return; + } + + //for some reason FF 20 generates extra event (click) in select2 widget with e.target = document + //we need to filter it via construction below. See https://github.com/vitalets/x-editable/issues/199 + //Possibly related to http://stackoverflow.com/questions/10119793/why-does-firefox-react-differently-from-webkit-and-ie-to-click-event-on-selec + if($target.is(document)) { + return; + } + + //if click inside one of exclude classes --> no nothing + for(i=0; i container changes size before hide. + */ + + //if form already exist - delete previous data + if(this.$form) { + //todo: destroy prev data! + //this.$form.destroy(); + } + + this.$form = $('
            '); + + //insert form into container body + if(this.tip().is(this.innerCss)) { + //for inline container + this.tip().append(this.$form); + } else { + this.tip().find(this.innerCss).append(this.$form); + } + + //render form + this.renderForm(); + }, + + /** + Hides container with form + @method hide() + @param {string} reason Reason caused hiding. Can be save|cancel|onblur|nochange|undefined (=manual) + **/ + hide: function(reason) { + if(!this.tip() || !this.tip().is(':visible') || !this.$element.hasClass('editable-open')) { + return; + } + + //if form is saving value, schedule hide + if(this.$form.data('editableform').isSaving) { + this.delayedHide = {reason: reason}; + return; + } else { + this.delayedHide = false; + } + + this.$element.removeClass('editable-open'); + this.innerHide(); + + /** + Fired when container was hidden. It occurs on both save or cancel. + **Note:** Bootstrap popover has own `hidden` event that now cannot be separated from x-editable's one. + The workaround is to check `arguments.length` that is always `2` for x-editable. + + @event hidden + @param {object} event event object + @param {string} reason Reason caused hiding. Can be save|cancel|onblur|nochange|manual + @example + $('#username').on('hidden', function(e, reason) { + if(reason === 'save' || reason === 'cancel') { + //auto-open next editable + $(this).closest('tr').next().find('.editable').editable('show'); + } + }); + **/ + this.$element.triggerHandler('hidden', reason || 'manual'); + }, + + /* internal show method. To be overwritten in child classes */ + innerShow: function () { + + }, + + /* internal hide method. To be overwritten in child classes */ + innerHide: function () { + + }, + + /** + Toggles container visibility (show / hide) + @method toggle() + @param {boolean} closeAll Whether to close all other editable containers when showing this one. Default true. + **/ + toggle: function(closeAll) { + if(this.container() && this.tip() && this.tip().is(':visible')) { + this.hide(); + } else { + this.show(closeAll); + } + }, + + /* + Updates the position of container when content changed. + @method setPosition() + */ + setPosition: function() { + //tbd in child class + }, + + save: function(e, params) { + /** + Fired when new value was submitted. You can use $(this).data('editableContainer') inside handler to access to editableContainer instance + + @event save + @param {Object} event event object + @param {Object} params additional params + @param {mixed} params.newValue submitted value + @param {Object} params.response ajax response + @example + $('#username').on('save', function(e, params) { + //assuming server response: '{success: true}' + var pk = $(this).data('editableContainer').options.pk; + if(params.response && params.response.success) { + alert('value: ' + params.newValue + ' with pk: ' + pk + ' saved!'); + } else { + alert('error!'); + } + }); + **/ + this.$element.triggerHandler('save', params); + + //hide must be after trigger, as saving value may require methods of plugin, applied to input + this.hide('save'); + }, + + /** + Sets new option + + @method option(key, value) + @param {string} key + @param {mixed} value + **/ + option: function(key, value) { + this.options[key] = value; + if(key in this.containerOptions) { + this.containerOptions[key] = value; + this.setContainerOption(key, value); + } else { + this.formOptions[key] = value; + if(this.$form) { + this.$form.editableform('option', key, value); + } + } + }, + + setContainerOption: function(key, value) { + this.call('option', key, value); + }, + + /** + Destroys the container instance + @method destroy() + **/ + destroy: function() { + this.hide(); + this.innerDestroy(); + this.$element.off('destroyed'); + this.$element.removeData('editableContainer'); + }, + + /* to be overwritten in child classes */ + innerDestroy: function() { + + }, + + /* + Closes other containers except one related to passed element. + Other containers can be cancelled or submitted (depends on onblur option) + */ + closeOthers: function(element) { + $('.editable-open').each(function(i, el){ + //do nothing with passed element and it's children + if(el === element || $(el).find(element).length) { + return; + } + + //otherwise cancel or submit all open containers + var $el = $(el), + ec = $el.data('editableContainer'); + + if(!ec) { + return; + } + + if(ec.options.onblur === 'cancel') { + $el.data('editableContainer').hide('onblur'); + } else if(ec.options.onblur === 'submit') { + $el.data('editableContainer').tip().find('form').submit(); + } + }); + + }, + + /** + Activates input of visible container (e.g. set focus) + @method activate() + **/ + activate: function() { + if(this.tip && this.tip().is(':visible') && this.$form) { + this.$form.data('editableform').input.activate(); + } + } + + }; + + /** + jQuery method to initialize editableContainer. + + @method $().editableContainer(options) + @params {Object} options + @example + $('#edit').editableContainer({ + type: 'text', + url: '/post', + pk: 1, + value: 'hello' + }); + **/ + $.fn.editableContainer = function (option) { + var args = arguments; + return this.each(function () { + var $this = $(this), + dataKey = 'editableContainer', + data = $this.data(dataKey), + options = typeof option === 'object' && option, + Constructor = (options.mode === 'inline') ? Inline : Popup; + + if (!data) { + $this.data(dataKey, (data = new Constructor(this, options))); + } + + if (typeof option === 'string') { //call method + data[option].apply(data, Array.prototype.slice.call(args, 1)); + } + }); + }; + + //store constructors + $.fn.editableContainer.Popup = Popup; + $.fn.editableContainer.Inline = Inline; + + //defaults + $.fn.editableContainer.defaults = { + /** + Initial value of form input + + @property value + @type mixed + @default null + @private + **/ + value: null, + /** + Placement of container relative to element. Can be top|right|bottom|left. Not used for inline container. + + @property placement + @type string + @default 'top' + **/ + placement: 'top', + /** + Whether to hide container on save/cancel. + + @property autohide + @type boolean + @default true + @private + **/ + autohide: true, + /** + Action when user clicks outside the container. Can be cancel|submit|ignore. + Setting ignore allows to have several containers open. + + @property onblur + @type string + @default 'cancel' + @since 1.1.1 + **/ + onblur: 'cancel', + + /** + Animation speed (inline mode only) + @property anim + @type string + @default false + **/ + anim: false, + + /** + Mode of editable, can be `popup` or `inline` + + @property mode + @type string + @default 'popup' + @since 1.4.0 + **/ + mode: 'popup' + }; + + /* + * workaround to have 'destroyed' event to destroy popover when element is destroyed + * see http://stackoverflow.com/questions/2200494/jquery-trigger-event-when-an-element-is-removed-from-the-dom + */ + jQuery.event.special.destroyed = { + remove: function(o) { + if (o.handler) { + o.handler(); + } + } + }; + +}(window.jQuery)); + +/** +* Editable Inline +* --------------------- +*/ +(function ($) { + "use strict"; + + //copy prototype from EditableContainer + //extend methods + $.extend($.fn.editableContainer.Inline.prototype, $.fn.editableContainer.Popup.prototype, { + containerName: 'editableform', + innerCss: '.editable-inline', + containerClass: 'editable-container editable-inline', //css class applied to container element + + initContainer: function(){ + //container is element + this.$tip = $(''); + + //convert anim to miliseconds (int) + if(!this.options.anim) { + this.options.anim = 0; + } + }, + + splitOptions: function() { + //all options are passed to form + this.containerOptions = {}; + this.formOptions = this.options; + }, + + tip: function() { + return this.$tip; + }, + + innerShow: function () { + this.$element.hide(); + this.tip().insertAfter(this.$element).show(); + }, + + innerHide: function () { + this.$tip.hide(this.options.anim, $.proxy(function() { + this.$element.show(); + this.innerDestroy(); + }, this)); + }, + + innerDestroy: function() { + if(this.tip()) { + this.tip().empty().remove(); + } + } + }); + +}(window.jQuery)); +/** +Makes editable any HTML element on the page. Applied as jQuery method. + +@class editable +@uses editableContainer +**/ +(function ($) { + "use strict"; + + var Editable = function (element, options) { + this.$element = $(element); + //data-* has more priority over js options: because dynamically created elements may change data-* + this.options = $.extend({}, $.fn.editable.defaults, options, $.fn.editableutils.getConfigData(this.$element)); + if(this.options.selector) { + this.initLive(); + } else { + this.init(); + } + + //check for transition support + if(this.options.highlight && !$.fn.editableutils.supportsTransitions()) { + this.options.highlight = false; + } + }; + + Editable.prototype = { + constructor: Editable, + init: function () { + var isValueByText = false, + doAutotext, finalize; + + //name + this.options.name = this.options.name || this.$element.attr('id'); + + //create input of specified type. Input needed already here to convert value for initial display (e.g. show text by id for select) + //also we set scope option to have access to element inside input specific callbacks (e. g. source as function) + this.options.scope = this.$element[0]; + this.input = $.fn.editableutils.createInput(this.options); + if(!this.input) { + return; + } + + //set value from settings or by element's text + if (this.options.value === undefined || this.options.value === null) { + this.value = this.input.html2value($.trim(this.$element.html())); + isValueByText = true; + } else { + /* + value can be string when received from 'data-value' attribute + for complext objects value can be set as json string in data-value attribute, + e.g. data-value="{city: 'Moscow', street: 'Lenina'}" + */ + this.options.value = $.fn.editableutils.tryParseJson(this.options.value, true); + if(typeof this.options.value === 'string') { + this.value = this.input.str2value(this.options.value); + } else { + this.value = this.options.value; + } + } + + //add 'editable' class to every editable element + this.$element.addClass('editable'); + + //specifically for "textarea" add class .editable-pre-wrapped to keep linebreaks + if(this.input.type === 'textarea') { + this.$element.addClass('editable-pre-wrapped'); + } + + //attach handler activating editable. In disabled mode it just prevent default action (useful for links) + if(this.options.toggle !== 'manual') { + this.$element.addClass('editable-click'); + this.$element.on(this.options.toggle + '.editable', $.proxy(function(e){ + //prevent following link if editable enabled + if(!this.options.disabled) { + e.preventDefault(); + } + + //stop propagation not required because in document click handler it checks event target + //e.stopPropagation(); + + if(this.options.toggle === 'mouseenter') { + //for hover only show container + this.show(); + } else { + //when toggle='click' we should not close all other containers as they will be closed automatically in document click listener + var closeAll = (this.options.toggle !== 'click'); + this.toggle(closeAll); + } + }, this)); + } else { + this.$element.attr('tabindex', -1); //do not stop focus on element when toggled manually + } + + //if display is function it's far more convinient to have autotext = always to render correctly on init + //see https://github.com/vitalets/x-editable-yii/issues/34 + if(typeof this.options.display === 'function') { + this.options.autotext = 'always'; + } + + //check conditions for autotext: + switch(this.options.autotext) { + case 'always': + doAutotext = true; + break; + case 'auto': + //if element text is empty and value is defined and value not generated by text --> run autotext + doAutotext = !$.trim(this.$element.text()).length && this.value !== null && this.value !== undefined && !isValueByText; + break; + default: + doAutotext = false; + } + + //depending on autotext run render() or just finilize init + $.when(doAutotext ? this.render() : true).then($.proxy(function() { + if(this.options.disabled) { + this.disable(); + } else { + this.enable(); + } + /** + Fired when element was initialized by `$().editable()` method. + Please note that you should setup `init` handler **before** applying `editable`. + + @event init + @param {Object} event event object + @param {Object} editable editable instance (as here it cannot accessed via data('editable')) + @since 1.2.0 + @example + $('#username').on('init', function(e, editable) { + alert('initialized ' + editable.options.name); + }); + $('#username').editable(); + **/ + this.$element.triggerHandler('init', this); + }, this)); + }, + + /* + Initializes parent element for live editables + */ + initLive: function() { + //store selector + var selector = this.options.selector; + //modify options for child elements + this.options.selector = false; + this.options.autotext = 'never'; + //listen toggle events + this.$element.on(this.options.toggle + '.editable', selector, $.proxy(function(e){ + var $target = $(e.target); + if(!$target.data('editable')) { + //if delegated element initially empty, we need to clear it's text (that was manually set to `empty` by user) + //see https://github.com/vitalets/x-editable/issues/137 + if($target.hasClass(this.options.emptyclass)) { + $target.empty(); + } + $target.editable(this.options).trigger(e); + } + }, this)); + }, + + /* + Renders value into element's text. + Can call custom display method from options. + Can return deferred object. + @method render() + @param {mixed} response server response (if exist) to pass into display function + */ + render: function(response) { + //do not display anything + if(this.options.display === false) { + return; + } + + //if input has `value2htmlFinal` method, we pass callback in third param to be called when source is loaded + if(this.input.value2htmlFinal) { + return this.input.value2html(this.value, this.$element[0], this.options.display, response); + //if display method defined --> use it + } else if(typeof this.options.display === 'function') { + return this.options.display.call(this.$element[0], this.value, response); + //else use input's original value2html() method + } else { + return this.input.value2html(this.value, this.$element[0]); + } + }, + + /** + Enables editable + @method enable() + **/ + enable: function() { + this.options.disabled = false; + this.$element.removeClass('editable-disabled'); + this.handleEmpty(this.isEmpty); + if(this.options.toggle !== 'manual') { + if(this.$element.attr('tabindex') === '-1') { + this.$element.removeAttr('tabindex'); + } + } + }, + + /** + Disables editable + @method disable() + **/ + disable: function() { + this.options.disabled = true; + this.hide(); + this.$element.addClass('editable-disabled'); + this.handleEmpty(this.isEmpty); + //do not stop focus on this element + this.$element.attr('tabindex', -1); + }, + + /** + Toggles enabled / disabled state of editable element + @method toggleDisabled() + **/ + toggleDisabled: function() { + if(this.options.disabled) { + this.enable(); + } else { + this.disable(); + } + }, + + /** + Sets new option + + @method option(key, value) + @param {string|object} key option name or object with several options + @param {mixed} value option new value + @example + $('.editable').editable('option', 'pk', 2); + **/ + option: function(key, value) { + //set option(s) by object + if(key && typeof key === 'object') { + $.each(key, $.proxy(function(k, v){ + this.option($.trim(k), v); + }, this)); + return; + } + + //set option by string + this.options[key] = value; + + //disabled + if(key === 'disabled') { + return value ? this.disable() : this.enable(); + } + + //value + if(key === 'value') { + this.setValue(value); + } + + //transfer new option to container! + if(this.container) { + this.container.option(key, value); + } + + //pass option to input directly (as it points to the same in form) + if(this.input.option) { + this.input.option(key, value); + } + + }, + + /* + * set emptytext if element is empty + */ + handleEmpty: function (isEmpty) { + //do not handle empty if we do not display anything + if(this.options.display === false) { + return; + } + + /* + isEmpty may be set directly as param of method. + It is required when we enable/disable field and can't rely on content + as node content is text: "Empty" that is not empty %) + */ + if(isEmpty !== undefined) { + this.isEmpty = isEmpty; + } else { + //detect empty + //for some inputs we need more smart check + //e.g. wysihtml5 may have
            ,

            , + if(typeof(this.input.isEmpty) === 'function') { + this.isEmpty = this.input.isEmpty(this.$element); + } else { + this.isEmpty = $.trim(this.$element.html()) === ''; + } + } + + //emptytext shown only for enabled + if(!this.options.disabled) { + if (this.isEmpty) { + this.$element.html(this.options.emptytext); + if(this.options.emptyclass) { + this.$element.addClass(this.options.emptyclass); + } + } else if(this.options.emptyclass) { + this.$element.removeClass(this.options.emptyclass); + } + } else { + //below required if element disable property was changed + if(this.isEmpty) { + this.$element.empty(); + if(this.options.emptyclass) { + this.$element.removeClass(this.options.emptyclass); + } + } + } + }, + + /** + Shows container with form + @method show() + @param {boolean} closeAll Whether to close all other editable containers when showing this one. Default true. + **/ + show: function (closeAll) { + if(this.options.disabled) { + return; + } + + //init editableContainer: popover, tooltip, inline, etc.. + if(!this.container) { + var containerOptions = $.extend({}, this.options, { + value: this.value, + input: this.input //pass input to form (as it is already created) + }); + this.$element.editableContainer(containerOptions); + //listen `save` event + this.$element.on("save.internal", $.proxy(this.save, this)); + this.container = this.$element.data('editableContainer'); + } else if(this.container.tip().is(':visible')) { + return; + } + + //show container + this.container.show(closeAll); + }, + + /** + Hides container with form + @method hide() + **/ + hide: function () { + if(this.container) { + this.container.hide(); + } + }, + + /** + Toggles container visibility (show / hide) + @method toggle() + @param {boolean} closeAll Whether to close all other editable containers when showing this one. Default true. + **/ + toggle: function(closeAll) { + if(this.container && this.container.tip().is(':visible')) { + this.hide(); + } else { + this.show(closeAll); + } + }, + + /* + * called when form was submitted + */ + save: function(e, params) { + //mark element with unsaved class if needed + if(this.options.unsavedclass) { + /* + Add unsaved css to element if: + - url is not user's function + - value was not sent to server + - params.response === undefined, that means data was not sent + - value changed + */ + var sent = false; + sent = sent || typeof this.options.url === 'function'; + sent = sent || this.options.display === false; + sent = sent || params.response !== undefined; + sent = sent || (this.options.savenochange && this.input.value2str(this.value) !== this.input.value2str(params.newValue)); + + if(sent) { + this.$element.removeClass(this.options.unsavedclass); + } else { + this.$element.addClass(this.options.unsavedclass); + } + } + + //highlight when saving + if(this.options.highlight) { + var $e = this.$element, + bgColor = $e.css('background-color'); + + $e.css('background-color', this.options.highlight); + setTimeout(function(){ + if(bgColor === 'transparent') { + bgColor = ''; + } + $e.css('background-color', bgColor); + $e.addClass('editable-bg-transition'); + setTimeout(function(){ + $e.removeClass('editable-bg-transition'); + }, 1700); + }, 10); + } + + //set new value + this.setValue(params.newValue, false, params.response); + + /** + Fired when new value was submitted. You can use $(this).data('editable') to access to editable instance + + @event save + @param {Object} event event object + @param {Object} params additional params + @param {mixed} params.newValue submitted value + @param {Object} params.response ajax response + @example + $('#username').on('save', function(e, params) { + alert('Saved value: ' + params.newValue); + }); + **/ + //event itself is triggered by editableContainer. Description here is only for documentation + }, + + validate: function () { + if (typeof this.options.validate === 'function') { + return this.options.validate.call(this, this.value); + } + }, + + /** + Sets new value of editable + @method setValue(value, convertStr) + @param {mixed} value new value + @param {boolean} convertStr whether to convert value from string to internal format + **/ + setValue: function(value, convertStr, response) { + if(convertStr) { + this.value = this.input.str2value(value); + } else { + this.value = value; + } + if(this.container) { + this.container.option('value', this.value); + } + $.when(this.render(response)) + .then($.proxy(function() { + this.handleEmpty(); + }, this)); + }, + + /** + Activates input of visible container (e.g. set focus) + @method activate() + **/ + activate: function() { + if(this.container) { + this.container.activate(); + } + }, + + /** + Removes editable feature from element + @method destroy() + **/ + destroy: function() { + this.disable(); + + if(this.container) { + this.container.destroy(); + } + + this.input.destroy(); + + if(this.options.toggle !== 'manual') { + this.$element.removeClass('editable-click'); + this.$element.off(this.options.toggle + '.editable'); + } + + this.$element.off("save.internal"); + + this.$element.removeClass('editable editable-open editable-disabled'); + this.$element.removeData('editable'); + } + }; + + /* EDITABLE PLUGIN DEFINITION + * ======================= */ + + /** + jQuery method to initialize editable element. + + @method $().editable(options) + @params {Object} options + @example + $('#username').editable({ + type: 'text', + url: '/post', + pk: 1 + }); + **/ + $.fn.editable = function (option) { + //special API methods returning non-jquery object + var result = {}, args = arguments, datakey = 'editable'; + switch (option) { + /** + Runs client-side validation for all matched editables + + @method validate() + @returns {Object} validation errors map + @example + $('#username, #fullname').editable('validate'); + // possible result: + { + username: "username is required", + fullname: "fullname should be minimum 3 letters length" + } + **/ + case 'validate': + this.each(function () { + var $this = $(this), data = $this.data(datakey), error; + if (data && (error = data.validate())) { + result[data.options.name] = error; + } + }); + return result; + + /** + Returns current values of editable elements. + Note that it returns an **object** with name-value pairs, not a value itself. It allows to get data from several elements. + If value of some editable is `null` or `undefined` it is excluded from result object. + When param `isSingle` is set to **true** - it is supposed you have single element and will return value of editable instead of object. + + @method getValue() + @param {bool} isSingle whether to return just value of single element + @returns {Object} object of element names and values + @example + $('#username, #fullname').editable('getValue'); + //result: + { + username: "superuser", + fullname: "John" + } + //isSingle = true + $('#username').editable('getValue', true); + //result "superuser" + **/ + case 'getValue': + if(arguments.length === 2 && arguments[1] === true) { //isSingle = true + result = this.eq(0).data(datakey).value; + } else { + this.each(function () { + var $this = $(this), data = $this.data(datakey); + if (data && data.value !== undefined && data.value !== null) { + result[data.options.name] = data.input.value2submit(data.value); + } + }); + } + return result; + + /** + This method collects values from several editable elements and submit them all to server. + Internally it runs client-side validation for all fields and submits only in case of success. + See
            creating new records for details. + Since 1.5.1 `submit` can be applied to single element to send data programmatically. In that case + `url`, `success` and `error` is taken from initial options and you can just call `$('#username').editable('submit')`. + + @method submit(options) + @param {object} options + @param {object} options.url url to submit data + @param {object} options.data additional data to submit + @param {object} options.ajaxOptions additional ajax options + @param {function} options.error(obj) error handler + @param {function} options.success(obj,config) success handler + @returns {Object} jQuery object + **/ + case 'submit': //collects value, validate and submit to server for creating new record + var config = arguments[1] || {}, + $elems = this, + errors = this.editable('validate'); + + // validation ok + if($.isEmptyObject(errors)) { + var ajaxOptions = {}; + + // for single element use url, success etc from options + if($elems.length === 1) { + var editable = $elems.data('editable'); + //standard params + var params = { + name: editable.options.name || '', + value: editable.input.value2submit(editable.value), + pk: (typeof editable.options.pk === 'function') ? + editable.options.pk.call(editable.options.scope) : + editable.options.pk + }; + + //additional params + if(typeof editable.options.params === 'function') { + params = editable.options.params.call(editable.options.scope, params); + } else { + //try parse json in single quotes (from data-params attribute) + editable.options.params = $.fn.editableutils.tryParseJson(editable.options.params, true); + $.extend(params, editable.options.params); + } + + ajaxOptions = { + url: editable.options.url, + data: params, + type: 'POST' + }; + + // use success / error from options + config.success = config.success || editable.options.success; + config.error = config.error || editable.options.error; + + // multiple elements + } else { + var values = this.editable('getValue'); + + ajaxOptions = { + url: config.url, + data: values, + type: 'POST' + }; + } + + // ajax success callabck (response 200 OK) + ajaxOptions.success = typeof config.success === 'function' ? function(response) { + config.success.call($elems, response, config); + } : $.noop; + + // ajax error callabck + ajaxOptions.error = typeof config.error === 'function' ? function() { + config.error.apply($elems, arguments); + } : $.noop; + + // extend ajaxOptions + if(config.ajaxOptions) { + $.extend(ajaxOptions, config.ajaxOptions); + } + + // extra data + if(config.data) { + $.extend(ajaxOptions.data, config.data); + } + + // perform ajax request + $.ajax(ajaxOptions); + } else { //client-side validation error + if(typeof config.error === 'function') { + config.error.call($elems, errors); + } + } + return this; + } + + //return jquery object + return this.each(function () { + var $this = $(this), + data = $this.data(datakey), + options = typeof option === 'object' && option; + + //for delegated targets do not store `editable` object for element + //it's allows several different selectors. + //see: https://github.com/vitalets/x-editable/issues/312 + if(options && options.selector) { + data = new Editable(this, options); + return; + } + + if (!data) { + $this.data(datakey, (data = new Editable(this, options))); + } + + if (typeof option === 'string') { //call method + data[option].apply(data, Array.prototype.slice.call(args, 1)); + } + }); + }; + + + $.fn.editable.defaults = { + /** + Type of input. Can be text|textarea|select|date|checklist and more + + @property type + @type string + @default 'text' + **/ + type: 'text', + /** + Sets disabled state of editable + + @property disabled + @type boolean + @default false + **/ + disabled: false, + /** + How to toggle editable. Can be click|dblclick|mouseenter|manual. + When set to manual you should manually call show/hide methods of editable. + **Note**: if you call show or toggle inside **click** handler of some DOM element, + you need to apply e.stopPropagation() because containers are being closed on any click on document. + + @example + $('#edit-button').click(function(e) { + e.stopPropagation(); + $('#username').editable('toggle'); + }); + + @property toggle + @type string + @default 'click' + **/ + toggle: 'click', + /** + Text shown when element is empty. + + @property emptytext + @type string + @default 'Empty' + **/ + emptytext: 'Empty', + /** + Allows to automatically set element's text based on it's value. Can be auto|always|never. Useful for select and date. + For example, if dropdown list is {1: 'a', 2: 'b'} and element's value set to 1, it's html will be automatically set to 'a'. + auto - text will be automatically set only if element is empty. + always|never - always(never) try to set element's text. + + @property autotext + @type string + @default 'auto' + **/ + autotext: 'auto', + /** + Initial value of input. If not set, taken from element's text. + Note, that if element's text is empty - text is automatically generated from value and can be customized (see `autotext` option). + For example, to display currency sign: + @example + + + + @property value + @type mixed + @default element's text + **/ + value: null, + /** + Callback to perform custom displaying of value in element's text. + If `null`, default input's display used. + If `false`, no displaying methods will be called, element's text will never change. + Runs under element's scope. + _**Parameters:**_ + + * `value` current value to be displayed + * `response` server response (if display called after ajax submit), since 1.4.0 + + For _inputs with source_ (select, checklist) parameters are different: + + * `value` current value to be displayed + * `sourceData` array of items for current input (e.g. dropdown items) + * `response` server response (if display called after ajax submit), since 1.4.0 + + To get currently selected items use `$.fn.editableutils.itemsByValue(value, sourceData)`. + + @property display + @type function|boolean + @default null + @since 1.2.0 + @example + display: function(value, sourceData) { + //display checklist as comma-separated values + var html = [], + checked = $.fn.editableutils.itemsByValue(value, sourceData); + + if(checked.length) { + $.each(checked, function(i, v) { html.push($.fn.editableutils.escape(v.text)); }); + $(this).html(html.join(', ')); + } else { + $(this).empty(); + } + } + **/ + display: null, + /** + Css class applied when editable text is empty. + + @property emptyclass + @type string + @since 1.4.1 + @default editable-empty + **/ + emptyclass: 'editable-empty', + /** + Css class applied when value was stored but not sent to server (`pk` is empty or `send = 'never'`). + You may set it to `null` if you work with editables locally and submit them together. + + @property unsavedclass + @type string + @since 1.4.1 + @default editable-unsaved + **/ + unsavedclass: 'editable-unsaved', + /** + If selector is provided, editable will be delegated to the specified targets. + Usefull for dynamically generated DOM elements. + **Please note**, that delegated targets can't be initialized with `emptytext` and `autotext` options, + as they actually become editable only after first click. + You should manually set class `editable-click` to these elements. + Also, if element originally empty you should add class `editable-empty`, set `data-value=""` and write emptytext into element: + + @property selector + @type string + @since 1.4.1 + @default null + @example +
            + + Empty + + Operator +
            + + + **/ + selector: null, + /** + Color used to highlight element after update. Implemented via CSS3 transition, works in modern browsers. + + @property highlight + @type string|boolean + @since 1.4.5 + @default #FFFF80 + **/ + highlight: '#FFFF80' + }; + +}(window.jQuery)); + +/** +AbstractInput - base class for all editable inputs. +It defines interface to be implemented by any input type. +To create your own input you can inherit from this class. + +@class abstractinput +**/ +(function ($) { + "use strict"; + + //types + $.fn.editabletypes = {}; + + var AbstractInput = function () { }; + + AbstractInput.prototype = { + /** + Initializes input + + @method init() + **/ + init: function(type, options, defaults) { + this.type = type; + this.options = $.extend({}, defaults, options); + }, + + /* + this method called before render to init $tpl that is inserted in DOM + */ + prerender: function() { + this.$tpl = $(this.options.tpl); //whole tpl as jquery object + this.$input = this.$tpl; //control itself, can be changed in render method + this.$clear = null; //clear button + this.error = null; //error message, if input cannot be rendered + }, + + /** + Renders input from tpl. Can return jQuery deferred object. + Can be overwritten in child objects + + @method render() + **/ + render: function() { + + }, + + /** + Sets element's html by value. + + @method value2html(value, element) + @param {mixed} value + @param {DOMElement} element + **/ + value2html: function(value, element) { + $(element)[this.options.escape ? 'text' : 'html']($.trim(value)); + }, + + /** + Converts element's html to value + + @method html2value(html) + @param {string} html + @returns {mixed} + **/ + html2value: function(html) { + return $('
            ').html(html).text(); + }, + + /** + Converts value to string (for internal compare). For submitting to server used value2submit(). + + @method value2str(value) + @param {mixed} value + @returns {string} + **/ + value2str: function(value) { + return value; + }, + + /** + Converts string received from server into value. Usually from `data-value` attribute. + + @method str2value(str) + @param {string} str + @returns {mixed} + **/ + str2value: function(str) { + return str; + }, + + /** + Converts value for submitting to server. Result can be string or object. + + @method value2submit(value) + @param {mixed} value + @returns {mixed} + **/ + value2submit: function(value) { + return value; + }, + + /** + Sets value of input. + + @method value2input(value) + @param {mixed} value + **/ + value2input: function(value) { + this.$input.val(value); + }, + + /** + Returns value of input. Value can be object (e.g. datepicker) + + @method input2value() + **/ + input2value: function() { + return this.$input.val(); + }, + + /** + Activates input. For text it sets focus. + + @method activate() + **/ + activate: function() { + if(this.$input.is(':visible')) { + this.$input.focus(); + } + }, + + /** + Creates input. + + @method clear() + **/ + clear: function() { + this.$input.val(null); + }, + + /** + method to escape html. + **/ + escape: function(str) { + return $('
            ').text(str).html(); + }, + + /** + attach handler to automatically submit form when value changed (useful when buttons not shown) + **/ + autosubmit: function() { + + }, + + /** + Additional actions when destroying element + **/ + destroy: function() { + }, + + // -------- helper functions -------- + setClass: function() { + if(this.options.inputclass) { + this.$input.addClass(this.options.inputclass); + } + }, + + setAttr: function(attr) { + if (this.options[attr] !== undefined && this.options[attr] !== null) { + this.$input.attr(attr, this.options[attr]); + } + }, + + option: function(key, value) { + this.options[key] = value; + } + + }; + + AbstractInput.defaults = { + /** + HTML template of input. Normally you should not change it. + + @property tpl + @type string + @default '' + **/ + tpl: '', + /** + CSS class automatically applied to input + + @property inputclass + @type string + @default null + **/ + inputclass: null, + + /** + If `true` - html will be escaped in content of element via $.text() method. + If `false` - html will not be escaped, $.html() used. + When you use own `display` function, this option obviosly has no effect. + + @property escape + @type boolean + @since 1.5.0 + @default true + **/ + escape: true, + + //scope for external methods (e.g. source defined as function) + //for internal use only + scope: null, + + //need to re-declare showbuttons here to get it's value from common config (passed only options existing in defaults) + showbuttons: true + }; + + $.extend($.fn.editabletypes, {abstractinput: AbstractInput}); + +}(window.jQuery)); + +/** +List - abstract class for inputs that have source option loaded from js array or via ajax + +@class list +@extends abstractinput +**/ +(function ($) { + "use strict"; + + var List = function (options) { + + }; + + $.fn.editableutils.inherit(List, $.fn.editabletypes.abstractinput); + + $.extend(List.prototype, { + render: function () { + var deferred = $.Deferred(); + + this.error = null; + this.onSourceReady(function () { + this.renderList(); + deferred.resolve(); + }, function () { + this.error = this.options.sourceError; + deferred.resolve(); + }); + + return deferred.promise(); + }, + + html2value: function (html) { + return null; //can't set value by text + }, + + value2html: function (value, element, display, response) { + var deferred = $.Deferred(), + success = function () { + if(typeof display === 'function') { + //custom display method + display.call(element, value, this.sourceData, response); + } else { + this.value2htmlFinal(value, element); + } + deferred.resolve(); + }; + + //for null value just call success without loading source + if(value === null) { + success.call(this); + } else { + this.onSourceReady(success, function () { deferred.resolve(); }); + } + + return deferred.promise(); + }, + + // ------------- additional functions ------------ + + onSourceReady: function (success, error) { + //run source if it function + var source; + if ($.isFunction(this.options.source)) { + source = this.options.source.call(this.options.scope); + this.sourceData = null; + //note: if function returns the same source as URL - sourceData will be taken from cahce and no extra request performed + } else { + source = this.options.source; + } + + //if allready loaded just call success + if(this.options.sourceCache && $.isArray(this.sourceData)) { + success.call(this); + return; + } + + //try parse json in single quotes (for double quotes jquery does automatically) + try { + source = $.fn.editableutils.tryParseJson(source, false); + } catch (e) { + error.call(this); + return; + } + + //loading from url + if (typeof source === 'string') { + //try to get sourceData from cache + if(this.options.sourceCache) { + var cacheID = source, + cache; + + if (!$(document).data(cacheID)) { + $(document).data(cacheID, {}); + } + cache = $(document).data(cacheID); + + //check for cached data + if (cache.loading === false && cache.sourceData) { //take source from cache + this.sourceData = cache.sourceData; + this.doPrepend(); + success.call(this); + return; + } else if (cache.loading === true) { //cache is loading, put callback in stack to be called later + cache.callbacks.push($.proxy(function () { + this.sourceData = cache.sourceData; + this.doPrepend(); + success.call(this); + }, this)); + + //also collecting error callbacks + cache.err_callbacks.push($.proxy(error, this)); + return; + } else { //no cache yet, activate it + cache.loading = true; + cache.callbacks = []; + cache.err_callbacks = []; + } + } + + //ajaxOptions for source. Can be overwritten bt options.sourceOptions + var ajaxOptions = $.extend({ + url: source, + type: 'get', + cache: false, + dataType: 'json', + success: $.proxy(function (data) { + if(cache) { + cache.loading = false; + } + this.sourceData = this.makeArray(data); + if($.isArray(this.sourceData)) { + if(cache) { + //store result in cache + cache.sourceData = this.sourceData; + //run success callbacks for other fields waiting for this source + $.each(cache.callbacks, function () { this.call(); }); + } + this.doPrepend(); + success.call(this); + } else { + error.call(this); + if(cache) { + //run error callbacks for other fields waiting for this source + $.each(cache.err_callbacks, function () { this.call(); }); + } + } + }, this), + error: $.proxy(function () { + error.call(this); + if(cache) { + cache.loading = false; + //run error callbacks for other fields + $.each(cache.err_callbacks, function () { this.call(); }); + } + }, this) + }, this.options.sourceOptions); + + //loading sourceData from server + $.ajax(ajaxOptions); + + } else { //options as json/array + this.sourceData = this.makeArray(source); + + if($.isArray(this.sourceData)) { + this.doPrepend(); + success.call(this); + } else { + error.call(this); + } + } + }, + + doPrepend: function () { + if(this.options.prepend === null || this.options.prepend === undefined) { + return; + } + + if(!$.isArray(this.prependData)) { + //run prepend if it is function (once) + if ($.isFunction(this.options.prepend)) { + this.options.prepend = this.options.prepend.call(this.options.scope); + } + + //try parse json in single quotes + this.options.prepend = $.fn.editableutils.tryParseJson(this.options.prepend, true); + + //convert prepend from string to object + if (typeof this.options.prepend === 'string') { + this.options.prepend = {'': this.options.prepend}; + } + + this.prependData = this.makeArray(this.options.prepend); + } + + if($.isArray(this.prependData) && $.isArray(this.sourceData)) { + this.sourceData = this.prependData.concat(this.sourceData); + } + }, + + /* + renders input list + */ + renderList: function() { + // this method should be overwritten in child class + }, + + /* + set element's html by value + */ + value2htmlFinal: function(value, element) { + // this method should be overwritten in child class + }, + + /** + * convert data to array suitable for sourceData, e.g. [{value: 1, text: 'abc'}, {...}] + */ + makeArray: function(data) { + var count, obj, result = [], item, iterateItem; + if(!data || typeof data === 'string') { + return null; + } + + if($.isArray(data)) { //array + /* + function to iterate inside item of array if item is object. + Caclulates count of keys in item and store in obj. + */ + iterateItem = function (k, v) { + obj = {value: k, text: v}; + if(count++ >= 2) { + return false;// exit from `each` if item has more than one key. + } + }; + + for(var i = 0; i < data.length; i++) { + item = data[i]; + if(typeof item === 'object') { + count = 0; //count of keys inside item + $.each(item, iterateItem); + //case: [{val1: 'text1'}, {val2: 'text2} ...] + if(count === 1) { + result.push(obj); + //case: [{value: 1, text: 'text1'}, {value: 2, text: 'text2'}, ...] + } else if(count > 1) { + //removed check of existance: item.hasOwnProperty('value') && item.hasOwnProperty('text') + if(item.children) { + item.children = this.makeArray(item.children); + } + result.push(item); + } + } else { + //case: ['text1', 'text2' ...] + result.push({value: item, text: item}); + } + } + } else { //case: {val1: 'text1', val2: 'text2, ...} + $.each(data, function (k, v) { + result.push({value: k, text: v}); + }); + } + return result; + }, + + option: function(key, value) { + this.options[key] = value; + if(key === 'source') { + this.sourceData = null; + } + if(key === 'prepend') { + this.prependData = null; + } + } + + }); + + List.defaults = $.extend({}, $.fn.editabletypes.abstractinput.defaults, { + /** + Source data for list. + If **array** - it should be in format: `[{value: 1, text: "text1"}, {value: 2, text: "text2"}, ...]` + For compability, object format is also supported: `{"1": "text1", "2": "text2" ...}` but it does not guarantee elements order. + + If **string** - considered ajax url to load items. In that case results will be cached for fields with the same source and name. See also `sourceCache` option. + + If **function**, it should return data in format above (since 1.4.0). + + Since 1.4.1 key `children` supported to render OPTGROUP (for **select** input only). + `[{text: "group1", children: [{value: 1, text: "text1"}, {value: 2, text: "text2"}]}, ...]` + + + @property source + @type string | array | object | function + @default null + **/ + source: null, + /** + Data automatically prepended to the beginning of dropdown list. + + @property prepend + @type string | array | object | function + @default false + **/ + prepend: false, + /** + Error message when list cannot be loaded (e.g. ajax error) + + @property sourceError + @type string + @default Error when loading list + **/ + sourceError: 'Error when loading list', + /** + if true and source is **string url** - results will be cached for fields with the same source. + Usefull for editable column in grid to prevent extra requests. + + @property sourceCache + @type boolean + @default true + @since 1.2.0 + **/ + sourceCache: true, + /** + Additional ajax options to be used in $.ajax() when loading list from server. + Useful to send extra parameters (`data` key) or change request method (`type` key). + + @property sourceOptions + @type object|function + @default null + @since 1.5.0 + **/ + sourceOptions: null + }); + + $.fn.editabletypes.list = List; + +}(window.jQuery)); + +/** +Text input + +@class text +@extends abstractinput +@final +@example +awesome + +**/ +(function ($) { + "use strict"; + + var Text = function (options) { + this.init('text', options, Text.defaults); + }; + + $.fn.editableutils.inherit(Text, $.fn.editabletypes.abstractinput); + + $.extend(Text.prototype, { + render: function() { + this.renderClear(); + this.setClass(); + this.setAttr('placeholder'); + }, + + activate: function() { + if(this.$input.is(':visible')) { + this.$input.focus(); + $.fn.editableutils.setCursorPosition(this.$input.get(0), this.$input.val().length); + if(this.toggleClear) { + this.toggleClear(); + } + } + }, + + //render clear button + renderClear: function() { + if (this.options.clear) { + this.$clear = $(''); + this.$input.after(this.$clear) + .css('padding-right', 24) + .keyup($.proxy(function(e) { + //arrows, enter, tab, etc + if(~$.inArray(e.keyCode, [40,38,9,13,27])) { + return; + } + + clearTimeout(this.t); + var that = this; + this.t = setTimeout(function() { + that.toggleClear(e); + }, 100); + + }, this)) + .parent().css('position', 'relative'); + + this.$clear.click($.proxy(this.clear, this)); + } + }, + + postrender: function() { + /* + //now `clear` is positioned via css + if(this.$clear) { + //can position clear button only here, when form is shown and height can be calculated +// var h = this.$input.outerHeight(true) || 20, + var h = this.$clear.parent().height(), + delta = (h - this.$clear.height()) / 2; + + //this.$clear.css({bottom: delta, right: delta}); + } + */ + }, + + //show / hide clear button + toggleClear: function(e) { + if(!this.$clear) { + return; + } + + var len = this.$input.val().length, + visible = this.$clear.is(':visible'); + + if(len && !visible) { + this.$clear.show(); + } + + if(!len && visible) { + this.$clear.hide(); + } + }, + + clear: function() { + this.$clear.hide(); + this.$input.val('').focus(); + } + }); + + Text.defaults = $.extend({}, $.fn.editabletypes.abstractinput.defaults, { + /** + @property tpl + @default + **/ + tpl: '', + /** + Placeholder attribute of input. Shown when input is empty. + + @property placeholder + @type string + @default null + **/ + placeholder: null, + + /** + Whether to show `clear` button + + @property clear + @type boolean + @default true + **/ + clear: true + }); + + $.fn.editabletypes.text = Text; + +}(window.jQuery)); + +/** +Textarea input + +@class textarea +@extends abstractinput +@final +@example +awesome comment! + +**/ +(function ($) { + "use strict"; + + var Textarea = function (options) { + this.init('textarea', options, Textarea.defaults); + }; + + $.fn.editableutils.inherit(Textarea, $.fn.editabletypes.abstractinput); + + $.extend(Textarea.prototype, { + render: function () { + this.setClass(); + this.setAttr('placeholder'); + this.setAttr('rows'); + + //ctrl + enter + this.$input.keydown(function (e) { + if (e.ctrlKey && e.which === 13) { + $(this).closest('form').submit(); + } + }); + }, + + //using `white-space: pre-wrap` solves \n <--> BR conversion very elegant! + /* + value2html: function(value, element) { + var html = '', lines; + if(value) { + lines = value.split("\n"); + for (var i = 0; i < lines.length; i++) { + lines[i] = $('
            ').text(lines[i]).html(); + } + html = lines.join('
            '); + } + $(element).html(html); + }, + + html2value: function(html) { + if(!html) { + return ''; + } + + var regex = new RegExp(String.fromCharCode(10), 'g'); + var lines = html.split(//i); + for (var i = 0; i < lines.length; i++) { + var text = $('
            ').html(lines[i]).text(); + + // Remove newline characters (\n) to avoid them being converted by value2html() method + // thus adding extra
            tags + text = text.replace(regex, ''); + + lines[i] = text; + } + return lines.join("\n"); + }, + */ + activate: function() { + $.fn.editabletypes.text.prototype.activate.call(this); + } + }); + + Textarea.defaults = $.extend({}, $.fn.editabletypes.abstractinput.defaults, { + /** + @property tpl + @default + **/ + tpl:'', + /** + @property inputclass + @default input-large + **/ + inputclass: 'input-large', + /** + Placeholder attribute of input. Shown when input is empty. + + @property placeholder + @type string + @default null + **/ + placeholder: null, + /** + Number of rows in textarea + + @property rows + @type integer + @default 7 + **/ + rows: 7 + }); + + $.fn.editabletypes.textarea = Textarea; + +}(window.jQuery)); + +/** +Select (dropdown) + +@class select +@extends list +@final +@example + + +**/ +(function ($) { + "use strict"; + + var Select = function (options) { + this.init('select', options, Select.defaults); + }; + + $.fn.editableutils.inherit(Select, $.fn.editabletypes.list); + + $.extend(Select.prototype, { + renderList: function() { + this.$input.empty(); + + var fillItems = function($el, data) { + var attr; + if($.isArray(data)) { + for(var i=0; i', attr), data[i].children)); + } else { + attr.value = data[i].value; + if(data[i].disabled) { + attr.disabled = true; + } + $el.append($('