From 18468be006df5edc6737c6f6973caf18fa088042 Mon Sep 17 00:00:00 2001 From: Steve Date: Sun, 5 Jan 2025 17:24:37 +0000 Subject: [PATCH] 2021-01-03 --- Websites/SharePrices/SharePrices.sln | 22 + Websites/SharePrices/SharePrices.v12.suo | Bin 0 -> 58880 bytes .../SharePrices/App_Code/DataAccessLayer.vb | 216 ++ .../SharePrices/App_Code/SharePricesUtils.vb | 40 + .../SharePrices/CreateDBSchema.sql | 649 ++++ .../SharePrices/SharePrices/FlotTest.html | 119 + .../SharePrices/SharePrices/HtmlPage1.html | 89 + .../My Project/Application.Designer.vb | 12 + .../SharePrices/My Project/Application.myapp | 10 + .../SharePrices/My Project/AssemblyInfo.vb | 34 + .../My Project/MyExtensions/MyWebExtension.vb | 73 + .../My Project/Resources.Designer.vb | 61 + .../SharePrices/My Project/Resources.resx | 117 + .../My Project/Settings.Designer.vb | 72 + .../SharePrices/My Project/Settings.settings | 7 + .../SharePrices/SharePrices/SharePrices.aspx | 97 + .../SharePrices/SharePrices.aspx.designer.vb | 15 + .../SharePrices/SharePrices.aspx.vb | 136 + .../SharePrices/SharePrices.vbproj | 222 ++ .../SharePrices/SharePrices.vbproj.user | 27 + .../SharePrices/SharePricesModal.css | 66 + .../SharePrices/SharePricesStyles.css | 70 + .../SharePrices/SharePrices/Web.Debug.config | 30 + .../SharePrices/Web.Release.config | 31 + Websites/SharePrices/SharePrices/Web.config | 24 + .../SharePrices/bin/SharePrices.dll | Bin 0 -> 38400 bytes .../SharePrices/bin/SharePrices.dll.config | 24 + .../SharePrices/bin/SharePrices.pdb | Bin 0 -> 60928 bytes .../SharePrices/bin/SharePrices.xml | 36 + .../SharePrices/SharePrices/jquery-ui.css | 1312 +++++++ ...gnTimeResolveAssemblyReferencesInput.cache | Bin 0 -> 11310 bytes .../obj/Debug/SharePrices.Resources.resources | Bin 0 -> 180 bytes .../SharePrices/obj/Debug/SharePrices.dll | Bin 0 -> 38400 bytes .../SharePrices/obj/Debug/SharePrices.pdb | Bin 0 -> 60928 bytes .../SharePrices.vbproj.FileListAbsolute.txt | 9 + .../SharePrices.vbproj.GenerateResource.Cache | Bin 0 -> 919 bytes .../SharePrices/obj/Debug/SharePrices.xml | 36 + .../My Project.Resources.Designer.vb.dll | Bin 0 -> 7680 bytes .../SharePrices/scripts/FlotGaps.js | 77 + .../SharePrices/scripts/SharePrices.js | 1520 ++++++++ .../SharePrices/scripts/jquery-3.5.1.min.js | 2 + .../SharePrices/scripts/jquery-ui.min.js | 13 + .../scripts/jquery.flot.crosshair.js | 431 +++ .../SharePrices/scripts/jquery.flot.js | 3168 ++++++++++++++++ .../SharePrices/scripts/jquery.flot.pie.js | 786 ++++ .../scripts/jquery.flot.time.min.js | 7 + .../scripts/js.cookie-2.2.1.min.js | 3 + .../scripts/tablesorter/dragtable.mod.css | 64 + .../scripts/tablesorter/filter.formatter.css | 183 + .../scripts/tablesorter/highlights.css | 104 + .../scripts/tablesorter/jquery.tablesorter.js | 2914 +++++++++++++++ .../tablesorter/jquery.tablesorter.widgets.js | 3184 +++++++++++++++++ .../scripts/tablesorter/theme.black-ice.css | 192 + .../scripts/tablesorter/theme.blue.css | 229 ++ .../scripts/tablesorter/theme.bootstrap.css | 193 + .../scripts/tablesorter/theme.bootstrap_2.css | 188 + .../scripts/tablesorter/theme.bootstrap_3.css | 190 + .../scripts/tablesorter/theme.bootstrap_4.css | 188 + .../scripts/tablesorter/theme.dark.css | 193 + .../scripts/tablesorter/theme.default.css | 194 + .../scripts/tablesorter/theme.dropbox.css | 214 ++ .../scripts/tablesorter/theme.green.css | 212 ++ .../scripts/tablesorter/theme.grey.css | 251 ++ .../scripts/tablesorter/theme.ice.css | 212 ++ .../scripts/tablesorter/theme.jui.css | 164 + .../scripts/tablesorter/theme.materialize.css | 176 + .../scripts/tablesorter/theme.metro-dark.css | 197 + .../scripts/tablesorter/widget.grouping.css | 38 + 68 files changed, 19143 insertions(+) create mode 100644 Websites/SharePrices/SharePrices.sln create mode 100644 Websites/SharePrices/SharePrices.v12.suo create mode 100644 Websites/SharePrices/SharePrices/App_Code/DataAccessLayer.vb create mode 100644 Websites/SharePrices/SharePrices/App_Code/SharePricesUtils.vb create mode 100644 Websites/SharePrices/SharePrices/CreateDBSchema.sql create mode 100644 Websites/SharePrices/SharePrices/FlotTest.html create mode 100644 Websites/SharePrices/SharePrices/HtmlPage1.html create mode 100644 Websites/SharePrices/SharePrices/My Project/Application.Designer.vb create mode 100644 Websites/SharePrices/SharePrices/My Project/Application.myapp create mode 100644 Websites/SharePrices/SharePrices/My Project/AssemblyInfo.vb create mode 100644 Websites/SharePrices/SharePrices/My Project/MyExtensions/MyWebExtension.vb create mode 100644 Websites/SharePrices/SharePrices/My Project/Resources.Designer.vb create mode 100644 Websites/SharePrices/SharePrices/My Project/Resources.resx create mode 100644 Websites/SharePrices/SharePrices/My Project/Settings.Designer.vb create mode 100644 Websites/SharePrices/SharePrices/My Project/Settings.settings create mode 100644 Websites/SharePrices/SharePrices/SharePrices.aspx create mode 100644 Websites/SharePrices/SharePrices/SharePrices.aspx.designer.vb create mode 100644 Websites/SharePrices/SharePrices/SharePrices.aspx.vb create mode 100644 Websites/SharePrices/SharePrices/SharePrices.vbproj create mode 100644 Websites/SharePrices/SharePrices/SharePrices.vbproj.user create mode 100644 Websites/SharePrices/SharePrices/SharePricesModal.css create mode 100644 Websites/SharePrices/SharePrices/SharePricesStyles.css create mode 100644 Websites/SharePrices/SharePrices/Web.Debug.config create mode 100644 Websites/SharePrices/SharePrices/Web.Release.config create mode 100644 Websites/SharePrices/SharePrices/Web.config create mode 100644 Websites/SharePrices/SharePrices/bin/SharePrices.dll create mode 100644 Websites/SharePrices/SharePrices/bin/SharePrices.dll.config create mode 100644 Websites/SharePrices/SharePrices/bin/SharePrices.pdb create mode 100644 Websites/SharePrices/SharePrices/bin/SharePrices.xml create mode 100644 Websites/SharePrices/SharePrices/jquery-ui.css create mode 100644 Websites/SharePrices/SharePrices/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache create mode 100644 Websites/SharePrices/SharePrices/obj/Debug/SharePrices.Resources.resources create mode 100644 Websites/SharePrices/SharePrices/obj/Debug/SharePrices.dll create mode 100644 Websites/SharePrices/SharePrices/obj/Debug/SharePrices.pdb create mode 100644 Websites/SharePrices/SharePrices/obj/Debug/SharePrices.vbproj.FileListAbsolute.txt create mode 100644 Websites/SharePrices/SharePrices/obj/Debug/SharePrices.vbproj.GenerateResource.Cache create mode 100644 Websites/SharePrices/SharePrices/obj/Debug/SharePrices.xml create mode 100644 Websites/SharePrices/SharePrices/obj/Debug/TempPE/My Project.Resources.Designer.vb.dll create mode 100644 Websites/SharePrices/SharePrices/scripts/FlotGaps.js create mode 100644 Websites/SharePrices/SharePrices/scripts/SharePrices.js create mode 100644 Websites/SharePrices/SharePrices/scripts/jquery-3.5.1.min.js create mode 100644 Websites/SharePrices/SharePrices/scripts/jquery-ui.min.js create mode 100644 Websites/SharePrices/SharePrices/scripts/jquery.flot.crosshair.js create mode 100644 Websites/SharePrices/SharePrices/scripts/jquery.flot.js create mode 100644 Websites/SharePrices/SharePrices/scripts/jquery.flot.pie.js create mode 100644 Websites/SharePrices/SharePrices/scripts/jquery.flot.time.min.js create mode 100644 Websites/SharePrices/SharePrices/scripts/js.cookie-2.2.1.min.js create mode 100644 Websites/SharePrices/SharePrices/scripts/tablesorter/dragtable.mod.css create mode 100644 Websites/SharePrices/SharePrices/scripts/tablesorter/filter.formatter.css create mode 100644 Websites/SharePrices/SharePrices/scripts/tablesorter/highlights.css create mode 100644 Websites/SharePrices/SharePrices/scripts/tablesorter/jquery.tablesorter.js create mode 100644 Websites/SharePrices/SharePrices/scripts/tablesorter/jquery.tablesorter.widgets.js create mode 100644 Websites/SharePrices/SharePrices/scripts/tablesorter/theme.black-ice.css create mode 100644 Websites/SharePrices/SharePrices/scripts/tablesorter/theme.blue.css create mode 100644 Websites/SharePrices/SharePrices/scripts/tablesorter/theme.bootstrap.css create mode 100644 Websites/SharePrices/SharePrices/scripts/tablesorter/theme.bootstrap_2.css create mode 100644 Websites/SharePrices/SharePrices/scripts/tablesorter/theme.bootstrap_3.css create mode 100644 Websites/SharePrices/SharePrices/scripts/tablesorter/theme.bootstrap_4.css create mode 100644 Websites/SharePrices/SharePrices/scripts/tablesorter/theme.dark.css create mode 100644 Websites/SharePrices/SharePrices/scripts/tablesorter/theme.default.css create mode 100644 Websites/SharePrices/SharePrices/scripts/tablesorter/theme.dropbox.css create mode 100644 Websites/SharePrices/SharePrices/scripts/tablesorter/theme.green.css create mode 100644 Websites/SharePrices/SharePrices/scripts/tablesorter/theme.grey.css create mode 100644 Websites/SharePrices/SharePrices/scripts/tablesorter/theme.ice.css create mode 100644 Websites/SharePrices/SharePrices/scripts/tablesorter/theme.jui.css create mode 100644 Websites/SharePrices/SharePrices/scripts/tablesorter/theme.materialize.css create mode 100644 Websites/SharePrices/SharePrices/scripts/tablesorter/theme.metro-dark.css create mode 100644 Websites/SharePrices/SharePrices/scripts/tablesorter/widget.grouping.css diff --git a/Websites/SharePrices/SharePrices.sln b/Websites/SharePrices/SharePrices.sln new file mode 100644 index 0000000..4f02fb1 --- /dev/null +++ b/Websites/SharePrices/SharePrices.sln @@ -0,0 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.30110.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "SharePrices", "SharePrices\SharePrices.vbproj", "{AB459D42-2246-47E4-8F1B-F8325E8B780A}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {AB459D42-2246-47E4-8F1B-F8325E8B780A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AB459D42-2246-47E4-8F1B-F8325E8B780A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AB459D42-2246-47E4-8F1B-F8325E8B780A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AB459D42-2246-47E4-8F1B-F8325E8B780A}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Websites/SharePrices/SharePrices.v12.suo b/Websites/SharePrices/SharePrices.v12.suo new file mode 100644 index 0000000000000000000000000000000000000000..4b46cceefd25e1be0e2f6329e237b35bc332ab7b GIT binary patch literal 58880 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 Now() Then + Debug.Print("Bad date: " + d) + Else + dt.Rows.Add(FromEpochTime(p.DT), p.Open, p.High, p.Low, p.Close, p.Volume) + End If + Next + + Dim c As SqlCommand = GetSQLCommand("usp_InsertDailyData") + c.Parameters.AddWithValue("Symbol", Symbol) + c.Parameters.AddWithValue("PriceData", dt) + Try + InsertDailyData = DataReaderToJSONString(c.ExecuteReader()) + Catch ex As Exception + InsertDailyData = "{""ErrorMSG"":'" + ex.ToString + "'}" + End Try + DisposeSQLCommand(c) + End Function + + Public Shared Function InsertIntradayData(Symbol As String, DailyPrices As List(Of PriceData)) As String + Dim dt As New DataTable("IntradayPrices") + dt.Columns.Add(New DataColumn("PriceDT", System.Type.GetType("System.DateTime"))) + dt.Columns.Add(New DataColumn("OpenPrice", System.Type.GetType("System.Double"))) + dt.Columns.Add(New DataColumn("HighPrice", System.Type.GetType("System.Double"))) + dt.Columns.Add(New DataColumn("LowPrice", System.Type.GetType("System.Double"))) + dt.Columns.Add(New DataColumn("ClosePrice", System.Type.GetType("System.Double"))) + dt.Columns.Add(New DataColumn("Volume", System.Type.GetType("System.Int64"))) + For Each p As PriceData In DailyPrices + Dim d As DateTime = FromEpochTime(p.DT) + If d < New DateTime(1980, 1, 1) Or d > Now() Then + Debug.Print("Bad date: " + d) + Else + dt.Rows.Add(FromEpochTime(p.DT), p.Open, p.High, p.Low, p.Close, p.Volume) + End If + Next + + Dim c As SqlCommand = GetSQLCommand("usp_InsertIntradayData") + c.Parameters.AddWithValue("Symbol", Symbol) + c.Parameters.AddWithValue("PriceData", dt) + Try + InsertIntradayData = DataReaderToJSONString(c.ExecuteReader()) + Catch ex As Exception + InsertIntradayData = "{""ErrorMSG"":'" + ex.ToString + "'}" + End Try + DisposeSQLCommand(c) + End Function + + Public Shared Function DeleteHolding(HoldingID) As String + Dim c As SqlCommand = GetSQLCommand("usp_DeleteHolding") + c.Parameters.AddWithValue("HoldingID", HoldingID) + DeleteHolding = DataReaderToJSONString(c.ExecuteReader()) + DisposeSQLCommand(c) + End Function + + Private Shared Function GetSQLConnection() As SqlConnection + Dim c As New SqlConnection("Server=OZHOST1\SQL2008;Database=SharePrices;Trusted_Connection=True;Application Name=Share Prices Web;") + c.Open() + Return c + End Function + + Private Shared Function GetSQLCommand(StoredProcedureName As String) As SqlCommand + Dim c As New SqlCommand(StoredProcedureName, GetSQLConnection()) + c.CommandType = Data.CommandType.StoredProcedure + Return c + End Function + + Private Shared Sub DisposeSQLCommand(c As SqlCommand) + c.Connection.Close() + c.Connection.Dispose() + c.Dispose() + End Sub + + Private Shared Function DataReaderToJSONString(dr As SqlDataReader) As String + Dim fieldNo As Integer + Dim noRows As Integer = 0 + Dim result As String = "" + Dim thisRow As String + While dr.Read + noRows += 1 + thisRow = "" + For fieldNo = 0 To dr.FieldCount - 1 + 'Debug.Print(" Field " + fieldNo.ToString + "(" + dr.GetName(fieldNo) + "): " + dr.GetDataTypeName(fieldNo)) + thisRow += ",""" + dr.GetName(fieldNo) + """:" + If IsDBNull(dr(fieldNo)) Then + thisRow += "null" + Else + Select Case dr.GetDataTypeName(fieldNo).ToUpper + Case "CHAR", "VARCHAR" : thisRow += """" + dr(fieldNo) + """" + Case "DATETIME", "SMALLDATETIME", "DATETIME2", "DATE" : thisRow += ToEpochTime(dr(fieldNo)).ToString() + Case Else : thisRow += dr(fieldNo).ToString() + End Select + End If + Next + result += "," + "{" + thisRow.Substring(1) + "}" + End While + If result <> "" Then result = result.Substring(1) + If noRows > 1 Then result = "[" + result + "]" + 'Debug.Print("Result: " + result) + Return result + End Function +End Class diff --git a/Websites/SharePrices/SharePrices/App_Code/SharePricesUtils.vb b/Websites/SharePrices/SharePrices/App_Code/SharePricesUtils.vb new file mode 100644 index 0000000..7032712 --- /dev/null +++ b/Websites/SharePrices/SharePrices/App_Code/SharePricesUtils.vb @@ -0,0 +1,40 @@ +Imports System.Diagnostics +Public Class SharePricesUtils + Private Shared JavascriptEpochTimeBase As New Date(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc) + + Public Shared Function ToEpochTime(DT As Date) As Long + Return (DT - JavascriptEpochTimeBase).TotalMilliseconds + End Function + + Public Shared Function FromEpochTime(DT As Long) As Date + Return JavascriptEpochTimeBase.AddMilliseconds(DT) + End Function + + Public Shared Sub SetResponseAndCompleteRequest(CurrentRequest As HttpContext, ContentType As String, ResponseText As String) + 'System.Diagnostics.Debug.Print("ReponseText: " + ResponseText) + With CurrentRequest + .Response.Clear() + .Response.ContentType = ContentType + .Response.Write(ResponseText) + .Response.Flush() + .Response.SuppressContent = True + .ApplicationInstance.CompleteRequest() + End With + End Sub + + Public Shared Sub SetResponseAndCompleteRequest(CurrentRequest As HttpContext, ContentType As String, BinaryResponse() As Byte) + Try + With CurrentRequest + .Response.Clear() + .Response.ContentType = ContentType + .Response.BinaryWrite(BinaryResponse) + .Response.Flush() + .Response.SuppressContent = True + .ApplicationInstance.CompleteRequest() + End With + Catch ex As Exception + Debug.Print("SetResponseAndCompleteRequest (binary) error: " + ex.ToString()) + End Try + End Sub + +End Class diff --git a/Websites/SharePrices/SharePrices/CreateDBSchema.sql b/Websites/SharePrices/SharePrices/CreateDBSchema.sql new file mode 100644 index 0000000..2328539 --- /dev/null +++ b/Websites/SharePrices/SharePrices/CreateDBSchema.sql @@ -0,0 +1,649 @@ +USE SharePrices +GO + +/* +DROP VIEW vHolding +DROP PROCEDURE usp_GetHoldingsHistory +DROP PROCEDURE usp_DeleteHolding +DROP PROCEDURE usp_GetAccounts +DROP PROCEDURE usp_GetHoldings +DROP PROCEDURE usp_InsertHolding +DROP PROCEDURE usp_InsertIntradayData +DROP PROCEDURE usp_InsertDailyData +DROP PROCEDURE usp_GetDailyData +DROP PROCEDURE usp_GetIntradayData +DROP PROCEDURE usp_InsertInstrument +DROP PROCEDURE usp_GetInstruments +DROP TYPE PriceDataType +DROP TABLE Holding +DROP TABLE Account +DROP TABLE InstrumentHistory_Daily +DROP TABLE InstrumentHistory_Intraday +DROP TABLE Instrument +--DROP TABLE Exchange +*/ +GO + +/* +CREATE LOGIN [OZDOMAIN\SharePrices_WebApp] FROM WINDOWS +CREATE USER [OZDOMAIN\SharePrices_WebApp] FOR LOGIN [OZDOMAIN\SharePrices_WebApp] +CREATE ROLE WebApp_Role +EXEC sp_addrolemember 'WebApp_Role', 'OZDOMAIN\SharePrices_WebApp' +*/ + +/* +CREATE TABLE Exchange ( + ExchangeID tinyint IDENTITY NOT NULL, + ShortName varchar(10) NOT NULL, + FullName varchar(50) NULL, + CONSTRAINT PK_Exchange PRIMARY KEY CLUSTERED (ExchangeID) +) +GO +INSERT Exchange (ShortName, FullName) + VALUES ('N/A', 'N/A'), + ('ASX', 'Australian Stock Exchange'), + ('LSE', 'London Stock Exchange'), + ('NYSE', 'New York Stock Exchange'), + ('NASDAQ', 'NASDAQ') +GO +*/ + +CREATE TABLE Instrument ( + InstrumentID smallint IDENTITY NOT NULL, + --ExchangeID tinyint NOT NULL, + Symbol VARCHAR(8) NOT NULL, + FullName VARCHAR(100) NULL, + DisplayOrder TINYINT NULL, + CONSTRAINT PK_Instrument PRIMARY KEY CLUSTERED (InstrumentID), + --CONSTRAINT FK_Instrument_Exchange FOREIGN KEY (ExchangeID) REFERENCES Exchange (ExchangeID) +) +GO +--CREATE NONCLUSTERED INDEX IDX_Instrument_ExchangeID_Symbol ON Instrument (ExchangeID, Symbol) +CREATE NONCLUSTERED INDEX IDX_Instrument_Symbol ON Instrument (Symbol) +CREATE NONCLUSTERED INDEX IDX_Instrument_DisplayOrder ON Instrument (DisplayOrder) +GO + +CREATE TABLE InstrumentHistory_Daily ( + InstrumentID smallint NOT NULL, + HistoryDT date NOT NULL, + OpenPrice money NULL, + HighPrice money NULL, + LowPrice money NULL, + ClosePrice money NULL, + Volume bigint NULL, + CONSTRAINT PK_InstrumentHistory_Daily PRIMARY KEY CLUSTERED (InstrumentID, HistoryDT), + CONSTRAINT FK_InstrumentHistory_Daily_Instrument FOREIGN KEY (InstrumentID) REFERENCES Instrument (InstrumentID) +) +GO + +CREATE TABLE InstrumentHistory_Intraday ( + InstrumentID smallint NOT NULL, + HistoryDT smalldatetime NOT NULL, + OpenPrice money NULL, + HighPrice money NULL, + LowPrice money NULL, + ClosePrice money NULL, + Volume bigint NULL, + CONSTRAINT PK_InstrumentHistory_Intraday PRIMARY KEY CLUSTERED (InstrumentID, HistoryDT), + CONSTRAINT FK_InstrumentHistory_Intraday_Instrument FOREIGN KEY (InstrumentID) REFERENCES Instrument (InstrumentID) +) +GO + +CREATE TABLE Account ( + AccountID tinyint IDENTITY NOT NULL, + ShortName varchar(20) NOT NULL, + CONSTRAINT PK_Account PRIMARY KEY CLUSTERED (AccountID), + CONSTRAINT UC_Account_ShortName UNIQUE NONCLUSTERED (ShortName) +) +GO +INSERT Account (ShortName) VALUES + ('Steve HL ISA'), + ('Steve HL Trd'), + ('Steph HL Trd'), + ('Steph ii ISA'), + ('Steph ii Trd'), + ('Steve ii Trd'), + ('Steve AJB'), + ('Steph AJB') +GO + +CREATE TABLE Holding ( + HoldingID int IDENTITY NOT NULL, + AccountID tinyint NOT NULL, + InstrumentID smallint NOT NULL, + NoUnits int NOT NULL, + PurchasePricePerUnit money NOT NULL, + PurchaseDate datetime NOT NULL, + SoldDate datetime NULL, + CONSTRAINT PK_Holding PRIMARY KEY CLUSTERED (HoldingID), + CONSTRAINT FK_Holding_Account FOREIGN KEY (AccountID) REFERENCES Account (AccountID), + CONSTRAINT FK_Holding_Instrument FOREIGN KEY (InstrumentID) REFERENCES Instrument (InstrumentID) +) +GO + +CREATE TYPE PriceDataType +AS TABLE ( + PriceDT datetime NOT NULL, + OpenPrice money NULL, + HighPrice money NULL, + LowPrice money NULL, + ClosePrice money NULL, + Volume bigint NULL +) +GO +GRANT EXECUTE ON TYPE::PriceDataType TO WebApp_Role +GO + +--CREATE PROCEDURE usp_InsertInstrument (@ExchangeShortName varchar(10), @Symbol varchar(7), @FullName varchar(100)) +CREATE PROCEDURE usp_InsertInstrument (@Symbol varchar(8), @FullName varchar(100)) +AS +BEGIN + SET NOCOUNT ON + DECLARE @DisplayOrder tinyint + + IF NOT EXISTS (SELECT NULL FROM Instrument WHERE Symbol = @Symbol) + BEGIN + SELECT @DisplayOrder = MAX(DisplayOrder)+1 FROM Instrument + SELECT @DisplayOrder = ISNULL(@DisplayOrder, 1) + + --INSERT Instrument (ExchangeID, Symbol, FullName, DisplayOrder) SELECT @ExchangeID, @Symbol, @FullName, @DisplayOrder WHERE NOT EXISTS (SELECT NULL FROM Instrument WHERE ExchangeID = @ExchangeID AND Symbol = @Symbol) + INSERT Instrument (Symbol, FullName, DisplayOrder) SELECT @Symbol, @FullName, @DisplayOrder + SELECT + i.DisplayOrder, + i.FullName as [InstrumentName], + i.Symbol as [Symbol], + CONVERT(DATETIME, '2030-12-31') as [MinDailyDate], + CONVERT(DATETIME, '1970-01-01') as [MaxDailyDate], + CONVERT(DATETIME, '2030-12-31') as [MinIntradayDate], + CONVERT(DATETIME, '1970-01-01') as [MaxIntradayDate] + FROM + Instrument i + WHERE + Symbol = @Symbol + END +END +GO +GRANT EXECUTE ON usp_InsertInstrument TO WebApp_Role +GO +EXEC usp_InsertInstrument '^AXJO', 'S&P ASX 200' +EXEC usp_InsertInstrument 'QAN.AX', 'Qantas' +EXEC usp_InsertInstrument 'WEB.AX', 'Webjet' +EXEC usp_InsertInstrument 'WBC.AX', 'Westpac' +EXEC usp_InsertInstrument 'CBA.AX', 'Commonwealth Bank' +EXEC usp_InsertInstrument 'FLT.AX', 'Flight Centre' +EXEC usp_InsertInstrument '^FTSE', 'FTSE 100' +EXEC usp_InsertInstrument '^FTAS', 'FTSE All-Share' +EXEC usp_InsertInstrument 'TMPL.L', 'Temple Bar Investment Trust' +EXEC usp_InsertInstrument 'SDV.L', 'Cherverton Investment Trust' +EXEC usp_InsertInstrument 'MKS.L', 'Marks & Spencer' +EXEC usp_InsertInstrument 'BP.L', 'BP' +EXEC usp_InsertInstrument 'RDSB.L', 'Royal Dutch Shell' +EXEC usp_InsertInstrument 'LLOY.L', 'Lloyds Bank' +EXEC usp_InsertInstrument 'BARC.L', 'Barclays Bank' +EXEC usp_InsertInstrument 'AML.L', 'Aston Martin Lagonda' +EXEC usp_InsertInstrument 'TUI.L', 'TUI' +EXEC usp_InsertInstrument 'RR.L', 'Rolls Royce' +EXEC usp_InsertInstrument 'IAG.L', 'International Consolidated Airlines' +EXEC usp_InsertInstrument 'CCL.L', 'Carnival Cruises (LSE)' +EXEC usp_InsertInstrument '^GSPC', 'S&P 500' +EXEC usp_InsertInstrument '^DJI', 'Dow Jones Industrial Average' +EXEC usp_InsertInstrument '^IXIC', 'NASDAQ Composite' +EXEC usp_InsertInstrument 'CCL', 'Carnival Cruises (NYSE)' +EXEC usp_InsertInstrument 'RCL', 'Royal Caribbean Cruises' +EXEC usp_InsertInstrument 'NCLH', 'Norwegian Cruise Line Holdings' +EXEC usp_InsertInstrument 'AAL', 'American Airlines' +EXEC usp_InsertInstrument 'EBAY', 'E-bay' +--EXEC usp_InsertInstrument 'AMZN', 'Amazon' +EXEC usp_InsertInstrument 'GBPUSD=X', 'GBP/USD' +EXEC usp_InsertInstrument 'GBPAUD=X', 'GBP/AUD' +GO + +/* + +delete InstrumentHistory_Intraday where InstrumentID>31 +delete InstrumentHistory_Daily where InstrumentID>31 +delete Instrument where InstrumentID>31 + +*/ + +CREATE PROCEDURE usp_GetAccounts +AS +BEGIN + SET NOCOUNT ON + + SELECT + ShortName as [AccountName] + FROM + Account + ORDER BY + ShortName +END +GO +GRANT EXECUTE ON usp_GetAccounts TO WebApp_Role +GO + +CREATE PROCEDURE usp_GetInstruments +AS +BEGIN + SET NOCOUNT ON + + SELECT + i.DisplayOrder, + --e.ShortName as [Exchange], + i.FullName as [InstrumentName], + i.Symbol as [Symbol], + ISNULL((SELECT MIN(dd.HistoryDT) FROM InstrumentHistory_Daily dd WHERE dd.InstrumentID = i.InstrumentID), CONVERT(DATETIME, '2030-12-31')) as [MinDailyDate], + ISNULL((SELECT MAX(dd.HistoryDT) FROM InstrumentHistory_Daily dd WHERE dd.InstrumentID = i.InstrumentID), CONVERT(DATETIME, '1970-01-01')) as [MaxDailyDate], + ISNULL((SELECT MIN(id.HistoryDT) FROM InstrumentHistory_Intraday id WHERE id.InstrumentID = i.InstrumentID), CONVERT(DATETIME, '2030-12-31')) as [MinIntradayDate], + ISNULL((SELECT MAX(id.HistoryDT) FROM InstrumentHistory_Intraday id WHERE id.InstrumentID = i.InstrumentID), CONVERT(DATETIME, '1970-01-01')) as [MaxIntradayDate] + FROM + Instrument i + /*INNER JOIN Exchange e + ON e.ExchangeID = i.ExchangeID*/ + ORDER BY + i.DisplayOrder +END +GO +GRANT EXECUTE ON usp_GetInstruments TO WebApp_Role +GO + +CREATE PROCEDURE usp_GetDailyData (@Symbol varchar(8), @StartDate datetime, @EndDate datetime) +AS +BEGIN + SELECT + h.HistoryDT as [DT], + h.OpenPrice as [open], + h.HighPrice as [high], + h.LowPrice as [low], + h.ClosePrice as [close], + h.Volume as [volume] + FROM + Instrument i + INNER JOIN InstrumentHistory_Daily h + ON h.InstrumentID = i.InstrumentID + WHERE + i.Symbol = @Symbol + AND h.HistoryDT >= @StartDate + AND h.HistoryDT <= @EndDate + ORDER BY + h.HistoryDT +END +GO +GRANT EXECUTE ON usp_GetDailyData TO WebApp_Role +GO + +CREATE PROCEDURE usp_GetIntradayData (@Symbol varchar(8), @StartDate datetime, @EndDate datetime) +AS +BEGIN + DECLARE @MAX_DAYS INT = 90 + + IF DATEDIFF(dd, @StartDate, @EndDate) > @MAX_DAYS + BEGIN + SET @StartDate = DATEADD(dd, 0-@MAX_DAYS, @EndDate) + END + + SELECT + h.HistoryDT as [DT], + h.OpenPrice as [open], + h.HighPrice as [high], + h.LowPrice as [low], + h.ClosePrice as [close], + h.Volume as [volume] + FROM + Instrument i + INNER LOOP JOIN InstrumentHistory_Intraday h + ON h.InstrumentID = i.InstrumentID + WHERE + i.Symbol = @Symbol + AND h.HistoryDT >= @StartDate + AND h.HistoryDT <= @EndDate + ORDER BY + h.HistoryDT +END +GO +GRANT EXECUTE ON usp_GetIntradayData TO WebApp_Role +GO + +CREATE PROCEDURE usp_InsertDailyData (@Symbol varchar(8), @PriceData PriceDataType READONLY) +AS +BEGIN + SET NOCOUNT ON + DECLARE @InstrumentID int + DECLARE @NoUpdated int + DECLARE @NoInserted int + + SELECT @InstrumentID = InstrumentID FROM Instrument WHERE Symbol = @Symbol + + IF @InstrumentID IS NOT NULL + BEGIN + UPDATE + h + SET + OpenPrice = d.OpenPrice, + HighPrice = d.HighPrice, + LowPrice = d.LowPrice, + ClosePrice = d.ClosePrice, + Volume = d.Volume + FROM + @PriceData d + INNER JOIN InstrumentHistory_Daily h + ON h.InstrumentID = @InstrumentID + AND h.HistoryDT = CONVERT(date, d.PriceDT) + + SET @NoUpdated = @@ROWCOUNT + + INSERT InstrumentHistory_Daily ( + InstrumentID, + HistoryDT, + OpenPrice, + HighPrice, + LowPrice, + ClosePrice, + Volume) + SELECT + @InstrumentID, + CONVERT(date, PriceDT), + OpenPrice, + HighPrice, + LowPrice, + ClosePrice, + Volume + FROM + @PriceData d + WHERE + NOT EXISTS (SELECT NULL FROM InstrumentHistory_Daily h WHERE h.InstrumentID = @InstrumentID AND h.HistoryDT = CONVERT(date, d.PriceDT)) + + SET @NoInserted = @@ROWCOUNT + + SELECT @NoInserted as [NoInserted], @NoUpdated as [NoUpdated] + END + ELSE + BEGIN + SELECT CONVERT(int, 0) as [NoInserted], CONVERT(int, 0) as [NoUpdated] + END +END +GO +GRANT EXECUTE ON usp_InsertDailyData TO WebApp_Role +GO + +CREATE PROCEDURE usp_InsertIntradayData (@Symbol varchar(8), @PriceData PriceDataType READONLY) +AS +BEGIN + SET NOCOUNT ON + DECLARE @InstrumentID int + DECLARE @NoUpdated int + DECLARE @NoInserted int + + SELECT @InstrumentID = InstrumentID FROM Instrument WHERE Symbol = @Symbol + + IF @InstrumentID IS NOT NULL + BEGIN + UPDATE + h + SET + OpenPrice = d.OpenPrice, + HighPrice = d.HighPrice, + LowPrice = d.LowPrice, + ClosePrice = d.ClosePrice, + Volume = d.Volume + FROM + @PriceData d + INNER JOIN InstrumentHistory_Intraday h + ON h.InstrumentID = @InstrumentID + AND h.HistoryDT = d.PriceDT + + SET @NoUpdated = @@ROWCOUNT + + INSERT InstrumentHistory_Intraday ( + InstrumentID, + HistoryDT, + OpenPrice, + HighPrice, + LowPrice, + ClosePrice, + Volume) + SELECT + @InstrumentID, + PriceDT, + OpenPrice, + HighPrice, + LowPrice, + ClosePrice, + Volume + FROM + @PriceData d + WHERE + NOT EXISTS (SELECT NULL FROM InstrumentHistory_Intraday h WHERE h.InstrumentID = @InstrumentID AND h.HistoryDT = d.PriceDT) + + SET @NoInserted = @@ROWCOUNT + + SELECT @NoInserted as [NoInserted], @NoUpdated as [NoUpdated] + END + ELSE + BEGIN + SELECT CONVERT(int, 0) as [NoInserted], CONVERT(int, 0) as [NoUpdated] + END +END +GO +GRANT EXECUTE ON usp_InsertIntradayData TO WebApp_Role +GO + +CREATE PROCEDURE usp_InsertHolding (@Account varchar(20), @Symbol varchar(8), @NoUnits int, @PurchasePricePerUnit money, @PurchaseDate datetime, @Solddate datetime = NULL) +AS +BEGIN + DECLARE @AccountID tinyint + DECLARE @InstrumentID smallint + + SELECT @AccountID = AccountID FROM Account WHERE ShortName = @Account + + SELECT @InstrumentID = InstrumentID FROM Instrument WHERE Symbol = @Symbol + + INSERT Holding ( + AccountID, + InstrumentID, + NoUnits, + PurchasePricePerUnit, + PurchaseDate, + SoldDate) + SELECT + @AccountID, + @InstrumentID, + @NoUnits, + @PurchasePricePerUnit, + @PurchaseDate, + @SoldDate + + SELECT + h.HoldingID, + a.ShortName as [AccountName], + i.Symbol, + h.PurchaseDate, + h.NoUnits, + h.PurchasePricePerUnit, + h.SoldDate + FROM + Holding h + INNER JOIN Instrument i + ON i.InstrumentID = h.InstrumentID + INNER JOIN Account a + ON a.AccountID = h.AccountID + WHERE + h.HoldingID = @@IDENTITY +END +GO +GRANT EXECUTE ON usp_InsertHolding TO WebApp_Role +GO +-- EXEC usp_InsertHolding 'Steve ii Trd', 'QAN.AX', 15700, 3.63, '2020-04-28', '2020-06-12' +-- EXEC usp_InsertHolding 'Steve ii Trd', 'WEB.AX', 17000, 2.55, '2020-04-28', '2020-06-12' +-- EXEC usp_InsertHolding 'Steve ii Trd', 'WBC.AX', 2240, 15.07, '2020-05-13', '2020-06-12' +-- EXEC usp_InsertHolding 'Steve ii Trd', 'FLT.AX', 3500, 13.813, '2020-06-03', '2020-06-12' +-- EXEC usp_InsertHolding 'Steve ii Trd', 'WEB.AX', 20618, 3.0359, '2020-07-22 05:37', NULL +-- EXEC usp_InsertHolding 'Steph ii Trd', 'CBA.AX', 580, 59.00, '2020-05-13', '2020-06-12' +-- EXEC usp_InsertHolding 'Steph ii Trd', 'NCLH', 2580, 19.037, '2020-07-21 11:55', NULL +-- EXEC usp_InsertHolding 'Steph ii Trd', 'NCLH', 2580, 15.1690, '2020-07-21 11:55', NULL +-- EXEC usp_InsertHolding 'Steph ii Trd', 'RCL', 1071, 53.7053, '2020-07-21 12:01', NULL +-- EXEC usp_InsertHolding 'Steph ii Trd', 'RCL', 1078, 53.192, '2020-07-21 12:18', NULL +-- EXEC usp_InsertHolding 'Steph ii ISA', 'AAL', 2170, 11.5245, '2020-07-21 12:13', NULL +-- EXEC usp_InsertHolding 'Steph ii ISA', 'FLT.AX', 2705, 11.63, '2020-08-20 01:10', NULL + +EXEC usp_InsertHolding 'Steve AJB', 'TMPL.L', 5623, 708, '2020-05-13' +EXEC usp_InsertHolding 'Steve AJB', 'MKS.L', 33546, 89, '2020-05-11' +-- EXEC usp_InsertHolding 'Steve AJB', 'CCL', 2334, 17.44, '2020-06-03', '2020-06-11' +EXEC usp_InsertHolding 'Steph AJB', 'TMPL.L', 2372, 708, '2020-05-13' +-- EXEC usp_InsertHolding 'Steph AJB', 'SDV.L', 2000, 127, '2020-05-17', '2020-06-12' +EXEC usp_InsertHolding 'Steph AJB', 'BP.L', 5787, 311, '2020-05-13' +EXEC usp_InsertHolding 'Steph AJB', 'RDSB.L', 1897, 1264.88, '2020-05-11' +EXEC usp_InsertHolding 'Steph AJB', 'LLOY.L', 59170, 30.42, '2020-05-11' +EXEC usp_InsertHolding 'Steph AJB', 'BARC.L', 17261, 104.28, '2020-05-11' +-- EXEC usp_InsertHolding 'Steph ii ISA', 'RCL', 1050, 54.15 , '2020-05-27', '2020-06-11' +-- EXEC usp_InsertHolding 'Steph ii Trd', 'NCLH', 2650, 17.8, '2020-05-27', '2020-06-11' +-- EXEC usp_InsertHolding 'Steph ii Trd', 'AML.L', 9985, 67.1, '2020-06-04', '2020-06-12' +-- EXEC usp_InsertHolding 'Steve HL ISA', 'NCLH', 3053, 17.27, '2020-05-27', '2020-06-11' +-- EXEC usp_InsertHolding 'Steve HL ISA', 'NCLH', 3053, 17.27, '2020-05-17', '2020-06-24 18:24' +-- EXEC usp_InsertHolding 'Steve HL ISA', 'CCL', 2667, 15.451, '2020-07-21 17:10', NULL +-- EXEC usp_InsertHolding 'Steve HL Trd', 'AAL', 2994, 12.35, '2020-05-27', '2020-06-11' +EXEC usp_InsertHolding 'Steph HL Trd', 'IAG.L', 6644, 325.1, '2020-06-05' +EXEC usp_InsertHolding 'Steve HL Trd', 'TUI.L', 4010, 490.93, '2020-06-05' +-- EXEC usp_InsertHolding 'Steph HL Trd', 'EBAY', 949, 39.35, '2020-04-29', '2020-06-11' +-- EXEC usp_InsertHolding 'Steph HL Trd', 'NCLH', 1696, 21.72, '2020-06-10', '2020-06-11' +-- EXEC usp_InsertHolding 'Steph HL Trd', 'AMZN', 15, 2375.18, '2020-04-29', '2020-06-05' +EXEC usp_InsertHolding 'Steph HL Trd', 'RR.L', 5783, 335.08, '2020-06-05' +EXEC usp_InsertHolding 'Steph HL Trd', 'RR.L', 19276, 32.00, '2020-11-09' +EXEC usp_InsertHolding 'Steve ii Trd', 'MAB.L', 9044, 227.2204, '2020-06-22 10:38', '2020-11-16 09:42' +EXEC usp_InsertHolding 'Steve ii Trd', 'JDW.L', 824, 11.3962, '2020-06-22 10:40', '2020-11-25 12:47' +EXEC usp_InsertHolding 'Steve ii Trd', 'RTN.L', 39894, 0.70936, '2020-06-22 10:34', '2020-12-02 10:50' +EXEC usp_InsertHolding 'Steve ii Trd', 'AML.L', 1078, 1854.724, '2020-12-24 09:22', NULL +EXEC usp_InsertHolding 'Steve ii Trd', 'IAG.L', 10911, 166.3459, '2020-12-24 09:28', NULL +EXEC usp_InsertHolding 'Steve ii Trd', 'CCL.L', 2576, 1203.112, '2020-11-16 12:56', NULL +EXEC usp_InsertHolding 'Steph ii Trd', 'NCLH', 960, 21.1690, '2020-11-18 15:55', NULL +EXEC usp_InsertHolding 'Steph ii Trd', 'NCLH', 40, 21.08, '2020-11-18 15:58', NULL + +GO + +CREATE VIEW vHolding +AS + SELECT + h.HoldingID, + a.ShortName as [AccountName], + i.Symbol, + i.FullName as [InstrumentName], + h.PurchaseDate, + h.NoUnits, + h.PurchasePricePerUnit, + h.SoldDate + FROM + Holding h + INNER JOIN Instrument i + ON i.InstrumentId = h.InstrumentId + INNER JOIN Account a + ON a.AccountID = h.AccountID +GO + +-- select * from vholding where instrumentname like '%caribb%' + +-- update holding set solddate = '2020-06-24 18:27' where holdingid = 34 + +CREATE PROCEDURE usp_GetHoldings +AS +BEGIN + SELECT + h.HoldingID, + a.ShortName as [AccountName], + i.Symbol as [Symbol], + h.PurchaseDate, + h.NoUnits, + h.PurchasePricePerUnit, + h.SoldDate + FROM + Holding h + INNER JOIN Instrument i + ON h.InstrumentID = i.InstrumentID + INNER JOIN Account a + ON a.AccountID = h.AccountID + ORDER BY + i.Symbol, + h.PurchaseDate, + a.ShortName, + h.NoUnits, + h.PurchasePricePerUnit, + h.SoldDate +END +GO +GRANT EXECUTE ON usp_GetHoldings TO WebApp_Role +GO + +CREATE PROCEDURE usp_GetHoldingsHistory +AS +BEGIN + DECLARE @Dates TABLE (InstrumentID int, DT datetime) + + INSERT @Dates + SELECT + InstrumentID, + PurchaseDate as [DT] + FROM + Holding + UNION + SELECT + InstrumentID, + SoldDate as [DT] + FROM + Holding + WHERE + SoldDate IS NOT NULL + ORDER BY + DT + + SELECT + i.Symbol, + d.DT, + ISNULL((SELECT SUM(NoUnits) FROM Holding p WHERE p.InstrumentID = d.InstrumentID AND p.PurchaseDate <= d.DT), 0) - + ISNULL((SELECT SUM(NoUnits) FROM Holding s WHERE s.InstrumentID = d.InstrumentID AND s.SoldDate <= d.DT), 0) as [TotalUnits], + ISNULL((SELECT SUM(NoUnits*PurchasePricePerUnit) FROM Holding p WHERE p.InstrumentID = d.InstrumentID AND p.PurchaseDate <= d.DT), 0) - + ISNULL((SELECT SUM(NoUnits*PurchasePricePerUnit) FROM Holding s WHERE s.InstrumentID = d.InstrumentID AND s.SoldDate <= d.DT), 0) as [TotalCost] + FROM + @Dates d + INNER JOIN Instrument i + ON i.InstrumentID = d.InstrumentID + ORDER BY + d.InstrumentID, + d.DT +END +GO +GRANT EXECUTE ON usp_GetHoldingsHistory TO WebApp_Role +GO + +CREATE PROCEDURE usp_DeleteHolding (@HoldingID int) +AS +BEGIN + DELETE Holding WHERE HoldingID = @HoldingID + SELECT @@ROWCOUNT AS [RecordsDeleted] +END +GO +GRANT EXECUTE ON usp_DeleteHolding TO WebApp_Role +GO + +/* + +select * from Instrument + +select * from InstrumentHistory_Daily +select * from InstrumentHistory_Intraday + +select * from InstrumentHistory_Intraday where InstrumentID = 18 order by HistoryDT desc + +--Delete daily prices that are 90% less than previous and next daily prices +DELETE d1 +FROM + InstrumentHistory_Daily d1 + INNER JOIN InstrumentHistory_Daily p + ON p.InstrumentID = d1.InstrumentID + AND p.HistoryDT = (SELECT MAX(HistoryDT) FROM InstrumentHistory_Daily WHERE InstrumentID = d1.InstrumentID AND HistoryDT < d1.HistoryDT) + INNER JOIN InstrumentHistory_Daily n + ON n.InstrumentID = d1.InstrumentID + AND n.HistoryDT = (SELECT MIN(HistoryDT) FROM InstrumentHistory_Daily WHERE InstrumentID = d1.InstrumentID AND HistoryDT > d1.HistoryDT) +WHERE + p.ClosePrice/d1.ClosePrice > 90 + AND n.ClosePrice/d1.ClosePrice > 90 + +*/ diff --git a/Websites/SharePrices/SharePrices/FlotTest.html b/Websites/SharePrices/SharePrices/FlotTest.html new file mode 100644 index 0000000..6beb0c0 --- /dev/null +++ b/Websites/SharePrices/SharePrices/FlotTest.html @@ -0,0 +1,119 @@ + + + + Flot test + + + + + + +
+
+ + + + diff --git a/Websites/SharePrices/SharePrices/HtmlPage1.html b/Websites/SharePrices/SharePrices/HtmlPage1.html new file mode 100644 index 0000000..e582cfe --- /dev/null +++ b/Websites/SharePrices/SharePrices/HtmlPage1.html @@ -0,0 +1,89 @@ + + + + + + + +
+
+
+ + + diff --git a/Websites/SharePrices/SharePrices/My Project/Application.Designer.vb b/Websites/SharePrices/SharePrices/My Project/Application.Designer.vb new file mode 100644 index 0000000..8f0e3bf --- /dev/null +++ b/Websites/SharePrices/SharePrices/My Project/Application.Designer.vb @@ -0,0 +1,12 @@ +'------------------------------------------------------------------------------ +' +' This code was generated by a tool. +' +' Changes to this file may cause incorrect behavior and will be lost if +' the code is regenerated. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + diff --git a/Websites/SharePrices/SharePrices/My Project/Application.myapp b/Websites/SharePrices/SharePrices/My Project/Application.myapp new file mode 100644 index 0000000..758895d --- /dev/null +++ b/Websites/SharePrices/SharePrices/My Project/Application.myapp @@ -0,0 +1,10 @@ + + + false + false + 0 + true + 0 + 1 + true + diff --git a/Websites/SharePrices/SharePrices/My Project/AssemblyInfo.vb b/Websites/SharePrices/SharePrices/My Project/AssemblyInfo.vb new file mode 100644 index 0000000..1694c95 --- /dev/null +++ b/Websites/SharePrices/SharePrices/My Project/AssemblyInfo.vb @@ -0,0 +1,34 @@ +Imports System +Imports System.Reflection +Imports System.Runtime.InteropServices + +' General Information about an assembly is controlled through the following +' set of attributes. Change these attribute values to modify the information +' associated with an assembly. + +' Review the values of the assembly attributes + + + + + + + + + +'The following GUID is for the ID of the typelib if this project is exposed to COM + + +' Version information for an assembly consists of the following four values: +' +' Major Version +' Minor Version +' Build Number +' Revision +' +' You can specify all the values or you can default the Build and Revision Numbers +' by using the '*' as shown below: +' + + + diff --git a/Websites/SharePrices/SharePrices/My Project/MyExtensions/MyWebExtension.vb b/Websites/SharePrices/SharePrices/My Project/MyExtensions/MyWebExtension.vb new file mode 100644 index 0000000..78c7c19 --- /dev/null +++ b/Websites/SharePrices/SharePrices/My Project/MyExtensions/MyWebExtension.vb @@ -0,0 +1,73 @@ +#If _MyType <> "Empty" Then + +Namespace My + ''' + ''' Module used to define the properties that are available in the My Namespace for Web projects. + ''' + ''' + _ + Module MyWebExtension + Private s_Computer As New ThreadSafeObjectProvider(Of Global.Microsoft.VisualBasic.Devices.ServerComputer) + Private s_User As New ThreadSafeObjectProvider(Of Global.Microsoft.VisualBasic.ApplicationServices.WebUser) + Private s_Log As New ThreadSafeObjectProvider(Of Global.Microsoft.VisualBasic.Logging.AspLog) + ''' + ''' Returns information about the host computer. + ''' + _ + Friend ReadOnly Property Computer() As Global.Microsoft.VisualBasic.Devices.ServerComputer + Get + Return s_Computer.GetInstance() + End Get + End Property + ''' + ''' Returns information for the current Web user. + ''' + _ + Friend ReadOnly Property User() As Global.Microsoft.VisualBasic.ApplicationServices.WebUser + Get + Return s_User.GetInstance() + End Get + End Property + ''' + ''' Returns Request object. + ''' + _ + _ + Friend ReadOnly Property Request() As Global.System.Web.HttpRequest + _ + Get + Dim CurrentContext As Global.System.Web.HttpContext = Global.System.Web.HttpContext.Current + If CurrentContext IsNot Nothing Then + Return CurrentContext.Request + End If + Return Nothing + End Get + End Property + ''' + ''' Returns Response object. + ''' + _ + _ + Friend ReadOnly Property Response() As Global.System.Web.HttpResponse + _ + Get + Dim CurrentContext As Global.System.Web.HttpContext = Global.System.Web.HttpContext.Current + If CurrentContext IsNot Nothing Then + Return CurrentContext.Response + End If + Return Nothing + End Get + End Property + ''' + ''' Returns the Asp log object. + ''' + _ + Friend ReadOnly Property Log() As Global.Microsoft.VisualBasic.Logging.AspLog + Get + Return s_Log.GetInstance() + End Get + End Property + End Module +End Namespace + +#End If \ No newline at end of file diff --git a/Websites/SharePrices/SharePrices/My Project/Resources.Designer.vb b/Websites/SharePrices/SharePrices/My Project/Resources.Designer.vb new file mode 100644 index 0000000..e8ef548 --- /dev/null +++ b/Websites/SharePrices/SharePrices/My Project/Resources.Designer.vb @@ -0,0 +1,61 @@ +'------------------------------------------------------------------------------ +' +' This code was generated by a tool. +' +' Changes to this file may cause incorrect behavior and will be lost if +' the code is regenerated. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Namespace My.Resources + + 'This class was auto-generated by the StronglyTypedResourceBuilder + 'class via a tool like ResGen or Visual Studio. + 'To add or remove a member, edit your .ResX file then rerun ResGen + 'with the /str option, or rebuild your VS project. + ' + ' A strongly-typed resource class, for looking up localized strings, etc. + ' + _ + Friend Module Resources + + Private resourceMan As Global.System.Resources.ResourceManager + + Private resourceCulture As Global.System.Globalization.CultureInfo + + ' + ' Returns the cached ResourceManager instance used by this class. + ' + _ + Friend ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager + Get + If Object.ReferenceEquals(resourceMan, Nothing) Then + Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager("SharePrices.Resources", GetType(Resources).Assembly) + resourceMan = temp + End If + Return resourceMan + End Get + End Property + + ' + ' Overrides the current thread's CurrentUICulture property for all + ' resource lookups using this strongly typed resource class. + ' + _ + Friend Property Culture() As Global.System.Globalization.CultureInfo + Get + Return resourceCulture + End Get + Set(ByVal value As Global.System.Globalization.CultureInfo) + resourceCulture = value + End Set + End Property + End Module +End Namespace diff --git a/Websites/SharePrices/SharePrices/My Project/Resources.resx b/Websites/SharePrices/SharePrices/My Project/Resources.resx new file mode 100644 index 0000000..5931345 --- /dev/null +++ b/Websites/SharePrices/SharePrices/My Project/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Websites/SharePrices/SharePrices/My Project/Settings.Designer.vb b/Websites/SharePrices/SharePrices/My Project/Settings.Designer.vb new file mode 100644 index 0000000..b35fb01 --- /dev/null +++ b/Websites/SharePrices/SharePrices/My Project/Settings.Designer.vb @@ -0,0 +1,72 @@ +'------------------------------------------------------------------------------ +' +' This code was generated by a tool. +' +' Changes to this file may cause incorrect behavior and will be lost if +' the code is regenerated. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Namespace My + + _ + Partial Friend NotInheritable Class MySettings + Inherits Global.System.Configuration.ApplicationSettingsBase + + Private Shared defaultInstance As MySettings = CType(Global.System.Configuration.ApplicationSettingsBase.Synchronized(New MySettings), MySettings) + +#Region "My.Settings Auto-Save Functionality" +#If _MyType = "WindowsForms" Then + Private Shared addedHandler As Boolean + + Private Shared addedHandlerLockObject As New Object + + _ + Private Shared Sub AutoSaveSettings(ByVal sender As Global.System.Object, ByVal e As Global.System.EventArgs) + If My.Application.SaveMySettingsOnExit Then + My.Settings.Save() + End If + End Sub +#End If +#End Region + + Public Shared ReadOnly Property [Default]() As MySettings + Get + +#If _MyType = "WindowsForms" Then + If Not addedHandler Then + SyncLock addedHandlerLockObject + If Not addedHandler Then + AddHandler My.Application.Shutdown, AddressOf AutoSaveSettings + addedHandler = True + End If + End SyncLock + End If +#End If + Return defaultInstance + End Get + End Property + End Class +End Namespace + +Namespace My + + _ + Friend Module MySettingsProperty + + _ + Friend ReadOnly Property Settings() As Global.SharePrices.My.MySettings + Get + Return Global.SharePrices.My.MySettings.Default + End Get + End Property + End Module +End Namespace \ No newline at end of file diff --git a/Websites/SharePrices/SharePrices/My Project/Settings.settings b/Websites/SharePrices/SharePrices/My Project/Settings.settings new file mode 100644 index 0000000..85b890b --- /dev/null +++ b/Websites/SharePrices/SharePrices/My Project/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Websites/SharePrices/SharePrices/SharePrices.aspx b/Websites/SharePrices/SharePrices/SharePrices.aspx new file mode 100644 index 0000000..be5ac1d --- /dev/null +++ b/Websites/SharePrices/SharePrices/SharePrices.aspx @@ -0,0 +1,97 @@ +<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="SharePrices.aspx.vb" Inherits="SharePrices.SharePrices" %> + + + + + + Steve's share prices + + + + + + + + + + + + + + + + + +
+
Charts
+
Current Holdings
+
Share Analysis
+
+ +
+ + + diff --git a/Websites/SharePrices/SharePrices/SharePrices.aspx.designer.vb b/Websites/SharePrices/SharePrices/SharePrices.aspx.designer.vb new file mode 100644 index 0000000..1554391 --- /dev/null +++ b/Websites/SharePrices/SharePrices/SharePrices.aspx.designer.vb @@ -0,0 +1,15 @@ +'------------------------------------------------------------------------------ +' +' This code was generated by a tool. +' +' Changes to this file may cause incorrect behavior and will be lost if +' the code is regenerated. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Partial Public Class SharePrices +End Class diff --git a/Websites/SharePrices/SharePrices/SharePrices.aspx.vb b/Websites/SharePrices/SharePrices/SharePrices.aspx.vb new file mode 100644 index 0000000..8021ccd --- /dev/null +++ b/Websites/SharePrices/SharePrices/SharePrices.aspx.vb @@ -0,0 +1,136 @@ +Imports System.Web.Services +Imports SharePrices.SharePricesUtils + +Public Class SharePrices + Inherits System.Web.UI.Page + + Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load + Debug.Print("SharePrices - Page load - " + Now().ToString("yyyy-MM-dd HH:mm:ss")) + End Sub + + + Public Shared Sub GetInstruments() + Debug.Print(Now().ToString("yyyy-MM-dd HH:mm:ss") + " - SharePrices.GetInstruments webmethod") + + Dim responseText As String = DataAccessLayer.GetInstruments() + SetResponseAndCompleteRequest(HttpContext.Current, "application/json", responseText) + End Sub + + + Public Shared Sub AddInstrument(Symbol As String, FullName As String) + Debug.Print(Now().ToString("yyyy-MM-dd HH:mm:ss") + " - SharePrices.AddInstrument webmethod: " + Symbol + ", " + FullName) + + Dim responseText As String = DataAccessLayer.AddInstrument(Symbol, FullName) + SetResponseAndCompleteRequest(HttpContext.Current, "application/json", responseText) + End Sub + + + Public Shared Sub AddHolding(AccountName As String, Symbol As String, NoUnits As Integer, PurchasePricePerUnit As Double, PurchaseDate As Int64) + Debug.Print(Now().ToString("yyyy-MM-dd HH:mm:ss") + " - SharePrices.AddHolding webmethod: " + AccountName + ", " + Symbol) + + Dim responseText As String = DataAccessLayer.AddHolding(AccountName, Symbol, NoUnits, PurchasePricePerUnit, PurchaseDate) + SetResponseAndCompleteRequest(HttpContext.Current, "application/json", responseText) + End Sub + + + Public Shared Sub GetAllDailyData(startDate As Int64, endDate As Int64) + Debug.Print(Now().ToString("yyyy-MM-dd HH:mm:ss") + " - SharePrices.GetAllDailyData webmethod: """ + FromEpochTime(startDate).ToString("yyyy-MM-dd HH:mm:ss") + """, """ + FromEpochTime(endDate).ToString("yyyy-MM-dd HH:mm:ss") + """") + + Dim responseText As String = DataAccessLayer.GetAllDailyData(FromEpochTime(startDate), FromEpochTime(endDate)) + If responseText = "" Then responseText = "[]" + SetResponseAndCompleteRequest(HttpContext.Current, "application/json", responseText) + End Sub + + + Public Shared Sub GetDailyData(Symbol As String, startDate As Int64, endDate As Int64) + Debug.Print(Now().ToString("yyyy-MM-dd HH:mm:ss") + " - SharePrices.GetDailyData webmethod: """ + Symbol + """, """ + FromEpochTime(startDate).ToString("yyyy-MM-dd HH:mm:ss") + """, """ + FromEpochTime(endDate).ToString("yyyy-MM-dd HH:mm:ss") + """") + + Dim responseText As String = DataAccessLayer.GetDailyData(Symbol, FromEpochTime(startDate), FromEpochTime(endDate)) + If responseText = "" Then responseText = "[]" + SetResponseAndCompleteRequest(HttpContext.Current, "application/json", responseText) + End Sub + + + Public Shared Sub GetAllIntradayData(startDate As Int64, endDate As Int64) + Dim startDT As Date = Now() + Debug.Print(Now().ToString("yyyy-MM-dd HH:mm:ss") + " - SharePrices.GetAllIntradayData webmethod: """ + FromEpochTime(startDate).ToString("yyyy-MM-dd HH:mm:ss") + """, """ + FromEpochTime(endDate).ToString("yyyy-MM-dd HH:mm:ss") + """") + + Dim responseText As String = DataAccessLayer.GetAllIntradayData(FromEpochTime(startDate), FromEpochTime(endDate)) + If responseText = "" Then responseText = "[]" + SetResponseAndCompleteRequest(HttpContext.Current, "application/json", responseText) + Dim endDT As Date = Now() + Debug.Print(Now().ToString("yyyy-MM-dd HH:mm:ss") + " - SharePrices.GetAllIntradayData completed. Duration = " + DateDiff(DateInterval.Second, startDate, endDT).ToString()) + End Sub + + + Public Shared Sub GetIntradayData(Symbol As String, startDate As Int64, endDate As Int64) + Debug.Print(Now().ToString("yyyy-MM-dd HH:mm:ss") + " - SharePrices.GetIntradayData webmethod: """ + Symbol + """, """ + FromEpochTime(startDate).ToString("yyyy-MM-dd HH:mm:ss") + """, """ + FromEpochTime(endDate).ToString("yyyy-MM-dd HH:mm:ss") + """") + + Dim responseText As String = DataAccessLayer.GetIntradayData(Symbol, FromEpochTime(startDate), FromEpochTime(endDate)) + If responseText = "" Then responseText = "[]" + SetResponseAndCompleteRequest(HttpContext.Current, "application/json", responseText) + End Sub + + + Public Shared Sub SubmitDailyData(Symbol As String, DailyPrices As List(Of DataAccessLayer.PriceData)) + Debug.Print(Now().ToString("yyyy-MM-dd HH:mm:ss") + " - SharePrices.SubmitDailyData webmethod: " + Symbol) + + Dim responseText As String = DataAccessLayer.InsertDailyData(Symbol, DailyPrices) + If responseText = "" Then responseText = "[]" + SetResponseAndCompleteRequest(HttpContext.Current, "application/json", responseText) + End Sub + + + Public Shared Sub SubmitIntradayData(Symbol As String, DailyPrices As List(Of DataAccessLayer.PriceData)) + Debug.Print(Now().ToString("yyyy-MM-dd HH:mm:ss") + " - SharePrices.SubmitIntradayData webmethod: " + Symbol) + + Dim responseText As String = DataAccessLayer.InsertIntradayData(Symbol, DailyPrices) + If responseText = "" Then responseText = "[]" + SetResponseAndCompleteRequest(HttpContext.Current, "application/json", responseText) + End Sub + + + Public Shared Sub DeleteHolding(HoldingID As Integer) + Debug.Print(Now().ToString("yyyy-MM-dd HH:mm:ss") + " - SharePrices.DeleteHolding webmethod: " + HoldingID.ToString()) + + Dim responseText As String = DataAccessLayer.DeleteHolding(HoldingID) + SetResponseAndCompleteRequest(HttpContext.Current, "application/json", responseText) + End Sub + + + Public Shared Sub FetchYahooFinanceIntraday(Symbol As String) + Debug.Print(Now().ToString("yyyy-MM-dd HH:mm:ss") + " - SharePrices.FetchYahooFinanceIntraday webmethod: " + Symbol) + + Dim webClient As New System.Net.WebClient + Dim responseText As String = webClient.DownloadString("https://query1.finance.yahoo.com/v8/finance/chart/" + Symbol + "?region=GB&lang=en-GB&includePrePost=false&interval=1h&range=1mo&.tsrc=finance") + SetResponseAndCompleteRequest(HttpContext.Current, "application/json", responseText) + End Sub + + + Public Shared Sub FetchYahooFinanceDaily(Symbol As String) + Debug.Print(Now().ToString("yyyy-MM-dd HH:mm:ss") + " - SharePrices.FetchYahooFinanceDaily webmethod: " + Symbol) + + Dim webClient As New System.Net.WebClient + Dim responseText As String = webClient.DownloadString("https://query1.finance.yahoo.com/v8/finance/chart/" + Symbol + "?region=GB&lang=en-GB&includePrePost=false&interval=1d&range=6mo&.tsrc=finance") + SetResponseAndCompleteRequest(HttpContext.Current, "application/json", responseText) + End Sub + + + Public Shared Sub FetchYahooFinanceSingleDay(Symbol As String) + Debug.Print(Now().ToString("yyyy-MM-dd HH:mm:ss") + " - SharePrices.FetchYahooFinanceSingleDay webmethod: " + Symbol) + + Dim webClient As New System.Net.WebClient + Dim responseText As String = webClient.DownloadString("https://query1.finance.yahoo.com/v8/finance/chart/" + Symbol + "?region=GB&lang=en-GB&includePrePost=false&interval=2m&range=1d&corsDomain=uk.finance.yahoo.com&.tsrc=finance") + SetResponseAndCompleteRequest(HttpContext.Current, "application/json", responseText) + End Sub + + + Public Shared Sub SearchYahooFinanceShares(SearchString As String) + Debug.Print(Now().ToString("yyyy-MM-dd HH:mm:ss") + " - SharePrices.SearchYahooFinanceShares webmethod: " + SearchString) + + Dim webClient As New System.Net.WebClient + Dim responseText As String = webClient.DownloadString("https://query1.finance.yahoo.com/v1/finance/search?q=" + SearchString + ""esCount=6&newsCount=0&enableFuzzyQuery=false"esQueryId=tss_match_phrase_query&multiQuoteQueryId=multi_quote_single_token_query&newsQueryId=news_ss_symbols&enableCb=false&enableNavLinks=false&vespaNewsTimeoutMs=600") + SetResponseAndCompleteRequest(HttpContext.Current, "application/json", responseText) + End Sub + +End Class \ No newline at end of file diff --git a/Websites/SharePrices/SharePrices/SharePrices.vbproj b/Websites/SharePrices/SharePrices/SharePrices.vbproj new file mode 100644 index 0000000..85f6408 --- /dev/null +++ b/Websites/SharePrices/SharePrices/SharePrices.vbproj @@ -0,0 +1,222 @@ + + + + + Debug + AnyCPU + + + + + {AB459D42-2246-47E4-8F1B-F8325E8B780A} + {349c5851-65df-11da-9384-00065b846f21};{F184B08F-C81C-45F6-A57F-5ABD9991F28F} + Library + SharePrices + SharePrices + v4.5 + Custom + false + + + + + + + true + full + true + true + bin\ + SharePrices.xml + 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 + + + pdbonly + false + true + true + bin\ + SharePrices.xml + 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + True + Application.myapp + + + Microsoft.VisualBasic.Web.MyExtension + 1.0.0.0 + + + True + True + Resources.resx + + + True + Settings.settings + True + + + SharePrices.aspx + + + SharePrices.aspx + ASPXCodeBehind + + + + + + VbMyResourcesResXFileCodeGenerator + Resources.Designer.vb + My.Resources + Designer + + + + + MyApplicationCodeGenerator + Application.Designer.vb + + + SettingsSingleFileGenerator + My + Settings.Designer.vb + + + Web.config + + + Web.config + + + + + 10.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + On + + + Binary + + + Off + + + On + + + + + + + + + True + True + 56173 + / + https://www.copeland-bowen.com/SharePrices + False + False + + + False + + + + + + \ No newline at end of file diff --git a/Websites/SharePrices/SharePrices/SharePrices.vbproj.user b/Websites/SharePrices/SharePrices/SharePrices.vbproj.user new file mode 100644 index 0000000..fb7e265 --- /dev/null +++ b/Websites/SharePrices/SharePrices/SharePrices.vbproj.user @@ -0,0 +1,27 @@ + + + + + + + SharePrices.aspx + SpecificPage + True + False + False + False + + + + + + + + + True + True + + + + + \ No newline at end of file diff --git a/Websites/SharePrices/SharePrices/SharePricesModal.css b/Websites/SharePrices/SharePrices/SharePricesModal.css new file mode 100644 index 0000000..11ab366 --- /dev/null +++ b/Websites/SharePrices/SharePrices/SharePricesModal.css @@ -0,0 +1,66 @@ +/* The Modal (background) */ +.modal { + display: none; /* Hidden by default */ + position: fixed; /* Stay in place */ + z-index: 1; /* Sit on top */ + padding-top: 100px; /* Location of the box */ + left: 0; + top: 0; + width: 100%; /* Full width */ + height: 100%; /* Full height */ + overflow: auto; /* Enable scroll if needed */ + background-color: rgb(0,0,0); /* Fallback color */ + background-color: rgba(0,0,0,0.4); /* Black w/ opacity */ +} + +.modal-title { + background-color: #3279ea; + margin: auto; + padding: 5px; + border: 1px solid #888; + /*display: block;*/ + width: 100%; + vertical-align: central; +} + +/* Modal Content */ +.modal-content { + background-color: #fefefe; + margin: auto; + padding: 15px; + border: 1px solid #888; + width: 50%; +} + +/* The Close Button */ +.close { + color: #aaaaaa; + /*float: right;*/ + font-size: 24px; + font-weight: bold; + text-align: right; + vertical-align: central; +} + +.close:hover, +.close:focus { + color: #000; + text-decoration: none; + cursor: pointer; +} + +.ok-button { + background-color: ButtonFace; + cursor: pointer; + padding: 10px; +} + +.ok-button-disabled { + background-color: dimgrey; + cursor:not-allowed ; + padding: 10px; +} + +table.instrumentSearchResults { width: 100%; border-collapse: collapse; } +.instrumentSearchResults tr:hover { background-color: lightgray; cursor: pointer; } +.selectedSearchResult { background-color: #80f530 !important; } diff --git a/Websites/SharePrices/SharePrices/SharePricesStyles.css b/Websites/SharePrices/SharePrices/SharePricesStyles.css new file mode 100644 index 0000000..879b8ab --- /dev/null +++ b/Websites/SharePrices/SharePrices/SharePricesStyles.css @@ -0,0 +1,70 @@ +html, body { min-height: 100% !important; height: 100%; width: 100%; } +body { font-family: Verdana, Arial, Helvetica, sans-serif; margin-left: 0px; } + + /* The navigation bar */ +.navbar { overflow: hidden; background-color: #333; position: fixed; top: 0; width: 100%; z-index: 100; } +.navbar a { float: left; display: block; color: #f2f2f2; text-align: center; padding: 7px 16px; text-decoration: none; } +.navbar label { color: #f2f2f2; } +.navbar a:hover { background: #ddd; color: black; } +.activenav { float: left; display: block; color: #f2f2f2 !important; background-color: #307D30 !important; text-align: center; padding: 7px 16px; text-decoration: none; } +.main { height: 100%; width: 100%; margin-top: 34px; /* Add a top margin to avoid content overlay */ } +/* #chartDiv { height: 100%; overflow: scroll; } */ +#chartDiv { margin-top: 34px; } +#holdingsDiv { margin-top: 34px; } +#analDiv { margin-top: 34px; } + +div.activetab {position: absolute; top: 0; height: 100%; width: 100%; z-index: 1; background-color: white; overflow: scroll; /*display: inline;*/} +div.inactivetab {position: absolute; top: 0; height:100%; width: 100%; z-index: 0; overflow: scroll; /*display: none;*/} + +td {vertical-align: top;} + +.shareRow { /*background-color: #ffffff;*/ } +.altShareRow { background-color: #f4f4f4; } + +.miniHoldings { border-collapse: collapse; border-spacing: 0; } +.miniHoldings td { font-size: x-small; border: 1px solid black; } +.miniHoldings th { font-size: x-small; border: 1px solid black; } +.soldHolding { text-decoration: line-through; } + +.mainHoldings { font-size: small; } +table.mainHoldings { width: 100%; } +table.mainHoldings th, table.mainHoldings td { padding-left: 5px; padding-right: 5px; } +table.mainHoldings tr:hover { background-color: #acc9e4; } + +.price-summary { font-size: x-small; } + +.current-value { font-size: medium; } + +.num {text-align: right;} + +.summary { width: 100%; border-collapse: collapse; } + +.spacer { padding-top: 6px; } + +.profit { color: #07b200; /*limegreen*/} +.loss { color: firebrick; } + +td.no-border { border: 0px; text-align: right; } + +.LongSummary { font-size: x-small; } +.LongChart { height: 150px; width: 300px; } + +.MidSummary { font-size: x-small; } +.MidChart { height: 150px; width: 300px; } + +.ShortSummary { font-size: x-small; } +.ShortChart { height: 150px; width: 300px; } + +.DaySummary { font-size: x-small; } +.DayChart { height: 136px; width: 300px; } + +.HoldingCurrenciesChart { height: 160px; width: 160px; } +/*#divHoldingCurrenciesChart .pieLabel { color: red !important; background-color: black; }*/ +*#divHoldingCurrenciesChart div.pieLabel { font-size: x-small; text-align: center; padding: 2px; color: white; background-color: black } +.deletebutton { color: red; cursor: pointer; } + +span.addHolding { cursor: pointer; } + +.flot-text { font-size: x-small !important; } + +.chart-tooltip { position: absolute; border: 1px solid #fdd; padding: 2px; background-color: #fee; opacity: 0.80; display: none; z-index: 2; } \ No newline at end of file diff --git a/Websites/SharePrices/SharePrices/Web.Debug.config b/Websites/SharePrices/SharePrices/Web.Debug.config new file mode 100644 index 0000000..2e302f9 --- /dev/null +++ b/Websites/SharePrices/SharePrices/Web.Debug.config @@ -0,0 +1,30 @@ + + + + + + + + + + \ No newline at end of file diff --git a/Websites/SharePrices/SharePrices/Web.Release.config b/Websites/SharePrices/SharePrices/Web.Release.config new file mode 100644 index 0000000..c358444 --- /dev/null +++ b/Websites/SharePrices/SharePrices/Web.Release.config @@ -0,0 +1,31 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/Websites/SharePrices/SharePrices/Web.config b/Websites/SharePrices/SharePrices/Web.config new file mode 100644 index 0000000..eee211a --- /dev/null +++ b/Websites/SharePrices/SharePrices/Web.config @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + diff --git a/Websites/SharePrices/SharePrices/bin/SharePrices.dll b/Websites/SharePrices/SharePrices/bin/SharePrices.dll new file mode 100644 index 0000000000000000000000000000000000000000..84ee57434e029c418750e3bd964a39b0160c6c16 GIT binary patch literal 38400 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 literal 0 HcmV?d00001 diff --git a/Websites/SharePrices/SharePrices/bin/SharePrices.dll.config b/Websites/SharePrices/SharePrices/bin/SharePrices.dll.config new file mode 100644 index 0000000..eee211a --- /dev/null +++ b/Websites/SharePrices/SharePrices/bin/SharePrices.dll.config @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + diff --git a/Websites/SharePrices/SharePrices/bin/SharePrices.pdb b/Websites/SharePrices/SharePrices/bin/SharePrices.pdb new file mode 100644 index 0000000000000000000000000000000000000000..2e9d09a189471035c82cc91715320d7a6d41e26b GIT binary patch literal 60928 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 literal 0 HcmV?d00001 diff --git a/Websites/SharePrices/SharePrices/bin/SharePrices.xml b/Websites/SharePrices/SharePrices/bin/SharePrices.xml new file mode 100644 index 0000000..f6df688 --- /dev/null +++ b/Websites/SharePrices/SharePrices/bin/SharePrices.xml @@ -0,0 +1,36 @@ + + + + +SharePrices + + + + + + Returns information about the host computer. + + + + Returns information for the current Web user. + + + + Returns Request object. + + + + Returns Response object. + + + + Returns the Asp log object. + + + + Module used to define the properties that are available in the My Namespace for Web projects. + + + + + \ No newline at end of file diff --git a/Websites/SharePrices/SharePrices/jquery-ui.css b/Websites/SharePrices/SharePrices/jquery-ui.css new file mode 100644 index 0000000..93707f4 --- /dev/null +++ b/Websites/SharePrices/SharePrices/jquery-ui.css @@ -0,0 +1,1312 @@ +/*! jQuery UI - v1.12.1 - 2016-09-14 +* http://jqueryui.com +* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.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/?bgShadowXPos=&bgOverlayXPos=&bgErrorXPos=&bgHighlightXPos=&bgContentXPos=&bgHeaderXPos=&bgActiveXPos=&bgHoverXPos=&bgDefaultXPos=&bgShadowYPos=&bgOverlayYPos=&bgErrorYPos=&bgHighlightYPos=&bgContentYPos=&bgHeaderYPos=&bgActiveYPos=&bgHoverYPos=&bgDefaultYPos=&bgShadowRepeat=&bgOverlayRepeat=&bgErrorRepeat=&bgHighlightRepeat=&bgContentRepeat=&bgHeaderRepeat=&bgActiveRepeat=&bgHoverRepeat=&bgDefaultRepeat=&iconsHover=url(%22images%2Fui-icons_555555_256x240.png%22)&iconsHighlight=url(%22images%2Fui-icons_777620_256x240.png%22)&iconsHeader=url(%22images%2Fui-icons_444444_256x240.png%22)&iconsError=url(%22images%2Fui-icons_cc0000_256x240.png%22)&iconsDefault=url(%22images%2Fui-icons_777777_256x240.png%22)&iconsContent=url(%22images%2Fui-icons_444444_256x240.png%22)&iconsActive=url(%22images%2Fui-icons_ffffff_256x240.png%22)&bgImgUrlShadow=&bgImgUrlOverlay=&bgImgUrlHover=&bgImgUrlHighlight=&bgImgUrlHeader=&bgImgUrlError=&bgImgUrlDefault=&bgImgUrlContent=&bgImgUrlActive=&opacityFilterShadow=Alpha(Opacity%3D30)&opacityFilterOverlay=Alpha(Opacity%3D30)&opacityShadowPerc=30&opacityOverlayPerc=30&iconColorHover=%23555555&iconColorHighlight=%23777620&iconColorHeader=%23444444&iconColorError=%23cc0000&iconColorDefault=%23777777&iconColorContent=%23444444&iconColorActive=%23ffffff&bgImgOpacityShadow=0&bgImgOpacityOverlay=0&bgImgOpacityError=95&bgImgOpacityHighlight=55&bgImgOpacityContent=75&bgImgOpacityHeader=75&bgImgOpacityActive=65&bgImgOpacityHover=75&bgImgOpacityDefault=75&bgTextureShadow=flat&bgTextureOverlay=flat&bgTextureError=flat&bgTextureHighlight=flat&bgTextureContent=flat&bgTextureHeader=flat&bgTextureActive=flat&bgTextureHover=flat&bgTextureDefault=flat&cornerRadius=3px&fwDefault=normal&ffDefault=Arial%2CHelvetica%2Csans-serif&fsDefault=1em&cornerRadiusShadow=8px&thicknessShadow=5px&offsetLeftShadow=0px&offsetTopShadow=0px&opacityShadow=.3&bgColorShadow=%23666666&opacityOverlay=.3&bgColorOverlay=%23aaaaaa&fcError=%235f3f3f&borderColorError=%23f1a899&bgColorError=%23fddfdf&fcHighlight=%23777620&borderColorHighlight=%23dad55e&bgColorHighlight=%23fffa90&fcContent=%23333333&borderColorContent=%23dddddd&bgColorContent=%23ffffff&fcHeader=%23333333&borderColorHeader=%23dddddd&bgColorHeader=%23e9e9e9&fcActive=%23ffffff&borderColorActive=%23003eff&bgColorActive=%23007fff&fcHover=%232b2b2b&borderColorHover=%23cccccc&bgColorHover=%23ededed&fcDefault=%23454545&borderColorDefault=%23c5c5c5&bgColorDefault=%23f6f6f6 +* Copyright 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-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; + pointer-events: none; +} + + +/* Icons +----------------------------------*/ +.ui-icon { + display: inline-block; + vertical-align: middle; + margin-top: -.25em; + position: relative; + text-indent: -99999px; + overflow: hidden; + background-repeat: no-repeat; +} + +.ui-widget-icon-block { + left: 50%; + margin-left: -8px; + display: block; +} + +/* 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; + font-size: 100%; +} +.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-menu { + list-style: none; + padding: 0; + margin: 0; + display: block; + outline: 0; +} +.ui-menu .ui-menu { + position: absolute; +} +.ui-menu .ui-menu-item { + margin: 0; + cursor: pointer; + /* support: IE10, see #8844 */ + list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"); +} +.ui-menu .ui-menu-item-wrapper { + position: relative; + padding: 3px 1em 3px .4em; +} +.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-wrapper { + 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-button { + padding: .4em 1em; + display: inline-block; + position: relative; + line-height: normal; + margin-right: .1em; + cursor: pointer; + vertical-align: middle; + text-align: center; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + + /* Support: IE <= 11 */ + overflow: visible; +} + +.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: 2em; + box-sizing: border-box; + text-indent: -9999px; + white-space: nowrap; +} + +/* no icon support for input elements */ +input.ui-button.ui-button-icon-only { + text-indent: 0; +} + +/* button icon element(s) */ +.ui-button-icon-only .ui-icon { + position: absolute; + top: 50%; + left: 50%; + margin-top: -8px; + margin-left: -8px; +} + +.ui-button.ui-icon-notext .ui-icon { + padding: 0; + width: 2.1em; + height: 2.1em; + text-indent: -9999px; + white-space: nowrap; + +} + +input.ui-button.ui-icon-notext .ui-icon { + width: auto; + height: auto; + text-indent: 0; + white-space: normal; + padding: .4em 1em; +} + +/* workarounds */ +/* Support: Firefox 5 - 40 */ +input.ui-button::-moz-focus-inner, +button.ui-button::-moz-focus-inner { + border: 0; + padding: 0; +} +.ui-controlgroup { + vertical-align: middle; + display: inline-block; +} +.ui-controlgroup > .ui-controlgroup-item { + float: left; + margin-left: 0; + margin-right: 0; +} +.ui-controlgroup > .ui-controlgroup-item:focus, +.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus { + z-index: 9999; +} +.ui-controlgroup-vertical > .ui-controlgroup-item { + display: block; + float: none; + width: 100%; + margin-top: 0; + margin-bottom: 0; + text-align: left; +} +.ui-controlgroup-vertical .ui-controlgroup-item { + box-sizing: border-box; +} +.ui-controlgroup .ui-controlgroup-label { + padding: .4em 1em; +} +.ui-controlgroup .ui-controlgroup-label span { + font-size: 80%; +} +.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item { + border-left: none; +} +.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item { + border-top: none; +} +.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content { + border-right: none; +} +.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content { + border-bottom: none; +} + +/* Spinner specific style fixes */ +.ui-controlgroup-vertical .ui-spinner-input { + + /* Support: IE8 only, Android < 4.4 only */ + width: 75%; + width: calc( 100% - 2.4em ); +} +.ui-controlgroup-vertical .ui-spinner .ui-spinner-up { + border-top-style: solid; +} + +.ui-checkboxradio-label .ui-icon-background { + box-shadow: inset 1px 1px 1px #ccc; + border-radius: .12em; + border: none; +} +.ui-checkboxradio-radio-label .ui-icon-background { + width: 16px; + height: 16px; + border-radius: 1em; + overflow: visible; + border: none; +} +.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon, +.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon { + background-image: none; + width: 8px; + height: 8px; + border-width: 4px; + border-style: solid; +} +.ui-checkboxradio-disabled { + pointer-events: none; +} +.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; +} + +/* Icons */ +.ui-datepicker .ui-icon { + display: block; + text-indent: -99999px; + overflow: hidden; + background-repeat: no-repeat; + left: .5em; + top: .3em; +} +.ui-dialog { + 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-n { + height: 2px; + top: 0; +} +.ui-dialog .ui-resizable-e { + width: 2px; + right: 0; +} +.ui-dialog .ui-resizable-s { + height: 2px; + bottom: 0; +} +.ui-dialog .ui-resizable-w { + width: 2px; + left: 0; +} +.ui-dialog .ui-resizable-se, +.ui-dialog .ui-resizable-sw, +.ui-dialog .ui-resizable-ne, +.ui-dialog .ui-resizable-nw { + width: 7px; + height: 7px; +} +.ui-dialog .ui-resizable-se { + right: 0; + bottom: 0; +} +.ui-dialog .ui-resizable-sw { + left: 0; + bottom: 0; +} +.ui-dialog .ui-resizable-ne { + right: 0; + top: 0; +} +.ui-dialog .ui-resizable-nw { + left: 0; + top: 0; +} +.ui-draggable .ui-dialog-titlebar { + cursor: move; +} +.ui-draggable-handle { + -ms-touch-action: none; + touch-action: 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-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-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; + 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-text { + display: block; + margin-right: 20px; + overflow: hidden; + text-overflow: ellipsis; +} +.ui-selectmenu-button.ui-button { + text-align: left; + white-space: nowrap; + width: 14em; +} +.ui-selectmenu-icon.ui-icon { + float: right; + margin-top: 0; +} +.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: .222em 0; + margin: .2em 0; + vertical-align: middle; + margin-left: .4em; + margin-right: 2em; +} +.ui-spinner-button { + width: 1.6em; + 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-style: none; + border-bottom-style: none; + border-right-style: none; +} +.ui-spinner-up { + top: 0; +} +.ui-spinner-down { + bottom: 0; +} +.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; +} +body .ui-tooltip { + border-width: 2px; +} + +/* Component containers +----------------------------------*/ +.ui-widget { + font-family: Arial,Helvetica,sans-serif; + font-size: 1em; +} +.ui-widget .ui-widget { + font-size: 1em; +} +.ui-widget input, +.ui-widget select, +.ui-widget textarea, +.ui-widget button { + font-family: Arial,Helvetica,sans-serif; + font-size: 1em; +} +.ui-widget.ui-widget-content { + border: 1px solid #c5c5c5; +} +.ui-widget-content { + border: 1px solid #dddddd; + background: #ffffff; + color: #333333; +} +.ui-widget-content a { + color: #333333; +} +.ui-widget-header { + border: 1px solid #dddddd; + background: #e9e9e9; + color: #333333; + font-weight: bold; +} +.ui-widget-header a { + color: #333333; +} + +/* Interaction states +----------------------------------*/ +.ui-state-default, +.ui-widget-content .ui-state-default, +.ui-widget-header .ui-state-default, +.ui-button, + +/* We use html here because we need a greater specificity to make sure disabled +works properly when clicked or hovered */ +html .ui-button.ui-state-disabled:hover, +html .ui-button.ui-state-disabled:active { + border: 1px solid #c5c5c5; + background: #f6f6f6; + font-weight: normal; + color: #454545; +} +.ui-state-default a, +.ui-state-default a:link, +.ui-state-default a:visited, +a.ui-button, +a:link.ui-button, +a:visited.ui-button, +.ui-button { + color: #454545; + 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, +.ui-button:hover, +.ui-button:focus { + border: 1px solid #cccccc; + background: #ededed; + font-weight: normal; + color: #2b2b2b; +} +.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, +a.ui-button:hover, +a.ui-button:focus { + color: #2b2b2b; + text-decoration: none; +} + +.ui-visual-focus { + box-shadow: 0 0 3px 1px rgb(94, 158, 214); +} +.ui-state-active, +.ui-widget-content .ui-state-active, +.ui-widget-header .ui-state-active, +a.ui-button:active, +.ui-button:active, +.ui-button.ui-state-active:hover { + border: 1px solid #003eff; + background: #007fff; + font-weight: normal; + color: #ffffff; +} +.ui-icon-background, +.ui-state-active .ui-icon-background { + border: #003eff; + background-color: #ffffff; +} +.ui-state-active a, +.ui-state-active a:link, +.ui-state-active a:visited { + color: #ffffff; + text-decoration: none; +} + +/* Interaction Cues +----------------------------------*/ +.ui-state-highlight, +.ui-widget-content .ui-state-highlight, +.ui-widget-header .ui-state-highlight { + border: 1px solid #dad55e; + background: #fffa90; + color: #777620; +} +.ui-state-checked { + border: 1px solid #dad55e; + background: #fffa90; +} +.ui-state-highlight a, +.ui-widget-content .ui-state-highlight a, +.ui-widget-header .ui-state-highlight a { + color: #777620; +} +.ui-state-error, +.ui-widget-content .ui-state-error, +.ui-widget-header .ui-state-error { + border: 1px solid #f1a899; + background: #fddfdf; + color: #5f3f3f; +} +.ui-state-error a, +.ui-widget-content .ui-state-error a, +.ui-widget-header .ui-state-error a { + color: #5f3f3f; +} +.ui-state-error-text, +.ui-widget-content .ui-state-error-text, +.ui-widget-header .ui-state-error-text { + color: #5f3f3f; +} +.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_444444_256x240.png"); +} +.ui-widget-header .ui-icon { + background-image: url("images/ui-icons_444444_256x240.png"); +} +.ui-state-hover .ui-icon, +.ui-state-focus .ui-icon, +.ui-button:hover .ui-icon, +.ui-button:focus .ui-icon { + background-image: url("images/ui-icons_555555_256x240.png"); +} +.ui-state-active .ui-icon, +.ui-button:active .ui-icon { + background-image: url("images/ui-icons_ffffff_256x240.png"); +} +.ui-state-highlight .ui-icon, +.ui-button .ui-state-highlight.ui-icon { + background-image: url("images/ui-icons_777620_256x240.png"); +} +.ui-state-error .ui-icon, +.ui-state-error-text .ui-icon { + background-image: url("images/ui-icons_cc0000_256x240.png"); +} +.ui-button .ui-icon { + background-image: url("images/ui-icons_777777_256x240.png"); +} + +/* positioning */ +.ui-icon-blank { background-position: 16px 16px; } +.ui-icon-caret-1-n { background-position: 0 0; } +.ui-icon-caret-1-ne { background-position: -16px 0; } +.ui-icon-caret-1-e { background-position: -32px 0; } +.ui-icon-caret-1-se { background-position: -48px 0; } +.ui-icon-caret-1-s { background-position: -65px 0; } +.ui-icon-caret-1-sw { background-position: -80px 0; } +.ui-icon-caret-1-w { background-position: -96px 0; } +.ui-icon-caret-1-nw { background-position: -112px 0; } +.ui-icon-caret-2-n-s { background-position: -128px 0; } +.ui-icon-caret-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: -65px -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: -65px -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: 1px -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: 3px; +} +.ui-corner-all, +.ui-corner-top, +.ui-corner-right, +.ui-corner-tr { + border-top-right-radius: 3px; +} +.ui-corner-all, +.ui-corner-bottom, +.ui-corner-left, +.ui-corner-bl { + border-bottom-left-radius: 3px; +} +.ui-corner-all, +.ui-corner-bottom, +.ui-corner-right, +.ui-corner-br { + border-bottom-right-radius: 3px; +} + +/* Overlays */ +.ui-widget-overlay { + background: #aaaaaa; + opacity: .003; + filter: Alpha(Opacity=.3); /* support: IE8 */ +} +.ui-widget-shadow { + -webkit-box-shadow: 0px 0px 5px #666666; + box-shadow: 0px 0px 5px #666666; +} diff --git a/Websites/SharePrices/SharePrices/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/Websites/SharePrices/SharePrices/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache new file mode 100644 index 0000000000000000000000000000000000000000..a4fb8a34196a91b3f4c4e24da982918426f807c2 GIT binary patch literal 11310 zcmeHNZFdtl7ET~c36w2nS=vHh+?U;L*EO9o-GqSB@W;B&F zByO7D(qGWCKXLcD8ryLKr9HWPw zo|0NNjk_jv!h)Jfd?DQh8HO@iDlbkH*SOL`Mz>4T?iBq@6c>`fB#PgTcw!U_CWU6|OSX;->#vEoo?O9s@*wDO!~ zXv0G|9eT|(c z$eI1!1Lyj6Hs{SwI3KxyqI<8CVEk2H-cQ;-FN-~99h0qFH0{8d1Q1w zjj@YqkX=NGvxWFW*K2LSuOR&3hwo)$t6t`fqy?!FPOc*4sd6oY7ybCQ%9~vA2yeO` z^V)p;J!-*uh|7nS?1k~9tW!Y!1*$LhTT!I)3n(A6PyCVYLM;O4BJR$hY|5RPnkn5J z{}cW%kY(xDxkSR<5mD$n6seE7eh@ex*gL+<3uOEo^vs74OT!qW5=gU(c-L*4FmNsd z?!ho{_kps)TD+9vT^UxrtsfGuI+KZTJ*}OO0QcQ6>S<4j7_LFBzQq9o<`TaJy9(rE0M#kMgMAj;e) zx{c`(ZBARN$u~hYW2xLXK{acs{tl|l2X1OWpQ&xjF$IpyXS*&(x_fA8N;%SCPqiU; zEzLA&HuD*%Eya0cNoMlv7Lar-$1FHD@@YtKu9?e^Vyhb@UIRr=GXTDC*v@2u_%WT; zu7fJ`&uQw%Ava1+_D2i_`>|5ojXOYmJd8C6vC0F^GzMR4;dx;Gv~a7A zC4UQfsG?0v6~EfOaqa7Re+ggg?jay`GqBgtU!fn~b*R%az1~k#gt3gU#Q?YCfm>#V z%}0?$_QobRXi0t-8f@pO0eMoQ(vBy>1rRp!Bvjn)HI%_)^5Y>}T7$y%4$_X6c`@G> zT4u6j1w0%1wU8+8fr95pQC19FL@jHz`=E;Rqgtdia;${rHLhOJmYQW<0&9{VD-HR9 znePzw15mSksi_Mef+ozDrre2GD7?O7J_2PsUrKbRFdf^4%U}y~X6v6Tu#AtvxRo#C zAy4@Zd^vi`(=f2jS^-Tnzh)85BN6>TTw}EFew-{iP8MZ)EF$Y%tIcF=;*d$GPi<df?e~($OcNHk>NGIT& zDnu=ZdAC3*P0LWj%~%Cz*G4J5X>*=~s*F;;^QF=PB|zyaP!g21b^ZnM!QR3v57X^C zYpA`jcV9$?PL)*@&hBC8>^o0TetB>8)hER|`_5C;XOUO^H*n7FRoM=$qUa>qzVi%4 zcZONBHAGY|Q0|lx$Id!L9zEsM0lc1r3sjiLd@LIal%1vP9oz5Z6m*^Z<#-bNtwXEF MlUV=Q;l|nj111Gr)Bpeg literal 0 HcmV?d00001 diff --git a/Websites/SharePrices/SharePrices/obj/Debug/SharePrices.Resources.resources b/Websites/SharePrices/SharePrices/obj/Debug/SharePrices.Resources.resources new file mode 100644 index 0000000000000000000000000000000000000000..6c05a9776bd7cbae976fdcec7e3a254e93018279 GIT binary patch literal 180 zcmX?i>is@O1_p+SK%5g?SzMBus~417oL^d$oLUTL1*ImYq!#HYR*8GxXUf^%t3Noi54ZC+|=Nl{{sjzU0bQch;FcWPxwes*e}ZIZcpqG__J onW3ezNveT`r81^vrFkWpxv4PQgHubGfR2KJ07n-P+5+SQ04Y>DD*ylh literal 0 HcmV?d00001 diff --git a/Websites/SharePrices/SharePrices/obj/Debug/SharePrices.dll b/Websites/SharePrices/SharePrices/obj/Debug/SharePrices.dll new file mode 100644 index 0000000000000000000000000000000000000000..84ee57434e029c418750e3bd964a39b0160c6c16 GIT binary patch literal 38400 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 literal 0 HcmV?d00001 diff --git a/Websites/SharePrices/SharePrices/obj/Debug/SharePrices.pdb b/Websites/SharePrices/SharePrices/obj/Debug/SharePrices.pdb new file mode 100644 index 0000000000000000000000000000000000000000..2e9d09a189471035c82cc91715320d7a6d41e26b GIT binary patch literal 60928 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 literal 0 HcmV?d00001 diff --git a/Websites/SharePrices/SharePrices/obj/Debug/SharePrices.vbproj.FileListAbsolute.txt b/Websites/SharePrices/SharePrices/obj/Debug/SharePrices.vbproj.FileListAbsolute.txt new file mode 100644 index 0000000..f0a83f3 --- /dev/null +++ b/Websites/SharePrices/SharePrices/obj/Debug/SharePrices.vbproj.FileListAbsolute.txt @@ -0,0 +1,9 @@ +D:\Documents\Visual Studio Projects\SharePrices\SharePrices\obj\Debug\SharePrices.Resources.resources +D:\Documents\Visual Studio Projects\SharePrices\SharePrices\obj\Debug\SharePrices.vbproj.GenerateResource.Cache +D:\Documents\Visual Studio Projects\SharePrices\SharePrices\bin\SharePrices.dll.config +D:\Documents\Visual Studio Projects\SharePrices\SharePrices\bin\SharePrices.dll +D:\Documents\Visual Studio Projects\SharePrices\SharePrices\bin\SharePrices.pdb +D:\Documents\Visual Studio Projects\SharePrices\SharePrices\bin\SharePrices.xml +D:\Documents\Visual Studio Projects\SharePrices\SharePrices\obj\Debug\SharePrices.dll +D:\Documents\Visual Studio Projects\SharePrices\SharePrices\obj\Debug\SharePrices.xml +D:\Documents\Visual Studio Projects\SharePrices\SharePrices\obj\Debug\SharePrices.pdb diff --git a/Websites/SharePrices/SharePrices/obj/Debug/SharePrices.vbproj.GenerateResource.Cache b/Websites/SharePrices/SharePrices/obj/Debug/SharePrices.vbproj.GenerateResource.Cache new file mode 100644 index 0000000000000000000000000000000000000000..7d22c1638237c0144c6ca1167c245fdfed527372 GIT binary patch literal 919 zcma)4K}*~~6i#ZgZn7)HLy^)RmeNDPCG1v2FH6A{tLTEQB0Ut!B=bVYoy{!s5;0zS z?V&%a|Du1O$Kt&weJ`kphT;pnd3p1__suu+9M^H2D>7c$y3fdcov73rG+7aEl}gL_ zSl|@nv*EjV(C?jqMP>34|MA!FjZ0mW7DhRgg%!HrJ1i5e(tW6o%@p!cGFZ#jvyE&x zl8x~_81D-F zR_m%+e5!GorKW39;Bo4|g^L6T4~&pIg7q)nyib6F7UVE`?+fPlgv zBo{H1D_b3MFD6xw&U{K&^@Ya6lr{y7X(G;}x*I`)F1d*7*&^=2=5u=3JOqyiZIx2> zknzQL^xZ_^%H6 + + + +SharePrices + + + + + + Returns information about the host computer. + + + + Returns information for the current Web user. + + + + Returns Request object. + + + + Returns Response object. + + + + Returns the Asp log object. + + + + Module used to define the properties that are available in the My Namespace for Web projects. + + + + + \ No newline at end of file diff --git a/Websites/SharePrices/SharePrices/obj/Debug/TempPE/My Project.Resources.Designer.vb.dll b/Websites/SharePrices/SharePrices/obj/Debug/TempPE/My Project.Resources.Designer.vb.dll new file mode 100644 index 0000000000000000000000000000000000000000..f4d3af58af90ee4e2b43995b60a3aef1602c77ab GIT binary patch literal 7680 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 Fe*!LX{O|w( literal 0 HcmV?d00001 diff --git a/Websites/SharePrices/SharePrices/scripts/FlotGaps.js b/Websites/SharePrices/SharePrices/scripts/FlotGaps.js new file mode 100644 index 0000000..800b7d9 --- /dev/null +++ b/Websites/SharePrices/SharePrices/scripts/FlotGaps.js @@ -0,0 +1,77 @@ +function generateChartGapMap(data, maxGapSize) { + let gaps = []; + if (data.length > 1) { + let currentOffset = 0; + let previousOffset = 0; + let previousX = data[0][0]; + + for (let i = 1; i < data.length; i++) { + if (data[i][0] != null && data[i][1] != null) { + let currentX = data[i][0]; + if (currentX - previousX > maxGapSize) { //New gap + previousOffset = currentOffset; + currentOffset += currentX - (previousX + maxGapSize); + let gap = { + unmappedGapStart: previousX, + unmappedGapEnd: currentX, + mappedGapStart: previousX - previousOffset, + mappedGapEnd: currentX - currentOffset, + startOffset: previousOffset, + endOffset: currentOffset + }; + gaps.push(gap); + } + previousX = currentX; + } + } + } + return gaps; +} +function mapChartXValue(unmappedValue, gapMap) { + if (gapMap.length > 0) { + let i = 0; + let gap = gapMap[i]; + while (unmappedValue > gap.unmappedGapEnd && i < gapMap.length - 1) { + i++; + gap = gapMap[i]; + } + if (unmappedValue >= gap.unmappedGapEnd) { //unmappedValue is after this gap + return unmappedValue - gap.endOffset; + } else { + if (unmappedValue <= gap.unmappedGapStart) { //unmappedValue is before this gap + return unmappedValue - gap.startOffset; + } else { //unmappedValue is within this gap + let unmappedGapSize = gap.unmappedGapEnd - gap.unmappedGapStart; + let mappedGapSize = gap.mappedGapEnd - gap.mappedGapStart; + let position = (unmappedValue - gap.unmappedGapStart) / unmappedGapSize; + return gap.mappedGapStart + (position * mappedGapSize); + } + } + } else { + return unmappedValue; + } +} +function unmapChartXValue(mappedValue, gapMap) { + if (gapMap.length > 0) { + let i = 0; + let gap = gapMap[i]; + while (mappedValue > gap.mappedGapEnd && i < gapMap.length - 1) { + i++; + gap = gapMap[i]; + } + if (mappedValue >= gap.mappedGapEnd) { //mappedValue is after this gap + return mappedValue + gap.endOffset; + } else { + if (mappedValue <= gap.mappedGapStart) { //mappedValue is before this gap + return mappedValue + gap.startOffset; + } else { //mappedValue is within this gap + let unmappedGapSize = gap.unmappedGapEnd - gap.unmappedGapStart; + let mappedGapSize = gap.mappedGapEnd - gap.mappedGapStart; + let position = mappedValue - gap.mappedGapStart; + return gap.unmappedGapStart + (position / mappedGapSize * unmappedGapSize); + } + } + } else { + return mappedValue; + } +} diff --git a/Websites/SharePrices/SharePrices/scripts/SharePrices.js b/Websites/SharePrices/SharePrices/scripts/SharePrices.js new file mode 100644 index 0000000..feaa2b3 --- /dev/null +++ b/Websites/SharePrices/SharePrices/scripts/SharePrices.js @@ -0,0 +1,1520 @@ +var timespans = { oneSecond: 1000, oneMinute: 60 * 1000, oneHour: 60 * 60 * 1000, oneDay: 24 * 60 * 60 * 1000, oneWeek: 7 * 24 * 60 * 60 * 1000, oneMonth: 31 * 24 * 60 * 60 * 1000 }; +var fetchIntervalDaily = 2 * timespans.oneHour; +var fetchIntervalIntraday = 1 * timespans.oneHour; +var fetchIntervalSingleDay = 1 * timespans.oneMinute; +var fetchInterval = 200; +var fetchTimer = 0; +var currencyFormatter = new Intl.NumberFormat('en-GB', { style: 'currency', currency: 'GBP' }); +var instrumentSearchResults = []; + +var Instruments = { + Data: [], + indexOfSymbol: function (Symbol) { return this.Data.map(function (item) { return item.Symbol; }).indexOf(Symbol); }, + GetSymbol: function (Symbol) { return this.Data[this.indexOfSymbol(Symbol)]; }, + GetHolding: function (holdingID) { + for (let x = 0; x < this.Data.length; x++) { + let i = this.Data[x]; + for (let n = 0; n < i.Holdings.length; n++) { + let h = i.Holdings[n]; + if (h.HoldingID == holdingID) { + return { instrument: i, holding: h}; + } + } + } + }, + GetCurrentHoldings: function (Instrument) { + let result = []; + for (let x = 0; x < Instrument.Holdings.length; x++) { + let h = Instrument.Holdings[x]; + if (h.SoldDate == null) { + result.push(h); + } + } + return result; + }, + GetLastFetchedDaily: function () { + if (!this.Data[0].lastFetchedDaily) { this.Data[0].lastFetchedDaily = this.Data[0].MaxDailyDate }; + let lastFetchedDate = this.Data[0].lastFetchedDaily; + let lastFetchedIndex = 0; + for (let i = 1; i < this.Data.length; i++) { + if (!this.Data[i].lastFetchedDaily) { this.Data[i].lastFetchedDaily = this.Data[i].MaxDailyDate }; + if (lastFetchedDate > this.Data[i].lastFetchedDaily) { + lastFetchedDate > this.Data[i].lastFetchedDaily; + lastFetchedIndex = i; + } + } + return this.Data[lastFetchedIndex]; + }, + GetLastFetchedIntraday: function () { + if (!this.Data[0].lastFetchedIntraday) { this.Data[0].lastFetchedIntraday = this.Data[0].MaxIntradayDate }; + let lastFetchedDate = this.Data[0].lastFetchedIntraday; + let lastFetchedIndex = 0; + for (let i = 1; i < this.Data.length; i++) { + if (!this.Data[i].lastFetchedIntraday) { this.Data[i].lastFetchedIntraday = this.Data[i].MaxIntradayDate }; + if (lastFetchedDate > this.Data[i].lastFetchedIntraday) { + lastFetchedDate > this.Data[i].lastFetchedIntraday; + lastFetchedIndex = i; + } + } + return this.Data[lastFetchedIndex]; + }, + GetLastFetchedSingleDay: function () { + if (!this.Data[0].lastFetchedSingleDay) { this.Data[0].lastFetchedSingleDay = 0 }; + let lastFetchedDate = this.Data[0].lastFetchedSingleDay; + let lastFetchedIndex = 0; + for (let i = 1; i < this.Data.length; i++) { + if (!this.Data[i].lastFetchedSingleDay) { this.Data[i].lastFetchedSingleDay = 0 }; + if (lastFetchedDate > this.Data[i].lastFetchedSingleDay) { + lastFetchedDate > this.Data[i].lastFetchedSingleDay; + lastFetchedIndex = i; + } + } + return this.Data[lastFetchedIndex]; + }, + GetCurrentPrice: function (Instrument) { + if (Instrument.CurrentPrice) { + return Instrument.CurrentPrice; + } else { + for (let i = Instrument.IntradayData.length - 1; i >= 0; i--) { + if (Instrument.IntradayData[i].close) { + return Instrument.IntradayData[i].close; + } + } + for (let i = Instrument.DailyData.length - 1; i >= 0; i--) { + if (Instrument.DailyData[i].close) { + return Instrument.DailyData[i].close; + } + } + } + }, + GetExchangeRate: function (fromCurrency, toCurrency) { + if (fromCurrency == 'GBp' && toCurrency == 'GBP') { + return 100; + } else { + let curr = this.GetSymbol(toCurrency + fromCurrency + '=X'); + if (curr) { + //return curr.CurrentPrice; + return this.GetCurrentPrice(curr); + } else { + curr = this.GetSymbol(toCurrency + fromCurrency + '=X'); + if (curr) { + if (curr.CurrentPrice) { + //return 1/curr.CurrentPrice; + return 1/this.GetCurrentPrice(curr); + } + } + } + } + }, + MarketIsOpen: function (instrument) { + let currentDT = new Date().getTime(); + let startOfDay = new Date().setHours(0, 0, 0); + if (instrument.SingleDayStartDate > (startOfDay + timespans.oneDay)) { + currentDT += timespans.oneDay; + } + /* + if (instrument.Symbol == 'QAN.AX') { + console.info('Qantas'); + console.info(' Current local time: ' + new Date().getTime().toString() + new Date().yyyymmddhhmmss()); + console.info(' SingleDayStartDate: ' + new Date(instrument.SingleDayStartDate).getTime().toString() + new Date(instrument.SingleDayStartDate).yyyymmddhhmmss()); + console.info(' SingleDayEndDate: ' + new Date(instrument.SingleDayEndDate).getTime().toString() + new Date(instrument.SingleDayEndDate).yyyymmddhhmmss()); + } + */ + if (currentDT < instrument.SingleDayStartDate) { + return 0; //Not open yet + } else { + if (currentDT > instrument.SingleDayEndDate) { + return 2; //Market closed (end of day) + } else { + return 1; //Market is currently open + } + } + } +} + +Date.prototype.yyyymmddhhmmss = function () { + var yyyy = this.getFullYear().toString(); + var mm = (this.getMonth() + 1).toString(); // getMonth() is zero-based + var dd = this.getDate().toString(); + var hh = this.getHours().toString(); + var nn = this.getMinutes().toString(); + var ss = this.getSeconds().toString(); + return yyyy + '-' + (mm[1] ? mm : "0" + mm[0]) + '-' + (dd[1] ? dd : "0" + dd[0]) + " " + (hh[1] ? hh : "0" + hh[0]) + ":" + (nn[1] ? nn : "0" + nn[0]) + ":" + (ss[1] ? ss : "0" + ss[0]); +}; +Date.prototype.yyyymmdd = function () { + var yyyy = this.getFullYear().toString(); + var mm = (this.getMonth() + 1).toString(); // getMonth() is zero-based + var dd = this.getDate().toString(); + return yyyy + '-' + (mm[1] ? mm : "0" + mm[0]) + '-' + (dd[1] ? dd : "0" + dd[0]); +}; +Date.prototype.hhmm = function () { + var hh = this.getHours().toString(); + var nn = this.getMinutes().toString(); + return (hh[1] ? hh : "0" + hh[0]) + ":" + (nn[1] ? nn : "0" + nn[0]); +}; + +function logInfo(msg) { + console.info(msg); + $("#logDiv").css("font-color", "white").text(msg); +} +function logWarning(msg) { + console.warn(msg); + $("#logDiv").css("font-color", "orange").text(msg); +} +function logError(msg) { + console.error(msg); + $("#logDiv").css("font-color", "red").text(msg); +} +function formatAmount(amount, currency, decimals) { + let isNegative = (amount < 0); + let s = Math.abs(amount).toFixed(decimals); + let pos = s.indexOf('.'); + let wholeNumber = (pos >= 0) ? s.substring(0, pos) : s; + let decimal = (pos >= 0) ? s.substring(pos) : ''; + s = ''; + while (wholeNumber.length > 0) { + //if (s.length > 0 && wholeNumber!='-') s = ',' + s; //Don't add a comma if the only thing left to add to the string is the minus sign + if (s.length > 0) s = ',' + s; + if (wholeNumber.length >= 3) { + s = wholeNumber.substring(wholeNumber.length - 3) + s; + wholeNumber = wholeNumber.substring(0, wholeNumber.length - 3); + } else { + s = wholeNumber + s; + wholeNumber = ''; + } + } + s = s + decimal; + let sign = isNegative ? '-' : ''; + switch (currency) { + case 'GBP': + s = sign + '£' + s; + break; + case 'GBp': + s = sign + s + 'p'; + break; + case 'USD': + s = sign + 'U$' + s; + break; + case 'AUD': + s = sign + 'A$' + s; + break; + case 'EUR': + s = sign + '€' + s; + break; + default: + s = sign + currency + s; + } + return s; +} +function getProfitOrLoss(BasePrice, CurrentPrice, ShowPercent) { + let priceMovement = (CurrentPrice - BasePrice).toFixed(2); + let percentMovement = (((CurrentPrice / BasePrice) - 1) * 100).toFixed(1) + '%'; + if (percentMovement[0] == '-') percentMovement = percentMovement.substring(1); + return '' + (CurrentPrice < BasePrice ? '' : '+') + priceMovement + (ShowPercent ? ' (' + percentMovement + ')' : '') + ''; +} + +function getInstruments() { + if (fetchTimer != 0) { clearTimeout(fetchTimer) }; + //console.info('getInstruments()'); + $.ajax({ + type: "POST", + contentType: "application/json", + url: "SharePrices.aspx/GetInstruments", + dataType: "json", + success: function (response) { + //console.info('getInstruments Success'); + //Instruments.Data = response; + Instruments.Data = response.Instruments; + Instruments.Accounts = response.Accounts; + for (let i = 0; i < Instruments.Data.length; i++) { + Instruments.Data[i].Holdings = []; + Instruments.Data[i].HoldingsHistory = []; + } + let symbol = ''; + let instrument = {}; + for (let i = 0; i < response.Holdings.length; i++) { + if (symbol != response.Holdings[i].Symbol) { + symbol = response.Holdings[i].Symbol; + instrument = Instruments.GetSymbol(response.Holdings[i].Symbol); + } + instrument.Holdings.push(response.Holdings[i]); + } + for (let i = 0; i < response.HoldingsHistory.length; i++) { + let h = response.HoldingsHistory[i]; + if (symbol != h.Symbol) { + symbol = h.Symbol; + instrument = Instruments.GetSymbol(h.Symbol); + } + instrument.HoldingsHistory.push(h); + } + createSharesTable(); + }, + failure: function (response) { console.error("GetInstruments error: " + response.d) } + }); +}; + +function createSharesTable() { + //console.info('createSharesTable()'); + var tbl = '' + + '' + + '' + + '' + + ''; + for (var rowNo = 0; rowNo < Instruments.Data.length; rowNo++) { + let i = Instruments.Data[rowNo]; + if (i.DisplayOrder) { + //let cls = (rowNo % 2) ? 'altShareRow' : 'shareRow'; + let cls = (rowNo % 2) ? 'shareRow altShareRow' : 'shareRow'; + let tr = '' + createSharesTableRow(i) + ''; + tbl += tr; + } + } + tbl += '
InstrumentYTD1 Month' + + '' + + '1 Week1 Day
'; + $('#chartDiv').html(tbl); + //$('#chartDiv span.addHolding').unbind().bind('click', function () { showModalDialog_AddHolding(this) }); + bindShareRowEvents(); + getAllLocalDailyData(); +}; +function createSharesTableRow(instrument) { + function getHoldingsTable(Instrument) { + if (Instrument.Holdings.length > 0) { + let showPreviousHoldings = $('#showPreviousHoldings').prop('checked'); + let totalUnits = 0; + let totalPrice = 0; + let noRows = 0; + let t = ''; + for (let i = 0; i < Instrument.Holdings.length; i++) { + let h = Instrument.Holdings[i]; + if (h.SoldDate == null) { + noRows++; + totalUnits += h.NoUnits; + totalPrice += (h.NoUnits * h.PurchasePricePerUnit); + t += '' + + '' + + '' + + '' + + ''; + } else { + if (showPreviousHoldings) { + noRows++; + t += '' + + '' + + '' + + '' + + ''; + } + } + } + //if (Instrument.Holdings.length > 1) { + if (totalUnits > 0) { + Instrument.TotalUnitsHeld = totalUnits; + Instrument.TotalHoldingsCost = totalPrice; + Instrument.BreakevenPrice = totalPrice / totalUnits; + t += '' + + '' + + '' + + '' + + '' + + ''; + } + t += '
AccountBuy DatePriceUnitsTotal
×' + h.AccountName + '' + new Date(h.PurchaseDate).yyyymmdd() + '' + formatAmount(h.PurchasePricePerUnit, '', 2) + '' + formatAmount(h.NoUnits, '', 0) + '' + formatAmount(h.NoUnits * h.PurchasePricePerUnit, '', 0) + '
' + h.AccountName + '' + new Date(h.PurchaseDate).yyyymmdd() + '' + formatAmount(h.PurchasePricePerUnit, '', 2) + '' + formatAmount(h.NoUnits, '', 0) + '' + formatAmount(h.NoUnits * h.PurchasePricePerUnit, '', 0) + '
Total' + formatAmount(Instrument.BreakevenPrice, '', 2) + '' + formatAmount(Instrument.TotalUnitsHeld, '', 0) + '' + formatAmount(Instrument.TotalHoldingsCost, '', 0) + '
'; + return (noRows>0) ? t : ''; + } else { + delete Instrument.TotalUnitsHeld; + delete Instrument.TotalHoldingsCost; + delete Instrument.BreakevenPrice; + return ''; + } + } + + let dispOrder = instrument.DisplayOrder.toString(); + return '' + instrument.InstrumentName + '
' + + '' + instrument.Symbol + ' +
' + + getHoldingsTable(instrument) + + '
' + + '' + + '
' + + '
' + + '
' + + '
' +}; +function bindShareRowEvents() { + $('#chartDiv span.addHolding').unbind().bind('click', function () { showModalDialog_AddHolding(this) }); + /* + $('#tblInstruments .shareRow').unbind().hover(function () { + showShareRowPriceSummaries(this); + }, function () { + hideShareRowPriceSummaries(this); + }); + */ +} +function showShareRowPriceSummaries(row) { + $(row).find('price-summary, .LongSummary, .MidSummary, .ShortSummary, .DaySummary').css('display', 'inherit'); +} +function hideShareRowPriceSummaries(row) { + $(row).find('price-summary, .LongSummary, .MidSummary, .ShortSummary, .DaySummary').css('display', 'none'); +} + +function redrawAllSharesCharts() { + for (n = 0; n < Instruments.Data.length; n++) { + let i = Instruments.Data[n]; + createLongChart(i); + createMidChart(i); + createShortChart(i); + createSingleDayChart(i); + } +} + +function getNewRemoteData() { + clearTimeout(fetchTimer); + let lastFetchedDailyInstrument = Instruments.GetLastFetchedDaily(); + if (lastFetchedDailyInstrument.lastFetchedDaily < (new Date().getTime() - fetchIntervalDaily)) { + //console.info(new Date().yyyymmddhhmmss() + ": Last fetched daily: " + lastFetchedDailyInstrument.Symbol + ", Last fetched date: " + new Date(lastFetchedDailyInstrument.lastFetchedDaily).yyyymmddhhmmss()); + //logInfo(new Date().yyyymmddhhmmss() + ": Last fetched daily: " + lastFetchedDailyInstrument.Symbol + ", Last fetched date: " + new Date(lastFetchedDailyInstrument.lastFetchedDaily).yyyymmddhhmmss()); + getYahooDailyData(lastFetchedDailyInstrument); + } else { + let lastFetchedIntradayInstrument = Instruments.GetLastFetchedIntraday(); + if (lastFetchedIntradayInstrument.lastFetchedIntraday < (new Date().getTime() - fetchIntervalIntraday)) { + //console.info(new Date().yyyymmddhhmmss() + ": Last fetched intraday: " + lastFetchedIntradayInstrument.Symbol + ", Last fetched date: " + new Date(lastFetchedIntradayInstrument.lastFetchedIntraday).yyyymmddhhmmss()); + //logInfo(new Date().yyyymmddhhmmss() + ": Last fetched intraday: " + lastFetchedIntradayInstrument.Symbol + ", Last fetched date: " + new Date(lastFetchedIntradayInstrument.lastFetchedIntraday).yyyymmddhhmmss()); + getYahooIntradayData(lastFetchedIntradayInstrument); + } else { + let lastFetchedSingleDayInstrument = Instruments.GetLastFetchedSingleDay(); + if (lastFetchedSingleDayInstrument.lastFetchedSingleDay < (new Date().getTime() - fetchIntervalSingleDay)) { + //console.info(new Date().yyyymmddhhmmss() + ": Last fetched single day: " + lastFetchedSingleDayInstrument.Symbol + ", Last fetched date: " + new Date(lastFetchedSingleDayInstrument.lastFetchedSingleDay).yyyymmddhhmmss()); + //logInfo(new Date().yyyymmddhhmmss() + ": Last fetched single day: " + lastFetchedSingleDayInstrument.Symbol + ", Last fetched date: " + new Date(lastFetchedSingleDayInstrument.lastFetchedSingleDay).yyyymmddhhmmss()); + getYahooSingleDayData(lastFetchedSingleDayInstrument); + } else { + fetchInterval = 500; + } + } + } + + fetchTimer = setTimeout(getNewRemoteData, fetchInterval); +} +function getAllLocalDailyData() { + let startDate = new Date(new Date().getFullYear(), 0, 1); + //let endDate = new Date(new Date().setHours(0, 0, 0, 0)); + + // Set start date to 2020-01-01 to include pre-pandemic prices + startDate = new Date("2020-01-01 00:00:00"); + + let endDate = new Date(new Date()); + let params = { startDate: startDate.getTime(), endDate: endDate.getTime() }; + $.ajax({ + type: "POST", + contentType: "application/json", + url: "SharePrices.aspx/GetAllDailyData", + dataType: "json", + data: JSON.stringify(params), + success: function (response) { + for (let x = 0; x < response.length; x++) { + let i = Instruments.GetSymbol(response[x].Symbol); + i.DailyData = response[x].DailyData; + } + getAllLocalIntradayData(); + }, + failure: function (response) { console.error("getYTDData error:"); console.info(response); } + }); +} +function getAllLocalIntradayData() { + let startDate = new Date(new Date().getFullYear(), 0, 1); + //let endDate = new Date(new Date().setHours(0, 0, 0, 0)); + let endDate = new Date(new Date()); + + // Set start date to 2020-01-01 to include pre-pandemic prices + startDate = new Date("2020-01-01 00:00:00"); + + let params = { startDate: startDate.getTime(), endDate: endDate.getTime() }; + $.ajax({ + type: "POST", + contentType: "application/json", + url: "SharePrices.aspx/GetAllIntradayData", + dataType: "json", + data: JSON.stringify(params), + success: function (response) { + for (let x = 0; x < response.length; x++) { + let i = Instruments.GetSymbol(response[x].Symbol); + i.IntradayData = response[x].IntradayData; + if (i.DailyData.length > 0) { + createMidChart(i); + createLongChart(i); + } + if (i.IntradayData.length > 0) { + createShortChart(i); + } + } + fetchTimer = setTimeout(getNewRemoteData, 500); + }, + failure: function (response) { console.error("getYTDData error:"); console.info(response); } + }); +} + +function createLongChart(Instrument) { + let rowNo = Instrument.DisplayOrder; + let ytdStartDate = new Date(new Date().getFullYear(), 0, 1).getTime(); + + // Set start date to 2020-01-01 to include pre-pandemic prices + ytdStartDate = new Date("2020-01-01 00:00:00"); + + let ytdEndDate = new Date().getTime(); + createChart(Instrument, ytdStartDate, ytdEndDate, 'divLongChart' + rowNo.toString(), 'divLongSummary' + rowNo.toString()); +} +function createMidChart(Instrument) { + let rowNo = Instrument.DisplayOrder; + let monthStartDate = new Date().setHours(0, 0, 0) - timespans.oneMonth; + let monthEndDate = new Date().getTime(); + //createChart(Instrument, monthStartDate, monthEndDate, 'divMidChart' + rowNo.toString(), 'tdMidSummary' + rowNo.toString()); + createChart(Instrument, monthStartDate, monthEndDate, 'divMidChart' + rowNo.toString(), 'divMidSummary' + rowNo.toString()); +} +function createShortChart(Instrument) { + let rowNo = Instrument.DisplayOrder; + let weekStartDate = new Date().setHours(0, 0, 0) - timespans.oneWeek; + let weekEndDate = new Date().getTime(); + createChart(Instrument, weekStartDate, weekEndDate, 'divShortChart' + rowNo.toString(), 'divShortSummary' + rowNo.toString()); +} +function createSingleDayChart(Instrument) { + let rowNo = Instrument.DisplayOrder; + let dayStartDate = 0; + let dayEndDate = 0; + let dt = new Date().getTime(); + //if (dt >= Instrument.SingleDayStartDate && dt <= Instrument.SingleDayEndDate) { //Market is currently open + dayStartDate = Instrument.SingleDayStartDate; + dayEndDate = Instrument.SingleDayEndDate; + //} else { //Market is closed + //dayStartDate = Instrument.SingleDayData[0].DT; + //dayEndDate = Instrument.SingleDayData[Instrument.SingleDayData.length - 1].DT; + //} + let previousClose = Instrument.SingleDayPreviousClose; + createChart(Instrument, dayStartDate, dayEndDate, 'divDayChart' + rowNo.toString(), 'divDaySummary' + rowNo.toString(), previousClose); +} +function createChart(Instrument, startDate, endDate, chartContainerID, summaryContainerID, previousClose) { + function getChartDataSubset(Instrument, dateFrom, dateTo) { + let result = []; + //Single day data can be passed direct + if (dateTo - dateFrom <= timespans.oneDay) { + result = Instrument.SingleDayData; + //return Instrument.SingleDayData; + } else { + //Anything over one month should only use daily data + if (dateTo - dateFrom > (timespans.oneMonth + (timespans.oneDay*4))) { + for (let i = 0; i < Instrument.DailyData.length; i++) { + let quote = Instrument.DailyData[i]; + if (quote.DT >= dateFrom && quote.DT <= dateTo) { + result.push(quote); + } + } + } else { + //Get all in-date-range intraday data + let foundDates = { min: new Date().getTime, max: 0 } + for (let i = 0; i < Instrument.IntradayData.length; i++) { + let quote = Instrument.IntradayData[i]; + if (quote.DT >= dateFrom && quote.DT <= dateTo) { + if (quote.DT > foundDates.max) foundDates.max = quote.DT; + if (quote.DT < foundDates.min) foundDates.min = quote.DT; + result.push(quote); + } + } + //Back-fill with daily data if the intraday data doesn't cover the whole date range + let minFoundDate = new Date(foundDates.min).setHours(0, 0, 0); + if (minFoundDate > dateFrom) { + for (let i = 0; i < Instrument.DailyData.length; i++) { + let quote = Instrument.DailyData[i]; + if (quote.DT >= dateFrom && quote.DT < minFoundDate) { + result.push(quote); + } else { + break; + } + } + } + } + } + return result; + } + function getBreakevenLine(Instrument, dateFrom, dateTo) { + let result = []; + let currentPrice = 0; + for (let i = 0; i < Instrument.HoldingsHistory.length; i++) { + let h = Instrument.HoldingsHistory[i]; + if (currentPrice > 0) { result.push([h.DT - 1, currentPrice]) }; + if (h.TotalUnits > 0) { + currentPrice = h.TotalCost / h.TotalUnits; + result.push([h.DT, (h.TotalCost / h.TotalUnits)]); + } else { + currentPrice = 0; + result.push([h.DT, null]); + } + } + if (currentPrice > 0) { + result.push([dateTo, currentPrice]); + } + + /* + if (Instrument.Symbol == 'FLT.AX') { + console.info("Before removing:"); + for (let i = 0; i < result.length; i++) { + console.info(new Date(result[i][0]).yyyymmddhhmmss() + ' = ' + String(result[i][1])); + } + } + */ + //Remove all points before the start of the date range + let i = result.length - 1; + while (i >= 0 && result[i][0] >= startDate) i--; + while (i > 0) { result.shift(); i--; } + /* + if (Instrument.Symbol == 'FLT.AX') { + console.info("After removing:"); + for (let i = 0; i < result.length; i++) { + console.info(new Date(result[i][0]).yyyymmddhhmmss() + ' = ' + String(result[i][1])); + } + } + */ + + return result; + } + function transformAndSummariseChartData(cd) { + let seriesData = []; + //Find the first entry within the date range + let x = 0; + let summaryData = { + StartDT: cd[x].DT, + EndDT: cd[cd.length - 1].DT, + Open: cd[x].open, + High: cd[x].high, + HighDT: cd[x].DT, + Low: cd[x].low, + LowDT: cd[x].DT, + Close: cd[cd.length - 1].close + }; + while (x < cd.length && cd[x].DT < startDate) { + summaryData.StartDT = cd[x].DT; + summaryData.EndDT = cd[cd.length - 1].DT; + summaryData.Open = cd[x].open; + summaryData.High = cd[x].high; + summaryData.HighDT = cd[x].DT; + summaryData.Low = cd[x].low; + summaryData.LowDT = cd[x].DT; + summaryData.Close = cd[cd.length - 1].close; + x++; + }; + let basePrice = (!previousClose) ? summaryData.Open : previousClose; + for (let i = 0; i < cd.length; i++) { + let entry = cd[i]; + if (summaryData.High < entry.high) { + summaryData.High = entry.high; + summaryData.HighDT = cd[x].DT; + } + if (summaryData.Low > entry.low) { + summaryData.Low = entry.low; + summaryData.LowDT = cd[x].DT; + } + if (i >= x) { + if (priceType == 'percent') { + seriesData.push([entry.DT, ((entry.close / basePrice) - 1) * 100]); + } else { + seriesData.push([entry.DT, entry.close]); + } + } + } + return { summaryData: summaryData, seriesData: seriesData, basePrice: basePrice }; + } + function zzz_transformAndSummariseChartData(cd) { + let seriesData = []; + //Find the first entry within the date range + let x = 0; + let summaryData = { + StartDT: cd[x].DT, + EndDT: cd[cd.length - 1].DT, + Open: cd[x].open, + High: cd[x].high, + Low: cd[x].low, + Close: cd[cd.length - 1].close + }; + while (x < cd.length && cd[x].DT < startDate) { + summaryData.StartDT = cd[x].DT; + summaryData.EndDT = cd[cd.length - 1].DT; + summaryData.Open = cd[x].open; + summaryData.High = cd[x].high; + summaryData.Low = cd[x].low; + summaryData.Close = cd[cd.length - 1].close; + x++; + }; + let basePrice = (!previousClose) ? summaryData.Open : previousClose; + for (let i = 0; i < cd.length; i++) { + let entry = cd[i]; + if (summaryData.High < entry.high) summaryData.High = entry.high; + if (summaryData.Low > entry.low) summaryData.Low = entry.low; + if (i >= x) { + if (priceType == 'percent') { + seriesData.push([entry.DT, ((entry.close / basePrice) - 1) * 100]); + } else { + seriesData.push([entry.DT, entry.close]); + } + } + } + return { summaryData: summaryData, seriesData: seriesData, basePrice: basePrice }; + } + /*function getWeekendMarkings(startDate, endDate) { + var markings = [], + d = new Date(startDate); + + //Get the first Saturday + d.setUTCDate(d.getUTCDate() - ((d.getUTCDay() + 1) % 7)) + d.setUTCSeconds(0); + d.setUTCMinutes(0); + d.setUTCHours(0); + var i = d.getTime(); + + do { + markings.push({ xaxis: { from: i, to: i + 2 * timespans.oneDay }, color: '#e8e8e8' }); + i += 7 * timespans.oneDay; + } while (i < endDate); + + return markings; + }*/ + + let priceType = $('#displayAsPercent').prop('checked') ? 'percent' : ''; + //let chartData = getChartDataSubset(Instrument, startDate, endDate); + let chartData = []; + if (endDate - endDate <= timespans.oneDay) { + chartData = getChartDataSubset(Instrument, startDate, endDate); + } else { + chartData = getChartDataSubset(Instrument, startDate - (timespans.oneDay * 3), endDate); + } + + //console.info(new Date().yyyymmddhhmmss() + ' - createChart ' + Instrument.Symbol + ' ' + chartContainerID + ' ' + new Date(startDate).yyyymmddhhmmss() + ' -> ' + new Date(endDate).yyyymmddhhmmss()); + let seriesData = []; + if (chartData.length > 1) { + /*let transformedAndSummarisedData = transformAndSummariseChartData(chartData); + let summaryData = transformedAndSummarisedData.summaryData; + let basePrice = transformedAndSummarisedData.basePrice; + seriesData = transformedAndSummarisedData.seriesData;*/ + + //Summarise the data and transform values to percentage if required + let summaryData = { + StartDT: chartData[0].DT, + EndDT: chartData[chartData.length - 1].DT, + Open: chartData[0].open, + High: chartData[0].high, + HighDT: chartData[0].DT, + Low: chartData[0].low, + LowDT: chartData[0].DT, + Close: chartData[chartData.length - 1].close + }; + let basePrice = (!previousClose) ? summaryData.Open : previousClose; + for (let i = 0; i < chartData.length; i++) { + let entry = chartData[i]; + if (summaryData.High < entry.high) { + summaryData.High = entry.high; + summaryData.HighDT = entry.DT; + } + if (summaryData.Low > entry.low) { + summaryData.Low = entry.low; + summaryData.LowDT = entry.DT; + + } + if (priceType == 'percent') { + seriesData.push([entry.DT, ((entry.close / basePrice) - 1) * 100]); + } else { + seriesData.push([entry.DT, entry.close]); + } + } + + //let weekendMarkings = getWeekendMarkings(startDate, endDate); + let color = (summaryData.Close > basePrice) ? "green" : (summaryData.Close < basePrice) ? "red" : "blue"; + series = [{ data: seriesData, color: color, shadowSize: 0, lines: { lineWidth: 1 } }]; + + //Add the breakeven price line + if ($('#showBreakevenLine').prop('checked')) { + if (priceType == 'percent') { + series.unshift({ data: [[startDate, ((Instrument.BreakevenPrice / basePrice) - 1) * 100], [endDate, ((Instrument.BreakevenPrice / basePrice) - 1) * 100]], color: '#24BCC7', shadowSize: 0, lines: { lineWidth: 1 } }); + } else { + //series.unshift({ data: [[startDate, Instrument.BreakevenPrice], [endDate, Instrument.BreakevenPrice]], color: '#24BCC7', shadowSize: 0, lines: { lineWidth: 1 } }); + let b = getBreakevenLine(Instrument, startDate, endDate); + if (b.length > 0 && b[0][0]startDate) { //Only add the series if it falls within the chart date range + //series.unshift({ data: b, color: '#00cc00', shadowSize: 0, lines: { lineWidth: 1.5 } }); + series.push({ data: b, color: '#00cc00', shadowSize: 0, lines: { lineWidth: 1.5 } }); + } + } + } + + //Add the previousClose line to the series + if (previousClose) { + if (priceType == 'percent') { + series.unshift({ data: [[startDate, ((previousClose / basePrice) - 1) * 100], [endDate, ((previousClose / basePrice) - 1) * 100]], color: 'blue', shadowSize: 0, lines: { lineWidth: 1 } }); + } else { + series.unshift({ data: [[startDate, previousClose], [endDate, previousClose]], color: 'blue', shadowSize: 0, lines: { lineWidth: 1 } }); + } + } + + let chartTimespan = endDate - startDate; + let gapMap = []; + if (chartTimespan > timespans.oneDay && chartTimespan < timespans.oneMonth * 3) { + gapMap = generateChartGapMap(seriesData, timespans.oneHour); + } + $.plot($('#' + chartContainerID), series, { + grid: { show: true, hoverable: true /*, markings: weekendMarkings*/ }, + /*crosshair: { mode: 'x', snapX: true, showXValue: false },*/ + xaxis: { + mode: "time", + timezone: 'browser', + min: chartTimespan > timespans.oneDay ? summaryData.StartDT : startDate, + /*min: startDate, */ + max: chartTimespan > timespans.oneDay ? summaryData.EndDT : endDate, + /*max: endDate,*/ + transform: function (v) { return mapChartXValue(v, gapMap); }, + inverseTransform: function (v) { return unmapChartXValue(v, gapMap); } + } + }); + + //Bind the chart tooltip + $("#" + chartContainerID).bind("plothover", function (event, pos, item) { + if (!pos.x || !pos.y) { return; } + if (item) { + let x = new Date(item.datapoint[0]).yyyymmddhhmmss(); + let y = item.datapoint[1].toFixed(2); + let tt = $("#chartTooltip"); + tt.html(x + " = " + y).css({ top: item.pageY + 5, left: item.pageX + 5 }).fadeIn(200); + } else { + $("#chartTooltip").hide(); + } + }); + $("#" + chartContainerID).bind("mouseout", function (event, pos, item) { + $("#chartTooltip").hide(); + }); + + //Create the summary table + let summaryTable = ''; + if ((endDate - startDate) <= timespans.oneDay) { + let dt = new Date().getTime(); + let marketHours = (new Date(Instrument.SingleDayStartDate)).hhmm() + ' - ' + (new Date(Instrument.SingleDayEndDate)).hhmm(); + summaryTable += ''; + summaryTable += (!previousClose) ? '' : (''); + summaryTable += ''; + } + summaryTable += ''; + summaryTable += ''; + summaryTable += ''; + summaryTable += ''; + summaryTable += '
' + ((dt >= Instrument.SingleDayStartDate && dt <= Instrument.SingleDayEndDate) ? 'Market Open' : 'Market Closed') + ' (' + marketHours + ')Prev close: ' + previousClose.toString() + '
O: ' + summaryData.Open.toFixed(2) + ' ' + ((previousClose) ? getProfitOrLoss(previousClose, summaryData.Open, 1) : '') + 'H: ' + summaryData.High.toFixed(2) + ' ' + getProfitOrLoss(basePrice, summaryData.High, 1) + '
L: ' + summaryData.Low.toFixed(2) + ' ' + getProfitOrLoss(basePrice, summaryData.Low, 1) + 'C: ' + summaryData.Close.toFixed(2) + ' ' + getProfitOrLoss(basePrice, summaryData.Close, 1) + '
'; + $('#' + summaryContainerID).html(summaryTable); + } else { + //console.warn('Not enough data to plot ' + Instrument.Symbol + ' ' + new Date(startDate).yyyymmddhhmmss() + ' -> ' + new Date(endDate).yyyymmddhhmmss() + ' to ' + chartContainerID); + } +} + +function getYahooDailyData(Instrument) { + //console.info('getYahooDailyData: ' + Instrument.Symbol); + Instrument.lastFetchedDaily = new Date().getTime(); + $.ajax({ + type: "POST", + contentType: "application/json", + url: "SharePrices.aspx/FetchYahooFinanceDaily", + dataType: "json", + data: JSON.stringify({ Symbol: Instrument.Symbol }), + success: function (response) { + let newData = []; + if (response.chart.result) { + let dataSeries = response.chart.result[0]; + let nonSubmittedEntries = 0; + for (let i = 0; i < dataSeries.timestamp.length; i++) { + let quote = dataSeries.indicators.quote[0]; + if (quote.open[i] == null || quote.high[i] == null || quote.low[i] == null || quote.close[i] == null || quote.volume[i] == null) { + //console.info("Not submitting entry with null values: " + JSON.stringify({ DT: dataSeries.timestamp[i] * 1000, open: quote.open[i], high: quote.high[i], low: quote.low[i], close: quote.close[i], volume: quote.volume[i] })); + nonSubmittedEntries += 1; + } else { + newData.push({ DT: dataSeries.timestamp[i] * 1000, open: quote.open[i], high: quote.high[i], low: quote.low[i], close: quote.close[i], volume: quote.volume[i] }); + } + } + if (nonSubmittedEntries > 0) { + //console.warn("Didn't submit " + nonSubmittedEntries.toString() + " entries (" + newData.length.toString() + " OK) with null values for " + Instrument.Symbol); + } + + //let d = new Date(newData[newData.length - 1].DT).yyyymmddhhmmss(); + //console.info("getYahooDailyData: " + Instrument.Symbol + ', Last data point: ' + d); + + submitNewDailyData(Instrument, newData); + createMidChart(Instrument); + createLongChart(Instrument); + } else { + console.info("No data received for symbol: " + Instrument.Symbol); + } + }, + failure: function (response) { console.error("getYahooDailyData error:"); console.info(response); } + }); +} +function getYahooIntradayData(Instrument) { + //console.info('getYahooIntradayData: ' + Instrument.Symbol); + Instrument.lastFetchedIntraday = new Date().getTime(); + $.ajax({ + type: "POST", + contentType: "application/json", + url: "SharePrices.aspx/FetchYahooFinanceIntraday", + dataType: "json", + data: JSON.stringify({ Symbol: Instrument.Symbol }), + success: function (response) { + let newData = []; + if (response.chart.result) { + let dataSeries = response.chart.result[0]; + let nonSubmittedEntries = 0; + for (let i=0; i 0) { + //console.warn("Didn't submit " + nonSubmittedEntries.toString() + " entries (" + newData.length.toString() + " OK) with null values for " + Instrument.Symbol); + } + submitNewIntradayData(Instrument, newData); + createMidChart(Instrument); + createShortChart(Instrument); + } else { + console.info("No data received for symbol: " + Instrument.Symbol); + } + }, + failure: function (response) { console.error("getYahooIntradayData error:"); console.info(response); } + }); +} +function getYahooSingleDayData(Instrument) { + //console.info('getYahooSingleDayData: ' + Instrument.Symbol); + Instrument.lastFetchedSingleDay = new Date().getTime(); + $.ajax({ + type: "POST", + contentType: "application/json", + url: "SharePrices.aspx/FetchYahooFinanceSingleDay", + dataType: "json", + data: JSON.stringify({ Symbol: Instrument.Symbol }), + success: function (response) { + let newData = []; + if (response.chart.result) { + if (response.chart.result[0].timestamp) { + let dataSeries = response.chart.result[0]; + let ignoredEntries = 0; + for (let i = 0; i < dataSeries.timestamp.length; i++) { + let quote = dataSeries.indicators.quote[0]; + if (quote.open[i] == null || quote.high[i] == null || quote.low[i] == null || quote.close[i] == null || quote.volume[i] == null) { + ignoredEntries++; + } else { + newData.push({ DT: dataSeries.timestamp[i] * 1000, open: quote.open[i], high: quote.high[i], low: quote.low[i], close: quote.close[i], volume: quote.volume[i] }); + } + } + if (ignoredEntries > 0) { + //console.warn("Ignored " + ignoredEntries.toString() + " entries (" + newData.length.toString() + " OK) with null values for " + Instrument.Symbol); + } + + Instrument.SingleDayData = newData; + Instrument.SingleDayPreviousClose = dataSeries.meta.previousClose; + Instrument.SingleDayOpenPrice = dataSeries.indicators.quote[0].open[0]; + + Instrument.SingleDayStartDate = dataSeries.meta.currentTradingPeriod.regular.start * 1000; + Instrument.SingleDayEndDate = dataSeries.meta.currentTradingPeriod.regular.end * 1000; + + Instrument.InstrumentType = dataSeries.meta.instrumentType; + Instrument.Currency = dataSeries.meta.currency; + + Instrument.CurrentPrice = dataSeries.meta.regularMarketPrice; + let currentValue = ''; + if (Instrument.CurrentPrice) { + if (Instrument.TotalUnitsHeld > 0) { + currentValue = '
'; + currentValue += 'Price (' + Instrument.Currency + '): ' + Instrument.BreakevenPrice.toFixed(2) + ' -> ' + Instrument.CurrentPrice.toFixed(2) + ': ' + getProfitOrLoss(Instrument.BreakevenPrice, Instrument.CurrentPrice) + '
'; + currentValue += 'Value: ' + (Instrument.TotalHoldingsCost).toFixed(2) + ' -> ' + (Instrument.TotalUnitsHeld * Instrument.CurrentPrice).toFixed(2) + ': ' + getProfitOrLoss(Instrument.TotalHoldingsCost, Instrument.TotalUnitsHeld * Instrument.CurrentPrice); + let exRate = Instruments.GetExchangeRate(Instrument.Currency, 'GBP'); + if (exRate) { + if (Instrument.Currency != 'GBp') { + currentValue += '
GBP/' + Instrument.Currency + ' = ' + exRate.toFixed(4); + } + currentValue += '
'; + //currentValue += 'Current value:
' + '£' + (Instrument.TotalUnitsHeld * Instrument.CurrentPrice / exRate).toFixed(2) + ': £' + getProfitOrLoss(Instrument.TotalHoldingsCost / exRate, Instrument.TotalUnitsHeld * Instrument.CurrentPrice / exRate); + currentValue += 'Current value:
' + currencyFormatter.format(Instrument.TotalUnitsHeld * Instrument.CurrentPrice / exRate) + ': ' + getProfitOrLoss(Instrument.TotalHoldingsCost / exRate, Instrument.TotalUnitsHeld * Instrument.CurrentPrice / exRate, 1); + currentValue += '
'; + } else { + currentValue += '
' + Instrument.Currency; + } + } else { + //INDEX, CURRENCY, EQUITY + if (Instrument.InstrumentType == 'CURRENCY') { + currentValue = 'Exchange Rate: ' + Instrument.CurrentPrice.toFixed(4); + } else { + currentValue = 'Price (' + Instrument.Currency + '): ' + Instrument.CurrentPrice.toFixed(2); + } + } + } + $('#divCurrentValue' + Instrument.DisplayOrder).html(currentValue); + + createSingleDayChart(Instrument); + createHoldingsTable(); + } else { + //console.warn("No timestamp series received for symbol: " + Instrument.Symbol); + logWarning("No timestamp series received for symbol: " + Instrument.Symbol); + } + } else { + //console.info("No data received for symbol: " + Instrument.Symbol); + logInfo("No data received for symbol: " + Instrument.Symbol); + } + }, + failure: function (response) { console.error("getYahooSingleDayData error:"); console.info(response); } + }); +} + +function submitNewDailyData(Instrument, NewData) { + //console.info("submitNewDailyData"); + let currentMaxDT = Instrument.DailyData.length ? Instrument.DailyData[Instrument.DailyData.length - 1].DT : 0; + for (let i = 0; i < NewData.length; i++) { + if (NewData[i].DT > currentMaxDT) { + Instrument.DailyData.push(NewData[i]); + } + } + $.ajax({ + type: "POST", + contentType: "application/json", + url: "SharePrices.aspx/SubmitDailyData", + dataType: "json", + data: JSON.stringify({Symbol: Instrument.Symbol, DailyPrices: NewData}), + success: function (response) { + //console.info('SubmitDailyData success: ' + Instrument.Symbol + ' - ' + JSON.stringify(response)); + }, + failure: function (response) { console.error("SubmitDailyData error: " + JSON.stringify(response)); } + }); +} +function submitNewIntradayData(Instrument, NewData) { + //console.info("submitNewIntradayData"); + $.ajax({ + type: "POST", + contentType: "application/json", + url: "SharePrices.aspx/SubmitIntradayData", + dataType: "json", + data: JSON.stringify({ Symbol: Instrument.Symbol, DailyPrices: NewData }), + success: function (response) { + //console.info('SubmitIntradayData success: ' + Instrument.Symbol + ' - ' + JSON.stringify(response)); + }, + failure: function (response) { console.error("SubmitIntradayData error: " + JSON.stringify(response)); } + }); + + //Add new data to Instrument + let currentSummary = {}; + if (!Instrument.IntradayData || Instrument.IntradayData.length<1) { + Instrument.IntradayData = []; + currentSummary = { minDate: new Date().getTime(), maxDate: 0 }; + } else { + currentSummary = { minDate: Instrument.IntradayData[0].DT, maxDate: Instrument.IntradayData[Instrument.IntradayData.length-1].DT }; + } + + let dataToAddToFront = []; + for (let i = 0; i < NewData.length; i++) { + if (NewData[i].DT < currentSummary.minDate) { + dataToAddToFront.push(NewData[i]); + } else { + if (NewData[i].DT > currentSummary.maxDate) Instrument.IntradayData.push(NewData[i]); + } + } + for (let i = dataToAddToFront.length - 1; i >= 0; i--) { + Instrument.IntradayData.unshift(dataToAddToFront[i]); + } +} + +function createHoldingsTable() { + function calcTotalHoldingsValue() { + let totalValue = 0; + for (let n = 0; n < Instruments.Data.length; n++) { + let i = Instruments.Data[n]; + try { + let c = Instruments.GetCurrentHoldings(i); + if (i.CurrentPrice) { + let exchangeRate = Instruments.GetExchangeRate(i.Currency, 'GBP'); + for (let x = 0; x < c.length; x++) { + let h = c[x]; + let currentValue = h.NoUnits * (i.Currency == 'GBp' ? i.CurrentPrice / 100 : i.CurrentPrice); + totalValue += currentValue; + } + } + } + catch (err) { + console.info("Error adding " + i.Symbol + " to main holdings table: " + err.message); + } + } + return totalValue; + } + + let holdingCurrencies = { + data: [], + indexOfHoldingCurrency: function (symbol) { return this.data.map(function (item) { return item.symbol; }).indexOf(symbol); }, + getHoldingCurrency: function (symbol) { return this.data[this.indexOfHoldingCurrency(symbol)]; }, + addHoldingCurrency: function (symbol, amount) { + let c = this.getHoldingCurrency(symbol); + if (c) { + c.total += amount; + } else { + this.data.push({ symbol: symbol, total: amount }); + } + }, + getChartData: function () { + let d = [] + for (i = 0; i < this.data.length; i++) { + d.push({ label: this.data[i].symbol, data: this.data[i].total / Instruments.GetExchangeRate(this.data[i].symbol, 'GBP') }); + } + return d; + } + }; + let totalHoldingsValue = calcTotalHoldingsValue(); + + let tbl = '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + ''; + let altRow = 1; + let totalBookCostGBP = 0; + let totalValueGBP = 0; + let totalGainGBP = 0; + let todaysGainGBP = 0; + for (let n = 0; n < Instruments.Data.length; n++) { + let i = Instruments.Data[n]; + try { + let c = Instruments.GetCurrentHoldings(i); + if (c.length > 0) { altRow = !altRow }; + if (i.CurrentPrice) { + for (let x = 0; x < c.length; x++) { + let h = c[x]; + let profitOrLoss = i.CurrentPrice < h.PurchasePricePerUnit ? 'loss' : 'profit'; + let marketIsOpen = Instruments.MarketIsOpen(i); + let exchangeRate = Instruments.GetExchangeRate(i.Currency, 'GBP'); + let bookCost = h.NoUnits * (i.Currency == 'GBp' ? h.PurchasePricePerUnit / 100 : h.PurchasePricePerUnit); + let currentValue = h.NoUnits * (i.Currency == 'GBp' ? i.CurrentPrice / 100 : i.CurrentPrice); + let gain = (i.Currency == 'GBp' ? (i.CurrentPrice - h.PurchasePricePerUnit) / 100 : (i.CurrentPrice - h.PurchasePricePerUnit)) * h.NoUnits; + let gainPercent = (i.CurrentPrice - h.PurchasePricePerUnit) / h.PurchasePricePerUnit * 100; + let currentValueGBP = (h.NoUnits * i.CurrentPrice) / exchangeRate; + let gainGBP = ((i.CurrentPrice - h.PurchasePricePerUnit) * h.NoUnits) / exchangeRate; + let singleDayGainGBP = ((i.CurrentPrice - i.SingleDayPreviousClose) * h.NoUnits) / exchangeRate; + let singleDayGainPercent = ((i.CurrentPrice / i.SingleDayPreviousClose) - 1) * 100; + let singleDayProfitOrLoss = i.CurrentPrice < i.SingleDayPreviousClose ? 'loss' : 'profit'; + + holdingCurrencies.addHoldingCurrency(i.Currency, h.NoUnits * h.PurchasePricePerUnit); + + totalBookCostGBP += h.NoUnits * h.PurchasePricePerUnit / exchangeRate; + totalValueGBP += currentValueGBP; + totalGainGBP += gainGBP; + todaysGainGBP += (marketIsOpen == 0 ? 0 : singleDayGainGBP); + + tbl += ''; + //Group holdings of same shares + /*if (c.length > 1) { + if (x == 0) { + tbl += ''; + tbl += ''; + } + } else { */ + tbl += ''; + tbl += ''; + //} + tbl += '' + + '' + + '' + + '' + //Buy Price + '' + //Current Price + '' + //Book Cost + '' + //Current Value + '' + //Gain + '' + //Gain % + '' + //Current Value £ + '' + //Allocation + '' + //Gain £ + (marketIsOpen == 0 ? '') + //Today's Gain £ + (marketIsOpen == 0 ? '') + //Today's Gain % + ''; + } + } else { + if (i.InstrumentType == 'EQUITY') { + tbl += ''; + tbl += ''; + tbl += ''; + tbl += ''; + } + } + } + catch (err) { + console.info("Error adding " + i.Symbol + " to main holdings table: " + err.message); + tbl+=''; + } + } + let profitOrLoss = totalValueGBP < totalBookCostGBP ? 'loss' : 'profit'; + let todaysProfitOrLoss = todaysGainGBP < 0 ? 'loss' : 'profit'; + tbl += ''; + tbl += '' + + '' + + '' + + '' + + '' + + '' + //Allocation + '' + + '' + + '' + + ''; + tbl += '
NameSymbolAccountBuy DateNo UnitsBuy
Price
Current
Price
Book
Cost
Current
Value
GainGain%Current
Value £
AllocationGain £Today's
Gain £
Today's
Gain %
' + i.InstrumentName + '' + i.Symbol + '' + '' + i.InstrumentName + '' + i.Symbol + '' + '' + h.AccountName + '' + new Date(h.PurchaseDate).yyyymmdd() + '' + formatAmount(h.NoUnits, '', 0) + '' + formatAmount(h.PurchasePricePerUnit, i.Currency, 2) + '' + formatAmount(i.CurrentPrice, i.Currency, 2) + '' + formatAmount(bookCost, i.Currency == 'GBp' ? 'GBP' : i.Currency, 0) + '' + formatAmount(currentValue, i.Currency == 'GBp' ? 'GBP' : i.Currency, 0) + '' + formatAmount(gain, i.Currency == 'GBp' ? 'GBP' : i.Currency, 0) + '' + gainPercent.toFixed(1) + '%' + formatAmount(currentValueGBP, 'GBP', 2) + '' + formatAmount(currentValueGBP/totalHoldingsValue*100, '', 1) + '%' + formatAmount(gainGBP, 'GBP', 0) + '' : '' + formatAmount(singleDayGainGBP, 'GBP', 0) + '' : '' + singleDayGainPercent.toFixed(1) + '%
' + i.InstrumentName + '' + i.Symbol + '' + 'No current price
Error adding ' + i.Symbol + ' to table: ' + err.message + '
               
' + formatAmount(totalBookCostGBP, 'GBP', 2) + '' + formatAmount((((totalValueGBP/totalBookCostGBP) - 1) * 100), '', 1) + '%' + formatAmount(totalValueGBP, 'GBP', 2) + ' ' + formatAmount(totalGainGBP, 'GBP', 2) + '' + formatAmount(todaysGainGBP, 'GBP', 2) + '' + formatAmount(((todaysGainGBP/totalBookCostGBP) * 100), '', 1) + '%
'; + $('#holdingsDiv').html(tbl + '
'); + + + + $("#tblMainHoldings").tablesorter(); + + + + let cd = holdingCurrencies.getChartData(); + function labelFormatter(label, series) { + return "
" + label + "
" + Math.round(series.percent) + "%
" + formatAmount(series.data[0][1], 'GBP', 0) + "
"; + } + let ops = { series: { pie: { show: true, radius: 1, label: { show: true, radius: 0.7, formatter: labelFormatter } } }, legend: { show: false } }; + if (cd.length) { + $.plot('#divHoldingCurrenciesChart', cd, ops); + } +} + +function showModalDialog_DeleteHolding(holdingID) { + let modal = document.getElementById("modalDialog"); + + let o = Instruments.GetHolding(holdingID); + let h = o.holding; + let i = o.instrument; + let content = 'Symbol: ' + i.Symbol + + '
Name: ' + i.InstrumentName + + '
Account: ' + h.AccountName + + '
Purchase Date: ' + new Date(h.PurchaseDate).yyyymmdd() + + '
Purchase Price: ' + formatAmount(h.PurchasePricePerUnit, i.Currency, 2) + + '
No Units: ' + formatAmount(h.NoUnits, '', 0) + + '
Cost: ' + formatAmount(h.NoUnits * h.PurchasePricePerUnit, i.Currency, 2) + + '

Delete holding?' + + '

Delete'; + $("#modalContentDiv").html(content); + + $("#modalDialog .close").click(function () { modal.style.display = "none"; }); + + window.onclick = function (event) { // When the user clicks anywhere outside of the modal, close it + if (event.target == modal) { + modal.style.display = "none"; + } + } + + $("#modalDialog .ok-button").click(function () { modal.style.display = "none"; deleteHolding(holdingID); }); + + //Display the dialog + modal.style.display = "block"; +} +function deleteHolding(holdingID) { + //console.info("Delete holding: " + holdingID.toString()); + + let o = Instruments.GetHolding(holdingID); + let h = o.holding; + let i = o.instrument; + + //this.Data.map(function (item) { return item.Symbol; }).indexOf(Symbol); + let idx = i.Holdings.map(function (item) { return item.HoldingID; }).indexOf(holdingID); + if (idx >= 0) { + i.Holdings.splice(idx, 1); + } + + $.ajax({ + type: "POST", + contentType: "application/json", + url: "SharePrices.aspx/DeleteHolding", + dataType: "json", + data: JSON.stringify({ HoldingID: holdingID }), + success: function (response) { + $("#shareRow" + i.DisplayOrder).html(createSharesTableRow(i)); + createLongChart(i); + createMidChart(i); + createShortChart(i); + createSingleDayChart(i); + }, + failure: function (response) { console.error("DeleteHolding error: " + JSON.stringify(response)); } + }); +} + +function showModalDialog_AddInstrument() { + let modal = document.getElementById("modalDialog"); + + $("#modalTitle").html("Add Instrument"); + + let content = '
Search text:

' + + '
'; + $("#modalContentDiv").html(content); + + $("#modalDialog .close").click(function () { modal.style.display = "none"; }); + + window.onclick = function (event) { // When the user clicks anywhere outside of the modal, close it + if (event.target == modal) { + modal.style.display = "none"; + } + } + + //$("#modalDialog .ok-button").click(function () { modal.style.display = "none"; }); + + //Display the dialog + modal.style.display = "block"; +} +function searchForYahooInstrument(searchString) { + if (searchString.length > 1) { + $.ajax({ + type: "POST", + contentType: "application/json", + url: "SharePrices.aspx/SearchYahooFinanceShares", + dataType: "json", + data: JSON.stringify({ SearchString: searchString }), + success: function (response) { + let results = ''; + if (response.quotes) { + instrumentSearchResults = response.quotes; + results = ''; + for (let x = 0; x < instrumentSearchResults.length; x++) { + let q = instrumentSearchResults[x]; + results += '' + + '' + + '' + + '' + + ''; + } + results += '
SymbolNameExchangeType
' + q.symbol + '' + (q.longname ? q.longname : q.shortname) + '' + q.exchange + '' + q.typeDisp + '

Add Instrument
'; + } + $("#addInstrumentSearchResults").html(results); + }, + failure: function (response) { console.error("searchForYahooInstrument error: " + JSON.stringify(response)); } + }); + } +} +function selectSearchResult(index) { + for (let x = 0; x < instrumentSearchResults.length; x++) { + if (x == index) { + $("#searchResult" + x.toString()).addClass('selectedSearchResult'); + } else { + $("#searchResult" + x.toString()).removeClass('selectedSearchResult'); + } + } + $("#addInstrumentOKButton").removeClass("ok-button-disabled").addClass("ok-button").unbind().click(function () { $("#modalDialog").css("display", "none"); addInstrument(index) }); +} +function addInstrument(index) { + let i = instrumentSearchResults[index]; + console.info("Add instrument: " + JSON.stringify(i)); + $.ajax({ + type: "POST", + contentType: "application/json", + url: "SharePrices.aspx/AddInstrument", + dataType: "json", + data: JSON.stringify({ Symbol: i.symbol, FullName: (i.longname ? i.longname : i.shortname) }), + success: function (response) { + if (response.Symbol) { + Instruments.Data.push(response); + let i = Instruments.Data[Instruments.Data.length - 1]; + i.Holdings = []; + i.DailyData = []; + i.IntradayData = []; + let lastTR = $('#tblInstruments>tbody>tr').last(); + let cls = (lastTR.hasClass('shareRow')) ? 'altShareRow' : 'shareRow'; + let tr = '' + createSharesTableRow(i) + ''; + lastTR.after(tr); + } else { + console.error("addInstrument response error: " + JSON.stringify(response)); + } + }, + failure: function (response) { console.error("addInstrument AJAX error: " + JSON.stringify(response)); } + }); +} + +function showModalDialog_AddHolding(span) { + function GetAccountsDropdown() { + let dd = ''; + return dd; + } + + let symbol = $(span).attr('data-symbol'); + let i = Instruments.GetSymbol(symbol); + + let modal = document.getElementById("modalDialog"); + $("#modalTitle").html("Add Holding"); + + let content = '
' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '
Instrument Name' + i.InstrumentName + '
Symbol' + symbol + '
Account' + GetAccountsDropdown() + '
Current price' + (i.CurrentPrice ? formatAmount(i.CurrentPrice, i.Currency, 2) : '') + '
Purchase price / unit
No units
Total cost
Purchase date

' + + '
OK
'; + $("#modalContentDiv").html(content); + $("#newHoldingDate").datepicker({ dateFormat: 'yy-mm-dd', onSelect: function () { ValidateNewHolding(symbol) }}); + $("#modalDialog .close").click(function () { modal.style.display = "none"; }); + window.onclick = function (event) { // When the user clicks anywhere outside of the modal, close it + if (event.target == modal) { + modal.style.display = "none"; + } + } + + $("#newHoldingPrice").bind('input', function () { + $("#newHoldingOKButton").removeClass("ok-button").addClass("ok-button-disabled").unbind(); + try { + let noUnits = parseFloat($("#newHoldingNoUnits").val()); + let price = parseFloat($("#newHoldingPrice").val()); + $("#newHoldingTotalCost").val((noUnits * price).toFixed(2)); + ValidateNewHolding(symbol); + } catch (err) { } + }); + $("#newHoldingNoUnits").bind('input', function () { + $("#newHoldingOKButton").removeClass("ok-button").addClass("ok-button-disabled").unbind(); + try { + let noUnits = parseFloat($("#newHoldingNoUnits").val()); + let price = parseFloat($("#newHoldingPrice").val()); + $("#newHoldingTotalCost").val((noUnits * price).toFixed(2)); + ValidateNewHolding(symbol); + } catch (err) { } + }); + $("#newHoldingTotalCost").bind('input', function () { + $("#newHoldingOKButton").removeClass("ok-button").addClass("ok-button-disabled").unbind(); + try { + let noUnits = parseFloat($("#newHoldingNoUnits").val()); + let totalCost = parseFloat($("#newHoldingTotalCost").val()); + $("#newHoldingPrice").val((totalCost / noUnits).toFixed(4)); + ValidateNewHolding(symbol); + } catch (err) { } + }); + $("#newHoldingDate").bind('input', function () { + ValidateNewHolding(symbol); + }); + $("#addHoldingAccountName").bind('input', function () { + ValidateNewHolding(symbol); + }); + + //Display the dialog + modal.style.display = "block"; +} +function ValidateNewHolding(symbol) { + $("#newHoldingOKButton").removeClass("ok-button").addClass("ok-button-disabled").unbind(); + try { + let accountName = $("#addHoldingAccountName").val(); + let noUnits = parseFloat($("#newHoldingNoUnits").val()); + let price = parseFloat($("#newHoldingPrice").val()); + let purchaseDate = $("#newHoldingDate").val(); + + if (accountName != '' && accountName != 'Select account...' && noUnits > 0 && price > 0 && purchaseDate != '') { + if (new Date(purchaseDate) <= new Date()) { + $("#newHoldingOKButton").removeClass("ok-button-disabled").addClass("ok-button").unbind().bind('click', function () { $("#modalDialog").css("display", "none"); AddHolding(accountName, symbol, noUnits, price, purchaseDate) }); + } + } + } catch (err) { } +} +function AddHolding (accountName, symbol, noUnits, purchasePricePerUnit, purchaseDate) { + console.info("AddHolding: " + accountName + ", " + symbol + ", " + noUnits.toString() + ", " + purchasePricePerUnit.toFixed(4) + ", " + new Date(purchaseDate).yyyymmdd()); + + $.ajax({ + type: "POST", + contentType: "application/json", + url: "SharePrices.aspx/AddHolding", + dataType: "json", + data: JSON.stringify({ AccountName: accountName, Symbol: symbol, NoUnits: noUnits, PurchasePricePerUnit: purchasePricePerUnit, PurchaseDate: new Date(purchaseDate).getTime() }), + success: function (response) { + if (response.HoldingID) { + let i = Instruments.GetSymbol(symbol); + if (!i.Holdings) i.Holdings = []; + i.Holdings.push(response); + let tr = $("#shareRow" + i.DisplayOrder.toString()); + tr.html(createSharesTableRow(i)); + //$('#chartDiv span.addHolding').unbind().bind('click', function () { showModalDialog_AddHolding(this) }); + bindShareRowEvents(); + createLongChart(i); + createMidChart(i); + createShortChart(i); + createSingleDayChart(i); + } else { + console.error("addInstrument response error: " + JSON.stringify(response)); + } + }, + failure: function (response) { console.error("addInstrument AJAX error: " + JSON.stringify(response)); } + }); +} + +function zzz_OLD_createSharesTable() { + function zzz_getHoldingsTable(Instrument) { + if (Instrument.Holdings.length > 0) { + let totalUnits = 0; + let totalPrice = 0; + let t = ''; + for (let i = 0; i < Instrument.Holdings.length; i++) { + let h = Instrument.Holdings[i]; + totalUnits += h.NoUnits; + totalPrice += (h.NoUnits * h.PurchasePricePerUnit); + t += '' + + '' + + '' + + '' + + ''; + } + Instrument.TotalUnitsHeld = totalUnits; + Instrument.TotalHoldingsCost = totalPrice; + Instrument.BreakevenPrice = totalPrice / totalUnits; + if (Instrument.Holdings.length > 1) { + t += '' + + '' + + '' + + '' + + '' + + ''; + } + t += '
AccountBuy DatePriceUnitsTotal
×' + h.AccountName + '' + new Date(h.PurchaseDate).yyyymmdd() + '' + formatAmount(h.PurchasePricePerUnit, '', 2) + '' + formatAmount(h.NoUnits, '', 0) + '' + formatAmount(h.NoUnits * h.PurchasePricePerUnit, '', 2) + '
Total' + formatAmount(Instrument.BreakevenPrice, '', 2) + '' + formatAmount(Instrument.TotalUnitsHeld, '', 0) + '' + formatAmount(Instrument.TotalHoldingsCost, '', 2) + '
'; + return t; + } else { + return ''; + } + } + //console.info('createSharesTable()'); + //let tableClass = ($("navCharts").hasClass("activenav")) ? "activetab" : "inactivetab"; + //var tbl = '' + + var tbl = '
Instrument
' + + '' + + '' + + '' + + ''; + for (var rowNo = 0; rowNo < Instruments.Data.length; rowNo++) { + let i = Instruments.Data[rowNo]; + if (i.DisplayOrder) { + let cls = (rowNo % 2) ? 'altShareRow' : 'shareRow'; + let tr = '' + + '' + + '' + + '' + + '' + + ''; + tbl += tr; + } + } + tbl += '
InstrumentYTD1 Month' + + '' + + '1 Week1 Day
' + i.InstrumentName + '
' + + '' + i.Symbol + '
' + + getHoldingsTable(i) + + '
'+ + '
'; + $('#chartDiv').html(tbl); + getAllLocalDailyData(); +}; \ No newline at end of file diff --git a/Websites/SharePrices/SharePrices/scripts/jquery-3.5.1.min.js b/Websites/SharePrices/SharePrices/scripts/jquery-3.5.1.min.js new file mode 100644 index 0000000..b061403 --- /dev/null +++ b/Websites/SharePrices/SharePrices/scripts/jquery-3.5.1.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.5.1 | (c) JS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.5.1",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function D(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||j,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,j=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function qe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function Le(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function He(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Oe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||S.expando+"_"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Ut=E.implementation.createHTMLDocument("").body).innerHTML="
",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):("number"==typeof f.top&&(f.top+="px"),"number"==typeof f.left&&(f.left+="px"),c.css(f))}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=$e(y.pixelPosition,function(e,t){if(t)return t=Be(e,n),Me.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.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(e,n){S.fn[n]=function(e,t){return 0
"))}function n(e){var i="button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";return e.on("mouseout",i,function(){t(this).removeClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&t(this).removeClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&t(this).removeClass("ui-datepicker-next-hover")}).on("mouseover",i,o)}function o(){t.datepicker._isDisabledDatepicker(m.inline?m.dpDiv.parent()[0]:m.input[0])||(t(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover"),t(this).addClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&t(this).addClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&t(this).addClass("ui-datepicker-next-hover"))}function a(e,i){t.extend(e,i);for(var s in i)null==i[s]&&(e[s]=i[s]);return e}function r(t){return function(){var e=this.element.val();t.apply(this,arguments),this._refresh(),e!==this.element.val()&&this._trigger("change")}}t.ui=t.ui||{},t.ui.version="1.12.1";var h=0,l=Array.prototype.slice;t.cleanData=function(e){return function(i){var s,n,o;for(o=0;null!=(n=i[o]);o++)try{s=t._data(n,"events"),s&&s.remove&&t(n).triggerHandler("remove")}catch(a){}e(i)}}(t.cleanData),t.widget=function(e,i,s){var n,o,a,r={},h=e.split(".")[0];e=e.split(".")[1];var l=h+"-"+e;return s||(s=i,i=t.Widget),t.isArray(s)&&(s=t.extend.apply(null,[{}].concat(s))),t.expr[":"][l.toLowerCase()]=function(e){return!!t.data(e,l)},t[h]=t[h]||{},n=t[h][e],o=t[h][e]=function(t,e){return this._createWidget?(arguments.length&&this._createWidget(t,e),void 0):new o(t,e)},t.extend(o,n,{version:s.version,_proto:t.extend({},s),_childConstructors:[]}),a=new i,a.options=t.widget.extend({},a.options),t.each(s,function(e,s){return t.isFunction(s)?(r[e]=function(){function t(){return i.prototype[e].apply(this,arguments)}function n(t){return i.prototype[e].apply(this,t)}return function(){var e,i=this._super,o=this._superApply;return this._super=t,this._superApply=n,e=s.apply(this,arguments),this._super=i,this._superApply=o,e}}(),void 0):(r[e]=s,void 0)}),o.prototype=t.widget.extend(a,{widgetEventPrefix:n?a.widgetEventPrefix||e:e},r,{constructor:o,namespace:h,widgetName:e,widgetFullName:l}),n?(t.each(n._childConstructors,function(e,i){var s=i.prototype;t.widget(s.namespace+"."+s.widgetName,o,i._proto)}),delete n._childConstructors):i._childConstructors.push(o),t.widget.bridge(e,o),o},t.widget.extend=function(e){for(var i,s,n=l.call(arguments,1),o=0,a=n.length;a>o;o++)for(i in n[o])s=n[o][i],n[o].hasOwnProperty(i)&&void 0!==s&&(e[i]=t.isPlainObject(s)?t.isPlainObject(e[i])?t.widget.extend({},e[i],s):t.widget.extend({},s):s);return e},t.widget.bridge=function(e,i){var s=i.prototype.widgetFullName||e;t.fn[e]=function(n){var o="string"==typeof n,a=l.call(arguments,1),r=this;return o?this.length||"instance"!==n?this.each(function(){var i,o=t.data(this,s);return"instance"===n?(r=o,!1):o?t.isFunction(o[n])&&"_"!==n.charAt(0)?(i=o[n].apply(o,a),i!==o&&void 0!==i?(r=i&&i.jquery?r.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+n+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+n+"'")}):r=void 0:(a.length&&(n=t.widget.extend.apply(null,[n].concat(a))),this.each(function(){var e=t.data(this,s);e?(e.option(n||{}),e._init&&e._init()):t.data(this,s,new i(n,this))})),r}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,i){i=t(i||this.defaultElement||this)[0],this.element=t(i),this.uuid=h++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},i!==this&&(t.data(i,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===i&&this.destroy()}}),this.document=t(i.style?i.ownerDocument:i.document||i),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
"),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,g=-2*e.offset[1];0>c?(s=t.top+p+f+g+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+g)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+g-h,(i>0||u>a(i))&&(t.top+=p+f+g))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}});var c="ui-effects-",u="ui-effects-style",d="ui-effects-animated",p=t;t.effects={effect:{}},function(t,e){function i(t,e,i){var s=u[e.type]||{};return null==t?i||!e.def?null:e.def:(t=s.floor?~~t:parseFloat(t),isNaN(t)?e.def:s.mod?(t+s.mod)%s.mod:0>t?0:t>s.max?s.max:t)}function s(i){var s=l(),n=s._rgba=[];return i=i.toLowerCase(),f(h,function(t,o){var a,r=o.re.exec(i),h=r&&o.parse(r),l=o.space||"rgba";return h?(a=s[l](h),s[c[l].cache]=a[c[l].cache],n=s._rgba=a._rgba,!1):e}),n.length?("0,0,0,0"===n.join()&&t.extend(n,o.transparent),s):o[i]}function n(t,e,i){return i=(i+1)%1,1>6*i?t+6*(e-t)*i:1>2*i?e:2>3*i?t+6*(e-t)*(2/3-i):t}var o,a="backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor",r=/^([\-+])=\s*(\d+\.?\d*)/,h=[{re:/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(t){return[t[1],t[2],t[3],t[4]]}},{re:/rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(t){return[2.55*t[1],2.55*t[2],2.55*t[3],t[4]]}},{re:/#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,parse:function(t){return[parseInt(t[1],16),parseInt(t[2],16),parseInt(t[3],16)]}},{re:/#([a-f0-9])([a-f0-9])([a-f0-9])/,parse:function(t){return[parseInt(t[1]+t[1],16),parseInt(t[2]+t[2],16),parseInt(t[3]+t[3],16)]}},{re:/hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,space:"hsla",parse:function(t){return[t[1],t[2]/100,t[3]/100,t[4]]}}],l=t.Color=function(e,i,s,n){return new t.Color.fn.parse(e,i,s,n)},c={rgba:{props:{red:{idx:0,type:"byte"},green:{idx:1,type:"byte"},blue:{idx:2,type:"byte"}}},hsla:{props:{hue:{idx:0,type:"degrees"},saturation:{idx:1,type:"percent"},lightness:{idx:2,type:"percent"}}}},u={"byte":{floor:!0,max:255},percent:{max:1},degrees:{mod:360,floor:!0}},d=l.support={},p=t("

")[0],f=t.each;p.style.cssText="background-color:rgba(1,1,1,.5)",d.rgba=p.style.backgroundColor.indexOf("rgba")>-1,f(c,function(t,e){e.cache="_"+t,e.props.alpha={idx:3,type:"percent",def:1}}),l.fn=t.extend(l.prototype,{parse:function(n,a,r,h){if(n===e)return this._rgba=[null,null,null,null],this;(n.jquery||n.nodeType)&&(n=t(n).css(a),a=e);var u=this,d=t.type(n),p=this._rgba=[];return a!==e&&(n=[n,a,r,h],d="array"),"string"===d?this.parse(s(n)||o._default):"array"===d?(f(c.rgba.props,function(t,e){p[e.idx]=i(n[e.idx],e)}),this):"object"===d?(n instanceof l?f(c,function(t,e){n[e.cache]&&(u[e.cache]=n[e.cache].slice())}):f(c,function(e,s){var o=s.cache;f(s.props,function(t,e){if(!u[o]&&s.to){if("alpha"===t||null==n[t])return;u[o]=s.to(u._rgba)}u[o][e.idx]=i(n[t],e,!0)}),u[o]&&0>t.inArray(null,u[o].slice(0,3))&&(u[o][3]=1,s.from&&(u._rgba=s.from(u[o])))}),this):e},is:function(t){var i=l(t),s=!0,n=this;return f(c,function(t,o){var a,r=i[o.cache];return r&&(a=n[o.cache]||o.to&&o.to(n._rgba)||[],f(o.props,function(t,i){return null!=r[i.idx]?s=r[i.idx]===a[i.idx]:e})),s}),s},_space:function(){var t=[],e=this;return f(c,function(i,s){e[s.cache]&&t.push(i)}),t.pop()},transition:function(t,e){var s=l(t),n=s._space(),o=c[n],a=0===this.alpha()?l("transparent"):this,r=a[o.cache]||o.to(a._rgba),h=r.slice();return s=s[o.cache],f(o.props,function(t,n){var o=n.idx,a=r[o],l=s[o],c=u[n.type]||{};null!==l&&(null===a?h[o]=l:(c.mod&&(l-a>c.mod/2?a+=c.mod:a-l>c.mod/2&&(a-=c.mod)),h[o]=i((l-a)*e+a,n)))}),this[n](h)},blend:function(e){if(1===this._rgba[3])return this;var i=this._rgba.slice(),s=i.pop(),n=l(e)._rgba;return l(t.map(i,function(t,e){return(1-s)*n[e]+s*t}))},toRgbaString:function(){var e="rgba(",i=t.map(this._rgba,function(t,e){return null==t?e>2?1:0:t});return 1===i[3]&&(i.pop(),e="rgb("),e+i.join()+")"},toHslaString:function(){var e="hsla(",i=t.map(this.hsla(),function(t,e){return null==t&&(t=e>2?1:0),e&&3>e&&(t=Math.round(100*t)+"%"),t});return 1===i[3]&&(i.pop(),e="hsl("),e+i.join()+")"},toHexString:function(e){var i=this._rgba.slice(),s=i.pop();return e&&i.push(~~(255*s)),"#"+t.map(i,function(t){return t=(t||0).toString(16),1===t.length?"0"+t:t}).join("")},toString:function(){return 0===this._rgba[3]?"transparent":this.toRgbaString()}}),l.fn.parse.prototype=l.fn,c.hsla.to=function(t){if(null==t[0]||null==t[1]||null==t[2])return[null,null,null,t[3]];var e,i,s=t[0]/255,n=t[1]/255,o=t[2]/255,a=t[3],r=Math.max(s,n,o),h=Math.min(s,n,o),l=r-h,c=r+h,u=.5*c;return e=h===r?0:s===r?60*(n-o)/l+360:n===r?60*(o-s)/l+120:60*(s-n)/l+240,i=0===l?0:.5>=u?l/c:l/(2-c),[Math.round(e)%360,i,u,null==a?1:a]},c.hsla.from=function(t){if(null==t[0]||null==t[1]||null==t[2])return[null,null,null,t[3]];var e=t[0]/360,i=t[1],s=t[2],o=t[3],a=.5>=s?s*(1+i):s+i-s*i,r=2*s-a;return[Math.round(255*n(r,a,e+1/3)),Math.round(255*n(r,a,e)),Math.round(255*n(r,a,e-1/3)),o]},f(c,function(s,n){var o=n.props,a=n.cache,h=n.to,c=n.from;l.fn[s]=function(s){if(h&&!this[a]&&(this[a]=h(this._rgba)),s===e)return this[a].slice();var n,r=t.type(s),u="array"===r||"object"===r?s:arguments,d=this[a].slice();return f(o,function(t,e){var s=u["object"===r?t:e.idx];null==s&&(s=d[e.idx]),d[e.idx]=i(s,e)}),c?(n=l(c(d)),n[a]=d,n):l(d)},f(o,function(e,i){l.fn[e]||(l.fn[e]=function(n){var o,a=t.type(n),h="alpha"===e?this._hsla?"hsla":"rgba":s,l=this[h](),c=l[i.idx];return"undefined"===a?c:("function"===a&&(n=n.call(this,c),a=t.type(n)),null==n&&i.empty?this:("string"===a&&(o=r.exec(n),o&&(n=c+parseFloat(o[2])*("+"===o[1]?1:-1))),l[i.idx]=n,this[h](l)))})})}),l.hook=function(e){var i=e.split(" ");f(i,function(e,i){t.cssHooks[i]={set:function(e,n){var o,a,r="";if("transparent"!==n&&("string"!==t.type(n)||(o=s(n)))){if(n=l(o||n),!d.rgba&&1!==n._rgba[3]){for(a="backgroundColor"===i?e.parentNode:e;(""===r||"transparent"===r)&&a&&a.style;)try{r=t.css(a,"backgroundColor"),a=a.parentNode}catch(h){}n=n.blend(r&&"transparent"!==r?r:"_default")}n=n.toRgbaString()}try{e.style[i]=n}catch(h){}}},t.fx.step[i]=function(e){e.colorInit||(e.start=l(e.elem,i),e.end=l(e.end),e.colorInit=!0),t.cssHooks[i].set(e.elem,e.start.transition(e.end,e.pos))}})},l.hook(a),t.cssHooks.borderColor={expand:function(t){var e={};return f(["Top","Right","Bottom","Left"],function(i,s){e["border"+s+"Color"]=t}),e}},o=t.Color.names={aqua:"#00ffff",black:"#000000",blue:"#0000ff",fuchsia:"#ff00ff",gray:"#808080",green:"#008000",lime:"#00ff00",maroon:"#800000",navy:"#000080",olive:"#808000",purple:"#800080",red:"#ff0000",silver:"#c0c0c0",teal:"#008080",white:"#ffffff",yellow:"#ffff00",transparent:[null,null,null,0],_default:"#ffffff"}}(p),function(){function e(e){var i,s,n=e.ownerDocument.defaultView?e.ownerDocument.defaultView.getComputedStyle(e,null):e.currentStyle,o={};if(n&&n.length&&n[0]&&n[n[0]])for(s=n.length;s--;)i=n[s],"string"==typeof n[i]&&(o[t.camelCase(i)]=n[i]);else for(i in n)"string"==typeof n[i]&&(o[i]=n[i]);return o}function i(e,i){var s,o,a={};for(s in i)o=i[s],e[s]!==o&&(n[s]||(t.fx.step[s]||!isNaN(parseFloat(o)))&&(a[s]=o));return a}var s=["add","remove","toggle"],n={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};t.each(["borderLeftStyle","borderRightStyle","borderBottomStyle","borderTopStyle"],function(e,i){t.fx.step[i]=function(t){("none"!==t.end&&!t.setAttr||1===t.pos&&!t.setAttr)&&(p.style(t.elem,i,t.end),t.setAttr=!0)}}),t.fn.addBack||(t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.effects.animateClass=function(n,o,a,r){var h=t.speed(o,a,r);return this.queue(function(){var o,a=t(this),r=a.attr("class")||"",l=h.children?a.find("*").addBack():a;l=l.map(function(){var i=t(this);return{el:i,start:e(this)}}),o=function(){t.each(s,function(t,e){n[e]&&a[e+"Class"](n[e])})},o(),l=l.map(function(){return this.end=e(this.el[0]),this.diff=i(this.start,this.end),this}),a.attr("class",r),l=l.map(function(){var e=this,i=t.Deferred(),s=t.extend({},h,{queue:!1,complete:function(){i.resolve(e)}});return this.el.animate(this.diff,s),i.promise()}),t.when.apply(t,l.get()).done(function(){o(),t.each(arguments,function(){var e=this.el;t.each(this.diff,function(t){e.css(t,"")})}),h.complete.call(a[0])})})},t.fn.extend({addClass:function(e){return function(i,s,n,o){return s?t.effects.animateClass.call(this,{add:i},s,n,o):e.apply(this,arguments)}}(t.fn.addClass),removeClass:function(e){return function(i,s,n,o){return arguments.length>1?t.effects.animateClass.call(this,{remove:i},s,n,o):e.apply(this,arguments)}}(t.fn.removeClass),toggleClass:function(e){return function(i,s,n,o,a){return"boolean"==typeof s||void 0===s?n?t.effects.animateClass.call(this,s?{add:i}:{remove:i},n,o,a):e.apply(this,arguments):t.effects.animateClass.call(this,{toggle:i},s,n,o)}}(t.fn.toggleClass),switchClass:function(e,i,s,n,o){return t.effects.animateClass.call(this,{add:i,remove:e},s,n,o)}})}(),function(){function e(e,i,s,n){return t.isPlainObject(e)&&(i=e,e=e.effect),e={effect:e},null==i&&(i={}),t.isFunction(i)&&(n=i,s=null,i={}),("number"==typeof i||t.fx.speeds[i])&&(n=s,s=i,i={}),t.isFunction(s)&&(n=s,s=null),i&&t.extend(e,i),s=s||i.duration,e.duration=t.fx.off?0:"number"==typeof s?s:s in t.fx.speeds?t.fx.speeds[s]:t.fx.speeds._default,e.complete=n||i.complete,e}function i(e){return!e||"number"==typeof e||t.fx.speeds[e]?!0:"string"!=typeof e||t.effects.effect[e]?t.isFunction(e)?!0:"object"!=typeof e||e.effect?!1:!0:!0}function s(t,e){var i=e.outerWidth(),s=e.outerHeight(),n=/^rect\((-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto)\)$/,o=n.exec(t)||["",0,i,s,0];return{top:parseFloat(o[1])||0,right:"auto"===o[2]?i:parseFloat(o[2]),bottom:"auto"===o[3]?s:parseFloat(o[3]),left:parseFloat(o[4])||0}}t.expr&&t.expr.filters&&t.expr.filters.animated&&(t.expr.filters.animated=function(e){return function(i){return!!t(i).data(d)||e(i)}}(t.expr.filters.animated)),t.uiBackCompat!==!1&&t.extend(t.effects,{save:function(t,e){for(var i=0,s=e.length;s>i;i++)null!==e[i]&&t.data(c+e[i],t[0].style[e[i]])},restore:function(t,e){for(var i,s=0,n=e.length;n>s;s++)null!==e[s]&&(i=t.data(c+e[s]),t.css(e[s],i))},setMode:function(t,e){return"toggle"===e&&(e=t.is(":hidden")?"show":"hide"),e},createWrapper:function(e){if(e.parent().is(".ui-effects-wrapper"))return e.parent();var i={width:e.outerWidth(!0),height:e.outerHeight(!0),"float":e.css("float")},s=t("

").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),n={width:e.width(),height:e.height()},o=document.activeElement;try{o.id}catch(a){o=document.body}return e.wrap(s),(e[0]===o||t.contains(e[0],o))&&t(o).trigger("focus"),s=e.parent(),"static"===e.css("position")?(s.css({position:"relative"}),e.css({position:"relative"})):(t.extend(i,{position:e.css("position"),zIndex:e.css("z-index")}),t.each(["top","left","bottom","right"],function(t,s){i[s]=e.css(s),isNaN(parseInt(i[s],10))&&(i[s]="auto")}),e.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})),e.css(n),s.css(i).show()},removeWrapper:function(e){var i=document.activeElement;return e.parent().is(".ui-effects-wrapper")&&(e.parent().replaceWith(e),(e[0]===i||t.contains(e[0],i))&&t(i).trigger("focus")),e}}),t.extend(t.effects,{version:"1.12.1",define:function(e,i,s){return s||(s=i,i="effect"),t.effects.effect[e]=s,t.effects.effect[e].mode=i,s},scaledDimensions:function(t,e,i){if(0===e)return{height:0,width:0,outerHeight:0,outerWidth:0};var s="horizontal"!==i?(e||100)/100:1,n="vertical"!==i?(e||100)/100:1;return{height:t.height()*n,width:t.width()*s,outerHeight:t.outerHeight()*n,outerWidth:t.outerWidth()*s}},clipToBox:function(t){return{width:t.clip.right-t.clip.left,height:t.clip.bottom-t.clip.top,left:t.clip.left,top:t.clip.top}},unshift:function(t,e,i){var s=t.queue();e>1&&s.splice.apply(s,[1,0].concat(s.splice(e,i))),t.dequeue()},saveStyle:function(t){t.data(u,t[0].style.cssText)},restoreStyle:function(t){t[0].style.cssText=t.data(u)||"",t.removeData(u)},mode:function(t,e){var i=t.is(":hidden");return"toggle"===e&&(e=i?"show":"hide"),(i?"hide"===e:"show"===e)&&(e="none"),e},getBaseline:function(t,e){var i,s;switch(t[0]){case"top":i=0;break;case"middle":i=.5;break;case"bottom":i=1;break;default:i=t[0]/e.height}switch(t[1]){case"left":s=0;break;case"center":s=.5;break;case"right":s=1;break;default:s=t[1]/e.width}return{x:s,y:i}},createPlaceholder:function(e){var i,s=e.css("position"),n=e.position();return e.css({marginTop:e.css("marginTop"),marginBottom:e.css("marginBottom"),marginLeft:e.css("marginLeft"),marginRight:e.css("marginRight")}).outerWidth(e.outerWidth()).outerHeight(e.outerHeight()),/^(static|relative)/.test(s)&&(s="absolute",i=t("<"+e[0].nodeName+">").insertAfter(e).css({display:/^(inline|ruby)/.test(e.css("display"))?"inline-block":"block",visibility:"hidden",marginTop:e.css("marginTop"),marginBottom:e.css("marginBottom"),marginLeft:e.css("marginLeft"),marginRight:e.css("marginRight"),"float":e.css("float")}).outerWidth(e.outerWidth()).outerHeight(e.outerHeight()).addClass("ui-effects-placeholder"),e.data(c+"placeholder",i)),e.css({position:s,left:n.left,top:n.top}),i},removePlaceholder:function(t){var e=c+"placeholder",i=t.data(e);i&&(i.remove(),t.removeData(e))},cleanUp:function(e){t.effects.restoreStyle(e),t.effects.removePlaceholder(e)},setTransition:function(e,i,s,n){return n=n||{},t.each(i,function(t,i){var o=e.cssUnit(i);o[0]>0&&(n[i]=o[0]*s+o[1])}),n}}),t.fn.extend({effect:function(){function i(e){function i(){r.removeData(d),t.effects.cleanUp(r),"hide"===s.mode&&r.hide(),a()}function a(){t.isFunction(h)&&h.call(r[0]),t.isFunction(e)&&e()}var r=t(this);s.mode=c.shift(),t.uiBackCompat===!1||o?"none"===s.mode?(r[l](),a()):n.call(r[0],s,i):(r.is(":hidden")?"hide"===l:"show"===l)?(r[l](),a()):n.call(r[0],s,a)}var s=e.apply(this,arguments),n=t.effects.effect[s.effect],o=n.mode,a=s.queue,r=a||"fx",h=s.complete,l=s.mode,c=[],u=function(e){var i=t(this),s=t.effects.mode(i,l)||o;i.data(d,!0),c.push(s),o&&("show"===s||s===o&&"hide"===s)&&i.show(),o&&"none"===s||t.effects.saveStyle(i),t.isFunction(e)&&e()};return t.fx.off||!n?l?this[l](s.duration,h):this.each(function(){h&&h.call(this)}):a===!1?this.each(u).each(i):this.queue(r,u).queue(r,i)},show:function(t){return function(s){if(i(s))return t.apply(this,arguments);var n=e.apply(this,arguments);return n.mode="show",this.effect.call(this,n) +}}(t.fn.show),hide:function(t){return function(s){if(i(s))return t.apply(this,arguments);var n=e.apply(this,arguments);return n.mode="hide",this.effect.call(this,n)}}(t.fn.hide),toggle:function(t){return function(s){if(i(s)||"boolean"==typeof s)return t.apply(this,arguments);var n=e.apply(this,arguments);return n.mode="toggle",this.effect.call(this,n)}}(t.fn.toggle),cssUnit:function(e){var i=this.css(e),s=[];return t.each(["em","px","%","pt"],function(t,e){i.indexOf(e)>0&&(s=[parseFloat(i),e])}),s},cssClip:function(t){return t?this.css("clip","rect("+t.top+"px "+t.right+"px "+t.bottom+"px "+t.left+"px)"):s(this.css("clip"),this)},transfer:function(e,i){var s=t(this),n=t(e.to),o="fixed"===n.css("position"),a=t("body"),r=o?a.scrollTop():0,h=o?a.scrollLeft():0,l=n.offset(),c={top:l.top-r,left:l.left-h,height:n.innerHeight(),width:n.innerWidth()},u=s.offset(),d=t("
").appendTo("body").addClass(e.className).css({top:u.top-r,left:u.left-h,height:s.innerHeight(),width:s.innerWidth(),position:o?"fixed":"absolute"}).animate(c,e.duration,e.easing,function(){d.remove(),t.isFunction(i)&&i()})}}),t.fx.step.clip=function(e){e.clipInit||(e.start=t(e.elem).cssClip(),"string"==typeof e.end&&(e.end=s(e.end,e.elem)),e.clipInit=!0),t(e.elem).cssClip({top:e.pos*(e.end.top-e.start.top)+e.start.top,right:e.pos*(e.end.right-e.start.right)+e.start.right,bottom:e.pos*(e.end.bottom-e.start.bottom)+e.start.bottom,left:e.pos*(e.end.left-e.start.left)+e.start.left})}}(),function(){var e={};t.each(["Quad","Cubic","Quart","Quint","Expo"],function(t,i){e[i]=function(e){return Math.pow(e,t+2)}}),t.extend(e,{Sine:function(t){return 1-Math.cos(t*Math.PI/2)},Circ:function(t){return 1-Math.sqrt(1-t*t)},Elastic:function(t){return 0===t||1===t?t:-Math.pow(2,8*(t-1))*Math.sin((80*(t-1)-7.5)*Math.PI/15)},Back:function(t){return t*t*(3*t-2)},Bounce:function(t){for(var e,i=4;((e=Math.pow(2,--i))-1)/11>t;);return 1/Math.pow(4,3-i)-7.5625*Math.pow((3*e-2)/22-t,2)}}),t.each(e,function(e,i){t.easing["easeIn"+e]=i,t.easing["easeOut"+e]=function(t){return 1-i(1-t)},t.easing["easeInOut"+e]=function(t){return.5>t?i(2*t)/2:1-i(-2*t+2)/2}})}();var f=t.effects;t.effects.define("blind","hide",function(e,i){var s={up:["bottom","top"],vertical:["bottom","top"],down:["top","bottom"],left:["right","left"],horizontal:["right","left"],right:["left","right"]},n=t(this),o=e.direction||"up",a=n.cssClip(),r={clip:t.extend({},a)},h=t.effects.createPlaceholder(n);r.clip[s[o][0]]=r.clip[s[o][1]],"show"===e.mode&&(n.cssClip(r.clip),h&&h.css(t.effects.clipToBox(r)),r.clip=a),h&&h.animate(t.effects.clipToBox(r),e.duration,e.easing),n.animate(r,{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("bounce",function(e,i){var s,n,o,a=t(this),r=e.mode,h="hide"===r,l="show"===r,c=e.direction||"up",u=e.distance,d=e.times||5,p=2*d+(l||h?1:0),f=e.duration/p,g=e.easing,m="up"===c||"down"===c?"top":"left",_="up"===c||"left"===c,v=0,b=a.queue().length;for(t.effects.createPlaceholder(a),o=a.css(m),u||(u=a["top"===m?"outerHeight":"outerWidth"]()/3),l&&(n={opacity:1},n[m]=o,a.css("opacity",0).css(m,_?2*-u:2*u).animate(n,f,g)),h&&(u/=Math.pow(2,d-1)),n={},n[m]=o;d>v;v++)s={},s[m]=(_?"-=":"+=")+u,a.animate(s,f,g).animate(n,f,g),u=h?2*u:u/2;h&&(s={opacity:0},s[m]=(_?"-=":"+=")+u,a.animate(s,f,g)),a.queue(i),t.effects.unshift(a,b,p+1)}),t.effects.define("clip","hide",function(e,i){var s,n={},o=t(this),a=e.direction||"vertical",r="both"===a,h=r||"horizontal"===a,l=r||"vertical"===a;s=o.cssClip(),n.clip={top:l?(s.bottom-s.top)/2:s.top,right:h?(s.right-s.left)/2:s.right,bottom:l?(s.bottom-s.top)/2:s.bottom,left:h?(s.right-s.left)/2:s.left},t.effects.createPlaceholder(o),"show"===e.mode&&(o.cssClip(n.clip),n.clip=s),o.animate(n,{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("drop","hide",function(e,i){var s,n=t(this),o=e.mode,a="show"===o,r=e.direction||"left",h="up"===r||"down"===r?"top":"left",l="up"===r||"left"===r?"-=":"+=",c="+="===l?"-=":"+=",u={opacity:0};t.effects.createPlaceholder(n),s=e.distance||n["top"===h?"outerHeight":"outerWidth"](!0)/2,u[h]=l+s,a&&(n.css(u),u[h]=c+s,u.opacity=1),n.animate(u,{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("explode","hide",function(e,i){function s(){b.push(this),b.length===u*d&&n()}function n(){p.css({visibility:"visible"}),t(b).remove(),i()}var o,a,r,h,l,c,u=e.pieces?Math.round(Math.sqrt(e.pieces)):3,d=u,p=t(this),f=e.mode,g="show"===f,m=p.show().css("visibility","hidden").offset(),_=Math.ceil(p.outerWidth()/d),v=Math.ceil(p.outerHeight()/u),b=[];for(o=0;u>o;o++)for(h=m.top+o*v,c=o-(u-1)/2,a=0;d>a;a++)r=m.left+a*_,l=a-(d-1)/2,p.clone().appendTo("body").wrap("
").css({position:"absolute",visibility:"visible",left:-a*_,top:-o*v}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:_,height:v,left:r+(g?l*_:0),top:h+(g?c*v:0),opacity:g?0:1}).animate({left:r+(g?0:l*_),top:h+(g?0:c*v),opacity:g?1:0},e.duration||500,e.easing,s)}),t.effects.define("fade","toggle",function(e,i){var s="show"===e.mode;t(this).css("opacity",s?0:1).animate({opacity:s?1:0},{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("fold","hide",function(e,i){var s=t(this),n=e.mode,o="show"===n,a="hide"===n,r=e.size||15,h=/([0-9]+)%/.exec(r),l=!!e.horizFirst,c=l?["right","bottom"]:["bottom","right"],u=e.duration/2,d=t.effects.createPlaceholder(s),p=s.cssClip(),f={clip:t.extend({},p)},g={clip:t.extend({},p)},m=[p[c[0]],p[c[1]]],_=s.queue().length;h&&(r=parseInt(h[1],10)/100*m[a?0:1]),f.clip[c[0]]=r,g.clip[c[0]]=r,g.clip[c[1]]=0,o&&(s.cssClip(g.clip),d&&d.css(t.effects.clipToBox(g)),g.clip=p),s.queue(function(i){d&&d.animate(t.effects.clipToBox(f),u,e.easing).animate(t.effects.clipToBox(g),u,e.easing),i()}).animate(f,u,e.easing).animate(g,u,e.easing).queue(i),t.effects.unshift(s,_,4)}),t.effects.define("highlight","show",function(e,i){var s=t(this),n={backgroundColor:s.css("backgroundColor")};"hide"===e.mode&&(n.opacity=0),t.effects.saveStyle(s),s.css({backgroundImage:"none",backgroundColor:e.color||"#ffff99"}).animate(n,{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("size",function(e,i){var s,n,o,a=t(this),r=["fontSize"],h=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],l=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"],c=e.mode,u="effect"!==c,d=e.scale||"both",p=e.origin||["middle","center"],f=a.css("position"),g=a.position(),m=t.effects.scaledDimensions(a),_=e.from||m,v=e.to||t.effects.scaledDimensions(a,0);t.effects.createPlaceholder(a),"show"===c&&(o=_,_=v,v=o),n={from:{y:_.height/m.height,x:_.width/m.width},to:{y:v.height/m.height,x:v.width/m.width}},("box"===d||"both"===d)&&(n.from.y!==n.to.y&&(_=t.effects.setTransition(a,h,n.from.y,_),v=t.effects.setTransition(a,h,n.to.y,v)),n.from.x!==n.to.x&&(_=t.effects.setTransition(a,l,n.from.x,_),v=t.effects.setTransition(a,l,n.to.x,v))),("content"===d||"both"===d)&&n.from.y!==n.to.y&&(_=t.effects.setTransition(a,r,n.from.y,_),v=t.effects.setTransition(a,r,n.to.y,v)),p&&(s=t.effects.getBaseline(p,m),_.top=(m.outerHeight-_.outerHeight)*s.y+g.top,_.left=(m.outerWidth-_.outerWidth)*s.x+g.left,v.top=(m.outerHeight-v.outerHeight)*s.y+g.top,v.left=(m.outerWidth-v.outerWidth)*s.x+g.left),a.css(_),("content"===d||"both"===d)&&(h=h.concat(["marginTop","marginBottom"]).concat(r),l=l.concat(["marginLeft","marginRight"]),a.find("*[width]").each(function(){var i=t(this),s=t.effects.scaledDimensions(i),o={height:s.height*n.from.y,width:s.width*n.from.x,outerHeight:s.outerHeight*n.from.y,outerWidth:s.outerWidth*n.from.x},a={height:s.height*n.to.y,width:s.width*n.to.x,outerHeight:s.height*n.to.y,outerWidth:s.width*n.to.x};n.from.y!==n.to.y&&(o=t.effects.setTransition(i,h,n.from.y,o),a=t.effects.setTransition(i,h,n.to.y,a)),n.from.x!==n.to.x&&(o=t.effects.setTransition(i,l,n.from.x,o),a=t.effects.setTransition(i,l,n.to.x,a)),u&&t.effects.saveStyle(i),i.css(o),i.animate(a,e.duration,e.easing,function(){u&&t.effects.restoreStyle(i)})})),a.animate(v,{queue:!1,duration:e.duration,easing:e.easing,complete:function(){var e=a.offset();0===v.opacity&&a.css("opacity",_.opacity),u||(a.css("position","static"===f?"relative":f).offset(e),t.effects.saveStyle(a)),i()}})}),t.effects.define("scale",function(e,i){var s=t(this),n=e.mode,o=parseInt(e.percent,10)||(0===parseInt(e.percent,10)?0:"effect"!==n?0:100),a=t.extend(!0,{from:t.effects.scaledDimensions(s),to:t.effects.scaledDimensions(s,o,e.direction||"both"),origin:e.origin||["middle","center"]},e);e.fade&&(a.from.opacity=1,a.to.opacity=0),t.effects.effect.size.call(this,a,i)}),t.effects.define("puff","hide",function(e,i){var s=t.extend(!0,{},e,{fade:!0,percent:parseInt(e.percent,10)||150});t.effects.effect.scale.call(this,s,i)}),t.effects.define("pulsate","show",function(e,i){var s=t(this),n=e.mode,o="show"===n,a="hide"===n,r=o||a,h=2*(e.times||5)+(r?1:0),l=e.duration/h,c=0,u=1,d=s.queue().length;for((o||!s.is(":visible"))&&(s.css("opacity",0).show(),c=1);h>u;u++)s.animate({opacity:c},l,e.easing),c=1-c;s.animate({opacity:c},l,e.easing),s.queue(i),t.effects.unshift(s,d,h+1)}),t.effects.define("shake",function(e,i){var s=1,n=t(this),o=e.direction||"left",a=e.distance||20,r=e.times||3,h=2*r+1,l=Math.round(e.duration/h),c="up"===o||"down"===o?"top":"left",u="up"===o||"left"===o,d={},p={},f={},g=n.queue().length;for(t.effects.createPlaceholder(n),d[c]=(u?"-=":"+=")+a,p[c]=(u?"+=":"-=")+2*a,f[c]=(u?"-=":"+=")+2*a,n.animate(d,l,e.easing);r>s;s++)n.animate(p,l,e.easing).animate(f,l,e.easing);n.animate(p,l,e.easing).animate(d,l/2,e.easing).queue(i),t.effects.unshift(n,g,h+1)}),t.effects.define("slide","show",function(e,i){var s,n,o=t(this),a={up:["bottom","top"],down:["top","bottom"],left:["right","left"],right:["left","right"]},r=e.mode,h=e.direction||"left",l="up"===h||"down"===h?"top":"left",c="up"===h||"left"===h,u=e.distance||o["top"===l?"outerHeight":"outerWidth"](!0),d={};t.effects.createPlaceholder(o),s=o.cssClip(),n=o.position()[l],d[l]=(c?-1:1)*u+n,d.clip=o.cssClip(),d.clip[a[h][1]]=d.clip[a[h][0]],"show"===r&&(o.cssClip(d.clip),o.css(l,d[l]),d.clip=s,d[l]=n),o.animate(d,{queue:!1,duration:e.duration,easing:e.easing,complete:i})});var f;t.uiBackCompat!==!1&&(f=t.effects.define("transfer",function(e,i){t(this).transfer(e,i)})),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.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},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,.\/:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.widget("ui.accordion",{version:"1.12.1",options:{active:0,animate:{},classes:{"ui-accordion-header":"ui-corner-top","ui-accordion-header-collapsed":"ui-corner-all","ui-accordion-content":"ui-corner-bottom"},collapsible:!1,event:"click",header:"> li > :first-child, > :not(li):even",heightStyle:"auto",icons:{activeHeader:"ui-icon-triangle-1-s",header:"ui-icon-triangle-1-e"},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 e=this.options;this.prevShow=this.prevHide=t(),this._addClass("ui-accordion","ui-widget ui-helper-reset"),this.element.attr("role","tablist"),e.collapsible||e.active!==!1&&null!=e.active||(e.active=0),this._processPanels(),0>e.active&&(e.active+=this.headers.length),this._refresh()},_getCreateEventData:function(){return{header:this.active,panel:this.active.length?this.active.next():t()}},_createIcons:function(){var e,i,s=this.options.icons;s&&(e=t(""),this._addClass(e,"ui-accordion-header-icon","ui-icon "+s.header),e.prependTo(this.headers),i=this.active.children(".ui-accordion-header-icon"),this._removeClass(i,s.header)._addClass(i,null,s.activeHeader)._addClass(this.headers,"ui-accordion-icons"))},_destroyIcons:function(){this._removeClass(this.headers,"ui-accordion-icons"),this.headers.children(".ui-accordion-header-icon").remove()},_destroy:function(){var t;this.element.removeAttr("role"),this.headers.removeAttr("role aria-expanded aria-selected aria-controls tabIndex").removeUniqueId(),this._destroyIcons(),t=this.headers.next().css("display","").removeAttr("role aria-hidden aria-labelledby").removeUniqueId(),"content"!==this.options.heightStyle&&t.css("height","")},_setOption:function(t,e){return"active"===t?(this._activate(e),void 0):("event"===t&&(this.options.event&&this._off(this.headers,this.options.event),this._setupEvents(e)),this._super(t,e),"collapsible"!==t||e||this.options.active!==!1||this._activate(0),"icons"===t&&(this._destroyIcons(),e&&this._createIcons()),void 0)},_setOptionDisabled:function(t){this._super(t),this.element.attr("aria-disabled",t),this._toggleClass(null,"ui-state-disabled",!!t),this._toggleClass(this.headers.add(this.headers.next()),null,"ui-state-disabled",!!t)},_keydown:function(e){if(!e.altKey&&!e.ctrlKey){var i=t.ui.keyCode,s=this.headers.length,n=this.headers.index(e.target),o=!1;switch(e.keyCode){case i.RIGHT:case i.DOWN:o=this.headers[(n+1)%s];break;case i.LEFT:case i.UP:o=this.headers[(n-1+s)%s];break;case i.SPACE:case i.ENTER:this._eventHandler(e);break;case i.HOME:o=this.headers[0];break;case i.END:o=this.headers[s-1]}o&&(t(e.target).attr("tabIndex",-1),t(o).attr("tabIndex",0),t(o).trigger("focus"),e.preventDefault())}},_panelKeyDown:function(e){e.keyCode===t.ui.keyCode.UP&&e.ctrlKey&&t(e.currentTarget).prev().trigger("focus")},refresh:function(){var e=this.options;this._processPanels(),e.active===!1&&e.collapsible===!0||!this.headers.length?(e.active=!1,this.active=t()):e.active===!1?this._activate(0):this.active.length&&!t.contains(this.element[0],this.active[0])?this.headers.length===this.headers.find(".ui-state-disabled").length?(e.active=!1,this.active=t()):this._activate(Math.max(0,e.active-1)):e.active=this.headers.index(this.active),this._destroyIcons(),this._refresh()},_processPanels:function(){var t=this.headers,e=this.panels;this.headers=this.element.find(this.options.header),this._addClass(this.headers,"ui-accordion-header ui-accordion-header-collapsed","ui-state-default"),this.panels=this.headers.next().filter(":not(.ui-accordion-content-active)").hide(),this._addClass(this.panels,"ui-accordion-content","ui-helper-reset ui-widget-content"),e&&(this._off(t.not(this.headers)),this._off(e.not(this.panels)))},_refresh:function(){var e,i=this.options,s=i.heightStyle,n=this.element.parent();this.active=this._findActive(i.active),this._addClass(this.active,"ui-accordion-header-active","ui-state-active")._removeClass(this.active,"ui-accordion-header-collapsed"),this._addClass(this.active.next(),"ui-accordion-content-active"),this.active.next().show(),this.headers.attr("role","tab").each(function(){var e=t(this),i=e.uniqueId().attr("id"),s=e.next(),n=s.uniqueId().attr("id");e.attr("aria-controls",n),s.attr("aria-labelledby",i)}).next().attr("role","tabpanel"),this.headers.not(this.active).attr({"aria-selected":"false","aria-expanded":"false",tabIndex:-1}).next().attr({"aria-hidden":"true"}).hide(),this.active.length?this.active.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0}).next().attr({"aria-hidden":"false"}):this.headers.eq(0).attr("tabIndex",0),this._createIcons(),this._setupEvents(i.event),"fill"===s?(e=n.height(),this.element.siblings(":visible").each(function(){var i=t(this),s=i.css("position");"absolute"!==s&&"fixed"!==s&&(e-=i.outerHeight(!0))}),this.headers.each(function(){e-=t(this).outerHeight(!0)}),this.headers.next().each(function(){t(this).height(Math.max(0,e-t(this).innerHeight()+t(this).height()))}).css("overflow","auto")):"auto"===s&&(e=0,this.headers.next().each(function(){var i=t(this).is(":visible");i||t(this).show(),e=Math.max(e,t(this).css("height","").height()),i||t(this).hide()}).height(e))},_activate:function(e){var i=this._findActive(e)[0];i!==this.active[0]&&(i=i||this.active[0],this._eventHandler({target:i,currentTarget:i,preventDefault:t.noop}))},_findActive:function(e){return"number"==typeof e?this.headers.eq(e):t()},_setupEvents:function(e){var i={keydown:"_keydown"};e&&t.each(e.split(" "),function(t,e){i[e]="_eventHandler"}),this._off(this.headers.add(this.headers.next())),this._on(this.headers,i),this._on(this.headers.next(),{keydown:"_panelKeyDown"}),this._hoverable(this.headers),this._focusable(this.headers)},_eventHandler:function(e){var i,s,n=this.options,o=this.active,a=t(e.currentTarget),r=a[0]===o[0],h=r&&n.collapsible,l=h?t():a.next(),c=o.next(),u={oldHeader:o,oldPanel:c,newHeader:h?t():a,newPanel:l};e.preventDefault(),r&&!n.collapsible||this._trigger("beforeActivate",e,u)===!1||(n.active=h?!1:this.headers.index(a),this.active=r?t():a,this._toggle(u),this._removeClass(o,"ui-accordion-header-active","ui-state-active"),n.icons&&(i=o.children(".ui-accordion-header-icon"),this._removeClass(i,null,n.icons.activeHeader)._addClass(i,null,n.icons.header)),r||(this._removeClass(a,"ui-accordion-header-collapsed")._addClass(a,"ui-accordion-header-active","ui-state-active"),n.icons&&(s=a.children(".ui-accordion-header-icon"),this._removeClass(s,null,n.icons.header)._addClass(s,null,n.icons.activeHeader)),this._addClass(a.next(),"ui-accordion-content-active")))},_toggle:function(e){var i=e.newPanel,s=this.prevShow.length?this.prevShow:e.oldPanel;this.prevShow.add(this.prevHide).stop(!0,!0),this.prevShow=i,this.prevHide=s,this.options.animate?this._animate(i,s,e):(s.hide(),i.show(),this._toggleComplete(e)),s.attr({"aria-hidden":"true"}),s.prev().attr({"aria-selected":"false","aria-expanded":"false"}),i.length&&s.length?s.prev().attr({tabIndex:-1,"aria-expanded":"false"}):i.length&&this.headers.filter(function(){return 0===parseInt(t(this).attr("tabIndex"),10)}).attr("tabIndex",-1),i.attr("aria-hidden","false").prev().attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0})},_animate:function(t,e,i){var s,n,o,a=this,r=0,h=t.css("box-sizing"),l=t.length&&(!e.length||t.index()",delay:300,options:{icons:{submenu:"ui-icon-caret-1-e"},items:"> *",menus:"ul",position:{my:"left top",at:"right top"},role:"menu",blur:null,focus:null,select:null},_create:function(){this.activeMenu=this.element,this.mouseHandled=!1,this.element.uniqueId().attr({role:this.options.role,tabIndex:0}),this._addClass("ui-menu","ui-widget ui-widget-content"),this._on({"mousedown .ui-menu-item":function(t){t.preventDefault()},"click .ui-menu-item":function(e){var i=t(e.target),s=t(t.ui.safeActiveElement(this.document[0]));!this.mouseHandled&&i.not(".ui-state-disabled").length&&(this.select(e),e.isPropagationStopped()||(this.mouseHandled=!0),i.has(".ui-menu").length?this.expand(e):!this.element.is(":focus")&&s.closest(".ui-menu").length&&(this.element.trigger("focus",[!0]),this.active&&1===this.active.parents(".ui-menu").length&&clearTimeout(this.timer)))},"mouseenter .ui-menu-item":function(e){if(!this.previousFilter){var i=t(e.target).closest(".ui-menu-item"),s=t(e.currentTarget);i[0]===s[0]&&(this._removeClass(s.siblings().children(".ui-state-active"),null,"ui-state-active"),this.focus(e,s))}},mouseleave:"collapseAll","mouseleave .ui-menu":"collapseAll",focus:function(t,e){var i=this.active||this.element.find(this.options.items).eq(0);e||this.focus(t,i)},blur:function(e){this._delay(function(){var i=!t.contains(this.element[0],t.ui.safeActiveElement(this.document[0]));i&&this.collapseAll(e)})},keydown:"_keydown"}),this.refresh(),this._on(this.document,{click:function(t){this._closeOnDocumentClick(t)&&this.collapseAll(t),this.mouseHandled=!1}})},_destroy:function(){var e=this.element.find(".ui-menu-item").removeAttr("role aria-disabled"),i=e.children(".ui-menu-item-wrapper").removeUniqueId().removeAttr("tabIndex role aria-haspopup");this.element.removeAttr("aria-activedescendant").find(".ui-menu").addBack().removeAttr("role aria-labelledby aria-expanded aria-hidden aria-disabled tabIndex").removeUniqueId().show(),i.children().each(function(){var e=t(this);e.data("ui-menu-submenu-caret")&&e.remove()})},_keydown:function(e){var i,s,n,o,a=!0;switch(e.keyCode){case t.ui.keyCode.PAGE_UP:this.previousPage(e);break;case t.ui.keyCode.PAGE_DOWN:this.nextPage(e);break;case t.ui.keyCode.HOME:this._move("first","first",e);break;case t.ui.keyCode.END:this._move("last","last",e);break;case t.ui.keyCode.UP:this.previous(e);break;case t.ui.keyCode.DOWN:this.next(e);break;case t.ui.keyCode.LEFT:this.collapse(e);break;case t.ui.keyCode.RIGHT:this.active&&!this.active.is(".ui-state-disabled")&&this.expand(e);break;case t.ui.keyCode.ENTER:case t.ui.keyCode.SPACE:this._activate(e);break;case t.ui.keyCode.ESCAPE:this.collapse(e);break;default:a=!1,s=this.previousFilter||"",o=!1,n=e.keyCode>=96&&105>=e.keyCode?""+(e.keyCode-96):String.fromCharCode(e.keyCode),clearTimeout(this.filterTimer),n===s?o=!0:n=s+n,i=this._filterMenuItems(n),i=o&&-1!==i.index(this.active.next())?this.active.nextAll(".ui-menu-item"):i,i.length||(n=String.fromCharCode(e.keyCode),i=this._filterMenuItems(n)),i.length?(this.focus(e,i),this.previousFilter=n,this.filterTimer=this._delay(function(){delete this.previousFilter},1e3)):delete this.previousFilter}a&&e.preventDefault()},_activate:function(t){this.active&&!this.active.is(".ui-state-disabled")&&(this.active.children("[aria-haspopup='true']").length?this.expand(t):this.select(t))},refresh:function(){var e,i,s,n,o,a=this,r=this.options.icons.submenu,h=this.element.find(this.options.menus);this._toggleClass("ui-menu-icons",null,!!this.element.find(".ui-icon").length),s=h.filter(":not(.ui-menu)").hide().attr({role:this.options.role,"aria-hidden":"true","aria-expanded":"false"}).each(function(){var e=t(this),i=e.prev(),s=t("").data("ui-menu-submenu-caret",!0);a._addClass(s,"ui-menu-icon","ui-icon "+r),i.attr("aria-haspopup","true").prepend(s),e.attr("aria-labelledby",i.attr("id"))}),this._addClass(s,"ui-menu","ui-widget ui-widget-content ui-front"),e=h.add(this.element),i=e.find(this.options.items),i.not(".ui-menu-item").each(function(){var e=t(this);a._isDivider(e)&&a._addClass(e,"ui-menu-divider","ui-widget-content")}),n=i.not(".ui-menu-item, .ui-menu-divider"),o=n.children().not(".ui-menu").uniqueId().attr({tabIndex:-1,role:this._itemRole()}),this._addClass(n,"ui-menu-item")._addClass(o,"ui-menu-item-wrapper"),i.filter(".ui-state-disabled").attr("aria-disabled","true"),this.active&&!t.contains(this.element[0],this.active[0])&&this.blur()},_itemRole:function(){return{menu:"menuitem",listbox:"option"}[this.options.role]},_setOption:function(t,e){if("icons"===t){var i=this.element.find(".ui-menu-icon");this._removeClass(i,null,this.options.icons.submenu)._addClass(i,null,e.submenu)}this._super(t,e)},_setOptionDisabled:function(t){this._super(t),this.element.attr("aria-disabled",t+""),this._toggleClass(null,"ui-state-disabled",!!t)},focus:function(t,e){var i,s,n;this.blur(t,t&&"focus"===t.type),this._scrollIntoView(e),this.active=e.first(),s=this.active.children(".ui-menu-item-wrapper"),this._addClass(s,null,"ui-state-active"),this.options.role&&this.element.attr("aria-activedescendant",s.attr("id")),n=this.active.parent().closest(".ui-menu-item").children(".ui-menu-item-wrapper"),this._addClass(n,null,"ui-state-active"),t&&"keydown"===t.type?this._close():this.timer=this._delay(function(){this._close()},this.delay),i=e.children(".ui-menu"),i.length&&t&&/^mouse/.test(t.type)&&this._startOpening(i),this.activeMenu=e.parent(),this._trigger("focus",t,{item:e})},_scrollIntoView:function(e){var i,s,n,o,a,r;this._hasScroll()&&(i=parseFloat(t.css(this.activeMenu[0],"borderTopWidth"))||0,s=parseFloat(t.css(this.activeMenu[0],"paddingTop"))||0,n=e.offset().top-this.activeMenu.offset().top-i-s,o=this.activeMenu.scrollTop(),a=this.activeMenu.height(),r=e.outerHeight(),0>n?this.activeMenu.scrollTop(o+n):n+r>a&&this.activeMenu.scrollTop(o+n-a+r))},blur:function(t,e){e||clearTimeout(this.timer),this.active&&(this._removeClass(this.active.children(".ui-menu-item-wrapper"),null,"ui-state-active"),this._trigger("blur",t,{item:this.active}),this.active=null)},_startOpening:function(t){clearTimeout(this.timer),"true"===t.attr("aria-hidden")&&(this.timer=this._delay(function(){this._close(),this._open(t)},this.delay))},_open:function(e){var i=t.extend({of:this.active},this.options.position);clearTimeout(this.timer),this.element.find(".ui-menu").not(e.parents(".ui-menu")).hide().attr("aria-hidden","true"),e.show().removeAttr("aria-hidden").attr("aria-expanded","true").position(i)},collapseAll:function(e,i){clearTimeout(this.timer),this.timer=this._delay(function(){var s=i?this.element:t(e&&e.target).closest(this.element.find(".ui-menu"));s.length||(s=this.element),this._close(s),this.blur(e),this._removeClass(s.find(".ui-state-active"),null,"ui-state-active"),this.activeMenu=s},this.delay)},_close:function(t){t||(t=this.active?this.active.parent():this.element),t.find(".ui-menu").hide().attr("aria-hidden","true").attr("aria-expanded","false")},_closeOnDocumentClick:function(e){return!t(e.target).closest(".ui-menu").length},_isDivider:function(t){return!/[^\-\u2014\u2013\s]/.test(t.text())},collapse:function(t){var e=this.active&&this.active.parent().closest(".ui-menu-item",this.element);e&&e.length&&(this._close(),this.focus(t,e))},expand:function(t){var e=this.active&&this.active.children(".ui-menu ").find(this.options.items).first();e&&e.length&&(this._open(e.parent()),this._delay(function(){this.focus(t,e)}))},next:function(t){this._move("next","first",t)},previous:function(t){this._move("prev","last",t)},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(t,e,i){var s;this.active&&(s="first"===t||"last"===t?this.active["first"===t?"prevAll":"nextAll"](".ui-menu-item").eq(-1):this.active[t+"All"](".ui-menu-item").eq(0)),s&&s.length&&this.active||(s=this.activeMenu.find(this.options.items)[e]()),this.focus(i,s)},nextPage:function(e){var i,s,n;return this.active?(this.isLastItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.nextAll(".ui-menu-item").each(function(){return i=t(this),0>i.offset().top-s-n}),this.focus(e,i)):this.focus(e,this.activeMenu.find(this.options.items)[this.active?"last":"first"]())),void 0):(this.next(e),void 0)},previousPage:function(e){var i,s,n;return this.active?(this.isFirstItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.prevAll(".ui-menu-item").each(function(){return i=t(this),i.offset().top-s+n>0}),this.focus(e,i)):this.focus(e,this.activeMenu.find(this.options.items).first())),void 0):(this.next(e),void 0)},_hasScroll:function(){return this.element.outerHeight()",options:{appendTo:null,autoFocus:!1,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null,change:null,close:null,focus:null,open:null,response:null,search:null,select:null},requestIndex:0,pending:0,_create:function(){var e,i,s,n=this.element[0].nodeName.toLowerCase(),o="textarea"===n,a="input"===n; +this.isMultiLine=o||!a&&this._isContentEditable(this.element),this.valueMethod=this.element[o||a?"val":"text"],this.isNewMenu=!0,this._addClass("ui-autocomplete-input"),this.element.attr("autocomplete","off"),this._on(this.element,{keydown:function(n){if(this.element.prop("readOnly"))return e=!0,s=!0,i=!0,void 0;e=!1,s=!1,i=!1;var o=t.ui.keyCode;switch(n.keyCode){case o.PAGE_UP:e=!0,this._move("previousPage",n);break;case o.PAGE_DOWN:e=!0,this._move("nextPage",n);break;case o.UP:e=!0,this._keyEvent("previous",n);break;case o.DOWN:e=!0,this._keyEvent("next",n);break;case o.ENTER:this.menu.active&&(e=!0,n.preventDefault(),this.menu.select(n));break;case o.TAB:this.menu.active&&this.menu.select(n);break;case o.ESCAPE:this.menu.element.is(":visible")&&(this.isMultiLine||this._value(this.term),this.close(n),n.preventDefault());break;default:i=!0,this._searchTimeout(n)}},keypress:function(s){if(e)return e=!1,(!this.isMultiLine||this.menu.element.is(":visible"))&&s.preventDefault(),void 0;if(!i){var n=t.ui.keyCode;switch(s.keyCode){case n.PAGE_UP:this._move("previousPage",s);break;case n.PAGE_DOWN:this._move("nextPage",s);break;case n.UP:this._keyEvent("previous",s);break;case n.DOWN:this._keyEvent("next",s)}}},input:function(t){return s?(s=!1,t.preventDefault(),void 0):(this._searchTimeout(t),void 0)},focus:function(){this.selectedItem=null,this.previous=this._value()},blur:function(t){return this.cancelBlur?(delete this.cancelBlur,void 0):(clearTimeout(this.searching),this.close(t),this._change(t),void 0)}}),this._initSource(),this.menu=t("