[PORTAL-10] Enhancing Drill Down 45/5945/1
authorst782s <statta@research.att.com>
Wed, 24 May 2017 14:20:53 +0000 (10:20 -0400)
committerst782s <statta@research.att.com>
Wed, 24 May 2017 14:22:16 +0000 (10:22 -0400)
Changes have been made to improve the stability of Drill down
capabilities.

Change-Id: I6d4831b69f19f9b33cf43b65acc6dd7c5deebb67
Signed-off-by: st782s <statta@research.att.com>
17 files changed:
ecomp-sdk/epsdk-app-overlay/README.md
ecomp-sdk/epsdk-app-overlay/src/main/webapp/app/fusion/external/b2b/css/b2b-angular/b2b-angular.css
ecomp-sdk/epsdk-app-overlay/src/main/webapp/app/fusion/external/b2b/js/b2b-angular/b2b-library.min.js
ecomp-sdk/epsdk-app-overlay/src/main/webapp/app/fusion/scripts/DS2-controllers/ds2-reports/report-chart-controller.js
ecomp-sdk/epsdk-app-overlay/src/main/webapp/app/fusion/scripts/DS2-controllers/ds2-reports/report-run-controller.js
ecomp-sdk/epsdk-app-overlay/src/main/webapp/app/fusion/scripts/DS2-controllers/ds2-reports/report-step-controller.js
ecomp-sdk/epsdk-app-overlay/src/main/webapp/app/fusion/scripts/DS2-directives/ds2Header.js
ecomp-sdk/epsdk-app-overlay/src/main/webapp/app/fusion/scripts/DS2-services/ds2-raptor-report/raptorReportFactory.js
ecomp-sdk/epsdk-app-overlay/src/main/webapp/app/fusion/scripts/DS2-view-models/b2b-leftnav-ext.html
ecomp-sdk/epsdk-app-overlay/src/main/webapp/app/fusion/scripts/DS2-view-models/ds2-admin/admin-menu-edit.html
ecomp-sdk/epsdk-app-overlay/src/main/webapp/app/fusion/scripts/DS2-view-models/ds2-reports/modal/report-wizard-col-edit.html
ecomp-sdk/epsdk-app-overlay/src/main/webapp/app/fusion/scripts/DS2-view-models/ds2-reports/modal/report-wizard-drilldown-edit.html
ecomp-sdk/epsdk-app-overlay/src/main/webapp/app/fusion/scripts/DS2-view-models/ds2-reports/report-run.html
ecomp-sdk/epsdk-app-overlay/src/main/webapp/app/fusion/styles/ecomp.css
ecomp-sdk/epsdk-core/src/main/java/org/openecomp/portalsdk/core/conf/AppConfig.java
ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/util/SSOUtil.java
ecomp-sdk/pom.xml

index 174d445..affe1b9 100644 (file)
@@ -18,7 +18,8 @@ AngularJS version 1.5.0.
 ### OpenECOMP Distributions
 
 Version 1.1.0
-- [Portal-7] Improvements added as part of the rebasing process
+[Portal-7] Improvements added as part of the rebasing process
+[Portal-10] Enhancing Drill Down Capabilities of EcompSDK Analytics
+
 Version 1.0.0
 - Initial release
index d124617..69f8d96 100644 (file)
@@ -1,48 +1,41 @@
-/*! b2b-angular-library - v1.0.1 - Last updated: 2017-03-02. Copyright (c) 2016 AT&T Services, Inc. */ 
-.b2b-horizontal-table {
-  border: 1px solid;
-  width: 651px; }
-  .b2b-horizontal-table ::-webkit-scrollbar {
-    height: 10px; }
-  .b2b-horizontal-table ::-webkit-scrollbar-thumb {
-    background: #666666;
-    border-radius: 5px; }
-  .b2b-horizontal-table .b2b-horizontal-table-inner-container {
-    width: 650px;
-    padding-left: 150px;
-    overflow-x: scroll; }
-  .b2b-horizontal-table th:first-child {
-    background-color: #FFFFFF; }
-  .b2b-horizontal-table td:first-child {
-    background-color: #FFFFFF;
-    border-top: 1px solid #cccccc;
-    border-right: 1px solid #cccccc;
-    margin-top: -0.5px; }
-  .b2b-horizontal-table tr th:nth-child(2), .b2b-horizontal-table tr td:nth-child(2) {
-    border-left: none; }
-  .b2b-horizontal-table .b2b-horizontal-table-column-info {
-    padding-top: 16px;
-    text-align: center; }
-  .b2b-horizontal-table .b2b-horizontal-table-arrows .btn-arrow:hover, .b2b-horizontal-table .b2b-horizontal-table-arrows .btn-arrow:focus {
-    text-decoration: none; }
-  .b2b-horizontal-table .b2b-horizontal-table-arrows .left {
-    float: left;
-    margin: 10px;
-    color: #0568ae; }
-    .b2b-horizontal-table .b2b-horizontal-table-arrows .left[disabled] {
-      color: #767676;
-      cursor: not-allowed; }
-  .b2b-horizontal-table .b2b-horizontal-table-arrows .right {
-    float: right;
-    clear: right;
-    margin: 10px;
-    color: #0568ae; }
-    .b2b-horizontal-table .b2b-horizontal-table-arrows .right[disabled] {
-      color: #767676;
-      cursor: not-allowed; }
-    .b2b-horizontal-table .b2b-horizontal-table-arrows .right.btn-arrow .btn {
-      margin-right: 0;
-      margin-left: 10px; }
+/*! b2b-angular-library - v1.0.4 - Last updated: 2017-05-03. Copyright (c) 2016 AT&T Services, Inc. */ 
+.b2b-horizontal-table ::-webkit-scrollbar {
+  height: 10px; }
+
+.b2b-horizontal-table ::-webkit-scrollbar-thumb {
+  background: #666666;
+  border-radius: 5px; }
+
+.b2b-horizontal-table .b2b-frozen-col {
+  font-size: 12px;
+  font-weight: normal;
+  font-style: italic; }
+
+.b2b-horizontal-table .b2b-horizontal-table-inner-container {
+  overflow-x: scroll; }
+
+.b2b-horizontal-table .b2b-horizontal-table-column-info {
+  text-align: center; }
+
+.b2b-horizontal-table .b2b-horizontal-table-legend div[b2b-flyout-toggler] {
+  color: #0568ae;
+  cursor: pointer; }
+
+.b2b-horizontal-table .b2b-horizontal-table-legend .b2b-frozen-cell {
+  width: 16px;
+  height: 16px;
+  background-color: #F2F2F2;
+  display: inline-block;
+  margin-right: 10px; }
+
+.b2b-horizontal-table .b2b-horizontal-table-arrows {
+  margin-bottom: 20px; }
+  .b2b-horizontal-table .b2b-horizontal-table-arrows .b2b-disabled-text {
+    color: #767676; }
+  .b2b-horizontal-table .b2b-horizontal-table-arrows .b2b-next-link {
+    padding-right: 15px; }
+  .b2b-horizontal-table .b2b-horizontal-table-arrows .b2b-prev-link {
+    padding-left: 15px; }
 
 @-moz-document url-prefix() {
   .b2b-horizontal-table td:first-child {
@@ -193,57 +186,57 @@ small {
 
 @font-face {
   font-family: "Omnes-ECOMP-W02";
-  src: url("fonts/Omnes_ATTW02.eot");
-  src: url("fonts/Omnes_ATTW02.eot?#iefix") format("embedded-opentype"), url("fonts/Omnes_ATTW02.woff") format("woff"), url("fonts/Omnes_ATTW02.ttf") format("truetype");
+  src: url("../b2b-angular/fonts/Omnes_ATTW02.eot");
+  src: url("../b2b-angular/fonts/Omnes_ATTW02.eot?#iefix") format("embedded-opentype"), url("../b2b-angular/fonts/Omnes_ATTW02.woff") format("woff"), url("../b2b-angular/fonts/Omnes_ATTW02.ttf") format("truetype");
   font-weight: normal;
   font-style: normal; }
 
 @font-face {
   font-family: "Omnes-ECOMP-W02-Medium";
-  src: url("fonts/Omnes_ATTW02Medium.eot");
-  src: url("fonts/Omnes_ATTW02Medium.eot?#iefix") format("embedded-opentype"), url("fonts/Omnes_ATTW02Medium.woff") format("woff"), url("fonts/Omnes_ATTW02Medium.ttf") format("truetype");
+  src: url("../b2b-angular/fonts/Omnes_ATTW02Medium.eot");
+  src: url("../b2b-angular/fonts/Omnes_ATTW02Medium.eot?#iefix") format("embedded-opentype"), url("../b2b-angular/fonts/Omnes_ATTW02Medium.woff") format("woff"), url("../b2b-angular/fonts/Omnes_ATTW02Medium.ttf") format("truetype");
   font-weight: normal;
   font-style: normal; }
 
 @font-face {
   font-family: "Omnes-ECOMP-W02-Italic";
-  src: url("fonts/Omnes_ATTW02Italic.eot");
-  src: url("fonts/Omnes_ATTW02Italic.eot?#iefix") format("embedded-opentype"), url("fonts/Omnes_ATTW02Italic.woff") format("woff"), url("fonts/Omnes_ATTW02Italic.ttf") format("truetype");
+  src: url("../b2b-angular/fonts/Omnes_ATTW02Italic.eot");
+  src: url("../b2b-angular/fonts/Omnes_ATTW02Italic.eot?#iefix") format("embedded-opentype"), url("../b2b-angular/fonts/Omnes_ATTW02Italic.woff") format("woff"), url("../b2b-angular/fonts/Omnes_ATTW02Italic.ttf") format("truetype");
   font-weight: normal;
   font-style: normal; }
 
 @font-face {
   font-family: "Omnes-ECOMP-W02-Light";
-  src: url("fonts/Omnes_ATTW02Light.eot");
-  src: url("fonts/Omnes_ATTW02Light.eot?#iefix") format("embedded-opentype"), url("fonts/Omnes_ATTW02Light.woff") format("woff"), url("fonts/Omnes_ATTW02Light.ttf") format("truetype");
+  src: url("../b2b-angular/fonts/Omnes_ATTW02Light.eot");
+  src: url("../b2b-angular/fonts/Omnes_ATTW02Light.eot?#iefix") format("embedded-opentype"), url("../b2b-angular/fonts/Omnes_ATTW02Light.woff") format("woff"), url("../b2b-angular/fonts/Omnes_ATTW02Light.ttf") format("truetype");
   font-weight: normal;
   font-style: normal; }
 
 @font-face {
   font-family: "Omnes-ECOMP-W02-Bold";
-  src: url("fonts/Omnes_ATTW02Bold.eot");
-  src: url("fonts/Omnes_ATTW02Bold.eot?#iefix") format("embedded-opentype"), url("fonts/Omnes_ATTW02Bold.woff") format("woff"), url("fonts/Omnes_ATTW02Bold.woff2") format("woff2"), url("fonts/Omnes_ATTW02Bold.ttf") format("truetype");
+  src: url("../b2b-angular/fonts/Omnes_ATTW02Bold.eot");
+  src: url("../b2b-angular/fonts/Omnes_ATTW02Bold.eot?#iefix") format("embedded-opentype"), url("../b2b-angular/fonts/Omnes_ATTW02Bold.woff") format("woff"), url("../b2b-angular/fonts/Omnes_ATTW02Bold.woff2") format("woff2"), url("../b2b-angular/fonts/Omnes_ATTW02Bold.ttf") format("truetype");
   font-weight: normal;
   font-style: normal; }
 
 @font-face {
   font-family: "Omnes-ECOMP-W02-Light-Italic";
-  src: url("fonts/Omnes_ATTW02LightItalic.eot");
-  src: url("fonts/Omnes_ATTW02LightItalic.eot?#iefix") format("embedded-opentype"), url("fonts/Omnes_ATTW02LightItalic.woff") format("woff"), url("fonts/Omnes_ATTW02LightItalic.woff2") format("woff2"), url("fonts/Omnes_ATTW02LightItalic.ttf") format("truetype");
+  src: url("../b2b-angular/fonts/Omnes_ATTW02LightItalic.eot");
+  src: url("../b2b-angular/fonts/Omnes_ATTW02LightItalic.eot?#iefix") format("embedded-opentype"), url("../b2b-angular/fonts/Omnes_ATTW02LightItalic.woff") format("woff"), url("../b2b-angular/fonts/Omnes_ATTW02LightItalic.woff2") format("woff2"), url("../b2b-angular/fonts/Omnes_ATTW02LightItalic.ttf") format("truetype");
   font-weight: normal;
   font-style: normal; }
 
 @font-face {
   font-family: "Omnes-ECOMP-W02-Medium-Italic";
-  src: url("fonts/Omnes_ATTW02MediumItalic.eot");
-  src: url("fonts/Omnes_ATTW02MediumItalic.eot?#iefix") format("embedded-opentype"), url("fonts/Omnes_ATTW02MediumItalic.woff") format("woff"), url("fonts/Omnes_ATTW02MediumItalic.woff2") format("woff2"), url("fonts/Omnes_ATTW02MediumItalic.ttf") format("truetype");
+  src: url("../b2b-angular/fonts/Omnes_ATTW02MediumItalic.eot");
+  src: url("../b2b-angular/fonts/Omnes_ATTW02MediumItalic.eot?#iefix") format("embedded-opentype"), url("../b2b-angular/fonts/Omnes_ATTW02MediumItalic.woff") format("woff"), url("../b2b-angular/fonts/Omnes_ATTW02MediumItalic.woff2") format("woff2"), url("../b2b-angular/fonts/Omnes_ATTW02MediumItalic.ttf") format("truetype");
   font-weight: normal;
   font-style: normal; }
 
 @font-face {
   font-family: "Omnes-ECOMP-W02-Bold-Italic";
-  src: url("fonts/Omnes_ATTW02BoldItalic.eot");
-  src: url("fonts/Omnes_ATTW02BoldItalic.eot?#iefix") format("embedded-opentype"), url("fonts/Omnes_ATTW02BoldItalic.woff") format("woff"), url("fonts/Omnes_ATTW02BoldItalic.woff2") format("woff2"), url("fonts/Omnes_ATTW02BoldItalic.ttf") format("truetype");
+  src: url("../b2b-angular/fonts/Omnes_ATTW02BoldItalic.eot");
+  src: url("../b2b-angular/fonts/Omnes_ATTW02BoldItalic.eot?#iefix") format("embedded-opentype"), url("../b2b-angular/fonts/Omnes_ATTW02BoldItalic.woff") format("woff"), url("../b2b-angular/fonts/Omnes_ATTW02BoldItalic.woff2") format("woff2"), url("../b2b-angular/fonts/Omnes_ATTW02BoldItalic.ttf") format("truetype");
   font-weight: normal;
   font-style: normal; }
 
@@ -824,8 +817,8 @@ small {
 
 @font-face {
   font-family: 'icoPrimary';
-  src: url("fonts/icons/icoPrimary.eot?timestamp=@@timestamp");
-  src: url("fonts/icons/icoPrimary.eot?timestamp=@@timestamp#iefix") format("embedded-opentype"), url("data:font/woff2; charset=utf-8;base64,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") format("woff2"), url("data:application/font-woff; charset=utf-8;base64,d09GRgABAAAAACJAAAsAAAAAIfQAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABPUy8yAAABCAAAAGAAAABgEAQFaGNtYXAAAAFoAAAAfAAAAHy9F7zuZ2FzcAAAAeQAAAAIAAAACAAAABBnbHlmAAAB7AAAHRgAAB0Yg9YlNWhlYWQAAB8EAAAANgAAADYLSS2jaGhlYQAAHzwAAAAkAAAAJAbOAvZobXR4AAAfYAAAAKAAAACglK4SEGxvY2EAACAAAAAAUgAAAFKIhIEEbWF4cAAAIFQAAAAgAAAAIAA4ANNuYW1lAAAgdAAAAaoAAAGq0IdVx3Bvc3QAACIgAAAAIAAAACAAAwAAAAMD6QGQAAUAAAKZAswAAACPApkCzAAAAesAMwEJAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAQAAA6jwCzP7NATMCzAEzAAAAAQAAAAAAAAAAAAAAIAAAAAAAAwAAAAMAAAAcAAEAAwAAABwAAwABAAAAHAAEAGAAAAAUABAAAwAEAAEAIOkb6SLpJekn6WzqPP/9//8AAAAAACDpAOkf6SXpJ+ls6jz//f//AAH/4xcEFwEW/xb+FroV6wADAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAH//wAPAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAABAAAAAAAAAAAAAgAANzkBAAAAAAYACf7JA/0CtwASAC0ATABzAJgArQAAFx4DMzI+AjcOAyMiJicFMj4CNz4BNz4BNw4DIyIuAiceAzMnIi4CJxQWFx4BFx4DMzI+Ajc+AT0BDgMjAQ4BBwYWFx4DMzI+Ajc2NCcuAScWDgIjIi4CNT4BNTIwIyUeARUUDgIjIiY1NDY3DgEHDgEVFB4CMzI+AjU0JicuAScnLgEjIgYHDgEVFBYzMj4CNTYmJ8ogSE5ULDBbVE0hDzlUbkN1mSgBWC9gWk8dEh4PCRAGHGuLpFU8eWxXGRddf55YiGGQYzYHBAQCDQsXU3mhZYqwaC0GCQsJda3SZv6cCxYEAgMCDEmExolTkXBJCwQEBxELAXarvEZKhmQ7AgQCAgMXAgE+c6VmmFcJCxMjEQcHVIeqVluGWCoPEw0ZDUo6gElJgzoRFJCEQXFUMAIPD84ZJxsOESEuHQodGxQqGBoNGiYaDCYYDiEPKUQvGhMmOCYzTjQb3ig8Rx8VMBMJGA0YNy8eJzY2DxVGIh0lUEMsAaIVQRMJCgcYPDMjFCc5JQ0fExUwEzFQOB8cMEIlCxEGogIFBBU2LyBWJQwaDRMlFQgQBCY+LBgbKzYbExsWDRYKNiIlJSQJEgogORIcJBIGDggAAAEA+gCaAw0A5gANAAAlISImNTQ2MyEyFhUUBgLg/kAOGBURAcYPGBqaFRERFRURERUAAAACAAD+wAQAAsAAEwAnAAABIi4CNTQ+AjMyHgIVFA4CAyIOAhUUHgIzMj4CNTQuAgIAarqLUVGLumpquotRUYu6al+of0pKfqlfX6h/Skp+qf7AUYu6amq6i1FRi7pqarqLUQPQSn6pX1+of0pKf6hfX6h/SgAAAAADAEn/UgO3Ai4AEAAgADAAAAEhIgYdARQWMyEyNj0BNCYjESEiBh0BFBYzITI2PQE0JgMhIgYdARQWMyEyNj0BNCYDkvzcDxYWDwMkDxYWD/zcDxYWDwMkDxYWD/zcDxYWDwMkDxYWAi4WD0kPFhYPSQ8W/tsVD0oPFRUPSg8V/twWD0kPFhYPSQ8WAAQAqv8VA1YCawAPAB0AKgA7AAABISIGFREUFjMhMjY1ETQmAyMiJjU0NjsBMhYVFAY3DgEHBiY3PgE3NhYHNxQGIyEiJjURNDYzITIWFREDIv28Fh4eFgJEFh4ew0QJDQ0JRAkMDIQCEgwWHwQDEgwWHwUbDAj97ggLCwgCEggMAmseFf0QFR4eFQLwFR785QwJCQ0NCQkMDQwSAgQfFQwSAwQfFmwIDAwIAlYICwsI/aoAAAYAnP8VA2QCawAQACEASABUAGEAbwAAATQmIyEiBhURFBYzITI2NREDISImNQM0NjMhMhYVERQGIwMRFAYjISImNTQ2MyEyNjURNCYjISIGFREUBiMiJjURNDYzITIWFQMiBhUUFjMyNjU0JgciJjU0NjMyFhUUBiMnFAYrASImNTQ2OwEyFgNkHRT9mhQdHRQCZhQdMf2aCxABEQsCZgwQEAwYEg3+CAUGBgUB+AQFBQT+CAQFBwQFBhINAfgNElERGRkREhgYEggNDQgJDAwJTQYEVgQGBgRWBAYCOxQcHBT9ChQcHBQC9vzvEAsC9gsQEAv9CgsQAtT92Q0RBgUEBgUEAicDBQUD/pQEBwcEAWwMEhIM/ZwYEREYGBERGD0MCAgMDAgIDBQEBgYEBQYGAAAAAgBj/24DnQIBACIAMwAAASEiBhURFBYzIRUjIgYVFBYzITI2NTQmKwE1ITI2NRE0JiMDFAYjISImNRE0NjMhMhYVEQNp/S4WHh4WAU2IDBAQDAFIDBAQDIgBTRYeHhYFDAn9YgkMDAkCngkMAgEeFf5IFh47EQwLERELDBE7HhYBuBUe/i8JDAwJAYQIDAwI/nwAAAMAdf9/A4sCGgAiADIAWQAAASEiBhURFBYzIRUjIgYVFBYzITI2NTQmKwE1ITI2NRE0JiMTFAYjISImNRE0NjMhMhYVBxEUBiMhIiY1NDYzITI2NRE0JiMhIgYVERQGIyImNRE0NjMhMhYVA2X9NhAWFhABWpkEBwcEAUgEBwcEmQFaEBYWEBEKB/02BwoKBwLKBwonDgr9yQQHBwQCNwECAgH9kgECBgUEBg4KAm4KDgIaFw/+CRAWQgcEBAcHBAQHQhYQAfcPF/3jBwkJBwH3BwkJBzD+bgoOBgUEBgIBAZIBAgIB/vYEBwcEAQoKDg4KAAADAQT/DwL8AngAHAAqADsAAAEuASsBIgYHDgEVERQWFx4BOwEyNjc+ATURNCYnAyMiJjU0NjsBMhYVFAY3FAYjISImNRE0NjMhMhYVEQKrJHUPBg91JCgpKSgkdQ8HDnUkKCkpKIBWDRISDVYNEhKLDAj+oggMDAgBXggMAnMDAgIDBCsm/UolKwQDAgIDBCslArYmKwT82BINDRITDA0ShwgMDAgCFgkMDAn96gAAAAIAAP7ABAACwAATACcAAAEiLgI1ND4CMzIeAhUUDgIDIg4CFRQeAjMyPgI1NC4CAgBquotRUYu6amq6i1FRi7pqUIxoPD1ojE9QjGg8PGiM/sBRi7pqarqLUVGLumpquotRA4A8aIxQUIxoPD1ojE9QjGg8AAAAAAEAAP7ABAACwAAoAAABBx4BFRQOAiMiLgI1ND4CMzUiDgIVFB4CMzI+AjU0LgInA2lYMzw9aIxPT4xoPT1ojE9quotRUYu6amq6i1EVJzgjAilbM4xPT4xoPT1ojE9PjGg9gFGLumpquotRUYu6ajVlXFEiAAAAAAIA+v+6Aw0BxgANABsAAAUiJjURNDYzMhYVERQGNyEiJjU0NjMhMhYVFAYCAA4YFRERFRjS/kAOGBURAcYPGBpGFREBwA4YFRH+Og8R4BURERUVEREVAAAFAQD/DAMAAnsAHAA6AEkAVwB+AAABLgEjIgYHDgEVERQWFx4BMzoBMTI2Nz4BNRE0JhMUBgcOASMiJicuATURNDY3PgEzOgExMhYXHgEVEScjIgYVFBY7ATI2NTQmIxUjIiY1NDY7ATIWFRQGExEUBiMhIiY1NDYzITI2NRE0JiMhIgYVERQGIyImNRE0NjMhMhYVAqsngAQEgCcqKysqJHMQAgIEgCcqKysVHyIngQEBgSciHx8iI3YNAgEBgSciH79WERgYEVYRGBgRVggMDAhWCAwMlRMN/rAFBgYFAVAFBgYF/rAFBgYEBQYTDQFQDRMCdgQBAQQDLSj9SictBAMBAQMELScCtigt/PUfIAMEAQEEAyAfArYfIQMEAQEEAyEf/UorGBERGRkRERg+DAkIDAwICQwCnf3hDhIGBQQGBgUCHwQGBgT+fwQGBgQBgQ0SEg0AAAMAVf8VA6sCawAUAC4APwAAJRQOAiMiLgI1ND4CMzIeAhUFMzQ2NTQmIyIGFRQWNz4BMzIWFRQGBwYWMQcUFjsBMjY9ATQmKwEiBh0BA6tDdJxYWJx0Q0N0nFhYnHRD/iM+lFNKU040AQUwNigtgQgBAQ0VFAoUFhYUChQVwFicdENDdJxYWJx0Q0N0nFhoTzBdOEhVIh8LAiM8JiA7KmgHAnEUFBQUCRQWFhQJAAAAAwBV/xUDqwJrABQAKwA7AAAlFA4CIyIuAjU0PgIzMh4CFSUTHgE7ATI2NxM2JicuASsBIgYHDgEXEzQmKwEiBh0BFBY7ATI2NQOrQ3ScWFicdENDdJxYWJx0Q/4cGAEKEQkRCwIXAgQHBxMMFAwTBwcEAnQcGgsZHBwZCxocwFicdENDdJxYWJx0Q0N0nFjg/vQIGxkLAQoPFwcIBwcIBxcO/kQZHBwZChkcHBkAAAACARr/YQLmAh8AIQAyAAAlPgM1NCYjIgYHBiY1ND4CMzIWFRQOAgcOASMiJjcTMzI2PQE0JisBIgYdARQWMwGvATlENzQxQ0AFAVwcOVc7bHk8ST8CAx4XGiECMRAhJCMiECEhIx91QkAlICImK04rAxA2GzoxIGVSQD8sLi8ODRgY/uwhIA0iISIhDSAhAAACANL/hAMrAesAEQAjAAAXIiYnJjQ3ATYyFxYUBwEOASMhIiYnASY0NzYyFwEWFAcOASP3ChIJDg4CDw8qEQ8P/fEIEgsCDwsSCP3xDg4PKhECDw8PCRIKfAgGDyoRAg8PDw8qEf30CAkIBgIPDyoRDw/98Q4qEgYIAAAAAgAA/sAEAALAABMAJwAAASIuAjU0PgIzMh4CFRQOAgMiDgIVFB4CMzI+AjU0LgICAGq6i1FRi7pqarqLUVGLumpfqH9KSn6pX1+of0pKfqn+wFGLumpquotRUYu6amq6i1ED0Ep+qV9fqH9KSn+oX1+of0oAAAAAAQDV/4oDLgHcABYAAAkBDgEjIiYvASY2Nz4BHwEBPgEXHgEHAy7+yQgcDw4ZCb8LAw0NJg2jASILJhAQCAoBnP4MDhANC/AOJgwMAQySAZAPBwsKJhAAAAMAaP9SA5kCLgAuAEUAVQAABRQGBw4BIyEiJicuATU0MDE8ATE0NjU+ATcBPgEzMTIWFwEeARcUFhUwFhU4ARUBFx4BOwEyNj8BNiYnLgErASIGBw4BFxM0JisBIgYdARQWOwEyNjUDmRANDiUU/ZcVJQ4NDwECCAYBNQ4rGRkrDgE1BggCAQH+PRIBBwwHDQcCEQIEBQQOCQ8JDgUFBAJWFRMIExQUEwgTFVwRIQsLCgoLCyERAQEBBAgEChUKAhcZHh4Z/ekKFQoECAQBAQEBkcUGFBMIxAoRBgUGBgUGEAv+uRMVFRMHExQUEwAAAAEAav+DA6EB/QBIAAABIS4BJy4BKwEiBhUUFjsBEhY5AR4BFw4BFRQWMzI2NTQmJzMUBhUUFjMyNjU0JicmIisBIiYnITgBMzgBMTI2PwI0NjU0JiMDcf3hBQkEAg8KnwsREQuIPhcJJR4DBCodHSoBAYwBKR4dKiYaAgQB/zQsCQGTAREaBD4BAR0TAZoVJxEJDREMCxH+7mQmMw0HDwgdKiodBAcDAwcEHSoqHRwoAgEhHRQQ6QUCBAIUHQAAAAQAXf9zA6QB5wAuAGsAkwCuAAAlMCIxISImNTQ2MzEFMDI5ATI2PwEwNDU0JiMhIiY1NDYzMSEyFhUcARUPAQ4BIxcUBiMiJjU8ATcjHAEVFAYjIiY1NDY3LgEnMCYDIyImNTQ2OwEyFhcUHgIVHgEXPgEzMhYXMz4BMzIWFSUxLgEnOAExLgEnLgEjIgYHMQ4BBzgBMQ4BBzEOARUUFjMyNjU0JjUFNCYjIgYHMQ4BBzgBMQ4BBzEUBhUUFjMyNjUDNgH+bwQHBwQBkQEKDgI/EAv96wQGBgQCFRQcAT4EGhElMCEiMAGYMCEiMAYGExoIF0GWBAYGBJ4EBgEcIhwHFhALHREZKQmjCigZIjD+sAEBAQEDAQgbEAsUCAIEAgEDAgMFJBkZIwEBOyQYERoIAgMBAQEBASQZGCRLBwQFBgELCe0DAQsQBwQEBx0UAgQCBekQFIchMDAhAwUDAwUDITAwIQwVCRAwIGUBHwYFBAYEBAJ6k3sCHSkOCwwcFhYcMCILAwUDAwUCDRAIBwIDAgMEAgcPCBgkJBgDBQMLGSQQDQIFAwMFAwMFAxgkJBgAAAABADP/MQPNAlUANQAAJTQmIyE1NC4CIyIOAh0BOAExFBYzMjY1OAE5ATU0NjMyFh0BIyIGFTERMRQWMyEyNjUxEQPNIBb+eiZBVzEyV0ElHRUUHVI6OVILFyAgFwH0FyChFh+YMFQ/JCQ/VDAdFR0dFR03TU03mB8W/sQWHh4WATwAAAAEAF//SgOhAjYADQAbAG4AgAAABSEiJjU0NjMhMhYVFAYnISImNTQ2MyEyFhUUBjc0JiMhNTQuAiMiDgIdARQWFx4BMzI2PQE0NjMyFh0BFBYzMjY9ATQmIyIGHQEUBiMiJicuAT0BND4CMzIeAh0BIyIGBxEeATMhMjY3MxEDFAYjISImNRE0NjMhMhYVERUDMf7HBQYGBQE5BAcHBP7HBQYGBQE5BAcHbCIX/rQjPFEuLlI8IwgIBxIKEyBHMjJHBgQFBlM7O1QVCAYLBAQFIDdJKilKNiBHFyEBASEXAagVHwQBFRUP/lgOFRUOAagPFT8GBQQGBgQFBnYHBAQHBwQEB1YWIZwsTjoiIjpOLEILEwcFBxkYQjBFRTBCBAYGBEI5UVE5QhALAwQDCwZCKEY0Hx80RiicIRf+9RcgGhIBF/70DhQUDgELDhQUDv79CAAAAgDP/zEDMQJVACAAKgAAJTQmKwE1NC4CIyIOAh0BIyIGFTERMRQWMyEyNjUxESU0NjMyFh0BITUDMSAXCyVBVzIxV0EmCxcgIBcB9Bcg/kRSOTpS/umhFh+YMFQ/JCQ/VDCYHxb+xBYeHhYBPM03TU03mJgAAAAABQDN/xQDMwJsAB8ARABdAGsAeQAAJTQmJzU0LgIjIg4CHQEOAQcjERUzHgEzITI2NzMRATIeAh0BIzU0JiMiBh0BFBYzMjY9ATQ2MzIWHQEhNTQ+AjMBFAYjISImJzURNT4BMyE4ATkBMzIWFRMHJyEiJjU0NjMhMhYVFAYnISImNTQ2MyEyFhUUBgMzIBcoRFw0NFxEKBQeBAEBBCQXAeYXJAQB/s0wVD4lRl5DQl4GBQQGUjk6Uf6PJD9ULwEdGRH+GhIYAQEZEQGJXREZAQFp/pkFBgYFAWcEBgYE/pkFBgYFAWcEBgaFFyIDuTJYQiYmQlgyuQIcFP7DCxUeHhUBPgHRIjxQLri4QFxcQEoFBgYFSjhOTji4uC5QPCL8/BEXFxEDASwDERgYEf7ZC0sGBAUGBgUEBocHBAQHBwQEBwAADQB2/1QDhQJQACIAMgBCAEkAWQBpAHkAiQCZAKAAsADAANAAAAEjNTQmIw4BHQEhNTQmIw4BHQEjIgYVERQWMyEyNjURNCYjARQGKwEiJj0BNDY7ATIWFTUUBisBIiY9ATQ2OwEyFhUnLgE1MxQGExQGKwEiJj0BNDY7ATIWFTUUBisBIiY9ATQ2OwEyFhUTFAYrASImPQE0NjsBMhYVNRQGKwEiJj0BNDY7ATIWFTUUBisBIiY9ATQ2OwEyFhU3MxQGJy4BExQGKwEiJj0BNDY7ATIWFTUUBisBIiY9ATQ2OwEyFhU1FAYrASImPQE0NjsBMhYVA2ZhGRERFv6TGRERFmENEhINAtENEhIN/c8GBXEEBgYEcQUGBgVxBAYGBHEFBhgRFlEZuQYEcQUGBgVxBAYGBHEFBgYFcQQGsgYEcQQGBgRxBAYGBHEEBgYEcQQGBgRxBAYGBHEEBhtRGRERFpgGBHIEBgYEcgQGBgRyBAYGBHIEBgYEcgQGBgRyBAYB/ikRGAEaESYpERgBGhEmEg39lA0SEg0CbA0S/ZoFBgYFbAUGBgVCBAYGBG0EBgYE+gEXERIY/ewFBgYFbAUGBgVCBAYGBG0EBgYE/uUFBgYFbAUGBgVCBAYGBG0EBgYEQQQGBgRtBAYGBHUSGAEBF/3TBQYGBWwFBgYFQgQGBgRtBAYGBEEEBgYEbQQGBgQAAA8Abv9mA5ICdwApAC4AMgA2ADoAPgBCAFAAXgCEAIkAkQCVAJkAoQAAJTgBNRE0JisBNTQmIyIGHQEhNTQmIyIGHQEjIgYVERQWMyEyNjUROAE1BTMVIzU7ARUjJSM1MwcjNTMXMxUjNzMVIwM0NjMyFh0BFAYjIiY1JTQ2MzIWHQEUBiMiJjUnNDY7ARUUFjMyNj0BIRUUFjMyNj0BMzIWFREjNTMyNjU0JiMhNRcVIzUzAyImPQEzFSMzNTMVMzUzFTMjNTMVFAYjA5IeFkweFRUf/qkeFRUeTBYeHhYCvBYe/PGyssirqwFwr6/Fq6sWr6/Fq6sQEQ0MEhIMDRH+QhIMDBISDAwSgBINTB4VFR4BVx8VFR5MDRGsMAQHBwT9g7KyspMNErKTqasWr6ONqxENwQEBMRUfHBYeHhYcHBYeHhYcHxX9phUeHhUBJwELlpaWq6KioreWlpYCIw0REQ1RDBISDFENERENUQwSEgwBDBIfFR4eFR8fFR4eFR8SDP7YogYFBAZxhqKi/g4SDHKQkJCQkJByDBIAAAAAAQC6/3kDSAIHAB8AACUUBisBFRQGIyImPQEjIiY1NDY7ATU0NjMyFh0BMzIWA0gpHrkpHh0quR0qKh25Kh0eKbkeKcAdKrkdKioduSodHSq5HSoqHbkqAAEAuQB5A0cBBwANAAAlISImNTQ2MyEyFhUUBgMA/gAdKiodAgAdKip5Kh0dKiodHSoAAAAGAGn/ZAOdAhYADQAbADoARwBWAGcAAAE0JisBIgYVFBY7AT4BFzQmIyEiBhUUFjMhPgEXIzU0Ji8BLgEjISIGFREjIgYdARQWMyEyNj0BLgEjATQ2MyEVFBY7ARUhEQMiJjU0NjsBMhYVFAYrAQUUBiMhIiY9ATQ2MyEyFh0BAiYMC6oJDgwLqgsMig0L/tAJDw0LATAJD6w9CAdsBxMJ/oYRGDoYIyMYAr4YIwMkGv26CAcBRwgEb/4vWwkODAtbCQ4MC1sCLAgG/k4GCAgGAa8GCAFKCA8NCgsNAg1PCQ4MCwsNAwxD0gkUBm0GCBcS/rYjG8cYIiIYxx0kASoHCG8FB8EBLf5sDQsJDgwLCQ+ABwgIBxEHCAgHEQAAAAAIAGP/XgOfAh8AEAAhAC8APQBLAFkAhACHAAAFISImPQE0NjMhMhYdAQ4BIwEiBh0BFBYzITI2PQE0JiMhFzQmKwEiBhUUFjsBMjYFNCYjISIGFRQWMyEyNgM0JiMhIgYVFBYzITI2JzQmKwEiBhUUFjsBMjYlJy4BIyEiBhURFBYzMjY1ETQ2MyEyFhcVFBY7ARQWHQEUFjMyNj0BLgEnJxcjA1z9SBonJxoCuxomAica/UgSFxcSArsSFxcS/UWeBwWBBAcHBIEFBwGOCAT+eAQICAQBiAQIGAcE/qMEBwcEAV0GBbUHBacEBwcEpwUHAQRsCRgL/q0WHwcFBAgTDQFTAgUCBwV9AwgEBAgFCgl4Z2eiJhrHGyYmG8caJgEzFxLHERgYEccSFzcEBwcEBQcHjgUHBwUEBwcBSQQICAQECAhQBQcHBQQIBk9tCAkfFv7/BAgIBAEBDhABAn4ECAIEA4kECAgEiQ4bBltmAAIAWP8VA60CawAUACsAAAEiDgIVFB4CMzI+AjU0LgIjFwEOASMiJi8BJjY3NjIfARM+ARceAQcCAlibdENDdJtYWZt0Q0N0m1nz/v4IFg0MFAifCQILCx8Mh/IJIA0NBwkCa0N0nFhYnHRDQ3ScWFicdEP1/l8LDQoJyAwfCwoKegFODAYJCCANAAAAAwBV/xUDqwJrABQAIQAuAAAlFA4CIyIuAjU0PgIzMh4CFQUyNiMuATcTIwMGFjMTMjY1NCYjIgYVFBYzA6tDdJxYWJx0Q0N0nFhYnHRD/j4hDAEYDAY3RTgJGyY5FRcVFBUXFRTAWJx0Q0N0nFhYnHRDQ3ScWPohAhYbAQb++ygtAaMbEw8RGxMOEgABAHb/QQOKAi4AKAAAATYyHwEeAR8BHgEPAQ4BHwEWBi8BJiIPAQYmPwE2Ji8BJjY/AT4BPwEB5QsgC1ELNBm1GQoSgxIUBB8FGhehF0AWohcZBB8EFBKDEgoZtRk0C1ECLhcXoxcmAxsDHxJ/Ej0ZtBkSC1UMDFULEhm0GT0SfxIfAxsDJhejAAAAAAEAmv/vA1cBfQAZAAATNDY3NjIfATc2MhcWFAcBDgEjIiYnAS4BNZoKChQ4FPT0FDkUFBT+7w0kExMjDv7wCgoBTA0ZChQU9PUUFBQ4FP7uDQ8PDQERChkNAAAAAQAAAAEAAJw5MTFfDzz1AAsEAAAAAADUFPWTAAAAANQU9ZMAAP7ABAACwAAAAAgAAgAAAAAAAAABAAACzP7NAAAEAAAAAAAEAAABAAAAAAAAAAAAAAAAAAAAKAQAAAAAAAAAAAAAAACuAAAEAAAJBAAA+gQAAAAEAABJBAAAqgQAAJwEAABjBAAAdQQAAQQEAAAABAAAAAQAAPoEAAEABAAAVQQAAFUEAAEaBAAA0gQAAAAEAADVBAAAaAQAAGoEAABdBAAAMwQAAF8EAADPBAAAzQQAAHYEAABuBAAAugQAALkEAABpBAAAYwQAAFgEAABVBAAAdgQAAJoAAAAAAAoAFAAeAQ4BKAFkAaoCBAKeAugDYgO6A/YEMgReBQoFYgW6BgIGQAZ8BqgHIAeACFoInAlGCYIKJAsuC/4MKgxEDNQNjA3SDhgOXg6MAAAAAQAAACgA0QAPAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAA4ArgABAAAAAAABAAoAAAABAAAAAAACAAcAewABAAAAAAADAAoAPwABAAAAAAAEAAoAkAABAAAAAAAFAAsAHgABAAAAAAAGAAoAXQABAAAAAAAKABoArgADAAEECQABABQACgADAAEECQACAA4AggADAAEECQADABQASQADAAEECQAEABQAmgADAAEECQAFABYAKQADAAEECQAGABQAZwADAAEECQAKADQAyGljb1ByaW1hcnkAaQBjAG8AUAByAGkAbQBhAHIAeVZlcnNpb24gMS4wAFYAZQByAHMAaQBvAG4AIAAxAC4AMGljb1ByaW1hcnkAaQBjAG8AUAByAGkAbQBhAHIAeWljb1ByaW1hcnkAaQBjAG8AUAByAGkAbQBhAHIAeVJlZ3VsYXIAUgBlAGcAdQBsAGEAcmljb1ByaW1hcnkAaQBjAG8AUAByAGkAbQBhAHIAeUZvbnQgZ2VuZXJhdGVkIGJ5IEljb01vb24uAEYAbwBuAHQAIABnAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAEkAYwBvAE0AbwBvAG4ALgAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=") format("woff"), url("fonts/icons/icoPrimary.ttf?timestamp=@@timestamp") format("truetype");
+  src: url("../b2b-angular/fonts/icons/icoPrimary.eot?timestamp=@@timestamp");
+  src: url("../b2b-angular/fonts/icons/icoPrimary.eot?timestamp=@@timestamp#iefix") format("embedded-opentype"), url("data:font/woff2; charset=utf-8;base64,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") format("woff2"), url("data:application/font-woff; charset=utf-8;base64,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") format("woff"), url("../b2b-angular/fonts/icons/icoPrimary.ttf?timestamp=@@timestamp") format("truetype");
   font-weight: normal;
   font-style: normal; }
 
@@ -864,6 +857,27 @@ small {
   vertical-align: middle;
   width: 1em; }
 
+[class*="icoWeather-"],[class*="icoTrans-"],[class*="icoBubble-"],[class*="icoRetail-"],[class*="icoPeople-"],[class*="icoNumslets-"],[class*="icoLocation-"],[class*="icoHealthcare-"],[class*="icoDocuments-"],[class*="icoDevices-"],[class*="icoDatanetwork-"],[class*="icoControls-"],[class*="icoBuilding-"],[class*="icoArrows-"]{
+  color: #0568ae;
+  display: inline-block;
+  font-size: 20px;
+  font-weight: normal;
+  font-variant: normal;
+  font-style: normal;
+  width: 20px;
+  text-transform: none;
+  line-height: 1;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+  position: relative;
+  speak: none;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+  vertical-align: middle;
+  }
+
 [class*="icon-primary-"]:before,
 [class*="icon-primary-"]:after {
   box-sizing: border-box;
@@ -1067,16 +1081,16 @@ small {
   margin-left: -1em;
   position: absolute; }
 
-[class*="icon-primary-"].white {
+[class*="icon-primary-"].white, [class^="ico"][class*="-"].white {
   color: #fff; }
 
-[class*="icon-primary-"].black {
+[class*="icon-primary-"].black, [class^="ico"][class*="-"].black {
   color: #000; }
 
-[class*="icon-primary-"].blue {
+[class*="icon-primary-"].blue, [class^="ico"][class*="-"].blue {
   color: #0568ae; }
 
-[class*="icon-primary-"].green {
+[class*="icon-primary-"].green, [class^="ico"][class*="-"].green {
   color: #007a3e; }
 
 @-webkit-viewport {
@@ -1458,7 +1472,7 @@ h6 {
 
 .heading-small {
   font-size: 1.8rem !important;
-  font-family: "Omnes-ECOMP-W02";
+  font-family: "Omnes-ECOMP-W02", Arial;
   margin-bottom: 20px; }
 
 .heading-small-emphasis {
@@ -1468,7 +1482,7 @@ h6 {
 
 .heading-micro {
   font-size: 1.3rem !important;
-  font-family: "Omnes-ECOMP-W02-Medium", Arial
+  font-family: "Omnes-ECOMP-W02-Medium", Arial;
   text-transform: uppercase;
   color: #da0081;
   margin-bottom: 10px; }
@@ -1499,7 +1513,7 @@ h6 {
 
 .lead {
   color: #666;
-  font-family: "Omnes-ECOMP-W02-Light-Italic", Arial
+  font-family: "Omnes-ECOMP-W02-Light-Italic", Arial;
   font-size: 2.4rem;
   line-height: 2.8rem;
   margin-top: 10px;
@@ -1512,7 +1526,7 @@ h6 {
 .eyebrow,
 .subheading {
   font-size: 1.4rem !important;
-  font-family: "Omnes-ECOMP-W02-Medium", Arial
+  font-family: "Omnes-ECOMP-W02-Medium", Arial;
   color: #666; }
 
 .eyebrow + .heading-major-section,
@@ -1531,11 +1545,11 @@ h6 {
   h6,
   .heading-page {
     font-size: 2rem;
-    font-family: "Omnes-ECOMP-W02", Arial
+    font-family: "Omnes-ECOMP-W02", Arial;
     margin-bottom: 30px; }
   .heading-major-section {
     font-size: 2rem;
-    font-family: "Omnes-ECOMP-W02", Arial
+    font-family: "Omnes-ECOMP-W02", Arial;
     margin-bottom: 30px; }
   .heading-sub-section {
     font-size: 2rem;
@@ -1659,7 +1673,7 @@ p + .p-max {
 
 b,
 strong {
-  font-family: "Omnes-ECOMP-W02-Medium";
+  font-family: "Omnes-ECOMP-W02-Medium", Arial;
   font-weight: normal; }
 
 i,
@@ -2717,6 +2731,14 @@ button.close {
 .ds2_touchevents textarea.hasScrollbar:focus + .reset-field {
   right: 22px; }
 
+.ds2-no-colors .b2b-tmpl-card-corner-button {
+  border: none !important; }
+
+.ds2-no-colors .b2b-tmpl-card-corner-button .close {
+  border: 1px solid black;
+  top: 0px !important;
+  right: 0px !important; }
+
 .form-row.error .error-msg {
   display: block;
   font-size: 14px;
@@ -2972,13 +2994,13 @@ select[disabled],
 select[readonly],
 textarea[disabled],
 textarea[readonly],
-span.icon-primary-calendar.disabled,
+i.icon-primary-calendar.disabled,
 span.icon-primary-calendar.readonly {
   cursor: not-allowed;
   background-color: #f2f2f2;
   box-shadow: none; }
 
-span.icon-primary-calendar.disabled input,
+i.icon-primary-calendar.disabled input,
 span.icon-primary-calendar.readonly input {
   color: #959595 !important; }
 
@@ -3080,24 +3102,22 @@ legend + .form-row {
 .ds2_touchevents .tooltip-onclick input:focus {
   padding-right: 95px; }
 
-span.icon-primary-calendar {
-  display: block;
-  position: relative;
-  background-color: #fff;
-  border-radius: 4px;
-  overflow: hidden;
-  height: 36px; }
+.btn-calendar-icon {
+  position: absolute;
+  background-color: transparent !important;
+  top: 8px;
+  border: 0 !important;
+  width: 30px;
+  right: 15px; }
 
-span.icon-primary-calendar:before {
+.btn-calendar-icon .icon-primary-calendar:before {
   position: absolute;
-  top: 7px;
-  left: 13px;
   color: #0568ae; }
 
-span.icon-primary-calendar.disabled {
+.btn-calendar-icon .icon-primary-calendar.disabled {
   background-color: #f2f2f2; }
 
-span.icon-primary-calendar.disabled:before {
+.btn-calendar-icon .icon-primary-calendar.disabled:before {
   color: #959595; }
 
 span.icon-primary-calendar input {
@@ -4077,7 +4097,7 @@ hr.bottom-space-only {
   height: 18px; }
 
 .b2b-badge {
-  font-family: "Omnes-ECOMP-W02-Medium";
+  font-family: "Omnes-ECOMP-W02-Medium", Arial;
   background-color: #5A5A5A;
   border-radius: 12px;
   color: #FFFFFF;
@@ -4929,7 +4949,7 @@ a > .b2b-badge {
   display: block; }
 
 .show-date {
-  font-family: "Omnes-ECOMP-W02-Medium";
+  font-family: "Omnes-ECOMP-W02-Medium", Arial;
   color: #0568ae;
   height: 26px;
   line-height: 26px;
@@ -5217,7 +5237,7 @@ a > .b2b-badge {
 
 .datepicker-dropdown.datepicker-orient-left:before,
 .datepicker-dropdown.datepicker-orient-left:after {
-  left: 16px; }
+  left: 255px; }
 
 .datepicker-dropdown.datepicker-orient-right:before,
 .datepicker-dropdown.datepicker-orient-right:after {
@@ -5705,6 +5725,15 @@ a > .b2b-badge {
 .j {
   background-position: 0 0; }
 
+.datepicker-container {
+  position: relative; }
+
+.btn-calendar-icon:focus .icon-primary-calendar {
+  outline: 1px dotted #191919; }
+
+.btn-calendar-icon:focus {
+  outline: none; }
+
 /* remove focus outline when dropdown is opened */
 /*resolve blue focus outline over dropdown with error*/
 select {
@@ -5725,7 +5754,7 @@ select {
 
 .selectWrap.disabled button.awd-select {
   z-index: 0;
-  text-indent: 15; }
+  text-indent: 15px; }
 
 .selectWrap.disabled:after {
   color: #5A5A5A;
@@ -5743,7 +5772,6 @@ input.awd-select {
   height: 36px;
   line-height: 0;
   margin-bottom: 0;
-  padding: 12px 45px 8px 0;
   position: relative;
   text-align: left;
   top: 0;
@@ -5752,7 +5780,9 @@ input.awd-select {
   padding: 12px 45px 8px 15px;
   user-select: none; }
   input.awd-select:focus {
-    border-color: #0568ae !important; }
+    border-color: #0568ae !important;
+    text-overflow: ellipsis;
+    padding-right: 45px; }
 
 button.awd-select {
   background-color: transparent;
@@ -5766,7 +5796,6 @@ button.awd-select {
   height: 36px;
   line-height: 36px;
   margin-bottom: 0;
-  /*padding-right: 41px;*/
   position: relative;
   text-align: left;
   top: 0;
@@ -5864,12 +5893,10 @@ span.selectWrap input[readonly]:focus {
   cursor: pointer;
   height: 100%;
   min-height: 36px;
-  line-height: 38px;
+  line-height: 20px;
   overflow: hidden;
-  padding: 0 15px;
+  padding: 8px 15px;
   position: relative;
-  text-overflow: ellipsis;
-  white-space: nowrap;
   z-index: 1000; }
   .awd-select-list-item:hover {
     cursor: pointer;
@@ -5909,7 +5936,7 @@ span.selectWrap input[readonly]:focus {
     padding-bottom: 9px;
     padding-top: 20px; }
 
-.awd-select-list-item[aria-selected="true"] {
+.awd-select-list-item[data-hover="true"] {
   background-color: #d2d2d2; }
 
 span input.awd-select {
@@ -6240,12 +6267,6 @@ input.awd-select {
   -ms-user-select: text;
   user-select: text; }
 
-input.awd-select.focused {
-  -webkit-user-select: none !important;
-  -moz-user-select: none !important;
-  -ms-user-select: none !important;
-  user-select: none !important; }
-
 /**********************Dropdown Chrome scrolling fix end ********************/
 .mpc-expanders {
   border-bottom: 1px solid #e4e4e4;
@@ -6903,7 +6924,7 @@ input.awd-select.focused {
 
 .b2b-header-tabs .selectWrap button.awd-select, .b2b-header-tabs .selectWrap input.awd-select {
   height: 36px;
-  line-height: 8px;
+  line-height: 31px;
   font-size: 1rem;
   display: inline-block; }
 
@@ -6932,7 +6953,7 @@ input.awd-select.focused {
     top: 20px; }
   .b2b-header-tabs {
     height: 90px; }
-  .selectWrap {
+  .header__item .selectWrap {
     bottom: 15px; }
   .b2b-header-tabs .header__items {
     padding-top: 25px; }
@@ -6999,78 +7020,78 @@ input.awd-select.focused {
 
 @font-face {
   font-family: "Omnes-ECOMP-W02";
-  src: url("fonts/Omnes_ATTW02.eot");
-  src: url("fonts/Omnes_ATTW02.eot?#iefix") format("embedded-opentype"), url("fonts/Omnes_ATTW02.woff") format("woff"), url("fonts/Omnes_ATTW02.ttf") format("truetype");
+  src: url("../b2b-angular/fonts/Omnes_ATTW02.eot");
+  src: url("../b2b-angular/fonts/Omnes_ATTW02.eot?#iefix") format("embedded-opentype"), url("../b2b-angular/fonts/Omnes_ATTW02.woff") format("woff"), url("../b2b-angular/fonts/Omnes_ATTW02.ttf") format("truetype");
   font-weight: normal;
   font-style: normal; }
 
 @font-face {
   font-family: "Omnes-ECOMP-W02-Medium";
-  src: url("fonts/Omnes_ATTW02Medium.eot");
-  src: url("fonts/Omnes_ATTW02Medium.eot?#iefix") format("embedded-opentype"), url("fonts/Omnes_ATTW02Medium.woff") format("woff"), url("fonts/Omnes_ATTW02Medium.ttf") format("truetype");
+  src: url("../b2b-angular/fonts/Omnes_ATTW02Medium.eot");
+  src: url("../b2b-angular/fonts/Omnes_ATTW02Medium.eot?#iefix") format("embedded-opentype"), url("../b2b-angular/fonts/Omnes_ATTW02Medium.woff") format("woff"), url("../b2b-angular/fonts/Omnes_ATTW02Medium.ttf") format("truetype");
   font-weight: normal;
   font-style: normal; }
 
 @font-face {
   font-family: "Omnes-ECOMP-W02-Italic";
-  src: url("fonts/Omnes_ATTW02Italic.eot");
-  src: url("fonts/Omnes_ATTW02Italic.eot?#iefix") format("embedded-opentype"), url("fonts/Omnes_ATTW02Italic.woff") format("woff"), url("fonts/Omnes_ATTW02Italic.ttf") format("truetype");
+  src: url("../b2b-angular/fonts/Omnes_ATTW02Italic.eot");
+  src: url("../b2b-angular/fonts/Omnes_ATTW02Italic.eot?#iefix") format("embedded-opentype"), url("../b2b-angular/fonts/Omnes_ATTW02Italic.woff") format("woff"), url("../b2b-angular/fonts/Omnes_ATTW02Italic.ttf") format("truetype");
   font-weight: normal;
   font-style: normal; }
 
 @font-face {
   font-family: "Omnes-ECOMP-W02-Light";
-  src: url("fonts/Omnes_ATTW02Light.eot");
-  src: url("fonts/Omnes_ATTW02Light.eot?#iefix") format("embedded-opentype"), url("fonts/Omnes_ATTW02Light.woff") format("woff"), url("fonts/Omnes_ATTW02Light.ttf") format("truetype");
+  src: url("../b2b-angular/fonts/Omnes_ATTW02Light.eot");
+  src: url("../b2b-angular/fonts/Omnes_ATTW02Light.eot?#iefix") format("embedded-opentype"), url("../b2b-angular/fonts/Omnes_ATTW02Light.woff") format("woff"), url("../b2b-angular/fonts/Omnes_ATTW02Light.ttf") format("truetype");
   font-weight: normal;
   font-style: normal; }
 
 @font-face {
   font-family: "Omnes-ECOMP-W02-Bold";
-  src: url("fonts/Omnes_ATTW02Bold.eot");
-  src: url("fonts/Omnes_ATTW02Bold.eot?#iefix") format("embedded-opentype"), url("fonts/Omnes_ATTW02Bold.woff") format("woff"), url("fonts/Omnes_ATTW02Bold.woff2") format("woff2"), url("fonts/Omnes_ATTW02Bold.ttf") format("truetype");
+  src: url("../b2b-angular/fonts/Omnes_ATTW02Bold.eot");
+  src: url("../b2b-angular/fonts/Omnes_ATTW02Bold.eot?#iefix") format("embedded-opentype"), url("../b2b-angular/fonts/Omnes_ATTW02Bold.woff") format("woff"), url("../b2b-angular/fonts/Omnes_ATTW02Bold.woff2") format("woff2"), url("../b2b-angular/fonts/Omnes_ATTW02Bold.ttf") format("truetype");
   font-weight: normal;
   font-style: normal; }
 
 @font-face {
   font-family: "Omnes-ECOMP-W02-Light-Italic";
-  src: url("fonts/Omnes_ATTW02LightItalic.eot");
-  src: url("fonts/Omnes_ATTW02LightItalic.eot?#iefix") format("embedded-opentype"), url("fonts/Omnes_ATTW02LightItalic.woff") format("woff"), url("fonts/Omnes_ATTW02LightItalic.woff2") format("woff2"), url("fonts/Omnes_ATTW02LightItalic.ttf") format("truetype");
+  src: url("../b2b-angular/fonts/Omnes_ATTW02LightItalic.eot");
+  src: url("../b2b-angular/fonts/Omnes_ATTW02LightItalic.eot?#iefix") format("embedded-opentype"), url("../b2b-angular/fonts/Omnes_ATTW02LightItalic.woff") format("woff"), url("../b2b-angular/fonts/Omnes_ATTW02LightItalic.woff2") format("woff2"), url("../b2b-angular/fonts/Omnes_ATTW02LightItalic.ttf") format("truetype");
   font-weight: normal;
   font-style: normal; }
 
 @font-face {
   font-family: "Omnes-ECOMP-W02-Medium-Italic";
-  src: url("fonts/Omnes_ATTW02MediumItalic.eot");
-  src: url("fonts/Omnes_ATTW02MediumItalic.eot?#iefix") format("embedded-opentype"), url("fonts/Omnes_ATTW02MediumItalic.woff") format("woff"), url("fonts/Omnes_ATTW02MediumItalic.woff2") format("woff2"), url("fonts/Omnes_ATTW02MediumItalic.ttf") format("truetype");
+  src: url("../b2b-angular/fonts/Omnes_ATTW02MediumItalic.eot");
+  src: url("../b2b-angular/fonts/Omnes_ATTW02MediumItalic.eot?#iefix") format("embedded-opentype"), url("../b2b-angular/fonts/Omnes_ATTW02MediumItalic.woff") format("woff"), url("../b2b-angular/fonts/Omnes_ATTW02MediumItalic.woff2") format("woff2"), url("../b2b-angular/fonts/Omnes_ATTW02MediumItalic.ttf") format("truetype");
   font-weight: normal;
   font-style: normal; }
 
 @font-face {
   font-family: "Omnes-ECOMP-W02-Bold-Italic";
-  src: url("fonts/Omnes_ATTW02BoldItalic.eot");
-  src: url("fonts/Omnes_ATTW02BoldItalic.eot?#iefix") format("embedded-opentype"), url("fonts/Omnes_ATTW02BoldItalic.woff") format("woff"), url("fonts/Omnes_ATTW02BoldItalic.woff2") format("woff2"), url("fonts/Omnes_ATTW02BoldItalic.ttf") format("truetype");
+  src: url("../b2b-angular/fonts/Omnes_ATTW02BoldItalic.eot");
+  src: url("../b2b-angular/fonts/Omnes_ATTW02BoldItalic.eot?#iefix") format("embedded-opentype"), url("../b2b-angular/fonts/Omnes_ATTW02BoldItalic.woff") format("woff"), url("../b2b-angular/fonts/Omnes_ATTW02BoldItalic.woff2") format("woff2"), url("../b2b-angular/fonts/Omnes_ATTW02BoldItalic.ttf") format("truetype");
   font-weight: normal;
   font-style: normal; }
 
 /* TODO: Build a reference page for these classes */
 .font-regular {
-  font-family: "Omnes-ECOMP-W02" !important; }
+  font-family: "Omnes-ECOMP-W02", Arial !important; }
 
 .font-light {
-  font-family: "Omnes-ECOMP-W02-Light" !important; }
+  font-family: "Omnes-ECOMP-W02-Light", Arial !important; }
 
 .font-italic {
-  font-family: "Omnes-ECOMP-W02-Italic" !important; }
+  font-family: "Omnes-ECOMP-W02-Italic", Arial !important; }
 
 .font-light-italic {
-  font-family: "Omnes-ECOMP-W02-Light-Italic" !important; }
+  font-family: "Omnes-ECOMP-W02-Light-Italic", Arial !important; }
 
 .font-medium {
-  font-family: "Omnes-ECOMP-W02-Medium" !important; }
+  font-family: "Omnes-ECOMP-W02-Medium", Arial !important; }
 
 .font-medium-italic {
-  font-family: "Omnes-ECOMP-W02-Medium-Italic" !important; }
+  font-family: "Omnes-ECOMP-W02-Medium-Italic", Arial !important; }
 
 .font-reset {
   font-style: normal;
@@ -7208,6 +7229,14 @@ input.awd-select.focused {
   top: 50%;
   left: 50%; }
 
+.small-modal-loader {
+  width: 420px !important;
+  height: 212px !important;
+  text-align: center; }
+
+.small-modal-loader .icon-primary-spinner {
+  margin-bottom: 5px; }
+
 .body.styled-by-modal {
   position: fixed; }
 
@@ -7333,9 +7362,6 @@ input.awd-select.focused {
 :not(.modal-docked) .b2b-modal-footer {
   position: relative; }
 
-.modal-docked .b2b-modal-footer {
-  border-top: 1px solid #d2d2d2; }
-
 .modal-landscape .b2b-modal-footer {
   position: relative; }
 
@@ -7343,7 +7369,8 @@ input.awd-select.focused {
   display: flex;
   justify-content: flex-end;
   padding: 20px 0 5px;
-  width: 100%; }
+  width: 100%;
+  border-top: 1px solid #d2d2d2; }
 
 .b2b-modal-footer .cta-button-group .btn {
   margin-left: auto;
@@ -7523,7 +7550,7 @@ input.awd-select.focused {
   padding: 0 0 5px 30px;
   line-height: 22px;
   margin-left: -10px;
-  color: #333;
+  color: #0568ae;
   font-size: 1.4rem; }
 
 .b2b-ml-nav a:focus {
@@ -7558,9 +7585,6 @@ input.awd-select.focused {
 .b2b-ml-nav a > span > i {
   font-size: 20px; }
 
-.b2b-ml-nav a:only-child {
-  color: #0574ac; }
-
 .b2b-ml-nav a:only-child > span {
   left: -6px;
   border-radius: 50%;
@@ -7584,6 +7608,9 @@ input.awd-select.focused {
 .b2b-ml-nav li a.active + ul {
   display: block; }
 
+.b2b-ml-nav .selected {
+  color: #333; }
+
 /*to overide ng-doc inline property for library demo - TODO: Move to docs.css*/
 .b2b-ml-nav a [class^="icon-primary-"], a [class*=" icon-primary-"], a [class^="icon-primary-"]:before, a [class*=" icon-primary-"]:before {
   display: inline-block; }
@@ -7595,7 +7622,10 @@ input.awd-select.focused {
   .b2b-alerts-messages h3 {
     color: #333 !important;
     font-family: "Omnes-ECOMP-W02-Medium", Arial;
-    margin-bottom: 0 !important; }
+    margin-bottom: 0 !important; 
+       margin: 1em 0 5px;
+       line-height: 27px;
+       font-size: 18px;}
   .b2b-alerts-messages h4 {
     color: #333 !important;
     font-family: "Omnes-ECOMP-W02-Medium", Arial;
@@ -7764,7 +7794,7 @@ a.pager__item--next:focus, a.pager__item--prev:focus {
   font-size: 1.6rem;
   margin-top: 20px;
   display: inline-block;
-  font-family: "Omnes-ECOMP-w02-medium", Arial; }
+  font-family: "Omnes-ECOMP-W02-Medium", Arial; }
 
 .mobile-view > .pager__item {
   margin: 5px 10px;
@@ -8736,7 +8766,8 @@ ul.module-optinalcta {
     width: 100%;
     height: 6px;
     background-color: #cccccc;
-    border-radius: 10px; }
+    border-radius: 10px;
+    border: 1px solid #cccccc; }
   .b2b-slider-container .slider-track-fill {
     width: 100%;
     height: 6px;
@@ -8744,7 +8775,8 @@ ul.module-optinalcta {
     border-radius: 10px;
     width: 0;
     background-color: #157BB2;
-    transition: width 0s linear; }
+    transition: width 0s linear;
+    border: 1px solid #cccccc; }
   .b2b-slider-container .slider-knob-container {
     transition: left 0s linear; }
     .b2b-slider-container .slider-knob-container.slider-knob-hidden {
@@ -8854,36 +8886,46 @@ ul.module-optinalcta {
   margin-left: 5px; }
 
 .b2b-status-tracker > .b2b-status-tracker-step .b2b-status-tracker-heading {
-  font-family: "Omnes-ECOMP-W02", Arial;
+  font-family: "Omnes-ECOMP-W02-Medium", Arial;
   font-size: 14px;
-  color: #767676;
+  color: #191919;
   margin-bottom: 10px; }
 
-.b2b-status-tracker > .b2b-status-tracker-step.complete > .b2b-status-tracker-heading {
-  font-family: "Omnes-ECOMP-W02-Medium", Arial;
-  color: #1b7e28; }
-
 .b2b-status-tracker > .b2b-status-tracker-step.complete > .progress > .progress-bar {
   width: 100%;
   background-color: #1b7e28; }
 
-.b2b-status-tracker > .b2b-status-tracker-step.complete > .b2b-status-tracker-estimate {
-  font-family: "Omnes-ECOMP-W02-Medium", Arial;
-  color: #333333; }
-  .b2b-status-tracker > .b2b-status-tracker-step.complete > .b2b-status-tracker-estimate > .icoControls-approval {
-    color: #1b7e28; }
-
-.b2b-status-tracker > .b2b-status-tracker-step.current > .b2b-status-tracker-heading {
-  font-family: "Omnes-ECOMP-W02-Medium", Arial;
-  color: #333333; }
+.b2b-status-tracker > .b2b-status-tracker-step.complete .icoControls-approval {
+  color: #1b7e28; }
 
 .b2b-status-tracker > .b2b-status-tracker-step.current > .progress > .progress-bar {
   width: 100%;
   background-color: #333333; }
 
-.b2b-status-tracker > .b2b-status-tracker-step.current > .b2b-status-tracker-estimate > .icon-misc-time {
+.b2b-status-tracker > .b2b-status-tracker-step.current .icon-misc-time {
   color: #333333; }
 
+.b2b-status-tracker > .b2b-status-tracker-step.pending > .progress > .progress-bar {
+  width: 100%;
+  background-color: #ffb81c; }
+
+.b2b-status-tracker > .b2b-status-tracker-step.pending .icoControls-statusokay {
+  color: #ffb81c; }
+
+.b2b-status-tracker > .b2b-status-tracker-step.actionRequired > .progress > .progress-bar {
+  width: 100%;
+  background-color: #cf2a2a; }
+
+.b2b-status-tracker > .b2b-status-tracker-step.actionRequired .icon-primary-securityalerts-alert {
+  color: #cf2a2a; }
+
+.b2b-status-tracker > .b2b-status-tracker-step.notAvailable > .progress > .progress-bar {
+  width: 100%;
+  background-color: #767676; }
+
+.b2b-status-tracker > .b2b-status-tracker-step.notAvailable .icoControls-restricted {
+  color: #767676; }
+
 .b2b-status-tracker > .b2b-status-tracker-step > .progress {
   position: relative;
   border-radius: 1.5px;
@@ -8895,18 +8937,18 @@ ul.module-optinalcta {
     height: 3px; }
 
 .b2b-status-tracker > .b2b-status-tracker-step > .b2b-status-tracker-estimate {
-  font-family: "Omnes-ECOMP-W02", Arial;
+  font-family: "Omnes-ECOMP-W02-Medium", Arial;
   font-size: 14px;
-  color: #767676;
+  color: #191919;
   margin-bottom: 10px; }
-  .b2b-status-tracker > .b2b-status-tracker-step > .b2b-status-tracker-estimate > .icon-misc-time {
-    color: #767676; }
 
 .b2b-status-tracker > .b2b-status-tracker-step > .b2b-status-tracker-description {
   font-family: "Omnes-ECOMP-W02", Arial;
   font-size: 12px;
   color: #767676;
   padding-right: 15px; }
+  .b2b-status-tracker > .b2b-status-tracker-step > .b2b-status-tracker-description a {
+    cursor: pointer; }
 
 .step-indicator {
   height: auto;
@@ -9483,6 +9525,10 @@ ul.module-optinalcta {
     height: 16px;
     width: 16px; }
 
+.btn-switch.focused {
+  outline: 1px dotted #000;
+  outline-offset: 5px; }
+
 table {
   max-width: 100%;
   background-color: transparent;
@@ -9701,7 +9747,6 @@ th:nth-child(8) {
 .b2b-table-div .selectWrap {
   width: 290px;
   position: relative;
-  left: 10px;
   display: inline-table;
   margin-bottom: 0px; }
 
@@ -9713,7 +9758,11 @@ th:nth-child(8) {
   font-size: 36px;
   border: 1px solid #ccc;
   background: #FFF;
-  border-radius: 6px; }
+  border-radius: 6px;
+  text-align: center; 
+  background: linear-gradient(#fcfcfc, #f2f2f2);
+  background-blend-mode: multiply;
+  width: 1em;}
 
 .b2b-external-sort-label {
   padding-bottom: 10px; }
@@ -9725,8 +9774,17 @@ th:nth-child(8) {
   text-decoration: none; }
 
 .b2b-external-sort-label label {
-  position: relative;
-  left: 10px; }
+  position: relative; }
+
+.b2b-external-sort-margin {
+  margin-right: 13px !important; }
+
+.b2b-table-sorter-icon [class*="icoArrows-"]:before {
+  font-size: 20px; }
+
+@media screen and (max-width: 950px) {
+  .b2b-external-sort-margin .selectWrap {
+    bottom: 0px !important; } }
 
 .tablesorter-default .tablesorter-header.sorter-false .tablesorter-header-inner {
   background: 0 0;
@@ -9862,7 +9920,8 @@ th:nth-child(8) {
 
 .b2b-table-scrollbar {
   border: 1px solid;
-  width: 651px; }
+  width: 651px;
+  position: relative; }
   .b2b-table-scrollbar .b2b-table-inner-container {
     width: 650px;
     padding-left: 150px;
@@ -10154,7 +10213,8 @@ label .tooltip {
   bottom: 0;
   left: 0;
   opacity: 0;
-  transform: rotate(45deg); }
+  transform: rotate(45deg);
+  z-index: 20; }
 
 .tooltip.active .icon-primary-tooltip[data-placement="top"] .arrow {
   display: block;
@@ -10348,7 +10408,7 @@ label .tooltip {
     border-left: 1px solid #ccc; }
     .b2b-tree ul li.bg > a {
       color: #333;
-      background-image: url("../style/images/treebg.png"); }
+      background-image: url("./style/images/treebg.png"); }
     .b2b-tree ul li .b2b-tree-tooltip {
       display: none;
       position: absolute;
@@ -10667,7 +10727,7 @@ label .tooltip {
 
 .filter-selected > span,
 .filter-selected > a.clear-all-filters {
-  font-family: Omnes-ECOMP-W02-Medium; }
+  font-family: "Omnes-ECOMP-W02-Medium", Arial; }
 
 .filter-selected-group {
   padding-top: 15px; }
@@ -10716,7 +10776,7 @@ label .tooltip {
   padding: 15px 20px 15px 0;
   color: #0574ac !important;
   cursor: pointer !important;
-  font-family: "Omnes-ECOMP-W02" !important;
+  font-family: "Omnes-ECOMP-W02", Arial !important;
   outline-offset: inherit !important;
   position: relative;
   height: auto;
@@ -10939,7 +10999,7 @@ label .tooltip {
 
 /********************* Utility CSS Ends **********************/
 /* Fix for alignment issue on Cancel link inside modal */
-.b2b-modal-footer > .cta-button-group {
+.modal-footer > .cta-button-group {
   line-height: 40px; }
 
 /* .att-dark-green { // Not used
@@ -11025,7 +11085,7 @@ button .colors-off-msg {
 }
 .fixed-230-subnav > li > a.live {
   color: #333333;
-  font-family: "Omnes-ECOMP-W02-Medium";
+  font-family: "Omnes-ECOMP-W02-Medium", Arial;
 }
 .fixed-230-subnav a > i {
   right: 10px;
@@ -11043,7 +11103,7 @@ button .colors-off-msg {
 }
 .fixed-230-subnav > li li > a.active {
   color: #333333;
-  font-family: "Omnes-ECOMP-W02-Medium";
+  font-family: "Omnes-ECOMP-W02-Medium", Arial;
   text-decoration: none;
 }
 .fixed-230-subnav ul {
@@ -11051,7 +11111,7 @@ button .colors-off-msg {
 } */
 .unlinked {
   color: #0568ae !important;
-  font-family: "Omnes-ECOMP-W02" !important; }
+  font-family: "Omnes-ECOMP-W02", Arial !important; }
 
 .unlinked.active {
   color: inherit !important; }
@@ -11094,7 +11154,7 @@ button .colors-off-msg {
   }
   .fixed-230-subnav > li li > a.active {
     color: inherit;
-    font-family: "Omnes-ECOMP-W02-Medium";
+    font-family: "Omnes-ECOMP-W02-Medium", Arial;
   }
 } */
 @keyframes DOMinsertion {
@@ -11128,9 +11188,9 @@ button .colors-off-msg {
     outline-color: transparent; } }
 
 .ajaxed,
-.modal.fade.in .b2b-modal-header,
-.modal.fade.in .b2b-modal-body,
-.modal.fade.in .b2b-modal-footer {
+.modal.fade.in .modal-header,
+.modal.fade.in .modal-body,
+.modal.fade.in .modal-footer {
   animation-duration: 0.01s;
   -o-animation-duration: 0.01s;
   -ms-animation-duration: 0.01s;
@@ -11237,13 +11297,6 @@ button .colors-off-msg {
   position: absolute;
   top: 0;
   z-index: 1; }
-
-.icon-primary-primary-circle:before {
-  background-image: url("data:image/svg+xml,%3Csvg%20baseProfile%3D%22tiny%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2036%2036%22%3E%3Ccircle%20fill%3D%22transparent%22%20stroke%3D%22%23666%22%20stroke-miterlimit%3D%2210%22%20cx%3D%2218%22%20cy%3D%2218%22%20r%3D%2216%22%2F%3E%3C%2Fsvg%3E");
-  content: "";
-  position: absolute;
-  top: 0;
-  z-index: 1; }
 /* Flyout inputs color is not aligned */
 textarea, input {
   color: #333; }
@@ -11480,30 +11533,38 @@ textarea, input {
   margin-left: -115px;
   margin-top: 100px; }
 
-.b2b-directory-listing .btn-right {
-  margin-bottom: 15px !important; }
-  .b2b-directory-listing .btn-right:after {
-    content: "  \27A1"; }
-
-.b2b-directory-listing .btn-left {
-  margin-top: 10px !important; }
-
 .b2b-directory-listing .btn-remove {
   margin-right: auto !important;
   margin-bottom: 15px; }
+  .b2b-directory-listing .btn-remove i {
+    margin-right: 0;
+    color: #fff;
+    top: -1px; }
 
 .b2b-directory-listing .btn-remove-all {
   margin-top: 0;
   margin-bottom: 61px !important;
   /* need to be removed */
   margin-right: auto !important; }
+  .b2b-directory-listing .btn-remove-all i {
+    margin-right: 0;
+    color: #fff;
+    top: -1px; }
+
+.b2b-directory-listing .btn-add {
+  margin-bottom: 15px !important; }
+  .b2b-directory-listing .btn-add i {
+    margin-right: 0;
+    color: #fff;
+    top: -1px; }
 
 .b2b-directory-listing .btn-add-all {
   margin-top: 0;
   margin-bottom: 61px !important; }
-
-.b2b-directory-listing .btn-left:before {
-  content: "\2B05  "; }
+  .b2b-directory-listing .btn-add-all i {
+    margin-right: 0;
+    color: #fff;
+    top: -1px; }
 
 .b2b-directory-listing .btn-search[class*="btn"] {
   right: 0.09rem; }
@@ -11517,7 +11578,10 @@ textarea, input {
 .b2b-directory-listing-label-heading {
   margin-top: 24px;
   padding-bottom: 5px; }
-
+.b2b-directory-listing .center {
+    display: block;
+    margin: 2em auto;
+}
 .b2b-dl-list-box option {
   padding-top: 13px;
   padding-bottom: 7px;
@@ -11799,11 +11863,7 @@ label.b2b-static-route-label-heading {
   display: inline-block; }
 
 
-/*
-To Remove later
-*/
-
-.selectWrap::after { 
+  .selectWrap::after { 
   align-items: center; 
   background-position: 7px 7px; 
   background-repeat: no-repeat; 
index 0e62a34..3d211ec 100644 (file)
@@ -1,5 +1,5 @@
-/*! b2b-angular-library - v1.0.1 - Last updated: 2017-03-02. Copyright (c) 2016 AT&T Services, Inc. */ 
-angular.module("b2b.att.tpls", ['b2bTemplate/audioPlayer/audioPlayer.html', 'b2bTemplate/audioRecorder/audioRecorder.html', 'b2bTemplate/backToTop/backToTop.html', 'b2bTemplate/boardstrip/b2bAddBoard.html', 'b2bTemplate/boardstrip/b2bBoard.html', 'b2bTemplate/boardstrip/b2bBoardstrip.html', 'b2bTemplate/calendar/datepicker-popup.html', 'b2bTemplate/calendar/datepicker.html', 'b2bTemplate/coachmark/coachmark.html', 'b2bTemplate/dropdowns/b2bDropdownDesktop.html', 'b2bTemplate/dropdowns/b2bDropdownGroupDesktop.html', 'b2bTemplate/dropdowns/b2bDropdownListDesktop.html', 'b2bTemplate/fileUpload/fileUpload.html', 'b2bTemplate/flyout/flyout.html', 'b2bTemplate/flyout/flyoutContent.html', 'b2bTemplate/footer/footer_column_switch_tpl.html', 'b2bTemplate/horizontalTable/horizontalTable.html', 'b2bTemplate/hourPicker/b2bHourpicker.html', 'b2bTemplate/hourPicker/b2bHourpickerPanel.html', 'b2bTemplate/hourPicker/b2bHourpickerValue.html', 'b2bTemplate/leftNavigation/leftNavigation.html', 'b2bTemplate/listbox/listbox.html', 'b2bTemplate/modalsAndAlerts/b2b-backdrop.html', 'b2bTemplate/modalsAndAlerts/b2b-window.html', 'b2bTemplate/monthSelector/monthSelector-popup.html', 'b2bTemplate/monthSelector/monthSelector.html', 'b2bTemplate/monthSelector/monthSelectorLink.html', 'b2bTemplate/pagination/b2b-pagination.html', 'b2bTemplate/paneSelector/paneSelector.html', 'b2bTemplate/paneSelector/paneSelectorPane.html', 'b2bTemplate/profileCard/profileCard-addUser.html', 'b2bTemplate/profileCard/profileCard.html', 'b2bTemplate/searchField/searchField.html', 'b2bTemplate/seekBar/seekBar.html', 'b2bTemplate/slider/slider.html', 'b2bTemplate/spinButton/spinButton.html', 'b2bTemplate/statusTracker/statusTracker.html', 'b2bTemplate/stepTracker/stepTracker.html', 'b2bTemplate/switches/switches-spanish.html', 'b2bTemplate/switches/switches.html', 'b2bTemplate/tableMessages/tableMessage.html', 'b2bTemplate/tables/b2bTable.html', 'b2bTemplate/tables/b2bTableBody.html', 'b2bTemplate/tables/b2bTableHeaderSortable.html', 'b2bTemplate/tables/b2bTableHeaderUnsortable.html', 'b2bTemplate/tableScrollbar/tableScrollbar.html', 'b2bTemplate/tabs/b2bTab.html', 'b2bTemplate/tabs/b2bTabset.html', 'b2bTemplate/treeNav/groupedTree.html', 'b2bTemplate/treeNav/treeMember.html', 'b2bTemplate/treeNav/ungroupedTree.html', 'b2bTemplate/treeNodeCheckbox/groupedTree.html', 'b2bTemplate/treeNodeCheckbox/treeMember.html', 'b2bTemplate/treeNodeCheckbox/ungroupedTree.html']);angular.module("b2b.att", ["b2b.att.tpls", 'b2b.att.addressInputTemplate','b2b.att.arrows','b2b.att.audioPlayer','b2b.att.audioRecorder','b2b.att.backToTop','b2b.att.badgesForAlerts','b2b.att.boardstrip','b2b.att.breadcrumbs','b2b.att.buttonGroups','b2b.att.buttons','b2b.att.calendar','b2b.att.checkboxes','b2b.att.coachmark','b2b.att.configurationSection','b2b.att.directoryListingTemplate','b2b.att.dropdowns','b2b.att.fileUpload','b2b.att.filters','b2b.att.flyout','b2b.att.footer','b2b.att.header','b2b.att.headings','b2b.att.horizontalTable','b2b.att.hourPicker','b2b.att.inputTemplate','b2b.att.leftNavigation','b2b.att.links','b2b.att.listbox','b2b.att.loaderAnimation','b2b.att.messageWrapper','b2b.att.modalsAndAlerts','b2b.att.monthSelector','b2b.att.multiLevelNavigation','b2b.att.multipurposeExpander','b2b.att.notesMessagesAndErrors','b2b.att.notificationCardTemplate','b2b.att.orderConfirmationTemplate','b2b.att.pagination','b2b.att.paneSelector','b2b.att.phoneNumberInput','b2b.att.profileBlockTemplate','b2b.att.profileCard','b2b.att.radios','b2b.att.searchField','b2b.att.seekBar','b2b.att.selectorModule','b2b.att.separators','b2b.att.slider','b2b.att.spinButton','b2b.att.staticRouteTemplate','b2b.att.statusTracker','b2b.att.stepTracker','b2b.att.switches','b2b.att.tableMessages','b2b.att.tables','b2b.att.tableScrollbar','b2b.att.tabs','b2b.att.tagBadges','b2b.att.textArea','b2b.att.tooltipsForForms','b2b.att.treeNav','b2b.att.treeNodeCheckbox','b2b.att.utilities']);/**
+/*! b2b-angular-library - v1.0.4 - Last updated: 2017-05-03. Copyright (c) 2016 AT&T Services, Inc. */ 
+angular.module("b2b.att.tpls", ['b2bTemplate/audioPlayer/audioPlayer.html', 'b2bTemplate/audioRecorder/audioRecorder.html', 'b2bTemplate/backToTop/backToTop.html', 'b2bTemplate/boardstrip/b2bAddBoard.html', 'b2bTemplate/boardstrip/b2bBoard.html', 'b2bTemplate/boardstrip/b2bBoardstrip.html', 'b2bTemplate/calendar/datepicker-popup.html', 'b2bTemplate/calendar/datepicker.html', 'b2bTemplate/coachmark/coachmark.html', 'b2bTemplate/dropdowns/b2bDropdownDesktop.html', 'b2bTemplate/dropdowns/b2bDropdownGroupDesktop.html', 'b2bTemplate/dropdowns/b2bDropdownListDesktop.html', 'b2bTemplate/fileUpload/fileUpload.html', 'b2bTemplate/flyout/flyout.html', 'b2bTemplate/flyout/flyoutContent.html', 'b2bTemplate/footer/footer_column_switch_tpl.html', 'b2bTemplate/horizontalTable/horizontalTable.html', 'b2bTemplate/hourPicker/b2bHourpicker.html', 'b2bTemplate/hourPicker/b2bHourpickerPanel.html', 'b2bTemplate/hourPicker/b2bHourpickerValue.html', 'b2bTemplate/leftNavigation/leftNavigation.html', 'b2bTemplate/listbox/listbox.html', 'b2bTemplate/modalsAndAlerts/b2b-backdrop.html', 'b2bTemplate/modalsAndAlerts/b2b-window.html', 'b2bTemplate/monthSelector/monthSelector-popup.html', 'b2bTemplate/monthSelector/monthSelector.html', 'b2bTemplate/monthSelector/monthSelectorLink.html', 'b2bTemplate/pagination/b2b-pagination.html', 'b2bTemplate/paneSelector/paneSelector.html', 'b2bTemplate/paneSelector/paneSelectorPane.html', 'b2bTemplate/profileCard/profileCard-addUser.html', 'b2bTemplate/profileCard/profileCard.html', 'b2bTemplate/searchField/searchField.html', 'b2bTemplate/seekBar/seekBar.html', 'b2bTemplate/slider/slider.html', 'b2bTemplate/spinButton/spinButton.html', 'b2bTemplate/statusTracker/statusTracker.html', 'b2bTemplate/stepTracker/stepTracker.html', 'b2bTemplate/switches/switches-spanish.html', 'b2bTemplate/switches/switches.html', 'b2bTemplate/tableMessages/tableMessage.html', 'b2bTemplate/tables/b2bTable.html', 'b2bTemplate/tables/b2bTableBody.html', 'b2bTemplate/tables/b2bTableHeaderSortable.html', 'b2bTemplate/tables/b2bTableHeaderUnsortable.html', 'b2bTemplate/tableScrollbar/tableScrollbar.html', 'b2bTemplate/tabs/b2bTab.html', 'b2bTemplate/tabs/b2bTabset.html', 'b2bTemplate/treeNav/groupedTree.html', 'b2bTemplate/treeNav/treeMember.html', 'b2bTemplate/treeNav/ungroupedTree.html', 'b2bTemplate/treeNodeCheckbox/groupedTree.html', 'b2bTemplate/treeNodeCheckbox/treeMember.html', 'b2bTemplate/treeNodeCheckbox/ungroupedTree.html']);angular.module("b2b.att", ["b2b.att.tpls", 'b2b.att.addressInputTemplate','b2b.att.arrows','b2b.att.audioPlayer','b2b.att.audioRecorder','b2b.att.backToTop','b2b.att.badgesForAlerts','b2b.att.boardstrip','b2b.att.bootstrapGridTemplate','b2b.att.breadcrumbs','b2b.att.buttonGroups','b2b.att.buttons','b2b.att.calendar','b2b.att.checkboxes','b2b.att.coachmark','b2b.att.configurationSection','b2b.att.directoryListingTemplate','b2b.att.dropdowns','b2b.att.dropdowns','b2b.att.fileUpload','b2b.att.filters','b2b.att.flyout','b2b.att.footer','b2b.att.header','b2b.att.headingsAndCopy','b2b.att.horizontalTable','b2b.att.hourPicker','b2b.att.inputTemplate','b2b.att.leftNavigation','b2b.att.links','b2b.att.listbox','b2b.att.loaderAnimation','b2b.att.messageWrapper','b2b.att.modalsAndAlerts','b2b.att.monthSelector','b2b.att.multiLevelNavigation','b2b.att.multipurposeExpander','b2b.att.notesMessagesAndErrors','b2b.att.notificationCardTemplate','b2b.att.orderConfirmationTemplate','b2b.att.pagination','b2b.att.paneSelector','b2b.att.phoneNumberInput','b2b.att.profileBlockTemplate','b2b.att.profileCard','b2b.att.radios','b2b.att.searchField','b2b.att.seekBar','b2b.att.separators','b2b.att.slider','b2b.att.spinButton','b2b.att.staticRouteTemplate','b2b.att.statusTracker','b2b.att.stepTracker','b2b.att.switches','b2b.att.tableMessages','b2b.att.tables','b2b.att.tableScrollbar','b2b.att.tabs','b2b.att.tagBadges','b2b.att.textArea','b2b.att.timeInputField','b2b.att.tooltipsForForms','b2b.att.treeNav','b2b.att.treeNodeCheckbox','b2b.att.utilities']);/**
  * @ngdoc directive
  * @name Template.att:Address Input
  *
@@ -1005,6 +1005,24 @@ angular.module('b2b.att.boardstrip', ['b2b.att.utilities'])
             }
         };
     }]);
+/** 
+ * @ngdoc directive 
+ * @name Template.att:Bootstrap Grid Template
+ * 
+ * @description 
+ *  <file src="src/bootstrapGridTemplate/docs/readme.md" /> 
+ * 
+ * @example 
+ *  <section id="code">
+        <example module="b2b.att"> 
+            <file src="src/bootstrapGridTemplate/docs/demo.html" /> 
+            <file src="src/bootstrapGridTemplate/docs/demo.js" /> 
+       </example> 
+    </section>    
+ * 
+ */
+angular.module('b2b.att.bootstrapGridTemplate', [])
+  
 /**
  * @ngdoc directive
  * @name Navigation.att:breadcrumbs
@@ -1295,7 +1313,7 @@ angular.module('b2b.att.calendar', ['b2b.att.position', 'b2b.att.utilities'])
     legendMessage: null,
     calendarDisabled: false,
     collapseWait: 0,
-    orientation: 'left',
+    orientation: 'right',
     inline: false,
     helperText: 'The date you selected is $date. In case of mobile double tap to open calendar. Select a date to close the calendar.',
     datepickerEvalAttributes: ['dateFormat', 'dayFormat', 'monthFormat', 'yearFormat', 'dayHeaderFormat', 'dayTitleFormat', 'disableWeekend', 'disableSunday', 'startingDay', 'collapseWait', 'orientation'],
@@ -1359,11 +1377,15 @@ angular.module('b2b.att.calendar', ['b2b.att.position', 'b2b.att.utilities'])
             dayHeader: getValue($attrs.dayHeaderFormat, dtConfig.dayHeaderFormat),
             dayTitle: getValue($attrs.dayTitleFormat, dtConfig.dayTitleFormat),
             disableWeekend: getValue($attrs.disableWeekend, dtConfig.disableWeekend),
-            disableSunday: getValue($attrs.disableSunday, dtConfig.disableSunday),
-            disableDates: getValue($attrs.disableDates, dtConfig.disableDates)
+            disableSunday: getValue($attrs.disableSunday, dtConfig.disableSunday)
         },
         startingDay = getValue($attrs.startingDay, dtConfig.startingDay);
 
+    if($attrs.disableDates !== undefined) {
+        format.disableDates = $attrs.disableDates;
+    } else {
+       format.disableDates =  dtConfig.disableDates;     
+    }
     $scope.minDate = dtConfig.minDate ? $scope.resetTime(dtConfig.minDate) : null;
     $scope.maxDate = dtConfig.maxDate ? $scope.resetTime(dtConfig.maxDate) : null;
     $scope.dueDate = dtConfig.dueDate ? $scope.resetTime(dtConfig.dueDate) : null;
@@ -1398,12 +1420,35 @@ angular.module('b2b.att.calendar', ['b2b.att.position', 'b2b.att.utilities'])
 
     this.updatePosition = function (b2bDatepickerPopupTemplate) {
         $scope.position = $position.offset($element);
-        $scope.position.top = $scope.position.top + $element.find('input').prop('offsetHeight');
-        if ($scope.orientation === 'right') {
-            $scope.position.left = $scope.position.left - (((b2bDatepickerPopupTemplate && b2bDatepickerPopupTemplate.prop('offsetWidth')) || 290) - $element.find('input').prop('offsetWidth'));
-        }
+        $scope.position.top = $scope.position.top + $element.prop('offsetHeight');
+        $scope.position.left = $scope.position.left - (((b2bDatepickerPopupTemplate && b2bDatepickerPopupTemplate.prop('offsetWidth')) || 290) - $element.prop('offsetWidth'));
     };
 
+    this.isDateInRange = function(date) {
+        if ((compare(date, $scope.minDate) >= 0) && (compare(date, $scope.maxDate) <= 0)) {
+            return true;
+        } else  {
+            return false;
+        }
+        return false;
+    }
+
+    this.isDisbaledDate = function(date) {
+        if ($attrs.from && !angular.isDate($scope.fromDate)) {
+            return true;
+        }
+        if (format.disableWeekend === true && (dateFilter(date, format.dayHeader) === "Saturday" || dateFilter(date, format.dayHeader) === "Sunday")) {
+            return true;
+        }
+        if (format.disableSunday === true && (dateFilter(date, format.dayHeader) === "Sunday")) {
+            return true;
+        }
+    
+        return (($scope.minDate && compare(date, $scope.minDate) < 0) || ($scope.maxDate && compare(date, $scope.maxDate) > 0) || ($scope.datesCallBack({
+            date: date
+        })));
+
+    }
     function isSelected(dt) {
         if (dt && angular.isDate($scope.currentDate) && compare(dt, $scope.currentDate) === 0) {
             return true;
@@ -1470,7 +1515,7 @@ angular.module('b2b.att.calendar', ['b2b.att.position', 'b2b.att.utilities'])
         if (isOld(date, currentMonthDate) || isNew(date, currentMonthDate)) {
             return true;
         }
-        return (($scope.minDate && compare(date, $scope.minDate) < 0) || ($scope.maxDate && compare(date, $scope.maxDate) > 0) || (format.disableDates && format.disableDates({
+        return (($scope.minDate && compare(date, $scope.minDate) < 0) || ($scope.maxDate && compare(date, $scope.maxDate) > 0) || ($scope.datesCallBack({
             date: date
         })));
     };
@@ -1582,36 +1627,69 @@ angular.module('b2b.att.calendar', ['b2b.att.position', 'b2b.att.utilities'])
     ];
 }])
 
-.directive('b2bDatepickerPopup', ['$parse', '$log', '$timeout', '$document', '$documentBind', '$isElement', '$templateCache', '$compile', 'trapFocusInElement', '$position', '$window', function ($parse, $log, $timeout, $document, $documentBind, $isElement, $templateCache, $compile, trapFocusInElement, $position, $window) {
+.directive('b2bDatepicker', ['$parse', '$log', '$timeout', '$document', '$documentBind', '$isElement', '$templateCache', '$compile', 'trapFocusInElement', '$position', '$window', '$filter', 'b2bDatepickerConfig', function ($parse, $log, $timeout, $document, $documentBind, $isElement, $templateCache, $compile, trapFocusInElement, $position, $window, $filter, b2bDatepickerConfig) {
     return {
         restrict: 'EA',
-        replace: true,
-        transclude: true,
-        templateUrl: function (elem, attr) {
-            if (attr.inline === 'true') {
-                return 'b2bTemplate/calendar/datepicker-popup.html';
-            } else {
-                return 'b2bTemplate/calendar/datepicker.html';
-            }
+        scope: { 
+            model: '=ngModel',
+            datesCallBack: '&disableDates',
+            onSelectClose: '&',
+            disabledInput: '=?ngDisabled'
         },
-        scope: {},
-        require: ['b2bDatepickerPopup', 'ngModel', '?^b2bDatepickerGroup'],
+        require: ['b2bDatepicker', 'ngModel', '?^b2bDatepickerGroup'],
         controller: 'b2bDatepickerController',
         link: function (scope, element, attrs, ctrls) {
             var datepickerCtrl = ctrls[0],
                 ngModel = ctrls[1],
                 b2bDatepickerGroupCtrl = ctrls[2];
             var b2bDatepickerPopupTemplate;
+            var isCalendarOpened = false;
+            if(scope.disabledInput === undefined || scope.disabledInput === '') {
+                scope.disabledInput = false;
+            } 
+            if(attrs.inline == 'true'){     
+                element.after($compile($templateCache.get('b2bTemplate/calendar/datepicker-popup.html'))(scope));
+                var temp = element.after();
+                element.remove();
+                element = temp; 
+            } else {
+                var buttonTabIndex =  scope.disabledInput===true ? -1 : 0; 
+
+                element.after($compile('<button class="btn-calendar-icon" ng-disabled='+scope.disabledInput+' ><i class="icon-primary-calendar b2b-calendar-icon" aria-haspopup="true" aria-expanded="false" ng-class=\"{\'disabled\': '+scope.disabledInput+'}\" ></i></button>')(scope));
+                element.attr('placeholder', 'MM/dd/yyyy');
+                element.attr('b2b-format-date', b2bDatepickerConfig.dateFormat); 
+            }
+            scope.$watch('model', function(val) {
+
+                if(val !== undefined && val !== '') {
+                    var date_regex = /^(0[1-9]|1[0-2])\/(0[1-9]|1\d|2\d|3[01])\/(19|20)\d{2}$/ ;
+
+                    if(!date_regex.test(element[0].value)) {
+                        ngModel.$setValidity('datePattern', false);
+                    } else {    
+                        ngModel.$setValidity('datePattern', true);
+                    }
+                    
+                } else {
+                    ngModel.$setValidity('datePattern', true);
+                }
+                
+            });
 
             if (!ngModel) {
                 $log.error("ng-model is required.");
                 return; // do nothing if no ng-model
             }
 
+            if(scope.model !== undefined && scope.model !== '') {
+                element[0].value = $filter('date')(scope.model, "MM/dd/yyyy");
+            }
+
             // Configuration parameters
             var mode = 0,
                 selected;
             scope.isOpen = false;
+            var isValidDate = false;
 
             scope.headers = [];
             scope.footers = [];
@@ -1620,21 +1698,66 @@ angular.module('b2b.att.calendar', ['b2b.att.position', 'b2b.att.utilities'])
                 b2bDatepickerGroupCtrl.registerDatepickerScope(scope);
             }
 
-            element.find('button').bind('click', function () {
-                element.find('input')[0].click();
-            });
+             var calendarButton = angular.element(element[0].nextElementSibling);
 
-            element.find('input').bind('click', function () {
+            calendarButton.bind('click',function(){
+                openCalendarPopup = false;
                 if (!scope.ngDisabled) {
                     scope.isOpen = !scope.isOpen;
                     toggleCalendar(scope.isOpen);
                     scope.$apply();
                     datepickerCtrl.updatePosition(b2bDatepickerPopupTemplate);
                     $timeout(function () { 
-                        angular.element(element[0].querySelector('.datepicker-input')).scrollTop=0;
+                       // angular.element(element[0].querySelector('.datepicker-input')).scrollTop=0;
                     },10);
                 }
-            });
+            })
+            var openCalendarPopup = false;
+
+            element.bind('blur', function() {
+                if(scope.model !== undefined && scope.model !== '') {
+                    var dateEntered = scope.model;
+
+                      var date_regex = /^(0[1-9]|1[0-2])\/(0[1-9]|1\d|2\d|3[01])\/(19|20)\d{2}$/ ;
+
+                    if(date_regex.test(dateEntered)) {       
+                        var parts = dateEntered.split('/');
+                        var enteredDate = new Date(parts[2],parts[0]-1,parts[1]);                           
+
+                        if(datepickerCtrl.isDateInRange(enteredDate)) {
+                            isValidDate -= 1;
+                            ngModel.$setValidity('outOfRange', true);
+                            $timeout(function(){
+                                ngModel.$setValidity('outOfRange', true);
+                            },10);
+                            isValidDate = true;
+                            if(!datepickerCtrl.isDisbaledDate(enteredDate)) {  
+                               $timeout(function(){
+                                    ngModel.$setValidity('disabledDate', true);
+                               },10);   
+                                scope.select(enteredDate); 
+                                openCalendarPopup = true;
+                            } else {
+                                $timeout(function(){
+                                    ngModel.$setValidity('disabledDate', false);
+                                },10);
+                                isValidDate = false;
+                                openCalendarPopup = false;
+                            }
+  
+                        } else {
+                            isValidDate += 1;
+                            $timeout(function(){
+                                ngModel.$setValidity('outOfRange', false);
+                            },10);
+                            isValidDate = false;
+                            openCalendarPopup = false;
+                        }
+
+                    }
+                }
+            });   
+
             var toggleCalendar = function (flag) {
                 if (!scope.inline) {
                     if (flag) {
@@ -1650,17 +1773,45 @@ angular.module('b2b.att.calendar', ['b2b.att.position', 'b2b.att.utilities'])
                                 scope.getFocus = false; 
                                 scope.$apply();
                             }, 100);
+                            handleTabEvent();
                         });
+                        angular.element(document.querySelector('.b2b-calendar-icon')).attr('aria-expanded','true');
                     } else {
-                        b2bDatepickerPopupTemplate.unbind('keydown', keyPress);
-                        b2bDatepickerPopupTemplate.remove();
-                        element.find('button')[0].focus();
+                        if(!openCalendarPopup) {
+                            b2bDatepickerPopupTemplate.unbind('keydown', keyPress);
+                            b2bDatepickerPopupTemplate.remove();
+                        }
+                        element[0].focus();
                         scope.getFocus = false;
+                        angular.element(document.querySelector('.b2b-calendar-icon')).attr('aria-expanded','false');
                         trapFocusInElement(flag, b2bDatepickerPopupTemplate);
                     }
                 }
             };
 
+            var handleTabEvent = function(){
+                b2bDatepickerPopupTemplate.find('td').on('keydown', function (e) {
+                    if (e.keyCode == '9') {
+                        if(e.shiftKey){
+                            if(b2bDatepickerPopupTemplate.find('tr')[0].querySelector('th.next')){
+                                b2bDatepickerPopupTemplate.find('tr')[0].querySelector('th.next').focus();
+                            }else{
+                                b2bDatepickerPopupTemplate.find('tr')[0].querySelector('th.datepicker-switch').focus()
+                            }        
+                        }else{
+                            if(b2bDatepickerPopupTemplate.find('tr')[0].querySelector('th.prev')){
+                                b2bDatepickerPopupTemplate.find('tr')[0].querySelector('th.prev').focus();
+                            }else{
+                                b2bDatepickerPopupTemplate.find('tr')[0].querySelector('th.datepicker-switch').focus()
+                            }
+                        }
+                        
+                        e.preventDefault();
+                        e.stopPropagation();
+                    }
+                });
+            }
+
             var outsideClick = function (e) {
                 var isElement = $isElement(angular.element(e.target), element, $document);
                 var isb2bDatepickerPopupTemplate = $isElement(angular.element(e.target), b2bDatepickerPopupTemplate, $document);
@@ -1871,6 +2022,8 @@ angular.module('b2b.att.calendar', ['b2b.att.position', 'b2b.att.utilities'])
                         date: dt
                     }) !== false)) {
                     scope.currentDate = dt;
+                    element[0].value = $filter('date')(dt, "MM/dd/yyyy");
+                    ngModel.$setValidity('outOfRange', true);
                     if (angular.isNumber(scope.collapseWait)) {
                         $timeout(function () {
                             scope.isOpen = false;
@@ -1892,6 +2045,7 @@ angular.module('b2b.att.calendar', ['b2b.att.position', 'b2b.att.utilities'])
 
                 $timeout(function () {
                     trapFocusInElement();
+                    handleTabEvent();
                 }, 100);
 
                 $event.preventDefault();
@@ -1928,73 +2082,6 @@ angular.module('b2b.att.calendar', ['b2b.att.position', 'b2b.att.utilities'])
     };
 }])
 
-.directive('b2bDatepicker', ['$compile', '$log', 'b2bDatepickerConfig', 'b2bDatepickerService', function ($compile, $log, b2bDatepickerConfig, b2bDatepickerService) {
-    return {
-        restrict: 'A',
-        scope: {
-            disableDates: '&',
-            onSelectClose: '&'
-        },
-        require: 'ngModel',
-        controller: ['$scope', '$element', '$attrs', function (scope, elem, attr) {
-            var dateFormatString = angular.isDefined(attr.dateFormat) ? scope.$parent.$eval(attr.dateFormat) : b2bDatepickerConfig.dateFormat;
-            var helperText = angular.isDefined(attr.helperText) ? scope.$parent.$eval(attr.helperText) : b2bDatepickerConfig.helperText;
-            helperText = helperText.replace('$date', '{{dt | date : \'' + dateFormatString + '\'}}');
-
-            var inline = false;
-            if (elem.prop('nodeName') !== 'INPUT') {
-                inline = true;
-            }
-
-            var calendarIcon = '<i class="icon-primary-calendar" aria-hidden="true"></i>'
-            var selectedDateMessage = '<button id="' + attr.btnId + '" type="button" class="span12 faux-input" ng-disabled="ngDisabled"><span class="hidden-spoken">' + helperText + '</span></button>';
-
-            elem.removeAttr('b2b-datepicker');
-            elem.removeAttr('ng-model');
-            elem.removeAttr('ng-disabled');
-            elem.addClass('datepicker-input');
-            elem.attr('ng-model', 'dt');
-            elem.attr('aria-describedby', 'datepicker');
-            elem.attr('aria-hidden', 'true');
-            elem.attr('tabindex', '-1');
-            elem.attr('readonly', 'true');
-            elem.attr('ng-disabled', 'ngDisabled');
-            elem.attr('b2b-format-date', dateFormatString);
-
-            var wrapperElement = angular.element('<div></div>');
-            wrapperElement.attr('b2b-datepicker-popup', '');
-            wrapperElement.attr('ng-model', 'dt');
-            if (inline) {
-                wrapperElement.attr('inline', inline);
-            }
-
-            b2bDatepickerService.setAttributes(attr, wrapperElement);
-            b2bDatepickerService.bindScope(attr, scope);
-
-            wrapperElement.html('');
-            wrapperElement.append(calendarIcon);
-            wrapperElement.append(selectedDateMessage);
-            wrapperElement.append(elem.prop('outerHTML'));
-
-            var elm = wrapperElement.prop('outerHTML');
-            elm = $compile(elm)(scope);
-            elem.replaceWith(elm);
-        }],
-        link: function (scope, elem, attr, ctrl) {
-            if (!ctrl) {
-                $log.error("ng-model is required.");
-                return; // do nothing if no ng-model
-            }
-
-            scope.$watch('dt', function (value) {
-                ctrl.$setViewValue(value);
-            });
-            ctrl.$render = function () {
-                scope.dt = ctrl.$viewValue;
-            };
-        }
-    };
-}])
 
 .directive('b2bDatepickerGroup', [function () {
     return {
@@ -2146,7 +2233,7 @@ angular.module('b2b.att.checkboxes', ['b2b.att.utilities'])
 
 angular.module('b2b.att.coachmark', ['b2b.att.utilities','b2b.att.position'])
         
-    .directive('b2bCoachmark', ['$document', '$compile', '$position', '$timeout', function($document, $compile, $position, $timeout) {
+    .directive('b2bCoachmark', ['$document', '$compile', '$position', '$timeout', 'b2bViewport', 'keymap', function($document, $compile, $position, $timeout, b2bViewport, keymap) {
         return {
             restrict: 'A',
              scope: {
@@ -2210,8 +2297,39 @@ angular.module('b2b.att.coachmark', ['b2b.att.utilities','b2b.att.position'])
                     }
                     element[0].focus();
                 }
+
+                var realStyle = function(_elem, _style) {
+                    var computedStyle;
+                    if ( typeof _elem.currentStyle != 'undefined' ) {
+                        computedStyle = _elem.currentStyle;
+                    } else {
+                        computedStyle = document.defaultView.getComputedStyle(_elem, null);
+                    }
+
+                    return _style ? computedStyle[_style] : computedStyle;
+                };
+
+                var copyComputedStyle = function(src, dest) {
+                    var s = realStyle(src);
+                    for ( var i in s ) {
+                        // Do not use `hasOwnProperty`, nothing will get copied
+                        if ( typeof i == "string" && i != "cssText" && !/\d/.test(i) && i.indexOf('webkit') !== 0 ) {
+                            // The try is for setter only properties
+                            try {
+                                dest.style[i] = s[i];
+                                // `fontSize` comes before `font` If `font` is empty, `fontSize` gets
+                                // overwritten.  So make sure to reset this property. (hackyhackhack)
+                                // Other properties may need similar treatment
+                                if ( i == "font" ) {
+                                    dest.style.fontSize = s.fontSize;
+                                }
+                            } catch (e) {}
+                        }
+                    }
+                };
                 
                 function showCoachmark(targetElement) {
+
                     scope.currentCoachmark = targetElement;
                     if(coachMarkElement !== undefined && coachMarkElement !==""){
                         coachMarkElement.removeClass('b2b-coachmark-label')
@@ -2219,16 +2337,32 @@ angular.module('b2b.att.coachmark', ['b2b.att.utilities','b2b.att.position'])
                         coachmarkHighlight.remove();
                     }
                     coachMarkElement = angular.element(document.querySelector(targetElement.elementId));
-                    coachMarkElement.addClass('b2b-coachmark-label');
+                    
                     var elementPosition = $position.offset(coachMarkElement);
                     
                     coachmarkHighlight = angular.element('<div class="b2b-coachmark-highlight"></div><div class="b2b-coachmark-highlight b2b-coachmark-highlight-mask"></div>');
                     coachmarkHighlight.css({
-                        'width': (elementPosition.width + 20) +'px',
+                        'width': (elementPosition.width + 25) +'px',
                         'top': (elementPosition.top -10) + 'px',
                         'left': (elementPosition.left - 10) + 'px',
                         'height': (elementPosition.height + 20) +'px'
-                    }); 
+                    });
+                    if(targetElement.cloneHtml){
+                        var copy = coachMarkElement[0].cloneNode(true);
+                        copy.id = "b2b-unique-"+targetElement.elementId.slice(1);
+                        copyComputedStyle(coachMarkElement[0],copy);
+                        var copychildNodes = copy.childNodes;
+                        var coachmarkChildNodes = coachMarkElement[0].childNodes;
+                        for(i=0;i<copychildNodes.length;i++){
+                            if(copychildNodes[i].nodeType === '3'){
+                                copyComputedStyle(coachmarkChildNodes[i],copychildNodes[i])
+                            }
+                        }
+                        coachmarkHighlight[0].appendChild(copy); // IE11 only supports appendChild, not append
+                    }else{
+                        coachMarkElement.addClass('b2b-coachmark-label');
+                    }
+                    
                     body.append(coachmarkHighlight);
                     
                     scope.coackmarkElPos.top = (elementPosition.top + elementPosition.height + 32) + 'px';
@@ -2237,14 +2371,29 @@ angular.module('b2b.att.coachmark', ['b2b.att.utilities','b2b.att.position'])
                     coackmarkContainer = $compile(coackmarkJqContainer)(scope);
                     body.append(coackmarkContainer);
                     
+                    
                     $timeout(function () {
                         var currentCoachmarkContainer = document.getElementsByClassName('b2b-coachmark-container')[0];
                         currentCoachmarkContainer.focus();
+
+                        newElem = angular.element(currentCoachmarkContainer);
+                        newElem.bind('keydown', function (e) {
+                            if(e.keyCode == keymap.KEY.TAB){
+                                if(e.shiftKey) {
+                                    if(e.target.className === 'b2b-coachmark-container'){
+                                        e.preventDefault();
+                                        e.stopPropagation();
+                                    }
+                                }
+                            }
+                        });
                         var coachmarkHeight = window.getComputedStyle(currentCoachmarkContainer).height.split('px')[0];
-                        var newOffsetHeight = (Math.round(elementPosition.top) - Math.round(coachmarkHeight));
+                        var newOffsetHeight = Math.round(elementPosition.top) - elementPosition.height;
                         
                         // We need a slight offset to show the lightboxed item
-                        TweenLite.to(window, 2, {scrollTo:{x: (scope.coackmarkElPos.left.split('px')[0]-100), y: newOffsetHeight}});
+                        if(!targetElement.cloneHtml){
+                            TweenLite.to(window, 2, {scrollTo:{x: (scope.coackmarkElPos.left.split('px')[0] - 100), y: newOffsetHeight-200}});
+                        }
                     }, 200);
                 }
                 
@@ -2275,6 +2424,32 @@ angular.module('b2b.att.coachmark', ['b2b.att.utilities','b2b.att.position'])
                     });
                 });
 
+
+                //performance technique to ensure scroll event doesn't cause lag
+                var throttle = function(type, name, obj) {
+                    obj = obj || window; 
+                    var running = false; 
+                    var func = function() { 
+                        if (running) { return; } 
+                        running = true; 
+                         requestAnimationFrame(function() { 
+                            obj.dispatchEvent(new CustomEvent(name)); 
+                            running = false; 
+                        }); 
+                    }; 
+                    obj.addEventListener(type, func); 
+                };
+             
+                scope.viewportWidth = b2bViewport.viewportWidth(); 
+                /* init - you can init any event */ 
+                throttle("resize", "optimizedResize"); 
+                window.addEventListener("optimizedResize", function() {
+                    if(initaitedCoachmark){
+                        showCoachmark(coachmarkItems[scope.coachmarkIndex]);
+                        scope.viewportWidth = b2bViewport.viewportWidth(); 
+                        scope.$digest();
+                    }
+                });
             }
         };
     }])
@@ -2436,13 +2611,11 @@ angular.module('b2b.att.dropdowns', ['b2b.att.utilities', 'b2b.att.position', 'n
                     set();
                 });
             }
+
         }],  
         link: function (scope, elem, attr, ctrl) {
             if ((scope.isInputDropdown && b2bUserAgent.notMobile()) || (!scope.isInputDropdown)) {
                 scope.updateModel = function () {
-                    if (ctrl.$dirty) {
-                        debugger;
-                    }
                     ctrl.$setViewValue(scope.currentSelected.value);
                     if (scope.dropdownRequired && scope.currentSelected.value === '') {
                         scope.setRequired(false);
@@ -2457,22 +2630,23 @@ angular.module('b2b.att.dropdowns', ['b2b.att.utilities', 'b2b.att.position', 'n
                     }
                 };
                 ctrl.$render = function () {
-//                    if(ctrl.$dirty || ctrl.$pristine) {
-                        $timeout(function () {
 
-                            if ((angular.isUndefined(ctrl.$viewValue) || ctrl.$viewValue == '') && (angular.isUndefined(scope.placeHoldertext) || scope.placeHoldertext == '')) {
-                                scope.dropdownLists[ctrl.$viewValue] && scope.dropdownLists[ctrl.$viewValue][0].updateDropdownValue();
-                            } else if ((angular.isUndefined(scope.placeHoldertext) || scope.placeHoldertext == '') && ctrl.$viewValue !== '' ) {
-                                scope.dropdownLists[ctrl.$viewValue] && scope.dropdownLists[ctrl.$viewValue][0].updateDropdownValue();
-                            } else if ((angular.isUndefined(ctrl.$viewValue) || ctrl.$viewValue == '') && scope.placeHoldertext !== '' )  {
-                                scope.currentSelected.text = scope.placeHoldertext; 
-                            } else {
-                                scope.dropdownLists[ctrl.$viewValue] && scope.dropdownLists[ctrl.$viewValue][0].updateDropdownValue();
-                            }
+                $timeout(function () {
+
+                        if ((angular.isUndefined(ctrl.$viewValue) || ctrl.$viewValue == '') && (angular.isUndefined(scope.placeHoldertext) || scope.placeHoldertext == '')) {
+                            scope.dropdownLists[ctrl.$viewValue] && scope.dropdownLists[ctrl.$viewValue][0].updateDropdownValue();
+                        } else if ((angular.isUndefined(scope.placeHoldertext) || scope.placeHoldertext == '') && ctrl.$viewValue !== '' ) {
+                            scope.dropdownLists[ctrl.$viewValue] && scope.dropdownLists[ctrl.$viewValue][0].updateDropdownValue();
+                        } else if ((angular.isUndefined(ctrl.$viewValue) || ctrl.$viewValue == '') && scope.placeHoldertext !== '' )  {
+                            scope.currentSelected.text = scope.placeHoldertext;
+                            ctrl.$setViewValue(scope.placeHoldertext);
+                        } else {
+                            scope.dropdownLists[ctrl.$viewValue] && scope.dropdownLists[ctrl.$viewValue][0].updateDropdownValue();
+                        }
+
+                    }, 100);
+                };
 
-                        }, 100);
-                    };
-//                }
                 scope.disabled = false;
                 scope.dropdownName = attr.name;
                 scope.dropdownId = attr.id;
@@ -2525,10 +2699,22 @@ angular.module('b2b.att.dropdowns', ['b2b.att.utilities', 'b2b.att.position', 'n
                 label: '',
                 index: -1
             };
+            scope.dropdownTextList = [];
             var searchString = '';
+
+            var getDropdownText = function(){
+                var dropdownItems = elem.parent().find('ul').children();
+                var count = dropdownItems.length;
+                for(var i=0;i<count;i++){
+                    scope.dropdownTextList.push(dropdownItems.eq(i).text());
+                }
+            };
             var searchElement = function (searchExp) {
-                var regex = new RegExp("\\b" + searchExp, "gi");
-                var position = scope.dropdownListValues.regexIndexOf(regex, scope.currentSelected.index + 1, true);
+                 if(scope.dropdownTextList.length ==0){
+                    getDropdownText ();
+                }
+                var regex = new RegExp("^" + searchExp, "i");
+                var position = scope.dropdownTextList.regexIndexOf(regex, scope.currentSelected.index + 1, true);
                 if (position > -1) {
                     return position;
                 }
@@ -2561,6 +2747,17 @@ angular.module('b2b.att.dropdowns', ['b2b.att.utilities', 'b2b.att.position', 'n
                                 ctrl.resetCounter(scope.dropdownLists[scope.currentSelected.value][2]);
                             }
                         }
+                        $timeout(function () {
+                            if(scope.dropdownLists[scope.currentSelected.value] !== undefined){
+                                (scope.dropdownLists[scope.currentSelected.value][1])[0].focus();
+                            } else {
+                                if (scope.isInputDropdown) {
+                                    elem.parent().find('input')[0].focus();
+                                } else {
+                                    elem.parent().find('button')[0].focus();
+                                }
+                            }
+                        }, 100);
                         if (scope.dropdownType === b2bDropdownConfig.linkMenuKeyword) {
                             scope.appendCaretPositionStyle();
                         }
@@ -2579,7 +2776,7 @@ angular.module('b2b.att.dropdowns', ['b2b.att.utilities', 'b2b.att.position', 'n
                 if (!scope.toggleFlag) {
                     if (ev.keyCode) {
                         var currentIndex = scope.currentSelected.index;
-                        if (ev.altKey === true && ev.keyCode === keymap.KEY.DOWN) {
+                        if (ev.keyCode === keymap.KEY.DOWN) {
                             scope.toggleDropdown(true);
                             ev.preventDefault();
                             ev.stopPropagation();
@@ -2621,6 +2818,7 @@ angular.module('b2b.att.dropdowns', ['b2b.att.utilities', 'b2b.att.position', 'n
                 }
             };
             $documentBind.click('toggleFlag', outsideClick, scope);
+            $documentBind.touch('toggleFlag', outsideClick, scope);
         }
     };
 }])
@@ -2663,13 +2861,28 @@ angular.module('b2b.att.dropdowns', ['b2b.att.utilities', 'b2b.att.position', 'n
     return {
         restrict: 'A',
         controller: ['$scope', '$element', '$attrs', function (scope, elem, attr) {
+            if(attr.optionRepeat && !scope.watchRegistered){
+                 var arrayName = attr.optionRepeat.split(" ").pop();
+                if(arrayName.indexOf(']') == -1){
+                    scope.$watch(arrayName,function(){
+                        /*scope.dropdownLists ={};*/
+                        scope.dropdownListValues =[];
+                        scope.dropdown = {
+                            totalIndex: -1
+                        };
+                        scope.dropdownTextList = [];
+                    },true);
+                scope.watchRegistered = true;
+                }                  
+            }
+           
             if ((scope.isInputDropdown && b2bUserAgent.notMobile()) || (!scope.isInputDropdown)) {
                 var innerHtml = angular.element('<div></div>').append(elem.html());
                 innerHtml = ($compile(innerHtml)(scope)).html();
                 var template = angular.element($templateCache.get('b2bTemplate/dropdowns/b2bDropdownListDesktop.html'));
                 template.attr('ng-repeat', attr.optionRepeat);
                 template.attr('value', elem.attr('value'));
-                template.attr('search-key', elem.attr('value'));
+                template.attr('search-key', elem.text());
                 if (elem.attr('aria-describedby')){
                     template.attr('aria-describedby', attr.ariaDescribedby);
                 }
@@ -2701,6 +2914,7 @@ angular.module('b2b.att.dropdowns', ['b2b.att.utilities', 'b2b.att.position', 'n
     return {
         restrict: 'A',
         scope: true,
+
         link: function (scope, elem, attr, ctrl) {
             var dropdownListValue = scope.dropdownListValue = attr.value;
             scope.dropdown.totalIndex++;
@@ -2710,20 +2924,17 @@ angular.module('b2b.att.dropdowns', ['b2b.att.utilities', 'b2b.att.position', 'n
             scope.dropdownLists[dropdownListValue][0] = scope;
             scope.dropdownLists[dropdownListValue][1] = elem;
             scope.dropdownLists[dropdownListValue][2] = dropdownListIndex;
+                                   
             scope.updateDropdownValue = function () {
                 scope.currentSelected.value = dropdownListValue;
                 if (scope.isInputDropdown) {
                     scope.currentSelected.text = elem.text();
+                    scope.currentSelected.label = elem.text();
                 } else if ((scope.dropdownType === b2bDropdownConfig.linkMenuKeyword) || (scope.dropdownType === b2bDropdownConfig.menuKeyword && scope.dropdownSize === b2bDropdownConfig.smallKeyword)) {
                     scope.currentSelected.text = dropdownListValue;
-                } else if (scope.dropdownType === b2bDropdownConfig.menuKeyword) {
-                    scope.currentSelected.text = $sce.trustAsHtml(elem.html());
-                }
-                if (scope.isInputDropdown) {
-                    scope.currentSelected.label = elem.text();
-                } else if (scope.dropdownType === b2bDropdownConfig.linkMenuKeyword) {
                     scope.currentSelected.label = dropdownListValue;
                 } else if (scope.dropdownType === b2bDropdownConfig.menuKeyword) {
+                    scope.currentSelected.text = $sce.trustAsHtml(elem.html());
                     scope.currentSelected.label = elem.text();
                 }
                 scope.currentSelected.index = dropdownListIndex;
@@ -2740,13 +2951,14 @@ angular.module('b2b.att.dropdowns', ['b2b.att.utilities', 'b2b.att.position', 'n
             elem.bind('mouseover', function (ev) {
                 elem[0].focus();
             });
+
             elem.bind('keydown', function (ev) {
                 if (!ev.keyCode) {
                     if (ev.which) {
                         ev.keyCode = ev.which;
                     } else if (ev.charCode) {
                         ev.keyCode = ev.charCode;
-                    }
+                    }  
                 }
                 if (ev.altKey === true && ev.keyCode === keymap.KEY.UP) {
                     scope.toggleDropdown(false);
@@ -3357,7 +3569,7 @@ angular.module('b2b.att.flyout', ['b2b.att.utilities', 'b2b.att.position'])
                 closeFlyout: '&'
             },
             link: function (scope, element, attrs, ctrl) {
-                element.bind('click', function (e) {
+                element.bind('click touchstart', function (e) {
                     scope.closeFlyout(e);
                     ctrl.closeFlyout(e);
                 });
@@ -3801,42 +4013,21 @@ angular.module('b2b.att.header', ['b2b.att.dropdowns','b2b.att.utilities'])
 
 /**
  * @ngdoc directive
- * @name Layouts.att:headings
+ * @name Layouts.att:headings & copy
  *
  * @description
- *  <file src="src/headings/docs/readme.md" />
+ *  <file src="src/headingsAndCopy/docs/readme.md" />
  *
- * @usage
-    <h1 class="heading-page">38px page heading</h1>
-    <h2 class="heading-major-section">30px major section heading</h2>
-    <h3 class="heading-sub-section">24px sub-section heading</h3>
-    <h2 class="heading-medium">20px medium heading</h2>
-    <h2 class="heading-medium-emphasis">20px medium emphasis heading</h2>
-    <h3 class="heading-small">18px small heading</h3>
-    <h3 class="heading-small-emphasis">18px small emphasis heading</h3>
-    <h3 class="heading-micro">13px micro heading</h3>
-
-    <h2 class="heading-group">Lead</h2>
-    <h1 class="heading-page">This is 38px heading</h1>
-    <h2 class="lead">This is lead text...The next big thing since the last big thing we announced.</h2>
-    <h2 class="heading-group">Eyebrow</h2>
-    <h3 class="eyebrow">EYEBROW TEXT</h3>
-    <h2 class="heading-major-section">This is a 30px heading</h2>
-    <h3 class="eyebrow">EYEBROW TEXT</h3>
-    <h3 class="heading-sub-section">24px sub-section heading</h3>
-    <h2 class="heading-group">Subheading</h2>
-    <h2 class="heading-major-section">This is a 30px heading</h2>
-    <h3 class="subheading">A subheading here to support what was said above</h3>
  * @example
  <section id="code">
     <b>HTML + AngularJS</b>
     <example module="b2b.att">
-    <file src="src/headings/docs/demo.html" />
+    <file src="src/headingsAndCopy/docs/demo.html" />
 </example>
 </section>
  */
 
-var b2bLegalCopy = angular.module('b2b.att.headings', []);
+var b2bLegalCopy = angular.module('b2b.att.headingsAndCopy', []);
 /**
  * @ngdoc directive
  * @name Tabs, tables & accordions.att:horizontalTable
@@ -3847,6 +4038,8 @@ var b2bLegalCopy = angular.module('b2b.att.headings', []);
  * @usage
  * @param {int} sticky - Number of sticky columns to have. Maximum of 3.
  * @param {boolean} refresh - A boolean that when set to true will force a re-render of table. Only use when using 'bulk mode'
+ * @param {string} legendContent - A string of html to fill in the legend flyout. This should generally be a <ul> with <li> and should not rely on Angular for repeating.
+ * @param {boolean} retainColumnSet - A boolean that on re-render of the table, determines if the columns visible should reset to 0 or not. Default is false. 
  * @example
  *  <section id="code">
         <example module="b2b.att">
@@ -3867,7 +4060,9 @@ angular.module('b2b.att.horizontalTable', [])
             transclude: true,
             scope: {
                 numOfStickyCols: '=?sticky',
-                refresh: '=?'
+                refresh: '=?',
+                legendContent: '=?',
+                retainColumnSet: '=?'
 
             },
             templateUrl: 'b2bTemplate/horizontalTable/horizontalTable.html',
@@ -3875,29 +4070,6 @@ angular.module('b2b.att.horizontalTable', [])
                 scope.numOfStickyCols = scope.numOfStickyCols || 1;
                 scope.viewportIndex = scope.numOfStickyCols;
 
-                // JM520E: This is a temporary hack until I solve the ngRepeat issue
-                function hack() {
-                    if (element.find('th').length < scope.numOfStickyCols) {
-                        // DOM ngRepeat is not ready, let's check back in 10 ms
-                        console.info('THs are not ready, trying again in 10ms');
-                        $timeout(hack, 10, false);
-                    } else {
-                        init();
-                    }
-                }
-                hack();
-
-                if (attrs.refresh !== undefined && attrs.refresh !== '') {
-                    scope.$watch('refresh', function(oldVal, newVal) {
-                        if (scope.refresh) {
-                            // From testing it takes about 30 ms before ngRepeat executes, so let's set initial timeout
-                            // NOTE: May need to expose timeout to developers. Application is known to have digest cycle of 3-5k watches.
-                            $timeout(init, 100, false);
-                            scope.refresh = false;
-                        }
-                    });
-                }
-
                 var tableElement = element.find('table');
                 var thElements = element.find('th');
                 var innerContainer = angular.element(element[0].querySelector('.b2b-horizontal-table-inner-container'));
@@ -3919,72 +4091,28 @@ angular.module('b2b.att.horizontalTable', [])
                 var displayNoneCSS = {'display': 'none'};
                 var displayBlockCSS = {'display': 'table-cell'};
 
-                function calculateVisibleColumns(startingPoint) {
-                    var usedWidth = 0, 
-                        visibleColumns = startingPoint || scope.numOfStickyCols;
-
-                    while(usedWidth < stickyPixels && visibleColumns < collectiveColumnWidth.length) {
-                        if (usedWidth+collectiveColumnWidth[visibleColumns] > stickyPixels) {
-                            if (startingPoint === visibleColumns) {
-                                return visibleColumns; // The next cell is too large to fit, it should be only thing to fit
-                            }
-                            visibleColumns--;
-                            return visibleColumns;
-                        }
-                        usedWidth += collectiveColumnWidth[visibleColumns];
-                        visibleColumns++;
-                    }
-
-                    if (usedWidth > stickyPixels) {
-                        return --visibleColumns;
-                    }
-                    return visibleColumns;
-                }
-
-                function updateCellDisplay(set) {
-                    for (var i = scope.numOfStickyCols; i < tableColumns.length; i++) {
-                        angular.element(tableColumns[i]).css(displayNoneCSS);
-                    }
-
-                    for (var i = set[0]; i <= set[1]; i++) {
-                        angular.element(tableColumns[i]).css(displayBlockCSS);
-                    }
-                }
-
-                function forceDigest() {
-                    if (!scope.$$phase) {
-                        scope.$digest();
-                    }
-                }
-
-                function findMax(arr, prop) {
-                    var max = 0;
-                    var localVal = 0;
-                    var prevDisplay;
-                    var item;
-                    for (var i = 0; i < arr.length; i++) {
-                        item = arr[i];
-                        prevDisplay = angular.element(item).css('display');
-                        if (scope.$$phase) {
-                            scope.$digest();
-                        }
-                        if (prop === 'width') {
-                            localVal = Math.ceil(parseInt(window.getComputedStyle(item).width.split('px')[0], 10)) + 30; // 30 px is padding
-                        } else if (prop === 'offsetWidth') {
-                            localVal = item.offsetWidth;
-                        } else if (prop === 'height') {
-                            localVal = item.offsetHeight;
+                // JM520E: This is a temporary hack until I solve the ngRepeat issue
+                function hack() {
+                    if (element.find('th').length < scope.numOfStickyCols) {
+                        // DOM ngRepeat is not ready, let's check back in 10 ms
+                        $timeout(hack, 10, false);
+                    } else {
+                        if (scope.refresh !== undefined) {
+                            scope.$watch('refresh', function(oldVal, newVal) { // this watch calls too many times
+                                if (!angular.equals(oldVal, newVal)) { //hackFinished && oldVal < newVal
+                                    // From testing it takes about 30 ms before ngRepeat executes, so let's set initial timeout
+                                    // NOTE: May need to expose timeout to developers. Application is known to have digest cycle of 3-5k watches.
+                                    $timeout(init, 100, false);
+                                    scope.refresh = false;
+                                }
+                            });
                         }
 
-                        if (localVal >= max) {
-                            max = localVal;
-                        }
+                        init();
                     }
-                    
-                    return max;
                 }
 
-                function init() {
+                var init = function() {
                     // Reset this from a previous execution
                     tableColumns = [];
                     collectiveColumnWidth = [];
@@ -3993,7 +4121,9 @@ angular.module('b2b.att.horizontalTable', [])
                     maxHeight = 0;
                     lastVisibleColumn = 0;
                     columnSets = [];
-                    setIndex = 0; 
+                    if ((!!scope.retainColumnSet)) {
+                        setIndex = 0;
+                    }
                     visibleColumns = [];
                     stickyPixels = 0;
 
@@ -4002,20 +4132,16 @@ angular.module('b2b.att.horizontalTable', [])
                     innerContainer = angular.element(element[0].querySelector('.b2b-horizontal-table-inner-container'));
                     outerContainer = angular.element(element[0].querySelector('.b2b-horizontal-table'));
                     totalWidth = element.children()[0].offsetWidth;
-
-
                     tableRows = element.find('tr');
-                    totalWidth = element.children()[0].offsetWidth;
 
                     scope.disableLeft = true;
                     scope.disableRight = false;
 
                     if (scope.numOfStickyCols > b2bHorizontalTableConfig.maxStickyColumns) {
-                        throw new Error("Table can only support 3 sticky columns.");
-                    }                  
+                        throw new Error('Table can only support ' + b2bHorizontalTableConfig.maxStickyColumns + ' sticky columns.');
+                    }             
 
                     angular.forEach(tableRows, function(row, rowIndex) {
-                        collectiveRowHeight.push(findMax(row.children, 'height'));
                         for(var j = 0; j < row.children.length; j++) {
                             if (tableColumns[j] === undefined) {
                                 tableColumns[j] = [];
@@ -4029,38 +4155,52 @@ angular.module('b2b.att.horizontalTable', [])
                         for (var i = scope.numOfStickyCols+1; i < tableColumns.length; i++) {
                             angular.element(tableColumns[i]).css(displayBlockCSS);
                         }
-                    }
+                    }   
 
+                    // We must calculate here as we need cells to be reset after re-render. 
+                    angular.forEach(tableRows, function(row, rowIndex) {
+                        collectiveRowHeight.push(findMax(row.children, 'height')); // BUG: Keeping this here now causes row height bugs
+                    });
+                    
+                    console.log('tableColumns:', tableColumns);
                     for (var i = 0; i < tableColumns.length; i++) {
                         collectiveColumnWidth.push(findMax(tableColumns[i], 'width')); //offsetWidth doesn't take into account custom css inside
                     }
                     for(var i = 0; i < scope.numOfStickyCols; i++) {
                         maxWidth += collectiveColumnWidth[i];
                     }
-      
-                    stickyPixels = totalWidth-maxWidth;
 
+                    // BUG: The code I put in to fix the table not spanning 100%  width is now preventing 
+                    // table cells from laying out more than stickyPixels and thus we have weird wrapping
+                    stickyPixels = totalWidth-maxWidth;
 
                     // At this point, for each tr, I need to set the properties (height) and each numOfStickyCols children
                     // should be set with sticky properties (margin-left and width)
                     var width = maxWidth;
+                    var additive = 0; 
+
+                    if (angular.element(document).find('html').hasClass('isIE')) {
+                        additive = 25;
+                    }
+                    var thObject = undefined;
                     for(var i = 0; i < scope.numOfStickyCols; i++) {
                         for (var j = 0; j < tableRows.length; j++) {
-                            trObject = angular.element(tableRows[j].children[i]);
-                            
-                            angular.element(trObject).css({
+                            thObject = angular.element(tableRows[j].children[i]);
+                            angular.element(thObject).css({
                                 'margin-left': -(width + 2) + 'px', 
                                 'width': (collectiveColumnWidth[i] + 3) + 'px', // instead of taking the max width, grab max width for that column
-                                'height': collectiveRowHeight[j] + 'px',
+                                'height': (collectiveRowHeight[j] + additive) + 'px',
                                 'position': 'absolute',
-                                'background-color': 'lightgrey'
+                                'background-color': '#F2F2F2'
                             });
                         }
-                        
-
                         width -= collectiveColumnWidth[i];
                     }
-
+                    angular.element(tableRows[0]).css('height', collectiveRowHeight[0] + 'px');
+                    for(var i = 0; i < tableRows.length; i++) {
+                        angular.element(tableRows[i]).css('height', (collectiveRowHeight[i] + additive) + 'px'); 
+                    }
+                    
                     innerContainer.css({
                         'padding-left': (maxWidth + 2) + 'px'
                     });
@@ -4074,23 +4214,93 @@ angular.module('b2b.att.horizontalTable', [])
                         i = visibleColumns + 1;
                     }
                     
+                    //columnSets = [[1, 1], [2,7]]; 
+                    
                     updateCellDisplay(columnSets[setIndex]);
                     checkScrollArrows();
 
                     scope.numOfCols = tableColumns.length;
 
-                    console.log('Bulk Mode is ' + (attrs.bulkMode ? 'enabled': 'disabled'));
-                    console.log('tableColumns', tableColumns);
-                    console.log('collectiveColumnWidth: ', collectiveColumnWidth);
-                    console.log('maxWidth: ', maxWidth);
+                    console.log('collectiveColumnWidth', collectiveColumnWidth);
+                    console.log('collectiveRowHeight: ', collectiveRowHeight);
+                }
+                
+
+                // Let's get started with some math!
+                hack();
+
+                function calculateVisibleColumns(startingPoint) {
+                    var usedWidth = 0, 
+                        visibleColumns = startingPoint || scope.numOfStickyCols;
+
+                    while(usedWidth < stickyPixels && visibleColumns < collectiveColumnWidth.length) {
+                        if (usedWidth+collectiveColumnWidth[visibleColumns] > stickyPixels) {
+                            if (startingPoint === visibleColumns) {
+                                return visibleColumns; // The next cell is too large to fit, it should be only thing to fit
+                            }
+                            visibleColumns--;
+                            return visibleColumns;
+                        }
+                        usedWidth += collectiveColumnWidth[visibleColumns];
+                        visibleColumns++;
+                    }
+
+                    if (usedWidth > stickyPixels) {
+                        return --visibleColumns;
+                    }
+                    return visibleColumns;
+                }
+
+                function updateCellDisplay(set) {
+                    for (var i = scope.numOfStickyCols; i < tableColumns.length; i++) {
+                        angular.element(tableColumns[i]).css(displayNoneCSS);
+                    }
+
+                    for (var i = set[0]; i <= set[1]; i++) {
+                        angular.element(tableColumns[i]).css(displayBlockCSS);
+                    }
+                }
+
+                function findMax(arr, prop) {
+                    var max = 0;
+                    var localVal = 0;
+                    var prevDisplay;
+                    var item;
+                    for (var i = 0; i < arr.length; i++) {
+                        item = arr[i];
+                        prevDisplay = angular.element(item).css('display');
+
+                        if (scope.$$phase) {
+                            scope.$digest();
+                        }
+                        // Remove inline styles, they will mess up calculations from original run
+                        angular.element(item).css('height', '');
+                        angular.element(item).css('width', ''); 
+                        if (prop === 'width') {
+                            // If we do not undo previous run's inline styles, this will grow widths on each re-render.
+                            localVal = Math.ceil(parseInt(window.getComputedStyle(item).width.split('px')[0], 10)) + 30; // 30 px is padding
+                        } else if (prop === 'offsetWidth') {
+                            localVal = item.offsetWidth;
+                        } else if (prop === 'height') {
+                            //localVal = item.offsetHeight;
+                            localVal = Math.ceil(parseInt(window.getComputedStyle(item).height.split('px')[0], 10))
+                        }
+
+                        if (localVal >= max) {
+                            max = localVal;
+                        }
+                    }
+                    
+                    return max;
                 }
 
+                
+
                 function checkScrollArrows() {
                     scope.disableLeft = (setIndex === 0);
                     scope.disableRight = !(setIndex < columnSets.length-1);
                 }
 
-
                 scope.moveViewportLeft = function () {
                     setIndex--;
                     updateCellDisplay(columnSets[setIndex]);
@@ -4517,29 +4727,13 @@ angular.module('b2b.att.leftNavigation', [])
                 scope.idx = -1;
                 scope.itemIdx = -1;
                 scope.navIdx = -1;
-                scope.toggleNav = function (val,link) {
-                       /**Added for ECOMP: make parent menu a link if no child menus.**/
-                       if(link!=null && link!=''){
-                               location.href = link;
-                               return;
-                       }
-                       /**Ended**/
-                               if (val === scope.idx) {
+                scope.toggleNav = function (val) {
+                    if (val === scope.idx) {
                         scope.idx = -1;
                         return;
                     }
                     scope.idx = val;
                 };
-                /*New function for ECOMP*/
-                scope.toggleDrawer = function(showmenu){
-                       scope.idx=-1; /*hide the sunmenus*/
-                       if(showmenu){
-                               //scope.openList.length=0;
-                               document.getElementById('page-content').style.marginLeft = "50px";
-                       }
-                       else
-                               document.getElementById('page-content').style.marginLeft = "250px";             
-                };
                 scope.liveLink = function (evt, val1, val2) {
                     scope.itemIdx = val1;
                     scope.navIdx = val2;
@@ -4616,29 +4810,6 @@ angular.module('b2b.att.listbox', ['b2b.att.utilities'])
                             'listboxDataIndex': 0
                         };
 
-                        /*scope.$watch('currentIndex', function(oldVal, newVal) {
-                            if (angular.equals(oldVal, newVal)) return;
-                            if (!scope.multiselectable) {
-                                // This doesn't garuntee anything. index will update on focus based on rules
-                                currentIndexSet.listboxDataIndex = scope.currentIndex;
-                                // Should this occur? 
-                                //scope.listboxData[currentIndexSet.listboxDataIndex].selected = true;
-
-                                // Update elementIndex
-                                elements = elem.children();
-                                var indecies = Array.prototype.map.call(elements, function(item) {
-                                    return parseInt(angular.element(item).attr('data-index'), 10);
-                                }).filter(function(item) {
-                                    return item === scope.currentIndex;
-                                });
-                                currentIndex.elementIndex = indecies[0];
-                                //focusOnElement(currentIndexSet.elementIndex); // This isn't shifting focus
-                                if (!scope.$$phase) {
-                                    scope.$apply();
-                                }
-                            }
-                        });*/
-
                         function isTrue(item) {
                             if (item.selected === true) {
                                 return true;
@@ -4827,7 +4998,9 @@ angular.module('b2b.att.listbox', ['b2b.att.utilities'])
                                         // If no modifier keys are selected, all other items need to be unselected.
                                         prevDirection = undefined;
                                         selectItems(0, scope.listboxData.length, false);
-                                        scope.listboxData[currentIndexSet.listboxDataIndex].selected = true;
+                                        if(currentIndexSet.listboxDataIndex !== undefined && !isNaN(currentIndexSet.listboxDataIndex)){
+                                            scope.listboxData[currentIndexSet.listboxDataIndex].selected = true;
+                                        }
                                     }
                                     focusOnElement(currentIndexSet.elementIndex);
                                     if(!scope.$$phase) {
@@ -4861,7 +5034,9 @@ angular.module('b2b.att.listbox', ['b2b.att.utilities'])
                                         // If no modifier keys are selected, all other items need to be unselected.
                                         prevDirection = undefined;
                                         selectItems(0, scope.listboxData.length, false);
-                                        scope.listboxData[currentIndexSet.listboxDataIndex].selected = true;
+                                        if(currentIndexSet.listboxDataIndex !== undefined && !isNaN(currentIndexSet.listboxDataIndex)){
+                                            scope.listboxData[currentIndexSet.listboxDataIndex].selected = true;
+                                        }
                                     }
 
                                     focusOnElement(currentIndexSet.elementIndex);
@@ -5227,10 +5402,7 @@ angular.module('b2b.att.loaderAnimation', [])
             });
         }
     };
-}])
-
-
-;
+}]);
  /**
  * @ngdoc directive
  * @name Misc.att:messageWrapper
@@ -5503,7 +5675,7 @@ angular.module('b2b.att.modalsAndAlerts', ['b2b.att.position', 'b2b.att.transiti
     };
 }])
 
-.directive('b2bModalWindow', ['$timeout', 'windowOrientation', '$window', function ($timeout, windowOrientation, $window) {
+.directive('b2bModalWindow', ['$timeout', 'windowOrientation', '$window', 'keymap', function ($timeout, windowOrientation, $window, keymap) {
     return {
         restrict: 'EA',
         scope: {
@@ -5516,6 +5688,7 @@ angular.module('b2b.att.modalsAndAlerts', ['b2b.att.position', 'b2b.att.transiti
             scope.windowClass = attrs.windowClass || '';
             scope.sizeClass = attrs.sizeClass || '';
             scope.isNotifDialog = false;
+            scope.modalClose = attrs.modalClose || false;
 
             this.setTitle = function (title) {
                 scope.title = title;
@@ -5566,7 +5739,15 @@ angular.module('b2b.att.modalsAndAlerts', ['b2b.att.position', 'b2b.att.transiti
                     });
                 }
             }
-            
+
+            if(scope.modalClose){
+                element.bind('keydown', function (e) {
+                    if(e.keyCode == keymap.KEY.ESC){
+                        e.preventDefault();
+                        e.stopPropagation();
+                    }
+                });
+            }
         }
     };
 }])
@@ -5742,6 +5923,7 @@ angular.module('b2b.att.modalsAndAlerts', ['b2b.att.position', 'b2b.att.transiti
         angularDomEl.attr('window-class', modal.windowClass);
         angularDomEl.attr('size-class', modal.sizeClass);
         angularDomEl.attr('index', openedWindows.length() - 1);
+        angularDomEl.attr('modal-close', modal.modalClose);
         angularDomEl.html(modal.content);
 
         var modalDomEl = $compile(angularDomEl)(modal.scope);
@@ -5882,7 +6064,8 @@ angular.module('b2b.att.modalsAndAlerts', ['b2b.att.position', 'b2b.att.transiti
                         backdrop: modalOptions.backdrop,
                         keyboard: modalOptions.keyboard,
                         windowClass: modalOptions.windowClass,
-                        sizeClass: modalOptions.sizeClass
+                        sizeClass: modalOptions.sizeClass,
+                        modalClose: modalOptions.modalClose
                     });
 
                 }, function resolveError(reason) {
@@ -5914,7 +6097,8 @@ angular.module('b2b.att.modalsAndAlerts', ['b2b.att.position', 'b2b.att.transiti
             modalOk: '&',
             modalCancel: '&',
             windowClass: '@',
-            sizeClass: '@'
+            sizeClass: '@', 
+            modalClose: '@'
         },
         link: function (scope, elm, attr) {
             elm.bind('click', function (ev) {
@@ -5927,7 +6111,8 @@ angular.module('b2b.att.modalsAndAlerts', ['b2b.att.position', 'b2b.att.transiti
                     templateUrl: scope.b2bModal,
                     controller: scope.modalController,
                     windowClass: scope.windowClass,
-                    sizeClass: scope.sizeClass
+                    sizeClass: scope.sizeClass, 
+                    modalClose: scope.modalClose
                 }).result.then(function (value) {
                     scope.modalOk({
                         value: value
@@ -7001,6 +7186,7 @@ angular.module('b2b.att.multiLevelNavigation', ['b2b.att.utilities'])
                     }
                     //for any expandable tree item on click
                 var toggleState = function (e) {
+                                    
                     if (angular.element(e.target).attr("b2b-ml-nav") !== "endNode") {
                         var eLink = element.find('a').eq(0);
                         if (eLink.hasClass('active')) {
@@ -7087,6 +7273,14 @@ angular.module('b2b.att.multiLevelNavigation', ['b2b.att.utilities'])
                     if(element.attr("b2b-ml-nav") !== "endNode") { 
                         toggleState(e); 
                     }
+                    if (rootE==undefined){
+                        findRoot(element);
+                    }
+                    var currSelected = rootE.parent()[0].querySelector('.selected');
+                    if(currSelected){
+                        angular.element(currSelected).removeClass('selected');
+                    }                    
+                    element.find('a').eq(0).addClass('selected');
                     e.stopPropagation();
                 });
                 element.bind('focus', function (e) {
@@ -7808,20 +8002,18 @@ angular.module('b2b.att.phoneNumberInput', ['ngMessages', 'b2b.att.utilities'])
         phoneMaskDot: '___.___.____',
         phoneMaskHyphen: '___-___-____'
     })
-    .directive('b2bPhoneMask', ['$parse', 'CoreFormsUiConfig', 'keymap', function ($parse, CoreFormsUiConfig, keymap) {
+    .directive('b2bPhoneMask', ['$parse', 'CoreFormsUiConfig', 'keymap', 'b2bUserAgent', function ($parse, CoreFormsUiConfig, keymap, b2bUserAgent) {
         return {
             require: 'ngModel',
             scope: {
                 ngModel: '='
             },
             link: function (scope, iElement, iAttrs, ctrl) {
-                var navigatorAgent = navigator.userAgent.toLowerCase(),
-                    isAndroid = navigatorAgent.indexOf("android") > -1,
-                    oldIE = navigatorAgent.indexOf('msie 8.0') !== -1;
+                
                 var mask = '';
                 var validPhoneNumber = false;
                 var currentKey = '';
-                if (isAndroid) {
+                if (b2bUserAgent.isMobile()) {
                     mask = "__________";
                 } else {
                     switch (iAttrs.b2bPhoneMask) {
@@ -7912,13 +8104,13 @@ angular.module('b2b.att.phoneNumberInput', ['ngMessages', 'b2b.att.utilities'])
                                 // Allow: Ctrl+C/c
                                 (!(e.ctrlKey) && (e.which !== '99' || e.which !== '67')) &&
                                 // Allow: Ctrl+X/x
-                                (!(e.ctrlKey) && (e.which !== '120' || e.which !== '88'))) {
+                                (!(e.ctrlKey) && (e.which !== '120' || e.which !== '88')) &&
+                                /* 229 key code will sent as placeholder key for andriod devices */
+                                (e.which != 229 )) {
                                 e.preventDefault ? e.preventDefault() : e.returnValue = false;
-                                iElement.attr("aria-label", "Only numbers are allowed");
                                 validPhoneNumber = false;
                             }
                         } else {
-                            iElement.removeAttr("aria-label");
                             validPhoneNumber = true;
                         }
 
@@ -8771,38 +8963,6 @@ angular.module('b2b.att.seekBar', ['b2b.att.utilities','b2b.att.position'])
                     }
                 };
             }]);
-/**
- * @ngdoc directive
- * @name Forms.att:selectorModule
- *
- * @description
- *  <file src="src/selectorModule/docs/readme.md" />
- *
- * @usage
- * <select name="myNameBig" type="large" b2b-dropdown ng-model="Controller Variable here">
- *   <option b2b-dropdown-list option-repeat="option data here" imgsrc="image path" value="value">List Text</option>
- * </select>
- *
- * <select name="myNameBig" type="large" b2b-dropdown ng-model="Controller Variable here">
- * <option b2b-dropdown-list option-repeat="option data here" imgsrc="image path" value="value">List Text</option>
- * </select>
- *
- * <select name="myNameBig" b2b-dropdown ng-model="Controller Variable here">
- *   <optgroup b2b-dropdown-group label="Group Label here">
- *     <option b2b-dropdown-list option-repeat="option data here" imgsrc="image path" value="value">List Text</option>
- *   </optgroup>
- * </select>
- *
- *  @example
- *  <section id="code">
-        <example module="b2b.att">
-            <file src="src/selectorModule/docs/demo.html" />
-            <file src="src/selectorModule/docs/demo.js" />
-       </example>
-    </section>
- *
- */
-angular.module('b2b.att.selectorModule', ['b2b.att.dropdowns']);
 /**
  * @ngdoc directive
  * @name Layouts.att:separators
@@ -9372,7 +9532,7 @@ angular.module('b2b.att.staticRouteTemplate', ['b2b.att.utilities'])
  * @name Progress & usage indicators.att:statusTracker
  *
  * @scope
- * @param {array} statuses - An array of status objects
+ * @param {array} statusObject - An array of status objects that accept heading, estimate, description and state
  * @description
  * <file src="src/statusTracker/docs/readme.md" />
  *
@@ -9384,7 +9544,6 @@ angular.module('b2b.att.staticRouteTemplate', ['b2b.att.utilities'])
 
  * @example
     <section id="code">   
-        <b>HTML + AngularJS</b>
         <example module="b2b.att">
             <file src="src/statusTracker/docs/demo.html" />
             <file src="src/statusTracker/docs/demo.js" />
@@ -9394,7 +9553,14 @@ angular.module('b2b.att.staticRouteTemplate', ['b2b.att.utilities'])
 
 angular.module('b2b.att.statusTracker', ['b2b.att.utilities'])
 .constant('b2bStatusTrackerConfig', {
-    'maxViewItems': 3
+    'maxViewItems': 3,
+    'icons': {
+        'complete': 'icoControls-approval',
+        'current': 'icon-misc-time',
+        'pending': 'icoControls-statusokay',
+        'actionRequired': 'icon-primary-securityalerts-alert',
+        'notAvailable': 'icoControls-restricted'
+    }
 })
 .directive('b2bStatusTracker', ['b2bStatusTrackerConfig', function(b2bStatusTrackerConfig) {
         return {
@@ -9424,19 +9590,10 @@ angular.module('b2b.att.statusTracker', ['b2b.att.utilities'])
                 scope.isInViewport = function(index) {
                     return (index < scope.currentViewIndex+3 && index >= scope.currentViewIndex);  // && index > scope.currentViewIndex-2
                 };
-                scope.currentStatus = function(index) {
-                    if(index != undefined){
-                        if(!scope.statuses[index].complete) {
-                            if(index > 0 && scope.statuses[index-1].complete) {
-                                return true;
-                            } else if(index == 0 && !scope.statuses[index].complete){
-                                return true;
-                            } else {
-                                return false;
-                            }
-                        }
-                    }
-                };
+
+                scope.removeCamelCase = function(str) {
+                    return str.replace(/([a-z])([A-Z])/g, '$1 $2').toLowerCase();
+                }
             }
         };
     }]);
@@ -9702,7 +9859,7 @@ angular.module('b2b.att.tableScrollbar', [])
                     firstColumn = angular.element(trObject.children()[0]);
 
                     angular.element(firstColumn).css({
-                        'margin-left': -(firstColumnWidth + 2) + 'px',
+                        'left': '0px',
                         'width': (firstColumnWidth + 2) + 'px',
                         'position': 'absolute'
                     });
@@ -9754,6 +9911,7 @@ angular.module('b2b.att.tableScrollbar', [])
                     }
                 };
 
+
                 innerContainer.bind('scroll', function () {
                     $timeout(function () {
                         scope.checkScrollArrows();
@@ -10038,7 +10196,7 @@ angular.module('b2b.att.tables', ['b2b.att.utilities'])
                 } else if (attr.type === 'body') {
                     var html = elem.children();
                     if (attr.rowRepeat) {
-                        html.attr('ng-repeat', attr.rowRepeat.concat(" | orderBy : columnIndex : reverse | filter : searchCriteria : false "));
+                        html.attr('ng-repeat', attr.rowRepeat.concat(" | orderBy : (reverse?'-':'')+ columnIndex  | filter : searchCriteria : false "));
                     }
                     html.attr('ng-class', "{'odd': $odd && zebraStripFlag}");
                     html.attr('class', 'data-row');
@@ -10581,6 +10739,51 @@ angular.module('b2b.att.textArea', ['b2b.att.utilities'])
     };
 }]);
 
+/**
+ * @ngdoc directive
+ * @name Forms.att:timeInputField
+ *
+ * @description
+ *  <file src="src/timeInputField/docs/readme.md" />
+ *
+ * @example
+ *  <section id="code">
+        <example module="b2b.att">
+            <file src="src/timeInputField/docs/demo.html" />
+            <file src="src/timeInputField/docs/demo.js" />
+       </example>
+    </section>
+ *
+ */
+angular.module('b2b.att.timeInputField',['ngMessages', 'b2b.att.utilities']).directive('b2bTimeFormat',function(){
+    return{
+        restrict : 'A',
+        require : '^ngModel',
+        link : function(scope,elem,attr,ctrl){
+            elem.on('keyup',function(evt){
+                var modelValue = ctrl.$modelValue;
+                var format = attr.b2bTimeFormat;
+                 modelValue = modelValue.split(':');
+                if(format == "12"){
+                    if(!(modelValue[0] <= 12 && modelValue[0] > 0 ) || !(modelValue[1] <= 59)){
+                        ctrl.$setValidity('inValidTime',false);   
+                    }else{
+                        ctrl.$setValidity('inValidTime',true);
+                    }
+                }else if(format =="24"){
+                    if(!(modelValue[0] <= 23) || !(modelValue[1] <= 59)){
+                        ctrl.$setValidity('inValidTime',false);
+                    }else{
+                        ctrl.$setValidity('inValidTime',true);
+                    }
+                }                
+               scope.$apply();
+            });
+        }
+    }
+});
+
 /**
  * @ngdoc directive
  * @name Forms.att:tooltipsForForms
@@ -19400,7 +19603,7 @@ angular.module('b2b.att.utilities', ['ngSanitize'])
         searchText = searchText.toLowerCase();
         angular.forEach(items, function(item) {
             angular.forEach(attrs, function(attr) {
-                if (item.hasOwnProperty(attr) && item[attr].toLowerCase().includes(searchText)) {
+                if (item.hasOwnProperty(attr) && (item[attr].toLowerCase().indexOf(searchText) != -1)) {
                     filtered.push(item);
                     return;
                 }
@@ -19820,6 +20023,18 @@ https://github.com/cwilso/AudioRecorder/blob/master/js/recorderjs/recorder.js
         });
     };
 
+    var _touch = function (flag, callbackFunc, scope) {
+        scope.$watch(flag, function (val) {
+            $timeout(function () {
+                if (val) {
+                    $document.bind('touchstart', callbackFunc);
+                } else {
+                    $document.unbind('touchstart', callbackFunc);
+                }
+            });
+        });
+    };
+
     var _scroll = function (flag, callbackFunc, scope) {
         scope.$watch(flag, function (val) {
             $timeout(function () {
@@ -19863,6 +20078,7 @@ https://github.com/cwilso/AudioRecorder/blob/master/js/recorderjs/recorder.js
 
     return {
         click: _click,
+        touch: _touch,
         scroll: _scroll,
         event: _event
     };
@@ -21014,6 +21230,690 @@ https://github.com/cwilso/AudioRecorder/blob/master/js/recorderjs/recorder.js
     };
 }])
 
+.constant('b2bMaskConfig', {
+    maskDefinitions: {
+        '9': /\d/,
+        'A': /[a-zA-Z]/,
+        '*': /[a-zA-Z0-9]/
+    },
+    clearOnBlur: false,
+    clearOnBlurPlaceholder: false,
+    escChar: '\\',
+    eventsToHandle: ['input', 'keyup', 'click', 'focus'],
+    addDefaultPlaceholder: true,
+    allowInvalidValue: true
+})
+/**
+ * @param {boolean} modelViewValue - If this is set to true, then the model value bound with ng-model will be the same as the $viewValue meaning it will contain any static mask characters present in the mask definition. This will not set the model value to a $viewValue that is considered invalid.
+ * @param {String} maskPlaceholder - Allows customizing the mask placeholder when a user has focused the input element and while typing in their value
+ * @param {String} maskPlaceholderChar - Allows customizing the mask placeholder character. The default mask placeholder is _.
+ * @param {boolean} addDefaultPlaceholder - The default placeholder is constructed from the ui-mask definition so a mask of 999-9999 would have a default placeholder of ___-____; unless you have overridden the default placeholder character.
+ */
+.directive('b2bMask', ['b2bMaskConfig', function(b2bMaskConfig) {
+    return {
+        require: 'ngModel',
+        restrict: 'A',
+        link: function(scope, element, attrs, ctrl) {
+            var maskProcessed = false, eventsBound = false,
+                maskCaretMap, maskPatterns, maskPlaceholder, maskComponents,
+                // Minimum required length of the value to be considered valid
+                minRequiredLength,
+                value, valueMasked, isValid,
+                // Vars for initializing/uninitializing
+                originalPlaceholder = attrs.placeholder,
+                originalMaxlength = attrs.maxlength,
+                // Vars used exclusively in eventHandler()
+                oldValue, oldValueUnmasked, oldCaretPosition, oldSelectionLength,
+                // Used for communicating if a backspace operation should be allowed between
+                // keydownHandler and eventHandler
+                preventBackspace;
+
+            var options = b2bMaskConfig;
+
+            function isFocused (elem) {
+              return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
+            }
+
+            var originalIsEmpty = ctrl.$isEmpty;
+            ctrl.$isEmpty = function(value) {
+                if (maskProcessed) {
+                    return originalIsEmpty(unmaskValue(value || ''));
+                } else {
+                    return originalIsEmpty(value);
+                }
+            };
+
+            function initialize(maskAttr) {
+                if (!angular.isDefined(maskAttr)) {
+                    return uninitialize();
+                }
+                processRawMask(maskAttr);
+                if (!maskProcessed) {
+                    return uninitialize();
+                }
+                initializeElement();
+                bindEventListeners();
+                return true;
+            }
+
+            function initPlaceholder(placeholderAttr) {
+                if ( ! placeholderAttr) {
+                    return;
+                }
+                maskPlaceholder = placeholderAttr;
+                /* If the mask is processed, then we need to update the value
+                   but don't set the value if there is nothing entered into the element
+                   and there is a placeholder attribute on the element because that
+                   will only set the value as the blank maskPlaceholder
+                   and override the placeholder on the element */
+                if (maskProcessed && !(element.val().length === 0 && angular.isDefined(attrs.placeholder))) {
+                    element.val(maskValue(unmaskValue(element.val())));
+                }
+            }
+
+            function initPlaceholderChar() {
+                return initialize(attrs.uiMask);
+            }
+
+            var modelViewValue = false;
+
+            attrs.$observe('modelViewValue', function(val) {
+                if (val === 'true') {
+                    modelViewValue = true;
+                }
+            });
+
+            attrs.$observe('allowInvalidValue', function(val) {
+                linkOptions.allowInvalidValue = val === ''? true : !!val;
+                formatter(ctrl.$modelValue);
+            });
+
+            function formatter(fromModelValue) {
+                if (!maskProcessed) {
+                    return fromModelValue;
+                }
+                value = unmaskValue(fromModelValue || '');
+                isValid = validateValue(value);
+                ctrl.$setValidity('mask', isValid);
+
+                if (!value.length) return undefined;
+                if (isValid || linkOptions.allowInvalidValue) {
+                    return maskValue(value);
+                } else {
+                    return undefined;
+                }
+            }
+
+            function parser(fromViewValue) {
+                if (!maskProcessed) {
+                    return fromViewValue;
+                }
+                value = unmaskValue(fromViewValue || '');
+                isValid = validateValue(value);
+                /* We have to set viewValue manually as the reformatting of the input
+                   value performed by eventHandler() doesn't happen until after
+                   this parser is called, which causes what the user sees in the input
+                   to be out-of-sync with what the ctrl's $viewValue is set to. */
+                ctrl.$viewValue = value.length ? maskValue(value) : '';
+                ctrl.$setValidity('mask', isValid);
+
+                if (isValid || linkOptions.allowInvalidValue) {
+                    return modelViewValue ? ctrl.$viewValue : value;
+                }
+            }
+
+            var linkOptions = {};
+
+            // to do 
+            if (attrs.b2bMaskOptions) {
+                linkOptions = scope.$eval('[' + attrs.b2bMaskOptions + ']');
+                if (angular.isObject(linkOptions[0])) {
+                    // we can't use angular.copy nor angular.extend, they lack the power to do a deep merge
+                    linkOptions = (function(original, current) {
+                        for (var i in original) {
+                            if (Object.prototype.hasOwnProperty.call(original, i)) {
+                                if (current[i] === undefined) {
+                                    current[i] = angular.copy(original[i]);
+                                } else {
+                                    if (angular.isObject(current[i]) && !angular.isArray(current[i])) {
+                                        current[i] = angular.extend({}, original[i], current[i]);
+                                    }
+                                }
+                            }
+                        }
+                        return current;
+                    })(options, linkOptions[0]);
+                } else {
+                    linkOptions = options;  //gotta be a better way to do this..
+                }
+            } else {
+                linkOptions = options;
+            }
+
+            attrs.$observe('b2bMask', initialize);
+            if (angular.isDefined(attrs.maskPlaceholder)) {
+                attrs.$observe('maskPlaceholder', initPlaceholder);
+            }
+            else {
+                attrs.$observe('placeholder', initPlaceholder);
+            }
+            if (angular.isDefined(attrs.maskPlaceholderChar)) {
+                attrs.$observe('maskPlaceholderChar', initPlaceholderChar);
+            }
+
+            ctrl.$formatters.unshift(formatter);
+            ctrl.$parsers.unshift(parser);
+
+            function uninitialize() {
+                maskProcessed = false;
+                unbindEventListeners();
+
+                if (angular.isDefined(originalPlaceholder)) {
+                    element.attr('placeholder', originalPlaceholder);
+                } else {
+                    element.removeAttr('placeholder');
+                }
+
+                if (angular.isDefined(originalMaxlength)) {
+                    element.attr('maxlength', originalMaxlength);
+                } else {
+                    element.removeAttr('maxlength');
+                }
+
+                element.val(ctrl.$modelValue);
+                ctrl.$viewValue = ctrl.$modelValue;
+                return false;
+            }
+
+            function initializeElement() {
+                value = oldValueUnmasked = unmaskValue(ctrl.$modelValue || '');
+                valueMasked = oldValue = maskValue(value);
+                isValid = validateValue(value);
+                if (attrs.maxlength) { // Double maxlength to allow pasting new val at end of mask
+                    element.attr('maxlength', maskCaretMap[maskCaretMap.length - 1] * 2);
+                }
+                if ( ! originalPlaceholder && linkOptions.addDefaultPlaceholder) {
+                    element.attr('placeholder', maskPlaceholder);
+                }
+                var viewValue = ctrl.$modelValue;
+                var idx = ctrl.$formatters.length;
+                while(idx--) {
+                    viewValue = ctrl.$formatters[idx](viewValue);
+                }
+                ctrl.$viewValue = viewValue || '';
+                ctrl.$render();
+            }
+
+            function bindEventListeners() {
+                if (eventsBound) {
+                    return;
+                }
+                element.bind('blur', blurHandler);
+                element.bind('mousedown mouseup', mouseDownUpHandler);
+                element.bind('keydown', keydownHandler);
+                element.bind(linkOptions.eventsToHandle.join(' '), eventHandler);
+                eventsBound = true;
+            }
+
+            function unbindEventListeners() {
+                if (!eventsBound) {
+                    return;
+                }
+                element.unbind('blur', blurHandler);
+                element.unbind('mousedown', mouseDownUpHandler);
+                element.unbind('mouseup', mouseDownUpHandler);
+                element.unbind('keydown', keydownHandler);
+                element.unbind('input', eventHandler);
+                element.unbind('keyup', eventHandler);
+                element.unbind('click', eventHandler);
+                element.unbind('focus', eventHandler);
+                eventsBound = false;
+            }
+
+            function validateValue(value) {
+                // Zero-length value validity is ngRequired's determination
+                return value.length ? value.length >= minRequiredLength : true;
+            }
+
+             function unmaskValue(value) {
+                var valueUnmasked = '',
+                    input = element[0],
+                    maskPatternsCopy = maskPatterns.slice(),
+                    selectionStart = oldCaretPosition,
+                    selectionEnd = selectionStart + getSelectionLength(input),
+                    valueOffset, valueDelta, tempValue = '';
+                // Preprocess by stripping mask components from value
+                value = value.toString();
+                valueOffset = 0;
+                valueDelta = value.length - maskPlaceholder.length;
+                angular.forEach(maskComponents, function(component) {
+                    var position = component.position;
+                    //Only try and replace the component if the component position is not within the selected range
+                    //If component was in selected range then it was removed with the user input so no need to try and remove that component
+                    if (!(position >= selectionStart && position < selectionEnd)) {
+                        if (position >= selectionStart) {
+                            position += valueDelta;
+                        }
+                        if (value.substring(position, position + component.value.length) === component.value) {
+                            tempValue += value.slice(valueOffset, position);// + value.slice(position + component.value.length);
+                            valueOffset = position + component.value.length;
+                        }
+                    }
+                });
+                value = tempValue + value.slice(valueOffset);
+                angular.forEach(value.split(''), function(chr) {
+                    if (maskPatternsCopy.length && maskPatternsCopy[0].test(chr)) {
+                        valueUnmasked += chr;
+                        maskPatternsCopy.shift();
+                    }
+                });
+
+                return valueUnmasked;
+            }
+
+            function maskValue(unmaskedValue) {
+                var valueMasked = '',
+                        maskCaretMapCopy = maskCaretMap.slice();
+
+                angular.forEach(maskPlaceholder.split(''), function(chr, i) {
+                    if (unmaskedValue.length && i === maskCaretMapCopy[0]) {
+                        valueMasked += unmaskedValue.charAt(0) || '_';
+                        unmaskedValue = unmaskedValue.substr(1);
+                        maskCaretMapCopy.shift();
+                    }
+                    else {
+                        valueMasked += chr;
+                    }
+                });
+                return valueMasked;
+            }
+
+            function getPlaceholderChar(i) {
+                var placeholder = angular.isDefined(attrs.uiMaskPlaceholder) ? attrs.uiMaskPlaceholder : attrs.placeholder,
+                    defaultPlaceholderChar;
+
+                if (angular.isDefined(placeholder) && placeholder[i]) {
+                    return placeholder[i];
+                } else {
+                    defaultPlaceholderChar = angular.isDefined(attrs.uiMaskPlaceholderChar) && attrs.uiMaskPlaceholderChar ? attrs.uiMaskPlaceholderChar : '_';
+                    return (defaultPlaceholderChar.toLowerCase() === 'space') ? ' ' : defaultPlaceholderChar[0];
+                }
+            }
+
+            /* Generate array of mask components that will be stripped from a masked value
+               before processing to prevent mask components from being added to the unmasked value.
+               E.g., a mask pattern of '+7 9999' won't have the 7 bleed into the unmasked value. */
+            function getMaskComponents() {
+                var maskPlaceholderChars = maskPlaceholder.split(''),
+                        maskPlaceholderCopy, components;
+
+                /* maskCaretMap can have bad values if the input has the ui-mask attribute implemented as an obversable property, e.g. the demo page */
+                if (maskCaretMap && !isNaN(maskCaretMap[0])) {
+                    /* Instead of trying to manipulate the RegEx based on the placeholder characters
+                       we can simply replace the placeholder characters based on the already built
+                       maskCaretMap to underscores and leave the original working RegEx to get the proper
+                       mask components */
+                    angular.forEach(maskCaretMap, function(value) {
+                        maskPlaceholderChars[value] = '_';
+                    });
+                }
+                maskPlaceholderCopy = maskPlaceholderChars.join('');
+                components = maskPlaceholderCopy.replace(/[_]+/g, '_').split('_');
+                components = components.filter(function(s) {
+                    return s !== '';
+                });
+
+                /* need a string search offset in cases where the mask contains multiple identical components
+                   E.g., a mask of 99.99.99-999.99 */
+                var offset = 0;
+                return components.map(function(c) {
+                    var componentPosition = maskPlaceholderCopy.indexOf(c, offset);
+                    offset = componentPosition + 1;
+                    return {
+                        value: c,
+                        position: componentPosition
+                    };
+                });
+            }
+
+            function processRawMask(mask) {
+                var characterCount = 0;
+
+                maskCaretMap = [];
+                maskPatterns = [];
+                maskPlaceholder = '';
+
+                if (angular.isString(mask)) {
+                    minRequiredLength = 0;
+
+                    var isOptional = false,
+                            numberOfOptionalCharacters = 0,
+                            splitMask = mask.split('');
+
+                    var inEscape = false;
+                    angular.forEach(splitMask, function(chr, i) {
+                        if (inEscape) {
+                            inEscape = false;
+                            maskPlaceholder += chr;
+                            characterCount++;
+                        }
+                        else if (linkOptions.escChar === chr) {
+                            inEscape = true;
+                        }
+                        else if (linkOptions.maskDefinitions[chr]) {
+                            maskCaretMap.push(characterCount);
+
+                            maskPlaceholder += getPlaceholderChar(i - numberOfOptionalCharacters);
+                            maskPatterns.push(linkOptions.maskDefinitions[chr]);
+
+                            characterCount++;
+                            if (!isOptional) {
+                                minRequiredLength++;
+                            }
+
+                            isOptional = false;
+                        }
+                        else if (chr === '?') {
+                            isOptional = true;
+                            numberOfOptionalCharacters++;
+                        }
+                        else {
+                            maskPlaceholder += chr;
+                            characterCount++;
+                        }
+                    });
+                }
+                // Caret position immediately following last position is valid.
+                maskCaretMap.push(maskCaretMap.slice().pop() + 1);
+
+                maskComponents = getMaskComponents();
+                maskProcessed = maskCaretMap.length > 1 ? true : false;
+            }
+
+            var prevValue = element.val();
+            function blurHandler() {
+                if (linkOptions.clearOnBlur || ((linkOptions.clearOnBlurPlaceholder) && (value.length === 0) && attrs.placeholder)) {
+                    oldCaretPosition = 0;
+                    oldSelectionLength = 0;
+                    if (!isValid || value.length === 0) {
+                        valueMasked = '';
+                        element.val('');
+                        scope.$apply(function() {
+                            //only $setViewValue when not $pristine to avoid changing $pristine state.
+                            if (!ctrl.$pristine) {
+                                ctrl.$setViewValue('');
+                            }
+                        });
+                    }
+                }
+                //Check for different value and trigger change.
+                if (value !== prevValue) {
+                    var currentVal = element.val();
+                    var isTemporarilyEmpty = value === '' && currentVal && angular.isDefined(attrs.uiMaskPlaceholderChar) && attrs.uiMaskPlaceholderChar === 'space';
+                    if(isTemporarilyEmpty) {
+                        element.val('');
+                    }
+                    triggerChangeEvent(element[0]);
+                    if(isTemporarilyEmpty) {
+                        element.val(currentVal);
+                    }
+                }
+                prevValue = value;
+            }
+
+            function triggerChangeEvent(element) {
+                var change;
+                if (angular.isFunction(window.Event) && !element.fireEvent) {
+                    // modern browsers and Edge
+                    try {
+                        change = new Event('change', {
+                            view: window,
+                            bubbles: true,
+                            cancelable: false
+                        });
+                    } catch (ex) {
+                        //this is for certain mobile browsers that have the Event object
+                        //but don't support the Event constructor 
+                        change = document.createEvent('HTMLEvents');
+                        change.initEvent('change', false, true);
+                    } finally {
+                        element.dispatchEvent(change);
+                    }
+                } else if ('createEvent' in document) {
+                    // older browsers
+                    change = document.createEvent('HTMLEvents');
+                    change.initEvent('change', false, true);
+                    element.dispatchEvent(change);
+                }
+                else if (element.fireEvent) {
+                    // IE <= 11
+                    element.fireEvent('onchange');
+                }
+            }
+
+            function mouseDownUpHandler(e) {
+                if (e.type === 'mousedown') {
+                    element.bind('mouseout', mouseoutHandler);
+                } else {
+                    element.unbind('mouseout', mouseoutHandler);
+                }
+            }
+
+            element.bind('mousedown mouseup', mouseDownUpHandler);
+
+            function mouseoutHandler() {
+                oldSelectionLength = getSelectionLength(this);
+                element.unbind('mouseout', mouseoutHandler);
+            }
+
+            function keydownHandler(e) {
+                var isKeyBackspace = e.which === 8,
+                caretPos = getCaretPosition(this) - 1 || 0, //value in keydown is pre change so bump caret position back to simulate post change
+                isCtrlZ = e.which === 90 && e.ctrlKey; //ctrl+z pressed
+
+                if (isKeyBackspace) {
+                    while(caretPos >= 0) {
+                        if (isValidCaretPosition(caretPos)) {
+                            //re-adjust the caret position.
+                            //Increment to account for the initial decrement to simulate post change caret position
+                            setCaretPosition(this, caretPos + 1);
+                            break;
+                        }
+                        caretPos--;
+                    }
+                    preventBackspace = caretPos === -1;
+                }
+
+                if (isCtrlZ) {
+                    // prevent IE bug - value should be returned to initial state
+                    element.val('');
+                    e.preventDefault();
+                }
+            }
+
+            function eventHandler(e) {
+                e = e || {};
+                // Allows more efficient minification
+                var eventWhich = e.which,
+                        eventType = e.type;
+
+                // Prevent shift and ctrl from mucking with old values
+                if (eventWhich === 16 || eventWhich === 91) {
+                    return;
+                }
+
+                var val = element.val(),
+                        valOld = oldValue,
+                        valMasked,
+                        valAltered = false,
+                        valUnmasked = unmaskValue(val),
+                        valUnmaskedOld = oldValueUnmasked,
+                        caretPos = getCaretPosition(this) || 0,
+                        caretPosOld = oldCaretPosition || 0,
+                        caretPosDelta = caretPos - caretPosOld,
+                        caretPosMin = maskCaretMap[0],
+                        caretPosMax = maskCaretMap[valUnmasked.length] || maskCaretMap.slice().shift(),
+                        selectionLenOld = oldSelectionLength || 0,
+                        isSelected = getSelectionLength(this) > 0,
+                        wasSelected = selectionLenOld > 0,
+                        // Case: Typing a character to overwrite a selection
+                        isAddition = (val.length > valOld.length) || (selectionLenOld && val.length > valOld.length - selectionLenOld),
+                        // Case: Delete and backspace behave identically on a selection
+                        isDeletion = (val.length < valOld.length) || (selectionLenOld && val.length === valOld.length - selectionLenOld),
+                        isSelection = (eventWhich >= 37 && eventWhich <= 40) && e.shiftKey, // Arrow key codes
+
+                        isKeyLeftArrow = eventWhich === 37,
+                        // Necessary due to "input" event not providing a key code
+                        isKeyBackspace = eventWhich === 8 || (eventType !== 'keyup' && isDeletion && (caretPosDelta === -1)),
+                        isKeyDelete = eventWhich === 46 || (eventType !== 'keyup' && isDeletion && (caretPosDelta === 0) && !wasSelected),
+                        // Handles cases where caret is moved and placed in front of invalid maskCaretMap position. Logic below
+                        // ensures that, on click or leftward caret placement, caret is moved leftward until directly right of
+                        // non-mask character. Also applied to click since users are (arguably) more likely to backspace
+                        // a character when clicking within a filled input.
+                        caretBumpBack = (isKeyLeftArrow || isKeyBackspace || eventType === 'click') && caretPos > caretPosMin;
+
+                oldSelectionLength = getSelectionLength(this);
+
+                // These events don't require any action
+                if (isSelection || (isSelected && (eventType === 'click' || eventType === 'keyup' || eventType === 'focus'))) {
+                    return;
+                }
+
+                if (isKeyBackspace && preventBackspace) {
+                    element.val(maskPlaceholder);
+                    // This shouldn't be needed but for some reason after aggressive backspacing the ctrl $viewValue is incorrect.
+                    // This keeps the $viewValue updated and correct.
+                    scope.$apply(function () {
+                        ctrl.$setViewValue(''); // $setViewValue should be run in angular context, otherwise the changes will be invisible to angular and user code.
+                    });
+                    setCaretPosition(this, caretPosOld);
+                    return;
+                }
+
+                // User attempted to delete but raw value was unaffected--correct this grievous offense
+                if ((eventType === 'input') && isDeletion && !wasSelected && valUnmasked === valUnmaskedOld) {
+                    while (isKeyBackspace && caretPos > caretPosMin && !isValidCaretPosition(caretPos)) {
+                        caretPos--;
+                    }
+                    while (isKeyDelete && caretPos < caretPosMax && maskCaretMap.indexOf(caretPos) === -1) {
+                        caretPos++;
+                    }
+                    var charIndex = maskCaretMap.indexOf(caretPos);
+                    // Strip out non-mask character that user would have deleted if mask hadn't been in the way.
+                    valUnmasked = valUnmasked.substring(0, charIndex) + valUnmasked.substring(charIndex + 1);
+
+                    // If value has not changed, don't want to call $setViewValue, may be caused by IE raising input event due to placeholder
+                    if (valUnmasked !== valUnmaskedOld)
+                        valAltered = true;
+                }
+
+                // Update values
+                valMasked = maskValue(valUnmasked);
+
+                oldValue = valMasked;
+                oldValueUnmasked = valUnmasked;
+
+                //additional check to fix the problem where the viewValue is out of sync with the value of the element.
+                //better fix for commit 2a83b5fb8312e71d220a497545f999fc82503bd9 (I think)
+                if (!valAltered && val.length > valMasked.length)
+                    valAltered = true;
+
+                element.val(valMasked);
+
+                //we need this check.  What could happen if you don't have it is that you'll set the model value without the user
+                //actually doing anything.  Meaning, things like pristine and touched will be set.
+                if (valAltered) {
+                    scope.$apply(function () {
+                        ctrl.$setViewValue(valMasked); // $setViewValue should be run in angular context, otherwise the changes will be invisible to angular and user code.
+                    });
+                }
+
+                // Caret Repositioning
+                // Ensure that typing always places caret ahead of typed character in cases where the first char of
+                // the input is a mask char and the caret is placed at the 0 position.
+                if (isAddition && (caretPos <= caretPosMin)) {
+                    caretPos = caretPosMin + 1;
+                }
+
+                if (caretBumpBack) {
+                    caretPos--;
+                }
+
+                // Make sure caret is within min and max position limits
+                caretPos = caretPos > caretPosMax ? caretPosMax : caretPos < caretPosMin ? caretPosMin : caretPos;
+
+                // Scoot the caret back or forth until it's in a non-mask position and within min/max position limits
+                while (!isValidCaretPosition(caretPos) && caretPos > caretPosMin && caretPos < caretPosMax) {
+                    caretPos += caretBumpBack ? -1 : 1;
+                }
+
+                if ((caretBumpBack && caretPos < caretPosMax) || (isAddition && !isValidCaretPosition(caretPosOld))) {
+                    caretPos++;
+                }
+                oldCaretPosition = caretPos;
+                setCaretPosition(this, caretPos);
+            }
+
+            function isValidCaretPosition(pos) {
+                return maskCaretMap.indexOf(pos) > -1;
+            }
+
+            function getCaretPosition(input) {
+                if (!input)
+                    return 0;
+                if (input.selectionStart !== undefined) {
+                    return input.selectionStart;
+                } else if (document.selection) {
+                    if (isFocused(element[0])) {
+                        // For IE
+                        input.focus();
+                        var selection = document.selection.createRange();
+                        selection.moveStart('character', input.value ? -input.value.length : 0);
+                        return selection.text.length;
+                    }
+                }
+                return 0;
+            }
+
+            function setCaretPosition(input, pos) {
+                if (!input)
+                    return 0;
+                if (input.offsetWidth === 0 || input.offsetHeight === 0) {
+                    return; // Input's hidden
+                }
+                if (input.setSelectionRange) {
+                    if (isFocused(element[0])) {
+                        input.focus();
+                        input.setSelectionRange(pos, pos);
+                    }
+                }
+                else if (input.createTextRange) {
+                    // For IE
+                    var range = input.createTextRange();
+                    range.collapse(true);
+                    range.moveEnd('character', pos);
+                    range.moveStart('character', pos);
+                    range.select();
+                }
+            }
+
+            function getSelectionLength(input) {
+                if (!input)
+                    return 0;
+                if (input.selectionStart !== undefined) {
+                    return (input.selectionEnd - input.selectionStart);
+                }
+                if (window.getSelection) {
+                    return (window.getSelection().toString().length);
+                }
+                if (document.selection) {
+                    return (document.selection.createRange().text.length);
+                }
+                return 0;
+            }
+        }
+    };
+}])
 .filter('b2bMultiSepartorHighlight', function($sce) {
         return function(text, searchText, searchSeperator) {
             var splitText = function(string) {
@@ -21051,10 +21951,20 @@ https://github.com/cwilso/AudioRecorder/blob/master/js/recorderjs/recorder.js
     
     .factory('b2bUserAgent', [function() {
         var _isMobile = function() {
-            return /Android|webOS|iPhone|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
+            if(/Android/i.test(navigator.userAgent)){
+                return /Mobile/i.test(navigator.userAgent);
+            }else{
+                return /Android|webOS|iPhone|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
+            }
+            
         };
         var _notMobile = function() {
-            return !/Android|webOS|iPhone|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
+            if(/Android/i.test(navigator.userAgent)){
+                return !/Mobile/i.test(navigator.userAgent);
+            }else{
+                return !/Android|webOS|iPhone|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
+            }
+            
         };
         var _isIE = function() {
             return /msie|trident/i.test(navigator.userAgent);
@@ -21280,9 +22190,9 @@ angular.module("b2bTemplate/calendar/datepicker-popup.html", []).run(["$template
     "        <table class=\"table-condensed\">\n" +
     "            <thead>\n" +
     "                <tr>\n" +
-    "                    <th id=\"prev\" class=\"prev\" tabindex=\"0\" b2b-accessibility-click=\"13\" aria-label=\"Previous Month\" role=\"button\" b2b-element-focus=\"!disablePrev && getFocus\" ng-style=\"{visibility: visibilityPrev}\" ng-click=\"!disablePrev && move(-1,$event)\"><i class=\"icon-primary-left\" aria-hidden=\"true\"></i></th>\n" +
+    "                    <th id=\"prev\" class=\"prev\" tabindex=\"0\" b2b-accessibility-click=\"13,32\" aria-label=\"Previous Month\" role=\"button\" b2b-element-focus=\"!disablePrev && getFocus\" ng-style=\"{visibility: visibilityPrev}\" ng-click=\"!disablePrev && move(-1,$event)\"><i class=\"icon-primary-left\" aria-hidden=\"true\"></i></th>\n" +
     "                    <th id=\"month\" tabindex=\"-1\" aria-label=\"{{title}}\" class=\"datepicker-switch\" colspan=\"{{rows[0].length - 2}}\">{{title}}</th>\n" +
-    "                    <th id=\"next\" class=\"next\" tabindex=\"0\" b2b-accessibility-click=\"13\" b2b-element-focus=\"disablePrev && getFocus\" aria-label=\"Next Month\" role=\"button\" ng-style=\"{visibility: visibilityNext}\" ng-click=\"!disableNext && move(1,$event)\"><i class=\"icon-primary-right\" aria-hidden=\"true\"></i></th>\n" +
+    "                    <th id=\"next\" class=\"next\" tabindex=\"0\" b2b-accessibility-click=\"13,32\" b2b-element-focus=\"disablePrev && getFocus\" aria-label=\"Next Month\" role=\"button\" ng-style=\"{visibility: visibilityNext}\" ng-click=\"!disableNext && move(1,$event)\"><i class=\"icon-primary-right\" aria-hidden=\"true\"></i></th>\n" +
     "                </tr>\n" +
     "                <tr ng-show=\"labels.length > 0\">\n" +
     "                    <th id=\"{{label.post}}\" class=\"dow\" ng-repeat=\"label in labels\" aria-hidden=\"true\"><span aria-hidden=\"true\">{{label.pre}}</span></th>\n" +
@@ -21336,7 +22246,7 @@ angular.module("b2bTemplate/coachmark/coachmark.html", []).run(["$templateCache"
 angular.module("b2bTemplate/dropdowns/b2bDropdownDesktop.html", []).run(["$templateCache", function($templateCache) {
   $templateCache.put("b2bTemplate/dropdowns/b2bDropdownDesktop.html",
     "<span b2b-key prev=\"38\" next=\"40\" enable-search ng-class=\"{'large': (dropdownSize === 'large'), 'disabled': (disabled), 'selectWrap': (isInputDropdown), 'selectorModule': (dropdownType === 'menu'), 'linkSelectorModule': (dropdownType === 'link-menu')}\">\n" +
-    "    <input b2b-dropdown-toggle b2b-dropdown-validation ng-disabled=\"disabled\" type=\"text\" id=\"{{dropdownId}}\" name=\"{{dropdownName}}\" class=\"awd-select isWrapped\" ng-required=\"dropdownRequired\" ng-model=\"currentSelected.text\" role=\"combobox\" aria-owns=\"listbox{{$id}}\" aria-expanded=\"{{toggleFlag}}\" ng-click=\"toggleDropdown()\" ng-focus=\"focused=true\" ng-blur=\"setBlur(); focused=false\" ng-class=\"{'active': toggleFlag, 'closed': !toggleFlag, 'large': (dropdownSize === 'large'), 'focused':focused}\" style=\"width:100%;\" value=\"{{currentSelected.text}}\" ng-show=\"isInputDropdown\" aria-describedby=\"{{dropdownDescribedBy}}\" readonly=\"readonly\">\n" +
+    "    <input b2b-dropdown-toggle b2b-dropdown-validation ng-disabled=\"disabled\" type=\"text\" id=\"{{dropdownId}}\" name=\"{{dropdownName}}\" class=\"awd-select isWrapped\" ng-required=\"dropdownRequired\" ng-model=\"currentSelected.text\" role=\"combobox\" aria-owns=\"listbox{{$id}}\" aria-expanded=\"{{toggleFlag}}\" ng-click=\"toggleDropdown()\" ng-blur=\"setBlur();\" ng-class=\"{'active': toggleFlag, 'closed': !toggleFlag, 'large': (dropdownSize === 'large')}\" style=\"width:100%;\" value=\"{{currentSelected.text}}\" ng-show=\"isInputDropdown\" aria-describedby=\"{{dropdownDescribedBy}}\" readonly=\"readonly\">\n" +
     "    <button type=\"button\" b2b-dropdown-toggle ng-disabled=\"disabled\" class=\"selectModule\" aria-label=\"{{labelText}} {{currentSelected.label}}\" aria-expanded=\"{{toggleFlag}}\" aria-haspopup=\"true\" ng-click=\"toggleDropdown()\" ng-blur=\"setBlur()\" ng-class=\"{'active opened': toggleFlag, 'closed': !toggleFlag, 'large': (dropdownSize === 'large')}\" ng-bind-html=\"currentSelected.text\" ng-show=\"!isInputDropdown\"></button>\n" +
     "    <div ng-class=\"{'selectWrapper': (isInputDropdown), 'moduleWrapper': (!isInputDropdown)}\">\n" +
     "        <ul id=\"listbox{{$id}}\" role=\"{{isInputDropdown?'listbox':'menu'}}\" ng-class=\"{'awd-select-list': (isInputDropdown), 'awd-module-list': (!isInputDropdown)}\" tabindex=\"-1\" ng-show=\"toggleFlag\" aria-label=\"Choose options\"></ul>\n" +
@@ -21347,7 +22257,7 @@ angular.module("b2bTemplate/dropdowns/b2bDropdownDesktop.html", []).run(["$templ
     "        </ul>\n" +
     "</div>\n" +
     "<i class=\"icon-primary-down\" aria-hidden=\"true\"></i>\n" +
-    "</span>    ");
+    "</span>");
 }]);
 
 angular.module("b2bTemplate/dropdowns/b2bDropdownGroupDesktop.html", []).run(["$templateCache", function($templateCache) {
@@ -21359,7 +22269,7 @@ angular.module("b2bTemplate/dropdowns/b2bDropdownGroupDesktop.html", []).run(["$
 
 angular.module("b2bTemplate/dropdowns/b2bDropdownListDesktop.html", []).run(["$templateCache", function($templateCache) {
   $templateCache.put("b2bTemplate/dropdowns/b2bDropdownListDesktop.html",
-    "<li b2b-dropdown-list-desktop b2b-key-item b2b-accessibility-click=\"13\" aria-selected=\"{{currentSelected.value === dropdownListValue}}\" ng-class=\"{'awd-select-list-item': (isInputDropdown), 'module-list-item': (!isInputDropdown)}\" tabindex=\"0\" role=\"{{isInputDropdown?'option':'menuitem'}}\" ng-click=\"selectDropdownItem()\"></li>");
+    "<li b2b-dropdown-list-desktop b2b-key-item b2b-accessibility-click=\"13\" aria-selected=\"{{currentSelected.value === dropdownListValue}}\" data-hover=\"{{dropdown.highlightedValue === dropdownListValue}}\" ng-class=\"{'awd-select-list-item': (isInputDropdown), 'module-list-item': (!isInputDropdown)}\" tabindex=\"0\" role=\"{{isInputDropdown?'option':'menuitem'}}\" ng-click=\"selectDropdownItem()\" ng-focus=\"highlightDropdown()\"></li>");
 }]);
 
 angular.module("b2bTemplate/fileUpload/fileUpload.html", []).run(["$templateCache", function($templateCache) {
@@ -21415,16 +22325,30 @@ angular.module("b2bTemplate/horizontalTable/horizontalTable.html", []).run(["$te
   $templateCache.put("b2bTemplate/horizontalTable/horizontalTable.html",
     "<div class=\"b2b-horizontal-table\">\n" +
     "    <div class=\"b2b-horizontal-table-arrows row span12\">\n" +
-    "       <div class=\"span4\">\n" +
-    "           <button class=\"btn-arrow left\" type=\"button\" ng-click=\"moveViewportLeft()\" ddh-accessibility-click=\"13,32\" ng-disabled=\"disableLeft\"><div class=\"btn btn-alt\"><i class=\"icon-primary-left\"></i></div>Previous Set</button>\n" +
+    "       <div class=\"span4 b2b-prev-link\">\n" +
+    "           <a href=\"javascript:void(0)\" ng-click=\"moveViewportLeft()\" ddh-accessibility-click=\"13,32\" ng-if=\"!disableLeft\">Previous Set</a>\n" +
+    "            <span ng-if=\"disableLeft\" class=\"b2b-disabled-text\">Previous Set</span>\n" +
     "        </div>\n" +
     "        \n" +
     "        <span class=\"span5 b2b-horizontal-table-column-info\" aria-live=\"polite\" tabindex=\"-1\">\n" +
     "           Displaying {{getColumnSet()[0]}} - {{getColumnSet()[1]}} of {{numOfCols}} (total) columns\n" +
     "        </span>\n" +
+    "\n" +
+    "        <div ng-if=\"legendContent\" class=\"span2 b2b-horizontal-table-legend\">\n" +
+    "            <b2b-flyout>\n" +
+    "                <div tabindex=\"0\" role=\"button\" aria-haspopup=\"true\" b2b-flyout-toggler b2b-accessibility-click=\"13,32\" aria-expanded=\"{{flyoutOpened ? 'true' : 'false'}}\">\n" +
+    "                    Legend\n" +
+    "                    <i class=\"icoControls-down\" role=\"img\"></i>\n" +
+    "                </div>\n" +
+    "              <b2b-flyout-content horizontal-placement=\"center\" vertical-placement=\"below\">\n" +
+    "                <div ng-bind-html=\"legendContent\"></div>\n" +
+    "              </b2b-flyout-content>\n" +
+    "            </b2b-flyout>\n" +
+    "        </div>\n" +
     "        \n" +
-    "        <div class=\"span3\">\n" +
-    "           <button class=\"btn-arrow right\" ng-click=\"moveViewportRight()\" ddh-accessibility-click=\"13,32\" ng-disabled=\"disableRight\" type=\"button\">Next Set<div class=\"btn btn-alt\"><i class=\"icon-primary-right\"></i></div></button>\n" +
+    "        <div class=\"span3 text-right b2b-next-link\">\n" +
+    "            <a href=\"javascript:void(0)\" ng-click=\"moveViewportRight()\" ddh-accessibility-click=\"13,32\" ng-if=\"!disableRight\">Next Set</a>\n" +
+    "            <span ng-if=\"disableRight\" class=\"b2b-disabled-text\">Next Set</span>\n" +
     "       </div>\n" +
     "    </div>\n" +
     "    <div class=\"b2b-horizontal-table-inner-container\">\n" +
@@ -21449,7 +22373,7 @@ angular.module("b2bTemplate/hourPicker/b2bHourpickerPanel.html", []).run(["$temp
   $templateCache.put("b2bTemplate/hourPicker/b2bHourpickerPanel.html",
     "<form name=\"{{'hourpickerForm' + $id}}\">\n" +
     "    <div class=\"hp-checkbox\" role=\"group\">\n" +
-    "        <label class=\"checkbox\" for=\"checkbox_{{dayOption.title}}_{{$id}}\" aria-label=\"{{dayOption.title}}\" ng-repeat=\"dayOption in hourpicker.dayOptions\">\n" +
+    "        <label class=\"checkbox\" for=\"checkbox_{{dayOption.title}}_{{$id}}\" ng-repeat=\"dayOption in hourpicker.dayOptions\">\n" +
     "            <input type=\"checkbox\" id=\"checkbox_{{dayOption.title}}_{{$id}}\" name=\"{{'hourpickerDays' + $id}}\" ng-model=\"hourpickerPanelValue.days[$index].value\" ng-disabled=\"dayOption.disabled\" /><i class=\"skin\"></i><span>{{dayOption.label}}</span>\n" +
     "        </label>\n" +
     "    </div>\n" +
@@ -21503,8 +22427,8 @@ angular.module("b2bTemplate/hourPicker/b2bHourpickerValue.html", []).run(["$temp
     "<div class=\"selected-days\">\n" +
     "    <span class=\"day\">{{hourpickerValue.days}} &nbsp; {{hourpickerValue.startTime}} {{hourpickerValue.startMeridiem}} - {{hourpickerValue.endTime}} {{hourpickerValue.endMeridiem}}</span>\n" +
     "    <span style=\"float:right\">\n" +
-    "        <i class=\"icon-misc-pen\" role=\"button\" title=\"Edit {{hourpickerValue.days}} &nbsp; {{hourpickerValue.startTime}} {{hourpickerValue.startMeridiem}} - {{hourpickerValue.endTime}} {{hourpickerValue.endMeridiem}}\" tabindex=\"0\" b2b-accessibility-click=\"13,32\" ng-click=\"editHourpickerValue(hourpickerValue.index)\"></i>\n" +
-    "        <i class=\"icon-misc-trash\" role=\"button\" title=\"Delete {{hourpickerValue.days}} &nbsp; {{hourpickerValue.startTime}} {{hourpickerValue.startMeridiem}} - {{hourpickerValue.endTime}} {{hourpickerValue.endMeridiem}}\" tabindex=\"0\" b2b-accessibility-click=\"13,32\" ng-click=\"deleteHourpickerValue(hourpickerValue.index)\"></i>\n" +
+    "        <i class=\"icon-misc-pen\" role=\"button\" aria-label=\"Edit {{hourpickerValue.days}} {{hourpickerValue.startTime}} {{hourpickerValue.startMeridiem}} - {{hourpickerValue.endTime}} {{hourpickerValue.endMeridiem}}\" title=\"Edit\" tabindex=\"0\" b2b-accessibility-click=\"13,32\" ng-click=\"editHourpickerValue(hourpickerValue.index)\"></i>\n" +
+    "        <i class=\"icon-misc-trash\" role=\"button\" aria-label=\"Delete {{hourpickerValue.days}} {{hourpickerValue.startTime}} {{hourpickerValue.startMeridiem}} - {{hourpickerValue.endTime}} {{hourpickerValue.endMeridiem}}\" title=\"Delete\" tabindex=\"0\" b2b-accessibility-click=\"13,32\" ng-click=\"deleteHourpickerValue(hourpickerValue.index)\"></i>\n" +
     "    </span>\n" +
     "    <div style=\"clear:both\"></div>\n" +
     "</div>");
@@ -21512,26 +22436,13 @@ angular.module("b2bTemplate/hourPicker/b2bHourpickerValue.html", []).run(["$temp
 
 angular.module("b2bTemplate/leftNavigation/leftNavigation.html", []).run(["$templateCache", function($templateCache) {
   $templateCache.put("b2bTemplate/leftNavigation/leftNavigation.html",
-    "<div class=\"b2b-nav-menu\" ng-init=\"(showmenu = true)\" ng-class=\"{false: 'left-menu-collapsed'}[showmenu]\">\n" +
+    "<div class=\"b2b-nav-menu\">\n" +
     "    <div class=\"b2b-subnav-container\">\n" +
     "        <ul class=\"b2b-subnav-content\">\n" +
-    "                   <li>" +
-    "                          <div ng-class=\"{true: 'leftmenu-arrow-expand', false: 'leftmenu-arrow-collapse'}[showmenu]\">"+        
-    "                                  <a ng-click=\"toggleDrawer(showmenu);(showmenu = !showmenu) \" class=\"text-right\">" +
-    "                                  <i ng-class=\"{true: 'icon-controls-left', false: 'icon-controls-right'}[showmenu]\">&nbsp;</i></a>" +
-    "                          </div>"+                        
-    "                  </li>" +
-    "            <li ng-repeat=\"menu in menuData\" ng-click=\"!showmenu||toggleNav($index,menu.href)\">" +
-    "                          <span ng-class=\"{true: 'menu-icon', false: 'menu-icon-collapse'}[showmenu]\"><span class=\"{{menu.imageSrc}}\"></span>&nbsp;&nbsp;</span>" +
-    "                          <a ng-class=\"{expand: isOpen($index)}\" ng-if=\"showmenu\"  aria-label=\"{{menu.name}}\" title=\" \" aria-expanded=\"{{(idx==$index)?true:false;}}\" href=\"javascript:void(0);\">" +
-    "                                  {{menu.name}}" +
-    "                                  <i aria-hidden=\"true\" ng-if=\"(menu.menuItems.length > 0)\" class=\"b2b-icon-primary-plus-minus\"ng-class=\"idx==$index ? 'icon-primary-expanded' : 'icon-primary-collapsed'\"></i>" +
-    "                          </a>\n" +
-    "                          <div role=\"region\" aria-hidden=\"{{(isOpen($index))?false:true;}}\">\n" +
-    "                  <ul ng-class=\"{expand: idx==$index}\">\n" +
-    "                            <li ng-repeat=\"menuItem in menu.menuItems\" ng-click=\"liveLink($event, $index, $parent.$index)\"><a aria-hidden=\"{{!(idx==$parent.$index)}}\" aria-label=\"{{menuItem.name}}\" title=\" \" href=\"{{menuItem.href}}\" tabindex=\"{{(idx==$parent.$index)?0:-1;}}\" ng-class=\"{active: itemIdx==$index && navIdx==$parent.$index}\">{{menuItem.name}}</a></li>\n" +
-    "                          </ul>\n" +
-    "                          </div>\n" +
+    "            <li ng-repeat=\"menu in menuData\" ng-click=\"toggleNav($index)\"><a ng-class=\"{'expand': idx==$index}\" aria-label=\"{{menu.name}}\" title=\" \" aria-expanded=\"{{(idx==$index)?true:false;}}\" href=\"javascript:void(0);\">{{menu.name}}<i class=\"b2b-icon-primary-plus-minus\" ng-class=\"idx==$index ? 'icon-primary-expanded' : 'icon-primary-collapsed'\"></i></a>\n" +
+    "                <ul ng-class=\"{expand: idx==$index}\">\n" +
+    "                    <li ng-repeat=\"menuItem in menu.menuItems\" ng-click=\"liveLink($event, $index, $parent.$index)\"><a aria-hidden=\"{{!(idx==$parent.$index)}}\" aria-label=\"{{menuItem.name}}\" title=\" \" href=\"{{menuItem.href}}\" tabindex=\"{{(idx==$parent.$index)?0:-1;}}\" ng-class=\"{active: itemIdx==$index && navIdx==$parent.$index}\">{{menuItem.name}}</a></li>\n" +
+    "                </ul>\n" +
     "            </li>\n" +
     "        </ul>\n" +
     "    </div>\n" +
@@ -21616,20 +22527,22 @@ angular.module("b2bTemplate/pagination/b2b-pagination.html", []).run(["$template
     "        <a tabindex=\"{{currentPage <= 1 ? -1 : 0 }}\" class=\"b2b-pager__item--prev\" b2b-accessibility-click=\"13,32\" title=\"Previous Page\" ng-click=\"prev($event)\" ng-if=\"totalPages > 10\" ng-class=\"currentPage <= 1 ? 'b2b-pager__item--prev-disabled': '' \">\n" +
     "            <i class=\"icon-primary-left\"></i>\n" +
     "        </a>\n" +
-    "        <a tabindex=\"{{currentPage === 1 ? -1 : 0}}\" ng-class=\"{'b2b-pager__item--noclick': currentPage === 1}\" aria-selected=\"{{checkSelectedPage(page)}}\" class=\"b2b-pager__item b2b-pager__item--link\" title=\"Page 1{{checkSelectedPage(page) ? ' selected' : '' }}\" ng-if=\"totalPages > 10 && currentPage > 6\" b2b-accessibility-click=\"13,32\" ng-click=\"selectPage(1, $event)\">\n" +
+    "        <a tabindex=\"{{currentPage === 1 ? -1 : 0}}\" ng-class=\"{'b2b-pager__item--noclick': currentPage === 1}\" class=\"b2b-pager__item b2b-pager__item--link\" title=\"Page 1{{checkSelectedPage(page) ? ' selected' : '' }}\" ng-if=\"totalPages > 10 && currentPage > 6\" b2b-accessibility-click=\"13,32\" ng-click=\"selectPage(1, $event)\">\n" +
     "            1<span class=\"offscreen-text\" ng-if=\"currentPage === 1\"> is selected</span>\n" +
     "        </a>\n" +
-    "        <a tabindex=\"{{currentPage === 2 ? -1 : 0}}\" aria-selected=\"{{checkSelectedPage(page)}}\" ng-class=\"{'b2b-pager__item--noclick': currentPage === 2}\" class=\"b2b-pager__item b2b-pager__item--link\" title=\"Page 2{{checkSelectedPage(page) ? ' selected' : '' }}\" ng-if=\"totalPages > 10 && currentPage > 6\" b2b-accessibility-click=\"13,32\" ng-click=\"selectPage(2, $event)\">2<span class=\"offscreen-text\" ng-if=\"currentPage === 2\"> is selected</span></a>\n" +
+    "        <a tabindex=\"{{currentPage === 2 ? -1 : 0}}\" ng-class=\"{'b2b-pager__item--noclick': currentPage === 2}\" class=\"b2b-pager__item b2b-pager__item--link\" title=\"Page 2{{checkSelectedPage(page) ? ' selected' : '' }}\" ng-if=\"totalPages > 10 && currentPage > 6\" b2b-accessibility-click=\"13,32\" ng-click=\"selectPage(2, $event)\">\n" +
+    "            2<span class=\"offscreen-text\" ng-if=\"currentPage === 2\"> is selected</span></a>\n" +
     "\n" +
     "        <span class=\"b2b-pager__item\" ng-if=\"totalPages > 10 && currentPage > 6\">...</span>\n" +
     "\n" +
-    "        <a tabindex=\"{{checkSelectedPage(page) ? -1 : 0}}\" href=\"javascript:void(0)\" class=\"b2b-pager__item b2b-pager__item--link\" title=\"Page {{page}}\" b2b-element-focus=\"isFocused(page)\" ng-repeat=\"page in pages\" ng-class=\"{'b2b-pager__item--active': checkSelectedPage(page), 'b2b-pager__item--noclick': checkSelectedPage(page)}\" b2b-accessibility-click=\"13,32\" ng-click=\"!checkSelectedPage(page) && selectPage(page, $event)\">{{page}}<span class=\"offscreen-text\" ng-if=\"currentPage === page\"> is selected</span></a>\n" +
+    "        <a tabindex=\"{{checkSelectedPage(page) ? -1 : 0}}\" href=\"javascript:void(0)\" class=\"b2b-pager__item b2b-pager__item--link\" title=\"Page {{page}}\" b2b-element-focus=\"isFocused(page)\" ng-repeat=\"page in pages\" ng-class=\"{'b2b-pager__item--active': checkSelectedPage(page), 'b2b-pager__item--noclick': checkSelectedPage(page)}\" b2b-accessibility-click=\"13,32\" ng-click=\"!checkSelectedPage(page) && selectPage(page, $event)\">\n" +
+    "            {{page}}<span class=\"offscreen-text\" ng-if=\"checkSelectedPage(page)\"> is selected</span></a>\n" +
     "\n" +
     "        <span class=\"b2b-pager__item\" ng-if=\"totalPages > 10 && currentPage <= totalPages - 5\">...</span>\n" +
     "\n" +
-    "        <a tabindex=\"{{checkSelectedPage(page) ? -1 : 0}}\" href=\"javascript:void(0)\" ng-class=\"{'b2b-pager__item--noclick': checkSelectedPage(page)}\" aria-selected=\"{{checkSelectedPage(page)}}\" class=\"b2b-pager__item b2b-pager__item--link\" title=\"Page {{totalPages-1}}\" ng-if=\"totalPages > 10 && currentPage <= totalPages - 5\" b2b-accessibility-click=\"13,32\" ng-click=\"selectPage(totalPages-1, $event)\">{{totalPages-1}}<span class=\"offscreen-text\" ng-if=\"currentPage === totalPages-1\"> is selected</span></a>\n" +
+    "        <a tabindex=\"{{checkSelectedPage(page) ? -1 : 0}}\" href=\"javascript:void(0)\" ng-class=\"{'b2b-pager__item--noclick': checkSelectedPage(page)}\" class=\"b2b-pager__item b2b-pager__item--link\" title=\"Page {{totalPages-1}}\" ng-if=\"totalPages > 10 && currentPage <= totalPages - 5\" b2b-accessibility-click=\"13,32\" ng-click=\"selectPage(totalPages-1, $event)\">{{totalPages-1}}<span class=\"offscreen-text\" ng-if=\"checkSelectedPage(page)\"> is selected</span></a>\n" +
     "\n" +
-    "        <a tabindex=\"{{currentPage === totalPages ? -1 : 0}}\" href=\"javascript:void(0)\" ng-class=\"{'b2b-pager__item--noclick': currentPage === totalPages}\" aria-selected=\"{{checkSelectedPage(page)}}\" class=\"b2b-pager__item b2b-pager__item--link\" title=\"Page {{totalPages}}\" ng-if=\"totalPages > 10 && currentPage <= totalPages - 5\" b2b-accessibility-click=\"13,32\" ng-click=\"selectPage(totalPages, $event)\">{{totalPages}}<span class=\"offscreen-text\" ng-if=\"currentPage === totalPages\"> is selected</span></a>\n" +
+    "        <a tabindex=\"{{currentPage === totalPages ? -1 : 0}}\" href=\"javascript:void(0)\" ng-class=\"{'b2b-pager__item--noclick': currentPage === totalPages}\" class=\"b2b-pager__item b2b-pager__item--link\" title=\"Page {{totalPages}}\" ng-if=\"totalPages > 10 && currentPage <= totalPages - 5\" b2b-accessibility-click=\"13,32\" ng-click=\"selectPage(totalPages, $event)\">{{totalPages}}<span class=\"offscreen-text\" ng-if=\"checkSelectedPage(page)\"> is selected</span></a>\n" +
     "\n" +
     "        <a tabindex=\"{{currentPage >= totalPages ? -1 : 0 }}\" href=\"javascript:void(0)\" class=\"b2b-pager__item--next\" b2b-accessibility-click=\"13,32\" title=\"Next Page\" ng-click=\"next($event)\" ng-if=\"totalPages > 10\" ng-class=\"currentPage >= totalPages ? 'b2b-pager__item--next-disabled' :'' \">\n" +
     "            <i class=\"icon-primary-right\"></i>\n" +
@@ -21823,22 +22736,22 @@ angular.module("b2bTemplate/statusTracker/statusTracker.html", []).run(["$templa
     "           <i class=\"icon-primary-left\"></i>\n" +
     "       </div>\n" +
     "   </button>\n" +
-    "   <div ng-repeat=\"status in statuses\" class=\"b2b-status-tracker-step\" ng-class=\"{ 'complete' : status.complete, 'current' : currentStatus($index)}\" ng-show=\"isInViewport($index)\">\n" +
+    "   <div ng-repeat=\"status in statuses\" class=\"b2b-status-tracker-step {{ status.state }}\" ng-show=\"isInViewport($index)\">\n" +
     "       <p class=\"b2b-status-tracker-heading\">{{status.heading}}</p>\n" +
     "       <div class=\"progress\">\n" +
     "           <div class=\"progress-bar\">\n" +
     "               <span class=\"hidden-spoken\">\n" +
-    "                   {{status.complete ? 'Complete' : 'Incomplete'}}\n" +
+    "                   {{ removeCamelCase(status.state) }}\n" +
     "               </span>\n" +
     "           </div>\n" +
     "       </div>\n" +
-    "       <div class=\"b2b-status-tracker-estimate\">\n" +
-    "           <i ng-show=\"status.estimate !== '' && status.estimate !== undefined\" ng-class=\"status.complete ? 'icoControls-approval' : 'icon-misc-time'\"></i> {{status.complete ? 'Complete' : status.estimate}}\n" +
+    "       <div class=\"b2b-status-tracker-estimate {{status.state}}\">\n" +
+    "           <i ng-show=\"status.estimate !== '' && status.estimate !== undefined\" ng-class=\"b2bStatusTrackerConfig.icons[status.state]\"></i>\n" +
     "           &nbsp;\n" +
+    "           <span ng-bind-html=\"status.estimate\"></span>\n" +
     "       </div>\n" +
     "       \n" +
-    "       <div class=\"b2b-status-tracker-description\">\n" +
-    "           {{status.description}}\n" +
+    "       <div class=\"b2b-status-tracker-description\" ng-bind-html=\"status.description\"> \n" +
     "       </div>\n" +
     "   </div>\n" +
     "   <button tabindex=\"0\" ng-disabled=\"currentViewIndex + b2bStatusTrackerConfig.maxViewItems === statuses.length\" ng-if=\"statuses.length > b2bStatusTrackerConfig.maxViewItems\" class=\"btn-arrow\" type=\"button\" aria-label=\"Next status\" ng-click=\"nextStatus()\">\n" +
@@ -21948,7 +22861,7 @@ angular.module("b2bTemplate/tables/b2bTableHeaderSortable.html", []).run(["$temp
   $templateCache.put("b2bTemplate/tables/b2bTableHeaderSortable.html",
     "<th scope=\"col\" role=\"columnheader\" aria-sort=\"{{sortPattern !== 'null' && 'none' || sortPattern}}\" aria-label=\"{{headerName}} {{sortable !== 'false' && ': activate to sort' || ' '}} {{sortPattern !== 'null' && '' || sortPattern}}\" tabindex=\"{{sortable !== 'false' && '0' || '-1'}}\" b2b-accessibility-click=\"13,32\" ng-click=\"(sortable !== 'false') && sort();\" ng-hide=\"isHidden()\">\n" +
     "    <span ng-transclude></span>\n" +
-    "    <i ng-class=\"{'icon-primary-arrows-sort-arrow active': sortPattern === 'ascending', 'icon-primary-arrows-sort-arrow active down': sortPattern === 'descending'}\"></i>\n" +
+    "    <i ng-class=\"{'icoArrows-sort-arrow active': sortPattern === 'ascending', 'icoArrows-sort-arrow active down': sortPattern === 'descending'}\"></i>\n" +
     "</th>");
 }]);
 
index 806b1bc..80e1a26 100644 (file)
@@ -345,7 +345,7 @@ appDS2.controller('reportChartController', function ($scope, $rootScope, $timeou
 
 });
 
-app.directive('onlyDigits', function () {
+appDS2.directive('onlyDigits', function () {
 
     return {
         restrict: 'A',
@@ -362,7 +362,7 @@ app.directive('onlyDigits', function () {
     };
 });
 
-app.directive('onlyCharacters', function () {
+appDS2.directive('onlyCharacters', function () {
     return {
         restrict: 'A',
         require: '?ngModel',
index 760ff6d..6eb0afe 100644 (file)
@@ -52,12 +52,15 @@ appDS2.controller("reportRunController", ['$scope','$rootScope','$routeParams','
        
        
        
+       $scope.backToParentReport = function (){
+               $window.location.href = "report#/report_run/"+$scope.parentReportUrlParams
+       }
        
        $scope.urlParams = parseQueryString($scope.currentReportUrlParams);
        
-       $scope.reportChartURL = 'report#/report_chart_wizard/'+$scope.urlParams.c_master;
+       $scope.reportChartURL = 'report#/report_chart/'+$scope.urlParams.c_master;
        
-       $scope.reportEditURL = 'report_wizard.htm?action=report.edit&c_master='+$scope.urlParams.c_master;
+       $scope.reportEditURL = 'report#/report_wizard/'+$scope.urlParams.c_master;
 
        
        $http.get('raptor.htm?action=report.run.container&'+$scope.currentReportUrlParams).then(
index f1e82fa..faa2c42 100644 (file)
@@ -408,8 +408,8 @@ appDS2.controller('reportStepController', function($scope,$http,$location, $rout
                                                                  "displayHeaderAlignment" : ($scope.selectedDisplayHeaderAlignment.value=="null")?null:$scope.selectedDisplayHeaderAlignment.value,
                                                                  "sortable" : ($scope.sortable.value=="true"),
                                                                  "visible" : ($scope.visible.value=="true"),
-                                                                 "drilldownURL" : drilldownURL,
-                                                                 "drilldownParams" : "",
+                                                                 "drilldownURL" : raptorReportFactory.drillDownURL,
+                                                                 "drilldownParams" : raptorReportFactory.drillDownParams,
                                                                  "drilldownType" : ""
                                                                }
                                                 raptorReportFactory.saveColumnEditInfo(colInfo).then(function(data){
@@ -600,26 +600,46 @@ appDS2.controller('reportStepController', function($scope,$http,$location, $rout
                      });
  };
     
-       $scope.openDrillDownReportPopup = function (reportId) {
+       $scope.openDrillDownReportPopup = function (reportId,parentReportId) {
                   var modalInstance = $modal.open({
                                 scope: $scope,
                                 animation: $scope.animationsEnabled,
                                 templateUrl: 'app/fusion/scripts/DS2-view-models/ds2-reports/modal/report-wizard-drilldown-edit.html',
                                 sizeClass: 'modal-large',
                                 controller: ['$scope', '$modalInstance', '$http', '$log','raptorReportFactory','reportId', function ($scope, $modalInstance, $http, $log, raptorReportFactory, reportId) {
+                                        
+                                        $scope.drillDownOptionList =[];
                                         $scope.selectedvalueradioGroup = {"name":""};
                                         $scope.selectedChildReportFormField = {"value":""};
                                         $scope.selectedChildReportColumn = {"value":""};
                                         $scope.fixedValue = {"value":""};
                                         $scope.suppressValues = {"value":""};
 
-                                       raptorReportFactory.getChildReportFormField(reportId).then(function(data){
-                                               $scope.childReportFF =data;
+                                       raptorReportFactory.getChildReportFormField(reportId).then(function(data){                                              
+                                               for (var i=0;i<data.length;i++) {
+                                                       $scope.drillDownOptionList.push(
+                                                                       {
+                                                                       "name": data[i].name,
+                                                                       "id": data[i].id,
+                                                                       "selectedvalueradioGroup":{"name":""},
+                                                                       "selectedChildReportFormField":{"value":""},
+                                                                       "selectedChildReportColumn":{"value":""},
+                                                                       "fixedValue":{"value":""},
+                                                                       "suppressValues":{"value":""}                                                                   
+                                                                       }
+                                                                       )
+                                               }
                                                },function(error){
                                                        $log.error("raptorReportFactory: getChildReportFormField failed.");  
                                                        });
 
-                                       raptorReportFactory.getChildReportColumn(reportId).then(function(data){
+                                       raptorReportFactory.getChildReportFormField(parentReportId).then(function(data){
+                                               $scope.childReportFF =data;
+                                               },function(error){
+                                                       $log.error("raptorReportFactory: getChildReportFormField failed.");  
+                                                       });                                     
+
+                                       raptorReportFactory.getChildReportColumn(parentReportId).then(function(data){
                                                $scope.childReportCol =data;
                                                },function(error){
                                                        $log.error("raptorReportFactory: getChildReportFormField failed.");  
@@ -628,19 +648,10 @@ appDS2.controller('reportStepController', function($scope,$http,$location, $rout
                                        raptorReportFactory.setDrillDownPopupOptions(null);                                                                                                                     
                        
                                  $scope.complete = function() {
-//                                     if ($scope.selectedvalueradioGroup.name=="radiovalue1") {
-//                                             console.log("radio 1 selected");
-//                                     } else if ($scope.selectedvalueradioGroup.name=="radiovalue2") {
-//                                             console.log("radio 2 selected");                                                
-//                                     } else if ($scope.selectedvalueradioGroup.name=="radiovalue3") {
-//                                             console.log("radio 3 selected");
-//                                     } else if ($scope.selectedvalueradioGroup.name=="radiovalue4") {
-//                                             console.log("radio 4 selected");
-//                                     } else if ($scope.selectedvalueradioGroup.name=="radiovalue5") {
-//                                             console.log("radio 5 selected");
-//                                     } else {
-//                                             console.log("None selected");
-//                                     }
+
+                                       console.log("$scope.drillDownOptionList: ");
+                                       console.log($scope.drillDownOptionList);
+                                       
 
                                        var drillDownPopupOptions= {
                                                        radioGroup : $scope.selectedvalueradioGroup.name,
@@ -649,8 +660,23 @@ appDS2.controller('reportStepController', function($scope,$http,$location, $rout
                                                        fixedValue:  $scope.fixedValue.value,
                                                        suppressValues: $scope.suppressValues.value
                                        }
-                                       raptorReportFactory.setDrillDownPopupOptions(drillDownPopupOptions);
-                                       console.log(raptorReportFactory.drillDownPopupOptions);
+                                       var drillDownParams = "";
+                                       var ampStr ="";
+                                       for (var i=0;i<$scope.drillDownOptionList.length; i++) {
+                                               if (drillDownParams!="") {
+                                                       ampStr = "&amp;";
+                                               } 
+                                               if ($scope.drillDownOptionList[i].selectedvalueradioGroup.name=="fixedValue"){
+                                                       drillDownParams = drillDownParams + ampStr + $scope.drillDownOptionList[i].id + "="+$scope.drillDownOptionList[i].fixedValue.value;
+                                               } else if ($scope.drillDownOptionList[i].selectedvalueradioGroup.name=="reportFF"){
+                                                       drillDownParams = drillDownParams + ampStr + $scope.drillDownOptionList[i].id + "=[!"+$scope.drillDownOptionList[i].selectedChildReportFormField.value + "]";                                                   
+                                               } else if ($scope.drillDownOptionList[i].selectedvalueradioGroup.name=="reportCol"){
+                                                       drillDownParams = drillDownParams + ampStr + $scope.drillDownOptionList[i].id + "=["+$scope.drillDownOptionList[i].selectedChildReportColumn.value + "]";                                                                                                               
+                                               }                                                       
+                                       }
+                                       raptorReportFactory.setDrillDownPopupOptions(reportId,drillDownParams);
+                                       console.log(raptorReportFactory.drillDownURL);
+                                       console.log(raptorReportFactory.drillDownParams);
                                        
                                        $modalInstance.close();
                                  };
@@ -970,8 +996,10 @@ appDS2.controller('reportStepController', function($scope,$http,$location, $rout
        });
        
            $scope.$on('openDrillDownpage', function(event, reportId) {
+               console.log("$scope.reportId");
+               console.log($scope.reportId);
        if (reportId!="") {
-                               $scope.openDrillDownReportPopup(reportId);
+                               $scope.openDrillDownReportPopup(reportId,$scope.reportId);
        }
        });
 
index 7dcbdbe..088fa48 100644 (file)
@@ -88,7 +88,7 @@ appDS2.directive('ds2Header', function () {
                        
                        $scope.adjustHeader=function() {
                        $scope.showHeader = ($cookies.get("show_app_header") == undefined ? true : $cookies.get("show_app_header"));
-                       console.log($scope.showHeader);
+                       // console.log($scope.showHeader);
                        if ($scope.showHeader==true) {
                                document.getElementById('page-content').style.marginTop = "45px";
                }else{                  
index 65e05fb..b0aafdb 100644 (file)
@@ -376,8 +376,9 @@ appDS2.factory('raptorReportFactory', function($http, $q) {
                                                return $q.reject("raptorReportFactory: getSearchDataAtPage callback failed");                           
                                        });
                },
-               setDrillDownPopupOptions: function(drillDownPopupOptions) {
-                       this.drillDownPopupOptions = drillDownPopupOptions;
+               setDrillDownPopupOptions: function(drillDownURL,drillDownParams) {
+                       this.drillDownURL = drillDownURL;
+                       this.drillDownParams = drillDownParams;
                },      
                getReportDeleteStatus : function(deleteUrl) {
                        return $http.get(deleteUrl).then(function(response) {
index fad0e04..5337fd2 100644 (file)
@@ -1,43 +1,50 @@
-<div class="b2b-nav-menu" id="left-menu-main-div" ng-class="leftMenuClass">
+<div class="b2b-nav-menu" id="left-menu-main-div"
+       ng-class="leftMenuClass">
        <div class="b2b-subnav-container" id="left-menu-subnav-container">
                <ul class="b2b-subnav-content" id="left-menu-subnav-content">
                        <li id="b2b-subnav-content-li">
                                <div ng-class="leftMenuArrowClass" id="left-menu-arrow-toggle-div">
-                                       <a ng-click="toggleDrawer(showmenu);" class="text-right" id="left-menu-arrow-toggle-anchor">
-                                               <i ng-class="{true: 'icon-controls-left', false: 'icon-controls-right'}[showmenu]" id="left-menuf-arrow-toggle-icon">&nbsp;</i>
+                                       <a ng-click="toggleDrawer(showmenu);" class="text-right"
+                                               id="left-menu-arrow-toggle-anchor"> <i
+                                               ng-class="{true: 'icon-controls-left', false: 'icon-controls-right'}[showmenu]"
+                                               id="left-menuf-arrow-toggle-icon">&nbsp;</i>
                                        </a>
                                </div>
                        </li>
-                       <li ng-repeat="menu in menuData" ng-click="toggleNav($index,menu.href,showmenu)" id="left-menu-li-{{menu.name.split(' ').join('-')}}">
-                               <span ng-class="{true: 'menu-icon', false: 'menu-icon-collapse'}[showmenu]" id="left-menu-span-{{menu.name.split(' ').join('-')}}">
-                                       <span class="{{menu.imageSrc}}" id="icon-image-{{menu.name.split(' ').join('-')}}"></span>&nbsp;&nbsp;
-                               </span>
-                               <a ng-class="{expand: isOpen($index)}" 
-                                       id="parent-item-{{menu.name.split(' ').join('-')}}" 
-                                       ng-if="showmenu" 
-                                       aria-label="{{menu.name}}" title="{{menu.name}}" 
-                                       aria-expanded="{{(idx==$index)?true:false;}}" 
-                                       href="javascript:void(0);">
-                                       {{menu.name}} 
-                                               <i aria-hidden="true" 
-                                                       ng-if="(menu.menuItems.length > 0)" 
-                                                       class="b2b-icon-primary-plus-minus"     
-                                                       ng-class="idx==$index ? 'icon-primary-expanded' : 'icon-primary-collapsed'"></i>
-                               </a>
-                               <div role="region" aria-hidden="{{(isOpen($index))?false:true;}}" id="left-menu-child-div-{{menu.name.split(' ').join('-')}}">
-                                       <ul ng-class="{expand: idx==$index}" id="left-menu-child-ul-{{menu.name.split(' ').join('-')}}">
-                                               <li ng-repeat="menuItem in menu.menuItems"
-                                                       ng-click="liveLink($event, $index, $parent.$index)" 
-                                                       id="left-menu-child-li-{{menuItem.name.split(' ').join('-')}}-{{menu.name.split(' ').join('-')}}">
-                                                       <a      aria-hidden="{{!(idx==$parent.$index)}}" 
-                                                                       aria-label="{{menuItem.name}}" title="{{menuItem.name}}" 
-                                                                       id="child-item-{{menuItem.name.split(' ').join('-')}}"
-                                                                       href="{{menuItem.href}}" tabindex="{{(idx==$parent.$index)?0:-1;}}"     
-                                                                       ng-class="{active: itemIdx==$index && navIdx==$parent.$index}">{{menuItem.name}}</a>
-                                               </li>
-                                       </ul>
-                               </div>
-                       </li>
+                       <li ng-repeat="menu in menuData"
+                               ng-click="toggleNav($index,menu.href,showmenu)"
+                               id="left-menu-li-{{menu.name.split(' ').join('-')}}"><span
+                               ng-class="{true: 'menu-icon', false: 'menu-icon-collapse'}[showmenu]"
+                               id="left-menu-span-{{menu.name.split(' ').join('-')}}"> <span
+                                       class="{{menu.imageSrc}}"
+                                       id="icon-image-{{menu.name.split(' ').join('-')}}"></span>&nbsp;&nbsp;
+                       </span> <a ng-class="{expand: isOpen($index)}"
+                               id="parent-item-{{menu.name.split(' ').join('-')}}" ng-if="showmenu"
+                               aria-label="{{menu.name}}" title="{{menu.name}}"
+                               aria-expanded="{{(idx==$index)?true:false;}}"
+                               href="javascript:void(0);"> {{menu.name}} <i aria-hidden="true"
+                                       ng-if="(menu.menuItems.length > 0)"
+                                       class="b2b-icon-primary-plus-minus"
+                                       ng-class="idx==$index ? 'icon-primary-expanded' : 'icon-primary-collapsed'"></i>
+                       </a>
+                               <div role="region" aria-hidden="{{(isOpen($index))?false:true;}}"
+                                       id="left-menu-child-div-{{menu.name.split(' ').join('-')}}">
+                                       <div class="left-menu-child">
+                                               <ul ng-class="{expand: idx==$index}"
+                                                       id="left-menu-child-ul-{{menu.name.split(' ').join('-')}}">
+                                                       <li ng-repeat="menuItem in menu.menuItems"
+                                                               ng-click="liveLink($event, $index, $parent.$index)"
+                                                               id="left-menu-child-li-{{menuItem.name.split(' ').join('-')}}-{{menu.name.split(' ').join('-')}}">
+                                                               <a aria-hidden="{{!(idx==$parent.$index)}}"
+                                                               aria-label="{{menuItem.name}}" title="{{menuItem.name}}"
+                                                               id="child-item-{{menuItem.name.split(' ').join('-')}}"
+                                                               href="{{menuItem.href}}"
+                                                               tabindex="{{(idx==$parent.$index)?0:-1;}}"
+                                                               ng-class="{active: itemIdx==$index && navIdx==$parent.$index}">{{menuItem.name}}</a>
+                                                       </li>
+                                               </ul>
+                                       </div>
+                                       </div></li>
                </ul>
        </div>
 </div>
\ No newline at end of file
index 69fd324..913b10e 100644 (file)
@@ -3,7 +3,7 @@
                <h1 class="heading-page" id="AdminMenuItems">Admin Menu Items</h1>
        </div>
        <div>
-               <button type="submit" ng-click="addNewFnMenuItemModalPopup();" class="btn btn-alt btn-small">Add Menu Item</button>
+               <button type="submit" ng-click="addNewFnMenuItemModalPopup();" class="btn btn-alt btn-small" style="position: initial;">Add Menu Item</button>
        </div>
     
     <h3 class="heading-small">
index 097d179..e74f89a 100644 (file)
 #columnEditTable .selectWrap{
        width:220px;
 }
+
+
+#drilldownOption .selectWrap{
+       width:450px;
+}
 </style>
 
 <div style="height: 700px;">
 
              <tr>
                 <td class="colTableLeftColumn" style="width:350px;">Drill-down Link:</td>
-                               <td>
+                               <td id="drilldownOption">
                                        <select name="drillDown" b2b-dropdown ng-model="selectedDrillDownReport.value" placeholder-text="Select">
                                                <option  b2b-dropdown-list option-repeat="d in drilldownReports" value="{{d.id}}">{{d.name}}</option>
                     </select>
index ec2134b..6b98ac7 100644 (file)
        <div class="b2b-modal-body ng-scope ng-isolate-scope in"  style="margin-bottom: -50px;">
                <form name="workflowForm" class="css-form" novalidate>
                        
-       <div id="columnEditTable">
+       <div id="columnEditTable" ng-repeat="drillDownOption in drillDownOptionList">
     <table class="striped">
         <tbody>
         <fieldset role="radiogroup" radio-group-accessibility>
-            <tr ng-show="childReportFF.length>0">      
+            <tr ng-show="childReportFF.length>0||childReportCol.length>0">     
                <td colspan="2">
-                       <h2>User</h2>
+                       <h2>{{drillDownOption.name}}</h2>
                </td>       
                        </tr>            
                        
-            <tr ng-show="childReportFF.length>0">      
-                <td>
-                       <div class="form-row" role="radio" style="margin-top:0px;">
-                                   <label for="optionsRadios1111" class="radio">
-                                       <input type="radio" ng-model="selectedvalueradioGroup.name" id="optionsRadios1111" name="optionsRadio11" value="noValue" required>
-                                       <i class="skin"></i>
-                                       <span>No Value</span>
-                                   </label>
-                               </div>                
-                </td>
-                               <td style="margin-top:10px;">
-                                       <p>Accept Default</p>
-                               </td>
-            </tr>
             
-            <tr ng-show="childReportFF.length>0">      
+            <tr ng-show="childReportFF.length>0||childReportCol.length>0">     
                 <td>
                        <div class="form-row" role="radio" style="margin-top:0px;">
-                                   <label for="optionsRadios2222" class="radio">
-                                       <input type="radio" ng-model="selectedvalueradioGroup.name" id="optionsRadios2222" name="optionsRadio11" value="fixedValue">
+                                   <label for="optionsRadios2{{$index}}" class="radio">
+                                       <input type="radio" ng-model="drillDownOption.selectedvalueradioGroup.name" id="optionsRadios2{{$index}}" name="optionsRadio2{{$index}}" value="fixedValue">
                                        <i class="skin"></i>
                                        <span>Fixed Value</span>
                                    </label>
                                </div>             
                 </td>
-                <td><input type="text" name="defaultValue" ng-model="fixedValue.value" class="colTableInput"></td>                
+                <td><input type="text" name="defaultValue" ng-model="drillDownOption.fixedValue.value" class="colTableInput"></td>                
             </tr>
             
                                     
-            <tr ng-show="childReportFF.length>0">      
+            <tr ng-show="childReportCol.length>0">     
                 <td>
                        <div class="form-row" role="radio" style="margin-top:0px;">
-                                   <label for="optionsRadios333333" class="radio">
-                                       <input type="radio" ng-model="selectedvalueradioGroup.name" id="optionsRadios333333" name="optionsRadio11" value="reportCol">
+                                   <label for="optionsRadios3{{$index}}" class="radio">
+                                       <input type="radio" ng-model="drillDownOption.selectedvalueradioGroup.name" id="optionsRadios3{{$index}}" name="optionsRadio3{{$index}}" value="reportCol">
                                        <i class="skin"></i>
                                        <span>Value of Column</span>
                                </div>
                 </td>
                                <td>
-                                       <select name="childReportColumn" b2b-dropdown ng-model="selectedChildReportColumn.value" placeholder-text="Select">
+                                       <select name="childReportColumn" b2b-dropdown ng-model="drillDownOption.selectedChildReportColumn.value" placeholder-text="Select">
                                                <option b2b-dropdown-list option-repeat="d in childReportCol" value="{{d.id}}">{{d.name}}</option>
                     </select>
                                </td>
             <tr ng-show="childReportFF.length>0">      
                 <td>
                        <div class="form-row" role="radio" style="margin-top:0px;">
-                               <label for="optionsRadios444444" class="radio">
-                                       <input type="radio" ng-model="selectedvalueradioGroup.name" id="optionsRadios444444" name="optionsRadio11" value="reportFF">
+                               <label for="optionsRadios4{{$index}}" class="radio">
+                                       <input type="radio" ng-model="drillDownOption.selectedvalueradioGroup.name" id="optionsRadios4{{$index}}" name="optionsRadio4{{$index}}" value="reportFF">
                                        <i class="skin"></i>
                                <span>Value of Form Field</span>
                                </div>
                 </td>
                                <td>
-                                       <select name="childReportFormField" b2b-dropdown ng-model="selectedChildReportFormField.value" placeholder-text="Select">
+                                       <select name="childReportFormField" b2b-dropdown ng-model="drillDownOption.selectedChildReportFormField.value" placeholder-text="Select">
                                                <option b2b-dropdown-list option-repeat="d in childReportFF" value="{{d.id}}">{{d.name}}</option>
                     </select>
                                </td>
             </tr> 
 
-            <tr ng-show="childReportFF.length>0">      
-                <td>
-                       <div class="form-row" role="radio" style="margin-top:0px;">
-                                   <label for="optionsRadios5555" class="radio">
-                                       <input type="radio" ng-model="selectedvalueradioGroup.name" id="optionsRadios5555" name="optionsRadio11" value="valueSet" required>
-                                       <i class="skin"></i>
-                                       <span>Value Set</span>
-                                   </label>
-                               </div>                
-                </td>
-                               <td style="margin-top:10px;">
-                                       <p>Pass the value of the selected column if not empty, otherwise pass the value of the selected form field</p>
-                               </td>
-            </tr>
+
                        
              </fieldset>
 
-                       <tr>
-                               <td colspan="2">
-                                       <h2>Parameter values not to be passed to the drill-down report</h2>       
-                               </td>
-                       </tr>            
-
-            <tr>
-                <td class="colTableLeftColumn">Suppress Values</td>
-                <td><input type="text" name="suppressValue" ng-model="suppressValues.value" class="colTableInput"></td>
-            </tr>
 
         </tbody>
       </table>
index 70b2492..e5a04a1 100644 (file)
@@ -80,7 +80,7 @@ body {
            <br><br>
            <button type="submit" style="width: 90px; height:35px;margin-top:20px; margin-left:5px;" class="btn btn-alt btn-small" ng-click="runReport()">Run</button>
          </form>
-         <a type="submit" ng-show="showBackButton"  style="margin: 10px" ng-href="report.htm#/report_run/{{parentReportUrlParams}}" att-button btn-type="primary" size="small" title='Back'>Back</a>
+          <button type="submit" ng-show="showBackButton" style="width: 90px; height:35px;margin-top:20px; margin-left:5px;" class="btn btn-alt btn-small" ng-click="backToParentReport()">Back</button>
          <iframe id="chartiframe" ng-show="showChart" width="100%" height="450px" style="border: none" scrolling="no"></iframe>
          <div id="errorDiv"></div>
          <div  ng-if="showGrid">
index bf5e400..9a0716a 100644 (file)
@@ -163,4 +163,8 @@ p,a{
        left: 0;
        background-color: #222;
        z-index: 9999;
+}
+.left-menu-child
+{
+       margin-left: 37px;
 }
\ No newline at end of file
index 118b0e5..eb4e66c 100644 (file)
@@ -26,7 +26,6 @@ import javax.sql.DataSource;
 
 import org.openecomp.portalsdk.core.interceptor.ResourceInterceptor;
 import org.openecomp.portalsdk.core.interceptor.SessionTimeoutInterceptor;
-import org.openecomp.portalsdk.core.lm.FusionLicenseManager;
 import org.openecomp.portalsdk.core.logging.format.AlarmSeverityEnum;
 import org.openecomp.portalsdk.core.logging.format.AppMessagesEnum;
 import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate;
@@ -66,11 +65,11 @@ public class AppConfig extends WebMvcConfigurerAdapter implements Configurable,
        protected ApplicationContext appApplicationContext = null;
 
        public AppConfig() {
-               //loads all default fields and marks logging
-               //has been started for each log file type.
+               // loads all default fields and marks logging
+               // has been started for each log file type.
                initGlobalLocalContext();
        }
-       
+
        /**
         * Creates and returns a new instance of a secondary (order=2)
         * {@link ViewResolver} that finds files by adding prefix "/WEB-INF/jsp/"
@@ -89,9 +88,8 @@ public class AppConfig extends WebMvcConfigurerAdapter implements Configurable,
        }
 
        /**
-        * Loads all the default logging fields into the 
-        * global MDC context and marks each log file type
-        * that logging has been started.
+        * Loads all the default logging fields into the global MDC context and
+        * marks each log file type that logging has been started.
         */
        private void initGlobalLocalContext() {
                logger.init();
@@ -202,10 +200,14 @@ public class AppConfig extends WebMvcConfigurerAdapter implements Configurable,
                        dataSource.setIdleConnectionTestPeriod(
                                        Integer.parseInt(SystemProperties.getProperty(SystemProperties.IDLE_CONNECTION_TEST_PERIOD)));
                } catch (Exception e) {
-                       logger.error(EELFLoggerDelegate.errorLogger, "Error initializing database, verify database settings in properties file: "
-                                       + UserUtils.getStackTrace(e),AlarmSeverityEnum.CRITICAL);
-                       logger.error(EELFLoggerDelegate.debugLogger, "Error initializing database, verify database settings in properties file: "
-                                       + UserUtils.getStackTrace(e),AlarmSeverityEnum.CRITICAL);
+                       logger.error(EELFLoggerDelegate.errorLogger,
+                                       "Error initializing database, verify database settings in properties file: "
+                                                       + UserUtils.getStackTrace(e),
+                                       AlarmSeverityEnum.CRITICAL);
+                       logger.error(EELFLoggerDelegate.debugLogger,
+                                       "Error initializing database, verify database settings in properties file: "
+                                                       + UserUtils.getStackTrace(e),
+                                       AlarmSeverityEnum.CRITICAL);
                        // Raise an alarm that opening a connection to the database is
                        // failed.
                        logger.logEcompError(AppMessagesEnum.BeDaoSystemError);
@@ -285,24 +287,20 @@ public class AppConfig extends WebMvcConfigurerAdapter implements Configurable,
 
        /**
         * Sets the array of Strings that are paths excluded for session timeout.
+        * 
+        * @param excludeUrlPathsForSessionTimeout
+        *            Paths to exclude
         */
        public void setExcludeUrlPathsForSessionTimeout(final String... excludeUrlPathsForSessionTimeout) {
                this.excludeUrlPathsForSessionTimeout = excludeUrlPathsForSessionTimeout;
        }
 
-       /**
-        * Creates and returns a new instance of a {@link FusionLicenseManager}.
-        * 
-        * @return New instance of {@link FusionLicenseManager}.
-//     @Bean
-       public FusionLicenseManager fusionLicenseManager() {
-               return new FusionLicenseManager(new LicenseableClassImpl());
-       }
-        */
-
        /*
         * (non-Javadoc)
-        * @see org.springframework.context.ApplicationContextAware#setApplicationContext(org.springframework.context.ApplicationContext)
+        * 
+        * @see
+        * org.springframework.context.ApplicationContextAware#setApplicationContext
+        * (org.springframework.context.ApplicationContext)
         */
        @Override
        public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
index 67ac567..87134d3 100644 (file)
@@ -17,9 +17,12 @@ public class SSOUtil {
         * Constructs a path for this server, this app's context, etc.
         * 
         * @param request
+        *            HttpServletRequest
         * @param response
+        *            HttpServletResponse
         * @param forwardPath
-        * @return
+        *            Path to forward user
+        * @return Redirect URL
         */
        public static String getECOMPSSORedirectURL(HttpServletRequest request, HttpServletResponse response,
                        String forwardPath) {
@@ -29,13 +32,11 @@ public class SSOUtil {
                try {
                        encodedAppURL = URLEncoder.encode(appURL, "UTF-8");
                } catch (UnsupportedEncodingException ex) {
-                       logger.error("getECOMPSSORedirectURL: Failed to encode app URL "
-                        + appURL);
+                       logger.error("getECOMPSSORedirectURL: Failed to encode app URL " + appURL);
                }
                String portalURL = PortalApiProperties.getProperty(PortalApiConstants.ECOMP_REDIRECT_URL);
                if (portalURL == null || portalURL.length() == 0) {
-                       logger.error("getECOMPSSORedirectURL: Failed to get property " +
-                        PortalApiConstants.ECOMP_REDIRECT_URL);
+                       logger.error("getECOMPSSORedirectURL: Failed to get property " + PortalApiConstants.ECOMP_REDIRECT_URL);
                        return null;
                }
                String redirectURL = portalURL + "?redirectUrl=" + encodedAppURL;
index e802cff..82d9d8b 100644 (file)
@@ -1,7 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
-       
+
        <!-- ECOMP Portal SDK Maven parent project -->
        <groupId>org.openecomp.ecompsdkos</groupId>
        <artifactId>epsdk-project</artifactId>
        <packaging>pom</packaging>
        <name>ECOMP Portal SDK Project (parent)</name>
        <url>https://wiki.onap.org/display/DW/Portal</url>
-       <scm>
-                       <connection>scm:git:https://gitlab/scm/st_quantum/quantum.git</connection>
-               <developerConnection>scm:git:ssh://git@gitlab/st_quantum/quantum.git</developerConnection>
-               <tag>HEAD</tag>
-  </scm>
 
        <modules>
                <module>epsdk-fw</module>
                <module>epsdk-core</module>
-               <module>epsdk-analytics</module>                
+               <module>epsdk-analytics</module>
                <module>epsdk-workflow</module>
                <module>epsdk-app-common</module>
                <module>epsdk-app-overlay</module>
-               
        </modules>
 
        <properties>
                <encoding>UTF-8</encoding>
                <springframework.version>4.2.0.RELEASE</springframework.version>
                <hibernate.version>4.3.11.Final</hibernate.version>
-               <!-- Tests usually require some setup that maven cannot do, so skip. -->
-               <skiptests>true</skiptests>
                <nexusproxy>https://nexus.onap.org</nexusproxy>
                <snapshotNexusPath>content/repositories/snapshots/</snapshotNexusPath>
                <releaseNexusPath>content/repositories/releases/</releaseNexusPath>
 
        <repositories>
                <repository>
-                       <!-- Releases repository has ECOMP release artifacts -->
-                       <id>ecomp-releases</id>
-                       <name>OpenECOMP - Release Repository</name>
-                       <url>${nexusproxy}/${releaseNexusPath}</url>
-               </repository>
-               <repository>
-                       <!-- Snapshots repository has ECOMP snapshot artifacts -->
-                       <id>ecomp-snapshots</id>
-                       <name>OpenECOMP - Snapshot Repository</name>
-                       <url>${nexusproxy}/${snapshotNexusPath}</url>
-               </repository>
-               <repository>
-                       <id>ecomp-public</id>
-                       <name>ecomp onap public Repository</name>
-                       <url>https://nexus.onap.org/content/groups/public</url>
+                       <!-- Releases repository has ECOMP release artifacts -->
+                       <id>ecomp-releases</id>
+                       <name>OpenECOMP - Release Repository</name>
+                       <url>${nexusproxy}/${releaseNexusPath}</url>
+               </repository>
+               <repository>
+                       <!-- Snapshots repository has ECOMP snapshot artifacts -->
+                       <id>ecomp-snapshots</id>
+                       <name>OpenECOMP - Snapshot Repository</name>
+                       <url>${nexusproxy}/${snapshotNexusPath}</url>
+               </repository>
+               <repository>
+                       <id>ecomp-public</id>
+                       <name>ecomp onap public Repository</name>
+                       <url>https://nexus.onap.org/content/groups/public</url>
                </repository>
        </repositories>
 
                                </plugins>
                        </build>
                </profile>
-    
+
        </profiles>
 
        <build>
                <plugins>
 
-                       <!-- Name the "master" branch -->
-                       <plugin>
-                               <groupId>org.apache.maven.plugins</groupId>
-                               <artifactId>maven-scm-plugin</artifactId>
-                               <version>1.8.1</version>
-                               <configuration>
-                                       <connectionType>developerConnection</connectionType>
-                                       <scmVersionType>branch</scmVersionType>
-                                       <scmVersion>feature/BRANCH_1707</scmVersion>
-                               </configuration>
-                       </plugin>
-
                        <!-- Compile to Java 1.8 class output format -->
                        <plugin>
                                <groupId>org.apache.maven.plugins</groupId>
                                </configuration>
                        </plugin>
 
-                       <!-- Link iteration name with jar version -->
+                       <!-- Include project version in jar -->
                        <plugin>
                                <groupId>org.apache.maven.plugins</groupId>
                                <artifactId>maven-jar-plugin</artifactId>
        </build>
 
        <distributionManagement>
-               <!-- Publish jars to the Nexus Repository - public group -->
-               <!-- The id below must match your .m2/settings.xml/servers/server/id -->
+               <!-- The id below must match .m2/settings.xml/servers/server/id -->
                <repository>
-                       <id>ecomp-releases</id>
-                       <name>OpenECOMP - Release Repository</name>
-                       <url>${nexusproxy}/${releaseNexusPath}</url>
+                       <id>ecomp-releases</id>
+                       <name>OpenECOMP - Release Repository</name>
+                       <url>${nexusproxy}/${releaseNexusPath}</url>
                </repository>
                <snapshotRepository>
-                       <id>ecomp-snapshots</id>
-                       <name>OpenECOMP - Snapshot Repository</name>
-                       <url>${nexusproxy}/${snapshotNexusPath}</url>
+                       <id>ecomp-snapshots</id>
+                       <name>OpenECOMP - Snapshot Repository</name>
+                       <url>${nexusproxy}/${snapshotNexusPath}</url>
                </snapshotRepository>
-               
+               <!-- Javadocs -->
                <site>
-                       <id>ecomp-site</id>
-                       <url>dav:${nexusproxy}${sitePath}</url>
+                       <id>ecomp-site</id>
+                       <url>dav:${nexusproxy}${sitePath}</url>
                </site>
        </distributionManagement>