Initial
This commit is contained in:
commit
343564fcc0
30
.dockerignore
Normal file
30
.dockerignore
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
**/.classpath
|
||||||
|
**/.dockerignore
|
||||||
|
**/.env
|
||||||
|
**/.git
|
||||||
|
**/.gitignore
|
||||||
|
**/.project
|
||||||
|
**/.settings
|
||||||
|
**/.toolstarget
|
||||||
|
**/.vs
|
||||||
|
**/.vscode
|
||||||
|
**/*.*proj.user
|
||||||
|
**/*.dbmdl
|
||||||
|
**/*.jfm
|
||||||
|
**/azds.yaml
|
||||||
|
**/bin
|
||||||
|
**/charts
|
||||||
|
**/docker-compose*
|
||||||
|
**/Dockerfile*
|
||||||
|
**/node_modules
|
||||||
|
**/npm-debug.log
|
||||||
|
**/obj
|
||||||
|
**/secrets.dev.yaml
|
||||||
|
**/values.dev.yaml
|
||||||
|
LICENSE
|
||||||
|
README.md
|
||||||
|
!**/.gitignore
|
||||||
|
!.git/HEAD
|
||||||
|
!.git/config
|
||||||
|
!.git/packed-refs
|
||||||
|
!.git/refs/heads/**
|
||||||
63
.gitattributes
vendored
Normal file
63
.gitattributes
vendored
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
###############################################################################
|
||||||
|
# Set default behavior to automatically normalize line endings.
|
||||||
|
###############################################################################
|
||||||
|
* text=auto
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
# Set default behavior for command prompt diff.
|
||||||
|
#
|
||||||
|
# This is need for earlier builds of msysgit that does not have it on by
|
||||||
|
# default for csharp files.
|
||||||
|
# Note: This is only used by command line
|
||||||
|
###############################################################################
|
||||||
|
#*.cs diff=csharp
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
# Set the merge driver for project and solution files
|
||||||
|
#
|
||||||
|
# Merging from the command prompt will add diff markers to the files if there
|
||||||
|
# are conflicts (Merging from VS is not affected by the settings below, in VS
|
||||||
|
# the diff markers are never inserted). Diff markers may cause the following
|
||||||
|
# file extensions to fail to load in VS. An alternative would be to treat
|
||||||
|
# these files as binary and thus will always conflict and require user
|
||||||
|
# intervention with every merge. To do so, just uncomment the entries below
|
||||||
|
###############################################################################
|
||||||
|
#*.sln merge=binary
|
||||||
|
#*.csproj merge=binary
|
||||||
|
#*.vbproj merge=binary
|
||||||
|
#*.vcxproj merge=binary
|
||||||
|
#*.vcproj merge=binary
|
||||||
|
#*.dbproj merge=binary
|
||||||
|
#*.fsproj merge=binary
|
||||||
|
#*.lsproj merge=binary
|
||||||
|
#*.wixproj merge=binary
|
||||||
|
#*.modelproj merge=binary
|
||||||
|
#*.sqlproj merge=binary
|
||||||
|
#*.wwaproj merge=binary
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
# behavior for image files
|
||||||
|
#
|
||||||
|
# image files are treated as binary by default.
|
||||||
|
###############################################################################
|
||||||
|
#*.jpg binary
|
||||||
|
#*.png binary
|
||||||
|
#*.gif binary
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
# diff behavior for common document formats
|
||||||
|
#
|
||||||
|
# Convert binary document formats to text before diffing them. This feature
|
||||||
|
# is only available from the command line. Turn it on by uncommenting the
|
||||||
|
# entries below.
|
||||||
|
###############################################################################
|
||||||
|
#*.doc diff=astextplain
|
||||||
|
#*.DOC diff=astextplain
|
||||||
|
#*.docx diff=astextplain
|
||||||
|
#*.DOCX diff=astextplain
|
||||||
|
#*.dot diff=astextplain
|
||||||
|
#*.DOT diff=astextplain
|
||||||
|
#*.pdf diff=astextplain
|
||||||
|
#*.PDF diff=astextplain
|
||||||
|
#*.rtf diff=astextplain
|
||||||
|
#*.RTF diff=astextplain
|
||||||
363
.gitignore
vendored
Normal file
363
.gitignore
vendored
Normal file
@ -0,0 +1,363 @@
|
|||||||
|
## Ignore Visual Studio temporary files, build results, and
|
||||||
|
## files generated by popular Visual Studio add-ons.
|
||||||
|
##
|
||||||
|
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
|
||||||
|
|
||||||
|
# User-specific files
|
||||||
|
*.rsuser
|
||||||
|
*.suo
|
||||||
|
*.user
|
||||||
|
*.userosscache
|
||||||
|
*.sln.docstates
|
||||||
|
|
||||||
|
# User-specific files (MonoDevelop/Xamarin Studio)
|
||||||
|
*.userprefs
|
||||||
|
|
||||||
|
# Mono auto generated files
|
||||||
|
mono_crash.*
|
||||||
|
|
||||||
|
# Build results
|
||||||
|
[Dd]ebug/
|
||||||
|
[Dd]ebugPublic/
|
||||||
|
[Rr]elease/
|
||||||
|
[Rr]eleases/
|
||||||
|
x64/
|
||||||
|
x86/
|
||||||
|
[Ww][Ii][Nn]32/
|
||||||
|
[Aa][Rr][Mm]/
|
||||||
|
[Aa][Rr][Mm]64/
|
||||||
|
bld/
|
||||||
|
[Bb]in/
|
||||||
|
[Oo]bj/
|
||||||
|
[Oo]ut/
|
||||||
|
[Ll]og/
|
||||||
|
[Ll]ogs/
|
||||||
|
|
||||||
|
# Visual Studio 2015/2017 cache/options directory
|
||||||
|
.vs/
|
||||||
|
# Uncomment if you have tasks that create the project's static files in wwwroot
|
||||||
|
#wwwroot/
|
||||||
|
|
||||||
|
# Visual Studio 2017 auto generated files
|
||||||
|
Generated\ Files/
|
||||||
|
|
||||||
|
# MSTest test Results
|
||||||
|
[Tt]est[Rr]esult*/
|
||||||
|
[Bb]uild[Ll]og.*
|
||||||
|
|
||||||
|
# NUnit
|
||||||
|
*.VisualState.xml
|
||||||
|
TestResult.xml
|
||||||
|
nunit-*.xml
|
||||||
|
|
||||||
|
# Build Results of an ATL Project
|
||||||
|
[Dd]ebugPS/
|
||||||
|
[Rr]eleasePS/
|
||||||
|
dlldata.c
|
||||||
|
|
||||||
|
# Benchmark Results
|
||||||
|
BenchmarkDotNet.Artifacts/
|
||||||
|
|
||||||
|
# .NET Core
|
||||||
|
project.lock.json
|
||||||
|
project.fragment.lock.json
|
||||||
|
artifacts/
|
||||||
|
|
||||||
|
# ASP.NET Scaffolding
|
||||||
|
ScaffoldingReadMe.txt
|
||||||
|
|
||||||
|
# StyleCop
|
||||||
|
StyleCopReport.xml
|
||||||
|
|
||||||
|
# Files built by Visual Studio
|
||||||
|
*_i.c
|
||||||
|
*_p.c
|
||||||
|
*_h.h
|
||||||
|
*.ilk
|
||||||
|
*.meta
|
||||||
|
*.obj
|
||||||
|
*.iobj
|
||||||
|
*.pch
|
||||||
|
*.pdb
|
||||||
|
*.ipdb
|
||||||
|
*.pgc
|
||||||
|
*.pgd
|
||||||
|
*.rsp
|
||||||
|
*.sbr
|
||||||
|
*.tlb
|
||||||
|
*.tli
|
||||||
|
*.tlh
|
||||||
|
*.tmp
|
||||||
|
*.tmp_proj
|
||||||
|
*_wpftmp.csproj
|
||||||
|
*.log
|
||||||
|
*.vspscc
|
||||||
|
*.vssscc
|
||||||
|
.builds
|
||||||
|
*.pidb
|
||||||
|
*.svclog
|
||||||
|
*.scc
|
||||||
|
|
||||||
|
# Chutzpah Test files
|
||||||
|
_Chutzpah*
|
||||||
|
|
||||||
|
# Visual C++ cache files
|
||||||
|
ipch/
|
||||||
|
*.aps
|
||||||
|
*.ncb
|
||||||
|
*.opendb
|
||||||
|
*.opensdf
|
||||||
|
*.sdf
|
||||||
|
*.cachefile
|
||||||
|
*.VC.db
|
||||||
|
*.VC.VC.opendb
|
||||||
|
|
||||||
|
# Visual Studio profiler
|
||||||
|
*.psess
|
||||||
|
*.vsp
|
||||||
|
*.vspx
|
||||||
|
*.sap
|
||||||
|
|
||||||
|
# Visual Studio Trace Files
|
||||||
|
*.e2e
|
||||||
|
|
||||||
|
# TFS 2012 Local Workspace
|
||||||
|
$tf/
|
||||||
|
|
||||||
|
# Guidance Automation Toolkit
|
||||||
|
*.gpState
|
||||||
|
|
||||||
|
# ReSharper is a .NET coding add-in
|
||||||
|
_ReSharper*/
|
||||||
|
*.[Rr]e[Ss]harper
|
||||||
|
*.DotSettings.user
|
||||||
|
|
||||||
|
# TeamCity is a build add-in
|
||||||
|
_TeamCity*
|
||||||
|
|
||||||
|
# DotCover is a Code Coverage Tool
|
||||||
|
*.dotCover
|
||||||
|
|
||||||
|
# AxoCover is a Code Coverage Tool
|
||||||
|
.axoCover/*
|
||||||
|
!.axoCover/settings.json
|
||||||
|
|
||||||
|
# Coverlet is a free, cross platform Code Coverage Tool
|
||||||
|
coverage*.json
|
||||||
|
coverage*.xml
|
||||||
|
coverage*.info
|
||||||
|
|
||||||
|
# Visual Studio code coverage results
|
||||||
|
*.coverage
|
||||||
|
*.coveragexml
|
||||||
|
|
||||||
|
# NCrunch
|
||||||
|
_NCrunch_*
|
||||||
|
.*crunch*.local.xml
|
||||||
|
nCrunchTemp_*
|
||||||
|
|
||||||
|
# MightyMoose
|
||||||
|
*.mm.*
|
||||||
|
AutoTest.Net/
|
||||||
|
|
||||||
|
# Web workbench (sass)
|
||||||
|
.sass-cache/
|
||||||
|
|
||||||
|
# Installshield output folder
|
||||||
|
[Ee]xpress/
|
||||||
|
|
||||||
|
# DocProject is a documentation generator add-in
|
||||||
|
DocProject/buildhelp/
|
||||||
|
DocProject/Help/*.HxT
|
||||||
|
DocProject/Help/*.HxC
|
||||||
|
DocProject/Help/*.hhc
|
||||||
|
DocProject/Help/*.hhk
|
||||||
|
DocProject/Help/*.hhp
|
||||||
|
DocProject/Help/Html2
|
||||||
|
DocProject/Help/html
|
||||||
|
|
||||||
|
# Click-Once directory
|
||||||
|
publish/
|
||||||
|
|
||||||
|
# Publish Web Output
|
||||||
|
*.[Pp]ublish.xml
|
||||||
|
*.azurePubxml
|
||||||
|
# Note: Comment the next line if you want to checkin your web deploy settings,
|
||||||
|
# but database connection strings (with potential passwords) will be unencrypted
|
||||||
|
*.pubxml
|
||||||
|
*.publishproj
|
||||||
|
|
||||||
|
# Microsoft Azure Web App publish settings. Comment the next line if you want to
|
||||||
|
# checkin your Azure Web App publish settings, but sensitive information contained
|
||||||
|
# in these scripts will be unencrypted
|
||||||
|
PublishScripts/
|
||||||
|
|
||||||
|
# NuGet Packages
|
||||||
|
*.nupkg
|
||||||
|
# NuGet Symbol Packages
|
||||||
|
*.snupkg
|
||||||
|
# The packages folder can be ignored because of Package Restore
|
||||||
|
**/[Pp]ackages/*
|
||||||
|
# except build/, which is used as an MSBuild target.
|
||||||
|
!**/[Pp]ackages/build/
|
||||||
|
# Uncomment if necessary however generally it will be regenerated when needed
|
||||||
|
#!**/[Pp]ackages/repositories.config
|
||||||
|
# NuGet v3's project.json files produces more ignorable files
|
||||||
|
*.nuget.props
|
||||||
|
*.nuget.targets
|
||||||
|
|
||||||
|
# Microsoft Azure Build Output
|
||||||
|
csx/
|
||||||
|
*.build.csdef
|
||||||
|
|
||||||
|
# Microsoft Azure Emulator
|
||||||
|
ecf/
|
||||||
|
rcf/
|
||||||
|
|
||||||
|
# Windows Store app package directories and files
|
||||||
|
AppPackages/
|
||||||
|
BundleArtifacts/
|
||||||
|
Package.StoreAssociation.xml
|
||||||
|
_pkginfo.txt
|
||||||
|
*.appx
|
||||||
|
*.appxbundle
|
||||||
|
*.appxupload
|
||||||
|
|
||||||
|
# Visual Studio cache files
|
||||||
|
# files ending in .cache can be ignored
|
||||||
|
*.[Cc]ache
|
||||||
|
# but keep track of directories ending in .cache
|
||||||
|
!?*.[Cc]ache/
|
||||||
|
|
||||||
|
# Others
|
||||||
|
ClientBin/
|
||||||
|
~$*
|
||||||
|
*~
|
||||||
|
*.dbmdl
|
||||||
|
*.dbproj.schemaview
|
||||||
|
*.jfm
|
||||||
|
*.pfx
|
||||||
|
*.publishsettings
|
||||||
|
orleans.codegen.cs
|
||||||
|
|
||||||
|
# Including strong name files can present a security risk
|
||||||
|
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
|
||||||
|
#*.snk
|
||||||
|
|
||||||
|
# Since there are multiple workflows, uncomment next line to ignore bower_components
|
||||||
|
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
|
||||||
|
#bower_components/
|
||||||
|
|
||||||
|
# RIA/Silverlight projects
|
||||||
|
Generated_Code/
|
||||||
|
|
||||||
|
# Backup & report files from converting an old project file
|
||||||
|
# to a newer Visual Studio version. Backup files are not needed,
|
||||||
|
# because we have git ;-)
|
||||||
|
_UpgradeReport_Files/
|
||||||
|
Backup*/
|
||||||
|
UpgradeLog*.XML
|
||||||
|
UpgradeLog*.htm
|
||||||
|
ServiceFabricBackup/
|
||||||
|
*.rptproj.bak
|
||||||
|
|
||||||
|
# SQL Server files
|
||||||
|
*.mdf
|
||||||
|
*.ldf
|
||||||
|
*.ndf
|
||||||
|
|
||||||
|
# Business Intelligence projects
|
||||||
|
*.rdl.data
|
||||||
|
*.bim.layout
|
||||||
|
*.bim_*.settings
|
||||||
|
*.rptproj.rsuser
|
||||||
|
*- [Bb]ackup.rdl
|
||||||
|
*- [Bb]ackup ([0-9]).rdl
|
||||||
|
*- [Bb]ackup ([0-9][0-9]).rdl
|
||||||
|
|
||||||
|
# Microsoft Fakes
|
||||||
|
FakesAssemblies/
|
||||||
|
|
||||||
|
# GhostDoc plugin setting file
|
||||||
|
*.GhostDoc.xml
|
||||||
|
|
||||||
|
# Node.js Tools for Visual Studio
|
||||||
|
.ntvs_analysis.dat
|
||||||
|
node_modules/
|
||||||
|
|
||||||
|
# Visual Studio 6 build log
|
||||||
|
*.plg
|
||||||
|
|
||||||
|
# Visual Studio 6 workspace options file
|
||||||
|
*.opt
|
||||||
|
|
||||||
|
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
|
||||||
|
*.vbw
|
||||||
|
|
||||||
|
# Visual Studio LightSwitch build output
|
||||||
|
**/*.HTMLClient/GeneratedArtifacts
|
||||||
|
**/*.DesktopClient/GeneratedArtifacts
|
||||||
|
**/*.DesktopClient/ModelManifest.xml
|
||||||
|
**/*.Server/GeneratedArtifacts
|
||||||
|
**/*.Server/ModelManifest.xml
|
||||||
|
_Pvt_Extensions
|
||||||
|
|
||||||
|
# Paket dependency manager
|
||||||
|
.paket/paket.exe
|
||||||
|
paket-files/
|
||||||
|
|
||||||
|
# FAKE - F# Make
|
||||||
|
.fake/
|
||||||
|
|
||||||
|
# CodeRush personal settings
|
||||||
|
.cr/personal
|
||||||
|
|
||||||
|
# Python Tools for Visual Studio (PTVS)
|
||||||
|
__pycache__/
|
||||||
|
*.pyc
|
||||||
|
|
||||||
|
# Cake - Uncomment if you are using it
|
||||||
|
# tools/**
|
||||||
|
# !tools/packages.config
|
||||||
|
|
||||||
|
# Tabs Studio
|
||||||
|
*.tss
|
||||||
|
|
||||||
|
# Telerik's JustMock configuration file
|
||||||
|
*.jmconfig
|
||||||
|
|
||||||
|
# BizTalk build output
|
||||||
|
*.btp.cs
|
||||||
|
*.btm.cs
|
||||||
|
*.odx.cs
|
||||||
|
*.xsd.cs
|
||||||
|
|
||||||
|
# OpenCover UI analysis results
|
||||||
|
OpenCover/
|
||||||
|
|
||||||
|
# Azure Stream Analytics local run output
|
||||||
|
ASALocalRun/
|
||||||
|
|
||||||
|
# MSBuild Binary and Structured Log
|
||||||
|
*.binlog
|
||||||
|
|
||||||
|
# NVidia Nsight GPU debugger configuration file
|
||||||
|
*.nvuser
|
||||||
|
|
||||||
|
# MFractors (Xamarin productivity tool) working folder
|
||||||
|
.mfractor/
|
||||||
|
|
||||||
|
# Local History for Visual Studio
|
||||||
|
.localhistory/
|
||||||
|
|
||||||
|
# BeatPulse healthcheck temp database
|
||||||
|
healthchecksdb
|
||||||
|
|
||||||
|
# Backup folder for Package Reference Convert tool in Visual Studio 2017
|
||||||
|
MigrationBackup/
|
||||||
|
|
||||||
|
# Ionide (cross platform F# VS Code tools) working folder
|
||||||
|
.ionide/
|
||||||
|
|
||||||
|
# Fody - auto-generated XML schema
|
||||||
|
FodyWeavers.xsd
|
||||||
13
.idea/.idea.TaxCalculator/.idea/.gitignore
generated
vendored
Normal file
13
.idea/.idea.TaxCalculator/.idea/.gitignore
generated
vendored
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
# Default ignored files
|
||||||
|
/shelf/
|
||||||
|
/workspace.xml
|
||||||
|
# Rider ignored files
|
||||||
|
/modules.xml
|
||||||
|
/projectSettingsUpdater.xml
|
||||||
|
/.idea.TaxCalculator.iml
|
||||||
|
/contentModel.xml
|
||||||
|
# Editor-based HTTP Client requests
|
||||||
|
/httpRequests/
|
||||||
|
# Datasource local storage ignored files
|
||||||
|
/dataSources/
|
||||||
|
/dataSources.local.xml
|
||||||
1
.idea/.idea.TaxCalculator/.idea/.name
generated
Normal file
1
.idea/.idea.TaxCalculator/.idea/.name
generated
Normal file
@ -0,0 +1 @@
|
|||||||
|
TaxCalculator
|
||||||
4
.idea/.idea.TaxCalculator/.idea/encodings.xml
generated
Normal file
4
.idea/.idea.TaxCalculator/.idea/encodings.xml
generated
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="Encoding" addBOMForNewFiles="with BOM under Windows, with no BOM otherwise" />
|
||||||
|
</project>
|
||||||
8
.idea/.idea.TaxCalculator/.idea/indexLayout.xml
generated
Normal file
8
.idea/.idea.TaxCalculator/.idea/indexLayout.xml
generated
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="UserContentModel">
|
||||||
|
<attachedFolders />
|
||||||
|
<explicitIncludes />
|
||||||
|
<explicitExcludes />
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
6
.idea/.idea.TaxCalculator/.idea/vcs.xml
generated
Normal file
6
.idea/.idea.TaxCalculator/.idea/vcs.xml
generated
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="VcsDirectoryMappings">
|
||||||
|
<mapping directory="" vcs="Git" />
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
13
DAL/DAL.csproj
Normal file
13
DAL/DAL.csproj
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\Domain\Domain.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
9
DAL/ITaxBandRepository.cs
Normal file
9
DAL/ITaxBandRepository.cs
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
namespace DAL
|
||||||
|
{
|
||||||
|
using Domain;
|
||||||
|
|
||||||
|
public interface ITaxBandRepository
|
||||||
|
{
|
||||||
|
Task<List<TaxBand>> GetTaxBands();
|
||||||
|
}
|
||||||
|
}
|
||||||
20
DAL/TaxBandRepository.cs
Normal file
20
DAL/TaxBandRepository.cs
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
namespace DAL
|
||||||
|
{
|
||||||
|
using Domain;
|
||||||
|
|
||||||
|
public class TaxBandRepository : ITaxBandRepository
|
||||||
|
{
|
||||||
|
public async Task<List<TaxBand>> GetTaxBands()
|
||||||
|
{
|
||||||
|
// You can implement logic here to fetch tax bands from a data source.
|
||||||
|
// For now, let's create a sample list.
|
||||||
|
|
||||||
|
return new List<TaxBand>
|
||||||
|
{
|
||||||
|
new TaxBand { LowerLimit = 0, UpperLimit = 5000, TaxRate = 0 },
|
||||||
|
new TaxBand { LowerLimit = 5000, UpperLimit = 20000, TaxRate = 20 },
|
||||||
|
new TaxBand { LowerLimit = 20000, UpperLimit = null, TaxRate = 40 }
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
9
Domain/Domain.csproj
Normal file
9
Domain/Domain.csproj
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
12
Domain/SalaryDetails.cs
Normal file
12
Domain/SalaryDetails.cs
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
namespace Domain
|
||||||
|
{
|
||||||
|
public class SalaryDetails
|
||||||
|
{
|
||||||
|
public decimal GrossAnnualSalary { get; set; }
|
||||||
|
public decimal GrossMonthlySalary { get; set; }
|
||||||
|
public decimal NetAnnualSalary { get; set; }
|
||||||
|
public decimal NetMonthlySalary { get; set; }
|
||||||
|
public decimal AnnualTaxPaid { get; set; }
|
||||||
|
public decimal MonthlyTaxPaid { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
9
Domain/TaxBand.cs
Normal file
9
Domain/TaxBand.cs
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
namespace Domain
|
||||||
|
{
|
||||||
|
public class TaxBand
|
||||||
|
{
|
||||||
|
public int LowerLimit { get; set; }
|
||||||
|
public int? UpperLimit { get; set; }
|
||||||
|
public int TaxRate { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
26
TaxCalculator.Api/Controllers/SalaryController.cs
Normal file
26
TaxCalculator.Api/Controllers/SalaryController.cs
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
namespace TaxCalculator.Api.Controllers
|
||||||
|
{
|
||||||
|
using Domain;
|
||||||
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
using TaxCalculator.Models;
|
||||||
|
|
||||||
|
[Route("api/[controller]")]
|
||||||
|
[ApiController]
|
||||||
|
public class SalaryController : ControllerBase
|
||||||
|
{
|
||||||
|
private readonly ISalaryService _salaryService;
|
||||||
|
|
||||||
|
public SalaryController(ISalaryService salaryService)
|
||||||
|
{
|
||||||
|
_salaryService = salaryService;
|
||||||
|
}
|
||||||
|
|
||||||
|
[HttpPost]
|
||||||
|
public async Task<SalaryDetails> Post([FromBody] int grossAnnualSalary)
|
||||||
|
{
|
||||||
|
var salaryDetails = await _salaryService.CalculateSalaryDetails(grossAnnualSalary);
|
||||||
|
|
||||||
|
return salaryDetails;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
25
TaxCalculator.Api/Dockerfile
Normal file
25
TaxCalculator.Api/Dockerfile
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
#See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging.
|
||||||
|
|
||||||
|
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
|
||||||
|
USER app
|
||||||
|
WORKDIR /app
|
||||||
|
EXPOSE 8080
|
||||||
|
EXPOSE 8081
|
||||||
|
|
||||||
|
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
|
||||||
|
ARG BUILD_CONFIGURATION=Release
|
||||||
|
WORKDIR /src
|
||||||
|
COPY ["TaxCalculator.Api/TaxCalculator.Api.csproj", "TaxCalculator.Api/"]
|
||||||
|
RUN dotnet restore "./TaxCalculator.Api/./TaxCalculator.Api.csproj"
|
||||||
|
COPY . .
|
||||||
|
WORKDIR "/src/TaxCalculator.Api"
|
||||||
|
RUN dotnet build "./TaxCalculator.Api.csproj" -c $BUILD_CONFIGURATION -o /app/build
|
||||||
|
|
||||||
|
FROM build AS publish
|
||||||
|
ARG BUILD_CONFIGURATION=Release
|
||||||
|
RUN dotnet publish "./TaxCalculator.Api.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false
|
||||||
|
|
||||||
|
FROM base AS final
|
||||||
|
WORKDIR /app
|
||||||
|
COPY --from=publish /app/publish .
|
||||||
|
ENTRYPOINT ["dotnet", "TaxCalculator.Api.dll"]
|
||||||
52
TaxCalculator.Api/Program.cs
Normal file
52
TaxCalculator.Api/Program.cs
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
|
||||||
|
namespace TaxCalculator.Api
|
||||||
|
{
|
||||||
|
using DAL;
|
||||||
|
using TaxCalculator.Api.Services;
|
||||||
|
using TaxCalculator.Models;
|
||||||
|
|
||||||
|
public class Program
|
||||||
|
{
|
||||||
|
public static void Main(string[] args)
|
||||||
|
{
|
||||||
|
var builder = WebApplication.CreateBuilder(args);
|
||||||
|
|
||||||
|
// Add services to the container.
|
||||||
|
builder.Services.AddControllers();
|
||||||
|
|
||||||
|
// Register your services and repositories here
|
||||||
|
builder.Services.AddScoped<ITaxBandRepository, TaxBandRepository>();
|
||||||
|
builder.Services.AddScoped<ITaxCalculatorService, TaxCalculatorService>();
|
||||||
|
builder.Services.AddScoped<ISalaryService, SalaryService>();
|
||||||
|
|
||||||
|
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
|
||||||
|
builder.Services.AddEndpointsApiExplorer();
|
||||||
|
builder.Services.AddSwaggerGen();
|
||||||
|
|
||||||
|
var app = builder.Build();
|
||||||
|
|
||||||
|
// Configure the HTTP request pipeline.
|
||||||
|
if (app.Environment.IsDevelopment())
|
||||||
|
{
|
||||||
|
app.UseSwagger();
|
||||||
|
app.UseSwaggerUI();
|
||||||
|
}
|
||||||
|
|
||||||
|
app.UseHttpsRedirection();
|
||||||
|
|
||||||
|
// Configure CORS with the variable
|
||||||
|
app.UseCors(builder =>
|
||||||
|
{
|
||||||
|
builder.AllowAnyOrigin()
|
||||||
|
.AllowAnyMethod()
|
||||||
|
.AllowAnyHeader();
|
||||||
|
});
|
||||||
|
|
||||||
|
app.UseAuthorization();
|
||||||
|
|
||||||
|
app.MapControllers();
|
||||||
|
|
||||||
|
app.Run();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
52
TaxCalculator.Api/Properties/launchSettings.json
Normal file
52
TaxCalculator.Api/Properties/launchSettings.json
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
{
|
||||||
|
"profiles": {
|
||||||
|
"http": {
|
||||||
|
"commandName": "Project",
|
||||||
|
"launchBrowser": true,
|
||||||
|
"launchUrl": "swagger",
|
||||||
|
"environmentVariables": {
|
||||||
|
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||||
|
},
|
||||||
|
"dotnetRunMessages": true,
|
||||||
|
"applicationUrl": "http://localhost:5020"
|
||||||
|
},
|
||||||
|
"https": {
|
||||||
|
"commandName": "Project",
|
||||||
|
"launchBrowser": true,
|
||||||
|
"launchUrl": "swagger",
|
||||||
|
"environmentVariables": {
|
||||||
|
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||||
|
},
|
||||||
|
"dotnetRunMessages": true,
|
||||||
|
"applicationUrl": "https://localhost:7122;http://localhost:5020"
|
||||||
|
},
|
||||||
|
"IIS Express": {
|
||||||
|
"commandName": "IISExpress",
|
||||||
|
"launchBrowser": true,
|
||||||
|
"launchUrl": "swagger",
|
||||||
|
"environmentVariables": {
|
||||||
|
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Docker": {
|
||||||
|
"commandName": "Docker",
|
||||||
|
"launchBrowser": true,
|
||||||
|
"launchUrl": "{Scheme}://{ServiceHost}:{ServicePort}/swagger",
|
||||||
|
"environmentVariables": {
|
||||||
|
"ASPNETCORE_HTTPS_PORTS": "8081",
|
||||||
|
"ASPNETCORE_HTTP_PORTS": "8080"
|
||||||
|
},
|
||||||
|
"publishAllPorts": true,
|
||||||
|
"useSSL": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"$schema": "http://json.schemastore.org/launchsettings.json",
|
||||||
|
"iisSettings": {
|
||||||
|
"windowsAuthentication": false,
|
||||||
|
"anonymousAuthentication": true,
|
||||||
|
"iisExpress": {
|
||||||
|
"applicationUrl": "http://localhost:55237",
|
||||||
|
"sslPort": 44352
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
9
TaxCalculator.Api/Services/ISalaryService.cs
Normal file
9
TaxCalculator.Api/Services/ISalaryService.cs
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
namespace TaxCalculator.Models
|
||||||
|
{
|
||||||
|
using Domain;
|
||||||
|
|
||||||
|
public interface ISalaryService
|
||||||
|
{
|
||||||
|
Task<SalaryDetails> CalculateSalaryDetails(int grossAnnualSalary);
|
||||||
|
}
|
||||||
|
}
|
||||||
7
TaxCalculator.Api/Services/ITaxCalculatorService.cs
Normal file
7
TaxCalculator.Api/Services/ITaxCalculatorService.cs
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
namespace TaxCalculator.Api.Services
|
||||||
|
{
|
||||||
|
public interface ITaxCalculatorService
|
||||||
|
{
|
||||||
|
Task<decimal> CalculateTax(int annualSalary);
|
||||||
|
}
|
||||||
|
}
|
||||||
41
TaxCalculator.Api/Services/SalaryService .cs
Normal file
41
TaxCalculator.Api/Services/SalaryService .cs
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
namespace TaxCalculator.Api.Services
|
||||||
|
{
|
||||||
|
using Domain;
|
||||||
|
using TaxCalculator.Models;
|
||||||
|
|
||||||
|
public class SalaryService : ISalaryService
|
||||||
|
{
|
||||||
|
private readonly ITaxCalculatorService _taxCalculator;
|
||||||
|
|
||||||
|
public SalaryService(ITaxCalculatorService taxCalculator)
|
||||||
|
{
|
||||||
|
_taxCalculator = taxCalculator ?? throw new ArgumentNullException(nameof(taxCalculator));
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<SalaryDetails> CalculateSalaryDetails(int grossAnnualSalary)
|
||||||
|
{
|
||||||
|
if (grossAnnualSalary < 0)
|
||||||
|
{
|
||||||
|
throw new ArgumentException("Gross annual salary must be non-negative.");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Calculate tax once
|
||||||
|
decimal annualTax = await _taxCalculator.CalculateTax(grossAnnualSalary);
|
||||||
|
|
||||||
|
decimal netAnnualSalary = grossAnnualSalary - annualTax;
|
||||||
|
decimal grossMonthlySalary = (decimal)grossAnnualSalary / 12;
|
||||||
|
decimal netMonthlySalary = netAnnualSalary / 12;
|
||||||
|
decimal monthlyTaxPaid = annualTax / 12;
|
||||||
|
|
||||||
|
return new SalaryDetails
|
||||||
|
{
|
||||||
|
GrossAnnualSalary = grossAnnualSalary,
|
||||||
|
GrossMonthlySalary = Math.Round(grossMonthlySalary, 2),
|
||||||
|
NetAnnualSalary = netAnnualSalary,
|
||||||
|
NetMonthlySalary = Math.Round(netMonthlySalary, 2),
|
||||||
|
AnnualTaxPaid = annualTax,
|
||||||
|
MonthlyTaxPaid = Math.Round(monthlyTaxPaid, 2)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
42
TaxCalculator.Api/Services/TaxCalculatorService.cs
Normal file
42
TaxCalculator.Api/Services/TaxCalculatorService.cs
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
namespace TaxCalculator.Api.Services
|
||||||
|
{
|
||||||
|
using DAL;
|
||||||
|
|
||||||
|
public class TaxCalculatorService : ITaxCalculatorService
|
||||||
|
{
|
||||||
|
private readonly ITaxBandRepository _taxBandRepository;
|
||||||
|
|
||||||
|
public TaxCalculatorService(ITaxBandRepository taxBandRepository)
|
||||||
|
{
|
||||||
|
_taxBandRepository = taxBandRepository ?? throw new ArgumentNullException(nameof(taxBandRepository));
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<decimal> CalculateTax(int annualSalary)
|
||||||
|
{
|
||||||
|
if (annualSalary < 0)
|
||||||
|
{
|
||||||
|
throw new ArgumentException("Gross annual salary must be non-negative.");
|
||||||
|
}
|
||||||
|
|
||||||
|
decimal taxPaid = 0;
|
||||||
|
|
||||||
|
foreach (var band in await _taxBandRepository.GetTaxBands())
|
||||||
|
{
|
||||||
|
if (annualSalary <= band.LowerLimit)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
decimal taxableAmountInBand = band.UpperLimit.HasValue
|
||||||
|
? Math.Min(annualSalary, band.UpperLimit.Value) - band.LowerLimit
|
||||||
|
: annualSalary - band.LowerLimit;
|
||||||
|
|
||||||
|
decimal taxInBand = taxableAmountInBand * (band.TaxRate / 100m);
|
||||||
|
taxPaid += taxInBand;
|
||||||
|
|
||||||
|
if (!band.UpperLimit.HasValue || annualSalary <= band.UpperLimit.Value)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return taxPaid;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
27
TaxCalculator.Api/TaxCalculator.Api.csproj
Normal file
27
TaxCalculator.Api/TaxCalculator.Api.csproj
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk.Web">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<InvariantGlobalization>true</InvariantGlobalization>
|
||||||
|
<UserSecretsId>da1c3abf-bae6-42a2-9318-1ee6c4dd7e64</UserSecretsId>
|
||||||
|
<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Microsoft.AspNetCore.Cors" Version="2.2.0" />
|
||||||
|
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.19.5" />
|
||||||
|
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.4.0" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<Folder Include="Models\" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\DAL\DAL.csproj" />
|
||||||
|
<ProjectReference Include="..\Domain\Domain.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
6
TaxCalculator.Api/TaxCalculator.Api.http
Normal file
6
TaxCalculator.Api/TaxCalculator.Api.http
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
@TaxCalculator.Api_HostAddress = http://localhost:5020
|
||||||
|
|
||||||
|
GET {{TaxCalculator.Api_HostAddress}}/weatherforecast/
|
||||||
|
Accept: application/json
|
||||||
|
|
||||||
|
###
|
||||||
8
TaxCalculator.Api/appsettings.Development.json
Normal file
8
TaxCalculator.Api/appsettings.Development.json
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"Logging": {
|
||||||
|
"LogLevel": {
|
||||||
|
"Default": "Information",
|
||||||
|
"Microsoft.AspNetCore": "Warning"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
9
TaxCalculator.Api/appsettings.json
Normal file
9
TaxCalculator.Api/appsettings.json
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"Logging": {
|
||||||
|
"LogLevel": {
|
||||||
|
"Default": "Information",
|
||||||
|
"Microsoft.AspNetCore": "Warning"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"AllowedHosts": "*"
|
||||||
|
}
|
||||||
1
TaxCalculator.UnitTests/GlobalUsings.cs
Normal file
1
TaxCalculator.UnitTests/GlobalUsings.cs
Normal file
@ -0,0 +1 @@
|
|||||||
|
global using Xunit;
|
||||||
52
TaxCalculator.UnitTests/SalaryServiceTests.cs
Normal file
52
TaxCalculator.UnitTests/SalaryServiceTests.cs
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
using Moq;
|
||||||
|
using TaxCalculator.Api.Services;
|
||||||
|
|
||||||
|
namespace TaxCalculator.UnitTests
|
||||||
|
{
|
||||||
|
public class SalaryServiceTests
|
||||||
|
{
|
||||||
|
[Theory]
|
||||||
|
[InlineData(10000, 833.33, 9000, 750, 1000.00, 83.33)]
|
||||||
|
[InlineData(40000, 3333.33, 29000, 2416.67, 11000.00, 916.67)]
|
||||||
|
public async Task CalculateSalaryDetails_ReturnsCorrectResult(
|
||||||
|
int grossAnnualSalary, decimal grossMonthlySalary, decimal netAnnualSalary, decimal netMonthlySalary,
|
||||||
|
decimal annualTaxPaid, decimal monthlyTaxPaid)
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var taxCalculatorMock = new Mock<ITaxCalculatorService>();
|
||||||
|
taxCalculatorMock.Setup(tc => tc.CalculateTax(It.IsAny<int>()))
|
||||||
|
.Returns(Task.FromResult(annualTaxPaid));
|
||||||
|
|
||||||
|
var salaryService = new SalaryService(taxCalculatorMock.Object);
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var result = await salaryService.CalculateSalaryDetails(grossAnnualSalary);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.NotNull(result);
|
||||||
|
Assert.Equal(grossAnnualSalary, result.GrossAnnualSalary);
|
||||||
|
Assert.Equal(grossMonthlySalary, result.GrossMonthlySalary);
|
||||||
|
Assert.Equal(netAnnualSalary, result.NetAnnualSalary);
|
||||||
|
Assert.Equal(netMonthlySalary, result.NetMonthlySalary);
|
||||||
|
Assert.Equal(annualTaxPaid, result.AnnualTaxPaid);
|
||||||
|
Assert.Equal(monthlyTaxPaid, result.MonthlyTaxPaid);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task CalculateSalaryDetails_ThrowsException_ForNegativeSalary()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var taxCalculatorMock = new Mock<ITaxCalculatorService>();
|
||||||
|
taxCalculatorMock.Setup(tc => tc.CalculateTax(It.IsAny<int>())).Returns(Task.FromResult((decimal)0));
|
||||||
|
|
||||||
|
var salaryService = new SalaryService(taxCalculatorMock.Object);
|
||||||
|
var negativeSalary = -5000;
|
||||||
|
|
||||||
|
// Act & Assert
|
||||||
|
var exception =
|
||||||
|
await Assert.ThrowsAsync<ArgumentException>(async () => await salaryService.CalculateSalaryDetails(negativeSalary));
|
||||||
|
|
||||||
|
Assert.Equal("Gross annual salary must be non-negative.", exception.Message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
30
TaxCalculator.UnitTests/TaxCalculator.UnitTests.csproj
Normal file
30
TaxCalculator.UnitTests/TaxCalculator.UnitTests.csproj
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
|
||||||
|
<IsPackable>false</IsPackable>
|
||||||
|
<IsTestProject>true</IsTestProject>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.6.0" />
|
||||||
|
<PackageReference Include="Moq" Version="4.20.69" />
|
||||||
|
<PackageReference Include="xunit" Version="2.4.2" />
|
||||||
|
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.5">
|
||||||
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
|
<PrivateAssets>all</PrivateAssets>
|
||||||
|
</PackageReference>
|
||||||
|
<PackageReference Include="coverlet.collector" Version="6.0.0">
|
||||||
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
|
<PrivateAssets>all</PrivateAssets>
|
||||||
|
</PackageReference>
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\TaxCalculator.Api\TaxCalculator.Api.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
46
TaxCalculator.UnitTests/TaxCalculatorServiceTests.cs
Normal file
46
TaxCalculator.UnitTests/TaxCalculatorServiceTests.cs
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
namespace TaxCalculator.UnitTests
|
||||||
|
{
|
||||||
|
using DAL;
|
||||||
|
using Domain;
|
||||||
|
using Moq;
|
||||||
|
using TaxCalculator.Api.Services;
|
||||||
|
|
||||||
|
public class TaxCalculatorServiceTests
|
||||||
|
{
|
||||||
|
[Theory]
|
||||||
|
[InlineData(5000, 0, 0)] // Example test case for Band A
|
||||||
|
[InlineData(15000, 20, 3000)] // Example test case for Band B
|
||||||
|
[InlineData(30000, 40, 12000)] // Example test case for Band C
|
||||||
|
// Add more test cases as needed
|
||||||
|
public async Task CalculateTax_ReturnsCorrectResult(
|
||||||
|
int annualSalary, int taxRate, int expectedTax)
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var taxBandRepositoryMock = new Mock<ITaxBandRepository>();
|
||||||
|
taxBandRepositoryMock.Setup(repo => repo.GetTaxBands()).Returns(Task.FromResult(new List<TaxBand>
|
||||||
|
{
|
||||||
|
new TaxBand { LowerLimit = 0, UpperLimit = null, TaxRate = taxRate }
|
||||||
|
}));
|
||||||
|
|
||||||
|
var taxCalculator = new TaxCalculatorService(taxBandRepositoryMock.Object);
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var result = await taxCalculator.CalculateTax(annualSalary);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.Equal(expectedTax, result);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task CalculateTax_ThrowsException_ForNegativeSalary()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var taxBandRepositoryMock = new Mock<ITaxBandRepository>();
|
||||||
|
var taxCalculator = new TaxCalculatorService(taxBandRepositoryMock.Object);
|
||||||
|
|
||||||
|
// Act & Assert
|
||||||
|
var exception = await Assert.ThrowsAsync<ArgumentException>(async () => await taxCalculator.CalculateTax(-5000));
|
||||||
|
Assert.Equal("Gross annual salary must be non-negative.", exception.Message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
49
TaxCalculator.sln
Normal file
49
TaxCalculator.sln
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
|
||||||
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
|
# Visual Studio Version 17
|
||||||
|
VisualStudioVersion = 17.8.34309.116
|
||||||
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TaxCalculator", "TaxCalculator\TaxCalculator.csproj", "{A2FCCADA-B92A-4F25-961C-94BC63D1E785}"
|
||||||
|
EndProject
|
||||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TaxCalculator.Api", "TaxCalculator.Api\TaxCalculator.Api.csproj", "{8EA8659C-83D8-4503-B462-29F26778473C}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TaxCalculator.UnitTests", "TaxCalculator.UnitTests\TaxCalculator.UnitTests.csproj", "{D6050FFF-3624-4CC9-9AEB-4351CEE954BE}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DAL", "DAL\DAL.csproj", "{22F41B2F-3AAA-4EF8-8173-7A46F709D65F}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Domain", "Domain\Domain.csproj", "{A3D516A9-EBA5-45DD-A672-211D100C4416}"
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
Debug|Any CPU = Debug|Any CPU
|
||||||
|
Release|Any CPU = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{A2FCCADA-B92A-4F25-961C-94BC63D1E785}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{A2FCCADA-B92A-4F25-961C-94BC63D1E785}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{A2FCCADA-B92A-4F25-961C-94BC63D1E785}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{A2FCCADA-B92A-4F25-961C-94BC63D1E785}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{8EA8659C-83D8-4503-B462-29F26778473C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{8EA8659C-83D8-4503-B462-29F26778473C}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{8EA8659C-83D8-4503-B462-29F26778473C}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{8EA8659C-83D8-4503-B462-29F26778473C}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{D6050FFF-3624-4CC9-9AEB-4351CEE954BE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{D6050FFF-3624-4CC9-9AEB-4351CEE954BE}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{D6050FFF-3624-4CC9-9AEB-4351CEE954BE}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{D6050FFF-3624-4CC9-9AEB-4351CEE954BE}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{22F41B2F-3AAA-4EF8-8173-7A46F709D65F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{22F41B2F-3AAA-4EF8-8173-7A46F709D65F}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{22F41B2F-3AAA-4EF8-8173-7A46F709D65F}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{22F41B2F-3AAA-4EF8-8173-7A46F709D65F}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{A3D516A9-EBA5-45DD-A672-211D100C4416}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{A3D516A9-EBA5-45DD-A672-211D100C4416}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{A3D516A9-EBA5-45DD-A672-211D100C4416}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{A3D516A9-EBA5-45DD-A672-211D100C4416}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
|
HideSolutionNode = FALSE
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
|
SolutionGuid = {752DFC7A-1662-4157-A280-D99C3FB9DD13}
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
||||||
34
TaxCalculator/Controllers/HomeController.cs
Normal file
34
TaxCalculator/Controllers/HomeController.cs
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using TaxCalculator.Models;
|
||||||
|
|
||||||
|
namespace TaxCalculator.Controllers
|
||||||
|
{
|
||||||
|
public class HomeController : Controller
|
||||||
|
{
|
||||||
|
private readonly ApiSettings _apiSettings;
|
||||||
|
|
||||||
|
public HomeController(ApiSettings apiSettings)
|
||||||
|
{
|
||||||
|
_apiSettings = apiSettings ?? throw new ArgumentNullException(nameof(apiSettings));
|
||||||
|
}
|
||||||
|
|
||||||
|
public IActionResult Index()
|
||||||
|
{
|
||||||
|
ViewBag.ApiUrl = _apiSettings.ApiUrl;
|
||||||
|
|
||||||
|
return View();
|
||||||
|
}
|
||||||
|
|
||||||
|
public IActionResult Privacy()
|
||||||
|
{
|
||||||
|
return View();
|
||||||
|
}
|
||||||
|
|
||||||
|
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
|
||||||
|
public IActionResult Error()
|
||||||
|
{
|
||||||
|
return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
25
TaxCalculator/Dockerfile
Normal file
25
TaxCalculator/Dockerfile
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
#See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging.
|
||||||
|
|
||||||
|
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
|
||||||
|
USER app
|
||||||
|
WORKDIR /app
|
||||||
|
EXPOSE 8080
|
||||||
|
EXPOSE 8081
|
||||||
|
|
||||||
|
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
|
||||||
|
ARG BUILD_CONFIGURATION=Release
|
||||||
|
WORKDIR /src
|
||||||
|
COPY ["TaxCalculator/TaxCalculator.csproj", "TaxCalculator/"]
|
||||||
|
RUN dotnet restore "./TaxCalculator/./TaxCalculator.csproj"
|
||||||
|
COPY . .
|
||||||
|
WORKDIR "/src/TaxCalculator"
|
||||||
|
RUN dotnet build "./TaxCalculator.csproj" -c $BUILD_CONFIGURATION -o /app/build
|
||||||
|
|
||||||
|
FROM build AS publish
|
||||||
|
ARG BUILD_CONFIGURATION=Release
|
||||||
|
RUN dotnet publish "./TaxCalculator.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false
|
||||||
|
|
||||||
|
FROM base AS final
|
||||||
|
WORKDIR /app
|
||||||
|
COPY --from=publish /app/publish .
|
||||||
|
ENTRYPOINT ["dotnet", "TaxCalculator.dll"]
|
||||||
15
TaxCalculator/Models/ApiSettings.cs
Normal file
15
TaxCalculator/Models/ApiSettings.cs
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
namespace TaxCalculator.Models
|
||||||
|
{
|
||||||
|
public class ApiSettings
|
||||||
|
{
|
||||||
|
public string ApiUrl { get; set; }
|
||||||
|
|
||||||
|
public string AppOrigin { get; set; }
|
||||||
|
|
||||||
|
public ApiSettings()
|
||||||
|
{
|
||||||
|
ApiUrl = string.Empty; // or any other default value
|
||||||
|
AppOrigin = string.Empty;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
9
TaxCalculator/Models/ErrorViewModel.cs
Normal file
9
TaxCalculator/Models/ErrorViewModel.cs
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
namespace TaxCalculator.Models
|
||||||
|
{
|
||||||
|
public class ErrorViewModel
|
||||||
|
{
|
||||||
|
public string? RequestId { get; set; }
|
||||||
|
|
||||||
|
public bool ShowRequestId => !string.IsNullOrEmpty(RequestId);
|
||||||
|
}
|
||||||
|
}
|
||||||
53
TaxCalculator/Program.cs
Normal file
53
TaxCalculator/Program.cs
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
using TaxCalculator.Models;
|
||||||
|
using TaxCalculator.Services;
|
||||||
|
|
||||||
|
namespace TaxCalculator
|
||||||
|
{
|
||||||
|
public class Program
|
||||||
|
{
|
||||||
|
public static void Main(string[] args)
|
||||||
|
{
|
||||||
|
var builder = WebApplication.CreateBuilder(args);
|
||||||
|
|
||||||
|
// Add services to the container.
|
||||||
|
builder.Services.AddControllersWithViews();
|
||||||
|
|
||||||
|
// Register SettingsService
|
||||||
|
builder.Services.AddSingleton<SettingsService>();
|
||||||
|
|
||||||
|
// Register ApiSettings using the SettingsService
|
||||||
|
builder.Services.AddSingleton(provider => provider.GetRequiredService<SettingsService>().GetApiSettings());
|
||||||
|
|
||||||
|
var app = builder.Build();
|
||||||
|
|
||||||
|
// Configure the HTTP request pipeline.
|
||||||
|
if (!app.Environment.IsDevelopment())
|
||||||
|
{
|
||||||
|
app.UseExceptionHandler("/Home/Error");
|
||||||
|
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
|
||||||
|
app.UseHsts();
|
||||||
|
}
|
||||||
|
|
||||||
|
app.UseHttpsRedirection();
|
||||||
|
app.UseStaticFiles();
|
||||||
|
|
||||||
|
app.UseRouting();
|
||||||
|
|
||||||
|
// Configure CORS with the variable
|
||||||
|
app.UseCors(builder =>
|
||||||
|
{
|
||||||
|
builder.WithOrigins("https://localhost:44301")
|
||||||
|
.AllowAnyMethod()
|
||||||
|
.AllowAnyHeader();
|
||||||
|
});
|
||||||
|
|
||||||
|
app.UseAuthorization();
|
||||||
|
|
||||||
|
app.MapControllerRoute(
|
||||||
|
name: "default",
|
||||||
|
pattern: "{controller=Home}/{action=Index}/{id?}");
|
||||||
|
|
||||||
|
app.Run();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
49
TaxCalculator/Properties/launchSettings.json
Normal file
49
TaxCalculator/Properties/launchSettings.json
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
{
|
||||||
|
"profiles": {
|
||||||
|
"http": {
|
||||||
|
"commandName": "Project",
|
||||||
|
"launchBrowser": true,
|
||||||
|
"environmentVariables": {
|
||||||
|
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||||
|
},
|
||||||
|
"dotnetRunMessages": true,
|
||||||
|
"applicationUrl": "http://localhost:5071"
|
||||||
|
},
|
||||||
|
"https": {
|
||||||
|
"commandName": "Project",
|
||||||
|
"launchBrowser": true,
|
||||||
|
"environmentVariables": {
|
||||||
|
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||||
|
},
|
||||||
|
"dotnetRunMessages": true,
|
||||||
|
"applicationUrl": "https://localhost:7150;http://localhost:5071"
|
||||||
|
},
|
||||||
|
"IIS Express": {
|
||||||
|
"commandName": "IISExpress",
|
||||||
|
"launchBrowser": true,
|
||||||
|
"environmentVariables": {
|
||||||
|
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Docker": {
|
||||||
|
"commandName": "Docker",
|
||||||
|
"launchBrowser": true,
|
||||||
|
"launchUrl": "{Scheme}://{ServiceHost}:{ServicePort}",
|
||||||
|
"environmentVariables": {
|
||||||
|
"ASPNETCORE_HTTPS_PORTS": "8081",
|
||||||
|
"ASPNETCORE_HTTP_PORTS": "8080"
|
||||||
|
},
|
||||||
|
"publishAllPorts": true,
|
||||||
|
"useSSL": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"$schema": "http://json.schemastore.org/launchsettings.json",
|
||||||
|
"iisSettings": {
|
||||||
|
"windowsAuthentication": false,
|
||||||
|
"anonymousAuthentication": true,
|
||||||
|
"iisExpress": {
|
||||||
|
"applicationUrl": "http://localhost:5278",
|
||||||
|
"sslPort": 44301
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
33
TaxCalculator/Services/SettingsService.cs
Normal file
33
TaxCalculator/Services/SettingsService.cs
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
using TaxCalculator.Models;
|
||||||
|
|
||||||
|
namespace TaxCalculator.Services
|
||||||
|
{
|
||||||
|
public class SettingsService
|
||||||
|
{
|
||||||
|
private readonly IConfiguration _configuration;
|
||||||
|
|
||||||
|
public SettingsService(IConfiguration configuration)
|
||||||
|
{
|
||||||
|
_configuration = configuration ?? throw new ArgumentNullException(nameof(configuration));
|
||||||
|
}
|
||||||
|
|
||||||
|
public ApiSettings GetApiSettings()
|
||||||
|
{
|
||||||
|
var result = new ApiSettings();
|
||||||
|
|
||||||
|
var section = _configuration.GetSection("ApiSettings");
|
||||||
|
string? apiUrl = section["ApiUrl"];
|
||||||
|
if (apiUrl != null)
|
||||||
|
{
|
||||||
|
result.ApiUrl = apiUrl;
|
||||||
|
}
|
||||||
|
string? appOrigin = section["AppOrigin"];
|
||||||
|
if(appOrigin != null)
|
||||||
|
{
|
||||||
|
result.AppOrigin = appOrigin;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
16
TaxCalculator/TaxCalculator.csproj
Normal file
16
TaxCalculator/TaxCalculator.csproj
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk.Web">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<UserSecretsId>f1d75944-cb93-4b20-8512-2a271a1e6524</UserSecretsId>
|
||||||
|
<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="jQuery" Version="3.7.1" />
|
||||||
|
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.19.5" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
97
TaxCalculator/Views/Home/Index.cshtml
Normal file
97
TaxCalculator/Views/Home/Index.cshtml
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
@{
|
||||||
|
ViewData["Title"] = "Home Page";
|
||||||
|
}
|
||||||
|
|
||||||
|
<div class="text-center">
|
||||||
|
<h1 class="display-4">Income Tax Calculator</h1>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<label for="grossAnnualSalary">Gross Annual Salary:</label>
|
||||||
|
<input type="text" id="grossAnnualSalary" pattern="^[1-9]\d*$" title="Please enter a positive integer value" max="2147483647" />
|
||||||
|
<button id="calculateButton">Calculate</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="resultsSection" class="container mt-4" style="display:none; border: 1px solid #ddd; padding: 15px; text-align: center;">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6 mx-auto">
|
||||||
|
<label for="calculatedGrossAnnualSalary">Gross Annual Salary:</label>
|
||||||
|
<span id="calculatedGrossAnnualSalary" class="ml-2"></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6 mx-auto">
|
||||||
|
<label for="calculatedGrossMonthlySalary">Gross Monthly Salary:</label>
|
||||||
|
<span id="calculatedGrossMonthlySalary" class="ml-2"></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6 mx-auto">
|
||||||
|
<label for="calculatedNetAnnualSalary">Net Annual Salary:</label>
|
||||||
|
<span id="calculatedNetAnnualSalary" class="ml-2"></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6 mx-auto">
|
||||||
|
<label for="calculatedNetMonthlySalary">Net Monthly Salary:</label>
|
||||||
|
<span id="calculatedNetMonthlySalary" class="ml-2"></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6 mx-auto">
|
||||||
|
<label for="calculatedAnnualTaxPaid">Annual Tax Paid:</label>
|
||||||
|
<span id="calculatedAnnualTaxPaid" class="ml-2"></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6 mx-auto">
|
||||||
|
<label for="calculatedMonthlyTaxPaid">Monthly Tax Paid:</label>
|
||||||
|
<span id="calculatedMonthlyTaxPaid" class="ml-2"></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
@section Scripts {
|
||||||
|
<script>
|
||||||
|
$(document).ready(function () {
|
||||||
|
$('#calculateButton').click(function () {
|
||||||
|
var apiUrl = '@ViewBag.ApiUrl';
|
||||||
|
|
||||||
|
toastr["info"]("Wait a second...", "Income Tax Calclator");
|
||||||
|
|
||||||
|
var grossAnnualSalary = $('#grossAnnualSalary').val();
|
||||||
|
|
||||||
|
// Make the AJAX request to the Web API
|
||||||
|
$.ajax({
|
||||||
|
url: apiUrl + '/api/salary',
|
||||||
|
type: 'POST',
|
||||||
|
contentType: 'application/json',
|
||||||
|
data: grossAnnualSalary,
|
||||||
|
success: function (result) {
|
||||||
|
// Update the UI with the calculated results
|
||||||
|
$('#calculatedGrossAnnualSalary').text(result.grossAnnualSalary);
|
||||||
|
$('#calculatedGrossMonthlySalary').text(result.grossMonthlySalary);
|
||||||
|
$('#calculatedNetAnnualSalary').text(result.netAnnualSalary);
|
||||||
|
$('#calculatedNetMonthlySalary').text(result.netMonthlySalary);
|
||||||
|
$('#calculatedAnnualTaxPaid').text(result.annualTaxPaid);
|
||||||
|
$('#calculatedMonthlyTaxPaid').text(result.monthlyTaxPaid);
|
||||||
|
|
||||||
|
// Show the results section
|
||||||
|
$('#resultsSection').show();
|
||||||
|
},
|
||||||
|
error: function () {
|
||||||
|
// Handle error
|
||||||
|
toastr["error"]("An error appears during tax calculating!", "Income Tax Calclator")
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
}
|
||||||
6
TaxCalculator/Views/Home/Privacy.cshtml
Normal file
6
TaxCalculator/Views/Home/Privacy.cshtml
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
@{
|
||||||
|
ViewData["Title"] = "Privacy Policy";
|
||||||
|
}
|
||||||
|
<h1>@ViewData["Title"]</h1>
|
||||||
|
|
||||||
|
<p>Use this page to detail your site's privacy policy.</p>
|
||||||
25
TaxCalculator/Views/Shared/Error.cshtml
Normal file
25
TaxCalculator/Views/Shared/Error.cshtml
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
@model ErrorViewModel
|
||||||
|
@{
|
||||||
|
ViewData["Title"] = "Error";
|
||||||
|
}
|
||||||
|
|
||||||
|
<h1 class="text-danger">Error.</h1>
|
||||||
|
<h2 class="text-danger">An error occurred while processing your request.</h2>
|
||||||
|
|
||||||
|
@if (Model.ShowRequestId)
|
||||||
|
{
|
||||||
|
<p>
|
||||||
|
<strong>Request ID:</strong> <code>@Model.RequestId</code>
|
||||||
|
</p>
|
||||||
|
}
|
||||||
|
|
||||||
|
<h3>Development Mode</h3>
|
||||||
|
<p>
|
||||||
|
Swapping to <strong>Development</strong> environment will display more detailed information about the error that occurred.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<strong>The Development environment shouldn't be enabled for deployed applications.</strong>
|
||||||
|
It can result in displaying sensitive information from exceptions to end users.
|
||||||
|
For local debugging, enable the <strong>Development</strong> environment by setting the <strong>ASPNETCORE_ENVIRONMENT</strong> environment variable to <strong>Development</strong>
|
||||||
|
and restarting the app.
|
||||||
|
</p>
|
||||||
51
TaxCalculator/Views/Shared/_Layout.cshtml
Normal file
51
TaxCalculator/Views/Shared/_Layout.cshtml
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
|
<title>@ViewData["Title"] - Income Tax Calculator</title>
|
||||||
|
<link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.min.css" />
|
||||||
|
<link rel="stylesheet" href="~/lib/toastr/build/toastr.css" />
|
||||||
|
<link rel="stylesheet" href="~/css/site.css" asp-append-version="true" />
|
||||||
|
<link rel="stylesheet" href="~/TaxCalculator.styles.css" asp-append-version="true" />
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<header>
|
||||||
|
<nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
|
||||||
|
<div class="container-fluid">
|
||||||
|
<a class="navbar-brand" asp-area="" asp-controller="Home" asp-action="Index">TaxCalculator</a>
|
||||||
|
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target=".navbar-collapse" aria-controls="navbarSupportedContent"
|
||||||
|
aria-expanded="false" aria-label="Toggle navigation">
|
||||||
|
<span class="navbar-toggler-icon"></span>
|
||||||
|
</button>
|
||||||
|
<div class="navbar-collapse collapse d-sm-inline-flex justify-content-between">
|
||||||
|
<ul class="navbar-nav flex-grow-1">
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Index">Home</a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Privacy">Privacy</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
</header>
|
||||||
|
<div class="container">
|
||||||
|
<main role="main" class="pb-3">
|
||||||
|
@RenderBody()
|
||||||
|
</main>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<footer class="border-top footer text-muted">
|
||||||
|
<div class="container">
|
||||||
|
© 2023 - Income Tax Calculator - <a asp-area="" asp-controller="Home" asp-action="Privacy">Privacy</a>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
<script src="~/lib/jquery/dist/jquery.min.js"></script>
|
||||||
|
<script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
|
||||||
|
<script src="~/lib/toastr/build/toastr.min.js"></script>
|
||||||
|
<script src="~/js/site.js" asp-append-version="true"></script>
|
||||||
|
@await RenderSectionAsync("Scripts", required: false)
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
48
TaxCalculator/Views/Shared/_Layout.cshtml.css
Normal file
48
TaxCalculator/Views/Shared/_Layout.cshtml.css
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
/* Please see documentation at https://learn.microsoft.com/aspnet/core/client-side/bundling-and-minification
|
||||||
|
for details on configuring this project to bundle and minify static web assets. */
|
||||||
|
|
||||||
|
a.navbar-brand {
|
||||||
|
white-space: normal;
|
||||||
|
text-align: center;
|
||||||
|
word-break: break-all;
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: #0077cc;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-primary {
|
||||||
|
color: #fff;
|
||||||
|
background-color: #1b6ec2;
|
||||||
|
border-color: #1861ac;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-pills .nav-link.active, .nav-pills .show > .nav-link {
|
||||||
|
color: #fff;
|
||||||
|
background-color: #1b6ec2;
|
||||||
|
border-color: #1861ac;
|
||||||
|
}
|
||||||
|
|
||||||
|
.border-top {
|
||||||
|
border-top: 1px solid #e5e5e5;
|
||||||
|
}
|
||||||
|
.border-bottom {
|
||||||
|
border-bottom: 1px solid #e5e5e5;
|
||||||
|
}
|
||||||
|
|
||||||
|
.box-shadow {
|
||||||
|
box-shadow: 0 .25rem .75rem rgba(0, 0, 0, .05);
|
||||||
|
}
|
||||||
|
|
||||||
|
button.accept-policy {
|
||||||
|
font-size: 1rem;
|
||||||
|
line-height: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer {
|
||||||
|
position: absolute;
|
||||||
|
bottom: 0;
|
||||||
|
width: 100%;
|
||||||
|
white-space: nowrap;
|
||||||
|
line-height: 60px;
|
||||||
|
}
|
||||||
@ -0,0 +1,2 @@
|
|||||||
|
<script src="~/lib/jquery-validation/dist/jquery.validate.min.js"></script>
|
||||||
|
<script src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js"></script>
|
||||||
3
TaxCalculator/Views/_ViewImports.cshtml
Normal file
3
TaxCalculator/Views/_ViewImports.cshtml
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
@using TaxCalculator
|
||||||
|
@using TaxCalculator.Models
|
||||||
|
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
3
TaxCalculator/Views/_ViewStart.cshtml
Normal file
3
TaxCalculator/Views/_ViewStart.cshtml
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
@{
|
||||||
|
Layout = "_Layout";
|
||||||
|
}
|
||||||
8
TaxCalculator/appsettings.Development.json
Normal file
8
TaxCalculator/appsettings.Development.json
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"Logging": {
|
||||||
|
"LogLevel": {
|
||||||
|
"Default": "Information",
|
||||||
|
"Microsoft.AspNetCore": "Warning"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
13
TaxCalculator/appsettings.json
Normal file
13
TaxCalculator/appsettings.json
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"Logging": {
|
||||||
|
"LogLevel": {
|
||||||
|
"Default": "Information",
|
||||||
|
"Microsoft.AspNetCore": "Warning"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"AllowedHosts": "*",
|
||||||
|
"ApiSettings": {
|
||||||
|
"ApiUrl": "https://localhost:44352",
|
||||||
|
"AppOrigin": "https://localhost:44301"
|
||||||
|
}
|
||||||
|
}
|
||||||
25
TaxCalculator/bower_components/jquery/.bower.json
vendored
Normal file
25
TaxCalculator/bower_components/jquery/.bower.json
vendored
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
{
|
||||||
|
"name": "jquery",
|
||||||
|
"main": "dist/jquery.js",
|
||||||
|
"license": "MIT",
|
||||||
|
"ignore": [
|
||||||
|
"package.json"
|
||||||
|
],
|
||||||
|
"keywords": [
|
||||||
|
"jquery",
|
||||||
|
"javascript",
|
||||||
|
"browser",
|
||||||
|
"library"
|
||||||
|
],
|
||||||
|
"homepage": "https://github.com/jquery/jquery-dist",
|
||||||
|
"version": "2.2.4",
|
||||||
|
"_release": "2.2.4",
|
||||||
|
"_resolution": {
|
||||||
|
"type": "version",
|
||||||
|
"tag": "2.2.4",
|
||||||
|
"commit": "c0185ab7c75aab88762c5aae780b9d83b80eda72"
|
||||||
|
},
|
||||||
|
"_source": "https://github.com/jquery/jquery-dist.git",
|
||||||
|
"_target": ">=1.6.3 <3",
|
||||||
|
"_originalSource": "jquery"
|
||||||
|
}
|
||||||
278
TaxCalculator/bower_components/jquery/AUTHORS.txt
vendored
Normal file
278
TaxCalculator/bower_components/jquery/AUTHORS.txt
vendored
Normal file
@ -0,0 +1,278 @@
|
|||||||
|
Authors ordered by first contribution.
|
||||||
|
|
||||||
|
John Resig <jeresig@gmail.com>
|
||||||
|
Gilles van den Hoven <gilles0181@gmail.com>
|
||||||
|
Michael Geary <mike@geary.com>
|
||||||
|
Stefan Petre <stefan.petre@gmail.com>
|
||||||
|
Yehuda Katz <wycats@gmail.com>
|
||||||
|
Corey Jewett <cj@syntheticplayground.com>
|
||||||
|
Klaus Hartl <klaus.hartl@gmail.com>
|
||||||
|
Franck Marcia <franck.marcia@gmail.com>
|
||||||
|
Jörn Zaefferer <joern.zaefferer@gmail.com>
|
||||||
|
Paul Bakaus <paul.bakaus@gmail.com>
|
||||||
|
Brandon Aaron <brandon.aaron@gmail.com>
|
||||||
|
Mike Alsup <malsup@gmail.com>
|
||||||
|
Dave Methvin <dave.methvin@gmail.com>
|
||||||
|
Ed Engelhardt <edengelhardt@gmail.com>
|
||||||
|
Sean Catchpole <littlecooldude@gmail.com>
|
||||||
|
Paul Mclanahan <pmclanahan@gmail.com>
|
||||||
|
David Serduke <davidserduke@gmail.com>
|
||||||
|
Richard D. Worth <rdworth@gmail.com>
|
||||||
|
Scott González <scott.gonzalez@gmail.com>
|
||||||
|
Ariel Flesler <aflesler@gmail.com>
|
||||||
|
Jon Evans <jon@springyweb.com>
|
||||||
|
TJ Holowaychuk <tj@vision-media.ca>
|
||||||
|
Michael Bensoussan <mickey@seesmic.com>
|
||||||
|
Robert Katić <robert.katic@gmail.com>
|
||||||
|
Louis-Rémi Babé <lrbabe@gmail.com>
|
||||||
|
Earle Castledine <mrspeaker@gmail.com>
|
||||||
|
Damian Janowski <damian.janowski@gmail.com>
|
||||||
|
Rich Dougherty <rich@rd.gen.nz>
|
||||||
|
Kim Dalsgaard <kim@kimdalsgaard.com>
|
||||||
|
Andrea Giammarchi <andrea.giammarchi@gmail.com>
|
||||||
|
Mark Gibson <jollytoad@gmail.com>
|
||||||
|
Karl Swedberg <kswedberg@gmail.com>
|
||||||
|
Justin Meyer <justinbmeyer@gmail.com>
|
||||||
|
Ben Alman <cowboy@rj3.net>
|
||||||
|
James Padolsey <cla@padolsey.net>
|
||||||
|
David Petersen <public@petersendidit.com>
|
||||||
|
Batiste Bieler <batiste.bieler@gmail.com>
|
||||||
|
Alexander Farkas <info@corrupt-system.de>
|
||||||
|
Rick Waldron <waldron.rick@gmail.com>
|
||||||
|
Filipe Fortes <filipe@fortes.com>
|
||||||
|
Neeraj Singh <neerajdotname@gmail.com>
|
||||||
|
Paul Irish <paul.irish@gmail.com>
|
||||||
|
Iraê Carvalho <irae@irae.pro.br>
|
||||||
|
Matt Curry <matt@pseudocoder.com>
|
||||||
|
Michael Monteleone <michael@michaelmonteleone.net>
|
||||||
|
Noah Sloan <noah.sloan@gmail.com>
|
||||||
|
Tom Viner <github@viner.tv>
|
||||||
|
Douglas Neiner <doug@dougneiner.com>
|
||||||
|
Adam J. Sontag <ajpiano@ajpiano.com>
|
||||||
|
Dave Reed <dareed@microsoft.com>
|
||||||
|
Ralph Whitbeck <ralph.whitbeck@gmail.com>
|
||||||
|
Carl Fürstenberg <azatoth@gmail.com>
|
||||||
|
Jacob Wright <jacwright@gmail.com>
|
||||||
|
J. Ryan Stinnett <jryans@gmail.com>
|
||||||
|
unknown <Igen005@.upcorp.ad.uprr.com>
|
||||||
|
temp01 <temp01irc@gmail.com>
|
||||||
|
Heungsub Lee <h@subl.ee>
|
||||||
|
Colin Snover <github.com@zetafleet.com>
|
||||||
|
Ryan W Tenney <ryan@10e.us>
|
||||||
|
Pinhook <contact@pinhooklabs.com>
|
||||||
|
Ron Otten <r.j.g.otten@gmail.com>
|
||||||
|
Jephte Clain <Jephte.Clain@univ-reunion.fr>
|
||||||
|
Anton Matzneller <obhvsbypqghgc@gmail.com>
|
||||||
|
Alex Sexton <AlexSexton@gmail.com>
|
||||||
|
Dan Heberden <danheberden@gmail.com>
|
||||||
|
Henri Wiechers <hwiechers@gmail.com>
|
||||||
|
Russell Holbrook <russell.holbrook@patch.com>
|
||||||
|
Julian Aubourg <aubourg.julian@gmail.com>
|
||||||
|
Gianni Alessandro Chiappetta <gianni@runlevel6.org>
|
||||||
|
Scott Jehl <scottjehl@gmail.com>
|
||||||
|
James Burke <jrburke@gmail.com>
|
||||||
|
Jonas Pfenniger <jonas@pfenniger.name>
|
||||||
|
Xavi Ramirez <xavi.rmz@gmail.com>
|
||||||
|
Jared Grippe <jared@deadlyicon.com>
|
||||||
|
Sylvester Keil <sylvester@keil.or.at>
|
||||||
|
Brandon Sterne <bsterne@mozilla.com>
|
||||||
|
Mathias Bynens <mathias@qiwi.be>
|
||||||
|
Timmy Willison <timmywillisn@gmail.com>
|
||||||
|
Corey Frang <gnarf37@gmail.com>
|
||||||
|
Digitalxero <digitalxero>
|
||||||
|
Anton Kovalyov <anton@kovalyov.net>
|
||||||
|
David Murdoch <david@davidmurdoch.com>
|
||||||
|
Josh Varner <josh.varner@gmail.com>
|
||||||
|
Charles McNulty <cmcnulty@kznf.com>
|
||||||
|
Jordan Boesch <jboesch26@gmail.com>
|
||||||
|
Jess Thrysoee <jess@thrysoee.dk>
|
||||||
|
Michael Murray <m@murz.net>
|
||||||
|
Lee Carpenter <elcarpie@gmail.com>
|
||||||
|
Alexis Abril <me@alexisabril.com>
|
||||||
|
Rob Morgan <robbym@gmail.com>
|
||||||
|
John Firebaugh <john_firebaugh@bigfix.com>
|
||||||
|
Sam Bisbee <sam@sbisbee.com>
|
||||||
|
Gilmore Davidson <gilmoreorless@gmail.com>
|
||||||
|
Brian Brennan <me@brianlovesthings.com>
|
||||||
|
Xavier Montillet <xavierm02.net@gmail.com>
|
||||||
|
Daniel Pihlstrom <sciolist.se@gmail.com>
|
||||||
|
Sahab Yazdani <sahab.yazdani+github@gmail.com>
|
||||||
|
avaly <github-com@agachi.name>
|
||||||
|
Scott Hughes <hi@scott-hughes.me>
|
||||||
|
Mike Sherov <mike.sherov@gmail.com>
|
||||||
|
Greg Hazel <ghazel@gmail.com>
|
||||||
|
Schalk Neethling <schalk@ossreleasefeed.com>
|
||||||
|
Denis Knauf <Denis.Knauf@gmail.com>
|
||||||
|
Timo Tijhof <krinklemail@gmail.com>
|
||||||
|
Steen Nielsen <swinedk@gmail.com>
|
||||||
|
Anton Ryzhov <anton@ryzhov.me>
|
||||||
|
Shi Chuan <shichuanr@gmail.com>
|
||||||
|
Berker Peksag <berker.peksag@gmail.com>
|
||||||
|
Toby Brain <tobyb@freshview.com>
|
||||||
|
Matt Mueller <mattmuelle@gmail.com>
|
||||||
|
Justin <drakefjustin@gmail.com>
|
||||||
|
Daniel Herman <daniel.c.herman@gmail.com>
|
||||||
|
Oleg Gaidarenko <markelog@gmail.com>
|
||||||
|
Richard Gibson <richard.gibson@gmail.com>
|
||||||
|
Rafaël Blais Masson <rafbmasson@gmail.com>
|
||||||
|
cmc3cn <59194618@qq.com>
|
||||||
|
Joe Presbrey <presbrey@gmail.com>
|
||||||
|
Sindre Sorhus <sindresorhus@gmail.com>
|
||||||
|
Arne de Bree <arne@bukkie.nl>
|
||||||
|
Vladislav Zarakovsky <vlad.zar@gmail.com>
|
||||||
|
Andrew E Monat <amonat@gmail.com>
|
||||||
|
Oskari <admin@o-programs.com>
|
||||||
|
Joao Henrique de Andrade Bruni <joaohbruni@yahoo.com.br>
|
||||||
|
tsinha <tsinha@Anthonys-MacBook-Pro.local>
|
||||||
|
Matt Farmer <matt@frmr.me>
|
||||||
|
Trey Hunner <treyhunner@gmail.com>
|
||||||
|
Jason Moon <jmoon@socialcast.com>
|
||||||
|
Jeffery To <jeffery.to@gmail.com>
|
||||||
|
Kris Borchers <kris.borchers@gmail.com>
|
||||||
|
Vladimir Zhuravlev <private.face@gmail.com>
|
||||||
|
Jacob Thornton <jacobthornton@gmail.com>
|
||||||
|
Chad Killingsworth <chadkillingsworth@missouristate.edu>
|
||||||
|
Nowres Rafid <nowres.rafed@gmail.com>
|
||||||
|
David Benjamin <davidben@mit.edu>
|
||||||
|
Uri Gilad <antishok@gmail.com>
|
||||||
|
Chris Faulkner <thefaulkner@gmail.com>
|
||||||
|
Elijah Manor <elijah.manor@gmail.com>
|
||||||
|
Daniel Chatfield <chatfielddaniel@gmail.com>
|
||||||
|
Nikita Govorov <nikita.govorov@gmail.com>
|
||||||
|
Wesley Walser <waw325@gmail.com>
|
||||||
|
Mike Pennisi <mike@mikepennisi.com>
|
||||||
|
Markus Staab <markus.staab@redaxo.de>
|
||||||
|
Dave Riddle <david@joyvuu.com>
|
||||||
|
Callum Macrae <callum@lynxphp.com>
|
||||||
|
Benjamin Truyman <bentruyman@gmail.com>
|
||||||
|
James Huston <james@jameshuston.net>
|
||||||
|
Erick Ruiz de Chávez <erickrdch@gmail.com>
|
||||||
|
David Bonner <dbonner@cogolabs.com>
|
||||||
|
Akintayo Akinwunmi <aakinwunmi@judge.com>
|
||||||
|
MORGAN <morgan@morgangraphics.com>
|
||||||
|
Ismail Khair <ismail.khair@gmail.com>
|
||||||
|
Carl Danley <carldanley@gmail.com>
|
||||||
|
Mike Petrovich <michael.c.petrovich@gmail.com>
|
||||||
|
Greg Lavallee <greglavallee@wapolabs.com>
|
||||||
|
Daniel Gálvez <dgalvez@editablething.com>
|
||||||
|
Sai Lung Wong <sai.wong@huffingtonpost.com>
|
||||||
|
Tom H Fuertes <TomFuertes@gmail.com>
|
||||||
|
Roland Eckl <eckl.roland@googlemail.com>
|
||||||
|
Jay Merrifield <fracmak@gmail.com>
|
||||||
|
Allen J Schmidt Jr <cobrasoft@gmail.com>
|
||||||
|
Jonathan Sampson <jjdsampson@gmail.com>
|
||||||
|
Marcel Greter <marcel.greter@ocbnet.ch>
|
||||||
|
Matthias Jäggli <matthias.jaeggli@gmail.com>
|
||||||
|
David Fox <dfoxinator@gmail.com>
|
||||||
|
Yiming He <yiminghe@gmail.com>
|
||||||
|
Devin Cooper <cooper.semantics@gmail.com>
|
||||||
|
Paul Ramos <paul.b.ramos@gmail.com>
|
||||||
|
Rod Vagg <rod@vagg.org>
|
||||||
|
Bennett Sorbo <bsorbo@gmail.com>
|
||||||
|
Sebastian Burkhard <sebi.burkhard@gmail.com>
|
||||||
|
Zachary Adam Kaplan <razic@viralkitty.com>
|
||||||
|
nanto_vi <nanto@moon.email.ne.jp>
|
||||||
|
nanto <nanto@moon.email.ne.jp>
|
||||||
|
Danil Somsikov <danilasomsikov@gmail.com>
|
||||||
|
Ryunosuke SATO <tricknotes.rs@gmail.com>
|
||||||
|
Jean Boussier <jean.boussier@gmail.com>
|
||||||
|
Adam Coulombe <me@adam.co>
|
||||||
|
Andrew Plummer <plummer.andrew@gmail.com>
|
||||||
|
Mark Raddatz <mraddatz@gmail.com>
|
||||||
|
Isaac Z. Schlueter <i@izs.me>
|
||||||
|
Karl Sieburg <ksieburg@yahoo.com>
|
||||||
|
Pascal Borreli <pascal@borreli.com>
|
||||||
|
Nguyen Phuc Lam <ruado1987@gmail.com>
|
||||||
|
Dmitry Gusev <dmitry.gusev@gmail.com>
|
||||||
|
Michał Gołębiowski <m.goleb@gmail.com>
|
||||||
|
Li Xudong <istonelee@gmail.com>
|
||||||
|
Steven Benner <admin@stevenbenner.com>
|
||||||
|
Tom H Fuertes <tomfuertes@gmail.com>
|
||||||
|
Renato Oliveira dos Santos <ros3@cin.ufpe.br>
|
||||||
|
ros3cin <ros3@cin.ufpe.br>
|
||||||
|
Jason Bedard <jason+jquery@jbedard.ca>
|
||||||
|
Kyle Robinson Young <kyle@dontkry.com>
|
||||||
|
Chris Talkington <chris@talkingtontech.com>
|
||||||
|
Eddie Monge <eddie@eddiemonge.com>
|
||||||
|
Terry Jones <terry@jon.es>
|
||||||
|
Jason Merino <jasonmerino@gmail.com>
|
||||||
|
Jeremy Dunck <jdunck@gmail.com>
|
||||||
|
Chris Price <price.c@gmail.com>
|
||||||
|
Guy Bedford <guybedford@gmail.com>
|
||||||
|
Amey Sakhadeo <me@ameyms.com>
|
||||||
|
Mike Sidorov <mikes.ekb@gmail.com>
|
||||||
|
Anthony Ryan <anthonyryan1@gmail.com>
|
||||||
|
Dominik D. Geyer <dominik.geyer@gmail.com>
|
||||||
|
George Kats <katsgeorgeek@gmail.com>
|
||||||
|
Lihan Li <frankieteardrop@gmail.com>
|
||||||
|
Ronny Springer <springer.ronny@gmail.com>
|
||||||
|
Chris Antaki <ChrisAntaki@gmail.com>
|
||||||
|
Marian Sollmann <marian.sollmann@cargomedia.ch>
|
||||||
|
njhamann <njhamann@gmail.com>
|
||||||
|
Ilya Kantor <iliakan@gmail.com>
|
||||||
|
David Hong <d.hong@me.com>
|
||||||
|
John Paul <john@johnkpaul.com>
|
||||||
|
Jakob Stoeck <jakob@pokermania.de>
|
||||||
|
Christopher Jones <chris@cjqed.com>
|
||||||
|
Forbes Lindesay <forbes@lindesay.co.uk>
|
||||||
|
S. Andrew Sheppard <andrew@wq.io>
|
||||||
|
Leonardo Balter <leonardo.balter@gmail.com>
|
||||||
|
Roman Reiß <me@silverwind.io>
|
||||||
|
Benjy Cui <benjytrys@gmail.com>
|
||||||
|
Rodrigo Rosenfeld Rosas <rr.rosas@gmail.com>
|
||||||
|
John Hoven <hovenj@gmail.com>
|
||||||
|
Philip Jägenstedt <philip@foolip.org>
|
||||||
|
Christian Kosmowski <ksmwsk@gmail.com>
|
||||||
|
Liang Peng <poppinlp@gmail.com>
|
||||||
|
TJ VanToll <tj.vantoll@gmail.com>
|
||||||
|
Senya Pugach <upisfree@outlook.com>
|
||||||
|
Aurelio De Rosa <aurelioderosa@gmail.com>
|
||||||
|
Nazar Mokrynskyi <nazar@mokrynskyi.com>
|
||||||
|
Amit Merchant <bullredeyes@gmail.com>
|
||||||
|
Jason Bedard <jason+github@jbedard.ca>
|
||||||
|
Arthur Verschaeve <contact@arthurverschaeve.be>
|
||||||
|
Dan Hart <danhart@notonthehighstreet.com>
|
||||||
|
Bin Xin <rhyzix@gmail.com>
|
||||||
|
David Corbacho <davidcorbacho@gmail.com>
|
||||||
|
Veaceslav Grimalschi <grimalschi@yandex.ru>
|
||||||
|
Daniel Husar <dano.husar@gmail.com>
|
||||||
|
Frederic Hemberger <mail@frederic-hemberger.de>
|
||||||
|
Ben Toews <mastahyeti@gmail.com>
|
||||||
|
Aditya Raghavan <araghavan3@gmail.com>
|
||||||
|
Victor Homyakov <vkhomyackov@gmail.com>
|
||||||
|
Shivaji Varma <contact@shivajivarma.com>
|
||||||
|
Nicolas HENRY <icewil@gmail.com>
|
||||||
|
Anne-Gaelle Colom <coloma@westminster.ac.uk>
|
||||||
|
George Mauer <gmauer@gmail.com>
|
||||||
|
Leonardo Braga <leonardo.braga@gmail.com>
|
||||||
|
Stephen Edgar <stephen@netweb.com.au>
|
||||||
|
Thomas Tortorini <thomastortorini@gmail.com>
|
||||||
|
Winston Howes <winstonhowes@gmail.com>
|
||||||
|
Jon Hester <jon.d.hester@gmail.com>
|
||||||
|
Alexander O'Mara <me@alexomara.com>
|
||||||
|
Bastian Buchholz <buchholz.bastian@googlemail.com>
|
||||||
|
Arthur Stolyar <nekr.fabula@gmail.com>
|
||||||
|
Calvin Metcalf <calvin.metcalf@gmail.com>
|
||||||
|
Mu Haibao <mhbseal@163.com>
|
||||||
|
Richard McDaniel <rm0026@uah.edu>
|
||||||
|
Chris Rebert <github@rebertia.com>
|
||||||
|
Gabriel Schulhof <gabriel.schulhof@intel.com>
|
||||||
|
Gilad Peleg <giladp007@gmail.com>
|
||||||
|
Martin Naumann <martin@geekonaut.de>
|
||||||
|
Marek Lewandowski <m.lewandowski@cksource.com>
|
||||||
|
Bruno Pérel <brunoperel@gmail.com>
|
||||||
|
Reed Loden <reed@reedloden.com>
|
||||||
|
Daniel Nill <daniellnill@gmail.com>
|
||||||
|
Yongwoo Jeon <yongwoo.jeon@navercorp.com>
|
||||||
|
Sean Henderson <seanh.za@gmail.com>
|
||||||
|
Richard Kraaijenhagen <stdin+git@riichard.com>
|
||||||
|
Connor Atherton <c.liam.atherton@gmail.com>
|
||||||
|
Gary Ye <garysye@gmail.com>
|
||||||
|
Christian Grete <webmaster@christiangrete.com>
|
||||||
|
Liza Ramo <liza.h.ramo@gmail.com>
|
||||||
|
Julian Alexander Murillo <julian.alexander.murillo@gmail.com>
|
||||||
|
Joelle Fleurantin <joasqueeniebee@gmail.com>
|
||||||
|
Jun Sun <klsforever@gmail.com>
|
||||||
|
Devin Wilson <dwilson6.github@gmail.com>
|
||||||
|
Todor Prikumov <tono_pr@abv.bg>
|
||||||
|
Zack Hall <zackhall@outlook.com>
|
||||||
36
TaxCalculator/bower_components/jquery/LICENSE.txt
vendored
Normal file
36
TaxCalculator/bower_components/jquery/LICENSE.txt
vendored
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
Copyright jQuery Foundation and other contributors, https://jquery.org/
|
||||||
|
|
||||||
|
This software consists of voluntary contributions made by many
|
||||||
|
individuals. For exact contribution history, see the revision history
|
||||||
|
available at https://github.com/jquery/jquery
|
||||||
|
|
||||||
|
The following license applies to all parts of this software except as
|
||||||
|
documented below:
|
||||||
|
|
||||||
|
====
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of this software and associated documentation files (the
|
||||||
|
"Software"), to deal in the Software without restriction, including
|
||||||
|
without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be
|
||||||
|
included in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||||
|
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||||
|
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
|
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
|
====
|
||||||
|
|
||||||
|
All files located in the node_modules and external directories are
|
||||||
|
externally maintained libraries used by this software which have their
|
||||||
|
own licenses; we recommend you read them, as their terms may differ from
|
||||||
|
the terms above.
|
||||||
65
TaxCalculator/bower_components/jquery/README.md
vendored
Normal file
65
TaxCalculator/bower_components/jquery/README.md
vendored
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
# jQuery
|
||||||
|
|
||||||
|
> jQuery is a fast, small, and feature-rich JavaScript library.
|
||||||
|
|
||||||
|
For information on how to get started and how to use jQuery, please see [jQuery's documentation](http://api.jquery.com/).
|
||||||
|
For source files and issues, please visit the [jQuery repo](https://github.com/jquery/jquery).
|
||||||
|
|
||||||
|
## Including jQuery
|
||||||
|
|
||||||
|
Below are some of the most common ways to include jQuery.
|
||||||
|
|
||||||
|
### Browser
|
||||||
|
|
||||||
|
#### Script tag
|
||||||
|
|
||||||
|
```html
|
||||||
|
<script src="https://code.jquery.com/jquery-2.2.0.min.js"></script>
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Babel
|
||||||
|
|
||||||
|
[Babel](http://babeljs.io/) is a next generation JavaScript compiler. One of the features is the ability to use ES6/ES2015 modules now, even though browsers do not yet support this feature natively.
|
||||||
|
|
||||||
|
```js
|
||||||
|
import $ from "jquery";
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Browserify/Webpack
|
||||||
|
|
||||||
|
There are several ways to use [Browserify](http://browserify.org/) and [Webpack](https://webpack.github.io/). For more information on using these tools, please refer to the corresponding project's documention. In the script, including jQuery will usually look like this...
|
||||||
|
|
||||||
|
```js
|
||||||
|
var $ = require("jquery");
|
||||||
|
```
|
||||||
|
|
||||||
|
#### AMD (Asynchronous Module Definition)
|
||||||
|
|
||||||
|
AMD is a module format built for the browser. For more information, we recommend [require.js' documentation](http://requirejs.org/docs/whyamd.html).
|
||||||
|
|
||||||
|
```js
|
||||||
|
define(["jquery"], function($) {
|
||||||
|
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
### Node
|
||||||
|
|
||||||
|
To include jQuery in [Node](nodejs.org), first install with npm.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
npm install jquery
|
||||||
|
```
|
||||||
|
|
||||||
|
For jQuery to work in Node, a window with a document is required. Since no such window exists natively in Node, one can be mocked by tools such as [jsdom](https://github.com/tmpvar/jsdom). This can be useful for testing purposes.
|
||||||
|
|
||||||
|
```js
|
||||||
|
require("jsdom").env("", function(err, window) {
|
||||||
|
if (err) {
|
||||||
|
console.error(err);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var $ = require("jquery")(window);
|
||||||
|
});
|
||||||
|
```
|
||||||
14
TaxCalculator/bower_components/jquery/bower.json
vendored
Normal file
14
TaxCalculator/bower_components/jquery/bower.json
vendored
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"name": "jquery",
|
||||||
|
"main": "dist/jquery.js",
|
||||||
|
"license": "MIT",
|
||||||
|
"ignore": [
|
||||||
|
"package.json"
|
||||||
|
],
|
||||||
|
"keywords": [
|
||||||
|
"jquery",
|
||||||
|
"javascript",
|
||||||
|
"browser",
|
||||||
|
"library"
|
||||||
|
]
|
||||||
|
}
|
||||||
9814
TaxCalculator/bower_components/jquery/dist/jquery.js
vendored
Normal file
9814
TaxCalculator/bower_components/jquery/dist/jquery.js
vendored
Normal file
File diff suppressed because it is too large
Load Diff
4
TaxCalculator/bower_components/jquery/dist/jquery.min.js
vendored
Normal file
4
TaxCalculator/bower_components/jquery/dist/jquery.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
TaxCalculator/bower_components/jquery/dist/jquery.min.map
vendored
Normal file
1
TaxCalculator/bower_components/jquery/dist/jquery.min.map
vendored
Normal file
File diff suppressed because one or more lines are too long
36
TaxCalculator/bower_components/jquery/external/sizzle/LICENSE.txt
vendored
Normal file
36
TaxCalculator/bower_components/jquery/external/sizzle/LICENSE.txt
vendored
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
Copyright jQuery Foundation and other contributors, https://jquery.org/
|
||||||
|
|
||||||
|
This software consists of voluntary contributions made by many
|
||||||
|
individuals. For exact contribution history, see the revision history
|
||||||
|
available at https://github.com/jquery/sizzle
|
||||||
|
|
||||||
|
The following license applies to all parts of this software except as
|
||||||
|
documented below:
|
||||||
|
|
||||||
|
====
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of this software and associated documentation files (the
|
||||||
|
"Software"), to deal in the Software without restriction, including
|
||||||
|
without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be
|
||||||
|
included in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||||
|
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||||
|
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
|
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
|
====
|
||||||
|
|
||||||
|
All files located in the node_modules and external directories are
|
||||||
|
externally maintained libraries used by this software which have their
|
||||||
|
own licenses; we recommend you read them, as their terms may differ from
|
||||||
|
the terms above.
|
||||||
2143
TaxCalculator/bower_components/jquery/external/sizzle/dist/sizzle.js
vendored
Normal file
2143
TaxCalculator/bower_components/jquery/external/sizzle/dist/sizzle.js
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3
TaxCalculator/bower_components/jquery/external/sizzle/dist/sizzle.min.js
vendored
Normal file
3
TaxCalculator/bower_components/jquery/external/sizzle/dist/sizzle.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
TaxCalculator/bower_components/jquery/external/sizzle/dist/sizzle.min.map
vendored
Normal file
1
TaxCalculator/bower_components/jquery/external/sizzle/dist/sizzle.min.map
vendored
Normal file
File diff suppressed because one or more lines are too long
29
TaxCalculator/bower_components/jquery/src/.jshintrc
vendored
Normal file
29
TaxCalculator/bower_components/jquery/src/.jshintrc
vendored
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
{
|
||||||
|
"boss": true,
|
||||||
|
"curly": true,
|
||||||
|
"eqeqeq": true,
|
||||||
|
"eqnull": true,
|
||||||
|
"expr": true,
|
||||||
|
"immed": true,
|
||||||
|
"noarg": true,
|
||||||
|
"quotmark": "double",
|
||||||
|
"undef": true,
|
||||||
|
"unused": true,
|
||||||
|
|
||||||
|
"sub": true,
|
||||||
|
|
||||||
|
// Support: IE < 10, Android < 4.1
|
||||||
|
// The above browsers are failing a lot of tests in the ES5
|
||||||
|
// test suite at http://test262.ecmascript.org.
|
||||||
|
"es3": true,
|
||||||
|
|
||||||
|
"globals": {
|
||||||
|
"window": true,
|
||||||
|
"JSON": false,
|
||||||
|
|
||||||
|
"jQuery": true,
|
||||||
|
"define": true,
|
||||||
|
"module": true,
|
||||||
|
"noGlobal": true
|
||||||
|
}
|
||||||
|
}
|
||||||
845
TaxCalculator/bower_components/jquery/src/ajax.js
vendored
Normal file
845
TaxCalculator/bower_components/jquery/src/ajax.js
vendored
Normal file
@ -0,0 +1,845 @@
|
|||||||
|
define( [
|
||||||
|
"./core",
|
||||||
|
"./var/document",
|
||||||
|
"./var/rnotwhite",
|
||||||
|
"./ajax/var/location",
|
||||||
|
"./ajax/var/nonce",
|
||||||
|
"./ajax/var/rquery",
|
||||||
|
|
||||||
|
"./core/init",
|
||||||
|
"./ajax/parseJSON",
|
||||||
|
"./ajax/parseXML",
|
||||||
|
"./event/trigger",
|
||||||
|
"./deferred"
|
||||||
|
], function( jQuery, document, rnotwhite, location, nonce, rquery ) {
|
||||||
|
|
||||||
|
var
|
||||||
|
rhash = /#.*$/,
|
||||||
|
rts = /([?&])_=[^&]*/,
|
||||||
|
rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
|
||||||
|
|
||||||
|
// #7653, #8125, #8152: local protocol detection
|
||||||
|
rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
|
||||||
|
rnoContent = /^(?:GET|HEAD)$/,
|
||||||
|
rprotocol = /^\/\//,
|
||||||
|
|
||||||
|
/* Prefilters
|
||||||
|
* 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
|
||||||
|
* 2) These are called:
|
||||||
|
* - BEFORE asking for a transport
|
||||||
|
* - AFTER param serialization (s.data is a string if s.processData is true)
|
||||||
|
* 3) key is the dataType
|
||||||
|
* 4) the catchall symbol "*" can be used
|
||||||
|
* 5) execution will start with transport dataType and THEN continue down to "*" if needed
|
||||||
|
*/
|
||||||
|
prefilters = {},
|
||||||
|
|
||||||
|
/* Transports bindings
|
||||||
|
* 1) key is the dataType
|
||||||
|
* 2) the catchall symbol "*" can be used
|
||||||
|
* 3) selection will start with transport dataType and THEN go to "*" if needed
|
||||||
|
*/
|
||||||
|
transports = {},
|
||||||
|
|
||||||
|
// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
|
||||||
|
allTypes = "*/".concat( "*" ),
|
||||||
|
|
||||||
|
// Anchor tag for parsing the document origin
|
||||||
|
originAnchor = document.createElement( "a" );
|
||||||
|
originAnchor.href = location.href;
|
||||||
|
|
||||||
|
// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
|
||||||
|
function addToPrefiltersOrTransports( structure ) {
|
||||||
|
|
||||||
|
// dataTypeExpression is optional and defaults to "*"
|
||||||
|
return function( dataTypeExpression, func ) {
|
||||||
|
|
||||||
|
if ( typeof dataTypeExpression !== "string" ) {
|
||||||
|
func = dataTypeExpression;
|
||||||
|
dataTypeExpression = "*";
|
||||||
|
}
|
||||||
|
|
||||||
|
var dataType,
|
||||||
|
i = 0,
|
||||||
|
dataTypes = dataTypeExpression.toLowerCase().match( rnotwhite ) || [];
|
||||||
|
|
||||||
|
if ( jQuery.isFunction( func ) ) {
|
||||||
|
|
||||||
|
// For each dataType in the dataTypeExpression
|
||||||
|
while ( ( dataType = dataTypes[ i++ ] ) ) {
|
||||||
|
|
||||||
|
// Prepend if requested
|
||||||
|
if ( dataType[ 0 ] === "+" ) {
|
||||||
|
dataType = dataType.slice( 1 ) || "*";
|
||||||
|
( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );
|
||||||
|
|
||||||
|
// Otherwise append
|
||||||
|
} else {
|
||||||
|
( structure[ dataType ] = structure[ dataType ] || [] ).push( func );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// Base inspection function for prefilters and transports
|
||||||
|
function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
|
||||||
|
|
||||||
|
var inspected = {},
|
||||||
|
seekingTransport = ( structure === transports );
|
||||||
|
|
||||||
|
function inspect( dataType ) {
|
||||||
|
var selected;
|
||||||
|
inspected[ dataType ] = true;
|
||||||
|
jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
|
||||||
|
var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
|
||||||
|
if ( typeof dataTypeOrTransport === "string" &&
|
||||||
|
!seekingTransport && !inspected[ dataTypeOrTransport ] ) {
|
||||||
|
|
||||||
|
options.dataTypes.unshift( dataTypeOrTransport );
|
||||||
|
inspect( dataTypeOrTransport );
|
||||||
|
return false;
|
||||||
|
} else if ( seekingTransport ) {
|
||||||
|
return !( selected = dataTypeOrTransport );
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
return selected;
|
||||||
|
}
|
||||||
|
|
||||||
|
return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
|
||||||
|
}
|
||||||
|
|
||||||
|
// A special extend for ajax options
|
||||||
|
// that takes "flat" options (not to be deep extended)
|
||||||
|
// Fixes #9887
|
||||||
|
function ajaxExtend( target, src ) {
|
||||||
|
var key, deep,
|
||||||
|
flatOptions = jQuery.ajaxSettings.flatOptions || {};
|
||||||
|
|
||||||
|
for ( key in src ) {
|
||||||
|
if ( src[ key ] !== undefined ) {
|
||||||
|
( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ( deep ) {
|
||||||
|
jQuery.extend( true, target, deep );
|
||||||
|
}
|
||||||
|
|
||||||
|
return target;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Handles responses to an ajax request:
|
||||||
|
* - finds the right dataType (mediates between content-type and expected dataType)
|
||||||
|
* - returns the corresponding response
|
||||||
|
*/
|
||||||
|
function ajaxHandleResponses( s, jqXHR, responses ) {
|
||||||
|
|
||||||
|
var ct, type, finalDataType, firstDataType,
|
||||||
|
contents = s.contents,
|
||||||
|
dataTypes = s.dataTypes;
|
||||||
|
|
||||||
|
// Remove auto dataType and get content-type in the process
|
||||||
|
while ( dataTypes[ 0 ] === "*" ) {
|
||||||
|
dataTypes.shift();
|
||||||
|
if ( ct === undefined ) {
|
||||||
|
ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if we're dealing with a known content-type
|
||||||
|
if ( ct ) {
|
||||||
|
for ( type in contents ) {
|
||||||
|
if ( contents[ type ] && contents[ type ].test( ct ) ) {
|
||||||
|
dataTypes.unshift( type );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check to see if we have a response for the expected dataType
|
||||||
|
if ( dataTypes[ 0 ] in responses ) {
|
||||||
|
finalDataType = dataTypes[ 0 ];
|
||||||
|
} else {
|
||||||
|
|
||||||
|
// Try convertible dataTypes
|
||||||
|
for ( type in responses ) {
|
||||||
|
if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) {
|
||||||
|
finalDataType = type;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if ( !firstDataType ) {
|
||||||
|
firstDataType = type;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Or just use first one
|
||||||
|
finalDataType = finalDataType || firstDataType;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If we found a dataType
|
||||||
|
// We add the dataType to the list if needed
|
||||||
|
// and return the corresponding response
|
||||||
|
if ( finalDataType ) {
|
||||||
|
if ( finalDataType !== dataTypes[ 0 ] ) {
|
||||||
|
dataTypes.unshift( finalDataType );
|
||||||
|
}
|
||||||
|
return responses[ finalDataType ];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Chain conversions given the request and the original response
|
||||||
|
* Also sets the responseXXX fields on the jqXHR instance
|
||||||
|
*/
|
||||||
|
function ajaxConvert( s, response, jqXHR, isSuccess ) {
|
||||||
|
var conv2, current, conv, tmp, prev,
|
||||||
|
converters = {},
|
||||||
|
|
||||||
|
// Work with a copy of dataTypes in case we need to modify it for conversion
|
||||||
|
dataTypes = s.dataTypes.slice();
|
||||||
|
|
||||||
|
// Create converters map with lowercased keys
|
||||||
|
if ( dataTypes[ 1 ] ) {
|
||||||
|
for ( conv in s.converters ) {
|
||||||
|
converters[ conv.toLowerCase() ] = s.converters[ conv ];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
current = dataTypes.shift();
|
||||||
|
|
||||||
|
// Convert to each sequential dataType
|
||||||
|
while ( current ) {
|
||||||
|
|
||||||
|
if ( s.responseFields[ current ] ) {
|
||||||
|
jqXHR[ s.responseFields[ current ] ] = response;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Apply the dataFilter if provided
|
||||||
|
if ( !prev && isSuccess && s.dataFilter ) {
|
||||||
|
response = s.dataFilter( response, s.dataType );
|
||||||
|
}
|
||||||
|
|
||||||
|
prev = current;
|
||||||
|
current = dataTypes.shift();
|
||||||
|
|
||||||
|
if ( current ) {
|
||||||
|
|
||||||
|
// There's only work to do if current dataType is non-auto
|
||||||
|
if ( current === "*" ) {
|
||||||
|
|
||||||
|
current = prev;
|
||||||
|
|
||||||
|
// Convert response if prev dataType is non-auto and differs from current
|
||||||
|
} else if ( prev !== "*" && prev !== current ) {
|
||||||
|
|
||||||
|
// Seek a direct converter
|
||||||
|
conv = converters[ prev + " " + current ] || converters[ "* " + current ];
|
||||||
|
|
||||||
|
// If none found, seek a pair
|
||||||
|
if ( !conv ) {
|
||||||
|
for ( conv2 in converters ) {
|
||||||
|
|
||||||
|
// If conv2 outputs current
|
||||||
|
tmp = conv2.split( " " );
|
||||||
|
if ( tmp[ 1 ] === current ) {
|
||||||
|
|
||||||
|
// If prev can be converted to accepted input
|
||||||
|
conv = converters[ prev + " " + tmp[ 0 ] ] ||
|
||||||
|
converters[ "* " + tmp[ 0 ] ];
|
||||||
|
if ( conv ) {
|
||||||
|
|
||||||
|
// Condense equivalence converters
|
||||||
|
if ( conv === true ) {
|
||||||
|
conv = converters[ conv2 ];
|
||||||
|
|
||||||
|
// Otherwise, insert the intermediate dataType
|
||||||
|
} else if ( converters[ conv2 ] !== true ) {
|
||||||
|
current = tmp[ 0 ];
|
||||||
|
dataTypes.unshift( tmp[ 1 ] );
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Apply converter (if not an equivalence)
|
||||||
|
if ( conv !== true ) {
|
||||||
|
|
||||||
|
// Unless errors are allowed to bubble, catch and return them
|
||||||
|
if ( conv && s.throws ) {
|
||||||
|
response = conv( response );
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
response = conv( response );
|
||||||
|
} catch ( e ) {
|
||||||
|
return {
|
||||||
|
state: "parsererror",
|
||||||
|
error: conv ? e : "No conversion from " + prev + " to " + current
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return { state: "success", data: response };
|
||||||
|
}
|
||||||
|
|
||||||
|
jQuery.extend( {
|
||||||
|
|
||||||
|
// Counter for holding the number of active queries
|
||||||
|
active: 0,
|
||||||
|
|
||||||
|
// Last-Modified header cache for next request
|
||||||
|
lastModified: {},
|
||||||
|
etag: {},
|
||||||
|
|
||||||
|
ajaxSettings: {
|
||||||
|
url: location.href,
|
||||||
|
type: "GET",
|
||||||
|
isLocal: rlocalProtocol.test( location.protocol ),
|
||||||
|
global: true,
|
||||||
|
processData: true,
|
||||||
|
async: true,
|
||||||
|
contentType: "application/x-www-form-urlencoded; charset=UTF-8",
|
||||||
|
/*
|
||||||
|
timeout: 0,
|
||||||
|
data: null,
|
||||||
|
dataType: null,
|
||||||
|
username: null,
|
||||||
|
password: null,
|
||||||
|
cache: null,
|
||||||
|
throws: false,
|
||||||
|
traditional: false,
|
||||||
|
headers: {},
|
||||||
|
*/
|
||||||
|
|
||||||
|
accepts: {
|
||||||
|
"*": allTypes,
|
||||||
|
text: "text/plain",
|
||||||
|
html: "text/html",
|
||||||
|
xml: "application/xml, text/xml",
|
||||||
|
json: "application/json, text/javascript"
|
||||||
|
},
|
||||||
|
|
||||||
|
contents: {
|
||||||
|
xml: /\bxml\b/,
|
||||||
|
html: /\bhtml/,
|
||||||
|
json: /\bjson\b/
|
||||||
|
},
|
||||||
|
|
||||||
|
responseFields: {
|
||||||
|
xml: "responseXML",
|
||||||
|
text: "responseText",
|
||||||
|
json: "responseJSON"
|
||||||
|
},
|
||||||
|
|
||||||
|
// Data converters
|
||||||
|
// Keys separate source (or catchall "*") and destination types with a single space
|
||||||
|
converters: {
|
||||||
|
|
||||||
|
// Convert anything to text
|
||||||
|
"* text": String,
|
||||||
|
|
||||||
|
// Text to html (true = no transformation)
|
||||||
|
"text html": true,
|
||||||
|
|
||||||
|
// Evaluate text as a json expression
|
||||||
|
"text json": jQuery.parseJSON,
|
||||||
|
|
||||||
|
// Parse text as xml
|
||||||
|
"text xml": jQuery.parseXML
|
||||||
|
},
|
||||||
|
|
||||||
|
// For options that shouldn't be deep extended:
|
||||||
|
// you can add your own custom options here if
|
||||||
|
// and when you create one that shouldn't be
|
||||||
|
// deep extended (see ajaxExtend)
|
||||||
|
flatOptions: {
|
||||||
|
url: true,
|
||||||
|
context: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// Creates a full fledged settings object into target
|
||||||
|
// with both ajaxSettings and settings fields.
|
||||||
|
// If target is omitted, writes into ajaxSettings.
|
||||||
|
ajaxSetup: function( target, settings ) {
|
||||||
|
return settings ?
|
||||||
|
|
||||||
|
// Building a settings object
|
||||||
|
ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
|
||||||
|
|
||||||
|
// Extending ajaxSettings
|
||||||
|
ajaxExtend( jQuery.ajaxSettings, target );
|
||||||
|
},
|
||||||
|
|
||||||
|
ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
|
||||||
|
ajaxTransport: addToPrefiltersOrTransports( transports ),
|
||||||
|
|
||||||
|
// Main method
|
||||||
|
ajax: function( url, options ) {
|
||||||
|
|
||||||
|
// If url is an object, simulate pre-1.5 signature
|
||||||
|
if ( typeof url === "object" ) {
|
||||||
|
options = url;
|
||||||
|
url = undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Force options to be an object
|
||||||
|
options = options || {};
|
||||||
|
|
||||||
|
var transport,
|
||||||
|
|
||||||
|
// URL without anti-cache param
|
||||||
|
cacheURL,
|
||||||
|
|
||||||
|
// Response headers
|
||||||
|
responseHeadersString,
|
||||||
|
responseHeaders,
|
||||||
|
|
||||||
|
// timeout handle
|
||||||
|
timeoutTimer,
|
||||||
|
|
||||||
|
// Url cleanup var
|
||||||
|
urlAnchor,
|
||||||
|
|
||||||
|
// To know if global events are to be dispatched
|
||||||
|
fireGlobals,
|
||||||
|
|
||||||
|
// Loop variable
|
||||||
|
i,
|
||||||
|
|
||||||
|
// Create the final options object
|
||||||
|
s = jQuery.ajaxSetup( {}, options ),
|
||||||
|
|
||||||
|
// Callbacks context
|
||||||
|
callbackContext = s.context || s,
|
||||||
|
|
||||||
|
// Context for global events is callbackContext if it is a DOM node or jQuery collection
|
||||||
|
globalEventContext = s.context &&
|
||||||
|
( callbackContext.nodeType || callbackContext.jquery ) ?
|
||||||
|
jQuery( callbackContext ) :
|
||||||
|
jQuery.event,
|
||||||
|
|
||||||
|
// Deferreds
|
||||||
|
deferred = jQuery.Deferred(),
|
||||||
|
completeDeferred = jQuery.Callbacks( "once memory" ),
|
||||||
|
|
||||||
|
// Status-dependent callbacks
|
||||||
|
statusCode = s.statusCode || {},
|
||||||
|
|
||||||
|
// Headers (they are sent all at once)
|
||||||
|
requestHeaders = {},
|
||||||
|
requestHeadersNames = {},
|
||||||
|
|
||||||
|
// The jqXHR state
|
||||||
|
state = 0,
|
||||||
|
|
||||||
|
// Default abort message
|
||||||
|
strAbort = "canceled",
|
||||||
|
|
||||||
|
// Fake xhr
|
||||||
|
jqXHR = {
|
||||||
|
readyState: 0,
|
||||||
|
|
||||||
|
// Builds headers hashtable if needed
|
||||||
|
getResponseHeader: function( key ) {
|
||||||
|
var match;
|
||||||
|
if ( state === 2 ) {
|
||||||
|
if ( !responseHeaders ) {
|
||||||
|
responseHeaders = {};
|
||||||
|
while ( ( match = rheaders.exec( responseHeadersString ) ) ) {
|
||||||
|
responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
match = responseHeaders[ key.toLowerCase() ];
|
||||||
|
}
|
||||||
|
return match == null ? null : match;
|
||||||
|
},
|
||||||
|
|
||||||
|
// Raw string
|
||||||
|
getAllResponseHeaders: function() {
|
||||||
|
return state === 2 ? responseHeadersString : null;
|
||||||
|
},
|
||||||
|
|
||||||
|
// Caches the header
|
||||||
|
setRequestHeader: function( name, value ) {
|
||||||
|
var lname = name.toLowerCase();
|
||||||
|
if ( !state ) {
|
||||||
|
name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
|
||||||
|
requestHeaders[ name ] = value;
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
},
|
||||||
|
|
||||||
|
// Overrides response content-type header
|
||||||
|
overrideMimeType: function( type ) {
|
||||||
|
if ( !state ) {
|
||||||
|
s.mimeType = type;
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
},
|
||||||
|
|
||||||
|
// Status-dependent callbacks
|
||||||
|
statusCode: function( map ) {
|
||||||
|
var code;
|
||||||
|
if ( map ) {
|
||||||
|
if ( state < 2 ) {
|
||||||
|
for ( code in map ) {
|
||||||
|
|
||||||
|
// Lazy-add the new callback in a way that preserves old ones
|
||||||
|
statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
|
||||||
|
// Execute the appropriate callbacks
|
||||||
|
jqXHR.always( map[ jqXHR.status ] );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
},
|
||||||
|
|
||||||
|
// Cancel the request
|
||||||
|
abort: function( statusText ) {
|
||||||
|
var finalText = statusText || strAbort;
|
||||||
|
if ( transport ) {
|
||||||
|
transport.abort( finalText );
|
||||||
|
}
|
||||||
|
done( 0, finalText );
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Attach deferreds
|
||||||
|
deferred.promise( jqXHR ).complete = completeDeferred.add;
|
||||||
|
jqXHR.success = jqXHR.done;
|
||||||
|
jqXHR.error = jqXHR.fail;
|
||||||
|
|
||||||
|
// Remove hash character (#7531: and string promotion)
|
||||||
|
// Add protocol if not provided (prefilters might expect it)
|
||||||
|
// Handle falsy url in the settings object (#10093: consistency with old signature)
|
||||||
|
// We also use the url parameter if available
|
||||||
|
s.url = ( ( url || s.url || location.href ) + "" ).replace( rhash, "" )
|
||||||
|
.replace( rprotocol, location.protocol + "//" );
|
||||||
|
|
||||||
|
// Alias method option to type as per ticket #12004
|
||||||
|
s.type = options.method || options.type || s.method || s.type;
|
||||||
|
|
||||||
|
// Extract dataTypes list
|
||||||
|
s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().match( rnotwhite ) || [ "" ];
|
||||||
|
|
||||||
|
// A cross-domain request is in order when the origin doesn't match the current origin.
|
||||||
|
if ( s.crossDomain == null ) {
|
||||||
|
urlAnchor = document.createElement( "a" );
|
||||||
|
|
||||||
|
// Support: IE8-11+
|
||||||
|
// IE throws exception if url is malformed, e.g. http://example.com:80x/
|
||||||
|
try {
|
||||||
|
urlAnchor.href = s.url;
|
||||||
|
|
||||||
|
// Support: IE8-11+
|
||||||
|
// Anchor's host property isn't correctly set when s.url is relative
|
||||||
|
urlAnchor.href = urlAnchor.href;
|
||||||
|
s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !==
|
||||||
|
urlAnchor.protocol + "//" + urlAnchor.host;
|
||||||
|
} catch ( e ) {
|
||||||
|
|
||||||
|
// If there is an error parsing the URL, assume it is crossDomain,
|
||||||
|
// it can be rejected by the transport if it is invalid
|
||||||
|
s.crossDomain = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Convert data if not already a string
|
||||||
|
if ( s.data && s.processData && typeof s.data !== "string" ) {
|
||||||
|
s.data = jQuery.param( s.data, s.traditional );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Apply prefilters
|
||||||
|
inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
|
||||||
|
|
||||||
|
// If request was aborted inside a prefilter, stop there
|
||||||
|
if ( state === 2 ) {
|
||||||
|
return jqXHR;
|
||||||
|
}
|
||||||
|
|
||||||
|
// We can fire global events as of now if asked to
|
||||||
|
// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)
|
||||||
|
fireGlobals = jQuery.event && s.global;
|
||||||
|
|
||||||
|
// Watch for a new set of requests
|
||||||
|
if ( fireGlobals && jQuery.active++ === 0 ) {
|
||||||
|
jQuery.event.trigger( "ajaxStart" );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Uppercase the type
|
||||||
|
s.type = s.type.toUpperCase();
|
||||||
|
|
||||||
|
// Determine if request has content
|
||||||
|
s.hasContent = !rnoContent.test( s.type );
|
||||||
|
|
||||||
|
// Save the URL in case we're toying with the If-Modified-Since
|
||||||
|
// and/or If-None-Match header later on
|
||||||
|
cacheURL = s.url;
|
||||||
|
|
||||||
|
// More options handling for requests with no content
|
||||||
|
if ( !s.hasContent ) {
|
||||||
|
|
||||||
|
// If data is available, append data to url
|
||||||
|
if ( s.data ) {
|
||||||
|
cacheURL = ( s.url += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data );
|
||||||
|
|
||||||
|
// #9682: remove data so that it's not used in an eventual retry
|
||||||
|
delete s.data;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add anti-cache in url if needed
|
||||||
|
if ( s.cache === false ) {
|
||||||
|
s.url = rts.test( cacheURL ) ?
|
||||||
|
|
||||||
|
// If there is already a '_' parameter, set its value
|
||||||
|
cacheURL.replace( rts, "$1_=" + nonce++ ) :
|
||||||
|
|
||||||
|
// Otherwise add one to the end
|
||||||
|
cacheURL + ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + nonce++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
|
||||||
|
if ( s.ifModified ) {
|
||||||
|
if ( jQuery.lastModified[ cacheURL ] ) {
|
||||||
|
jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
|
||||||
|
}
|
||||||
|
if ( jQuery.etag[ cacheURL ] ) {
|
||||||
|
jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the correct header, if data is being sent
|
||||||
|
if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
|
||||||
|
jqXHR.setRequestHeader( "Content-Type", s.contentType );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the Accepts header for the server, depending on the dataType
|
||||||
|
jqXHR.setRequestHeader(
|
||||||
|
"Accept",
|
||||||
|
s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?
|
||||||
|
s.accepts[ s.dataTypes[ 0 ] ] +
|
||||||
|
( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
|
||||||
|
s.accepts[ "*" ]
|
||||||
|
);
|
||||||
|
|
||||||
|
// Check for headers option
|
||||||
|
for ( i in s.headers ) {
|
||||||
|
jqXHR.setRequestHeader( i, s.headers[ i ] );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Allow custom headers/mimetypes and early abort
|
||||||
|
if ( s.beforeSend &&
|
||||||
|
( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
|
||||||
|
|
||||||
|
// Abort if not done already and return
|
||||||
|
return jqXHR.abort();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Aborting is no longer a cancellation
|
||||||
|
strAbort = "abort";
|
||||||
|
|
||||||
|
// Install callbacks on deferreds
|
||||||
|
for ( i in { success: 1, error: 1, complete: 1 } ) {
|
||||||
|
jqXHR[ i ]( s[ i ] );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get transport
|
||||||
|
transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
|
||||||
|
|
||||||
|
// If no transport, we auto-abort
|
||||||
|
if ( !transport ) {
|
||||||
|
done( -1, "No Transport" );
|
||||||
|
} else {
|
||||||
|
jqXHR.readyState = 1;
|
||||||
|
|
||||||
|
// Send global event
|
||||||
|
if ( fireGlobals ) {
|
||||||
|
globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
|
||||||
|
}
|
||||||
|
|
||||||
|
// If request was aborted inside ajaxSend, stop there
|
||||||
|
if ( state === 2 ) {
|
||||||
|
return jqXHR;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Timeout
|
||||||
|
if ( s.async && s.timeout > 0 ) {
|
||||||
|
timeoutTimer = window.setTimeout( function() {
|
||||||
|
jqXHR.abort( "timeout" );
|
||||||
|
}, s.timeout );
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
state = 1;
|
||||||
|
transport.send( requestHeaders, done );
|
||||||
|
} catch ( e ) {
|
||||||
|
|
||||||
|
// Propagate exception as error if not done
|
||||||
|
if ( state < 2 ) {
|
||||||
|
done( -1, e );
|
||||||
|
|
||||||
|
// Simply rethrow otherwise
|
||||||
|
} else {
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Callback for when everything is done
|
||||||
|
function done( status, nativeStatusText, responses, headers ) {
|
||||||
|
var isSuccess, success, error, response, modified,
|
||||||
|
statusText = nativeStatusText;
|
||||||
|
|
||||||
|
// Called once
|
||||||
|
if ( state === 2 ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// State is "done" now
|
||||||
|
state = 2;
|
||||||
|
|
||||||
|
// Clear timeout if it exists
|
||||||
|
if ( timeoutTimer ) {
|
||||||
|
window.clearTimeout( timeoutTimer );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Dereference transport for early garbage collection
|
||||||
|
// (no matter how long the jqXHR object will be used)
|
||||||
|
transport = undefined;
|
||||||
|
|
||||||
|
// Cache response headers
|
||||||
|
responseHeadersString = headers || "";
|
||||||
|
|
||||||
|
// Set readyState
|
||||||
|
jqXHR.readyState = status > 0 ? 4 : 0;
|
||||||
|
|
||||||
|
// Determine if successful
|
||||||
|
isSuccess = status >= 200 && status < 300 || status === 304;
|
||||||
|
|
||||||
|
// Get response data
|
||||||
|
if ( responses ) {
|
||||||
|
response = ajaxHandleResponses( s, jqXHR, responses );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Convert no matter what (that way responseXXX fields are always set)
|
||||||
|
response = ajaxConvert( s, response, jqXHR, isSuccess );
|
||||||
|
|
||||||
|
// If successful, handle type chaining
|
||||||
|
if ( isSuccess ) {
|
||||||
|
|
||||||
|
// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
|
||||||
|
if ( s.ifModified ) {
|
||||||
|
modified = jqXHR.getResponseHeader( "Last-Modified" );
|
||||||
|
if ( modified ) {
|
||||||
|
jQuery.lastModified[ cacheURL ] = modified;
|
||||||
|
}
|
||||||
|
modified = jqXHR.getResponseHeader( "etag" );
|
||||||
|
if ( modified ) {
|
||||||
|
jQuery.etag[ cacheURL ] = modified;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// if no content
|
||||||
|
if ( status === 204 || s.type === "HEAD" ) {
|
||||||
|
statusText = "nocontent";
|
||||||
|
|
||||||
|
// if not modified
|
||||||
|
} else if ( status === 304 ) {
|
||||||
|
statusText = "notmodified";
|
||||||
|
|
||||||
|
// If we have data, let's convert it
|
||||||
|
} else {
|
||||||
|
statusText = response.state;
|
||||||
|
success = response.data;
|
||||||
|
error = response.error;
|
||||||
|
isSuccess = !error;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
|
||||||
|
// Extract error from statusText and normalize for non-aborts
|
||||||
|
error = statusText;
|
||||||
|
if ( status || !statusText ) {
|
||||||
|
statusText = "error";
|
||||||
|
if ( status < 0 ) {
|
||||||
|
status = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set data for the fake xhr object
|
||||||
|
jqXHR.status = status;
|
||||||
|
jqXHR.statusText = ( nativeStatusText || statusText ) + "";
|
||||||
|
|
||||||
|
// Success/Error
|
||||||
|
if ( isSuccess ) {
|
||||||
|
deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
|
||||||
|
} else {
|
||||||
|
deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Status-dependent callbacks
|
||||||
|
jqXHR.statusCode( statusCode );
|
||||||
|
statusCode = undefined;
|
||||||
|
|
||||||
|
if ( fireGlobals ) {
|
||||||
|
globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
|
||||||
|
[ jqXHR, s, isSuccess ? success : error ] );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Complete
|
||||||
|
completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
|
||||||
|
|
||||||
|
if ( fireGlobals ) {
|
||||||
|
globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
|
||||||
|
|
||||||
|
// Handle the global AJAX counter
|
||||||
|
if ( !( --jQuery.active ) ) {
|
||||||
|
jQuery.event.trigger( "ajaxStop" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return jqXHR;
|
||||||
|
},
|
||||||
|
|
||||||
|
getJSON: function( url, data, callback ) {
|
||||||
|
return jQuery.get( url, data, callback, "json" );
|
||||||
|
},
|
||||||
|
|
||||||
|
getScript: function( url, callback ) {
|
||||||
|
return jQuery.get( url, undefined, callback, "script" );
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
|
||||||
|
jQuery.each( [ "get", "post" ], function( i, method ) {
|
||||||
|
jQuery[ method ] = function( url, data, callback, type ) {
|
||||||
|
|
||||||
|
// Shift arguments if data argument was omitted
|
||||||
|
if ( jQuery.isFunction( data ) ) {
|
||||||
|
type = type || callback;
|
||||||
|
callback = data;
|
||||||
|
data = undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
// The url can be an options object (which then must have .url)
|
||||||
|
return jQuery.ajax( jQuery.extend( {
|
||||||
|
url: url,
|
||||||
|
type: method,
|
||||||
|
dataType: type,
|
||||||
|
data: data,
|
||||||
|
success: callback
|
||||||
|
}, jQuery.isPlainObject( url ) && url ) );
|
||||||
|
};
|
||||||
|
} );
|
||||||
|
|
||||||
|
return jQuery;
|
||||||
|
} );
|
||||||
100
TaxCalculator/bower_components/jquery/src/ajax/jsonp.js
vendored
Normal file
100
TaxCalculator/bower_components/jquery/src/ajax/jsonp.js
vendored
Normal file
@ -0,0 +1,100 @@
|
|||||||
|
define( [
|
||||||
|
"../core",
|
||||||
|
"./var/nonce",
|
||||||
|
"./var/rquery",
|
||||||
|
"../ajax"
|
||||||
|
], function( jQuery, nonce, rquery ) {
|
||||||
|
|
||||||
|
var oldCallbacks = [],
|
||||||
|
rjsonp = /(=)\?(?=&|$)|\?\?/;
|
||||||
|
|
||||||
|
// Default jsonp settings
|
||||||
|
jQuery.ajaxSetup( {
|
||||||
|
jsonp: "callback",
|
||||||
|
jsonpCallback: function() {
|
||||||
|
var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
|
||||||
|
this[ callback ] = true;
|
||||||
|
return callback;
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
|
||||||
|
// Detect, normalize options and install callbacks for jsonp requests
|
||||||
|
jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
|
||||||
|
|
||||||
|
var callbackName, overwritten, responseContainer,
|
||||||
|
jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
|
||||||
|
"url" :
|
||||||
|
typeof s.data === "string" &&
|
||||||
|
( s.contentType || "" )
|
||||||
|
.indexOf( "application/x-www-form-urlencoded" ) === 0 &&
|
||||||
|
rjsonp.test( s.data ) && "data"
|
||||||
|
);
|
||||||
|
|
||||||
|
// Handle iff the expected data type is "jsonp" or we have a parameter to set
|
||||||
|
if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
|
||||||
|
|
||||||
|
// Get callback name, remembering preexisting value associated with it
|
||||||
|
callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
|
||||||
|
s.jsonpCallback() :
|
||||||
|
s.jsonpCallback;
|
||||||
|
|
||||||
|
// Insert callback into url or form data
|
||||||
|
if ( jsonProp ) {
|
||||||
|
s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
|
||||||
|
} else if ( s.jsonp !== false ) {
|
||||||
|
s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Use data converter to retrieve json after script execution
|
||||||
|
s.converters[ "script json" ] = function() {
|
||||||
|
if ( !responseContainer ) {
|
||||||
|
jQuery.error( callbackName + " was not called" );
|
||||||
|
}
|
||||||
|
return responseContainer[ 0 ];
|
||||||
|
};
|
||||||
|
|
||||||
|
// Force json dataType
|
||||||
|
s.dataTypes[ 0 ] = "json";
|
||||||
|
|
||||||
|
// Install callback
|
||||||
|
overwritten = window[ callbackName ];
|
||||||
|
window[ callbackName ] = function() {
|
||||||
|
responseContainer = arguments;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Clean-up function (fires after converters)
|
||||||
|
jqXHR.always( function() {
|
||||||
|
|
||||||
|
// If previous value didn't exist - remove it
|
||||||
|
if ( overwritten === undefined ) {
|
||||||
|
jQuery( window ).removeProp( callbackName );
|
||||||
|
|
||||||
|
// Otherwise restore preexisting value
|
||||||
|
} else {
|
||||||
|
window[ callbackName ] = overwritten;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Save back as free
|
||||||
|
if ( s[ callbackName ] ) {
|
||||||
|
|
||||||
|
// Make sure that re-using the options doesn't screw things around
|
||||||
|
s.jsonpCallback = originalSettings.jsonpCallback;
|
||||||
|
|
||||||
|
// Save the callback name for future use
|
||||||
|
oldCallbacks.push( callbackName );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Call if it was a function and we have a response
|
||||||
|
if ( responseContainer && jQuery.isFunction( overwritten ) ) {
|
||||||
|
overwritten( responseContainer[ 0 ] );
|
||||||
|
}
|
||||||
|
|
||||||
|
responseContainer = overwritten = undefined;
|
||||||
|
} );
|
||||||
|
|
||||||
|
// Delegate to script
|
||||||
|
return "script";
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
|
||||||
|
} );
|
||||||
83
TaxCalculator/bower_components/jquery/src/ajax/load.js
vendored
Normal file
83
TaxCalculator/bower_components/jquery/src/ajax/load.js
vendored
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
define( [
|
||||||
|
"../core",
|
||||||
|
"../core/parseHTML",
|
||||||
|
"../ajax",
|
||||||
|
"../traversing",
|
||||||
|
"../manipulation",
|
||||||
|
"../selector",
|
||||||
|
|
||||||
|
// Optional event/alias dependency
|
||||||
|
"../event/alias"
|
||||||
|
], function( jQuery ) {
|
||||||
|
|
||||||
|
// Keep a copy of the old load method
|
||||||
|
var _load = jQuery.fn.load;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load a url into a page
|
||||||
|
*/
|
||||||
|
jQuery.fn.load = function( url, params, callback ) {
|
||||||
|
if ( typeof url !== "string" && _load ) {
|
||||||
|
return _load.apply( this, arguments );
|
||||||
|
}
|
||||||
|
|
||||||
|
var selector, type, response,
|
||||||
|
self = this,
|
||||||
|
off = url.indexOf( " " );
|
||||||
|
|
||||||
|
if ( off > -1 ) {
|
||||||
|
selector = jQuery.trim( url.slice( off ) );
|
||||||
|
url = url.slice( 0, off );
|
||||||
|
}
|
||||||
|
|
||||||
|
// If it's a function
|
||||||
|
if ( jQuery.isFunction( params ) ) {
|
||||||
|
|
||||||
|
// We assume that it's the callback
|
||||||
|
callback = params;
|
||||||
|
params = undefined;
|
||||||
|
|
||||||
|
// Otherwise, build a param string
|
||||||
|
} else if ( params && typeof params === "object" ) {
|
||||||
|
type = "POST";
|
||||||
|
}
|
||||||
|
|
||||||
|
// If we have elements to modify, make the request
|
||||||
|
if ( self.length > 0 ) {
|
||||||
|
jQuery.ajax( {
|
||||||
|
url: url,
|
||||||
|
|
||||||
|
// If "type" variable is undefined, then "GET" method will be used.
|
||||||
|
// Make value of this field explicit since
|
||||||
|
// user can override it through ajaxSetup method
|
||||||
|
type: type || "GET",
|
||||||
|
dataType: "html",
|
||||||
|
data: params
|
||||||
|
} ).done( function( responseText ) {
|
||||||
|
|
||||||
|
// Save response for use in complete callback
|
||||||
|
response = arguments;
|
||||||
|
|
||||||
|
self.html( selector ?
|
||||||
|
|
||||||
|
// If a selector was specified, locate the right elements in a dummy div
|
||||||
|
// Exclude scripts to avoid IE 'Permission Denied' errors
|
||||||
|
jQuery( "<div>" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :
|
||||||
|
|
||||||
|
// Otherwise use the full result
|
||||||
|
responseText );
|
||||||
|
|
||||||
|
// If the request succeeds, this function gets "data", "status", "jqXHR"
|
||||||
|
// but they are ignored because response was set above.
|
||||||
|
// If it fails, this function gets "jqXHR", "status", "error"
|
||||||
|
} ).always( callback && function( jqXHR, status ) {
|
||||||
|
self.each( function() {
|
||||||
|
callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );
|
||||||
|
} );
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
|
} );
|
||||||
13
TaxCalculator/bower_components/jquery/src/ajax/parseJSON.js
vendored
Normal file
13
TaxCalculator/bower_components/jquery/src/ajax/parseJSON.js
vendored
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
define( [
|
||||||
|
"../core"
|
||||||
|
], function( jQuery ) {
|
||||||
|
|
||||||
|
// Support: Android 2.3
|
||||||
|
// Workaround failure to string-cast null input
|
||||||
|
jQuery.parseJSON = function( data ) {
|
||||||
|
return JSON.parse( data + "" );
|
||||||
|
};
|
||||||
|
|
||||||
|
return jQuery.parseJSON;
|
||||||
|
|
||||||
|
} );
|
||||||
27
TaxCalculator/bower_components/jquery/src/ajax/parseXML.js
vendored
Normal file
27
TaxCalculator/bower_components/jquery/src/ajax/parseXML.js
vendored
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
define( [
|
||||||
|
"../core"
|
||||||
|
], function( jQuery ) {
|
||||||
|
|
||||||
|
// Cross-browser xml parsing
|
||||||
|
jQuery.parseXML = function( data ) {
|
||||||
|
var xml;
|
||||||
|
if ( !data || typeof data !== "string" ) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Support: IE9
|
||||||
|
try {
|
||||||
|
xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
|
||||||
|
} catch ( e ) {
|
||||||
|
xml = undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
|
||||||
|
jQuery.error( "Invalid XML: " + data );
|
||||||
|
}
|
||||||
|
return xml;
|
||||||
|
};
|
||||||
|
|
||||||
|
return jQuery.parseXML;
|
||||||
|
|
||||||
|
} );
|
||||||
68
TaxCalculator/bower_components/jquery/src/ajax/script.js
vendored
Normal file
68
TaxCalculator/bower_components/jquery/src/ajax/script.js
vendored
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
define( [
|
||||||
|
"../core",
|
||||||
|
"../var/document",
|
||||||
|
"../ajax"
|
||||||
|
], function( jQuery, document ) {
|
||||||
|
|
||||||
|
// Install script dataType
|
||||||
|
jQuery.ajaxSetup( {
|
||||||
|
accepts: {
|
||||||
|
script: "text/javascript, application/javascript, " +
|
||||||
|
"application/ecmascript, application/x-ecmascript"
|
||||||
|
},
|
||||||
|
contents: {
|
||||||
|
script: /\b(?:java|ecma)script\b/
|
||||||
|
},
|
||||||
|
converters: {
|
||||||
|
"text script": function( text ) {
|
||||||
|
jQuery.globalEval( text );
|
||||||
|
return text;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
|
||||||
|
// Handle cache's special case and crossDomain
|
||||||
|
jQuery.ajaxPrefilter( "script", function( s ) {
|
||||||
|
if ( s.cache === undefined ) {
|
||||||
|
s.cache = false;
|
||||||
|
}
|
||||||
|
if ( s.crossDomain ) {
|
||||||
|
s.type = "GET";
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
|
||||||
|
// Bind script tag hack transport
|
||||||
|
jQuery.ajaxTransport( "script", function( s ) {
|
||||||
|
|
||||||
|
// This transport only deals with cross domain requests
|
||||||
|
if ( s.crossDomain ) {
|
||||||
|
var script, callback;
|
||||||
|
return {
|
||||||
|
send: function( _, complete ) {
|
||||||
|
script = jQuery( "<script>" ).prop( {
|
||||||
|
charset: s.scriptCharset,
|
||||||
|
src: s.url
|
||||||
|
} ).on(
|
||||||
|
"load error",
|
||||||
|
callback = function( evt ) {
|
||||||
|
script.remove();
|
||||||
|
callback = null;
|
||||||
|
if ( evt ) {
|
||||||
|
complete( evt.type === "error" ? 404 : 200, evt.type );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
// Use native DOM manipulation to avoid our domManip AJAX trickery
|
||||||
|
document.head.appendChild( script[ 0 ] );
|
||||||
|
},
|
||||||
|
abort: function() {
|
||||||
|
if ( callback ) {
|
||||||
|
callback();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
|
||||||
|
} );
|
||||||
3
TaxCalculator/bower_components/jquery/src/ajax/var/location.js
vendored
Normal file
3
TaxCalculator/bower_components/jquery/src/ajax/var/location.js
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
define( function() {
|
||||||
|
return window.location;
|
||||||
|
} );
|
||||||
5
TaxCalculator/bower_components/jquery/src/ajax/var/nonce.js
vendored
Normal file
5
TaxCalculator/bower_components/jquery/src/ajax/var/nonce.js
vendored
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
define( [
|
||||||
|
"../../core"
|
||||||
|
], function( jQuery ) {
|
||||||
|
return jQuery.now();
|
||||||
|
} );
|
||||||
3
TaxCalculator/bower_components/jquery/src/ajax/var/rquery.js
vendored
Normal file
3
TaxCalculator/bower_components/jquery/src/ajax/var/rquery.js
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
define( function() {
|
||||||
|
return ( /\?/ );
|
||||||
|
} );
|
||||||
167
TaxCalculator/bower_components/jquery/src/ajax/xhr.js
vendored
Normal file
167
TaxCalculator/bower_components/jquery/src/ajax/xhr.js
vendored
Normal file
@ -0,0 +1,167 @@
|
|||||||
|
define( [
|
||||||
|
"../core",
|
||||||
|
"../var/support",
|
||||||
|
"../ajax"
|
||||||
|
], function( jQuery, support ) {
|
||||||
|
|
||||||
|
jQuery.ajaxSettings.xhr = function() {
|
||||||
|
try {
|
||||||
|
return new window.XMLHttpRequest();
|
||||||
|
} catch ( e ) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
var xhrSuccessStatus = {
|
||||||
|
|
||||||
|
// File protocol always yields status code 0, assume 200
|
||||||
|
0: 200,
|
||||||
|
|
||||||
|
// Support: IE9
|
||||||
|
// #1450: sometimes IE returns 1223 when it should be 204
|
||||||
|
1223: 204
|
||||||
|
},
|
||||||
|
xhrSupported = jQuery.ajaxSettings.xhr();
|
||||||
|
|
||||||
|
support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
|
||||||
|
support.ajax = xhrSupported = !!xhrSupported;
|
||||||
|
|
||||||
|
jQuery.ajaxTransport( function( options ) {
|
||||||
|
var callback, errorCallback;
|
||||||
|
|
||||||
|
// Cross domain only allowed if supported through XMLHttpRequest
|
||||||
|
if ( support.cors || xhrSupported && !options.crossDomain ) {
|
||||||
|
return {
|
||||||
|
send: function( headers, complete ) {
|
||||||
|
var i,
|
||||||
|
xhr = options.xhr();
|
||||||
|
|
||||||
|
xhr.open(
|
||||||
|
options.type,
|
||||||
|
options.url,
|
||||||
|
options.async,
|
||||||
|
options.username,
|
||||||
|
options.password
|
||||||
|
);
|
||||||
|
|
||||||
|
// Apply custom fields if provided
|
||||||
|
if ( options.xhrFields ) {
|
||||||
|
for ( i in options.xhrFields ) {
|
||||||
|
xhr[ i ] = options.xhrFields[ i ];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Override mime type if needed
|
||||||
|
if ( options.mimeType && xhr.overrideMimeType ) {
|
||||||
|
xhr.overrideMimeType( options.mimeType );
|
||||||
|
}
|
||||||
|
|
||||||
|
// X-Requested-With header
|
||||||
|
// For cross-domain requests, seeing as conditions for a preflight are
|
||||||
|
// akin to a jigsaw puzzle, we simply never set it to be sure.
|
||||||
|
// (it can always be set on a per-request basis or even using ajaxSetup)
|
||||||
|
// For same-domain requests, won't change header if already provided.
|
||||||
|
if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) {
|
||||||
|
headers[ "X-Requested-With" ] = "XMLHttpRequest";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set headers
|
||||||
|
for ( i in headers ) {
|
||||||
|
xhr.setRequestHeader( i, headers[ i ] );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Callback
|
||||||
|
callback = function( type ) {
|
||||||
|
return function() {
|
||||||
|
if ( callback ) {
|
||||||
|
callback = errorCallback = xhr.onload =
|
||||||
|
xhr.onerror = xhr.onabort = xhr.onreadystatechange = null;
|
||||||
|
|
||||||
|
if ( type === "abort" ) {
|
||||||
|
xhr.abort();
|
||||||
|
} else if ( type === "error" ) {
|
||||||
|
|
||||||
|
// Support: IE9
|
||||||
|
// On a manual native abort, IE9 throws
|
||||||
|
// errors on any property access that is not readyState
|
||||||
|
if ( typeof xhr.status !== "number" ) {
|
||||||
|
complete( 0, "error" );
|
||||||
|
} else {
|
||||||
|
complete(
|
||||||
|
|
||||||
|
// File: protocol always yields status 0; see #8605, #14207
|
||||||
|
xhr.status,
|
||||||
|
xhr.statusText
|
||||||
|
);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
complete(
|
||||||
|
xhrSuccessStatus[ xhr.status ] || xhr.status,
|
||||||
|
xhr.statusText,
|
||||||
|
|
||||||
|
// Support: IE9 only
|
||||||
|
// IE9 has no XHR2 but throws on binary (trac-11426)
|
||||||
|
// For XHR2 non-text, let the caller handle it (gh-2498)
|
||||||
|
( xhr.responseType || "text" ) !== "text" ||
|
||||||
|
typeof xhr.responseText !== "string" ?
|
||||||
|
{ binary: xhr.response } :
|
||||||
|
{ text: xhr.responseText },
|
||||||
|
xhr.getAllResponseHeaders()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
// Listen to events
|
||||||
|
xhr.onload = callback();
|
||||||
|
errorCallback = xhr.onerror = callback( "error" );
|
||||||
|
|
||||||
|
// Support: IE9
|
||||||
|
// Use onreadystatechange to replace onabort
|
||||||
|
// to handle uncaught aborts
|
||||||
|
if ( xhr.onabort !== undefined ) {
|
||||||
|
xhr.onabort = errorCallback;
|
||||||
|
} else {
|
||||||
|
xhr.onreadystatechange = function() {
|
||||||
|
|
||||||
|
// Check readyState before timeout as it changes
|
||||||
|
if ( xhr.readyState === 4 ) {
|
||||||
|
|
||||||
|
// Allow onerror to be called first,
|
||||||
|
// but that will not handle a native abort
|
||||||
|
// Also, save errorCallback to a variable
|
||||||
|
// as xhr.onerror cannot be accessed
|
||||||
|
window.setTimeout( function() {
|
||||||
|
if ( callback ) {
|
||||||
|
errorCallback();
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create the abort callback
|
||||||
|
callback = callback( "abort" );
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
|
// Do send the request (this may raise an exception)
|
||||||
|
xhr.send( options.hasContent && options.data || null );
|
||||||
|
} catch ( e ) {
|
||||||
|
|
||||||
|
// #14683: Only rethrow if this hasn't been notified as an error yet
|
||||||
|
if ( callback ) {
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
abort: function() {
|
||||||
|
if ( callback ) {
|
||||||
|
callback();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
|
||||||
|
} );
|
||||||
11
TaxCalculator/bower_components/jquery/src/attributes.js
vendored
Normal file
11
TaxCalculator/bower_components/jquery/src/attributes.js
vendored
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
define( [
|
||||||
|
"./core",
|
||||||
|
"./attributes/attr",
|
||||||
|
"./attributes/prop",
|
||||||
|
"./attributes/classes",
|
||||||
|
"./attributes/val"
|
||||||
|
], function( jQuery ) {
|
||||||
|
|
||||||
|
// Return jQuery for attributes-only inclusion
|
||||||
|
return jQuery;
|
||||||
|
} );
|
||||||
142
TaxCalculator/bower_components/jquery/src/attributes/attr.js
vendored
Normal file
142
TaxCalculator/bower_components/jquery/src/attributes/attr.js
vendored
Normal file
@ -0,0 +1,142 @@
|
|||||||
|
define( [
|
||||||
|
"../core",
|
||||||
|
"../core/access",
|
||||||
|
"./support",
|
||||||
|
"../var/rnotwhite",
|
||||||
|
"../selector"
|
||||||
|
], function( jQuery, access, support, rnotwhite ) {
|
||||||
|
|
||||||
|
var boolHook,
|
||||||
|
attrHandle = jQuery.expr.attrHandle;
|
||||||
|
|
||||||
|
jQuery.fn.extend( {
|
||||||
|
attr: function( name, value ) {
|
||||||
|
return access( this, jQuery.attr, name, value, arguments.length > 1 );
|
||||||
|
},
|
||||||
|
|
||||||
|
removeAttr: function( name ) {
|
||||||
|
return this.each( function() {
|
||||||
|
jQuery.removeAttr( this, name );
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
|
||||||
|
jQuery.extend( {
|
||||||
|
attr: function( elem, name, value ) {
|
||||||
|
var ret, hooks,
|
||||||
|
nType = elem.nodeType;
|
||||||
|
|
||||||
|
// Don't get/set attributes on text, comment and attribute nodes
|
||||||
|
if ( nType === 3 || nType === 8 || nType === 2 ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fallback to prop when attributes are not supported
|
||||||
|
if ( typeof elem.getAttribute === "undefined" ) {
|
||||||
|
return jQuery.prop( elem, name, value );
|
||||||
|
}
|
||||||
|
|
||||||
|
// All attributes are lowercase
|
||||||
|
// Grab necessary hook if one is defined
|
||||||
|
if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
|
||||||
|
name = name.toLowerCase();
|
||||||
|
hooks = jQuery.attrHooks[ name ] ||
|
||||||
|
( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( value !== undefined ) {
|
||||||
|
if ( value === null ) {
|
||||||
|
jQuery.removeAttr( elem, name );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( hooks && "set" in hooks &&
|
||||||
|
( ret = hooks.set( elem, value, name ) ) !== undefined ) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
elem.setAttribute( name, value + "" );
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = jQuery.find.attr( elem, name );
|
||||||
|
|
||||||
|
// Non-existent attributes return null, we normalize to undefined
|
||||||
|
return ret == null ? undefined : ret;
|
||||||
|
},
|
||||||
|
|
||||||
|
attrHooks: {
|
||||||
|
type: {
|
||||||
|
set: function( elem, value ) {
|
||||||
|
if ( !support.radioValue && value === "radio" &&
|
||||||
|
jQuery.nodeName( elem, "input" ) ) {
|
||||||
|
var val = elem.value;
|
||||||
|
elem.setAttribute( "type", value );
|
||||||
|
if ( val ) {
|
||||||
|
elem.value = val;
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
removeAttr: function( elem, value ) {
|
||||||
|
var name, propName,
|
||||||
|
i = 0,
|
||||||
|
attrNames = value && value.match( rnotwhite );
|
||||||
|
|
||||||
|
if ( attrNames && elem.nodeType === 1 ) {
|
||||||
|
while ( ( name = attrNames[ i++ ] ) ) {
|
||||||
|
propName = jQuery.propFix[ name ] || name;
|
||||||
|
|
||||||
|
// Boolean attributes get special treatment (#10870)
|
||||||
|
if ( jQuery.expr.match.bool.test( name ) ) {
|
||||||
|
|
||||||
|
// Set corresponding property to false
|
||||||
|
elem[ propName ] = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
elem.removeAttribute( name );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
|
||||||
|
// Hooks for boolean attributes
|
||||||
|
boolHook = {
|
||||||
|
set: function( elem, value, name ) {
|
||||||
|
if ( value === false ) {
|
||||||
|
|
||||||
|
// Remove boolean attributes when set to false
|
||||||
|
jQuery.removeAttr( elem, name );
|
||||||
|
} else {
|
||||||
|
elem.setAttribute( name, name );
|
||||||
|
}
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
|
||||||
|
var getter = attrHandle[ name ] || jQuery.find.attr;
|
||||||
|
|
||||||
|
attrHandle[ name ] = function( elem, name, isXML ) {
|
||||||
|
var ret, handle;
|
||||||
|
if ( !isXML ) {
|
||||||
|
|
||||||
|
// Avoid an infinite loop by temporarily removing this function from the getter
|
||||||
|
handle = attrHandle[ name ];
|
||||||
|
attrHandle[ name ] = ret;
|
||||||
|
ret = getter( elem, name, isXML ) != null ?
|
||||||
|
name.toLowerCase() :
|
||||||
|
null;
|
||||||
|
attrHandle[ name ] = handle;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
};
|
||||||
|
} );
|
||||||
|
|
||||||
|
} );
|
||||||
177
TaxCalculator/bower_components/jquery/src/attributes/classes.js
vendored
Normal file
177
TaxCalculator/bower_components/jquery/src/attributes/classes.js
vendored
Normal file
@ -0,0 +1,177 @@
|
|||||||
|
define( [
|
||||||
|
"../core",
|
||||||
|
"../var/rnotwhite",
|
||||||
|
"../data/var/dataPriv",
|
||||||
|
"../core/init"
|
||||||
|
], function( jQuery, rnotwhite, dataPriv ) {
|
||||||
|
|
||||||
|
var rclass = /[\t\r\n\f]/g;
|
||||||
|
|
||||||
|
function getClass( elem ) {
|
||||||
|
return elem.getAttribute && elem.getAttribute( "class" ) || "";
|
||||||
|
}
|
||||||
|
|
||||||
|
jQuery.fn.extend( {
|
||||||
|
addClass: function( value ) {
|
||||||
|
var classes, elem, cur, curValue, clazz, j, finalValue,
|
||||||
|
i = 0;
|
||||||
|
|
||||||
|
if ( jQuery.isFunction( value ) ) {
|
||||||
|
return this.each( function( j ) {
|
||||||
|
jQuery( this ).addClass( value.call( this, j, getClass( this ) ) );
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( typeof value === "string" && value ) {
|
||||||
|
classes = value.match( rnotwhite ) || [];
|
||||||
|
|
||||||
|
while ( ( elem = this[ i++ ] ) ) {
|
||||||
|
curValue = getClass( elem );
|
||||||
|
cur = elem.nodeType === 1 &&
|
||||||
|
( " " + curValue + " " ).replace( rclass, " " );
|
||||||
|
|
||||||
|
if ( cur ) {
|
||||||
|
j = 0;
|
||||||
|
while ( ( clazz = classes[ j++ ] ) ) {
|
||||||
|
if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
|
||||||
|
cur += clazz + " ";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Only assign if different to avoid unneeded rendering.
|
||||||
|
finalValue = jQuery.trim( cur );
|
||||||
|
if ( curValue !== finalValue ) {
|
||||||
|
elem.setAttribute( "class", finalValue );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return this;
|
||||||
|
},
|
||||||
|
|
||||||
|
removeClass: function( value ) {
|
||||||
|
var classes, elem, cur, curValue, clazz, j, finalValue,
|
||||||
|
i = 0;
|
||||||
|
|
||||||
|
if ( jQuery.isFunction( value ) ) {
|
||||||
|
return this.each( function( j ) {
|
||||||
|
jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( !arguments.length ) {
|
||||||
|
return this.attr( "class", "" );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( typeof value === "string" && value ) {
|
||||||
|
classes = value.match( rnotwhite ) || [];
|
||||||
|
|
||||||
|
while ( ( elem = this[ i++ ] ) ) {
|
||||||
|
curValue = getClass( elem );
|
||||||
|
|
||||||
|
// This expression is here for better compressibility (see addClass)
|
||||||
|
cur = elem.nodeType === 1 &&
|
||||||
|
( " " + curValue + " " ).replace( rclass, " " );
|
||||||
|
|
||||||
|
if ( cur ) {
|
||||||
|
j = 0;
|
||||||
|
while ( ( clazz = classes[ j++ ] ) ) {
|
||||||
|
|
||||||
|
// Remove *all* instances
|
||||||
|
while ( cur.indexOf( " " + clazz + " " ) > -1 ) {
|
||||||
|
cur = cur.replace( " " + clazz + " ", " " );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Only assign if different to avoid unneeded rendering.
|
||||||
|
finalValue = jQuery.trim( cur );
|
||||||
|
if ( curValue !== finalValue ) {
|
||||||
|
elem.setAttribute( "class", finalValue );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return this;
|
||||||
|
},
|
||||||
|
|
||||||
|
toggleClass: function( value, stateVal ) {
|
||||||
|
var type = typeof value;
|
||||||
|
|
||||||
|
if ( typeof stateVal === "boolean" && type === "string" ) {
|
||||||
|
return stateVal ? this.addClass( value ) : this.removeClass( value );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( jQuery.isFunction( value ) ) {
|
||||||
|
return this.each( function( i ) {
|
||||||
|
jQuery( this ).toggleClass(
|
||||||
|
value.call( this, i, getClass( this ), stateVal ),
|
||||||
|
stateVal
|
||||||
|
);
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.each( function() {
|
||||||
|
var className, i, self, classNames;
|
||||||
|
|
||||||
|
if ( type === "string" ) {
|
||||||
|
|
||||||
|
// Toggle individual class names
|
||||||
|
i = 0;
|
||||||
|
self = jQuery( this );
|
||||||
|
classNames = value.match( rnotwhite ) || [];
|
||||||
|
|
||||||
|
while ( ( className = classNames[ i++ ] ) ) {
|
||||||
|
|
||||||
|
// Check each className given, space separated list
|
||||||
|
if ( self.hasClass( className ) ) {
|
||||||
|
self.removeClass( className );
|
||||||
|
} else {
|
||||||
|
self.addClass( className );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Toggle whole class name
|
||||||
|
} else if ( value === undefined || type === "boolean" ) {
|
||||||
|
className = getClass( this );
|
||||||
|
if ( className ) {
|
||||||
|
|
||||||
|
// Store className if set
|
||||||
|
dataPriv.set( this, "__className__", className );
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the element has a class name or if we're passed `false`,
|
||||||
|
// then remove the whole classname (if there was one, the above saved it).
|
||||||
|
// Otherwise bring back whatever was previously saved (if anything),
|
||||||
|
// falling back to the empty string if nothing was stored.
|
||||||
|
if ( this.setAttribute ) {
|
||||||
|
this.setAttribute( "class",
|
||||||
|
className || value === false ?
|
||||||
|
"" :
|
||||||
|
dataPriv.get( this, "__className__" ) || ""
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
},
|
||||||
|
|
||||||
|
hasClass: function( selector ) {
|
||||||
|
var className, elem,
|
||||||
|
i = 0;
|
||||||
|
|
||||||
|
className = " " + selector + " ";
|
||||||
|
while ( ( elem = this[ i++ ] ) ) {
|
||||||
|
if ( elem.nodeType === 1 &&
|
||||||
|
( " " + getClass( elem ) + " " ).replace( rclass, " " )
|
||||||
|
.indexOf( className ) > -1
|
||||||
|
) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
|
||||||
|
} );
|
||||||
125
TaxCalculator/bower_components/jquery/src/attributes/prop.js
vendored
Normal file
125
TaxCalculator/bower_components/jquery/src/attributes/prop.js
vendored
Normal file
@ -0,0 +1,125 @@
|
|||||||
|
define( [
|
||||||
|
"../core",
|
||||||
|
"../core/access",
|
||||||
|
"./support",
|
||||||
|
"../selector"
|
||||||
|
], function( jQuery, access, support ) {
|
||||||
|
|
||||||
|
var rfocusable = /^(?:input|select|textarea|button)$/i,
|
||||||
|
rclickable = /^(?:a|area)$/i;
|
||||||
|
|
||||||
|
jQuery.fn.extend( {
|
||||||
|
prop: function( name, value ) {
|
||||||
|
return access( this, jQuery.prop, name, value, arguments.length > 1 );
|
||||||
|
},
|
||||||
|
|
||||||
|
removeProp: function( name ) {
|
||||||
|
return this.each( function() {
|
||||||
|
delete this[ jQuery.propFix[ name ] || name ];
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
|
||||||
|
jQuery.extend( {
|
||||||
|
prop: function( elem, name, value ) {
|
||||||
|
var ret, hooks,
|
||||||
|
nType = elem.nodeType;
|
||||||
|
|
||||||
|
// Don't get/set properties on text, comment and attribute nodes
|
||||||
|
if ( nType === 3 || nType === 8 || nType === 2 ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
|
||||||
|
|
||||||
|
// Fix name and attach hooks
|
||||||
|
name = jQuery.propFix[ name ] || name;
|
||||||
|
hooks = jQuery.propHooks[ name ];
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( value !== undefined ) {
|
||||||
|
if ( hooks && "set" in hooks &&
|
||||||
|
( ret = hooks.set( elem, value, name ) ) !== undefined ) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ( elem[ name ] = value );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
return elem[ name ];
|
||||||
|
},
|
||||||
|
|
||||||
|
propHooks: {
|
||||||
|
tabIndex: {
|
||||||
|
get: function( elem ) {
|
||||||
|
|
||||||
|
// elem.tabIndex doesn't always return the
|
||||||
|
// correct value when it hasn't been explicitly set
|
||||||
|
// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
|
||||||
|
// Use proper attribute retrieval(#12072)
|
||||||
|
var tabindex = jQuery.find.attr( elem, "tabindex" );
|
||||||
|
|
||||||
|
return tabindex ?
|
||||||
|
parseInt( tabindex, 10 ) :
|
||||||
|
rfocusable.test( elem.nodeName ) ||
|
||||||
|
rclickable.test( elem.nodeName ) && elem.href ?
|
||||||
|
0 :
|
||||||
|
-1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
propFix: {
|
||||||
|
"for": "htmlFor",
|
||||||
|
"class": "className"
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
|
||||||
|
// Support: IE <=11 only
|
||||||
|
// Accessing the selectedIndex property
|
||||||
|
// forces the browser to respect setting selected
|
||||||
|
// on the option
|
||||||
|
// The getter ensures a default option is selected
|
||||||
|
// when in an optgroup
|
||||||
|
if ( !support.optSelected ) {
|
||||||
|
jQuery.propHooks.selected = {
|
||||||
|
get: function( elem ) {
|
||||||
|
var parent = elem.parentNode;
|
||||||
|
if ( parent && parent.parentNode ) {
|
||||||
|
parent.parentNode.selectedIndex;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
},
|
||||||
|
set: function( elem ) {
|
||||||
|
var parent = elem.parentNode;
|
||||||
|
if ( parent ) {
|
||||||
|
parent.selectedIndex;
|
||||||
|
|
||||||
|
if ( parent.parentNode ) {
|
||||||
|
parent.parentNode.selectedIndex;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
jQuery.each( [
|
||||||
|
"tabIndex",
|
||||||
|
"readOnly",
|
||||||
|
"maxLength",
|
||||||
|
"cellSpacing",
|
||||||
|
"cellPadding",
|
||||||
|
"rowSpan",
|
||||||
|
"colSpan",
|
||||||
|
"useMap",
|
||||||
|
"frameBorder",
|
||||||
|
"contentEditable"
|
||||||
|
], function() {
|
||||||
|
jQuery.propFix[ this.toLowerCase() ] = this;
|
||||||
|
} );
|
||||||
|
|
||||||
|
} );
|
||||||
36
TaxCalculator/bower_components/jquery/src/attributes/support.js
vendored
Normal file
36
TaxCalculator/bower_components/jquery/src/attributes/support.js
vendored
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
define( [
|
||||||
|
"../var/document",
|
||||||
|
"../var/support"
|
||||||
|
], function( document, support ) {
|
||||||
|
|
||||||
|
( function() {
|
||||||
|
var input = document.createElement( "input" ),
|
||||||
|
select = document.createElement( "select" ),
|
||||||
|
opt = select.appendChild( document.createElement( "option" ) );
|
||||||
|
|
||||||
|
input.type = "checkbox";
|
||||||
|
|
||||||
|
// Support: iOS<=5.1, Android<=4.2+
|
||||||
|
// Default value for a checkbox should be "on"
|
||||||
|
support.checkOn = input.value !== "";
|
||||||
|
|
||||||
|
// Support: IE<=11+
|
||||||
|
// Must access selectedIndex to make default options select
|
||||||
|
support.optSelected = opt.selected;
|
||||||
|
|
||||||
|
// Support: Android<=2.3
|
||||||
|
// Options inside disabled selects are incorrectly marked as disabled
|
||||||
|
select.disabled = true;
|
||||||
|
support.optDisabled = !opt.disabled;
|
||||||
|
|
||||||
|
// Support: IE<=11+
|
||||||
|
// An input loses its value after becoming a radio
|
||||||
|
input = document.createElement( "input" );
|
||||||
|
input.value = "t";
|
||||||
|
input.type = "radio";
|
||||||
|
support.radioValue = input.value === "t";
|
||||||
|
} )();
|
||||||
|
|
||||||
|
return support;
|
||||||
|
|
||||||
|
} );
|
||||||
177
TaxCalculator/bower_components/jquery/src/attributes/val.js
vendored
Normal file
177
TaxCalculator/bower_components/jquery/src/attributes/val.js
vendored
Normal file
@ -0,0 +1,177 @@
|
|||||||
|
define( [
|
||||||
|
"../core",
|
||||||
|
"./support",
|
||||||
|
"../core/init"
|
||||||
|
], function( jQuery, support ) {
|
||||||
|
|
||||||
|
var rreturn = /\r/g,
|
||||||
|
rspaces = /[\x20\t\r\n\f]+/g;
|
||||||
|
|
||||||
|
jQuery.fn.extend( {
|
||||||
|
val: function( value ) {
|
||||||
|
var hooks, ret, isFunction,
|
||||||
|
elem = this[ 0 ];
|
||||||
|
|
||||||
|
if ( !arguments.length ) {
|
||||||
|
if ( elem ) {
|
||||||
|
hooks = jQuery.valHooks[ elem.type ] ||
|
||||||
|
jQuery.valHooks[ elem.nodeName.toLowerCase() ];
|
||||||
|
|
||||||
|
if ( hooks &&
|
||||||
|
"get" in hooks &&
|
||||||
|
( ret = hooks.get( elem, "value" ) ) !== undefined
|
||||||
|
) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = elem.value;
|
||||||
|
|
||||||
|
return typeof ret === "string" ?
|
||||||
|
|
||||||
|
// Handle most common string cases
|
||||||
|
ret.replace( rreturn, "" ) :
|
||||||
|
|
||||||
|
// Handle cases where value is null/undef or number
|
||||||
|
ret == null ? "" : ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
isFunction = jQuery.isFunction( value );
|
||||||
|
|
||||||
|
return this.each( function( i ) {
|
||||||
|
var val;
|
||||||
|
|
||||||
|
if ( this.nodeType !== 1 ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( isFunction ) {
|
||||||
|
val = value.call( this, i, jQuery( this ).val() );
|
||||||
|
} else {
|
||||||
|
val = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Treat null/undefined as ""; convert numbers to string
|
||||||
|
if ( val == null ) {
|
||||||
|
val = "";
|
||||||
|
|
||||||
|
} else if ( typeof val === "number" ) {
|
||||||
|
val += "";
|
||||||
|
|
||||||
|
} else if ( jQuery.isArray( val ) ) {
|
||||||
|
val = jQuery.map( val, function( value ) {
|
||||||
|
return value == null ? "" : value + "";
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
|
||||||
|
hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
|
||||||
|
|
||||||
|
// If set returns undefined, fall back to normal setting
|
||||||
|
if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) {
|
||||||
|
this.value = val;
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
|
||||||
|
jQuery.extend( {
|
||||||
|
valHooks: {
|
||||||
|
option: {
|
||||||
|
get: function( elem ) {
|
||||||
|
|
||||||
|
var val = jQuery.find.attr( elem, "value" );
|
||||||
|
return val != null ?
|
||||||
|
val :
|
||||||
|
|
||||||
|
// Support: IE10-11+
|
||||||
|
// option.text throws exceptions (#14686, #14858)
|
||||||
|
// Strip and collapse whitespace
|
||||||
|
// https://html.spec.whatwg.org/#strip-and-collapse-whitespace
|
||||||
|
jQuery.trim( jQuery.text( elem ) ).replace( rspaces, " " );
|
||||||
|
}
|
||||||
|
},
|
||||||
|
select: {
|
||||||
|
get: function( elem ) {
|
||||||
|
var value, option,
|
||||||
|
options = elem.options,
|
||||||
|
index = elem.selectedIndex,
|
||||||
|
one = elem.type === "select-one" || index < 0,
|
||||||
|
values = one ? null : [],
|
||||||
|
max = one ? index + 1 : options.length,
|
||||||
|
i = index < 0 ?
|
||||||
|
max :
|
||||||
|
one ? index : 0;
|
||||||
|
|
||||||
|
// Loop through all the selected options
|
||||||
|
for ( ; i < max; i++ ) {
|
||||||
|
option = options[ i ];
|
||||||
|
|
||||||
|
// IE8-9 doesn't update selected after form reset (#2551)
|
||||||
|
if ( ( option.selected || i === index ) &&
|
||||||
|
|
||||||
|
// Don't return options that are disabled or in a disabled optgroup
|
||||||
|
( support.optDisabled ?
|
||||||
|
!option.disabled : option.getAttribute( "disabled" ) === null ) &&
|
||||||
|
( !option.parentNode.disabled ||
|
||||||
|
!jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {
|
||||||
|
|
||||||
|
// Get the specific value for the option
|
||||||
|
value = jQuery( option ).val();
|
||||||
|
|
||||||
|
// We don't need an array for one selects
|
||||||
|
if ( one ) {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Multi-Selects return an array
|
||||||
|
values.push( value );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return values;
|
||||||
|
},
|
||||||
|
|
||||||
|
set: function( elem, value ) {
|
||||||
|
var optionSet, option,
|
||||||
|
options = elem.options,
|
||||||
|
values = jQuery.makeArray( value ),
|
||||||
|
i = options.length;
|
||||||
|
|
||||||
|
while ( i-- ) {
|
||||||
|
option = options[ i ];
|
||||||
|
if ( option.selected =
|
||||||
|
jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1
|
||||||
|
) {
|
||||||
|
optionSet = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Force browsers to behave consistently when non-matching value is set
|
||||||
|
if ( !optionSet ) {
|
||||||
|
elem.selectedIndex = -1;
|
||||||
|
}
|
||||||
|
return values;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
|
||||||
|
// Radios and checkboxes getter/setter
|
||||||
|
jQuery.each( [ "radio", "checkbox" ], function() {
|
||||||
|
jQuery.valHooks[ this ] = {
|
||||||
|
set: function( elem, value ) {
|
||||||
|
if ( jQuery.isArray( value ) ) {
|
||||||
|
return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
if ( !support.checkOn ) {
|
||||||
|
jQuery.valHooks[ this ].get = function( elem ) {
|
||||||
|
return elem.getAttribute( "value" ) === null ? "on" : elem.value;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
|
||||||
|
} );
|
||||||
232
TaxCalculator/bower_components/jquery/src/callbacks.js
vendored
Normal file
232
TaxCalculator/bower_components/jquery/src/callbacks.js
vendored
Normal file
@ -0,0 +1,232 @@
|
|||||||
|
define( [
|
||||||
|
"./core",
|
||||||
|
"./var/rnotwhite"
|
||||||
|
], function( jQuery, rnotwhite ) {
|
||||||
|
|
||||||
|
// Convert String-formatted options into Object-formatted ones
|
||||||
|
function createOptions( options ) {
|
||||||
|
var object = {};
|
||||||
|
jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) {
|
||||||
|
object[ flag ] = true;
|
||||||
|
} );
|
||||||
|
return object;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Create a callback list using the following parameters:
|
||||||
|
*
|
||||||
|
* options: an optional list of space-separated options that will change how
|
||||||
|
* the callback list behaves or a more traditional option object
|
||||||
|
*
|
||||||
|
* By default a callback list will act like an event callback list and can be
|
||||||
|
* "fired" multiple times.
|
||||||
|
*
|
||||||
|
* Possible options:
|
||||||
|
*
|
||||||
|
* once: will ensure the callback list can only be fired once (like a Deferred)
|
||||||
|
*
|
||||||
|
* memory: will keep track of previous values and will call any callback added
|
||||||
|
* after the list has been fired right away with the latest "memorized"
|
||||||
|
* values (like a Deferred)
|
||||||
|
*
|
||||||
|
* unique: will ensure a callback can only be added once (no duplicate in the list)
|
||||||
|
*
|
||||||
|
* stopOnFalse: interrupt callings when a callback returns false
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
jQuery.Callbacks = function( options ) {
|
||||||
|
|
||||||
|
// Convert options from String-formatted to Object-formatted if needed
|
||||||
|
// (we check in cache first)
|
||||||
|
options = typeof options === "string" ?
|
||||||
|
createOptions( options ) :
|
||||||
|
jQuery.extend( {}, options );
|
||||||
|
|
||||||
|
var // Flag to know if list is currently firing
|
||||||
|
firing,
|
||||||
|
|
||||||
|
// Last fire value for non-forgettable lists
|
||||||
|
memory,
|
||||||
|
|
||||||
|
// Flag to know if list was already fired
|
||||||
|
fired,
|
||||||
|
|
||||||
|
// Flag to prevent firing
|
||||||
|
locked,
|
||||||
|
|
||||||
|
// Actual callback list
|
||||||
|
list = [],
|
||||||
|
|
||||||
|
// Queue of execution data for repeatable lists
|
||||||
|
queue = [],
|
||||||
|
|
||||||
|
// Index of currently firing callback (modified by add/remove as needed)
|
||||||
|
firingIndex = -1,
|
||||||
|
|
||||||
|
// Fire callbacks
|
||||||
|
fire = function() {
|
||||||
|
|
||||||
|
// Enforce single-firing
|
||||||
|
locked = options.once;
|
||||||
|
|
||||||
|
// Execute callbacks for all pending executions,
|
||||||
|
// respecting firingIndex overrides and runtime changes
|
||||||
|
fired = firing = true;
|
||||||
|
for ( ; queue.length; firingIndex = -1 ) {
|
||||||
|
memory = queue.shift();
|
||||||
|
while ( ++firingIndex < list.length ) {
|
||||||
|
|
||||||
|
// Run callback and check for early termination
|
||||||
|
if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&
|
||||||
|
options.stopOnFalse ) {
|
||||||
|
|
||||||
|
// Jump to end and forget the data so .add doesn't re-fire
|
||||||
|
firingIndex = list.length;
|
||||||
|
memory = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Forget the data if we're done with it
|
||||||
|
if ( !options.memory ) {
|
||||||
|
memory = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
firing = false;
|
||||||
|
|
||||||
|
// Clean up if we're done firing for good
|
||||||
|
if ( locked ) {
|
||||||
|
|
||||||
|
// Keep an empty list if we have data for future add calls
|
||||||
|
if ( memory ) {
|
||||||
|
list = [];
|
||||||
|
|
||||||
|
// Otherwise, this object is spent
|
||||||
|
} else {
|
||||||
|
list = "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// Actual Callbacks object
|
||||||
|
self = {
|
||||||
|
|
||||||
|
// Add a callback or a collection of callbacks to the list
|
||||||
|
add: function() {
|
||||||
|
if ( list ) {
|
||||||
|
|
||||||
|
// If we have memory from a past run, we should fire after adding
|
||||||
|
if ( memory && !firing ) {
|
||||||
|
firingIndex = list.length - 1;
|
||||||
|
queue.push( memory );
|
||||||
|
}
|
||||||
|
|
||||||
|
( function add( args ) {
|
||||||
|
jQuery.each( args, function( _, arg ) {
|
||||||
|
if ( jQuery.isFunction( arg ) ) {
|
||||||
|
if ( !options.unique || !self.has( arg ) ) {
|
||||||
|
list.push( arg );
|
||||||
|
}
|
||||||
|
} else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) {
|
||||||
|
|
||||||
|
// Inspect recursively
|
||||||
|
add( arg );
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
} )( arguments );
|
||||||
|
|
||||||
|
if ( memory && !firing ) {
|
||||||
|
fire();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
},
|
||||||
|
|
||||||
|
// Remove a callback from the list
|
||||||
|
remove: function() {
|
||||||
|
jQuery.each( arguments, function( _, arg ) {
|
||||||
|
var index;
|
||||||
|
while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
|
||||||
|
list.splice( index, 1 );
|
||||||
|
|
||||||
|
// Handle firing indexes
|
||||||
|
if ( index <= firingIndex ) {
|
||||||
|
firingIndex--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
return this;
|
||||||
|
},
|
||||||
|
|
||||||
|
// Check if a given callback is in the list.
|
||||||
|
// If no argument is given, return whether or not list has callbacks attached.
|
||||||
|
has: function( fn ) {
|
||||||
|
return fn ?
|
||||||
|
jQuery.inArray( fn, list ) > -1 :
|
||||||
|
list.length > 0;
|
||||||
|
},
|
||||||
|
|
||||||
|
// Remove all callbacks from the list
|
||||||
|
empty: function() {
|
||||||
|
if ( list ) {
|
||||||
|
list = [];
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
},
|
||||||
|
|
||||||
|
// Disable .fire and .add
|
||||||
|
// Abort any current/pending executions
|
||||||
|
// Clear all callbacks and values
|
||||||
|
disable: function() {
|
||||||
|
locked = queue = [];
|
||||||
|
list = memory = "";
|
||||||
|
return this;
|
||||||
|
},
|
||||||
|
disabled: function() {
|
||||||
|
return !list;
|
||||||
|
},
|
||||||
|
|
||||||
|
// Disable .fire
|
||||||
|
// Also disable .add unless we have memory (since it would have no effect)
|
||||||
|
// Abort any pending executions
|
||||||
|
lock: function() {
|
||||||
|
locked = queue = [];
|
||||||
|
if ( !memory ) {
|
||||||
|
list = memory = "";
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
},
|
||||||
|
locked: function() {
|
||||||
|
return !!locked;
|
||||||
|
},
|
||||||
|
|
||||||
|
// Call all callbacks with the given context and arguments
|
||||||
|
fireWith: function( context, args ) {
|
||||||
|
if ( !locked ) {
|
||||||
|
args = args || [];
|
||||||
|
args = [ context, args.slice ? args.slice() : args ];
|
||||||
|
queue.push( args );
|
||||||
|
if ( !firing ) {
|
||||||
|
fire();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
},
|
||||||
|
|
||||||
|
// Call all the callbacks with the given arguments
|
||||||
|
fire: function() {
|
||||||
|
self.fireWith( this, arguments );
|
||||||
|
return this;
|
||||||
|
},
|
||||||
|
|
||||||
|
// To know if the callbacks have already been called at least once
|
||||||
|
fired: function() {
|
||||||
|
return !!fired;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
return self;
|
||||||
|
};
|
||||||
|
|
||||||
|
return jQuery;
|
||||||
|
} );
|
||||||
494
TaxCalculator/bower_components/jquery/src/core.js
vendored
Normal file
494
TaxCalculator/bower_components/jquery/src/core.js
vendored
Normal file
@ -0,0 +1,494 @@
|
|||||||
|
define( [
|
||||||
|
"./var/arr",
|
||||||
|
"./var/document",
|
||||||
|
"./var/slice",
|
||||||
|
"./var/concat",
|
||||||
|
"./var/push",
|
||||||
|
"./var/indexOf",
|
||||||
|
"./var/class2type",
|
||||||
|
"./var/toString",
|
||||||
|
"./var/hasOwn",
|
||||||
|
"./var/support"
|
||||||
|
], function( arr, document, slice, concat, push, indexOf, class2type, toString, hasOwn, support ) {
|
||||||
|
|
||||||
|
var
|
||||||
|
version = "@VERSION",
|
||||||
|
|
||||||
|
// Define a local copy of jQuery
|
||||||
|
jQuery = function( selector, context ) {
|
||||||
|
|
||||||
|
// The jQuery object is actually just the init constructor 'enhanced'
|
||||||
|
// Need init if jQuery is called (just allow error to be thrown if not included)
|
||||||
|
return new jQuery.fn.init( selector, context );
|
||||||
|
},
|
||||||
|
|
||||||
|
// Support: Android<4.1
|
||||||
|
// Make sure we trim BOM and NBSP
|
||||||
|
rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
|
||||||
|
|
||||||
|
// Matches dashed string for camelizing
|
||||||
|
rmsPrefix = /^-ms-/,
|
||||||
|
rdashAlpha = /-([\da-z])/gi,
|
||||||
|
|
||||||
|
// Used by jQuery.camelCase as callback to replace()
|
||||||
|
fcamelCase = function( all, letter ) {
|
||||||
|
return letter.toUpperCase();
|
||||||
|
};
|
||||||
|
|
||||||
|
jQuery.fn = jQuery.prototype = {
|
||||||
|
|
||||||
|
// The current version of jQuery being used
|
||||||
|
jquery: version,
|
||||||
|
|
||||||
|
constructor: jQuery,
|
||||||
|
|
||||||
|
// Start with an empty selector
|
||||||
|
selector: "",
|
||||||
|
|
||||||
|
// The default length of a jQuery object is 0
|
||||||
|
length: 0,
|
||||||
|
|
||||||
|
toArray: function() {
|
||||||
|
return slice.call( this );
|
||||||
|
},
|
||||||
|
|
||||||
|
// Get the Nth element in the matched element set OR
|
||||||
|
// Get the whole matched element set as a clean array
|
||||||
|
get: function( num ) {
|
||||||
|
return num != null ?
|
||||||
|
|
||||||
|
// Return just the one element from the set
|
||||||
|
( num < 0 ? this[ num + this.length ] : this[ num ] ) :
|
||||||
|
|
||||||
|
// Return all the elements in a clean array
|
||||||
|
slice.call( this );
|
||||||
|
},
|
||||||
|
|
||||||
|
// Take an array of elements and push it onto the stack
|
||||||
|
// (returning the new matched element set)
|
||||||
|
pushStack: function( elems ) {
|
||||||
|
|
||||||
|
// Build a new jQuery matched element set
|
||||||
|
var ret = jQuery.merge( this.constructor(), elems );
|
||||||
|
|
||||||
|
// Add the old object onto the stack (as a reference)
|
||||||
|
ret.prevObject = this;
|
||||||
|
ret.context = this.context;
|
||||||
|
|
||||||
|
// Return the newly-formed element set
|
||||||
|
return ret;
|
||||||
|
},
|
||||||
|
|
||||||
|
// Execute a callback for every element in the matched set.
|
||||||
|
each: function( callback ) {
|
||||||
|
return jQuery.each( this, callback );
|
||||||
|
},
|
||||||
|
|
||||||
|
map: function( callback ) {
|
||||||
|
return this.pushStack( jQuery.map( this, function( elem, i ) {
|
||||||
|
return callback.call( elem, i, elem );
|
||||||
|
} ) );
|
||||||
|
},
|
||||||
|
|
||||||
|
slice: function() {
|
||||||
|
return this.pushStack( slice.apply( this, arguments ) );
|
||||||
|
},
|
||||||
|
|
||||||
|
first: function() {
|
||||||
|
return this.eq( 0 );
|
||||||
|
},
|
||||||
|
|
||||||
|
last: function() {
|
||||||
|
return this.eq( -1 );
|
||||||
|
},
|
||||||
|
|
||||||
|
eq: function( i ) {
|
||||||
|
var len = this.length,
|
||||||
|
j = +i + ( i < 0 ? len : 0 );
|
||||||
|
return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );
|
||||||
|
},
|
||||||
|
|
||||||
|
end: function() {
|
||||||
|
return this.prevObject || this.constructor();
|
||||||
|
},
|
||||||
|
|
||||||
|
// For internal use only.
|
||||||
|
// Behaves like an Array's method, not like a jQuery method.
|
||||||
|
push: push,
|
||||||
|
sort: arr.sort,
|
||||||
|
splice: arr.splice
|
||||||
|
};
|
||||||
|
|
||||||
|
jQuery.extend = jQuery.fn.extend = function() {
|
||||||
|
var options, name, src, copy, copyIsArray, clone,
|
||||||
|
target = arguments[ 0 ] || {},
|
||||||
|
i = 1,
|
||||||
|
length = arguments.length,
|
||||||
|
deep = false;
|
||||||
|
|
||||||
|
// Handle a deep copy situation
|
||||||
|
if ( typeof target === "boolean" ) {
|
||||||
|
deep = target;
|
||||||
|
|
||||||
|
// Skip the boolean and the target
|
||||||
|
target = arguments[ i ] || {};
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle case when target is a string or something (possible in deep copy)
|
||||||
|
if ( typeof target !== "object" && !jQuery.isFunction( target ) ) {
|
||||||
|
target = {};
|
||||||
|
}
|
||||||
|
|
||||||
|
// Extend jQuery itself if only one argument is passed
|
||||||
|
if ( i === length ) {
|
||||||
|
target = this;
|
||||||
|
i--;
|
||||||
|
}
|
||||||
|
|
||||||
|
for ( ; i < length; i++ ) {
|
||||||
|
|
||||||
|
// Only deal with non-null/undefined values
|
||||||
|
if ( ( options = arguments[ i ] ) != null ) {
|
||||||
|
|
||||||
|
// Extend the base object
|
||||||
|
for ( name in options ) {
|
||||||
|
src = target[ name ];
|
||||||
|
copy = options[ name ];
|
||||||
|
|
||||||
|
// Prevent never-ending loop
|
||||||
|
if ( target === copy ) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Recurse if we're merging plain objects or arrays
|
||||||
|
if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
|
||||||
|
( copyIsArray = jQuery.isArray( copy ) ) ) ) {
|
||||||
|
|
||||||
|
if ( copyIsArray ) {
|
||||||
|
copyIsArray = false;
|
||||||
|
clone = src && jQuery.isArray( src ) ? src : [];
|
||||||
|
|
||||||
|
} else {
|
||||||
|
clone = src && jQuery.isPlainObject( src ) ? src : {};
|
||||||
|
}
|
||||||
|
|
||||||
|
// Never move original objects, clone them
|
||||||
|
target[ name ] = jQuery.extend( deep, clone, copy );
|
||||||
|
|
||||||
|
// Don't bring in undefined values
|
||||||
|
} else if ( copy !== undefined ) {
|
||||||
|
target[ name ] = copy;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return the modified object
|
||||||
|
return target;
|
||||||
|
};
|
||||||
|
|
||||||
|
jQuery.extend( {
|
||||||
|
|
||||||
|
// Unique for each copy of jQuery on the page
|
||||||
|
expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
|
||||||
|
|
||||||
|
// Assume jQuery is ready without the ready module
|
||||||
|
isReady: true,
|
||||||
|
|
||||||
|
error: function( msg ) {
|
||||||
|
throw new Error( msg );
|
||||||
|
},
|
||||||
|
|
||||||
|
noop: function() {},
|
||||||
|
|
||||||
|
isFunction: function( obj ) {
|
||||||
|
return jQuery.type( obj ) === "function";
|
||||||
|
},
|
||||||
|
|
||||||
|
isArray: Array.isArray,
|
||||||
|
|
||||||
|
isWindow: function( obj ) {
|
||||||
|
return obj != null && obj === obj.window;
|
||||||
|
},
|
||||||
|
|
||||||
|
isNumeric: function( obj ) {
|
||||||
|
|
||||||
|
// parseFloat NaNs numeric-cast false positives (null|true|false|"")
|
||||||
|
// ...but misinterprets leading-number strings, particularly hex literals ("0x...")
|
||||||
|
// subtraction forces infinities to NaN
|
||||||
|
// adding 1 corrects loss of precision from parseFloat (#15100)
|
||||||
|
var realStringObj = obj && obj.toString();
|
||||||
|
return !jQuery.isArray( obj ) && ( realStringObj - parseFloat( realStringObj ) + 1 ) >= 0;
|
||||||
|
},
|
||||||
|
|
||||||
|
isPlainObject: function( obj ) {
|
||||||
|
var key;
|
||||||
|
|
||||||
|
// Not plain objects:
|
||||||
|
// - Any object or value whose internal [[Class]] property is not "[object Object]"
|
||||||
|
// - DOM nodes
|
||||||
|
// - window
|
||||||
|
if ( jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Not own constructor property must be Object
|
||||||
|
if ( obj.constructor &&
|
||||||
|
!hasOwn.call( obj, "constructor" ) &&
|
||||||
|
!hasOwn.call( obj.constructor.prototype || {}, "isPrototypeOf" ) ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Own properties are enumerated firstly, so to speed up,
|
||||||
|
// if last one is own, then all properties are own
|
||||||
|
for ( key in obj ) {}
|
||||||
|
|
||||||
|
return key === undefined || hasOwn.call( obj, key );
|
||||||
|
},
|
||||||
|
|
||||||
|
isEmptyObject: function( obj ) {
|
||||||
|
var name;
|
||||||
|
for ( name in obj ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
|
||||||
|
type: function( obj ) {
|
||||||
|
if ( obj == null ) {
|
||||||
|
return obj + "";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Support: Android<4.0, iOS<6 (functionish RegExp)
|
||||||
|
return typeof obj === "object" || typeof obj === "function" ?
|
||||||
|
class2type[ toString.call( obj ) ] || "object" :
|
||||||
|
typeof obj;
|
||||||
|
},
|
||||||
|
|
||||||
|
// Evaluates a script in a global context
|
||||||
|
globalEval: function( code ) {
|
||||||
|
var script,
|
||||||
|
indirect = eval;
|
||||||
|
|
||||||
|
code = jQuery.trim( code );
|
||||||
|
|
||||||
|
if ( code ) {
|
||||||
|
|
||||||
|
// If the code includes a valid, prologue position
|
||||||
|
// strict mode pragma, execute code by injecting a
|
||||||
|
// script tag into the document.
|
||||||
|
if ( code.indexOf( "use strict" ) === 1 ) {
|
||||||
|
script = document.createElement( "script" );
|
||||||
|
script.text = code;
|
||||||
|
document.head.appendChild( script ).parentNode.removeChild( script );
|
||||||
|
} else {
|
||||||
|
|
||||||
|
// Otherwise, avoid the DOM node creation, insertion
|
||||||
|
// and removal by using an indirect global eval
|
||||||
|
|
||||||
|
indirect( code );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// Convert dashed to camelCase; used by the css and data modules
|
||||||
|
// Support: IE9-11+
|
||||||
|
// Microsoft forgot to hump their vendor prefix (#9572)
|
||||||
|
camelCase: function( string ) {
|
||||||
|
return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
|
||||||
|
},
|
||||||
|
|
||||||
|
nodeName: function( elem, name ) {
|
||||||
|
return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
|
||||||
|
},
|
||||||
|
|
||||||
|
each: function( obj, callback ) {
|
||||||
|
var length, i = 0;
|
||||||
|
|
||||||
|
if ( isArrayLike( obj ) ) {
|
||||||
|
length = obj.length;
|
||||||
|
for ( ; i < length; i++ ) {
|
||||||
|
if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for ( i in obj ) {
|
||||||
|
if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return obj;
|
||||||
|
},
|
||||||
|
|
||||||
|
// Support: Android<4.1
|
||||||
|
trim: function( text ) {
|
||||||
|
return text == null ?
|
||||||
|
"" :
|
||||||
|
( text + "" ).replace( rtrim, "" );
|
||||||
|
},
|
||||||
|
|
||||||
|
// results is for internal usage only
|
||||||
|
makeArray: function( arr, results ) {
|
||||||
|
var ret = results || [];
|
||||||
|
|
||||||
|
if ( arr != null ) {
|
||||||
|
if ( isArrayLike( Object( arr ) ) ) {
|
||||||
|
jQuery.merge( ret,
|
||||||
|
typeof arr === "string" ?
|
||||||
|
[ arr ] : arr
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
push.call( ret, arr );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
},
|
||||||
|
|
||||||
|
inArray: function( elem, arr, i ) {
|
||||||
|
return arr == null ? -1 : indexOf.call( arr, elem, i );
|
||||||
|
},
|
||||||
|
|
||||||
|
merge: function( first, second ) {
|
||||||
|
var len = +second.length,
|
||||||
|
j = 0,
|
||||||
|
i = first.length;
|
||||||
|
|
||||||
|
for ( ; j < len; j++ ) {
|
||||||
|
first[ i++ ] = second[ j ];
|
||||||
|
}
|
||||||
|
|
||||||
|
first.length = i;
|
||||||
|
|
||||||
|
return first;
|
||||||
|
},
|
||||||
|
|
||||||
|
grep: function( elems, callback, invert ) {
|
||||||
|
var callbackInverse,
|
||||||
|
matches = [],
|
||||||
|
i = 0,
|
||||||
|
length = elems.length,
|
||||||
|
callbackExpect = !invert;
|
||||||
|
|
||||||
|
// Go through the array, only saving the items
|
||||||
|
// that pass the validator function
|
||||||
|
for ( ; i < length; i++ ) {
|
||||||
|
callbackInverse = !callback( elems[ i ], i );
|
||||||
|
if ( callbackInverse !== callbackExpect ) {
|
||||||
|
matches.push( elems[ i ] );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return matches;
|
||||||
|
},
|
||||||
|
|
||||||
|
// arg is for internal usage only
|
||||||
|
map: function( elems, callback, arg ) {
|
||||||
|
var length, value,
|
||||||
|
i = 0,
|
||||||
|
ret = [];
|
||||||
|
|
||||||
|
// Go through the array, translating each of the items to their new values
|
||||||
|
if ( isArrayLike( elems ) ) {
|
||||||
|
length = elems.length;
|
||||||
|
for ( ; i < length; i++ ) {
|
||||||
|
value = callback( elems[ i ], i, arg );
|
||||||
|
|
||||||
|
if ( value != null ) {
|
||||||
|
ret.push( value );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Go through every key on the object,
|
||||||
|
} else {
|
||||||
|
for ( i in elems ) {
|
||||||
|
value = callback( elems[ i ], i, arg );
|
||||||
|
|
||||||
|
if ( value != null ) {
|
||||||
|
ret.push( value );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Flatten any nested arrays
|
||||||
|
return concat.apply( [], ret );
|
||||||
|
},
|
||||||
|
|
||||||
|
// A global GUID counter for objects
|
||||||
|
guid: 1,
|
||||||
|
|
||||||
|
// Bind a function to a context, optionally partially applying any
|
||||||
|
// arguments.
|
||||||
|
proxy: function( fn, context ) {
|
||||||
|
var tmp, args, proxy;
|
||||||
|
|
||||||
|
if ( typeof context === "string" ) {
|
||||||
|
tmp = fn[ context ];
|
||||||
|
context = fn;
|
||||||
|
fn = tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Quick check to determine if target is callable, in the spec
|
||||||
|
// this throws a TypeError, but we will just return undefined.
|
||||||
|
if ( !jQuery.isFunction( fn ) ) {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Simulated bind
|
||||||
|
args = slice.call( arguments, 2 );
|
||||||
|
proxy = function() {
|
||||||
|
return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
|
||||||
|
};
|
||||||
|
|
||||||
|
// Set the guid of unique handler to the same of original handler, so it can be removed
|
||||||
|
proxy.guid = fn.guid = fn.guid || jQuery.guid++;
|
||||||
|
|
||||||
|
return proxy;
|
||||||
|
},
|
||||||
|
|
||||||
|
now: Date.now,
|
||||||
|
|
||||||
|
// jQuery.support is not used in Core but other projects attach their
|
||||||
|
// properties to it so it needs to exist.
|
||||||
|
support: support
|
||||||
|
} );
|
||||||
|
|
||||||
|
// JSHint would error on this code due to the Symbol not being defined in ES5.
|
||||||
|
// Defining this global in .jshintrc would create a danger of using the global
|
||||||
|
// unguarded in another place, it seems safer to just disable JSHint for these
|
||||||
|
// three lines.
|
||||||
|
/* jshint ignore: start */
|
||||||
|
if ( typeof Symbol === "function" ) {
|
||||||
|
jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];
|
||||||
|
}
|
||||||
|
/* jshint ignore: end */
|
||||||
|
|
||||||
|
// Populate the class2type map
|
||||||
|
jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
|
||||||
|
function( i, name ) {
|
||||||
|
class2type[ "[object " + name + "]" ] = name.toLowerCase();
|
||||||
|
} );
|
||||||
|
|
||||||
|
function isArrayLike( obj ) {
|
||||||
|
|
||||||
|
// Support: iOS 8.2 (not reproducible in simulator)
|
||||||
|
// `in` check used to prevent JIT error (gh-2145)
|
||||||
|
// hasOwn isn't used here due to false negatives
|
||||||
|
// regarding Nodelist length in IE
|
||||||
|
var length = !!obj && "length" in obj && obj.length,
|
||||||
|
type = jQuery.type( obj );
|
||||||
|
|
||||||
|
if ( type === "function" || jQuery.isWindow( obj ) ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return type === "array" || length === 0 ||
|
||||||
|
typeof length === "number" && length > 0 && ( length - 1 ) in obj;
|
||||||
|
}
|
||||||
|
|
||||||
|
return jQuery;
|
||||||
|
} );
|
||||||
65
TaxCalculator/bower_components/jquery/src/core/access.js
vendored
Normal file
65
TaxCalculator/bower_components/jquery/src/core/access.js
vendored
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
define( [
|
||||||
|
"../core"
|
||||||
|
], function( jQuery ) {
|
||||||
|
|
||||||
|
// Multifunctional method to get and set values of a collection
|
||||||
|
// The value/s can optionally be executed if it's a function
|
||||||
|
var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
|
||||||
|
var i = 0,
|
||||||
|
len = elems.length,
|
||||||
|
bulk = key == null;
|
||||||
|
|
||||||
|
// Sets many values
|
||||||
|
if ( jQuery.type( key ) === "object" ) {
|
||||||
|
chainable = true;
|
||||||
|
for ( i in key ) {
|
||||||
|
access( elems, fn, i, key[ i ], true, emptyGet, raw );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sets one value
|
||||||
|
} else if ( value !== undefined ) {
|
||||||
|
chainable = true;
|
||||||
|
|
||||||
|
if ( !jQuery.isFunction( value ) ) {
|
||||||
|
raw = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( bulk ) {
|
||||||
|
|
||||||
|
// Bulk operations run against the entire set
|
||||||
|
if ( raw ) {
|
||||||
|
fn.call( elems, value );
|
||||||
|
fn = null;
|
||||||
|
|
||||||
|
// ...except when executing function values
|
||||||
|
} else {
|
||||||
|
bulk = fn;
|
||||||
|
fn = function( elem, key, value ) {
|
||||||
|
return bulk.call( jQuery( elem ), value );
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( fn ) {
|
||||||
|
for ( ; i < len; i++ ) {
|
||||||
|
fn(
|
||||||
|
elems[ i ], key, raw ?
|
||||||
|
value :
|
||||||
|
value.call( elems[ i ], i, fn( elems[ i ], key ) )
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return chainable ?
|
||||||
|
elems :
|
||||||
|
|
||||||
|
// Gets
|
||||||
|
bulk ?
|
||||||
|
fn.call( elems ) :
|
||||||
|
len ? fn( elems[ 0 ], key ) : emptyGet;
|
||||||
|
};
|
||||||
|
|
||||||
|
return access;
|
||||||
|
|
||||||
|
} );
|
||||||
134
TaxCalculator/bower_components/jquery/src/core/init.js
vendored
Normal file
134
TaxCalculator/bower_components/jquery/src/core/init.js
vendored
Normal file
@ -0,0 +1,134 @@
|
|||||||
|
// Initialize a jQuery object
|
||||||
|
define( [
|
||||||
|
"../core",
|
||||||
|
"../var/document",
|
||||||
|
"./var/rsingleTag",
|
||||||
|
"../traversing/findFilter"
|
||||||
|
], function( jQuery, document, rsingleTag ) {
|
||||||
|
|
||||||
|
// A central reference to the root jQuery(document)
|
||||||
|
var rootjQuery,
|
||||||
|
|
||||||
|
// A simple way to check for HTML strings
|
||||||
|
// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
|
||||||
|
// Strict HTML recognition (#11290: must start with <)
|
||||||
|
rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,
|
||||||
|
|
||||||
|
init = jQuery.fn.init = function( selector, context, root ) {
|
||||||
|
var match, elem;
|
||||||
|
|
||||||
|
// HANDLE: $(""), $(null), $(undefined), $(false)
|
||||||
|
if ( !selector ) {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Method init() accepts an alternate rootjQuery
|
||||||
|
// so migrate can support jQuery.sub (gh-2101)
|
||||||
|
root = root || rootjQuery;
|
||||||
|
|
||||||
|
// Handle HTML strings
|
||||||
|
if ( typeof selector === "string" ) {
|
||||||
|
if ( selector[ 0 ] === "<" &&
|
||||||
|
selector[ selector.length - 1 ] === ">" &&
|
||||||
|
selector.length >= 3 ) {
|
||||||
|
|
||||||
|
// Assume that strings that start and end with <> are HTML and skip the regex check
|
||||||
|
match = [ null, selector, null ];
|
||||||
|
|
||||||
|
} else {
|
||||||
|
match = rquickExpr.exec( selector );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Match html or make sure no context is specified for #id
|
||||||
|
if ( match && ( match[ 1 ] || !context ) ) {
|
||||||
|
|
||||||
|
// HANDLE: $(html) -> $(array)
|
||||||
|
if ( match[ 1 ] ) {
|
||||||
|
context = context instanceof jQuery ? context[ 0 ] : context;
|
||||||
|
|
||||||
|
// Option to run scripts is true for back-compat
|
||||||
|
// Intentionally let the error be thrown if parseHTML is not present
|
||||||
|
jQuery.merge( this, jQuery.parseHTML(
|
||||||
|
match[ 1 ],
|
||||||
|
context && context.nodeType ? context.ownerDocument || context : document,
|
||||||
|
true
|
||||||
|
) );
|
||||||
|
|
||||||
|
// HANDLE: $(html, props)
|
||||||
|
if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {
|
||||||
|
for ( match in context ) {
|
||||||
|
|
||||||
|
// Properties of context are called as methods if possible
|
||||||
|
if ( jQuery.isFunction( this[ match ] ) ) {
|
||||||
|
this[ match ]( context[ match ] );
|
||||||
|
|
||||||
|
// ...and otherwise set as attributes
|
||||||
|
} else {
|
||||||
|
this.attr( match, context[ match ] );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return this;
|
||||||
|
|
||||||
|
// HANDLE: $(#id)
|
||||||
|
} else {
|
||||||
|
elem = document.getElementById( match[ 2 ] );
|
||||||
|
|
||||||
|
// Support: Blackberry 4.6
|
||||||
|
// gEBID returns nodes no longer in the document (#6963)
|
||||||
|
if ( elem && elem.parentNode ) {
|
||||||
|
|
||||||
|
// Inject the element directly into the jQuery object
|
||||||
|
this.length = 1;
|
||||||
|
this[ 0 ] = elem;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.context = document;
|
||||||
|
this.selector = selector;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
// HANDLE: $(expr, $(...))
|
||||||
|
} else if ( !context || context.jquery ) {
|
||||||
|
return ( context || root ).find( selector );
|
||||||
|
|
||||||
|
// HANDLE: $(expr, context)
|
||||||
|
// (which is just equivalent to: $(context).find(expr)
|
||||||
|
} else {
|
||||||
|
return this.constructor( context ).find( selector );
|
||||||
|
}
|
||||||
|
|
||||||
|
// HANDLE: $(DOMElement)
|
||||||
|
} else if ( selector.nodeType ) {
|
||||||
|
this.context = this[ 0 ] = selector;
|
||||||
|
this.length = 1;
|
||||||
|
return this;
|
||||||
|
|
||||||
|
// HANDLE: $(function)
|
||||||
|
// Shortcut for document ready
|
||||||
|
} else if ( jQuery.isFunction( selector ) ) {
|
||||||
|
return root.ready !== undefined ?
|
||||||
|
root.ready( selector ) :
|
||||||
|
|
||||||
|
// Execute immediately if ready is not present
|
||||||
|
selector( jQuery );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( selector.selector !== undefined ) {
|
||||||
|
this.selector = selector.selector;
|
||||||
|
this.context = selector.context;
|
||||||
|
}
|
||||||
|
|
||||||
|
return jQuery.makeArray( selector, this );
|
||||||
|
};
|
||||||
|
|
||||||
|
// Give the init function the jQuery prototype for later instantiation
|
||||||
|
init.prototype = jQuery.fn;
|
||||||
|
|
||||||
|
// Initialize central reference
|
||||||
|
rootjQuery = jQuery( document );
|
||||||
|
|
||||||
|
return init;
|
||||||
|
|
||||||
|
} );
|
||||||
41
TaxCalculator/bower_components/jquery/src/core/parseHTML.js
vendored
Normal file
41
TaxCalculator/bower_components/jquery/src/core/parseHTML.js
vendored
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
define( [
|
||||||
|
"../core",
|
||||||
|
"../var/document",
|
||||||
|
"./var/rsingleTag",
|
||||||
|
"../manipulation/buildFragment"
|
||||||
|
], function( jQuery, document, rsingleTag, buildFragment ) {
|
||||||
|
|
||||||
|
// Argument "data" should be string of html
|
||||||
|
// context (optional): If specified, the fragment will be created in this context,
|
||||||
|
// defaults to document
|
||||||
|
// keepScripts (optional): If true, will include scripts passed in the html string
|
||||||
|
jQuery.parseHTML = function( data, context, keepScripts ) {
|
||||||
|
if ( !data || typeof data !== "string" ) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if ( typeof context === "boolean" ) {
|
||||||
|
keepScripts = context;
|
||||||
|
context = false;
|
||||||
|
}
|
||||||
|
context = context || document;
|
||||||
|
|
||||||
|
var parsed = rsingleTag.exec( data ),
|
||||||
|
scripts = !keepScripts && [];
|
||||||
|
|
||||||
|
// Single tag
|
||||||
|
if ( parsed ) {
|
||||||
|
return [ context.createElement( parsed[ 1 ] ) ];
|
||||||
|
}
|
||||||
|
|
||||||
|
parsed = buildFragment( [ data ], context, scripts );
|
||||||
|
|
||||||
|
if ( scripts && scripts.length ) {
|
||||||
|
jQuery( scripts ).remove();
|
||||||
|
}
|
||||||
|
|
||||||
|
return jQuery.merge( [], parsed.childNodes );
|
||||||
|
};
|
||||||
|
|
||||||
|
return jQuery.parseHTML;
|
||||||
|
|
||||||
|
} );
|
||||||
103
TaxCalculator/bower_components/jquery/src/core/ready.js
vendored
Normal file
103
TaxCalculator/bower_components/jquery/src/core/ready.js
vendored
Normal file
@ -0,0 +1,103 @@
|
|||||||
|
define( [
|
||||||
|
"../core",
|
||||||
|
"../var/document",
|
||||||
|
"../core/init",
|
||||||
|
"../deferred"
|
||||||
|
], function( jQuery, document ) {
|
||||||
|
|
||||||
|
// The deferred used on DOM ready
|
||||||
|
var readyList;
|
||||||
|
|
||||||
|
jQuery.fn.ready = function( fn ) {
|
||||||
|
|
||||||
|
// Add the callback
|
||||||
|
jQuery.ready.promise().done( fn );
|
||||||
|
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
|
jQuery.extend( {
|
||||||
|
|
||||||
|
// Is the DOM ready to be used? Set to true once it occurs.
|
||||||
|
isReady: false,
|
||||||
|
|
||||||
|
// A counter to track how many items to wait for before
|
||||||
|
// the ready event fires. See #6781
|
||||||
|
readyWait: 1,
|
||||||
|
|
||||||
|
// Hold (or release) the ready event
|
||||||
|
holdReady: function( hold ) {
|
||||||
|
if ( hold ) {
|
||||||
|
jQuery.readyWait++;
|
||||||
|
} else {
|
||||||
|
jQuery.ready( true );
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// Handle when the DOM is ready
|
||||||
|
ready: function( wait ) {
|
||||||
|
|
||||||
|
// Abort if there are pending holds or we're already ready
|
||||||
|
if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remember that the DOM is ready
|
||||||
|
jQuery.isReady = true;
|
||||||
|
|
||||||
|
// If a normal DOM Ready event fired, decrement, and wait if need be
|
||||||
|
if ( wait !== true && --jQuery.readyWait > 0 ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If there are functions bound, to execute
|
||||||
|
readyList.resolveWith( document, [ jQuery ] );
|
||||||
|
|
||||||
|
// Trigger any bound ready events
|
||||||
|
if ( jQuery.fn.triggerHandler ) {
|
||||||
|
jQuery( document ).triggerHandler( "ready" );
|
||||||
|
jQuery( document ).off( "ready" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The ready event handler and self cleanup method
|
||||||
|
*/
|
||||||
|
function completed() {
|
||||||
|
document.removeEventListener( "DOMContentLoaded", completed );
|
||||||
|
window.removeEventListener( "load", completed );
|
||||||
|
jQuery.ready();
|
||||||
|
}
|
||||||
|
|
||||||
|
jQuery.ready.promise = function( obj ) {
|
||||||
|
if ( !readyList ) {
|
||||||
|
|
||||||
|
readyList = jQuery.Deferred();
|
||||||
|
|
||||||
|
// Catch cases where $(document).ready() is called
|
||||||
|
// after the browser event has already occurred.
|
||||||
|
// Support: IE9-10 only
|
||||||
|
// Older IE sometimes signals "interactive" too soon
|
||||||
|
if ( document.readyState === "complete" ||
|
||||||
|
( document.readyState !== "loading" && !document.documentElement.doScroll ) ) {
|
||||||
|
|
||||||
|
// Handle it asynchronously to allow scripts the opportunity to delay ready
|
||||||
|
window.setTimeout( jQuery.ready );
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
// Use the handy event callback
|
||||||
|
document.addEventListener( "DOMContentLoaded", completed );
|
||||||
|
|
||||||
|
// A fallback to window.onload, that will always work
|
||||||
|
window.addEventListener( "load", completed );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return readyList.promise( obj );
|
||||||
|
};
|
||||||
|
|
||||||
|
// Kick off the DOM ready check even if the user does not
|
||||||
|
jQuery.ready.promise();
|
||||||
|
|
||||||
|
} );
|
||||||
5
TaxCalculator/bower_components/jquery/src/core/var/rsingleTag.js
vendored
Normal file
5
TaxCalculator/bower_components/jquery/src/core/var/rsingleTag.js
vendored
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
define( function() {
|
||||||
|
|
||||||
|
// Match a standalone tag
|
||||||
|
return ( /^<([\w-]+)\s*\/?>(?:<\/\1>|)$/ );
|
||||||
|
} );
|
||||||
502
TaxCalculator/bower_components/jquery/src/css.js
vendored
Normal file
502
TaxCalculator/bower_components/jquery/src/css.js
vendored
Normal file
@ -0,0 +1,502 @@
|
|||||||
|
define( [
|
||||||
|
"./core",
|
||||||
|
"./var/pnum",
|
||||||
|
"./core/access",
|
||||||
|
"./css/var/rmargin",
|
||||||
|
"./var/document",
|
||||||
|
"./var/rcssNum",
|
||||||
|
"./css/var/rnumnonpx",
|
||||||
|
"./css/var/cssExpand",
|
||||||
|
"./css/var/isHidden",
|
||||||
|
"./css/var/getStyles",
|
||||||
|
"./css/var/swap",
|
||||||
|
"./css/curCSS",
|
||||||
|
"./css/adjustCSS",
|
||||||
|
"./css/defaultDisplay",
|
||||||
|
"./css/addGetHookIf",
|
||||||
|
"./css/support",
|
||||||
|
"./data/var/dataPriv",
|
||||||
|
|
||||||
|
"./core/init",
|
||||||
|
"./core/ready",
|
||||||
|
"./selector" // contains
|
||||||
|
], function( jQuery, pnum, access, rmargin, document, rcssNum, rnumnonpx, cssExpand, isHidden,
|
||||||
|
getStyles, swap, curCSS, adjustCSS, defaultDisplay, addGetHookIf, support, dataPriv ) {
|
||||||
|
|
||||||
|
var
|
||||||
|
|
||||||
|
// Swappable if display is none or starts with table
|
||||||
|
// except "table", "table-cell", or "table-caption"
|
||||||
|
// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
|
||||||
|
rdisplayswap = /^(none|table(?!-c[ea]).+)/,
|
||||||
|
|
||||||
|
cssShow = { position: "absolute", visibility: "hidden", display: "block" },
|
||||||
|
cssNormalTransform = {
|
||||||
|
letterSpacing: "0",
|
||||||
|
fontWeight: "400"
|
||||||
|
},
|
||||||
|
|
||||||
|
cssPrefixes = [ "Webkit", "O", "Moz", "ms" ],
|
||||||
|
emptyStyle = document.createElement( "div" ).style;
|
||||||
|
|
||||||
|
// Return a css property mapped to a potentially vendor prefixed property
|
||||||
|
function vendorPropName( name ) {
|
||||||
|
|
||||||
|
// Shortcut for names that are not vendor prefixed
|
||||||
|
if ( name in emptyStyle ) {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check for vendor prefixed names
|
||||||
|
var capName = name[ 0 ].toUpperCase() + name.slice( 1 ),
|
||||||
|
i = cssPrefixes.length;
|
||||||
|
|
||||||
|
while ( i-- ) {
|
||||||
|
name = cssPrefixes[ i ] + capName;
|
||||||
|
if ( name in emptyStyle ) {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function setPositiveNumber( elem, value, subtract ) {
|
||||||
|
|
||||||
|
// Any relative (+/-) values have already been
|
||||||
|
// normalized at this point
|
||||||
|
var matches = rcssNum.exec( value );
|
||||||
|
return matches ?
|
||||||
|
|
||||||
|
// Guard against undefined "subtract", e.g., when used as in cssHooks
|
||||||
|
Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) :
|
||||||
|
value;
|
||||||
|
}
|
||||||
|
|
||||||
|
function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
|
||||||
|
var i = extra === ( isBorderBox ? "border" : "content" ) ?
|
||||||
|
|
||||||
|
// If we already have the right measurement, avoid augmentation
|
||||||
|
4 :
|
||||||
|
|
||||||
|
// Otherwise initialize for horizontal or vertical properties
|
||||||
|
name === "width" ? 1 : 0,
|
||||||
|
|
||||||
|
val = 0;
|
||||||
|
|
||||||
|
for ( ; i < 4; i += 2 ) {
|
||||||
|
|
||||||
|
// Both box models exclude margin, so add it if we want it
|
||||||
|
if ( extra === "margin" ) {
|
||||||
|
val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( isBorderBox ) {
|
||||||
|
|
||||||
|
// border-box includes padding, so remove it if we want content
|
||||||
|
if ( extra === "content" ) {
|
||||||
|
val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
|
||||||
|
}
|
||||||
|
|
||||||
|
// At this point, extra isn't border nor margin, so remove border
|
||||||
|
if ( extra !== "margin" ) {
|
||||||
|
val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
|
||||||
|
// At this point, extra isn't content, so add padding
|
||||||
|
val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
|
||||||
|
|
||||||
|
// At this point, extra isn't content nor padding, so add border
|
||||||
|
if ( extra !== "padding" ) {
|
||||||
|
val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getWidthOrHeight( elem, name, extra ) {
|
||||||
|
|
||||||
|
// Start with offset property, which is equivalent to the border-box value
|
||||||
|
var valueIsBorderBox = true,
|
||||||
|
val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
|
||||||
|
styles = getStyles( elem ),
|
||||||
|
isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
|
||||||
|
|
||||||
|
// Some non-html elements return undefined for offsetWidth, so check for null/undefined
|
||||||
|
// svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
|
||||||
|
// MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
|
||||||
|
if ( val <= 0 || val == null ) {
|
||||||
|
|
||||||
|
// Fall back to computed then uncomputed css if necessary
|
||||||
|
val = curCSS( elem, name, styles );
|
||||||
|
if ( val < 0 || val == null ) {
|
||||||
|
val = elem.style[ name ];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Computed unit is not pixels. Stop here and return.
|
||||||
|
if ( rnumnonpx.test( val ) ) {
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check for style in case a browser which returns unreliable values
|
||||||
|
// for getComputedStyle silently falls back to the reliable elem.style
|
||||||
|
valueIsBorderBox = isBorderBox &&
|
||||||
|
( support.boxSizingReliable() || val === elem.style[ name ] );
|
||||||
|
|
||||||
|
// Normalize "", auto, and prepare for extra
|
||||||
|
val = parseFloat( val ) || 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Use the active box-sizing model to add/subtract irrelevant styles
|
||||||
|
return ( val +
|
||||||
|
augmentWidthOrHeight(
|
||||||
|
elem,
|
||||||
|
name,
|
||||||
|
extra || ( isBorderBox ? "border" : "content" ),
|
||||||
|
valueIsBorderBox,
|
||||||
|
styles
|
||||||
|
)
|
||||||
|
) + "px";
|
||||||
|
}
|
||||||
|
|
||||||
|
function showHide( elements, show ) {
|
||||||
|
var display, elem, hidden,
|
||||||
|
values = [],
|
||||||
|
index = 0,
|
||||||
|
length = elements.length;
|
||||||
|
|
||||||
|
for ( ; index < length; index++ ) {
|
||||||
|
elem = elements[ index ];
|
||||||
|
if ( !elem.style ) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
values[ index ] = dataPriv.get( elem, "olddisplay" );
|
||||||
|
display = elem.style.display;
|
||||||
|
if ( show ) {
|
||||||
|
|
||||||
|
// Reset the inline display of this element to learn if it is
|
||||||
|
// being hidden by cascaded rules or not
|
||||||
|
if ( !values[ index ] && display === "none" ) {
|
||||||
|
elem.style.display = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set elements which have been overridden with display: none
|
||||||
|
// in a stylesheet to whatever the default browser style is
|
||||||
|
// for such an element
|
||||||
|
if ( elem.style.display === "" && isHidden( elem ) ) {
|
||||||
|
values[ index ] = dataPriv.access(
|
||||||
|
elem,
|
||||||
|
"olddisplay",
|
||||||
|
defaultDisplay( elem.nodeName )
|
||||||
|
);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
hidden = isHidden( elem );
|
||||||
|
|
||||||
|
if ( display !== "none" || !hidden ) {
|
||||||
|
dataPriv.set(
|
||||||
|
elem,
|
||||||
|
"olddisplay",
|
||||||
|
hidden ? display : jQuery.css( elem, "display" )
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the display of most of the elements in a second loop
|
||||||
|
// to avoid the constant reflow
|
||||||
|
for ( index = 0; index < length; index++ ) {
|
||||||
|
elem = elements[ index ];
|
||||||
|
if ( !elem.style ) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
|
||||||
|
elem.style.display = show ? values[ index ] || "" : "none";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return elements;
|
||||||
|
}
|
||||||
|
|
||||||
|
jQuery.extend( {
|
||||||
|
|
||||||
|
// Add in style property hooks for overriding the default
|
||||||
|
// behavior of getting and setting a style property
|
||||||
|
cssHooks: {
|
||||||
|
opacity: {
|
||||||
|
get: function( elem, computed ) {
|
||||||
|
if ( computed ) {
|
||||||
|
|
||||||
|
// We should always get a number back from opacity
|
||||||
|
var ret = curCSS( elem, "opacity" );
|
||||||
|
return ret === "" ? "1" : ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// Don't automatically add "px" to these possibly-unitless properties
|
||||||
|
cssNumber: {
|
||||||
|
"animationIterationCount": true,
|
||||||
|
"columnCount": true,
|
||||||
|
"fillOpacity": true,
|
||||||
|
"flexGrow": true,
|
||||||
|
"flexShrink": true,
|
||||||
|
"fontWeight": true,
|
||||||
|
"lineHeight": true,
|
||||||
|
"opacity": true,
|
||||||
|
"order": true,
|
||||||
|
"orphans": true,
|
||||||
|
"widows": true,
|
||||||
|
"zIndex": true,
|
||||||
|
"zoom": true
|
||||||
|
},
|
||||||
|
|
||||||
|
// Add in properties whose names you wish to fix before
|
||||||
|
// setting or getting the value
|
||||||
|
cssProps: {
|
||||||
|
"float": "cssFloat"
|
||||||
|
},
|
||||||
|
|
||||||
|
// Get and set the style property on a DOM Node
|
||||||
|
style: function( elem, name, value, extra ) {
|
||||||
|
|
||||||
|
// Don't set styles on text and comment nodes
|
||||||
|
if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Make sure that we're working with the right name
|
||||||
|
var ret, type, hooks,
|
||||||
|
origName = jQuery.camelCase( name ),
|
||||||
|
style = elem.style;
|
||||||
|
|
||||||
|
name = jQuery.cssProps[ origName ] ||
|
||||||
|
( jQuery.cssProps[ origName ] = vendorPropName( origName ) || origName );
|
||||||
|
|
||||||
|
// Gets hook for the prefixed version, then unprefixed version
|
||||||
|
hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
|
||||||
|
|
||||||
|
// Check if we're setting a value
|
||||||
|
if ( value !== undefined ) {
|
||||||
|
type = typeof value;
|
||||||
|
|
||||||
|
// Convert "+=" or "-=" to relative numbers (#7345)
|
||||||
|
if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {
|
||||||
|
value = adjustCSS( elem, name, ret );
|
||||||
|
|
||||||
|
// Fixes bug #9237
|
||||||
|
type = "number";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Make sure that null and NaN values aren't set (#7116)
|
||||||
|
if ( value == null || value !== value ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If a number was passed in, add the unit (except for certain CSS properties)
|
||||||
|
if ( type === "number" ) {
|
||||||
|
value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Support: IE9-11+
|
||||||
|
// background-* props affect original clone's values
|
||||||
|
if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
|
||||||
|
style[ name ] = "inherit";
|
||||||
|
}
|
||||||
|
|
||||||
|
// If a hook was provided, use that value, otherwise just set the specified value
|
||||||
|
if ( !hooks || !( "set" in hooks ) ||
|
||||||
|
( value = hooks.set( elem, value, extra ) ) !== undefined ) {
|
||||||
|
|
||||||
|
style[ name ] = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
// If a hook was provided get the non-computed value from there
|
||||||
|
if ( hooks && "get" in hooks &&
|
||||||
|
( ret = hooks.get( elem, false, extra ) ) !== undefined ) {
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Otherwise just get the value from the style object
|
||||||
|
return style[ name ];
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
css: function( elem, name, extra, styles ) {
|
||||||
|
var val, num, hooks,
|
||||||
|
origName = jQuery.camelCase( name );
|
||||||
|
|
||||||
|
// Make sure that we're working with the right name
|
||||||
|
name = jQuery.cssProps[ origName ] ||
|
||||||
|
( jQuery.cssProps[ origName ] = vendorPropName( origName ) || origName );
|
||||||
|
|
||||||
|
// Try prefixed name followed by the unprefixed name
|
||||||
|
hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
|
||||||
|
|
||||||
|
// If a hook was provided get the computed value from there
|
||||||
|
if ( hooks && "get" in hooks ) {
|
||||||
|
val = hooks.get( elem, true, extra );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Otherwise, if a way to get the computed value exists, use that
|
||||||
|
if ( val === undefined ) {
|
||||||
|
val = curCSS( elem, name, styles );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Convert "normal" to computed value
|
||||||
|
if ( val === "normal" && name in cssNormalTransform ) {
|
||||||
|
val = cssNormalTransform[ name ];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Make numeric if forced or a qualifier was provided and val looks numeric
|
||||||
|
if ( extra === "" || extra ) {
|
||||||
|
num = parseFloat( val );
|
||||||
|
return extra === true || isFinite( num ) ? num || 0 : val;
|
||||||
|
}
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
|
||||||
|
jQuery.each( [ "height", "width" ], function( i, name ) {
|
||||||
|
jQuery.cssHooks[ name ] = {
|
||||||
|
get: function( elem, computed, extra ) {
|
||||||
|
if ( computed ) {
|
||||||
|
|
||||||
|
// Certain elements can have dimension info if we invisibly show them
|
||||||
|
// but it must have a current display style that would benefit
|
||||||
|
return rdisplayswap.test( jQuery.css( elem, "display" ) ) &&
|
||||||
|
elem.offsetWidth === 0 ?
|
||||||
|
swap( elem, cssShow, function() {
|
||||||
|
return getWidthOrHeight( elem, name, extra );
|
||||||
|
} ) :
|
||||||
|
getWidthOrHeight( elem, name, extra );
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
set: function( elem, value, extra ) {
|
||||||
|
var matches,
|
||||||
|
styles = extra && getStyles( elem ),
|
||||||
|
subtract = extra && augmentWidthOrHeight(
|
||||||
|
elem,
|
||||||
|
name,
|
||||||
|
extra,
|
||||||
|
jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
|
||||||
|
styles
|
||||||
|
);
|
||||||
|
|
||||||
|
// Convert to pixels if value adjustment is needed
|
||||||
|
if ( subtract && ( matches = rcssNum.exec( value ) ) &&
|
||||||
|
( matches[ 3 ] || "px" ) !== "px" ) {
|
||||||
|
|
||||||
|
elem.style[ name ] = value;
|
||||||
|
value = jQuery.css( elem, name );
|
||||||
|
}
|
||||||
|
|
||||||
|
return setPositiveNumber( elem, value, subtract );
|
||||||
|
}
|
||||||
|
};
|
||||||
|
} );
|
||||||
|
|
||||||
|
jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
|
||||||
|
function( elem, computed ) {
|
||||||
|
if ( computed ) {
|
||||||
|
return ( parseFloat( curCSS( elem, "marginLeft" ) ) ||
|
||||||
|
elem.getBoundingClientRect().left -
|
||||||
|
swap( elem, { marginLeft: 0 }, function() {
|
||||||
|
return elem.getBoundingClientRect().left;
|
||||||
|
} )
|
||||||
|
) + "px";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
// Support: Android 2.3
|
||||||
|
jQuery.cssHooks.marginRight = addGetHookIf( support.reliableMarginRight,
|
||||||
|
function( elem, computed ) {
|
||||||
|
if ( computed ) {
|
||||||
|
return swap( elem, { "display": "inline-block" },
|
||||||
|
curCSS, [ elem, "marginRight" ] );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
// These hooks are used by animate to expand properties
|
||||||
|
jQuery.each( {
|
||||||
|
margin: "",
|
||||||
|
padding: "",
|
||||||
|
border: "Width"
|
||||||
|
}, function( prefix, suffix ) {
|
||||||
|
jQuery.cssHooks[ prefix + suffix ] = {
|
||||||
|
expand: function( value ) {
|
||||||
|
var i = 0,
|
||||||
|
expanded = {},
|
||||||
|
|
||||||
|
// Assumes a single number if not a string
|
||||||
|
parts = typeof value === "string" ? value.split( " " ) : [ value ];
|
||||||
|
|
||||||
|
for ( ; i < 4; i++ ) {
|
||||||
|
expanded[ prefix + cssExpand[ i ] + suffix ] =
|
||||||
|
parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
|
||||||
|
}
|
||||||
|
|
||||||
|
return expanded;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
if ( !rmargin.test( prefix ) ) {
|
||||||
|
jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
|
||||||
|
jQuery.fn.extend( {
|
||||||
|
css: function( name, value ) {
|
||||||
|
return access( this, function( elem, name, value ) {
|
||||||
|
var styles, len,
|
||||||
|
map = {},
|
||||||
|
i = 0;
|
||||||
|
|
||||||
|
if ( jQuery.isArray( name ) ) {
|
||||||
|
styles = getStyles( elem );
|
||||||
|
len = name.length;
|
||||||
|
|
||||||
|
for ( ; i < len; i++ ) {
|
||||||
|
map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
|
||||||
|
}
|
||||||
|
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
return value !== undefined ?
|
||||||
|
jQuery.style( elem, name, value ) :
|
||||||
|
jQuery.css( elem, name );
|
||||||
|
}, name, value, arguments.length > 1 );
|
||||||
|
},
|
||||||
|
show: function() {
|
||||||
|
return showHide( this, true );
|
||||||
|
},
|
||||||
|
hide: function() {
|
||||||
|
return showHide( this );
|
||||||
|
},
|
||||||
|
toggle: function( state ) {
|
||||||
|
if ( typeof state === "boolean" ) {
|
||||||
|
return state ? this.show() : this.hide();
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.each( function() {
|
||||||
|
if ( isHidden( this ) ) {
|
||||||
|
jQuery( this ).show();
|
||||||
|
} else {
|
||||||
|
jQuery( this ).hide();
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
|
||||||
|
return jQuery;
|
||||||
|
} );
|
||||||
24
TaxCalculator/bower_components/jquery/src/css/addGetHookIf.js
vendored
Normal file
24
TaxCalculator/bower_components/jquery/src/css/addGetHookIf.js
vendored
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
define( function() {
|
||||||
|
|
||||||
|
function addGetHookIf( conditionFn, hookFn ) {
|
||||||
|
|
||||||
|
// Define the hook, we'll check on the first run if it's really needed.
|
||||||
|
return {
|
||||||
|
get: function() {
|
||||||
|
if ( conditionFn() ) {
|
||||||
|
|
||||||
|
// Hook not needed (or it's not possible to use it due
|
||||||
|
// to missing dependency), remove it.
|
||||||
|
delete this.get;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Hook needed; redefine it so that the support test is not executed again.
|
||||||
|
return ( this.get = hookFn ).apply( this, arguments );
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return addGetHookIf;
|
||||||
|
|
||||||
|
} );
|
||||||
65
TaxCalculator/bower_components/jquery/src/css/adjustCSS.js
vendored
Normal file
65
TaxCalculator/bower_components/jquery/src/css/adjustCSS.js
vendored
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
define( [
|
||||||
|
"../core",
|
||||||
|
"../var/rcssNum"
|
||||||
|
], function( jQuery, rcssNum ) {
|
||||||
|
|
||||||
|
function adjustCSS( elem, prop, valueParts, tween ) {
|
||||||
|
var adjusted,
|
||||||
|
scale = 1,
|
||||||
|
maxIterations = 20,
|
||||||
|
currentValue = tween ?
|
||||||
|
function() { return tween.cur(); } :
|
||||||
|
function() { return jQuery.css( elem, prop, "" ); },
|
||||||
|
initial = currentValue(),
|
||||||
|
unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
|
||||||
|
|
||||||
|
// Starting value computation is required for potential unit mismatches
|
||||||
|
initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
|
||||||
|
rcssNum.exec( jQuery.css( elem, prop ) );
|
||||||
|
|
||||||
|
if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {
|
||||||
|
|
||||||
|
// Trust units reported by jQuery.css
|
||||||
|
unit = unit || initialInUnit[ 3 ];
|
||||||
|
|
||||||
|
// Make sure we update the tween properties later on
|
||||||
|
valueParts = valueParts || [];
|
||||||
|
|
||||||
|
// Iteratively approximate from a nonzero starting point
|
||||||
|
initialInUnit = +initial || 1;
|
||||||
|
|
||||||
|
do {
|
||||||
|
|
||||||
|
// If previous iteration zeroed out, double until we get *something*.
|
||||||
|
// Use string for doubling so we don't accidentally see scale as unchanged below
|
||||||
|
scale = scale || ".5";
|
||||||
|
|
||||||
|
// Adjust and apply
|
||||||
|
initialInUnit = initialInUnit / scale;
|
||||||
|
jQuery.style( elem, prop, initialInUnit + unit );
|
||||||
|
|
||||||
|
// Update scale, tolerating zero or NaN from tween.cur()
|
||||||
|
// Break the loop if scale is unchanged or perfect, or if we've just had enough.
|
||||||
|
} while (
|
||||||
|
scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( valueParts ) {
|
||||||
|
initialInUnit = +initialInUnit || +initial || 0;
|
||||||
|
|
||||||
|
// Apply relative offset (+=/-=) if specified
|
||||||
|
adjusted = valueParts[ 1 ] ?
|
||||||
|
initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :
|
||||||
|
+valueParts[ 2 ];
|
||||||
|
if ( tween ) {
|
||||||
|
tween.unit = unit;
|
||||||
|
tween.start = initialInUnit;
|
||||||
|
tween.end = adjusted;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return adjusted;
|
||||||
|
}
|
||||||
|
|
||||||
|
return adjustCSS;
|
||||||
|
} );
|
||||||
60
TaxCalculator/bower_components/jquery/src/css/curCSS.js
vendored
Normal file
60
TaxCalculator/bower_components/jquery/src/css/curCSS.js
vendored
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
define( [
|
||||||
|
"../core",
|
||||||
|
"./var/rnumnonpx",
|
||||||
|
"./var/rmargin",
|
||||||
|
"./var/getStyles",
|
||||||
|
"./support",
|
||||||
|
"../selector" // Get jQuery.contains
|
||||||
|
], function( jQuery, rnumnonpx, rmargin, getStyles, support ) {
|
||||||
|
|
||||||
|
function curCSS( elem, name, computed ) {
|
||||||
|
var width, minWidth, maxWidth, ret,
|
||||||
|
style = elem.style;
|
||||||
|
|
||||||
|
computed = computed || getStyles( elem );
|
||||||
|
ret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined;
|
||||||
|
|
||||||
|
// Support: Opera 12.1x only
|
||||||
|
// Fall back to style even without computed
|
||||||
|
// computed is undefined for elems on document fragments
|
||||||
|
if ( ( ret === "" || ret === undefined ) && !jQuery.contains( elem.ownerDocument, elem ) ) {
|
||||||
|
ret = jQuery.style( elem, name );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Support: IE9
|
||||||
|
// getPropertyValue is only needed for .css('filter') (#12537)
|
||||||
|
if ( computed ) {
|
||||||
|
|
||||||
|
// A tribute to the "awesome hack by Dean Edwards"
|
||||||
|
// Android Browser returns percentage for some values,
|
||||||
|
// but width seems to be reliably pixels.
|
||||||
|
// This is against the CSSOM draft spec:
|
||||||
|
// http://dev.w3.org/csswg/cssom/#resolved-values
|
||||||
|
if ( !support.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.test( name ) ) {
|
||||||
|
|
||||||
|
// Remember the original values
|
||||||
|
width = style.width;
|
||||||
|
minWidth = style.minWidth;
|
||||||
|
maxWidth = style.maxWidth;
|
||||||
|
|
||||||
|
// Put in the new values to get a computed value out
|
||||||
|
style.minWidth = style.maxWidth = style.width = ret;
|
||||||
|
ret = computed.width;
|
||||||
|
|
||||||
|
// Revert the changed values
|
||||||
|
style.width = width;
|
||||||
|
style.minWidth = minWidth;
|
||||||
|
style.maxWidth = maxWidth;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret !== undefined ?
|
||||||
|
|
||||||
|
// Support: IE9-11+
|
||||||
|
// IE returns zIndex value as an integer.
|
||||||
|
ret + "" :
|
||||||
|
ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
return curCSS;
|
||||||
|
} );
|
||||||
72
TaxCalculator/bower_components/jquery/src/css/defaultDisplay.js
vendored
Normal file
72
TaxCalculator/bower_components/jquery/src/css/defaultDisplay.js
vendored
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
define( [
|
||||||
|
"../core",
|
||||||
|
"../var/document",
|
||||||
|
"../manipulation" // appendTo
|
||||||
|
], function( jQuery, document ) {
|
||||||
|
|
||||||
|
var iframe,
|
||||||
|
elemdisplay = {
|
||||||
|
|
||||||
|
// Support: Firefox
|
||||||
|
// We have to pre-define these values for FF (#10227)
|
||||||
|
HTML: "block",
|
||||||
|
BODY: "block"
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve the actual display of a element
|
||||||
|
* @param {String} name nodeName of the element
|
||||||
|
* @param {Object} doc Document object
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Called only from within defaultDisplay
|
||||||
|
function actualDisplay( name, doc ) {
|
||||||
|
var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),
|
||||||
|
|
||||||
|
display = jQuery.css( elem[ 0 ], "display" );
|
||||||
|
|
||||||
|
// We don't have any data stored on the element,
|
||||||
|
// so use "detach" method as fast way to get rid of the element
|
||||||
|
elem.detach();
|
||||||
|
|
||||||
|
return display;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Try to determine the default display value of an element
|
||||||
|
* @param {String} nodeName
|
||||||
|
*/
|
||||||
|
function defaultDisplay( nodeName ) {
|
||||||
|
var doc = document,
|
||||||
|
display = elemdisplay[ nodeName ];
|
||||||
|
|
||||||
|
if ( !display ) {
|
||||||
|
display = actualDisplay( nodeName, doc );
|
||||||
|
|
||||||
|
// If the simple way fails, read from inside an iframe
|
||||||
|
if ( display === "none" || !display ) {
|
||||||
|
|
||||||
|
// Use the already-created iframe if possible
|
||||||
|
iframe = ( iframe || jQuery( "<iframe frameborder='0' width='0' height='0'/>" ) )
|
||||||
|
.appendTo( doc.documentElement );
|
||||||
|
|
||||||
|
// Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse
|
||||||
|
doc = iframe[ 0 ].contentDocument;
|
||||||
|
|
||||||
|
// Support: IE
|
||||||
|
doc.write();
|
||||||
|
doc.close();
|
||||||
|
|
||||||
|
display = actualDisplay( nodeName, doc );
|
||||||
|
iframe.detach();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Store the correct default display
|
||||||
|
elemdisplay[ nodeName ] = display;
|
||||||
|
}
|
||||||
|
|
||||||
|
return display;
|
||||||
|
}
|
||||||
|
|
||||||
|
return defaultDisplay;
|
||||||
|
} );
|
||||||
18
TaxCalculator/bower_components/jquery/src/css/hiddenVisibleSelectors.js
vendored
Normal file
18
TaxCalculator/bower_components/jquery/src/css/hiddenVisibleSelectors.js
vendored
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
define( [
|
||||||
|
"../core",
|
||||||
|
"../selector"
|
||||||
|
], function( jQuery ) {
|
||||||
|
|
||||||
|
jQuery.expr.filters.hidden = function( elem ) {
|
||||||
|
return !jQuery.expr.filters.visible( elem );
|
||||||
|
};
|
||||||
|
jQuery.expr.filters.visible = function( elem ) {
|
||||||
|
|
||||||
|
// Support: Opera <= 12.12
|
||||||
|
// Opera reports offsetWidths and offsetHeights less than zero on some elements
|
||||||
|
// Use OR instead of AND as the element is not visible if either is true
|
||||||
|
// See tickets #10406 and #13132
|
||||||
|
return elem.offsetWidth > 0 || elem.offsetHeight > 0 || elem.getClientRects().length > 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
} );
|
||||||
48
TaxCalculator/bower_components/jquery/src/css/showHide.js
vendored
Normal file
48
TaxCalculator/bower_components/jquery/src/css/showHide.js
vendored
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
define( [
|
||||||
|
"../data/var/dataPriv"
|
||||||
|
], function( dataPriv ) {
|
||||||
|
|
||||||
|
function showHide( elements, show ) {
|
||||||
|
var display, elem,
|
||||||
|
values = [],
|
||||||
|
index = 0,
|
||||||
|
length = elements.length;
|
||||||
|
|
||||||
|
// Determine new display value for elements that need to change
|
||||||
|
for ( ; index < length; index++ ) {
|
||||||
|
elem = elements[ index ];
|
||||||
|
if ( !elem.style ) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
display = elem.style.display;
|
||||||
|
if ( show ) {
|
||||||
|
if ( display === "none" ) {
|
||||||
|
|
||||||
|
// Restore a pre-hide() value if we have one
|
||||||
|
values[ index ] = dataPriv.get( elem, "display" ) || "";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if ( display !== "none" ) {
|
||||||
|
values[ index ] = "none";
|
||||||
|
|
||||||
|
// Remember the value we're replacing
|
||||||
|
dataPriv.set( elem, "display", display );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the display of the elements in a second loop
|
||||||
|
// to avoid the constant reflow
|
||||||
|
for ( index = 0; index < length; index++ ) {
|
||||||
|
if ( values[ index ] != null ) {
|
||||||
|
elements[ index ].style.display = values[ index ];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return elements;
|
||||||
|
}
|
||||||
|
|
||||||
|
return showHide;
|
||||||
|
|
||||||
|
} );
|
||||||
121
TaxCalculator/bower_components/jquery/src/css/support.js
vendored
Normal file
121
TaxCalculator/bower_components/jquery/src/css/support.js
vendored
Normal file
@ -0,0 +1,121 @@
|
|||||||
|
define( [
|
||||||
|
"../core",
|
||||||
|
"../var/document",
|
||||||
|
"../var/documentElement",
|
||||||
|
"../var/support"
|
||||||
|
], function( jQuery, document, documentElement, support ) {
|
||||||
|
|
||||||
|
( function() {
|
||||||
|
var pixelPositionVal, boxSizingReliableVal, pixelMarginRightVal, reliableMarginLeftVal,
|
||||||
|
container = document.createElement( "div" ),
|
||||||
|
div = document.createElement( "div" );
|
||||||
|
|
||||||
|
// Finish early in limited (non-browser) environments
|
||||||
|
if ( !div.style ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Support: IE9-11+
|
||||||
|
// Style of cloned element affects source element cloned (#8908)
|
||||||
|
div.style.backgroundClip = "content-box";
|
||||||
|
div.cloneNode( true ).style.backgroundClip = "";
|
||||||
|
support.clearCloneStyle = div.style.backgroundClip === "content-box";
|
||||||
|
|
||||||
|
container.style.cssText = "border:0;width:8px;height:0;top:0;left:-9999px;" +
|
||||||
|
"padding:0;margin-top:1px;position:absolute";
|
||||||
|
container.appendChild( div );
|
||||||
|
|
||||||
|
// Executing both pixelPosition & boxSizingReliable tests require only one layout
|
||||||
|
// so they're executed at the same time to save the second computation.
|
||||||
|
function computeStyleTests() {
|
||||||
|
div.style.cssText =
|
||||||
|
|
||||||
|
// Support: Firefox<29, Android 2.3
|
||||||
|
// Vendor-prefix box-sizing
|
||||||
|
"-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;" +
|
||||||
|
"position:relative;display:block;" +
|
||||||
|
"margin:auto;border:1px;padding:1px;" +
|
||||||
|
"top:1%;width:50%";
|
||||||
|
div.innerHTML = "";
|
||||||
|
documentElement.appendChild( container );
|
||||||
|
|
||||||
|
var divStyle = window.getComputedStyle( div );
|
||||||
|
pixelPositionVal = divStyle.top !== "1%";
|
||||||
|
reliableMarginLeftVal = divStyle.marginLeft === "2px";
|
||||||
|
boxSizingReliableVal = divStyle.width === "4px";
|
||||||
|
|
||||||
|
// Support: Android 4.0 - 4.3 only
|
||||||
|
// Some styles come back with percentage values, even though they shouldn't
|
||||||
|
div.style.marginRight = "50%";
|
||||||
|
pixelMarginRightVal = divStyle.marginRight === "4px";
|
||||||
|
|
||||||
|
documentElement.removeChild( container );
|
||||||
|
}
|
||||||
|
|
||||||
|
jQuery.extend( support, {
|
||||||
|
pixelPosition: function() {
|
||||||
|
|
||||||
|
// This test is executed only once but we still do memoizing
|
||||||
|
// since we can use the boxSizingReliable pre-computing.
|
||||||
|
// No need to check if the test was already performed, though.
|
||||||
|
computeStyleTests();
|
||||||
|
return pixelPositionVal;
|
||||||
|
},
|
||||||
|
boxSizingReliable: function() {
|
||||||
|
if ( boxSizingReliableVal == null ) {
|
||||||
|
computeStyleTests();
|
||||||
|
}
|
||||||
|
return boxSizingReliableVal;
|
||||||
|
},
|
||||||
|
pixelMarginRight: function() {
|
||||||
|
|
||||||
|
// Support: Android 4.0-4.3
|
||||||
|
// We're checking for boxSizingReliableVal here instead of pixelMarginRightVal
|
||||||
|
// since that compresses better and they're computed together anyway.
|
||||||
|
if ( boxSizingReliableVal == null ) {
|
||||||
|
computeStyleTests();
|
||||||
|
}
|
||||||
|
return pixelMarginRightVal;
|
||||||
|
},
|
||||||
|
reliableMarginLeft: function() {
|
||||||
|
|
||||||
|
// Support: IE <=8 only, Android 4.0 - 4.3 only, Firefox <=3 - 37
|
||||||
|
if ( boxSizingReliableVal == null ) {
|
||||||
|
computeStyleTests();
|
||||||
|
}
|
||||||
|
return reliableMarginLeftVal;
|
||||||
|
},
|
||||||
|
reliableMarginRight: function() {
|
||||||
|
|
||||||
|
// Support: Android 2.3
|
||||||
|
// Check if div with explicit width and no margin-right incorrectly
|
||||||
|
// gets computed margin-right based on width of container. (#3333)
|
||||||
|
// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
|
||||||
|
// This support function is only executed once so no memoizing is needed.
|
||||||
|
var ret,
|
||||||
|
marginDiv = div.appendChild( document.createElement( "div" ) );
|
||||||
|
|
||||||
|
// Reset CSS: box-sizing; display; margin; border; padding
|
||||||
|
marginDiv.style.cssText = div.style.cssText =
|
||||||
|
|
||||||
|
// Support: Android 2.3
|
||||||
|
// Vendor-prefix box-sizing
|
||||||
|
"-webkit-box-sizing:content-box;box-sizing:content-box;" +
|
||||||
|
"display:block;margin:0;border:0;padding:0";
|
||||||
|
marginDiv.style.marginRight = marginDiv.style.width = "0";
|
||||||
|
div.style.width = "1px";
|
||||||
|
documentElement.appendChild( container );
|
||||||
|
|
||||||
|
ret = !parseFloat( window.getComputedStyle( marginDiv ).marginRight );
|
||||||
|
|
||||||
|
documentElement.removeChild( container );
|
||||||
|
div.removeChild( marginDiv );
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
} )();
|
||||||
|
|
||||||
|
return support;
|
||||||
|
|
||||||
|
} );
|
||||||
3
TaxCalculator/bower_components/jquery/src/css/var/cssExpand.js
vendored
Normal file
3
TaxCalculator/bower_components/jquery/src/css/var/cssExpand.js
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
define( function() {
|
||||||
|
return [ "Top", "Right", "Bottom", "Left" ];
|
||||||
|
} );
|
||||||
15
TaxCalculator/bower_components/jquery/src/css/var/getStyles.js
vendored
Normal file
15
TaxCalculator/bower_components/jquery/src/css/var/getStyles.js
vendored
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
define( function() {
|
||||||
|
return function( elem ) {
|
||||||
|
|
||||||
|
// Support: IE<=11+, Firefox<=30+ (#15098, #14150)
|
||||||
|
// IE throws on elements created in popups
|
||||||
|
// FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
|
||||||
|
var view = elem.ownerDocument.defaultView;
|
||||||
|
|
||||||
|
if ( !view || !view.opener ) {
|
||||||
|
view = window;
|
||||||
|
}
|
||||||
|
|
||||||
|
return view.getComputedStyle( elem );
|
||||||
|
};
|
||||||
|
} );
|
||||||
16
TaxCalculator/bower_components/jquery/src/css/var/isHidden.js
vendored
Normal file
16
TaxCalculator/bower_components/jquery/src/css/var/isHidden.js
vendored
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
define( [
|
||||||
|
"../../core",
|
||||||
|
"../../selector"
|
||||||
|
|
||||||
|
// css is assumed
|
||||||
|
], function( jQuery ) {
|
||||||
|
|
||||||
|
return function( elem, el ) {
|
||||||
|
|
||||||
|
// isHidden might be called from jQuery#filter function;
|
||||||
|
// in that case, element will be second argument
|
||||||
|
elem = el || elem;
|
||||||
|
return jQuery.css( elem, "display" ) === "none" ||
|
||||||
|
!jQuery.contains( elem.ownerDocument, elem );
|
||||||
|
};
|
||||||
|
} );
|
||||||
3
TaxCalculator/bower_components/jquery/src/css/var/rmargin.js
vendored
Normal file
3
TaxCalculator/bower_components/jquery/src/css/var/rmargin.js
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
define( function() {
|
||||||
|
return ( /^margin/ );
|
||||||
|
} );
|
||||||
5
TaxCalculator/bower_components/jquery/src/css/var/rnumnonpx.js
vendored
Normal file
5
TaxCalculator/bower_components/jquery/src/css/var/rnumnonpx.js
vendored
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
define( [
|
||||||
|
"../../var/pnum"
|
||||||
|
], function( pnum ) {
|
||||||
|
return new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
|
||||||
|
} );
|
||||||
24
TaxCalculator/bower_components/jquery/src/css/var/swap.js
vendored
Normal file
24
TaxCalculator/bower_components/jquery/src/css/var/swap.js
vendored
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
define( function() {
|
||||||
|
|
||||||
|
// A method for quickly swapping in/out CSS properties to get correct calculations.
|
||||||
|
return function( elem, options, callback, args ) {
|
||||||
|
var ret, name,
|
||||||
|
old = {};
|
||||||
|
|
||||||
|
// Remember the old values, and insert the new ones
|
||||||
|
for ( name in options ) {
|
||||||
|
old[ name ] = elem.style[ name ];
|
||||||
|
elem.style[ name ] = options[ name ];
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = callback.apply( elem, args || [] );
|
||||||
|
|
||||||
|
// Revert the old values
|
||||||
|
for ( name in options ) {
|
||||||
|
elem.style[ name ] = old[ name ];
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
};
|
||||||
|
|
||||||
|
} );
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user