incubator-esme-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From rhir...@apache.org
Subject svn commit: r937955 - in /incubator/esme/trunk/server/src/main: resources/ scala/org/apache/esme/model/ webapp/ webapp/images/ webapp/info_view/ webapp/profile_view/ webapp/scripts/ webapp/style/ webapp/templates-hidden/
Date Mon, 26 Apr 2010 07:52:07 GMT
Author: rhirsch
Date: Mon Apr 26 07:52:06 2010
New Revision: 937955

URL: http://svn.apache.org/viewvc?rev=937955&view=rev
Log:
[ESME-100] Finish web UI
Daily hour

Added:
    incubator/esme/trunk/server/src/main/webapp/images/first.png   (with props)
    incubator/esme/trunk/server/src/main/webapp/images/last.png   (with props)
    incubator/esme/trunk/server/src/main/webapp/images/next.png   (with props)
    incubator/esme/trunk/server/src/main/webapp/images/prev.png   (with props)
    incubator/esme/trunk/server/src/main/webapp/scripts/jquery.tablesorter.pager.js
    incubator/esme/trunk/server/src/main/webapp/scripts/jquery.validate.js
Modified:
    incubator/esme/trunk/server/src/main/resources/ESMEBase.properties
    incubator/esme/trunk/server/src/main/resources/ESMECustom.properties
    incubator/esme/trunk/server/src/main/scala/org/apache/esme/model/AuthToken.scala
    incubator/esme/trunk/server/src/main/webapp/index.html
    incubator/esme/trunk/server/src/main/webapp/info_view/users.html
    incubator/esme/trunk/server/src/main/webapp/profile_view/edit.html
    incubator/esme/trunk/server/src/main/webapp/scripts/esme_table_sorter_users.js
    incubator/esme/trunk/server/src/main/webapp/scripts/esme_tool_tip.js
    incubator/esme/trunk/server/src/main/webapp/signup.html
    incubator/esme/trunk/server/src/main/webapp/style/style.css
    incubator/esme/trunk/server/src/main/webapp/templates-hidden/base.html
    incubator/esme/trunk/server/src/main/webapp/templates-hidden/default.html
    incubator/esme/trunk/server/src/main/webapp/templates-hidden/default_signup.html
    incubator/esme/trunk/server/src/main/webapp/templates-hidden/upw_login_form.html
    incubator/esme/trunk/server/src/main/webapp/templates-hidden/upw_signup_form.html

Modified: incubator/esme/trunk/server/src/main/resources/ESMEBase.properties
URL: http://svn.apache.org/viewvc/incubator/esme/trunk/server/src/main/resources/ESMEBase.properties?rev=937955&r1=937954&r2=937955&view=diff
==============================================================================
--- incubator/esme/trunk/server/src/main/resources/ESMEBase.properties (original)
+++ incubator/esme/trunk/server/src/main/resources/ESMEBase.properties Mon Apr 26 07:52:06 2010
@@ -63,7 +63,7 @@ base_user_ui_timezone=Timezone
 base_user_ui_locale=Locale
 base_user_msg_follow=User %s followed %s.
 base_user_msg_unfollow=User %s unfollowed %s.
-base_user_err_unknown_creds=Unknown credentials
+base_user_err_unknown_creds=Unknown user or incorrect password. Please try again. 
 base_user_err_bad_email=Bad email address
 base_user_err_mismatch_password=Passwords do not match
 base_user_err_password_too_short=Passwords must be 6 characters or longer
@@ -78,6 +78,7 @@ base_token_menu=My Tokens
 base_token_error_name_short=Token description too short! Token descriptions must have a length of at least 3 characters!
 base_token_msg_new_token=A new token '%s' has been created. 
 base_token_msg_removed=Action '%s' removed
+base_token_err_duplicate_token=The description '%s' is taken, please choose another
 
 base_track_menu=My Tracks
 base_track_error_name_short=The track is too short. Tracks must have a length of at least 3 characters!

Modified: incubator/esme/trunk/server/src/main/resources/ESMECustom.properties
URL: http://svn.apache.org/viewvc/incubator/esme/trunk/server/src/main/resources/ESMECustom.properties?rev=937955&r1=937954&r2=937955&view=diff
==============================================================================
--- incubator/esme/trunk/server/src/main/resources/ESMECustom.properties (original)
+++ incubator/esme/trunk/server/src/main/resources/ESMECustom.properties Mon Apr 26 07:52:06 2010
@@ -20,7 +20,7 @@ custom_mail_from_adress=esme@esme.apache
 custom_mail_subject=Message from ESME
 
 custom_opening_main_title=Getting Started on ESME
-custom_opening_main_body=Apache Enterprise Social Messaging Experiment (ESME) is a secure and highly scalable microsharing and micromessaging platform that allows people to discover and meet one another and get controlled access to other sources of information, all in a business process context.ESME is based on the idea that you - the user - decide what information is useful for you.  There are various ways to discover what other users are posting information that may be relevant for you 1) Use "Tracks" to follow terms that may be of interest for you, 2) Use the public timeline to find others who posts may be of interest 3) Use the search function to find others who posts meet certain criterien, 4) Post your thoughts, ideas, etc and others with similar interests will enter into conversations with you
+custom_opening_main_body=Apache Enterprise Social Messaging Experiment (ESME) is a secure and highly scalable microsharing and micromessaging platform that allows people to discover and meet one another and get controlled access to other sources of information, all in a business process context. ESME is based on the idea that you - the user - decide what information is useful for you.  There are various ways to discover what other users are posting information that may be relevant for you 1) Use "Tracks" to follow terms that may be of interest for you, 2) Use the public timeline to find others who posts may be of interest 3) Use the search function to find others who posts meet certain criterien, 4) Post your thoughts, ideas, etc and others with similar interests will enter into conversations with you
 
 custom_heading_1_title=ASF 
 custom_heading_1_body=Apache Software Foundation (ASF) provides support for the Apache community of open-source software projects. 

Modified: incubator/esme/trunk/server/src/main/scala/org/apache/esme/model/AuthToken.scala
URL: http://svn.apache.org/viewvc/incubator/esme/trunk/server/src/main/scala/org/apache/esme/model/AuthToken.scala?rev=937955&r1=937954&r2=937955&view=diff
==============================================================================
--- incubator/esme/trunk/server/src/main/scala/org/apache/esme/model/AuthToken.scala (original)
+++ incubator/esme/trunk/server/src/main/scala/org/apache/esme/model/AuthToken.scala Mon Apr 26 07:52:06 2010
@@ -48,9 +48,26 @@ class AuthToken extends LongKeyedMapper[
   def getSingleton = AuthToken // what's the "meta" server
   def primaryKeyField = id
 
+  def findByDescription(str: String): List[AuthToken] =
+  AuthToken.findAll(By(description, str))
+
   object id extends MappedLongIndex(this)
   object user extends MappedLongForeignKey(this, User)
-  object description extends MappedPoliteString(this, 64)
+  object description extends MappedPoliteString(this, 64) {
+  
+    private def validateDescription(str: String): List[FieldError] = {
+      val others = getSingleton.findByDescription(str).
+      filter(_.id.is != fieldOwner.id.is)
+      others.map{u =>
+        val msg = S.?("base_token_err_duplicate_token", str)
+        S.error(msg)
+        FieldError(this, Text(msg))
+      }
+    }
+
+
+    override def validations = validateDescription _ :: super.validations
+  }
    //define createfields
   object createdDate extends MappedDateTime(this)
   

Added: incubator/esme/trunk/server/src/main/webapp/images/first.png
URL: http://svn.apache.org/viewvc/incubator/esme/trunk/server/src/main/webapp/images/first.png?rev=937955&view=auto
==============================================================================
Binary file - no diff available.

Propchange: incubator/esme/trunk/server/src/main/webapp/images/first.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: incubator/esme/trunk/server/src/main/webapp/images/last.png
URL: http://svn.apache.org/viewvc/incubator/esme/trunk/server/src/main/webapp/images/last.png?rev=937955&view=auto
==============================================================================
Binary file - no diff available.

Propchange: incubator/esme/trunk/server/src/main/webapp/images/last.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: incubator/esme/trunk/server/src/main/webapp/images/next.png
URL: http://svn.apache.org/viewvc/incubator/esme/trunk/server/src/main/webapp/images/next.png?rev=937955&view=auto
==============================================================================
Binary file - no diff available.

Propchange: incubator/esme/trunk/server/src/main/webapp/images/next.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: incubator/esme/trunk/server/src/main/webapp/images/prev.png
URL: http://svn.apache.org/viewvc/incubator/esme/trunk/server/src/main/webapp/images/prev.png?rev=937955&view=auto
==============================================================================
Binary file - no diff available.

Propchange: incubator/esme/trunk/server/src/main/webapp/images/prev.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Modified: incubator/esme/trunk/server/src/main/webapp/index.html
URL: http://svn.apache.org/viewvc/incubator/esme/trunk/server/src/main/webapp/index.html?rev=937955&r1=937954&r2=937955&view=diff
==============================================================================
--- incubator/esme/trunk/server/src/main/webapp/index.html (original)
+++ incubator/esme/trunk/server/src/main/webapp/index.html Mon Apr 26 07:52:06 2010
@@ -22,8 +22,6 @@
 		<lift:surround with="message" at="content"/>
 		<div id="messages"></div>
 		<lift:Msgs>
-			<lift:error_msg>Error:</lift:error_msg>
-			<lift:notice_msg>FYI:</lift:notice_msg>
 			<lift:error_class>error_major</lift:error_class>
 			<lift:notice_msg>
 				<lift:loc>ui_base_note</lift:loc>

Modified: incubator/esme/trunk/server/src/main/webapp/info_view/users.html
URL: http://svn.apache.org/viewvc/incubator/esme/trunk/server/src/main/webapp/info_view/users.html?rev=937955&r1=937954&r2=937955&view=diff
==============================================================================
--- incubator/esme/trunk/server/src/main/webapp/info_view/users.html (original)
+++ incubator/esme/trunk/server/src/main/webapp/info_view/users.html Mon Apr 26 07:52:06 2010
@@ -18,6 +18,7 @@
 -->
 <lift:surround with="base" at="left">
     <link rel="stylesheet" type="text/css" href="../style/style.css"/>
+     <script type="text/javascript" src="../scripts/jquery.tablesorter.pager.js"></script>
     <script type="text/javascript" src="../scripts/esme_table_sorter_users.js"></script>
     <lift:TableSorterSnip/>
     <div id="back-header">
@@ -71,7 +72,19 @@
                 </lift:displayUsers>
             </tbody>
         </table>
-      
+         <div style="top: 635px; position: absolute;" id="pager" class="pager">
+	<form>
+		<img src="../images/first.png" class="first"/>
+		<img src="../images/prev.png" class="prev"/>
+	        <input disabled="true" value="1/100" class="inputBox2 pagedisplay" type="text"/>
+		<img src="../images/next.png" class="next"/>
+		<img src="../images/last.png" class="last"/>
+		<select class="pagesize">
+			<option  value="5">5</option>
+			<option  selected="selected" value="10">10</option>
+		</select>
+	</form>
+      </div>
       </div><!--container-settings-->
 	</div><!--END CONTENT BOX-->	
 </lift:surround>
\ No newline at end of file

Modified: incubator/esme/trunk/server/src/main/webapp/profile_view/edit.html
URL: http://svn.apache.org/viewvc/incubator/esme/trunk/server/src/main/webapp/profile_view/edit.html?rev=937955&r1=937954&r2=937955&view=diff
==============================================================================
--- incubator/esme/trunk/server/src/main/webapp/profile_view/edit.html (original)
+++ incubator/esme/trunk/server/src/main/webapp/profile_view/edit.html Mon Apr 26 07:52:06 2010
@@ -24,55 +24,55 @@
 
 	<!---CONTENT BOX-->
 	<div class="container-settings">
-		  <lift:editProfile form="post">
+		  <lift:editProfile form="post" id = "validateForm">
 					<div id="form-signup">
 							<div class="post-form-row">
-								<label><lift:loc>ui_sign_up_nickname</lift:loc></label>
-								<user:nickname class="inputBox2  tipelement" title="This is nickname that other users will use communicate with you."/>
+								<label class="main"><lift:loc>ui_sign_up_nickname</lift:loc></label>
+								<user:nickname class="inputBox2  tipelement required alphanumeric" minlength="3" title="This is nickname that other users will use communicate with you."/>
 							</div>	
 							
 							<div class="post-form-row">
-								<label><lift:loc>ui_sign_up_firstname</lift:loc></label>
-								<user:firstName class="inputBox2 tipelement" title="This is your first name."/>
+								<label class="main"><lift:loc>ui_sign_up_firstname</lift:loc></label>
+								<user:firstName class="inputBox2 tipelement required" minlength="3" title="This is your first name."/>
 							</div>	
 							
 							<div class="post-form-row">
-								<label><lift:loc>ui_sign_up_lastname</lift:loc></label>
-								<user:lastName class="inputBox2 tipelement" title="This is your last name."/>
+								<label class="main"><lift:loc>ui_sign_up_lastname</lift:loc></label>
+								<user:lastName class="inputBox2 tipelement required" minlength="3"  title="This is your last name."/>
 							</div>	
 							
 							<div class="post-form-row">
-								<label><lift:loc>ui_sign_up_image_url</lift:loc></label>
-								<user:imageURL class="inputBox2 tipelement" title="This is the URL that points to your avatar picture. You can use Gravatar.com to store your avatar images."/>
+								<label class="main"><lift:loc>ui_sign_up_image_url</lift:loc></label>
+								<user:imageURL class="inputBox2 tipelement  url"  title="This is the URL that points to your avatar picture. You can use Gravatar.com to store your avatar images."/>
 							</div>	
 							
 							<div class="post-form-row">
-								<label><lift:loc>ui_sign_up_timezone</lift:loc></label>
+								<label class="main"><lift:loc>ui_sign_up_timezone</lift:loc></label>
 								<user:timezone class="inputBox2 tipelement" title="This is the timezone in which you are located."/>
 							</div>	
 							
 							<div class="post-form-row">
-								<label><lift:loc>ui_sign_up_locale</lift:loc></label>
+								<label class="main"><lift:loc>ui_sign_up_locale</lift:loc></label>
 								<user:locale class="inputBox2 tipelement" title="This is your language setting that influences which language is used in the UI. "/>
 							</div>
 							
 							<div class="post-form-row">
-								<label><lift:loc>ui_login_email</lift:loc></label>
-								<user:email class="inputBox2 tipelement" title="This is your email. "/>
+								<label class="main"><lift:loc>ui_login_email</lift:loc></label>
+								<user:email class="inputBox2 tipelement  email" minlength="3" title="This is your email. "/>
 							</div>	
 							
 							<div class="post-form-row">
-								<label><lift:loc>ui_login_password</lift:loc></label>
+								<label class="main"><lift:loc>ui_login_password</lift:loc></label>
 								<user:password class="inputBox2 tipelement" title="This is your password"/>
 							</div>	
 							
 							<div class="post-form-row">
-								<label><lift:loc>ui_login_password_repeat</lift:loc></label>
+								<label class="main"><lift:loc>ui_login_password_repeat</lift:loc></label>
 								<user:confirm class="inputBox2 tipelement" title="Please enter your password again to make sure that it is correct"/>
 							</div>	
 							
 							<div class="post-form-row">
-								<label><lift:loc>ui_sign_up_openid</lift:loc></label>
+								<label class="main"><lift:loc>ui_sign_up_openid</lift:loc></label>
 								<user:openid class="inputBox2 tipelement" title="This is your OpenID URL."/>
 							</div>	
 							

Modified: incubator/esme/trunk/server/src/main/webapp/scripts/esme_table_sorter_users.js
URL: http://svn.apache.org/viewvc/incubator/esme/trunk/server/src/main/webapp/scripts/esme_table_sorter_users.js?rev=937955&r1=937954&r2=937955&view=diff
==============================================================================
--- incubator/esme/trunk/server/src/main/webapp/scripts/esme_table_sorter_users.js (original)
+++ incubator/esme/trunk/server/src/main/webapp/scripts/esme_table_sorter_users.js Mon Apr 26 07:52:06 2010
@@ -19,7 +19,8 @@
 
 $(document).ready(function() 
     { 
-        $("#esme-table").tablesorter({headers: { 0: { sorter: false} } }); 
-    } 
-); 
+        $("#esme-table")
+         .tablesorter({headers: { 0: { sorter: false} }})  
+         .tablesorterPager({container: $("#pager")}); 
+}); 
    
\ No newline at end of file

Modified: incubator/esme/trunk/server/src/main/webapp/scripts/esme_tool_tip.js
URL: http://svn.apache.org/viewvc/incubator/esme/trunk/server/src/main/webapp/scripts/esme_tool_tip.js?rev=937955&r1=937954&r2=937955&view=diff
==============================================================================
--- incubator/esme/trunk/server/src/main/webapp/scripts/esme_tool_tip.js (original)
+++ incubator/esme/trunk/server/src/main/webapp/scripts/esme_tool_tip.js Mon Apr 26 07:52:06 2010
@@ -17,6 +17,11 @@
  under the License.                                           *
 */
 
+  $(document).ready(function(){
+    $("#validateForm").validate();
+  });
+
+
 $(function(){
     $(".tipelement").tipTip({maxWidth: "auto", edgeOffset: 10});
 });

Added: incubator/esme/trunk/server/src/main/webapp/scripts/jquery.tablesorter.pager.js
URL: http://svn.apache.org/viewvc/incubator/esme/trunk/server/src/main/webapp/scripts/jquery.tablesorter.pager.js?rev=937955&view=auto
==============================================================================
--- incubator/esme/trunk/server/src/main/webapp/scripts/jquery.tablesorter.pager.js (added)
+++ incubator/esme/trunk/server/src/main/webapp/scripts/jquery.tablesorter.pager.js Mon Apr 26 07:52:06 2010
@@ -0,0 +1,198 @@
+/*
+ * 
+ * TableSorter 2.0 - Client-side table sorting with ease!
+ * Version 2.0.3
+ * @requires jQuery v1.2.3
+ * 
+ * Copyright (c) 2007 Christian Bach
+ * Examples and docs at: http://tablesorter.com
+ * Dual licensed under the MIT and GPL licenses:
+ * http://www.opensource.org/licenses/mit-license.php
+ * http://www.gnu.org/licenses/gpl.html
+ * 
+ */
+
+(function($) {
+	$.extend({
+		tablesorterPager: new function() {
+			
+			function updatePageDisplay(c) {
+				var s = $(c.cssPageDisplay,c.container).val((c.page+1) + c.seperator + c.totalPages);	
+			}
+			
+			function setPageSize(table,size) {
+				var c = table.config;
+				c.size = size;
+				c.totalPages = Math.ceil(c.totalRows / c.size);
+				c.pagerPositionSet = false;
+				moveToPage(table);
+				fixPosition(table);
+			}
+			
+			function fixPosition(table) {
+				var c = table.config;
+				if(!c.pagerPositionSet && c.positionFixed) {
+					var c = table.config, o = $(table);
+					if(o.offset) {
+						c.container.css({
+							top: o.offset().top + o.height() + 'px',
+							position: 'absolute'
+						});
+					}
+					c.pagerPositionSet = true;
+				}
+			}
+			
+			function moveToFirstPage(table) {
+				var c = table.config;
+				c.page = 0;
+				moveToPage(table);
+			}
+			
+			function moveToLastPage(table) {
+				var c = table.config;
+				c.page = (c.totalPages-1);
+				moveToPage(table);
+			}
+			
+			function moveToNextPage(table) {
+				var c = table.config;
+				c.page++;
+				if(c.page >= (c.totalPages-1)) {
+					c.page = (c.totalPages-1);
+				}
+				moveToPage(table);
+			}
+			
+			function moveToPrevPage(table) {
+				var c = table.config;
+				c.page--;
+				if(c.page <= 0) {
+					c.page = 0;
+				}
+				moveToPage(table);
+			}
+						
+			
+			function moveToPage(table) {
+				var c = table.config;
+				if(c.page < 0 || c.page > (c.totalPages-1)) {
+					c.page = 0;
+				}
+				
+				renderTable(table,c.rowsCopy);
+			}
+			
+			function renderTable(table,rows) {
+				
+				var c = table.config;
+				var l = rows.length;
+				var s = (c.page * c.size);
+				var e = (s + c.size);
+				if(e > rows.length ) {
+					e = rows.length;
+				}
+				
+				
+				var tableBody = $(table.tBodies[0]);
+				
+				// clear the table body
+				
+				$.tablesorter.clearTableBody(table);
+				
+				for(var i = s; i < e; i++) {
+					
+					//tableBody.append(rows[i]);
+					
+					var o = rows[i];
+					var l = o.length;
+					for(var j=0; j < l; j++) {
+						
+						tableBody[0].appendChild(o[j]);
+
+					}
+				}
+				
+				fixPosition(table,tableBody);
+				
+				$(table).trigger("applyWidgets");
+				
+				if( c.page >= c.totalPages ) {
+        			moveToLastPage(table);
+				}
+				
+				updatePageDisplay(c);
+			}
+			
+			this.appender = function(table,rows) {
+				
+				var c = table.config;
+				
+				c.rowsCopy = rows;
+				c.totalRows = rows.length;
+				c.totalPages = Math.ceil(c.totalRows / c.size);
+				
+				renderTable(table,rows);
+			};
+			
+			this.defaults = {
+				size: 10,
+				offset: 0,
+				page: 0,
+				totalRows: 0,
+				totalPages: 10,
+				container: null,
+				cssNext: '.next',
+				cssPrev: '.prev',
+				cssFirst: '.first',
+				cssLast: '.last',
+				cssPageDisplay: '.pagedisplay',
+				cssPageSize: '.pagesize',
+				seperator: "/",
+				positionFixed: true,
+				appender: this.appender
+			};
+			
+			this.construct = function(settings) {
+				
+				return this.each(function() {	
+					
+					config = $.extend(this.config, $.tablesorterPager.defaults, settings);
+					
+					var table = this, pager = config.container;
+				
+					$(this).trigger("appendCache");
+					
+					config.size = parseInt($(".pagesize",pager).val());
+					
+					$(config.cssFirst,pager).click(function() {
+						moveToFirstPage(table);
+						return false;
+					});
+					$(config.cssNext,pager).click(function() {
+						moveToNextPage(table);
+						return false;
+					});
+					$(config.cssPrev,pager).click(function() {
+						moveToPrevPage(table);
+						return false;
+					});
+					$(config.cssLast,pager).click(function() {
+						moveToLastPage(table);
+						return false;
+					});
+					$(config.cssPageSize,pager).change(function() {
+						setPageSize(table,parseInt($(this).val()));
+						return false;
+					});
+				});
+			};
+			
+		}
+	});
+	// extend plugin scope
+	$.fn.extend({
+        tablesorterPager: $.tablesorterPager.construct
+	});
+	
+})(jQuery);				
\ No newline at end of file

Added: incubator/esme/trunk/server/src/main/webapp/scripts/jquery.validate.js
URL: http://svn.apache.org/viewvc/incubator/esme/trunk/server/src/main/webapp/scripts/jquery.validate.js?rev=937955&view=auto
==============================================================================
--- incubator/esme/trunk/server/src/main/webapp/scripts/jquery.validate.js (added)
+++ incubator/esme/trunk/server/src/main/webapp/scripts/jquery.validate.js Mon Apr 26 07:52:06 2010
@@ -0,0 +1,1146 @@
+/*
+ * jQuery validation plug-in 1.7
+ *
+ * http://bassistance.de/jquery-plugins/jquery-plugin-validation/
+ * http://docs.jquery.com/Plugins/Validation
+ *
+ * Copyright (c) 2006 - 2008 Jörn Zaefferer
+ *
+ * $Id: jquery.validate.js 6403 2009-06-17 14:27:16Z joern.zaefferer $
+ *
+ * Dual licensed under the MIT and GPL licenses:
+ *   http://www.opensource.org/licenses/mit-license.php
+ *   http://www.gnu.org/licenses/gpl.html
+ */
+
+(function($) {
+
+$.extend($.fn, {
+	// http://docs.jquery.com/Plugins/Validation/validate
+	validate: function( options ) {
+
+		// if nothing is selected, return nothing; can't chain anyway
+		if (!this.length) {
+			options && options.debug && window.console && console.warn( "nothing selected, can't validate, returning nothing" );
+			return;
+		}
+
+		// check if a validator for this form was already created
+		var validator = $.data(this[0], 'validator');
+		if ( validator ) {
+			return validator;
+		}
+		
+		validator = new $.validator( options, this[0] );
+		$.data(this[0], 'validator', validator); 
+		
+		if ( validator.settings.onsubmit ) {
+		
+			// allow suppresing validation by adding a cancel class to the submit button
+			this.find("input, button").filter(".cancel").click(function() {
+				validator.cancelSubmit = true;
+			});
+			
+			// when a submitHandler is used, capture the submitting button
+			if (validator.settings.submitHandler) {
+				this.find("input, button").filter(":submit").click(function() {
+					validator.submitButton = this;
+				});
+			}
+		
+			// validate the form on submit
+			this.submit( function( event ) {
+				if ( validator.settings.debug )
+					// prevent form submit to be able to see console output
+					event.preventDefault();
+					
+				function handle() {
+					if ( validator.settings.submitHandler ) {
+						if (validator.submitButton) {
+							// insert a hidden input as a replacement for the missing submit button
+							var hidden = $("<input type='hidden'/>").attr("name", validator.submitButton.name).val(validator.submitButton.value).appendTo(validator.currentForm);
+						}
+						validator.settings.submitHandler.call( validator, validator.currentForm );
+						if (validator.submitButton) {
+							// and clean up afterwards; thanks to no-block-scope, hidden can be referenced
+							hidden.remove();
+						}
+						return false;
+					}
+					return true;
+				}
+					
+				// prevent submit for invalid forms or custom submit handlers
+				if ( validator.cancelSubmit ) {
+					validator.cancelSubmit = false;
+					return handle();
+				}
+				if ( validator.form() ) {
+					if ( validator.pendingRequest ) {
+						validator.formSubmitted = true;
+						return false;
+					}
+					return handle();
+				} else {
+					validator.focusInvalid();
+					return false;
+				}
+			});
+		}
+		
+		return validator;
+	},
+	// http://docs.jquery.com/Plugins/Validation/valid
+	valid: function() {
+        if ( $(this[0]).is('form')) {
+            return this.validate().form();
+        } else {
+            var valid = true;
+            var validator = $(this[0].form).validate();
+            this.each(function() {
+				valid &= validator.element(this);
+            });
+            return valid;
+        }
+    },
+	// attributes: space seperated list of attributes to retrieve and remove
+	removeAttrs: function(attributes) {
+		var result = {},
+			$element = this;
+		$.each(attributes.split(/\s/), function(index, value) {
+			result[value] = $element.attr(value);
+			$element.removeAttr(value);
+		});
+		return result;
+	},
+	// http://docs.jquery.com/Plugins/Validation/rules
+	rules: function(command, argument) {
+		var element = this[0];
+		
+		if (command) {
+			var settings = $.data(element.form, 'validator').settings;
+			var staticRules = settings.rules;
+			var existingRules = $.validator.staticRules(element);
+			switch(command) {
+			case "add":
+				$.extend(existingRules, $.validator.normalizeRule(argument));
+				staticRules[element.name] = existingRules;
+				if (argument.messages)
+					settings.messages[element.name] = $.extend( settings.messages[element.name], argument.messages );
+				break;
+			case "remove":
+				if (!argument) {
+					delete staticRules[element.name];
+					return existingRules;
+				}
+				var filtered = {};
+				$.each(argument.split(/\s/), function(index, method) {
+					filtered[method] = existingRules[method];
+					delete existingRules[method];
+				});
+				return filtered;
+			}
+		}
+		
+		var data = $.validator.normalizeRules(
+		$.extend(
+			{},
+			$.validator.metadataRules(element),
+			$.validator.classRules(element),
+			$.validator.attributeRules(element),
+			$.validator.staticRules(element)
+		), element);
+		
+		// make sure required is at front
+		if (data.required) {
+			var param = data.required;
+			delete data.required;
+			data = $.extend({required: param}, data);
+		}
+		
+		return data;
+	}
+});
+
+// Custom selectors
+$.extend($.expr[":"], {
+	// http://docs.jquery.com/Plugins/Validation/blank
+	blank: function(a) {return !$.trim("" + a.value);},
+	// http://docs.jquery.com/Plugins/Validation/filled
+	filled: function(a) {return !!$.trim("" + a.value);},
+	// http://docs.jquery.com/Plugins/Validation/unchecked
+	unchecked: function(a) {return !a.checked;}
+});
+
+// constructor for validator
+$.validator = function( options, form ) {
+	this.settings = $.extend( true, {}, $.validator.defaults, options );
+	this.currentForm = form;
+	this.init();
+};
+
+$.validator.format = function(source, params) {
+	if ( arguments.length == 1 ) 
+		return function() {
+			var args = $.makeArray(arguments);
+			args.unshift(source);
+			return $.validator.format.apply( this, args );
+		};
+	if ( arguments.length > 2 && params.constructor != Array  ) {
+		params = $.makeArray(arguments).slice(1);
+	}
+	if ( params.constructor != Array ) {
+		params = [ params ];
+	}
+	$.each(params, function(i, n) {
+		source = source.replace(new RegExp("\\{" + i + "\\}", "g"), n);
+	});
+	return source;
+};
+
+$.extend($.validator, {
+	
+	defaults: {
+		messages: {},
+		groups: {},
+		rules: {},
+		errorClass: "error",
+		validClass: "valid",
+		errorElement: "label",
+		focusInvalid: true,
+		errorContainer: $( [] ),
+		errorLabelContainer: $( [] ),
+		onsubmit: true,
+		ignore: [],
+		ignoreTitle: false,
+		onfocusin: function(element) {
+			this.lastActive = element;
+				
+			// hide error label and remove error class on focus if enabled
+			if ( this.settings.focusCleanup && !this.blockFocusCleanup ) {
+				this.settings.unhighlight && this.settings.unhighlight.call( this, element, this.settings.errorClass, this.settings.validClass );
+				this.errorsFor(element).hide();
+			}
+		},
+		onfocusout: function(element) {
+			if ( !this.checkable(element) && (element.name in this.submitted || !this.optional(element)) ) {
+				this.element(element);
+			}
+		},
+		onkeyup: function(element) {
+			if ( element.name in this.submitted || element == this.lastElement ) {
+				this.element(element);
+			}
+		},
+		onclick: function(element) {
+			// click on selects, radiobuttons and checkboxes
+			if ( element.name in this.submitted )
+				this.element(element);
+			// or option elements, check parent select in that case
+			else if (element.parentNode.name in this.submitted)
+				this.element(element.parentNode);
+		},
+		highlight: function( element, errorClass, validClass ) {
+			$(element).addClass(errorClass).removeClass(validClass);
+		},
+		unhighlight: function( element, errorClass, validClass ) {
+			$(element).removeClass(errorClass).addClass(validClass);
+		}
+	},
+
+	// http://docs.jquery.com/Plugins/Validation/Validator/setDefaults
+	setDefaults: function(settings) {
+		$.extend( $.validator.defaults, settings );
+	},
+
+	messages: {
+		required: "This field is required.",
+		remote: "Please fix this field.",
+		email: "Please enter a valid email address.",
+		url: "Please enter a valid URL.",
+		date: "Please enter a valid date.",
+		dateISO: "Please enter a valid date (ISO).",
+		number: "Please enter a valid number.",
+		digits: "Please enter only digits.",
+		creditcard: "Please enter a valid credit card number.",
+		equalTo: "Please enter the same value again.",
+		accept: "Please enter a value with a valid extension.",
+		maxlength: $.validator.format("Please enter no more than {0} characters."),
+		minlength: $.validator.format("Please enter at least {0} characters."),
+		rangelength: $.validator.format("Please enter a value between {0} and {1} characters long."),
+		range: $.validator.format("Please enter a value between {0} and {1}."),
+		max: $.validator.format("Please enter a value less than or equal to {0}."),
+		min: $.validator.format("Please enter a value greater than or equal to {0}.")
+	},
+	
+	autoCreateRanges: false,
+	
+	prototype: {
+		
+		init: function() {
+			this.labelContainer = $(this.settings.errorLabelContainer);
+			this.errorContext = this.labelContainer.length && this.labelContainer || $(this.currentForm);
+			this.containers = $(this.settings.errorContainer).add( this.settings.errorLabelContainer );
+			this.submitted = {};
+			this.valueCache = {};
+			this.pendingRequest = 0;
+			this.pending = {};
+			this.invalid = {};
+			this.reset();
+			
+			var groups = (this.groups = {});
+			$.each(this.settings.groups, function(key, value) {
+				$.each(value.split(/\s/), function(index, name) {
+					groups[name] = key;
+				});
+			});
+			var rules = this.settings.rules;
+			$.each(rules, function(key, value) {
+				rules[key] = $.validator.normalizeRule(value);
+			});
+			
+			function delegate(event) {
+				var validator = $.data(this[0].form, "validator"),
+					eventType = "on" + event.type.replace(/^validate/, "");
+				validator.settings[eventType] && validator.settings[eventType].call(validator, this[0] );
+			}
+			$(this.currentForm)
+				.validateDelegate(":text, :password, :file, select, textarea", "focusin focusout keyup", delegate)
+				.validateDelegate(":radio, :checkbox, select, option", "click", delegate);
+
+			if (this.settings.invalidHandler)
+				$(this.currentForm).bind("invalid-form.validate", this.settings.invalidHandler);
+		},
+
+		// http://docs.jquery.com/Plugins/Validation/Validator/form
+		form: function() {
+			this.checkForm();
+			$.extend(this.submitted, this.errorMap);
+			this.invalid = $.extend({}, this.errorMap);
+			if (!this.valid())
+				$(this.currentForm).triggerHandler("invalid-form", [this]);
+			this.showErrors();
+			return this.valid();
+		},
+		
+		checkForm: function() {
+			this.prepareForm();
+			for ( var i = 0, elements = (this.currentElements = this.elements()); elements[i]; i++ ) {
+				this.check( elements[i] );
+			}
+			return this.valid(); 
+		},
+		
+		// http://docs.jquery.com/Plugins/Validation/Validator/element
+		element: function( element ) {
+			element = this.clean( element );
+			this.lastElement = element;
+			this.prepareElement( element );
+			this.currentElements = $(element);
+			var result = this.check( element );
+			if ( result ) {
+				delete this.invalid[element.name];
+			} else {
+				this.invalid[element.name] = true;
+			}
+			if ( !this.numberOfInvalids() ) {
+				// Hide error containers on last error
+				this.toHide = this.toHide.add( this.containers );
+			}
+			this.showErrors();
+			return result;
+		},
+
+		// http://docs.jquery.com/Plugins/Validation/Validator/showErrors
+		showErrors: function(errors) {
+			if(errors) {
+				// add items to error list and map
+				$.extend( this.errorMap, errors );
+				this.errorList = [];
+				for ( var name in errors ) {
+					this.errorList.push({
+						message: errors[name],
+						element: this.findByName(name)[0]
+					});
+				}
+				// remove items from success list
+				this.successList = $.grep( this.successList, function(element) {
+					return !(element.name in errors);
+				});
+			}
+			this.settings.showErrors
+				? this.settings.showErrors.call( this, this.errorMap, this.errorList )
+				: this.defaultShowErrors();
+		},
+		
+		// http://docs.jquery.com/Plugins/Validation/Validator/resetForm
+		resetForm: function() {
+			if ( $.fn.resetForm )
+				$( this.currentForm ).resetForm();
+			this.submitted = {};
+			this.prepareForm();
+			this.hideErrors();
+			this.elements().removeClass( this.settings.errorClass );
+		},
+		
+		numberOfInvalids: function() {
+			return this.objectLength(this.invalid);
+		},
+		
+		objectLength: function( obj ) {
+			var count = 0;
+			for ( var i in obj )
+				count++;
+			return count;
+		},
+		
+		hideErrors: function() {
+			this.addWrapper( this.toHide ).hide();
+		},
+		
+		valid: function() {
+			return this.size() == 0;
+		},
+		
+		size: function() {
+			return this.errorList.length;
+		},
+		
+		focusInvalid: function() {
+			if( this.settings.focusInvalid ) {
+				try {
+					$(this.findLastActive() || this.errorList.length && this.errorList[0].element || [])
+					.filter(":visible")
+					.focus()
+					// manually trigger focusin event; without it, focusin handler isn't called, findLastActive won't have anything to find
+					.trigger("focusin");
+				} catch(e) {
+					// ignore IE throwing errors when focusing hidden elements
+				}
+			}
+		},
+		
+		findLastActive: function() {
+			var lastActive = this.lastActive;
+			return lastActive && $.grep(this.errorList, function(n) {
+				return n.element.name == lastActive.name;
+			}).length == 1 && lastActive;
+		},
+		
+		elements: function() {
+			var validator = this,
+				rulesCache = {};
+			
+			// select all valid inputs inside the form (no submit or reset buttons)
+			// workaround $Query([]).add until http://dev.jquery.com/ticket/2114 is solved
+			return $([]).add(this.currentForm.elements)
+			.filter(":input")
+			.not(":submit, :reset, :image, [disabled]")
+			.not( this.settings.ignore )
+			.filter(function() {
+				!this.name && validator.settings.debug && window.console && console.error( "%o has no name assigned", this);
+			
+				// select only the first element for each name, and only those with rules specified
+				if ( this.name in rulesCache || !validator.objectLength($(this).rules()) )
+					return false;
+				
+				rulesCache[this.name] = true;
+				return true;
+			});
+		},
+		
+		clean: function( selector ) {
+			return $( selector )[0];
+		},
+		
+		errors: function() {
+			return $( this.settings.errorElement + "." + this.settings.errorClass, this.errorContext );
+		},
+		
+		reset: function() {
+			this.successList = [];
+			this.errorList = [];
+			this.errorMap = {};
+			this.toShow = $([]);
+			this.toHide = $([]);
+			this.currentElements = $([]);
+		},
+		
+		prepareForm: function() {
+			this.reset();
+			this.toHide = this.errors().add( this.containers );
+		},
+		
+		prepareElement: function( element ) {
+			this.reset();
+			this.toHide = this.errorsFor(element);
+		},
+	
+		check: function( element ) {
+			element = this.clean( element );
+			
+			// if radio/checkbox, validate first element in group instead
+			if (this.checkable(element)) {
+				element = this.findByName( element.name )[0];
+			}
+			
+			var rules = $(element).rules();
+			var dependencyMismatch = false;
+			for( method in rules ) {
+				var rule = { method: method, parameters: rules[method] };
+				try {
+					var result = $.validator.methods[method].call( this, element.value.replace(/\r/g, ""), element, rule.parameters );
+					
+					// if a method indicates that the field is optional and therefore valid,
+					// don't mark it as valid when there are no other rules
+					if ( result == "dependency-mismatch" ) {
+						dependencyMismatch = true;
+						continue;
+					}
+					dependencyMismatch = false;
+					
+					if ( result == "pending" ) {
+						this.toHide = this.toHide.not( this.errorsFor(element) );
+						return;
+					}
+					
+					if( !result ) {
+						this.formatAndAdd( element, rule );
+						return false;
+					}
+				} catch(e) {
+					this.settings.debug && window.console && console.log("exception occured when checking element " + element.id
+						 + ", check the '" + rule.method + "' method", e);
+					throw e;
+				}
+			}
+			if (dependencyMismatch)
+				return;
+			if ( this.objectLength(rules) )
+				this.successList.push(element);
+			return true;
+		},
+		
+		// return the custom message for the given element and validation method
+		// specified in the element's "messages" metadata
+		customMetaMessage: function(element, method) {
+			if (!$.metadata)
+				return;
+			
+			var meta = this.settings.meta
+				? $(element).metadata()[this.settings.meta]
+				: $(element).metadata();
+			
+			return meta && meta.messages && meta.messages[method];
+		},
+		
+		// return the custom message for the given element name and validation method
+		customMessage: function( name, method ) {
+			var m = this.settings.messages[name];
+			return m && (m.constructor == String
+				? m
+				: m[method]);
+		},
+		
+		// return the first defined argument, allowing empty strings
+		findDefined: function() {
+			for(var i = 0; i < arguments.length; i++) {
+				if (arguments[i] !== undefined)
+					return arguments[i];
+			}
+			return undefined;
+		},
+		
+		defaultMessage: function( element, method) {
+			return this.findDefined(
+				this.customMessage( element.name, method ),
+				this.customMetaMessage( element, method ),
+				// title is never undefined, so handle empty string as undefined
+				!this.settings.ignoreTitle && element.title || undefined,
+				$.validator.messages[method],
+				"<strong>Warning: No message defined for " + element.name + "</strong>"
+			);
+		},
+		
+		formatAndAdd: function( element, rule ) {
+			var message = this.defaultMessage( element, rule.method ),
+				theregex = /\$?\{(\d+)\}/g;
+			if ( typeof message == "function" ) {
+				message = message.call(this, rule.parameters, element);
+			} else if (theregex.test(message)) {
+				message = jQuery.format(message.replace(theregex, '{$1}'), rule.parameters);
+			}			
+			this.errorList.push({
+				message: message,
+				element: element
+			});
+			
+			this.errorMap[element.name] = message;
+			this.submitted[element.name] = message;
+		},
+		
+		addWrapper: function(toToggle) {
+			if ( this.settings.wrapper )
+				toToggle = toToggle.add( toToggle.parent( this.settings.wrapper ) );
+			return toToggle;
+		},
+		
+		defaultShowErrors: function() {
+			for ( var i = 0; this.errorList[i]; i++ ) {
+				var error = this.errorList[i];
+				this.settings.highlight && this.settings.highlight.call( this, error.element, this.settings.errorClass, this.settings.validClass );
+				this.showLabel( error.element, error.message );
+			}
+			if( this.errorList.length ) {
+				this.toShow = this.toShow.add( this.containers );
+			}
+			if (this.settings.success) {
+				for ( var i = 0; this.successList[i]; i++ ) {
+					this.showLabel( this.successList[i] );
+				}
+			}
+			if (this.settings.unhighlight) {
+				for ( var i = 0, elements = this.validElements(); elements[i]; i++ ) {
+					this.settings.unhighlight.call( this, elements[i], this.settings.errorClass, this.settings.validClass );
+				}
+			}
+			this.toHide = this.toHide.not( this.toShow );
+			this.hideErrors();
+			this.addWrapper( this.toShow ).show();
+		},
+		
+		validElements: function() {
+			return this.currentElements.not(this.invalidElements());
+		},
+		
+		invalidElements: function() {
+			return $(this.errorList).map(function() {
+				return this.element;
+			});
+		},
+		
+		showLabel: function(element, message) {
+			var label = this.errorsFor( element );
+			if ( label.length ) {
+				// refresh error/success class
+				label.removeClass().addClass( this.settings.errorClass );
+			
+				// check if we have a generated label, replace the message then
+				label.attr("generated") && label.html(message);
+			} else {
+				// create label
+				label = $("<" + this.settings.errorElement + "/>")
+					.attr({"for":  this.idOrName(element), generated: true})
+					.addClass(this.settings.errorClass)
+					.html(message || "");
+				if ( this.settings.wrapper ) {
+					// make sure the element is visible, even in IE
+					// actually showing the wrapped element is handled elsewhere
+					label = label.hide().show().wrap("<" + this.settings.wrapper + "/>").parent();
+				}
+				if ( !this.labelContainer.append(label).length )
+					this.settings.errorPlacement
+						? this.settings.errorPlacement(label, $(element) )
+						: label.insertAfter(element);
+			}
+			if ( !message && this.settings.success ) {
+				label.text("");
+				typeof this.settings.success == "string"
+					? label.addClass( this.settings.success )
+					: this.settings.success( label );
+			}
+			this.toShow = this.toShow.add(label);
+		},
+		
+		errorsFor: function(element) {
+			var name = this.idOrName(element);
+    		return this.errors().filter(function() {
+				return $(this).attr('for') == name;
+			});
+		},
+		
+		idOrName: function(element) {
+			return this.groups[element.name] || (this.checkable(element) ? element.name : element.id || element.name);
+		},
+
+		checkable: function( element ) {
+			return /radio|checkbox/i.test(element.type);
+		},
+		
+		findByName: function( name ) {
+			// select by name and filter by form for performance over form.find("[name=...]")
+			var form = this.currentForm;
+			return $(document.getElementsByName(name)).map(function(index, element) {
+				return element.form == form && element.name == name && element  || null;
+			});
+		},
+		
+		getLength: function(value, element) {
+			switch( element.nodeName.toLowerCase() ) {
+			case 'select':
+				return $("option:selected", element).length;
+			case 'input':
+				if( this.checkable( element) )
+					return this.findByName(element.name).filter(':checked').length;
+			}
+			return value.length;
+		},
+	
+		depend: function(param, element) {
+			return this.dependTypes[typeof param]
+				? this.dependTypes[typeof param](param, element)
+				: true;
+		},
+	
+		dependTypes: {
+			"boolean": function(param, element) {
+				return param;
+			},
+			"string": function(param, element) {
+				return !!$(param, element.form).length;
+			},
+			"function": function(param, element) {
+				return param(element);
+			}
+		},
+		
+		optional: function(element) {
+			return !$.validator.methods.required.call(this, $.trim(element.value), element) && "dependency-mismatch";
+		},
+		
+		startRequest: function(element) {
+			if (!this.pending[element.name]) {
+				this.pendingRequest++;
+				this.pending[element.name] = true;
+			}
+		},
+		
+		stopRequest: function(element, valid) {
+			this.pendingRequest--;
+			// sometimes synchronization fails, make sure pendingRequest is never < 0
+			if (this.pendingRequest < 0)
+				this.pendingRequest = 0;
+			delete this.pending[element.name];
+			if ( valid && this.pendingRequest == 0 && this.formSubmitted && this.form() ) {
+				$(this.currentForm).submit();
+				this.formSubmitted = false;
+			} else if (!valid && this.pendingRequest == 0 && this.formSubmitted) {
+				$(this.currentForm).triggerHandler("invalid-form", [this]);
+				this.formSubmitted = false;
+			}
+		},
+		
+		previousValue: function(element) {
+			return $.data(element, "previousValue") || $.data(element, "previousValue", {
+				old: null,
+				valid: true,
+				message: this.defaultMessage( element, "remote" )
+			});
+		}
+		
+	},
+	
+	classRuleSettings: {
+		required: {required: true},
+		email: {email: true},
+		url: {url: true},
+		date: {date: true},
+		dateISO: {dateISO: true},
+		dateDE: {dateDE: true},
+		number: {number: true},
+		numberDE: {numberDE: true},
+		digits: {digits: true},
+		creditcard: {creditcard: true}
+	},
+	
+	addClassRules: function(className, rules) {
+		className.constructor == String ?
+			this.classRuleSettings[className] = rules :
+			$.extend(this.classRuleSettings, className);
+	},
+	
+	classRules: function(element) {
+		var rules = {};
+		var classes = $(element).attr('class');
+		classes && $.each(classes.split(' '), function() {
+			if (this in $.validator.classRuleSettings) {
+				$.extend(rules, $.validator.classRuleSettings[this]);
+			}
+		});
+		return rules;
+	},
+	
+	attributeRules: function(element) {
+		var rules = {};
+		var $element = $(element);
+		
+		for (method in $.validator.methods) {
+			var value = $element.attr(method);
+			if (value) {
+				rules[method] = value;
+			}
+		}
+		
+		// maxlength may be returned as -1, 2147483647 (IE) and 524288 (safari) for text inputs
+		if (rules.maxlength && /-1|2147483647|524288/.test(rules.maxlength)) {
+			delete rules.maxlength;
+		}
+		
+		return rules;
+	},
+	
+	metadataRules: function(element) {
+		if (!$.metadata) return {};
+		
+		var meta = $.data(element.form, 'validator').settings.meta;
+		return meta ?
+			$(element).metadata()[meta] :
+			$(element).metadata();
+	},
+	
+	staticRules: function(element) {
+		var rules = {};
+		var validator = $.data(element.form, 'validator');
+		if (validator.settings.rules) {
+			rules = $.validator.normalizeRule(validator.settings.rules[element.name]) || {};
+		}
+		return rules;
+	},
+	
+	normalizeRules: function(rules, element) {
+		// handle dependency check
+		$.each(rules, function(prop, val) {
+			// ignore rule when param is explicitly false, eg. required:false
+			if (val === false) {
+				delete rules[prop];
+				return;
+			}
+			if (val.param || val.depends) {
+				var keepRule = true;
+				switch (typeof val.depends) {
+					case "string":
+						keepRule = !!$(val.depends, element.form).length;
+						break;
+					case "function":
+						keepRule = val.depends.call(element, element);
+						break;
+				}
+				if (keepRule) {
+					rules[prop] = val.param !== undefined ? val.param : true;
+				} else {
+					delete rules[prop];
+				}
+			}
+		});
+		
+		// evaluate parameters
+		$.each(rules, function(rule, parameter) {
+			rules[rule] = $.isFunction(parameter) ? parameter(element) : parameter;
+		});
+		
+		// clean number parameters
+		$.each(['minlength', 'maxlength', 'min', 'max'], function() {
+			if (rules[this]) {
+				rules[this] = Number(rules[this]);
+			}
+		});
+		$.each(['rangelength', 'range'], function() {
+			if (rules[this]) {
+				rules[this] = [Number(rules[this][0]), Number(rules[this][1])];
+			}
+		});
+		
+		if ($.validator.autoCreateRanges) {
+			// auto-create ranges
+			if (rules.min && rules.max) {
+				rules.range = [rules.min, rules.max];
+				delete rules.min;
+				delete rules.max;
+			}
+			if (rules.minlength && rules.maxlength) {
+				rules.rangelength = [rules.minlength, rules.maxlength];
+				delete rules.minlength;
+				delete rules.maxlength;
+			}
+		}
+		
+		// To support custom messages in metadata ignore rule methods titled "messages"
+		if (rules.messages) {
+			delete rules.messages;
+		}
+		
+		return rules;
+	},
+	
+	// Converts a simple string to a {string: true} rule, e.g., "required" to {required:true}
+	normalizeRule: function(data) {
+		if( typeof data == "string" ) {
+			var transformed = {};
+			$.each(data.split(/\s/), function() {
+				transformed[this] = true;
+			});
+			data = transformed;
+		}
+		return data;
+	},
+	
+	// http://docs.jquery.com/Plugins/Validation/Validator/addMethod
+	addMethod: function(name, method, message) {
+		$.validator.methods[name] = method;
+		$.validator.messages[name] = message != undefined ? message : $.validator.messages[name];
+		if (method.length < 3) {
+			$.validator.addClassRules(name, $.validator.normalizeRule(name));
+		}
+	},
+
+	methods: {
+
+		// http://docs.jquery.com/Plugins/Validation/Methods/required
+		required: function(value, element, param) {
+			// check if dependency is met
+			if ( !this.depend(param, element) )
+				return "dependency-mismatch";
+			switch( element.nodeName.toLowerCase() ) {
+			case 'select':
+				// could be an array for select-multiple or a string, both are fine this way
+				var val = $(element).val();
+				return val && val.length > 0;
+			case 'input':
+				if ( this.checkable(element) )
+					return this.getLength(value, element) > 0;
+			default:
+				return $.trim(value).length > 0;
+			}
+		},
+		
+		// http://docs.jquery.com/Plugins/Validation/Methods/remote
+		remote: function(value, element, param) {
+			if ( this.optional(element) )
+				return "dependency-mismatch";
+			
+			var previous = this.previousValue(element);
+			if (!this.settings.messages[element.name] )
+				this.settings.messages[element.name] = {};
+			previous.originalMessage = this.settings.messages[element.name].remote;
+			this.settings.messages[element.name].remote = previous.message;
+			
+			param = typeof param == "string" && {url:param} || param; 
+			
+			if ( previous.old !== value ) {
+				previous.old = value;
+				var validator = this;
+				this.startRequest(element);
+				var data = {};
+				data[element.name] = value;
+				$.ajax($.extend(true, {
+					url: param,
+					mode: "abort",
+					port: "validate" + element.name,
+					dataType: "json",
+					data: data,
+					success: function(response) {
+						validator.settings.messages[element.name].remote = previous.originalMessage;
+						var valid = response === true;
+						if ( valid ) {
+							var submitted = validator.formSubmitted;
+							validator.prepareElement(element);
+							validator.formSubmitted = submitted;
+							validator.successList.push(element);
+							validator.showErrors();
+						} else {
+							var errors = {};
+							var message = (previous.message = response || validator.defaultMessage( element, "remote" ));
+							errors[element.name] = $.isFunction(message) ? message(value) : message;
+							validator.showErrors(errors);
+						}
+						previous.valid = valid;
+						validator.stopRequest(element, valid);
+					}
+				}, param));
+				return "pending";
+			} else if( this.pending[element.name] ) {
+				return "pending";
+			}
+			return previous.valid;
+		},
+
+		// http://docs.jquery.com/Plugins/Validation/Methods/minlength
+		minlength: function(value, element, param) {
+			return this.optional(element) || this.getLength($.trim(value), element) >= param;
+		},
+		
+		// http://docs.jquery.com/Plugins/Validation/Methods/maxlength
+		maxlength: function(value, element, param) {
+			return this.optional(element) || this.getLength($.trim(value), element) <= param;
+		},
+		
+		// http://docs.jquery.com/Plugins/Validation/Methods/rangelength
+		rangelength: function(value, element, param) {
+			var length = this.getLength($.trim(value), element);
+			return this.optional(element) || ( length >= param[0] && length <= param[1] );
+		},
+		
+		// http://docs.jquery.com/Plugins/Validation/Methods/min
+		min: function( value, element, param ) {
+			return this.optional(element) || value >= param;
+		},
+		
+		// http://docs.jquery.com/Plugins/Validation/Methods/max
+		max: function( value, element, param ) {
+			return this.optional(element) || value <= param;
+		},
+		
+		// http://docs.jquery.com/Plugins/Validation/Methods/range
+		range: function( value, element, param ) {
+			return this.optional(element) || ( value >= param[0] && value <= param[1] );
+		},
+		
+		// http://docs.jquery.com/Plugins/Validation/Methods/email
+		email: function(value, element) {
+			// contributed by Scott Gonzalez: http://projects.scottsplayground.com/email_address_validation/
+			return this.optional(element) || /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i.test(value);
+		},
+	
+		// http://docs.jquery.com/Plugins/Validation/Methods/url
+		url: function(value, element) {
+			// contributed by Scott Gonzalez: http://projects.scottsplayground.com/iri/
+			return this.optional(element) || /^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]
 |\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(value);
+		},
+        
+		// http://docs.jquery.com/Plugins/Validation/Methods/date
+		date: function(value, element) {
+			return this.optional(element) || !/Invalid|NaN/.test(new Date(value));
+		},
+	
+		// http://docs.jquery.com/Plugins/Validation/Methods/dateISO
+		dateISO: function(value, element) {
+			return this.optional(element) || /^\d{4}[\/-]\d{1,2}[\/-]\d{1,2}$/.test(value);
+		},
+	
+		// http://docs.jquery.com/Plugins/Validation/Methods/number
+		number: function(value, element) {
+			return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:,\d{3})+)(?:\.\d+)?$/.test(value);
+		},
+	
+		// http://docs.jquery.com/Plugins/Validation/Methods/digits
+		digits: function(value, element) {
+			return this.optional(element) || /^\d+$/.test(value);
+		},
+		
+		// http://docs.jquery.com/Plugins/Validation/Methods/creditcard
+		// based on http://en.wikipedia.org/wiki/Luhn
+		creditcard: function(value, element) {
+			if ( this.optional(element) )
+				return "dependency-mismatch";
+			// accept only digits and dashes
+			if (/[^0-9-]+/.test(value))
+				return false;
+			var nCheck = 0,
+				nDigit = 0,
+				bEven = false;
+
+			value = value.replace(/\D/g, "");
+
+			for (var n = value.length - 1; n >= 0; n--) {
+				var cDigit = value.charAt(n);
+				var nDigit = parseInt(cDigit, 10);
+				if (bEven) {
+					if ((nDigit *= 2) > 9)
+						nDigit -= 9;
+				}
+				nCheck += nDigit;
+				bEven = !bEven;
+			}
+
+			return (nCheck % 10) == 0;
+		},
+		
+		// http://docs.jquery.com/Plugins/Validation/Methods/accept
+		accept: function(value, element, param) {
+			param = typeof param == "string" ? param.replace(/,/g, '|') : "png|jpe?g|gif";
+			return this.optional(element) || value.match(new RegExp(".(" + param + ")$", "i")); 
+		},
+		
+		// http://docs.jquery.com/Plugins/Validation/Methods/equalTo
+		equalTo: function(value, element, param) {
+			// bind to the blur event of the target in order to revalidate whenever the target field is updated
+			// TODO find a way to bind the event just once, avoiding the unbind-rebind overhead
+			var target = $(param).unbind(".validate-equalTo").bind("blur.validate-equalTo", function() {
+				$(element).valid();
+			});
+			return value == target.val();
+		}
+		
+	}
+	
+});
+
+// deprecated, use $.validator.format instead
+$.format = $.validator.format;
+
+})(jQuery);
+
+// ajax mode: abort
+// usage: $.ajax({ mode: "abort"[, port: "uniqueport"]});
+// if mode:"abort" is used, the previous request on that port (port can be undefined) is aborted via XMLHttpRequest.abort() 
+;(function($) {
+	var ajax = $.ajax;
+	var pendingRequests = {};
+	$.ajax = function(settings) {
+		// create settings for compatibility with ajaxSetup
+		settings = $.extend(settings, $.extend({}, $.ajaxSettings, settings));
+		var port = settings.port;
+		if (settings.mode == "abort") {
+			if ( pendingRequests[port] ) {
+				pendingRequests[port].abort();
+			}
+			return (pendingRequests[port] = ajax.apply(this, arguments));
+		}
+		return ajax.apply(this, arguments);
+	};
+})(jQuery);
+
+// provides cross-browser focusin and focusout events
+// IE has native support, in other browsers, use event caputuring (neither bubbles)
+
+// provides delegate(type: String, delegate: Selector, handler: Callback) plugin for easier event delegation
+// handler is only called when $(event.target).is(delegate), in the scope of the jquery-object for event.target 
+;(function($) {
+	// only implement if not provided by jQuery core (since 1.4)
+	// TODO verify if jQuery 1.4's implementation is compatible with older jQuery special-event APIs
+	if (!jQuery.event.special.focusin && !jQuery.event.special.focusout && document.addEventListener) {
+		$.each({
+			focus: 'focusin',
+			blur: 'focusout'	
+		}, function( original, fix ){
+			$.event.special[fix] = {
+				setup:function() {
+					this.addEventListener( original, handler, true );
+				},
+				teardown:function() {
+					this.removeEventListener( original, handler, true );
+				},
+				handler: function(e) {
+					arguments[0] = $.event.fix(e);
+					arguments[0].type = fix;
+					return $.event.handle.apply(this, arguments);
+				}
+			};
+			function handler(e) {
+				e = $.event.fix(e);
+				e.type = fix;
+				return $.event.handle.call(this, e);
+			}
+		});
+	};
+	$.extend($.fn, {
+		validateDelegate: function(delegate, type, handler) {
+			return this.bind(type, function(event) {
+				var target = $(event.target);
+				if (target.is(delegate)) {
+					return handler.apply(target, arguments);
+				}
+			});
+		}
+	});
+})(jQuery);

Modified: incubator/esme/trunk/server/src/main/webapp/signup.html
URL: http://svn.apache.org/viewvc/incubator/esme/trunk/server/src/main/webapp/signup.html?rev=937955&r1=937954&r2=937955&view=diff
==============================================================================
--- incubator/esme/trunk/server/src/main/webapp/signup.html (original)
+++ incubator/esme/trunk/server/src/main/webapp/signup.html Mon Apr 26 07:52:06 2010
@@ -20,50 +20,60 @@
 <lift:surround with="default_signup" at="login">
 
 
+    <head>
+        <script src="/scripts/jquery.validate.js" type="text/javascript"/> 
+    </head>
 
 <div id="content">
 	<div class="gray-box signup">
 	 <div id="messages"></div>
 		<h1><lift:loc>ui_sign_up_intro</lift:loc></h1>
+		<lift:Msgs>
+			<lift:error_class>error_major</lift:error_class>
+			<lift:notice_msg>
+				<lift:loc>ui_base_note</lift:loc>
+			</lift:notice_msg>
+			<lift:notice_class>note_major</lift:notice_class>
+		</lift:Msgs>
 		
-			<lift:signup form="post">
+			<lift:signup form="post" id = "validateForm">
 					<div id="form-signup">
 							<signup:credentials/>	
 							
 							<div class="post-form-row">
-								<label><lift:loc>ui_sign_up_nickname</lift:loc></label>
-								<signup:nickname class="inputBox2 tipelement" title="This is nickname that other users will use communicate with you."/>
+								<label class="main"><lift:loc>ui_sign_up_nickname</lift:loc></label>
+								<signup:nickname class="inputBox2 tipelement required alphanumeric" minlength="3" title="This is nickname that other users will use communicate with you."/>
 							</div>	
 							
 							<div class="post-form-row">
-								<label><lift:loc>ui_sign_up_firstname</lift:loc></label>
-								 <signup:firstname class="inputBox2 tipelement" title="This is your first name."/>
+								<label class="main"><lift:loc>ui_sign_up_firstname</lift:loc></label>
+								 <signup:firstname class="inputBox2 tipelement required" minlength="3" title="This is your first name."/>
 							</div>	
 							
 							<div class="post-form-row">
-								<label> <lift:loc>ui_sign_up_lastname</lift:loc></label>
-								<signup:lastname class="inputBox2 tipelement" title="This is your last name."/>
+								<label class="main"> <lift:loc>ui_sign_up_lastname</lift:loc></label>
+								<signup:lastname class="inputBox2 tipelement required" minlength="3" title="This is your last name."/>
 							</div>	
 							
 							<div class="post-form-row">
-								<label> <lift:loc>ui_sign_up_image_url</lift:loc></label>
-								<signup:image_url class="inputBox2 tipelement" title="This is the URL that points to your avatar picture. You can use Gravatar.com to store your avatar images."/>
+								<label class="main"> <lift:loc>ui_sign_up_image_url</lift:loc></label>
+								<signup:image_url class="inputBox2 tipelement url" title="This is the URL that points to your avatar picture. You can use Gravatar.com to store your avatar images."/>
 							</div>	
 						
 							
 							<div class="post-form-row">
-								<label> <lift:loc>ui_sign_up_timezone</lift:loc></label>
+								<label class="main"> <lift:loc>ui_sign_up_timezone</lift:loc></label>
 								<signup:timezone class="inputBox2 tipelement" title="This is the timezone in which you are located."/>
 							</div>	
 							
 							<div class="post-form-row">
-								<label> <lift:loc>ui_sign_up_locale</lift:loc></label>
+								<label class="main"><lift:loc>ui_sign_up_locale</lift:loc></label>
 								<signup:locale class="inputBox2 tipelement" title="This is your language setting that influences which language is used in the UI. "/>
 							</div>
 								
 							<div class="post-form-row">
 								<div class="submit-btn">
-									<signup:submit type="image" src="images/btn-signup-big.gif" class="tipelement" title="Create a new user!" />
+									<signup:submit type="image" src="images/btn-signup-big.gif" class="tipelement url required"  title="Create a new user!" />
 								</div>
 							</div>	
 							

Modified: incubator/esme/trunk/server/src/main/webapp/style/style.css
URL: http://svn.apache.org/viewvc/incubator/esme/trunk/server/src/main/webapp/style/style.css?rev=937955&r1=937954&r2=937955&view=diff
==============================================================================
--- incubator/esme/trunk/server/src/main/webapp/style/style.css (original)
+++ incubator/esme/trunk/server/src/main/webapp/style/style.css Mon Apr 26 07:52:06 2010
@@ -140,6 +140,25 @@ div#logo h1 a{
 	}
 
 
+/*Validation Errors
+*********************************************************************************/
+
+ form.validateForm label.error, label.error {
+     color:red;
+     font-style:italic;
+}
+
+#validateForm label.error {
+    display:inline;
+    width:auto;
+    margin-left:253px;
+}
+
+input.error {
+border:1px dotted red;
+}
+
+
 /*BLUE HEADER - HOME
 *********************************************************************************/
 #container-2nd-level-bg {
@@ -188,6 +207,12 @@ div#logo h1 a{
 	position:relative; 
 	top:-13px;
 }
+
+.error_major ul {
+	list-style-type:none;
+	color:red;
+	font-weight:bold;
+}
 .inputBox2 { 
 	background-color:#FFFFFF !important;	
 	border:1px solid #ccc; 	
@@ -559,7 +584,7 @@ ul#toc li.current a {
 	margin-right:40px;
 	}
 
-#form-signup label, #form-settings label {
+#form-signup label.main, #form-settings label.main {
 	font-weight:bold;
 	color:#000;
 	margin-top: 5px;
@@ -615,3 +640,6 @@ width:100%;
 z-index:10000;
 }
 
+000;
+}
+

Modified: incubator/esme/trunk/server/src/main/webapp/templates-hidden/base.html
URL: http://svn.apache.org/viewvc/incubator/esme/trunk/server/src/main/webapp/templates-hidden/base.html?rev=937955&r1=937954&r2=937955&view=diff
==============================================================================
--- incubator/esme/trunk/server/src/main/webapp/templates-hidden/base.html (original)
+++ incubator/esme/trunk/server/src/main/webapp/templates-hidden/base.html Mon Apr 26 07:52:06 2010
@@ -38,6 +38,7 @@
         <script id="json" src="/classpath/json.js" type="text/javascript"/>
         <script src="../scripts/jquery.TipTip.js" type="text/javascript"/> 
         <script src="../scripts/esme_tool_tip.js" type="text/javascript"/> 
+        <script src="/scripts/jquery.validate.js" type="text/javascript"/> 
     </head>
     <body id="back">
      <div id="messages" class="esme_message_bar" style="display: none"></div>
@@ -101,10 +102,10 @@
                             </li>
 
                         </ul><!--search form-->
-                        <form action="/info_view/search" method="post">
+                        <form action="/info_view/search" method="post" id = "validateForm">
                             <div id="search">
                                 <div class="searchBox">
-                                    <input type="text" class="inputBox" name="term" value=""/>
+                                    <input type="text" class="inputBox required alphanumeric nowhitespace" name="term" value=""/>
                                 </div>
                                 <div class="searchButton">
                                     <input type="image" onclick="javascript:form.submit();" src="../images/btn-search.gif" style="padding:0;"/>

Modified: incubator/esme/trunk/server/src/main/webapp/templates-hidden/default.html
URL: http://svn.apache.org/viewvc/incubator/esme/trunk/server/src/main/webapp/templates-hidden/default.html?rev=937955&r1=937954&r2=937955&view=diff
==============================================================================
--- incubator/esme/trunk/server/src/main/webapp/templates-hidden/default.html (original)
+++ incubator/esme/trunk/server/src/main/webapp/templates-hidden/default.html Mon Apr 26 07:52:06 2010
@@ -49,13 +49,6 @@
                 <lift:bind name="login">
                  <lift:UserSnip.loginForm/> 
                 </lift:bind>
-                 <lift:Msgs>
-                     <lift:error_msg>Error:</lift:error_msg>
-                     <lift:notice_msg>FYI:</lift:notice_msg>
-                     <lift:error_class>error_major</lift:error_class>
-                     <lift:notice_msg><lift:loc>ui_base_note</lift:loc></lift:notice_msg>
-                     <lift:notice_class>note_major</lift:notice_class>
-                 </lift:Msgs>
                 </div><!--right -->
            </div><!--// ENDS CONTAINER -->
         </div><!--// ENDS CONTAINER-BG -->

Modified: incubator/esme/trunk/server/src/main/webapp/templates-hidden/default_signup.html
URL: http://svn.apache.org/viewvc/incubator/esme/trunk/server/src/main/webapp/templates-hidden/default_signup.html?rev=937955&r1=937954&r2=937955&view=diff
==============================================================================
--- incubator/esme/trunk/server/src/main/webapp/templates-hidden/default_signup.html (original)
+++ incubator/esme/trunk/server/src/main/webapp/templates-hidden/default_signup.html Mon Apr 26 07:52:06 2010
@@ -45,13 +45,6 @@
                 <lift:bind name="login">
                  <lift:UserSnip.loginForm/> 
                 </lift:bind>
-                 <lift:Msgs>
-                     <lift:error_msg>Error:</lift:error_msg>
-                     <lift:notice_msg>FYI:</lift:notice_msg>
-                     <lift:error_class>error_major</lift:error_class>
-                     <lift:notice_msg><lift:loc>ui_base_note</lift:loc></lift:notice_msg>
-                     <lift:notice_class>note_major</lift:notice_class>
-                 </lift:Msgs>
                 </div><!--right -->
            </div><!--// ENDS CONTAINER -->
         </div><!--// ENDS CONTAINER-BG -->

Modified: incubator/esme/trunk/server/src/main/webapp/templates-hidden/upw_login_form.html
URL: http://svn.apache.org/viewvc/incubator/esme/trunk/server/src/main/webapp/templates-hidden/upw_login_form.html?rev=937955&r1=937954&r2=937955&view=diff
==============================================================================
--- incubator/esme/trunk/server/src/main/webapp/templates-hidden/upw_login_form.html (original)
+++ incubator/esme/trunk/server/src/main/webapp/templates-hidden/upw_login_form.html Mon Apr 26 07:52:06 2010
@@ -22,7 +22,14 @@
 	
 
 		<div class="top-login"></div>
+
 		<div class="mid-login">
+	         <lift:Msgs>
+                     <lift:error_class>error_major</lift:error_class>
+                     <lift:notice_msg><lift:loc>ui_base_note</lift:loc></lift:notice_msg>
+                     <lift:notice_class>note_major</lift:notice_class>
+                 </lift:Msgs>
+
 			<form name="loginFrm" action="javascript:login()" method="post" >
 				<div class="form">
 						<div class="post-form-row">

Modified: incubator/esme/trunk/server/src/main/webapp/templates-hidden/upw_signup_form.html
URL: http://svn.apache.org/viewvc/incubator/esme/trunk/server/src/main/webapp/templates-hidden/upw_signup_form.html?rev=937955&r1=937954&r2=937955&view=diff
==============================================================================
--- incubator/esme/trunk/server/src/main/webapp/templates-hidden/upw_signup_form.html (original)
+++ incubator/esme/trunk/server/src/main/webapp/templates-hidden/upw_signup_form.html Mon Apr 26 07:52:06 2010
@@ -18,21 +18,21 @@
 -->
 <lift:xml_group>
 	<div class="post-form-row">
-		<label>
+		<label class="main">
 			<lift:loc>ui_login_email</lift:loc>
 		</label>
-		<signup:email class="inputBox2 tipelement" title="This is your email. "/>
+		<signup:email class="inputBox2 tipelement email required" minlength="3" title="This is your email. "/>
 	</div>
 	<div class="post-form-row">
-		<label>
+		<label class="main">
 			<lift:loc>ui_login_password</lift:loc>
 		</label>
-		<signup:pwd1 class="inputBox2 tipelement" title="This is your password"/>
+		<signup:pwd1 class="inputBox2 tipelement required alphanumeric nowhitespace" minlength="6"  title="This is your password"/>
 	</div>
 	<div class="post-form-row">
-		<label>
+		<label class="main">
 			<lift:loc>ui_login_password_repeat</lift:loc>
 		</label>
-		<signup:pwd2 class="inputBox2" title="Please enter your password again to make sure that it is correct"/>
+		<signup:pwd2 class="inputBox2  tipelement required alphanumeric nowhitespace" minlength="6" title="Please enter your password again to make sure that it is correct"/>
 	</div>
 </lift:xml_group>



Mime
View raw message