diff --git a/public/js/wn-web.js b/public/js/wn-web.js
index cd6552a..e45acf2 100644
--- a/public/js/wn-web.js
+++ b/public/js/wn-web.js
@@ -1,4 +1,4 @@
-window.home_page = "index";
+window.home_page = "home";
 // footer signup widget
 // automatically adds it to the .layout-main div of the page
 // adds events and also random goodies.
@@ -8,18 +8,30 @@
   // goodies
   var goodies = [
      "ERPNext also contains a module to build your website. \
-The way it works is, when you log out, the app becomes your website. \
-This website is generated from ERPNext.",
+    The way it works is, when you log out, the app becomes your website. \
+    This website is generated from ERPNext.",
 
-     "You can add custom fields to your transactions in ERPNext to capture specific information about your business.",
+     "You can add custom fields to your transactions in ERPNext to \
+     capture specific information about your business.",
 
-     "All forms in ERPNext can be customized, if you feel there are features you do not want to use, you can hide them.",
+     "All forms in ERPNext can be customized, if you feel there are \
+     features you do not want to use, you can hide them.",
 
-     "You can email transactions like Quotations and Invoices directly from the system. You can also set this process to become automatic",
+     "You can email transactions like Quotations and Invoices directly \
+     from the system. You can also set this process to become automatic",
 
-     "You can create your own Roles and assign user to those roles. You can also set detailed permissions for each role in transactions.",
+     "You can create your own Roles and assign user to those roles. \
+     You can also set detailed permissions for each role in transactions.",
 
-     "ERPNext allows you to assign any transaction like an Invoice or Customer Issue to a user. You can also add comments on any transaction."
+     "ERPNext allows you to assign any transaction like an Invoice \
+     or Customer Issue to a user. You can also add comments on any \
+     transaction.",
+     
+     "Stay on top with a daily, weekly or montly email summarizing all your business\
+     activites and accounting data like Income, Receivables, Paybles etc.",
+     
+     "Integrate incoming Support queries to your email into ERPNext. \
+     Keep track of open tickets and allocate tickets to your users."
 
   ];
 
@@ -28,54 +40,82 @@
 
   $('#page-' + page_name + ' .layout-main').append('<div class="page-footer">\
 <h2 style="padding: 0px">Try before you buy. \
-Request a 30-day Free Trial.</h2><br>\
-\
-<input name="company_name" type="text" placeholder="Company Name"> \
-<input name="sender_name" type="text" placeholder="Your Name"> \
-<input name="email" type="text" placeholder="Email"> \
-<input name="password" type="password" placeholder="Password"> \
-<button class="btn btn-success btn-small btn-request">Request</button>\
-\
-<p>Note: Free trials usually take one business day to setup. \
-Please fill out your genuine information because we verify \
-your name and company before setting up a demo to \
-ensure that spammers don\'t crash our servers. \
-If you would like to see something right now, \
-<a href="#!demo">jump to the demo.</a></p>\
-\
-<p style="font-size: 90%; margin-top: 10px;">\
+Request a 30-day Free Trial.</h2>\
+<ul>\
+<li><a href="erpnext-pricing.html">Starts at an un-believable $299 per year.</a>\
+<li><a href="http://demo.erpnext.com" target="_blank">\
+Show me a full demo (new page).</a>\
+<li><a href="sign-up.html">Take me to the sign-up page.</a>\
+</ul>\
+<p>\
 <i class="icon-hand-right"></i> <b>ERPNext Goodies:</b> <span class="goodie">'
 
 + goodies[parseInt(Math.random() * goodies.length)]+
 
 '</goodie></p>\
-</span>');
+<p>ERPNext is <a href="open-source.html">Open Source</a> under the GNU/General Public License.</p>\
+<p><g:plusone size="medium" annotation="inline"></g:plusone></p>\
+\
+<table><tr><td style="width: 115px">\
+    <a href="https://twitter.com/erpnext" class="twitter-follow-button" \
+    data-show-count="false">Follow @erpnext</a></td>\
+    <td style="width: 150px; font-size: 80%; vertical-align: middle;">\
+    Get status updates on Twitter.</td></tr>\
+</table>');
 
-  // bind the events
+  // render plusone
+  window.gapi && window.gapi.plusone.go();
+  
+  // render twitter button
+  twttr.widgets.load();
+}
 
-  $('#page-'+page_name+' .btn-request').click(function() {
+//////////////// Hide Login for frappe!
 
-    var page = $('#page-' + wn.container.page.page_name);
-    var args = {
-        sender_name: page.find('[name="sender_name"]').val(),
-        company_name: page.find('[name="company_name"]').val(),
-        email: page.find('[name="email"]').val(),
-        password: page.find('[name="password"]').val()
-      }
+$(document).ready(function() {
+  setTimeout("$('#login-topbar-item').toggle(false);", 1000);
+});
 
-    if(!(args.sender_name && args.company_name && args.email && args.password)) {
-       msgprint("All fields are necessary. Please try again.");
-       return;
-    }
+//////////////// Analytics
+
+window._gaq = window._gaq || [];
+window._gaq.push(['_setAccount', 'UA-8911157-1']);
+window._gaq.push(['_trackPageview']);
+
+(function() {
+    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
+    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
+})();
 
 
-    erpnext.send_message({
-      subject:'New Trial Request',
-      sender: page.find('[name="sender_name"]').val(),
-      message: args,
-      callback: function() {
-        page.find(':input').val('');
-      }
-    });
-  });
-}
\ No newline at end of file
+/////////////// Page view
+
+$(window).bind('hashchange', function() {
+  window._gaq.push(['_trackPageview', wn.get_route_str()]);
+});
+
+/////////////// Update conversion
+
+erpnext.update_conversion = function() {
+  $('body').append('<div style="display:inline;">\
+<img height="1" width="1" style="border-style:none;" alt="" \
+src="http://www.googleadservices.com/pagead/conversion/1032834481/?label=JvAUCLX41gEQsZu_7AM&amp;guid=ON&amp;script=0"/>\
+</div>')
+};
+
+////////////// Plus One
+
+(function() {
+  var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
+  po.src = 'https://apis.google.com/js/plusone.js';
+  var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
+})();
+
+////////////// Twitter
+
+(function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];
+if(!d.getElementById(id)){js=d.createElement(s);js.id=id;
+js.src="//platform.twitter.com/widgets.js";
+fjs.parentNode.insertBefore(js,fjs);}})(document,"script","twitter-wjs");
+
