2 |
3 | @if (Model.Count > 0)
4 | {
5 | Registered Logins
6 |
34 | }
35 |
--------------------------------------------------------------------------------
/AutomatedTellerMachine/Web.Release.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
17 |
18 |
19 |
30 |
31 |
32 |
--------------------------------------------------------------------------------
/AutomatedTellerMachine/AutomatedTellerMachine.Tests/App.config:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
--------------------------------------------------------------------------------
/AutomatedTellerMachine/Views/Account/ExternalLoginConfirmation.cshtml:
--------------------------------------------------------------------------------
1 | @model AutomatedTellerMachine.Models.ExternalLoginConfirmationViewModel
2 | @{
3 | ViewBag.Title = "Register";
4 | }
5 | @ViewBag.Title.
6 | Associate your @ViewBag.LoginProvider account.
7 |
8 | @using (Html.BeginForm("ExternalLoginConfirmation", "Account", new { ReturnUrl = ViewBag.ReturnUrl }, FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
9 | {
10 | @Html.AntiForgeryToken()
11 |
12 | Association Form
13 |
14 | @Html.ValidationSummary(true, "", new { @class = "text-danger" })
15 |
16 | You've successfully authenticated with @ViewBag.LoginProvider.
17 | Please enter a user name for this site below and click the Register button to finish
18 | logging in.
19 |
20 |
27 |
32 | }
33 |
34 | @section Scripts {
35 | @Scripts.Render("~/bundles/jqueryval")
36 | }
37 |
--------------------------------------------------------------------------------
/AutomatedTellerMachine/Properties/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Reflection;
2 | using System.Runtime.CompilerServices;
3 | using System.Runtime.InteropServices;
4 |
5 | // General Information about an assembly is controlled through the following
6 | // set of attributes. Change these attribute values to modify the information
7 | // associated with an assembly.
8 | [assembly: AssemblyTitle("AutomatedTellerMachine")]
9 | [assembly: AssemblyDescription("")]
10 | [assembly: AssemblyConfiguration("")]
11 | [assembly: AssemblyCompany("")]
12 | [assembly: AssemblyProduct("AutomatedTellerMachine")]
13 | [assembly: AssemblyCopyright("Copyright © 2014")]
14 | [assembly: AssemblyTrademark("")]
15 | [assembly: AssemblyCulture("")]
16 |
17 | // Setting ComVisible to false makes the types in this assembly not visible
18 | // to COM components. If you need to access a type in this assembly from
19 | // COM, set the ComVisible attribute to true on that type.
20 | [assembly: ComVisible(false)]
21 |
22 | // The following GUID is for the ID of the typelib if this project is exposed to COM
23 | [assembly: Guid("e3070e6e-82eb-4f9c-a7af-e377d6bc7bfe")]
24 |
25 | // Version information for an assembly consists of the following four values:
26 | //
27 | // Major Version
28 | // Minor Version
29 | // Build Number
30 | // Revision
31 | //
32 | // You can specify all the values or you can default the Revision and Build Numbers
33 | // by using the '*' as shown below:
34 | [assembly: AssemblyVersion("1.0.0.0")]
35 | [assembly: AssemblyFileVersion("1.0.0.0")]
36 |
--------------------------------------------------------------------------------
/AutomatedTellerMachine/Views/Account/_ChangePasswordPartial.cshtml:
--------------------------------------------------------------------------------
1 | @using Microsoft.AspNet.Identity
2 | @model AutomatedTellerMachine.Models.ManageUserViewModel
3 |
4 | You're logged in as @User.Identity.GetUserName().
5 |
6 | @using (Html.BeginForm("Manage", "Account", FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
7 | {
8 | @Html.AntiForgeryToken()
9 | Change Password Form
10 |
11 | @Html.ValidationSummary("", new { @class = "text-danger" })
12 |
18 |
24 |
30 |
31 |
36 | }
37 |
--------------------------------------------------------------------------------
/AutomatedTellerMachine/AutomatedTellerMachine.Tests/Properties/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Reflection;
2 | using System.Runtime.CompilerServices;
3 | using System.Runtime.InteropServices;
4 |
5 | // General Information about an assembly is controlled through the following
6 | // set of attributes. Change these attribute values to modify the information
7 | // associated with an assembly.
8 | [assembly: AssemblyTitle("AutomatedTellerMachine.Tests")]
9 | [assembly: AssemblyDescription("")]
10 | [assembly: AssemblyConfiguration("")]
11 | [assembly: AssemblyCompany("")]
12 | [assembly: AssemblyProduct("AutomatedTellerMachine.Tests")]
13 | [assembly: AssemblyCopyright("Copyright © 2014")]
14 | [assembly: AssemblyTrademark("")]
15 | [assembly: AssemblyCulture("")]
16 |
17 | // Setting ComVisible to false makes the types in this assembly not visible
18 | // to COM components. If you need to access a type in this assembly from
19 | // COM, set the ComVisible attribute to true on that type.
20 | [assembly: ComVisible(false)]
21 |
22 | // The following GUID is for the ID of the typelib if this project is exposed to COM
23 | [assembly: Guid("1666f3ba-b3b7-4353-9b8d-026383f1d74d")]
24 |
25 | // Version information for an assembly consists of the following four values:
26 | //
27 | // Major Version
28 | // Minor Version
29 | // Build Number
30 | // Revision
31 | //
32 | // You can specify all the values or you can default the Revision and Build Numbers
33 | // by using the '*' as shown below:
34 | [assembly: AssemblyVersion("1.0.0.0")]
35 | [assembly: AssemblyFileVersion("1.0.0.0")]
36 |
--------------------------------------------------------------------------------
/AutomatedTellerMachine/Views/Account/ResetPassword.cshtml:
--------------------------------------------------------------------------------
1 | @model AutomatedTellerMachine.Models.ResetPasswordViewModel
2 | @{
3 | ViewBag.Title = "Reset password";
4 | }
5 |
6 | @ViewBag.Title.
7 |
8 | @using (Html.BeginForm("ResetPassword", "Account", FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
9 | {
10 | @Html.AntiForgeryToken()
11 | Reset your password.
12 |
13 | @Html.ValidationSummary("", new { @class = "text-danger" })
14 | @Html.HiddenFor(model => model.Code)
15 |
21 |
27 |
33 |
38 | }
39 |
40 | @section Scripts {
41 | @Scripts.Render("~/bundles/jqueryval")
42 | }
43 |
--------------------------------------------------------------------------------
/AutomatedTellerMachine/Views/CheckingAccount/List.cshtml:
--------------------------------------------------------------------------------
1 | @model IEnumerable
2 |
3 | @{
4 | ViewBag.Title = "List";
5 | }
6 |
7 | List
8 |
9 |
10 | @Html.ActionLink("Create New", "Create")
11 |
12 |
13 |
14 | |
15 | @Html.DisplayNameFor(model => model.User.Pin)
16 | |
17 |
18 | @Html.DisplayNameFor(model => model.AccountNumber)
19 | |
20 |
21 | @Html.DisplayNameFor(model => model.FirstName)
22 | |
23 |
24 | @Html.DisplayNameFor(model => model.LastName)
25 | |
26 |
27 | @Html.DisplayNameFor(model => model.Balance)
28 | |
29 | |
30 |
31 |
32 | @foreach (var item in Model) {
33 |
34 | |
35 | @Html.DisplayFor(modelItem => item.User.Pin)
36 | |
37 |
38 | @Html.DisplayFor(modelItem => item.AccountNumber)
39 | |
40 |
41 | @Html.DisplayFor(modelItem => item.FirstName)
42 | |
43 |
44 | @Html.DisplayFor(modelItem => item.LastName)
45 | |
46 |
47 | @Html.DisplayFor(modelItem => item.Balance)
48 | |
49 |
50 | @Html.ActionLink("Edit", "Edit", new { id=item.Id }) |
51 | @Html.ActionLink("Details", "Details", new { id=item.Id }) |
52 | @Html.ActionLink("Delete", "Delete", new { id=item.Id })
53 | |
54 |
55 | }
56 |
57 |
58 |
--------------------------------------------------------------------------------
/AutomatedTellerMachine.sln:
--------------------------------------------------------------------------------
1 |
2 | Microsoft Visual Studio Solution File, Format Version 12.00
3 | # Visual Studio Express 2013 for Web
4 | VisualStudioVersion = 12.0.30501.0
5 | MinimumVisualStudioVersion = 10.0.40219.1
6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AutomatedTellerMachine", "AutomatedTellerMachine\AutomatedTellerMachine.csproj", "{7CAEB0A3-4FDF-44E6-845F-17716F639FD7}"
7 | EndProject
8 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AutomatedTellerMachine.Tests", "AutomatedTellerMachine\AutomatedTellerMachine.Tests\AutomatedTellerMachine.Tests.csproj", "{C03B1594-EDCA-421F-9B91-522F5BA20920}"
9 | EndProject
10 | Global
11 | GlobalSection(SolutionConfigurationPlatforms) = preSolution
12 | Debug|Any CPU = Debug|Any CPU
13 | Release|Any CPU = Release|Any CPU
14 | EndGlobalSection
15 | GlobalSection(ProjectConfigurationPlatforms) = postSolution
16 | {7CAEB0A3-4FDF-44E6-845F-17716F639FD7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
17 | {7CAEB0A3-4FDF-44E6-845F-17716F639FD7}.Debug|Any CPU.Build.0 = Debug|Any CPU
18 | {7CAEB0A3-4FDF-44E6-845F-17716F639FD7}.Release|Any CPU.ActiveCfg = Release|Any CPU
19 | {7CAEB0A3-4FDF-44E6-845F-17716F639FD7}.Release|Any CPU.Build.0 = Release|Any CPU
20 | {C03B1594-EDCA-421F-9B91-522F5BA20920}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
21 | {C03B1594-EDCA-421F-9B91-522F5BA20920}.Debug|Any CPU.Build.0 = Debug|Any CPU
22 | {C03B1594-EDCA-421F-9B91-522F5BA20920}.Release|Any CPU.ActiveCfg = Release|Any CPU
23 | {C03B1594-EDCA-421F-9B91-522F5BA20920}.Release|Any CPU.Build.0 = Release|Any CPU
24 | EndGlobalSection
25 | GlobalSection(SolutionProperties) = preSolution
26 | HideSolutionNode = FALSE
27 | EndGlobalSection
28 | EndGlobal
29 |
--------------------------------------------------------------------------------
/AutomatedTellerMachine/App_Start/BundleConfig.cs:
--------------------------------------------------------------------------------
1 | using System.Web;
2 | using System.Web.Optimization;
3 |
4 | namespace AutomatedTellerMachine
5 | {
6 | public class BundleConfig
7 | {
8 | // For more information on bundling, visit http://go.microsoft.com/fwlink/?LinkId=301862
9 | public static void RegisterBundles(BundleCollection bundles)
10 | {
11 | bundles.Add(new ScriptBundle("~/bundles/jquery", "//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js").Include(
12 | "~/Scripts/jquery-{version}.js"));
13 |
14 | bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include(
15 | "~/Scripts/jquery.validate*"));
16 |
17 | // Use the development version of Modernizr to develop with and learn from. Then, when you're
18 | // ready for production, use the build tool at http://modernizr.com to pick only the tests you need.
19 | bundles.Add(new ScriptBundle("~/bundles/modernizr").Include(
20 | "~/Scripts/modernizr-*"));
21 |
22 | bundles.Add(new ScriptBundle("~/bundles/bootstrap").Include(
23 | "~/Scripts/bootstrap.js",
24 | "~/Scripts/respond.js"));
25 |
26 | bundles.Add(new StyleBundle("~/Content/css").Include(
27 | "~/Content/bootstrap.css",
28 | "~/Content/site.css"));
29 |
30 | // Set EnableOptimizations to false for debugging. For more information,
31 | // visit http://go.microsoft.com/fwlink/?LinkId=301862
32 | bundles.UseCdn = true;
33 | BundleTable.EnableOptimizations = true;
34 | }
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/AutomatedTellerMachine/AutomatedTellerMachine.Tests/UnitTest1.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using Microsoft.VisualStudio.TestTools.UnitTesting;
3 | using AutomatedTellerMachine.Controllers;
4 | using System.Web.Mvc;
5 | using AutomatedTellerMachine.Models;
6 |
7 | namespace AutomatedTellerMachine.Tests
8 | {
9 | [TestClass]
10 | public class UnitTest1
11 | {
12 | [TestMethod]
13 | public void FooActionReturnsAboutView()
14 | {
15 | var homeController = new HomeController();
16 | var result = homeController.Foo() as ViewResult;
17 | Assert.AreEqual("About", result.ViewName);
18 | }
19 |
20 | [TestMethod]
21 | public void ContactFormSaysThanks()
22 | {
23 | var homeController = new HomeController();
24 | var result = homeController.Contact("I love your bank") as ViewResult;
25 | Assert.IsNotNull(result.ViewBag.TheMessage);
26 | }
27 |
28 | [TestMethod]
29 | public void BalanceIsCorrectAfterDeposit()
30 | {
31 | var fakeDb = new FakeApplicationDbContext();
32 | fakeDb.CheckingAccounts = new FakeDbSet();
33 | var checkingAccount = new CheckingAccount { Id = 1, AccountNumber = "000123TEST", Balance = 0 };
34 | fakeDb.CheckingAccounts.Add(checkingAccount);
35 | fakeDb.Transactions = new FakeDbSet();
36 | var transactionController = new TransactionController(fakeDb);
37 |
38 | transactionController.Deposit(new Transaction { CheckingAccountId = 1, Amount = 25 });
39 |
40 | Assert.AreEqual(25, checkingAccount.Balance);
41 | }
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/AutomatedTellerMachine/Migrations/Configuration.cs:
--------------------------------------------------------------------------------
1 | namespace AutomatedTellerMachine.Migrations
2 | {
3 | using AutomatedTellerMachine.Models;
4 | using AutomatedTellerMachine.Services;
5 | using Microsoft.AspNet.Identity;
6 | using Microsoft.AspNet.Identity.EntityFramework;
7 | using System;
8 | using System.Data.Entity;
9 | using System.Data.Entity.Migrations;
10 | using System.Linq;
11 |
12 | internal sealed class Configuration : DbMigrationsConfiguration
13 | {
14 | public Configuration()
15 | {
16 | AutomaticMigrationsEnabled = true;
17 | ContextKey = "AutomatedTellerMachine.Models.ApplicationDbContext";
18 | }
19 |
20 | protected override void Seed(AutomatedTellerMachine.Models.ApplicationDbContext context)
21 | {
22 | var userStore = new UserStore(context);
23 | var userManager = new UserManager(userStore);
24 |
25 | if (!context.Users.Any(u => u.UserName == "admin@mvcatm.com"))
26 | {
27 | var user = new ApplicationUser { UserName = "admin@mvcatm.com", Email = "admin@mvcatm.com" };
28 | IdentityResult result = userManager.Create(user, "passW0rd!");
29 |
30 | var service = new CheckingAccountService(context);
31 | service.CreateCheckingAccount("admin", "user", user.Id, 1000);
32 |
33 | context.Roles.AddOrUpdate(r => r.Name, new IdentityRole { Name = "Admin" });
34 | context.SaveChanges();
35 |
36 | userManager.AddToRole(user.Id, "Admin");
37 | context.SaveChanges();
38 | }
39 |
40 | }
41 |
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/AutomatedTellerMachine/Views/Web.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
--------------------------------------------------------------------------------
/AutomatedTellerMachine/Views/Shared/_Layout.cshtml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | @ViewBag.Title - MVC Bank
7 | @Styles.Render("~/Content/css")
8 | @Scripts.Render("~/bundles/modernizr")
9 |
10 |
11 |
12 |
13 |
14 |
22 |
23 |
24 | - @Html.ActionLink("Home", "Index", "Home")
25 | - @Html.ActionLink("About", "About", "Home")
26 | - @Html.ActionLink("Contact", "Contact", "Home")
27 |
28 | @Html.Partial("_LoginPartial")
29 |
30 |
31 |
32 |
33 |
36 | @RenderBody()
37 |
38 |
41 |
42 |
43 | @Scripts.Render("~/bundles/jquery")
44 | @Scripts.Render("~/bundles/bootstrap")
45 | @RenderSection("scripts", required: false)
46 |
47 |
48 |
--------------------------------------------------------------------------------
/AutomatedTellerMachine/Views/Account/Register.cshtml:
--------------------------------------------------------------------------------
1 | @model AutomatedTellerMachine.Models.RegisterViewModel
2 | @{
3 | ViewBag.Title = "Register";
4 | }
5 |
6 | @ViewBag.Title.
7 |
8 | @using (Html.BeginForm("Register", "Account", FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
9 | {
10 | @Html.AntiForgeryToken()
11 | Create a new account.
12 |
13 | @Html.ValidationSummary("", new { @class = "text-danger" })
14 |
20 |
26 |
32 |
38 |
44 |
49 | }
50 |
51 | @section Scripts {
52 | @Scripts.Render("~/bundles/jqueryval")
53 | }
54 |
--------------------------------------------------------------------------------
/AutomatedTellerMachine/Controllers/HomeController.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Web;
5 | using System.Web.Mvc;
6 | using Microsoft.AspNet.Identity;
7 | using AutomatedTellerMachine.Models;
8 | using Microsoft.AspNet.Identity.Owin;
9 |
10 | namespace AutomatedTellerMachine.Controllers
11 | {
12 | public class HomeController : Controller
13 | {
14 | private ApplicationDbContext db = new ApplicationDbContext();
15 |
16 | // GET /home/index
17 | [Authorize]
18 | public ActionResult Index()
19 | {
20 | var userId = User.Identity.GetUserId();
21 | var checkingAccountId = db.CheckingAccounts.Where(c => c.ApplicationUserId == userId).First().Id;
22 | ViewBag.CheckingAccountId = checkingAccountId;
23 |
24 | var manager = HttpContext.GetOwinContext().GetUserManager();
25 | var user = manager.FindById(userId);
26 | ViewBag.Pin = user.Pin;
27 | return View();
28 | }
29 |
30 | // GET /home/about
31 | public ActionResult About()
32 | {
33 | ViewBag.Message = "Your application description page.";
34 |
35 | return View();
36 | }
37 |
38 | public ActionResult Contact()
39 | {
40 | ViewBag.TheMessage = "Having trouble? Send us a message.";
41 |
42 | return View();
43 | }
44 |
45 | [HttpPost]
46 | public ActionResult Contact(string message)
47 | {
48 | // TODO: send the message to HQ
49 | ViewBag.TheMessage = "Thanks, we got your message!";
50 |
51 | return View();
52 | }
53 |
54 | public ActionResult Foo()
55 | {
56 | return View("About");
57 | }
58 |
59 | public ActionResult Serial(string letterCase)
60 | {
61 | var serial = "ASPNETMVC5ATM1";
62 | if (letterCase == "lower")
63 | {
64 | return Content(serial.ToLower());
65 | }
66 | // return new HttpStatusCodeResult(403);
67 | // return Json(new { name = "serial number", value = "serial" }, JsonRequestBehavior.AllowGet);
68 | return RedirectToAction("Index");
69 | }
70 | }
71 | }
--------------------------------------------------------------------------------
/AutomatedTellerMachine/packages.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
--------------------------------------------------------------------------------
/AutomatedTellerMachine/Views/CheckingAccount/Create.cshtml:
--------------------------------------------------------------------------------
1 | @model AutomatedTellerMachine.Models.CheckingAccount
2 |
3 | @{
4 | ViewBag.Title = "Create";
5 | }
6 |
7 | Create
8 |
9 |
10 | @using (Html.BeginForm())
11 | {
12 | @Html.AntiForgeryToken()
13 |
14 |
56 | }
57 |
58 |
59 | @Html.ActionLink("Back to List", "Index")
60 |
61 |
62 | @section Scripts {
63 | @Scripts.Render("~/bundles/jqueryval")
64 | }
65 |
--------------------------------------------------------------------------------
/.gitattributes:
--------------------------------------------------------------------------------
1 | ###############################################################################
2 | # Set default behavior to automatically normalize line endings.
3 | ###############################################################################
4 | * text=auto
5 |
6 | ###############################################################################
7 | # Set default behavior for command prompt diff.
8 | #
9 | # This is need for earlier builds of msysgit that does not have it on by
10 | # default for csharp files.
11 | # Note: This is only used by command line
12 | ###############################################################################
13 | #*.cs diff=csharp
14 |
15 | ###############################################################################
16 | # Set the merge driver for project and solution files
17 | #
18 | # Merging from the command prompt will add diff markers to the files if there
19 | # are conflicts (Merging from VS is not affected by the settings below, in VS
20 | # the diff markers are never inserted). Diff markers may cause the following
21 | # file extensions to fail to load in VS. An alternative would be to treat
22 | # these files as binary and thus will always conflict and require user
23 | # intervention with every merge. To do so, just uncomment the entries below
24 | ###############################################################################
25 | #*.sln merge=binary
26 | #*.csproj merge=binary
27 | #*.vbproj merge=binary
28 | #*.vcxproj merge=binary
29 | #*.vcproj merge=binary
30 | #*.dbproj merge=binary
31 | #*.fsproj merge=binary
32 | #*.lsproj merge=binary
33 | #*.wixproj merge=binary
34 | #*.modelproj merge=binary
35 | #*.sqlproj merge=binary
36 | #*.wwaproj merge=binary
37 |
38 | ###############################################################################
39 | # behavior for image files
40 | #
41 | # image files are treated as binary by default.
42 | ###############################################################################
43 | #*.jpg binary
44 | #*.png binary
45 | #*.gif binary
46 |
47 | ###############################################################################
48 | # diff behavior for common document formats
49 | #
50 | # Convert binary document formats to text before diffing them. This feature
51 | # is only available from the command line. Turn it on by uncommenting the
52 | # entries below.
53 | ###############################################################################
54 | #*.doc diff=astextplain
55 | #*.DOC diff=astextplain
56 | #*.docx diff=astextplain
57 | #*.DOCX diff=astextplain
58 | #*.dot diff=astextplain
59 | #*.DOT diff=astextplain
60 | #*.pdf diff=astextplain
61 | #*.PDF diff=astextplain
62 | #*.rtf diff=astextplain
63 | #*.RTF diff=astextplain
64 |
--------------------------------------------------------------------------------
/AutomatedTellerMachine/App_Start/Startup.Auth.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.AspNet.Identity;
2 | using Microsoft.AspNet.Identity.EntityFramework;
3 | using Microsoft.AspNet.Identity.Owin;
4 | using Microsoft.Owin;
5 | using Microsoft.Owin.Security.Cookies;
6 | using Microsoft.Owin.Security.DataProtection;
7 | using Microsoft.Owin.Security.Google;
8 | using Owin;
9 | using System;
10 | using AutomatedTellerMachine.Models;
11 |
12 | namespace AutomatedTellerMachine
13 | {
14 | public partial class Startup
15 | {
16 | // For more information on configuring authentication, please visit http://go.microsoft.com/fwlink/?LinkId=301864
17 | public void ConfigureAuth(IAppBuilder app)
18 | {
19 | // Configure the db context and user manager to use a single instance per request
20 | app.CreatePerOwinContext(ApplicationDbContext.Create);
21 | app.CreatePerOwinContext(ApplicationUserManager.Create);
22 |
23 | // Enable the application to use a cookie to store information for the signed in user
24 | // and to use a cookie to temporarily store information about a user logging in with a third party login provider
25 | // Configure the sign in cookie
26 | app.UseCookieAuthentication(new CookieAuthenticationOptions
27 | {
28 | AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
29 | LoginPath = new PathString("/Account/Login"),
30 | Provider = new CookieAuthenticationProvider
31 | {
32 | OnValidateIdentity = SecurityStampValidator.OnValidateIdentity(
33 | validateInterval: TimeSpan.FromMinutes(30),
34 | regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
35 | }
36 | });
37 |
38 | app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);
39 |
40 | // Uncomment the following lines to enable logging in with third party login providers
41 | //app.UseMicrosoftAccountAuthentication(
42 | // clientId: "",
43 | // clientSecret: "");
44 |
45 | //app.UseTwitterAuthentication(
46 | // consumerKey: "",
47 | // consumerSecret: "");
48 |
49 | app.UseFacebookAuthentication(
50 | appId: "1468658983372615",
51 | appSecret: "bfaf465369cce4b99f59b2dc30586a4c");
52 |
53 | //app.UseGoogleAuthentication(new GoogleOAuth2AuthenticationOptions()
54 | //{
55 | // ClientId = "",
56 | // ClientSecret = ""
57 | //});
58 | }
59 | }
60 | }
--------------------------------------------------------------------------------
/AutomatedTellerMachine/Models/FakeDbSet.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Web;
5 |
6 | namespace AutomatedTellerMachine.Models
7 | {
8 | public class FakeDbSet : System.Data.Entity.IDbSet where T : class
9 | {
10 | private readonly List list = new List();
11 |
12 | public FakeDbSet()
13 | {
14 | list = new List();
15 | }
16 |
17 | public FakeDbSet(IEnumerable contents)
18 | {
19 | this.list = contents.ToList();
20 | }
21 |
22 | #region IDbSet Members
23 |
24 | public T Add(T entity)
25 | {
26 | this.list.Add(entity);
27 | return entity;
28 | }
29 |
30 | public T Attach(T entity)
31 | {
32 | this.list.Add(entity);
33 | return entity;
34 | }
35 |
36 | public TDerivedEntity Create() where TDerivedEntity : class, T
37 | {
38 | throw new NotImplementedException();
39 | }
40 |
41 | public T Create()
42 | {
43 | throw new NotImplementedException();
44 | }
45 |
46 | public T Find(params object[] keyValues)
47 | {
48 | throw new NotImplementedException();
49 | }
50 |
51 | public System.Collections.ObjectModel.ObservableCollection Local
52 | {
53 | get
54 | {
55 | throw new NotImplementedException();
56 | }
57 | }
58 |
59 | public T Remove(T entity)
60 | {
61 | this.list.Remove(entity);
62 | return entity;
63 | }
64 |
65 | #endregion
66 |
67 | #region IEnumerable Members
68 |
69 | public IEnumerator GetEnumerator()
70 | {
71 | return this.list.GetEnumerator();
72 | }
73 |
74 | #endregion
75 |
76 | #region IEnumerable Members
77 |
78 | System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
79 | {
80 | return this.list.GetEnumerator();
81 | }
82 |
83 | #endregion
84 |
85 | #region IQueryable Members
86 |
87 | public Type ElementType
88 | {
89 | get { return this.list.AsQueryable().ElementType; }
90 | }
91 |
92 | public System.Linq.Expressions.Expression Expression
93 | {
94 | get { return this.list.AsQueryable().Expression; }
95 | }
96 |
97 | public IQueryProvider Provider
98 | {
99 | get { return this.list.AsQueryable().Provider; }
100 | }
101 |
102 | #endregion
103 | }
104 | }
--------------------------------------------------------------------------------
/AutomatedTellerMachine/Views/Account/Login.cshtml:
--------------------------------------------------------------------------------
1 | @using AutomatedTellerMachine.Models
2 | @model LoginViewModel
3 |
4 | @{
5 | ViewBag.Title = "Log in";
6 | }
7 |
8 | @ViewBag.Title.
9 |
61 | @section Scripts {
62 | @Scripts.Render("~/bundles/jqueryval")
63 | }
--------------------------------------------------------------------------------
/AutomatedTellerMachine/Controllers/CheckingAccountController.cs:
--------------------------------------------------------------------------------
1 | using AutomatedTellerMachine.Models;
2 | using System;
3 | using System.Collections.Generic;
4 | using System.Linq;
5 | using System.Web;
6 | using System.Web.Mvc;
7 | using Microsoft.AspNet.Identity;
8 |
9 | namespace AutomatedTellerMachine.Controllers
10 | {
11 | [Authorize]
12 | public class CheckingAccountController : Controller
13 | {
14 | private ApplicationDbContext db = new ApplicationDbContext();
15 |
16 | // GET: CheckingAccount
17 | public ActionResult Index()
18 | {
19 | return View();
20 | }
21 |
22 | // GET: CheckingAccount/Details
23 | public ActionResult Details()
24 | {
25 | var userId = User.Identity.GetUserId();
26 | var checkingAccount = db.CheckingAccounts.Where(c => c.ApplicationUserId == userId).First();
27 | return View(checkingAccount);
28 | }
29 |
30 | [Authorize(Roles="Admin")]
31 | public ActionResult DetailsForAdmin(int id)
32 | {
33 | var checkingAccount = db.CheckingAccounts.Find(id);
34 | return View("Details", checkingAccount);
35 | }
36 |
37 | [Authorize(Roles = "Admin")]
38 | public ActionResult List()
39 | {
40 | return View(db.CheckingAccounts.ToList());
41 | }
42 |
43 | // GET: CheckingAccount/Create
44 | public ActionResult Create()
45 | {
46 | return View();
47 | }
48 |
49 | // POST: CheckingAccount/Create
50 | [HttpPost]
51 | public ActionResult Create(FormCollection collection)
52 | {
53 | try
54 | {
55 | // TODO: Add insert logic here
56 |
57 | return RedirectToAction("Index");
58 | }
59 | catch
60 | {
61 | return View();
62 | }
63 | }
64 |
65 | // GET: CheckingAccount/Edit/5
66 | public ActionResult Edit(int id)
67 | {
68 | return View();
69 | }
70 |
71 | // POST: CheckingAccount/Edit/5
72 | [HttpPost]
73 | public ActionResult Edit(int id, FormCollection collection)
74 | {
75 | try
76 | {
77 | // TODO: Add update logic here
78 |
79 | return RedirectToAction("Index");
80 | }
81 | catch
82 | {
83 | return View();
84 | }
85 | }
86 |
87 | // GET: CheckingAccount/Delete/5
88 | public ActionResult Delete(int id)
89 | {
90 | return View();
91 | }
92 |
93 | // POST: CheckingAccount/Delete/5
94 | [HttpPost]
95 | public ActionResult Delete(int id, FormCollection collection)
96 | {
97 | try
98 | {
99 | // TODO: Add delete logic here
100 |
101 | return RedirectToAction("Index");
102 | }
103 | catch
104 | {
105 | return View();
106 | }
107 | }
108 | }
109 | }
110 |
--------------------------------------------------------------------------------
/AutomatedTellerMachine/App_Start/IdentityConfig.cs:
--------------------------------------------------------------------------------
1 | using System.Threading.Tasks;
2 | using Microsoft.AspNet.Identity;
3 | using Microsoft.AspNet.Identity.EntityFramework;
4 | using Microsoft.AspNet.Identity.Owin;
5 | using Microsoft.Owin;
6 | using AutomatedTellerMachine.Models;
7 |
8 | namespace AutomatedTellerMachine
9 | {
10 | // Configure the application user manager used in this application. UserManager is defined in ASP.NET Identity and is used by the application.
11 |
12 | public class ApplicationUserManager : UserManager
13 | {
14 | public ApplicationUserManager(IUserStore store)
15 | : base(store)
16 | {
17 | }
18 |
19 | public static ApplicationUserManager Create(IdentityFactoryOptions options, IOwinContext context)
20 | {
21 | var manager = new ApplicationUserManager(new UserStore(context.Get()));
22 | // Configure validation logic for usernames
23 | manager.UserValidator = new UserValidator(manager)
24 | {
25 | AllowOnlyAlphanumericUserNames = false,
26 | RequireUniqueEmail = true
27 | };
28 | // Configure validation logic for passwords
29 | manager.PasswordValidator = new PasswordValidator
30 | {
31 | RequiredLength = 6,
32 | RequireNonLetterOrDigit = true,
33 | RequireDigit = true,
34 | RequireLowercase = true,
35 | RequireUppercase = true,
36 | };
37 | // Register two factor authentication providers. This application uses Phone and Emails as a step of receiving a code for verifying the user
38 | // You can write your own provider and plug in here.
39 | manager.RegisterTwoFactorProvider("PhoneCode", new PhoneNumberTokenProvider
40 | {
41 | MessageFormat = "Your security code is: {0}"
42 | });
43 | manager.RegisterTwoFactorProvider("EmailCode", new EmailTokenProvider
44 | {
45 | Subject = "Security Code",
46 | BodyFormat = "Your security code is: {0}"
47 | });
48 | manager.EmailService = new EmailService();
49 | manager.SmsService = new SmsService();
50 | var dataProtectionProvider = options.DataProtectionProvider;
51 | if (dataProtectionProvider != null)
52 | {
53 | manager.UserTokenProvider = new DataProtectorTokenProvider(dataProtectionProvider.Create("ASP.NET Identity"));
54 | }
55 | return manager;
56 | }
57 | }
58 |
59 | public class EmailService : IIdentityMessageService
60 | {
61 | public Task SendAsync(IdentityMessage message)
62 | {
63 | // Plug in your email service here to send an email.
64 | return Task.FromResult(0);
65 | }
66 | }
67 |
68 | public class SmsService : IIdentityMessageService
69 | {
70 | public Task SendAsync(IdentityMessage message)
71 | {
72 | // Plug in your sms service here to send a text message.
73 | return Task.FromResult(0);
74 | }
75 | }
76 | }
77 |
--------------------------------------------------------------------------------
/AutomatedTellerMachine/Models/AccountViewModels.cs:
--------------------------------------------------------------------------------
1 | using System.ComponentModel.DataAnnotations;
2 |
3 | namespace AutomatedTellerMachine.Models
4 | {
5 | public class ExternalLoginConfirmationViewModel
6 | {
7 | [Required]
8 | [EmailAddress]
9 | [Display(Name = "Email")]
10 | public string Email { get; set; }
11 | }
12 |
13 | public class ExternalLoginListViewModel
14 | {
15 | public string Action { get; set; }
16 | public string ReturnUrl { get; set; }
17 | }
18 |
19 | public class ManageUserViewModel
20 | {
21 | [Required]
22 | [DataType(DataType.Password)]
23 | [Display(Name = "Current password")]
24 | public string OldPassword { get; set; }
25 |
26 | [Required]
27 | [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
28 | [DataType(DataType.Password)]
29 | [Display(Name = "New password")]
30 | public string NewPassword { get; set; }
31 |
32 | [DataType(DataType.Password)]
33 | [Display(Name = "Confirm new password")]
34 | [Compare("NewPassword", ErrorMessage = "The new password and confirmation password do not match.")]
35 | public string ConfirmPassword { get; set; }
36 | }
37 |
38 | public class LoginViewModel
39 | {
40 | [Required]
41 | [EmailAddress]
42 | [Display(Name = "Email")]
43 | public string Email { get; set; }
44 |
45 | [Required]
46 | [DataType(DataType.Password)]
47 | [Display(Name = "Password")]
48 | public string Password { get; set; }
49 |
50 | [Display(Name = "Remember me?")]
51 | public bool RememberMe { get; set; }
52 | }
53 |
54 | public class RegisterViewModel
55 | {
56 | [Required]
57 | [EmailAddress]
58 | [Display(Name = "Email")]
59 | public string Email { get; set; }
60 |
61 | [Required]
62 | [Display(Name = "First name")]
63 | public string FirstName { get; set; }
64 |
65 | [Required]
66 | [Display(Name = "Last name")]
67 | public string LastName { get; set; }
68 |
69 | [Required]
70 | [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
71 | [DataType(DataType.Password)]
72 | [Display(Name = "Password")]
73 | public string Password { get; set; }
74 |
75 | [DataType(DataType.Password)]
76 | [Display(Name = "Confirm password")]
77 | [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
78 | public string ConfirmPassword { get; set; }
79 | }
80 |
81 | public class ResetPasswordViewModel
82 | {
83 | [Required]
84 | [EmailAddress]
85 | [Display(Name = "Email")]
86 | public string Email { get; set; }
87 |
88 | [Required]
89 | [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
90 | [DataType(DataType.Password)]
91 | [Display(Name = "Password")]
92 | public string Password { get; set; }
93 |
94 | [DataType(DataType.Password)]
95 | [Display(Name = "Confirm password")]
96 | [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
97 | public string ConfirmPassword { get; set; }
98 |
99 | public string Code { get; set; }
100 | }
101 |
102 | public class ForgotPasswordViewModel
103 | {
104 | [Required]
105 | [EmailAddress]
106 | [Display(Name = "Email")]
107 | public string Email { get; set; }
108 | }
109 | }
110 |
--------------------------------------------------------------------------------
/AutomatedTellerMachine/Web.config:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
--------------------------------------------------------------------------------
/AutomatedTellerMachine/Scripts/respond.min.js:
--------------------------------------------------------------------------------
1 | /*! Respond.js v1.4.2: min/max-width media query polyfill * Copyright 2013 Scott Jehl
2 | * Licensed under https://github.com/scottjehl/Respond/blob/master/LICENSE-MIT
3 | * */
4 |
5 | !function(a){"use strict";a.matchMedia=a.matchMedia||function(a){var b,c=a.documentElement,d=c.firstElementChild||c.firstChild,e=a.createElement("body"),f=a.createElement("div");return f.id="mq-test-1",f.style.cssText="position:absolute;top:-100em",e.style.background="none",e.appendChild(f),function(a){return f.innerHTML='',c.insertBefore(e,d),b=42===f.offsetWidth,c.removeChild(e),{matches:b,media:a}}}(a.document)}(this),function(a){"use strict";function b(){u(!0)}var c={};a.respond=c,c.update=function(){};var d=[],e=function(){var b=!1;try{b=new a.XMLHttpRequest}catch(c){b=new a.ActiveXObject("Microsoft.XMLHTTP")}return function(){return b}}(),f=function(a,b){var c=e();c&&(c.open("GET",a,!0),c.onreadystatechange=function(){4!==c.readyState||200!==c.status&&304!==c.status||b(c.responseText)},4!==c.readyState&&c.send(null))};if(c.ajax=f,c.queue=d,c.regex={media:/@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi,keyframes:/@(?:\-(?:o|moz|webkit)\-)?keyframes[^\{]+\{(?:[^\{\}]*\{[^\}\{]*\})+[^\}]*\}/gi,urls:/(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g,findStyles:/@media *([^\{]+)\{([\S\s]+?)$/,only:/(only\s+)?([a-zA-Z]+)\s?/,minw:/\([\s]*min\-width\s*:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/,maxw:/\([\s]*max\-width\s*:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/},c.mediaQueriesSupported=a.matchMedia&&null!==a.matchMedia("only all")&&a.matchMedia("only all").matches,!c.mediaQueriesSupported){var g,h,i,j=a.document,k=j.documentElement,l=[],m=[],n=[],o={},p=30,q=j.getElementsByTagName("head")[0]||k,r=j.getElementsByTagName("base")[0],s=q.getElementsByTagName("link"),t=function(){var a,b=j.createElement("div"),c=j.body,d=k.style.fontSize,e=c&&c.style.fontSize,f=!1;return b.style.cssText="position:absolute;font-size:1em;width:1em",c||(c=f=j.createElement("body"),c.style.background="none"),k.style.fontSize="100%",c.style.fontSize="100%",c.appendChild(b),f&&k.insertBefore(c,k.firstChild),a=b.offsetWidth,f?k.removeChild(c):c.removeChild(b),k.style.fontSize=d,e&&(c.style.fontSize=e),a=i=parseFloat(a)},u=function(b){var c="clientWidth",d=k[c],e="CSS1Compat"===j.compatMode&&d||j.body[c]||d,f={},o=s[s.length-1],r=(new Date).getTime();if(b&&g&&p>r-g)return a.clearTimeout(h),h=a.setTimeout(u,p),void 0;g=r;for(var v in l)if(l.hasOwnProperty(v)){var w=l[v],x=w.minw,y=w.maxw,z=null===x,A=null===y,B="em";x&&(x=parseFloat(x)*(x.indexOf(B)>-1?i||t():1)),y&&(y=parseFloat(y)*(y.indexOf(B)>-1?i||t():1)),w.hasquery&&(z&&A||!(z||e>=x)||!(A||y>=e))||(f[w.media]||(f[w.media]=[]),f[w.media].push(m[w.rules]))}for(var C in n)n.hasOwnProperty(C)&&n[C]&&n[C].parentNode===q&&q.removeChild(n[C]);n.length=0;for(var D in f)if(f.hasOwnProperty(D)){var E=j.createElement("style"),F=f[D].join("\n");E.type="text/css",E.media=D,q.insertBefore(E,o.nextSibling),E.styleSheet?E.styleSheet.cssText=F:E.appendChild(j.createTextNode(F)),n.push(E)}},v=function(a,b,d){var e=a.replace(c.regex.keyframes,"").match(c.regex.media),f=e&&e.length||0;b=b.substring(0,b.lastIndexOf("/"));var g=function(a){return a.replace(c.regex.urls,"$1"+b+"$2$3")},h=!f&&d;b.length&&(b+="/"),h&&(f=1);for(var i=0;f>i;i++){var j,k,n,o;h?(j=d,m.push(g(a))):(j=e[i].match(c.regex.findStyles)&&RegExp.$1,m.push(RegExp.$2&&g(RegExp.$2))),n=j.split(","),o=n.length;for(var p=0;o>p;p++)k=n[p],l.push({media:k.split("(")[0].match(c.regex.only)&&RegExp.$2||"all",rules:m.length-1,hasquery:k.indexOf("(")>-1,minw:k.match(c.regex.minw)&&parseFloat(RegExp.$1)+(RegExp.$2||""),maxw:k.match(c.regex.maxw)&&parseFloat(RegExp.$1)+(RegExp.$2||"")})}u()},w=function(){if(d.length){var b=d.shift();f(b.href,function(c){v(c,b.href,b.media),o[b.href]=!0,a.setTimeout(function(){w()},0)})}},x=function(){for(var b=0;b #mq-test-1 { width: 42px; }',c.insertBefore(e,d),b=42===f.offsetWidth,c.removeChild(e),{matches:b,media:a}}}(a.document)}(this),function(a){"use strict";if(a.matchMedia&&a.matchMedia("all").addListener)return!1;var b=a.matchMedia,c=b("only all").matches,d=!1,e=0,f=[],g=function(){a.clearTimeout(e),e=a.setTimeout(function(){for(var c=0,d=f.length;d>c;c++){var e=f[c].mql,g=f[c].listeners||[],h=b(e.media).matches;if(h!==e.matches){e.matches=h;for(var i=0,j=g.length;j>i;i++)g[i].call(a,e)}}},30)};a.matchMedia=function(e){var h=b(e),i=[],j=0;return h.addListener=function(b){c&&(d||(d=!0,a.addEventListener("resize",g,!0)),0===j&&(j=f.push({mql:h,listeners:i})),i.push(b))},h.removeListener=function(a){for(var b=0,c=i.length;c>b;b++)i[b]===a&&i.splice(b,1)},h}}(this),function(a){"use strict";function b(){u(!0)}var c={};a.respond=c,c.update=function(){};var d=[],e=function(){var b=!1;try{b=new a.XMLHttpRequest}catch(c){b=new a.ActiveXObject("Microsoft.XMLHTTP")}return function(){return b}}(),f=function(a,b){var c=e();c&&(c.open("GET",a,!0),c.onreadystatechange=function(){4!==c.readyState||200!==c.status&&304!==c.status||b(c.responseText)},4!==c.readyState&&c.send(null))};if(c.ajax=f,c.queue=d,c.regex={media:/@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi,keyframes:/@(?:\-(?:o|moz|webkit)\-)?keyframes[^\{]+\{(?:[^\{\}]*\{[^\}\{]*\})+[^\}]*\}/gi,urls:/(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g,findStyles:/@media *([^\{]+)\{([\S\s]+?)$/,only:/(only\s+)?([a-zA-Z]+)\s?/,minw:/\([\s]*min\-width\s*:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/,maxw:/\([\s]*max\-width\s*:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/},c.mediaQueriesSupported=a.matchMedia&&null!==a.matchMedia("only all")&&a.matchMedia("only all").matches,!c.mediaQueriesSupported){var g,h,i,j=a.document,k=j.documentElement,l=[],m=[],n=[],o={},p=30,q=j.getElementsByTagName("head")[0]||k,r=j.getElementsByTagName("base")[0],s=q.getElementsByTagName("link"),t=function(){var a,b=j.createElement("div"),c=j.body,d=k.style.fontSize,e=c&&c.style.fontSize,f=!1;return b.style.cssText="position:absolute;font-size:1em;width:1em",c||(c=f=j.createElement("body"),c.style.background="none"),k.style.fontSize="100%",c.style.fontSize="100%",c.appendChild(b),f&&k.insertBefore(c,k.firstChild),a=b.offsetWidth,f?k.removeChild(c):c.removeChild(b),k.style.fontSize=d,e&&(c.style.fontSize=e),a=i=parseFloat(a)},u=function(b){var c="clientWidth",d=k[c],e="CSS1Compat"===j.compatMode&&d||j.body[c]||d,f={},o=s[s.length-1],r=(new Date).getTime();if(b&&g&&p>r-g)return a.clearTimeout(h),h=a.setTimeout(u,p),void 0;g=r;for(var v in l)if(l.hasOwnProperty(v)){var w=l[v],x=w.minw,y=w.maxw,z=null===x,A=null===y,B="em";x&&(x=parseFloat(x)*(x.indexOf(B)>-1?i||t():1)),y&&(y=parseFloat(y)*(y.indexOf(B)>-1?i||t():1)),w.hasquery&&(z&&A||!(z||e>=x)||!(A||y>=e))||(f[w.media]||(f[w.media]=[]),f[w.media].push(m[w.rules]))}for(var C in n)n.hasOwnProperty(C)&&n[C]&&n[C].parentNode===q&&q.removeChild(n[C]);n.length=0;for(var D in f)if(f.hasOwnProperty(D)){var E=j.createElement("style"),F=f[D].join("\n");E.type="text/css",E.media=D,q.insertBefore(E,o.nextSibling),E.styleSheet?E.styleSheet.cssText=F:E.appendChild(j.createTextNode(F)),n.push(E)}},v=function(a,b,d){var e=a.replace(c.regex.keyframes,"").match(c.regex.media),f=e&&e.length||0;b=b.substring(0,b.lastIndexOf("/"));var g=function(a){return a.replace(c.regex.urls,"$1"+b+"$2$3")},h=!f&&d;b.length&&(b+="/"),h&&(f=1);for(var i=0;f>i;i++){var j,k,n,o;h?(j=d,m.push(g(a))):(j=e[i].match(c.regex.findStyles)&&RegExp.$1,m.push(RegExp.$2&&g(RegExp.$2))),n=j.split(","),o=n.length;for(var p=0;o>p;p++)k=n[p],l.push({media:k.split("(")[0].match(c.regex.only)&&RegExp.$2||"all",rules:m.length-1,hasquery:k.indexOf("(")>-1,minw:k.match(c.regex.minw)&&parseFloat(RegExp.$1)+(RegExp.$2||""),maxw:k.match(c.regex.maxw)&&parseFloat(RegExp.$1)+(RegExp.$2||"")})}u()},w=function(){if(d.length){var b=d.shift();f(b.href,function(c){v(c,b.href,b.media),o[b.href]=!0,a.setTimeout(function(){w()},0)})}},x=function(){for(var b=0;b
2 |
3 |
4 |
5 | Your ASP.NET application
6 |
95 |
96 |
97 |
98 |
102 |
103 |
104 |
105 |
This application consists of:
106 |
107 | - Sample pages showing basic nav between Home, About, and Contact
108 | - Theming using Bootstrap
109 | - Authentication, if selected, shows how to register and sign in
110 | - ASP.NET features managed using NuGet
111 |
112 |
113 |
114 |
115 |
Customize app
116 |
130 |
131 |
132 |
140 |
141 |
142 |
Get help
143 |
147 |
148 |
149 |
150 |
151 |
--------------------------------------------------------------------------------
/AutomatedTellerMachine/Migrations/201407071700075_InitialCreate.cs:
--------------------------------------------------------------------------------
1 | namespace AutomatedTellerMachine.Migrations
2 | {
3 | using System;
4 | using System.Data.Entity.Migrations;
5 |
6 | public partial class InitialCreate : DbMigration
7 | {
8 | public override void Up()
9 | {
10 | CreateTable(
11 | "dbo.CheckingAccounts",
12 | c => new
13 | {
14 | Id = c.Int(nullable: false, identity: true),
15 | AccountNumber = c.String(nullable: false),
16 | FirstName = c.String(nullable: false),
17 | LastName = c.String(nullable: false),
18 | Balance = c.Decimal(nullable: false, precision: 18, scale: 2),
19 | ApplicationUserId = c.String(maxLength: 128),
20 | })
21 | .PrimaryKey(t => t.Id)
22 | .ForeignKey("dbo.AspNetUsers", t => t.ApplicationUserId)
23 | .Index(t => t.ApplicationUserId);
24 |
25 | CreateTable(
26 | "dbo.AspNetUsers",
27 | c => new
28 | {
29 | Id = c.String(nullable: false, maxLength: 128),
30 | Email = c.String(maxLength: 256),
31 | EmailConfirmed = c.Boolean(nullable: false),
32 | PasswordHash = c.String(),
33 | SecurityStamp = c.String(),
34 | PhoneNumber = c.String(),
35 | PhoneNumberConfirmed = c.Boolean(nullable: false),
36 | TwoFactorEnabled = c.Boolean(nullable: false),
37 | LockoutEndDateUtc = c.DateTime(),
38 | LockoutEnabled = c.Boolean(nullable: false),
39 | AccessFailedCount = c.Int(nullable: false),
40 | UserName = c.String(nullable: false, maxLength: 256),
41 | })
42 | .PrimaryKey(t => t.Id)
43 | .Index(t => t.UserName, unique: true, name: "UserNameIndex");
44 |
45 | CreateTable(
46 | "dbo.AspNetUserClaims",
47 | c => new
48 | {
49 | Id = c.Int(nullable: false, identity: true),
50 | UserId = c.String(nullable: false, maxLength: 128),
51 | ClaimType = c.String(),
52 | ClaimValue = c.String(),
53 | })
54 | .PrimaryKey(t => t.Id)
55 | .ForeignKey("dbo.AspNetUsers", t => t.UserId, cascadeDelete: true)
56 | .Index(t => t.UserId);
57 |
58 | CreateTable(
59 | "dbo.AspNetUserLogins",
60 | c => new
61 | {
62 | LoginProvider = c.String(nullable: false, maxLength: 128),
63 | ProviderKey = c.String(nullable: false, maxLength: 128),
64 | UserId = c.String(nullable: false, maxLength: 128),
65 | })
66 | .PrimaryKey(t => new { t.LoginProvider, t.ProviderKey, t.UserId })
67 | .ForeignKey("dbo.AspNetUsers", t => t.UserId, cascadeDelete: true)
68 | .Index(t => t.UserId);
69 |
70 | CreateTable(
71 | "dbo.AspNetUserRoles",
72 | c => new
73 | {
74 | UserId = c.String(nullable: false, maxLength: 128),
75 | RoleId = c.String(nullable: false, maxLength: 128),
76 | })
77 | .PrimaryKey(t => new { t.UserId, t.RoleId })
78 | .ForeignKey("dbo.AspNetUsers", t => t.UserId, cascadeDelete: true)
79 | .ForeignKey("dbo.AspNetRoles", t => t.RoleId, cascadeDelete: true)
80 | .Index(t => t.UserId)
81 | .Index(t => t.RoleId);
82 |
83 | CreateTable(
84 | "dbo.AspNetRoles",
85 | c => new
86 | {
87 | Id = c.String(nullable: false, maxLength: 128),
88 | Name = c.String(nullable: false, maxLength: 256),
89 | })
90 | .PrimaryKey(t => t.Id)
91 | .Index(t => t.Name, unique: true, name: "RoleNameIndex");
92 |
93 | }
94 |
95 | public override void Down()
96 | {
97 | DropForeignKey("dbo.AspNetUserRoles", "RoleId", "dbo.AspNetRoles");
98 | DropForeignKey("dbo.CheckingAccounts", "ApplicationUserId", "dbo.AspNetUsers");
99 | DropForeignKey("dbo.AspNetUserRoles", "UserId", "dbo.AspNetUsers");
100 | DropForeignKey("dbo.AspNetUserLogins", "UserId", "dbo.AspNetUsers");
101 | DropForeignKey("dbo.AspNetUserClaims", "UserId", "dbo.AspNetUsers");
102 | DropIndex("dbo.AspNetRoles", "RoleNameIndex");
103 | DropIndex("dbo.AspNetUserRoles", new[] { "RoleId" });
104 | DropIndex("dbo.AspNetUserRoles", new[] { "UserId" });
105 | DropIndex("dbo.AspNetUserLogins", new[] { "UserId" });
106 | DropIndex("dbo.AspNetUserClaims", new[] { "UserId" });
107 | DropIndex("dbo.AspNetUsers", "UserNameIndex");
108 | DropIndex("dbo.CheckingAccounts", new[] { "ApplicationUserId" });
109 | DropTable("dbo.AspNetRoles");
110 | DropTable("dbo.AspNetUserRoles");
111 | DropTable("dbo.AspNetUserLogins");
112 | DropTable("dbo.AspNetUserClaims");
113 | DropTable("dbo.AspNetUsers");
114 | DropTable("dbo.CheckingAccounts");
115 | }
116 | }
117 | }
118 |
--------------------------------------------------------------------------------
/AutomatedTellerMachine/Scripts/jquery.validate.unobtrusive.min.js:
--------------------------------------------------------------------------------
1 | /* NUGET: BEGIN LICENSE TEXT
2 | *
3 | * Microsoft grants you the right to use these script files for the sole
4 | * purpose of either: (i) interacting through your browser with the Microsoft
5 | * website or online service, subject to the applicable licensing or use
6 | * terms; or (ii) using the files as included with a Microsoft product subject
7 | * to that product's license terms. Microsoft reserves all other rights to the
8 | * files not expressly granted by Microsoft, whether by implication, estoppel
9 | * or otherwise. Insofar as a script file is dual licensed under GPL,
10 | * Microsoft neither took the code under GPL nor distributes it thereunder but
11 | * under the terms set out in this paragraph. All notices and licenses
12 | * below are for informational purposes only.
13 | *
14 | * NUGET: END LICENSE TEXT */
15 | /*
16 | ** Unobtrusive validation support library for jQuery and jQuery Validate
17 | ** Copyright (C) Microsoft Corporation. All rights reserved.
18 | */
19 | (function(a){var d=a.validator,b,e="unobtrusiveValidation";function c(a,b,c){a.rules[b]=c;if(a.message)a.messages[b]=a.message}function j(a){return a.replace(/^\s+|\s+$/g,"").split(/\s*,\s*/g)}function f(a){return a.replace(/([!"#$%&'()*+,./:;<=>?@\[\\\]^`{|}~])/g,"\\$1")}function h(a){return a.substr(0,a.lastIndexOf(".")+1)}function g(a,b){if(a.indexOf("*.")===0)a=a.replace("*.",b);return a}function m(c,e){var b=a(this).find("[data-valmsg-for='"+f(e[0].name)+"']"),d=b.attr("data-valmsg-replace"),g=d?a.parseJSON(d)!==false:null;b.removeClass("field-validation-valid").addClass("field-validation-error");c.data("unobtrusiveContainer",b);if(g){b.empty();c.removeClass("input-validation-error").appendTo(b)}else c.hide()}function l(e,d){var c=a(this).find("[data-valmsg-summary=true]"),b=c.find("ul");if(b&&b.length&&d.errorList.length){b.empty();c.addClass("validation-summary-errors").removeClass("validation-summary-valid");a.each(d.errorList,function(){a("").html(this.message).appendTo(b)})}}function k(d){var b=d.data("unobtrusiveContainer"),c=b.attr("data-valmsg-replace"),e=c?a.parseJSON(c):null;if(b){b.addClass("field-validation-valid").removeClass("field-validation-error");d.removeData("unobtrusiveContainer");e&&b.empty()}}function n(){var b=a(this);b.data("validator").resetForm();b.find(".validation-summary-errors").addClass("validation-summary-valid").removeClass("validation-summary-errors");b.find(".field-validation-error").addClass("field-validation-valid").removeClass("field-validation-error").removeData("unobtrusiveContainer").find(">*").removeData("unobtrusiveContainer")}function i(b){var c=a(b),f=c.data(e),i=a.proxy(n,b),g=d.unobtrusive.options||{},h=function(e,d){var c=g[e];c&&a.isFunction(c)&&c.apply(b,d)};if(!f){f={options:{errorClass:g.errorClass||"input-validation-error",errorElement:g.errorElement||"span",errorPlacement:function(){m.apply(b,arguments);h("errorPlacement",arguments)},invalidHandler:function(){l.apply(b,arguments);h("invalidHandler",arguments)},messages:{},rules:{},success:function(){k.apply(b,arguments);h("success",arguments)}},attachValidation:function(){c.off("reset."+e,i).on("reset."+e,i).validate(this.options)},validate:function(){c.validate();return c.valid()}};c.data(e,f)}return f}d.unobtrusive={adapters:[],parseElement:function(b,h){var d=a(b),f=d.parents("form")[0],c,e,g;if(!f)return;c=i(f);c.options.rules[b.name]=e={};c.options.messages[b.name]=g={};a.each(this.adapters,function(){var c="data-val-"+this.name,i=d.attr(c),h={};if(i!==undefined){c+="-";a.each(this.params,function(){h[this]=d.attr(c+this)});this.adapt({element:b,form:f,message:i,params:h,rules:e,messages:g})}});a.extend(e,{__dummy__:true});!h&&c.attachValidation()},parse:function(c){var b=a(c),e=b.parents().addBack().filter("form").add(b.find("form")).has("[data-val=true]");b.find("[data-val=true]").each(function(){d.unobtrusive.parseElement(this,true)});e.each(function(){var a=i(this);a&&a.attachValidation()})}};b=d.unobtrusive.adapters;b.add=function(c,a,b){if(!b){b=a;a=[]}this.push({name:c,params:a,adapt:b});return this};b.addBool=function(a,b){return this.add(a,function(d){c(d,b||a,true)})};b.addMinMax=function(e,g,f,a,d,b){return this.add(e,[d||"min",b||"max"],function(b){var e=b.params.min,d=b.params.max;if(e&&d)c(b,a,[e,d]);else if(e)c(b,g,e);else d&&c(b,f,d)})};b.addSingleVal=function(a,b,d){return this.add(a,[b||"val"],function(e){c(e,d||a,e.params[b])})};d.addMethod("__dummy__",function(){return true});d.addMethod("regex",function(b,c,d){var a;if(this.optional(c))return true;a=(new RegExp(d)).exec(b);return a&&a.index===0&&a[0].length===b.length});d.addMethod("nonalphamin",function(c,d,b){var a;if(b){a=c.match(/\W/g);a=a&&a.length>=b}return a});if(d.methods.extension){b.addSingleVal("accept","mimtype");b.addSingleVal("extension","extension")}else b.addSingleVal("extension","extension","accept");b.addSingleVal("regex","pattern");b.addBool("creditcard").addBool("date").addBool("digits").addBool("email").addBool("number").addBool("url");b.addMinMax("length","minlength","maxlength","rangelength").addMinMax("range","min","max","range");b.addMinMax("minlength","minlength").addMinMax("maxlength","minlength","maxlength");b.add("equalto",["other"],function(b){var i=h(b.element.name),j=b.params.other,d=g(j,i),e=a(b.form).find(":input").filter("[name='"+f(d)+"']")[0];c(b,"equalTo",e)});b.add("required",function(a){(a.element.tagName.toUpperCase()!=="INPUT"||a.element.type.toUpperCase()!=="CHECKBOX")&&c(a,"required",true)});b.add("remote",["url","type","additionalfields"],function(b){var d={url:b.params.url,type:b.params.type||"GET",data:{}},e=h(b.element.name);a.each(j(b.params.additionalfields||b.element.name),function(i,h){var c=g(h,e);d.data[c]=function(){return a(b.form).find(":input").filter("[name='"+f(c)+"']").val()}});c(b,"remote",d)});b.add("password",["min","nonalphamin","regex"],function(a){a.params.min&&c(a,"minlength",a.params.min);a.params.nonalphamin&&c(a,"nonalphamin",a.params.nonalphamin);a.params.regex&&c(a,"regex",a.params.regex)});a(function(){d.unobtrusive.parse(document)})})(jQuery);
--------------------------------------------------------------------------------
/AutomatedTellerMachine/AutomatedTellerMachine.Tests/AutomatedTellerMachine.Tests.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Debug
5 | AnyCPU
6 |
7 |
8 | 2.0
9 | {C03B1594-EDCA-421F-9B91-522F5BA20920}
10 | Library
11 | Properties
12 | AutomatedTellerMachine.Tests
13 | AutomatedTellerMachine.Tests
14 | v4.5.1
15 | 512
16 | {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
17 |
18 |
19 | true
20 | full
21 | false
22 | bin\Debug\
23 | DEBUG;TRACE
24 | prompt
25 | 4
26 |
27 |
28 | pdbonly
29 | true
30 | bin\Release\
31 | TRACE
32 | prompt
33 | 4
34 |
35 |
36 |
37 | ..\..\packages\EntityFramework.6.1.1\lib\net45\EntityFramework.dll
38 |
39 |
40 | ..\..\packages\EntityFramework.6.1.1\lib\net45\EntityFramework.SqlServer.dll
41 |
42 |
43 |
44 |
45 | ..\..\packages\Newtonsoft.Json.6.0.3\lib\net45\Newtonsoft.Json.dll
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 | False
58 | ..\..\packages\Microsoft.AspNet.WebPages.3.2.0\lib\net45\System.Web.Helpers.dll
59 |
60 |
61 | False
62 | ..\..\packages\Microsoft.AspNet.Mvc.5.2.0\lib\net45\System.Web.Mvc.dll
63 |
64 |
65 | False
66 | ..\..\packages\Microsoft.AspNet.Razor.3.2.0\lib\net45\System.Web.Razor.dll
67 |
68 |
69 |
70 | False
71 | ..\..\packages\Microsoft.AspNet.WebPages.3.2.0\lib\net45\System.Web.WebPages.dll
72 |
73 |
74 | False
75 | ..\..\packages\Microsoft.AspNet.WebPages.3.2.0\lib\net45\System.Web.WebPages.Deployment.dll
76 |
77 |
78 | False
79 | ..\..\packages\Microsoft.AspNet.WebPages.3.2.0\lib\net45\System.Web.WebPages.Razor.dll
80 |
81 |
82 |
83 |
84 | True
85 | ..\..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 | {7CAEB0A3-4FDF-44E6-845F-17716F639FD7}
103 | AutomatedTellerMachine
104 |
105 |
106 |
107 |
114 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | ## Ignore Visual Studio temporary files, build results, and
2 | ## files generated by popular Visual Studio add-ons.
3 | ##
4 | ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
5 |
6 | # User-specific files
7 | *.rsuser
8 | *.suo
9 | *.user
10 | *.userosscache
11 | *.sln.docstates
12 |
13 | # User-specific files (MonoDevelop/Xamarin Studio)
14 | *.userprefs
15 |
16 | # Build results
17 | [Dd]ebug/
18 | [Dd]ebugPublic/
19 | [Rr]elease/
20 | [Rr]eleases/
21 | x64/
22 | x86/
23 | [Aa][Rr][Mm]/
24 | [Aa][Rr][Mm]64/
25 | bld/
26 | [Bb]in/
27 | [Oo]bj/
28 | [Ll]og/
29 |
30 | # Visual Studio 2015/2017 cache/options directory
31 | .vs/
32 | # Uncomment if you have tasks that create the project's static files in wwwroot
33 | #wwwroot/
34 |
35 | # Visual Studio 2017 auto generated files
36 | Generated\ Files/
37 |
38 | # MSTest test Results
39 | [Tt]est[Rr]esult*/
40 | [Bb]uild[Ll]og.*
41 |
42 | # NUNIT
43 | *.VisualState.xml
44 | TestResult.xml
45 |
46 | # Build Results of an ATL Project
47 | [Dd]ebugPS/
48 | [Rr]eleasePS/
49 | dlldata.c
50 |
51 | # Benchmark Results
52 | BenchmarkDotNet.Artifacts/
53 |
54 | # .NET Core
55 | project.lock.json
56 | project.fragment.lock.json
57 | artifacts/
58 |
59 | # StyleCop
60 | StyleCopReport.xml
61 |
62 | # Files built by Visual Studio
63 | *_i.c
64 | *_p.c
65 | *_h.h
66 | *.ilk
67 | *.meta
68 | *.obj
69 | *.iobj
70 | *.pch
71 | *.pdb
72 | *.ipdb
73 | *.pgc
74 | *.pgd
75 | *.rsp
76 | *.sbr
77 | *.tlb
78 | *.tli
79 | *.tlh
80 | *.tmp
81 | *.tmp_proj
82 | *_wpftmp.csproj
83 | *.log
84 | *.vspscc
85 | *.vssscc
86 | .builds
87 | *.pidb
88 | *.svclog
89 | *.scc
90 |
91 | # Chutzpah Test files
92 | _Chutzpah*
93 |
94 | # Visual C++ cache files
95 | ipch/
96 | *.aps
97 | *.ncb
98 | *.opendb
99 | *.opensdf
100 | *.sdf
101 | *.cachefile
102 | *.VC.db
103 | *.VC.VC.opendb
104 |
105 | # Visual Studio profiler
106 | *.psess
107 | *.vsp
108 | *.vspx
109 | *.sap
110 |
111 | # Visual Studio Trace Files
112 | *.e2e
113 |
114 | # TFS 2012 Local Workspace
115 | $tf/
116 |
117 | # Guidance Automation Toolkit
118 | *.gpState
119 |
120 | # ReSharper is a .NET coding add-in
121 | _ReSharper*/
122 | *.[Rr]e[Ss]harper
123 | *.DotSettings.user
124 |
125 | # JustCode is a .NET coding add-in
126 | .JustCode
127 |
128 | # TeamCity is a build add-in
129 | _TeamCity*
130 |
131 | # DotCover is a Code Coverage Tool
132 | *.dotCover
133 |
134 | # AxoCover is a Code Coverage Tool
135 | .axoCover/*
136 | !.axoCover/settings.json
137 |
138 | # Visual Studio code coverage results
139 | *.coverage
140 | *.coveragexml
141 |
142 | # NCrunch
143 | _NCrunch_*
144 | .*crunch*.local.xml
145 | nCrunchTemp_*
146 |
147 | # MightyMoose
148 | *.mm.*
149 | AutoTest.Net/
150 |
151 | # Web workbench (sass)
152 | .sass-cache/
153 |
154 | # Installshield output folder
155 | [Ee]xpress/
156 |
157 | # DocProject is a documentation generator add-in
158 | DocProject/buildhelp/
159 | DocProject/Help/*.HxT
160 | DocProject/Help/*.HxC
161 | DocProject/Help/*.hhc
162 | DocProject/Help/*.hhk
163 | DocProject/Help/*.hhp
164 | DocProject/Help/Html2
165 | DocProject/Help/html
166 |
167 | # Click-Once directory
168 | publish/
169 |
170 | # Publish Web Output
171 | *.[Pp]ublish.xml
172 | *.azurePubxml
173 | # Note: Comment the next line if you want to checkin your web deploy settings,
174 | # but database connection strings (with potential passwords) will be unencrypted
175 | *.pubxml
176 | *.publishproj
177 |
178 | # Microsoft Azure Web App publish settings. Comment the next line if you want to
179 | # checkin your Azure Web App publish settings, but sensitive information contained
180 | # in these scripts will be unencrypted
181 | PublishScripts/
182 |
183 | # NuGet Packages
184 | *.nupkg
185 | # The packages folder can be ignored because of Package Restore
186 | **/[Pp]ackages/*
187 | # except build/, which is used as an MSBuild target.
188 | !**/[Pp]ackages/build/
189 | # Uncomment if necessary however generally it will be regenerated when needed
190 | #!**/[Pp]ackages/repositories.config
191 | # NuGet v3's project.json files produces more ignorable files
192 | *.nuget.props
193 | *.nuget.targets
194 |
195 | # Microsoft Azure Build Output
196 | csx/
197 | *.build.csdef
198 |
199 | # Microsoft Azure Emulator
200 | ecf/
201 | rcf/
202 |
203 | # Windows Store app package directories and files
204 | AppPackages/
205 | BundleArtifacts/
206 | Package.StoreAssociation.xml
207 | _pkginfo.txt
208 | *.appx
209 |
210 | # Visual Studio cache files
211 | # files ending in .cache can be ignored
212 | *.[Cc]ache
213 | # but keep track of directories ending in .cache
214 | !?*.[Cc]ache/
215 |
216 | # Others
217 | ClientBin/
218 | ~$*
219 | *~
220 | *.dbmdl
221 | *.dbproj.schemaview
222 | *.jfm
223 | *.pfx
224 | *.publishsettings
225 | orleans.codegen.cs
226 |
227 | # Including strong name files can present a security risk
228 | # (https://github.com/github/gitignore/pull/2483#issue-259490424)
229 | #*.snk
230 |
231 | # Since there are multiple workflows, uncomment next line to ignore bower_components
232 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
233 | #bower_components/
234 |
235 | # RIA/Silverlight projects
236 | Generated_Code/
237 |
238 | # Backup & report files from converting an old project file
239 | # to a newer Visual Studio version. Backup files are not needed,
240 | # because we have git ;-)
241 | _UpgradeReport_Files/
242 | Backup*/
243 | UpgradeLog*.XML
244 | UpgradeLog*.htm
245 | ServiceFabricBackup/
246 | *.rptproj.bak
247 |
248 | # SQL Server files
249 | *.mdf
250 | *.ldf
251 | *.ndf
252 |
253 | # Business Intelligence projects
254 | *.rdl.data
255 | *.bim.layout
256 | *.bim_*.settings
257 | *.rptproj.rsuser
258 | *- Backup*.rdl
259 |
260 | # Microsoft Fakes
261 | FakesAssemblies/
262 |
263 | # GhostDoc plugin setting file
264 | *.GhostDoc.xml
265 |
266 | # Node.js Tools for Visual Studio
267 | .ntvs_analysis.dat
268 | node_modules/
269 |
270 | # Visual Studio 6 build log
271 | *.plg
272 |
273 | # Visual Studio 6 workspace options file
274 | *.opt
275 |
276 | # Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
277 | *.vbw
278 |
279 | # Visual Studio LightSwitch build output
280 | **/*.HTMLClient/GeneratedArtifacts
281 | **/*.DesktopClient/GeneratedArtifacts
282 | **/*.DesktopClient/ModelManifest.xml
283 | **/*.Server/GeneratedArtifacts
284 | **/*.Server/ModelManifest.xml
285 | _Pvt_Extensions
286 |
287 | # Paket dependency manager
288 | .paket/paket.exe
289 | paket-files/
290 |
291 | # FAKE - F# Make
292 | .fake/
293 |
294 | # JetBrains Rider
295 | .idea/
296 | *.sln.iml
297 |
298 | # CodeRush personal settings
299 | .cr/personal
300 |
301 | # Python Tools for Visual Studio (PTVS)
302 | __pycache__/
303 | *.pyc
304 |
305 | # Cake - Uncomment if you are using it
306 | # tools/**
307 | # !tools/packages.config
308 |
309 | # Tabs Studio
310 | *.tss
311 |
312 | # Telerik's JustMock configuration file
313 | *.jmconfig
314 |
315 | # BizTalk build output
316 | *.btp.cs
317 | *.btm.cs
318 | *.odx.cs
319 | *.xsd.cs
320 |
321 | # OpenCover UI analysis results
322 | OpenCover/
323 |
324 | # Azure Stream Analytics local run output
325 | ASALocalRun/
326 |
327 | # MSBuild Binary and Structured Log
328 | *.binlog
329 |
330 | # NVidia Nsight GPU debugger configuration file
331 | *.nvuser
332 |
333 | # MFractors (Xamarin productivity tool) working folder
334 | .mfractor/
335 |
336 | # Local History for Visual Studio
337 | .localhistory/
338 |
339 | # BeatPulse healthcheck temp database
340 | healthchecksdb
--------------------------------------------------------------------------------
/AutomatedTellerMachine/Scripts/respond.js:
--------------------------------------------------------------------------------
1 | /*! matchMedia() polyfill - Test a CSS media type/query in JS. Authors & copyright (c) 2012: Scott Jehl, Paul Irish, Nicholas Zakas. Dual MIT/BSD license */
2 | /*! NOTE: If you're already including a window.matchMedia polyfill via Modernizr or otherwise, you don't need this part */
3 | (function(w) {
4 | "use strict";
5 | w.matchMedia = w.matchMedia || function(doc, undefined) {
6 | var bool, docElem = doc.documentElement, refNode = docElem.firstElementChild || docElem.firstChild, fakeBody = doc.createElement("body"), div = doc.createElement("div");
7 | div.id = "mq-test-1";
8 | div.style.cssText = "position:absolute;top:-100em";
9 | fakeBody.style.background = "none";
10 | fakeBody.appendChild(div);
11 | return function(q) {
12 | div.innerHTML = '';
13 | docElem.insertBefore(fakeBody, refNode);
14 | bool = div.offsetWidth === 42;
15 | docElem.removeChild(fakeBody);
16 | return {
17 | matches: bool,
18 | media: q
19 | };
20 | };
21 | }(w.document);
22 | })(this);
23 |
24 | /*! Respond.js v1.4.0: min/max-width media query polyfill. (c) Scott Jehl. MIT Lic. j.mp/respondjs */
25 | (function(w) {
26 | "use strict";
27 | var respond = {};
28 | w.respond = respond;
29 | respond.update = function() {};
30 | var requestQueue = [], xmlHttp = function() {
31 | var xmlhttpmethod = false;
32 | try {
33 | xmlhttpmethod = new w.XMLHttpRequest();
34 | } catch (e) {
35 | xmlhttpmethod = new w.ActiveXObject("Microsoft.XMLHTTP");
36 | }
37 | return function() {
38 | return xmlhttpmethod;
39 | };
40 | }(), ajax = function(url, callback) {
41 | var req = xmlHttp();
42 | if (!req) {
43 | return;
44 | }
45 | req.open("GET", url, true);
46 | req.onreadystatechange = function() {
47 | if (req.readyState !== 4 || req.status !== 200 && req.status !== 304) {
48 | return;
49 | }
50 | callback(req.responseText);
51 | };
52 | if (req.readyState === 4) {
53 | return;
54 | }
55 | req.send(null);
56 | };
57 | respond.ajax = ajax;
58 | respond.queue = requestQueue;
59 | respond.regex = {
60 | media: /@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi,
61 | keyframes: /@(?:\-(?:o|moz|webkit)\-)?keyframes[^\{]+\{(?:[^\{\}]*\{[^\}\{]*\})+[^\}]*\}/gi,
62 | urls: /(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g,
63 | findStyles: /@media *([^\{]+)\{([\S\s]+?)$/,
64 | only: /(only\s+)?([a-zA-Z]+)\s?/,
65 | minw: /\([\s]*min\-width\s*:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/,
66 | maxw: /\([\s]*max\-width\s*:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/
67 | };
68 | respond.mediaQueriesSupported = w.matchMedia && w.matchMedia("only all") !== null && w.matchMedia("only all").matches;
69 | if (respond.mediaQueriesSupported) {
70 | return;
71 | }
72 | var doc = w.document, docElem = doc.documentElement, mediastyles = [], rules = [], appendedEls = [], parsedSheets = {}, resizeThrottle = 30, head = doc.getElementsByTagName("head")[0] || docElem, base = doc.getElementsByTagName("base")[0], links = head.getElementsByTagName("link"), lastCall, resizeDefer, eminpx, getEmValue = function() {
73 | var ret, div = doc.createElement("div"), body = doc.body, originalHTMLFontSize = docElem.style.fontSize, originalBodyFontSize = body && body.style.fontSize, fakeUsed = false;
74 | div.style.cssText = "position:absolute;font-size:1em;width:1em";
75 | if (!body) {
76 | body = fakeUsed = doc.createElement("body");
77 | body.style.background = "none";
78 | }
79 | docElem.style.fontSize = "100%";
80 | body.style.fontSize = "100%";
81 | body.appendChild(div);
82 | if (fakeUsed) {
83 | docElem.insertBefore(body, docElem.firstChild);
84 | }
85 | ret = div.offsetWidth;
86 | if (fakeUsed) {
87 | docElem.removeChild(body);
88 | } else {
89 | body.removeChild(div);
90 | }
91 | docElem.style.fontSize = originalHTMLFontSize;
92 | if (originalBodyFontSize) {
93 | body.style.fontSize = originalBodyFontSize;
94 | }
95 | ret = eminpx = parseFloat(ret);
96 | return ret;
97 | }, applyMedia = function(fromResize) {
98 | var name = "clientWidth", docElemProp = docElem[name], currWidth = doc.compatMode === "CSS1Compat" && docElemProp || doc.body[name] || docElemProp, styleBlocks = {}, lastLink = links[links.length - 1], now = new Date().getTime();
99 | if (fromResize && lastCall && now - lastCall < resizeThrottle) {
100 | w.clearTimeout(resizeDefer);
101 | resizeDefer = w.setTimeout(applyMedia, resizeThrottle);
102 | return;
103 | } else {
104 | lastCall = now;
105 | }
106 | for (var i in mediastyles) {
107 | if (mediastyles.hasOwnProperty(i)) {
108 | var thisstyle = mediastyles[i], min = thisstyle.minw, max = thisstyle.maxw, minnull = min === null, maxnull = max === null, em = "em";
109 | if (!!min) {
110 | min = parseFloat(min) * (min.indexOf(em) > -1 ? eminpx || getEmValue() : 1);
111 | }
112 | if (!!max) {
113 | max = parseFloat(max) * (max.indexOf(em) > -1 ? eminpx || getEmValue() : 1);
114 | }
115 | if (!thisstyle.hasquery || (!minnull || !maxnull) && (minnull || currWidth >= min) && (maxnull || currWidth <= max)) {
116 | if (!styleBlocks[thisstyle.media]) {
117 | styleBlocks[thisstyle.media] = [];
118 | }
119 | styleBlocks[thisstyle.media].push(rules[thisstyle.rules]);
120 | }
121 | }
122 | }
123 | for (var j in appendedEls) {
124 | if (appendedEls.hasOwnProperty(j)) {
125 | if (appendedEls[j] && appendedEls[j].parentNode === head) {
126 | head.removeChild(appendedEls[j]);
127 | }
128 | }
129 | }
130 | appendedEls.length = 0;
131 | for (var k in styleBlocks) {
132 | if (styleBlocks.hasOwnProperty(k)) {
133 | var ss = doc.createElement("style"), css = styleBlocks[k].join("\n");
134 | ss.type = "text/css";
135 | ss.media = k;
136 | head.insertBefore(ss, lastLink.nextSibling);
137 | if (ss.styleSheet) {
138 | ss.styleSheet.cssText = css;
139 | } else {
140 | ss.appendChild(doc.createTextNode(css));
141 | }
142 | appendedEls.push(ss);
143 | }
144 | }
145 | }, translate = function(styles, href, media) {
146 | var qs = styles.replace(respond.regex.keyframes, "").match(respond.regex.media), ql = qs && qs.length || 0;
147 | href = href.substring(0, href.lastIndexOf("/"));
148 | var repUrls = function(css) {
149 | return css.replace(respond.regex.urls, "$1" + href + "$2$3");
150 | }, useMedia = !ql && media;
151 | if (href.length) {
152 | href += "/";
153 | }
154 | if (useMedia) {
155 | ql = 1;
156 | }
157 | for (var i = 0; i < ql; i++) {
158 | var fullq, thisq, eachq, eql;
159 | if (useMedia) {
160 | fullq = media;
161 | rules.push(repUrls(styles));
162 | } else {
163 | fullq = qs[i].match(respond.regex.findStyles) && RegExp.$1;
164 | rules.push(RegExp.$2 && repUrls(RegExp.$2));
165 | }
166 | eachq = fullq.split(",");
167 | eql = eachq.length;
168 | for (var j = 0; j < eql; j++) {
169 | thisq = eachq[j];
170 | mediastyles.push({
171 | media: thisq.split("(")[0].match(respond.regex.only) && RegExp.$2 || "all",
172 | rules: rules.length - 1,
173 | hasquery: thisq.indexOf("(") > -1,
174 | minw: thisq.match(respond.regex.minw) && parseFloat(RegExp.$1) + (RegExp.$2 || ""),
175 | maxw: thisq.match(respond.regex.maxw) && parseFloat(RegExp.$1) + (RegExp.$2 || "")
176 | });
177 | }
178 | }
179 | applyMedia();
180 | }, makeRequests = function() {
181 | if (requestQueue.length) {
182 | var thisRequest = requestQueue.shift();
183 | ajax(thisRequest.href, function(styles) {
184 | translate(styles, thisRequest.href, thisRequest.media);
185 | parsedSheets[thisRequest.href] = true;
186 | w.setTimeout(function() {
187 | makeRequests();
188 | }, 0);
189 | });
190 | }
191 | }, ripCSS = function() {
192 | for (var i = 0; i < links.length; i++) {
193 | var sheet = links[i], href = sheet.href, media = sheet.media, isCSS = sheet.rel && sheet.rel.toLowerCase() === "stylesheet";
194 | if (!!href && isCSS && !parsedSheets[href]) {
195 | if (sheet.styleSheet && sheet.styleSheet.rawCssText) {
196 | translate(sheet.styleSheet.rawCssText, href, media);
197 | parsedSheets[href] = true;
198 | } else {
199 | if (!/^([a-zA-Z:]*\/\/)/.test(href) && !base || href.replace(RegExp.$1, "").split("/")[0] === w.location.host) {
200 | if (href.substring(0, 2) === "//") {
201 | href = w.location.protocol + href;
202 | }
203 | requestQueue.push({
204 | href: href,
205 | media: media
206 | });
207 | }
208 | }
209 | }
210 | }
211 | makeRequests();
212 | };
213 | ripCSS();
214 | respond.update = ripCSS;
215 | respond.getEmValue = getEmValue;
216 | function callMedia() {
217 | applyMedia(true);
218 | }
219 | if (w.addEventListener) {
220 | w.addEventListener("resize", callMedia, false);
221 | } else if (w.attachEvent) {
222 | w.attachEvent("onresize", callMedia);
223 | }
224 | })(this);
--------------------------------------------------------------------------------
/AutomatedTellerMachine/Migrations/201407071700075_InitialCreate.resx:
--------------------------------------------------------------------------------
1 |
2 |
3 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 | text/microsoft-resx
110 |
111 |
112 | 2.0
113 |
114 |
115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
116 |
117 |
118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
119 |
120 |
121 | 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
122 |
123 |
124 | dbo
125 |
126 |
--------------------------------------------------------------------------------
/AutomatedTellerMachine/Migrations/201407071846136_AccountNumberChanges.resx:
--------------------------------------------------------------------------------
1 |
2 |
3 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 | text/microsoft-resx
110 |
111 |
112 | 2.0
113 |
114 |
115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
116 |
117 |
118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
119 |
120 |
121 | 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
122 |
123 |
124 | dbo
125 |
126 |
--------------------------------------------------------------------------------
/AutomatedTellerMachine/Scripts/respond.matchmedia.addListener.js:
--------------------------------------------------------------------------------
1 | /*! matchMedia() polyfill - Test a CSS media type/query in JS. Authors & copyright (c) 2012: Scott Jehl, Paul Irish, Nicholas Zakas. Dual MIT/BSD license */
2 | /*! NOTE: If you're already including a window.matchMedia polyfill via Modernizr or otherwise, you don't need this part */
3 | (function(w) {
4 | "use strict";
5 | w.matchMedia = w.matchMedia || function(doc, undefined) {
6 | var bool, docElem = doc.documentElement, refNode = docElem.firstElementChild || docElem.firstChild, fakeBody = doc.createElement("body"), div = doc.createElement("div");
7 | div.id = "mq-test-1";
8 | div.style.cssText = "position:absolute;top:-100em";
9 | fakeBody.style.background = "none";
10 | fakeBody.appendChild(div);
11 | return function(q) {
12 | div.innerHTML = '';
13 | docElem.insertBefore(fakeBody, refNode);
14 | bool = div.offsetWidth === 42;
15 | docElem.removeChild(fakeBody);
16 | return {
17 | matches: bool,
18 | media: q
19 | };
20 | };
21 | }(w.document);
22 | })(this);
23 |
24 | /*! matchMedia() polyfill addListener/removeListener extension. Author & copyright (c) 2012: Scott Jehl. Dual MIT/BSD license */
25 | (function(w) {
26 | "use strict";
27 | if (w.matchMedia && w.matchMedia("all").addListener) {
28 | return false;
29 | }
30 | var localMatchMedia = w.matchMedia, hasMediaQueries = localMatchMedia("only all").matches, isListening = false, timeoutID = 0, queries = [], handleChange = function(evt) {
31 | w.clearTimeout(timeoutID);
32 | timeoutID = w.setTimeout(function() {
33 | for (var i = 0, il = queries.length; i < il; i++) {
34 | var mql = queries[i].mql, listeners = queries[i].listeners || [], matches = localMatchMedia(mql.media).matches;
35 | if (matches !== mql.matches) {
36 | mql.matches = matches;
37 | for (var j = 0, jl = listeners.length; j < jl; j++) {
38 | listeners[j].call(w, mql);
39 | }
40 | }
41 | }
42 | }, 30);
43 | };
44 | w.matchMedia = function(media) {
45 | var mql = localMatchMedia(media), listeners = [], index = 0;
46 | mql.addListener = function(listener) {
47 | if (!hasMediaQueries) {
48 | return;
49 | }
50 | if (!isListening) {
51 | isListening = true;
52 | w.addEventListener("resize", handleChange, true);
53 | }
54 | if (index === 0) {
55 | index = queries.push({
56 | mql: mql,
57 | listeners: listeners
58 | });
59 | }
60 | listeners.push(listener);
61 | };
62 | mql.removeListener = function(listener) {
63 | for (var i = 0, il = listeners.length; i < il; i++) {
64 | if (listeners[i] === listener) {
65 | listeners.splice(i, 1);
66 | }
67 | }
68 | };
69 | return mql;
70 | };
71 | })(this);
72 |
73 | /*! Respond.js v1.4.0: min/max-width media query polyfill. (c) Scott Jehl. MIT Lic. j.mp/respondjs */
74 | (function(w) {
75 | "use strict";
76 | var respond = {};
77 | w.respond = respond;
78 | respond.update = function() {};
79 | var requestQueue = [], xmlHttp = function() {
80 | var xmlhttpmethod = false;
81 | try {
82 | xmlhttpmethod = new w.XMLHttpRequest();
83 | } catch (e) {
84 | xmlhttpmethod = new w.ActiveXObject("Microsoft.XMLHTTP");
85 | }
86 | return function() {
87 | return xmlhttpmethod;
88 | };
89 | }(), ajax = function(url, callback) {
90 | var req = xmlHttp();
91 | if (!req) {
92 | return;
93 | }
94 | req.open("GET", url, true);
95 | req.onreadystatechange = function() {
96 | if (req.readyState !== 4 || req.status !== 200 && req.status !== 304) {
97 | return;
98 | }
99 | callback(req.responseText);
100 | };
101 | if (req.readyState === 4) {
102 | return;
103 | }
104 | req.send(null);
105 | };
106 | respond.ajax = ajax;
107 | respond.queue = requestQueue;
108 | respond.regex = {
109 | media: /@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi,
110 | keyframes: /@(?:\-(?:o|moz|webkit)\-)?keyframes[^\{]+\{(?:[^\{\}]*\{[^\}\{]*\})+[^\}]*\}/gi,
111 | urls: /(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g,
112 | findStyles: /@media *([^\{]+)\{([\S\s]+?)$/,
113 | only: /(only\s+)?([a-zA-Z]+)\s?/,
114 | minw: /\([\s]*min\-width\s*:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/,
115 | maxw: /\([\s]*max\-width\s*:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/
116 | };
117 | respond.mediaQueriesSupported = w.matchMedia && w.matchMedia("only all") !== null && w.matchMedia("only all").matches;
118 | if (respond.mediaQueriesSupported) {
119 | return;
120 | }
121 | var doc = w.document, docElem = doc.documentElement, mediastyles = [], rules = [], appendedEls = [], parsedSheets = {}, resizeThrottle = 30, head = doc.getElementsByTagName("head")[0] || docElem, base = doc.getElementsByTagName("base")[0], links = head.getElementsByTagName("link"), lastCall, resizeDefer, eminpx, getEmValue = function() {
122 | var ret, div = doc.createElement("div"), body = doc.body, originalHTMLFontSize = docElem.style.fontSize, originalBodyFontSize = body && body.style.fontSize, fakeUsed = false;
123 | div.style.cssText = "position:absolute;font-size:1em;width:1em";
124 | if (!body) {
125 | body = fakeUsed = doc.createElement("body");
126 | body.style.background = "none";
127 | }
128 | docElem.style.fontSize = "100%";
129 | body.style.fontSize = "100%";
130 | body.appendChild(div);
131 | if (fakeUsed) {
132 | docElem.insertBefore(body, docElem.firstChild);
133 | }
134 | ret = div.offsetWidth;
135 | if (fakeUsed) {
136 | docElem.removeChild(body);
137 | } else {
138 | body.removeChild(div);
139 | }
140 | docElem.style.fontSize = originalHTMLFontSize;
141 | if (originalBodyFontSize) {
142 | body.style.fontSize = originalBodyFontSize;
143 | }
144 | ret = eminpx = parseFloat(ret);
145 | return ret;
146 | }, applyMedia = function(fromResize) {
147 | var name = "clientWidth", docElemProp = docElem[name], currWidth = doc.compatMode === "CSS1Compat" && docElemProp || doc.body[name] || docElemProp, styleBlocks = {}, lastLink = links[links.length - 1], now = new Date().getTime();
148 | if (fromResize && lastCall && now - lastCall < resizeThrottle) {
149 | w.clearTimeout(resizeDefer);
150 | resizeDefer = w.setTimeout(applyMedia, resizeThrottle);
151 | return;
152 | } else {
153 | lastCall = now;
154 | }
155 | for (var i in mediastyles) {
156 | if (mediastyles.hasOwnProperty(i)) {
157 | var thisstyle = mediastyles[i], min = thisstyle.minw, max = thisstyle.maxw, minnull = min === null, maxnull = max === null, em = "em";
158 | if (!!min) {
159 | min = parseFloat(min) * (min.indexOf(em) > -1 ? eminpx || getEmValue() : 1);
160 | }
161 | if (!!max) {
162 | max = parseFloat(max) * (max.indexOf(em) > -1 ? eminpx || getEmValue() : 1);
163 | }
164 | if (!thisstyle.hasquery || (!minnull || !maxnull) && (minnull || currWidth >= min) && (maxnull || currWidth <= max)) {
165 | if (!styleBlocks[thisstyle.media]) {
166 | styleBlocks[thisstyle.media] = [];
167 | }
168 | styleBlocks[thisstyle.media].push(rules[thisstyle.rules]);
169 | }
170 | }
171 | }
172 | for (var j in appendedEls) {
173 | if (appendedEls.hasOwnProperty(j)) {
174 | if (appendedEls[j] && appendedEls[j].parentNode === head) {
175 | head.removeChild(appendedEls[j]);
176 | }
177 | }
178 | }
179 | appendedEls.length = 0;
180 | for (var k in styleBlocks) {
181 | if (styleBlocks.hasOwnProperty(k)) {
182 | var ss = doc.createElement("style"), css = styleBlocks[k].join("\n");
183 | ss.type = "text/css";
184 | ss.media = k;
185 | head.insertBefore(ss, lastLink.nextSibling);
186 | if (ss.styleSheet) {
187 | ss.styleSheet.cssText = css;
188 | } else {
189 | ss.appendChild(doc.createTextNode(css));
190 | }
191 | appendedEls.push(ss);
192 | }
193 | }
194 | }, translate = function(styles, href, media) {
195 | var qs = styles.replace(respond.regex.keyframes, "").match(respond.regex.media), ql = qs && qs.length || 0;
196 | href = href.substring(0, href.lastIndexOf("/"));
197 | var repUrls = function(css) {
198 | return css.replace(respond.regex.urls, "$1" + href + "$2$3");
199 | }, useMedia = !ql && media;
200 | if (href.length) {
201 | href += "/";
202 | }
203 | if (useMedia) {
204 | ql = 1;
205 | }
206 | for (var i = 0; i < ql; i++) {
207 | var fullq, thisq, eachq, eql;
208 | if (useMedia) {
209 | fullq = media;
210 | rules.push(repUrls(styles));
211 | } else {
212 | fullq = qs[i].match(respond.regex.findStyles) && RegExp.$1;
213 | rules.push(RegExp.$2 && repUrls(RegExp.$2));
214 | }
215 | eachq = fullq.split(",");
216 | eql = eachq.length;
217 | for (var j = 0; j < eql; j++) {
218 | thisq = eachq[j];
219 | mediastyles.push({
220 | media: thisq.split("(")[0].match(respond.regex.only) && RegExp.$2 || "all",
221 | rules: rules.length - 1,
222 | hasquery: thisq.indexOf("(") > -1,
223 | minw: thisq.match(respond.regex.minw) && parseFloat(RegExp.$1) + (RegExp.$2 || ""),
224 | maxw: thisq.match(respond.regex.maxw) && parseFloat(RegExp.$1) + (RegExp.$2 || "")
225 | });
226 | }
227 | }
228 | applyMedia();
229 | }, makeRequests = function() {
230 | if (requestQueue.length) {
231 | var thisRequest = requestQueue.shift();
232 | ajax(thisRequest.href, function(styles) {
233 | translate(styles, thisRequest.href, thisRequest.media);
234 | parsedSheets[thisRequest.href] = true;
235 | w.setTimeout(function() {
236 | makeRequests();
237 | }, 0);
238 | });
239 | }
240 | }, ripCSS = function() {
241 | for (var i = 0; i < links.length; i++) {
242 | var sheet = links[i], href = sheet.href, media = sheet.media, isCSS = sheet.rel && sheet.rel.toLowerCase() === "stylesheet";
243 | if (!!href && isCSS && !parsedSheets[href]) {
244 | if (sheet.styleSheet && sheet.styleSheet.rawCssText) {
245 | translate(sheet.styleSheet.rawCssText, href, media);
246 | parsedSheets[href] = true;
247 | } else {
248 | if (!/^([a-zA-Z:]*\/\/)/.test(href) && !base || href.replace(RegExp.$1, "").split("/")[0] === w.location.host) {
249 | if (href.substring(0, 2) === "//") {
250 | href = w.location.protocol + href;
251 | }
252 | requestQueue.push({
253 | href: href,
254 | media: media
255 | });
256 | }
257 | }
258 | }
259 | }
260 | makeRequests();
261 | };
262 | ripCSS();
263 | respond.update = ripCSS;
264 | respond.getEmValue = getEmValue;
265 | function callMedia() {
266 | applyMedia(true);
267 | }
268 | if (w.addEventListener) {
269 | w.addEventListener("resize", callMedia, false);
270 | } else if (w.attachEvent) {
271 | w.attachEvent("onresize", callMedia);
272 | }
273 | })(this);
--------------------------------------------------------------------------------
/AutomatedTellerMachine/Content/bootstrap-theme.min.css:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap v3.2.0 (http://getbootstrap.com)
3 | * Copyright 2011-2014 Twitter, Inc.
4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
5 | */.btn-default,.btn-primary,.btn-success,.btn-info,.btn-warning,.btn-danger{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-default:active,.btn-primary:active,.btn-success:active,.btn-info:active,.btn-warning:active,.btn-danger:active,.btn-default.active,.btn-primary.active,.btn-success.active,.btn-info.active,.btn-warning.active,.btn-danger.active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn:active,.btn.active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0));background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#dbdbdb;border-color:#ccc}.btn-default:hover,.btn-default:focus{background-color:#e0e0e0;background-position:0 -15px}.btn-default:active,.btn-default.active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default:disabled,.btn-default[disabled]{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#428bca 0,#2d6ca2 100%);background-image:-o-linear-gradient(top,#428bca 0,#2d6ca2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#2d6ca2));background-image:linear-gradient(to bottom,#428bca 0,#2d6ca2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff2d6ca2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#2b669a}.btn-primary:hover,.btn-primary:focus{background-color:#2d6ca2;background-position:0 -15px}.btn-primary:active,.btn-primary.active{background-color:#2d6ca2;border-color:#2b669a}.btn-primary:disabled,.btn-primary[disabled]{background-color:#2d6ca2;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#419641));background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:hover,.btn-success:focus{background-color:#419641;background-position:0 -15px}.btn-success:active,.btn-success.active{background-color:#419641;border-color:#3e8f3e}.btn-success:disabled,.btn-success[disabled]{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2aabd2));background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:hover,.btn-info:focus{background-color:#2aabd2;background-position:0 -15px}.btn-info:active,.btn-info.active{background-color:#2aabd2;border-color:#28a4c9}.btn-info:disabled,.btn-info[disabled]{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#eb9316));background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:hover,.btn-warning:focus{background-color:#eb9316;background-position:0 -15px}.btn-warning:active,.btn-warning.active{background-color:#eb9316;border-color:#e38d13}.btn-warning:disabled,.btn-warning[disabled]{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c12e2a));background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:hover,.btn-danger:focus{background-color:#c12e2a;background-position:0 -15px}.btn-danger:active,.btn-danger.active{background-color:#c12e2a;border-color:#b92c28}.btn-danger:disabled,.btn-danger[disabled]{background-color:#c12e2a;background-image:none}.thumbnail,.img-thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{background-color:#357ebd;background-image:-webkit-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:-o-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#357ebd));background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);background-repeat:repeat-x}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-o-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f3f3f3 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f3f3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f3f3f3));background-image:linear-gradient(to bottom,#ebebeb 0,#f3f3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff3f3f3', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-o-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x}.navbar-inverse .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top,#222 0,#282828 100%);background-image:-o-linear-gradient(top,#222 0,#282828 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#222),to(#282828));background-image:linear-gradient(to bottom,#222 0,#282828 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff282828', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-static-top,.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);background-repeat:repeat-x;border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);background-repeat:repeat-x;border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);background-repeat:repeat-x;border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-o-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);background-repeat:repeat-x;border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#428bca 0,#3071a9 100%);background-image:-o-linear-gradient(top,#428bca 0,#3071a9 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#3071a9));background-image:linear-gradient(to bottom,#428bca 0,#3071a9 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);background-repeat:repeat-x}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{text-shadow:0 -1px 0 #3071a9;background-image:-webkit-linear-gradient(top,#428bca 0,#3278b3 100%);background-image:-o-linear-gradient(top,#428bca 0,#3278b3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#3278b3));background-image:linear-gradient(to bottom,#428bca 0,#3278b3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0);background-repeat:repeat-x;border-color:#3278b3}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:-o-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#357ebd));background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-o-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)}
--------------------------------------------------------------------------------
/AutomatedTellerMachine/AutomatedTellerMachine.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Debug
6 | AnyCPU
7 |
8 |
9 | 2.0
10 | {7CAEB0A3-4FDF-44E6-845F-17716F639FD7}
11 | {349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}
12 | Library
13 | Properties
14 | AutomatedTellerMachine
15 | AutomatedTellerMachine
16 | v4.5.1
17 | false
18 | true
19 |
20 |
21 |
22 |
23 |
24 |
25 | true
26 | full
27 | false
28 | bin\
29 | DEBUG;TRACE
30 | prompt
31 | 4
32 |
33 |
34 | pdbonly
35 | true
36 | bin\
37 | TRACE
38 | prompt
39 | 4
40 |
41 |
42 |
43 | False
44 | ..\packages\Antlr.3.5.0.2\lib\Antlr3.Runtime.dll
45 |
46 |
47 | False
48 | ..\packages\EntityFramework.6.1.1\lib\net45\EntityFramework.dll
49 |
50 |
51 | False
52 | ..\packages\EntityFramework.6.1.1\lib\net45\EntityFramework.SqlServer.dll
53 |
54 |
55 | False
56 | ..\packages\Microsoft.AspNet.Identity.Core.2.0.1\lib\net45\Microsoft.AspNet.Identity.Core.dll
57 |
58 |
59 | False
60 | ..\packages\Microsoft.AspNet.Identity.EntityFramework.2.0.1\lib\net45\Microsoft.AspNet.Identity.EntityFramework.dll
61 |
62 |
63 | False
64 | ..\packages\Microsoft.AspNet.Identity.Owin.2.0.1\lib\net45\Microsoft.AspNet.Identity.Owin.dll
65 |
66 |
67 |
68 | False
69 | ..\packages\Newtonsoft.Json.6.0.3\lib\net45\Newtonsoft.Json.dll
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 | False
82 | ..\packages\Microsoft.AspNet.WebPages.3.2.0\lib\net45\System.Web.Helpers.dll
83 |
84 |
85 | False
86 | ..\packages\Microsoft.AspNet.Mvc.5.2.0\lib\net45\System.Web.Mvc.dll
87 |
88 |
89 | False
90 | ..\packages\Microsoft.AspNet.Razor.3.2.0\lib\net45\System.Web.Razor.dll
91 |
92 |
93 | False
94 | ..\packages\Microsoft.AspNet.WebPages.3.2.0\lib\net45\System.Web.WebPages.dll
95 |
96 |
97 | False
98 | ..\packages\Microsoft.AspNet.WebPages.3.2.0\lib\net45\System.Web.WebPages.Deployment.dll
99 |
100 |
101 | False
102 | ..\packages\Microsoft.AspNet.WebPages.3.2.0\lib\net45\System.Web.WebPages.Razor.dll
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 | True
115 | ..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll
116 |
117 |
118 |
119 |
120 |
121 |
122 | ..\packages\Microsoft.AspNet.Web.Optimization.1.1.3\lib\net40\System.Web.Optimization.dll
123 |
124 |
125 | False
126 | ..\packages\WebGrease.1.6.0\lib\WebGrease.dll
127 |
128 |
129 |
130 |
131 | ..\packages\Owin.1.0\lib\net40\Owin.dll
132 |
133 |
134 | ..\packages\Microsoft.Owin.2.1.0\lib\net45\Microsoft.Owin.dll
135 |
136 |
137 | ..\packages\Microsoft.Owin.Host.SystemWeb.2.1.0\lib\net45\Microsoft.Owin.Host.SystemWeb.dll
138 |
139 |
140 | ..\packages\Microsoft.Owin.Security.2.1.0\lib\net45\Microsoft.Owin.Security.dll
141 |
142 |
143 | ..\packages\Microsoft.Owin.Security.Facebook.2.1.0\lib\net45\Microsoft.Owin.Security.Facebook.dll
144 |
145 |
146 | ..\packages\Microsoft.Owin.Security.Cookies.2.1.0\lib\net45\Microsoft.Owin.Security.Cookies.dll
147 |
148 |
149 | ..\packages\Microsoft.Owin.Security.OAuth.2.1.0\lib\net45\Microsoft.Owin.Security.OAuth.dll
150 |
151 |
152 | ..\packages\Microsoft.Owin.Security.Google.2.1.0\lib\net45\Microsoft.Owin.Security.Google.dll
153 |
154 |
155 | ..\packages\Microsoft.Owin.Security.Twitter.2.1.0\lib\net45\Microsoft.Owin.Security.Twitter.dll
156 |
157 |
158 | ..\packages\Microsoft.Owin.Security.MicrosoftAccount.2.1.0\lib\net45\Microsoft.Owin.Security.MicrosoftAccount.dll
159 |
160 |
161 |
162 |
163 |
164 |
165 |
166 |
167 |
168 |
169 |
170 |
171 |
172 | Global.asax
173 |
174 |
175 |
176 | 201407071700075_InitialCreate.cs
177 |
178 |
179 |
180 | 201407071846136_AccountNumberChanges.cs
181 |
182 |
183 |
184 |
185 |
186 |
187 |
188 |
189 |
190 |
191 |
192 |
193 |
194 |
195 |
196 |
197 |
198 |
199 |
200 |
201 |
202 |
203 |
204 |
205 |
206 |
207 |
208 |
209 |
210 |
211 |
212 |
213 |
214 |
215 |
216 |
217 |
218 |
219 |
220 |
221 |
222 |
223 |
224 |
225 |
226 |
227 | Web.config
228 |
229 |
230 | Web.config
231 |
232 |
233 |
234 |
235 |
236 |
237 |
238 |
239 |
240 |
241 |
242 |
243 |
244 |
245 |
246 |
247 |
248 |
249 |
250 |
251 |
252 |
253 |
254 |
255 |
256 |
257 |
258 |
259 |
260 |
261 |
262 |
263 |
264 |
265 |
266 |
267 |
268 | 201407071700075_InitialCreate.cs
269 |
270 |
271 | 201407071846136_AccountNumberChanges.cs
272 |
273 |
274 |
275 | 10.0
276 | $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)
277 |
278 |
279 |
280 |
281 |
282 |
283 |
284 |
285 |
286 |
287 |
288 | True
289 | True
290 | 56431
291 | /
292 | http://localhost:56431/
293 | False
294 | False
295 |
296 |
297 | False
298 |
299 |
300 |
301 |
302 |
308 |
--------------------------------------------------------------------------------
/AutomatedTellerMachine/Scripts/jquery.validate.unobtrusive.js:
--------------------------------------------------------------------------------
1 | /* NUGET: BEGIN LICENSE TEXT
2 | *
3 | * Microsoft grants you the right to use these script files for the sole
4 | * purpose of either: (i) interacting through your browser with the Microsoft
5 | * website or online service, subject to the applicable licensing or use
6 | * terms; or (ii) using the files as included with a Microsoft product subject
7 | * to that product's license terms. Microsoft reserves all other rights to the
8 | * files not expressly granted by Microsoft, whether by implication, estoppel
9 | * or otherwise. Insofar as a script file is dual licensed under GPL,
10 | * Microsoft neither took the code under GPL nor distributes it thereunder but
11 | * under the terms set out in this paragraph. All notices and licenses
12 | * below are for informational purposes only.
13 | *
14 | * NUGET: END LICENSE TEXT */
15 | /*!
16 | ** Unobtrusive validation support library for jQuery and jQuery Validate
17 | ** Copyright (C) Microsoft Corporation. All rights reserved.
18 | */
19 |
20 | /*jslint white: true, browser: true, onevar: true, undef: true, nomen: true, eqeqeq: true, plusplus: true, bitwise: true, regexp: true, newcap: true, immed: true, strict: false */
21 | /*global document: false, jQuery: false */
22 |
23 | (function ($) {
24 | var $jQval = $.validator,
25 | adapters,
26 | data_validation = "unobtrusiveValidation";
27 |
28 | function setValidationValues(options, ruleName, value) {
29 | options.rules[ruleName] = value;
30 | if (options.message) {
31 | options.messages[ruleName] = options.message;
32 | }
33 | }
34 |
35 | function splitAndTrim(value) {
36 | return value.replace(/^\s+|\s+$/g, "").split(/\s*,\s*/g);
37 | }
38 |
39 | function escapeAttributeValue(value) {
40 | // As mentioned on http://api.jquery.com/category/selectors/
41 | return value.replace(/([!"#$%&'()*+,./:;<=>?@\[\\\]^`{|}~])/g, "\\$1");
42 | }
43 |
44 | function getModelPrefix(fieldName) {
45 | return fieldName.substr(0, fieldName.lastIndexOf(".") + 1);
46 | }
47 |
48 | function appendModelPrefix(value, prefix) {
49 | if (value.indexOf("*.") === 0) {
50 | value = value.replace("*.", prefix);
51 | }
52 | return value;
53 | }
54 |
55 | function onError(error, inputElement) { // 'this' is the form element
56 | var container = $(this).find("[data-valmsg-for='" + escapeAttributeValue(inputElement[0].name) + "']"),
57 | replaceAttrValue = container.attr("data-valmsg-replace"),
58 | replace = replaceAttrValue ? $.parseJSON(replaceAttrValue) !== false : null;
59 |
60 | container.removeClass("field-validation-valid").addClass("field-validation-error");
61 | error.data("unobtrusiveContainer", container);
62 |
63 | if (replace) {
64 | container.empty();
65 | error.removeClass("input-validation-error").appendTo(container);
66 | }
67 | else {
68 | error.hide();
69 | }
70 | }
71 |
72 | function onErrors(event, validator) { // 'this' is the form element
73 | var container = $(this).find("[data-valmsg-summary=true]"),
74 | list = container.find("ul");
75 |
76 | if (list && list.length && validator.errorList.length) {
77 | list.empty();
78 | container.addClass("validation-summary-errors").removeClass("validation-summary-valid");
79 |
80 | $.each(validator.errorList, function () {
81 | $("").html(this.message).appendTo(list);
82 | });
83 | }
84 | }
85 |
86 | function onSuccess(error) { // 'this' is the form element
87 | var container = error.data("unobtrusiveContainer"),
88 | replaceAttrValue = container.attr("data-valmsg-replace"),
89 | replace = replaceAttrValue ? $.parseJSON(replaceAttrValue) : null;
90 |
91 | if (container) {
92 | container.addClass("field-validation-valid").removeClass("field-validation-error");
93 | error.removeData("unobtrusiveContainer");
94 |
95 | if (replace) {
96 | container.empty();
97 | }
98 | }
99 | }
100 |
101 | function onReset(event) { // 'this' is the form element
102 | var $form = $(this);
103 | $form.data("validator").resetForm();
104 | $form.find(".validation-summary-errors")
105 | .addClass("validation-summary-valid")
106 | .removeClass("validation-summary-errors");
107 | $form.find(".field-validation-error")
108 | .addClass("field-validation-valid")
109 | .removeClass("field-validation-error")
110 | .removeData("unobtrusiveContainer")
111 | .find(">*") // If we were using valmsg-replace, get the underlying error
112 | .removeData("unobtrusiveContainer");
113 | }
114 |
115 | function validationInfo(form) {
116 | var $form = $(form),
117 | result = $form.data(data_validation),
118 | onResetProxy = $.proxy(onReset, form),
119 | defaultOptions = $jQval.unobtrusive.options || {},
120 | execInContext = function (name, args) {
121 | var func = defaultOptions[name];
122 | func && $.isFunction(func) && func.apply(form, args);
123 | }
124 |
125 | if (!result) {
126 | result = {
127 | options: { // options structure passed to jQuery Validate's validate() method
128 | errorClass: defaultOptions.errorClass || "input-validation-error",
129 | errorElement: defaultOptions.errorElement || "span",
130 | errorPlacement: function () {
131 | onError.apply(form, arguments);
132 | execInContext("errorPlacement", arguments);
133 | },
134 | invalidHandler: function () {
135 | onErrors.apply(form, arguments);
136 | execInContext("invalidHandler", arguments);
137 | },
138 | messages: {},
139 | rules: {},
140 | success: function () {
141 | onSuccess.apply(form, arguments);
142 | execInContext("success", arguments);
143 | }
144 | },
145 | attachValidation: function () {
146 | $form
147 | .off("reset." + data_validation, onResetProxy)
148 | .on("reset." + data_validation, onResetProxy)
149 | .validate(this.options);
150 | },
151 | validate: function () { // a validation function that is called by unobtrusive Ajax
152 | $form.validate();
153 | return $form.valid();
154 | }
155 | };
156 | $form.data(data_validation, result);
157 | }
158 |
159 | return result;
160 | }
161 |
162 | $jQval.unobtrusive = {
163 | adapters: [],
164 |
165 | parseElement: function (element, skipAttach) {
166 | ///
167 | /// Parses a single HTML element for unobtrusive validation attributes.
168 | ///
169 | /// The HTML element to be parsed.
170 | /// [Optional] true to skip attaching the
171 | /// validation to the form. If parsing just this single element, you should specify true.
172 | /// If parsing several elements, you should specify false, and manually attach the validation
173 | /// to the form when you are finished. The default is false.
174 | var $element = $(element),
175 | form = $element.parents("form")[0],
176 | valInfo, rules, messages;
177 |
178 | if (!form) { // Cannot do client-side validation without a form
179 | return;
180 | }
181 |
182 | valInfo = validationInfo(form);
183 | valInfo.options.rules[element.name] = rules = {};
184 | valInfo.options.messages[element.name] = messages = {};
185 |
186 | $.each(this.adapters, function () {
187 | var prefix = "data-val-" + this.name,
188 | message = $element.attr(prefix),
189 | paramValues = {};
190 |
191 | if (message !== undefined) { // Compare against undefined, because an empty message is legal (and falsy)
192 | prefix += "-";
193 |
194 | $.each(this.params, function () {
195 | paramValues[this] = $element.attr(prefix + this);
196 | });
197 |
198 | this.adapt({
199 | element: element,
200 | form: form,
201 | message: message,
202 | params: paramValues,
203 | rules: rules,
204 | messages: messages
205 | });
206 | }
207 | });
208 |
209 | $.extend(rules, { "__dummy__": true });
210 |
211 | if (!skipAttach) {
212 | valInfo.attachValidation();
213 | }
214 | },
215 |
216 | parse: function (selector) {
217 | ///
218 | /// Parses all the HTML elements in the specified selector. It looks for input elements decorated
219 | /// with the [data-val=true] attribute value and enables validation according to the data-val-*
220 | /// attribute values.
221 | ///
222 | /// Any valid jQuery selector.
223 |
224 | // $forms includes all forms in selector's DOM hierarchy (parent, children and self) that have at least one
225 | // element with data-val=true
226 | var $selector = $(selector),
227 | $forms = $selector.parents()
228 | .addBack()
229 | .filter("form")
230 | .add($selector.find("form"))
231 | .has("[data-val=true]");
232 |
233 | $selector.find("[data-val=true]").each(function () {
234 | $jQval.unobtrusive.parseElement(this, true);
235 | });
236 |
237 | $forms.each(function () {
238 | var info = validationInfo(this);
239 | if (info) {
240 | info.attachValidation();
241 | }
242 | });
243 | }
244 | };
245 |
246 | adapters = $jQval.unobtrusive.adapters;
247 |
248 | adapters.add = function (adapterName, params, fn) {
249 | /// Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation.
250 | /// The name of the adapter to be added. This matches the name used
251 | /// in the data-val-nnnn HTML attribute (where nnnn is the adapter name).
252 | /// [Optional] An array of parameter names (strings) that will
253 | /// be extracted from the data-val-nnnn-mmmm HTML attributes (where nnnn is the adapter name, and
254 | /// mmmm is the parameter name).
255 | /// The function to call, which adapts the values from the HTML
256 | /// attributes into jQuery Validate rules and/or messages.
257 | ///
258 | if (!fn) { // Called with no params, just a function
259 | fn = params;
260 | params = [];
261 | }
262 | this.push({ name: adapterName, params: params, adapt: fn });
263 | return this;
264 | };
265 |
266 | adapters.addBool = function (adapterName, ruleName) {
267 | /// Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where
268 | /// the jQuery Validate validation rule has no parameter values.
269 | /// The name of the adapter to be added. This matches the name used
270 | /// in the data-val-nnnn HTML attribute (where nnnn is the adapter name).
271 | /// [Optional] The name of the jQuery Validate rule. If not provided, the value
272 | /// of adapterName will be used instead.
273 | ///
274 | return this.add(adapterName, function (options) {
275 | setValidationValues(options, ruleName || adapterName, true);
276 | });
277 | };
278 |
279 | adapters.addMinMax = function (adapterName, minRuleName, maxRuleName, minMaxRuleName, minAttribute, maxAttribute) {
280 | /// Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where
281 | /// the jQuery Validate validation has three potential rules (one for min-only, one for max-only, and
282 | /// one for min-and-max). The HTML parameters are expected to be named -min and -max.
283 | /// The name of the adapter to be added. This matches the name used
284 | /// in the data-val-nnnn HTML attribute (where nnnn is the adapter name).
285 | /// The name of the jQuery Validate rule to be used when you only
286 | /// have a minimum value.
287 | /// The name of the jQuery Validate rule to be used when you only
288 | /// have a maximum value.
289 | /// The name of the jQuery Validate rule to be used when you
290 | /// have both a minimum and maximum value.
291 | /// [Optional] The name of the HTML attribute that
292 | /// contains the minimum value. The default is "min".
293 | /// [Optional] The name of the HTML attribute that
294 | /// contains the maximum value. The default is "max".
295 | ///
296 | return this.add(adapterName, [minAttribute || "min", maxAttribute || "max"], function (options) {
297 | var min = options.params.min,
298 | max = options.params.max;
299 |
300 | if (min && max) {
301 | setValidationValues(options, minMaxRuleName, [min, max]);
302 | }
303 | else if (min) {
304 | setValidationValues(options, minRuleName, min);
305 | }
306 | else if (max) {
307 | setValidationValues(options, maxRuleName, max);
308 | }
309 | });
310 | };
311 |
312 | adapters.addSingleVal = function (adapterName, attribute, ruleName) {
313 | /// Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where
314 | /// the jQuery Validate validation rule has a single value.
315 | /// The name of the adapter to be added. This matches the name used
316 | /// in the data-val-nnnn HTML attribute(where nnnn is the adapter name).
317 | /// [Optional] The name of the HTML attribute that contains the value.
318 | /// The default is "val".
319 | /// [Optional] The name of the jQuery Validate rule. If not provided, the value
320 | /// of adapterName will be used instead.
321 | ///
322 | return this.add(adapterName, [attribute || "val"], function (options) {
323 | setValidationValues(options, ruleName || adapterName, options.params[attribute]);
324 | });
325 | };
326 |
327 | $jQval.addMethod("__dummy__", function (value, element, params) {
328 | return true;
329 | });
330 |
331 | $jQval.addMethod("regex", function (value, element, params) {
332 | var match;
333 | if (this.optional(element)) {
334 | return true;
335 | }
336 |
337 | match = new RegExp(params).exec(value);
338 | return (match && (match.index === 0) && (match[0].length === value.length));
339 | });
340 |
341 | $jQval.addMethod("nonalphamin", function (value, element, nonalphamin) {
342 | var match;
343 | if (nonalphamin) {
344 | match = value.match(/\W/g);
345 | match = match && match.length >= nonalphamin;
346 | }
347 | return match;
348 | });
349 |
350 | if ($jQval.methods.extension) {
351 | adapters.addSingleVal("accept", "mimtype");
352 | adapters.addSingleVal("extension", "extension");
353 | } else {
354 | // for backward compatibility, when the 'extension' validation method does not exist, such as with versions
355 | // of JQuery Validation plugin prior to 1.10, we should use the 'accept' method for
356 | // validating the extension, and ignore mime-type validations as they are not supported.
357 | adapters.addSingleVal("extension", "extension", "accept");
358 | }
359 |
360 | adapters.addSingleVal("regex", "pattern");
361 | adapters.addBool("creditcard").addBool("date").addBool("digits").addBool("email").addBool("number").addBool("url");
362 | adapters.addMinMax("length", "minlength", "maxlength", "rangelength").addMinMax("range", "min", "max", "range");
363 | adapters.addMinMax("minlength", "minlength").addMinMax("maxlength", "minlength", "maxlength");
364 | adapters.add("equalto", ["other"], function (options) {
365 | var prefix = getModelPrefix(options.element.name),
366 | other = options.params.other,
367 | fullOtherName = appendModelPrefix(other, prefix),
368 | element = $(options.form).find(":input").filter("[name='" + escapeAttributeValue(fullOtherName) + "']")[0];
369 |
370 | setValidationValues(options, "equalTo", element);
371 | });
372 | adapters.add("required", function (options) {
373 | // jQuery Validate equates "required" with "mandatory" for checkbox elements
374 | if (options.element.tagName.toUpperCase() !== "INPUT" || options.element.type.toUpperCase() !== "CHECKBOX") {
375 | setValidationValues(options, "required", true);
376 | }
377 | });
378 | adapters.add("remote", ["url", "type", "additionalfields"], function (options) {
379 | var value = {
380 | url: options.params.url,
381 | type: options.params.type || "GET",
382 | data: {}
383 | },
384 | prefix = getModelPrefix(options.element.name);
385 |
386 | $.each(splitAndTrim(options.params.additionalfields || options.element.name), function (i, fieldName) {
387 | var paramName = appendModelPrefix(fieldName, prefix);
388 | value.data[paramName] = function () {
389 | return $(options.form).find(":input").filter("[name='" + escapeAttributeValue(paramName) + "']").val();
390 | };
391 | });
392 |
393 | setValidationValues(options, "remote", value);
394 | });
395 | adapters.add("password", ["min", "nonalphamin", "regex"], function (options) {
396 | if (options.params.min) {
397 | setValidationValues(options, "minlength", options.params.min);
398 | }
399 | if (options.params.nonalphamin) {
400 | setValidationValues(options, "nonalphamin", options.params.nonalphamin);
401 | }
402 | if (options.params.regex) {
403 | setValidationValues(options, "regex", options.params.regex);
404 | }
405 | });
406 |
407 | $(function () {
408 | $jQval.unobtrusive.parse(document);
409 | });
410 | }(jQuery));
--------------------------------------------------------------------------------
23 | @foreach (AuthenticationDescription p in loginProviders) 24 | { 25 | 26 | } 27 |
28 |