>From 67f29fef0d654ede4b52f260802c3a851d262fe4 Mon Sep 17 00:00:00 2001
From: Jiri Tomasek <jtomasek@redhat.com>
Date: Mon, 25 Jun 2012 13:43:53 +0200
Subject: [PATCH 09/12] Incorporate Login layout from converge-ui

---
 src/app/controllers/user_sessions_controller.rb    |    1 +
 src/app/stylesheets/login.scss                     |  283 +-------------------
 src/app/views/layouts/application.html.haml        |    8 +-
 src/app/views/layouts/login.html.haml              |   51 ++--
 .../user_sessions/_password_recovery.html.haml     |   16 ++
 src/app/views/user_sessions/_security.html.haml    |   56 ++--
 .../user_sessions/_username_recovery.html.haml     |   13 +
 src/app/views/user_sessions/new.html.haml          |   92 ++-----
 src/config/locales/en.yml                          |   13 +-
 src/public/javascripts/jquery.showpassword.js      |  107 --------
 src/vendor/converge-ui                             |    2 +-
 11 files changed, 140 insertions(+), 502 deletions(-)
 create mode 100644 src/app/views/user_sessions/_password_recovery.html.haml
 create mode 100644 src/app/views/user_sessions/_username_recovery.html.haml
 delete mode 100644 src/public/javascripts/jquery.showpassword.js

diff --git a/src/app/controllers/user_sessions_controller.rb b/src/app/controllers/user_sessions_controller.rb
index 492ebb1..a7fe6e7 100644
--- a/src/app/controllers/user_sessions_controller.rb
+++ b/src/app/controllers/user_sessions_controller.rb
@@ -23,6 +23,7 @@ class UserSessionsController < ApplicationController
   layout 'login'
 
   def new
+    @title = t('masthead.login')
   end
 
   def create
diff --git a/src/app/stylesheets/login.scss b/src/app/stylesheets/login.scss
index 75472f0..4fa7637 100644
--- a/src/app/stylesheets/login.scss
+++ b/src/app/stylesheets/login.scss
@@ -1,286 +1,25 @@
 @import "converge-ui/login";
 
-$font-family-base: "Lucida Sans Unicode", "Lucida Grande", Verdana, Arial, Helvetica, sans-serif;
-$font-family-em: "Lucida Sans", "Lucida Sans Unicode", "Lucida Grande", Verdana, Arial, Helvetica, sans-serif;
-$font-family-primary: Helvetica, Arial, "Lucida Grande", sans-serif;
+article{
+  .button{ position: relative; }
 
-/* body */
+  aside img{ margin-left: 30px; }
 
-html, body{ width: 100%; height: 100%; }
-
-strong, em, b, i{ font-family: $font-family-em; }
-
-body#auth{
-  background: url('../../images/login-body-bg.png');
-  font-family: $font-family-base;
-  font-size: 12px; /* 12px base */
-  color: #333;
-
-  #primary-container{
-    position: relative;
-    width: 518px;
-    margin: 0 auto;
-  }
-
-  div.error{
-    background: url('../../images/login-error-bg.png') no-repeat top left;
-    width: 506px;
-    height: 97px;
-    margin: 4px;
-
-    p.text{
-      padding: 22px 20px 20px 0px;
-      margin-left: 160px;
-      line-height: 22px;
-    }
-
-  }
-
-  div.error.critical{
-    background: url('../../images/login-failure-bg.png') no-repeat top left;
-  }
-
-  #stage{
-    float: left;
-    position: absolute;
-    top: 60%;
-    left: 0;
-    width: 100%;
-    height: 500px;
-    background: -webkit-gradient(radial, 50% 0%, 0, 50% 0%, 550, from(rgba(51,51,51,0.60)), to(rgba(130,130,130,0)));
-    background: -moz-radial-gradient(50% 0% 90deg,circle closest-corner, rgba(51,51,51,0.60), rgba(130,130,130,0));
-  }
-
-  /* Content */
-
-  $container-width: 517px;
-  $container-height: 280px;
-  $container-waterline: 80px;
-
-  $card-surround-width: 517px;
-  $card-surround-height: 280px;
-
-  $card-width: 500px;
-  $card-height: 260px;
-
-  #primary-container{
-    position: absolute;
-    left: 50%;
-    bottom: 40%;
-    margin-left: -$container-width / 2;
-    margin-bottom: -$container-waterline;
-  }
-
-  #card-surround{
-    width: $card-surround-width;
-    height: $card-surround-height;
-    background: url('../../images/login-card-surround-bg.png') no-repeat bottom center;
-    border: 1px solid transparent;
-  }
-
-  #card{
-    position: relative;
-    background-color: #e7e7e7;
-    width: $card-width;
-    height: $card-height;
-    margin-top: ($card-surround-height - $card-height) / 2;
-    margin-left: ($card-surround-width - $card-width) / 2;
-
-    -webkit-border-radius: 7px;
-    -moz-border-radius: 7px;
-    border-radius: 7px;
-    border: 1px solid #666;
-
-    background: url('../../images/login-card-bg.png');
-    overflow: hidden;
-  }
-
-  div.panel{
-    position: absolute;
-    width: $card-width;
-    height: $card-height;
-
-    .content{
-      margin: 18px;
+  .container section .card{
+    div.error{
+      padding: 30px 0px 0px 26px;
+      font-size: 10px;
     }
 
-  }
-
-  $security-nubbin: 143px;
-
-  #security{
-    background: url('../../images/login-card-security-bg.png') no-repeat top right;
-    left: -($card-width - $security-nubbin);
-    margin-right: 18px;
-    float: left;
-    font-family: $font-family-primary;
-    color: #fff;
-
-    header{
-      display: block;
-      height: 54px;
-      margin-left: 18px;
-      padding-top: 30px;
-      padding-left: 50px;
-    }
-
-    h1{
-      font-size: 20px;
-      color: #fff;
-    }
-
-    span.expiration{
-      font-size: 11px;
-      font-weight: normal;
-    }
-
-    header.secure{
-      background: url('../../images/login-header-secure.png') no-repeat top left;
-    }
-
-    header.unsecure{
-      background: url('../../images/login-header-insecure.png') no-repeat 16px 28px;
-      height: 34px;
-    }
-
-    .content{
-      margin-left: 68px;
-      margin-top: 0px;
-      margin-right: 143px;
-
-      p{line-height: 18px};
-      p+p{margin-top: 12px;}
-
-    }
-
-    #logo{
-      position: absolute;
-      right: 30px;
-      top: 74px;
-    }
-
-  }
-
-  #login{
-
-    width: $card-width - $security-nubbin;
-    left: $security-nubbin;
-
-    label{
-      font-size: 11px;
-      color: #666;
-    }
-
-    .content{
-      margin-top: 48px;
-    }
-
-    fieldset.primary{
-
-      label{
-        display: block;
-        text-transform: uppercase;
-        margin-bottom: 6px;
-      }
-
-      input{
-        width: 284px;
-        padding: 8px 0px 8px 28px;
-        font-size: 18px;
-        color: #000;
-        font-family: $font-family-primary;
+    fieldset.primary input{
+      &:focus{
+        @include box-shadow(0px 0px 2px $login_link-color);
       }
-
-      input.username{ background: #fff url('../../images/login-username-icon.png') no-repeat 6px 8px; }
-      input.password{ background: #fff url('../../images/login-password-icon.png') no-repeat 12px 11px; }
-    }
-
-    fieldset + fieldset{
-      margin-top: 10px;
-    }
-
-    div.group.left{
-      display: inline;
-      float: left;
-    }
-
-    div.group.right{
-      display: inline;
-      float: right;
-      text-align: right;
-    }
-
-    div.group.bottom{
-      position: absolute;
-      bottom: 18px;
-    }
-
-    div.group.submit{
-      position: absolute;
-      right: 18px;
-      width: 110px;
     }
 
     #progress-indicator{
-      margin: 4px;
-      display: none;
-    }
-
-    .options{
-      a.help{ background: url('../../images/login-btn-help.png') no-repeat 0px 0px; }
-      a.security{ background: url('../../images/login-btn-security.png') no-repeat 0px 0px; }
-      a{
-        display: inline-block;
-        outline: 0;
-        text-align: left;
-        margin: 0px;
-        height: 21px;
-        width: 21px;
-        &:hover{ background-position: -21px 0px; }
-        &:active{ background-position: -42px 0px; }
-      }
-      a span{ display: none; position: absolute; top: -999em; }
-    }
-
-    #login-btn{
       float: right;
-      padding-left: 20px;
-      padding-right: 20px;
-    }
-
-  }
-
-  .button{
-    height: 26px;
-    border: 1px solid #999;
-    font-size: 13px;
-    padding-left: 14px;
-    padding-right: 14px;
-    font-family: $font-family-base;
-    -webkit-border-radius: 13px;
-    -moz-border-radius: 13px;
-    border-radius: 13px;
-
-    background: rgb(255,255,255); /* Old browsers */
-    background: -moz-linear-gradient(top, rgba(255,255,255,1) 0%, rgba(204,204,204,1) 100%); /* FF3.6+ */
-    background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(255,255,255,1)), color-stop(100%,rgba(204,204,204,1))); /* Chrome,Safari4+ */
-    background: -webkit-linear-gradient(top, rgba(255,255,255,1) 0%,rgba(204,204,204,1) 100%); /* Chrome10+,Safari5.1+ */
-    background: -o-linear-gradient(top, rgba(255,255,255,1) 0%,rgba(204,204,204,1) 100%); /* Opera11.10+ */
-    background: -ms-linear-gradient(top, rgba(255,255,255,1) 0%,rgba(204,204,204,1) 100%); /* IE10+ */
-    filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#cccccc',GradientType=0 ); /* IE6-9 */
-    background: linear-gradient(top, rgba(255,255,255,1) 0%,rgba(204,204,204,1) 100%); /* W3C */
-
-    &:active{
-      background: rgb(204,204,204); /* Old browsers */
-      background: -moz-linear-gradient(top, rgba(204,204,204,1) 0%, rgba(175,175,175,1) 100%); /* FF3.6+ */
-      background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(204,204,204,1)), color-stop(100%,rgba(175,175,175,1))); /* Chrome,Safari4+ */
-      background: -webkit-linear-gradient(top, rgba(204,204,204,1) 0%,rgba(175,175,175,1) 100%); /* Chrome10+,Safari5.1+ */
-      background: -o-linear-gradient(top, rgba(204,204,204,1) 0%,rgba(175,175,175,1) 100%); /* Opera11.10+ */
-      background: -ms-linear-gradient(top, rgba(204,204,204,1) 0%,rgba(175,175,175,1) 100%); /* IE10+ */
-      filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#cccccc', endColorstr='#afafaf',GradientType=0 ); /* IE6-9 */
-      background: linear-gradient(top, rgba(204,204,204,1) 0%,rgba(175,175,175,1) 100%); /* W3C */
+      margin: 7px 10px;
     }
-
   }
-
 }
diff --git a/src/app/views/layouts/application.html.haml b/src/app/views/layouts/application.html.haml
index 8b84fb2..ba6b020 100644
--- a/src/app/views/layouts/application.html.haml
+++ b/src/app/views/layouts/application.html.haml
@@ -19,7 +19,7 @@
     window.history.pushState || (window.history.pushState = function(){});
     window.history.replaceState || (window.history.replaceState = function(){});
 
-  = javascript_include_tag "converge-ui/lib/jquery/jquery-1.6.2.min.js"
+  = javascript_include_tag "converge-ui/lib/jquery/jquery-1.6.2.js"
   = javascript_include_tag "jquery.ui-1.8.1/jquery-ui-1.8.1.custom.min.js"
   = javascript_include_tag "mustache.min.js"
   = javascript_include_tag "underscore-min.js"
@@ -32,8 +32,8 @@
   = javascript_include_tag "backbone/routers.js"
   = javascript_include_tag "converge-ui/lib/rails.js"
   = javascript_include_tag "lib/modernizr-custom.js"
-  = javascript_include_tag "lib/converge-ui/jquery/plugins/flot-0.7/jquery.flot.js"
-  = javascript_include_tag "lib/converge-ui/jquery/plugins/flot-0.7/excanvas.js"
+  = javascript_include_tag "converge-ui/lib/jquery/plugins/flot-0.7/jquery.flot.js"
+  = javascript_include_tag "converge-ui/lib/jquery/plugins/flot-0.7/excanvas.js"
 
 = content_for :logo do
   = link_to t('layout.appname'), root_path, :class => "logo"
@@ -55,6 +55,6 @@
   = yield
 
 = content_for :footer do
-  = render :partial => 'footer'
+  = render :partial => 'layouts/footer'
 
 = render :file => "app/views/layouts/converge-ui/shell_layout"
diff --git a/src/app/views/layouts/login.html.haml b/src/app/views/layouts/login.html.haml
index e3ed60d..e8f2011 100644
--- a/src/app/views/layouts/login.html.haml
+++ b/src/app/views/layouts/login.html.haml
@@ -1,26 +1,25 @@
-!!! 5
-%html{"xml:lang" => "en", :lang => "en"}
-  %head
-    %meta{:charset => 'utf-8'}/
-    %title Aeolus Conductor : Login
-    %link{:rel =>  'shortcut icon', :href => '/favicon.ico'}
-    = stylesheet_link_tag '/stylesheets/reset.css'
-    = stylesheet_link_tag '/stylesheets/compiled/login.css'
-    /[if lt IE 9]
-      = javascript_include_tag 'http://html5shiv.googlecode.com/svn/trunk/html5.js'
-      = stylesheet_link_tag '/stylesheets/layout_ie.css'
-    = javascript_include_tag "converge-ui/lib/jquery/jquery-1.6.2.min.js"
-    = javascript_include_tag "jquery.showpassword.js"
-    = javascript_include_tag "converge-ui/lib/rails.js"
-    = csrf_meta_tag
-    = yield :scripts
-  %body#auth
-    #stage &nbsp;
-    #primary-container
-      -if flash[:warning]
-        %div.error
-          %p.text= flash[:warning]
-      -if flash[:error]
-        %div.error
-          %p.text= flash[:error]
-      = yield
+= content_for :title do
+  = t("layout.appname")
+  = "| #{@title}" unless @title.blank?
+
+= content_for :stylesheets_block do
+  = stylesheet_link_tag '/stylesheets/compiled/login.css'
+  /[if lt IE 8]
+    = stylesheet_link_tag '/stylesheets/layout_ie7.css'
+
+  = javascript_include_tag "converge-ui/lib/jquery/jquery-1.6.2.js"
+  = javascript_include_tag "converge-ui/login.js"
+  = javascript_include_tag "converge-ui/lib/rails.js"
+  /[if lt IE 9]
+    = javascript_include_tag 'http://html5shiv.googlecode.com/svn/trunk/html5.js'
+
+= content_for :login_logo do
+  = image_tag 'login-card-logo-upstream.png'
+
+= content_for :content do
+  = yield
+
+= content_for :footer do
+  = render :partial => "layouts/footer"
+
+= render :file => "app/views/layouts/converge-ui/user_session_layout"
diff --git a/src/app/views/user_sessions/_password_recovery.html.haml b/src/app/views/user_sessions/_password_recovery.html.haml
new file mode 100644
index 0000000..1b6dd65
--- /dev/null
+++ b/src/app/views/user_sessions/_password_recovery.html.haml
@@ -0,0 +1,16 @@
+.card_container#password_recovery_container
+  .card
+    %p
+      = t('user_sessions.new.password_unknown_info')
+      %a{ :id => "password_return_link", :href => "#" }
+        = t('user_sessions.new.return_to_login')
+    = form_tag user_session_path, :method => :post, :id => "password_recovery_form", :remote => true do
+      %fieldset.primary
+        = label_tag :login
+        = text_field_tag :login, params[:login]
+      %fieldset.primary
+        = label_tag :email
+        = text_field_tag :email, params[:email]
+      %div.group.secondary_actions
+        %span
+      = submit_tag t('user_sessions.new.reset_password'), :class => 'button fr', :disabled => true
diff --git a/src/app/views/user_sessions/_security.html.haml b/src/app/views/user_sessions/_security.html.haml
index 5751438..bc39759 100644
--- a/src/app/views/user_sessions/_security.html.haml
+++ b/src/app/views/user_sessions/_security.html.haml
@@ -1,27 +1,29 @@
-- if request.ssl?
-  .panel#security
-    %header.secure
-      %h1=t'user_sessions.security.encrypted_connection'
-      %span.expiration=t 'user_sessions.security.expiration'
-    .content
-      %p
-        =t'user_sessions.security.issued'
-        %br
-        =t'user_sessions.security.unknown_ca'
-      %p
-        =t'user_sessions.security.message', :host => "#{h request.host}"
-      %p
-        %input.button#show-login{:type => 'button', :value => 'Return to Login'}
-    = image_tag 'login-card-logo-upstream.png', :id => 'logo'
--else
-  .panel#security
-    %header.unsecure
-      %h1=t'user_sessions.security.unencrypted_connection'
-    .content
-      %p
-        =t'user_sessions.security.message_unencrypted', :host => "#{h request.host}"
-      %p
-        =t'user_sessions.security.message_unencrypted2'
-      %p
-        %input.button#show-login{:type => 'button', :value => "#{t('user_sessions.security.return_to_login')}"}
-    = image_tag 'login-card-logo-upstream.png', :id => 'logo'
+.card_container#security
+  .card
+    - if request.ssl?
+      .panel#security
+        %header.secure
+          %h1=t'user_sessions.security.encrypted_connection'
+          %span.expiration=t 'user_sessions.security.expiration'
+        .content
+          %p
+            =t'user_sessions.security.issued'
+            %br
+            =t'user_sessions.security.unknown_ca'
+          %p
+            =t'user_sessions.security.message', :host => "#{h request.host}"
+          %p
+            %input.button#show-login{:type => 'button', :value => 'Return to Login'}
+        = image_tag 'login-card-logo-upstream.png', :id => 'logo'
+    -else
+      .panel#security
+        %header.unsecure
+          %h1=t'user_sessions.security.unencrypted_connection'
+        .content
+          %p
+            =t'user_sessions.security.message_unencrypted', :host => "#{h request.host}"
+          %p
+            =t'user_sessions.security.message_unencrypted2'
+          %p
+            %input.button#show-login{:type => 'button', :value => "#{t('user_sessions.security.return_to_login')}"}
+        = image_tag 'login-card-logo-upstream.png', :id => 'logo'
diff --git a/src/app/views/user_sessions/_username_recovery.html.haml b/src/app/views/user_sessions/_username_recovery.html.haml
new file mode 100644
index 0000000..80b7c76
--- /dev/null
+++ b/src/app/views/user_sessions/_username_recovery.html.haml
@@ -0,0 +1,13 @@
+.card_container#username_recovery_container
+  .card
+    %p
+      = t('user_sessions.new.login_unknown_info')
+      = link_to t('user_sessions.new.return_to_login'), "#", :id => "username_return_link"
+    = form_tag user_session_path, :method => :get, :id => "login_recovery_form", :remote => true do
+      %fieldset.primary
+        = label_tag :email
+        = text_field_tag :email, params[:email]
+      %fieldset.primary.hidden
+      %div.group.secondary_actions
+        %span
+      = submit_tag t('user_sessions.new.send_login'), :class => 'button fr', :disabled => true
diff --git a/src/app/views/user_sessions/new.html.haml b/src/app/views/user_sessions/new.html.haml
index bb3eaa9..a89614c 100644
--- a/src/app/views/user_sessions/new.html.haml
+++ b/src/app/views/user_sessions/new.html.haml
@@ -1,70 +1,38 @@
 :javascript
-  /* todo: cleanup soon */
   $(document).ready(function() {
-    $('#password-input').showPassword({'checkbox':'#reveal'});
     $('#username').focus(); // bring the username to focus
 
-    $('#security-btn').click(function(){
-      $('#login').hide();
-      $('#security').animate({ 'left': 0, 'width': 502 },{queue:false,duration:150});
-    });
-
-    $('#show-login').click(function(){
-      $('#security').animate({ 'left': -$('#security').outerWidth() + 143, 'width': 500 },{queue:false,duration:150});
-      $('#login').show();
-    });
-
-    $('#new_user_session').submit(function() {
+    $('#login_form').submit(function() {
       $('#progress-indicator').show();
-      var form_data = $(this).serialize(); /* serialize() is sensitive to disabled elements */
-      $('#login input').each(function(){ $(this).attr('disabled', true); });
-      $.ajax({
-        url: this.action,
-        type: 'POST',
-        accepts: { html: "application/javascript" },
-        dataType: 'html',
-        data: form_data,
-        success: function(data, textStatus, jqXHR) {
-          if(jqXHR.status === 201) window.location = data;
-          else window.location.reload();
-        },
-        error: function(response) {
-          //TODO: for some reason error connection errors are not handled by 'error' callback,
-          //what's worse jquery sets 'textStatus' to success, if we want to catch connection errors
-          //we will have to check if status code == 0 in 'complete' callback
-          $('#error-content').remove();
-          $('#primary-container').prepend('<div id="error-content" class="error" style="opacity: 0; position: relative;"></div>');
-          var text = response.responseText == '' ? response.statusText : response.responseText;
-          if(response.status !== 401) text = "Internal Server Error";
-          $('#error-content').html('<p class="text">' + text  + '</p>');
-          $('#error-content').animate({ 'opacity': 1, 'top': -10 },{queue:false,duration:150});
-          $('#progress-indicator').hide();
-          $('#login input').each(function(){ $(this).removeAttr('disabled'); });
-        },
-      });
-      return false;
     });
   })
 
-#card-surround
-  #card
-    = render :partial => 'security'
-    .panel#login
-      .content
-        = form_tag user_session_path, :id => 'new_user_session' do
-          %fieldset.primary
-            = label_tag :login, t("user_sessions.new.username")
-            = text_field_tag :login, params[:login], :class => 'username'
-          %fieldset.primary
-            = label_tag :password, t("user_sessions.new.password")
-            = password_field_tag :password, params[:password], :class => 'password', :id => 'password-input'
-          %fieldset.reveal_pass
-            %input{:type => 'checkbox', :id => 'reveal'}
-            %label{:for => 'reveal'}= t"user_sessions.new.show_password"
-          %div.group.bottom.left
-            .options
-              %a.security#security-btn{:href => '#'}
-                %span=t"user_sessions.new.security_info"
-          %div.group.bottom.submit
-            = image_tag 'login-spinner.gif', :alt => 'Working...', :id => 'progress-indicator'
-            = submit_tag "#{t('user_sessions.new.login')}", :class => "button", :id => 'login-btn'
+.card
+  -if flash[:warning]
+    %div.error
+      %p.text= flash[:warning]
+  -if flash[:error]
+    %div.error
+      %p.text= flash[:error]
+
+  = form_tag user_session_path, :id => 'login_form' do
+    %fieldset.primary
+      = label_tag :login, t("user_sessions.new.username")
+      = text_field_tag :login, params[:login], :class => 'username', :id => 'username'
+    %fieldset.primary
+      = label_tag :password, t("user_sessions.new.password")
+      = password_field_tag :password, params[:password], :class => 'password', :id => 'password-input'
+    .group.secondary_actions
+      /%input{:type => 'checkbox', :id => 'reveal'}
+      /%label{:for => 'reveal'}= t"user_sessions.new.show_password"
+      %span
+        = t "user_sessions.new.forgot"
+        = link_to t("user_sessions.new.login"), "#", :id => "username_link"
+        = t "user_sessions.new.or"
+        = link_to( t("user_sessions.new.password"), "#", :id => "password_link" ) + "?"
+    = submit_tag "#{t('user_sessions.new.login')}", :class => "button fr", :id => 'login_btn'
+    = image_tag 'login-spinner.gif', :alt => 'Working...', :id => 'progress-indicator'
+
+- unless @disable_password_recovery
+  = render :partial => 'password_recovery'
+  = render :partial => 'username_recovery'
diff --git a/src/config/locales/en.yml b/src/config/locales/en.yml
index efad169..42b15f5 100644
--- a/src/config/locales/en.yml
+++ b/src/config/locales/en.yml
@@ -160,13 +160,20 @@ en:
       ldap: "LDAP-managed User Groups"
   user_sessions:
     new:
-      username: "Username:"
-      password: "Password:"
+      username: "Username"
+      password: "Password"
       show_password: Show my password
       login_assistance: Login Assistance
       security_info: Security Info
       login: Login
       help: "Help functionality is not yet available."
+      forgot: Forgot
+      or: or
+      login_unknown_info: "If you do not know your username, please enter your email address below and your username information will be sent to you."
+      return_to_login: "Return to log in"
+      send_login: "Send Login"
+      password_unknown_info: "Enter your username and email address below and instructions on resetting your password will be sent to you."
+      reset_password: "Reset Password"
     security:
       encrypted_connection: Encrypted Connection
       unencrypted_connection:  Unencrypted Connection
@@ -182,7 +189,7 @@ en:
         login: "Login successful!"
         logout: "Logout successful!"
       warning:
-        login_failed: "Login failed: The Username and Password you entered do not match"
+        login_failed: "The Username or Password is incorrect, please try again."
   about: About
   configure: Configure
   hello: Hello
diff --git a/src/public/javascripts/jquery.showpassword.js b/src/public/javascripts/jquery.showpassword.js
deleted file mode 100644
index c1d33ca..0000000
--- a/src/public/javascripts/jquery.showpassword.js
+++ /dev/null
@@ -1,107 +0,0 @@
-/**
-*	@name							Show Password
-*	@descripton
-*	@version						1.2
-*	@requires						Jquery 1.2.6+
-*
-*	@author							Jan Jarfalk
-*	@author-email					jan.jarfalk@unwrongest.com
-*	@author-website					http://www.unwrongest.com
-*
-*	@special-thanks					Michel Gratton
-*
-*	@licens							MIT License - http://www.opensource.org/licenses/mit-license.php
-*/
- (function($) {
-    $.fn.extend({
-        showPassword: function(options, callback) {
-            return this.each(function() {
-
-                var $input = $(this),
-                callbackArguments = {
-                    'input': $input
-                },
-                $checkbox = $(options.checkbox);
-
-
-                // Create clone
-                var $clone = cloneElement($input);
-
-                // Add clone to callback arguments
-                callbackArguments.clone = $clone;
-
-                $clone.insertAfter($input);
-
-                function cloneElement(element) {
-
-                    var $element = $(element);
-
-                    $clone = $("<input />");
-
-                    // Name added for JQuery Validation compatibility
-                    // Element name is required to avoid script warning.
-                    $clone.attr({
-                        'type': 'text',
-                        'class': $input.attr('class'),
-                        'style': $input.attr('style'),
-                        'size': $input.attr('size'),
-                        'name': '_' + $input.attr('name'),
-                        'tabindex': $input.attr('tabindex')
-                    });
-
-                    return $clone;
-                };
-
-                var update = function(a, b) {
-                    b.val(a.val());
-                };
-
-                var setState = function() {
-                    if ($checkbox.is(':checked')) {
-                        update($input, $clone);
-                        $clone.show();
-                        $input.hide();
-                    } else {
-                        update($clone, $input);
-                        $clone.hide();
-                        $input.show();
-                    }
-                };
-
-                $checkbox.bind('click',
-                function() {
-                    setState();
-                });
-
-                $input.bind('keyup',
-                function() {
-                    update($input, $clone)
-                });
-
-                $clone.bind('keyup',
-                function() {
-                    update($clone, $input);
-
-                    // Added for JQuery Validation compatibility
-                    // This will trigger validation if it's ON for keyup event
-                    $input.trigger('keyup');
-
-                });
-
-                // Added for JQuery Validation compatibility
-                // This will trigger validation if it's ON for blur event
-                $clone.bind('blur',
-                function() {
-                    $input.trigger('focusout');
-                });
-
-                setState();
-
-                if (callback) {
-                    callback(callbackArguments);
-                }
-
-            });
-        }
-    });
-})(jQuery);
diff --git a/src/vendor/converge-ui b/src/vendor/converge-ui
index f36be9b..fd4e416 160000
--- a/src/vendor/converge-ui
+++ b/src/vendor/converge-ui
@@ -1 +1 @@
-Subproject commit f36be9b36606acc8112e27ea91bdb5a2cd92d22c
+Subproject commit fd4e41685e2b5bfc401a278069f3480971287d4a
-- 
1.7.7.6

