BeCollegeReady

Init commit

7/31/2018 10:09:15 AM

Changes

config/defaults.js 61(+61 -0)

css/Drawer.scss 95(+95 -0)

css/ie.css 26(+26 -0)

css/main.css 313(+313 -0)

css/main.css.map 7(+7 -0)

css/main.scss 204(+204 -0)

font/simple.eot 0(+0 -0)

font/simple.svg 14(+14 -0)

font/simple.ttf 0(+0 -0)

font/simple.woff 0(+0 -0)

images/books.jpg 0(+0 -0)

index.html 124(+124 -0)

js/CreateGeocoder.js 357(+357 -0)

js/Drawer.js 246(+246 -0)

js/main.js 209(+209 -0)

js/nls/resources.js 36(+36 -0)

js/selectivizr-min.js 261(+261 -0)

js/template.js 281(+281 -0)

README.md 8(+8 -0)

web.config 10(+10 -0)

Details

diff --git a/config/commonConfig.js b/config/commonConfig.js
new file mode 100644
index 0000000..dfd00d7
--- /dev/null
+++ b/config/commonConfig.js
@@ -0,0 +1,35 @@
+define(
+[],
+function() {
+  var config = {
+    bingMapsKey:"Arrzu_Koi7htDRMIwm6kTe0Nqh8FvVdN17blcaJVTEhn87z-tIYJh2LgBNbJS4fv",   
+    units: null,
+    helperServices: {
+       geometry:{
+        url: location.protocol + "//utility.arcgisonline.com/ArcGIS/rest/services/Geometry/GeometryServer"
+       },
+       printTask: {
+        url: location.protocol + "//utility.arcgisonline.com/arcgis/rest/services/Utilities/PrintingTools/GPServer/Export%20Web%20Map%20Task"
+       },
+       elevationSync:{
+         url: location.protocol + "//elevation.arcgis.com/arcgis/rest/services/Tools/ElevationSync/GPServer"
+       },
+       geocode: [{
+        url: location.protocol + "//geocode.arcgis.com/arcgis/rest/services/World/GeocodeServer"
+       }]
+    },
+    queryForOrg: true
+};
+  
+  // could use a has() test to optionally populate some global
+  // property so that the stuff defined is in some global identifier
+  //
+  // instead, just populate a global, will need to remove the next line when
+  // when we remove support for loading modules with dojo.require
+  // which will be when we move to Dojo 2.0
+  commonConfig = config;
+  // instead of using a global, this should probably be added to some namespace...
+  // do the templates have a common namespace that they use?
+
+  return config;  
+});

config/defaults.js 61(+61 -0)

diff --git a/config/defaults.js b/config/defaults.js
new file mode 100644
index 0000000..de7b35d
--- /dev/null
+++ b/config/defaults.js
@@ -0,0 +1,61 @@
+define([], function() {
+    //Default configuration settings for the application. This is where you'll define things like a bing maps key,
+    //default web map, default app color theme and more. These values can be overwritten by template configuration settings
+    //and url parameters.
+    var aboutContent = '';
+    if(document.querySelector('#hidden-sidebar')) {
+      aboutContent = document.querySelector('#hidden-sidebar').innerHTML;
+    }
+    var defaults = {
+        "appid": "",
+        "webmap": "b8e87d8ced674513a19aedd65be72eee",
+        "oauthappid": null, //"AFTKRmv16wj14N3z",
+        //Group templates must support a group url parameter. This will contain the id of the group.
+        //group: "",
+        //Enter the url to the proxy if needed by the application. See the 'Using the proxy page' help topic for details
+        //http://developers.arcgis.com/en/javascript/jshelp/ags_proxy.html
+        "proxyurl": "",
+        //Color defines the text color for the menu icon and title that appear in the title bar.
+        "color": "#F9CC07",
+        //Theme defines the background color of the title bar and also the background color of the popup
+        //title bar.
+        "theme": "#1C1D20",
+        //Specify the color used for the closeable drawer titles.
+        "paneltheme": "#333333",
+        "bingmapskey": "", //Enter the url to your organizations bing maps key if you want to use bing basemaps
+        //Defaults to arcgis.com. Set this value to your portal or organization host name.
+        "sharinghost": "http:" + "//" + "geo.maps.arcgis.com",
+        //When true the template will query arcgis.com for default settings for helper services, units etc. If you
+        //want to use custom settings for units or any of the helper services set queryForOrg to false then enter
+        //default values for any items you need using the helper services and units properties.
+        "queryForOrg": true,
+        "units": null,
+        //Enter text here that will display in the title section.
+        //If not specified the web map title is used.
+        "title": "Oregon College Savings Statewide and County Overview",
+        //Enter text here that will display in the about panel
+        //If not specified the web map description is used.
+        //When true the locate button is displayed on the map.
+        "about": aboutContent,
+        "locate": true,
+        //When true the home button is displayed on the map.
+        "home": true,
+        //When true the geocoder search box is displayed in the title area
+        "search": true,
+        "helperServices": {
+           "geometry":{
+            "url": null
+           },
+           "printTask": {
+            "url": null
+           },
+           "elevationSync":{
+             "url": null
+           },
+           "geocode": [{
+            "url": null
+           }]
+        }
+    };
+    return defaults;
+});
diff --git a/configurationPanel.js b/configurationPanel.js
new file mode 100644
index 0000000..ff9130d
--- /dev/null
+++ b/configurationPanel.js
@@ -0,0 +1,63 @@
+{
+    "configurationSettings": [{
+        "category": "<b>Configure template</b>",
+        "fields": [{
+            "type": "webmap"
+        },{
+            "placeHolder": "Defaults to web map title",
+            "label": "Title:",
+            "fieldName": "title",
+            "type": "string",
+            "tooltip": "Defaults to web map title"
+        }, {
+            "type": "color",
+            "fieldName": "theme",
+            "tooltip": "Color theme to use",
+            "label": "Color Theme:"
+        },{
+            "type": "color",
+            "fieldName": "color",
+            "tooltip": "Text color",
+            "label": "Text Color:"
+        },{
+            "type": "color",
+            "fieldName": "paneltheme",
+            "tooltip": "Color theme for the drawer",
+            "label": "Drawer Title Theme:"
+        },
+        {
+               "type":"string",
+               "fieldName":"about",
+               "label":"Description",
+               "tooltip":"Enter content for the description panel",
+               "stringFieldOption":"richtext"
+            }
+    ]
+    },{
+        "category": "Tools",
+        "fields":[
+            {
+                "type": "boolean",
+                "fieldName": "search",
+                "label": "Address Finder"
+            },{
+                "type": "boolean",
+                "fieldName": "locate",
+                "label": "Find Location"
+            },{
+                "type": "boolean",
+                "fieldName": "home",
+                "label": "Home Extent Button"
+            }
+        ]
+
+    }],
+    "values": {
+        "search": true,
+        "locate": true,
+        "color": "#2f4f4f",
+        "theme": "#949494",
+        "paneltheme": "#ededed"
+
+    }
+}
diff --git a/css/.sass-cache/2592f85d9e73b592f080b65ade72dffccfdb3337/Drawer.scssc b/css/.sass-cache/2592f85d9e73b592f080b65ade72dffccfdb3337/Drawer.scssc
new file mode 100644
index 0000000..e3d5d12
Binary files /dev/null and b/css/.sass-cache/2592f85d9e73b592f080b65ade72dffccfdb3337/Drawer.scssc differ
diff --git a/css/.sass-cache/2592f85d9e73b592f080b65ade72dffccfdb3337/main.scssc b/css/.sass-cache/2592f85d9e73b592f080b65ade72dffccfdb3337/main.scssc
new file mode 100644
index 0000000..5e9b1a7
Binary files /dev/null and b/css/.sass-cache/2592f85d9e73b592f080b65ade72dffccfdb3337/main.scssc differ
diff --git a/css/.sass-cache/2592f85d9e73b592f080b65ade72dffccfdb3337/template_mixin.scssc b/css/.sass-cache/2592f85d9e73b592f080b65ade72dffccfdb3337/template_mixin.scssc
new file mode 100644
index 0000000..e86e59a
Binary files /dev/null and b/css/.sass-cache/2592f85d9e73b592f080b65ade72dffccfdb3337/template_mixin.scssc differ

css/Drawer.scss 95(+95 -0)

diff --git a/css/Drawer.scss b/css/Drawer.scss
new file mode 100644
index 0000000..5ff596d
--- /dev/null
+++ b/css/Drawer.scss
@@ -0,0 +1,95 @@
+/* Drawer */
+@import "template_mixin.scss";
+.top-bar {
+    position: absolute;
+    z-index: 36;
+    top: 0;
+    left: 0;
+    width: 100%;
+    height: 34px;
+    color: $font-color-light;
+}
+
+.esriRTL .top-bar {
+    right: 0;
+}
+.top-bar-title{
+    display:none;
+    font-size:1.2em;
+    overflow: hidden;
+    margin-left:40px;
+    margin-top:6px;
+    max-width:50%;
+    white-space: nowrap;
+    text-overflow: ellipsis;
+    @include respond-to(760){
+        display:block;
+    }
+
+}
+.esriRTL .top-bar-title{
+    float:right;
+    padding-right:10px;
+}
+.hamburger-button {
+    position:absolute;
+    top:9px;
+    left:2px;
+    cursor: pointer;
+}
+
+.hamburger-button:hover{
+    @include opacity(0.3);
+}
+.esriRTL .hamburger-button {
+    float:right;
+    right:5px;
+}
+
+.border-container-outer {
+    width: 100%;
+    height: 100%;
+    padding: 0;
+    margin: 0;
+    border: 0;
+    overflow: hidden;
+}
+
+.content-pane-left {
+    width: 0px;
+    max-width: $panel-width;
+    height: 100%;
+    padding: 0;
+    margin: 0;
+    border: 0;
+    background: #fff;
+    overflow: hidden;
+    @include transition(width, 250ms, ease);
+
+}
+
+.app-loading .content-pane-left {
+    width: 0;
+}
+
+.drawer-open .content-pane-left {
+    width: 400px;
+    overflow: auto;
+    overflow-x: hidden;
+    border-right: 1px solid $border-color;
+}
+
+.esriRTL .drawer-open .content-pane-left {
+    border-right: 0;
+    border-left: 1px solid $border-color;
+}
+
+.content-pane-center {
+    width: 100%;
+    height: 100%;
+    padding: 0;
+    margin: 0;
+    border: 0;
+}
+
+

css/ie.css 26(+26 -0)

diff --git a/css/ie.css b/css/ie.css
new file mode 100644
index 0000000..6d8f424
--- /dev/null
+++ b/css/ie.css
@@ -0,0 +1,26 @@
+.ac-container input:checked + label:after {
+    content: none;
+}
+
+.ac-container label {
+    cursor: default;
+}
+
+.esriSimpleSlider {
+    display: block;
+}
+
+#homeDiv {
+    position: absolute;
+    top: 125px;
+    left: 4px;
+    z-index: 50;
+}
+
+#search {
+    display: block;
+}
+
+.top-bar-title {
+    display: block
+}

css/main.css 313(+313 -0)

diff --git a/css/main.css b/css/main.css
new file mode 100644
index 0000000..39de247
--- /dev/null
+++ b/css/main.css
@@ -0,0 +1,313 @@
+@charset "UTF-8";
+/* Main Application */
+/* Custom Theme Edits */
+/* Drawer */
+/* Custom Theme Edits */
+h1.heading {
+  font-size: 18px;
+  text-decoration: underline;
+  margin: 0 0 5px 0
+}
+
+.top-bar {
+  position: absolute;
+  z-index: 36;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 34px;
+  color: #fff; }
+
+.esriRTL .top-bar {
+  right: 0; }
+
+.top-bar-title {
+  display: none;
+  font-size: 1.2em;
+  overflow: hidden;
+  margin-left: 40px;
+  margin-top: 6px;
+  max-width: 60%;
+  white-space: nowrap;
+  text-overflow: ellipsis; }
+  @media only screen and (min-width: 760px) {
+    .top-bar-title {
+      display: block; } }
+
+.esriRTL .top-bar-title {
+  float: right;
+  padding-right: 10px; }
+
+.hamburger-button {
+  position: absolute;
+  top: 9px;
+  left: 2px;
+  cursor: pointer; }
+
+.hamburger-button:hover {
+  opacity: 0.3;
+  filter: alpha(opacity=30); }
+
+.esriRTL .hamburger-button {
+  float: right;
+  right: 5px; }
+
+.border-container-outer {
+  width: 100%;
+  height: 100%;
+  padding: 0;
+  margin: 0;
+  border: 0;
+  overflow: hidden; }
+
+.content-pane-left {
+  width: 0px;
+  max-width: 400px;
+  height: 100%;
+  padding: 0;
+  margin: 0;
+  border: 0;
+  background: #fff;
+  overflow: hidden;
+  -webkit-transition: width 250ms ease;
+  -moz-transition: width 250ms ease;
+  -ms-transition: width 250ms ease;
+  -o-transition: width 250ms ease;
+  transition: width 250ms ease; }
+
+.app-loading .content-pane-left {
+  width: 0; }
+
+.drawer-open .content-pane-left {
+  width: 400px;
+  overflow: auto;
+  overflow-x: hidden;
+  border-right: 1px solid #ddd; }
+
+.esriRTL .drawer-open .content-pane-left {
+  border-right: 0;
+  border-left: 1px solid #ddd; }
+
+.content-pane-center {
+  width: 100%;
+  height: 100%;
+  padding: 0;
+  margin: 0;
+  border: 0; }
+
+html, body {
+  padding: 0;
+  margin: 0;
+  height: 100%;
+  width: 100%;
+  font-family: Arial,Helvetica,sans-serif;
+  color: #545454; }
+
+.ac-label {
+  background-color: #4C8140; }
+
+#mapDiv {
+  padding: 0;
+  margin: 0;
+  width: 100%;
+  height: 100%; }
+
+.hidden {
+  display: none; }
+
+.ac-container {
+  width: 400px; }
+
+.ac-container label {
+  padding: 2px 20px;
+  position: relative;
+  z-index: 20;
+  display: block;
+  height: 30px;
+  cursor: pointer;
+  color: #333;
+  line-height: 33px;
+  font-size: 1.2em;
+  font-weight: 500;
+  background-color: transparent;
+  background-color: rgba(163, 163, 163, 0.5);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#80A3A3A3,endColorstr=#80A3A3A3);
+  zoom: 1; }
+
+.ac-container label:hover {
+  background-color: transparent;
+  background-color: rgba(189, 189, 189, 0.5);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#80BDBDBD,endColorstr=#80BDBDBD);
+  zoom: 1; }
+
+.esriRTL .ac-container label {
+  float: right; }
+
+.ac-container label:after,
+.ac-container input:checked + label:after {
+  font-family: "simple";
+  font-style: normal;
+  font-weight: normal;
+  content: '\e803';
+  /*down arrow*/
+  position: absolute;
+  right: 25px;
+  cursor: pointer; }
+
+.ac-container input:checked + label:after {
+  content: '\e804';
+  /*up arrow*/
+  cursor: pointer; }
+
+.ac-container input {
+  display: none; }
+
+.ac-container .article {
+  background-color: transparent;
+  background-color: rgba(255, 255, 255, 0.5);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#80FFFFFF,endColorstr=#80FFFFFF);
+  zoom: 1;
+  margin-top: -1px;
+  overflow: hidden;
+  height: 0;
+  position: relative;
+  z-index: 10;
+  -webkit-transition: height 0.3s ease-in-out;
+  -moz-transition: height 0.3s ease-in-out;
+  -ms-transition: height 0.3s ease-in-out;
+  -o-transition: height 0.3s ease-in-out;
+  transition: height 0.3s ease-in-out;
+  -webkit-transition: box-shadow 0.6s linear;
+  -moz-transition: box-shadow 0.6s linear;
+  -ms-transition: box-shadow 0.6s linear;
+  -o-transition: box-shadow 0.6s linear;
+  transition: box-shadow 0.6s linear;
+  /*transition:
+      height 0.3s ease-in-out,
+      box-shadow 0.6s linear;*/ }
+
+.ac-container input:checked ~ div.ac-medium, .ac-container input:checked ~ div.ac-large {
+  -webkit-transition: height 0.5s ease-in-out;
+  -moz-transition: height 0.5s ease-in-out;
+  -ms-transition: height 0.5s ease-in-out;
+  -o-transition: height 0.5s ease-in-out;
+  transition: height 0.5s ease-in-out;
+  -webkit-transition: box-shadow 0.1s linear;
+  -moz-transition: box-shadow 0.1s linear;
+  -ms-transition: box-shadow 0.1s linear;
+  -o-transition: box-shadow 0.1s linear;
+  transition: box-shadow 0.1s linear;
+  /*transition:
+      height 0.5s ease-in-out,
+      box-shadow 0.1s linear;*/ }
+
+.simpleGeocoder .esriGeocoderMenu {
+  color: #333; }
+
+.ac-container input:checked ~ div.ac-medium {
+  height: 20%; }
+
+.ac-container input:checked ~ div.ac-large {
+  height: 80%; }
+
+.calcite label {
+  margin-bottom: 0 !important; }
+
+.panel_content {
+  padding: 10px;
+  max-width: 360px;
+  font-size: 13px; }
+
+.esriSimpleSlider {
+  display: none;
+  left: 2px; }
+  @media only screen and (min-width: 850px) {
+    .esriSimpleSlider {
+      display: block; } }
+
+#search {
+  position: absolute;
+  top: 0;
+  padding: 2px 4px;
+  right: 8px; }
+
+.open-drawer {
+  /*Hide geocoder for small screen sizes when drawer is open*/
+  display: none; }
+  @media only screen and (min-width: 450px) {
+    .open-drawer {
+      display: block; } }
+
+/* Esri Jvascript API*/
+.simpleGeocoder .esriGeocoderResult {
+  color: #333; }
+
+.esriPopup .pointer.bottom, .esriPopup .pointer.bottomLeft, .esriPopup .pointer.bottomRight {
+  background: #f7f7f7 !important; }
+
+#locateDiv {
+  position: absolute;
+  top: 55px;
+  left: 4px;
+  z-index: 50; }
+  @media only screen and (min-width: 850px) {
+    #locateDiv {
+      top: 130px; } }
+
+#homeDiv {
+  position: absolute;
+  top: 100px;
+  left: 4px;
+  z-index: 50; }
+  @media only screen and (min-width: 850px) {
+    #homeDiv {
+      top: 175px; } }
+
+.esriSimpleSlider {
+  top: 55px;
+  left: 4px; }
+
+@font-face {
+  font-family: 'simple';
+  src: url("../font/simple.eot?14672126");
+  src: url("../font/simple.eot?14672126#iefix") format("embedded-opentype"), url("../font/simple.woff?14672126") format("woff"), url("../font/simple.ttf?14672126") format("truetype"), url("../font/simple.svg?14672126#simple") format("svg");
+  font-weight: normal;
+  font-style: normal; }
+[class^="icon-"]:before, [class*=" icon-"]:before {
+  font-family: "simple";
+  font-style: normal;
+  font-weight: normal;
+  speak: none;
+  display: inline-block;
+  text-decoration: inherit;
+  width: 1em;
+  margin-right: .2em;
+  text-align: center;
+  /* opacity: .8; */
+  /* For safety - reset parent styles, that can break glyph codes*/
+  font-variant: normal;
+  text-transform: none;
+  /* fix buttons height, for twitter bootstrap */
+  line-height: 1em;
+  /* Animation center compensation - margins should be symmetric */
+  /* remove if not needed */
+  margin-left: .2em;
+  /* you can be more comfortable with increased icons size */
+  /* font-size: 120%; */
+  /* Uncomment for 3D effect */
+  /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */ }
+
+.icon-menu:before {
+  content: '\e801'; }
+
+/* 'εáü' */
+.icon-down-open:before {
+  content: '\e803'; }
+
+/* 'εáâ' */
+.icon-up-open:before {
+  content: '\e804'; }
+
+/* 'εáä' */
+
+/*# sourceMappingURL=main.css.map */

css/main.css.map 7(+7 -0)

diff --git a/css/main.css.map b/css/main.css.map
new file mode 100644
index 0000000..b7e15f4
--- /dev/null
+++ b/css/main.css.map
@@ -0,0 +1,7 @@
+{
+"version": 3,
+"mappings": ";;;;;AAEA,QAAS;EACL,QAAQ,EAAE,QAAQ;EAClB,OAAO,EAAE,EAAE;EACX,GAAG,EAAE,CAAC;EACN,IAAI,EAAE,CAAC;EACP,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,KAAK,ECJS,IAAI;;ADOtB,iBAAkB;EACd,KAAK,EAAE,CAAC;;AAEZ,cAAc;EACV,OAAO,EAAC,IAAI;EACZ,SAAS,EAAC,KAAK;EACf,QAAQ,EAAE,MAAM;EAChB,WAAW,EAAC,IAAI;EAChB,UAAU,EAAC,GAAG;EACd,SAAS,EAAC,GAAG;EACb,WAAW,EAAE,MAAM;EACnB,aAAa,EAAE,QAAQ;ECmBvB,yCAAqD;ID3BzD,cAAc;MAUN,OAAO,EAAC,KAAK;;AAIrB,uBAAuB;EACnB,KAAK,EAAC,KAAK;EACX,aAAa,EAAC,IAAI;;AAEtB,iBAAkB;EACd,QAAQ,EAAC,QAAQ;EACjB,GAAG,EAAC,GAAG;EACP,IAAI,EAAC,GAAG;EACR,MAAM,EAAE,OAAO;;AAGnB,uBAAuB;ECiBrB,OAAO,EDhBY,GAAG;ECkBtB,MAAM,EAAE,iBAA0B;;ADhBpC,0BAA2B;EACvB,KAAK,EAAC,KAAK;EACX,KAAK,EAAC,GAAG;;AAGb,uBAAwB;EACpB,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,CAAC;EACV,MAAM,EAAE,CAAC;EACT,MAAM,EAAE,CAAC;EACT,QAAQ,EAAE,MAAM;;AAGpB,kBAAmB;EACf,KAAK,EAAE,GAAG;EACV,SAAS,ECrDC,KAAK;EDsDf,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,CAAC;EACV,MAAM,EAAE,CAAC;EACT,MAAM,EAAE,CAAC;EACT,UAAU,EAAE,IAAI;EAChB,QAAQ,EAAE,MAAM;EC9BhB,kBAAkB,EAAE,gBAA6C;EACjE,eAAe,EAAE,gBAA6C;EAC9D,cAAc,EAAE,gBAA6C;EAC7D,aAAa,EAAE,gBAA6C;EAC5D,UAAU,EAAE,gBAA6C;;AD+B7D,+BAAgC;EAC5B,KAAK,EAAE,CAAC;;AAGZ,+BAAgC;EAC5B,KAAK,EAAE,KAAK;EACZ,QAAQ,EAAE,IAAI;EACd,UAAU,EAAE,MAAM;EAClB,YAAY,EAAE,cAAuB;;AAGzC,wCAAyC;EACrC,YAAY,EAAE,CAAC;EACf,WAAW,EAAE,cAAuB;;AAGxC,oBAAqB;EACjB,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,CAAC;EACV,MAAM,EAAE,CAAC;EACT,MAAM,EAAE,CAAC;;AExFb,UAAU;EACN,OAAO,EAAE,CAAC;EACV,MAAM,EAAE,CAAC;EACT,MAAM,EAAE,IAAI;EACZ,KAAK,EAAE,IAAI;EACX,WAAW,EAAE,0BAA0B;EACvC,KAAK,EDNI,OAAO;;ACSpB,SAAU;EACR,gBAAgB,EAAG,OAAO;;AAE5B,OAAQ;EACJ,OAAO,EAAE,CAAC;EACV,MAAM,EAAE,CAAC;EACT,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;;AAEhB,OAAO;EACH,OAAO,EAAC,IAAI;;AAGhB,aAAa;EACT,KAAK,EDzBK,KAAK;;AC2BnB,mBAAmB;EACf,OAAO,EAAC,QAAQ;EAChB,QAAQ,EAAC,QAAQ;EACjB,OAAO,EAAC,EAAE;EACV,OAAO,EAAC,KAAK;EACb,MAAM,EAAC,IAAI;EACX,MAAM,EAAC,OAAO;EACd,KAAK,ED/BS,IAAI;ECgClB,WAAW,EAAC,IAAI;EAChB,SAAS,EAAC,KAAK;EACf,WAAW,EAAC,GAAG;EDTjB,gBAAgB,EAAE,WAAW;EAC7B,gBAAgB,EAHT,wBAAoB;EAI3B,MAAM,EAAC,yFAAmG;EAC1G,IAAI,EAAE,CAAC;;ACST,yBAAyB;EDZvB,gBAAgB,EAAE,WAAW;EAC7B,gBAAgB,EAHT,wBAAoB;EAI3B,MAAM,EAAC,yFAAmG;EAC1G,IAAI,EAAE,CAAC;;ACYT,4BAA4B;EACxB,KAAK,EAAC,KAAK;;AAGf;yCACyC;EACrC,WAAW,EAAE,QAAQ;EACrB,UAAU,EAAE,MAAM;EAClB,WAAW,EAAE,MAAM;EACnB,OAAO,EAAE,OAAO;;EAChB,QAAQ,EAAE,QAAQ;EAClB,KAAK,EAAE,IAAI;EACX,MAAM,EAAC,OAAO;;AAGlB,yCAAyC;EACrC,OAAO,EAAE,OAAO;;EAChB,MAAM,EAAC,OAAO;;AAIlB,mBAAmB;EACf,OAAO,EAAE,IAAI;;AAEjB,sBAAsB;EDvCpB,gBAAgB,EAAE,WAAW;EAC7B,gBAAgB,EAHT,wBAAoB;EAI3B,MAAM,EAAC,yFAAmG;EAC1G,IAAI,EAAE,CAAC;ECsCL,UAAU,EAAE,IAAI;EAChB,QAAQ,EAAE,MAAM;EAChB,MAAM,EAAE,CAAC;EACT,QAAQ,EAAE,QAAQ;EAClB,OAAO,EAAE,EAAE;EDvCX,kBAAkB,EAAE,uBAA6C;EACjE,eAAe,EAAE,uBAA6C;EAC9D,cAAc,EAAE,uBAA6C;EAC7D,aAAa,EAAE,uBAA6C;EAC5D,UAAU,EAAE,uBAA6C;EAJzD,kBAAkB,EAAE,sBAA6C;EACjE,eAAe,EAAE,sBAA6C;EAC9D,cAAc,EAAE,sBAA6C;EAC7D,aAAa,EAAE,sBAA6C;EAC5D,UAAU,EAAE,sBAA6C;;;;;AC2C7D,uFAAuF;ED/CnF,kBAAkB,EAAE,uBAA6C;EACjE,eAAe,EAAE,uBAA6C;EAC9D,cAAc,EAAE,uBAA6C;EAC7D,aAAa,EAAE,uBAA6C;EAC5D,UAAU,EAAE,uBAA6C;EAJzD,kBAAkB,EAAE,sBAA6C;EACjE,eAAe,EAAE,sBAA6C;EAC9D,cAAc,EAAE,sBAA6C;EAC7D,aAAa,EAAE,sBAA6C;EAC5D,UAAU,EAAE,sBAA6C;;;;;ACmD7D,iCAAiC;EAC7B,KAAK,EAAE,IAAI;;AAEf,2CAA2C;EACvC,MAAM,EAAE,GAAG;;AAEf,0CAA0C;EACtC,MAAM,EAAE,GAAG;;AAEf,cAAc;EACV,aAAa,EAAC,YAAY;;AAG9B,cAAc;EACV,OAAO,EAAC,IAAI;EACZ,SAAS,EAAC,KAAiB;EAC3B,SAAS,EDnGK,IAAI;;ACqGtB,iBAAiB;EACb,OAAO,EAAC,IAAI;EACZ,IAAI,EAAC,GAAG;EDpER,yCAAqD;ICkEzD,iBAAiB;MAIT,OAAO,EAAC,KAAK;;AAGrB,OAAO;EACH,QAAQ,EAAC,QAAQ;EACjB,GAAG,EAAC,CAAC;EACL,OAAO,EAAC,OAAO;EACf,KAAK,EAAC,GAAG;;AAGb,YAAY;;EAER,OAAO,EAAC,IAAI;EDlFZ,yCAAqD;ICgFzD,YAAY;MAIP,OAAO,EAAC,KAAK;;;AAIlB,mCAAmC;EACjC,KAAK,EAAC,IAAI;;AAEZ,2FAA4F;EACxF,UAAU,EAAE,kBAAkB;;AAElC,UAAU;EACN,QAAQ,EAAE,QAAQ;EAClB,GAAG,EAAC,IAAI;EACR,IAAI,EAAC,GAAG;EACR,OAAO,EAAE,EAAE;EDlGX,yCAAqD;IC8FzD,UAAU;MAMF,GAAG,EAAC,KAAK;;AAIjB,QAAQ;EACN,QAAQ,EAAC,QAAQ;EACjB,GAAG,EAAC,KAAK;EACT,IAAI,EAAC,GAAG;EACR,OAAO,EAAC,EAAE;ED5GR,yCAAqD;ICwGzD,QAAQ;MAMJ,GAAG,EAAC,KAAK;;AAGb,iBAAkB;EACd,GAAG,EAAE,IAAI;EACT,IAAI,EAAC,GAAG;;AAEZ,UASC;EARC,WAAW,EAAE,QAAQ;EACrB,GAAG,EAAE,kCAAkC;EACvC,GAAG,EAAE,wOAAoE;EAIzE,WAAW,EAAE,MAAM;EACnB,UAAU,EAAE,MAAM;AAGnB,iDAAkD;EACjD,WAAW,EAAE,QAAQ;EACrB,UAAU,EAAE,MAAM;EAClB,WAAW,EAAE,MAAM;EACnB,KAAK,EAAE,IAAI;EAEX,OAAO,EAAE,YAAY;EACrB,eAAe,EAAE,OAAO;EACxB,KAAK,EAAE,GAAG;EACV,YAAY,EAAE,IAAI;EAClB,UAAU,EAAE,MAAM;;;EAIlB,YAAY,EAAE,MAAM;EACpB,cAAc,EAAE,IAAI;;EAGpB,WAAW,EAAE,GAAG;;;EAIhB,WAAW,EAAE,IAAI;;;;;;AASnB,iBAAkB;EAAE,OAAO,EAAE,OAAO;;;AACpC,sBAAuB;EAAE,OAAO,EAAE,OAAO;;;AACzC,oBAAqB;EAAE,OAAO,EAAE,OAAO",
+"sources": ["Drawer.scss","template_mixin.scss","main.scss"],
+"names": [],
+"file": "main.css"
+}
\ No newline at end of file

css/main.scss 204(+204 -0)

diff --git a/css/main.scss b/css/main.scss
new file mode 100644
index 0000000..56e1482
--- /dev/null
+++ b/css/main.scss
@@ -0,0 +1,204 @@
+/* Main Application */
+@import "template_mixin.scss";
+@import "Drawer.scss";
+html,body {
+    padding: 0;
+    margin: 0;
+    height: 100%;
+    width: 100%;
+    font-family: Arial,Helvetica,sans-serif;
+    color: $font-color;
+}
+
+.ac-label {
+  background-color : #4C8140;
+}
+#mapDiv {
+    padding: 0;
+    margin: 0;
+    width: 100%;
+    height: 100%;
+}
+.hidden{
+    display:none;
+}
+
+.ac-container{
+    width:$drawer-width;
+}
+.ac-container label{
+    padding:2px 20px;
+    position:relative;
+    z-index:20;
+    display:block;
+    height:30px;
+    cursor:pointer;
+    color: $font-color-dark;
+    line-height:33px;
+    font-size:1.2em;
+    font-weight:500;
+    @include transparent(rgb(163,163,163), 0.5); 
+}
+.ac-container label:hover{
+     @include transparent(rgb(189,189,189), 0.5);
+}
+.esriRTL .ac-container label{
+    float:right;
+}
+
+.ac-container label:after,
+.ac-container input:checked + label:after{
+    font-family: "simple";
+    font-style: normal;
+    font-weight: normal;
+    content: '\e803'; /*down arrow*/
+    position: absolute;
+    right: 25px;
+    cursor:pointer;
+}
+
+.ac-container input:checked + label:after{
+    content: '\e804'; /*up arrow*/
+    cursor:pointer;
+}
+
+
+.ac-container input{
+    display: none;
+}
+.ac-container .article{
+    @include transparent(rgb(255,255,255), 0.5);
+    margin-top: -1px;
+    overflow: hidden;
+    height: 0;
+    position: relative;
+    z-index: 10;
+    @include transition(height, 0.3s, ease-in-out);
+    @include transition(box-shadow, 0.6s, linear);
+    /*transition: 
+        height 0.3s ease-in-out, 
+        box-shadow 0.6s linear;*/
+}
+
+.ac-container input:checked ~ div.ac-medium, .ac-container input:checked ~ div.ac-large{
+    @include transition(height, 0.5s, ease-in-out);
+    @include transition(box-shadow, 0.1s, linear);
+    /*transition: 
+        height 0.5s ease-in-out, 
+        box-shadow 0.1s linear;*/
+
+}
+.simpleGeocoder .esriGeocoderMenu{
+    color: #333;
+}
+.ac-container input:checked ~ div.ac-medium{
+    height: 20%;
+}
+.ac-container input:checked ~ div.ac-large{
+    height: 80%;
+}
+.calcite label{
+    margin-bottom:0 !important;
+}
+
+.panel_content{
+    padding:10px;
+    max-width:$panel-width - 40;
+    font-size: $panel-font-size;
+}
+.esriSimpleSlider{
+    display:none;
+    left:2px;
+    @include respond-to(850){
+        display:block;
+    }
+}
+#search{
+    position:absolute;
+    top:0;
+    padding:2px 4px;
+    right:8px;
+}
+
+.open-drawer{
+ /*Hide geocoder for small screen sizes when drawer is open*/
+    display:none;
+    @include respond-to(450){
+     display:block;
+    }
+}
+/* Esri Jvascript API*/
+.simpleGeocoder .esriGeocoderResult{
+  color:#333;
+}
+.esriPopup .pointer.bottom , .esriPopup .pointer.bottomLeft, .esriPopup .pointer.bottomRight{
+    background: #f7f7f7 !important;
+}
+#locateDiv{
+    position: absolute;
+    top:55px;
+    left:4px;
+    z-index: 50;
+    @include respond-to(850){
+        top:130px;
+    }
+}
+
+#homeDiv{
+  position:absolute;
+  top:100px;
+  left:4px;
+  z-index:50;
+  @include respond-to(850){
+    top:175px;
+  }
+}
+.esriSimpleSlider {
+    top: 55px;
+    left:4px;
+}
+@font-face {
+  font-family: 'simple';
+  src: url('../font/simple.eot?14672126');
+  src: url('../font/simple.eot?14672126#iefix') format('embedded-opentype'),
+       url('../font/simple.woff?14672126') format('woff'),
+       url('../font/simple.ttf?14672126') format('truetype'),
+       url('../font/simple.svg?14672126#simple') format('svg');
+  font-weight: normal;
+  font-style: normal;
+}
+ 
+ [class^="icon-"]:before, [class*=" icon-"]:before {
+  font-family: "simple";
+  font-style: normal;
+  font-weight: normal;
+  speak: none;
+ 
+  display: inline-block;
+  text-decoration: inherit;
+  width: 1em;
+  margin-right: .2em;
+  text-align: center;
+  /* opacity: .8; */
+ 
+  /* For safety - reset parent styles, that can break glyph codes*/
+  font-variant: normal;
+  text-transform: none;
+     
+  /* fix buttons height, for twitter bootstrap */
+  line-height: 1em;
+ 
+  /* Animation center compensation - margins should be symmetric */
+  /* remove if not needed */
+  margin-left: .2em;
+ 
+  /* you can be more comfortable with increased icons size */
+  /* font-size: 120%; */
+ 
+  /* Uncomment for 3D effect */
+  /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */
+}
+ 
+.icon-menu:before { content: '\e801'; } /* '' */
+.icon-down-open:before { content: '\e803'; } /* '' */
+.icon-up-open:before { content: '\e804'; } /* '' */
\ No newline at end of file
diff --git a/css/template_mixin.scss b/css/template_mixin.scss
new file mode 100644
index 0000000..1731ddf
--- /dev/null
+++ b/css/template_mixin.scss
@@ -0,0 +1,65 @@
+$theme-color: #fff;
+$drawer-width:400px;
+$border-color: #ddd;
+$font-color: #545454;
+$font-color-dark: #333;
+$font-color-light:#fff;
+$panel-width: 400px;
+$panel-font-size: 13px;
+
+/* Custom Theme Edits */
+$nav-background-dark:#1C1D20;
+
+@mixin fontFace($family,$src,$weight: normal,$style: normal) {
+    @font-face {
+        font-family: $family;
+        src: url('#{$src}.eot'); // IE9 compat
+        src: url('#{$src}.eot?#iefix') format('embedded-opentype'), // IE8 and below
+            url('#{$src}.woff') format('woff'), // standards
+            url('#{$src}.ttf') format('truetype'), // Safari, Android, iOS
+            url('#{$src}.svg##{$family}') format('svg'); // legacy iOS
+
+        font-style: $style;
+        font-weight: $weight;
+    }
+}
+
+@mixin transparent($color, $alpha) {
+  $rgba: rgba($color, $alpha);
+  $ie-hex-str: ie-hex-str($rgba);
+  background-color: transparent;
+  background-color: $rgba;
+  filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#{$ie-hex-str},endColorstr=#{$ie-hex-str});
+  zoom: 1;
+}
+@mixin transition($transition-property, $transition-time, $method) {
+    -webkit-transition: $transition-property $transition-time $method;
+    -moz-transition: $transition-property $transition-time $method;
+    -ms-transition: $transition-property $transition-time $method;
+    -o-transition: $transition-property $transition-time $method;
+    transition: $transition-property $transition-time $method;
+}
+@mixin respond-to($breakpoint) {
+    @media only screen and (min-width: $breakpoint + px) { @content; }
+}
+
+@mixin box-shadow($top, $left, $blur, $color, $inset: false) {
+  @if $inset {
+    -webkit-box-shadow:inset $top $left $blur $color;
+    -moz-box-shadow:inset $top $left $blur $color;
+    box-shadow:inset $top $left $blur $color;
+  } @else {
+    -webkit-box-shadow: $top $left $blur $color;
+    -moz-box-shadow: $top $left $blur $color;
+    box-shadow: $top $left $blur $color;
+  }
+}
+@mixin opacity($opacity) {
+  opacity: $opacity;
+  $opacity-ie: $opacity * 100;
+  filter: alpha(opacity=$opacity-ie); //IE8
+}
+@mixin text-shadow($x: 2px, $y: 2px, $blur: 5px, $color: rgba(0,0,0,.4)) {
+    text-shadow: $x $y $blur $color;
+}
+

font/simple.eot 0(+0 -0)

diff --git a/font/simple.eot b/font/simple.eot
new file mode 100644
index 0000000..c1244a2
Binary files /dev/null and b/font/simple.eot differ

font/simple.svg 14(+14 -0)

diff --git a/font/simple.svg b/font/simple.svg
new file mode 100644
index 0000000..c63e025
--- /dev/null
+++ b/font/simple.svg
@@ -0,0 +1,14 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg xmlns="http://www.w3.org/2000/svg">
+<metadata>Copyright (C) 2014 by original authors @ fontello.com</metadata>
+<defs>
+<font id="simple" horiz-adv-x="1000" >
+<font-face font-family="simple" font-weight="400" font-stretch="normal" units-per-em="1000" ascent="850" descent="-150" />
+<missing-glyph horiz-adv-x="1000" />
+<glyph glyph-name="menu" unicode="&#xe801;" d="m857 100v-71q0-15-10-25t-26-11h-785q-15 0-25 11t-11 25v71q0 15 11 25t25 11h785q15 0 26-11t10-25z m0 286v-72q0-14-10-25t-26-10h-785q-15 0-25 10t-11 25v72q0 14 11 25t25 10h785q15 0 26-10t10-25z m0 285v-71q0-15-10-25t-26-11h-785q-15 0-25 11t-11 25v71q0 15 11 26t25 10h785q15 0 26-10t10-26z" horiz-adv-x="857.1" />
+<glyph glyph-name="down-open" unicode="&#xe803;" d="m899 457q0-29-21-50l-363-363q-21-22-51-22-30 0-50 22l-363 363q-21 20-21 50 0 30 21 51l41 42q22 20 51 20 29 0 50-20l271-271 271 271q21 20 51 20 29 0 50-20l42-42q21-22 21-51z" horiz-adv-x="928.6" />
+<glyph glyph-name="up-open" unicode="&#xe804;" d="m899 171q0-29-21-50l-42-42q-21-21-50-21-30 0-51 21l-271 271-271-271q-20-21-50-21t-50 21l-42 42q-21 20-21 50 0 30 21 51l363 363q21 21 50 21 29 0 51-21l363-363q21-21 21-51z" horiz-adv-x="928.6" />
+</font>
+</defs>
+</svg>
\ No newline at end of file

font/simple.ttf 0(+0 -0)

diff --git a/font/simple.ttf b/font/simple.ttf
new file mode 100644
index 0000000..bb9dafc
Binary files /dev/null and b/font/simple.ttf differ

font/simple.woff 0(+0 -0)

diff --git a/font/simple.woff b/font/simple.woff
new file mode 100644
index 0000000..9e70f9a
Binary files /dev/null and b/font/simple.woff differ

images/books.jpg 0(+0 -0)

diff --git a/images/books.jpg b/images/books.jpg
new file mode 100644
index 0000000..b53e178
Binary files /dev/null and b/images/books.jpg differ
diff --git a/images/books-background.jpg b/images/books-background.jpg
new file mode 100644
index 0000000..6d167b6
Binary files /dev/null and b/images/books-background.jpg differ
diff --git a/images/landscape.jpg b/images/landscape.jpg
new file mode 100644
index 0000000..6985c26
Binary files /dev/null and b/images/landscape.jpg differ
diff --git a/images/landscape-header.jpg b/images/landscape-header.jpg
new file mode 100644
index 0000000..d009c21
Binary files /dev/null and b/images/landscape-header.jpg differ

index.html 124(+124 -0)

diff --git a/index.html b/index.html
new file mode 100644
index 0000000..0c0c5c3
--- /dev/null
+++ b/index.html
@@ -0,0 +1,124 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title></title>
+    <!-- Define the versions of IE that will be used to render the page. See Microsoft documentation for details. Optional. -->
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <meta name="viewport" content="width=device-width, user-scalable=no">
+    <meta charset="utf-8">
+    <!--Use protocol relative urls that way if the browser is viewing the page via HTTPS the js/css file will be requested using the HTTPS protocol-->
+    <link rel="stylesheet" href="//js.arcgis.com/3.21/esri/css/calcite/calcite.css">
+    <link rel="stylesheet"  href="//js.arcgis.com/3.21/esri/css/esri.css">
+    <!--Load any application specific styles-->
+    <link rel="stylesheet" href="css/main.css">
+    <!--[if (lt IE 9)]>
+      <script  src="js/selectivizr-min.js"></script>
+      <link rel="stylesheet" href="css/ie.css"/>
+    <![endif]-->
+</head>
+<body class="calcite app-loading">
+   <!--The ArcGIS API for JavaScript provides bidirectional support.  When viewing the application in an right to left (rtl) language like Hebrew and Arabic the map needs to remain in left-to-right (ltr) mode. Specify this by setting the dir attribute on the div to ltr. -->
+       <div id="border_container" class="border-container-outer">
+        <div id="cp_left" class="content-pane-left">
+          <div id="ac-container" class="ac-container hidden">
+             <div id="legend-cont">
+                 <input id="legend-ac" type="checkbox" checked/>
+                 <label class="ac-label ab fc" id="legend-label" for="legend-ac"></label>
+                 <div class="article ac-large" id="legendDiv"></div>
+             </div>
+             <div id="about-cont">
+                <input id="about-ac" type="checkbox" checked/>
+                <label class="ac-label ab fc" id="about-label" for="about-ac"></label>
+                <div class="article ac-medium" id="aboutDiv"></div>
+             </div>
+          </div>
+        </div>
+        <div id="cp_center" class="content-pane-center">
+            <div class="top-bar bg">
+                <i id="toggle_button" class="hamburger-button icon-menu fc"></i>
+                <div id="title" class="top-bar-title"></div>
+                <div id="search" class="geocoder"></div>
+            </div>
+         <div id="mapDiv" dir="ltr"></div>
+        </div>
+    </div>
+    
+    <div id="hidden-sidebar" class="hidden">
+      <h1 class='heading'>Utilizing the Website</h1>
+      <p>Click on a county and a pop-up will appear with information on the county’s demographics, college savings assets and participation rates, and the total number of public elementary schools in the county.</p>
+      <p>The green dots on the map show participating school districts throughout the state.  To see a map of which elementary schools are participating in each school district, please visit 
+        <a href="https://drive.google.com/open?id=17FuBeSvIAZSKgnDHk-XYGILIjquAaVxz&usp=sharing" target="_blank">https://drive.google.com/open?id=17FuBeSvIAZSKgnDHk-XYGILIjquAaVxz&usp=sharing</a>
+      </p>
+      <hr> 
+      <p>Welcome to the Oregon Savings Network’s county information website. This website contains information about the college savings activity in every Oregon county. The Network was created to increase the ability of Oregonians to save for future higher education expenses through the Oregon College Savings Plan (OCSP). It is a unique investment tool that provides state and federal tax advantages and more flexibility than many other college savings vehicles. For more information, visit <a href='http://www.oregoncollegesavings.com' target='_blank'>www.oregoncollegesavings.com</a>.</p> 
+      <p>Children with as little as $500 saved for college are three times more likely to enroll in college and four times more likely to graduate, research shows. It is encouraging statistics like this that motivated us to create our school-based outreach program <i>Be College Ready</i>.</p> 
+      <h1 class='heading'>Be College Ready</h1> 
+      <p>Launched as a pilot program in five school districts during the 2015-16 school year, Be College Ready had the simple goal of helping young families learn the value of saving for higher education early in a child’s life using the OCSP. With results showing an increase in OCSP accounts among participating school districts and communities, we expanded Be College Ready to become a statewide program.</p> 
+      <h1 class='heading'>Be College Ready Today</h1> 
+      <p>For the 2017-2018 school year Be College Ready has been open to <b>all</b> public elementary schools, private elementary schools and homeschooled children of elementary school age across Oregon. We are very pleased with the response as of February 1, 2018:</p>
+      <ul>
+        <li>We have partnered with 72 different school districts across the state, serving 168 schools (10 private schools), including 28 school presentations/events with OCSP staff, resulting in an increased presence and awareness of the OCSP among Oregon families</li>
+        <li>We have provided 25,836 OCSP English informational brochures and 4,905 OCSP Spanish informational brochures to participating schools that can be shared with parents</li>
+        <li>
+          We have provided 46,474 English Be College Ready kits and 8,213 Spanish Be College Ready kits to participating schools
+          <ul>
+            <li>Each kit contains free homework folders, pencils and bookmarks for every student; also included is information for parents to win $100 for an OCSP account</li>
+          </ul>
+        </li>
+        <li>
+          The sharing of information about the benefits of the OCSP has translated into a substantial increase in OCSP account activity in participating school districts when comparing OCSP account activity from September –December 2016 to September –December 2017
+          <ul>
+            <li>The overall total number of new OCSP accounts opened in Be College Ready communities for the 2017 period is up 4.6% and the dollar amounts from these new contributing accounts <b>is up 49.6%</b> compared to 2016</li>
+            <li>The overall total number of OCSP contributing accounts in Be College Ready communities for the 2017 period was up 12.3% and the dollar amounts from these contributing accounts are up 12.7% when compared to the same timeframe from the year before</li>
+          </ul>
+        </li>
+      </ul>
+      <p>Please visit <a href='http://www.becollegeready.net' target='_blank'>www.becollegeready.net</a> starting August 14, 2017 to order free supplies for your elementary school(s) and to learn more about the program.</p>
+    </div>
+    <script type="text/javascript">
+        var package_path = window.location.pathname.substring(0, window.location.pathname.lastIndexOf('/'));
+        var dojoConfig = {
+            // The locationPath logic below may look confusing but all its doing is
+            // enabling us to load the api from a CDN and load local modules from the correct location.
+            packages: [{
+                name: "application",
+                location: package_path + '/js'
+            }, {
+                name: "config",
+                location: package_path + '/config'
+            }],
+            cacheBust: true
+        };
+    </script>
+    <script type="text/javascript" src="//js.arcgis.com/3.21/"></script>
+    <script type="text/javascript">
+        require([
+            "dojo/on",
+            "application/main",
+            "application/template",
+            "dojo/domReady!"
+        ], function(
+            on,
+            Main,
+            Template
+        ){
+            //create the template. This will take care of all the logic required for template applications
+            //If you need localization set the supportsLocalization value to true to get the localized strings
+            //from the javascript/nls/resource files.
+            //Note that we've included a placeholder nls folder and a resource file with one error string
+            //to show how to setup the strings file.
+
+            var supportsLocalization = true; //defaults to true
+
+            var myTemplate = new Template(supportsLocalization);
+
+            on(myTemplate, "ready", function(config) {
+                //The config object contains the following properties: helper services, (optionally)
+                //i18n, appid, webmap and any custom values defined by the application.
+                //In this example we have one called theme.
+                Main(config);
+            });
+        });
+    </script>
+</body>
+</html>

js/CreateGeocoder.js 357(+357 -0)

diff --git a/js/CreateGeocoder.js b/js/CreateGeocoder.js
new file mode 100644
index 0000000..68c6cf9
--- /dev/null
+++ b/js/CreateGeocoder.js
@@ -0,0 +1,357 @@
+/*Create a geocoder widget
+Will display multiple  locators if organization has more than one locator defined
+Adds support for info window that allows users to find different search results */
+define(["dojo/_base/declare", "dojo/Deferred", "esri/dijit/Geocoder", "esri/dijit/PopupTemplate", "esri/layers/FeatureLayer", "esri/geometry/Extent", "esri/geometry/Point", "esri/lang", "dojo/dom-construct", "dojo/dom", "dojo/dom-style", "dojo/on", "dijit/registry", "dojo/query", "dojo/_base/lang", "dojo/_base/array"
+
+], function (
+declare, Deferred, Geocoder, PopupTemplate, FeatureLayer, Extent, Point, esriLang, domConstruct, dom, domStyle, on, registry, query, lang, array
+
+) {
+    return declare(null, {
+        map: null,
+        geocoder: null,
+        allResults: null,
+        config: null,
+        content: null,
+        geocoders: [],
+        geocodeFeatureLayers: {},
+        constructor: function (args) {
+            this.map = args.map;
+            this.config = args.config;
+
+            var options = this._createGeocoderOptions();
+            this.geocoder = new Geocoder(options, this.geocoderDiv);
+
+            this.geocoder.startup();
+            this.geocoder.on("find-results", lang.hitch(this, this.checkResults));
+            this.geocoder.on("select", lang.hitch(this, this.showGeocodingResult));
+            this.geocoder.on("auto-complete", lang.hitch(this, this.clearGeocodeResults));
+            this.geocoder.on("clear", lang.hitch(this, this.clearGeocodeResults));
+
+        },
+
+        checkResults: function (geocodeResults) {
+            this.allResults = null;
+            if (geocodeResults && geocodeResults.results && geocodeResults.results.results) {
+                geocodeResults.results = geocodeResults.results.results;
+            }
+            if ((!geocodeResults || !geocodeResults.results || !geocodeResults.results.length)) {
+                console.log("No results found");
+            } else if (geocodeResults) {
+                this.allResults = geocodeResults.results;
+            }
+        },
+        clearGeocodeResults: function () {
+            if (this.map.infoWindow.isShowing) {
+                this.map.infoWindow.hide();
+            }
+            this.allResults = null;
+        },
+        showGeocodingResult: function (result, pos) {
+            this.map.infoWindow.hide();
+
+            var bestView, anchorPoint;
+            var geocodeResult = result.result || result;
+            anchorPoint = geocodeResult.feature.geometry;
+            if (anchorPoint.type === "polygon") {
+                anchorPoint = anchorPoint.getCentroid();
+                bestView = geocodeResult.feature.geometry.getExtent().expand(1.1);
+            } else if (anchorPoint.type === "polyline") {
+                anchorPoint = anchorPoint.getPoint(0, 0);
+                bestView = geocodeResult.feature.geometry.getExtent().expand(1.1);
+            } else {
+                bestView = this.map.extent.centerAt(anchorPoint).expand(0.0625);
+            }
+
+
+            //Add feature search support 
+            var featureSearch = false;
+            if (result.target && result.target.activeGeocoder) {
+                var activeGeocoder = result.target.activeGeocoder;
+                if (esriLang.isDefined(activeGeocoder.type)) {
+                    if (activeGeocoder.type === "query") {
+                        //get the layer 
+                        if (activeGeocoder.layerId) {
+                            var layer = this.map.getLayer(activeGeocoder.layerId);
+                            if (activeGeocoder.subLayerId) {
+                                if (layer.infoTemplates && layer.infoTemplates[activeGeocoder.subLayerId]) {
+                                    geocodeResult.feature.infoTemplate = layer.infoTemplates[activeGeocoder.subLayerId].infoTemplate;
+                                    featureSearch = true;
+                                    this._getPopupFeatureLayer(layer, activeGeocoder.subLayerId, geocodeResult.feature.infoTemplate).then(lang.hitch(this, function (layerResult) {
+                                        //Info template defined so create a feature layer and display the popup
+                                        geocodeResult.feature._layer = layerResult;
+                                        this.map.infoWindow.setFeatures([geocodeResult.feature]);
+                                        this.map.infoWindow.show(anchorPoint);
+                                        this.map.setExtent(bestView);
+                                    }));
+                                } else {
+                                    //No info template defined so just show popup with info"
+                                    this.map.infoWindow.setTitle(activeGeocoder.name);
+                                    this.map.infoWindow.setContent(geocodeResult.name);
+                                    this.map.infoWindow.show(anchorPoint);
+                                    this.map.setExtent(bestView);
+                                    featureSearch = true;
+                                }
+                            } else {
+                                //Feature layer so get the popup info, associate it with the result, then display 
+                                if (layer.infoTemplate) {
+                                    geocodeResult.feature.infoTemplate = layer.infoTemplate;
+                                    geocodeResult.feature._layer = layer;
+                                    this.map.infoWindow.setFeatures([geocodeResult.feature]);
+                                    this.map.infoWindow.show(anchorPoint);
+                                    this.map.setExtent(bestView);
+                                    featureSearch = true;
+                                }
+                            }
+
+                        }
+                    }
+                }
+            }
+
+            if (featureSearch) {
+                return;
+            }
+
+            if (!esriLang.isDefined(pos)) {
+                pos = 0;
+            }
+            //Locator based geocode results handled here 
+            this.setupInfoWindowAndZoom(geocodeResult.name, geocodeResult.feature.geometry, bestView, geocodeResult, pos);
+
+        },
+        _getPopupFeatureLayer: function (mapLayer, subLayerId, popupInfo) {
+            var deferred = new Deferred();
+            if (this.geocodeFeatureLayers[mapLayer.id] && this.geocodeFeatureLayers[mapLayer.id][subLayerId]) {
+                //already have it 
+                deferred.resolve(this.geocodeFeatureLayers[mapLayer.id][subLayerId]);
+            }
+            var url = mapLayer.url + "/" + subLayerId;
+            if (mapLayer.dynamicLayerInfos) {
+                array.some(mapLayer.dynamicLayerInfos, lang.hitch(this, function (dynLayerInfo) {
+                    if (dynLayerInfo.id === subLayerId) { //don't have this info but leaving for now
+                        url = mapLayer.url + "/" + dynLayerInfo.source.mapLayerId;
+                        return true;
+                    }
+                }));
+            }
+            var params = {
+                mode: FeatureLayer.MODE_SELECTION,
+                outFields: ["*"],
+                infoTemplate: popupInfo && new PopupTemplate(popupInfo)
+            };
+            var layer = new FeatureLayer(url, params);
+
+            //save the layer for later 
+            this.geocodeFeatureLayers[mapLayer.id] = this.geocodeFeatureLayers[mapLayer.id] || {};
+            this.geocodeFeatureLayers[mapLayer.id][subLayerId] = layer;
+
+
+            deferred.resolve(layer);
+
+
+
+
+            return deferred.promise;
+        },
+        setupInfoWindowAndZoom: function (content, geocodeLocation, newExtent, geocodeResult, pos) {
+            this.map.infoWindow.clearFeatures();
+
+            //Show info window
+            if (this.allResults && this.allResults.length > 1) {
+                //let's update the content to show additional results 
+                var currentLocationName = content;
+                var attr = this.allResults[pos].feature.attributes;
+                content = "<div id='geocodeCurrentResult' style='display:none;'><span style='font-weight:bold;'>";
+                content += "Current Location"; //this.config.i18n.viewer.main.search.currentLocation;
+                content += "</span></div>";
+                content += "<span>";
+
+                if (!attr.Match_addr) {
+                    content += currentLocationName;
+                } else {
+                    content += attr.Match_addr;
+                    if (attr.stAddr && attr.City) {
+                        content += " - " + attr.stAddr + ", " + attr.City;
+                    } else if (attr.stAddr) {
+                        content += " - " + attr.stAddr;
+                    }
+                }
+
+                content += "</span>";
+                content += "<div id='geocodeWantOtherResults'>";
+                content += "<a id='results' style='cursor:pointer'>";
+
+                content += "Not what you wanted?"; //this.config.i18n.viewer.main.search.notWhatYouWanted;
+                content += "</a>";
+                content += "</div>";
+                content += "<div id='geocodeOtherResults' style='display:none;'><span style='font-weight:bold;'>";
+                content += "Select another location"; //this.config.i18n.viewer.main.search.selectAnother;
+                content += "</span><br/>";
+                for (var i = 0; i < this.allResults.length; i++) {
+                    if (i !== pos) {
+                        var result = this.allResults[i];
+                        attr = result.feature.attributes;
+                        content += "<a style='cursor:pointer' class='li_item' id=" + i + ">";
+
+                        if (!attr.Match_addr) {
+                            content += result.name;
+                        } else {
+                            //content += result.feature.attributes.Place_addr ? (" - " + result.feature.attributes.Place_addr) : ""
+                            content += attr.Match_addr;
+                            if (attr.stAddr && attr.City) {
+                                content += " - " + attr.stAddr + ", " + attr.City;
+                            } else if (attr.stAddr) {
+                                content += " - " + attr.stAddr;
+                            }
+                        }
+
+                        content += "</a><br/>";
+                    }
+                }
+                content += "</div>";
+
+            }
+
+            //display a popup for the result
+            //this.config.i18n.viewer.main.search.popupTitle
+            this.map.infoWindow.setTitle("Location");
+
+            this.map.infoWindow.setContent(content);
+
+            query(".li_item").forEach(lang.hitch(this, function (node) {
+                on(node, "click", lang.hitch(this, function () {
+                    if (node.id >= 0) {
+                        this.selectAnotherResult(node.id);
+                    }
+                }));
+
+            }));
+            var resDiv = dom.byId("results");
+            if (resDiv) {
+                on(resDiv, "click", lang.hitch(this, function () {
+                    this.showOtherResults();
+                }));
+            }
+
+            var location = new Point(geocodeLocation.x, geocodeLocation.y, geocodeLocation.spatialReference);
+            on.once(this.map, "extent-change", lang.hitch(this, function () {
+                this.map.infoWindow.show(location);
+            }));
+            this.map.setExtent(newExtent);
+
+
+        },
+        showOtherResults: function () {
+
+            domStyle.set(dom.byId("geocodeWantOtherResults"), "display", "none");
+            domStyle.set(dom.byId("geocodeCurrentResult"), "display", "block");
+            domStyle.set(dom.byId("geocodeOtherResults"), "display", "block");
+
+        },
+        selectAnotherResult: function (pos) {
+            this.showGeocodingResult(this.allResults[pos], pos);
+        },
+        _createGeocoderOptions: function () {
+            //Check for multiple geocoder support and setup options for geocoder widget. 
+            var hasEsri = false,
+                geocoders = lang.clone(this.config.helperServices.geocode);
+
+            array.forEach(geocoders, function (geocoder, index) {
+
+                if (geocoder.url.indexOf(".arcgis.com/arcgis/rest/services/World/GeocodeServer") > -1) {
+                    hasEsri = true;
+                    geocoder.name = "Esri World Geocoder";
+                    geocoder.outFields = "Match_addr, stAddr, City";
+                    geocoder.singleLineFieldName = "SingleLine";
+                    geocoder.esri = geocoder.placefinding = true;
+                }
+
+            });
+            //only use geocoders with a singleLineFieldName that allow placefinding
+            geocoders = array.filter(geocoders, function (geocoder) {
+                return (esriLang.isDefined(geocoder.singleLineFieldName) && esriLang.isDefined(geocoder.placefinding) && geocoder.placefinding);
+            });
+            var esriIdx;
+            if (hasEsri) {
+                for (var i = 0; i < geocoders.length; i++) {
+                    if (esriLang.isDefined(geocoders[i].esri) && geocoders[i].esri === true) {
+                        esriIdx = i;
+                        break;
+                    }
+                }
+            }
+            var options = {
+                map: this.map,
+                autoNavigate: false,
+                minCharacters: 0,
+                maxLocations: 5,
+                searchDelay: 100,
+                theme: "simpleGeocoder",
+                autoComplete: hasEsri
+            };
+
+
+            //If there is a valid search id and field defined add the feature layer to the geocoder array
+            var searchLayers = [];
+            if (this.config.response.itemInfo.itemData && this.config.response.itemInfo.itemData.applicationProperties && this.config.response.itemInfo.itemData.applicationProperties.viewing && this.config.response.itemInfo.itemData.applicationProperties.viewing.search) {
+                var searchOptions = this.config.response.itemInfo.itemData.applicationProperties.viewing.search;
+
+
+                array.forEach(searchOptions.layers, lang.hitch(this, function (searchLayer) {
+                    var operationalLayers = this.config.itemInfo.itemData.operationalLayers;
+                    var layer = null;
+                    array.some(operationalLayers, function (opLayer) {
+                        if (opLayer.id === searchLayer.id) {
+                            layer = opLayer;
+                            return true;
+                        }
+                    });
+
+                    var url = layer.url;
+                    var field = searchLayer.field.name;
+                    var name = layer.title;
+                    if (esriLang.isDefined(searchLayer.subLayer)) {
+                        url = url + "/" + searchLayer.subLayer;
+                        array.some(layer.layerObject.layerInfos, function (info) {
+                            if (info.id == searchLayer.subLayer) {
+                                name += " - " + layer.layerObject.layerInfos[searchLayer.subLayer].name;
+                                return true;
+                            }
+
+                        });
+                    }
+                    searchLayers.push({
+                        "name": name,
+                        "url": url,
+                        "field": field,
+                        "exactMatch": (searchLayer.field.exactMatch || false),
+                        "placeholder": searchOptions.hintText,
+                        "outFields": "*",
+                        "type": "query",
+                        "layerId": searchLayer.id,
+                        "subLayerId": parseInt(searchLayer.subLayer) || null
+                    });
+                }));
+
+            }
+
+
+            if (hasEsri && esriIdx === 0) { // Esri geocoder is primary
+                options.arcgisGeocoder = false;
+                if (geocoders.length > 0) {
+                    options.geocoders = searchLayers.length ? searchLayers.concat(geocoders) : geocoders;
+                } else if (searchLayers.length > 0) {
+                    options.geocoders = searchLayers;
+                }
+            } else { // Esri geocoder is not primary
+                options.arcgisGeocoder = false;
+                options.geocoders = searchLayers.length ? searchLayers.concat(geocoders) : geocoders;
+            }
+
+
+            return options;
+        }
+    });
+
+});
\ No newline at end of file

js/Drawer.js 246(+246 -0)

diff --git a/js/Drawer.js b/js/Drawer.js
new file mode 100644
index 0000000..901eb07
--- /dev/null
+++ b/js/Drawer.js
@@ -0,0 +1,246 @@
+define(["dojo/Evented", "dojo/_base/declare", "dojo/_base/lang", "dijit/_WidgetBase", "dojo/on", "dojo/dom", "dojo/dom-class", "dijit/layout/BorderContainer", "dijit/layout/ContentPane", "dojo/Deferred", "dojo/window"], function (
+Evented, declare, lang, _WidgetBase, on, dom, domClass, BorderContainer, ContentPane, Deferred, win) {
+    var Widget = declare("application.Drawer", [_WidgetBase, Evented], {
+        options: {
+            showDrawerSize: 850,
+            borderContainer: null,
+            contentPaneCenter: null,
+            contentPaneSide: null,
+            toggleButton: null,
+            mapResizeTimeout: 300,
+            mapResizeStepTimeout: 25
+        },
+        // lifecycle: 1
+        constructor: function (options) {
+            // mix in settings and defaults
+            var defaults = lang.mixin({}, this.options, options);
+            // properties
+            this.set("showDrawerSize", defaults.showDrawerSize);
+            this.set("borderContainer", defaults.borderContainer);
+            this.set("contentPaneCenter", defaults.contentPaneCenter);
+            this.set("contentPaneSide", defaults.contentPaneSide);
+            this.set("toggleButton", defaults.toggleButton);
+            this.set("mapResizeTimeout", defaults.mapResizeTimeout);
+            this.set("mapResizeStepTimeout", defaults.mapResizeStepTimeout);
+            // classes
+            this.css = {
+                toggleButton: "toggle-grey",
+                toggleButtonSelected: "toggle-grey-on",
+                drawerOpen: "drawer-open",
+                drawerOpenComplete: "drawer-open-complete"
+            };
+        },
+        // start widget. called by user
+        startup: function () {
+            this._init();
+        },
+        // connections/subscriptions will be cleaned up during the destroy() lifecycle phase
+        destroy: function () {
+            this._removeEvents();
+            this.inherited(arguments);
+        },
+        resize: function () {
+            // resize border container
+            if (this._borderContainer) {
+                this._borderContainer.layout();
+            }
+            // drawer status resize
+            this.emit("resize", {});
+        },
+        /* ---------------- */
+        /* Public Events */
+        /* ---------------- */
+        // load
+        // resize
+        // toggle
+        /* ---------------- */
+        /* Public Functions */
+        /* ---------------- */
+        toggle: function (add) {
+            // deferred to return
+            var def = new Deferred();
+            // true if drawer is opened
+            var currentlyOpen = domClass.contains(document.body, this.css.drawerOpen);
+            // if already open or already closed and asked to do the same
+            if ((currentlyOpen && add === true) || (!currentlyOpen && add === false)) {
+                // return
+                return def.promise;
+            }
+            // whether drawer is now opened or closed
+            var nowOpen;
+            // if add is set
+            if (typeof add !== "undefined") {
+                nowOpen = domClass.toggle(document.body, this.css.drawerOpen, add);
+            } else {
+                nowOpen = domClass.toggle(document.body, this.css.drawerOpen, !currentlyOpen);
+            }
+            // remove shadow
+            domClass.remove(document.body, this.css.drawerOpenComplete);
+            // if steps animation exists
+            if (this._animationSteps) {
+                clearInterval(this._animationSteps);
+                this._animationSteps = null;
+            }
+            // resize during animation
+            this._animationSteps = setInterval(lang.hitch(this, function () {
+                // resize border container
+                this.resize();
+            }), this.get("mapResizeStepTimeout"));
+            // remove timeout if exists
+            if (this._animationTimeout) {
+                clearTimeout(this._animationTimeout);
+                this._animationTimeout = null;
+            }
+            // wait for animation to finish
+            this._animationTimeout = setTimeout(lang.hitch(this, function () {
+                // remove shown drawer
+                this._checkDrawerStatus();
+                // stop resizing container
+                clearInterval(this._animationSteps);
+                this._animationSteps = null;
+                // now drawer is open
+                if (nowOpen) {
+                    // add shadow
+                    domClass.add(document.body, this.css.drawerOpenComplete);
+                }
+                // return
+                def.resolve();
+            }), this.get("mapResizeTimeout"));
+            // return when done
+            return def.promise;
+        },
+        /* ---------------- */
+        /* Private Functions */
+        /* ---------------- */
+        _removeEvents: function () {
+            if (this._events && this._events.length) {
+                for (var i = 0; i < this._events.length; i++) {
+                    this._events[i].remove();
+                }
+            }
+            this._events = [];
+            // destroy content panes
+            if (this._contentPaneCenter) {
+                this._contentPaneCenter.destroy();
+            }
+            if (this._contentPaneSide) {
+                this._contentPaneSide.destroy();
+            }
+            // destroy content pane
+            if (this._borderContainer) {
+                this._borderContainer.destroy();
+            }
+        },
+        _init: function () {
+            // setup events
+            this._removeEvents();
+            // required nodes
+            this._borderContainerNode = dom.byId(this.get("borderContainer"));
+            this._contentPaneCenterNode = dom.byId(this.get("contentPaneCenter"));
+            this._contentPaneSideNode = dom.byId(this.get("contentPaneSide"));
+            this._toggleNode = dom.byId(this.get("toggleButton"));
+            // all nodes present
+            if (this._borderContainerNode && this._contentPaneCenterNode && this._contentPaneSideNode && this._toggleNode) {
+                // outer container
+                this._borderContainer = new BorderContainer({
+                    design: "sidebar",
+                    gutters: false
+                }, this._borderContainerNode);
+                // center panel
+                this._contentPaneCenter = new ContentPane({
+                    region: "center",
+                    style: {
+                        padding: 0
+                    }
+                }, this._contentPaneCenterNode);
+                this._borderContainer.addChild(this._contentPaneCenter);
+                // leading panel
+                this._contentPaneSide = new ContentPane({
+                    region: "leading",
+                    style: {
+                        padding: 0
+                    }
+                }, this._contentPaneSideNode);
+                this._borderContainer.addChild(this._contentPaneSide);
+                // start border container
+                this._borderContainer.startup();
+                // drawer button
+                var toggleClick = on(this._toggleNode, "click", lang.hitch(this, function () {
+                    this.toggle();
+                }));
+                this._events.push(toggleClick);
+                // window
+                var w = win.get(document);
+                // window size event
+                var winResize = on(w, "resize", lang.hitch(this, function () {
+                    this._windowResized();
+                }));
+                this._events.push(winResize);
+                // window focused on
+                var winFocus = on(w, "focus", lang.hitch(this, function () {
+                    setTimeout(lang.hitch(this, function () {
+                        this.resize();
+                    }), 250);
+                }));
+                this._events.push(winFocus);
+                // check window size
+                this._windowResized();
+                // fix layout
+                this.resize();
+                // set loaded property
+                this.set("loaded", true);
+                // emit loaded event
+                this.emit("load", {});
+            } else {
+                console.log("Drawer::Missing required node");
+            }
+        },
+        _windowResized: function () {
+            // view screen
+            var vs = win.getBox(),
+                add;
+            // if window width is less than specified size
+            if (vs.w < this.get("showDrawerSize")) {
+                // hide drawer
+                add = false;
+            } else {
+                // show drawer
+                add = true;
+            }
+            // toggle
+            this.toggle(add).always(lang.hitch(this, function () {
+                // remove forced open
+                this._checkDrawerStatus();
+            }));
+        },
+        _checkDrawerStatus: function () {
+            // border container layout
+            this.resize();
+            // hamburger button toggle
+            this._toggleButton();
+        },
+        _toggleButton: function () {
+            // if drawer is displayed
+            var search = dom.byId("search");
+            if (domClass.contains(document.body, this.css.drawerOpen)) {
+                // has normal class
+                if (domClass.contains(this._toggleNode, this.css.toggleButton)) {
+                    // replace with selected class
+                    domClass.replace(this._toggleNode, this.css.toggleButtonSelected, this.css.toggleButton);
+                }
+                if (search) {
+                    domClass.add(search, "open-drawer");
+                }
+            } else {
+                if (domClass.contains(this._toggleNode, this.css.toggleButtonSelected)) {
+                    // replace with normal class
+                    domClass.replace(this._toggleNode, this.css.toggleButton, this.css.toggleButtonSelected);
+                }
+                if (search) {
+                    domClass.remove(search, "open-drawer");
+                }
+            }
+        }
+    });
+    return Widget;
+});
\ No newline at end of file

js/main.js 209(+209 -0)

diff --git a/js/main.js b/js/main.js
new file mode 100644
index 0000000..e6bddf8
--- /dev/null
+++ b/js/main.js
@@ -0,0 +1,209 @@
+define(["dojo/ready", "dojo/_base/declare", "dojo/_base/lang", "dojo/_base/Color", "esri/arcgis/utils", "dojo/on", "dojo/has", "dojo/sniff", "dijit/registry", "application/Drawer", "application/CreateGeocoder", "esri/dijit/Legend", "dojo/dom-class", "dojo/dom", "dojo/query", "dojo/dom-construct", "esri/dijit/LocateButton", "esri/dijit/HomeButton"], function (
+ready, declare, lang, Color, arcgisUtils, on, has, sniff, registry, Drawer, CreateGeocoder, Legend, domClass, dom, query, domConstruct, LocateButton, HomeButton) {
+    return declare("", null, {
+        config: {},
+        theme: null,
+        color: null,
+        paneltheme: null,
+        constructor: function (config) {
+            // config will contain application and user defined info for the template such as i18n strings, the web map id
+            // and application id
+            // any url parameters and any application specific configuration information.
+            this.config = config;
+            // responsive drawer
+            var rtl = (query(".esriRTL").length > 0) ? "rtl" : "ltr";
+            this._drawer = new Drawer({
+                showDrawerSize: 820,
+                borderContainer: "border_container",
+                contentPaneCenter: "cp_center",
+                contentPaneSide: "cp_left",
+                toggleButton: "toggle_button",
+                direction: rtl
+            });
+
+            // startup drawer
+            this._drawer.startup();
+
+            // document ready
+            ready(lang.hitch(this, function () {
+                this.theme = this.setColor(this.config.theme);
+                this.color = this.setColor(this.config.color);
+                this.paneltheme = this.setColor(this.config.paneltheme);
+                //supply either the webmap id or, if available, the item info
+                var itemInfo = this.config.itemInfo || this.config.webmap;
+
+                //If a custom extent is set as a url parameter handle that before creating the map
+                if (this.config.extent) {
+                    var extArray = decodeURIComponent(this.config.extent).split(",");
+
+                    if (extArray.length === 4) {
+                        itemInfo.item.extent = [
+                            [parseFloat(extArray[0]), parseFloat(extArray[1])],
+                            [parseFloat(extArray[2]), parseFloat(extArray[3])]
+                        ];
+                    } else if (extArray.length === 5) {
+                        this.initExt = new Extent(JSON.parse(this.config.extent));
+
+                    }
+                }
+                this._createWebMap(itemInfo);
+
+
+            }));
+        },
+        _mapLoaded: function () {
+
+            // remove loading class
+            domClass.remove(dom.byId("ac-container"), "hidden");
+            domClass.remove(document.body, "app-loading");
+
+
+            //Add the geocoder if search is enabled
+            if (this.config.search) {
+                var options = {
+                    map: this.map,
+                    config: this.config
+                };
+                var myGeocoder = new CreateGeocoder(options);
+
+                if (myGeocoder.geocoder && myGeocoder.geocoder.domNode) {
+                    domConstruct.place(myGeocoder.geocoder.domNode, "search");
+                }
+            }
+
+            //Add the location button if enabled
+            if (this.config.locate) {
+                var location = new LocateButton({
+                    map: this.map
+                }, domConstruct.create("div", {
+                    id: "locateDiv"
+                }, "mapDiv"));
+                location.startup();
+            }
+
+            //Add the home button if configured
+            if (this.config.home) {
+                var homeButton = new HomeButton({
+                    map: this.map
+                }, domConstruct.create("div", {
+                    id: "homeDiv"
+                }, "mapDiv"));
+                homeButton.startup();
+            }
+
+            //Define legend panel content
+            dom.byId("legend-label").innerHTML = this.config.i18n.tools.legend;
+            var legend_div = domConstruct.create("div", {
+                className: "panel_content"
+            }, dom.byId("legendDiv"));
+            var layerInfo = arcgisUtils.getLegendLayers(this.config.response);
+
+            var legend = new Legend({
+                map: this.map,
+                layerInfos: layerInfo
+            }, legend_div);
+            legend.startup();
+
+
+            //Define about panel content
+            var about_content = this.config.about || this.config.itemInfo.item.description;
+            if (about_content !== null || about_content !== "") {
+                dom.byId("about-label").innerHTML = this.config.i18n.tools.about;
+                domConstruct.create("div", {
+                    innerHTML: about_content,
+                    className: "panel_content"
+                }, dom.byId("aboutDiv"));
+            } else {
+                domClass.add(dom.byId("about-cont"), "hidden");
+            }
+            this._updateTheme();
+
+        },
+        //create a map based on the input web map id
+        _createWebMap: function (itemInfo) {
+            arcgisUtils.createMap(itemInfo, "mapDiv", {
+                mapOptions: {
+
+                },
+                editable:false,
+                usePopupManager: true,
+                bingMapsKey: this.config.bingmapskey
+            }).then(lang.hitch(this, function (response) {
+
+                //define the application title
+                var title = this.config.title || response.itemInfo.item.title;
+                dom.byId("title").innerHTML = title;
+                document.title = title;
+
+
+                this.map = response.map;
+                domClass.add(this.map.infoWindow.domNode, "light");
+
+                this.config.response = response;
+
+                // make sure map is loaded
+                if (this.map.loaded) {
+                    // do something with the map
+                    this._mapLoaded();
+                } else {
+                    on.once(this.map, "load", lang.hitch(this, function () {
+                        // do something with the map
+                        this._mapLoaded();
+                    }));
+                }
+            }), lang.hitch(this, function (error) {
+                //an error occurred - notify the user. In this example we pull the string from the
+                //resource.js file located in the nls folder because we've set the application up
+                //for localization. If you don't need to support multiple languages you can hardcode the
+                //strings here and comment out the call in index.html to get the localization strings.
+                if (this.config && this.config.i18n) {
+                    alert(this.config.i18n.map.error + ": " + error.message);
+                } else {
+                    alert("Unable to create map: " + error.message);
+                }
+            }));
+        },
+        setColor: function (value) {
+            var colorValue = null;
+            var rgb = Color.fromHex(value).toRgb();
+
+            if (has("ie") == 8) {
+                colorValue = value;
+            } else {
+                rgb.push(0.9);
+                colorValue = Color.fromArray(rgb);
+            }
+            return colorValue;
+
+        },
+
+
+        _updateTheme: function () {
+            //Apply the configured theme to the template
+            //Add the bg class to any elements that you want to display using the specified background color
+            //Apply the fc class to elements that should display using the specified font color
+            query(".bg").style("backgroundColor", this.theme.toString());
+            query(".bg").style("color", this.color.toString());
+            query(".fc").style("color", this.color.toString());
+            query(".ac-container label:after").style("color", this.color.toString());
+
+
+            //Style the popup title bar to use the theme color.
+            query(".esriPopup .pointer").style("backgroundColor", this.theme.toString());
+            query(".esriPopup .titlePane").style("backgroundColor", this.theme.toString());
+
+
+            query(".esriPopup .titlePane").style("color", this.color.toString());
+            query(".esriPopup. .titleButton").style("color", this.color.toString());
+
+
+
+            //Query for the title areas in the drawer and  apply the panel theme.
+            query(".ab").style("backgroundColor", this.paneltheme.toString());
+
+
+
+            registry.byId("border_container").resize();
+        }
+    });
+});
diff --git a/js/nls/ar/resources.js b/js/nls/ar/resources.js
new file mode 100644
index 0000000..c4a7972
--- /dev/null
+++ b/js/nls/ar/resources.js
@@ -0,0 +1,12 @@
+define(
+   ({
+        map: {
+            error: "تعذر إنشاء خريطة"
+        }, 
+        tools: {
+        	legend: "وسيلة الإيضاح",
+        	 about: "حول"
+        }
+    })
+   
+);
\ No newline at end of file
diff --git a/js/nls/cs/resources.js b/js/nls/cs/resources.js
new file mode 100644
index 0000000..210be14
--- /dev/null
+++ b/js/nls/cs/resources.js
@@ -0,0 +1,12 @@
+define(
+   ({
+        map: {
+            error: "Nelze vytvořit mapu."
+        }, 
+        tools: {
+        	legend: "Legenda",
+        	 about: "O aplikaci"
+        }
+    })
+   
+);
\ No newline at end of file
diff --git a/js/nls/da/resources.js b/js/nls/da/resources.js
new file mode 100644
index 0000000..ff23c48
--- /dev/null
+++ b/js/nls/da/resources.js
@@ -0,0 +1,12 @@
+define(
+   ({
+        map: {
+            error: "ø_Unable to create map_å"
+        }, 
+        tools: {
+        	legend: "ø_Legend_å",
+        	 about: "ø_About_å"
+        }
+    })
+   
+);
\ No newline at end of file
diff --git a/js/nls/de/resources.js b/js/nls/de/resources.js
new file mode 100644
index 0000000..03f62a7
--- /dev/null
+++ b/js/nls/de/resources.js
@@ -0,0 +1,12 @@
+define(
+   ({
+        map: {
+            error: "Karte kann nicht erstellt werden"
+        }, 
+        tools: {
+        	legend: "Legende",
+        	 about: "Info zu"
+        }
+    })
+   
+);
\ No newline at end of file
diff --git a/js/nls/en/resources.js b/js/nls/en/resources.js
new file mode 100644
index 0000000..e3d6437
--- /dev/null
+++ b/js/nls/en/resources.js
@@ -0,0 +1,12 @@
+define(
+   ({
+        map: {
+            error: "Unable to create map"
+        }, 
+        tools: {
+        	legend: "Legend",
+        	 about: "About"
+        }
+    })
+   
+);
\ No newline at end of file
diff --git a/js/nls/es/resources.js b/js/nls/es/resources.js
new file mode 100644
index 0000000..111dc83
--- /dev/null
+++ b/js/nls/es/resources.js
@@ -0,0 +1,12 @@
+define(
+   ({
+        map: {
+            error: "No se puede crear el mapa"
+        }, 
+        tools: {
+        	legend: "Leyenda",
+        	 about: "Acerca de"
+        }
+    })
+   
+);
\ No newline at end of file
diff --git a/js/nls/et/resources.js b/js/nls/et/resources.js
new file mode 100644
index 0000000..dbf1341
--- /dev/null
+++ b/js/nls/et/resources.js
@@ -0,0 +1,12 @@
+define(
+   ({
+        map: {
+            error: "Š_Unable to create map_ä"
+        }, 
+        tools: {
+        	legend: "Š_Legend_ä",
+        	 about: "Š_About_ä"
+        }
+    })
+   
+);
\ No newline at end of file
diff --git a/js/nls/fi/resources.js b/js/nls/fi/resources.js
new file mode 100644
index 0000000..410883d
--- /dev/null
+++ b/js/nls/fi/resources.js
@@ -0,0 +1,12 @@
+define(
+   ({
+        map: {
+            error: "Å_Unable to create map_ö"
+        }, 
+        tools: {
+        	legend: "Å_Legend_ö",
+        	 about: "Å_About_ö"
+        }
+    })
+   
+);
\ No newline at end of file
diff --git a/js/nls/fr/resources.js b/js/nls/fr/resources.js
new file mode 100644
index 0000000..e141469
--- /dev/null
+++ b/js/nls/fr/resources.js
@@ -0,0 +1,12 @@
+define(
+   ({
+        map: {
+            error: "Impossible de créer la carte"
+        }, 
+        tools: {
+        	legend: "Légende",
+        	 about: "A propos"
+        }
+    })
+   
+);
\ No newline at end of file
diff --git a/js/nls/he/resources.js b/js/nls/he/resources.js
new file mode 100644
index 0000000..56b3df6
--- /dev/null
+++ b/js/nls/he/resources.js
@@ -0,0 +1,12 @@
+define(
+   ({
+        map: {
+            error: "לא ניתן ליצור מפה"
+        }, 
+        tools: {
+        	legend: "מקרא",
+        	 about: "אודות"
+        }
+    })
+   
+);
\ No newline at end of file
diff --git a/js/nls/it/resources.js b/js/nls/it/resources.js
new file mode 100644
index 0000000..4c254c9
--- /dev/null
+++ b/js/nls/it/resources.js
@@ -0,0 +1,12 @@
+define(
+   ({
+        map: {
+            error: "é_Unable to create map_È"
+        }, 
+        tools: {
+        	legend: "é_Legend_È",
+        	 about: "é_About_È"
+        }
+    })
+   
+);
\ No newline at end of file
diff --git a/js/nls/ja/resources.js b/js/nls/ja/resources.js
new file mode 100644
index 0000000..a7fa2d6
--- /dev/null
+++ b/js/nls/ja/resources.js
@@ -0,0 +1,12 @@
+define(
+   ({
+        map: {
+            error: "マップを作成できません"
+        }, 
+        tools: {
+        	legend: "凡例",
+        	 about: "情報"
+        }
+    })
+   
+);
\ No newline at end of file
diff --git a/js/nls/ko/resources.js b/js/nls/ko/resources.js
new file mode 100644
index 0000000..8875835
--- /dev/null
+++ b/js/nls/ko/resources.js
@@ -0,0 +1,12 @@
+define(
+   ({
+        map: {
+            error: "맵을 생성할 수 없음"
+        }, 
+        tools: {
+        	legend: "범례",
+        	 about: "정보"
+        }
+    })
+   
+);
\ No newline at end of file
diff --git a/js/nls/lt/resources.js b/js/nls/lt/resources.js
new file mode 100644
index 0000000..3129faa
--- /dev/null
+++ b/js/nls/lt/resources.js
@@ -0,0 +1,12 @@
+define(
+   ({
+        map: {
+            error: "Į_Unable to create map_š"
+        }, 
+        tools: {
+        	legend: "Į_Legend_š",
+        	 about: "Į_About_š"
+        }
+    })
+   
+);
\ No newline at end of file
diff --git a/js/nls/lv/resources.js b/js/nls/lv/resources.js
new file mode 100644
index 0000000..4898249
--- /dev/null
+++ b/js/nls/lv/resources.js
@@ -0,0 +1,12 @@
+define(
+   ({
+        map: {
+            error: "ķ_Unable to create map_ū"
+        }, 
+        tools: {
+        	legend: "ķ_Legend_ū",
+        	 about: "ķ_About_ū"
+        }
+    })
+   
+);
\ No newline at end of file
diff --git a/js/nls/nb/resources.js b/js/nls/nb/resources.js
new file mode 100644
index 0000000..fc39a17
--- /dev/null
+++ b/js/nls/nb/resources.js
@@ -0,0 +1,12 @@
+define(
+   ({
+        map: {
+            error: "å_Unable to create map_ø"
+        }, 
+        tools: {
+        	legend: "å_Legend_ø",
+        	 about: "å_About_ø"
+        }
+    })
+   
+);
\ No newline at end of file
diff --git a/js/nls/nl/resources.js b/js/nls/nl/resources.js
new file mode 100644
index 0000000..5816a46
--- /dev/null
+++ b/js/nls/nl/resources.js
@@ -0,0 +1,12 @@
+define(
+   ({
+        map: {
+            error: "Map kan niet gemaakt worden"
+        }, 
+        tools: {
+        	legend: "Legenda",
+        	 about: "Over"
+        }
+    })
+   
+);
\ No newline at end of file
diff --git a/js/nls/pl/resources.js b/js/nls/pl/resources.js
new file mode 100644
index 0000000..d83a8df
--- /dev/null
+++ b/js/nls/pl/resources.js
@@ -0,0 +1,12 @@
+define(
+   ({
+        map: {
+            error: "Nie udało się utworzyć mapy"
+        }, 
+        tools: {
+        	legend: "Legenda",
+        	 about: "Informacje"
+        }
+    })
+   
+);
\ No newline at end of file
diff --git a/js/nls/pt-BR/resources.js b/js/nls/pt-BR/resources.js
new file mode 100644
index 0000000..a45b973
--- /dev/null
+++ b/js/nls/pt-BR/resources.js
@@ -0,0 +1,12 @@
+define(
+   ({
+        map: {
+            error: "Não foi possível criar o mapa"
+        }, 
+        tools: {
+        	legend: "Legenda",
+        	 about: "Sobre"
+        }
+    })
+   
+);
\ No newline at end of file
diff --git a/js/nls/pt-PT/resources.js b/js/nls/pt-PT/resources.js
new file mode 100644
index 0000000..c39a5c4
--- /dev/null
+++ b/js/nls/pt-PT/resources.js
@@ -0,0 +1,12 @@
+define(
+   ({
+        map: {
+            error: "ã_Unable to create map_Ç"
+        }, 
+        tools: {
+        	legend: "ã_Legend_Ç",
+        	 about: "ã_About_Ç"
+        }
+    })
+   
+);
\ No newline at end of file

js/nls/resources.js 36(+36 -0)

diff --git a/js/nls/resources.js b/js/nls/resources.js
new file mode 100644
index 0000000..0ab153e
--- /dev/null
+++ b/js/nls/resources.js
@@ -0,0 +1,36 @@
+define({
+    root: ({
+        map: {
+            error: "Unable to create map"
+        }, 
+        tools: {
+        	legend: "Legend",
+        	 about: "About"
+        }
+    }),
+    "ar":1,
+    "cs":1,
+    "da":1,
+    "de":1,
+    "es":1,
+    "et":1,
+    "fi":1,
+    "fr":1,
+    "he":1,
+    "it":1,
+    "ja":1,
+    "ko":1,
+    "lt":1,
+    "lv":1,
+    "nl":1,
+    "nb":1,
+    "pl":1,
+    "pt-br":1,
+    "pt-pt":1,
+    "ro":1,
+    "ru":1,
+    "sv":1,
+    "tr":1,
+    "th":1,
+    "zh-cn":1
+});
\ No newline at end of file
diff --git a/js/nls/ro/resources.js b/js/nls/ro/resources.js
new file mode 100644
index 0000000..fc6c2da
--- /dev/null
+++ b/js/nls/ro/resources.js
@@ -0,0 +1,12 @@
+define(
+   ({
+        map: {
+            error: "Nu se poate crea harta"
+        }, 
+        tools: {
+        	legend: "Legendă",
+        	 about: "Despre"
+        }
+    })
+   
+);
\ No newline at end of file
diff --git a/js/nls/ru/resources.js b/js/nls/ru/resources.js
new file mode 100644
index 0000000..f8ac275
--- /dev/null
+++ b/js/nls/ru/resources.js
@@ -0,0 +1,12 @@
+define(
+   ({
+        map: {
+            error: "Не удалось создать карту"
+        }, 
+        tools: {
+        	legend: "Легенда",
+        	 about: "О"
+        }
+    })
+   
+);
\ No newline at end of file
diff --git a/js/nls/sv/resources.js b/js/nls/sv/resources.js
new file mode 100644
index 0000000..410883d
--- /dev/null
+++ b/js/nls/sv/resources.js
@@ -0,0 +1,12 @@
+define(
+   ({
+        map: {
+            error: "Å_Unable to create map_ö"
+        }, 
+        tools: {
+        	legend: "Å_Legend_ö",
+        	 about: "Å_About_ö"
+        }
+    })
+   
+);
\ No newline at end of file
diff --git a/js/nls/th/resources.js b/js/nls/th/resources.js
new file mode 100644
index 0000000..3bce35f
--- /dev/null
+++ b/js/nls/th/resources.js
@@ -0,0 +1,12 @@
+define(
+   ({
+        map: {
+            error: "ก้_Unable to create map_ษฺ"
+        }, 
+        tools: {
+        	legend: "ก้_Legend_ษฺ",
+        	 about: "ก้_About_ษฺ"
+        }
+    })
+   
+);
\ No newline at end of file
diff --git a/js/nls/tr/resources.js b/js/nls/tr/resources.js
new file mode 100644
index 0000000..5f4c4ba
--- /dev/null
+++ b/js/nls/tr/resources.js
@@ -0,0 +1,12 @@
+define(
+   ({
+        map: {
+            error: "Harita oluşturulamıyor"
+        }, 
+        tools: {
+        	legend: "Gösterim",
+        	 about: "Hakkında"
+        }
+    })
+   
+);
\ No newline at end of file
diff --git a/js/nls/zh-CN/resources.js b/js/nls/zh-CN/resources.js
new file mode 100644
index 0000000..887fe1e
--- /dev/null
+++ b/js/nls/zh-CN/resources.js
@@ -0,0 +1,12 @@
+define(
+   ({
+        map: {
+            error: "无法创建地图"
+        }, 
+        tools: {
+        	legend: "图例",
+        	 about: "关于"
+        }
+    })
+   
+);
\ No newline at end of file
diff --git a/js/OAuthHelper.js b/js/OAuthHelper.js
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/js/OAuthHelper.js

js/selectivizr-min.js 261(+261 -0)

diff --git a/js/selectivizr-min.js b/js/selectivizr-min.js
new file mode 100644
index 0000000..88faffa
--- /dev/null
+++ b/js/selectivizr-min.js
@@ -0,0 +1,261 @@
+/*!
+ * selectivizr v1.0.2 - (c) Keith Clark, freely distributable under the terms of the MIT license.
+ * selectivizr.com
+ */
+(function (j) {
+    function A(a) {
+        return a.replace(B, h).replace(C, function (a, d, b) {
+            for (var a = b.split(","), b = 0, e = a.length; b < e; b++) {
+                var s = D(a[b].replace(E, h).replace(F, h)) + o,
+                    l = [];
+                a[b] = s.replace(G, function (a, b, c, d, e) {
+                    if (b) {
+                        if (l.length > 0) {
+                            var a = l,
+                                f, e = s.substring(0, e).replace(H, i);
+                            if (e == i || e.charAt(e.length - 1) == o) e += "*";
+                            try {
+                                f = t(e)
+                            } catch (k) {}
+                            if (f) {
+                                e = 0;
+                                for (c = f.length; e < c; e++) {
+                                    for (var d = f[e], h = d.className, j = 0, m = a.length; j < m; j++) {
+                                        var g = a[j];
+                                        if (!RegExp("(^|\\s)" + g.className + "(\\s|$)").test(d.className) && g.b && (g.b === !0 || g.b(d) === !0)) h = u(h, g.className, !0)
+                                    }
+                                    d.className = h
+                                }
+                            }
+                            l = []
+                        }
+                        return b
+                    } else {
+                        if (b = c ? I(c) : !v || v.test(d) ? {
+                            className: w(d),
+                            b: !0
+                        } : null) return l.push(b), "." + b.className;
+                        return a
+                    }
+                })
+            }
+            return d + a.join(",")
+        })
+    }
+
+    function I(a) {
+        var c = !0,
+            d = w(a.slice(1)),
+            b = a.substring(0, 5) == ":not(",
+            e, f;
+        b && (a = a.slice(5, -1));
+        var l = a.indexOf("(");
+        l > -1 && (a = a.substring(0, l));
+        if (a.charAt(0) == ":") switch (a.slice(1)) {
+        case "root":
+            c = function (a) {
+                return b ? a != p : a == p
+            };
+            break;
+        case "target":
+            if (m == 8) {
+                c = function (a) {
+                    function c() {
+                        var d = location.hash,
+                            e = d.slice(1);
+                        return b ? d == i || a.id != e : d != i && a.id == e
+                    }
+                    k(j, "hashchange", function () {
+                        g(a, d, c())
+                    });
+                    return c()
+                };
+                break
+            }
+            return !1;
+        case "checked":
+            c = function (a) {
+                J.test(a.type) && k(a, "propertychange", function () {
+                    event.propertyName == "checked" && g(a, d, a.checked !== b)
+                });
+                return a.checked !== b
+            };
+            break;
+        case "disabled":
+            b = !b;
+        case "enabled":
+            c = function (c) {
+                if (K.test(c.tagName)) return k(c, "propertychange", function () {
+                    event.propertyName == "$disabled" && g(c, d, c.a === b)
+                }), q.push(c), c.a = c.disabled, c.disabled === b;
+                return a == ":enabled" ? b : !b
+            };
+            break;
+        case "focus":
+            e = "focus", f = "blur";
+        case "hover":
+            e || (e = "mouseenter", f = "mouseleave");
+            c = function (a) {
+                k(a, b ? f : e, function () {
+                    g(a, d, !0)
+                });
+                k(a, b ? e : f, function () {
+                    g(a, d, !1)
+                });
+                return b
+            };
+            break;
+        default:
+            if (!L.test(a)) return !1
+        }
+        return {
+            className: d,
+            b: c
+        }
+    }
+
+    function w(a) {
+        return M + "-" + (m == 6 && N ? O++ : a.replace(P, function (a) {
+            return a.charCodeAt(0)
+        }))
+    }
+
+    function D(a) {
+        return a.replace(x, h).replace(Q, o)
+    }
+
+    function g(a, c, d) {
+        var b = a.className,
+            c = u(b, c, d);
+        if (c != b) a.className = c, a.parentNode.className += i
+    }
+
+    function u(a, c, d) {
+        var b = RegExp("(^|\\s)" + c + "(\\s|$)"),
+            e = b.test(a);
+        return d ? e ? a : a + o + c : e ? a.replace(b, h).replace(x, h) : a
+    }
+
+    function k(a, c, d) {
+        a.attachEvent("on" + c, d)
+    }
+
+    function r(a, c) {
+        if (/^https?:\/\//i.test(a)) return c.substring(0, c.indexOf("/", 8)) == a.substring(0, a.indexOf("/", 8)) ? a : null;
+        if (a.charAt(0) == "/") return c.substring(0, c.indexOf("/", 8)) + a;
+        var d = c.split(/[?#]/)[0];
+        a.charAt(0) != "?" && d.charAt(d.length - 1) != "/" && (d = d.substring(0, d.lastIndexOf("/") + 1));
+        return d + a
+    }
+
+    function y(a) {
+        if (a) return n.open("GET", a, !1), n.send(), (n.status == 200 ? n.responseText : i).replace(R, i).replace(S, function (c, d, b, e, f) {
+            return y(r(b || f, a))
+        }).replace(T, function (c, d, b) {
+            d = d || i;
+            return " url(" + d + r(b, a) + d + ") "
+        });
+        return i
+    }
+
+    function U() {
+        var a, c;
+        a = f.getElementsByTagName("BASE");
+        for (var d = a.length > 0 ? a[0].href : f.location.href, b = 0; b < f.styleSheets.length; b++) if (c = f.styleSheets[b], c.href != i && (a = r(c.href, d))) c.cssText = A(y(a));
+        q.length > 0 && setInterval(function () {
+            for (var a = 0, c = q.length; a < c; a++) {
+                var b = q[a];
+                if (b.disabled !== b.a) b.disabled ? (b.disabled = !1, b.a = !0, b.disabled = !0) : b.a = b.disabled
+            }
+        }, 250)
+    }
+    if (! /*@cc_on!@*/ true) {
+        var f = document,
+            p = f.documentElement,
+            n = function () {
+                if (j.XMLHttpRequest) return new XMLHttpRequest;
+                try {
+                    return new ActiveXObject("Microsoft.XMLHTTP")
+                } catch (a) {
+                    return null
+                }
+            }(),
+            m = /MSIE (\d+)/.exec(navigator.userAgent)[1];
+        if (!(f.compatMode != "CSS1Compat" || m < 6 || m > 8 || !n)) {
+            var z = {
+                NW: "*.Dom.select",
+                MooTools: "$$",
+                DOMAssistant: "*.$",
+                Prototype: "$$",
+                YAHOO: "*.util.Selector.query",
+                Sizzle: "*",
+                jQuery: "*",
+                dojo: "*.query"
+            },
+                t, q = [],
+                O = 0,
+                N = !0,
+                M = "slvzr",
+                R = /(\/\*[^*]*\*+([^\/][^*]*\*+)*\/)\s*/g,
+                S = /@import\s*(?:(?:(?:url\(\s*(['"]?)(.*)\1)\s*\))|(?:(['"])(.*)\3))[^;]*;/g,
+                T = /\burl\(\s*(["']?)(?!data:)([^"')]+)\1\s*\)/g,
+                L = /^:(empty|(first|last|only|nth(-last)?)-(child|of-type))$/,
+                B = /:(:first-(?:line|letter))/g,
+                C = /(^|})\s*([^\{]*?[\[:][^{]+)/g,
+                G = /([ +~>])|(:[a-z-]+(?:\(.*?\)+)?)|(\[.*?\])/g,
+                H = /(:not\()?:(hover|enabled|disabled|focus|checked|target|active|visited|first-line|first-letter)\)?/g,
+                P = /[^\w-]/g,
+                K = /^(INPUT|SELECT|TEXTAREA|BUTTON)$/,
+                J = /^(checkbox|radio)$/,
+                v = m > 6 ? /[\$\^*]=(['"])\1/ : null,
+                E = /([(\[+~])\s+/g,
+                F = /\s+([)\]+~])/g,
+                Q = /\s+/g,
+                x = /^\s*((?:[\S\s]*\S)?)\s*$/,
+                i = "",
+                o = " ",
+                h = "$1";
+            (function (a, c) {
+                function d() {
+                    try {
+                        p.doScroll("left")
+                    } catch (a) {
+                        setTimeout(d, 50);
+                        return
+                    }
+                    b("poll")
+                }
+
+                function b(d) {
+                    if (!(d.type == "readystatechange" && f.readyState != "complete") && ((d.type == "load" ? a : f).detachEvent("on" + d.type, b, !1), !e && (e = !0))) c.call(a, d.type || d)
+                }
+                var e = !1,
+                    g = !0;
+                if (f.readyState == "complete") c.call(a, i);
+                else {
+                    if (f.createEventObject && p.doScroll) {
+                        try {
+                            g = !a.frameElement
+                        } catch (h) {}
+                        g && d()
+                    }
+                    k(f, "readystatechange", b);
+                    k(a, "load", b)
+                }
+            })(j, function () {
+                for (var a in z) {
+                    var c, d, b = j;
+                    if (j[a]) {
+                        for (c = z[a].replace("*", a).split(".");
+                        (d = c.shift()) && (b = b[d]););
+                        if (typeof b == "function") {
+                            t = b;
+                            U();
+                            break
+                        }
+                    }
+                }
+            })
+        }
+    }
+})(this);
\ No newline at end of file

js/template.js 281(+281 -0)

diff --git a/js/template.js b/js/template.js
new file mode 100644
index 0000000..0adeadf
--- /dev/null
+++ b/js/template.js
@@ -0,0 +1,281 @@
+define(["dojo/Evented", "dojo/parser", "dojo/_base/declare", "dojo/_base/kernel", "dojo/_base/array", "dojo/_base/lang", "dojo/dom-class", "dojo/Deferred", "dojo/promise/all", "esri/arcgis/utils", "esri/urlUtils", "esri/request", "esri/config", "esri/lang", "esri/IdentityManager", "esri/tasks/GeometryService", "config/defaults", "application/OAuthHelper", "config/commonConfig"
+
+], function (
+Evented, parser, declare, kernel, array, lang, domClass, Deferred, all, arcgisUtils, urlUtils, esriRequest, esriConfig, esriLang, IdentityManager, GeometryService, defaults, OAuthHelper, commonConfig) {
+    return declare([Evented], {
+        config: {},
+        localize: false,
+        orgConfig: {},
+        appConfig: {},
+        constructor: function (supportsLocalization) {
+            //config will contain application and user defined info for the application such as i18n strings, 
+            //the web map id and application id, any url parameters and any application specific configuration
+            // information. 
+            this.config = declare.safeMixin(defaults, commonConfig);
+            this.localize = supportsLocalization || false;
+            this._init().then(lang.hitch(this, function () {
+                this.emit("ready", this.config);
+            }));
+        },
+        //Get URL parameters and set application defaults needed to query arcgis.com for
+        //an application and to see if the app is running in Portal or an Org
+        _init: function () {
+            var deferred = new Deferred();
+            //Set the web map, group and appid if they exist but ignore other url params. 
+            //Additional url parameters may be defined by the application but they need to be mixed in
+            //to the config object after we retrieve the application configuration info. As an example,
+            //we'll mix in some commonly used url parameters in the _queryUrlParams function after
+            //the application configuration has been applied so that the url parameters overwrite any
+            //configured settings. It's up to the application developer to update the application to take 
+            //advantage of these parameters. 
+            var paramItems = ["webmap", "appid", "group", "oauthappid"];
+            var mixinParams = this._createUrlParamsObject(paramItems);
+            lang.mixin(this.config, mixinParams);
+            //Define the sharing url and other default values like the proxy. 
+            //The sharing url defines where to search for the web map and application content. The
+            //default value is arcgis.com. 
+            this._initializeApplication();
+
+            this._getLocalization().then(lang.hitch(this, this._queryApplicationConfiguration)).then(lang.hitch(this, this._queryDisplayItem)).then(lang.hitch(this, this._queryOrganizationInformation)).then(lang.hitch(this, function () {
+
+
+                //Now that we have the org and app settings do the mixins. First overwrite the defaults 
+                //with the application settings then apply org settings if required
+                lang.mixin(this.config, this.appConfig);
+                if (this.config.queryForOrg !== false) {
+                    lang.mixin(this.config, this.orgConfig);
+                }
+                //Set the geometry helper service to be the app default.  
+                if (this.config.helperServices && this.config.helperServices.geometry && this.config.helperServices.geometry.url) {
+                    esriConfig.defaults.geometryService = new GeometryService(this.config.helperServices.geometry.url);
+                }
+                //Now update the config with any custom url params
+                this._queryUrlParams();
+
+                //setup OAuth if oauth appid exists
+                if (this.config.oauthappid) {
+                    this._setupOAuth(this.config.oauthappid, this.config.sharinghost);
+                }
+
+                deferred.resolve();
+            }));
+
+            return deferred.promise;
+        },
+        _createUrlParamsObject: function (items) {
+            //retrieve url parameters. Templates all use url parameters to determine which arcgis.com 
+            //resource to work with. 
+            //Map templates use the webmap param to define the webmap to display
+            //Group templates use the group param to provide the id of the group to display. 
+            //appid is the id of the application based on the template. We use this 
+            //id to retrieve application specific configuration information. The configuration 
+            //information will contain the values the  user selected on the template configuration 
+            //panel.  
+            var urlObject = urlUtils.urlToObject(document.location.href);
+            urlObject.query = urlObject.query || {};
+            var obj = {};
+            if (urlObject.query && items && items.length) {
+                for (var i = 0; i < items.length; i++) {
+                    if (urlObject.query[items[i]]) {
+                        obj[items[i]] = urlObject.query[items[i]];
+                    }
+                }
+            }
+            return obj;
+        },
+
+        _initializeApplication: function () {
+
+            //Check to see if the app is hosted or a portal. If the app is hosted or a portal set the
+            // sharing url and the proxy. Otherwise use the sharing url set it to arcgis.com. 
+            //We know app is hosted (or portal) if it has /apps/ or /home/ in the url. 
+            var appLocation = location.pathname.indexOf("/apps/");
+            if (appLocation === -1) {
+                appLocation = location.pathname.indexOf("/home/");
+            }
+            //app is hosted and no sharing url is defined so let's figure it out. 
+            if (appLocation !== -1) {
+                //hosted or portal
+                var instance = location.pathname.substr(0, appLocation); //get the portal instance name
+                //this.config.sharinghost = location.protocol + "//" + location.host + instance;
+                this.config.sharinghost = location.protocol + "//" + "www.arcgis.com";
+                this.config.proxyurl = location.protocol + "//" + location.host + instance + "/sharing/proxy";
+            } else {
+                //setup OAuth if oauth appid exists. If we don't call it here before querying for appid
+                //the identity manager dialog will appear if the appid isn't publicly shared.
+                if (this.config.oauthappid) {
+                    this._setupOAuth(this.config.oauthappid, this.config.sharinghost);
+                }
+            }
+            arcgisUtils.arcgisUrl = this.config.sharinghost + "/sharing/rest/content/items";
+            //Define the proxy url for the app 
+            if (this.config.proxyurl) {
+                esriConfig.defaults.io.proxyUrl = this.config.proxyurl;
+                esriConfig.defaults.io.alwaysUseProxy = false;
+            }
+
+            //check sign-in status 
+            IdentityManager.checkSignInStatus(this.config.sharinghost + "/sharing").then(lang.hitch(this, function (credential) {
+                return;
+            }, function (error) {
+                return;
+            }));
+
+        },
+        _setupOAuth: function (id, portal) {
+            OAuthHelper.init({
+                appId: id,
+                portal: portal,
+                expiration: (14 * 24 * 60) //2 weeks (in minutes)
+            });
+        },
+        _getLocalization: function () {
+            var deferred = new Deferred();
+            if (this.localize) {
+                require(["dojo/i18n!application/nls/resources"], lang.hitch(this, function (appBundle) {
+                    //Get the localization strings for the template and store in an i18n variable. Also determine if the 
+                    //application is in a right-to-left language like Arabic or Hebrew. 
+                    this.config.i18n = appBundle || {};
+                    //Bi-directional language support added to support right-to-left languages like Arabic and Hebrew
+                    //Note: The map must stay ltr  
+                    this.config.i18n.direction = "ltr";
+                    array.some(["ar", "he"], lang.hitch(this, function (l) {
+                        if (kernel.locale.indexOf(l) !== -1) {
+                            this.config.i18n.direction = "rtl";
+                            return true;
+                        } else {
+                            return false;
+                        }
+                    }));
+                    //add a dir attribute to the html tag. Then you can add special css classes for rtl languages
+                    var dirNode = document.getElementsByTagName("html")[0];
+                    var classes = dirNode.className;
+                    if (this.config.i18n.direction === "rtl") {
+                        //need to add support for dj_rtl. 
+                        //if the dir node is set when the app loads dojo will handle. 
+                        dirNode.setAttribute("dir", "rtl");
+                        var rtlClasses = " esriRTL dj_rtl dijitRtl " + classes.replace(/ /g, "-rtl ");
+                        dirNode.className = lang.trim(classes + rtlClasses);
+                    } else {
+                        dirNode.setAttribute("dir", "ltr");
+                        domClass.add(dirNode, "esriLTR");
+                    }
+                    deferred.resolve(this.config.i18n);
+                }));
+            } else {
+                deferred.resolve();
+            }
+            return deferred.promise;
+        },
+        _queryDisplayItem: function () {
+            //Get details about the specified web map or group. If the group or web map is not shared publicly users will
+            //be prompted to log-in by the Identity Manager.
+            var deferred = new Deferred();
+            if (this.config.webmap || this.config.group) {
+                var itemId = this.config.webmap || this.config.group;
+                arcgisUtils.getItem(itemId).then(lang.hitch(this, function (itemInfo) {
+                    //ArcGIS.com allows you to set an application extent on the application item. Overwrite the 
+                    //existing web map extent with the application item extent when set. 
+                    if (this.config.appid && this.config.application_extent.length > 0 && itemInfo.item.extent) {
+                        itemInfo.item.extent = [
+                            [
+                            parseFloat(this.config.application_extent[0][0]), parseFloat(this.config.application_extent[0][1])],
+                            [
+                            parseFloat(this.config.application_extent[1][0]), parseFloat(this.config.application_extent[1][1])]
+                        ];
+                    }
+                    //Set the itemInfo config option. This can be used when calling createMap instead of the webmap or group id 
+                    this.config.itemInfo = itemInfo;
+                    deferred.resolve();
+                }));
+            } else {
+                deferred.resolve();
+            }
+            return deferred.promise;
+        },
+        _queryApplicationConfiguration: function () {
+            //Get the application configuration details using the application id. When the response contains
+            //itemData.values then we know the app contains configuration information. We'll use these values
+            //to overwrite the application defaults.
+            var deferred = new Deferred();
+            if (this.config.appid) {
+                arcgisUtils.getItem(this.config.appid).then(lang.hitch(this, function (response) {
+                    if (response.item && response.itemData && response.itemData.values) {
+                        //get app config values - we'll merge them with config later. 
+                        this.appConfig = response.itemData.values;
+
+                        //Get the web map from the app values. But if there's a web url
+                        //parameter don't overwrite with the app value. 
+                        var webmapParam = this._createUrlParamsObject(["webmap"]);
+                        if (!esriLang.isDefined(webmapParam.webmap) && response.itemData.values.webmap && this.config.webmap) {
+                            this.config.webmap = response.itemData.values.webmap;
+                        }
+                    }
+                    //get the extent for the application item. This can be used to override the default web map extent
+                    if (response.item && response.item.extent) {
+                        this.config.application_extent = response.item.extent;
+                    }
+                    deferred.resolve();
+                }));
+            } else {
+                deferred.resolve();
+            }
+            return deferred.promise;
+        },
+        _queryOrganizationInformation: function () {
+            var deferred = new Deferred();
+            //Query the ArcGIS.com organization. This is defined by the sharinghost that is specified. For example if you 
+            //are a member of an org you'll want to set the sharinghost to be http://<your org name>.arcgis.com. We query 
+            //the organization by making a self request to the org url which returns details specific to that organization. 
+            //Examples of the type of information returned are custom roles, units settings, helper services and more. 
+            esriRequest({
+                url: this.config.sharinghost + "/sharing/rest/portals/self",
+                content: {
+                    "f": "json"
+                },
+                callbackParamName: "callback"
+            }).then(lang.hitch(this, function (response) {
+                //get units defined by the org or the org user
+                this.orgConfig.units = "metric";
+                if (response.user && response.user.units) { //user defined units
+                    this.orgConfig.units = response.user.units;
+                } else if (response.units) { //org level units 
+                    this.orgConfig.units = response.units;
+                } else if ((response.user && response.user.region && response.user.region === "US") || (response.user && !response.user.region && response.region === "US") || (response.user && !response.user.region && !response.region) || (!response.user && response.ipCntryCode === "US") || (!response.user && !response.ipCntryCode && kernel.locale === "en-us")) {
+                    // use feet/miles only for the US and if nothing is set for a user
+                    this.orgConfig.units = "english";
+                }
+                //Get the helper servcies (routing, print, locator etc)
+                this.orgConfig.helperServices = {};
+                lang.mixin(this.orgConfig.helperServices, response.helperServices);
+
+
+                //are any custom roles defined in the organization? 
+                if (response.user && esriLang.isDefined(response.user.roleId)) {
+                    if (response.user.privileges) {
+                        this.orgConfig.userPrivileges = response.user.privileges;
+                    }
+                }
+
+
+                deferred.resolve();
+            }), function (error) {
+                console.log(error);
+                deferred.resolve();
+            });
+            return deferred.promise;
+        },
+        _queryUrlParams: function () {
+            //This function demonstrates how to handle additional custom url parameters. For example 
+            //if you want users to be able to specify lat/lon coordinates that define the map's center or 
+            //specify an alternate basemap via a url parameter. 
+            //If these options are also configurable these updates need to be added after any 
+            //application default and configuration info has been applied. Currently these values 
+            //(center, basemap, theme) are only here as examples and can be removed if you don't plan on 
+            //supporting additional url parameters in your application. 
+            var paramItems = ["center", "basemap", "theme", "extent"];
+            var mixinParams = this._createUrlParamsObject(paramItems);
+            lang.mixin(this.config, mixinParams);
+        }
+    });
+});
\ No newline at end of file

README.md 8(+8 -0)

diff --git a/README.md b/README.md
new file mode 100644
index 0000000..42a8d1d
--- /dev/null
+++ b/README.md
@@ -0,0 +1,8 @@
+# Be College Ready
+
+## Updates
+
+### February 2018
+
++ update sidebar with [feb2018.docx](./resources/feb2018.docx)
++ pointer to new web map id - b8e87d8ced674513a19aedd65be72eee
\ No newline at end of file
diff --git a/resources/feb2018.docx b/resources/feb2018.docx
new file mode 100644
index 0000000..e65516f
Binary files /dev/null and b/resources/feb2018.docx differ

web.config 10(+10 -0)

diff --git a/web.config b/web.config
new file mode 100644
index 0000000..1136eac
--- /dev/null
+++ b/web.config
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration>
+    <system.webServer>
+        <defaultDocument>
+            <files>
+                <add value="index.html" />
+            </files>
+        </defaultDocument>
+    </system.webServer>
+</configuration>