You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@usergrid.apache.org by sn...@apache.org on 2014/03/27 23:21:31 UTC

[37/50] [abbrv] adding help framework adding google analytics framework bug fixes

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/097fd3bd/portal/index-debug.html
----------------------------------------------------------------------
diff --git a/portal/index-debug.html b/portal/index-debug.html
index 0aaf485..3435072 100644
--- a/portal/index-debug.html
+++ b/portal/index-debug.html
@@ -8,14 +8,15 @@
   <meta name="description" content="">
   <meta name="author" content="">
 
-  <link id="libScript" href="2.0.0/js/libs/bootstrap/custom/css/bootstrap.min.css" rel="stylesheet">
-  <link id="libScript" href="2.0.0/css/dash.min.css" rel="stylesheet">
+  <link id="libScript" href="2.0.1/js/libs/bootstrap/custom/css/bootstrap.min.css" rel="stylesheet">
+  <link id="libScript" rel="stylesheet" href="2.0.1/bower_components/intro.js/introjs.css">
+  <link id="libScript" href="2.0.1/css/dash.min.css" rel="stylesheet">
 
   <!--styles for jquery ui calendar component-->
-  <link id="libScript" rel="stylesheet" type="text/css" href="2.0.0/js/libs/jqueryui/jquery-ui-1.8.9.custom.css">
-  <link id="libScript" rel="stylesheet" type="text/css" href="2.0.0/js/libs/jqueryui/jquery-ui-timepicker.css">
+  <link id="libScript" rel="stylesheet" type="text/css" href="2.0.1/js/libs/jqueryui/jquery-ui-1.8.9.custom.css">
+  <link id="libScript" rel="stylesheet" type="text/css" href="2.0.1/js/libs/jqueryui/jquery-ui-timepicker.css">
 </head>
-<body ng-controller="PageCtrl">
+<body ng-controller="PageCtrl" ng-intro-onchange="help.introjs_ChangeEvent" ng-intro-options="help.IntroOptions" ng-intro-onexit="help.introjs_ExitEvent" ng-intro-method="startHelp" ng-intro-autostart="false">
 <!-- Google Tag Manager -->
 <noscript><iframe src="//www.googletagmanager.com/ns.html?id=GTM-N52333" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
 <script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
@@ -32,18 +33,20 @@
         <span class="icon-bar"></span>
         <span class="icon-bar"></span>
       </button>
-      <a class="brand" href="#"><img src="img/logo.gif"></a>
-
+      <a class="brand" href="#"><img src="img/logo.gif"></a>      
       <div appswitcher=""></div>
 
 
       <div class="nav-collapse collapse" ng-show="loaded">
-
+        <div class="navbar-text pull-left" ng-if="activeUI">
+          <button class="helpButton" ng-class="{helpButtonClicked:help.helpTooltipsEnabled}" ng-click="help.toggleTooltips()" ng-show="help.showHelpButtons">{{help.helpButtonStatus}}</button>
+          <button class="helpButton" ng-click="startHelp(); help.introjs_StartEvent();" ng-show="help.showHelpButtons">Take the Tour</button>
+        </div>
         <div class="navbar-text pull-right" ng-if="activeUI">
           <span class="navbar-text" id="userEmail">{{userEmail}}</span> |
           <span ng-controller="LoginCtrl"><a id="logout-link" ng-click="logout()" title="logout"><i class="pictogram">&#59201</i></a></span>
           <span><a ng-click="profile()" title="profile"><i class="pictogram">&#59170</i></a></span> |
-          <span><a href="archive/" target="_blank">Legacy Portal</a></span>
+          <span><a href="archive/" target="_blank">Legacy Portal</a></span> |          
         </div>
 
       </div>
@@ -52,13 +55,15 @@
 </header>
 <section class="side-menu" ng-cloak="" ng-show="activeUI">
   <div class="sidebar-nav">
-    <div class="nav-collapse collapse">
+    <div id="intro-1-org" class="nav-collapse collapse">
 
       <org-menu context="orgmenu"></org-menu>
 
     </div>
-    <div class="nav-collapse collapse" id="sideMenu">
-    <ul class="nav nav-list" menu="sideMenu"><li class="option active" ng-cloak=""><a data-ng-href="#!/org-overview"><i class="pictogram">&#128362;</i>Org Administration</a></li><li class="option " ng-cloak=""><a data-ng-href="#!/getting-started/setup"><i class="pictogram">&#128640;</i>Getting Started</a></li><li class="option " ng-cloak=""><a data-ng-href="#!/app-overview/summary"><i class="pictogram">&#59214;</i>App Overview</a><ul class="nav nav-list"><li><a data-ng-href="#!/app-overview/summary"><i class="pictogram sub">&#128241;</i>Summary</a></li></ul></li><li class="option " ng-cloak=""><a data-ng-href="#!/users"><i class="pictogram">&#128100;</i>Users</a><ul class="nav nav-list"><li><a data-ng-href="#!/users"><i class="pictogram sub">&#128100;</i>Users</a></li></ul><ul class="nav nav-list"><li><a data-ng-href="#!/groups"><i class="pictogram sub">&#128101;</i>Groups</a></li></ul><ul class="nav nav-list"><li><a data-ng-href="#!/roles"><i class="pictogram sub">&#59170;</i>Roles
 </a></li></ul></li><li class="option " ng-cloak=""><a data-ng-href="#!/data"><i class="pictogram">&#128248;</i>Data</a><ul class="nav nav-list"><li><a data-ng-href="#!/data"><i class="pictogram sub">&#128254;</i>Collections</a></li></ul></li><li class="option " ng-cloak=""><a data-ng-href="#!/activities"><i class="pictogram">&#59194;</i>Activities</a></li><li class="option " ng-cloak=""><a data-ng-href="#!/shell"><i class="pictogram">&#9000;</i>Shell</a></li></ul></div>
+    <div id="intro-3-side-menu">
+	    <div class="nav-collapse collapse" id="sideMenu">
+	    <ul class="nav nav-list" menu="sideMenu"><li class="option active" ng-cloak=""><a data-ng-href="#!/org-overview"><i class="pictogram">&#128362;</i>Org Administration</a></li><li class="option " ng-cloak=""><a data-ng-href="#!/getting-started/setup"><i class="pictogram">&#128640;</i>Getting Started</a></li><li class="option " ng-cloak=""><a data-ng-href="#!/app-overview/summary"><i class="pictogram">&#59214;</i>App Overview</a><ul class="nav nav-list"><li><a data-ng-href="#!/app-overview/summary"><i class="pictogram sub">&#128241;</i>Summary</a></li></ul></li><li class="option " ng-cloak=""><a data-ng-href="#!/users"><i class="pictogram">&#128100;</i>Users</a><ul class="nav nav-list"><li><a data-ng-href="#!/users"><i class="pictogram sub">&#128100;</i>Users</a></li></ul><ul class="nav nav-list"><li><a data-ng-href="#!/groups"><i class="pictogram sub">&#128101;</i>Groups</a></li></ul><ul class="nav nav-list"><li><a data-ng-href="#!/roles"><i class="pictogram sub">&#59170;</i>Role
 s</a></li></ul></li><li class="option " ng-cloak=""><a data-ng-href="#!/data"><i class="pictogram">&#128248;</i>Data</a><ul class="nav nav-list"><li><a data-ng-href="#!/data"><i class="pictogram sub">&#128254;</i>Collections</a></li></ul></li><li class="option " ng-cloak=""><a data-ng-href="#!/activities"><i class="pictogram">&#59194;</i>Activities</a></li><li class="option " ng-cloak=""><a data-ng-href="#!/shell"><i class="pictogram">&#9000;</i>Shell</a></li></ul></div>
+	</div>
   </div>
 </section>
 
@@ -66,21 +71,23 @@
   <div class="container-fluid">
     <div class="row-fluid">
       <div class="span12">
-
+        <bsmodal id="tooltips" title="Help Tooltips Enabled" close="hideModal" closelabel="OK" ng-cloak="">
+          <p>Hover your cursor over the '(?)' icons to get helpful tips and information.</p>
+        </bsmodal>
         <!--header app/org context nav-->
 
         <nav class="navbar secondary" ng-show="activeUI">
           <div class="container-fluid">
             <div class="row-fluid">
               <div class="span12">
-                <div class="span5">
+                <div class="span5" id="intro-2-app-menu">
                   <app-menu></app-menu>
                 </div>
                 <div class="span7 button-area">
                   <div class="nav-collapse collapse">
                     <ul class="helper-links nav span12">
                       <li class="sdks span12">
-                        <ul class="pull-right">
+                        <ul id="intro-9-sdks" class="pull-right">
                           <li class="title"><label>SDKs and Modules</label></li>
                           <li><a target="_blank" href="http://apigee.com/docs/usergrid/content/sdks-and-examples#ios"><i class="sdk-icon-ios"></i></a></li>
                           <li><a target="_blank" href="http://apigee.com/docs/usergrid/content/sdks-and-examples#android"><i class="sdk-icon-android"></i></a></li>
@@ -115,14 +122,13 @@
     </div>
   </div>
 </section>
-<script id="libScript" src="2.0.0/js/libs/usergrid-libs.min.js"></script>
-<script id="libScript" src="2.0.0/js/libs/bootstrap/custom/js/bootstrap.min.js"></script>
+<script id="libScript" src="2.0.1/js/libs/usergrid-libs.min.js"></script>
+<script id="libScript" src="2.0.1/js/libs/bootstrap/custom/js/bootstrap.min.js"></script>
 <!--todo - remove this. temporarily including jquery ui for calendar in push-->
-<script id="libScript" src="2.0.0/js/libs/jqueryui/jquery.ui.timepicker.min.js" type="text/javascript"></script>
+<script id="libScript" src="2.0.1/js/libs/jqueryui/jquery.ui.timepicker.min.js" type="text/javascript"></script>
 <!-- In dev use: <script src="js/libs/angular-1.1.5.js"></script> -->
 <!--<script type="text/javascript" src="js/libs/angular-ui-ng-grid/ng-grid-2.0.2.debug.js"></script>-->
 <script src="config.js"></script>
-<script id="main-script" src="2.0.0/js/usergrid-dev.min.js"></script>
-
+<script id="main-script" src="2.0.1/js/usergrid-dev.min.js"></script>
 </body>
 </html>

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/097fd3bd/portal/index-template.html
----------------------------------------------------------------------
diff --git a/portal/index-template.html b/portal/index-template.html
index 650ef42..4a8c103 100644
--- a/portal/index-template.html
+++ b/portal/index-template.html
@@ -9,13 +9,14 @@
   <meta name="author" content="">
 
   <link id="libScript" href="js/libs/bootstrap/custom/css/bootstrap.min.css" rel="stylesheet"/>
+  <link id="libScript" rel="stylesheet" href="bower_components/intro.js/introjs.css">
   <link id="libScript" href="css/dash.min.css" rel="stylesheet"/>
 
   <!--styles for jquery ui calendar component-->
   <link id="libScript" rel="stylesheet" type="text/css" href="js/libs/jqueryui/jquery-ui-1.8.9.custom.css"/>
   <link id="libScript" rel="stylesheet" type="text/css" href="js/libs/jqueryui/jquery-ui-timepicker.css"/>
 </head>
-<body ng-controller="PageCtrl" >
+<body ng-controller="PageCtrl" ng-intro-onchange="help.introjs_ChangeEvent" ng-intro-options="help.IntroOptions" ng-intro-onexit="help.introjs_ExitEvent" ng-intro-method="startHelp" ng-intro-autostart="false">
 <!-- Google Tag Manager -->
 <noscript><iframe src="//www.googletagmanager.com/ns.html?id=GTM-N52333"
                   height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
@@ -33,18 +34,20 @@
         <span class="icon-bar"></span>
         <span class="icon-bar"></span>
       </button>
-      <a class="brand" href="#"><img src="img/logo.gif"/></a>
-
+      <a class="brand" href="#"><img src="img/logo.gif"/></a>      
       <div appswitcher ></div>
 
 
       <div class="nav-collapse collapse"  ng-show="loaded">
-
+        <div class="navbar-text pull-left" ng-if="activeUI">
+          <button class="helpButton" ng-class='{helpButtonClicked:help.helpTooltipsEnabled}' ng-click="help.toggleTooltips()" ng-show="help.showHelpButtons">{{help.helpButtonStatus}}</button>
+          <button class="helpButton" ng-click="startHelp(); help.introjs_StartEvent();" ng-show="help.showHelpButtons">Take the Tour</button>
+        </div>
         <div class="navbar-text pull-right" ng-if="activeUI">
           <span class="navbar-text" id="userEmail" >{{userEmail}}</span> |
           <span ng-controller="LoginCtrl"><a id="logout-link" ng-click="logout()" title="logout"><i class="pictogram">&#59201</i></a></span>
           <span ><a ng-click="profile()" title="profile"><i class="pictogram">&#59170</i></a></span> |
-          <span><a href="archive/" target="_blank">Legacy Portal</a></span>
+          <span><a href="archive/" target="_blank">Legacy Portal</a></span> |          
         </div>
 
       </div>
@@ -53,13 +56,15 @@
 </header>
 <section class="side-menu" ng-cloak   ng-show="activeUI">
   <div class="sidebar-nav">
-    <div class="nav-collapse collapse">
+    <div id="intro-1-org" class="nav-collapse collapse">
 
       <org-menu context="orgmenu"  ></org-menu>
 
     </div>
-    <div class="nav-collapse collapse" id="sideMenu">
-    </div>
+    <div id="intro-3-side-menu">
+	    <div class="nav-collapse collapse" id="sideMenu">
+	    </div>
+	</div>
   </div>
 </section>
 
@@ -67,21 +72,27 @@
   <div class="container-fluid">
     <div class="row-fluid">
       <div class="span12">
-
+        <bsmodal id="tooltips"
+             title="Help Tooltips Enabled"
+             close="hideModal"
+             closelabel="OK"
+             ng-cloak>
+          <p>Hover your cursor over the '(?)' icons to get helpful tips and information.</p>
+        </bsmodal>
         <!--header app/org context nav-->
 
         <nav class="navbar secondary"    ng-show="activeUI">
           <div class="container-fluid">
             <div class="row-fluid">
               <div class="span12">
-                <div class="span5">
+                <div class="span5" id="intro-2-app-menu">
                   <app-menu></app-menu>
                 </div>
                 <div class="span7 button-area">
                   <div class="nav-collapse collapse">
                     <ul class="helper-links nav span12">
                       <li class="sdks span12">
-                        <ul class="pull-right">
+                        <ul id="intro-9-sdks" class="pull-right">
                           <li class="title"><label>SDKs and Modules</label></li>
                           <li><a target="_blank" href="http://apigee.com/docs/usergrid/content/sdks-and-examples#ios"><i class="sdk-icon-ios"></i></a></li>
                           <li><a target="_blank" href="http://apigee.com/docs/usergrid/content/sdks-and-examples#android"><i class="sdk-icon-android"></i></a></li>
@@ -124,6 +135,5 @@
 <!--<script type="text/javascript" src="js/libs/angular-ui-ng-grid/ng-grid-2.0.2.debug.js"></script>-->
 <script src="config.js"></script>
 <script id="main-script" src="js/usergrid.min.js"></script>
-
 </body>
 </html>

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/097fd3bd/portal/index.html
----------------------------------------------------------------------
diff --git a/portal/index.html b/portal/index.html
index 6a00379..883c077 100644
--- a/portal/index.html
+++ b/portal/index.html
@@ -8,14 +8,15 @@
   <meta name="description" content="">
   <meta name="author" content="">
 
-  <link id="libScript" href="2.0.0/js/libs/bootstrap/custom/css/bootstrap.min.css" rel="stylesheet">
-  <link id="libScript" href="2.0.0/css/dash.min.css" rel="stylesheet">
+  <link id="libScript" href="2.0.1/js/libs/bootstrap/custom/css/bootstrap.min.css" rel="stylesheet">
+  <link id="libScript" rel="stylesheet" href="2.0.1/bower_components/intro.js/introjs.css">
+  <link id="libScript" href="2.0.1/css/dash.min.css" rel="stylesheet">
 
   <!--styles for jquery ui calendar component-->
-  <link id="libScript" rel="stylesheet" type="text/css" href="2.0.0/js/libs/jqueryui/jquery-ui-1.8.9.custom.css">
-  <link id="libScript" rel="stylesheet" type="text/css" href="2.0.0/js/libs/jqueryui/jquery-ui-timepicker.css">
+  <link id="libScript" rel="stylesheet" type="text/css" href="2.0.1/js/libs/jqueryui/jquery-ui-1.8.9.custom.css">
+  <link id="libScript" rel="stylesheet" type="text/css" href="2.0.1/js/libs/jqueryui/jquery-ui-timepicker.css">
 </head>
-<body ng-controller="PageCtrl">
+<body ng-controller="PageCtrl" ng-intro-onchange="help.introjs_ChangeEvent" ng-intro-options="help.IntroOptions" ng-intro-onexit="help.introjs_ExitEvent" ng-intro-method="startHelp" ng-intro-autostart="false">
 <!-- Google Tag Manager -->
 <noscript><iframe src="//www.googletagmanager.com/ns.html?id=GTM-N52333" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
 <script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
@@ -32,18 +33,20 @@
         <span class="icon-bar"></span>
         <span class="icon-bar"></span>
       </button>
-      <a class="brand" href="#"><img src="img/logo.gif"></a>
-
+      <a class="brand" href="#"><img src="img/logo.gif"></a>      
       <div appswitcher=""></div>
 
 
       <div class="nav-collapse collapse" ng-show="loaded">
-
+        <div class="navbar-text pull-left" ng-if="activeUI">
+          <button class="helpButton" ng-class="{helpButtonClicked:help.helpTooltipsEnabled}" ng-click="help.toggleTooltips()" ng-show="help.showHelpButtons">{{help.helpButtonStatus}}</button>
+          <button class="helpButton" ng-click="startHelp(); help.introjs_StartEvent();" ng-show="help.showHelpButtons">Take the Tour</button>
+        </div>
         <div class="navbar-text pull-right" ng-if="activeUI">
           <span class="navbar-text" id="userEmail">{{userEmail}}</span> |
           <span ng-controller="LoginCtrl"><a id="logout-link" ng-click="logout()" title="logout"><i class="pictogram">&#59201</i></a></span>
           <span><a ng-click="profile()" title="profile"><i class="pictogram">&#59170</i></a></span> |
-          <span><a href="archive/" target="_blank">Legacy Portal</a></span>
+          <span><a href="archive/" target="_blank">Legacy Portal</a></span> |          
         </div>
 
       </div>
@@ -52,13 +55,15 @@
 </header>
 <section class="side-menu" ng-cloak="" ng-show="activeUI">
   <div class="sidebar-nav">
-    <div class="nav-collapse collapse">
+    <div id="intro-1-org" class="nav-collapse collapse">
 
       <org-menu context="orgmenu"></org-menu>
 
     </div>
-    <div class="nav-collapse collapse" id="sideMenu">
-    <ul class="nav nav-list" menu="sideMenu"><li class="option active" ng-cloak=""><a data-ng-href="#!/org-overview"><i class="pictogram">&#128362;</i>Org Administration</a></li><li class="option " ng-cloak=""><a data-ng-href="#!/getting-started/setup"><i class="pictogram">&#128640;</i>Getting Started</a></li><li class="option " ng-cloak=""><a data-ng-href="#!/app-overview/summary"><i class="pictogram">&#59214;</i>App Overview</a><ul class="nav nav-list"><li><a data-ng-href="#!/app-overview/summary"><i class="pictogram sub">&#128241;</i>Summary</a></li></ul></li><li class="option " ng-cloak=""><a data-ng-href="#!/users"><i class="pictogram">&#128100;</i>Users</a><ul class="nav nav-list"><li><a data-ng-href="#!/users"><i class="pictogram sub">&#128100;</i>Users</a></li></ul><ul class="nav nav-list"><li><a data-ng-href="#!/groups"><i class="pictogram sub">&#128101;</i>Groups</a></li></ul><ul class="nav nav-list"><li><a data-ng-href="#!/roles"><i class="pictogram sub">&#59170;</i>Roles
 </a></li></ul></li><li class="option " ng-cloak=""><a data-ng-href="#!/data"><i class="pictogram">&#128248;</i>Data</a><ul class="nav nav-list"><li><a data-ng-href="#!/data"><i class="pictogram sub">&#128254;</i>Collections</a></li></ul></li><li class="option " ng-cloak=""><a data-ng-href="#!/activities"><i class="pictogram">&#59194;</i>Activities</a></li><li class="option " ng-cloak=""><a data-ng-href="#!/shell"><i class="pictogram">&#9000;</i>Shell</a></li></ul></div>
+    <div id="intro-3-side-menu">
+	    <div class="nav-collapse collapse" id="sideMenu">
+	    <ul class="nav nav-list" menu="sideMenu"><li class="option active" ng-cloak=""><a data-ng-href="#!/org-overview"><i class="pictogram">&#128362;</i>Org Administration</a></li><li class="option " ng-cloak=""><a data-ng-href="#!/getting-started/setup"><i class="pictogram">&#128640;</i>Getting Started</a></li><li class="option " ng-cloak=""><a data-ng-href="#!/app-overview/summary"><i class="pictogram">&#59214;</i>App Overview</a><ul class="nav nav-list"><li><a data-ng-href="#!/app-overview/summary"><i class="pictogram sub">&#128241;</i>Summary</a></li></ul></li><li class="option " ng-cloak=""><a data-ng-href="#!/users"><i class="pictogram">&#128100;</i>Users</a><ul class="nav nav-list"><li><a data-ng-href="#!/users"><i class="pictogram sub">&#128100;</i>Users</a></li></ul><ul class="nav nav-list"><li><a data-ng-href="#!/groups"><i class="pictogram sub">&#128101;</i>Groups</a></li></ul><ul class="nav nav-list"><li><a data-ng-href="#!/roles"><i class="pictogram sub">&#59170;</i>Role
 s</a></li></ul></li><li class="option " ng-cloak=""><a data-ng-href="#!/data"><i class="pictogram">&#128248;</i>Data</a><ul class="nav nav-list"><li><a data-ng-href="#!/data"><i class="pictogram sub">&#128254;</i>Collections</a></li></ul></li><li class="option " ng-cloak=""><a data-ng-href="#!/activities"><i class="pictogram">&#59194;</i>Activities</a></li><li class="option " ng-cloak=""><a data-ng-href="#!/shell"><i class="pictogram">&#9000;</i>Shell</a></li></ul></div>
+	</div>
   </div>
 </section>
 
@@ -66,21 +71,23 @@
   <div class="container-fluid">
     <div class="row-fluid">
       <div class="span12">
-
+        <bsmodal id="tooltips" title="Help Tooltips Enabled" close="hideModal" closelabel="OK" ng-cloak="">
+          <p>Hover your cursor over the '(?)' icons to get helpful tips and information.</p>
+        </bsmodal>
         <!--header app/org context nav-->
 
         <nav class="navbar secondary" ng-show="activeUI">
           <div class="container-fluid">
             <div class="row-fluid">
               <div class="span12">
-                <div class="span5">
+                <div class="span5" id="intro-2-app-menu">
                   <app-menu></app-menu>
                 </div>
                 <div class="span7 button-area">
                   <div class="nav-collapse collapse">
                     <ul class="helper-links nav span12">
                       <li class="sdks span12">
-                        <ul class="pull-right">
+                        <ul id="intro-9-sdks" class="pull-right">
                           <li class="title"><label>SDKs and Modules</label></li>
                           <li><a target="_blank" href="http://apigee.com/docs/usergrid/content/sdks-and-examples#ios"><i class="sdk-icon-ios"></i></a></li>
                           <li><a target="_blank" href="http://apigee.com/docs/usergrid/content/sdks-and-examples#android"><i class="sdk-icon-android"></i></a></li>
@@ -115,14 +122,13 @@
     </div>
   </div>
 </section>
-<script id="libScript" src="2.0.0/js/libs/usergrid-libs.min.js"></script>
-<script id="libScript" src="2.0.0/js/libs/bootstrap/custom/js/bootstrap.min.js"></script>
+<script id="libScript" src="2.0.1/js/libs/usergrid-libs.min.js"></script>
+<script id="libScript" src="2.0.1/js/libs/bootstrap/custom/js/bootstrap.min.js"></script>
 <!--todo - remove this. temporarily including jquery ui for calendar in push-->
-<script id="libScript" src="2.0.0/js/libs/jqueryui/jquery.ui.timepicker.min.js" type="text/javascript"></script>
+<script id="libScript" src="2.0.1/js/libs/jqueryui/jquery.ui.timepicker.min.js" type="text/javascript"></script>
 <!-- In dev use: <script src="js/libs/angular-1.1.5.js"></script> -->
 <!--<script type="text/javascript" src="js/libs/angular-ui-ng-grid/ng-grid-2.0.2.debug.js"></script>-->
 <script src="config.js"></script>
-<script id="main-script" src="2.0.0/js/usergrid.min.js"></script>
-
+<script id="main-script" src="2.0.1/js/usergrid.min.js"></script>
 </body>
 </html>

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/097fd3bd/portal/js/app.js
----------------------------------------------------------------------
diff --git a/portal/js/app.js b/portal/js/app.js
index 274d50e..cb81fc4 100644
--- a/portal/js/app.js
+++ b/portal/js/app.js
@@ -1,21 +1,21 @@
 'use strict';
 //todo - where does angular recommend we put polyfills????
-var polyfills = function(window,Object){
-  window.requestAnimFrame = (function(){
-    return  window.requestAnimationFrame       ||
-        window.webkitRequestAnimationFrame ||
-        window.mozRequestAnimationFrame    ||
-        window.oRequestAnimationFrame      ||
-        window.msRequestAnimationFrame     ||
-        function(/* function */ callback, /* DOMElement */ element){
-          window.setTimeout(callback, 1000 / 60);
-        };
+var polyfills = function(window, Object) {
+  window.requestAnimFrame = (function() {
+    return window.requestAnimationFrame ||
+      window.webkitRequestAnimationFrame ||
+      window.mozRequestAnimationFrame ||
+      window.oRequestAnimationFrame ||
+      window.msRequestAnimationFrame ||
+      function( /* function */ callback, /* DOMElement */ element) {
+        window.setTimeout(callback, 1000 / 60);
+    };
   })();
 
   Object.defineProperty(Object.prototype, "clone", {
     enumerable: false,
     writable: true,
-    value: function () {
+    value: function() {
       var i, newObj = (this instanceof Array) ? [] : {};
       for (i in this) {
         if (i === 'clone') {
@@ -34,15 +34,15 @@ var polyfills = function(window,Object){
   Object.defineProperty(Object.prototype, "stringifyJSON", {
     enumerable: false,
     writable: true,
-    value: function () {
-      return JSON.stringify(this, null, '\t') ;
+    value: function() {
+      return JSON.stringify(this, null, '\t');
     }
   });
 
 };
 
 polyfills(window,Object);
-
+var global=global||this;
 var AppServices = AppServices || {};
 global.AppServices = global.AppServices || AppServices;
 
@@ -52,69 +52,172 @@ AppServices.Controllers = angular.module('appservices.controllers', []);
 AppServices.Filters = angular.module('appservices.filters', []);
 AppServices.Directives = angular.module('appservices.directives', []);
 AppServices.Performance = angular.module('appservices.performance', []);
-AppServices.Push = angular.module('appservices.push', []);
+AppServices.MAX = angular.module('appservices.max', []);
+
+angular.module('appservices', ['ngRoute',
+  'ngResource',
+  'ngSanitize',
+  'ui.bootstrap',
+  'angulartics',
+  'angulartics.google.analytics',
+  'appservices.filters',
+  'appservices.services',
+  'appservices.directives',
+  'appservices.constants',
+  'appservices.controllers',
+  'appservices.max',
+  'angular-intro',
+]).config(['$routeProvider', '$locationProvider', '$sceDelegateProvider', '$analyticsProvider',
+  function($routeProvider, $locationProvider, $sceDelegateProvider, $analyticsProvider) {
+    $routeProvider
+      .when('/org-overview', {
+        templateUrl: 'org-overview/org-overview.html',
+        controller: 'OrgOverviewCtrl'
+      })
+      .when('/login', {
+        templateUrl: 'login/login.html',
+        controller: 'LoginCtrl'
+      })
+      .when('/login/loading', {
+        templateUrl: 'login/loading.html',
+        controller: 'LoginCtrl'
+      })
+      .when('/app-overview/summary', {
+        templateUrl: 'app-overview/app-overview.html',
+        controller: 'AppOverviewCtrl'
+      })
+      .when('/getting-started/setup', {
+        templateUrl: 'app-overview/getting-started.html',
+        controller: 'GettingStartedCtrl'
+      })
+      .when('/forgot-password', {
+        templateUrl: 'login/forgot-password.html',
+        controller: 'ForgotPasswordCtrl'
+      })
+      .when('/register', {
+        templateUrl: 'login/register.html',
+        controller: 'RegisterCtrl'
+      })
+      .when('/users', {
+        templateUrl: 'users/users.html',
+        controller: 'UsersCtrl'
+      })
+      .when('/users/profile', {
+        templateUrl: 'users/users-profile.html',
+        controller: 'UsersProfileCtrl'
+      })
+      .when('/users/groups', {
+        templateUrl: 'users/users-groups.html',
+        controller: 'UsersGroupsCtrl'
+      })
+      .when('/users/activities', {
+        templateUrl: 'users/users-activities.html',
+        controller: 'UsersActivitiesCtrl'
+      })
+      .when('/users/feed', {
+        templateUrl: 'users/users-feed.html',
+        controller: 'UsersFeedCtrl'
+      })
+      .when('/users/graph', {
+        templateUrl: 'users/users-graph.html',
+        controller: 'UsersGraphCtrl'
+      })
+      .when('/users/roles', {
+        templateUrl: 'users/users-roles.html',
+        controller: 'UsersRolesCtrl'
+      })
+      .when('/groups', {
+        templateUrl: 'groups/groups.html',
+        controller: 'GroupsCtrl'
+      })
+      .when('/groups/details', {
+        templateUrl: 'groups/groups-details.html',
+        controller: 'GroupsDetailsCtrl'
+      })
+      .when('/groups/members', {
+        templateUrl: 'groups/groups-members.html',
+        controller: 'GroupsMembersCtrl'
+      })
+      .when('/groups/activities', {
+        templateUrl: 'groups/groups-activities.html',
+        controller: 'GroupsActivitiesCtrl'
+      })
+      .when('/groups/roles', {
+        templateUrl: 'groups/groups-roles.html',
+        controller: 'GroupsRolesCtrl'
+      })
+      .when('/roles', {
+        templateUrl: 'roles/roles.html',
+        controller: 'RolesCtrl'
+      })
+      .when('/roles/settings', {
+        templateUrl: 'roles/roles-settings.html',
+        controller: 'RolesSettingsCtrl'
+      })
+      .when('/roles/users', {
+        templateUrl: 'roles/roles-users.html',
+        controller: 'RolesUsersCtrl'
+      })
+      .when('/roles/groups', {
+        templateUrl: 'roles/roles-groups.html',
+        controller: 'RolesGroupsCtrl'
+      })
+      .when('/data', {
+        templateUrl: 'data/data.html',
+        controller: 'DataCtrl'
+      })
+      .when('/data/entity', {
+        templateUrl: 'data/entity.html',
+        controller: 'EntityCtrl'
+      })
+      .when('/data/shell', {
+        templateUrl: 'data/shell.html',
+        controller: 'ShellCtrl'
+      })
+      .when('/profile/organizations', {
+        templateUrl: 'profile/organizations.html',
+        controller: 'OrgCtrl'
+      })
+      .when('/profile/profile', {
+        templateUrl: 'profile/profile.html',
+        controller: 'ProfileCtrl'
+      })
+      .when('/profile', {
+        templateUrl: 'profile/account.html',
+        controller: 'AccountCtrl'
+      })
+      .when('/activities', {
+        templateUrl: 'activities/activities.html',
+        controller: 'ActivitiesCtrl'
+      })
+      .when('/shell', {
+        templateUrl: 'shell/shell.html',
+        controller: 'ShellCtrl'
+      })
+      .when('/logout', {
+        templateUrl: 'login/logout.html',
+        controller: 'LogoutCtrl'
+      })
+      .otherwise({
+        redirectTo: '/org-overview'
+      });
 
-angular.module('appservices',
-    [ 'ngRoute',
-      'ngResource',
-      'ngSanitize',
-      'ui.bootstrap',
-      'appservices.filters',
-      'appservices.services',
-      'appservices.directives',
-      'appservices.constants',
-      'appservices.controllers',
-      'appservices.performance',
-      'appservices.push'
-    ]).config(['$routeProvider', '$locationProvider','$sceDelegateProvider',
-        function ($routeProvider,$locationProvider,$sceDelegateProvider) {
-            $routeProvider
-                .when('/org-overview', {templateUrl: 'org-overview/org-overview.html', controller: 'OrgOverviewCtrl'})
-                .when('/login', {templateUrl: 'login/login.html', controller: 'LoginCtrl'})
-                .when('/login/loading', {templateUrl: 'login/loading.html', controller: 'LoginCtrl'})
-                .when('/app-overview/summary', {templateUrl: 'app-overview/app-overview.html', controller: 'AppOverviewCtrl'})
-                .when('/getting-started/setup', {templateUrl: 'app-overview/getting-started.html', controller: 'GettingStartedCtrl'})
-                .when('/forgot-password', {templateUrl: 'login/forgot-password.html', controller: 'ForgotPasswordCtrl'})
-                .when('/register', {templateUrl: 'login/register.html', controller: 'RegisterCtrl'})
-                .when('/users', {templateUrl: 'users/users.html', controller: 'UsersCtrl'})
-                .when('/users/profile', {templateUrl: 'users/users-profile.html', controller: 'UsersProfileCtrl'})
-                .when('/users/groups', {templateUrl: 'users/users-groups.html', controller: 'UsersGroupsCtrl'})
-                .when('/users/activities', {templateUrl: 'users/users-activities.html', controller: 'UsersActivitiesCtrl'})
-                .when('/users/feed', {templateUrl: 'users/users-feed.html', controller: 'UsersFeedCtrl'})
-                .when('/users/graph', {templateUrl: 'users/users-graph.html', controller: 'UsersGraphCtrl'})
-                .when('/users/roles', {templateUrl: 'users/users-roles.html', controller: 'UsersRolesCtrl'})
-                .when('/groups', {templateUrl: 'groups/groups.html', controller: 'GroupsCtrl'})
-                .when('/groups/details', {templateUrl: 'groups/groups-details.html', controller: 'GroupsDetailsCtrl'})
-                .when('/groups/members', {templateUrl: 'groups/groups-members.html', controller: 'GroupsMembersCtrl'})
-                .when('/groups/activities', {templateUrl: 'groups/groups-activities.html', controller: 'GroupsActivitiesCtrl'})
-                .when('/groups/roles', {templateUrl: 'groups/groups-roles.html', controller: 'GroupsRolesCtrl'})
-                .when('/roles', {templateUrl: 'roles/roles.html', controller: 'RolesCtrl'})
-                .when('/roles/settings', {templateUrl: 'roles/roles-settings.html', controller: 'RolesSettingsCtrl'})
-                .when('/roles/users', {templateUrl: 'roles/roles-users.html', controller: 'RolesUsersCtrl'})
-                .when('/roles/groups', {templateUrl: 'roles/roles-groups.html', controller: 'RolesGroupsCtrl'})
-                .when('/data', {templateUrl: 'data/data.html', controller: 'DataCtrl'})
-                .when('/data/entity', {templateUrl: 'data/entity.html', controller: 'EntityCtrl'})
-                .when('/data/shell', {templateUrl: 'data/shell.html', controller: 'ShellCtrl'})
-                .when('/profile/organizations', {templateUrl: 'profile/organizations.html', controller: 'OrgCtrl'})
-                .when('/profile/profile', {templateUrl: 'profile/profile.html', controller: 'ProfileCtrl'})
-                .when('/profile', {templateUrl: 'profile/account.html', controller: 'AccountCtrl'})
-                .when('/activities', {templateUrl: 'activities/activities.html', controller: 'ActivitiesCtrl'})
-                .when('/shell', {templateUrl: 'shell/shell.html', controller: 'ShellCtrl'})
-                .when('/logout', {templateUrl: 'login/logout.html', controller: 'LogoutCtrl'})
-                .otherwise({redirectTo: '/org-overview'});
+    $locationProvider
+      .html5Mode(false)
+      .hashPrefix('!');
 
-            $locationProvider
-                .html5Mode(false)
-                .hashPrefix('!');
+    $sceDelegateProvider.resourceUrlWhitelist([
+      // Allow same origin resource loads.
+      'self',
+      // Allow loading from our assets domain.  Notice the difference between * and **.
+      'http://apigee-internal-prod.jupiter.apigee.net/**',
+      'http://apigee-internal-prod.mars.apigee.net/**',
+      'https://appservices.apigee.com/**',
+      'https://api.usergrid.com/**'
+    ]);
 
-            $sceDelegateProvider.resourceUrlWhitelist([
-                // Allow same origin resource loads.
-                'self',
-                // Allow loading from our assets domain.  Notice the difference between * and **.
-                'http://apigee-internal-prod.jupiter.apigee.net/**',
-                'http://apigee-internal-prod.mars.apigee.net/**',
-                'https://appservices.apigee.com/**',
-                'https://api.usergrid.com/**'
-            ]);
+    $analyticsProvider.virtualPageviews(false);
+    $analyticsProvider.firstPageview(false);
 
-        }]);
+  }
+]);

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/097fd3bd/portal/js/data/shell-controller.js
----------------------------------------------------------------------
diff --git a/portal/js/data/shell-controller.js b/portal/js/data/shell-controller.js
index b06bd9b..e69de29 100644
--- a/portal/js/data/shell-controller.js
+++ b/portal/js/data/shell-controller.js
@@ -1,9 +0,0 @@
-'use strict'
-
-AppServices.Controllers.controller('ShellCtrl', ['ug', '$scope', '$rootScope', '$location',
-  function (ug, $scope, $rootScope, $location) {
-
-
-
-
-  }]);
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/097fd3bd/portal/js/global/help-service.js
----------------------------------------------------------------------
diff --git a/portal/js/global/help-service.js b/portal/js/global/help-service.js
new file mode 100644
index 0000000..5e472a9
--- /dev/null
+++ b/portal/js/global/help-service.js
@@ -0,0 +1,140 @@
+'use strict';
+
+AppServices.Services.factory('help', function($rootScope, $http, $analytics) {
+
+  $rootScope.help = {};
+  $rootScope.help.helpButtonStatus = 'Enable Help';
+  $rootScope.help.helpTooltipsEnabled = false;
+  $rootScope.help.clicked = false;
+  $rootScope.help.showHelpButtons = false;
+  var tooltipStartTime;
+  var helpStartTime;
+  var introjs_step;    
+
+  $rootScope.help.sendTooltipGA = function (tooltipName) {      
+    $analytics.eventTrack('tooltip - ' + $rootScope.currentPath, {
+      category: 'App Services', 
+      label: tooltipName
+    });
+  }
+  
+  $rootScope.help.toggleTooltips = function() {
+    if ($rootScope.help.helpTooltipsEnabled == false) {
+      //turn on help tooltips
+      $rootScope.help.helpButtonStatus = 'Disable Help';
+      $rootScope.help.helpTooltipsEnabled = true;
+      showHelpModal('tooltips');
+    } else {
+      //turn off help tooltips
+      $rootScope.help.helpButtonStatus = 'Enable Help';
+      $rootScope.help.helpTooltipsEnabled = false;
+    }
+  };
+
+  $rootScope.help.IntroOptions = {
+    steps: [],
+    showStepNumbers: false,
+    exitOnOverlayClick: true,
+    exitOnEsc: true,
+    nextLabel: 'Next',
+    prevLabel: 'Back',
+    skipLabel: 'Got It',
+    doneLabel: 'Got it'
+  };
+
+  $rootScope.$on("$routeChangeSuccess", function(event, current) {      
+    //hide the help buttons if not on org-overview page
+    var path = current.$$route.originalPath;
+    if (path == '/org-overview') {
+      
+      $rootScope.help.showHelpButtons = true;
+
+      //retrieve the introjs and tooltip json for the current route
+      getHelpJson(path).success(function(json) {
+        
+        var helpJson = json;
+        
+        //set help strings
+        setHelpStrings(helpJson);
+
+        //show tour modal if first time user
+        showHelpModal('tour');
+      });
+    } else {
+      $rootScope.help.showHelpButtons = false;
+    }
+  });
+
+  //pop modal if local storage 'ftu_tour'/'ftu_tooltip' is not set
+  var showHelpModal = function(helpType) {
+    //visitor is first time user
+    var shouldHelp = location.search.indexOf('noHelp') <= 0;
+    if (helpType == 'tour' && !getHelpStatus(helpType)) {
+      shouldHelp && $rootScope.showModal('introjs');
+    } else if (helpType == 'tooltips' && !getHelpStatus(helpType)) {
+      shouldHelp && $rootScope.showModal('tooltips');
+    }
+  };
+
+  //set help strings
+  var setHelpStrings = function(helpJson) {
+    //Intro.js steps
+    $rootScope.help.IntroOptions.steps = helpJson.introjs;
+
+    //Tooltips
+    angular.forEach(helpJson.tooltip, function(value, binding) {
+      $rootScope[binding] = value;
+    });
+  }
+
+  
+
+  //user starts introjs
+  $rootScope.help.introjs_StartEvent = function() {
+    helpStartTime = Date.now();
+    introjs_step = 1;
+  }
+
+  //user exits introjs
+  $rootScope.help.introjs_ExitEvent = function() {
+    var introjs_time = Math.round((Date.now() - helpStartTime) / 1000);
+
+    //capture time spent in introjs
+    $analytics.eventTrack('introjs timing - ' + $rootScope.currentPath, {
+      category: 'App Services',
+      label: introjs_time + 's'
+    });
+
+    //capture what introjs step user exited on 
+    $analytics.eventTrack('introjs exit - ' + $rootScope.currentPath, {
+      category: 'App Services',
+      label: 'step' + introjs_step
+    });      
+  };
+
+  //increment the step tracking when user goes to next introjs step
+  $rootScope.help.introjs_ChangeEvent = function() {
+    introjs_step++;
+  };
+
+  //In-portal help end
+
+
+
+  var getHelpJson = function(path) {
+    return $http.jsonp('http://sdk.apigee.com.s3.amazonaws.com/portal_help' + path + '/helpJson.json?callback=JSON_CALLBACK');
+  };
+
+  var getHelpStatus = function(helpType) {
+    var status;
+    if (helpType == 'tour') {
+      status = localStorage.getItem('ftu_tour');        
+      localStorage.setItem('ftu_tour', 'false');
+    } else if (helpType == 'tooltips') {
+      status = localStorage.getItem('ftu_tooltips');        
+      localStorage.setItem('ftu_tooltips', 'false');
+    }
+    return status;
+  }
+
+});
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/097fd3bd/portal/js/global/page-controller.js
----------------------------------------------------------------------
diff --git a/portal/js/global/page-controller.js b/portal/js/global/page-controller.js
index 5de913b..a1be1ad 100644
--- a/portal/js/global/page-controller.js
+++ b/portal/js/global/page-controller.js
@@ -1,119 +1,125 @@
 'use strict'
 
-AppServices.Controllers.controller('PageCtrl',
-  [
-    'ug',
-    'utility',
-    '$scope',
-    '$rootScope',
-    '$location',
-    '$routeParams',
-    '$q',
-    '$route',
-    '$log',
-     function (
-                     ug,
-                     utility,
-                     $scope,
-                     $rootScope,
-                     $location,
-                     $routeParams,
-                     $q,
-                     $route,
-                     $log) {
-
-  var initScopeVariables = function(){
-    //$rootScope.urls()... will determine which URL should be used for a given environment
-    $scope.loadingText = 'Loading...';
-    $scope.use_sso = false;
-    $scope.newApp = {name: ''};
-    $scope.getPerm = '';
-    $scope.postPerm = '';
-    $scope.putPerm = '';
-    $scope.deletePerm = '';
-    $scope.usersTypeaheadValues = [];
-    $scope.groupsTypeaheadValues = [];
-    $scope.rolesTypeaheadValues = [];
-    $rootScope.sdkActive = false;
-    $rootScope.demoData = false;
-    $scope.queryStringApplied = false;
-    $rootScope.autoUpdateTimer = Usergrid.config ? Usergrid.config.autoUpdateTimer : 61;
-    $rootScope.requiresDeveloperKey = Usergrid.config ? Usergrid.config.client.requiresDeveloperKey : false;
-    $rootScope.loaded = $rootScope.activeUI = false;
-    for (var key in Usergrid.regex) {
-      $scope[key] = Usergrid.regex[key];
-    }
+AppServices.Controllers.controller('PageCtrl', [
+  'ug',
+  'help',
+  'utility',
+  '$scope',
+  '$rootScope',
+  '$location',
+  '$routeParams',
+  '$q',
+  '$route',
+  '$log',
+  '$analytics',
+  function(
+    ug,
+    help,
+    utility,
+    $scope,
+    $rootScope,
+    $location,
+    $routeParams,
+    $q,
+    $route,
+    $log,
+    $analytics) {
+
+    var initScopeVariables = function() {
+      //$rootScope.urls()... will determine which URL should be used for a given environment
+      $scope.loadingText = 'Loading...';
+      $scope.use_sso = false;
+      $scope.newApp = {
+        name: ''
+      };
+      $scope.getPerm = '';
+      $scope.postPerm = '';
+      $scope.putPerm = '';
+      $scope.deletePerm = '';
+      $scope.usersTypeaheadValues = [];
+      $scope.groupsTypeaheadValues = [];
+      $scope.rolesTypeaheadValues = [];
+      $rootScope.sdkActive = false;
+      $rootScope.demoData = false;
+      $scope.queryStringApplied = false;
+      $rootScope.autoUpdateTimer = Usergrid.config ? Usergrid.config.autoUpdateTimer : 61;
+      $rootScope.requiresDeveloperKey = Usergrid.config ? Usergrid.config.client.requiresDeveloperKey : false;
+      $rootScope.loaded = $rootScope.activeUI = false;      
+      for (var key in Usergrid.regex) {
+        $scope[key] = Usergrid.regex[key];
+      }
 
-    $scope.options = Usergrid.options;
+      $scope.options = Usergrid.options;
 
-    var getQuery = function () {
-      var result = {}, queryString = location.search.slice(1),
-          re = /([^&=]+)=([^&]*)/g, m;
-      while (m = re.exec(queryString)) {
-        result[decodeURIComponent(m[1])] = decodeURIComponent(m[2]);
-      }
-      return result;
+      var getQuery = function() {
+        var result = {}, queryString = location.search.slice(1),
+          re = /([^&=]+)=([^&]*)/g,
+          m;
+        while (m = re.exec(queryString)) {
+          result[decodeURIComponent(m[1])] = decodeURIComponent(m[2]);
+        }
+        return result;
+      };
+      $scope.queryString = getQuery();
     };
-    $scope.queryString = getQuery();
-  };
 
-  initScopeVariables();
+    initScopeVariables();
 
-  $rootScope.urls = function(){
-    var urls = ug.getUrls()
-    $scope.apiUrl = urls.apiUrl;
-    $scope.use_sso = urls.use_sso;
-    return urls;
-  };
+    $rootScope.urls = function() {
+      var urls = ug.getUrls()
+      $scope.apiUrl = urls.apiUrl;
+      $scope.use_sso = urls.use_sso;
+      return urls;
+    };
 
-  //used in users
-  $rootScope.gotoPage = function(path){
-    $location.path(path);
-  }
+    //used in users
+    $rootScope.gotoPage = function(path) {
+      $location.path(path);
+    }
 
-  var notRegistration = function(){
-    return  "/forgot-password"!==$location.path() && "/register"!==$location.path();
-  };
+    var notRegistration = function() {
+      return "/forgot-password" !== $location.path() && "/register" !== $location.path();
+    };
 
     //called in ng-init on main index page (first method called at app startup and every main navigation)
-  var verifyUser = function(){
-    //avoid polluting our target route with login path
-     if ($location.path().slice(0, '/login'.length) !== '/login') {
-       $rootScope.currentPath = $location.path();
-       //show loading screen during verify process
-       //      $location.path('/login/loading');
-     }
-
-     //first check to see if there is a token in the query string, if so, save it
-     if ($routeParams.access_token && $routeParams.admin_email && $routeParams.uuid) {
-       ug.set('token', $routeParams.access_token);
-       ug.set('email', $routeParams.admin_email);
-       ug.set('uuid', $routeParams.uuid);
-       $location.search('access_token', null);
-       $location.search('admin_email', null);
-       $location.search('uuid', null);
-     }
-
-     //use a promise so we can update afterwards in other UI areas
-     //next try to quick login
-     ug.checkAuthentication(true);
-  };
-
-
-    $scope.profile = function(){
-      if($scope.use_sso){
+    var verifyUser = function() {
+      //avoid polluting our target route with login path
+      if ($location.path().slice(0, '/login'.length) !== '/login') {
+        $rootScope.currentPath = $location.path();
+        //show loading screen during verify process
+        //      $location.path('/login/loading');
+      }
+
+      //first check to see if there is a token in the query string, if so, save it
+      if ($routeParams.access_token && $routeParams.admin_email && $routeParams.uuid) {
+        ug.set('token', $routeParams.access_token);
+        ug.set('email', $routeParams.admin_email);
+        ug.set('uuid', $routeParams.uuid);
+        $location.search('access_token', null);
+        $location.search('admin_email', null);
+        $location.search('uuid', null);
+      }
+
+      //use a promise so we can update afterwards in other UI areas
+      //next try to quick login
+      ug.checkAuthentication(true);
+    };
+
+
+    $scope.profile = function() {
+      if ($scope.use_sso) {
         window.location = $rootScope.urls().PROFILE_URL + '?callback=' + encodeURIComponent($location.absUrl());
-      }else{
+      } else {
         $location.path('/profile')
       }
 
     };
 
-    $scope.showModal = function(id){
+    $rootScope.showModal = function(id) {
       $('#' + id).modal('show')
     };
 
-    $scope.hideModal = function(id){
+    $rootScope.hideModal = function(id) {
       $('#' + id).modal('hide')
     };
 
@@ -123,26 +129,27 @@ AppServices.Controllers.controller('PageCtrl',
     $scope.deleteEntities = function(collection, successBroadcast, errorMessage) {
       collection.resetEntityPointer();
       var entitiesToDelete = []
-      while(collection.hasNextEntity()) {
+      while (collection.hasNextEntity()) {
         var entity = collection.getNextEntity();
         var checked = entity.checked;
-        if(checked){
+        if (checked) {
           entitiesToDelete.push(entity);
         }
       }
-      var count = 0,success=false;
-      for(var i=0; i<entitiesToDelete.length; i++) {
+      var count = 0,
+        success = false;
+      for (var i = 0; i < entitiesToDelete.length; i++) {
         var entity = entitiesToDelete[i];
-        collection.destroyEntity(entity, function(err){
+        collection.destroyEntity(entity, function(err) {
           count++;
-          if(err){
+          if (err) {
             $rootScope.$broadcast('alert', 'error', errorMessage);
-            $rootScope.$broadcast(successBroadcast+'-error',err);
-          }else{
-            success=true;
+            $rootScope.$broadcast(successBroadcast + '-error', err);
+          } else {
+            success = true;
           }
 
-          if(count===entitiesToDelete.length){
+          if (count === entitiesToDelete.length) {
             success && $rootScope.$broadcast(successBroadcast);
             $scope.applyScope();
           }
@@ -150,17 +157,17 @@ AppServices.Controllers.controller('PageCtrl',
       }
     };
 
-    $scope.selectAllEntities = function(list,that,varName,setValue){
+    $scope.selectAllEntities = function(list, that, varName, setValue) {
       varName = varName || 'master';
-      var val = that[varName] ;
-      if(setValue == undefined){
+      var val = that[varName];
+      if (setValue == undefined) {
         setValue = true;
       }
 
-      if(setValue){
+      if (setValue) {
         that[varName] = val = !val;
       }
-      list.forEach(function(entitiy){
+      list.forEach(function(entitiy) {
         entitiy.checked = val;
       });
     };
@@ -168,10 +175,10 @@ AppServices.Controllers.controller('PageCtrl',
 
     $scope.createPermission = function(type, entity, path, permissions) {
       //e.g.: "get,post,put:/mypermission"
-//      var path = $scope.path;
+      //      var path = $scope.path;
 
-      if(path.charAt(0) != '/') {
-        path = '/'+path;
+      if (path.charAt(0) != '/') {
+        path = '/' + path;
       }
       var ops = "";
       var s = "";
@@ -184,11 +191,11 @@ AppServices.Controllers.controller('PageCtrl',
         s = ",";
       }
       if (permissions.putPerm) {
-        ops =  ops + s + "put";
+        ops = ops + s + "put";
         s = ",";
       }
       if (permissions.deletePerm) {
-        ops =  ops + s + "delete";
+        ops = ops + s + "delete";
         s = ",";
       }
       var permission = ops + ":" + path;
@@ -196,39 +203,43 @@ AppServices.Controllers.controller('PageCtrl',
       return permission
     };
 
-    $scope.formatDate = function(date){
+    $scope.formatDate = function(date) {
       return new Date(date).toUTCString();
     };
 
-    $scope.clearCheckbox = function(id){
-      if($('#'+id).attr('checked')){
-        $('#'+id).click();
+    $scope.clearCheckbox = function(id) {
+      if ($('#' + id).attr('checked')) {
+        $('#' + id).click();
       }
     };
 
-    $scope.removeFirstSlash = function(path){
-      return path.indexOf('/') === 0 ?  path.substring(1,path.length): path;
+    $scope.removeFirstSlash = function(path) {
+      return path.indexOf('/') === 0 ? path.substring(1, path.length) : path;
     };
 
-    $scope.applyScope = function(cb){
-      cb = typeof cb === 'function' ? cb : function(){};
-      if(!this.$$phase) {
+    $scope.applyScope = function(cb) {
+      cb = typeof cb === 'function' ? cb : function() {};
+      if (!this.$$phase) {
         return this.$apply(cb);
-      }else{
+      } else {
         cb();
       }
     }
 
-    $scope.valueSelected = function(list){
-      return list &&  (list.some(function(item){return item.checked;}));
+    $scope.valueSelected = function(list) {
+      return list && (list.some(function(item) {
+        return item.checked;
+      }));
     };
 
-    $scope.sendHelp = function (modalId) {
-      ug.jsonpRaw('apigeeuihelpemail', '', {useremail: $rootScope.userEmail}).then(
-        function () {
+    $scope.sendHelp = function(modalId) {
+      ug.jsonpRaw('apigeeuihelpemail', '', {
+        useremail: $rootScope.userEmail
+      }).then(
+        function() {
           $rootScope.$broadcast('alert', 'success', 'Email sent. Our team will be in touch with you shortly.');
         },
-        function () {
+        function() {
           $rootScope.$broadcast('alert', 'error', 'Problem Sending Email. Try sending an email to mobile@apigee.com.');
         }
       );
@@ -237,24 +248,24 @@ AppServices.Controllers.controller('PageCtrl',
 
     $scope.$on('users-typeahead-received', function(event, users) {
       $scope.usersTypeaheadValues = users;
-      if(!$scope.$$phase) {
+      if (!$scope.$$phase) {
         $scope.$apply();
       }
     });
     $scope.$on('groups-typeahead-received', function(event, groups) {
       $scope.groupsTypeaheadValues = groups;
-      if(!$scope.$$phase) {
+      if (!$scope.$$phase) {
         $scope.$apply();
       }
     });
     $scope.$on('roles-typeahead-received', function(event, roles) {
       $scope.rolesTypeaheadValues = roles;
-      if(!$scope.$$phase) {
+      if (!$scope.$$phase) {
         $scope.$apply();
       }
     });
 
-    $scope.$on('checkAuthentication-success', function () {
+    $scope.$on('checkAuthentication-success', function() {
       sessionStorage.setItem('authenticateAttempts', 0);
 
       //all is well - repopulate objects
@@ -263,12 +274,12 @@ AppServices.Controllers.controller('PageCtrl',
       $scope.applyScope();
 
 
-      if(!$scope.queryStringApplied){
+      if (!$scope.queryStringApplied) {
         $scope.queryStringApplied = true;
-        setTimeout(function(){
+        setTimeout(function() {
           //if querystring exists then operate on it.
           if ($scope.queryString.org) {
-            $rootScope.$broadcast('change-org',$scope.queryString.org);
+            $rootScope.$broadcast('change-org', $scope.queryString.org);
           }
         }, 1000)
       }
@@ -277,7 +288,7 @@ AppServices.Controllers.controller('PageCtrl',
 
     });
 
-    $scope.$on('checkAuthentication-error', function (args,err, missingData,email) {
+    $scope.$on('checkAuthentication-error', function(args, err, missingData, email) {
       $scope.loaded = true;
       if (err && !$scope.use_sso && notRegistration()) {
         //there was an error on re-auth lite, immediately send to login
@@ -287,7 +298,7 @@ AppServices.Controllers.controller('PageCtrl',
       } else {
         if (missingData && notRegistration()) {
           if (!email && $scope.use_sso) {
-            window.location = $rootScope.urls().LOGIN_URL + '?callback=' +  encodeURIComponent($location.absUrl().split('?')[0]);
+            window.location = $rootScope.urls().LOGIN_URL + '?callback=' + encodeURIComponent($location.absUrl().split('?')[0]);
             return;
           }
           ug.reAuthenticate(email);
@@ -295,31 +306,31 @@ AppServices.Controllers.controller('PageCtrl',
       }
     });
 
-    $scope.$on('reAuthenticate-success', function (args,err, data, user, organizations, applications) {
+    $scope.$on('reAuthenticate-success', function(args, err, data, user, organizations, applications) {
       sessionStorage.setItem('authenticateAttempts', 0);
 
       //the user is authenticated
       $rootScope.$broadcast('loginSuccesful', user, organizations, applications);
       $rootScope.$emit('loginSuccesful', user, organizations, applications);
       $rootScope.$broadcast('checkAuthentication-success');
-      $scope.applyScope(function () {
+      $scope.applyScope(function() {
         $scope.deferredLogin.resolve();
         $location.path('/org-overview');
       })
     });
 
-    var authenticateAttempts = parseInt( sessionStorage.getItem('authenticateAttempts')  || 0);
-    $scope.$on('reAuthenticate-error', function () {
+    var authenticateAttempts = parseInt(sessionStorage.getItem('authenticateAttempts') || 0);
+    $scope.$on('reAuthenticate-error', function() {
       //user is not authenticated, send to SSO if enabled
       if ($scope.use_sso) {
         //go to sso
-        if(authenticateAttempts++>5){
+        if (authenticateAttempts++ > 5) {
           $rootScope.$broadcast('alert', 'error', 'There is an issue with authentication. Please contact support.');
           return;
         }
-        console.error('Failed to login via sso '+authenticateAttempts);
+        console.error('Failed to login via sso ' + authenticateAttempts);
         sessionStorage.setItem('authenticateAttempts', authenticateAttempts);
-        window.location = $rootScope.urls().LOGIN_URL + '?callback=' +  encodeURIComponent($location.absUrl().split('?')[0]);
+        window.location = $rootScope.urls().LOGIN_URL + '?callback=' + encodeURIComponent($location.absUrl().split('?')[0]);
       } else {
         //go to login page
         if (notRegistration()) {
@@ -330,39 +341,45 @@ AppServices.Controllers.controller('PageCtrl',
       }
     });
 
-    $scope.$on('loginSuccessful',function(){
+    $scope.$on('loginSuccessful', function() {
       $rootScope.activeUI = true;
     });
 
-    $scope.$on('app-changed',function(args,oldVal,newVal,preventReload){
-      if(newVal!==oldVal && !preventReload){
+    $scope.$on('app-changed', function(args, oldVal, newVal, preventReload) {
+      if (newVal !== oldVal && !preventReload) {
         $route.reload();
       }
     });
 
-    $scope.$on('org-changed',function(args, oldOrg,newOrg){
+    $scope.$on('org-changed', function(args, oldOrg, newOrg) {
       ug.getApplications();
       $route.reload();
     });
 
-    $scope.$on('app-settings-received',function(evt,data){
-    });
+    $scope.$on('app-settings-received', function(evt, data) {});
 
-    $scope.$on('request-times-slow', function (evt, averageRequestTimes) {
+    $scope.$on('request-times-slow', function(evt, averageRequestTimes) {
       $rootScope.$broadcast('alert', 'info', 'We are experiencing performance issues on our server.  Please click Get Help for support if this continues.');
     });
 
+    var lastPage = "";
     //verify on every route change
-    $scope.$on('$routeChangeSuccess', function () {
+    $scope.$on('$routeChangeSuccess', function() {
       //todo possibly do a date check here for token expiry
       //so we don't call this on every nav change
       verifyUser();
-      $scope.showDemoBar = $location.path().slice(0,'/performance'.length) === '/performance';
-      if(!$scope.showDemoBar){
+      $scope.showDemoBar = $location.path().slice(0, '/performance'.length) === '/performance';
+      if (!$scope.showDemoBar) {
         $rootScope.demoData = false;
       }
+      setTimeout(function() {
+        lastPage = ""; //remove the double load event
+      }, 50);
+      var path = window.location.pathname.replace("index-debug.html", "");
+      lastPage === "" && $analytics.pageTrack((path + $location.path()).replace("//", "/"));
+      lastPage = $location.path();
     });
-    $scope.$on('applications-received', function (event, applications) {
+    $scope.$on('applications-received', function(event, applications) {
       $scope.applications = applications;
       $scope.hasApplications = Object.keys(applications).length > 0;
     });
@@ -370,5 +387,16 @@ AppServices.Controllers.controller('PageCtrl',
     //init app
     ug.getAppSettings();
 
-  }]);
+    //first time user takes the tour
+    $rootScope.startFirstTimeUser = function() {
+      $rootScope.hideModal('introjs');
+      
+      //for GA
+      $rootScope.help.introjs_StartEvent();
+      
+      //call introjs start
+      $scope.startHelp();
+    }
 
+  }
+]);
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/097fd3bd/portal/js/global/ug-service.js
----------------------------------------------------------------------
diff --git a/portal/js/global/ug-service.js b/portal/js/global/ug-service.js
index b9c1d3b..73838be 100644
--- a/portal/js/global/ug-service.js
+++ b/portal/js/global/ug-service.js
@@ -1,6 +1,6 @@
 'use strict';
 
-AppServices.Services.factory('ug', function (configuration, $rootScope,utility, $q, $http, $resource, $log,$location) {
+AppServices.Services.factory('ug', function (configuration, $rootScope,utility, $q, $http, $resource, $log, $analytics,$location) {
 
   var requestTimes = [],
     running = false,
@@ -8,7 +8,9 @@ AppServices.Services.factory('ug', function (configuration, $rootScope,utility,
 
   function reportError(data,config){
     try {
-    
+      $analytics.eventTrack('error', {
+        category: 'App Services', label: data + ':' + config.url + ':' + (sessionStorage['apigee_uuid'] || 'na')
+      });
     } catch (e) {
       console.log(e)
     }
@@ -497,7 +499,7 @@ AppServices.Services.factory('ug', function (configuration, $rootScope,utility,
     getIndexes: function (path) {
       var options = {
         method:'GET',
-        endpoint: path.split('/').concat('indexes').filter(function(bit){return bit && bit.length}).join('/') 
+        endpoint: path.split('/').concat('indexes').filter(function(bit){return bit && bit.length}).join('/')
       }
       this.client().request(options, function (err, data) {
         if (err) {
@@ -755,7 +757,7 @@ AppServices.Services.factory('ug', function (configuration, $rootScope,utility,
       this.client().request(options, function (err, data) {
         if (err) {
           console.error(data);
-          $rootScope.$broadcast('alert', 'error', 'error creating notifier.' );
+          $rootScope.$broadcast('alert', 'error', data.error_description  || 'error creating notifier');
         } else {
           $rootScope.$broadcast('alert', 'success', 'New notifier created successfully.');
           $rootScope.$broadcast('notifier-update');
@@ -1006,9 +1008,10 @@ AppServices.Services.factory('ug', function (configuration, $rootScope,utility,
       });
     },
     runShellQuery:function(method,path,payload){
+      var path = path.replace(/^\//, ''); //remove leading slash if it does
       var options = {
-        "verb": method,
-          "endpoint":path
+        "method": method,
+        "endpoint":path
       };
       if(payload){
         options["body"]=payload;
@@ -1147,7 +1150,7 @@ AppServices.Services.factory('ug', function (configuration, $rootScope,utility,
       };
 
       successCallback && $rootScope.$broadcast("ajax_loading", objectType);
-      var reqCount = currentRequests[uri] || 0; 
+      var reqCount = currentRequests[uri] || 0;
       if(self.averageRequestTimes > 5 && reqCount>1){
         setTimeout(function(){
           deferred.reject(new Error('query in progress'));