From 58721e72291226b0ebf3d184b5d11a86e0a5b9ea Mon Sep 17 00:00:00 2001 From: WorldlineConnect Date: Tue, 19 Mar 2024 11:36:03 +0100 Subject: [PATCH] Release 2.0.0. --- .gitignore | 4 + README.md | 9 + full-angularjs/.gitattributes | 1 + full-angularjs/.gitignore | 8 + full-angularjs/.npmrc | 1 + full-angularjs/README.md | 118 + full-angularjs/app/js/app.js | 35 + .../connect/cardnumber.directive.js | 98 + .../connect/validation.directive.js | 48 + .../paymentitem-detail.controller.js | 338 + .../paymentitem-detail.html | 40 + .../templates/applepay.html | 7 + .../paymentitem-detail/templates/boleto.html | 8 + .../paymentitem-detail/templates/cards.html | 98 + .../templates/input-boleto.html | 18 + .../templates/input-currency.html | 16 + .../templates/input-default.html | 26 + .../templates/input-group-dateOfBirth.html | 40 + .../templates/input-select.html | 10 + .../templates/remember-me.html | 4 + .../paymentitem-detail/templates/tooltip.html | 7 + .../paymentitem-selection.controller.js | 174 + .../paymentitem-selection.html | 46 + .../services/connect/googlepay.service.js | 134 + full-angularjs/app/results/failure.html | 9 + full-angularjs/app/results/success.html | 16 + .../sessiondetails.controller.js | 30 + .../app/sessiondetails/sessiondetails.html | 113 + full-angularjs/app/styles/_alerts.scss | 4 + full-angularjs/app/styles/_bootstrap.scss | 50 + full-angularjs/app/styles/_breadcrumb.scss | 16 + full-angularjs/app/styles/_button-groups.scss | 3 + full-angularjs/app/styles/_buttons.scss | 97 + full-angularjs/app/styles/_cobrand.scss | 80 + full-angularjs/app/styles/_dropdowns.scss | 58 + full-angularjs/app/styles/_footer.scss | 6 + full-angularjs/app/styles/_forms.scss | 55 + full-angularjs/app/styles/_grid.scss | 10 + full-angularjs/app/styles/_header.scss | 3 + full-angularjs/app/styles/_hpp.scss | 1082 +++ full-angularjs/app/styles/_icons.scss | 58 + full-angularjs/app/styles/_input-groups.scss | 3 + .../app/styles/_isaac_offcanvas.scss | 109 + full-angularjs/app/styles/_jumbotron.scss | 7 + full-angularjs/app/styles/_labels.scss | 7 + full-angularjs/app/styles/_modals.scss | 7 + full-angularjs/app/styles/_navs.scss | 296 + full-angularjs/app/styles/_panels.scss | 66 + full-angularjs/app/styles/_popovers.scss | 32 + full-angularjs/app/styles/_sticky-footer.scss | 18 + full-angularjs/app/styles/_tables.scss | 5 + full-angularjs/app/styles/_type.scss | 38 + full-angularjs/app/styles/_variables.scss | 860 ++ full-angularjs/app/styles/base.scss | 41 + .../app/styles/mixins/_isaac-caret.scss | 32 + .../app/styles/mixins/_isaac-ie8fixes.scss | 7 + .../app/styles/mixins/_isaac-responsive.scss | 47 + full-angularjs/fonts/icons/icons.eot | Bin 0 -> 3096 bytes full-angularjs/fonts/icons/icons.svg | 17 + full-angularjs/fonts/icons/icons.ttf | Bin 0 -> 2932 bytes full-angularjs/fonts/icons/icons.woff | Bin 0 -> 2216 bytes full-angularjs/global/images/loader.png | Bin 0 -> 77087 bytes full-angularjs/global/images/logo.png | Bin 0 -> 6202 bytes full-angularjs/index.html | 148 + full-angularjs/package.json | 30 + full-angularjs/styles/base.css | 4168 +++++++++ full-angularjs/styles/forms.css | 43 + full-angularjs/styles/img/bg-gc.png | Bin 0 -> 12561 bytes full-angularjs/styles/img/bg-lock.png | Bin 0 -> 382 bytes .../styles/img/ccimages-s015f8354a0.png | Bin 0 -> 75230 bytes full-angularjs/styles/img/icons/icon-card.png | Bin 0 -> 1391 bytes .../styles/img/icons/icon-check.png | Bin 0 -> 1166 bytes .../styles/img/icons/icon-close.png | Bin 0 -> 1155 bytes full-angularjs/styles/img/icons/icon-date.png | Bin 0 -> 1353 bytes full-angularjs/styles/img/icons/icon-lock.png | Bin 0 -> 1464 bytes full-angularjs/styles/img/icons/icon-next.png | Bin 0 -> 1161 bytes .../styles/img/icons/icon-person.png | Bin 0 -> 1495 bytes full-angularjs/styles/img/icons/icon-prev.png | Bin 0 -> 1263 bytes full-jquery-handlebars-systemjs/.gitignore | 4 + full-jquery-handlebars-systemjs/.npmrc | 1 + full-jquery-handlebars-systemjs/README.md | 112 + .../fonts/icons/icons.eot | Bin 0 -> 3096 bytes .../fonts/icons/icons.svg | 17 + .../fonts/icons/icons.ttf | Bin 0 -> 2932 bytes .../fonts/icons/icons.woff | Bin 0 -> 2216 bytes .../global/images/icon-next.png | Bin 0 -> 1161 bytes .../global/images/icon-prev.png | Bin 0 -> 1263 bytes .../global/images/loader.png | Bin 0 -> 77087 bytes .../global/images/logo.png | Bin 0 -> 6202 bytes full-jquery-handlebars-systemjs/index.html | 16 + full-jquery-handlebars-systemjs/package.json | 31 + .../src/html/dev-start.html | 246 + .../src/html/dev-success.html | 138 + .../src/html/paymentitem-boleto.html | 283 + .../src/html/paymentitem-cards.html | 296 + .../src/html/paymentitem-non-cards.html | 406 + .../src/html/paymentitem-selection.html | 173 + .../src/js/app/dev-start.js | 56 + .../src/js/app/dev-success.js | 8 + .../src/js/app/paymentitem-boleto.js | 238 + .../src/js/app/paymentitem-cards-helpers.js | 364 + .../src/js/app/paymentitem-cards.js | 327 + .../src/js/app/paymentitem-formatter.js | 1 + .../src/js/app/paymentitem-googlepay.js | 144 + .../js/app/paymentitem-non-cards-helpers.js | 268 + .../src/js/app/paymentitem-non-cards.js | 295 + .../src/js/app/paymentitem-selection.js | 182 + .../src/js/app/validate-defaults.js | 44 + .../src/js/systemjs.config.js | 46 + .../src/styles/_alerts.scss | 4 + .../src/styles/_bootstrap.scss | 49 + .../src/styles/_breadcrumb.scss | 16 + .../src/styles/_button-groups.scss | 3 + .../src/styles/_buttons.scss | 93 + .../src/styles/_cobrand.scss | 81 + .../src/styles/_dropdowns.scss | 58 + .../src/styles/_footer.scss | 6 + .../src/styles/_forms.scss | 55 + .../src/styles/_grid.scss | 10 + .../src/styles/_header.scss | 3 + .../src/styles/_hpp.scss | 1067 +++ .../src/styles/_icons.scss | 58 + .../src/styles/_input-groups.scss | 3 + .../src/styles/_isaac_offcanvas.scss | 109 + .../src/styles/_jumbotron.scss | 7 + .../src/styles/_labels.scss | 7 + .../src/styles/_modals.scss | 7 + .../src/styles/_navs.scss | 296 + .../src/styles/_panels.scss | 67 + .../src/styles/_popovers.scss | 32 + .../src/styles/_sticky-footer.scss | 18 + .../src/styles/_tables.scss | 4 + .../src/styles/_type.scss | 38 + .../src/styles/_variables.scss | 860 ++ .../src/styles/base.scss | 41 + .../src/styles/mixins/_isaac-caret.scss | 32 + .../src/styles/mixins/_isaac-ie8fixes.scss | 7 + .../src/styles/mixins/_isaac-responsive.scss | 47 + minimal-browserify/.gitignore | 4 + minimal-browserify/.npmrc | 1 + minimal-browserify/README.md | 48 + minimal-browserify/index.html | 8 + minimal-browserify/package.json | 20 + minimal-browserify/src/js/app.js | 22 + minimal-prototypejs/.gitignore | 4 + minimal-prototypejs/.npmrc | 1 + minimal-prototypejs/README.md | 40 + minimal-prototypejs/index.html | 10 + minimal-prototypejs/js/app.js | 24 + minimal-prototypejs/js/config.js | 6 + minimal-prototypejs/js/create-payload.js | 36 + minimal-prototypejs/js/prototype.js | 7588 +++++++++++++++++ minimal-prototypejs/package.json | 12 + minimal-requirejs/.gitignore | 4 + minimal-requirejs/.npmrc | 1 + minimal-requirejs/README.md | 46 + minimal-requirejs/index.html | 12 + minimal-requirejs/js/app.js | 26 + minimal-requirejs/js/config.js | 8 + minimal-requirejs/js/create-payload.js | 36 + minimal-requirejs/js/forge-module.js | 3 + minimal-requirejs/package.json | 13 + minimal-systemjs/.gitignore | 4 + minimal-systemjs/.npmrc | 1 + minimal-systemjs/README.md | 38 + minimal-systemjs/index.html | 15 + minimal-systemjs/js/app.js | 22 + minimal-systemjs/js/create-payload.js | 36 + minimal-systemjs/package.json | 21 + minimal-systemjs/systemjs.config.js | 33 + minimal-vite-esm/.gitignore | 34 + minimal-vite-esm/.npmrc | 1 + minimal-vite-esm/README.md | 59 + minimal-vite-esm/index.html | 12 + minimal-vite-esm/package.json | 18 + minimal-vite-esm/src/app.ts | 40 + minimal-vite-esm/src/create-payload.ts | 39 + .../src/get-supported-iin-details.ts | 48 + minimal-vite-esm/src/promise-with-error.ts | 21 + minimal-vite-esm/src/types.ts | 7 + minimal-vite-esm/src/vite-env.d.ts | 1 + minimal-vite-esm/tsconfig.json | 23 + minimal-webpack/.gitignore | 34 + minimal-webpack/.npmrc | 1 + minimal-webpack/README.md | 55 + minimal-webpack/index.html | 11 + minimal-webpack/package.json | 28 + minimal-webpack/src/app.ts | 49 + minimal-webpack/src/create-payload.ts | 39 + .../src/get-supported-iin-details.ts | 48 + minimal-webpack/src/global.d.ts | 8 + minimal-webpack/src/promise-with-error.ts | 18 + minimal-webpack/src/types.ts | 7 + minimal-webpack/tsconfig.json | 30 + minimal-webpack/webpack.config.js | 30 + minimal-webpack/webpack.config.ts | 52 + 196 files changed, 24589 insertions(+) create mode 100644 README.md create mode 100644 full-angularjs/.gitattributes create mode 100644 full-angularjs/.gitignore create mode 100644 full-angularjs/.npmrc create mode 100644 full-angularjs/README.md create mode 100644 full-angularjs/app/js/app.js create mode 100644 full-angularjs/app/paymentitem-detail/directives/connect/cardnumber.directive.js create mode 100644 full-angularjs/app/paymentitem-detail/directives/connect/validation.directive.js create mode 100644 full-angularjs/app/paymentitem-detail/paymentitem-detail.controller.js create mode 100644 full-angularjs/app/paymentitem-detail/paymentitem-detail.html create mode 100644 full-angularjs/app/paymentitem-detail/templates/applepay.html create mode 100644 full-angularjs/app/paymentitem-detail/templates/boleto.html create mode 100644 full-angularjs/app/paymentitem-detail/templates/cards.html create mode 100644 full-angularjs/app/paymentitem-detail/templates/input-boleto.html create mode 100644 full-angularjs/app/paymentitem-detail/templates/input-currency.html create mode 100644 full-angularjs/app/paymentitem-detail/templates/input-default.html create mode 100644 full-angularjs/app/paymentitem-detail/templates/input-group-dateOfBirth.html create mode 100644 full-angularjs/app/paymentitem-detail/templates/input-select.html create mode 100644 full-angularjs/app/paymentitem-detail/templates/remember-me.html create mode 100644 full-angularjs/app/paymentitem-detail/templates/tooltip.html create mode 100644 full-angularjs/app/paymentitem-selection/paymentitem-selection.controller.js create mode 100644 full-angularjs/app/paymentitem-selection/paymentitem-selection.html create mode 100644 full-angularjs/app/paymentitem-selection/services/connect/googlepay.service.js create mode 100644 full-angularjs/app/results/failure.html create mode 100644 full-angularjs/app/results/success.html create mode 100644 full-angularjs/app/sessiondetails/sessiondetails.controller.js create mode 100644 full-angularjs/app/sessiondetails/sessiondetails.html create mode 100644 full-angularjs/app/styles/_alerts.scss create mode 100644 full-angularjs/app/styles/_bootstrap.scss create mode 100644 full-angularjs/app/styles/_breadcrumb.scss create mode 100644 full-angularjs/app/styles/_button-groups.scss create mode 100644 full-angularjs/app/styles/_buttons.scss create mode 100644 full-angularjs/app/styles/_cobrand.scss create mode 100644 full-angularjs/app/styles/_dropdowns.scss create mode 100644 full-angularjs/app/styles/_footer.scss create mode 100644 full-angularjs/app/styles/_forms.scss create mode 100644 full-angularjs/app/styles/_grid.scss create mode 100644 full-angularjs/app/styles/_header.scss create mode 100644 full-angularjs/app/styles/_hpp.scss create mode 100644 full-angularjs/app/styles/_icons.scss create mode 100644 full-angularjs/app/styles/_input-groups.scss create mode 100644 full-angularjs/app/styles/_isaac_offcanvas.scss create mode 100644 full-angularjs/app/styles/_jumbotron.scss create mode 100644 full-angularjs/app/styles/_labels.scss create mode 100644 full-angularjs/app/styles/_modals.scss create mode 100644 full-angularjs/app/styles/_navs.scss create mode 100644 full-angularjs/app/styles/_panels.scss create mode 100644 full-angularjs/app/styles/_popovers.scss create mode 100644 full-angularjs/app/styles/_sticky-footer.scss create mode 100644 full-angularjs/app/styles/_tables.scss create mode 100644 full-angularjs/app/styles/_type.scss create mode 100644 full-angularjs/app/styles/_variables.scss create mode 100644 full-angularjs/app/styles/base.scss create mode 100644 full-angularjs/app/styles/mixins/_isaac-caret.scss create mode 100644 full-angularjs/app/styles/mixins/_isaac-ie8fixes.scss create mode 100644 full-angularjs/app/styles/mixins/_isaac-responsive.scss create mode 100644 full-angularjs/fonts/icons/icons.eot create mode 100644 full-angularjs/fonts/icons/icons.svg create mode 100644 full-angularjs/fonts/icons/icons.ttf create mode 100644 full-angularjs/fonts/icons/icons.woff create mode 100644 full-angularjs/global/images/loader.png create mode 100644 full-angularjs/global/images/logo.png create mode 100644 full-angularjs/index.html create mode 100644 full-angularjs/package.json create mode 100644 full-angularjs/styles/base.css create mode 100644 full-angularjs/styles/forms.css create mode 100644 full-angularjs/styles/img/bg-gc.png create mode 100644 full-angularjs/styles/img/bg-lock.png create mode 100644 full-angularjs/styles/img/ccimages-s015f8354a0.png create mode 100644 full-angularjs/styles/img/icons/icon-card.png create mode 100644 full-angularjs/styles/img/icons/icon-check.png create mode 100644 full-angularjs/styles/img/icons/icon-close.png create mode 100644 full-angularjs/styles/img/icons/icon-date.png create mode 100644 full-angularjs/styles/img/icons/icon-lock.png create mode 100644 full-angularjs/styles/img/icons/icon-next.png create mode 100644 full-angularjs/styles/img/icons/icon-person.png create mode 100644 full-angularjs/styles/img/icons/icon-prev.png create mode 100644 full-jquery-handlebars-systemjs/.gitignore create mode 100644 full-jquery-handlebars-systemjs/.npmrc create mode 100644 full-jquery-handlebars-systemjs/README.md create mode 100644 full-jquery-handlebars-systemjs/fonts/icons/icons.eot create mode 100644 full-jquery-handlebars-systemjs/fonts/icons/icons.svg create mode 100644 full-jquery-handlebars-systemjs/fonts/icons/icons.ttf create mode 100644 full-jquery-handlebars-systemjs/fonts/icons/icons.woff create mode 100644 full-jquery-handlebars-systemjs/global/images/icon-next.png create mode 100644 full-jquery-handlebars-systemjs/global/images/icon-prev.png create mode 100644 full-jquery-handlebars-systemjs/global/images/loader.png create mode 100644 full-jquery-handlebars-systemjs/global/images/logo.png create mode 100644 full-jquery-handlebars-systemjs/index.html create mode 100644 full-jquery-handlebars-systemjs/package.json create mode 100644 full-jquery-handlebars-systemjs/src/html/dev-start.html create mode 100644 full-jquery-handlebars-systemjs/src/html/dev-success.html create mode 100644 full-jquery-handlebars-systemjs/src/html/paymentitem-boleto.html create mode 100644 full-jquery-handlebars-systemjs/src/html/paymentitem-cards.html create mode 100644 full-jquery-handlebars-systemjs/src/html/paymentitem-non-cards.html create mode 100644 full-jquery-handlebars-systemjs/src/html/paymentitem-selection.html create mode 100644 full-jquery-handlebars-systemjs/src/js/app/dev-start.js create mode 100644 full-jquery-handlebars-systemjs/src/js/app/dev-success.js create mode 100644 full-jquery-handlebars-systemjs/src/js/app/paymentitem-boleto.js create mode 100644 full-jquery-handlebars-systemjs/src/js/app/paymentitem-cards-helpers.js create mode 100644 full-jquery-handlebars-systemjs/src/js/app/paymentitem-cards.js create mode 100644 full-jquery-handlebars-systemjs/src/js/app/paymentitem-formatter.js create mode 100644 full-jquery-handlebars-systemjs/src/js/app/paymentitem-googlepay.js create mode 100644 full-jquery-handlebars-systemjs/src/js/app/paymentitem-non-cards-helpers.js create mode 100644 full-jquery-handlebars-systemjs/src/js/app/paymentitem-non-cards.js create mode 100644 full-jquery-handlebars-systemjs/src/js/app/paymentitem-selection.js create mode 100644 full-jquery-handlebars-systemjs/src/js/app/validate-defaults.js create mode 100644 full-jquery-handlebars-systemjs/src/js/systemjs.config.js create mode 100644 full-jquery-handlebars-systemjs/src/styles/_alerts.scss create mode 100644 full-jquery-handlebars-systemjs/src/styles/_bootstrap.scss create mode 100644 full-jquery-handlebars-systemjs/src/styles/_breadcrumb.scss create mode 100644 full-jquery-handlebars-systemjs/src/styles/_button-groups.scss create mode 100644 full-jquery-handlebars-systemjs/src/styles/_buttons.scss create mode 100644 full-jquery-handlebars-systemjs/src/styles/_cobrand.scss create mode 100644 full-jquery-handlebars-systemjs/src/styles/_dropdowns.scss create mode 100644 full-jquery-handlebars-systemjs/src/styles/_footer.scss create mode 100644 full-jquery-handlebars-systemjs/src/styles/_forms.scss create mode 100644 full-jquery-handlebars-systemjs/src/styles/_grid.scss create mode 100644 full-jquery-handlebars-systemjs/src/styles/_header.scss create mode 100644 full-jquery-handlebars-systemjs/src/styles/_hpp.scss create mode 100644 full-jquery-handlebars-systemjs/src/styles/_icons.scss create mode 100644 full-jquery-handlebars-systemjs/src/styles/_input-groups.scss create mode 100644 full-jquery-handlebars-systemjs/src/styles/_isaac_offcanvas.scss create mode 100644 full-jquery-handlebars-systemjs/src/styles/_jumbotron.scss create mode 100644 full-jquery-handlebars-systemjs/src/styles/_labels.scss create mode 100644 full-jquery-handlebars-systemjs/src/styles/_modals.scss create mode 100644 full-jquery-handlebars-systemjs/src/styles/_navs.scss create mode 100644 full-jquery-handlebars-systemjs/src/styles/_panels.scss create mode 100644 full-jquery-handlebars-systemjs/src/styles/_popovers.scss create mode 100644 full-jquery-handlebars-systemjs/src/styles/_sticky-footer.scss create mode 100644 full-jquery-handlebars-systemjs/src/styles/_tables.scss create mode 100644 full-jquery-handlebars-systemjs/src/styles/_type.scss create mode 100644 full-jquery-handlebars-systemjs/src/styles/_variables.scss create mode 100644 full-jquery-handlebars-systemjs/src/styles/base.scss create mode 100644 full-jquery-handlebars-systemjs/src/styles/mixins/_isaac-caret.scss create mode 100644 full-jquery-handlebars-systemjs/src/styles/mixins/_isaac-ie8fixes.scss create mode 100644 full-jquery-handlebars-systemjs/src/styles/mixins/_isaac-responsive.scss create mode 100644 minimal-browserify/.gitignore create mode 100644 minimal-browserify/.npmrc create mode 100644 minimal-browserify/README.md create mode 100644 minimal-browserify/index.html create mode 100644 minimal-browserify/package.json create mode 100644 minimal-browserify/src/js/app.js create mode 100644 minimal-prototypejs/.gitignore create mode 100644 minimal-prototypejs/.npmrc create mode 100644 minimal-prototypejs/README.md create mode 100644 minimal-prototypejs/index.html create mode 100644 minimal-prototypejs/js/app.js create mode 100644 minimal-prototypejs/js/config.js create mode 100644 minimal-prototypejs/js/create-payload.js create mode 100644 minimal-prototypejs/js/prototype.js create mode 100644 minimal-prototypejs/package.json create mode 100644 minimal-requirejs/.gitignore create mode 100644 minimal-requirejs/.npmrc create mode 100644 minimal-requirejs/README.md create mode 100644 minimal-requirejs/index.html create mode 100644 minimal-requirejs/js/app.js create mode 100644 minimal-requirejs/js/config.js create mode 100644 minimal-requirejs/js/create-payload.js create mode 100644 minimal-requirejs/js/forge-module.js create mode 100644 minimal-requirejs/package.json create mode 100644 minimal-systemjs/.gitignore create mode 100644 minimal-systemjs/.npmrc create mode 100644 minimal-systemjs/README.md create mode 100644 minimal-systemjs/index.html create mode 100644 minimal-systemjs/js/app.js create mode 100644 minimal-systemjs/js/create-payload.js create mode 100644 minimal-systemjs/package.json create mode 100644 minimal-systemjs/systemjs.config.js create mode 100644 minimal-vite-esm/.gitignore create mode 100644 minimal-vite-esm/.npmrc create mode 100644 minimal-vite-esm/README.md create mode 100644 minimal-vite-esm/index.html create mode 100644 minimal-vite-esm/package.json create mode 100644 minimal-vite-esm/src/app.ts create mode 100644 minimal-vite-esm/src/create-payload.ts create mode 100644 minimal-vite-esm/src/get-supported-iin-details.ts create mode 100644 minimal-vite-esm/src/promise-with-error.ts create mode 100644 minimal-vite-esm/src/types.ts create mode 100644 minimal-vite-esm/src/vite-env.d.ts create mode 100644 minimal-vite-esm/tsconfig.json create mode 100644 minimal-webpack/.gitignore create mode 100644 minimal-webpack/.npmrc create mode 100644 minimal-webpack/README.md create mode 100644 minimal-webpack/index.html create mode 100644 minimal-webpack/package.json create mode 100644 minimal-webpack/src/app.ts create mode 100644 minimal-webpack/src/create-payload.ts create mode 100644 minimal-webpack/src/get-supported-iin-details.ts create mode 100644 minimal-webpack/src/global.d.ts create mode 100644 minimal-webpack/src/promise-with-error.ts create mode 100644 minimal-webpack/src/types.ts create mode 100644 minimal-webpack/tsconfig.json create mode 100644 minimal-webpack/webpack.config.js create mode 100644 minimal-webpack/webpack.config.ts diff --git a/.gitignore b/.gitignore index e69de29..6b5e759 100644 --- a/.gitignore +++ b/.gitignore @@ -0,0 +1,4 @@ +debug.log +npm-debug.log +.idea/ +*.iml diff --git a/README.md b/README.md new file mode 100644 index 0000000..6b6f0b9 --- /dev/null +++ b/README.md @@ -0,0 +1,9 @@ +# Connect Client SDK Examples + +This repository contains all SDK examples for the [Worldline Connect JavaScript Client SDK](https://docs.connect.worldline-solutions.com/documentation/sdk/mobile/javascript/). +Refer to the README in each folder for more details about that specific example. + +## Full vs. minimal + +Full examples offer a fully working payment flow that mimics all the functionality that the hosted payment pages offer. +The minimal examples show you how to include the SDK with a module loader. diff --git a/full-angularjs/.gitattributes b/full-angularjs/.gitattributes new file mode 100644 index 0000000..176a458 --- /dev/null +++ b/full-angularjs/.gitattributes @@ -0,0 +1 @@ +* text=auto diff --git a/full-angularjs/.gitignore b/full-angularjs/.gitignore new file mode 100644 index 0000000..1947b5e --- /dev/null +++ b/full-angularjs/.gitignore @@ -0,0 +1,8 @@ +.tmp/ +coverage/ +dist/ +node_modules/ +jspm_packages/ +bower_components/ +npm-debug* +package-lock.json \ No newline at end of file diff --git a/full-angularjs/.npmrc b/full-angularjs/.npmrc new file mode 100644 index 0000000..9cf9495 --- /dev/null +++ b/full-angularjs/.npmrc @@ -0,0 +1 @@ +package-lock=false \ No newline at end of file diff --git a/full-angularjs/README.md b/full-angularjs/README.md new file mode 100644 index 0000000..f05fc23 --- /dev/null +++ b/full-angularjs/README.md @@ -0,0 +1,118 @@ +# Angularjs (1.x) Connect Client SDK Example + +🚨 Please note that this example is only compatible with SDK versions up to major version 4. +To learn how to work with the SDK version 5+, please refer to the documentation +on https://docs.connect.worldline-solutions.com/documentation/sdk/mobile/javascript/. + +### What is it? + +This application is an angularjs implementation of an Worldline Connect checkout process. You can use this application as a base for your own angularjs intergrated Worldline Connect powered payment solution. +It offers all features of the [Worldline Connect Responsive Payment Pages (RPP)](https://docs.connect.worldline-solutions.com/documentation/hosted-payment-pages/), including +* payment product selection +* payment product detail pages +* co-branded cards support +* payment product grouping +* payment product switching based on IIN Lookup + +and more. +The [Worldline Connect JavaScript Client SDK](https://github.com/Worldline-Global-Collect/connect-sdk-client-js) is used for all communication to the Worldline Connect Server API and crypto. +A simple webserver is included to make this application easy to install and run in development environments. See the [Worldline Connect Developer Hub](https://docs.connect.worldline-solutions.com/documentation/sdk/mobile/javascript/) +for more information on how to use the Worldline Connect Client API. + +### How to install + +Make sure you have installed [Node.js](https://nodejs.org/en/); the LTS version is recommended. Run + +```bash +npm install +``` + +### How to start the application + +Run the following command to start a webserver on `localhost` at port `3000` with [browsersync](https://www.browsersync.io/). +This will also start a watcher for the [sass](http://sass-lang.com/) files that auto compile to CSS; after each change the page is automatically reloaded for you on all connected devices. + +```bash +npm run start +``` + +When the webserver has started it will automatically load a page in which you have to provide details about the Worldline Connect client session and the payment details. +This page is for example and development purposes only. Notice that the URL contains the `dev-` prefix indicating is a development page. In your production application this information is used to initialize the application. +The final page of the payment journey has a `dev-` prefix as well and contains the encrypted string containing all information that you need to send to Worldline to for-fill the payment. + +### How to start the payment process + +Create a client session identifier and a customer identifier, which the Client API needs for authentication purposes. +These can be obtained by your e-commerce server using the [Server SDKs](https://docs.connect.worldline-solutions.com/documentation/sdk/server/) or directly using the [Server API](https://apireference.connect.worldline-solutions.com/s2sapi/v1/en_US/index.html). +Use this information along with the geographical region of the Client API you want to connect to and the payment details to start the process. +If you incorporate this into your production process all this information should be used to initialize the payment process. + +### In depth + +This application uses the following key frameworks and libraries which are managed by npm: +* Angularjs +* Twitter Bootstrap +* DigitalBazaar Forge +* Worldline Connect Client SDK + +### Other npm commands + +| Command | Description | +|:----------------------|:---------------------------------------------------| +| `npm run build:sass` | builds all css files; once | +| `npm run browsersync` | starts the webserver with browser-sync | +| `npm run postinstall` | automatically run after install (clean&build:sass) | +| `npm run watch:sass` | watch sass changes | + +### Folder structure + +``` ++-- app +| +-- js +| -- app.js - main controller with routing +| +-- payment-detail +| +-- directives +| +-- connect +| -- cardnumber.directive.js - directive which has all logic for cardnumber switchinh +| -- validation.directive.js - directive that binds Connect-sdk validation methods to angular.js +| +-- templates +| -- cards.html - specific template for card payments; since card payments have a lot of extra features compared to the other paymentmethods +| -- input-currency.html - template for currency based input fields +| -- input-default.html - template for input based fields +| -- input-select.html - template for dropdown based fields +| -- remember-me.html - template holding the account on file checkbox +| -- tooltip.html - template with the specific tooltip for a field (if present) +| -- paymentitem-detail.html - template for the payment form; this will load subtemplates on demand from the templates folder +| -- paymentitem-detail.controller.js - control logic for the payment form +| +-- payment-selection +| -- payment-selection.html - template for the payment selection form +| -- payment-selection.controller.js - control logic for the payment selection form +| +-- results +| -- failure.html - result page; failure +| -- success.html - result page; success; this page prints the encrypted blob you can send to Worldline Connect. +| +-- sessiondetails +| -- sessiondetails.html - this page provides the payment- and sessiondetails. +| -- sessiondetails.controller.js - control logic for the sessiondetails page +| +-- styles +| -- contains all sass files needed to compile the css file used with this demo ++-- fonts +| +-- icons +| -- icons.eot/icons.svg/icons.ttf/icons.woff - icons that are used in the cards form ++-- global +| +-- images +| -- loader.png - loading spinner +| -- logo.png - example logo ++-- node_modules +| ... folder containing all node dependencies; run npm install to get the dependencies ++-- styles +| +-- img +| ... folder containing all images used by the CSS +| -- base.css - the compiled css file; use npm run build:sass to compile this file +| -- forms.css - overrides for forms; this is purely used in this example; production code should use a better method to handle the displaying of validation errors +``` + +### Module loading + +This example focuses on displaying how to integrate the Worldline Connect JavaScript Client SDK with angularjs. +Module loading is out of scope of this example. +Refer to the various minimal examples on how to use module loading. diff --git a/full-angularjs/app/js/app.js b/full-angularjs/app/js/app.js new file mode 100644 index 0000000..2bf16c5 --- /dev/null +++ b/full-angularjs/app/js/app.js @@ -0,0 +1,35 @@ +var app = angular.module('app', ['ngRoute', 'ui.bootstrap', 'ui.mask', 'connect.validation', 'connect.cardnumber', 'connect.GooglePay']); + +app.config(['$routeProvider', function ($routeProvider) { + $routeProvider.when('/paymentitem-selection', { + templateUrl: 'app/paymentitem-selection/paymentitem-selection.html', + requiresSession: false + }).when('/paymentitem-detail/:type/:id/:aof?', { + templateUrl: 'app/paymentitem-detail/paymentitem-detail.html', + requiresSession: false + }).when('/dev-sessiondetails', { + templateUrl: 'app/sessiondetails/sessiondetails.html', + requiresSession: false + }).when('/dev-success', { + templateUrl: 'app/results/success.html', + requiresSession: true + }).when('/dev-failure', { + templateUrl: 'app/results/failure.html', + requiresSession: true + }).otherwise({ + templateUrl: 'app/sessiondetails/sessiondetails.html', + requiresSession: false + }); +}]); + +app.run(['$rootScope', '$location', function ($rootScope, $location) { + $rootScope.$on('$routeChangeStart', function (event, next, current) { + if (next.requiresSession && !$rootScope.hasSession) { + $location.path('/dev-sessiondetails'); + } + }); +}]); + +app.controller('app', ['$scope', '$rootScope', '$location', function ($scope, $rootScope, $location) { + $rootScope.loading = false; +}]); \ No newline at end of file diff --git a/full-angularjs/app/paymentitem-detail/directives/connect/cardnumber.directive.js b/full-angularjs/app/paymentitem-detail/directives/connect/cardnumber.directive.js new file mode 100644 index 0000000..2bdaddf --- /dev/null +++ b/full-angularjs/app/paymentitem-detail/directives/connect/cardnumber.directive.js @@ -0,0 +1,98 @@ +angular.module('connect.cardnumber', []).directive('connectCardNumber', function () { + return { + priority: 101, + require: 'ngModel', + restrict: 'A', + compile: function connectCardnumberCompilingFunction() { + + var $scope; + + return function connectCardnumberLinkingFunction(scope, iElement, iAttrs, controller) { + $scope = scope.$parent.$parent.$parent.$parent.$parent; // this is the paymentitem.controller + if (iAttrs.connectCardNumber === 'cardNumber') { + $scope.$watch(function () { + return controller.$$rawModelValue; + }, function (value) { + if (checkBINLength(value)) { + var newBIN = extractBin(value); + getIinDetails(newBIN); + } + }); + } + }; + + function checkBINLength(value) { + var ret = false; + if (value) { + var newBIN = extractBin(value); + if (newBIN !== $scope.currentBIN) { + $scope.currentBIN = newBIN; + ret = true; + } + } + return ret; + } + + function extractBin(value) { + var newBIN; + if (value.length >= 8) { + newBIN = value.substring(0, 8); + } else { + newBIN = value.substring(0, 6); + } + return newBIN; + } + + function getIinDetails(value) { + $scope.connect.session.getIinDetails(value, $scope.connect.paymentDetails).then(function (response) { + $scope.$apply(function () { + $scope.iinDetails = response; + $scope.ccstate = response.status; + if (response.status === "SUPPORTED") { + handleSupportedResponse(response); + } + }); + }, function () { + $scope.$apply(function () { + $scope.ccstate = "ERROR"; + }); + }); + } + + function handleSupportedResponse(response) { + // this card is supported; switch to the card + $scope.getPaymentProduct(response.paymentProductId).then(function (paymentProduct) { + $scope.$apply(function () { + $scope.hasCobrand = false; + $scope.setProduct(paymentProduct.id); + // enrich the cobrands response + if (response.coBrands) { + handleCobrand(response); + } + }); + }); + }; + + function handleCobrand(response) { + var cobrandCount = 0; + angular.forEach(response.coBrands, function (cobrand) { + var paymentProductId = cobrand.paymentProductId; + if (cobrand.isAllowedInContext) { + $scope.paymentProductDisplayHints = $scope.paymentProductDisplayHints || {}; + cobrandCount++; + if (!$scope.paymentProductDisplayHints[paymentProductId]) { + $scope.getPaymentProduct(paymentProductId).then(function (paymentProduct) { + $scope.$apply(function () { + $scope.paymentProductDisplayHints[paymentProductId] = paymentProduct.displayHints; + }); + }); + } + } + }); + if (cobrandCount > 1) { + $scope.hasCobrand = true; + } + } + } + } +}); diff --git a/full-angularjs/app/paymentitem-detail/directives/connect/validation.directive.js b/full-angularjs/app/paymentitem-detail/directives/connect/validation.directive.js new file mode 100644 index 0000000..10eff7b --- /dev/null +++ b/full-angularjs/app/paymentitem-detail/directives/connect/validation.directive.js @@ -0,0 +1,48 @@ +angular.module('connect.validation', []).directive('connectValidation', function () { + return { + priority: 100, + require: 'ngModel', + restrict: 'A', + compile: function connectValidationCompilingFunction() { + + return function connectValidationLinkingFunction(scope, iElement, iAttrs, controller) { + var addValidations = function (field) { + /* Add validators based on the dataRestrictions */ + angular.forEach(field.dataRestrictions.validationRules, function (validationRule) { + controller.$validators[validationRule.type] = function (modelValue, viewValue) { + if (validationRule.type !== 'boletoBancarioRequiredness') { + if (modelValue) { + return validationRule.validate(modelValue); + } else { + return true; + } + } else { + return validationRule.validate(modelValue || '', scope.item['fiscalNumber'] || ''); + } + }; + }); + } + var field = scope.paymentitem.paymentProductFieldById[scope.paymentItemFieldId || scope.paymentItemfield.id] + + scope.$watch(iAttrs.connectValidation, function (n, o) { + if (n !== o) { + field = scope.paymentitem.paymentProductFieldById[scope.paymentItemFieldId || scope.paymentItemfield.id]; + addValidations(field); + } + }); + addValidations(field); + + scope.$watch(function () { + return scope.item && scope.item['fiscalNumber'] + }, function (n, o) { + // recheck requiredness of the other fields + if (n) { + scope.paymentform.firstName && scope.paymentform.firstName.$validate(); + scope.paymentform.surname && scope.paymentform.surname.$validate(); + scope.paymentform.companyName && scope.paymentform.companyName.$validate(); + } + }); + } + } + } +}); \ No newline at end of file diff --git a/full-angularjs/app/paymentitem-detail/paymentitem-detail.controller.js b/full-angularjs/app/paymentitem-detail/paymentitem-detail.controller.js new file mode 100644 index 0000000..327d5bd --- /dev/null +++ b/full-angularjs/app/paymentitem-detail/paymentitem-detail.controller.js @@ -0,0 +1,338 @@ +app.controller('paymentitem.controller', ['$rootScope', '$scope', '$location', '$log', '$routeParams', '$sce', function ($rootScope, $scope, $location, $log, $routeParams, $sce) { + "use strict"; + + $scope.id = $routeParams.id; + $scope.type = $routeParams.type; + $scope.aofId = $routeParams.aof; + + $scope.hasError = false; + $scope.showCobrands = false; + + $scope.doValidate = false; + + $scope.item = {}; + + $rootScope.loading = true; + + $scope.maskoptions = { + clearOnBlur: false, + addDefaultPlaceholder: false, + clearOnBlurPlaceholder: true, + allowInvalidValue: true + } + + // This keys will be deprecated once the feature that allows the user uses language packages is released + $scope.installmentLanguageKeys = { + "numberOfInstallments": "Number of Installments", + "installmentAmount": "Installment Amount", + "interestRate": "Interest Rate", + "effectiveAnnualPercentageRate": "Effective interest rate", + "startupFee": "Startup Fee", + "monthlyFee": "Monthly Fee", + "totalAmount": "Total Amount to pay", + "secciUrl": "SECCI" + } + + $scope.getPaymentItem = function () { + $scope.hasError = false; + $rootScope.loading = true; + + if ($scope.type === 'group') { + $scope.showPaymentProductGroup($scope.id); + } else { + $scope.showPaymentProduct($scope.id); + } + }; + + $scope.showPaymentProductGroup = function (id) { + $scope.connect.session.getPaymentProductGroup(id, $scope.connect.paymentDetails).then(function (paymentProductGroup) { + $scope.$apply(function () { + $rootScope.loading = false; + $scope.paymentitem = paymentProductGroup; + }); + }, function () { + $scope.$apply(function () { + $scope.hasError = true; + $rootScope.loading = false; + $log.error('error while getting the payment product with id ' + id); + }); + }) + }; + + $scope.showPaymentProduct = function (id) { + if ($scope.paymentitem && $scope.paymentitem.id === id) { + $rootScope.loading = false; + } else { + $scope.connect.session.getPaymentProduct(id, $scope.connect.paymentDetails).then(function (paymentProduct) { + $rootScope.loading = false; + $scope.$apply(function () { + $scope.paymentitem = paymentProduct; + + $scope.connect.paymentRequest.setPaymentProduct(paymentProduct); + $scope.encryptIfNofields(); + + if ($scope.aofId) { + $scope.handleAccountOnFile(); + } + + if (id === '1503') { + $scope.boletoHelper(paymentProduct); + } + }); + }, function () { + $scope.$apply(function () { + $scope.hasError = true; + $rootScope.loading = false; + $log.error('error while getting the payment product with id ' + id); + }); + }); + } + }; + + $scope.encryptIfNofields = function () { + if ($scope.paymentitem.paymentProductFields.length === 0) { + encrypt(); + }; + } + + $scope.aofField = function (field) { + var accountOnFile = isNaN(Number($scope.aofId)) ? undefined : $scope.paymentitem.accountOnFileById[Number($scope.aofId)]; + if (accountOnFile) { + var attribute = accountOnFile.attributeByKey[field.id]; + return attribute && attribute.status !== "MUST_WRITE" && attribute.status !== "CAN_WRITE"; + } + return false; + }; + + $scope.handleAccountOnFile = function () { + // store account on file in request + var accountOnFile = isNaN($scope.aofId) ? null : $scope.paymentitem.accountOnFileById[$scope.aofId]; + $scope.connect.paymentRequest.setAccountOnFile(accountOnFile); + // prefill data + angular.forEach(accountOnFile.attributes, function (attribute) { + if ($scope.paymentitem.paymentProductFieldById[attribute.key]) { + if (attribute.status === "MUST_WRITE" || attribute.status === "CAN_WRITE") { + $scope.item[attribute.key] = attribute.value; + } else { + var masked = $scope.paymentitem.paymentProductFieldById[attribute.key].applyWildcardMask(attribute.value).formattedValue; + $scope.item[attribute.key] = masked; + } + } + }); + }; + + $scope.uimask = function (field) { + // we fix the mask for use with angular.ui.mask; if you use some other masking util refer to the docs of the directive. + if (field.displayHints.mask) { + return field.displayHints.mask.replace(/{{/g, '').replace(/}}/g, '').replace(/9/g, '?9'); + } + } + + $scope.boletoHelper = function (paymentProduct) { + $scope.$watch(function () { + return $scope.item && $scope.item['fiscalNumber'] + }, function (n, o) { + if (n && n.length >= 14) { + $scope.isBusiness = true; + } else { + $scope.isBusiness = false; + } + }); + } + + // Cache results of $sce.trustAsHtml to prevent infinite $digest loops + var trustedContent = {}; + $scope.htmltooltip = function (field) { + if (field.displayHints.tooltip) { + var tooltip = field.displayHints.tooltip; + var key = tooltip.label + "_" + tooltip.image; + if (!trustedContent[key]) { + trustedContent[key] = $sce.trustAsHtml(tooltip.label + "
"); + } + return trustedContent[key]; + } + } + + $scope.startApplePay = function () { + var networks = $scope.paymentitem.paymentProduct302SpecificData.networks; + + if ($scope.paymentitem.acquirerCountry) { + $scope.connect.paymentProductSpecificInputs.applePay.acquirerCountry = $scope.paymentitem.acquirerCountry; + } + $scope.connect.session.createApplePayPayment($scope.connect.paymentDetails, $scope.connect.paymentProductSpecificInputs.applePay, networks).then(function (res) { + var request = $scope.connect.session.getPaymentRequest(); + request.setValue('encryptedPaymentData', JSON.stringify(res.data.paymentData)); + encrypt(); + }, function (res) { + $rootScope.loading = false; + $scope.$apply(function () { + console.error(res.message); + $location.path('/dev-failure'); + $rootScope.loading = false; + }); + }); + } + + + + $scope.getPaymentProduct = function (id) { + return $scope.connect.session.getPaymentProduct(id, $scope.connect.paymentDetails); + }; + + $scope.toggleCobrands = function () { + $scope.showCobrands = !$scope.showCobrands; + }; + + $scope.setCobrand = function (id) { + $scope.showCobrands = false; + $scope.showPaymentProduct(id); + }; + + $scope.setProduct = function (id) { + $rootScope.loading = true; + $scope.showPaymentProduct(id); + }; + + $scope.birthDayArr = []; + + $scope.generateDateOfBirth = function (type, value) { + if (type == "day") $scope.birthDayArr[2] = String("0" + value).slice(-2); + if (type == "month") $scope.birthDayArr[1] = String("0" + value).slice(-2); + if (type == "year") $scope.birthDayArr[0] = value; + + $scope.item["dateOfBirth"] = $scope.birthDayArr.join(""); + } + + $scope.doPayment = function () { + $scope.doValidate = true; + // check if all mandatory fields are present + var request = $scope.connect.session.getPaymentRequest(); + + $scope.errorCustomerSearch = false; + + for (var key in $scope.item) { + // we need to supply masked values; so let's mask them here + var field = $scope.paymentitem.paymentProductFieldById[key]; + if (field) { + if (field.displayHints.formElement.type != 'boolean') { + var masked = field.applyMask($scope.item[key]).formattedValue; + } else { + var masked = $scope.item[key] + ''; + } + + if (!$scope.aofField(field)) { + request.setValue(key, masked); + } + } else { + if (key === 'rememberme') { + request.setTokenize($scope.item[key]); + } + } + } + if (request.getPaymentProduct()) { + var errors = request.validate(); + if (errors.length === 0) { + encrypt(); + } else { + console.log(errors); + } + } else { + console.log("no paymentProduct set"); + } + }; + + $scope.shouldShowRememberMe = function () { + var ret = false; + if ($scope.paymentitem && $scope.paymentitem.id === 'cards') { + if ($scope.connect.paymentDetails.isRecurring) { + // recurring groups show the checkbox + ret = true; + } + } else if ($scope.paymentitem) { + if ($scope.paymentitem.allowsTokenization && !$scope.paymentitem.autoTokenized) { + // paymentproducts that are tokenizable but not auto tokenized show the checkbox + ret = true; + } + } + return ret; + } + + var encrypt = function () { + var encryptor = $scope.connect.session.getEncryptor(); + var paymentRequest = $scope.connect.session.getPaymentRequest(); + $rootScope.encryptedString = null; + if (paymentRequest.getPaymentProduct()) { + var errors = paymentRequest.validate(); + if (errors.length === 0) { + $rootScope.loading = true; + encryptor.encrypt(paymentRequest).then(function (encryptedString) { + $rootScope.loading = false; + $scope.$apply(function () { + $rootScope.encryptedString = encryptedString; + $location.path('/dev-success'); + }); + }, function error (e) { + $rootScope.loading = false; + console.error('encryption failed', e); + $scope.$apply(function () { + $location.path('/dev-failure'); + }); + }); + } else { + // something is wrong according to the paymentRequest; + console.error(errors, paymentRequest.getValues(), paymentRequest.getPaymentProduct()); + $scope.$apply(function () { + $location.path('/dev-failure'); + }); + } + } else { + // the paymentRequest does not have a paymentProduct; + console.error("no paymentProduct set", paymentRequest.getValues()); + $scope.$apply(function () { + $location.path('/dev-failure'); + }); + } + }; + + var context = JSON.parse(sessionStorage.getItem('context')); + if (context) { + $scope.connect = {}; // store all connectSDK variables in this namespace + + + // split the context up in the session- and paymentDetails + $scope.connect.sessionDetails = { + clientSessionId: context.clientSessionId, + customerId: context.customerId, + clientApiUrl: context.clientApiUrl, + assetUrl: context.assetUrl + }; + $scope.connect.paymentDetails = { + totalAmount: context.amountInCents, + countryCode: context.countryCode, + locale: context.locale, + isRecurring: context.isRecurring, + currency: context.currencyCode + } + + $scope.connect.paymentProductSpecificInputs = { + applePay: { + merchantName: context.merchantName + }, + } + + $rootScope.hasSession = true; // this indicates we have enough info to render a payment result page + + // use the sessionDetails to create a new session + $scope.connect.session = new connectsdk.Session($scope.connect.sessionDetails); + + // Get the paymentRequest for this session. This is an SDK object that stores all the data + // that the customer provided during the checkout. In the end of the checkout it will provide + // all this information to the encryption function so that it can create the encrypted string + // that contains all this info. + $scope.connect.paymentRequest = $scope.connect.session.getPaymentRequest(); + // now render the page + $scope.getPaymentItem(); + } else { + $location.path('/start'); + } +}]); \ No newline at end of file diff --git a/full-angularjs/app/paymentitem-detail/paymentitem-detail.html b/full-angularjs/app/paymentitem-detail/paymentitem-detail.html new file mode 100644 index 0000000..f3bb57d --- /dev/null +++ b/full-angularjs/app/paymentitem-detail/paymentitem-detail.html @@ -0,0 +1,40 @@ +
+
+ There was a problem while getting the payment items; please check your credentials and payment context here +
+
+
+
+
+ + +
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+ + Cancel +
+
+
+
\ No newline at end of file diff --git a/full-angularjs/app/paymentitem-detail/templates/applepay.html b/full-angularjs/app/paymentitem-detail/templates/applepay.html new file mode 100644 index 0000000..edf7efa --- /dev/null +++ b/full-angularjs/app/paymentitem-detail/templates/applepay.html @@ -0,0 +1,7 @@ +
+ +
diff --git a/full-angularjs/app/paymentitem-detail/templates/boleto.html b/full-angularjs/app/paymentitem-detail/templates/boleto.html new file mode 100644 index 0000000..6af8bda --- /dev/null +++ b/full-angularjs/app/paymentitem-detail/templates/boleto.html @@ -0,0 +1,8 @@ +
+ +
+
\ No newline at end of file diff --git a/full-angularjs/app/paymentitem-detail/templates/cards.html b/full-angularjs/app/paymentitem-detail/templates/cards.html new file mode 100644 index 0000000..a52f8b7 --- /dev/null +++ b/full-angularjs/app/paymentitem-detail/templates/cards.html @@ -0,0 +1,98 @@ +
+ +
+ + + +
+
Enter a valid length please
+
Please enter a valid expiration data
+
Please enter valid data
+
+ +
+ +
+ + + + + + + +
Enter a valid length please
+
This is not a valid creditcardnumber
+
Please enter a valid expiration data
+
Please enter valid data
+
+
This creditcard is not supported
+
This is not a valid creditcard
+
+
+ +
+ Multiple brands detected +
+
+
+

Multiple brands detected

+

Please select your derired brand

+
+
+ +
+
+ +
+
+
+ +
+ +
+ + + + +
Enter a valid length please
+
Please enter a valid expiration data
+
Please enter valid data
+
+
+ +
+ +
+ + + + + +
Enter a valid length please
+
Please enter a valid expiration data
+
Please enter valid data
+
+
\ No newline at end of file diff --git a/full-angularjs/app/paymentitem-detail/templates/input-boleto.html b/full-angularjs/app/paymentitem-detail/templates/input-boleto.html new file mode 100644 index 0000000..07d778c --- /dev/null +++ b/full-angularjs/app/paymentitem-detail/templates/input-boleto.html @@ -0,0 +1,18 @@ + +
Enter a valid length please
+
Please enter valid data
+
This field is required
+
This is field is required
diff --git a/full-angularjs/app/paymentitem-detail/templates/input-currency.html b/full-angularjs/app/paymentitem-detail/templates/input-currency.html new file mode 100644 index 0000000..8669690 --- /dev/null +++ b/full-angularjs/app/paymentitem-detail/templates/input-currency.html @@ -0,0 +1,16 @@ +. + \ No newline at end of file diff --git a/full-angularjs/app/paymentitem-detail/templates/input-default.html b/full-angularjs/app/paymentitem-detail/templates/input-default.html new file mode 100644 index 0000000..e369fa5 --- /dev/null +++ b/full-angularjs/app/paymentitem-detail/templates/input-default.html @@ -0,0 +1,26 @@ + + +
Enter a valid length please
+
Please enter valid data
+
This field is required
diff --git a/full-angularjs/app/paymentitem-detail/templates/input-group-dateOfBirth.html b/full-angularjs/app/paymentitem-detail/templates/input-group-dateOfBirth.html new file mode 100644 index 0000000..6ce3517 --- /dev/null +++ b/full-angularjs/app/paymentitem-detail/templates/input-group-dateOfBirth.html @@ -0,0 +1,40 @@ +
+
+ + +
Please provide a value
+
+
-
+
+ + +
Please provide a value
+
+
-
+
+ + +
Please provide a value
+
+
\ No newline at end of file diff --git a/full-angularjs/app/paymentitem-detail/templates/input-select.html b/full-angularjs/app/paymentitem-detail/templates/input-select.html new file mode 100644 index 0000000..abfaccc --- /dev/null +++ b/full-angularjs/app/paymentitem-detail/templates/input-select.html @@ -0,0 +1,10 @@ + \ No newline at end of file diff --git a/full-angularjs/app/paymentitem-detail/templates/remember-me.html b/full-angularjs/app/paymentitem-detail/templates/remember-me.html new file mode 100644 index 0000000..5d37f19 --- /dev/null +++ b/full-angularjs/app/paymentitem-detail/templates/remember-me.html @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/full-angularjs/app/paymentitem-detail/templates/tooltip.html b/full-angularjs/app/paymentitem-detail/templates/tooltip.html new file mode 100644 index 0000000..270b75d --- /dev/null +++ b/full-angularjs/app/paymentitem-detail/templates/tooltip.html @@ -0,0 +1,7 @@ +? \ No newline at end of file diff --git a/full-angularjs/app/paymentitem-selection/paymentitem-selection.controller.js b/full-angularjs/app/paymentitem-selection/paymentitem-selection.controller.js new file mode 100644 index 0000000..793c4c5 --- /dev/null +++ b/full-angularjs/app/paymentitem-selection/paymentitem-selection.controller.js @@ -0,0 +1,174 @@ +app.controller('paymentitem-selection.controller', ['$scope', '$rootScope', '$location', '$log', 'connectGooglePay', function ($scope, $rootScope, $location, $log, connectGooglePay) { + "use strict"; + $scope.hasError = false; + var googlePayId = 320; + + var context = JSON.parse(sessionStorage.getItem('context')); + + var isPaymentProductIdInList = function (paymentProductId, list) { + return list.filter(function (paymentItem) { + return paymentItem.id === paymentProductId; + }).length > 0; + } + + var getPaymentProductNetworks = function () { + $scope.connect.session.getPaymentProduct(googlePayId, $scope.connect.paymentDetails, $scope.connect.paymentProductSpecificInputs).then(function (paymentProduct) { + // We extract some data from the Google Pay payment product response that is required to initialize Google Pay API + // As we can retrieve them here, we didn't add this as input fields on dev-start + // We add it to the paymentProductSpecificInputs for ease of use of one single object with Google Pay data we need to use in multiple places. + // Yes it is now also send to the SDK in getBasicPaymentItems but it is not needed but it also won't interfere. + $scope.connect.paymentProductSpecificInputs.googlePay.networks = paymentProduct.paymentProduct320SpecificData.networks; + $scope.connect.paymentProductSpecificInputs.googlePay.gateway = paymentProduct.paymentProduct320SpecificData.gateway; + if (paymentProduct.acquirerCountry) { + $scope.connect.paymentProductSpecificInputs.googlePay.acquirerCountry = paymentProduct.acquirerCountry; + } + }); + } + + $scope.getPaymentItems = function () { + $scope.hasError = false; + $scope.loading = true; + // Third parameter paymentProductSpecificInputs is optional + $scope.connect.session.getBasicPaymentItems($scope.connect.paymentDetails, $scope.grouping, $scope.connect.paymentProductSpecificInputs).then(function (basicPaymentItems) { + $scope.loading = false; + + // since the connect sdk has async calls outside of angular we need to tell Angular to dirty-check the state after the async call is complete. + $scope.$apply(function () { + // sort the paymentitems here + $scope.basicPaymentItems = basicPaymentItems.basicPaymentItems.sort(function (a, b) { + if (a.displayHints.displayOrder < b.displayHints.displayOrder) { + return -1; + } else if (a.displayHints.displayOrder > b.displayHints.displayOrder) { + return 1; + } + return 0; + }); + // add accounts on file + $scope.accountsOnFile = basicPaymentItems.accountsOnFile; + + // Need to retrieve networks for Google Pay when Google Pay exists in paymentItems + if (isPaymentProductIdInList(googlePayId, basicPaymentItems.basicPaymentItems)) { + getPaymentProductNetworks() + } + }); + }, function () { + $scope.$apply(function () { + $scope.hasError = true; + $scope.loading = false; + $log.error('error while getting the basicPaymentItems'); + }); + }) + }; + + var encryptPayment = function (paymentResponse) { + var encryptor = $scope.connect.session.getEncryptor(); + var paymentRequest = $scope.connect.session.getPaymentRequest(); + $rootScope.encryptedString = null; + if (paymentRequest.getPaymentProduct()) { + var errors = paymentRequest.validate(); + if (errors.length === 0) { + $rootScope.loading = true; + encryptor.encrypt(paymentRequest).then(function (encryptedString) { + $rootScope.loading = false; + $scope.$apply(function () { + $rootScope.encryptedString = encryptedString; + $location.path('/dev-success'); + }); + }, function error (e) { + $rootScope.loading = false; + console.error('encryption failed', e); + $scope.$apply(function () { + $location.path('/dev-failure'); + }); + }); + } else { + // something is wrong according to the paymentRequest; + console.error(errors, paymentRequest.getValues(), paymentRequest.getPaymentProduct()); + $scope.$apply(function () { + $location.path('/dev-failure'); + }); + } + } else { + // the paymentRequest does not have a paymentProduct; + console.error("no paymentProduct set", paymentRequest.getValues()); + $scope.$apply(function () { + $location.path('/dev-failure'); + }); + } + }; + + $scope.choosePaymentItem = function (paymentItem) { + if (paymentItem.id === googlePayId) { + var promise = connectGooglePay.setupGooglePayAndExecute($scope); + promise.then(function (paymentResponse) { + encryptPayment(paymentResponse); + }, function (reason) { + console.error('Failed: ' + reason); + }); + } else { + $location.path('/paymentitem-detail/' + paymentItem.json.type + '/' + paymentItem.id); + } + }; + + $scope.chooseAccountOnFile = function (aof) { + $location.path('/paymentitem-detail/product/' + aof.paymentProductId + '/' + aof.id); + }; + + $scope.showAccountOnFileData = function (accountOnFile) { + var accountOnFileObject = new connectsdk.AccountOnFile(accountOnFile); + var displayHints = accountOnFileObject.displayHints; + var output = ""; + for (var j = 0, jl = displayHints.labelTemplate.length; j < jl; j++) { + var keyToShow = displayHints.labelTemplate[j].attributeKey; + output = output + accountOnFileObject.getMaskedValueByAttributeKey(keyToShow).formattedValue + " "; + } + return output; + }; + + if (context) { + $scope.connect = {}; // store all connectSDK variables in this namespace + + // split the context up in the session- and paymentDetails + $scope.connect.sessionDetails = { + clientSessionId: context.clientSessionId, + customerId: context.customerId, + clientApiUrl: context.clientApiUrl, + assetUrl: context.assetUrl + }; + $scope.connect.paymentDetails = { + totalAmount: context.amountInCents, + countryCode: context.countryCode, + locale: context.locale, + isRecurring: context.isRecurring, + currency: context.currencyCode + } + // If you want to use Google Pay in your application, a merchantId is required to set it up. + // getBasicPaymentItems will use it to perform an extra check(canMakePayment) to see if the user can pay with Google Pay. + $scope.connect.paymentProductSpecificInputs = { + applePay: { + merchantName: context.merchantName + }, + googlePay: { + merchantId: context.merchantId, + gatewayMerchantId: context.gatewayMerchantId, + merchantName: context.merchantName + } + } + + $scope.grouping = context.grouping; + + // use the sessionDetails to create a new session + $scope.connect.session = new connectsdk.Session($scope.connect.sessionDetails); + + // Get the paymentRequest for this session. This is an SDK object that stores all the data + // that the customer provided during the checkout. In the end of the checkout it will provide + // all this information to the encryption function so that it can create the encrypted string + // that contains all this info. + $scope.connect.paymentRequest = $scope.connect.session.getPaymentRequest(); + + // now render the page + $scope.getPaymentItems(); + } else { + $location.path('/start'); + } +}]); diff --git a/full-angularjs/app/paymentitem-selection/paymentitem-selection.html b/full-angularjs/app/paymentitem-selection/paymentitem-selection.html new file mode 100644 index 0000000..8383a17 --- /dev/null +++ b/full-angularjs/app/paymentitem-selection/paymentitem-selection.html @@ -0,0 +1,46 @@ +
+
+ There was a problem while getting the payment items; please check your + credentials and payment context here +
+
+

Choose a payment product

+
+
+

Previously used accounts:

+ +
+
    +
  • + +
  • +
+
+
+
diff --git a/full-angularjs/app/paymentitem-selection/services/connect/googlepay.service.js b/full-angularjs/app/paymentitem-selection/services/connect/googlepay.service.js new file mode 100644 index 0000000..5e14653 --- /dev/null +++ b/full-angularjs/app/paymentitem-selection/services/connect/googlepay.service.js @@ -0,0 +1,134 @@ +angular.module('connect.GooglePay', []).factory('connectGooglePay', ['$q', function ($q) { + + + var $scope = null; + var googlePayId = 320; + var paymentsClient = null; + + // Only base is needed to trigger isReadyToPay + var _getBaseCardPaymentMethod = function (networks) { + return { + type: 'CARD', + parameters: { + allowedAuthMethods: ['PAN_ONLY', 'CRYPTOGRAM_3DS'], + allowedCardNetworks: networks + } + } + }; + + var _getTransactionInfo = function (paymentDetails, acquirerCountry) { + return { + 'totalPriceStatus': 'FINAL', + 'totalPrice': amountFormatted(paymentDetails.totalAmount), + 'countryCode': acquirerCountry, + 'currencyCode': paymentDetails.currency + }; + }; + + function amountFormatted(amount) { + var output = '00'.concat(amount); + return [output.slice(0, output.length - 2), '.', output.slice(output.length - 2)].join(''); + } + + var _getMerchantInfo = function (paymentProductSpecificInputs) { + return { + 'merchantName': paymentProductSpecificInputs.googlePay.merchantName + }; + }; + + var _getTokenizationSpecification = function (paymentProductSpecificInputs) { + return { + type: 'PAYMENT_GATEWAY', + parameters: { + 'gateway': paymentProductSpecificInputs.googlePay.gateway, + 'gatewayMerchantId': paymentProductSpecificInputs.googlePay.gatewayMerchantId + } + } + }; + + var _getGooglePaymentDataRequest = function (paymentProductSpecificInputs, networks, paymentDetails) { + var acquirerCountry; + if (paymentProductSpecificInputs.acquirerCountry) { + acquirerCountry = paymentProductSpecificInputs.acquirerCountry; + } else { + acquirerCountry = paymentDetails.countryCode; + } + + return { + apiVersion: 2, + apiVersionMinor: 0, + allowedPaymentMethods: [_getCardPaymentMethod(paymentProductSpecificInputs, networks)], + transactionInfo: _getTransactionInfo(paymentDetails, acquirerCountry), + merchantInfo: _getMerchantInfo(paymentProductSpecificInputs) + }; + }; + + var _getGooglePaymentsClient = function(environment) { + if (paymentsClient === null) { + var googlePayEnvironment = 'TEST'; + if (environment === 'PROD') { + googlePayEnvironment = 'PRODUCTION'; + } + paymentsClient = new google.payments.api.PaymentsClient({environment: googlePayEnvironment}); + } + return paymentsClient; + }; + + // To prefetch payment data we need base + tokenizationSpecification + var _getCardPaymentMethod = function (paymentProductSpecificInputs, networks) { + return Object.assign( + {}, + _getBaseCardPaymentMethod(networks), + { + tokenizationSpecification: _getTokenizationSpecification(paymentProductSpecificInputs) + } + ); + } + + return { + setupGooglePayAndExecute: function ($scope) { + return $q(function (resolve, reject) { + var paymentProductSpecificInputs = $scope.connect.paymentProductSpecificInputs; + + if (paymentProductSpecificInputs.googlePay) { + var _networks = paymentProductSpecificInputs.googlePay.networks; + if (_networks && _networks.length > 0) { + var paymentsClient = _getGooglePaymentsClient($scope.environment); + paymentsClient.loadPaymentData(_getGooglePaymentDataRequest(paymentProductSpecificInputs, _networks, $scope.connect.paymentDetails)) + .then(function (paymentData) { + // Get the payment product so the paymentRequest can be completed + // We do this here because Google does not allow async calls to be done between clicking and opening the payment sheet with 'loadPaymentData'. + $scope.connect.session.getPaymentProduct(googlePayId, $scope.connect.paymentDetails, paymentProductSpecificInputs).then(function (paymentProduct) { + // We need to set the paymentProduct for the encryptor to be able to do it's work. + $scope.connect.paymentRequest.setPaymentProduct(paymentProduct); + // Set the value for encryptedPaymentData which is returned by the Google Pay payment sheet. + $scope.connect.paymentRequest.setValue('encryptedPaymentData', paymentData.paymentMethodData.tokenizationData.token); + // return resolve to encrypt paymentrequest + resolve($scope.connect.paymentRequest); + }, function () { + $scope.hasError = true; + }); + }) + .catch(function (err) { + // statusCode: "CANCELED" is when payment sheet closes -> do nothing + // statusCode: "BUYER_ACCOUNT_ERROR" The current Google user is unable to provide payment information. -> do nothing (cancel button on details is the way out) + switch (err.statusCode) { + case 'DEVELOPER_ERROR': + case 'INTERNAL_ERROR': + reject('Oops! Something went wrong: ' + err.statusCode); + break; + default: + reject('statusCode: ' + err.statusCode); + break; + } + }); + } else { + reject('There are no product networks available.'); + } + } else { + reject('There is no payment context'); + } + }); + } + } +}]); \ No newline at end of file diff --git a/full-angularjs/app/results/failure.html b/full-angularjs/app/results/failure.html new file mode 100644 index 0000000..2865d77 --- /dev/null +++ b/full-angularjs/app/results/failure.html @@ -0,0 +1,9 @@ +
+
+
+

Payment failed

+

Something went wrong, please check the developer tools for more information.

+ Start again +
+
+
\ No newline at end of file diff --git a/full-angularjs/app/results/success.html b/full-angularjs/app/results/success.html new file mode 100644 index 0000000..7adf4c4 --- /dev/null +++ b/full-angularjs/app/results/success.html @@ -0,0 +1,16 @@ +
+
+
+

Payment has been set up

+

The payment has been checked and encrypted to:

+ +
+{{encryptedString}}
+                
+
+

Be aware that the encrypted string contains dots(.) which means double clicking does not select the entire string.

+

You can send this string to Worldline to process the payment

+ Start again +
+
+
diff --git a/full-angularjs/app/sessiondetails/sessiondetails.controller.js b/full-angularjs/app/sessiondetails/sessiondetails.controller.js new file mode 100644 index 0000000..9d42a93 --- /dev/null +++ b/full-angularjs/app/sessiondetails/sessiondetails.controller.js @@ -0,0 +1,30 @@ +app.controller('sessiondetails.controller', ['$scope', '$rootScope', '$location', function ($scope, $rootScope, $location) { + "use strict"; + var currentContext = JSON.parse(sessionStorage.getItem('context')); + // defaults for input + $scope.input = { + clientSessionId: (currentContext) ? currentContext.clientSessionId : null, + customerId: (currentContext) ? currentContext.customerId : null, + clientApiUrl: (currentContext) ? currentContext.clientApiUrl : null, + assetUrl: (currentContext) ? currentContext.assetUrl : null, + amountInCents: (currentContext) ? currentContext.amountInCents : 12345, + countryCode: (currentContext) ? currentContext.countryCode : 'NL', + currencyCode: (currentContext) ? currentContext.currencyCode : 'EUR', + locale: (currentContext) ? currentContext.locale : 'en_GB', + isRecurring: (currentContext) ? currentContext.isRecurring : false, + grouping: (currentContext) ? currentContext.grouping : true, + gatewayMerchantId: (currentContext) ? currentContext.gatewayMerchantId : null, + merchantId: (currentContext) ? currentContext.merchantId : null, + merchantName: (currentContext && currentContext.merchantName) ? currentContext.merchantName : '', + }; + + var firstInput = document.querySelector('form input:first-child'); + firstInput.focus(); + window.scrollTo(0,0); + + $scope.startPayment = function () { + $rootScope.hasSession = true; + sessionStorage.setItem('context', angular.toJson($scope.input)); + $location.path('/paymentitem-selection'); + } +}]); diff --git a/full-angularjs/app/sessiondetails/sessiondetails.html b/full-angularjs/app/sessiondetails/sessiondetails.html new file mode 100644 index 0000000..8468c57 --- /dev/null +++ b/full-angularjs/app/sessiondetails/sessiondetails.html @@ -0,0 +1,113 @@ +
+

+ To process the payment using the services provided by Worldline Global Collect, the following information must be provided as a merchant +

+

+ After providing the information requested below, this example can process a payment. +

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

This field is required

+
+
+
+ +
+ +

This field is required

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

+ Google Pay additional input fields: +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+
+
+
diff --git a/full-angularjs/app/styles/_alerts.scss b/full-angularjs/app/styles/_alerts.scss new file mode 100644 index 0000000..7cdcf54 --- /dev/null +++ b/full-angularjs/app/styles/_alerts.scss @@ -0,0 +1,4 @@ +.alert { + margin-top: 30px; + clear: both; +} \ No newline at end of file diff --git a/full-angularjs/app/styles/_bootstrap.scss b/full-angularjs/app/styles/_bootstrap.scss new file mode 100644 index 0000000..e4693d3 --- /dev/null +++ b/full-angularjs/app/styles/_bootstrap.scss @@ -0,0 +1,50 @@ +// Core variables and mixins +@import "bootstrap/variables"; +@import "bootstrap/mixins"; + +// Reset +@import "bootstrap/normalize"; +@import "bootstrap/print"; + +// Core CSS +@import "bootstrap/scaffolding"; +//@import "bootstrap/type"; +//@import "bootstrap/code"; +@import "bootstrap/grid"; +@import "bootstrap/tables"; +@import "bootstrap/forms"; +@import "bootstrap/buttons"; + +// Components +@import "bootstrap/component-animations"; +//@import "bootstrap/glyphicons"; +//@import "bootstrap/dropdowns"; +//@import "bootstrap/button-groups"; +//@import "bootstrap/input-groups"; +//@import "bootstrap/navs"; +//@import "bootstrap/navbar"; +//@import "bootstrap/breadcrumbs"; +//@import "bootstrap/pagination"; +//@import "bootstrap/pager"; +//@import "bootstrap/labels"; +//@import "bootstrap/badges"; +//@import "bootstrap/jumbotron"; +//@import "bootstrap/thumbnails"; +@import "bootstrap/alerts"; +//@import "bootstrap/progress-bars"; +//@import "bootstrap/media"; +//@import "bootstrap/list-group"; +//@import "bootstrap/panels"; +@import "bootstrap/wells"; +@import "bootstrap/close"; + + +// Components w/ JavaScript +@import "bootstrap/modals"; +@import "bootstrap/tooltip"; +@import "bootstrap/popovers"; +// @import "bootstrap/carousel"; + +// Utility classes +@import "bootstrap/utilities"; +@import "bootstrap/responsive-utilities"; \ No newline at end of file diff --git a/full-angularjs/app/styles/_breadcrumb.scss b/full-angularjs/app/styles/_breadcrumb.scss new file mode 100644 index 0000000..7515c8c --- /dev/null +++ b/full-angularjs/app/styles/_breadcrumb.scss @@ -0,0 +1,16 @@ +/*use an icon as breadcrumb seperator*/ +.breadcrumb { + position:absolute; + margin-top:-45px; + padding-left:0; + > li { + font-size:12px; + + li:before { + @include caret(4px, $gray, 'right'); + display:inline-block; + position:relative; + padding:0; + margin:0 8px 0 5px; + } + } +} \ No newline at end of file diff --git a/full-angularjs/app/styles/_button-groups.scss b/full-angularjs/app/styles/_button-groups.scss new file mode 100644 index 0000000..2f52ef7 --- /dev/null +++ b/full-angularjs/app/styles/_button-groups.scss @@ -0,0 +1,3 @@ +.btn-group > .btn.btn-primary + .dropdown-toggle { + border-left:1px solid darken($brand-primary,12%); +} \ No newline at end of file diff --git a/full-angularjs/app/styles/_buttons.scss b/full-angularjs/app/styles/_buttons.scss new file mode 100644 index 0000000..b1498ea --- /dev/null +++ b/full-angularjs/app/styles/_buttons.scss @@ -0,0 +1,97 @@ + // please note that we have edited the default bootstrap button scss! + +//specify button padding +.btn { + @include button-size($padding-base-vertical, $padding-base-horizontal, $font-size-base, $line-height-base, 0); + font-family:Arial,"Helvetica Neue",Helvetica,sans-serif; + font-size:18px; + + &.disabled, + &[disabled], + fieldset[disabled] & { + @include opacity(.5); + } + &.btn-link { + font-size: 15px; + color: #2869ac; + + &.secci-url, &.enter-information{ + padding: 6px 0; + } + + &:hover, &:focus{ + color: #262626; + text-decoration: underline; + background-color: transparent; + } + } + &.active, &:active { + outline: 0; + background-image: none; + box-shadow: 0 !important; + } +} + +.btn-sm { + font-size:15px; + padding: 4px 9px 5px 9px; +} + +.btn-lg { + font-size:18px; + padding: 9px 20px 12px 20px; +} + +.btn-primary { + &.disabled, + &[disabled] { + color:rgba(255,255,255,0.5); + } + +} + +@supports (-webkit-appearance: -apple-pay-button) { + .apple-pay-button { + display: inline-block; + -webkit-appearance: -apple-pay-button; + } + .apple-pay-button-black { + -apple-pay-button-style: black; + } + .apple-pay-button-white { + -apple-pay-button-style: white; + } + .apple-pay-button-white-with-line { + -apple-pay-button-style: white-outline; + } +} + +@supports not (-webkit-appearance: -apple-pay-button) { + .apple-pay-button { + display: inline-block; + background-size: 100% 60%; + background-repeat: no-repeat; + background-position: 50% 50%; + padding: 0px; + box-sizing: border-box; + min-height: 32px; + max-height: 64px; + } + .apple-pay-button-black { + background-image: -webkit-named-image(apple-pay-logo-white); + background-color: black; + } + .apple-pay-button-white { + background-image: -webkit-named-image(apple-pay-logo-black); + background-color: white; + } + .apple-pay-button-white-with-line { + background-image: -webkit-named-image(apple-pay-logo-black); + background-color: white; + border: 0.5px solid black; + } +} + + + + diff --git a/full-angularjs/app/styles/_cobrand.scss b/full-angularjs/app/styles/_cobrand.scss new file mode 100644 index 0000000..8f66459 --- /dev/null +++ b/full-angularjs/app/styles/_cobrand.scss @@ -0,0 +1,80 @@ +#cobrand { + overflow: hidden; + .toggle-cobrand { + float: right; + text-decoration: underline; + margin-top: 6px; + margin-bottom: 9px; + cursor: pointer; + } + .caret { + display: inline-block; + width: 0; + height: 0; + margin-left: 2px; + vertical-align: middle; + border-top: 4px solid; + border-right: 4px solid transparent; + border-left: 4px solid transparent; + } + .cobrand-close { + text-decoration: none; + background: url(img/icons/icon-close.png) no-repeat 0 0; + width: 18px; + height: 18px; + border: 1px solid transparent; + float: right; + cursor: pointer; + &:hover { + text-decoration: none; + border: 1px solid #cccccc; + } + } + .cobrand-intro { + float: left; + } + .cobrand-wrapper { + margin-top: 4px; + margin-bottom: 9px; + padding: 10px; + background-color: #f2f2f2; + border: 1px solid #cccccc; + h2 { + margin: 0 0 8px; + } + h3 { + margin: 0 0 5px; + } + p { + margin: 0 0 5px 0; + } + ul { + margin: 0; + } + } + #paymentoptionslist { + li .btn-tertiary > div:after { + background: none; + width: 12px; + height: 10px; + } + li .btn-tertiary.active-cobrand > div:after { + background: url(img/icons/icon-check.png) no-repeat 0 0; + background-size: 100%; + } + } +} + +body[dir=rtl] { + #cobrand { + .cobrand-close { + float: left; + } + .cobrand-close-wrapper { + float: left; + } + .cobrand-intro-wrapper { + float: right; + } + } +} \ No newline at end of file diff --git a/full-angularjs/app/styles/_dropdowns.scss b/full-angularjs/app/styles/_dropdowns.scss new file mode 100644 index 0000000..288ac70 --- /dev/null +++ b/full-angularjs/app/styles/_dropdowns.scss @@ -0,0 +1,58 @@ +.dropdown-menu { + border-radius:4px; +} + +.dropdown-menu-portal { + padding:20px 20px 20px 20px; + margin:4px 0 0 0; + width:474px; + left:-252px; + + h5 { + margin:0 0 14px 0; + } + + h6 { + font-family:$font-family-sans-serif; + margin:0 0 0 0; + color:$brand-primary; + font-size:15px; + } + + p { + font-size:11px; + } + + //add an arrow to the dropdown menu, based on the Bootstrap popover arrow technique + .arrow { + // .arrow is outer, .arrow:after is inner + @include caret(9px, $dropdown-border, top); + position:absolute; + top:-9px; + right:85px; + + .ie8 & { + border-bottom: 9px solid $dropdown-fallback-border; + } + + &:after { + @include caret(7px, $dropdown-bg, top); + display:block; + position:absolute; + margin-left:-7px; + margin-top:2px; + } + + } + +} + +//button dropdowns +.btn-group { + .dropdown-menu { + > li > a { + padding:3px 13px; + } + } + +} \ No newline at end of file diff --git a/full-angularjs/app/styles/_footer.scss b/full-angularjs/app/styles/_footer.scss new file mode 100644 index 0000000..f47a310 --- /dev/null +++ b/full-angularjs/app/styles/_footer.scss @@ -0,0 +1,6 @@ +#footer { + background-color:$gray-lighter; +} + + + diff --git a/full-angularjs/app/styles/_forms.scss b/full-angularjs/app/styles/_forms.scss new file mode 100644 index 0000000..ba325c9 --- /dev/null +++ b/full-angularjs/app/styles/_forms.scss @@ -0,0 +1,55 @@ +//form +body input { + font-size: 16px; //prevent iPhone from zooming in when clicking an input that has a font-szie smaller then 16px + border-width:1px; + padding: 6px 10px; + border-color: #aaaaaa; + border-radius: 2px; + box-shadow: rgba(0,0,0,0.15) 2px 3px 5px 0px inset; + @include placeholder($gray-dark); +} + +.has-error { //Bootstrap makes all these element red if the form-group is in error state + .help-block, + .control-label, + .radio, + .checkbox, + .radio-inline, + .checkbox-inline { + color: inherit; + } + //errors, triggered by javascript validation + label.error { + @extend .help-block; //inherit margin from help-block + font-weight:normal; + color:$state-danger-text; + } +} + +fieldset { + border-bottom:1px solid $gray-light; + margin:0 0 11px 0; +} +.modal-body form > fieldset:last-child { + border-bottom:none; +} + +legend { + font-size:18px; + margin-bottom:12px; +} + +.form-horizontal .control-label { + text-align: left; +} +.help-block { + font-size:13px; +} + +.form-control { + border-style: solid; + border-width: 1px; + border-color: #aaaaaa; + border-radius: 2px; + box-shadow: rgba(0,0,0,0.15) 2px 3px 5px 0px inset; +} diff --git a/full-angularjs/app/styles/_grid.scss b/full-angularjs/app/styles/_grid.scss new file mode 100644 index 0000000..956d5bf --- /dev/null +++ b/full-angularjs/app/styles/_grid.scss @@ -0,0 +1,10 @@ +body { + background-color: #ffffff; +} + +main { + padding:12px 0 44px 0; + @include isaac-respond-min-width(md) { + padding-top: 30px; + } +} diff --git a/full-angularjs/app/styles/_header.scss b/full-angularjs/app/styles/_header.scss new file mode 100644 index 0000000..a5b0d8d --- /dev/null +++ b/full-angularjs/app/styles/_header.scss @@ -0,0 +1,3 @@ +#header { + background:$gray-lighter; +} \ No newline at end of file diff --git a/full-angularjs/app/styles/_hpp.scss b/full-angularjs/app/styles/_hpp.scss new file mode 100644 index 0000000..32ed849 --- /dev/null +++ b/full-angularjs/app/styles/_hpp.scss @@ -0,0 +1,1082 @@ +// remove spinners +input[type=number]::-webkit-inner-spin-button, +input[type=number]::-webkit-outer-spin-button { + -webkit-appearance: none; + margin: 0; +} + +input[type=number] { + -moz-appearance: textfield; +} + +input::-ms-clear { + display: none; +} + +.form-control::-webkit-input-placeholder { /* WebKit browsers */ + color: #8e8e8e; +} + +.form-control:-moz-placeholder { /* Mozilla Firefox 4 to 18 */ + color: #8e8e8e; +} + +.form-control::-moz-placeholder { /* Mozilla Firefox 19+ */ + color: #8e8e8e; +} + +.form-control:-ms-input-placeholder { /* Internet Explorer 10+ */ + color: #8e8e8e; +} + +body input { + border: 1px solid #aaaaaa; +} + +#remembermeBlock { + min-height: 35px; +} + +#rememberme { + border: 1px solid #aaaaaa !important; + border-radius: 2px !important; + background: #ffffff !important; + box-shadow: none !important; +} + +header, #header { + min-height: 44px; + h3 { + text-align: center; + } +} + +#logoimage { + margin: 10px auto; + background-position: center top; + background-repeat: no-repeat; + background-size: 100%; + display: block; +} + +#merchantname { + display: none; +} + +.editMode #logoimage { + min-height: 30px; +} + +@media (min-width: 0px) { + #logoimage { + background-image: url(/global/images/logo.png); + width: 174px; + height: 36px; + } +} + +#content { + overflow: hidden; +} + +#main { + padding-top: 0; + padding-bottom: 0; + @include isaac-respond-min-width(md) { + margin: 15px auto; + } + +} + +.radio, .checkbox { + //padding-left: 20px; + + label { + line-height: 1.2; + } +} + +.cart { + padding: 10px; + margin: 0 -10px; + position: relative; + @include isaac-respond-min-width(md) { + padding: 30px; + min-height: 460px; + margin: 0; + .instructions & { + min-height: 0; + padding: 10px 30px; + } + } + background: #e5e5e5; + overflow: hidden; + + &.open { + .header { + display: none !important; + } + .content { + display: block !important; + tfoot td { + cursor: pointer; + } + } + } + + .header { + padding-top: 4px; + cursor: pointer; + margin-right: -10px; + .amount { + margin-top: -4px; + font-size: 1.2em; + font-weight: bold; + padding-right: 25px; + @include isaac-respond-min-width(md) { + padding-right: 0; + } + .caret { + @include caret(6px, $gray, bottom); + right: 9px; + top: 22px; + @include isaac-respond-min-width(md) { + .cart-instructions & { + right: 4px; + top: 19px; + } + } + display: none; + } + } + } + .content { + h2 { + font-size: 1.34em; + margin: 0 10px 8px 0; + @include isaac-respond-min-width(md) { + margin-right: 0; + } + } + table { + margin-bottom: 0; + tr { + td { + border-top: 0; + font-size: 1em; + .quantity { + font-size: 0.75em; + display: block; + } + + &.amount { + width: 1%; + white-space: nowrap; + padding-left: 15px; + text-align: right; + padding-right: 20px; + @include isaac-respond-min-width(md) { + padding-right: 4px; + } + } + } + } + tbody { + tr:last-child { + td { + padding-bottom: 10px; + } + } + } + tfoot { + tr { + td { + border-top: 1px solid $shopping-cart-content-border-color; + padding-top: 10px; + + &.amount { + font-size: 1.2em; + .caret { + @include caret(6px, $gray, top); + margin: 10px 0 0 8px; + cursor: pointer; + @include isaac-respond-min-width(md) { + display: none; + + .cart-instructions & { + display: inline-block; + } + } + } + } + } + } + } + } + } +} + +.paymentoptions { + padding-top: 10px; + form, .par { + min-width: 280px; + max-width: 300px; + margin: 0 auto; + @include isaac-respond-min-width(xs) { + width: 300px; + &.instructions { + width: 100%; + max-width: 100%; + } + } + } + @include isaac-respond-min-width(xs) { + padding: 10px; + } + + @include isaac-respond-min-width(md) { + min-height: 460px; + .paymentbuttons { + margin-top: 10px; + margin-bottom: 20px; + } + .instructions & { + padding: 20px 30px; + } + } + form p.par { + margin: 15px 0 -10px; + } + .securePayment { + color: $brand-success; + margin: -5px 0 5px 0; + font-size: 0.75em; + @include isaac-respond-min-width(md) { + margin-bottom: 25px; + + .instructions & { + margin: 0; + } + } + + img { + display: inline-block; + margin-top: -2px; + } + } + #selectmethod { + clear: both; + + } +} + +.paymentoption { + clear: both; + line-height: auto; + .form-control[disabled], .form-control[readonly], fieldset[disabled] .form-control { + background-color: transparent; + border: 0; + box-shadow: none; + cursor: default; + + + i, + span + i { + border-right: 0; + } + } + @include isaac-respond-min-width(md) { + + .instructions & { + clear: none; + width: 100%; + + h3 { + margin-top: 0; + } + } + } + + .form-group { + margin-bottom: 5px; + line-height: 1.3; + label { + margin: 6px 0 3px; + } + &.hideInputField { + display: none; + } + } + + .form-control { + height: auto; + min-height: 44px; + padding: 4px 10px 0; + .ie8 & { + padding-top: 11px; + } + font-size: 16px; + } + select.form-control { + padding-top: 11px; + padding-bottom: 11px; + } + + div.checkbox { + margin-bottom: 8px; + margin-top: 8px; + position: relative; + clear: left; + + label { + display: inline-block; + width: 87%; + } + .info-popover { + position: absolute; + right: 3px; + top: 5px; + margin: 0; + } + } + + .expiration { + width: 43.5%; + display: inline-block; + margin-right: 2px; + vertical-align: top; + } + .cvv { + width: 44%; + display: inline-block; + margin-right: 25px; + vertical-align: top; + } + .cvv + .expiration { + margin-right: 0; + margin-left: 9px; + } + > .cvv:first-child { + margin-bottom: 5px; + } + .hasIcon { + position: relative; + input { + padding-left: 48px; + } + label { + display: none; + .ie8 & { + display: block; + } + + } + i { + color: #666666; + font-size: 21px; + border-right: 1px solid #f2f2f2; + height: 41px; + position: absolute; + top: 2px; + width: 30px; + padding: 11px 8px 0 0; + margin-left: 10px; + pointer-events: none; + } + .cc-image { + display: block; + position: absolute; + right: 10px; + top: 10px; + width: 40px; + height: 27px; + overflow: hidden; + + img { + height: 100%; + } + } + } + .info-popover { + display: block; + position: absolute; + margin: 0; + right: -28px; + top: 11px; /*NAMI-1419; was bottom: 13px;*/ + + i { + font-size: 14px; + position: static; + border-right: 0; + height: auto; + margin-left: 0; + padding: 0; + top: auto; + width: auto; + } + } +} + +body .btn-primary, +body .btn-secondary { + white-space: normal; // NAMI-1386 +} + +body .btn-secondary { + display: block; + margin: 23px auto 0; + padding: 5px; + background: #ffffff; + +} + +.paymentbuttons { + text-align: center; + + &.row { + .btn { + margin-bottom: 5px; + } + } +} + +.extra-content > div { + margin: 10px 0; +} + +footer, #footer { + margin-top: 20px; + background: #ffffff; + + .footer-menu { + font-size: 12px; + padding: 20px 0; + .merchant { + ul { + overflow: hidden; + list-style: none; + margin: 0; + padding: 0; + text-align: center; + li { + list-style: none; + display: inline-block; + margin: 0 0 0 20px; + + &:first-child { + margin-left: 0; + } + } + } + } + } +} + +#globalcollectfooter { + color: $gray-darker; + font-size: 0.8em; + text-align: center; + padding: 20px 0 10px; + position: relative; + height: 26px; + box-sizing: content-box; + + .col-xs-24 { + min-height: 26px; + } + + a { + position: absolute; + right: $grid-gutter-width; + bottom: 3px; + text-align: right; + width: 50%; + + span { + display: block; + margin-left: 86px; // 20px right margin correctie + (image size / 2) + 10px white space + overflow: hidden; + text-overflow: ellipsis; + } + /* + @include isaac-respond-min-width(md) { + margin-left: 15px; + right: auto; + top: 5px; + } + */ + } +} + +#globalcollectimage { + margin: 0 auto; + width: 112px; + @include isaac-respond-min-width(md) { + display: inline-block; + } +} + +.editMode * { + cursor: default !important; +} + +#regionSelector { + position: absolute; + border: 1px solid #0093d0; + box-shadow: 0 0 5px #0093d0; + background: rgba(0, 147, 208, 0.2); +} + +.selectedNode { + box-shadow: inset 0 0 5px #0093d0; +} + +body .btn-tertiary { + border: 1px solid #cccccc; + height: 43px; + padding: 4px 10px 4px 0; + font-weight: bold; + font-size: 18px; + margin-top: 0px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + width: 100%; + text-align: left; + display: block; + margin-bottom: 0; + background: #ffffff; + position: relative; + + &:hover, &:active { + text-decoration: none; + background-color: $gray-lighter; + color: #000000; + z-index: 1; + } +} + +#paymentoptionslist { + + padding: 0; + list-style: none; + @include isaac-respond-min-width(md) { + + } + + li .btn-tertiary { + + & > div:after { + content: ""; + background: url(img/icons/icon-next.png) no-repeat 0 0; + background-size: 100%; + @include isaac-ie8-bg-contain('img/icons/icon-next.png'); + display: block; + width: 6px; + height: 10px; + position: absolute; + right: 10px; + top: 17px; + } + + > div { + width: 100%; + overflow: hidden; + text-overflow: ellipsis; + margin-left: 10px; + + > img { + width: 25px; + margin-right: 10px; + vertical-align: baseline; + } + } + .checkbox { + display: none; + } + } +} + +.instructions .paymentoption { + .table-responsive { + margin-top: 10px; + clear: left; + } + .intro { + @include isaac-respond-min-width(sm) { + h3 { + max-width: 83%; + } + img { + margin-top: -40px; + } + } + } +} + +.paymentoption .table { + border: 0; + > tbody { + > tr { + > td { + border-top: 0; + padding: 10px 0 0; + display: block; + width: 100%; + + @include isaac-respond-min-width(sm) { + display: table-cell; + border-bottom: 1px solid #cccccc; + padding: 6px; + width: 40%; + } + + &.important { + font-weight: bold; + border-bottom: 1px solid #cccccc; + padding: 0 0 10px; + @include isaac-respond-min-width(sm) { + padding: 6px; + width: 60%; + } + } + &.barcode { + padding: 20px 10px; + img { + display: block; + max-width: 280px; + @include isaac-respond-min-width(sm) { + max-width: 700px; + margin: 0 auto; + } + } + } + } + } + } +} + +.installment-plan.table { + margin: 12px 0px 0px 0px; + >tbody>tr>td, >tbody>tr>th { + border: 0px; + font-weight: normal; + font-size: 14px; + padding: 2px; + display: table-cell + } + >tbody>tr>th { + white-space: nowrap; + width: 60% + } + >tbody>tr>td.uri { + padding-top: 8px + } +} + +#label-installmentId { + font-size: 14px +} + +#installment-plans { + >.panel { + margin-bottom: 8px + } + .installment-plan-title { + background: white; + width: 100%; + cursor: pointer; + border: 1px solid #EAEAEA; + padding: 4px; + input { + margin: 0px 6px 0px 12px + } + span { + font-weight: normal; + margin-bottom: 0px + } + } +} + +.date-section { + .seperator { + padding: 10px 0 0 0; + text-align: center; + } + .date-input-container { + padding: 0; + } +} + +.popover { + .popover-content { + color: #000000; + > img.cvvImage { + width: 150px; + height: 92px; + } + } +} + +#loading { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 10000; + background: rgba(255, 255, 255, 0.9); + .loading-inner { + width: 64px; + margin: 20% auto 0; + position: relative; + i { + margin: 20% auto 0 auto; + font-size: 64px; + color: #666666; + } + } + .loading-text{ + width: 300px; + margin: 20px 0 0 -120px; + text-align: center; + + } +} + +// RTL support +body[dir=rtl] { + .cart { + .header { + margin-right: 0; + .amount { + padding-left: 18px; + padding-right: 0; + .caret { + @include caret(6px, $gray, bottom); + margin: 13px 4px 0 0; + right: auto; + left: 9px; + top: 6px; + } + } + } + .content { + h2 { + margin: 0 0 8px 10px; + } + } + &.open { + .content { + margin-right: 0; + } + } + tfoot { + tr { + td { + &.amount { + .caret { + margin: 10px 8px 0 0; + } + } + } + } + } + } + #paymentoptionslist { + li .btn-tertiary { + text-align: right; + padding-right: 10px; + padding-left: 0; + } + li .btn-tertiary > div:after { + background: url(img/icons/icon-prev.png) no-repeat 0 0; + background-size: 100%; + @include isaac-ie8-bg-contain('img/icons/icon-prev.png'); + right: auto; + left: 10px; + } + li .btn-tertiary img { + margin-right: 0; + margin-left: 10px; + } + } + .paymentoption { + .expiration { + margin-right: 0; + margin-left: 2%; + float: right; + } + .cvv { + display: block; + float: right; + margin-right: 0; + margin-left: 25px; + } + + .info-popover { + right: auto; + left: -28px; + i { + border-left: 0; + padding-left: 0; + margin-right: 0; + } + } + div.checkbox { + clear: right; + } + div.checkbox .info-popover { + right: auto; + left: 4px; + } + } + .radio, .checkbox { + padding-right: 20px; + padding-left: 0; + } + .radio input[type="radio"], .radio-inline input[type="radio"], .checkbox input[type="checkbox"], .checkbox-inline input[type="checkbox"] { + float: right; + margin-left: 10px; + margin-right: -20px; + } + #globalcollectfooter { + a { + left: $grid-gutter-width; + right: auto; + text-align: left; + + span { + margin-right: 86px; // 20px right margin correctie + (image size / 2) + 10px white space + margin-left: 0; + } + } + } + .pull-right { + float: left !important; + } + .pull-left { + float: right !important; + } + .popover { + text-align: inherit; + direction: rtl; + } + footer, #footer { + .footer-menu { + .merchant { + ul { + li { + margin: 0 20px 0 0; + &:first-child { + margin-right: 0; + } + } + } + } + } + } +} + +#paymentButtons { + overflow: hidden; + margin-bottom: 5px; + clear: both; +} + +.show-js { + display: none !important; + + .js & { + display: inherit !important; + } +} + +.postMessage { + display: none; +} + +/* print overrides */ +@media print { + html { + overflow: hidden; + } + #header, #footer, #globalcollectfooter { + display: none; + } + .paymentoptions .paymentbuttons { + display: none; + } + label.hidden-xs { + display: inline-block !important; + } + .info-popover { + display: none !important; + } + .form-control::-webkit-input-placeholder { /* WebKit browsers */ + color: transparent; + } + .form-control:-moz-placeholder { /* Mozilla Firefox 4 to 18 */ + color: transparent; + } + .form-control::-moz-placeholder { /* Mozilla Firefox 19+ */ + color: transparent; + } + .form-control:-ms-input-placeholder { /* Internet Explorer 10+ */ + color: transparent; + } + .cart { + .header { + display: none !important; + } + .content { + display: block !important; + + table { + border: 1px solid #999999; + width: 100%; + tr td { + border-bottom: 1px solid #999999; + } + tfoot tr td.amount .caret { + display: none !important; + } + } + } + } + + .paymentoption .table { + > tbody { + > tr { + > td { + display: table-cell; + border-bottom: 1px solid #cccccc; + padding: 6px; + width: 40%; + } + + &.important { + padding: 6px; + width: 60%; + } + &.barcode { + img { + display: block; + max-width: 700px; + margin: 0 auto; + } + } + } + } + } + .paymentoptions form.instructions { + width: 100%; + max-width: 100%; + } + .instructions .paymentoption .table-responsive { + overflow: hidden; + } +} + +.btn-link{ + color: #2869ac; +} + +#precarttext, #postcarttext, #prefootertext { + display: none; +} + +.form-control.euro { + width: 65%; + display: inline; +} + +.form-control.cent { + width: 20%; + display: inline; +} + +.form-group:not(.has-error) .error { + display: none !important; +} + +.form-group.has-error > .error:nth-child(1n+4) { + display: none !important; +} + +.transparent { + color: transparent; +} + +#paymentProductName { + margin-top: 3px; +} + +#globalcollectimage { + position: relative; + z-index: 1; +} + +#shoppingcart { + &.priceOnly { + .header { + display: block !important; + .caret { + display: none !important; + } + } + .content { + display: none !important; + } + } + &.full { + .header { + display: none !important; + } + .content { + display: block !important; + .caret { + display: none !important; + } + } + } +} + +// sticky footer +html { + position: relative; + min-height: 100%; +} + +body { + /* Margin bottom by footer height */ + margin-bottom: 160px; + &.minimal { + margin-bottom: 0; + } +} + +#footerWrapper { + position: absolute; + bottom: 0; + left: 0; + width: 100%; + /* Set the fixed height of the footer here */ + height: 160px; +} + +/* rpp-editor styling override */ +body.isOpenedInEditor { + overflow-y: scroll; +} + +/* Javascript specific styling*/ +html.js { + .cart{ + .header{ + .amount{ + .caret{ + display: inline-block; + } + } + } + } +} \ No newline at end of file diff --git a/full-angularjs/app/styles/_icons.scss b/full-angularjs/app/styles/_icons.scss new file mode 100644 index 0000000..d6f3b81 --- /dev/null +++ b/full-angularjs/app/styles/_icons.scss @@ -0,0 +1,58 @@ +@font-face { + font-family: 'icomoon'; + src:url('../fonts/icons/icons.eot?mn9aw3'); + src:url('../fonts/icons/icons.eot?#iefixmn9aw3') format('embedded-opentype'), + url('../fonts/icons/icons.woff?mn9aw3') format('woff'), + url('../fonts/icons/icons.ttf?mn9aw3') format('truetype'), + url('../fonts/icons/icons.svg?mn9aw3#icons') format('svg'); + font-weight: normal; + font-style: normal; +} + +[class^="icon-"], [class*=" icon-"] { + font-family: 'icomoon'; + speak: none; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + + /* Better Font Rendering =========== */ + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.icon-qmark:before { + content: "\e606"; +} +.icon-spinner-2:before { + content: "\e601"; +} +.icon-spinner-1:before { + content: "\e602"; +} +.icon-user:before { + content: "\e600"; +} +.icon-lock:before { + content: "\e603"; +} +.icon-date:before { + content: "\e604"; +} +.icon-card:before { + content: "\e605"; +} + +.icon-spinner-1, .icon-spinner-2 { + -ms-animation: 1s linear 0s normal none infinite spin; + -moz-animation: 1s linear 0s normal none infinite spin; + -webkit-animation: 1s linear 0s normal none infinite spin; + animation: 1s linear 0s normal none infinite spin; + position: absolute; +} + +@-ms-keyframes spin { from { -ms-transform: rotate(0deg); } to { -ms-transform: rotate(360deg); }} +@-moz-keyframes spin { from { -moz-transform: rotate(0deg); } to { -moz-transform: rotate(360deg); }} +@-webkit-keyframes spin { from { -webkit-transform: rotate(0deg); } to { -webkit-transform: rotate(360deg); }} +@keyframes spin { from { transform:rotate(0deg); } to { transform:rotate(360deg); }} \ No newline at end of file diff --git a/full-angularjs/app/styles/_input-groups.scss b/full-angularjs/app/styles/_input-groups.scss new file mode 100644 index 0000000..26ed76c --- /dev/null +++ b/full-angularjs/app/styles/_input-groups.scss @@ -0,0 +1,3 @@ +.input-group-addon { + color:#fff; +} \ No newline at end of file diff --git a/full-angularjs/app/styles/_isaac_offcanvas.scss b/full-angularjs/app/styles/_isaac_offcanvas.scss new file mode 100644 index 0000000..92dd62a --- /dev/null +++ b/full-angularjs/app/styles/_isaac_offcanvas.scss @@ -0,0 +1,109 @@ +@-webkit-keyframes offcanvasSlideInMenu { + 0% {display:block;@include translate3d(-($offcanvas-width - 1px),0,0)} + 1% {@include translate3d(-($offcanvas-width - 1px),0,0)} + 100% {@include translate3d(0,0,0)} +} + +@keyframes offcanvasSlideInMenu { + 0% {display:block;@include translate3d(-($offcanvas-width - 1px),0,0)} + 1% {@include translate3d(-($offcanvas-width - 1px),0,0)} + 100% {@include translate3d(0,0,0)} +} + +@-webkit-keyframes offcanvasSlideInContent { + 0% {@include translate3d(1px,0,0)} + 1% {@include translate3d(1px,0,0)} + 100% {@include translate3d($offcanvas-width,0,0)} +} + +@keyframes offcanvasSlideInContent { + 0% {@include translate3d(1px,0,0)} + 1% {@include translate3d(1px,0,0)} + 100% {@include translate3d($offcanvas-width,0,0)} +} + +@-webkit-keyframes offcanvasSlideOutMenu { + 0% {@include translate3d(0,0,0)} + 1% {@include translate3d(0,0,0)} + 100% {@include translate3d(-$offcanvas-width,0,0);} +} + +@keyframes offcanvasSlideOutMenu { + 0% {@include translate3d(0,0,0)} + 1% {@include translate3d(0,0,0)} + 100% {@include translate3d(-$offcanvas-width,0,0);} +} + + +@-webkit-keyframes offcanvasSlideOutContent { + 0% {@include translate3d($offcanvas-width - 1px,0,0)} + 1% {@include translate3d($offcanvas-width - 1px,0,0)} + 100% {@include translate3d(0,0,0)} +} + +@keyframes offcanvasSlideOutContent { + 0% {@include translate3d($offcanvas-width - 1px,0,0)} + 1% {@include translate3d($offcanvas-width - 1px,0,0)} + 100% {@include translate3d(0,0,0)} +} + + +.offcanvas-menu { + position: absolute; + top: 0; + left: 0; + width: $offcanvas-width; + height: auto; + display:none; + background-color:$offcanvas-bg; + -webkit-backface-visibility: hidden; + @include translate3d(-$offcanvas-width,0,0); + @include box-shadow($offcanvas-shadow); +} + +.offcanvas-content { + -webkit-backface-visibility: hidden; +} + +//hide offcanvas menu on md devices and up +@include isaac-respond-min-width(md) { + .offcanvas-menu { + display:none!important; + } +} + +// +@include isaac-respond-max-width(sm) { + //class offcanvas-open will be set on body while the offcanvas menu is shown + body.offcanvas-open { + overflow-x:hidden; + + .offcanvas-content { + //Note: the animation timing used here must also be specified in the javascript file + @include animation(offcanvasSlideInContent 200ms); + @include translate3d($offcanvas-width,0,0); + } + + .offcanvas-menu { + display:block; + @include animation(offcanvasSlideInMenu 200ms); + @include translate3d(0,0,0); + } + } + + //class offcanvas-closing will be removed after the animation has completed + body.offcanvas-closing { + overflow-x:hidden; + + .offcanvas-content { + @include animation(offcanvasSlideOutContent 200ms); + @include translate3d(0,0,0); + } + + .offcanvas-menu { + display:block; + @include animation(offcanvasSlideOutMenu 200ms); + @include translate3d(-$offcanvas-width,0,0); + } + } +} \ No newline at end of file diff --git a/full-angularjs/app/styles/_jumbotron.scss b/full-angularjs/app/styles/_jumbotron.scss new file mode 100644 index 0000000..4876435 --- /dev/null +++ b/full-angularjs/app/styles/_jumbotron.scss @@ -0,0 +1,7 @@ +.jumbotron { + margin:22px -10px 22px -10px; + @include isaac-respond-min-width(md) { + margin-left:-20px; + margin-right:-20px; + } +} \ No newline at end of file diff --git a/full-angularjs/app/styles/_labels.scss b/full-angularjs/app/styles/_labels.scss new file mode 100644 index 0000000..19c076c --- /dev/null +++ b/full-angularjs/app/styles/_labels.scss @@ -0,0 +1,7 @@ +.label { + border-radius:0; +} + +.label-warning { + color:#000; +} \ No newline at end of file diff --git a/full-angularjs/app/styles/_modals.scss b/full-angularjs/app/styles/_modals.scss new file mode 100644 index 0000000..e545571 --- /dev/null +++ b/full-angularjs/app/styles/_modals.scss @@ -0,0 +1,7 @@ +.modal-footer { + background-color:$gray-lighter; +} + +.modal-header { + min-height: 30px; +} \ No newline at end of file diff --git a/full-angularjs/app/styles/_navs.scss b/full-angularjs/app/styles/_navs.scss new file mode 100644 index 0000000..1ef22fd --- /dev/null +++ b/full-angularjs/app/styles/_navs.scss @@ -0,0 +1,296 @@ +//generic nav styles +.nav { + // Active state + > li.active > a { + &, + &:hover, + &:focus { + color: $brand-primary; + background-color: $brand-secondary; + border:1px solid #79c2e1; + } + } +} + +.nav-pills { + > li > a { + color:#000; + padding: 4px 15px 4px 11px; + &:before { + @include caret(4px, $brand-primary, right); + position:absolute; + display:block; + left:2px; + top:11px; + } + &:hover, + &:focus { + background-color:transparent; + color:$brand-primary; + } + } + + > li.active > a { + padding-left:8px; + &:before { + display:none; + } + } + +} + +//tabs +.nav-tabs { + margin-top: 4px; + margin-bottom: 35px; + border-bottom: 1px solid $gray; + > li { + > a { + text-transform: uppercase; + color: #000000; + font-family: $font-family-webfont-normal; + padding: 7px 19px 11px; + font-size: 16px; + &:hover { + background: none; + border: 1px solid transparent; + color: $brand-primary; + } + } + + // Active state, and its :hover to override normal :hover + &.active > a { + &, + &:hover, + &:focus { + color: #000000; + background-color: #ffffff; + border-color: $gray $gray $gray; + border-bottom-color: #ffffff; + cursor: default; + outline: none; + } + } + } +} + +//metamenu +.nav-metamenu { + + margin-top:2px; + + .caret { + border-top-color:$gray-darker; + } + + + //lock icon is shown at different font-size then the text, so we need to position it + .lock { + position:relative; + display:inline-block; + width:15px; + + .icon-lock { + color:$gray; + font-size:18px; + position:absolute; + left:0; + top:-15px; + } + + } + + + > li > a { + color:$brand-primary; + font-size:13px; + padding: 6px 12px 6px 12px; + &:before { + display:none; + } + &:hover, + &:focus { + color:$link-hover-color; + } + } + + + > li.active > a { + padding-left:12px; + } + + + > li { + + + li { + margin-left: 3px; + } + + } + +} + + + + +//left menu on desktop browsers +.nav-aside { + margin:7px 0 20px 0; + + .nav-header { + font-family:$font-family-webfont-normal; + font-size:18px; + margin-top:17px; + margin-bottom:5px; + &:first-child { + margin-top:0; + } + } + + + + +} + +//offcanvas tabs +.nav-tabs-offcanvas { + border-bottom: 0; + margin-top: 0; + margin-bottom: 0; + > li { + margin-bottom: 0; + > a { + margin-right: 0; + padding:16px 0 10px 7px; + background-color: $gray-darker; + border-radius:0; + border-width:0; + text-transform: none; + font-family:$font-family-webfont-normal; + font-size:15px; + line-height:1; + height:48px; + overflow:hidden; + color:#fff; + &:hover { + background-color: $gray-darker; + border: 0px solid transparent; + color: #fff; + } + + &[href="#tab-about"] { + width:75px; + } + + &[href="#tab-developers"] { + width:95px; + } + + &[href="#tab-merchant"] { + width:95px; + padding-left:16px; + @include box-shadow($offcanvas-shadow); + .icon-lock { + color:$gray; + height:100%; + display:block; + position:absolute; + top:15px; + left:5px; + } + } + + > small { + display:block; + font-size:9px; + color:$gray; + line-height:1; + } + + + } + + // Active state, and its :hover to override normal :hover + &.active > a { + &, + &:hover, + &:focus { + color: #fff; + background-color: $brand-primary; + border-width:0; + cursor: default; + } + } + } +} + + +//offcanvas menu +.nav-offcanvas { + background:transparent; + border-bottom:1px solid $brand-tertiary; + padding-bottom:7px; + margin-top:5px; + > li > a { + color:#fff; + padding: 9px 15px 9px 22px; + border-radius:0; + &:before { + @include caret(4px, #fff, right); + display:block; + position:absolute; + left:13px; + top:16px; + } + &:hover, + &:focus { + color: #fff; + background-color: transparent; + border:none; + } + } + + > li.active > a { + &, + &:hover, + &:focus { + color:#fff; + border:none; + background-color:darken($brand-primary,5%); + @include box-shadow($offcanvas-shadow); + } + } + + .nav-header { + font-family:$font-family-webfont; + font-size:15px; + color:$brand-tertiary; + border-top:1px solid $brand-tertiary; + background:transparent; + padding:12px 0 2px 12px; + margin-top:7px; + &:first-child { + margin-top:0; + } + } + + .nav-header:first-child { + border-top:none; + } + + > li + li { + margin-top:0; + } +} + +//menu used in pages, with links to additional info for this page +.nav-contentmenu { + > li > a { + color: $brand-primary; + font-weight:bold; + &:hover, + &:focus { + color:$link-hover-color; + } + } +} \ No newline at end of file diff --git a/full-angularjs/app/styles/_panels.scss b/full-angularjs/app/styles/_panels.scss new file mode 100644 index 0000000..0f252b1 --- /dev/null +++ b/full-angularjs/app/styles/_panels.scss @@ -0,0 +1,66 @@ +.panel { + width: 100%; + padding: 10px 15px 5px 15px; + background-color: #F2F2F2; + + .panel-body { + h2:first-child, + h3:first-child, + h4:first-child, + h5:first-child, + h6:first-child { + margin-top:4px; + } + + @include isaac-respond-min-width(md) { + padding:20px; + } + + } +} + +article .panel { + margin-left:-10px; + margin-right:-10px; + + @include isaac-respond-min-width(md) { + margin-left:-20px; + margin-right:-20px; + } + +} + + +.panel-title { + font-size: 24px; + color: $gray-darker; + + > a { + color: $gray-darker; + } +} + +.panel-info { + .panel-body { + background-color:$brand-secondary; + } + + .panel-title { + color: #fff; + > a { + color: #fff; + } + } + + //panel in menu dropdown + .dropdown-menu-portal & { + margin-bottom:0; + .panel-body { + padding:10px; + p { + font-style:italic; + } + } + } + +} diff --git a/full-angularjs/app/styles/_popovers.scss b/full-angularjs/app/styles/_popovers.scss new file mode 100644 index 0000000..c409ac1 --- /dev/null +++ b/full-angularjs/app/styles/_popovers.scss @@ -0,0 +1,32 @@ +.popover { + border-radius: 4px; + max-width: 266px; +} + +.info-popover { + display: inline-block; + width: 22px; + height: 22px; + border: 1px solid #666666; + border-radius: 10px; + font-family: $font-family-sans-serif; + font-weight: 400; + font-size: 16px; + background-color: $gray-lighter; + color: #666666; + text-align: center; + margin-left: 1px; + line-height: 1; + padding-top: 2px; + cursor: pointer; + + svg { + border: 0 none !important; + height: auto !important; + left: 3px; + margin-left: 0 !important; + padding-right: 0 !important; + top: 1px !important; + width: 15px !important; + } +} \ No newline at end of file diff --git a/full-angularjs/app/styles/_sticky-footer.scss b/full-angularjs/app/styles/_sticky-footer.scss new file mode 100644 index 0000000..f56c1db --- /dev/null +++ b/full-angularjs/app/styles/_sticky-footer.scss @@ -0,0 +1,18 @@ + +/* Sticky footer styles +-------------------------------------------------- */ +html { + position: relative; + min-height: 100%; +} +body { + /* Margin bottom by footer height */ + margin-bottom: 135px; +} +#footer-wrapper { + position: absolute; + bottom: 0; + width: 100%; + /* Set the fixed height of the footer here */ + height: 135px; +} diff --git a/full-angularjs/app/styles/_tables.scss b/full-angularjs/app/styles/_tables.scss new file mode 100644 index 0000000..c6e3641 --- /dev/null +++ b/full-angularjs/app/styles/_tables.scss @@ -0,0 +1,5 @@ +.table-responsive { + margin: 0; + border: 0; +} + diff --git a/full-angularjs/app/styles/_type.scss b/full-angularjs/app/styles/_type.scss new file mode 100644 index 0000000..51bbddf --- /dev/null +++ b/full-angularjs/app/styles/_type.scss @@ -0,0 +1,38 @@ +.page-header { + padding-bottom: 0; + margin: 0; + border-bottom: 0; + h1, .h1 { + margin-top: 0; + } +} + +h1, h2, h3, h4, h5, h6, +.h1, .h2, .h3, .h4, .h5, .h6 { + margin-top: 22px; + margin-bottom: 11px; +} + +h4, h5, h6, +.h4, .h5, .h6 { + margin-top: 22px; + margin-bottom: 4px; +} + +@include isaac-respond-min-width(md) { + h1, .h1 { + font-size:32px; + } + + h2, .h2 { + font-size:30px; + } + + h3, .h3 { + font-size:24px; + } + + h4, .h4 { + font-size:20px; + } +} \ No newline at end of file diff --git a/full-angularjs/app/styles/_variables.scss b/full-angularjs/app/styles/_variables.scss new file mode 100644 index 0000000..6162884 --- /dev/null +++ b/full-angularjs/app/styles/_variables.scss @@ -0,0 +1,860 @@ +//###################################### +//## ISAAC: non-Bootstrap variables +//###################################### + +//background colors (Bootstrap only has $body-bg) +$content-bg: #fff; //used for the complete site without the offcanvas menu's + +$brand-secondary: #f0f9fc; +$brand-tertiary: #c4e6f4; + +$offcanvas-width: 265px; +$offcanvas-bg: #0093d0; +$offcanvas-shadow: inset -10px 0 10px -10px rgba(0,0,0,0.5); + + + +//###################################### +//## ISAAC: Bootstrap variables +//###################################### + +// a flag to toggle asset pipeline / compass integration +// defaults to true if twbs-font-path function is present (no function => twbs-font-path('') parsed as string == right side) +// in Sass 3.3 this can be improved with: function-exists(twbs-font-path) +$bootstrap-sass-asset-helper: (twbs-font-path("") != unquote('twbs-font-path("")')) !default; +// +// Variables +// -------------------------------------------------- + + +//== Colors +// +//## Gray and brand colors for use across Bootstrap. + +$gray-darker: #333333; +$gray-dark: #8e8e8e; +$gray: #666666; +$gray-light: #e1e1e1; +$gray-lighter: #f2f2f2; + +$brand-primary: #0093d0 !default; +$brand-success: #006700 !default; +$brand-info: #0093d0 !default; +$brand-warning: #ffcc00 !default; +$brand-danger: #df0000 !default; + + +//== Scaffolding +// +// ## Settings for some of the most global styles. + +//** Background color for ``. +$body-bg: $gray-lighter !default; //bg color below the footer +//** Global text color on ``. +$text-color: #000 !default; + +//** Global textual link color. +$link-color: #000 !default; +//** Link hover color set via `darken()` function. +$link-hover-color: lighten($link-color, 15%) !default; + + +//== Typography +// +//## Font, line-height, and color for body text, headings, and more. + +$font-family-sans-serif: Arial, "Helvetica Neue", Helvetica, sans-serif; +$font-family-serif: Georgia, "Times New Roman", Times, serif !default; +//** Default monospace fonts for ``, ``, and `
`.
+$font-family-monospace:   Menlo, Monaco, Consolas, "Courier New", monospace !default;
+$font-family-base:        $font-family-sans-serif !default;
+
+$font-size-base:          15px !default;
+$font-size-large:         ceil(($font-size-base * 1.25)) !default; // ~18px
+$font-size-small:         ceil(($font-size-base * 0.85)) !default; // ~12px
+
+//font-sizes are mobile first! They will be overriden for md devices in _type.scss
+$font-size-h1:            26px;
+$font-size-h2:            24px;
+$font-size-h3:            20px;
+$font-size-h4:            18px;
+$font-size-h5:            15px;
+$font-size-h6:            13px;
+
+//** Unit-less `line-height` for use in components like buttons.
+$line-height-base:        1.5 !default;
+//** Computed "line-height" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.
+$line-height-computed:    floor(($font-size-base * $line-height-base)) !default; // ~20px
+
+//** By default, this inherits from the ``.
+$headings-font-family:    Arial, sans-serif;
+$headings-font-weight:    400 !default;
+$headings-line-height:    1.1 !default;
+$headings-color:          $gray-darker;
+
+
+//-- Iconography
+//
+//## Specify custom locations of the include Glyphicons icon font. Useful for those including Bootstrap via Bower.
+
+$icon-font-path:          "global/fonts/bootstrap/" !default;
+$icon-font-name:          "glyphicons-halflings-regular" !default;
+$icon-font-svg-id:        "glyphicons_halflingsregular" !default;
+
+//== Components
+//
+//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start).
+
+$padding-base-vertical:     6px !default;
+$padding-base-horizontal:   12px !default;
+
+$padding-large-vertical:    10px !default;
+$padding-large-horizontal:  16px !default;
+
+$padding-small-vertical:    5px !default;
+$padding-small-horizontal:  10px !default;
+
+$padding-xs-vertical:       1px !default;
+$padding-xs-horizontal:     5px !default;
+
+$line-height-large:         1.33 !default;
+$line-height-small:         1.5 !default;
+
+$border-radius-base:        0 !default;
+$border-radius-large:       0 !default;
+$border-radius-small:       0 !default;
+
+//** Global color for active items (e.g., navs or dropdowns).
+$component-active-color:    #fff !default;
+//** Global background color for active items (e.g., navs or dropdowns).
+$component-active-bg:       $brand-primary !default;
+
+//** Width of the `border` for generating carets that indicator dropdowns.
+$caret-width-base:          4px !default;
+//** Carets increase slightly in size for larger components.
+$caret-width-large:         5px !default;
+
+
+//== Tables
+//
+//## Customizes the `.table` component with basic values, each used across all table variations.
+
+//** Padding for ``s and ``s.
+$table-cell-padding:            4px !default;
+//** Padding for cells in `.table-condensed`.
+$table-condensed-cell-padding:  5px !default;
+
+//** Default background color used for all tables.
+$table-bg:                      transparent !default;
+//** Background color used for `.table-striped`.
+$table-bg-accent:               $brand-secondary !default;
+//** Background color used for `.table-hover`.
+$table-bg-hover:                #f5f5f5 !default;
+$table-bg-active:               $table-bg-hover !default;
+
+//** Border color for table and cell borders.
+$table-border-color:            $gray !default;
+
+
+//== Buttons
+//
+//## For each of Bootstrap's buttons, define text, background and border color.
+
+$btn-font-weight:                normal !default;
+
+$btn-default-color:              $brand-primary !default;
+$btn-default-bg:                 $brand-secondary !default;
+$btn-default-border:             $brand-primary !default;
+
+$btn-primary-color:              #fff !default;
+$btn-primary-bg:                 $brand-primary !default;
+$btn-primary-border:             $brand-primary !default;
+
+$btn-success-color:              #fff !default;
+$btn-success-bg:                 $brand-success !default;
+$btn-success-border:             darken($btn-success-bg, 5%) !default;
+
+$btn-info-color:                 #fff !default;
+$btn-info-bg:                    $brand-info !default;
+$btn-info-border:                darken($btn-info-bg, 5%) !default;
+
+$btn-warning-color:              #fff !default;
+$btn-warning-bg:                 $brand-warning !default;
+$btn-warning-border:             darken($btn-warning-bg, 5%) !default;
+
+$btn-danger-color:               #fff !default;
+$btn-danger-bg:                  $brand-danger !default;
+$btn-danger-border:              darken($btn-danger-bg, 5%) !default;
+
+$btn-link-disabled-color:        $gray-light !default;
+
+
+//== Forms
+//
+//##
+
+//** `` background color
+$input-bg:                       #fff !default;
+//** `` background color
+$input-bg-disabled:              $gray-lighter !default;
+
+//** Text color for ``s
+$input-color:                    $text-color;
+//** `` border color
+$input-border:                   $gray-darker;
+//** `` border radius
+$input-border-radius:            0 !default;
+//** Border color for inputs on focus
+$input-border-focus:             $gray-darker !default;
+
+//** Placeholder text color
+$input-color-placeholder:        $gray-darker;
+
+//** Default `.form-control` height
+$input-height-base:              ($line-height-computed + ($padding-base-vertical * 2) + 2) !default;
+//** Large `.form-control` height
+$input-height-large:             (ceil($font-size-large * $line-height-large) + ($padding-large-vertical * 2) + 2) !default;
+//** Small `.form-control` height
+$input-height-small:             (floor($font-size-small * $line-height-small) + ($padding-small-vertical * 2) + 2) !default;
+
+$legend-color:                   $gray-darker !default;
+$legend-border-color:            transparent !default;
+
+//** Background color for textual input addons
+$input-group-addon-bg:           $gray-darker !default;
+//** Border color for textual input addons
+$input-group-addon-border-color: $input-border !default;
+
+
+//== Dropdowns
+//
+//## Dropdown menu container and contents.
+
+//** Background for the dropdown menu.
+$dropdown-bg:                    #fff !default;
+//** Dropdown menu `border-color`.
+$dropdown-border:                rgba(0,0,0,.15) !default;
+//** Dropdown menu `border-color` **for IE8**.
+$dropdown-fallback-border:       #ccc !default;
+//** Divider color for between dropdown items.
+$dropdown-divider-bg:            $gray-light !default;
+
+//** Dropdown link text color.
+$dropdown-link-color:            $link-color !default;
+//** Hover color for dropdown links.
+$dropdown-link-hover-color:      darken($link-color, 5%) !default;
+//** Hover background for dropdown links.
+$dropdown-link-hover-bg:         #f5f5f5 !default;
+
+//** Active dropdown menu item text color.
+$dropdown-link-active-color:     $component-active-color !default;
+//** Active dropdown menu item background color.
+$dropdown-link-active-bg:        $component-active-bg !default;
+
+//** Disabled dropdown menu item background color.
+$dropdown-link-disabled-color:   $gray-light !default;
+
+//** Text color for headers within dropdown menus.
+$dropdown-header-color:          $gray-light !default;
+
+// Note: Deprecated $dropdown-caret-color as of v3.1.0
+$dropdown-caret-color:           $brand-primary;
+
+
+//-- Z-index master list
+//
+// Warning: Avoid customizing these values. They're used for a bird's eye view
+// of components dependent on the z-axis and are designed to all work together.
+//
+// Note: These variables are not generated into the Customizer.
+
+$zindex-navbar:            1000 !default;
+$zindex-dropdown:          1000 !default;
+$zindex-popover:           1010 !default;
+$zindex-tooltip:           1030 !default;
+$zindex-navbar-fixed:      1030 !default;
+$zindex-modal-background:  1040 !default;
+$zindex-modal:             1050 !default;
+
+
+//== Media queries breakpoints
+//
+//## Define the breakpoints at which your layout will change, adapting to different screen sizes.
+
+// Extra small screen / phone
+// Note: Deprecated $screen-xs and $screen-phone as of v3.0.1
+$screen-xs:                  480px !default;
+$screen-xs-min:              $screen-xs !default;
+$screen-phone:               $screen-xs-min !default;
+
+// Small screen / tablet
+// Note: Deprecated $screen-sm and $screen-tablet as of v3.0.1
+$screen-sm:                  768px !default;
+$screen-sm-min:              $screen-sm !default;
+$screen-tablet:              $screen-sm-min !default;
+
+// Medium screen / desktop
+// Note: Deprecated $screen-md and $screen-desktop as of v3.0.1
+$screen-md:                  992px !default;
+$screen-md-min:              $screen-md !default;
+$screen-desktop:             $screen-md-min !default;
+
+// Large screen / wide desktop
+// Note: Deprecated $screen-lg and $screen-lg-desktop as of v3.0.1
+$screen-lg:                  1200px !default;
+$screen-lg-min:              $screen-lg !default;
+$screen-lg-desktop:          $screen-lg-min !default;
+
+// So media queries don't overlap when required, provide a maximum
+$screen-xs-max:              ($screen-sm-min - 1) !default;
+$screen-sm-max:              ($screen-md-min - 1) !default;
+$screen-md-max:              ($screen-lg-min - 1) !default;
+
+
+//== Grid system
+//
+//## Define your custom responsive grid.
+
+//** Number of columns in the grid.
+$grid-columns:              24 !default;
+//** Padding between columns. Gets divided in half for the left and right.
+$grid-gutter-width:         20px !default;
+// Navbar collapse
+//** Point at which the navbar becomes uncollapsed.
+$grid-float-breakpoint:     $screen-sm-min !default;
+//** Point at which the navbar begins collapsing.
+$grid-float-breakpoint-max: ($grid-float-breakpoint - 1) !default;
+
+
+//== Container sizes
+//
+//## Define the maximum width of `.container` for different screen sizes.
+
+// Small screen / tablet
+$container-tablet:             100%;
+//** For `$screen-sm-min` and up.
+$container-sm:                 $container-tablet !default;
+
+// Medium screen / desktop
+$container-desktop:            ((950px + $grid-gutter-width)) !default;
+//** For `$screen-md-min` and up.
+$container-md:                 $container-desktop !default;
+
+// Large screen / wide desktop
+$container-large-desktop:      ((950px + $grid-gutter-width)) !default;
+//** For `$screen-lg-min` and up.
+$container-lg:                 $container-large-desktop !default;
+
+
+//== Navbar
+//
+//##
+
+// Basics of a navbar
+$navbar-height:                    50px !default;
+$navbar-margin-bottom:             $line-height-computed !default;
+$navbar-border-radius:             0 !default;
+$navbar-padding-horizontal:        floor(($grid-gutter-width / 2)) !default;
+$navbar-padding-vertical:          (($navbar-height - $line-height-computed) / 2) !default;
+$navbar-collapse-max-height:       340px !default;
+
+$navbar-default-color:             #FFF !default;
+$navbar-default-bg:                $gray-darker !default;
+$navbar-default-border:            darken($navbar-default-bg, 6.5%) !default;
+
+// Navbar links
+$navbar-default-link-color:                #FFF !default;
+$navbar-default-link-hover-color:          #CCC !default;
+$navbar-default-link-hover-bg:             transparent !default;
+$navbar-default-link-active-color:         #FFF !default;
+$navbar-default-link-active-bg:            darken($navbar-default-bg, 6.5%) !default;
+$navbar-default-link-disabled-color:       #ccc !default;
+$navbar-default-link-disabled-bg:          transparent !default;
+
+// Navbar brand label
+$navbar-default-brand-color:               $navbar-default-link-color !default;
+$navbar-default-brand-hover-color:         darken($navbar-default-brand-color, 10%) !default;
+$navbar-default-brand-hover-bg:            transparent !default;
+
+// Navbar toggle
+$navbar-default-toggle-hover-bg:           #ddd !default;
+$navbar-default-toggle-icon-bar-bg:        #888 !default;
+$navbar-default-toggle-border-color:       #ddd !default;
+
+
+// Inverted navbar
+// Reset inverted navbar basics
+$navbar-inverse-color:                      $gray-light !default;
+$navbar-inverse-bg:                         #222 !default;
+$navbar-inverse-border:                     darken($navbar-inverse-bg, 10%) !default;
+
+// Inverted navbar links
+$navbar-inverse-link-color:                 $gray-light !default;
+$navbar-inverse-link-hover-color:           #fff !default;
+$navbar-inverse-link-hover-bg:              transparent !default;
+$navbar-inverse-link-active-color:          $navbar-inverse-link-hover-color !default;
+$navbar-inverse-link-active-bg:             darken($navbar-inverse-bg, 10%) !default;
+$navbar-inverse-link-disabled-color:        #444 !default;
+$navbar-inverse-link-disabled-bg:           transparent !default;
+
+// Inverted navbar brand label
+$navbar-inverse-brand-color:                $navbar-inverse-link-color !default;
+$navbar-inverse-brand-hover-color:          #fff !default;
+$navbar-inverse-brand-hover-bg:             transparent !default;
+
+// Inverted navbar toggle
+$navbar-inverse-toggle-hover-bg:            #333 !default;
+$navbar-inverse-toggle-icon-bar-bg:         #fff !default;
+$navbar-inverse-toggle-border-color:        #333 !default;
+
+
+//== Navs
+//
+//##
+
+//=== Shared nav styles
+$nav-link-padding:                          10px 15px !default;
+$nav-link-hover-bg:                         $gray-lighter !default;
+
+$nav-disabled-link-color:                   $gray-light !default;
+$nav-disabled-link-hover-color:             $gray-light !default;
+
+$nav-open-link-hover-color:                 #fff !default;
+
+//== Tabs
+$nav-tabs-border-color:                     #ddd !default;
+
+$nav-tabs-link-hover-border-color:          $gray-lighter !default;
+
+$nav-tabs-active-link-hover-bg:             $body-bg !default;
+$nav-tabs-active-link-hover-color:          $gray !default;
+$nav-tabs-active-link-hover-border-color:   #ddd !default;
+
+$nav-tabs-justified-link-border-color:            #ddd !default;
+$nav-tabs-justified-active-link-border-color:     $body-bg !default;
+
+//== Pills
+$nav-pills-border-radius:                   $border-radius-base !default;
+$nav-pills-active-link-hover-bg:            $component-active-bg !default;
+$nav-pills-active-link-hover-color:         $component-active-color !default;
+
+
+//== Pagination
+//
+//##
+
+$pagination-color:                     $link-color !default;
+$pagination-bg:                        #fff !default;
+$pagination-border:                    #ddd !default;
+
+$pagination-hover-color:               $link-hover-color !default;
+$pagination-hover-bg:                  $gray-lighter !default;
+$pagination-hover-border:              #ddd !default;
+
+$pagination-active-color:              #fff !default;
+$pagination-active-bg:                 $brand-primary !default;
+$pagination-active-border:             $brand-primary !default;
+
+$pagination-disabled-color:            $gray-light !default;
+$pagination-disabled-bg:               #fff !default;
+$pagination-disabled-border:           #ddd !default;
+
+
+//== Pager
+//
+//##
+
+$pager-bg:                             $pagination-bg !default;
+$pager-border:                         $pagination-border !default;
+$pager-border-radius:                  15px !default;
+
+$pager-hover-bg:                       $pagination-hover-bg !default;
+
+$pager-active-bg:                      $pagination-active-bg !default;
+$pager-active-color:                   $pagination-active-color !default;
+
+$pager-disabled-color:                 $pagination-disabled-color !default;
+
+
+//== Jumbotron
+//
+//##
+
+$jumbotron-padding:              0 !default;
+$jumbotron-color:                inherit !default;
+$jumbotron-bg:                   #fff !default;
+$jumbotron-heading-color:        inherit !default;
+$jumbotron-font-size:            ceil(($font-size-base * 1.5)) !default;
+
+
+//== Form states and alerts
+//
+//## Define colors for form feedback states and, by default, alerts.
+
+$state-success-text:             #007a00 !default;
+$state-success-bg:               #d9f3d9 !default;
+$state-success-border:           #d9f3d9 !default;
+
+$state-info-text:                #006791 !default;
+$state-info-bg:                  #d9eff8 !default;
+$state-info-border:              $state-info-bg !default;
+
+$state-warning-text:             #b28e00 !default;
+$state-warning-bg:               #fff7d9 !default;
+$state-warning-border:           $state-warning-bg !default;
+
+$state-danger-text:              #9c0000 !default;
+$state-danger-bg:                #fad9d9 !default;
+$state-danger-border:            $state-danger-bg !default;
+
+
+//== Tooltips
+//
+//##
+
+//** Tooltip max width
+$tooltip-max-width:           200px !default;
+//** Tooltip text color
+$tooltip-color:               #fff !default;
+//** Tooltip background color
+$tooltip-bg:                  $gray-darker;
+$tooltip-opacity:             .9 !default;
+
+//** Tooltip arrow width
+$tooltip-arrow-width:         5px !default;
+//** Tooltip arrow color
+$tooltip-arrow-color:         $tooltip-bg !default;
+
+
+//== Popovers
+//
+//##
+
+//** Popover body background color
+$popover-bg:                          #fff !default;
+//** Popover maximum width
+$popover-max-width:                   276px !default;
+//** Popover border color
+$popover-border-color:                rgba(0,0,0,.2) !default;
+//** Popover fallback border color
+$popover-fallback-border-color:       #ccc !default;
+
+//** Popover title background color
+$popover-title-bg:                    darken($popover-bg, 3%) !default;
+
+//** Popover arrow width
+$popover-arrow-width:                 10px !default;
+//** Popover arrow color
+$popover-arrow-color:                 #fff !default;
+
+//** Popover outer arrow width
+$popover-arrow-outer-width:           ($popover-arrow-width + 1) !default;
+//** Popover outer arrow color
+$popover-arrow-outer-color:           fadein($popover-border-color, 5%) !default;
+//** Popover outer arrow fallback color
+$popover-arrow-outer-fallback-color:  darken($popover-fallback-border-color, 20%) !default;
+
+
+//== Labels
+//
+//##
+
+//** Default label background color
+$label-default-bg:            $gray-dark !default;
+//** Primary label background color
+$label-primary-bg:            $brand-primary !default;
+//** Success label background color
+$label-success-bg:            $brand-success !default;
+//** Info label background color
+$label-info-bg:               $brand-info !default;
+//** Warning label background color
+$label-warning-bg:            $brand-warning !default;
+//** Danger label background color
+$label-danger-bg:             $brand-danger !default;
+
+//** Default label text color
+$label-color:                 #fff !default;
+//** Default text color of a linked label
+$label-link-hover-color:      #fff !default;
+
+
+//== Modals
+//
+//##
+
+//** Padding applied to the modal body
+$modal-inner-padding:         15px !default;
+
+//** Padding applied to the modal title
+$modal-title-padding:         15px 15px 0 15px !default;
+//** Modal title line-height
+$modal-title-line-height:     $line-height-base !default;
+
+//** Background color of modal content area
+$modal-content-bg:                             #fff !default;
+//** Modal content border color
+$modal-content-border-color:                   rgba(0,0,0,.2) !default;
+//** Modal content border color **for IE8**
+$modal-content-fallback-border-color:          #999 !default;
+
+//** Modal backdrop background color
+$modal-backdrop-bg:           #000 !default;
+//** Modal backdrop opacity
+$modal-backdrop-opacity:      .5 !default;
+//** Modal header border color
+$modal-header-border-color:   transparent;
+//** Modal footer border color
+$modal-footer-border-color:   transparent;
+
+$modal-lg:                    900px !default;
+$modal-md:                    600px !default;
+$modal-sm:                    300px !default;
+
+
+//== Alerts
+//
+//## Define alert colors, border radius, and padding.
+
+$alert-padding:               10px !default;
+$alert-border-radius:         0 !default;
+$alert-link-font-weight:      bold !default;
+
+$alert-success-bg:            $state-success-bg !default;
+$alert-success-text:          $state-success-text !default;
+$alert-success-border:        $state-success-border !default;
+
+$alert-info-bg:               $state-info-bg !default;
+$alert-info-text:             $state-info-text !default;
+$alert-info-border:           $state-info-border !default;
+
+$alert-warning-bg:            $state-warning-bg !default;
+$alert-warning-text:          $state-warning-text !default;
+$alert-warning-border:        $state-warning-border !default;
+
+$alert-danger-bg:             $state-danger-bg !default;
+$alert-danger-text:           $state-danger-text !default;
+$alert-danger-border:         $state-danger-border !default;
+
+
+//== Progress bars
+//
+//##
+
+//** Background color of the whole progress component
+$progress-bg:                 #f5f5f5 !default;
+//** Progress bar text color
+$progress-bar-color:          #fff !default;
+
+//** Default progress bar color
+$progress-bar-bg:             $brand-primary !default;
+//** Success progress bar color
+$progress-bar-success-bg:     $brand-success !default;
+//** Warning progress bar color
+$progress-bar-warning-bg:     $brand-warning !default;
+//** Danger progress bar color
+$progress-bar-danger-bg:      $brand-danger !default;
+//** Info progress bar color
+$progress-bar-info-bg:        $brand-info !default;
+
+
+//== List group
+//
+//##
+
+//** Background color on `.list-group-item`
+$list-group-bg:                 #fff !default;
+//** `.list-group-item` border color
+$list-group-border:             #ddd !default;
+//** List group border radius
+$list-group-border-radius:      $border-radius-base !default;
+
+//** Background color of single list elements on hover
+$list-group-hover-bg:           #f5f5f5 !default;
+//** Text color of active list elements
+$list-group-active-color:       $component-active-color !default;
+//** Background color of active list elements
+$list-group-active-bg:          $component-active-bg !default;
+//** Border color of active list elements
+$list-group-active-border:      $list-group-active-bg !default;
+$list-group-active-text-color:  lighten($list-group-active-bg, 40%) !default;
+
+$list-group-link-color:         #555 !default;
+$list-group-link-heading-color: #333 !default;
+
+
+//== Panels
+//
+//##
+
+$panel-bg:                    #fff !default;
+$panel-body-padding:          10px !default;
+$panel-border-radius:         0 !default;
+
+//** Border color for elements within panels
+$panel-inner-border:          $gray;
+$panel-footer-bg:             $gray;
+
+$panel-default-text:          inherit;
+$panel-default-border:        $gray-light;
+$panel-default-heading-bg:    $gray-light;
+
+$panel-primary-text:          #fff !default;
+$panel-primary-border:        $brand-primary !default;
+$panel-primary-heading-bg:    $brand-primary !default;
+
+$panel-success-text:          $state-success-text !default;
+$panel-success-border:        $state-success-border !default;
+$panel-success-heading-bg:    $state-success-bg !default;
+
+$panel-info-text:             $state-info-text !default;
+$panel-info-border:           $brand-secondary !default;
+$panel-info-heading-bg:       $brand-primary !default;
+
+$panel-warning-text:          $state-warning-text !default;
+$panel-warning-border:        $state-warning-border !default;
+$panel-warning-heading-bg:    $state-warning-bg !default;
+
+$panel-danger-text:           $state-danger-text !default;
+$panel-danger-border:         $state-danger-border !default;
+$panel-danger-heading-bg:     $state-danger-bg !default;
+
+
+//== Thumbnails
+//
+//##
+
+//** Padding around the thumbnail image
+$thumbnail-padding:           4px !default;
+//** Thumbnail background color
+$thumbnail-bg:                $body-bg !default;
+//** Thumbnail border color
+$thumbnail-border:            #ddd !default;
+//** Thumbnail border radius
+$thumbnail-border-radius:     $border-radius-base !default;
+
+//** Custom text color for thumbnail captions
+$thumbnail-caption-color:     $text-color !default;
+//** Padding around the thumbnail caption
+$thumbnail-caption-padding:   9px !default;
+
+
+//== Wells
+//
+//##
+
+$well-bg:                     #f5f5f5 !default;
+$well-border:                 darken($well-bg, 7%) !default;
+
+
+//== Badges
+//
+//##
+
+$badge-color:                 #fff !default;
+//** Linked badge text color on hover
+$badge-link-hover-color:      #fff !default;
+$badge-bg:                    $gray-light !default;
+
+//** Badge text color in active nav link
+$badge-active-color:          $link-color !default;
+//** Badge background color in active nav link
+$badge-active-bg:             #fff !default;
+
+$badge-font-weight:           bold !default;
+$badge-line-height:           1 !default;
+$badge-border-radius:         10px !default;
+
+
+//== Breadcrumbs
+//
+//##
+
+$breadcrumb-padding-vertical:   14px !default;
+$breadcrumb-padding-horizontal: 15px !default;
+//** Breadcrumb background color
+$breadcrumb-bg:                 transparent !default;
+//** Breadcrumb text color
+$breadcrumb-color:              $gray-darker !default;
+//** Text color of current page in the breadcrumb
+$breadcrumb-active-color:       $gray-darker !default;
+//** Textual separator for between breadcrumb elements
+$breadcrumb-separator:          "" !default; //see http://www.utf8-chartable.de/
+
+
+//== Carousel
+//
+//##
+
+$carousel-text-shadow:                        0 1px 2px rgba(0,0,0,.6) !default;
+
+$carousel-control-color:                      #fff !default;
+$carousel-control-width:                      15% !default;
+$carousel-control-opacity:                    .5 !default;
+$carousel-control-font-size:                  20px !default;
+
+$carousel-indicator-active-bg:                #fff !default;
+$carousel-indicator-border-color:             #fff !default;
+
+$carousel-caption-color:                      #fff !default;
+
+
+//== Close
+//
+//##
+
+$close-font-weight:           bold !default;
+$close-color:                 #000 !default;
+$close-text-shadow:           0 1px 0 #fff !default;
+
+
+//== Code
+//
+//##
+
+$code-color:                  #c7254e !default;
+$code-bg:                     #f9f2f4 !default;
+
+$kbd-color:                   #fff !default;
+$kbd-bg:                      #333 !default;
+
+$pre-bg:                      #f5f5f5 !default;
+$pre-color:                   $gray-dark !default;
+$pre-border-color:            #ccc !default;
+$pre-scrollable-max-height:   340px !default;
+
+
+//== Type
+//
+//##
+
+//** Text muted color
+$text-muted:                  $gray-light !default;
+//** Abbreviations and acronyms border color
+$abbr-border-color:           $gray-light !default;
+//** Headings small color
+$headings-small-color:        $gray-light !default;
+//** Blockquote small color
+$blockquote-small-color:      $gray-light !default;
+//** Blockquote font size
+$blockquote-font-size:        ($font-size-base * 1.25) !default;
+//** Blockquote border color
+$blockquote-border-color:     $gray-lighter !default;
+//** Page header border color
+$page-header-border-color:    $gray-lighter !default;
+
+
+//== Miscellaneous
+//
+//##
+
+//** Horizontal line color.
+$hr-border:                   $gray-light !default;
+
+//** Horizontal offset for forms and lists.
+$component-offset-horizontal: 180px !default;
+
+/* spriting */
+
+//## RPP
+
+$shopping-cart-content-border-color: #cccccc;
\ No newline at end of file
diff --git a/full-angularjs/app/styles/base.scss b/full-angularjs/app/styles/base.scss
new file mode 100644
index 0000000..4090d76
--- /dev/null
+++ b/full-angularjs/app/styles/base.scss
@@ -0,0 +1,41 @@
+@charset "utf-8";
+
+@import "variables";
+
+//ISAAC mixins
+@import "mixins/isaac-responsive";
+@import "mixins/isaac-caret";
+@import "mixins/isaac-ie8fixes";
+
+//Compass mixins
+//@import "compass/css3/box-shadow";
+//@import "compass/typography/lists/horizontal-list";
+//@import "compass/typography/links/hover-link";
+//@import "compass/typography/links/link-colors";
+//@import "compass/typography/text/replacement";
+
+//combine all stylesheets and generate output
+@import "bootstrap";
+@import "grid";
+@import "header";
+@import "footer";
+//@import "breadcrumb";
+//@import "type";
+//@import "labels";
+@import "tables";
+//@import "navs";
+//@import "dropdowns";
+@import "modals";
+@import "panels";
+@import "icons";
+@import "buttons"; // please note that we have edited the default bootstrap button scss!
+//@import "button-groups";
+@import "forms";
+//@import "input-groups";
+@import "popovers";
+@import "alerts";
+//@import "jumbotron";
+
+@import "sticky-footer";
+@import "hpp";
+@import "cobrand";
\ No newline at end of file
diff --git a/full-angularjs/app/styles/mixins/_isaac-caret.scss b/full-angularjs/app/styles/mixins/_isaac-caret.scss
new file mode 100644
index 0000000..38e6aff
--- /dev/null
+++ b/full-angularjs/app/styles/mixins/_isaac-caret.scss
@@ -0,0 +1,32 @@
+@mixin caret($size:4px, $color:#000, $direction:top) {
+  width:0;
+  height:0;
+  content:'';
+  position:absolute;
+  display:inline-block;
+  
+  
+  @if $direction == bottom {
+    border-top:     $size solid $color;
+    border-right:   $size solid transparent;
+    border-left:    $size solid transparent;
+  }
+  
+  @if $direction == left {
+    border-right:   $size solid $color;
+    border-top:     $size solid transparent;
+    border-bottom:  $size solid transparent;
+  }
+  
+  @if $direction == right {
+    border-left:    $size solid $color;
+    border-top:     $size solid transparent;
+    border-bottom:  $size solid transparent;
+  }
+  
+  @if $direction == top {
+    border-bottom:  $size solid $color;
+    border-left:    $size solid transparent;
+    border-right:   $size solid transparent;
+  }
+}
\ No newline at end of file
diff --git a/full-angularjs/app/styles/mixins/_isaac-ie8fixes.scss b/full-angularjs/app/styles/mixins/_isaac-ie8fixes.scss
new file mode 100644
index 0000000..5a4c243
--- /dev/null
+++ b/full-angularjs/app/styles/mixins/_isaac-ie8fixes.scss
@@ -0,0 +1,7 @@
+@mixin isaac-ie8-bg-contain($img) {
+
+	.ie8 & {
+		background: url(#); //bugfix for IE8: transparent parts in the image are not clickable if the bg is set in a link, see http://haslayout.net/css/No-Transparency-Click-Bug
+        filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='#{$img}',sizingMethod='scale');
+	}
+}
\ No newline at end of file
diff --git a/full-angularjs/app/styles/mixins/_isaac-responsive.scss b/full-angularjs/app/styles/mixins/_isaac-responsive.scss
new file mode 100644
index 0000000..4bb7f66
--- /dev/null
+++ b/full-angularjs/app/styles/mixins/_isaac-responsive.scss
@@ -0,0 +1,47 @@
+// ISAAC Responsive Mixins
+// based on implementation from Gumby CSS and Bootstrap
+
+@mixin isaac-respond-min-width($media) {
+  @if $media == xs {
+    //select xs devices and up
+    @media only screen and (min-width: $screen-xs-min) { @content; }
+  }
+
+  @if $media == sm {
+    //select sm devices and up
+    @media only screen and (min-width: $screen-sm-min) { @content; }
+  }
+  
+  @if $media == md {
+    //select md devices and up
+    @media only screen and (min-width: $screen-md-min) { @content; }
+  }
+
+  @if $media == lg {
+    //select lg devices and up
+    @media only screen and (min-width: $screen-lg-min) { @content; }
+  }  
+}
+
+
+@mixin isaac-respond-max-width($media) {
+  @if $media == xs {
+    //select xs devices and up
+    @media only screen and (max-width: $screen-xs-max) { @content; }
+  }
+
+  @if $media == sm {
+    //select sm devices and up
+    @media only screen and (max-width: $screen-sm-max) { @content; }
+  }
+  
+  @if $media == md {
+    //select md devices and up
+    @media only screen and (max-width: $screen-md-max) { @content; }
+  }
+
+  @if $media == lg {
+    //select lg devices and up
+    @media only screen and (max-width: $screen-lg-max) { @content; }
+  }  
+}
\ No newline at end of file
diff --git a/full-angularjs/fonts/icons/icons.eot b/full-angularjs/fonts/icons/icons.eot
new file mode 100644
index 0000000000000000000000000000000000000000..31decc27edfb8322203a8dae43166149f4d1f9ec
GIT binary patch
literal 3096
zcma)8%Ws@l6+h?R?>@f!z2-d=$8~2sex!Ch9*FdeezY+pLb_qs#)RHJE`QBmO?AA}2_KLOp?+kNYRO7sP2*iiG*>
zm4p4;cMvBa`i_^A6vT(5Alv5G!FhGGeo3du@Axz@!afOoqE9s+KgJ&)!yDW@rQm7G
zKb+sOf_=TTLIIt_>c~Qd?Wy^xe*B-ukHI70l;iyPuM@$@A{XGr#L&X=#|-a#^L$SJ
z|GXv~9rOFNMl{;?*hH?xn({(zH5qewEJ!O1LzU
zCJF)*q%SQky_5n8A|sO|Vt|(E=J^HY-}1uw&6Mx5i(FKhEM(QH)@PSzXP3`vU9Dz?
z$qEFHMXkNmXe_mBIEFxa75E|IIz!(?WNRIPSVXllC02Wga7y}R9qjonx!zja0(%N#
zMA(tJ<|Klyr@%X6ogcQ&Z7(ivpKJLwIn}5~K^Quf)JslCC3UFf;O^vde|EONJShSl
zNTaPx8bv3Bu%&XvdBO46gI{waC50>16YWA9MD@n0#H)Efu2L>p7J^-|kw~kJgj3-q
z{<}?($IMmZsTspzn2-u+T4;)eiwM7cabk}t%uK1AN@oH$MoMN
z6_rI!#oT;HY-~<%bT?LdYg;_B_Fr@488_0No|~R)&(AHe_Lr4g=RPXBrmLo|r^ML3
ztoNq4hm;tGBGy*
ztp&##l}g;Zl%WY_;q>Wx9F~zwS}E8BQVJDlmI6Lhm_{bBLU;*F7ObR#C=j4zAVQa#
zuvn`m!YCs=U#5Ywh|el3vc^OeTU#d-;($MV5x59gxiodQTCO30$mt*oopgm_VpVKI
zfxvi);SFX=$Y6LFqyh(Fl7(TlemXT-mYEl&wP9ehG&3em5*=5HF(Shz9)JXKR&uUZ
zZ^UtAc|tG
zlO!=nR8(JL(lpU&qh1NaEP(++&kgV$L=eD%6nRUKw1c`jLR|$kNt;CFYHPjqBDXg?
za(!Gy$R&xac!5{PtQ~MeZ;MehDqKuX*jI@rd;s7DI=Hf)u)mfulZe+R}ojTiO
z`uy{so;f3w4V8hO*H_Lc!3*W)nQFfu*Go}Us>l6)^-Qyjh=#rB0oGYsAas3hSKI6P
zh>xg2^Rz)1sZXyUmezA(P%X5b7r2#Q6f`>G
zWp4R4)Sg{M=ofkX;)jDBhy1ch(ecq38|?6rM7J6A(H|rq4R$=m4?HzEXg2%#kB>}(
zh>yos+;pYHG`&){o15nbhld{D>F0nm2*UqRKE${FCEdrDe$q|G%_HxZqvnDBlZq7(
zSbRU2o6Z}CKiHE7lsBWi>vo_qZXENvBhXvc%Q&~kbDJqyJrGJOXLnIjz(e2sziRG$0NN97x>eNh8YyfBo~phy%th!6ql-&Zu;1W-!@xvQsL;wR0trzVA=;Rf*qRZ)Frl*=6_pzp)OZqyCNbC)
z?Zw}KR)fz>!5L=b3MNcrh*X@0_=Nahk;7-*+28#z`^uLT4d=e!Kf2%Zg7J!M{TQU5
zAcg=tKZp1v@PPNoQ%?F9rpPDYh0tl@>EfBdvooSSA9)0Dm{q3e$Mh#r6IaE%GM0~W
zuMzztubJ^?x$^&BDZMw^n=x9B;}F1K9q}dbnGqfUzdXVf2G4YaYckXu;SRIP6+a6F
zAvoUW5Fh#+;zOT9eCTtC4}A`C4cqf0+o8{s!|d~i-V-`+T-o2--@o
+
+
+Generated by IcoMoon
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/full-angularjs/fonts/icons/icons.ttf b/full-angularjs/fonts/icons/icons.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..0e0a402a5eb78cf5c4518843980b7553e6b95a1c
GIT binary patch
literal 2932
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℞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
+    
+    
+    
+    
+
+
+    
+
+    
+    
+    
+    
+
+
+    
+    
+    
+    
+    
+
+
+
\ No newline at end of file
diff --git a/full-angularjs/package.json b/full-angularjs/package.json
new file mode 100644
index 0000000..2805e38
--- /dev/null
+++ b/full-angularjs/package.json
@@ -0,0 +1,30 @@
+{
+  "name": "connect-sdk-client-js-example-angularjs",
+  "version": "1.14.0",
+  "description": "",
+  "private": true,
+  "main": "index.html",
+  "scripts": {
+    "start": "concurrent \"npm run watch\" \"npm run browsersync\" ",
+    "build:sass": "node-sass -o ./ --include-path node_modules/bootstrap-sass/assets/stylesheets/  app/",
+    "postinstall": "npm run build:sass",
+    "browsersync": "browser-sync --server --port 3000 --watch --files='./**/*.{html,htm,css,js}' --ignore 'node_modules'",
+    "watch:sass": "npm run build:sass && node-sass -o ./ -w app/ --include-path node_modules/bootstrap-sass/assets/stylesheets/",
+    "watch": "npm run watch:sass"
+  },
+  "author": "",
+  "license": "ISC",
+  "dependencies": {
+    "angular": "^1.7.9",
+    "angular-route": "^1.7.8",
+    "angular-ui-bootstrap": "^2.5.0",
+    "angular-ui-mask": "^1.8.6",
+    "bootstrap-sass": "3.4.1",
+    "connect-sdk-client-js": "^4.0.1"
+  },
+  "devDependencies": {
+    "browser-sync": "^2.27.11",
+    "concurrently": "^2.2.0",
+    "node-sass": "^4.14.1"
+  }
+}
diff --git a/full-angularjs/styles/base.css b/full-angularjs/styles/base.css
new file mode 100644
index 0000000..979f544
--- /dev/null
+++ b/full-angularjs/styles/base.css
@@ -0,0 +1,4168 @@
+/* spriting */
+/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */
+html {
+  font-family: sans-serif;
+  -ms-text-size-adjust: 100%;
+  -webkit-text-size-adjust: 100%; }
+
+body {
+  margin: 0; }
+
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+main,
+menu,
+nav,
+section,
+summary {
+  display: block; }
+
+audio,
+canvas,
+progress,
+video {
+  display: inline-block;
+  vertical-align: baseline; }
+
+audio:not([controls]) {
+  display: none;
+  height: 0; }
+
+[hidden],
+template {
+  display: none; }
+
+a {
+  background-color: transparent; }
+
+a:active,
+a:hover {
+  outline: 0; }
+
+abbr[title] {
+  border-bottom: none;
+  text-decoration: underline;
+  text-decoration: underline dotted; }
+
+b,
+strong {
+  font-weight: bold; }
+
+dfn {
+  font-style: italic; }
+
+h1 {
+  font-size: 2em;
+  margin: 0.67em 0; }
+
+mark {
+  background: #ff0;
+  color: #000; }
+
+small {
+  font-size: 80%; }
+
+sub,
+sup {
+  font-size: 75%;
+  line-height: 0;
+  position: relative;
+  vertical-align: baseline; }
+
+sup {
+  top: -0.5em; }
+
+sub {
+  bottom: -0.25em; }
+
+img {
+  border: 0; }
+
+svg:not(:root) {
+  overflow: hidden; }
+
+figure {
+  margin: 1em 40px; }
+
+hr {
+  box-sizing: content-box;
+  height: 0; }
+
+pre {
+  overflow: auto; }
+
+code,
+kbd,
+pre,
+samp {
+  font-family: monospace, monospace;
+  font-size: 1em; }
+
+button,
+input,
+optgroup,
+select,
+textarea {
+  color: inherit;
+  font: inherit;
+  margin: 0; }
+
+button {
+  overflow: visible; }
+
+button,
+select {
+  text-transform: none; }
+
+button,
+html input[type="button"],
+input[type="reset"],
+input[type="submit"] {
+  -webkit-appearance: button;
+  cursor: pointer; }
+
+button[disabled],
+html input[disabled] {
+  cursor: default; }
+
+button::-moz-focus-inner,
+input::-moz-focus-inner {
+  border: 0;
+  padding: 0; }
+
+input {
+  line-height: normal; }
+
+input[type="checkbox"],
+input[type="radio"] {
+  box-sizing: border-box;
+  padding: 0; }
+
+input[type="number"]::-webkit-inner-spin-button,
+input[type="number"]::-webkit-outer-spin-button {
+  height: auto; }
+
+input[type="search"] {
+  -webkit-appearance: textfield;
+  box-sizing: content-box; }
+
+input[type="search"]::-webkit-search-cancel-button,
+input[type="search"]::-webkit-search-decoration {
+  -webkit-appearance: none; }
+
+fieldset {
+  border: 1px solid #c0c0c0;
+  margin: 0 2px;
+  padding: 0.35em 0.625em 0.75em; }
+
+legend {
+  border: 0;
+  padding: 0; }
+
+textarea {
+  overflow: auto; }
+
+optgroup {
+  font-weight: bold; }
+
+table {
+  border-collapse: collapse;
+  border-spacing: 0; }
+
+td,
+th {
+  padding: 0; }
+
+/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */
+@media print {
+  *,
+  *:before,
+  *:after {
+    color: #000 !important;
+    text-shadow: none !important;
+    background: transparent !important;
+    box-shadow: none !important; }
+  a,
+  a:visited {
+    text-decoration: underline; }
+  a[href]:after {
+    content: " (" attr(href) ")"; }
+  abbr[title]:after {
+    content: " (" attr(title) ")"; }
+  a[href^="#"]:after,
+  a[href^="javascript:"]:after {
+    content: ""; }
+  pre,
+  blockquote {
+    border: 1px solid #999;
+    page-break-inside: avoid; }
+  thead {
+    display: table-header-group; }
+  tr,
+  img {
+    page-break-inside: avoid; }
+  img {
+    max-width: 100% !important; }
+  p,
+  h2,
+  h3 {
+    orphans: 3;
+    widows: 3; }
+  h2,
+  h3 {
+    page-break-after: avoid; }
+  .navbar {
+    display: none; }
+  .btn > .caret,
+  .dropup > .btn > .caret {
+    border-top-color: #000 !important; }
+  .label {
+    border: 1px solid #000; }
+  .table {
+    border-collapse: collapse !important; }
+    .table td,
+    .table th {
+      background-color: #fff !important; }
+  .table-bordered th,
+  .table-bordered td {
+    border: 1px solid #ddd !important; } }
+
+* {
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box; }
+
+*:before,
+*:after {
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box; }
+
+html {
+  font-size: 10px;
+  -webkit-tap-highlight-color: rgba(0, 0, 0, 0); }
+
+body {
+  font-family: Arial, "Helvetica Neue", Helvetica, sans-serif;
+  font-size: 15px;
+  line-height: 1.5;
+  color: #000;
+  background-color: #f2f2f2; }
+
+input,
+button,
+select,
+textarea {
+  font-family: inherit;
+  font-size: inherit;
+  line-height: inherit; }
+
+a {
+  color: #000;
+  text-decoration: none; }
+  a:hover, a:focus {
+    color: #262626;
+    text-decoration: underline; }
+  a:focus {
+    outline: 5px auto -webkit-focus-ring-color;
+    outline-offset: -2px; }
+
+figure {
+  margin: 0; }
+
+img {
+  vertical-align: middle; }
+
+.img-responsive {
+  display: block;
+  max-width: 100%;
+  height: auto; }
+
+.img-rounded {
+  border-radius: 0; }
+
+.img-thumbnail {
+  padding: 4px;
+  line-height: 1.5;
+  background-color: #f2f2f2;
+  border: 1px solid #ddd;
+  border-radius: 0;
+  -webkit-transition: all 0.2s ease-in-out;
+  -o-transition: all 0.2s ease-in-out;
+  transition: all 0.2s ease-in-out;
+  display: inline-block;
+  max-width: 100%;
+  height: auto; }
+
+.img-circle {
+  border-radius: 50%; }
+
+hr {
+  margin-top: 22px;
+  margin-bottom: 22px;
+  border: 0;
+  border-top: 1px solid #e1e1e1; }
+
+.sr-only {
+  position: absolute;
+  width: 1px;
+  height: 1px;
+  padding: 0;
+  margin: -1px;
+  overflow: hidden;
+  clip: rect(0, 0, 0, 0);
+  border: 0; }
+
+.sr-only-focusable:active, .sr-only-focusable:focus {
+  position: static;
+  width: auto;
+  height: auto;
+  margin: 0;
+  overflow: visible;
+  clip: auto; }
+
+[role="button"] {
+  cursor: pointer; }
+
+.container {
+  padding-right: 10px;
+  padding-left: 10px;
+  margin-right: auto;
+  margin-left: auto; }
+  .container:before, .container:after {
+    display: table;
+    content: " "; }
+  .container:after {
+    clear: both; }
+  @media (min-width: 768px) {
+    .container {
+      width: 100%; } }
+  @media (min-width: 992px) {
+    .container {
+      width: 970px; } }
+  @media (min-width: 1200px) {
+    .container {
+      width: 970px; } }
+
+.container-fluid {
+  padding-right: 10px;
+  padding-left: 10px;
+  margin-right: auto;
+  margin-left: auto; }
+  .container-fluid:before, .container-fluid:after {
+    display: table;
+    content: " "; }
+  .container-fluid:after {
+    clear: both; }
+
+.row {
+  margin-right: -10px;
+  margin-left: -10px; }
+  .row:before, .row:after {
+    display: table;
+    content: " "; }
+  .row:after {
+    clear: both; }
+
+.row-no-gutters {
+  margin-right: 0;
+  margin-left: 0; }
+  .row-no-gutters [class*="col-"] {
+    padding-right: 0;
+    padding-left: 0; }
+
+.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12, .col-xs-13, .col-sm-13, .col-md-13, .col-lg-13, .col-xs-14, .col-sm-14, .col-md-14, .col-lg-14, .col-xs-15, .col-sm-15, .col-md-15, .col-lg-15, .col-xs-16, .col-sm-16, .col-md-16, .col-lg-16, .col-xs-17, .col-sm-17, .col-md-17, .col-lg-17, .col-xs-18, .col-sm-18, .col-md-18, .col-lg-18, .col-xs-19, .col-sm-19, .col-md-19, .col-lg-19, .col-xs-20, .col-sm-20, .col-md-20, .col-lg-20, .col-xs-21, .col-sm-21, .col-md-21, .col-lg-21, .col-xs-22, .col-sm-22, .col-md-22, .col-lg-22, .col-xs-23, .col-sm-23, .col-md-23, .col-lg-23, .col-xs-24, .col-sm-24, .col-md-24, .col-lg-24 {
+  position: relative;
+  min-height: 1px;
+  padding-right: 10px;
+  padding-left: 10px; }
+
+.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12, .col-xs-13, .col-xs-14, .col-xs-15, .col-xs-16, .col-xs-17, .col-xs-18, .col-xs-19, .col-xs-20, .col-xs-21, .col-xs-22, .col-xs-23, .col-xs-24 {
+  float: left; }
+
+.col-xs-1 {
+  width: 4.16667%; }
+
+.col-xs-2 {
+  width: 8.33333%; }
+
+.col-xs-3 {
+  width: 12.5%; }
+
+.col-xs-4 {
+  width: 16.66667%; }
+
+.col-xs-5 {
+  width: 20.83333%; }
+
+.col-xs-6 {
+  width: 25%; }
+
+.col-xs-7 {
+  width: 29.16667%; }
+
+.col-xs-8 {
+  width: 33.33333%; }
+
+.col-xs-9 {
+  width: 37.5%; }
+
+.col-xs-10 {
+  width: 41.66667%; }
+
+.col-xs-11 {
+  width: 45.83333%; }
+
+.col-xs-12 {
+  width: 50%; }
+
+.col-xs-13 {
+  width: 54.16667%; }
+
+.col-xs-14 {
+  width: 58.33333%; }
+
+.col-xs-15 {
+  width: 62.5%; }
+
+.col-xs-16 {
+  width: 66.66667%; }
+
+.col-xs-17 {
+  width: 70.83333%; }
+
+.col-xs-18 {
+  width: 75%; }
+
+.col-xs-19 {
+  width: 79.16667%; }
+
+.col-xs-20 {
+  width: 83.33333%; }
+
+.col-xs-21 {
+  width: 87.5%; }
+
+.col-xs-22 {
+  width: 91.66667%; }
+
+.col-xs-23 {
+  width: 95.83333%; }
+
+.col-xs-24 {
+  width: 100%; }
+
+.col-xs-pull-0 {
+  right: auto; }
+
+.col-xs-pull-1 {
+  right: 4.16667%; }
+
+.col-xs-pull-2 {
+  right: 8.33333%; }
+
+.col-xs-pull-3 {
+  right: 12.5%; }
+
+.col-xs-pull-4 {
+  right: 16.66667%; }
+
+.col-xs-pull-5 {
+  right: 20.83333%; }
+
+.col-xs-pull-6 {
+  right: 25%; }
+
+.col-xs-pull-7 {
+  right: 29.16667%; }
+
+.col-xs-pull-8 {
+  right: 33.33333%; }
+
+.col-xs-pull-9 {
+  right: 37.5%; }
+
+.col-xs-pull-10 {
+  right: 41.66667%; }
+
+.col-xs-pull-11 {
+  right: 45.83333%; }
+
+.col-xs-pull-12 {
+  right: 50%; }
+
+.col-xs-pull-13 {
+  right: 54.16667%; }
+
+.col-xs-pull-14 {
+  right: 58.33333%; }
+
+.col-xs-pull-15 {
+  right: 62.5%; }
+
+.col-xs-pull-16 {
+  right: 66.66667%; }
+
+.col-xs-pull-17 {
+  right: 70.83333%; }
+
+.col-xs-pull-18 {
+  right: 75%; }
+
+.col-xs-pull-19 {
+  right: 79.16667%; }
+
+.col-xs-pull-20 {
+  right: 83.33333%; }
+
+.col-xs-pull-21 {
+  right: 87.5%; }
+
+.col-xs-pull-22 {
+  right: 91.66667%; }
+
+.col-xs-pull-23 {
+  right: 95.83333%; }
+
+.col-xs-pull-24 {
+  right: 100%; }
+
+.col-xs-push-0 {
+  left: auto; }
+
+.col-xs-push-1 {
+  left: 4.16667%; }
+
+.col-xs-push-2 {
+  left: 8.33333%; }
+
+.col-xs-push-3 {
+  left: 12.5%; }
+
+.col-xs-push-4 {
+  left: 16.66667%; }
+
+.col-xs-push-5 {
+  left: 20.83333%; }
+
+.col-xs-push-6 {
+  left: 25%; }
+
+.col-xs-push-7 {
+  left: 29.16667%; }
+
+.col-xs-push-8 {
+  left: 33.33333%; }
+
+.col-xs-push-9 {
+  left: 37.5%; }
+
+.col-xs-push-10 {
+  left: 41.66667%; }
+
+.col-xs-push-11 {
+  left: 45.83333%; }
+
+.col-xs-push-12 {
+  left: 50%; }
+
+.col-xs-push-13 {
+  left: 54.16667%; }
+
+.col-xs-push-14 {
+  left: 58.33333%; }
+
+.col-xs-push-15 {
+  left: 62.5%; }
+
+.col-xs-push-16 {
+  left: 66.66667%; }
+
+.col-xs-push-17 {
+  left: 70.83333%; }
+
+.col-xs-push-18 {
+  left: 75%; }
+
+.col-xs-push-19 {
+  left: 79.16667%; }
+
+.col-xs-push-20 {
+  left: 83.33333%; }
+
+.col-xs-push-21 {
+  left: 87.5%; }
+
+.col-xs-push-22 {
+  left: 91.66667%; }
+
+.col-xs-push-23 {
+  left: 95.83333%; }
+
+.col-xs-push-24 {
+  left: 100%; }
+
+.col-xs-offset-0 {
+  margin-left: 0%; }
+
+.col-xs-offset-1 {
+  margin-left: 4.16667%; }
+
+.col-xs-offset-2 {
+  margin-left: 8.33333%; }
+
+.col-xs-offset-3 {
+  margin-left: 12.5%; }
+
+.col-xs-offset-4 {
+  margin-left: 16.66667%; }
+
+.col-xs-offset-5 {
+  margin-left: 20.83333%; }
+
+.col-xs-offset-6 {
+  margin-left: 25%; }
+
+.col-xs-offset-7 {
+  margin-left: 29.16667%; }
+
+.col-xs-offset-8 {
+  margin-left: 33.33333%; }
+
+.col-xs-offset-9 {
+  margin-left: 37.5%; }
+
+.col-xs-offset-10 {
+  margin-left: 41.66667%; }
+
+.col-xs-offset-11 {
+  margin-left: 45.83333%; }
+
+.col-xs-offset-12 {
+  margin-left: 50%; }
+
+.col-xs-offset-13 {
+  margin-left: 54.16667%; }
+
+.col-xs-offset-14 {
+  margin-left: 58.33333%; }
+
+.col-xs-offset-15 {
+  margin-left: 62.5%; }
+
+.col-xs-offset-16 {
+  margin-left: 66.66667%; }
+
+.col-xs-offset-17 {
+  margin-left: 70.83333%; }
+
+.col-xs-offset-18 {
+  margin-left: 75%; }
+
+.col-xs-offset-19 {
+  margin-left: 79.16667%; }
+
+.col-xs-offset-20 {
+  margin-left: 83.33333%; }
+
+.col-xs-offset-21 {
+  margin-left: 87.5%; }
+
+.col-xs-offset-22 {
+  margin-left: 91.66667%; }
+
+.col-xs-offset-23 {
+  margin-left: 95.83333%; }
+
+.col-xs-offset-24 {
+  margin-left: 100%; }
+
+@media (min-width: 768px) {
+  .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm-13, .col-sm-14, .col-sm-15, .col-sm-16, .col-sm-17, .col-sm-18, .col-sm-19, .col-sm-20, .col-sm-21, .col-sm-22, .col-sm-23, .col-sm-24 {
+    float: left; }
+  .col-sm-1 {
+    width: 4.16667%; }
+  .col-sm-2 {
+    width: 8.33333%; }
+  .col-sm-3 {
+    width: 12.5%; }
+  .col-sm-4 {
+    width: 16.66667%; }
+  .col-sm-5 {
+    width: 20.83333%; }
+  .col-sm-6 {
+    width: 25%; }
+  .col-sm-7 {
+    width: 29.16667%; }
+  .col-sm-8 {
+    width: 33.33333%; }
+  .col-sm-9 {
+    width: 37.5%; }
+  .col-sm-10 {
+    width: 41.66667%; }
+  .col-sm-11 {
+    width: 45.83333%; }
+  .col-sm-12 {
+    width: 50%; }
+  .col-sm-13 {
+    width: 54.16667%; }
+  .col-sm-14 {
+    width: 58.33333%; }
+  .col-sm-15 {
+    width: 62.5%; }
+  .col-sm-16 {
+    width: 66.66667%; }
+  .col-sm-17 {
+    width: 70.83333%; }
+  .col-sm-18 {
+    width: 75%; }
+  .col-sm-19 {
+    width: 79.16667%; }
+  .col-sm-20 {
+    width: 83.33333%; }
+  .col-sm-21 {
+    width: 87.5%; }
+  .col-sm-22 {
+    width: 91.66667%; }
+  .col-sm-23 {
+    width: 95.83333%; }
+  .col-sm-24 {
+    width: 100%; }
+  .col-sm-pull-0 {
+    right: auto; }
+  .col-sm-pull-1 {
+    right: 4.16667%; }
+  .col-sm-pull-2 {
+    right: 8.33333%; }
+  .col-sm-pull-3 {
+    right: 12.5%; }
+  .col-sm-pull-4 {
+    right: 16.66667%; }
+  .col-sm-pull-5 {
+    right: 20.83333%; }
+  .col-sm-pull-6 {
+    right: 25%; }
+  .col-sm-pull-7 {
+    right: 29.16667%; }
+  .col-sm-pull-8 {
+    right: 33.33333%; }
+  .col-sm-pull-9 {
+    right: 37.5%; }
+  .col-sm-pull-10 {
+    right: 41.66667%; }
+  .col-sm-pull-11 {
+    right: 45.83333%; }
+  .col-sm-pull-12 {
+    right: 50%; }
+  .col-sm-pull-13 {
+    right: 54.16667%; }
+  .col-sm-pull-14 {
+    right: 58.33333%; }
+  .col-sm-pull-15 {
+    right: 62.5%; }
+  .col-sm-pull-16 {
+    right: 66.66667%; }
+  .col-sm-pull-17 {
+    right: 70.83333%; }
+  .col-sm-pull-18 {
+    right: 75%; }
+  .col-sm-pull-19 {
+    right: 79.16667%; }
+  .col-sm-pull-20 {
+    right: 83.33333%; }
+  .col-sm-pull-21 {
+    right: 87.5%; }
+  .col-sm-pull-22 {
+    right: 91.66667%; }
+  .col-sm-pull-23 {
+    right: 95.83333%; }
+  .col-sm-pull-24 {
+    right: 100%; }
+  .col-sm-push-0 {
+    left: auto; }
+  .col-sm-push-1 {
+    left: 4.16667%; }
+  .col-sm-push-2 {
+    left: 8.33333%; }
+  .col-sm-push-3 {
+    left: 12.5%; }
+  .col-sm-push-4 {
+    left: 16.66667%; }
+  .col-sm-push-5 {
+    left: 20.83333%; }
+  .col-sm-push-6 {
+    left: 25%; }
+  .col-sm-push-7 {
+    left: 29.16667%; }
+  .col-sm-push-8 {
+    left: 33.33333%; }
+  .col-sm-push-9 {
+    left: 37.5%; }
+  .col-sm-push-10 {
+    left: 41.66667%; }
+  .col-sm-push-11 {
+    left: 45.83333%; }
+  .col-sm-push-12 {
+    left: 50%; }
+  .col-sm-push-13 {
+    left: 54.16667%; }
+  .col-sm-push-14 {
+    left: 58.33333%; }
+  .col-sm-push-15 {
+    left: 62.5%; }
+  .col-sm-push-16 {
+    left: 66.66667%; }
+  .col-sm-push-17 {
+    left: 70.83333%; }
+  .col-sm-push-18 {
+    left: 75%; }
+  .col-sm-push-19 {
+    left: 79.16667%; }
+  .col-sm-push-20 {
+    left: 83.33333%; }
+  .col-sm-push-21 {
+    left: 87.5%; }
+  .col-sm-push-22 {
+    left: 91.66667%; }
+  .col-sm-push-23 {
+    left: 95.83333%; }
+  .col-sm-push-24 {
+    left: 100%; }
+  .col-sm-offset-0 {
+    margin-left: 0%; }
+  .col-sm-offset-1 {
+    margin-left: 4.16667%; }
+  .col-sm-offset-2 {
+    margin-left: 8.33333%; }
+  .col-sm-offset-3 {
+    margin-left: 12.5%; }
+  .col-sm-offset-4 {
+    margin-left: 16.66667%; }
+  .col-sm-offset-5 {
+    margin-left: 20.83333%; }
+  .col-sm-offset-6 {
+    margin-left: 25%; }
+  .col-sm-offset-7 {
+    margin-left: 29.16667%; }
+  .col-sm-offset-8 {
+    margin-left: 33.33333%; }
+  .col-sm-offset-9 {
+    margin-left: 37.5%; }
+  .col-sm-offset-10 {
+    margin-left: 41.66667%; }
+  .col-sm-offset-11 {
+    margin-left: 45.83333%; }
+  .col-sm-offset-12 {
+    margin-left: 50%; }
+  .col-sm-offset-13 {
+    margin-left: 54.16667%; }
+  .col-sm-offset-14 {
+    margin-left: 58.33333%; }
+  .col-sm-offset-15 {
+    margin-left: 62.5%; }
+  .col-sm-offset-16 {
+    margin-left: 66.66667%; }
+  .col-sm-offset-17 {
+    margin-left: 70.83333%; }
+  .col-sm-offset-18 {
+    margin-left: 75%; }
+  .col-sm-offset-19 {
+    margin-left: 79.16667%; }
+  .col-sm-offset-20 {
+    margin-left: 83.33333%; }
+  .col-sm-offset-21 {
+    margin-left: 87.5%; }
+  .col-sm-offset-22 {
+    margin-left: 91.66667%; }
+  .col-sm-offset-23 {
+    margin-left: 95.83333%; }
+  .col-sm-offset-24 {
+    margin-left: 100%; } }
+
+@media (min-width: 992px) {
+  .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md-13, .col-md-14, .col-md-15, .col-md-16, .col-md-17, .col-md-18, .col-md-19, .col-md-20, .col-md-21, .col-md-22, .col-md-23, .col-md-24 {
+    float: left; }
+  .col-md-1 {
+    width: 4.16667%; }
+  .col-md-2 {
+    width: 8.33333%; }
+  .col-md-3 {
+    width: 12.5%; }
+  .col-md-4 {
+    width: 16.66667%; }
+  .col-md-5 {
+    width: 20.83333%; }
+  .col-md-6 {
+    width: 25%; }
+  .col-md-7 {
+    width: 29.16667%; }
+  .col-md-8 {
+    width: 33.33333%; }
+  .col-md-9 {
+    width: 37.5%; }
+  .col-md-10 {
+    width: 41.66667%; }
+  .col-md-11 {
+    width: 45.83333%; }
+  .col-md-12 {
+    width: 50%; }
+  .col-md-13 {
+    width: 54.16667%; }
+  .col-md-14 {
+    width: 58.33333%; }
+  .col-md-15 {
+    width: 62.5%; }
+  .col-md-16 {
+    width: 66.66667%; }
+  .col-md-17 {
+    width: 70.83333%; }
+  .col-md-18 {
+    width: 75%; }
+  .col-md-19 {
+    width: 79.16667%; }
+  .col-md-20 {
+    width: 83.33333%; }
+  .col-md-21 {
+    width: 87.5%; }
+  .col-md-22 {
+    width: 91.66667%; }
+  .col-md-23 {
+    width: 95.83333%; }
+  .col-md-24 {
+    width: 100%; }
+  .col-md-pull-0 {
+    right: auto; }
+  .col-md-pull-1 {
+    right: 4.16667%; }
+  .col-md-pull-2 {
+    right: 8.33333%; }
+  .col-md-pull-3 {
+    right: 12.5%; }
+  .col-md-pull-4 {
+    right: 16.66667%; }
+  .col-md-pull-5 {
+    right: 20.83333%; }
+  .col-md-pull-6 {
+    right: 25%; }
+  .col-md-pull-7 {
+    right: 29.16667%; }
+  .col-md-pull-8 {
+    right: 33.33333%; }
+  .col-md-pull-9 {
+    right: 37.5%; }
+  .col-md-pull-10 {
+    right: 41.66667%; }
+  .col-md-pull-11 {
+    right: 45.83333%; }
+  .col-md-pull-12 {
+    right: 50%; }
+  .col-md-pull-13 {
+    right: 54.16667%; }
+  .col-md-pull-14 {
+    right: 58.33333%; }
+  .col-md-pull-15 {
+    right: 62.5%; }
+  .col-md-pull-16 {
+    right: 66.66667%; }
+  .col-md-pull-17 {
+    right: 70.83333%; }
+  .col-md-pull-18 {
+    right: 75%; }
+  .col-md-pull-19 {
+    right: 79.16667%; }
+  .col-md-pull-20 {
+    right: 83.33333%; }
+  .col-md-pull-21 {
+    right: 87.5%; }
+  .col-md-pull-22 {
+    right: 91.66667%; }
+  .col-md-pull-23 {
+    right: 95.83333%; }
+  .col-md-pull-24 {
+    right: 100%; }
+  .col-md-push-0 {
+    left: auto; }
+  .col-md-push-1 {
+    left: 4.16667%; }
+  .col-md-push-2 {
+    left: 8.33333%; }
+  .col-md-push-3 {
+    left: 12.5%; }
+  .col-md-push-4 {
+    left: 16.66667%; }
+  .col-md-push-5 {
+    left: 20.83333%; }
+  .col-md-push-6 {
+    left: 25%; }
+  .col-md-push-7 {
+    left: 29.16667%; }
+  .col-md-push-8 {
+    left: 33.33333%; }
+  .col-md-push-9 {
+    left: 37.5%; }
+  .col-md-push-10 {
+    left: 41.66667%; }
+  .col-md-push-11 {
+    left: 45.83333%; }
+  .col-md-push-12 {
+    left: 50%; }
+  .col-md-push-13 {
+    left: 54.16667%; }
+  .col-md-push-14 {
+    left: 58.33333%; }
+  .col-md-push-15 {
+    left: 62.5%; }
+  .col-md-push-16 {
+    left: 66.66667%; }
+  .col-md-push-17 {
+    left: 70.83333%; }
+  .col-md-push-18 {
+    left: 75%; }
+  .col-md-push-19 {
+    left: 79.16667%; }
+  .col-md-push-20 {
+    left: 83.33333%; }
+  .col-md-push-21 {
+    left: 87.5%; }
+  .col-md-push-22 {
+    left: 91.66667%; }
+  .col-md-push-23 {
+    left: 95.83333%; }
+  .col-md-push-24 {
+    left: 100%; }
+  .col-md-offset-0 {
+    margin-left: 0%; }
+  .col-md-offset-1 {
+    margin-left: 4.16667%; }
+  .col-md-offset-2 {
+    margin-left: 8.33333%; }
+  .col-md-offset-3 {
+    margin-left: 12.5%; }
+  .col-md-offset-4 {
+    margin-left: 16.66667%; }
+  .col-md-offset-5 {
+    margin-left: 20.83333%; }
+  .col-md-offset-6 {
+    margin-left: 25%; }
+  .col-md-offset-7 {
+    margin-left: 29.16667%; }
+  .col-md-offset-8 {
+    margin-left: 33.33333%; }
+  .col-md-offset-9 {
+    margin-left: 37.5%; }
+  .col-md-offset-10 {
+    margin-left: 41.66667%; }
+  .col-md-offset-11 {
+    margin-left: 45.83333%; }
+  .col-md-offset-12 {
+    margin-left: 50%; }
+  .col-md-offset-13 {
+    margin-left: 54.16667%; }
+  .col-md-offset-14 {
+    margin-left: 58.33333%; }
+  .col-md-offset-15 {
+    margin-left: 62.5%; }
+  .col-md-offset-16 {
+    margin-left: 66.66667%; }
+  .col-md-offset-17 {
+    margin-left: 70.83333%; }
+  .col-md-offset-18 {
+    margin-left: 75%; }
+  .col-md-offset-19 {
+    margin-left: 79.16667%; }
+  .col-md-offset-20 {
+    margin-left: 83.33333%; }
+  .col-md-offset-21 {
+    margin-left: 87.5%; }
+  .col-md-offset-22 {
+    margin-left: 91.66667%; }
+  .col-md-offset-23 {
+    margin-left: 95.83333%; }
+  .col-md-offset-24 {
+    margin-left: 100%; } }
+
+@media (min-width: 1200px) {
+  .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg-13, .col-lg-14, .col-lg-15, .col-lg-16, .col-lg-17, .col-lg-18, .col-lg-19, .col-lg-20, .col-lg-21, .col-lg-22, .col-lg-23, .col-lg-24 {
+    float: left; }
+  .col-lg-1 {
+    width: 4.16667%; }
+  .col-lg-2 {
+    width: 8.33333%; }
+  .col-lg-3 {
+    width: 12.5%; }
+  .col-lg-4 {
+    width: 16.66667%; }
+  .col-lg-5 {
+    width: 20.83333%; }
+  .col-lg-6 {
+    width: 25%; }
+  .col-lg-7 {
+    width: 29.16667%; }
+  .col-lg-8 {
+    width: 33.33333%; }
+  .col-lg-9 {
+    width: 37.5%; }
+  .col-lg-10 {
+    width: 41.66667%; }
+  .col-lg-11 {
+    width: 45.83333%; }
+  .col-lg-12 {
+    width: 50%; }
+  .col-lg-13 {
+    width: 54.16667%; }
+  .col-lg-14 {
+    width: 58.33333%; }
+  .col-lg-15 {
+    width: 62.5%; }
+  .col-lg-16 {
+    width: 66.66667%; }
+  .col-lg-17 {
+    width: 70.83333%; }
+  .col-lg-18 {
+    width: 75%; }
+  .col-lg-19 {
+    width: 79.16667%; }
+  .col-lg-20 {
+    width: 83.33333%; }
+  .col-lg-21 {
+    width: 87.5%; }
+  .col-lg-22 {
+    width: 91.66667%; }
+  .col-lg-23 {
+    width: 95.83333%; }
+  .col-lg-24 {
+    width: 100%; }
+  .col-lg-pull-0 {
+    right: auto; }
+  .col-lg-pull-1 {
+    right: 4.16667%; }
+  .col-lg-pull-2 {
+    right: 8.33333%; }
+  .col-lg-pull-3 {
+    right: 12.5%; }
+  .col-lg-pull-4 {
+    right: 16.66667%; }
+  .col-lg-pull-5 {
+    right: 20.83333%; }
+  .col-lg-pull-6 {
+    right: 25%; }
+  .col-lg-pull-7 {
+    right: 29.16667%; }
+  .col-lg-pull-8 {
+    right: 33.33333%; }
+  .col-lg-pull-9 {
+    right: 37.5%; }
+  .col-lg-pull-10 {
+    right: 41.66667%; }
+  .col-lg-pull-11 {
+    right: 45.83333%; }
+  .col-lg-pull-12 {
+    right: 50%; }
+  .col-lg-pull-13 {
+    right: 54.16667%; }
+  .col-lg-pull-14 {
+    right: 58.33333%; }
+  .col-lg-pull-15 {
+    right: 62.5%; }
+  .col-lg-pull-16 {
+    right: 66.66667%; }
+  .col-lg-pull-17 {
+    right: 70.83333%; }
+  .col-lg-pull-18 {
+    right: 75%; }
+  .col-lg-pull-19 {
+    right: 79.16667%; }
+  .col-lg-pull-20 {
+    right: 83.33333%; }
+  .col-lg-pull-21 {
+    right: 87.5%; }
+  .col-lg-pull-22 {
+    right: 91.66667%; }
+  .col-lg-pull-23 {
+    right: 95.83333%; }
+  .col-lg-pull-24 {
+    right: 100%; }
+  .col-lg-push-0 {
+    left: auto; }
+  .col-lg-push-1 {
+    left: 4.16667%; }
+  .col-lg-push-2 {
+    left: 8.33333%; }
+  .col-lg-push-3 {
+    left: 12.5%; }
+  .col-lg-push-4 {
+    left: 16.66667%; }
+  .col-lg-push-5 {
+    left: 20.83333%; }
+  .col-lg-push-6 {
+    left: 25%; }
+  .col-lg-push-7 {
+    left: 29.16667%; }
+  .col-lg-push-8 {
+    left: 33.33333%; }
+  .col-lg-push-9 {
+    left: 37.5%; }
+  .col-lg-push-10 {
+    left: 41.66667%; }
+  .col-lg-push-11 {
+    left: 45.83333%; }
+  .col-lg-push-12 {
+    left: 50%; }
+  .col-lg-push-13 {
+    left: 54.16667%; }
+  .col-lg-push-14 {
+    left: 58.33333%; }
+  .col-lg-push-15 {
+    left: 62.5%; }
+  .col-lg-push-16 {
+    left: 66.66667%; }
+  .col-lg-push-17 {
+    left: 70.83333%; }
+  .col-lg-push-18 {
+    left: 75%; }
+  .col-lg-push-19 {
+    left: 79.16667%; }
+  .col-lg-push-20 {
+    left: 83.33333%; }
+  .col-lg-push-21 {
+    left: 87.5%; }
+  .col-lg-push-22 {
+    left: 91.66667%; }
+  .col-lg-push-23 {
+    left: 95.83333%; }
+  .col-lg-push-24 {
+    left: 100%; }
+  .col-lg-offset-0 {
+    margin-left: 0%; }
+  .col-lg-offset-1 {
+    margin-left: 4.16667%; }
+  .col-lg-offset-2 {
+    margin-left: 8.33333%; }
+  .col-lg-offset-3 {
+    margin-left: 12.5%; }
+  .col-lg-offset-4 {
+    margin-left: 16.66667%; }
+  .col-lg-offset-5 {
+    margin-left: 20.83333%; }
+  .col-lg-offset-6 {
+    margin-left: 25%; }
+  .col-lg-offset-7 {
+    margin-left: 29.16667%; }
+  .col-lg-offset-8 {
+    margin-left: 33.33333%; }
+  .col-lg-offset-9 {
+    margin-left: 37.5%; }
+  .col-lg-offset-10 {
+    margin-left: 41.66667%; }
+  .col-lg-offset-11 {
+    margin-left: 45.83333%; }
+  .col-lg-offset-12 {
+    margin-left: 50%; }
+  .col-lg-offset-13 {
+    margin-left: 54.16667%; }
+  .col-lg-offset-14 {
+    margin-left: 58.33333%; }
+  .col-lg-offset-15 {
+    margin-left: 62.5%; }
+  .col-lg-offset-16 {
+    margin-left: 66.66667%; }
+  .col-lg-offset-17 {
+    margin-left: 70.83333%; }
+  .col-lg-offset-18 {
+    margin-left: 75%; }
+  .col-lg-offset-19 {
+    margin-left: 79.16667%; }
+  .col-lg-offset-20 {
+    margin-left: 83.33333%; }
+  .col-lg-offset-21 {
+    margin-left: 87.5%; }
+  .col-lg-offset-22 {
+    margin-left: 91.66667%; }
+  .col-lg-offset-23 {
+    margin-left: 95.83333%; }
+  .col-lg-offset-24 {
+    margin-left: 100%; } }
+
+table {
+  background-color: transparent; }
+  table col[class*="col-"] {
+    position: static;
+    display: table-column;
+    float: none; }
+  table td[class*="col-"],
+  table th[class*="col-"] {
+    position: static;
+    display: table-cell;
+    float: none; }
+
+caption {
+  padding-top: 4px;
+  padding-bottom: 4px;
+  color: #e1e1e1;
+  text-align: left; }
+
+th {
+  text-align: left; }
+
+.table {
+  width: 100%;
+  max-width: 100%;
+  margin-bottom: 22px; }
+  .table > thead > tr > th,
+  .table > thead > tr > td,
+  .table > tbody > tr > th,
+  .table > tbody > tr > td,
+  .table > tfoot > tr > th,
+  .table > tfoot > tr > td {
+    padding: 4px;
+    line-height: 1.5;
+    vertical-align: top;
+    border-top: 1px solid #666666; }
+  .table > thead > tr > th {
+    vertical-align: bottom;
+    border-bottom: 2px solid #666666; }
+  .table > caption + thead > tr:first-child > th,
+  .table > caption + thead > tr:first-child > td,
+  .table > colgroup + thead > tr:first-child > th,
+  .table > colgroup + thead > tr:first-child > td,
+  .table > thead:first-child > tr:first-child > th,
+  .table > thead:first-child > tr:first-child > td {
+    border-top: 0; }
+  .table > tbody + tbody {
+    border-top: 2px solid #666666; }
+  .table .table {
+    background-color: #f2f2f2; }
+
+.table-condensed > thead > tr > th,
+.table-condensed > thead > tr > td,
+.table-condensed > tbody > tr > th,
+.table-condensed > tbody > tr > td,
+.table-condensed > tfoot > tr > th,
+.table-condensed > tfoot > tr > td {
+  padding: 5px; }
+
+.table-bordered {
+  border: 1px solid #666666; }
+  .table-bordered > thead > tr > th,
+  .table-bordered > thead > tr > td,
+  .table-bordered > tbody > tr > th,
+  .table-bordered > tbody > tr > td,
+  .table-bordered > tfoot > tr > th,
+  .table-bordered > tfoot > tr > td {
+    border: 1px solid #666666; }
+  .table-bordered > thead > tr > th,
+  .table-bordered > thead > tr > td {
+    border-bottom-width: 2px; }
+
+.table-striped > tbody > tr:nth-of-type(odd) {
+  background-color: #f0f9fc; }
+
+.table-hover > tbody > tr:hover {
+  background-color: #f5f5f5; }
+
+.table > thead > tr > td.active,
+.table > thead > tr > th.active,
+.table > thead > tr.active > td,
+.table > thead > tr.active > th,
+.table > tbody > tr > td.active,
+.table > tbody > tr > th.active,
+.table > tbody > tr.active > td,
+.table > tbody > tr.active > th,
+.table > tfoot > tr > td.active,
+.table > tfoot > tr > th.active,
+.table > tfoot > tr.active > td,
+.table > tfoot > tr.active > th {
+  background-color: #f5f5f5; }
+
+.table-hover > tbody > tr > td.active:hover,
+.table-hover > tbody > tr > th.active:hover,
+.table-hover > tbody > tr.active:hover > td,
+.table-hover > tbody > tr:hover > .active,
+.table-hover > tbody > tr.active:hover > th {
+  background-color: #e8e8e8; }
+
+.table > thead > tr > td.success,
+.table > thead > tr > th.success,
+.table > thead > tr.success > td,
+.table > thead > tr.success > th,
+.table > tbody > tr > td.success,
+.table > tbody > tr > th.success,
+.table > tbody > tr.success > td,
+.table > tbody > tr.success > th,
+.table > tfoot > tr > td.success,
+.table > tfoot > tr > th.success,
+.table > tfoot > tr.success > td,
+.table > tfoot > tr.success > th {
+  background-color: #d9f3d9; }
+
+.table-hover > tbody > tr > td.success:hover,
+.table-hover > tbody > tr > th.success:hover,
+.table-hover > tbody > tr.success:hover > td,
+.table-hover > tbody > tr:hover > .success,
+.table-hover > tbody > tr.success:hover > th {
+  background-color: #c6edc6; }
+
+.table > thead > tr > td.info,
+.table > thead > tr > th.info,
+.table > thead > tr.info > td,
+.table > thead > tr.info > th,
+.table > tbody > tr > td.info,
+.table > tbody > tr > th.info,
+.table > tbody > tr.info > td,
+.table > tbody > tr.info > th,
+.table > tfoot > tr > td.info,
+.table > tfoot > tr > th.info,
+.table > tfoot > tr.info > td,
+.table > tfoot > tr.info > th {
+  background-color: #d9eff8; }
+
+.table-hover > tbody > tr > td.info:hover,
+.table-hover > tbody > tr > th.info:hover,
+.table-hover > tbody > tr.info:hover > td,
+.table-hover > tbody > tr:hover > .info,
+.table-hover > tbody > tr.info:hover > th {
+  background-color: #c3e6f4; }
+
+.table > thead > tr > td.warning,
+.table > thead > tr > th.warning,
+.table > thead > tr.warning > td,
+.table > thead > tr.warning > th,
+.table > tbody > tr > td.warning,
+.table > tbody > tr > th.warning,
+.table > tbody > tr.warning > td,
+.table > tbody > tr.warning > th,
+.table > tfoot > tr > td.warning,
+.table > tfoot > tr > th.warning,
+.table > tfoot > tr.warning > td,
+.table > tfoot > tr.warning > th {
+  background-color: #fff7d9; }
+
+.table-hover > tbody > tr > td.warning:hover,
+.table-hover > tbody > tr > th.warning:hover,
+.table-hover > tbody > tr.warning:hover > td,
+.table-hover > tbody > tr:hover > .warning,
+.table-hover > tbody > tr.warning:hover > th {
+  background-color: #fff2c0; }
+
+.table > thead > tr > td.danger,
+.table > thead > tr > th.danger,
+.table > thead > tr.danger > td,
+.table > thead > tr.danger > th,
+.table > tbody > tr > td.danger,
+.table > tbody > tr > th.danger,
+.table > tbody > tr.danger > td,
+.table > tbody > tr.danger > th,
+.table > tfoot > tr > td.danger,
+.table > tfoot > tr > th.danger,
+.table > tfoot > tr.danger > td,
+.table > tfoot > tr.danger > th {
+  background-color: #fad9d9; }
+
+.table-hover > tbody > tr > td.danger:hover,
+.table-hover > tbody > tr > th.danger:hover,
+.table-hover > tbody > tr.danger:hover > td,
+.table-hover > tbody > tr:hover > .danger,
+.table-hover > tbody > tr.danger:hover > th {
+  background-color: #f7c2c2; }
+
+.table-responsive {
+  min-height: .01%;
+  overflow-x: auto; }
+  @media screen and (max-width: 767px) {
+    .table-responsive {
+      width: 100%;
+      margin-bottom: 16.5px;
+      overflow-y: hidden;
+      -ms-overflow-style: -ms-autohiding-scrollbar;
+      border: 1px solid #666666; }
+      .table-responsive > .table {
+        margin-bottom: 0; }
+        .table-responsive > .table > thead > tr > th,
+        .table-responsive > .table > thead > tr > td,
+        .table-responsive > .table > tbody > tr > th,
+        .table-responsive > .table > tbody > tr > td,
+        .table-responsive > .table > tfoot > tr > th,
+        .table-responsive > .table > tfoot > tr > td {
+          white-space: nowrap; }
+      .table-responsive > .table-bordered {
+        border: 0; }
+        .table-responsive > .table-bordered > thead > tr > th:first-child,
+        .table-responsive > .table-bordered > thead > tr > td:first-child,
+        .table-responsive > .table-bordered > tbody > tr > th:first-child,
+        .table-responsive > .table-bordered > tbody > tr > td:first-child,
+        .table-responsive > .table-bordered > tfoot > tr > th:first-child,
+        .table-responsive > .table-bordered > tfoot > tr > td:first-child {
+          border-left: 0; }
+        .table-responsive > .table-bordered > thead > tr > th:last-child,
+        .table-responsive > .table-bordered > thead > tr > td:last-child,
+        .table-responsive > .table-bordered > tbody > tr > th:last-child,
+        .table-responsive > .table-bordered > tbody > tr > td:last-child,
+        .table-responsive > .table-bordered > tfoot > tr > th:last-child,
+        .table-responsive > .table-bordered > tfoot > tr > td:last-child {
+          border-right: 0; }
+        .table-responsive > .table-bordered > tbody > tr:last-child > th,
+        .table-responsive > .table-bordered > tbody > tr:last-child > td,
+        .table-responsive > .table-bordered > tfoot > tr:last-child > th,
+        .table-responsive > .table-bordered > tfoot > tr:last-child > td {
+          border-bottom: 0; } }
+
+fieldset {
+  min-width: 0;
+  padding: 0;
+  margin: 0;
+  border: 0; }
+
+legend {
+  display: block;
+  width: 100%;
+  padding: 0;
+  margin-bottom: 22px;
+  font-size: 22.5px;
+  line-height: inherit;
+  color: #333333;
+  border: 0;
+  border-bottom: 1px solid transparent; }
+
+label {
+  display: inline-block;
+  max-width: 100%;
+  margin-bottom: 5px;
+  font-weight: 700; }
+
+input[type="search"] {
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+  -webkit-appearance: none;
+  appearance: none; }
+
+input[type="radio"],
+input[type="checkbox"] {
+  margin: 4px 0 0;
+  margin-top: 1px \9;
+  line-height: normal; }
+  input[type="radio"][disabled], input[type="radio"].disabled,
+  fieldset[disabled] input[type="radio"],
+  input[type="checkbox"][disabled],
+  input[type="checkbox"].disabled,
+  fieldset[disabled]
+  input[type="checkbox"] {
+    cursor: not-allowed; }
+
+input[type="file"] {
+  display: block; }
+
+input[type="range"] {
+  display: block;
+  width: 100%; }
+
+select[multiple],
+select[size] {
+  height: auto; }
+
+input[type="file"]:focus,
+input[type="radio"]:focus,
+input[type="checkbox"]:focus {
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px; }
+
+output {
+  display: block;
+  padding-top: 7px;
+  font-size: 15px;
+  line-height: 1.5;
+  color: #000; }
+
+.form-control {
+  display: block;
+  width: 100%;
+  height: 36px;
+  padding: 6px 12px;
+  font-size: 15px;
+  line-height: 1.5;
+  color: #000;
+  background-color: #fff;
+  background-image: none;
+  border: 1px solid #333333;
+  border-radius: 0;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+  -webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;
+  -o-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;
+  transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; }
+  .form-control:focus {
+    border-color: #333333;
+    outline: 0;
+    -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(51, 51, 51, 0.6);
+    box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(51, 51, 51, 0.6); }
+  .form-control::-moz-placeholder {
+    color: #333333;
+    opacity: 1; }
+  .form-control:-ms-input-placeholder {
+    color: #333333; }
+  .form-control::-webkit-input-placeholder {
+    color: #333333; }
+  .form-control::-ms-expand {
+    background-color: transparent;
+    border: 0; }
+  .form-control[disabled], .form-control[readonly],
+  fieldset[disabled] .form-control {
+    background-color: #f2f2f2;
+    opacity: 1; }
+  .form-control[disabled],
+  fieldset[disabled] .form-control {
+    cursor: not-allowed; }
+
+textarea.form-control {
+  height: auto; }
+
+@media screen and (-webkit-min-device-pixel-ratio: 0) {
+  input[type="date"].form-control,
+  input[type="time"].form-control,
+  input[type="datetime-local"].form-control,
+  input[type="month"].form-control {
+    line-height: 36px; }
+  input[type="date"].input-sm,
+  .input-group-sm input[type="date"],
+  input[type="time"].input-sm,
+  .input-group-sm
+  input[type="time"],
+  input[type="datetime-local"].input-sm,
+  .input-group-sm
+  input[type="datetime-local"],
+  input[type="month"].input-sm,
+  .input-group-sm
+  input[type="month"] {
+    line-height: 31px; }
+  input[type="date"].input-lg,
+  .input-group-lg input[type="date"],
+  input[type="time"].input-lg,
+  .input-group-lg
+  input[type="time"],
+  input[type="datetime-local"].input-lg,
+  .input-group-lg
+  input[type="datetime-local"],
+  input[type="month"].input-lg,
+  .input-group-lg
+  input[type="month"] {
+    line-height: 48px; } }
+
+.form-group {
+  margin-bottom: 15px; }
+
+.radio,
+.checkbox {
+  position: relative;
+  display: block;
+  margin-top: 10px;
+  margin-bottom: 10px; }
+  .radio.disabled label,
+  fieldset[disabled] .radio label,
+  .checkbox.disabled label,
+  fieldset[disabled]
+  .checkbox label {
+    cursor: not-allowed; }
+  .radio label,
+  .checkbox label {
+    min-height: 22px;
+    padding-left: 20px;
+    margin-bottom: 0;
+    font-weight: 400;
+    cursor: pointer; }
+
+.radio input[type="radio"],
+.radio-inline input[type="radio"],
+.checkbox input[type="checkbox"],
+.checkbox-inline input[type="checkbox"] {
+  position: absolute;
+  margin-top: 4px \9;
+  margin-left: -20px; }
+
+.radio + .radio,
+.checkbox + .checkbox {
+  margin-top: -5px; }
+
+.radio-inline,
+.checkbox-inline {
+  position: relative;
+  display: inline-block;
+  padding-left: 20px;
+  margin-bottom: 0;
+  font-weight: 400;
+  vertical-align: middle;
+  cursor: pointer; }
+  .radio-inline.disabled,
+  fieldset[disabled] .radio-inline,
+  .checkbox-inline.disabled,
+  fieldset[disabled]
+  .checkbox-inline {
+    cursor: not-allowed; }
+
+.radio-inline + .radio-inline,
+.checkbox-inline + .checkbox-inline {
+  margin-top: 0;
+  margin-left: 10px; }
+
+.form-control-static {
+  min-height: 37px;
+  padding-top: 7px;
+  padding-bottom: 7px;
+  margin-bottom: 0; }
+  .form-control-static.input-lg, .form-control-static.input-sm {
+    padding-right: 0;
+    padding-left: 0; }
+
+.input-sm {
+  height: 31px;
+  padding: 5px 10px;
+  font-size: 13px;
+  line-height: 1.5;
+  border-radius: 0; }
+
+select.input-sm {
+  height: 31px;
+  line-height: 31px; }
+
+textarea.input-sm,
+select[multiple].input-sm {
+  height: auto; }
+
+.form-group-sm .form-control {
+  height: 31px;
+  padding: 5px 10px;
+  font-size: 13px;
+  line-height: 1.5;
+  border-radius: 0; }
+
+.form-group-sm select.form-control {
+  height: 31px;
+  line-height: 31px; }
+
+.form-group-sm textarea.form-control,
+.form-group-sm select[multiple].form-control {
+  height: auto; }
+
+.form-group-sm .form-control-static {
+  height: 31px;
+  min-height: 35px;
+  padding: 6px 10px;
+  font-size: 13px;
+  line-height: 1.5; }
+
+.input-lg {
+  height: 48px;
+  padding: 10px 16px;
+  font-size: 19px;
+  line-height: 1.33;
+  border-radius: 0; }
+
+select.input-lg {
+  height: 48px;
+  line-height: 48px; }
+
+textarea.input-lg,
+select[multiple].input-lg {
+  height: auto; }
+
+.form-group-lg .form-control {
+  height: 48px;
+  padding: 10px 16px;
+  font-size: 19px;
+  line-height: 1.33;
+  border-radius: 0; }
+
+.form-group-lg select.form-control {
+  height: 48px;
+  line-height: 48px; }
+
+.form-group-lg textarea.form-control,
+.form-group-lg select[multiple].form-control {
+  height: auto; }
+
+.form-group-lg .form-control-static {
+  height: 48px;
+  min-height: 41px;
+  padding: 11px 16px;
+  font-size: 19px;
+  line-height: 1.33; }
+
+.has-feedback {
+  position: relative; }
+  .has-feedback .form-control {
+    padding-right: 45px; }
+
+.form-control-feedback {
+  position: absolute;
+  top: 0;
+  right: 0;
+  z-index: 2;
+  display: block;
+  width: 36px;
+  height: 36px;
+  line-height: 36px;
+  text-align: center;
+  pointer-events: none; }
+
+.input-lg + .form-control-feedback,
+.input-group-lg + .form-control-feedback,
+.form-group-lg .form-control + .form-control-feedback {
+  width: 48px;
+  height: 48px;
+  line-height: 48px; }
+
+.input-sm + .form-control-feedback,
+.input-group-sm + .form-control-feedback,
+.form-group-sm .form-control + .form-control-feedback {
+  width: 31px;
+  height: 31px;
+  line-height: 31px; }
+
+.has-success .help-block, .has-success .has-error label.error, .has-error .has-success label.error,
+.has-success .control-label,
+.has-success .radio,
+.has-success .checkbox,
+.has-success .radio-inline,
+.has-success .checkbox-inline,
+.has-success.radio label,
+.has-success.checkbox label,
+.has-success.radio-inline label,
+.has-success.checkbox-inline label {
+  color: #007a00; }
+
+.has-success .form-control {
+  border-color: #007a00;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); }
+  .has-success .form-control:focus {
+    border-color: #004700;
+    -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #00e000;
+    box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #00e000; }
+
+.has-success .input-group-addon {
+  color: #007a00;
+  background-color: #d9f3d9;
+  border-color: #007a00; }
+
+.has-success .form-control-feedback {
+  color: #007a00; }
+
+.has-warning .help-block, .has-warning .has-error label.error, .has-error .has-warning label.error,
+.has-warning .control-label,
+.has-warning .radio,
+.has-warning .checkbox,
+.has-warning .radio-inline,
+.has-warning .checkbox-inline,
+.has-warning.radio label,
+.has-warning.checkbox label,
+.has-warning.radio-inline label,
+.has-warning.checkbox-inline label {
+  color: #b28e00; }
+
+.has-warning .form-control {
+  border-color: #b28e00;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); }
+  .has-warning .form-control:focus {
+    border-color: #7f6500;
+    -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ffd019;
+    box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ffd019; }
+
+.has-warning .input-group-addon {
+  color: #b28e00;
+  background-color: #fff7d9;
+  border-color: #b28e00; }
+
+.has-warning .form-control-feedback {
+  color: #b28e00; }
+
+.has-error .help-block, .has-error label.error,
+.has-error .control-label,
+.has-error .radio,
+.has-error .checkbox,
+.has-error .radio-inline,
+.has-error .checkbox-inline,
+.has-error.radio label,
+.has-error.checkbox label,
+.has-error.radio-inline label,
+.has-error.checkbox-inline label {
+  color: #9c0000; }
+
+.has-error .form-control {
+  border-color: #9c0000;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); }
+  .has-error .form-control:focus {
+    border-color: #690000;
+    -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ff0303;
+    box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ff0303; }
+
+.has-error .input-group-addon {
+  color: #9c0000;
+  background-color: #fad9d9;
+  border-color: #9c0000; }
+
+.has-error .form-control-feedback {
+  color: #9c0000; }
+
+.has-feedback label ~ .form-control-feedback {
+  top: 27px; }
+
+.has-feedback label.sr-only ~ .form-control-feedback {
+  top: 0; }
+
+.help-block, .has-error label.error {
+  display: block;
+  margin-top: 5px;
+  margin-bottom: 10px;
+  color: #404040; }
+
+@media (min-width: 768px) {
+  .form-inline .form-group {
+    display: inline-block;
+    margin-bottom: 0;
+    vertical-align: middle; }
+  .form-inline .form-control {
+    display: inline-block;
+    width: auto;
+    vertical-align: middle; }
+  .form-inline .form-control-static {
+    display: inline-block; }
+  .form-inline .input-group {
+    display: inline-table;
+    vertical-align: middle; }
+    .form-inline .input-group .input-group-addon,
+    .form-inline .input-group .input-group-btn,
+    .form-inline .input-group .form-control {
+      width: auto; }
+  .form-inline .input-group > .form-control {
+    width: 100%; }
+  .form-inline .control-label {
+    margin-bottom: 0;
+    vertical-align: middle; }
+  .form-inline .radio,
+  .form-inline .checkbox {
+    display: inline-block;
+    margin-top: 0;
+    margin-bottom: 0;
+    vertical-align: middle; }
+    .form-inline .radio label,
+    .form-inline .checkbox label {
+      padding-left: 0; }
+  .form-inline .radio input[type="radio"],
+  .form-inline .checkbox input[type="checkbox"] {
+    position: relative;
+    margin-left: 0; }
+  .form-inline .has-feedback .form-control-feedback {
+    top: 0; } }
+
+.form-horizontal .radio,
+.form-horizontal .checkbox,
+.form-horizontal .radio-inline,
+.form-horizontal .checkbox-inline {
+  padding-top: 7px;
+  margin-top: 0;
+  margin-bottom: 0; }
+
+.form-horizontal .radio,
+.form-horizontal .checkbox {
+  min-height: 29px; }
+
+.form-horizontal .form-group {
+  margin-right: -10px;
+  margin-left: -10px; }
+  .form-horizontal .form-group:before, .form-horizontal .form-group:after {
+    display: table;
+    content: " "; }
+  .form-horizontal .form-group:after {
+    clear: both; }
+
+@media (min-width: 768px) {
+  .form-horizontal .control-label {
+    padding-top: 7px;
+    margin-bottom: 0;
+    text-align: right; } }
+
+.form-horizontal .has-feedback .form-control-feedback {
+  right: 10px; }
+
+@media (min-width: 768px) {
+  .form-horizontal .form-group-lg .control-label {
+    padding-top: 11px;
+    font-size: 19px; } }
+
+@media (min-width: 768px) {
+  .form-horizontal .form-group-sm .control-label {
+    padding-top: 6px;
+    font-size: 13px; } }
+
+.btn {
+  display: inline-block;
+  margin-bottom: 0;
+  font-weight: normal;
+  text-align: center;
+  white-space: nowrap;
+  vertical-align: middle;
+  touch-action: manipulation;
+  cursor: pointer;
+  background-image: none;
+  border: 1px solid transparent;
+  padding: 6px 12px;
+  font-size: 15px;
+  line-height: 1.5;
+  border-radius: 0;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none; }
+  .btn:focus, .btn.focus, .btn:active:focus, .btn:active.focus, .btn.active:focus, .btn.active.focus {
+    outline: 5px auto -webkit-focus-ring-color;
+    outline-offset: -2px; }
+  .btn:hover, .btn:focus, .btn.focus {
+    color: #0093d0;
+    text-decoration: none; }
+  .btn:active, .btn.active {
+    background-image: none;
+    outline: 0;
+    -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+    box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); }
+  .btn.disabled, .btn[disabled],
+  fieldset[disabled] .btn {
+    cursor: not-allowed;
+    filter: alpha(opacity=65);
+    opacity: 0.65;
+    -webkit-box-shadow: none;
+    box-shadow: none; }
+
+a.btn.disabled,
+fieldset[disabled] a.btn {
+  pointer-events: none; }
+
+.btn-default {
+  color: #0093d0;
+  background-color: #f0f9fc;
+  border-color: #0093d0; }
+  .btn-default:focus, .btn-default.focus {
+    color: #0093d0;
+    background-color: #c6e8f4;
+    border-color: #003951; }
+  .btn-default:hover {
+    color: #0093d0;
+    background-color: #c6e8f4;
+    border-color: #006893; }
+  .btn-default:active, .btn-default.active,
+  .open > .btn-default.dropdown-toggle {
+    color: #0093d0;
+    background-color: #c6e8f4;
+    background-image: none;
+    border-color: #006893; }
+    .btn-default:active:hover, .btn-default:active:focus, .btn-default:active.focus, .btn-default.active:hover, .btn-default.active:focus, .btn-default.active.focus,
+    .open > .btn-default.dropdown-toggle:hover,
+    .open > .btn-default.dropdown-toggle:focus,
+    .open > .btn-default.dropdown-toggle.focus {
+      color: #0093d0;
+      background-color: #a8dcee;
+      border-color: #003951; }
+  .btn-default.disabled:hover, .btn-default.disabled:focus, .btn-default.disabled.focus, .btn-default[disabled]:hover, .btn-default[disabled]:focus, .btn-default[disabled].focus,
+  fieldset[disabled] .btn-default:hover,
+  fieldset[disabled] .btn-default:focus,
+  fieldset[disabled] .btn-default.focus {
+    background-color: #f0f9fc;
+    border-color: #0093d0; }
+  .btn-default .badge {
+    color: #f0f9fc;
+    background-color: #0093d0; }
+
+.btn-primary {
+  color: #fff;
+  background-color: #0093d0;
+  border-color: #0093d0; }
+  .btn-primary:focus, .btn-primary.focus {
+    color: #fff;
+    background-color: #006f9d;
+    border-color: #003951; }
+  .btn-primary:hover {
+    color: #fff;
+    background-color: #006f9d;
+    border-color: #006893; }
+  .btn-primary:active, .btn-primary.active,
+  .open > .btn-primary.dropdown-toggle {
+    color: #fff;
+    background-color: #006f9d;
+    background-image: none;
+    border-color: #006893; }
+    .btn-primary:active:hover, .btn-primary:active:focus, .btn-primary:active.focus, .btn-primary.active:hover, .btn-primary.active:focus, .btn-primary.active.focus,
+    .open > .btn-primary.dropdown-toggle:hover,
+    .open > .btn-primary.dropdown-toggle:focus,
+    .open > .btn-primary.dropdown-toggle.focus {
+      color: #fff;
+      background-color: #005679;
+      border-color: #003951; }
+  .btn-primary.disabled:hover, .btn-primary.disabled:focus, .btn-primary.disabled.focus, .btn-primary[disabled]:hover, .btn-primary[disabled]:focus, .btn-primary[disabled].focus,
+  fieldset[disabled] .btn-primary:hover,
+  fieldset[disabled] .btn-primary:focus,
+  fieldset[disabled] .btn-primary.focus {
+    background-color: #0093d0;
+    border-color: #0093d0; }
+  .btn-primary .badge {
+    color: #0093d0;
+    background-color: #fff; }
+
+.btn-success {
+  color: #fff;
+  background-color: #006700;
+  border-color: #004e00; }
+  .btn-success:focus, .btn-success.focus {
+    color: #fff;
+    background-color: #003400;
+    border-color: black; }
+  .btn-success:hover {
+    color: #fff;
+    background-color: #003400;
+    border-color: #001000; }
+  .btn-success:active, .btn-success.active,
+  .open > .btn-success.dropdown-toggle {
+    color: #fff;
+    background-color: #003400;
+    background-image: none;
+    border-color: #001000; }
+    .btn-success:active:hover, .btn-success:active:focus, .btn-success:active.focus, .btn-success.active:hover, .btn-success.active:focus, .btn-success.active.focus,
+    .open > .btn-success.dropdown-toggle:hover,
+    .open > .btn-success.dropdown-toggle:focus,
+    .open > .btn-success.dropdown-toggle.focus {
+      color: #fff;
+      background-color: #001000;
+      border-color: black; }
+  .btn-success.disabled:hover, .btn-success.disabled:focus, .btn-success.disabled.focus, .btn-success[disabled]:hover, .btn-success[disabled]:focus, .btn-success[disabled].focus,
+  fieldset[disabled] .btn-success:hover,
+  fieldset[disabled] .btn-success:focus,
+  fieldset[disabled] .btn-success.focus {
+    background-color: #006700;
+    border-color: #004e00; }
+  .btn-success .badge {
+    color: #006700;
+    background-color: #fff; }
+
+.btn-info {
+  color: #fff;
+  background-color: #0093d0;
+  border-color: #0081b7; }
+  .btn-info:focus, .btn-info.focus {
+    color: #fff;
+    background-color: #006f9d;
+    border-color: #002737; }
+  .btn-info:hover {
+    color: #fff;
+    background-color: #006f9d;
+    border-color: #005679; }
+  .btn-info:active, .btn-info.active,
+  .open > .btn-info.dropdown-toggle {
+    color: #fff;
+    background-color: #006f9d;
+    background-image: none;
+    border-color: #005679; }
+    .btn-info:active:hover, .btn-info:active:focus, .btn-info:active.focus, .btn-info.active:hover, .btn-info.active:focus, .btn-info.active.focus,
+    .open > .btn-info.dropdown-toggle:hover,
+    .open > .btn-info.dropdown-toggle:focus,
+    .open > .btn-info.dropdown-toggle.focus {
+      color: #fff;
+      background-color: #005679;
+      border-color: #002737; }
+  .btn-info.disabled:hover, .btn-info.disabled:focus, .btn-info.disabled.focus, .btn-info[disabled]:hover, .btn-info[disabled]:focus, .btn-info[disabled].focus,
+  fieldset[disabled] .btn-info:hover,
+  fieldset[disabled] .btn-info:focus,
+  fieldset[disabled] .btn-info.focus {
+    background-color: #0093d0;
+    border-color: #0081b7; }
+  .btn-info .badge {
+    color: #0093d0;
+    background-color: #fff; }
+
+.btn-warning {
+  color: #fff;
+  background-color: #ffcc00;
+  border-color: #e6b800; }
+  .btn-warning:focus, .btn-warning.focus {
+    color: #fff;
+    background-color: #cca300;
+    border-color: #665200; }
+  .btn-warning:hover {
+    color: #fff;
+    background-color: #cca300;
+    border-color: #a88700; }
+  .btn-warning:active, .btn-warning.active,
+  .open > .btn-warning.dropdown-toggle {
+    color: #fff;
+    background-color: #cca300;
+    background-image: none;
+    border-color: #a88700; }
+    .btn-warning:active:hover, .btn-warning:active:focus, .btn-warning:active.focus, .btn-warning.active:hover, .btn-warning.active:focus, .btn-warning.active.focus,
+    .open > .btn-warning.dropdown-toggle:hover,
+    .open > .btn-warning.dropdown-toggle:focus,
+    .open > .btn-warning.dropdown-toggle.focus {
+      color: #fff;
+      background-color: #a88700;
+      border-color: #665200; }
+  .btn-warning.disabled:hover, .btn-warning.disabled:focus, .btn-warning.disabled.focus, .btn-warning[disabled]:hover, .btn-warning[disabled]:focus, .btn-warning[disabled].focus,
+  fieldset[disabled] .btn-warning:hover,
+  fieldset[disabled] .btn-warning:focus,
+  fieldset[disabled] .btn-warning.focus {
+    background-color: #ffcc00;
+    border-color: #e6b800; }
+  .btn-warning .badge {
+    color: #ffcc00;
+    background-color: #fff; }
+
+.btn-danger {
+  color: #fff;
+  background-color: #df0000;
+  border-color: #c60000; }
+  .btn-danger:focus, .btn-danger.focus {
+    color: #fff;
+    background-color: #ac0000;
+    border-color: #460000; }
+  .btn-danger:hover {
+    color: #fff;
+    background-color: #ac0000;
+    border-color: #880000; }
+  .btn-danger:active, .btn-danger.active,
+  .open > .btn-danger.dropdown-toggle {
+    color: #fff;
+    background-color: #ac0000;
+    background-image: none;
+    border-color: #880000; }
+    .btn-danger:active:hover, .btn-danger:active:focus, .btn-danger:active.focus, .btn-danger.active:hover, .btn-danger.active:focus, .btn-danger.active.focus,
+    .open > .btn-danger.dropdown-toggle:hover,
+    .open > .btn-danger.dropdown-toggle:focus,
+    .open > .btn-danger.dropdown-toggle.focus {
+      color: #fff;
+      background-color: #880000;
+      border-color: #460000; }
+  .btn-danger.disabled:hover, .btn-danger.disabled:focus, .btn-danger.disabled.focus, .btn-danger[disabled]:hover, .btn-danger[disabled]:focus, .btn-danger[disabled].focus,
+  fieldset[disabled] .btn-danger:hover,
+  fieldset[disabled] .btn-danger:focus,
+  fieldset[disabled] .btn-danger.focus {
+    background-color: #df0000;
+    border-color: #c60000; }
+  .btn-danger .badge {
+    color: #df0000;
+    background-color: #fff; }
+
+.btn-link {
+  font-weight: 400;
+  color: #000;
+  border-radius: 0; }
+  .btn-link, .btn-link:active, .btn-link.active, .btn-link[disabled],
+  fieldset[disabled] .btn-link {
+    background-color: transparent;
+    -webkit-box-shadow: none;
+    box-shadow: none; }
+  .btn-link, .btn-link:hover, .btn-link:focus, .btn-link:active {
+    border-color: transparent; }
+  .btn-link:hover, .btn-link:focus {
+    color: #262626;
+    text-decoration: underline;
+    background-color: transparent; }
+  .btn-link[disabled]:hover, .btn-link[disabled]:focus,
+  fieldset[disabled] .btn-link:hover,
+  fieldset[disabled] .btn-link:focus {
+    color: #e1e1e1;
+    text-decoration: none; }
+
+.btn-lg {
+  padding: 10px 16px;
+  font-size: 19px;
+  line-height: 1.33;
+  border-radius: 0; }
+
+.btn-sm {
+  padding: 5px 10px;
+  font-size: 13px;
+  line-height: 1.5;
+  border-radius: 0; }
+
+.btn-xs {
+  padding: 1px 5px;
+  font-size: 13px;
+  line-height: 1.5;
+  border-radius: 0; }
+
+.btn-block {
+  display: block;
+  width: 100%; }
+
+.btn-block + .btn-block {
+  margin-top: 5px; }
+
+input[type="submit"].btn-block,
+input[type="reset"].btn-block,
+input[type="button"].btn-block {
+  width: 100%; }
+
+.fade {
+  opacity: 0;
+  -webkit-transition: opacity 0.15s linear;
+  -o-transition: opacity 0.15s linear;
+  transition: opacity 0.15s linear; }
+  .fade.in {
+    opacity: 1; }
+
+.collapse {
+  display: none; }
+  .collapse.in {
+    display: block; }
+
+tr.collapse.in {
+  display: table-row; }
+
+tbody.collapse.in {
+  display: table-row-group; }
+
+.collapsing {
+  position: relative;
+  height: 0;
+  overflow: hidden;
+  -webkit-transition-property: height, visibility;
+  transition-property: height, visibility;
+  -webkit-transition-duration: 0.35s;
+  transition-duration: 0.35s;
+  -webkit-transition-timing-function: ease;
+  transition-timing-function: ease; }
+
+.alert {
+  padding: 10px;
+  margin-bottom: 22px;
+  border: 1px solid transparent;
+  border-radius: 0; }
+  .alert h4 {
+    margin-top: 0;
+    color: inherit; }
+  .alert .alert-link {
+    font-weight: bold; }
+  .alert > p,
+  .alert > ul {
+    margin-bottom: 0; }
+  .alert > p + p {
+    margin-top: 5px; }
+
+.alert-dismissable,
+.alert-dismissible {
+  padding-right: 30px; }
+  .alert-dismissable .close,
+  .alert-dismissible .close {
+    position: relative;
+    top: -2px;
+    right: -21px;
+    color: inherit; }
+
+.alert-success {
+  color: #007a00;
+  background-color: #d9f3d9;
+  border-color: #d9f3d9; }
+  .alert-success hr {
+    border-top-color: #c6edc6; }
+  .alert-success .alert-link {
+    color: #004700; }
+
+.alert-info {
+  color: #006791;
+  background-color: #d9eff8;
+  border-color: #d9eff8; }
+  .alert-info hr {
+    border-top-color: #c3e6f4; }
+  .alert-info .alert-link {
+    color: #00435e; }
+
+.alert-warning {
+  color: #b28e00;
+  background-color: #fff7d9;
+  border-color: #fff7d9; }
+  .alert-warning hr {
+    border-top-color: #fff2c0; }
+  .alert-warning .alert-link {
+    color: #7f6500; }
+
+.alert-danger {
+  color: #9c0000;
+  background-color: #fad9d9;
+  border-color: #fad9d9; }
+  .alert-danger hr {
+    border-top-color: #f7c2c2; }
+  .alert-danger .alert-link {
+    color: #690000; }
+
+.well {
+  min-height: 20px;
+  padding: 19px;
+  margin-bottom: 20px;
+  background-color: #f5f5f5;
+  border: 1px solid #e3e3e3;
+  border-radius: 0;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); }
+  .well blockquote {
+    border-color: #ddd;
+    border-color: rgba(0, 0, 0, 0.15); }
+
+.well-lg {
+  padding: 24px;
+  border-radius: 0; }
+
+.well-sm {
+  padding: 9px;
+  border-radius: 0; }
+
+.close {
+  float: right;
+  font-size: 22.5px;
+  font-weight: bold;
+  line-height: 1;
+  color: #000;
+  text-shadow: 0 1px 0 #fff;
+  filter: alpha(opacity=20);
+  opacity: 0.2; }
+  .close:hover, .close:focus {
+    color: #000;
+    text-decoration: none;
+    cursor: pointer;
+    filter: alpha(opacity=50);
+    opacity: 0.5; }
+
+button.close {
+  padding: 0;
+  cursor: pointer;
+  background: transparent;
+  border: 0;
+  -webkit-appearance: none;
+  appearance: none; }
+
+.modal-open {
+  overflow: hidden; }
+
+.modal {
+  position: fixed;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  z-index: 1050;
+  display: none;
+  overflow: hidden;
+  -webkit-overflow-scrolling: touch;
+  outline: 0; }
+  .modal.fade .modal-dialog {
+    -webkit-transform: translate(0, -25%);
+    -ms-transform: translate(0, -25%);
+    -o-transform: translate(0, -25%);
+    transform: translate(0, -25%);
+    -webkit-transition: -webkit-transform 0.3s ease-out;
+    -moz-transition: -moz-transform 0.3s ease-out;
+    -o-transition: -o-transform 0.3s ease-out;
+    transition: transform 0.3s ease-out; }
+  .modal.in .modal-dialog {
+    -webkit-transform: translate(0, 0);
+    -ms-transform: translate(0, 0);
+    -o-transform: translate(0, 0);
+    transform: translate(0, 0); }
+
+.modal-open .modal {
+  overflow-x: hidden;
+  overflow-y: auto; }
+
+.modal-dialog {
+  position: relative;
+  width: auto;
+  margin: 10px; }
+
+.modal-content {
+  position: relative;
+  background-color: #fff;
+  background-clip: padding-box;
+  border: 1px solid #999;
+  border: 1px solid rgba(0, 0, 0, 0.2);
+  border-radius: 0;
+  -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);
+  box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);
+  outline: 0; }
+
+.modal-backdrop {
+  position: fixed;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  z-index: 1040;
+  background-color: #000; }
+  .modal-backdrop.fade {
+    filter: alpha(opacity=0);
+    opacity: 0; }
+  .modal-backdrop.in {
+    filter: alpha(opacity=50);
+    opacity: 0.5; }
+
+.modal-header {
+  padding: 15px 15px 0 15px;
+  border-bottom: 1px solid transparent; }
+  .modal-header:before, .modal-header:after {
+    display: table;
+    content: " "; }
+  .modal-header:after {
+    clear: both; }
+
+.modal-header .close {
+  margin-top: -2px; }
+
+.modal-title {
+  margin: 0;
+  line-height: 1.5; }
+
+.modal-body {
+  position: relative;
+  padding: 15px; }
+
+.modal-footer {
+  padding: 15px;
+  text-align: right;
+  border-top: 1px solid transparent; }
+  .modal-footer:before, .modal-footer:after {
+    display: table;
+    content: " "; }
+  .modal-footer:after {
+    clear: both; }
+  .modal-footer .btn + .btn {
+    margin-bottom: 0;
+    margin-left: 5px; }
+  .modal-footer .btn-group .btn + .btn {
+    margin-left: -1px; }
+  .modal-footer .btn-block + .btn-block {
+    margin-left: 0; }
+
+.modal-scrollbar-measure {
+  position: absolute;
+  top: -9999px;
+  width: 50px;
+  height: 50px;
+  overflow: scroll; }
+
+@media (min-width: 768px) {
+  .modal-dialog {
+    width: 600px;
+    margin: 30px auto; }
+  .modal-content {
+    -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);
+    box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); }
+  .modal-sm {
+    width: 300px; } }
+
+@media (min-width: 992px) {
+  .modal-lg {
+    width: 900px; } }
+
+.tooltip {
+  position: absolute;
+  z-index: 1030;
+  display: block;
+  font-family: Arial, "Helvetica Neue", Helvetica, sans-serif;
+  font-style: normal;
+  font-weight: 400;
+  line-height: 1.5;
+  line-break: auto;
+  text-align: left;
+  text-align: start;
+  text-decoration: none;
+  text-shadow: none;
+  text-transform: none;
+  letter-spacing: normal;
+  word-break: normal;
+  word-spacing: normal;
+  word-wrap: normal;
+  white-space: normal;
+  font-size: 13px;
+  filter: alpha(opacity=0);
+  opacity: 0; }
+  .tooltip.in {
+    filter: alpha(opacity=90);
+    opacity: 0.9; }
+  .tooltip.top {
+    padding: 5px 0;
+    margin-top: -3px; }
+  .tooltip.right {
+    padding: 0 5px;
+    margin-left: 3px; }
+  .tooltip.bottom {
+    padding: 5px 0;
+    margin-top: 3px; }
+  .tooltip.left {
+    padding: 0 5px;
+    margin-left: -3px; }
+  .tooltip.top .tooltip-arrow {
+    bottom: 0;
+    left: 50%;
+    margin-left: -5px;
+    border-width: 5px 5px 0;
+    border-top-color: #333333; }
+  .tooltip.top-left .tooltip-arrow {
+    right: 5px;
+    bottom: 0;
+    margin-bottom: -5px;
+    border-width: 5px 5px 0;
+    border-top-color: #333333; }
+  .tooltip.top-right .tooltip-arrow {
+    bottom: 0;
+    left: 5px;
+    margin-bottom: -5px;
+    border-width: 5px 5px 0;
+    border-top-color: #333333; }
+  .tooltip.right .tooltip-arrow {
+    top: 50%;
+    left: 0;
+    margin-top: -5px;
+    border-width: 5px 5px 5px 0;
+    border-right-color: #333333; }
+  .tooltip.left .tooltip-arrow {
+    top: 50%;
+    right: 0;
+    margin-top: -5px;
+    border-width: 5px 0 5px 5px;
+    border-left-color: #333333; }
+  .tooltip.bottom .tooltip-arrow {
+    top: 0;
+    left: 50%;
+    margin-left: -5px;
+    border-width: 0 5px 5px;
+    border-bottom-color: #333333; }
+  .tooltip.bottom-left .tooltip-arrow {
+    top: 0;
+    right: 5px;
+    margin-top: -5px;
+    border-width: 0 5px 5px;
+    border-bottom-color: #333333; }
+  .tooltip.bottom-right .tooltip-arrow {
+    top: 0;
+    left: 5px;
+    margin-top: -5px;
+    border-width: 0 5px 5px;
+    border-bottom-color: #333333; }
+
+.tooltip-inner {
+  max-width: 200px;
+  padding: 3px 8px;
+  color: #fff;
+  text-align: center;
+  background-color: #333333;
+  border-radius: 0; }
+
+.tooltip-arrow {
+  position: absolute;
+  width: 0;
+  height: 0;
+  border-color: transparent;
+  border-style: solid; }
+
+.popover {
+  position: absolute;
+  top: 0;
+  left: 0;
+  z-index: 1010;
+  display: none;
+  max-width: 276px;
+  padding: 1px;
+  font-family: Arial, "Helvetica Neue", Helvetica, sans-serif;
+  font-style: normal;
+  font-weight: 400;
+  line-height: 1.5;
+  line-break: auto;
+  text-align: left;
+  text-align: start;
+  text-decoration: none;
+  text-shadow: none;
+  text-transform: none;
+  letter-spacing: normal;
+  word-break: normal;
+  word-spacing: normal;
+  word-wrap: normal;
+  white-space: normal;
+  font-size: 15px;
+  background-color: #fff;
+  background-clip: padding-box;
+  border: 1px solid #ccc;
+  border: 1px solid rgba(0, 0, 0, 0.2);
+  border-radius: 0;
+  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+  box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); }
+  .popover.top {
+    margin-top: -10px; }
+  .popover.right {
+    margin-left: 10px; }
+  .popover.bottom {
+    margin-top: 10px; }
+  .popover.left {
+    margin-left: -10px; }
+  .popover > .arrow {
+    border-width: 11px; }
+    .popover > .arrow, .popover > .arrow:after {
+      position: absolute;
+      display: block;
+      width: 0;
+      height: 0;
+      border-color: transparent;
+      border-style: solid; }
+    .popover > .arrow:after {
+      content: "";
+      border-width: 10px; }
+  .popover.top > .arrow {
+    bottom: -11px;
+    left: 50%;
+    margin-left: -11px;
+    border-top-color: #999999;
+    border-top-color: fadein(rgba(0, 0, 0, 0.2), 5%);
+    border-bottom-width: 0; }
+    .popover.top > .arrow:after {
+      bottom: 1px;
+      margin-left: -10px;
+      content: " ";
+      border-top-color: #fff;
+      border-bottom-width: 0; }
+  .popover.right > .arrow {
+    top: 50%;
+    left: -11px;
+    margin-top: -11px;
+    border-right-color: #999999;
+    border-right-color: fadein(rgba(0, 0, 0, 0.2), 5%);
+    border-left-width: 0; }
+    .popover.right > .arrow:after {
+      bottom: -10px;
+      left: 1px;
+      content: " ";
+      border-right-color: #fff;
+      border-left-width: 0; }
+  .popover.bottom > .arrow {
+    top: -11px;
+    left: 50%;
+    margin-left: -11px;
+    border-top-width: 0;
+    border-bottom-color: #999999;
+    border-bottom-color: fadein(rgba(0, 0, 0, 0.2), 5%); }
+    .popover.bottom > .arrow:after {
+      top: 1px;
+      margin-left: -10px;
+      content: " ";
+      border-top-width: 0;
+      border-bottom-color: #fff; }
+  .popover.left > .arrow {
+    top: 50%;
+    right: -11px;
+    margin-top: -11px;
+    border-right-width: 0;
+    border-left-color: #999999;
+    border-left-color: fadein(rgba(0, 0, 0, 0.2), 5%); }
+    .popover.left > .arrow:after {
+      right: 1px;
+      bottom: -10px;
+      content: " ";
+      border-right-width: 0;
+      border-left-color: #fff; }
+
+.popover-title {
+  padding: 8px 14px;
+  margin: 0;
+  font-size: 15px;
+  background-color: #f7f7f7;
+  border-bottom: 1px solid #ebebeb;
+  border-radius: -1 -1 0 0; }
+
+.popover-content {
+  padding: 9px 14px; }
+
+.clearfix:before, .clearfix:after {
+  display: table;
+  content: " "; }
+
+.clearfix:after {
+  clear: both; }
+
+.center-block {
+  display: block;
+  margin-right: auto;
+  margin-left: auto; }
+
+.pull-right {
+  float: right !important; }
+
+.pull-left {
+  float: left !important; }
+
+.hide {
+  display: none !important; }
+
+.show {
+  display: block !important; }
+
+.invisible {
+  visibility: hidden; }
+
+.text-hide {
+  font: 0/0 a;
+  color: transparent;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0; }
+
+.hidden {
+  display: none !important; }
+
+.affix {
+  position: fixed; }
+
+@-ms-viewport {
+  width: device-width; }
+
+.visible-xs {
+  display: none !important; }
+
+.visible-sm {
+  display: none !important; }
+
+.visible-md {
+  display: none !important; }
+
+.visible-lg {
+  display: none !important; }
+
+.visible-xs-block,
+.visible-xs-inline,
+.visible-xs-inline-block,
+.visible-sm-block,
+.visible-sm-inline,
+.visible-sm-inline-block,
+.visible-md-block,
+.visible-md-inline,
+.visible-md-inline-block,
+.visible-lg-block,
+.visible-lg-inline,
+.visible-lg-inline-block {
+  display: none !important; }
+
+@media (max-width: 767px) {
+  .visible-xs {
+    display: block !important; }
+  table.visible-xs {
+    display: table !important; }
+  tr.visible-xs {
+    display: table-row !important; }
+  th.visible-xs,
+  td.visible-xs {
+    display: table-cell !important; } }
+
+@media (max-width: 767px) {
+  .visible-xs-block {
+    display: block !important; } }
+
+@media (max-width: 767px) {
+  .visible-xs-inline {
+    display: inline !important; } }
+
+@media (max-width: 767px) {
+  .visible-xs-inline-block {
+    display: inline-block !important; } }
+
+@media (min-width: 768px) and (max-width: 991px) {
+  .visible-sm {
+    display: block !important; }
+  table.visible-sm {
+    display: table !important; }
+  tr.visible-sm {
+    display: table-row !important; }
+  th.visible-sm,
+  td.visible-sm {
+    display: table-cell !important; } }
+
+@media (min-width: 768px) and (max-width: 991px) {
+  .visible-sm-block {
+    display: block !important; } }
+
+@media (min-width: 768px) and (max-width: 991px) {
+  .visible-sm-inline {
+    display: inline !important; } }
+
+@media (min-width: 768px) and (max-width: 991px) {
+  .visible-sm-inline-block {
+    display: inline-block !important; } }
+
+@media (min-width: 992px) and (max-width: 1199px) {
+  .visible-md {
+    display: block !important; }
+  table.visible-md {
+    display: table !important; }
+  tr.visible-md {
+    display: table-row !important; }
+  th.visible-md,
+  td.visible-md {
+    display: table-cell !important; } }
+
+@media (min-width: 992px) and (max-width: 1199px) {
+  .visible-md-block {
+    display: block !important; } }
+
+@media (min-width: 992px) and (max-width: 1199px) {
+  .visible-md-inline {
+    display: inline !important; } }
+
+@media (min-width: 992px) and (max-width: 1199px) {
+  .visible-md-inline-block {
+    display: inline-block !important; } }
+
+@media (min-width: 1200px) {
+  .visible-lg {
+    display: block !important; }
+  table.visible-lg {
+    display: table !important; }
+  tr.visible-lg {
+    display: table-row !important; }
+  th.visible-lg,
+  td.visible-lg {
+    display: table-cell !important; } }
+
+@media (min-width: 1200px) {
+  .visible-lg-block {
+    display: block !important; } }
+
+@media (min-width: 1200px) {
+  .visible-lg-inline {
+    display: inline !important; } }
+
+@media (min-width: 1200px) {
+  .visible-lg-inline-block {
+    display: inline-block !important; } }
+
+@media (max-width: 767px) {
+  .hidden-xs {
+    display: none !important; } }
+
+@media (min-width: 768px) and (max-width: 991px) {
+  .hidden-sm {
+    display: none !important; } }
+
+@media (min-width: 992px) and (max-width: 1199px) {
+  .hidden-md {
+    display: none !important; } }
+
+@media (min-width: 1200px) {
+  .hidden-lg {
+    display: none !important; } }
+
+.visible-print {
+  display: none !important; }
+
+@media print {
+  .visible-print {
+    display: block !important; }
+  table.visible-print {
+    display: table !important; }
+  tr.visible-print {
+    display: table-row !important; }
+  th.visible-print,
+  td.visible-print {
+    display: table-cell !important; } }
+
+.visible-print-block {
+  display: none !important; }
+  @media print {
+    .visible-print-block {
+      display: block !important; } }
+
+.visible-print-inline {
+  display: none !important; }
+  @media print {
+    .visible-print-inline {
+      display: inline !important; } }
+
+.visible-print-inline-block {
+  display: none !important; }
+  @media print {
+    .visible-print-inline-block {
+      display: inline-block !important; } }
+
+@media print {
+  .hidden-print {
+    display: none !important; } }
+
+body {
+  background-color: #ffffff; }
+
+main {
+  padding: 12px 0 44px 0; }
+  @media only screen and (min-width: 992px) {
+    main {
+      padding-top: 30px; } }
+
+#header {
+  background: #f2f2f2; }
+
+#footer {
+  background-color: #f2f2f2; }
+
+.table-responsive {
+  margin: 0;
+  border: 0; }
+
+.modal-footer {
+  background-color: #f2f2f2; }
+
+.modal-header {
+  min-height: 30px; }
+
+.panel {
+  width: 100%;
+  padding: 10px 15px 5px 15px;
+  background-color: #F2F2F2; }
+  .panel .panel-body h2:first-child,
+  .panel .panel-body h3:first-child,
+  .panel .panel-body h4:first-child,
+  .panel .panel-body h5:first-child,
+  .panel .panel-body h6:first-child {
+    margin-top: 4px; }
+  @media only screen and (min-width: 992px) {
+    .panel .panel-body {
+      padding: 20px; } }
+
+article .panel {
+  margin-left: -10px;
+  margin-right: -10px; }
+  @media only screen and (min-width: 992px) {
+    article .panel {
+      margin-left: -20px;
+      margin-right: -20px; } }
+
+.panel-title {
+  font-size: 24px;
+  color: #333333; }
+  .panel-title > a {
+    color: #333333; }
+
+.panel-info .panel-body {
+  background-color: #f0f9fc; }
+
+.panel-info .panel-title {
+  color: #fff; }
+  .panel-info .panel-title > a {
+    color: #fff; }
+
+.dropdown-menu-portal .panel-info {
+  margin-bottom: 0; }
+  .dropdown-menu-portal .panel-info .panel-body {
+    padding: 10px; }
+    .dropdown-menu-portal .panel-info .panel-body p {
+      font-style: italic; }
+
+@font-face {
+  font-family: 'icomoon';
+  src: url("../fonts/icons/icons.eot?mn9aw3");
+  src: url("../fonts/icons/icons.eot?#iefixmn9aw3") format("embedded-opentype"), url("../fonts/icons/icons.woff?mn9aw3") format("woff"), url("../fonts/icons/icons.ttf?mn9aw3") format("truetype"), url("../fonts/icons/icons.svg?mn9aw3#icons") format("svg");
+  font-weight: normal;
+  font-style: normal; }
+
+[class^="icon-"], [class*=" icon-"] {
+  font-family: 'icomoon';
+  speak: none;
+  font-style: normal;
+  font-weight: normal;
+  font-variant: normal;
+  text-transform: none;
+  line-height: 1;
+  /* Better Font Rendering =========== */
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale; }
+
+.icon-qmark:before {
+  content: "\e606"; }
+
+.icon-spinner-2:before {
+  content: "\e601"; }
+
+.icon-spinner-1:before {
+  content: "\e602"; }
+
+.icon-user:before {
+  content: "\e600"; }
+
+.icon-lock:before {
+  content: "\e603"; }
+
+.icon-date:before {
+  content: "\e604"; }
+
+.icon-card:before {
+  content: "\e605"; }
+
+.icon-spinner-1, .icon-spinner-2 {
+  -ms-animation: 1s linear 0s normal none infinite spin;
+  -moz-animation: 1s linear 0s normal none infinite spin;
+  -webkit-animation: 1s linear 0s normal none infinite spin;
+  animation: 1s linear 0s normal none infinite spin;
+  position: absolute; }
+
+@-ms-keyframes spin {
+  from {
+    -ms-transform: rotate(0deg); }
+  to {
+    -ms-transform: rotate(360deg); } }
+
+@-moz-keyframes spin {
+  from {
+    -moz-transform: rotate(0deg); }
+  to {
+    -moz-transform: rotate(360deg); } }
+
+@-webkit-keyframes spin {
+  from {
+    -webkit-transform: rotate(0deg); }
+  to {
+    -webkit-transform: rotate(360deg); } }
+
+@keyframes spin {
+  from {
+    transform: rotate(0deg); }
+  to {
+    transform: rotate(360deg); } }
+
+.btn {
+  padding: 6px 12px;
+  font-size: 15px;
+  line-height: 1.5;
+  border-radius: 0;
+  font-family: Arial,"Helvetica Neue",Helvetica,sans-serif;
+  font-size: 18px; }
+  .btn.disabled, .btn[disabled],
+  fieldset[disabled] .btn {
+    filter: alpha(opacity=50);
+    opacity: 0.5; }
+  .btn.btn-link {
+    font-size: 15px;
+    color: #2869ac; }
+    .btn.btn-link.secci-url, .btn.btn-link.enter-information {
+      padding: 6px 0; }
+    .btn.btn-link:hover, .btn.btn-link:focus {
+      color: #262626;
+      text-decoration: underline;
+      background-color: transparent; }
+  .btn.active, .btn:active {
+    outline: 0;
+    background-image: none;
+    box-shadow: 0 !important; }
+
+.btn-sm {
+  font-size: 15px;
+  padding: 4px 9px 5px 9px; }
+
+.btn-lg {
+  font-size: 18px;
+  padding: 9px 20px 12px 20px; }
+
+.btn-primary.disabled, .btn-primary[disabled] {
+  color: rgba(255, 255, 255, 0.5); }
+
+@supports (-webkit-appearance: -apple-pay-button) {
+  .apple-pay-button {
+    display: inline-block;
+    -webkit-appearance: -apple-pay-button; }
+  .apple-pay-button-black {
+    -apple-pay-button-style: black; }
+  .apple-pay-button-white {
+    -apple-pay-button-style: white; }
+  .apple-pay-button-white-with-line {
+    -apple-pay-button-style: white-outline; } }
+
+@supports not (-webkit-appearance: -apple-pay-button) {
+  .apple-pay-button {
+    display: inline-block;
+    background-size: 100% 60%;
+    background-repeat: no-repeat;
+    background-position: 50% 50%;
+    padding: 0px;
+    box-sizing: border-box;
+    min-height: 32px;
+    max-height: 64px; }
+  .apple-pay-button-black {
+    background-image: -webkit-named-image(apple-pay-logo-white);
+    background-color: black; }
+  .apple-pay-button-white {
+    background-image: -webkit-named-image(apple-pay-logo-black);
+    background-color: white; }
+  .apple-pay-button-white-with-line {
+    background-image: -webkit-named-image(apple-pay-logo-black);
+    background-color: white;
+    border: 0.5px solid black; } }
+
+body input {
+  font-size: 16px;
+  border-width: 1px;
+  padding: 6px 10px;
+  border-color: #aaaaaa;
+  border-radius: 2px;
+  box-shadow: rgba(0, 0, 0, 0.15) 2px 3px 5px 0px inset; }
+  body input::-moz-placeholder {
+    color: #8e8e8e;
+    opacity: 1; }
+  body input:-ms-input-placeholder {
+    color: #8e8e8e; }
+  body input::-webkit-input-placeholder {
+    color: #8e8e8e; }
+
+.has-error .help-block, .has-error label.error,
+.has-error .control-label,
+.has-error .radio,
+.has-error .checkbox,
+.has-error .radio-inline,
+.has-error .checkbox-inline {
+  color: inherit; }
+
+.has-error label.error {
+  font-weight: normal;
+  color: #9c0000; }
+
+fieldset {
+  border-bottom: 1px solid #e1e1e1;
+  margin: 0 0 11px 0; }
+
+.modal-body form > fieldset:last-child {
+  border-bottom: none; }
+
+legend {
+  font-size: 18px;
+  margin-bottom: 12px; }
+
+.form-horizontal .control-label {
+  text-align: left; }
+
+.help-block, .has-error label.error {
+  font-size: 13px; }
+
+.form-control {
+  border-style: solid;
+  border-width: 1px;
+  border-color: #aaaaaa;
+  border-radius: 2px;
+  box-shadow: rgba(0, 0, 0, 0.15) 2px 3px 5px 0px inset; }
+
+.popover {
+  border-radius: 4px;
+  max-width: 266px; }
+
+.info-popover {
+  display: inline-block;
+  width: 22px;
+  height: 22px;
+  border: 1px solid #666666;
+  border-radius: 10px;
+  font-family: Arial, "Helvetica Neue", Helvetica, sans-serif;
+  font-weight: 400;
+  font-size: 16px;
+  background-color: #f2f2f2;
+  color: #666666;
+  text-align: center;
+  margin-left: 1px;
+  line-height: 1;
+  padding-top: 2px;
+  cursor: pointer; }
+  .info-popover svg {
+    border: 0 none !important;
+    height: auto !important;
+    left: 3px;
+    margin-left: 0 !important;
+    padding-right: 0 !important;
+    top: 1px !important;
+    width: 15px !important; }
+
+.alert {
+  margin-top: 30px;
+  clear: both; }
+
+/* Sticky footer styles
+-------------------------------------------------- */
+html {
+  position: relative;
+  min-height: 100%; }
+
+body {
+  /* Margin bottom by footer height */
+  margin-bottom: 135px; }
+
+#footer-wrapper {
+  position: absolute;
+  bottom: 0;
+  width: 100%;
+  /* Set the fixed height of the footer here */
+  height: 135px; }
+
+input[type="number"]::-webkit-inner-spin-button,
+input[type="number"]::-webkit-outer-spin-button {
+  -webkit-appearance: none;
+  margin: 0; }
+
+input[type=number] {
+  -moz-appearance: textfield; }
+
+input::-ms-clear {
+  display: none; }
+
+.form-control::-webkit-input-placeholder {
+  /* WebKit browsers */
+  color: #8e8e8e; }
+
+.form-control:-moz-placeholder {
+  /* Mozilla Firefox 4 to 18 */
+  color: #8e8e8e; }
+
+.form-control::-moz-placeholder {
+  /* Mozilla Firefox 19+ */
+  color: #8e8e8e; }
+
+.form-control:-ms-input-placeholder {
+  /* Internet Explorer 10+ */
+  color: #8e8e8e; }
+
+body input {
+  border: 1px solid #aaaaaa; }
+
+#remembermeBlock {
+  min-height: 35px; }
+
+#rememberme {
+  border: 1px solid #aaaaaa !important;
+  border-radius: 2px !important;
+  background: #ffffff !important;
+  box-shadow: none !important; }
+
+header, #header {
+  min-height: 44px; }
+  header h3, #header h3 {
+    text-align: center; }
+
+#logoimage {
+  margin: 10px auto;
+  background-position: center top;
+  background-repeat: no-repeat;
+  background-size: 100%;
+  display: block; }
+
+#merchantname {
+  display: none; }
+
+.editMode #logoimage {
+  min-height: 30px; }
+
+@media (min-width: 0px) {
+  #logoimage {
+    background-image: url(/global/images/logo.png);
+    width: 174px;
+    height: 36px; } }
+
+#content {
+  overflow: hidden; }
+
+#main {
+  padding-top: 0;
+  padding-bottom: 0; }
+  @media only screen and (min-width: 992px) {
+    #main {
+      margin: 15px auto; } }
+
+.radio label,
+.checkbox label {
+  line-height: 1.2; }
+
+.cart {
+  padding: 10px;
+  margin: 0 -10px;
+  position: relative;
+  background: #e5e5e5;
+  overflow: hidden; }
+  @media only screen and (min-width: 992px) {
+    .cart {
+      padding: 30px;
+      min-height: 460px;
+      margin: 0; }
+      .instructions .cart {
+        min-height: 0;
+        padding: 10px 30px; } }
+  .cart.open .header {
+    display: none !important; }
+  .cart.open .content {
+    display: block !important; }
+    .cart.open .content tfoot td {
+      cursor: pointer; }
+  .cart .header {
+    padding-top: 4px;
+    cursor: pointer;
+    margin-right: -10px; }
+    .cart .header .amount {
+      margin-top: -4px;
+      font-size: 1.2em;
+      font-weight: bold;
+      padding-right: 25px; }
+      @media only screen and (min-width: 992px) {
+        .cart .header .amount {
+          padding-right: 0; } }
+      .cart .header .amount .caret {
+        width: 0;
+        height: 0;
+        content: '';
+        position: absolute;
+        display: inline-block;
+        border-top: 6px solid #666666;
+        border-right: 6px solid transparent;
+        border-left: 6px solid transparent;
+        right: 9px;
+        top: 22px;
+        display: none; }
+        @media only screen and (min-width: 992px) {
+          .cart-instructions .cart .header .amount .caret {
+            right: 4px;
+            top: 19px; } }
+  .cart .content h2 {
+    font-size: 1.34em;
+    margin: 0 10px 8px 0; }
+    @media only screen and (min-width: 992px) {
+      .cart .content h2 {
+        margin-right: 0; } }
+  .cart .content table {
+    margin-bottom: 0; }
+    .cart .content table tr td {
+      border-top: 0;
+      font-size: 1em; }
+      .cart .content table tr td .quantity {
+        font-size: 0.75em;
+        display: block; }
+      .cart .content table tr td.amount {
+        width: 1%;
+        white-space: nowrap;
+        padding-left: 15px;
+        text-align: right;
+        padding-right: 20px; }
+        @media only screen and (min-width: 992px) {
+          .cart .content table tr td.amount {
+            padding-right: 4px; } }
+    .cart .content table tbody tr:last-child td {
+      padding-bottom: 10px; }
+    .cart .content table tfoot tr td {
+      border-top: 1px solid #cccccc;
+      padding-top: 10px; }
+      .cart .content table tfoot tr td.amount {
+        font-size: 1.2em; }
+        .cart .content table tfoot tr td.amount .caret {
+          width: 0;
+          height: 0;
+          content: '';
+          position: absolute;
+          display: inline-block;
+          border-bottom: 6px solid #666666;
+          border-left: 6px solid transparent;
+          border-right: 6px solid transparent;
+          margin: 10px 0 0 8px;
+          cursor: pointer; }
+          @media only screen and (min-width: 992px) {
+            .cart .content table tfoot tr td.amount .caret {
+              display: none; }
+              .cart-instructions .cart .content table tfoot tr td.amount .caret {
+                display: inline-block; } }
+
+.paymentoptions {
+  padding-top: 10px; }
+  .paymentoptions form, .paymentoptions .par {
+    min-width: 280px;
+    max-width: 300px;
+    margin: 0 auto; }
+    @media only screen and (min-width: 480px) {
+      .paymentoptions form, .paymentoptions .par {
+        width: 300px; }
+        .paymentoptions form.instructions, .paymentoptions .par.instructions {
+          width: 100%;
+          max-width: 100%; } }
+  @media only screen and (min-width: 480px) {
+    .paymentoptions {
+      padding: 10px; } }
+  @media only screen and (min-width: 992px) {
+    .paymentoptions {
+      min-height: 460px; }
+      .paymentoptions .paymentbuttons {
+        margin-top: 10px;
+        margin-bottom: 20px; }
+      .instructions .paymentoptions {
+        padding: 20px 30px; } }
+  .paymentoptions form p.par {
+    margin: 15px 0 -10px; }
+  .paymentoptions .securePayment {
+    color: #006700;
+    margin: -5px 0 5px 0;
+    font-size: 0.75em; }
+    @media only screen and (min-width: 992px) {
+      .paymentoptions .securePayment {
+        margin-bottom: 25px; }
+        .instructions .paymentoptions .securePayment {
+          margin: 0; } }
+    .paymentoptions .securePayment img {
+      display: inline-block;
+      margin-top: -2px; }
+  .paymentoptions #selectmethod {
+    clear: both; }
+
+.paymentoption {
+  clear: both;
+  line-height: auto; }
+  .paymentoption .form-control[disabled], .paymentoption .form-control[readonly], .paymentoption fieldset[disabled] .form-control {
+    background-color: transparent;
+    border: 0;
+    box-shadow: none;
+    cursor: default; }
+    .paymentoption .form-control[disabled] + i, .paymentoption .form-control[disabled] + span + i, .paymentoption .form-control[readonly] + i, .paymentoption .form-control[readonly] + span + i, .paymentoption fieldset[disabled] .form-control + i, .paymentoption fieldset[disabled] .form-control + span + i {
+      border-right: 0; }
+  @media only screen and (min-width: 992px) {
+    .instructions .paymentoption {
+      clear: none;
+      width: 100%; }
+      .instructions .paymentoption h3 {
+        margin-top: 0; } }
+  .paymentoption .form-group {
+    margin-bottom: 5px;
+    line-height: 1.3; }
+    .paymentoption .form-group label {
+      margin: 6px 0 3px; }
+    .paymentoption .form-group.hideInputField {
+      display: none; }
+  .paymentoption .form-control {
+    height: auto;
+    min-height: 44px;
+    padding: 4px 10px 0;
+    font-size: 16px; }
+    .ie8 .paymentoption .form-control {
+      padding-top: 11px; }
+  .paymentoption select.form-control {
+    padding-top: 11px;
+    padding-bottom: 11px; }
+  .paymentoption div.checkbox {
+    margin-bottom: 8px;
+    margin-top: 8px;
+    position: relative;
+    clear: left; }
+    .paymentoption div.checkbox label {
+      display: inline-block;
+      width: 87%; }
+    .paymentoption div.checkbox .info-popover {
+      position: absolute;
+      right: 3px;
+      top: 5px;
+      margin: 0; }
+  .paymentoption .expiration {
+    width: 43.5%;
+    display: inline-block;
+    margin-right: 2px;
+    vertical-align: top; }
+  .paymentoption .cvv {
+    width: 44%;
+    display: inline-block;
+    margin-right: 25px;
+    vertical-align: top; }
+  .paymentoption .cvv + .expiration {
+    margin-right: 0;
+    margin-left: 9px; }
+  .paymentoption > .cvv:first-child {
+    margin-bottom: 5px; }
+  .paymentoption .hasIcon {
+    position: relative; }
+    .paymentoption .hasIcon input {
+      padding-left: 48px; }
+    .paymentoption .hasIcon label {
+      display: none; }
+      .ie8 .paymentoption .hasIcon label {
+        display: block; }
+    .paymentoption .hasIcon i {
+      color: #666666;
+      font-size: 21px;
+      border-right: 1px solid #f2f2f2;
+      height: 41px;
+      position: absolute;
+      top: 2px;
+      width: 30px;
+      padding: 11px 8px 0 0;
+      margin-left: 10px;
+      pointer-events: none; }
+    .paymentoption .hasIcon .cc-image {
+      display: block;
+      position: absolute;
+      right: 10px;
+      top: 10px;
+      width: 40px;
+      height: 27px;
+      overflow: hidden; }
+      .paymentoption .hasIcon .cc-image img {
+        height: 100%; }
+  .paymentoption .info-popover {
+    display: block;
+    position: absolute;
+    margin: 0;
+    right: -28px;
+    top: 11px;
+    /*NAMI-1419; was bottom: 13px;*/ }
+  .paymentoption .info-popover i {
+    font-size: 14px;
+    position: static;
+    border-right: 0;
+    height: auto;
+    margin-left: 0;
+    padding: 0;
+    top: auto;
+    width: auto; }
+
+body .btn-primary,
+body .btn-secondary {
+  white-space: normal; }
+
+body .btn-secondary {
+  display: block;
+  margin: 23px auto 0;
+  padding: 5px;
+  background: #ffffff; }
+
+.paymentbuttons {
+  text-align: center; }
+  .paymentbuttons.row .btn {
+    margin-bottom: 5px; }
+
+.extra-content > div {
+  margin: 10px 0; }
+
+footer, #footer {
+  margin-top: 20px;
+  background: #ffffff; }
+  footer .footer-menu, #footer .footer-menu {
+    font-size: 12px;
+    padding: 20px 0; }
+    footer .footer-menu .merchant ul, #footer .footer-menu .merchant ul {
+      overflow: hidden;
+      list-style: none;
+      margin: 0;
+      padding: 0;
+      text-align: center; }
+      footer .footer-menu .merchant ul li, #footer .footer-menu .merchant ul li {
+        list-style: none;
+        display: inline-block;
+        margin: 0 0 0 20px; }
+        footer .footer-menu .merchant ul li:first-child, #footer .footer-menu .merchant ul li:first-child {
+          margin-left: 0; }
+
+#globalcollectfooter {
+  color: #333333;
+  font-size: 0.8em;
+  text-align: center;
+  padding: 20px 0 10px;
+  position: relative;
+  height: 26px;
+  box-sizing: content-box; }
+  #globalcollectfooter .col-xs-24 {
+    min-height: 26px; }
+  #globalcollectfooter a {
+    position: absolute;
+    right: 20px;
+    bottom: 3px;
+    text-align: right;
+    width: 50%;
+    /*
+    @include isaac-respond-min-width(md) {
+      margin-left: 15px;
+      right: auto;
+      top: 5px;
+    }
+    */ }
+    #globalcollectfooter a span {
+      display: block;
+      margin-left: 86px;
+      overflow: hidden;
+      text-overflow: ellipsis; }
+
+#globalcollectimage {
+  margin: 0 auto;
+  width: 112px; }
+  @media only screen and (min-width: 992px) {
+    #globalcollectimage {
+      display: inline-block; } }
+
+.editMode * {
+  cursor: default !important; }
+
+#regionSelector {
+  position: absolute;
+  border: 1px solid #0093d0;
+  box-shadow: 0 0 5px #0093d0;
+  background: rgba(0, 147, 208, 0.2); }
+
+.selectedNode {
+  box-shadow: inset 0 0 5px #0093d0; }
+
+body .btn-tertiary {
+  border: 1px solid #cccccc;
+  height: 43px;
+  padding: 4px 10px 4px 0;
+  font-weight: bold;
+  font-size: 18px;
+  margin-top: 0px;
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  width: 100%;
+  text-align: left;
+  display: block;
+  margin-bottom: 0;
+  background: #ffffff;
+  position: relative; }
+  body .btn-tertiary:hover, body .btn-tertiary:active {
+    text-decoration: none;
+    background-color: #f2f2f2;
+    color: #000000;
+    z-index: 1; }
+
+#paymentoptionslist {
+  padding: 0;
+  list-style: none; }
+  #paymentoptionslist li .btn-tertiary > div:after {
+    content: "";
+    background: url(img/icons/icon-next.png) no-repeat 0 0;
+    background-size: 100%;
+    display: block;
+    width: 6px;
+    height: 10px;
+    position: absolute;
+    right: 10px;
+    top: 17px; }
+    .ie8 #paymentoptionslist li .btn-tertiary > div:after {
+      background: url(#);
+      filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='img/icons/icon-next.png',sizingMethod='scale'); }
+  #paymentoptionslist li .btn-tertiary > div {
+    width: 100%;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    margin-left: 10px; }
+    #paymentoptionslist li .btn-tertiary > div > img {
+      width: 25px;
+      margin-right: 10px;
+      vertical-align: baseline; }
+  #paymentoptionslist li .btn-tertiary .checkbox {
+    display: none; }
+
+.instructions .paymentoption .table-responsive {
+  margin-top: 10px;
+  clear: left; }
+
+@media only screen and (min-width: 768px) {
+  .instructions .paymentoption .intro h3 {
+    max-width: 83%; }
+  .instructions .paymentoption .intro img {
+    margin-top: -40px; } }
+
+.paymentoption .table {
+  border: 0; }
+  .paymentoption .table > tbody > tr > td {
+    border-top: 0;
+    padding: 10px 0 0;
+    display: block;
+    width: 100%; }
+    @media only screen and (min-width: 768px) {
+      .paymentoption .table > tbody > tr > td {
+        display: table-cell;
+        border-bottom: 1px solid #cccccc;
+        padding: 6px;
+        width: 40%; } }
+    .paymentoption .table > tbody > tr > td.important {
+      font-weight: bold;
+      border-bottom: 1px solid #cccccc;
+      padding: 0 0 10px; }
+      @media only screen and (min-width: 768px) {
+        .paymentoption .table > tbody > tr > td.important {
+          padding: 6px;
+          width: 60%; } }
+    .paymentoption .table > tbody > tr > td.barcode {
+      padding: 20px 10px; }
+      .paymentoption .table > tbody > tr > td.barcode img {
+        display: block;
+        max-width: 280px; }
+        @media only screen and (min-width: 768px) {
+          .paymentoption .table > tbody > tr > td.barcode img {
+            max-width: 700px;
+            margin: 0 auto; } }
+
+.installment-plan.table {
+  margin: 12px 0px 0px 0px; }
+  .installment-plan.table > tbody > tr > td, .installment-plan.table > tbody > tr > th {
+    border: 0px;
+    font-weight: normal;
+    font-size: 14px;
+    padding: 2px;
+    display: table-cell; }
+  .installment-plan.table > tbody > tr > th {
+    white-space: nowrap;
+    width: 60%; }
+  .installment-plan.table > tbody > tr > td.uri {
+    padding-top: 8px; }
+
+#label-installmentId {
+  font-size: 14px; }
+
+#installment-plans > .panel {
+  margin-bottom: 8px; }
+
+#installment-plans .installment-plan-title {
+  background: white;
+  width: 100%;
+  cursor: pointer;
+  border: 1px solid #EAEAEA;
+  padding: 4px; }
+  #installment-plans .installment-plan-title input {
+    margin: 0px 6px 0px 12px; }
+  #installment-plans .installment-plan-title span {
+    font-weight: normal;
+    margin-bottom: 0px; }
+
+.date-section .seperator {
+  padding: 10px 0 0 0;
+  text-align: center; }
+
+.date-section .date-input-container {
+  padding: 0; }
+
+.popover .popover-content {
+  color: #000000; }
+  .popover .popover-content > img.cvvImage {
+    width: 150px;
+    height: 92px; }
+
+#loading {
+  position: fixed;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  z-index: 10000;
+  background: rgba(255, 255, 255, 0.9); }
+  #loading .loading-inner {
+    width: 64px;
+    margin: 20% auto 0;
+    position: relative; }
+    #loading .loading-inner i {
+      margin: 20% auto 0 auto;
+      font-size: 64px;
+      color: #666666; }
+  #loading .loading-text {
+    width: 300px;
+    margin: 20px 0 0 -120px;
+    text-align: center; }
+
+body[dir=rtl] .cart .header {
+  margin-right: 0; }
+  body[dir=rtl] .cart .header .amount {
+    padding-left: 18px;
+    padding-right: 0; }
+    body[dir=rtl] .cart .header .amount .caret {
+      width: 0;
+      height: 0;
+      content: '';
+      position: absolute;
+      display: inline-block;
+      border-top: 6px solid #666666;
+      border-right: 6px solid transparent;
+      border-left: 6px solid transparent;
+      margin: 13px 4px 0 0;
+      right: auto;
+      left: 9px;
+      top: 6px; }
+
+body[dir=rtl] .cart .content h2 {
+  margin: 0 0 8px 10px; }
+
+body[dir=rtl] .cart.open .content {
+  margin-right: 0; }
+
+body[dir=rtl] .cart tfoot tr td.amount .caret {
+  margin: 10px 8px 0 0; }
+
+body[dir=rtl] #paymentoptionslist li .btn-tertiary {
+  text-align: right;
+  padding-right: 10px;
+  padding-left: 0; }
+
+body[dir=rtl] #paymentoptionslist li .btn-tertiary > div:after {
+  background: url(img/icons/icon-prev.png) no-repeat 0 0;
+  background-size: 100%;
+  right: auto;
+  left: 10px; }
+  .ie8 body[dir=rtl] #paymentoptionslist li .btn-tertiary > div:after {
+    background: url(#);
+    filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='img/icons/icon-prev.png',sizingMethod='scale'); }
+
+body[dir=rtl] #paymentoptionslist li .btn-tertiary img {
+  margin-right: 0;
+  margin-left: 10px; }
+
+body[dir=rtl] .paymentoption .expiration {
+  margin-right: 0;
+  margin-left: 2%;
+  float: right; }
+
+body[dir=rtl] .paymentoption .cvv {
+  display: block;
+  float: right;
+  margin-right: 0;
+  margin-left: 25px; }
+
+body[dir=rtl] .paymentoption .info-popover {
+  right: auto;
+  left: -28px; }
+  body[dir=rtl] .paymentoption .info-popover i {
+    border-left: 0;
+    padding-left: 0;
+    margin-right: 0; }
+
+body[dir=rtl] .paymentoption div.checkbox {
+  clear: right; }
+
+body[dir=rtl] .paymentoption div.checkbox .info-popover {
+  right: auto;
+  left: 4px; }
+
+body[dir=rtl] .paymentoption {
+  position: relative; }
+
+body[dir=rtl] .radio, body[dir=rtl] .checkbox {
+  padding-right: 20px;
+  padding-left: 0; }
+
+body[dir=rtl] .radio input[type="radio"], body[dir=rtl] .radio-inline input[type="radio"], body[dir=rtl] .checkbox input[type="checkbox"], body[dir=rtl] .checkbox-inline input[type="checkbox"] {
+  float: right;
+  margin-left: 10px;
+  margin-right: -20px; }
+
+body[dir=rtl] #globalcollectfooter a {
+  left: 20px;
+  right: auto;
+  text-align: left; }
+  body[dir=rtl] #globalcollectfooter a span {
+    margin-right: 86px;
+    margin-left: 0; }
+
+body[dir=rtl] .pull-right {
+  float: left !important; }
+
+body[dir=rtl] .pull-left {
+  float: right !important; }
+
+body[dir=rtl] .popover {
+  text-align: inherit;
+  direction: rtl; }
+
+body[dir=rtl] footer .footer-menu .merchant ul li, body[dir=rtl] #footer .footer-menu .merchant ul li {
+  margin: 0 20px 0 0; }
+  body[dir=rtl] footer .footer-menu .merchant ul li:first-child, body[dir=rtl] #footer .footer-menu .merchant ul li:first-child {
+    margin-right: 0; }
+
+#paymentButtons {
+  overflow: hidden;
+  margin-bottom: 5px;
+  clear: both; }
+
+.show-js {
+  display: none !important; }
+  .js .show-js {
+    display: inherit !important; }
+
+.postMessage {
+  display: none; }
+
+/* print overrides */
+@media print {
+  html {
+    overflow: hidden; }
+  #header, #footer, #globalcollectfooter {
+    display: none; }
+  .paymentoptions .paymentbuttons {
+    display: none; }
+  label.hidden-xs {
+    display: inline-block !important; }
+  .info-popover {
+    display: none !important; }
+  .form-control::-webkit-input-placeholder {
+    /* WebKit browsers */
+    color: transparent; }
+  .form-control:-moz-placeholder {
+    /* Mozilla Firefox 4 to 18 */
+    color: transparent; }
+  .form-control::-moz-placeholder {
+    /* Mozilla Firefox 19+ */
+    color: transparent; }
+  .form-control:-ms-input-placeholder {
+    /* Internet Explorer 10+ */
+    color: transparent; }
+  .cart .header {
+    display: none !important; }
+  .cart .content {
+    display: block !important; }
+    .cart .content table {
+      border: 1px solid #999999;
+      width: 100%; }
+      .cart .content table tr td {
+        border-bottom: 1px solid #999999; }
+      .cart .content table tfoot tr td.amount .caret {
+        display: none !important; }
+  .paymentoption .table > tbody > tr > td {
+    display: table-cell;
+    border-bottom: 1px solid #cccccc;
+    padding: 6px;
+    width: 40%; }
+  .paymentoption .table > tbody > tr.important {
+    padding: 6px;
+    width: 60%; }
+  .paymentoption .table > tbody > tr.barcode img {
+    display: block;
+    max-width: 700px;
+    margin: 0 auto; }
+  .paymentoptions form.instructions {
+    width: 100%;
+    max-width: 100%; }
+  .instructions .paymentoption .table-responsive {
+    overflow: hidden; } }
+
+.btn-link {
+  color: #2869ac; }
+
+#precarttext, #postcarttext, #prefootertext {
+  display: none; }
+
+.form-control.euro {
+  width: 65%;
+  display: inline; }
+
+.form-control.cent {
+  width: 20%;
+  display: inline; }
+
+.form-group:not(.has-error) .error {
+  display: none !important; }
+
+.form-group.has-error > .error:nth-child(1n+4) {
+  display: none !important; }
+
+.transparent {
+  color: transparent; }
+
+#paymentProductName {
+  margin-top: 3px; }
+
+#globalcollectimage {
+  position: relative;
+  z-index: 1; }
+
+#shoppingcart.priceOnly .header {
+  display: block !important; }
+  #shoppingcart.priceOnly .header .caret {
+    display: none !important; }
+
+#shoppingcart.priceOnly .content {
+  display: none !important; }
+
+#shoppingcart.full .header {
+  display: none !important; }
+
+#shoppingcart.full .content {
+  display: block !important; }
+  #shoppingcart.full .content .caret {
+    display: none !important; }
+
+html {
+  position: relative;
+  min-height: 100%; }
+
+body {
+  /* Margin bottom by footer height */
+  margin-bottom: 160px; }
+  body.minimal {
+    margin-bottom: 0; }
+
+#footerWrapper {
+  position: absolute;
+  bottom: 0;
+  left: 0;
+  width: 100%;
+  /* Set the fixed height of the footer here */
+  height: 160px; }
+
+/* rpp-editor styling override */
+body.isOpenedInEditor {
+  overflow-y: scroll; }
+
+/* Javascript specific styling*/
+html.js .cart .header .amount .caret {
+  display: inline-block; }
+
+#cobrand {
+  overflow: hidden; }
+  #cobrand .toggle-cobrand {
+    float: right;
+    text-decoration: underline;
+    margin-top: 6px;
+    margin-bottom: 9px;
+    cursor: pointer; }
+  #cobrand .caret {
+    display: inline-block;
+    width: 0;
+    height: 0;
+    margin-left: 2px;
+    vertical-align: middle;
+    border-top: 4px solid;
+    border-right: 4px solid transparent;
+    border-left: 4px solid transparent; }
+  #cobrand .cobrand-close {
+    text-decoration: none;
+    background: url(img/icons/icon-close.png) no-repeat 0 0;
+    width: 18px;
+    height: 18px;
+    border: 1px solid transparent;
+    float: right;
+    cursor: pointer; }
+    #cobrand .cobrand-close:hover {
+      text-decoration: none;
+      border: 1px solid #cccccc; }
+  #cobrand .cobrand-intro {
+    float: left; }
+  #cobrand .cobrand-wrapper {
+    margin-top: 4px;
+    margin-bottom: 9px;
+    padding: 10px;
+    background-color: #f2f2f2;
+    border: 1px solid #cccccc; }
+    #cobrand .cobrand-wrapper h2 {
+      margin: 0 0 8px; }
+    #cobrand .cobrand-wrapper h3 {
+      margin: 0 0 5px; }
+    #cobrand .cobrand-wrapper p {
+      margin: 0 0 5px 0; }
+    #cobrand .cobrand-wrapper ul {
+      margin: 0; }
+  #cobrand #paymentoptionslist li .btn-tertiary > div:after {
+    background: none;
+    width: 12px;
+    height: 10px; }
+  #cobrand #paymentoptionslist li .btn-tertiary.active-cobrand > div:after {
+    background: url(img/icons/icon-check.png) no-repeat 0 0;
+    background-size: 100%; }
+
+body[dir=rtl] #cobrand .cobrand-close {
+  float: left; }
+
+body[dir=rtl] #cobrand .cobrand-close-wrapper {
+  float: left; }
+
+body[dir=rtl] #cobrand .cobrand-intro-wrapper {
+  float: right; }
diff --git a/full-angularjs/styles/forms.css b/full-angularjs/styles/forms.css
new file mode 100644
index 0000000..eb15a4d
--- /dev/null
+++ b/full-angularjs/styles/forms.css
@@ -0,0 +1,43 @@
+.ng-invalid ~ .error {
+    display: block;
+    color: #ff0000;
+}
+.ng-untouched ~ .error, 
+.ng-valid ~ .error, 
+.error-length, 
+.error-luhn, 
+.error-expiration-date, 
+.error-regexp, 
+.error-required,
+.error-boleto-bancario-requiredness {
+    display: none;
+}
+.doValidate .ng-invalid-length ~ .error-length {
+    display: block;
+    color: #ff0000;
+}
+.doValidate .ng-invalid-luhn ~ .error-luhn {
+    display: block;
+    color: #ff0000;
+}
+.doValidate .ng-invalid-expiration-date ~ .error-expiration-date {
+    display: block;
+    color: #ff0000;
+}
+.doValidate .ng-invalid-regexp ~ .error-regexp, 
+.doValidate .ng-invalid-email-address ~ .error-regexp, 
+.doValidate .ng-invalid-regular-expression ~ .error-regexp {
+    display: block;
+    color: #ff0000;
+}
+.doValidate .ng-invalid-required ~ .error-required {
+    display: block;
+    color: #ff0000;
+}
+.doValidate .ng-invalid-boleto-bancario-requiredness ~ .error-boleto-bancario-requiredness {
+    display: block;
+    color: #ff0000;
+}
+.doValidate .error-cc {
+    color: #ff0000;
+}
diff --git a/full-angularjs/styles/img/bg-gc.png b/full-angularjs/styles/img/bg-gc.png
new file mode 100644
index 0000000000000000000000000000000000000000..24a856a30ba41cb62f4d3eafc2fbf507ef818173
GIT binary patch
literal 12561
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�t9M7Mz
z7Fzq0phKwhe;dM&Ng6m?%$^5hh=uOayV?*@Ftn-r7;02$8h;eZ6-Od<(qw2@{&>fw
zmOOa*r*
n-vkWy_YsqVV%J6wI&^#jQst<7FR+?nP$5>W;vAs!
z3`&Chf*B5M{#$bX&Y`<)zfTk&w7>WCjNAKk>(4w%CpqO_{_|V$+V{j|v?&;9&^dx$f|pIY!O@{=e4REq?aNguQQU7R)m9
z)3Ii{yvO;yhM~U6DXzAkS`fU$l&km8(jz~MM0eee<#f0g
s|4DHs6UU60f|>W^`%nI|^0~6APV%u7Q*4FFC7`Vgp00i_>zopr04a-$!~g&Q

literal 0
HcmV?d00001

diff --git a/full-angularjs/styles/img/ccimages-s015f8354a0.png b/full-angularjs/styles/img/ccimages-s015f8354a0.png
new file mode 100644
index 0000000000000000000000000000000000000000..d09eed21a73db4b1dc067976035adcca7f096012
GIT binary patch
literal 75230
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 literal 0 HcmV?d00001 diff --git a/full-angularjs/styles/img/icons/icon-check.png b/full-angularjs/styles/img/icons/icon-check.png new file mode 100644 index 0000000000000000000000000000000000000000..a5e4a7808bdcd20ffba11698fa8c378a40038769 GIT binary patch literal 1166 zcmaJ>U1%It6rSxiYX~N;kyfJEUZ;h&;?B&S+1cz2+3rqeHqDZ52;0R*YE5TnZn8r< zKbg7d?gkO77E_^;J_uS$F)y`<2%#WIL0ecs!B(t3)#AeW=DtNk6cv5mDo^6c;(pn1ZAK3uc6_NA|A zV3`^EpjhOJo{Fm0=z@<9ER2_pg;_%~>Fi!GRF_Er8(|&P?W0a0*E955T$$LRo29`T z1kYyZ2cjm66F_x+1Vkp4Fd&3rP-38%7I^VRz;jS!If;c_f`c;TWS#@lExE|OE+KnPDW9z!dLWW~)JFIIB9pDmrC}Tr(P;PjLEup}j_YE?S z=^Y(1>D{9fg+QW4)?8!WMh-4$8Jc()(=uf>B}h^_HO!}y5`_8Gu*gG2gM!Epr$^F) z(BT%G0PBu{I$Y}^S9v5?R(+&n*Dt&7(a!WHsxEees_Ow&1-lPgj_KBdJz;0tLXmGB zL*|I@+F-3Uvb90_baF7QK~BhXd7elYlyow!DS3?>6oga?igcT6ZcuicoBUrcOT@6@ zT>mrYj*Bc$Xs&N9xvcL!a>%m#WUG(-aJflQk!V3v%JmzS{bOSW=-*A-V0%b@%Q!XYQ-&?d?B->;?O^>Z{a=zsCPq+HAevB@X=7+t?|B z)oAW!-@Av*tK8QpcQ$%T#lLsIaDVIJP3Kp;;@@{wrog#qbNg~DyPP_A<$Y=?`YRLv xc+(vQTsv_?eroF0l~``Bv2AgxHKtIJ81;q5?Ogh@|8)356!PQRXTwL{{1;DBd1(Lu literal 0 HcmV?d00001 diff --git a/full-angularjs/styles/img/icons/icon-close.png b/full-angularjs/styles/img/icons/icon-close.png new file mode 100644 index 0000000000000000000000000000000000000000..b4d9ade86b9a5a440905697bc9ff121fbe6b19ac GIT binary patch literal 1155 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%!-*I5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83 zmzLNn0bL65LT-VtFWlg~VrW1CgG|37u|VHY&pf(~1RD?6IsxA(xEJ)Q4 zN-fSWElLK)N18HBGcfG%TLe-Fbd8luesXDUYF>$_i>(q+L@y;X#mdsq)zZM!$kouo z1Q?30W|mIQZkCqDF0O7CrY26VZZN%`dBr7(dC93Ty_pETE_n4?ITxiSmgExAZgT^Woi}e;J<`yo7 z2F9)iu0}wo8#`Ki(^Q|tt*o^ay2E0v<5FSJ)#)Z5~nh;Nh(Tt z$+ImhFUl=EwrtbRjEpU=8i&+5V-_hMQs1CF$FWXFTIx-E|NQE6Un@Q?5;K_R_x`5l@AhSjSyNutW0P~yQ4K*woUo;C`IWVW(!}i3l8=q#Ys^rIT-?GY{ zv`2yYMpIhwe=84m_63dBGd^Bh@%lcCD{v+#ko|V&|3Xf`Zd8? ub^Qz`8^1@~^Zf57-?#s}rIn+K(|}?1VvoCTl$b$941=eupUXO@geCw&OoGn< literal 0 HcmV?d00001 diff --git a/full-angularjs/styles/img/icons/icon-date.png b/full-angularjs/styles/img/icons/icon-date.png new file mode 100644 index 0000000000000000000000000000000000000000..afe2940d171d09458bc23193437b5aaf35406a03 GIT binary patch literal 1353 zcmeAS@N?(olHy`uVBq!ia0vp^=0F_6!3HGNcCX(Aq$EpRBT9nv(@M${i&7aJQ}UBi z6+Ckj(^G>|6H_V+Po~;1Ffc1-hD4M^`1)8S=jZArg4F0$^BXQ!4Z zB&DWj=GiK}-@RW+Av48RDcsc8z_-9TH6zobswg$M$}c3jDm&RSMakYy!KT6rXh3di zNuokUZcbjYRfVk**jy_h8zii+qySb@l5ML5aa4qFfP!;=QL2Keo~drKfsvttxuu?= zsfnebp^k!)fuXU!p@F`UrLLi&m5I5Pp_u{{C;@FNN=dT{a&d#&1?1T(Wt5Z@Sn2DR zmzV368|&p4rRy77T3YHG80i}s=>k>g7FXt#Bv$C=6)VF`a7isrF3Kz@$;{7F0GXJW zlwVq6s|0i@#0$9vaAWg|p}_Kj1}<)fhOWjI7UssTmgcS| zW+q0C=EfEWsc$#UuO@g4Jgp>Xu5 zxx%B<0xU~sbLi=^UKFYiUnk%cy*WZ8JtJXvv z)k(hI6Z(LOPsXC)!GT6*b~t0*lO3xbTU_3D-YaX@Kh2+>Mr|o^*V`vG)-Qg&Yv*&K36jJFj%>yXxtzzb9waPbvML zz!g66j@PVx-?VIlN9&F#U+*0=R36^#0ksr6t zebVxJ=8S1`>y5gt)CyufqbFTotC)3X+v{Di!Sj#se~k*Zj}JA9OJ{DZo%!O9-iy69 ta@Q@|6H_V+Po~;1Ffc1-hD4M^`1)8S=jZArg4F0$^BXQ!4Z zB&DWj=GiK}-@RW+Av48RDcsc8z_-9TH6zobswg$M$}c3jDm&RSMakYy!KT6rXh3di zNuokUZcbjYRfVk**jy_h8zii+qySb@l5ML5aa4qFfP!;=QL2Keo~drKfsvttxuu?= zsfnebp^k!)fuXU!p@F`UrLLi&m5I5Pp_u{{C;@FNN=dT{a&d#&1?1T(Wt5Z@Sn2DR zmzV368|&p4rRy77T3YHG80i}s=>k>g7FXt#Bv$C=6)VF`a7isrF3Kz@$;{7F0GXJW zlwVq6s|0i@#0$9vaAWg|p}_>tBg9ad}A-iZmzTbm*} zIy!onwzirr`^bL6tylk=^~dfO*1I_q-{kCJZl9SbUr?5|Z|+PT&WLHLKP+c1`?>DZ zf`|X7l&>&cr4rbpB(jjhRl`ZJD*%bPWQs`7@yB`VIUDB3?oBaz*)8^xMf(BU3fa9f zC&ZpkuMjX^;1@nIY6IiDgIXNY_pPfGFKAQ>OEArTz-SbB*X7FPy$qZI`4;)B%^LU$ zcxHOebqVqQaxz$diTMYnxP!_+Cag;p_i|ho&OR~EAbs))&+nYx+*>`jOEF(piqP4- zuKC22wc57LtQ&ZYwuxD>{$1tmxmVz#+eIzixNe@?F7FP!lfPcy6!|i%b;+*yBiR%6 zZU^5l+{JiLS#6VX^oAE7qf|1arMIizd%kLgjFHU`#+An&MyxyXJH_()B9EzEEJ+(9 zj6W5wJl|Z_8L>7Y`s`w_9p^b_Oz2!XYx&zoVasj(C&IQFrp#Iv+7XmBZ_2NydrY^V zW;(f?b?P~7K^_Y?jYXXvQA|!zyG?g@7jHi>X-cR`^`xWI-$y;Uu<)JqM8@`A`7T$~ zjx3rY9Q1u@M^!Svm!(qaeYdsDvd7z_1-++j3>1GYqI-D#tq6-pv*!ZCzvFqJcCeqK zPO@>FnEkTPBNaXyR>tXumu){y&Bl?VN47Kt3S;@v>>Y%dJ)78&qol`;+ E0Iit|=>Px# literal 0 HcmV?d00001 diff --git a/full-angularjs/styles/img/icons/icon-next.png b/full-angularjs/styles/img/icons/icon-next.png new file mode 100644 index 0000000000000000000000000000000000000000..12b58a990bc541b81178befe8eaecbd3f8e539ee GIT binary patch literal 1161 zcmeAS@N?(olHy`uVBq!ia0vp^+(0bE!3HFIOI1pNlw^r(L`iUdT1k0gQ7VIDN`6wR zf@f}GdTLN=VoGJ<$y6H#24=;~kcg59UmvUF{9L_6kQ%*;+ybC(1_m4Zih{)C?9>v4 zq}24xJX@vryZ0+8WTx0Eg`4^s_!c;)W@LI)6{QAO`Gq7`WhYyvDB0U7*i={n4aiL` zNmQuF&B-gas<2f8n`;GRgM{^!6u?SKvTcwn`Gu2HtFfvpyx70H< zHL)}_)KM@pFf`UTG|)G))HO7;GBLL@G*f^AC7^9ZDQQ+gE^bh}fIM5JjFOT9D}DX) z@^Za$W4-*MbbUihOG|wNBYh(yU7!lx;>x^|#0uTKVr7^KE~&-IMVSR9nfZANAQKal z@=Hr>m4GgVcp0+w{G(ayiGsVin#N5Kg(7@Q$z}3jm(AC({!oG&eP`1g19yq1ObbUQkNNEdbi=l3J8mmYU*Ll%J~r_OVqaZnqfX zG!Lpb1-Dy_aO%|uIz}H9uSoF>69Oh45EGtifgE_cPt5}+_99@a_A%dI3(OJ!JY5_^ zDsCnH`TyVExvFXx4>R-OC0Fb#-}{d|(jJX8vfbu#G)yN3*Y?ut0u` z77L@M!adHdoU0!xDg5hGS;lhYcB7Pw;T*=&&H5Ae@^wT`c;d&nQTu}D`~Z<=h5%=i z2~kaHH|i9=F=hQ|TqLndk=?`B?eYf6j^+lbe+x9)vQ{t$^=3#-V=B~XOIp#!>7XU= zTOlRP{IQ{xvwLM}gikEvk;o$z1=?4d_j9n`bt1P0K-f)9;#Rp}dhMzw_KmX=X z#VoK{S#u9t@80qknTz>5EGHg$$Gp)x;9+(S=SlgF_f9|0H{Re~@qzQ&7ay-j>>LIR Y&)SPN9GqKo15`M8y85}Sb4q9e08QF|lK=n! literal 0 HcmV?d00001 diff --git a/full-angularjs/styles/img/icons/icon-person.png b/full-angularjs/styles/img/icons/icon-person.png new file mode 100644 index 0000000000000000000000000000000000000000..4578cb7258b4af662ed4c5370c912691c00f976a GIT binary patch literal 1495 zcmeAS@N?(olHy`uVBq!ia0vp^mOvcB!3HEPismx{DajJoh?3y^w370~qErUQl>DSr z1<%~X^wgl##FWaylc_cg49tp|ArU1JzCKpT`MG+DAT@dwxdlMo3=B5*6$OdO*{LN8 zNvY|XdA3ULckfqH$V{%1*XSQL?vFu&J;D8jzb> zlBiITo0C^;Rbi_HHrEQs1_|pcDS(xfWZNo192Makpx~Tel&WB=XR4cQU}UIZZmDNz zYGP?h+i#(Mch>H3D2mX`VkM*2oZxQ#zd*s+SwSN_GcP5- zyjT;g+}GF2Gq1QLF)umQ)5TT^XnMv>2~2MaLaz%>y`YqkTL84#CABECEH%ZgC_h&L>|?7;+-`Bi zX&zK>3U0SJ;nb@Sbc{YIUXkJ%CIn18ASOK30y*$>pPC0u>_xy-eSUhLGXn#YkEe@c zNX4x;b9}X35=D-`PwhH(NXR=i(d(n^p0z3IXOAtN60~NShBfEXD>cmC(n|#58+toF zePY!)vqnPd|KZ4p-j8>zjn7N|58f}i^SMoW-QAtV?`?$>SB7v&nR2x{1nSrvC4(|Vk+(q`8{!aceP!g z)Xe!s`b+F5)5bd2`>OszFUsHSeqwo}DDz!q)wZg~59&tn>|6f8)4h9Lt+eaK zinXe#H@5J8%PRTf(Qn(4*Bqj&a=EJAFueUd+smE&7fVc4o%eREJI&+fT=m|`WX-fE zIuf5B?6F<8eyP@^n+N8f2y+hFXY%%w$0qLlo6l6ld8GgFU-I&dSumReORRz7@>ajw h|MOn&KYh?Vz|glPZ54}ptv0Br^>p=fS?83{1OOM3 literal 0 HcmV?d00001 diff --git a/full-angularjs/styles/img/icons/icon-prev.png b/full-angularjs/styles/img/icons/icon-prev.png new file mode 100644 index 0000000000000000000000000000000000000000..b7e5bd0a5237c2c93f9b8a53e145097faab97d1d GIT binary patch literal 1263 zcmeAS@N?(olHy`uVBq!ia0vp^+(0bE!3HFIOI1pN6k~CayA#8@b22Z19F}xPUq=Rp zjs4tz5?O(K&H|6fVg?4j!ywFfJby(BP*AeOHKHUqKdq!Zu_%?nF(p4KRlzeiF+DXX zH8G{K@MNkD0|T>SW=KRygs+cPa(=E}B1ny1MQ#C5Hv@x>eMLcHa&~HoLQ-maW}dCm z``!DM6f#q6mBLMZ4SWlnQ!_F>s)|yBtNcQetFn_VQY3^$8yFcXm|N-@nwnS|8tNz* z85kPt8ye^vS?U@ZTA7$z8Ja0TffCTRqLehNAQv~NT|l0#QbtKhft9{~d3m{Bxv^e; zQM$gNrKP35fswwEkuFe$ZgFK^Nn(X=Ua>OF1ees}+T7#d8#0MoBXEYLU9GXQxBrqI_HztY@Xxa#7Ppj3o=u^L<)Qdy9yACy|0 zUs{w5jJPyqkW~d%&PAz-CHX}m`T04pPz=b(FUc>?$S+WEc2>{`&&*57FE7>vEBE!a z^2{qPNz6-5^>ndS0ve!~nVDi`VPbCKVrXFOYT#;QXy|I}XklXE;^^vPU~X(|W@cy# z)9aF-T$-DjR|3KOgX0rJq%nSKHCHcL8%QOB4%xP{xc0 zT;E#yo>ceo9o)Ctd#Z`Ab_KubR^c6L6|b{g|NUf)eG&ek??LZsTcK&Zf4DifPmG`b zxU04#_U*;uXYHx4(yv^|b1(U2)&CRH3>5rB*tSiu3;b_ZcUa1Pqp*qFL_@WiOi!+5 VZ@;ns7bB=Z@pScbS?83{1OOnUtl0nn literal 0 HcmV?d00001 diff --git a/full-jquery-handlebars-systemjs/.gitignore b/full-jquery-handlebars-systemjs/.gitignore new file mode 100644 index 0000000..b64d657 --- /dev/null +++ b/full-jquery-handlebars-systemjs/.gitignore @@ -0,0 +1,4 @@ +dist/ +node_modules/ +npm-debug* +package-lock.json \ No newline at end of file diff --git a/full-jquery-handlebars-systemjs/.npmrc b/full-jquery-handlebars-systemjs/.npmrc new file mode 100644 index 0000000..9cf9495 --- /dev/null +++ b/full-jquery-handlebars-systemjs/.npmrc @@ -0,0 +1 @@ +package-lock=false \ No newline at end of file diff --git a/full-jquery-handlebars-systemjs/README.md b/full-jquery-handlebars-systemjs/README.md new file mode 100644 index 0000000..ca7e5c3 --- /dev/null +++ b/full-jquery-handlebars-systemjs/README.md @@ -0,0 +1,112 @@ +# jQuery / Handlebars Connect Client SDK Example + +🚨 Please note that this example is only compatible with SDK versions up to major version 4. +To learn how to work with the SDK version 5+, please refer to the documentation +on https://docs.connect.worldline-solutions.com/documentation/sdk/mobile/javascript/. + +### What is it? + +This application is a jQuery / Handlebars implementation of an Worldline Connect checkout process. +You can use this application as a base for your own jQuery integrated Worldline Connect powered payment solution. +It offers all features of the [Worldline Connect Responsive Payment Pages (RPP)](https://docs.connect.worldline-solutions.com/documentation/hosted-payment-pages/), including +* payment product selection +* payment product detail pages +* co-branded cards support +* payment product grouping +* payment product switching based on IIN Lookup + +and more. +The [Worldline Connect JavaScript Client SDK](https://github.com/Worldline-Global-Collect/connect-sdk-client-js) is used for all communication to the Worldline Connect Server API and crypto. +A simple webserver is included to make this application easy to install and run in development environments. +See the [Worldline Global Collect Developer Hub](https://docs.connect.worldline-solutions.com/documentation/sdk/mobile/javascript/) for more information on how to use the Worldline Connect Client API. + +### How to install + +Make sure you have installed [Node.js](https://nodejs.org/en/); the LTS version is recommended. Run + +```bash +npm install +``` + +### How to start the application + +Run the following command to start a webserver on `localhost` at port `3000` with [browsersync](https://www.browsersync.io/). +This will also start a watcher for the [sass](http://sass-lang.com/) files that auto compile to CSS; after each change the page is automatically reloaded for you on all connected devices. + +```bash +npm run start +``` + +When the webserver has started it will automatically load a page in which you have to provide details about the Worldline Connect client session and the payment details. This page is for example and development purposes only. +Notice that the URL contains the `dev-` prefix indicating is a development page. In your production application this information is used to initialize the application. +The final page of the payment journey has a `dev-` prefix as well and contains the encrypted string containing all information that you need to send to Worldline Connect to for-fill the payment. + +### How to start the payment process + +Create a client session identifier and a customer identifier, which the Client API needs for authentication purposes. +These can be obtained by your e-commerce server using the [Server SDKs](https://docs.connect.worldline-solutions.com/documentation/sdk/server/) or directly +using the [Server API](https://apireference.connect.worldline-solutions.com/s2sapi/v1/en_US/index.html). +Use this information along with the clientApiUrl and assetUrl of the Client API you want to connect to and the payment details to start the process. +If you incorporate this into your production process all this information should be used to initialize the payment process. + +### In depth + +This application uses the following key frameworks and libraries which are managed by npm: +* jQuery +* Handlebars +* Systemjs +* Twitter Bootstrap +* DigitalBazaar Forge +* Worldline Connect Client SDK + +### Other npm commands + +| Command | Description | +|:----------------------|:---------------------------------------------------| +| `npm run build:sass` | builds all css files; once | +| `npm run browsersync` | starts the webserver with browser-sync | +| `npm run postinstall` | automatically run after install (clean&build:sass) | +| `npm run watch:sass` | watch sass changes | + +### Folder structure + +``` ++-- src +| +-- js +| -- systemjs.config.js - config file for the systemjs module loader +| +-- app +| -- cards.js - (credit) card specific payment page with all enrichements used for card payments +| -- dev-start.js - logic for holding demo session credentials +| -- dev-success.js - logic for printing the encrypted payment blob on screen +| -- formatter.js - jQuery plugin to format / mask input files +| -- helpers.js - collection of helper functions +| -- paymentitem-detail.js - logic for the paymentitem detail page +| -- paymentitem-selection.js - logic for the paymentitem selection page +| -- validate-defaults.js - defaults for the jQuery validator +| +-- html +| -- cards.html - html page with handlebars templates specific for the (credit) card paymentproducts +| -- dev-start.html - html page for setting up the demo session credentials +| -- dev-success.html - html page for showing the encrypted payment blob +| -- dev-template.html - base html page (used to create other pages) +| -- paymentitem-detail - html page with handlebars templates for the paymentitem details +| -- paymentitem-selection - html page with handlebars templates for the paymentitem selection +| +-- styles +| -- sass files for creating the stylesheet ++-- global +| +-- images +| -- loader.png - loading spinner +| -- logo.png - example logo ++-- node_modules +| ... folder containing all node dependencies; run npm install to get the dependencies ++-- fonts + -- icons +| ... folder containing the icon fonts used by the app ++-- dist +| +-- styles +| -- base.css - the compiled css file; use npm run build:sass to compile this file +``` + +### Dev- + +Files prefixed with `dev-` are only used for demo purposes; they include an interface to enter the sessionDetails and pages to display the encrypted blob. +Full implementations hve the S2S SDK provide the sessionDetails and use the S2S SDK to send the encrypted blob to the Worldline Connect servers. diff --git a/full-jquery-handlebars-systemjs/fonts/icons/icons.eot b/full-jquery-handlebars-systemjs/fonts/icons/icons.eot new file mode 100644 index 0000000000000000000000000000000000000000..31decc27edfb8322203a8dae43166149f4d1f9ec GIT binary patch literal 3096 zcma)8%Ws@l6+h?R?>@f!z2-d=$8~2sex!Ch9*FdeezY+pLb_qs#)RHJE`QBmO?AA}2_KLOp?+kNYRO7sP2*iiG*> zm4p4;cMvBa`i_^A6vT(5Alv5G!FhGGeo3du@Axz@!afOoqE9s+KgJ&)!yDW@rQm7G zKb+sOf_=TTLIIt_>c~Qd?Wy^xe*B-ukHI70l;iyPuM@$@A{XGr#L&X=#|-a#^L$SJ z|GXv~9rOFNMl{;?*hH?xn({(zH5qewEJ!O1LzU zCJF)*q%SQky_5n8A|sO|Vt|(E=J^HY-}1uw&6Mx5i(FKhEM(QH)@PSzXP3`vU9Dz? z$qEFHMXkNmXe_mBIEFxa75E|IIz!(?WNRIPSVXllC02Wga7y}R9qjonx!zja0(%N# zMA(tJ<|Klyr@%X6ogcQ&Z7(ivpKJLwIn}5~K^Quf)JslCC3UFf;O^vde|EONJShSl zNTaPx8bv3Bu%&XvdBO46gI{waC50>16YWA9MD@n0#H)Efu2L>p7J^-|kw~kJgj3-q z{<}?($IMmZsTspzn2-u+T4;)eiwM7cabk}t%uK1AN@oH$MoMN z6_rI!#oT;HY-~<%bT?LdYg;_B_Fr@488_0No|~R)&(AHe_Lr4g=RPXBrmLo|r^ML3 ztoNq4hm;tGBGy* ztp&##l}g;Zl%WY_;q>Wx9F~zwS}E8BQVJDlmI6Lhm_{bBLU;*F7ObR#C=j4zAVQa# zuvn`m!YCs=U#5Ywh|el3vc^OeTU#d-;($MV5x59gxiodQTCO30$mt*oopgm_VpVKI zfxvi);SFX=$Y6LFqyh(Fl7(TlemXT-mYEl&wP9ehG&3em5*=5HF(Shz9)JXKR&uUZ zZ^UtAc|tG zlO!=nR8(JL(lpU&qh1NaEP(++&kgV$L=eD%6nRUKw1c`jLR|$kNt;CFYHPjqBDXg? za(!Gy$R&xac!5{PtQ~MeZ;MehDqKuX*jI@rd;s7DI=Hf)u)mfulZe+R}ojTiO z`uy{so;f3w4V8hO*H_Lc!3*W)nQFfu*Go}Us>l6)^-Qyjh=#rB0oGYsAas3hSKI6P zh>xg2^Rz)1sZXyUmezA(P%X5b7r2#Q6f`>G zWp4R4)Sg{M=ofkX;)jDBhy1ch(ecq38|?6rM7J6A(H|rq4R$=m4?HzEXg2%#kB>}( zh>yos+;pYHG`&){o15nbhld{D>F0nm2*UqRKE${FCEdrDe$q|G%_HxZqvnDBlZq7( zSbRU2o6Z}CKiHE7lsBWi>vo_qZXENvBhXvc%Q&~kbDJqyJrGJOXLnIjz(e2sziRG$0NN97x>eNh8YyfBo~phy%th!6ql-&Zu;1W-!@xvQsL;wR0trzVA=;Rf*qRZ)Frl*=6_pzp)OZqyCNbC) z?Zw}KR)fz>!5L=b3MNcrh*X@0_=Nahk;7-*+28#z`^uLT4d=e!Kf2%Zg7J!M{TQU5 zAcg=tKZp1v@PPNoQ%?F9rpPDYh0tl@>EfBdvooSSA9)0Dm{q3e$Mh#r6IaE%GM0~W zuMzztubJ^?x$^&BDZMw^n=x9B;}F1K9q}dbnGqfUzdXVf2G4YaYckXu;SRIP6+a6F zAvoUW5Fh#+;zOT9eCTtC4}A`C4cqf0+o8{s!|d~i-V-`+T-o2--@o + + +Generated by IcoMoon + + + + + + + + + + + + + \ No newline at end of file diff --git a/full-jquery-handlebars-systemjs/fonts/icons/icons.ttf b/full-jquery-handlebars-systemjs/fonts/icons/icons.ttf new file mode 100644 index 0000000000000000000000000000000000000000..0e0a402a5eb78cf5c4518843980b7553e6b95a1c GIT binary patch literal 2932 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 Y&)SPN9GqKo15`M8y85}Sb4q9e08QF|lK=n! literal 0 HcmV?d00001 diff --git a/full-jquery-handlebars-systemjs/global/images/icon-prev.png b/full-jquery-handlebars-systemjs/global/images/icon-prev.png new file mode 100644 index 0000000000000000000000000000000000000000..b7e5bd0a5237c2c93f9b8a53e145097faab97d1d GIT binary patch literal 1263 zcmeAS@N?(olHy`uVBq!ia0vp^+(0bE!3HFIOI1pN6k~CayA#8@b22Z19F}xPUq=Rp zjs4tz5?O(K&H|6fVg?4j!ywFfJby(BP*AeOHKHUqKdq!Zu_%?nF(p4KRlzeiF+DXX zH8G{K@MNkD0|T>SW=KRygs+cPa(=E}B1ny1MQ#C5Hv@x>eMLcHa&~HoLQ-maW}dCm z``!DM6f#q6mBLMZ4SWlnQ!_F>s)|yBtNcQetFn_VQY3^$8yFcXm|N-@nwnS|8tNz* z85kPt8ye^vS?U@ZTA7$z8Ja0TffCTRqLehNAQv~NT|l0#QbtKhft9{~d3m{Bxv^e; zQM$gNrKP35fswwEkuFe$ZgFK^Nn(X=Ua>OF1ees}+T7#d8#0MoBXEYLU9GXQxBrqI_HztY@Xxa#7Ppj3o=u^L<)Qdy9yACy|0 zUs{w5jJPyqkW~d%&PAz-CHX}m`T04pPz=b(FUc>?$S+WEc2>{`&&*57FE7>vEBE!a z^2{qPNz6-5^>ndS0ve!~nVDi`VPbCKVrXFOYT#;QXy|I}XklXE;^^vPU~X(|W@cy# z)9aF-T$-DjR|3KOgX0rJq%nSKHCHcL8%QOB4%xP{xc0 zT;E#yo>ceo9o)Ctd#Z`Ab_KubR^c6L6|b{g|NUf)eG&ek??LZsTcK&Zf4DifPmG`b zxU04#_U*;uXYHx4(yv^|b1(U2)&CRH3>5rB*tSiu3;b_ZcUa1Pqp*qFL_@WiOi!+5 VZ@;ns7bB=Z@pScbS?83{1OOnUtl0nn literal 0 HcmV?d00001 diff --git a/full-jquery-handlebars-systemjs/global/images/loader.png b/full-jquery-handlebars-systemjs/global/images/loader.png new file mode 100644 index 0000000000000000000000000000000000000000..e09284724cfe29651de3556822e2a842b1ceda83 GIT binary patch literal 77087 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℞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 literal 0 HcmV?d00001 diff --git a/full-jquery-handlebars-systemjs/index.html b/full-jquery-handlebars-systemjs/index.html new file mode 100644 index 0000000..c75032d --- /dev/null +++ b/full-jquery-handlebars-systemjs/index.html @@ -0,0 +1,16 @@ + + + + + + + + Worldline Connect SDK Client JavaScript jQuery example + + + + + redirecting ... + + + diff --git a/full-jquery-handlebars-systemjs/package.json b/full-jquery-handlebars-systemjs/package.json new file mode 100644 index 0000000..2f221a1 --- /dev/null +++ b/full-jquery-handlebars-systemjs/package.json @@ -0,0 +1,31 @@ +{ + "name": "connect-sdk-client-js-example-jquery", + "version": "1.14.0", + "description": "", + "private": true, + "main": "index.html", + "scripts": { + "start": "concurrent \"npm run watch\" \"npm run browsersync\" ", + "build:sass": "node-sass -o ./dist --include-path node_modules/bootstrap-sass/assets/stylesheets/ src/", + "browsersync": "browser-sync --server --port 3001 --watch --files='./**/*.{html,htm,css,js}' --ignore 'node_modules'", + "postinstall": "npm run build:sass", + "watch:sass": "npm run build:sass && node-sass -o ./dist -w src/ --include-path node_modules/bootstrap-sass/assets/stylesheets/", + "watch": "npm run watch:sass" + }, + "author": "", + "license": "ISC", + "dependencies": { + "bootstrap-sass": "3.4.1", + "connect-sdk-client-js": "^4.0.1", + "handlebars": "^4.7.7", + "jquery": "^3.2.1", + "jquery-validation": "^1.19.5", + "node-forge": "^1.3.1", + "systemjs": "^0.19.47" + }, + "devDependencies": { + "browser-sync": "^2.27.11", + "concurrently": "^2.2.0", + "node-sass": "^4.14.1" + } +} diff --git a/full-jquery-handlebars-systemjs/src/html/dev-start.html b/full-jquery-handlebars-systemjs/src/html/dev-start.html new file mode 100644 index 0000000..d73b1d9 --- /dev/null +++ b/full-jquery-handlebars-systemjs/src/html/dev-start.html @@ -0,0 +1,246 @@ + + + + + + Worldline Connect SDK Client JavaScript jQuery example + + + + +

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

+ + Secure payment +

+
+ + +
+

+ To process the payment using the services provided by the Worldline Global Collect platform, the following information must be provided + as a merchant +

+

+ After providing the information requested below, this example can process a payment. +

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

+ Google Pay additional input fields: +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+
+
+
+ + + + +
+
+
+ +
+ + + + + + + + + diff --git a/full-jquery-handlebars-systemjs/src/html/dev-success.html b/full-jquery-handlebars-systemjs/src/html/dev-success.html new file mode 100644 index 0000000..a3611dc --- /dev/null +++ b/full-jquery-handlebars-systemjs/src/html/dev-success.html @@ -0,0 +1,138 @@ + + + + + + Worldline Connect SDK Client JavaScript jQuery example + + + + + + +
+
+ +
+
+ + +
+
+ +
+
+
+ + +
+

+ + Secure payment +

+
+

Payment has been set up

+

The payment has been checked and encrypted to:

+ +
+
+                    
+
+

Be aware that the encrypted string contains dots(.) which means double clicking does not select the entire string.

+

You can send this string to Worldline Connect to process the payment

+ Start again +
+
+
+ + + + + + + + + + + diff --git a/full-jquery-handlebars-systemjs/src/html/paymentitem-boleto.html b/full-jquery-handlebars-systemjs/src/html/paymentitem-boleto.html new file mode 100644 index 0000000..0137ba1 --- /dev/null +++ b/full-jquery-handlebars-systemjs/src/html/paymentitem-boleto.html @@ -0,0 +1,283 @@ + + + + + + Worldline Connect SDK Client JavaScript jQuery example + + + + + + +
+
+ +
+
+ + +
+
+ +
+
+
+ + +
+

+ + Secure payment +

+
+
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + diff --git a/full-jquery-handlebars-systemjs/src/html/paymentitem-cards.html b/full-jquery-handlebars-systemjs/src/html/paymentitem-cards.html new file mode 100644 index 0000000..c8429c8 --- /dev/null +++ b/full-jquery-handlebars-systemjs/src/html/paymentitem-cards.html @@ -0,0 +1,296 @@ + + + + + + Worldline Connect SDK Client JavaScript jQuery example + + + + + + +
+
+ +
+
+ + +
+
+ +
+
+
+ + +
+

+ + Secure payment +

+
+
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + diff --git a/full-jquery-handlebars-systemjs/src/html/paymentitem-non-cards.html b/full-jquery-handlebars-systemjs/src/html/paymentitem-non-cards.html new file mode 100644 index 0000000..8db9d42 --- /dev/null +++ b/full-jquery-handlebars-systemjs/src/html/paymentitem-non-cards.html @@ -0,0 +1,406 @@ + + + + + Worldline Connect SDK Client JavaScript jQuery example + + + + + + +
+
+ +
+
+ + +
+
+ +
+
+
+ +
+

+ + Secure payment +

+
+
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + diff --git a/full-jquery-handlebars-systemjs/src/html/paymentitem-selection.html b/full-jquery-handlebars-systemjs/src/html/paymentitem-selection.html new file mode 100644 index 0000000..10ebe5e --- /dev/null +++ b/full-jquery-handlebars-systemjs/src/html/paymentitem-selection.html @@ -0,0 +1,173 @@ + + + + + + Worldline Connect SDK Client JavaScript jQuery example + + + + + + +
+
+ +
+
+ + +
+
+ +
+
+
+ + +
+

+ + Secure payment +

+
+
+ +
+
+
+
+ + + + + + + + + + + + + + diff --git a/full-jquery-handlebars-systemjs/src/js/app/dev-start.js b/full-jquery-handlebars-systemjs/src/js/app/dev-start.js new file mode 100644 index 0000000..0c1552e --- /dev/null +++ b/full-jquery-handlebars-systemjs/src/js/app/dev-start.js @@ -0,0 +1,56 @@ +var $ = require('jQuery'); +var jqueryValidate = require('jquery-validation'); +var validateDefaults = require('./validate-defaults'); + +$(function () { + // set the current values in the currentcontext or use some smart defaults + function _setcurrentValues() { + if (sessionStorage.getItem('context')) { + var currentContext = JSON.parse(sessionStorage.getItem('context')); + $("#clientSessionId").val(currentContext.clientSessionId); + $("#customerId").val(currentContext.customerId); + $("#assetUrl").val(currentContext.assetUrl); + $("#clientApiUrl").val(currentContext.clientApiUrl); + $("#totalAmount").val(currentContext.totalAmount); + $("#countryCode").val(currentContext.countryCode); + $("#currency").val(currentContext.currency); + $("#locale").val(currentContext.locale); + $("#isRecurring").val(currentContext.isRecurring); + $("#grouping").prop('checked', currentContext.grouping); + + // Google Pay specific additional fields, merchantId is required + $("#merchantId").val(currentContext.merchantId); + // merchantName and gatewayMerchantId are optional and will enable prefetching for the Google Pay API. + $("#merchantName").val(currentContext.merchantName); + $("#gatewayMerchantId").val(currentContext.gatewayMerchantId); + } else { + $("#totalAmount").val('16195'); + $("#grouping").prop('checked', true); + } + } + + _setcurrentValues(); + + $("form[name='session-details-form']").validate({ + submitHandler: function () { + var context = { + clientSessionId: $("#clientSessionId").val(), + customerId: $("#customerId").val(), + clientApiUrl: $("#clientApiUrl").val(), + assetUrl: $("#assetUrl").val(), + totalAmount: $("#totalAmount").val(), + countryCode: $("#countryCode").val(), + currency: $("#currency").val(), + locale: $("#locale").val(), + isRecurring: $("#isRecurring").is(":checked"), + grouping: $("#grouping").is(":checked"), + // Google Pay specific: + merchantId: $("#merchantId").val(), + merchantName: $("#merchantName").val(), + gatewayMerchantId: $("#gatewayMerchantId").val() + }; + sessionStorage.setItem('context', JSON.stringify(context)); + document.location.href = 'paymentitem-selection.html'; + } + }); +}); diff --git a/full-jquery-handlebars-systemjs/src/js/app/dev-success.js b/full-jquery-handlebars-systemjs/src/js/app/dev-success.js new file mode 100644 index 0000000..57316fb --- /dev/null +++ b/full-jquery-handlebars-systemjs/src/js/app/dev-success.js @@ -0,0 +1,8 @@ +var $ = require('jQuery'); + +$(function () { + var encryptedString = sessionStorage.getItem('encryptedString'); + sessionStorage.removeItem('encryptedString'); + + $("pre").text(encryptedString); +}); \ No newline at end of file diff --git a/full-jquery-handlebars-systemjs/src/js/app/paymentitem-boleto.js b/full-jquery-handlebars-systemjs/src/js/app/paymentitem-boleto.js new file mode 100644 index 0000000..11e3ca0 --- /dev/null +++ b/full-jquery-handlebars-systemjs/src/js/app/paymentitem-boleto.js @@ -0,0 +1,238 @@ +var $ = require('jQuery'); +var connectSDK = require('connectsdk.Session'); +var Handlebars = require('handlebars'); +require('jquery-validation'); +require('bootstrap'); + +require('./validate-defaults'); +require('./paymentitem-non-cards-helpers'); +require('./paymentitem-formatter'); + +$(function () { + function _showPaymentItem(id) { + $("#loading").show(); + session.getPaymentProduct(id, paymentDetails).then(function (paymentProduct) { + $("#loading").hide(); + paymentRequest.setPaymentProduct(paymentProduct); + + var accountOnFile = null; + if (accountOnFile) { + paymentRequest.setAccountOnFile(accountOnFile); + } + + if (paymentProduct.paymentProductFields.length === 0) { + encrypt(); + } else { + _renderPage(paymentProduct, $("#detail-template").html(), accountOnFile, false); + } + }, function () { + $("#loading").hide(); + $("#error").fadeIn(); + }); + }; + + function _renderPage(paymentItem, source, accountOnFile, isGroup) { + var template = Handlebars.compile(source); + var json = paymentItem.json; + + // We now add some additional stuff to the JSON object that represents the selected payment product so handlebars + // can actually fill out all the variables in its template. Some of these values for these variables are not + // available in the core payment product info so we add them. + $.each(json.fields, function (index, field) { + // A) a isCurrency field because the #if Handlebars clause it too limited (it cannot do the === 'currency' check itself) + if (field.displayHints.formElement.type === "currency") { + field.displayHints.formElement.isCurrency = true; + } + + // B) The paymentDetails so we can use its data in the field renderer; useful for printing currency etc. + field.paymentContext = paymentDetails; + + // C) In the case we have an account on file (AOF) we need to display the known values that + // are defined for the fields that the AOF contains. We're adding these values to the fields + if (accountOnFile) { + var relatedAofField = accountOnFile.attributeByKey[field.id]; + if (relatedAofField) { + // Nice, the account on file has an existing value for this field. To signal to the handlebars template + // that this is the case we add a new field field.aofData that contains that known value. However: we want + // to apply a mask to the known value before we show it. To do that we first retrieve the paymentProductField + // SDK object because it has the applyMask method. Note that we should not use the getMaskedValueByAttributeKey + // method on the AccountOnFile object because that uses the masking info that is provided in the + // AccountOnFile displayHints object. That object is used to indicate which AoF fields should be shown + // in the payment product selection list by including only the masks for those fields. In our case we want + // to mask all known fields, so we fall back to the mask information in the paymentProductField object. + var paymentProductField = paymentItem.paymentProductFieldById[field.id]; + field.knownValue = paymentProductField.applyWildcardMask(relatedAofField.value).formattedValue; + + // We also determine if this field should be readonly. This depends on the status of the field + // as defined in the Account On File object. If the status is READ_ONLY it cannot be changed, but + // if the value is CAN_WRITE or even MUST_WRITE it's existing value can be overwritten. + field.isReadOnly = !relatedAofField.status || relatedAofField.status === 'READ_ONLY'; + } + } + + // D) Fields that are part of the aofData and that have the READ_ONLY status should be excluded from the + // encrypted blob. + field.includeInEncryptedBlob = field.isReadOnly === undefined || field.isReadOnly ? "false" : "true"; + + // E) indicate that this field is the cardnumber field to render the holder for the cobrands feature + if (field.id === "cardNumber") { + field.isCardNumberField = true; + } + }); + + // E) There's one field that we should add to the form that is not included in the payment product fields list for + // a payment product: the "remember me" option, aka : tokenization. It's only visible if the payment product + // itself allows it: allowsTokenization === true && autoTokenized === false. (If autoTokenized === true it will + // get tokenized automatically by the server and we do not need to show the checkbox). + + // for groups a different logic is in place: if the payment is recurring the checkbox should be shown. + if (isGroup) { + json.showRememberMe = paymentDetails.isRecurring; + } else { + json.showRememberMe = json.allowsTokenization === true && json.autoTokenized === false; + } + + // We have extended the JSON object that represents the payment product so that it contains + // all the necessary information to fill in the Handlebars template. Now we generate the + // HTML and add it to the DOM. + $("#handlebarsDrop").html(template(json)); + if (!json.showRememberMe) { + $("#rememberme").closest('.checkbox').hide(); + } + + // 2) Add validators to each of the fields in the form + connect.addValidators(paymentItem); + + + // 3) Add submit handling for when the user finishes filling out the form + + // After the customer is done filling out the form he submits it. But instead of sending the form to the server + // we validate it and if successful we encrypt the result. Your application should send the cypher text to + // your e-commerce server itself. + $(".validatedForm").validate({ + submitHandler: function (e) { + + // We create an object with key:value pairs consisting on the id of the paymentproductfield + // and its value as presented (with or without mask). + var blob = {}; + + // We only add the form elements that have the "data-includeInEncryptedBlob=true" attribute; which we've added + // to each input/select when we created the form. + $(".validatedForm [data-includeInEncryptedBlob=true]").each(function () { + + if ($(this).attr("id").indexOf("-baseCurrencyUnit") !== -1 || $(this).attr("id").indexOf("-centecimalCurrencyUnit") !== -1) { + // The example application splits up currency fields into two fields: base currency and cents + // We need to merge the values of these two fields again because the SDK only accepts one + // value per field (and it expects the complete value in cents in this case) + var id = $(this).attr("id").substring(0, $(this).attr("id").indexOf("-")); + if ($(this).attr("id").indexOf("-baseCurrencyUnit") !== -1) { + blob[id] = (blob[id]) ? (Number(blob[id]) + Number($(this).val() * 100)) + '' : Number($(this).val() * 100) + ''; + } + if ($(this).attr("id").indexOf("-centecimalCurrencyUnit") !== -1) { + blob[id] = (blob[id]) ? (Number(blob[id]) + Number($(this).val())) + '' : Number($(this).val()) + ''; + } + + } else { + // In all other cases just us ethe entered value + blob[$(this).attr("id")] = $(this).val(); + } + }); + + // Remember that we need to add all entered values to paymentRequest so they will be included in the + // encryption later on. + for (var key in blob) { + paymentRequest.setValue(key, blob[key]); + } + + // encrypt the paymentRequest + encrypt(); + + // Cancel submitting the form + return false; + } + }); + + + // 4) Add handlers for some additional bells and whistles (such as tooltips, IIN lookups, etc) + + // A) Sometimes we show the "tokenize payment" checkbox (See above). Because of this special way of including the + // field we also need a separate handling of it. That is done here. + $("#rememberme").on("change", function () { + paymentRequest.setTokenize($(this).is(":checked")); + }); + + // B) Some fields have tooltips (e.g. the CVV code field). We initialize the popups that contain those tooltips here. + $('.info-popover').popover(); + + // C) We mask the fields that need masking as defined in the payment product field definition. Either use use a jquery masked + // input plugin, or write your own. In this example we use jquery formatter plugin, which is included in this file at the + // bottom. + + connect.updateFieldMask(paymentItem); + + // D) Enable boleto specific code; expect a consumer; and switch to a company if the fiscalNumber is 14 digits. + + $("div[data-wrapper='firstName']").show(); + $("div[data-wrapper='surname']").show(); + $("div[data-wrapper='companyName']").hide(); + + $("#fiscalNumber").on('keyup', function () { + var fiscalNumber = $(this).val(); + if (fiscalNumber.length >= 14) { + $("div[data-wrapper='firstName']").hide(); + $("div[data-wrapper='surname']").hide(); + + $("div[data-wrapper='companyName']").show(); + } else { + $("div[data-wrapper='firstName']").show(); + $("div[data-wrapper='surname']").show(); + + $("div[data-wrapper='companyName']").hide(); + } + }); + + function encrypt() { + + $("#loading").show(); + + // Create an SDK encryptor object + var encryptor = session.getEncryptor(); + + // Encrypting is an async task that we provide you as a promise. + encryptor.encrypt(paymentRequest).then(function (encryptedString) { + // The promise has fulfilled. + sessionStorage.setItem('encryptedString', encryptedString); + document.location.href = 'dev-success.html'; + }, function (errors) { + // The promise failed, inform the user what happened. + + $("#loading").hide(); + console.error("Failed to encrypt due to", errors); + }); + } + }; + + var context = sessionStorage.getItem('context'); + if (!context) { + document.location.href = 'dev-start.html'; + } + context = JSON.parse(context); + var sessionDetails = { + clientSessionId: context.clientSessionId, + customerId: context.customerId, + clientApiUrl: context.clientApiUrl, + assetUrl: context.assetUrl + }; + var paymentDetails = { + totalAmount: context.totalAmount, + countryCode: context.countryCode, + locale: context.locale, + isRecurring: context.isRecurring, + currency: context.currency + } + var grouping = context.grouping; + var session = new connectSDK(sessionDetails); + var paymentRequest = session.getPaymentRequest(); + + _showPaymentItem(1503); +}); \ No newline at end of file diff --git a/full-jquery-handlebars-systemjs/src/js/app/paymentitem-cards-helpers.js b/full-jquery-handlebars-systemjs/src/js/app/paymentitem-cards-helpers.js new file mode 100644 index 0000000..25f8657 --- /dev/null +++ b/full-jquery-handlebars-systemjs/src/js/app/paymentitem-cards-helpers.js @@ -0,0 +1,364 @@ +var $ = require('jQuery'); +var AccountOnFile = require('connectsdk.AccountOnFile'); +var Handlebars = require('handlebars'); + +/** + * This file contains helper functions for the example-app + * This declutters the example app itself; refer to the helper docs below for usage + */ +$(function () { + // declare a namespace in the window for references + window.connect = window.connect || {}; + + /** + * Add helpers for usage with handlebars. Use {@link connect@addHandleBarsHelpers} to setup the helpers + */ + connect.addHandleBarsHelpers = function (session) { + // a handlebars helper that shows the needed Account on File properties + Handlebars.registerHelper("showAoFProperties", function (items, options) { + var that = this; + var output = ""; + var accountOnFile = new AccountOnFile(that); + var displayHints = accountOnFile.displayHints; + + for (var j = 0, jl = displayHints.labelTemplate.length; j < jl; j++) { + var keyToShow = displayHints.labelTemplate[j].attributeKey; + output = output + accountOnFile.getMaskedValueByAttributeKey(keyToShow).formattedValue + " "; + } + + return output; + }); + + // a handlebars helper that shows the correct paymentproduct image for the given paymentproduct; please note: + // - we assume that you use jQuery + // - we assume that you have an element with the data attribute "data-aof-ppid" with the corresponding paymentproduct id + // - the element has an image, the content of the src attribute are handled as postfix so you can use your own fixed width and height (if needed) + // we need to do this this way since handlebars is a text based template and the paymentproduct call is async; it is also possible to do this before rendering the AoF data if you want to. + Handlebars.registerHelper("getImageByProductId", function (items, options) { + var that = this, id = items.fn(); + + session.getPaymentProduct(id).then(function (paymentProduct) { + // The promise has fulfilled. + var $target = $("[data-aof-ppid='" + id + "']").find("img"); + var imgUrl = paymentProduct.displayHints.logo + $target.attr("src"); + $target.attr("src", imgUrl); + }, function () { + // The promise failed, we just won;t show the image then + }); + }); + }; + + /** + * Adds non-simple validators. Use {@link connect#addValidators} to add the validators. + * + * @param {object} paymentItem - The paymentItem on which to bind the validations + */ + connect.addValidators = function (paymentItem) { + + // The payment product defines a set of data restrictions per field. We need to add functionality to + // our pages. In our case we use jQuery validator as the library to actually do these validations. + + // We extend the default jQuery validator with additional methods that call the correct SDK validator. + // The SDK offers validators per validation type (e.g. Luhn check, range check, etc). These extensions + // below only need to call the correct validator with the value that was entered by the user. + _addSimpleValidator("expirationDate", paymentItem, "Please enter a valid expiration date"); + _addSimpleValidator("emailAddress", paymentItem, "Please enter a valid email address"); + _addSimpleValidator("luhn", paymentItem, "Please enter a valid credit card number"); + _addSimpleValidator("regularExpression", paymentItem, "Please enter valid data"); + + jQuery.validator.addMethod("allowedInContext", function (value, element, params) { + if ($(element).hasClass('notAllowedInContext')) { + return false; + } + return true; + }, "This card is not allowed with this transaction"); + + var lParams = null; + jQuery.validator.addMethod("length", function (value, element, params) { + var paymentProductField = paymentItem.paymentProductFieldById[element.id]; + if (paymentProductField) { + var dataRestrictions = paymentProductField.dataRestrictions; + var validation = dataRestrictions.validationRuleByType["length"]; + var unmaskedValue = paymentProductField.removeMask(value); + // update params with the attributes + lParams = [validation.minLength, validation.maxLength]; + return this.optional(element) || validation.validate(unmaskedValue); + } else { + return true; + } + }, function () { + if (lParams[0] === lParams[1]) { + return jQuery.validator.format("Please enter a value of length {0}", lParams[0]); + } else { + return jQuery.validator.format("Please enter a valid length between {0} and {1}", lParams[0], lParams[1]); + } + }); + + var rParams = []; + jQuery.validator.addMethod("range", function (value, element, params) { + var id = element.id; + if (element.id.indexOf("-baseCurrencyUnit") !== -1 || element.id.indexOf("-centecimalCurrencyUnit") !== -1) { + id = element.id.substring(0, element.id.indexOf("-")); + } + var paymentProductField = paymentItem.paymentProductFieldById[id]; + if (paymentProductField) { + var dataRestrictions = paymentProductField.dataRestrictions; + var validation = dataRestrictions.validationRuleByType["range"]; + var unmaskedValue = paymentProductField.removeMask(value); + // update params with the attributes + rParams = [validation.minValue, validation.maxValue]; + if (element.id.indexOf("-baseCurrencyUnit") !== -1 || element.id.indexOf("-centecimalCurrencyUnit") !== -1) { + rParams = [Number(validation.minValue).toFixed(2), (Number(validation.maxValue) / 100).toFixed(2)]; + // combine the field as one price and validate as cents + var eur = $("#" + id + "-baseCurrencyUnit").val() * 100, + cent = $("#" + id + "-centecimalCurrencyUnit").val() * 1, + total = eur + cent; + return this.optional(element) || validation.validate(total); + } + return this.optional(element) || validation.validate(unmaskedValue); + } else { + return true; + } + }, function () { + return jQuery.validator.format("Please enter a valid range between {0} and {1}", rParams[0], rParams[1]); + }); + + // we need a static non-sdk validator to trigger the 'is not allowed in context' validator + $("#cardNumber").attr("data-rule-allowedInContext", true); + }; + + /** + * Update the masks in fields. Use {@link connect#updateFieldMask} to apply the mask to all visible fields + * + * @param {object} paymentItem - The paymentItem to apply masking to + */ + connect.updateFieldMask = function (paymentItem) { + $("input").each(function () { + // We look for the SDK mask that is defined on the payment product field. If it exists we add the formatter + // logic to the field so any time the user changes the field's value the formatter nicely formats it. + var paymentProductField = paymentItem.paymentProductFieldById[$(this).attr("id")]; + + if (paymentProductField) { + var mask = paymentProductField.displayHints.mask; + if (mask) { + $(this).formatter({ + 'pattern': mask + }); + } + } + }); + }; + + /** + * Updates the view of a paymentProduct. Use {@link connect#updatePaymentProduct} to update. + * + * @param {object} paymentProduct - The paymentProduct to use to update the view + */ + connect.updatePaymentProduct = function (paymentProduct) { + // A - Update the logo + if (paymentProduct.displayHints.logo) { + $("#cardNumber").parent().find(".cc-image").html('').show(); + } + // B - Add new fields to the view + _addFields(paymentProduct); + // C - Remove unused fields from view + _removeUnwantedFields(paymentProduct); + // D - Update tooltips + _updateAllTooltips(paymentProduct); + // E - Update validators + _updateAllValidators(paymentProduct); + }; + + /** + * Handles the support for cobrands. Use {@link connect@handleCobrands} to add support for cobrands to a paymentItem. + * + * @param {object} paymentItem - The paymentItem that could have cobrands + * @param {object} iinDetailsResponse - The response from the iinDetails. + * @param {object} paymentRequest - the request in which to update the paymentProduct if the user switches cobrand + * @param {object} session - the paymentSession which can be used to get new paymentItems + * @param {object} paymentDetails - the paymentContext used to determine which paymentItems can be used + */ + connect.handleCobrands = function (paymentItem, iinDetailsResponse, paymentRequest, session, paymentDetails) { + if (iinDetailsResponse.coBrands && _numberOfCardsAllowedInContext(iinDetailsResponse.coBrands) > 1) { + var source = $("#cobrands-template").html(); + var template = Handlebars.compile(source); + var cobrands = { + "coBrands": [] + }; + for (var i = 0; i < iinDetailsResponse.coBrands.length; i++) { + if (iinDetailsResponse.coBrands[i].isAllowedInContext) { + session.getPaymentProduct(iinDetailsResponse.coBrands[i].paymentProductId, paymentDetails).then(function (paymentProduct) { + cobrands.coBrands.push(paymentProduct); + var domElement = template(cobrands); + $("#cobrandsHolder").html(domElement); + $("#cobrand").show(); + }); + } + } + // cobrand events + $("#cobrandsHolder").on("click", ".toggle-cobrand", function (e) { + e.preventDefault(); + $("#cobrand .cobrand-wrapper").show(); + $(this).hide(); + }); + $("#cobrandsHolder").on("click", ".cobrand-close", function (e) { + e.preventDefault(); + $("#cobrand .toggle-cobrand").show(); + $("#cobrand .cobrand-wrapper").hide(); + }); + $("#cobrandsHolder").on("click", ".btn-tertiary", function (e) { + e.stopPropagation(); + var paymentProductId = $(this).data("payment-method"); + // set this new paymentproduct in the request + session.getPaymentProduct(paymentProductId, paymentDetails).then(function (paymentProduct) { + paymentRequest.setPaymentProduct(paymentProduct); + $("#cobrand .toggle-cobrand").show(); + $("#cobrand .cobrand-wrapper").hide(); + + // use this new paymentProduct to set-up the new view + connect.updatePaymentProduct(paymentProduct); + }); + }); + } else { + $("#cobrandsHolder").off("click"); + } + }; + /** + * Hides and reset the cobranding block on the page. Use {@link connect#hideCobranding} to use. + */ + connect.hideCobranding = function () { + $("#cobrand").hide(); + $("#cobrand .toggle-cobrand").show(); + $("#cobrand .cobrand-wrapper").hide(); + }; + + /** + * Private function that adds simple validation to a field + * + * @param {string} validationType - Type of validation to add. + * @param {object} paymentItem - Used paymentItem for this validation. + * @param {string} meesage - The message to display if validation fails. + */ + function _addSimpleValidator(validationType, paymentItem, message) { + jQuery.validator.addMethod(validationType, function (value, element, params) { + var paymentProductFieldId = element.id; + var paymentProductField = paymentItem.paymentProductFieldById[paymentProductFieldId]; + // If there is no field associated with the id then we just assume there is no validation + if (paymentProductField) { + var dataRestrictions = paymentProductField.dataRestrictions; + var validation = dataRestrictions.validationRuleByType[validationType]; + var unmaskedValue = paymentProductField.removeMask(value); + return this.optional(element) || validation.validate(unmaskedValue); + } else { + return true; + } + }, message); + }; + + /** + * Private function that adds new fields to the view based on the paymentItem + * + * @param {object} paymentItem - the paymentItem that has the paymentFields. + */ + function _addFields(paymentItem) { + var fields = paymentItem.paymentProductFields; + $.each(fields, function () { + var field = this; + $(".wrapper-" + field.id).show(); + }); + }; + + /** + * Private function that removes unwanted fields from the view based on the paymentItem. + * + * @param {object} paymentItem - the paymentItem that has the paymentFields. + * + */ + function _removeUnwantedFields(paymentItem) { + var fields = paymentItem.paymentProductFields; + + var visibleFields = $(".form-group[data-wrapper]:visible"); + var newFields = []; + $.each(visibleFields, function () { + var id = $(this).data("wrapper"); + $.each(fields, function () { + var field = this; + if (id === field.id) { + // found we store this one to keep + newFields.push(id); + } + }); + }); + // now remove the fields we no longer see + $.each(visibleFields, function () { + var id = $(this).data("wrapper"); + if ($.inArray(id, newFields) === -1) { + $(".wrapper-" + id).hide(); + } + }); + if (!(paymentItem.allowsTokenization && paymentItem.autoTokenized === false)) { + $("#rememberme").closest('.checkbox').hide(); + } + }; + + /** + * Private function that updates all tooltips and tooltip images in the view based on the paymentItem. + * + * @param {object} paymentItem - the paymentItem that has the updated tooltip(images). + */ + function _updateAllTooltips(paymentItem) { + var fields = paymentItem.paymentProductFields; + $.each(fields, function () { + var field = this; + if (field.displayHints && field.displayHints.tooltip) { + var tooltipImage = field.displayHints.tooltip.image, + tooltipText = field.displayHints.tooltip.label; + $("#" + field.id + "-popover").attr("data-content", tooltipText + "
"); + } + }); + }; + + /** + * Private function that updates the validators associated to this paymentItem. + * + * @param {object} paymentItem - the paymentItem that has the updated validators. + */ + function _updateAllValidators(paymentItem) { + connect.addValidators(paymentItem); + var fields = paymentItem.paymentProductFields; + $.each(fields, function () { + var field = this; + if (field.dataRestrictions && field.dataRestrictions.hasOwnProperty('isRequired')) { + if (field.dataRestrictions.isRequired) { + $("#" + field.id).attr("required", true); + } else { + $("#" + field.id).removeAttr("required"); + } + } + $("#" + field.id).rules("remove"); + $.each(field.dataRestrictions.validationRuleByType, function (key, value) { + $("#" + field.id).data("rule-" + key, true); + }); + if (field.id === "cardNumber") { + // we need the allowedInContext validator for cradNumber fields + $("#" + field.id).attr("data-rule-allowedInContext", true); + } + }); + }; + + /** + * Private function to determine how many cards are allowedInContext + * + * @param {array} cobrands - list of cobrands to check + */ + function _numberOfCardsAllowedInContext(cobrands) { + var allowed = 0; + $.each(cobrands, function () { + var cobrand = this; + if (cobrand.isAllowedInContext) { + allowed++; + } + }); + return allowed; + }; +}); diff --git a/full-jquery-handlebars-systemjs/src/js/app/paymentitem-cards.js b/full-jquery-handlebars-systemjs/src/js/app/paymentitem-cards.js new file mode 100644 index 0000000..e50bee4 --- /dev/null +++ b/full-jquery-handlebars-systemjs/src/js/app/paymentitem-cards.js @@ -0,0 +1,327 @@ +var $ = require('jQuery'); +var connectSDK = require('connectsdk.Session'); +var Handlebars = require('handlebars'); +require('jquery-validation'); +require('bootstrap'); + +require('./validate-defaults'); +require('./paymentitem-cards-helpers'); +require('./paymentitem-formatter'); + +// Add a handlebars helper so we can for equality between two primitives using the isEquals operator (object equality is not needed in our case). +Handlebars.registerHelper('eq', function(v1, v2, options) { + if(v1 === v2) { + return options.fn(this); + } + return options.inverse(this); +}); + +$(function () { + function _showPaymentItem(id, aofId) { + $("#loading").show(); + + if (id === 'cards') { + session.getPaymentProductGroup(id, paymentDetails).then(function (paymentProductGroup) { + _renderPage(paymentProductGroup, $("#detail-template").html(), null, true); + $(".cc-image").hide(); + $("#loading").hide(); + }, function () { + $("#loading").hide(); + $("#error").fadeIn(); + }); + } else { + session.getPaymentProduct(id, paymentDetails).then(function (paymentProductItem) { + var accountOnFile = !isNaN(aofId) ? paymentProductItem.accountOnFileById[aofId] : null; + var templateSource = accountOnFile ? $('#aof-template').html() : $('#detail-template').html(); + _renderPage(paymentProductItem, templateSource, accountOnFile, false); + $("#loading").hide(); + }, function () { + $("#loading").hide(); + $("#error").fadeIn(); + }); + } + }; + + function _renderPage(paymentItem, source, accountOnFile, isGroup) { + var template = Handlebars.compile(source); + var json = paymentItem.json; + + // when is account on file + // set payment product and account on file information + if (accountOnFile) { + paymentRequest.setPaymentProduct(paymentItem); + paymentRequest.setAccountOnFile(accountOnFile); + } + + // We now add some additional stuff to the JSON object that represents the selected payment product so handlebars + // can actually fill out all the variables in its template. Some of these values for these variables are not + // available in the core payment product info so we add them. + $.each(json.fields, function (index, field) { + // A) The paymentDetails so we can use its data in the field renderer; useful for printing currency etc. + field.paymentContext = paymentDetails; + + // B) In the case we have an account on file (AOF) we need to display the known values that + // are defined for the fields that the AOF contains. We're adding these values to the fields + if (accountOnFile) { + var relatedAofField = accountOnFile.attributeByKey[field.id]; + if (relatedAofField) { + // Nice, the account on file has an existing value for this field. To signal to the handlebars template + // that this is the case we add a new field field.aofData that contains that known value. However: we want + // to apply a mask to the known value before we show it. To do that we first retrieve the paymentProductField + // SDK object because it has the applyMask method. Note that we should not use the getMaskedValueByAttributeKey + // method on the AccountOnFile object because that uses the masking info that is provided in the + // AccountOnFile displayHints object. That object is used to indicate which AoF fields should be shown + // in the payment product selection list by including only the masks for those fields. In our case we want + // to mask all known fields, so we fall back to the mask information in the paymentProductField object. + var paymentProductField = paymentItem.paymentProductFieldById[field.id]; + field.knownValue = paymentProductField.applyWildcardMask(relatedAofField.value).formattedValue; + + // We also determine if this field should be readonly. This depends on the status of the field + // as defined in the Account On File object. If the status is READ_ONLY it cannot be changed, but + // if the value is CAN_WRITE or even MUST_WRITE it's existing value can be overwritten. + field.isReadOnly = !relatedAofField.status || relatedAofField.status === 'READ_ONLY'; + } + } + + // C) Fields that are part of the aofData and that have the READ_ONLY status should be excluded from the + // encrypted blob. + field.includeInEncryptedBlob = field.isReadOnly === undefined || field.isReadOnly ? "false" : "true"; + + // D) indicate that this field is the cardnumber field to render the holder for the cobrands feature + if (field.id === "cardNumber") { + field.isCardNumberField = true; + } + }); + + // E) There's one field that we should add to the form that is not included in the payment product fields list for + // a payment product: the "remember me" option, aka : tokenization. It's only visible if the payment product + // itself allows it: allowsTokenization === true && autoTokenized === false. (If autoTokenized === true it will + // get tokenized automatically by the server and we do not need to show the checkbox). + + // for groups a different logic is in place: if the payment is recurring the checkbox should be shown. + if (isGroup) { + json.showRememberMe = paymentDetails.isRecurring; + } else { + json.showRememberMe = json.allowsTokenization === true && json.autoTokenized === false; + } + + // We have extended the JSON object that represents the payment product so that it contains + // all the necessary information to fill in the Handlebars template. Now we generate the + // HTML and add it to the DOM. + $("#handlebarsDrop").html(template(json)); + if (!json.showRememberMe) { + $("#rememberme").closest('.checkbox').hide(); + } + + // 2) Add validators to each of the fields in the form + connect.addValidators(paymentItem); + + // 3) Add submit handling for when the user finishes filling out the form + // After the customer is done filling out the form he submits it. But instead of sending the form to the server + // we validate it and if successful we encrypt the result. Your application should send the cypher text to + // your e-commerce server itself. + $(".validatedForm").validate({ + submitHandler: function (e) { + // We create an object with key:value pairs consisting on the id of the paymentproductfield + // and its value as presented (with or without mask). + var blob = {}; + + // We only add the form elements that have the "data-includeInEncryptedBlob=true" attribute; which we've added + // to each input/select when we created the form. + $(".validatedForm [data-includeInEncryptedBlob=true]").each(function () { + + if ($(this).attr("id").indexOf("-baseCurrencyUnit") !== -1 || $(this).attr("id").indexOf("-centecimalCurrencyUnit") !== -1) { + // The example application splits up currency fields into two fields: base currency and cents + // We need to merge the values of these two fields again because the SDK only accepts one + // value per field (and it expects the complete value in cents in this case) + var id = $(this).attr("id").substring(0, $(this).attr("id").indexOf("-")); + if ($(this).attr("id").indexOf("-baseCurrencyUnit") !== -1) { + blob[id] = (blob[id]) ? (Number(blob[id]) + Number($(this).val() * 100)) + '' : Number($(this).val() * 100) + ''; + } + if ($(this).attr("id").indexOf("-centecimalCurrencyUnit") !== -1) { + blob[id] = (blob[id]) ? (Number(blob[id]) + Number($(this).val())) + '' : Number($(this).val()) + ''; + } + + } else { + // In all other cases just us ethe entered value + blob[$(this).attr("id")] = $(this).val(); + } + }); + + // Remember that we need to add all entered values to paymentRequest so they will be included in the + // encryption later on. + for (var key in blob) { + paymentRequest.setValue(key, blob[key]); + } + + // encrypt the paymentRequest + encrypt(); + return false; + } + }); + + + // 4) Add handlers for some additional bells and whistles (such as tooltips, IIN lookups, etc) + + // A) Sometimes we show the "tokenize payment" checkbox (See above). Because of this special way of including the + // field we also need a separate handling of it. That is done here. + $("#rememberme").on("change", function () { + paymentRequest.setTokenize($(this).is(":checked")); + }); + + // B) Some fields have tooltips (e.g. the CVV code field). We initialize the popups that contain those tooltips here. + $('.info-popover').popover(); + + // C) We mask the fields that need masking as defined in the payment product field definition. Either use use a jquery masked + // input plugin, or write your own. In this example we use jquery formatter plugin, which is included in this file at the + // bottom. + + connect.updateFieldMask(paymentItem); + + // D) The creditcard field has an IIN lookup that determines the issuer of the card. It could be the case that the customer chose + // payment product VISA but entered a mastercard creditcard number. In that case the selected payment product should switch. + $("#cardNumber").parent().find(".cc-image").html(''); + var storedFirstDigits = ''; + $("#cardNumber").on("keyup", function (e) { + if (e.keyCode === 17 || e.keyCode === 91) { + // don't handle ctrl events (copy paste otherwise will send double iin details calls) + return true; + } + var currentFirstDigits = extractBin(this); + if (currentFirstDigits !== storedFirstDigits) { + // We use the SDK to do the IIN lookup, this is an async task that we provide you as a promise + session.getIinDetails($(this).val(), paymentDetails).then(function (response) { + // The promise has fulfilled. + connect.hideCobranding(); + // if this new creditcard is supported you can show the new logo in the helper element + if (response.status === "SUPPORTED") { + //Remove notAllowedInContext class so validator succeeds if there was a SUPPORTED_BUT_NOT_ALLOWED response before + setAllowedInContextStatus(true); + storedFirstDigits = currentFirstDigits; + // Fetch the paymentproduct that belongs to the id the IIN returned, this is an async task that we provide you as a promise + session.getPaymentProduct(response.paymentProductId, paymentDetails).then(function (paymentProduct) { + // The promise has fulfilled. + //update field Mask in case a different cardnumber is filled in + connect.updateFieldMask(paymentProduct); + // update the paymentproduct in the request + paymentRequest.setPaymentProduct(paymentProduct); + connect.updatePaymentProduct(paymentProduct); + connect.handleCobrands(paymentProduct, response, paymentRequest, session, paymentDetails); + }); + + } else if (response.status === "EXISTING_BUT_NOT_ALLOWED") { + // The creditcard number that the user provided did map on a supported (for this merchant) issuer. + // But the payment is not allowed with the current payment context. (countryCode, isRecurring, amount, currency) + // We handle this by adding a method to the jquery validator who checks for the class 'notAllowedInContext' + setCardStatus(false, false, false); + } else { + // The creditcard number that the user provided did not map on any known or supported + // (for this merchant) issuer. We decide to not change the payment product and simply + // hide the payment poduct logo to indicate that it's unknown / unsupported. + setCardStatus(false, false, false); + } + + }, function (response) { + // The promise failed, inform the user what happened. + + // The creditcard number that the user provided did not map on any known or supported + // (for this merchant) issuer. We decide to not change the payment product and simply + // hide the payment poduct logo to indicate that it's unknown / unsupported. + setCardStatus(false, false, false); + }); + } + }); + + function extractBin(field) { + const currentValue = $(field).val().replace(' ', ''); + // we only need to analyse the card's first 6 or 8 digits. + return currentValue.length >= 8 + ? currentValue.substring(0, 8) + : currentValue.substring(0, 6); + } + + function encrypt() { + $("#loading").show(); + // Create an SDK encryptor object + var encryptor = session.getEncryptor(); + // Encrypting is an async task that we provide you as a promise. + encryptor.encrypt(paymentRequest).then(function (encryptedString) { + // The promise has fulfilled. + sessionStorage.setItem('encryptedString', encryptedString); + document.location.href = 'dev-success.html'; + }, function (errors) { + // The promise failed, inform the user what happened. + $("#loading").hide(); + console.error("Failed to encrypt due to", errors); + $("#error").fadeIn(); + }); + } + function setCardStatus(isAllowedInContext, showCobrand, showCCImage) { + // set allowedInContext class to trigger validation + setAllowedInContextStatus(isAllowedInContext); + setCobrandStatus(showCobrand); + setCCImageStatus(showCCImage); + // trigger validation + $("#paymentoptionForm").validate(); + } + function setAllowedInContextStatus(status) { + if (status) { + $("#cardNumber").removeClass("notAllowedInContext"); + } else { + $("#cardNumber").addClass("notAllowedInContext"); + } + } + function setCobrandStatus(status) { + if (status) { + $("#cobrand").show(); + } else { + $("#cobrand").hide(); + $("#cobrand .toggle-cobrand").show(); + $("#cobrand .cobrand-wrapper").hide(); + } + } + function setCCImageStatus(status) { + if (status) { + $("#cardNumber").parent().find(".cc-image").show(); + } else { + $("#cardNumber").parent().find(".cc-image").hide(); + } + } + }; + + // bootstrap the page + var context = sessionStorage.getItem('context'); + if (!context) { + document.location.href = 'dev-start.html'; + } + context = JSON.parse(context); + var sessionDetails = { + clientSessionId: context.clientSessionId, + customerId: context.customerId, + clientApiUrl: context.clientApiUrl, + assetUrl: context.assetUrl + }; + var paymentDetails = { + totalAmount: context.totalAmount, + countryCode: context.countryCode, + locale: context.locale, + isRecurring: context.isRecurring, + currency: context.currency + } + var grouping = context.grouping; + var session = new connectSDK(sessionDetails); + var paymentRequest = session.getPaymentRequest(); + + var search = document.location.search; + if (search) { + search = search.substring(1); + search = search.split("&").reduce(function(obj, str) { + var arr = str.split('='); + obj[arr[0]] = isNaN(arr[1]) ? arr[1] : parseInt(arr[1]); + return obj; + }, {}); + _showPaymentItem.apply(null, [ search.paymentitemId, search.accountOnFileId ]); + } else { + _showPaymentItem(); + } +}); diff --git a/full-jquery-handlebars-systemjs/src/js/app/paymentitem-formatter.js b/full-jquery-handlebars-systemjs/src/js/app/paymentitem-formatter.js new file mode 100644 index 0000000..7001b39 --- /dev/null +++ b/full-jquery-handlebars-systemjs/src/js/app/paymentitem-formatter.js @@ -0,0 +1 @@ +!function(a,b){"function"==typeof define&&define.amd?define(["jQuery"],b):b("object"==typeof exports?require("jQuery"):a.jQuery)}(this,function(){var a=function(){var a={},b=4,c=new RegExp("{{([^}]+)}}","g"),d=function(a){for(var b,d=[];b=c.exec(a);)d.push(b);return d};return a.parse=function(a){var c={inpts:{},chars:{}},e=d(a),f=a.length,g=0,h=0,i=0,j=function(a){for(var d=a.length,e=0;d>e;e++)c.inpts[h]=a.charAt(e),h++;g++,i+=a.length+b-1};for(i;f>i;i++)gb[0]&&ad&&b.call(c,a[d],d,a)!==!1;d++);else for(var f in a)if(a.hasOwnProperty(f)&&b.call(c,a[f],f,a)===!1)break},a}(),c=function(a,b){function c(c){var e=[],f=[];b.forEach(c,function(c){b.forEach(c,function(b,c){var g=a.parse(b),h=d(c);return e.push(h),f.push(g),!1})});var g=function(a){var c;return b.forEach(e,function(b,d){return b.test(a)?(c=d,!1):void 0}),void 0===c?null:f[c]};return{getPattern:g,patterns:f,matchers:e}}var d=function(a){return"*"===a?/.*/:new RegExp(a)};return c}(a,b),d=function(){var a={};return a.get=function(a){if("number"==typeof a.selectionStart)return{begin:a.selectionStart,end:a.selectionEnd};var b=document.selection.createRange();if(b&&b.parentElement()===a){var c=a.createTextRange(),d=a.createTextRange(),e=a.value.length;return c.moveToBookmark(b.getBookmark()),d.collapse(!1),c.compareEndPoints("StartToEnd",d)>-1?{begin:e,end:e}:{begin:-c.moveStart("character",-e),end:-c.moveEnd("character",-e)}}return{begin:0,end:0}},a.set=function(a,b){if("object"!=typeof b&&(b={begin:b,end:b}),a.setSelectionRange)a.focus(),a.setSelectionRange(b.begin,b.end);else if(a.createTextRange){var c=a.createTextRange();c.collapse(!0),c.moveEnd("character",b.end),c.moveStart("character",b.begin),c.select()}},a}(),e=function(a,b,c){function d(b,d){var f=this;if(f.el=b,!f.el)throw new TypeError("Must provide an existing element");if(f.opts=c.extend({},e,d),"undefined"!=typeof f.opts.pattern&&(f.opts.patterns=f._specFromSinglePattern(f.opts.pattern),delete f.opts.pattern),"undefined"==typeof f.opts.patterns)throw new TypeError("Must provide a pattern or array of patterns");f.patternMatcher=a(f.opts.patterns),f._updatePattern(),f.hldrs={},f.focus=0,c.addListener(f.el,"keydown",function(a){f._keyDown(a)}),c.addListener(f.el,"keypress",function(a){f._keyPress(a)}),c.addListener(f.el,"paste",function(a){f._paste(a)}),f.opts.persistent&&(f._processKey("",!1),f.el.blur(),c.addListener(f.el,"focus",function(a){f._focus(a)}),c.addListener(f.el,"click",function(a){f._focus(a)}),c.addListener(f.el,"touchstart",function(a){f._focus(a)}))}var e={persistent:!1,repeat:!1,placeholder:" "},f={9:/[0-9]/,a:/[A-Za-z]/,"*":/[A-Za-z0-9]/};return d.addInptType=function(a,b){f[a]=b},d.prototype.resetPattern=function(c){this.opts.patterns=c?this._specFromSinglePattern(c):this.opts.patterns,this.sel=b.get(this.el),this.val=this.el.value,this.delta=0,this._removeChars(),this.patternMatcher=a(this.opts.patterns);var d=this.patternMatcher.getPattern(this.val);this.mLength=d.mLength,this.chars=d.chars,this.inpts=d.inpts,this._processKey("",!1,!0)},d.prototype._updatePattern=function(){var a=this.patternMatcher.getPattern(this.val);a&&(this.mLength=a.mLength,this.chars=a.chars,this.inpts=a.inpts)},d.prototype._keyDown=function(a){var b=a.which||a.keyCode;return b&&c.isDelKeyDown(a.which,a.keyCode)?(this._processKey(null,b),c.preventDefault(a)):void 0},d.prototype._keyPress=function(a){var b,d;return b=a.which||a.keyCode,d=c.isSpecialKeyPress(a.which,a.keyCode),c.isDelKeyPress(a.which,a.keyCode)||d||c.isModifier(a)?void 0:(this._processKey(String.fromCharCode(b),!1),c.preventDefault(a))},d.prototype._paste=function(a){return this._processKey(c.getClip(a),!1),c.preventDefault(a)},d.prototype._focus=function(){var a=this;setTimeout(function(){var c=b.get(a.el),d=c.end>a.focus,e=0===c.end;(d||e)&&b.set(a.el,a.focus)},0)},d.prototype._processKey=function(a,d,e){if(this.sel=b.get(this.el),this.val=this.el.value,this.delta=0,this.sel.begin!==this.sel.end)this.delta=-1*Math.abs(this.sel.begin-this.sel.end),this.val=c.removeChars(this.val,this.sel.begin,this.sel.end);else if(d&&46===d)this._delete();else if(d&&this.sel.begin-1>=0)this.val=c.removeChars(this.val,this.sel.end-1,this.sel.end),this.delta-=1;else if(d)return!0;d||(this.val=c.addChars(this.val,a,this.sel.begin),this.delta+=a.length),this._formatValue(e)},d.prototype._delete=function(){for(;this.chars[this.sel.begin];)this._nextPos();this.sel.beginthis.focus&&(this.delta+=this.sel.end-this.focus);for(var a=0,b=0;b<=this.mLength;b++){var d,e=this.chars[b],f=this.hldrs[b],g=b+a;g=b>=this.sel.begin?g+this.delta:g,d=this.val.charAt(g),(e&&e===d||f&&f===d)&&(this.val=c.removeChars(this.val,g,g+1),a--)}this.hldrs={},this.focus=this.val.length},d.prototype._validateInpts=function(){for(var a=0;a 0) { + var paymentsClient = _getGooglePaymentsClient(context.environment); + paymentsClient.loadPaymentData(_getGooglePaymentDataRequest(paymentProductSpecificInputs, _networks, paymentDetails)) + .then(function (paymentData) { + // Get the payment product so the paymentRequest can be completed + // We do this here because Google does not allow async calls to be done between clicking and opening the payment sheet with 'loadPaymentData'. + session.getPaymentProduct(googlePayId, paymentDetails, paymentProductSpecificInputs).then(function (paymentProduct) { + // We need to set the paymentProduct for the encryptor to be able to do it's work. + paymentRequest.setPaymentProduct(paymentProduct); + // Set the value for encryptedPaymentData which is returned by the Google Pay payment sheet. + paymentRequest.setValue('encryptedPaymentData', paymentData.paymentMethodData.tokenizationData.token); + // encrypt paymentrequest + encryptGooglePayPayment(session, paymentRequest); + }, function () { + $("#error").fadeIn(); + }); + }) + .catch(function (err) { + // statusCode: "CANCELED" is when payment sheet closes -> do nothing + // statusCode: "BUYER_ACCOUNT_ERROR" The current Google user is unable to provide payment information. -> do nothing (cancel button on details is the way out) + switch (err.statusCode) { + case 'DEVELOPER_ERROR': + case 'INTERNAL_ERROR': + console.error("Oops! Something went wrong: ", err); + break; + default: + console.error('statusCode:', err); + break; + } + }); + } else { + console.error("There are no product networks available."); + } + } else { + console.error("There is no payment context"); + } +}; + +module.exports = setupGooglePayAndExecute; diff --git a/full-jquery-handlebars-systemjs/src/js/app/paymentitem-non-cards-helpers.js b/full-jquery-handlebars-systemjs/src/js/app/paymentitem-non-cards-helpers.js new file mode 100644 index 0000000..6be633d --- /dev/null +++ b/full-jquery-handlebars-systemjs/src/js/app/paymentitem-non-cards-helpers.js @@ -0,0 +1,268 @@ +var $ = require('jQuery'); +var Handlebars = require('handlebars'); + +/** + * This file contains helper functions for the example-app + * This declutters the example app itself; refer to the helper docs below for usage + */ +$(function () { + // declare a namespace in the window for references + window.connect = window.connect || {}; + + /** + * Adds non-simple validators. Use {@link connect#addValidators} to add the validators. + * + * @param {object} paymentItem - The paymentItem on which to bind the validations + */ + connect.addValidators = function (paymentItem) { + + // The payment product defines a set of data restrictions per field. We need to add functionality to + // our pages. In our case we use jQuery validator as the library to actually do these validations. + + // We extend the default jQuery validator with additional methods that call the correct SDK validator. + // The SDK offers validators per validation type (e.g. Luhn check, range check, etc). These extensions + // below only need to call the correct validator with the value that was entered by the user. + _addSimpleValidator("regularExpression", paymentItem, "Please enter valid data"); + _addSimpleValidator("iban", paymentItem, "Please enter valid iban"); + + var lParams = null; + jQuery.validator.addMethod("length", function (value, element, params) { + var paymentProductField = paymentItem.paymentProductFieldById[element.id]; + if (paymentProductField) { + var dataRestrictions = paymentProductField.dataRestrictions; + var validation = dataRestrictions.validationRuleByType["length"]; + var unmaskedValue = paymentProductField.removeMask(value); + // update params with the attributes + lParams = [validation.minLength, validation.maxLength]; + return this.optional(element) || validation.validate(unmaskedValue); + } else { + return true; + } + }, function () { + if (lParams[0] === lParams[1]) { + return jQuery.validator.format("Please enter a value of length {0}", lParams[0]); + } else { + return jQuery.validator.format("Please enter a valid length between {0} and {1}", lParams[0], lParams[1]); + } + }); + + var rParams = []; + jQuery.validator.addMethod("range", function (value, element, params) { + var id = element.id; + if (element.id.indexOf("-baseCurrencyUnit") !== -1 || element.id.indexOf("-centecimalCurrencyUnit") !== -1) { + id = element.id.substring(0, element.id.indexOf("-")); + } + var paymentProductField = paymentItem.paymentProductFieldById[id]; + if (paymentProductField) { + var dataRestrictions = paymentProductField.dataRestrictions; + var validation = dataRestrictions.validationRuleByType["range"]; + var unmaskedValue = paymentProductField.removeMask(value); + // update params with the attributes + rParams = [validation.minValue, validation.maxValue]; + if (element.id.indexOf("-baseCurrencyUnit") !== -1 || element.id.indexOf("-centecimalCurrencyUnit") !== -1) { + rParams = [Number(validation.minValue).toFixed(2), (Number(validation.maxValue) / 100).toFixed(2)]; + // combine the field as one price and validate as cents + var eur = $("#" + id + "-baseCurrencyUnit").val() * 100, + cent = $("#" + id + "-centecimalCurrencyUnit").val() * 1, + total = eur + cent; + return this.optional(element) || validation.validate(total); + } + return this.optional(element) || validation.validate(unmaskedValue); + } else { + return true; + } + }, function () { + return jQuery.validator.format("Please enter a valid range between {0} and {1}", rParams[0], rParams[1]); + }); + + var fiscalNumber; + jQuery.validator.addMethod('boletobancariorequiredness', function (value, element, params) { + var id = element.id; + var paymentProductField = paymentItem.paymentProductFieldById[id]; + if (paymentProductField) { + var dataRestrictions = paymentProductField.dataRestrictions; + var validation = dataRestrictions.validationRuleByType["boletoBancarioRequiredness"]; + var unmaskedValue = paymentProductField.removeMask(value); + fiscalNumber = validation.fiscalNumberLength; + // this validator needs the fiscalNumber value so get it from the live domElement + var fiscalNumberValue = paymentItem.paymentProductFieldById["fiscalNumber"].removeMask($("#fiscalNumber").val()); + return validation.validate(unmaskedValue, fiscalNumberValue); + } else { + return true; + } + }, function () { + return jQuery.validator.format("This field is required if fiscalNumber is {0}", fiscalNumber); + }); + }; + + /** + * Update the masks in fields. Use {@link connect#updateFieldMask} to apply the mask to all visible fields + * + * @param {object} paymentItem - The paymentItem to apply masking to + */ + connect.updateFieldMask = function (paymentItem) { + $("input").each(function () { + // We look for the SDK mask that is defined on the payment product field. If it exists we add the formatter + // logic to the field so any time the user changes the field's value the formatter nicely formats it. + var paymentProductField = paymentItem.paymentProductFieldById[$(this).attr("id")];; + + if (paymentProductField) { + var mask = paymentProductField.displayHints.mask; + if (mask) { + $(this).formatter({ + 'pattern': mask + }); + } + } + }); + }; + + /** + * Updates the view of a paymentProduct. Use {@link connect#updatePaymentProduct} to update. + * + * @param {object} paymentProduct - The paymentProduct to use to update the view + */ + connect.updatePaymentProduct = function (paymentProduct) { + // A - Add new fields to the view + _addFields(paymentProduct); + // B - Remove unused fields from view + _removeUnwantedFields(paymentProduct); + // C - Update tooltips + _updateAllTooltips(paymentProduct); + // D - Update validators + _updateAllValidators(paymentProduct); + }; + + /** + * Private function that adds simple validation to a field + * + * @param {string} validationType - Type of validation to add. + * @param {object} paymentItem - Used paymentItem for this validation. + * @param {string} meesage - The message to display if validation fails. + */ + function _addSimpleValidator(validationType, paymentItem, message) { + jQuery.validator.addMethod(validationType, function (value, element, params) { + var paymentProductFieldId = element.id; + var paymentProductField = paymentItem.paymentProductFieldById[paymentProductFieldId]; + // If there is no field associated with the id then we just assume there is no validation + if (paymentProductField) { + var dataRestrictions = paymentProductField.dataRestrictions; + var validation = dataRestrictions.validationRuleByType[validationType]; + var unmaskedValue = paymentProductField.removeMask(value); + return this.optional(element) || validation.validate(unmaskedValue); + } else { + return true; + } + }, message); + }; + + /** + * Private function that adds new fields to the view based on the paymentItem + * + * @param {object} paymentItem - the paymentItem that has the paymentFields. + */ + function _addFields(paymentItem) { + var fields = paymentItem.paymentProductFields; + var elementsInOrder = []; + $.each(fields, function () { + var field = this; + if ($("#" + field.id).length === 0) { + var source = $("#productfield-template").html(); + var template = Handlebars.compile(source); + var domElement = template(field); + elementsInOrder[field.displayHints.displayOrder] = $(domElement); + // $("form .form-group:last").after(domElement); + } else { + elementsInOrder[field.displayHints.displayOrder] = $("#" + field.id).closest(".form-group").detach(); // remove from view + } + }); + if (elementsInOrder.length > 0) { + $.each(elementsInOrder, function () { + if (this) { + $(".fields-holder").append(this); + } + }); + if (paymentItem.allowsTokenization && paymentItem.autoTokenized === false) { + $("#rememberme").closest('.checkbox').show(); + } + } + }; + + /** + * Private function that removes unwanted fields from the view based on the paymentItem. + * + * @param {object} paymentItem - the paymentItem that has the paymentFields. + * + */ + function _removeUnwantedFields(paymentItem) { + var fields = paymentItem.paymentProductFields; + + var visibleFields = $(".form-group[data-wrapper]"); + var newFields = []; + $.each(visibleFields, function () { + var id = $(this).data("wrapper"); + $.each(fields, function () { + var field = this; + if (id === field.id) { + // found we store this one to keep + newFields.push(id); + } + }); + }); + // now remove the fields we no longer see + $.each(visibleFields, function () { + var id = $(this).data("wrapper"); + if ($.inArray(id, newFields) === -1) { + $(this).remove(); + } + }); + if (!(paymentItem.allowsTokenization && paymentItem.autoTokenized === false)) { + $("#rememberme").closest('.checkbox').hide(); + } + }; + + /** + * Private function that updates all tooltips and tooltip images in the view based on the paymentItem. + * + * @param {object} paymentItem - the paymentItem that has the updated tooltip(images). + */ + function _updateAllTooltips(paymentItem) { + var fields = paymentItem.paymentProductFields; + $.each(fields, function () { + var field = this; + if (field.displayHints && field.displayHints.tooltip) { + var tooltipImage = field.displayHints.tooltip.image, + tooltipText = field.displayHints.tooltip.label; + $("#" + field.id + "-popover").attr("data-content", tooltipText + "
"); + } + }); + }; + + /** + * Private function that updates the validators associated to this paymentItem. + * + * @param {object} paymentItem - the paymentItem that has the updated validators. + */ + function _updateAllValidators(paymentItem) { + connect.addValidators(paymentItem); + var fields = paymentItem.paymentProductFields; + $.each(fields, function () { + var field = this; + if (field.dataRestrictions && field.dataRestrictions.hasOwnProperty('isRequired')) { + if (field.dataRestrictions.isRequired) { + $("#" + field.id).attr("required", true); + } else { + $("#" + field.id).removeAttr("required"); + } + } + $("#" + field.id).rules("remove"); + $.each(field.dataRestrictions.validationRuleByType, function (key, value) { + $("#" + field.id).data("rule-" + key, true); + }); + if (field.id === "cardNumber") { + // we need the allowedInContext validator for cradNumber fields + $("#" + field.id).attr("data-rule-allowedInContext", true); + } + }); + }; +}); diff --git a/full-jquery-handlebars-systemjs/src/js/app/paymentitem-non-cards.js b/full-jquery-handlebars-systemjs/src/js/app/paymentitem-non-cards.js new file mode 100644 index 0000000..3b7ad9d --- /dev/null +++ b/full-jquery-handlebars-systemjs/src/js/app/paymentitem-non-cards.js @@ -0,0 +1,295 @@ +var $ = require('jQuery'); +var connectSDK = require('connectsdk.Session'); +var Handlebars = require('handlebars'); +var applePayId = 302; +require('jquery-validation'); +require('bootstrap'); + +require('./validate-defaults'); +require('./paymentitem-non-cards-helpers'); +require('./paymentitem-formatter'); + +$(function () { + function _showPaymentItem (id) { + $('#loading').show(); + + session.getPaymentProduct(id, paymentDetails).then( + function (paymentProduct) { + $('#loading').hide(); + paymentRequest.setPaymentProduct(paymentProduct); + + var accountOnFile = null; + if (accountOnFile) { + paymentRequest.setAccountOnFile(accountOnFile); + } + + if (paymentProduct.paymentProductFields.length === 0) { + encrypt(); + } else { + if (paymentProduct.id === applePayId) { + _renderPage(paymentProduct, $('#applepay-template').html(), accountOnFile, false); + } else { + _renderPage(paymentProduct, $('#detail-template').html(), accountOnFile, false); + + } + } + }, + function () { + $('#loading').hide(); + $('#error').fadeIn(); + } + ); + } + + function _renderPage (paymentItem, source, accountOnFile, isGroup) { + var template = Handlebars.compile(source); + var json = paymentItem.json; + + // Render Apple pay template + if (paymentItem.id === applePayId) { + $('#handlebarsDrop').html(template(json)); + $("#apple-pay-button").click(function () { + + if (paymentItem.acquirerCountry) { + paymentProductSpecificInputs.applePay.acquirerCountry = paymentItem.acquirerCountry; + } + + session.createApplePayPayment(paymentDetails, paymentProductSpecificInputs.applePay, paymentItem.paymentProduct302SpecificData.networks).then(function (res) { + var request = session.getPaymentRequest(); + request.setValue('encryptedPaymentData', JSON.stringify(res.data.paymentData)); + encrypt(); + }, function (res) { + $('#loading').hide(); + console.error(res.message); + }) + }) + return; + } + + // We now add some additional stuff to the JSON object that represents the selected payment product so handlebars + // can actually fill out all the variables in its template. Some of these values for these variables are not + // available in the core payment product info so we add them. + $.each(json.fields, function (index, field) { + // A) a isCurrency field because the #if Handlebars clause it too limited (it cannot do the === 'currency' check itself) + if (field.displayHints.formElement.type === 'currency') { + field.displayHints.formElement.isCurrency = true; + } + + // B) The paymentDetails so we can use its data in the field renderer; useful for printing currency etc. + field.paymentContext = paymentDetails; + + // C) In the case we have an account on file (AOF) we need to display the known values that + // are defined for the fields that the AOF contains. We're adding these values to the fields + if (accountOnFile) { + var relatedAofField = accountOnFile.attributeByKey[field.id]; + if (relatedAofField) { + // Nice, the account on file has an existing value for this field. To signal to the handlebars template + // that this is the case we add a new field field.aofData that contains that known value. However: we want + // to apply a mask to the known value before we show it. To do that we first retrieve the paymentProductField + // SDK object because it has the applyMask method. Note that we should not use the getMaskedValueByAttributeKey + // method on the AccountOnFile object because that uses the masking info that is provided in the + // AccountOnFile displayHints object. That object is used to indicate which AoF fields should be shown + // in the payment product selection list by including only the masks for those fields. In our case we want + // to mask all known fields, so we fall back to the mask information in the paymentProductField object. + var paymentProductField = paymentItem.paymentProductFieldById[field.id]; + field.knownValue = paymentProductField.applyWildcardMask(relatedAofField.value).formattedValue; + + // We also determine if this field should be readonly. This depends on the status of the field + // as defined in the Account On File object. If the status is READ_ONLY it cannot be changed, but + // if the value is CAN_WRITE or even MUST_WRITE it's existing value can be overwritten. + field.isReadOnly = !relatedAofField.status || relatedAofField.status === 'READ_ONLY'; + } + } + + // D) Fields that are part of the aofData and that have the READ_ONLY status should be excluded from the + // encrypted blob. + field.includeInEncryptedBlob = field.isReadOnly === undefined || field.isReadOnly ? 'false' : 'true'; + + // E) indicate that this field is the cardnumber field to render the holder for the cobrands feature + if (field.id === 'cardNumber') { + field.isCardNumberField = true; + } + + // F) indicate that we have an installmentId + if (field.id === 'termsAndConditions') { + field.isTermAndConditionsField = true; + field.displayHints.label = field.displayHints.label.replace('{link}', json.displayHints.label); + } + }); + + // E) There's one field that we should add to the form that is not included in the payment product fields list for + // a payment product: the "remember me" option, aka : tokenization. It's only visible if the payment product + // itself allows it: allowsTokenization === true && autoTokenized === false. (If autoTokenized === true it will + // get tokenized automatically by the server and we do not need to show the checkbox). + + // for groups a different logic is in place: if the payment is recurring the checkbox should be shown. + if (isGroup) { + json.showRememberMe = paymentDetails.isRecurring; + } else { + json.showRememberMe = json.allowsTokenization === true && json.autoTokenized === false; + } + + // We have extended the JSON object that represents the payment product so that it contains + // all the necessary information to fill in the Handlebars template. Now we generate the + // HTML and add it to the DOM. + $('#handlebarsDrop').html(template(json)); + if (!json.showRememberMe) { + $('#rememberme') + .closest('.checkbox') + .hide(); + } + + // 2) Add validators to each of the fields in the form + connect.addValidators(paymentItem); + + // 3) Add submit handling for when the user finishes filling out the form + + // After the customer is done filling out the form he submits it. But instead of sending the form to the server + // we validate it and if successful we encrypt the result. Your application should send the cypher text to + // your e-commerce server itself. + $('.validatedForm').validate({ + submitHandler: function (e) { + // We create an object with key:value pairs consisting on the id of the paymentproductfield + // and its value as presented (with or without mask). + var blob = {}; + + // We only add the form elements that have the "data-includeInEncryptedBlob=true" attribute; which we've added + // to each input/select when we created the form. + $('.validatedForm [data-includeInEncryptedBlob=true]').each(function () { + if ( + $(this) + .attr('id') + .indexOf('-baseCurrencyUnit') !== -1 || + $(this) + .attr('id') + .indexOf('-centecimalCurrencyUnit') !== -1 + ) { + // The example application splits up currency fields into two fields: base currency and cents + // We need to merge the values of these two fields again because the SDK only accepts one + // value per field (and it expects the complete value in cents in this case) + var id = $(this) + .attr('id') + .substring( + 0, + $(this) + .attr('id') + .indexOf('-') + ); + if ( + $(this) + .attr('id') + .indexOf('-baseCurrencyUnit') !== -1 + ) { + blob[id] = blob[id] ? Number(blob[id]) + Number($(this).val() * 100) + '' : Number($(this).val() * 100) + ''; + } + if ( + $(this) + .attr('id') + .indexOf('-centecimalCurrencyUnit') !== -1 + ) { + blob[id] = blob[id] ? Number(blob[id]) + Number($(this).val()) + '' : Number($(this).val()) + ''; + } + } else { + // In all other cases just us ethe entered value + blob[$(this).attr('id')] = $(this).val(); + } + }); + + // Remember that we need to add all entered values to paymentRequest so they will be included in the + // encryption later on. + for (var key in blob) { + paymentRequest.setValue(key, blob[key]); + } + + // encrypt the paymentRequest + encrypt(); + + // Cancel submitting the form + return false; + } + }); + + // 4) Add handlers for some additional bells and whistles (such as tooltips, IIN lookups, etc) + + // A) Sometimes we show the "tokenize payment" checkbox (See above). Because of this special way of including the + // field we also need a separate handling of it. That is done here. + $('#rememberme').on('change', function () { + paymentRequest.setTokenize($(this).is(':checked')); + }); + + // B) Some fields have tooltips (e.g. the CVV code field). We initialize the popups that contain those tooltips here. + $('.info-popover').popover(); + + // C) We mask the fields that need masking as defined in the payment product field definition. Either use use a jquery masked + // input plugin, or write your own. In this example we use jquery formatter plugin, which is included in this file at the + // bottom. + + connect.updateFieldMask(paymentItem); + } + + + + function encrypt () { + $('#loading').show(); + + // Create an SDK encryptor object + var encryptor = session.getEncryptor(); + + // Encrypting is an async task that we provide you as a promise. + encryptor.encrypt(paymentRequest).then( + function (encryptedString) { + // The promise has fulfilled. + sessionStorage.setItem('encryptedString', encryptedString); + document.location.href = 'dev-success.html'; + }, + function (errors) { + // The promise failed, inform the user what happened. + + $('#loading').hide(); + console.error('Failed to encrypt due to', errors); + } + ); + } + + var context = sessionStorage.getItem('context'); + if (!context) { + document.location.href = 'dev-start.html'; + } + + context = JSON.parse(context); + var sessionDetails = { + clientSessionId: context.clientSessionId, + customerId: context.customerId, + clientApiUrl: context.clientApiUrl, + assetUrl: context.assetUrl + }; + var paymentDetails = { + totalAmount: context.totalAmount, + countryCode: context.countryCode, + locale: context.locale, + isRecurring: context.isRecurring, + currency: context.currency + }; + var paymentProductSpecificInputs = { + applePay: { + merchantName: context.merchantName + }, + } + var grouping = context.grouping; + var session = new connectSDK(sessionDetails); + var paymentRequest = session.getPaymentRequest(); + + var search = document.location.search; + if (search) { + search = search.substring(1); + search = search.split('&'); + $.each(search, function (i, part) { + part = part.split('='); + if (part[0] === 'paymentitemId') { + _showPaymentItem(part[1]); + } + }); + } else { + $('#error').fadeIn(); + } +}); diff --git a/full-jquery-handlebars-systemjs/src/js/app/paymentitem-selection.js b/full-jquery-handlebars-systemjs/src/js/app/paymentitem-selection.js new file mode 100644 index 0000000..c4e3743 --- /dev/null +++ b/full-jquery-handlebars-systemjs/src/js/app/paymentitem-selection.js @@ -0,0 +1,182 @@ +var $ = require('jQuery'); +var connect = require('connectsdk.Session'); +var handlebars = require('handlebars'); +var setupGooglePayAndExecute = require('./paymentitem-googlepay'); +var cardHelpers = require('./paymentitem-cards-helpers'); +var googlePayId = 320; + +$(function () { + var context = sessionStorage.getItem('context'); + if (!context) { + document.location.href = 'dev-start.html'; + } + context = JSON.parse(context); + var sessionDetails = { + clientSessionId: context.clientSessionId, + customerId: context.customerId, + clientApiUrl: context.clientApiUrl, + assetUrl: context.assetUrl + }; + var paymentDetails = { + totalAmount: context.totalAmount, + countryCode: context.countryCode, + locale: context.locale, + isRecurring: context.isRecurring, + currency: context.currency + }; + var grouping = context.grouping; + // If you want to use Google Pay in your application, a merchantId is required to set it up. + // Besides that if you want to enable prefetching for Google Pay API, you also need to provide merchantName and gatewayMerchantId. + var paymentProductSpecificInputs = { + googlePay: { + merchantId: context.merchantId, + merchantName: context.merchantName, + gatewayMerchantId: context.gatewayMerchantId + } + }; + var session = new connect(sessionDetails); + var paymentRequest = session.getPaymentRequest(); + + window.connect.addHandleBarsHelpers(session); + + function getPaymentProductNetworks () { + session.getPaymentProduct(googlePayId, paymentDetails, paymentProductSpecificInputs).then(function (paymentProduct) { + // We extract some data from the Google Pay payment product response that is required to initialize Google Pay API + // As we can retrieve them here, we didn't add this as input fields on dev-start + // We add it to the paymentProductSpecificInputs for ease of use of one single object with Google Pay data we need to use in multiple places. + // Yes it is now also send to the SDK in getBasicPaymentItems but it is not needed but it also won't interfere. + paymentProductSpecificInputs.googlePay.networks = paymentProduct.paymentProduct320SpecificData.networks; + paymentProductSpecificInputs.googlePay.gateway = paymentProduct.paymentProduct320SpecificData.gateway; + if (paymentProduct.acquirerCountry) { + paymentProductSpecificInputs.googlePay.acquirerCountry = paymentProduct.acquirerCountry; + } + }); + } + + function isPaymentProductIdInList (paymentProductId, list) { + return list.filter(function (paymentItem) { + return paymentItem.id === paymentProductId; + }).length > 0; + } + + function _getPaymentItems () { + $("#loading").show(); + session.getBasicPaymentItems(paymentDetails, grouping, paymentProductSpecificInputs).then(function (basicPaymentItems) { + $("#loading").hide(); + + // let's build up the page :) + + // get all accountsonfile for all visible paymentitems + var aof = basicPaymentItems.accountsOnFile; + + // get all paymentitems for the paymentDetails + var items = basicPaymentItems.basicPaymentItems; + + // Create view to show both account on file as well as all payment items. + var view = { + accountsOnFile: aof.map(function (accountOnFile) { + var data = accountOnFile.json; + + // since we separate the payment methods in different views + // for example: `paymentitem-cards.html`, `paymentitem-non-cards.html` + // we need to tell handlebars to open which template, we do this by adding the + // `data-payment-method` + var extendedData = {}; + for (var i = 0, j = items.length; i < j; i += 1) { + var paymentItem = items[i]; + var paymentItemAccountOnFile = paymentItem.accountsOnFile.length > 0 ? paymentItem.accountsOnFile[0] : null; + + // we are only interested in the same `id` and `paymentProductId` + if (!paymentItemAccountOnFile) continue; + if (paymentItemAccountOnFile.id !== accountOnFile.id) continue; + if (paymentItemAccountOnFile.paymentProductId !== accountOnFile.paymentProductId) continue; + + // set extended data + extendedData = { + paymentMethod: paymentItem.id, + type: paymentItem.json.type + }; + break; + } + + // overwrite extendedData properties (`paymentMethod` & `type`) + for (var prop in extendedData) { + data[prop] = extendedData[prop]; + } + + return data; + }), + + paymentItems: items.map(function (paymentItem) { + return paymentItem.json; + }) + }; + + // Need to retrieve networks for Google Pay when Google Pay exists in paymentItems + if (isPaymentProductIdInList(googlePayId, view.paymentItems)) { + getPaymentProductNetworks() + } + + // build the handlebars template + var source = $("#list-template").html(); + var template = handlebars.compile(source); + + // and show it on the screen + $("#handlebarsDrop").html(template(view)); + + // Delegate a click on the list of paymentitems to get the details of a single paymentitem. + // Note that we have included some code to handle history management as well. If you use a MVC based + // framework this should be handled by the framework. + $("body") + .off("click", "#paymentoptionslist button") + .on("click", "#paymentoptionslist button", function (e) { + e.preventDefault(); + + // Get the id of the clicked payment item or the ids of the clicked account on file and its + // associated payment item. + var id, aofid, type, method; + if ($(this).data("payment-id")) { + // the user clicked on a payment item + id = $(this).data("payment-id"); + aofid = null; + type = $(this).data("payment-type"); + method = $(this).data("payment-method"); + } else { + // the user clicked on an account on file + id = $(this).data("aof-ppid"); + aofid = $(this).data("aof-id"); + method = $(this).data("payment-method"); + } + + // get search query params + var search = '?' + [ + { key: 'paymentitemId', value: id }, + { key: 'type', value: type }, + { key: 'accountOnFileId', value: aofid } + ].filter(function (obj) { + return typeof obj.value !== 'undefined'; + }).map(function (obj) { + return obj.key + '=' + obj.value; + }).join('&'); + + // now redirect based on type + if ((id === 'cards' && type === 'group') || method === "card" || method === 'cards') { + // redirect to a specific page for card payments + document.location.href = 'paymentitem-cards.html' + search; + } else if (id === 1503) { + document.location.href = 'paymentitem-boleto.html' + search; + } else if (id === googlePayId) { + setupGooglePayAndExecute(session, context, paymentDetails, paymentRequest, paymentProductSpecificInputs); + } else { + // otherwise redirect o the details page + document.location.href = 'paymentitem-non-cards.html' + search; + } + }); + }, function () { + $("#loading").hide(); + $("#error").fadeIn(); + }); + } + + _getPaymentItems(); +}); diff --git a/full-jquery-handlebars-systemjs/src/js/app/validate-defaults.js b/full-jquery-handlebars-systemjs/src/js/app/validate-defaults.js new file mode 100644 index 0000000..0fea97e --- /dev/null +++ b/full-jquery-handlebars-systemjs/src/js/app/validate-defaults.js @@ -0,0 +1,44 @@ +$.validator.setDefaults({ + errorClass: "error", + errorElement: "label", // the error element type + errorPlacement: function(error, element) { + var parentLabel = element.parent('label') + ,formGroup = element.closest('.form-group'); + + + if (parentLabel.length === 1) { + /* + radio and checkboxes might be placed inside a .form-group, like this: +
+
+

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 literal 0 HcmV?d00001 diff --git a/full-angularjs/index.html b/full-angularjs/index.html new file mode 100644 index 0000000..701e596 --- /dev/null +++ b/full-angularjs/index.html @@ -0,0 +1,148 @@ + + + + + + Connect SDK Client JS Angularjs example + + + + + + +