- add users to Renkan user_management
authorymh <ymh.work@gmail.com>
Tue, 23 Apr 2013 16:54:18 +0200
branchuser_management
changeset 215 a282eebbc5e0
parent 214 ff3b21d62eb8
child 216 fdc74162bef1
- add users to Renkan
.classpath
server/README.md
server/pom.xml
server/src/main/java/org/iri_research/renkan/Constants.java
server/src/main/java/org/iri_research/renkan/controller/AdminController.java
server/src/main/java/org/iri_research/renkan/controller/admin/AdminController.java
server/src/main/java/org/iri_research/renkan/controller/admin/SpacesAdminController.java
server/src/main/java/org/iri_research/renkan/coweb/RenkanSessionModerator.java
server/src/main/java/org/iri_research/renkan/coweb/event/UserSyncEventManager.java
server/src/main/java/org/iri_research/renkan/management/MigrateRenkanUser.java
server/src/main/java/org/iri_research/renkan/models/Group.java
server/src/main/java/org/iri_research/renkan/models/Project.java
server/src/main/java/org/iri_research/renkan/models/RenkanUser.java
server/src/main/java/org/iri_research/renkan/models/RosterUser.java
server/src/main/java/org/iri_research/renkan/models/User.java
server/src/main/java/org/iri_research/renkan/repositories/ProjectsRepositoryCustom.java
server/src/main/java/org/iri_research/renkan/repositories/ProjectsRepositoryImpl.java
server/src/main/java/org/iri_research/renkan/repositories/UsersRepository.java
server/src/main/java/org/iri_research/renkan/services/RenkanUserDetailsService.java
server/src/main/java/org/iri_research/renkan/utils/ColorGenerator.java
server/src/main/webapp/WEB-INF/applicationContext.xml
server/src/main/webapp/WEB-INF/i18n/messages_en.properties
server/src/main/webapp/WEB-INF/i18n/messages_fr.properties
server/src/main/webapp/WEB-INF/templates/admin/spacesList.html
server/src/main/webapp/WEB-INF/templates/admin/userEdit.html
server/src/main/webapp/WEB-INF/templates/admin/usersList.html
server/src/main/webapp/static/css/index.css
server/src/main/webapp/static/lib/i18n/jquery-ui-i18n.min.js
server/src/test/java/org/iri_research/renkan/test/repositories/ProjectsRepositoryTest.java
server/src/test/resources/log4j.xml
--- a/.classpath	Tue May 14 14:10:23 2013 +0200
+++ b/.classpath	Tue Apr 23 16:54:18 2013 +0200
@@ -67,7 +67,7 @@
 			<attribute name="org.eclipse.jst.component.nondependency" value=""/>
 		</attributes>
 	</classpathentry>
-	<classpathentry kind="var" path="M2_REPO/org/mongodb/mongo-java-driver/2.10.1/mongo-java-driver-2.10.1.jar" sourcepath="M2_REPO/org/mongodb/mongo-java-driver/2.10.1/mongo-java-driver-2.10.1-sources.jar">
+	<classpathentry kind="var" path="M2_REPO/org/mongodb/mongo-java-driver/2.11.0/mongo-java-driver-2.11.0.jar" sourcepath="M2_REPO/org/mongodb/mongo-java-driver/2.10.1/mongo-java-driver-2.10.1-sources.jar">
 		<attributes>
 			<attribute name="javadoc_location" value="jar:file:/Users/ymh/.m2/repository/org/mongodb/mongo-java-driver/2.10.1/mongo-java-driver-2.10.1-javadoc.jar!/"/>
 			<attribute name="org.eclipse.jst.component.nondependency" value=""/>
@@ -195,7 +195,7 @@
 			<attribute name="org.eclipse.jst.component.nondependency" value=""/>
 		</attributes>
 	</classpathentry>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7">
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER">
 		<attributes>
 			<attribute name="owner.project.facets" value="java"/>
 		</attributes>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/server/README.md	Tue Apr 23 16:54:18 2013 +0200
@@ -0,0 +1,7 @@
+Dependencies
+
+- Icon user from echo-icon-theme (echo) (Open Icon Library - http://openiconlibrary.sourceforge.net/)  
+licence CC BY-SA - Creative Commons
+
+- cf pom.xml for dependencies
+
--- a/server/pom.xml	Tue May 14 14:10:23 2013 +0200
+++ b/server/pom.xml	Tue Apr 23 16:54:18 2013 +0200
@@ -13,6 +13,7 @@
         <cowebx-version>1.0</cowebx-version>
         <jersey-version>1.17.1</jersey-version>
         <spring-version>3.2.1.RELEASE</spring-version>
+        <spring-data-mongodb-version>1.2.0.RELEASE</spring-data-mongodb-version>
         <spring-security-version>3.1.3.RELEASE</spring-security-version>
         <jetty-version>8.1.10.v20130312</jetty-version>
         <junit-version>4.10</junit-version>
@@ -21,6 +22,7 @@
         <cometd-version>2.5.1</cometd-version>
         <jackson-version>2.1.4</jackson-version>
         <joda-version>2.1</joda-version>
+        <mongo-driver-version>2.11.0</mongo-driver-version>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
     </properties>
 
@@ -125,6 +127,11 @@
 	          <artifactId>maven-surefire-plugin</artifactId>
 	          <version>${surefire-version}</version>
 	        </plugin>
+	        <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-jar-plugin</artifactId>
+                <version>2.4</version>
+            </plugin>
         </plugins>
     </build>
     <repositories>
@@ -238,7 +245,7 @@
         <dependency>
             <groupId>org.mongodb</groupId>
             <artifactId>mongo-java-driver</artifactId>
-            <version>2.10.1</version>
+            <version>${mongo-driver-version}</version>
         </dependency>
         <dependency> 
             <groupId>org.slf4j</groupId>
@@ -284,7 +291,7 @@
         <dependency>
             <groupId>org.springframework.data</groupId>
             <artifactId>spring-data-mongodb</artifactId>
-            <version>1.2.0.RELEASE</version>
+            <version>${spring-data-mongodb-version}</version>
         </dependency>
         <dependency>
             <groupId>javax.persistence</groupId>
--- a/server/src/main/java/org/iri_research/renkan/Constants.java	Tue May 14 14:10:23 2013 +0200
+++ b/server/src/main/java/org/iri_research/renkan/Constants.java	Tue Apr 23 16:54:18 2013 +0200
@@ -49,6 +49,7 @@
 	public final static int PAGINATION_SIZE = 10;
 	public final static String PROPERTIES_SERVLET_CONTEXT_NAME = "renkan.properties";
 	public final static String PROPERTIES_CLASSPATH_NAME = "renkan_run.properties";
+	public final static String ANONYMOUS_USER_BASE_NAME = "Anonymous";
 	
 	private final static EthernetAddress ETHERNET_ADRESS = EthernetAddress.fromInterface(); 
 	public final static NoArgGenerator UUID_GENERATOR = Generators.timeBasedGenerator(ETHERNET_ADRESS);
--- a/server/src/main/java/org/iri_research/renkan/controller/AdminController.java	Tue May 14 14:10:23 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,195 +0,0 @@
-package org.iri_research.renkan.controller;
-
-import java.security.NoSuchAlgorithmException;
-import java.security.SecureRandom;
-import java.util.Arrays;
-import java.util.Map;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.validation.Valid;
-
-import org.apache.commons.codec.binary.Hex;
-import org.iri_research.renkan.Constants;
-import org.iri_research.renkan.RenkanException;
-import org.iri_research.renkan.forms.SpaceForm;
-import org.iri_research.renkan.forms.SpaceFormValidator;
-import org.iri_research.renkan.models.Space;
-import org.iri_research.renkan.repositories.ProjectsRepository;
-import org.iri_research.renkan.repositories.SpacesRepository;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.domain.Page;
-import org.springframework.data.domain.Pageable;
-import org.springframework.data.domain.Sort.Direction;
-import org.springframework.data.web.PageableDefaults;
-import org.springframework.http.HttpStatus;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.validation.BindingResult;
-import org.springframework.web.bind.WebDataBinder;
-import org.springframework.web.bind.annotation.InitBinder;
-import org.springframework.web.bind.annotation.ModelAttribute;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.client.HttpClientErrorException;
-
-@Controller
-@RequestMapping("/admin")
-public class AdminController {
-
-	private final Logger logger = LoggerFactory.getLogger(AdminController.class);
-	
-	@Autowired
-	private SpacesRepository spacesRepository;
-	@Autowired
-	private ProjectsRepository projectsRepository;
-	
-    @InitBinder(value={"space"})
-    protected void initBinder(WebDataBinder binder) {
-        binder.setValidator(new SpaceFormValidator());
-    }
-	
-	@RequestMapping(value="", method = RequestMethod.GET, produces={"text/html;charset=UTF-8"})
-	public String adminIndex() {
-				
-		return "admin/adminIndex";
-	}
-	
-	@RequestMapping(value="/spaces", method = RequestMethod.GET, produces={"text/html;charset=UTF-8"})
-	public String spacesList(
-			Model model,
-			@PageableDefaults(sort={"created"}, sortDir=Direction.DESC, pageNumber=0, value=Constants.PAGINATION_SIZE) Pageable p,
-			HttpServletRequest request) {
-		
-		Page<Space> page = this.spacesRepository.findAll(p);
-		
-		model.addAttribute("page", page);
-		model.addAttribute("baseUrl", Utils.buildBaseUrl(request));
-		model.addAttribute("projectsCount", this.projectsRepository.getCountBySpace());
-		
-		return "admin/spacesList";
-	}
-	
-	@RequestMapping(value="/spaces/edit/", method = RequestMethod.GET, produces={"text/html;charset=UTF-8"})
-	public String editSpace(Model model) {
-		return editSpace(model, null);
-	}
-	
-	@RequestMapping(value="/spaces/edit/{spaceId}", method = RequestMethod.GET, produces={"text/html;charset=UTF-8"})
-	public String editSpace(Model model, @PathVariable(value="spaceId") String spaceId) {
-		
-		SpaceForm spaceForm = null;
-		
-		if(spaceId == null || spaceId.length() == 0 || "_".equals(spaceId)) {
-			spaceForm = new SpaceForm();
-		}
-		else {
-			Space space = this.spacesRepository.findOne(spaceId);		
-			if(space == null) {
-				throw new HttpClientErrorException(HttpStatus.NOT_FOUND, "space " + spaceId + " not found");			
-			}
-			spaceForm = new SpaceForm(space);
-		}
-		
-		model.addAttribute("space", spaceForm);
-		
-		return "admin/spaceEdit";
-	}
-	
-	
-	@RequestMapping(value="/spaces/save", method = RequestMethod.POST)
-	public String saveSpace(Model model, @ModelAttribute("space") @Valid SpaceForm spaceForm, BindingResult bindingResult) {
-
-		logger.debug("space title " + spaceForm.getTitle());
-		logger.debug("space description " + spaceForm.getDescription());
-		
-		if(bindingResult.hasErrors()) {
-			return "admin/spaceEdit";
-		}
-		
-		spaceForm.setSpacesRepository(spacesRepository);
-		
-		try {
-			spaceForm.save();
-		} catch (RenkanException e) {
-			throw new HttpClientErrorException(HttpStatus.NOT_FOUND, "space " + spaceForm.getId() + " not found");
-		}
-		
-		return "redirect:/admin/spaces";
-	}
-	
-	//@RequestMapping(value="/spaces/confirmdelete/{spaceId}", method = RequestMethod.GET)
-	//public String askDeleteSpace(Model model, @PathVariable(value="spaceId") String spaceId) {
-		
-		
-	//}
-	
-	@RequestMapping(value="/spaces/delete/{spaceId}")
-	public String deleteSpace(
-			HttpServletRequest request,
-			Model model,
-			@PathVariable(value="spaceId") String spaceId,
-			@RequestParam(value="key", required=false) String key,
-			@RequestParam(value="salt", required=false) String salt) throws NoSuchAlgorithmException, RenkanException
-	{
-
-		if(spaceId == null || spaceId.length() == 0) {
-			throw new HttpClientErrorException(HttpStatus.BAD_REQUEST, "Null or empty space id");
-		}
-		
-		RequestMethod method = RequestMethod.valueOf(request.getMethod());
-		
-		Map<String, Integer> nbProj = this.projectsRepository.getCountBySpace(Arrays.asList(spaceId));
-		if(nbProj.containsKey(spaceId) && nbProj.get(spaceId).intValue()>0) {
-			throw new HttpClientErrorException(HttpStatus.BAD_REQUEST, "This space have projects");
-		}
-		
-		if(RequestMethod.GET.equals(method)) {
-
-			Space space = this.spacesRepository.findOne(spaceId);
-			
-			if(space == null) {
-				throw new HttpClientErrorException(HttpStatus.NOT_FOUND, "space " + spaceId + " not found");
-			}
-			
-			SecureRandom rand = SecureRandom.getInstance("SHA1PRNG");
-			rand.setSeed(System.currentTimeMillis());
-			byte[] rawSalt = new byte[50];
-			rand.nextBytes(rawSalt);
-			String newSalt = Hex.encodeHexString(rawSalt);
-						
-			
-			model.addAttribute("spaceObj", space);
-			model.addAttribute("salt", newSalt);
-			model.addAttribute("key", space.getKey(newSalt));
-						
-			return "admin/spaceDeleteConfirm";
-		}
-		else if (RequestMethod.POST.equals(method) && key != null && !key.isEmpty() && salt != null && !salt.isEmpty()) {
-						
-			if(spaceId != null && spaceId.length() > 0) {
-				
-				Space space = this.spacesRepository.findOne(spaceId);
-				if(space != null) {
-					if(space.checkKey(key, salt)) {
-						this.spacesRepository.delete(spaceId);
-					}
-					else {
-						throw new HttpClientErrorException(HttpStatus.BAD_REQUEST, "Key not ckecked");
-					}
-				}
-				
-			}
-			return "redirect:/admin/spaces";
-			
-		}
-		else {
-			throw new HttpClientErrorException(HttpStatus.BAD_REQUEST, "Bad request method or parameters"); 
-		}
-		
-	}
-	
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/server/src/main/java/org/iri_research/renkan/controller/admin/AdminController.java	Tue Apr 23 16:54:18 2013 +0200
@@ -0,0 +1,23 @@
+package org.iri_research.renkan.controller.admin;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+@Controller
+@RequestMapping("/admin")
+public class AdminController {
+
+	
+	@SuppressWarnings("unused")
+	private final Logger logger = LoggerFactory.getLogger(AdminController.class);
+		
+	@RequestMapping(value="", method = RequestMethod.GET, produces={"text/html;charset=UTF-8"})
+	public String adminIndex() {
+				
+		return "admin/adminIndex";
+	}
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/server/src/main/java/org/iri_research/renkan/controller/admin/SpacesAdminController.java	Tue Apr 23 16:54:18 2013 +0200
@@ -0,0 +1,184 @@
+package org.iri_research.renkan.controller.admin;
+
+import java.security.NoSuchAlgorithmException;
+import java.security.SecureRandom;
+import java.util.Arrays;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.validation.Valid;
+
+import org.apache.commons.codec.binary.Hex;
+import org.iri_research.renkan.Constants;
+import org.iri_research.renkan.RenkanException;
+import org.iri_research.renkan.controller.Utils;
+import org.iri_research.renkan.forms.SpaceForm;
+import org.iri_research.renkan.forms.SpaceFormValidator;
+import org.iri_research.renkan.models.Space;
+import org.iri_research.renkan.repositories.ProjectsRepository;
+import org.iri_research.renkan.repositories.SpacesRepository;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.domain.Sort.Direction;
+import org.springframework.data.web.PageableDefaults;
+import org.springframework.http.HttpStatus;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.WebDataBinder;
+import org.springframework.web.bind.annotation.InitBinder;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.client.HttpClientErrorException;
+
+@Controller
+@RequestMapping("/admin/spaces")
+public class SpacesAdminController {
+	
+	private final Logger logger = LoggerFactory.getLogger(SpacesAdminController.class);	
+
+	@Autowired
+	private SpacesRepository spacesRepository;
+	@Autowired
+	private ProjectsRepository projectsRepository;
+	
+    @InitBinder(value={"space"})
+    protected void initBinder(WebDataBinder binder) {
+        binder.setValidator(new SpaceFormValidator());
+    }
+
+	@RequestMapping(value="/", method = RequestMethod.GET, produces={"text/html;charset=UTF-8"})
+	public String spacesList(
+			Model model,
+			@PageableDefaults(sort={"created"}, sortDir=Direction.DESC, pageNumber=0, value=Constants.PAGINATION_SIZE) Pageable p,
+			HttpServletRequest request) {
+		
+		Page<Space> page = this.spacesRepository.findAll(p);
+		
+		model.addAttribute("page", page);
+		model.addAttribute("baseUrl", Utils.buildBaseUrl(request));
+		model.addAttribute("projectsCount", this.projectsRepository.getCountBySpace());
+		
+		return "admin/spacesList";
+	}
+	
+	@RequestMapping(value="/edit/", method = RequestMethod.GET, produces={"text/html;charset=UTF-8"})
+	public String editSpace(Model model) {
+		return editSpace(model, null);
+	}
+	
+	@RequestMapping(value="/edit/{spaceId}", method = RequestMethod.GET, produces={"text/html;charset=UTF-8"})
+	public String editSpace(Model model, @PathVariable(value="spaceId") String spaceId) {
+		
+		SpaceForm spaceForm = null;
+		
+		if(spaceId == null || spaceId.length() == 0 || "_".equals(spaceId)) {
+			spaceForm = new SpaceForm();
+		}
+		else {
+			Space space = this.spacesRepository.findOne(spaceId);		
+			if(space == null) {
+				throw new HttpClientErrorException(HttpStatus.NOT_FOUND, "space " + spaceId + " not found");			
+			}
+			spaceForm = new SpaceForm(space);
+		}
+		
+		model.addAttribute("space", spaceForm);
+		
+		return "admin/spaceEdit";
+	}
+	
+	
+	@RequestMapping(value="/save", method = RequestMethod.POST)
+	public String saveSpace(Model model, @ModelAttribute("space") @Valid SpaceForm spaceForm, BindingResult bindingResult) {
+
+		logger.debug("space title " + spaceForm.getTitle());
+		logger.debug("space description " + spaceForm.getDescription());
+		
+		if(bindingResult.hasErrors()) {
+			return "admin/spaceEdit";
+		}
+		
+		spaceForm.setSpacesRepository(spacesRepository);
+		
+		try {
+			spaceForm.save();
+		} catch (RenkanException e) {
+			throw new HttpClientErrorException(HttpStatus.NOT_FOUND, "space " + spaceForm.getId() + " not found");
+		}
+		
+		return "redirect:/admin/spaces";
+	}
+		
+	@RequestMapping(value="/delete/{spaceId}")
+	public String deleteSpace(
+			HttpServletRequest request,
+			Model model,
+			@PathVariable(value="spaceId") String spaceId,
+			@RequestParam(value="key", required=false) String key,
+			@RequestParam(value="salt", required=false) String salt) throws NoSuchAlgorithmException, RenkanException
+	{
+
+		if(spaceId == null || spaceId.length() == 0) {
+			throw new HttpClientErrorException(HttpStatus.BAD_REQUEST, "Null or empty space id");
+		}
+		
+		RequestMethod method = RequestMethod.valueOf(request.getMethod());
+		
+		Map<String, Integer> nbProj = this.projectsRepository.getCountBySpace(Arrays.asList(spaceId));
+		if(nbProj.containsKey(spaceId) && nbProj.get(spaceId).intValue()>0) {
+			throw new HttpClientErrorException(HttpStatus.BAD_REQUEST, "This space have projects");
+		}
+		
+		if(RequestMethod.GET.equals(method)) {
+
+			Space space = this.spacesRepository.findOne(spaceId);
+			
+			if(space == null) {
+				throw new HttpClientErrorException(HttpStatus.NOT_FOUND, "space " + spaceId + " not found");
+			}
+			
+			SecureRandom rand = SecureRandom.getInstance("SHA1PRNG");
+			rand.setSeed(System.currentTimeMillis());
+			byte[] rawSalt = new byte[50];
+			rand.nextBytes(rawSalt);
+			String newSalt = Hex.encodeHexString(rawSalt);
+						
+			
+			model.addAttribute("spaceObj", space);
+			model.addAttribute("salt", newSalt);
+			model.addAttribute("key", space.getKey(newSalt));
+						
+			return "admin/spaceDeleteConfirm";
+		}
+		else if (RequestMethod.POST.equals(method) && key != null && !key.isEmpty() && salt != null && !salt.isEmpty()) {
+						
+			if(spaceId != null && spaceId.length() > 0) {
+				
+				Space space = this.spacesRepository.findOne(spaceId);
+				if(space != null) {
+					if(space.checkKey(key, salt)) {
+						this.spacesRepository.delete(spaceId);
+					}
+					else {
+						throw new HttpClientErrorException(HttpStatus.BAD_REQUEST, "Key not ckecked");
+					}
+				}
+				
+			}
+			return "redirect:/admin/spaces";
+			
+		}
+		else {
+			throw new HttpClientErrorException(HttpStatus.BAD_REQUEST, "Bad request method or parameters"); 
+		}
+		
+	}
+    
+}
--- a/server/src/main/java/org/iri_research/renkan/coweb/RenkanSessionModerator.java	Tue May 14 14:10:23 2013 +0200
+++ b/server/src/main/java/org/iri_research/renkan/coweb/RenkanSessionModerator.java	Tue Apr 23 16:54:18 2013 +0200
@@ -123,7 +123,7 @@
 			return;
 		}
 		for (RosterUser rosterUser : r_user_list) {
-			if( rosterUser.getClient_id().equals(clientId)) {
+			if( rosterUser.getClientId().equals(clientId)) {
 				r_user_list.remove(rosterUser);
 			}
 		}
--- a/server/src/main/java/org/iri_research/renkan/coweb/event/UserSyncEventManager.java	Tue May 14 14:10:23 2013 +0200
+++ b/server/src/main/java/org/iri_research/renkan/coweb/event/UserSyncEventManager.java	Tue Apr 23 16:54:18 2013 +0200
@@ -1,5 +1,6 @@
 package org.iri_research.renkan.coweb.event;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
@@ -8,6 +9,7 @@
 
 import org.coweb.CowebException;
 import org.iri_research.renkan.models.Project;
+import org.iri_research.renkan.models.RenkanUser;
 import org.iri_research.renkan.models.User;
 import org.iri_research.renkan.repositories.IRenkanRepository;
 import org.iri_research.renkan.repositories.UsersRepository;
@@ -56,7 +58,7 @@
 			color = UserSyncEventManager.DEFAULT_COLOR;
 		}
 		
-		User user = new User(user_id, (String)values.get("title"), (String)values.get("description"), (String)values.get("uri"), color, project_id);
+		User user = new User(user_id, (String)values.get("title"), (String)values.get("description"), (String)values.get("uri"), color);
 		
 		Integer position = (Integer)data.get("position");
 		
@@ -64,7 +66,8 @@
 			throw new CowebException("node insert: bad insert position", String.format("Bad position %s not found", position==null?"null":position.toString()));
 		}
 		int index = position.intValue();
-		List<User> users = project.getUsers();
+		//TODO: correct this. done that to compile
+		List<User> users = new ArrayList<User>();//project.getUsers();
 		if(index > users.size()) {
 			index = users.size();
 		}
@@ -82,7 +85,9 @@
 
 	@Override
 	protected List<User> getObjectList(Project project) {
-		return project.getUsers();
+		//TODO: correct this, this is wrong, just put here to cpmpile
+		return null;
+		//return project.getUsers();
 	}
 
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/server/src/main/java/org/iri_research/renkan/management/MigrateRenkanUser.java	Tue Apr 23 16:54:18 2013 +0200
@@ -0,0 +1,72 @@
+package org.iri_research.renkan.management;
+
+import org.iri_research.renkan.models.Project;
+import org.iri_research.renkan.models.RenkanUser;
+import org.iri_research.renkan.models.User;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.stereotype.Component;
+
+import com.mongodb.BasicDBObject;
+import com.mongodb.DBCollection;
+import com.mongodb.DBObject;
+import com.mongodb.WriteConcern;
+
+@Component
+public class MigrateRenkanUser {
+	
+	public static void main(String[] args) {
+		
+		@SuppressWarnings("resource")
+		ApplicationContext context = new ClassPathXmlApplicationContext("classpath:WEB-INF/applicationContext.xml");
+		
+		MigrateRenkanUser p = context.getBean(MigrateRenkanUser.class);
+		p.start(args);
+		
+	}
+	
+	@Autowired
+	private MongoTemplate template;
+	
+	private void start(String[] args) {
+		
+		DBCollection userColl = template.getCollection(template.getCollectionName(User.class));
+		DBCollection renkanUserColl = template.getCollection(template.getCollectionName(RenkanUser.class));
+		DBCollection projectColl = template.getCollection(template.getCollectionName(Project.class));
+		
+		for (DBObject user: userColl.find()) {
+			if(!user.containsField("project_id")) {
+				continue;
+			}
+			String projectId = (String) user.get("project_id");
+			if(projectId == null || projectId.isEmpty()) {
+				user.removeField("project_id");
+				userColl.save(user);
+				continue;
+			}
+			DBObject proj = new BasicDBObject();
+			proj.put("_id", projectId);
+			if(projectColl.findOne(proj) != null) {
+				DBObject renkanUser = new BasicDBObject();
+				renkanUser.put("project_id", projectId);
+				renkanUser.put("user_id", user.get("_id"));				
+				if(renkanUserColl.findOne(renkanUser) == null) {
+					System.out.println(String.format("%s : %s : %s", user.get("_id"),user.get("title"),user.get("project_id")));
+					renkanUser = new BasicDBObject();
+					renkanUser.put("project_id", user.get("project_id"));
+					renkanUser.put("user_id", user.get("_id"));
+					renkanUser.put("color", user.get("color"));
+					renkanUserColl.insert(renkanUser);
+				}
+				user.removeField("project_id");
+				userColl.save(user);
+			}
+			else {
+				userColl.remove(user, WriteConcern.ACKNOWLEDGED);
+			}
+		}
+		
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/server/src/main/java/org/iri_research/renkan/models/Group.java	Tue Apr 23 16:54:18 2013 +0200
@@ -0,0 +1,14 @@
+package org.iri_research.renkan.models;
+
+import org.springframework.data.mongodb.core.mapping.Document;
+
+@Document(collection="groups")
+public class Group extends AbstractRenkanModel<String> {
+	
+	public String getGroupName() {
+		return this.getTitle();
+	}
+	
+	
+
+}
--- a/server/src/main/java/org/iri_research/renkan/models/Project.java	Tue May 14 14:10:23 2013 +0200
+++ b/server/src/main/java/org/iri_research/renkan/models/Project.java	Tue Apr 23 16:54:18 2013 +0200
@@ -14,6 +14,7 @@
 import org.apache.commons.codec.binary.Hex;
 import org.iri_research.renkan.Constants;
 import org.iri_research.renkan.Constants.EditMode;
+import org.iri_research.renkan.utils.ColorGenerator;
 import org.iri_research.renkan.RenkanException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -50,8 +51,7 @@
 	private List<Edge> edges = new ArrayList<Edge>();
 
 	// Users
-	@DBRef
-	private List<User> users = new ArrayList<User>();
+	private List<RenkanUser> users = new ArrayList<RenkanUser>();
 	
 	
 	public Project(Project project) {
@@ -67,8 +67,8 @@
 		for (Edge edge : project.edges) {
 			this.edges.add(new Edge(edge, nodeCloneMap.get(edge.getFrom()), nodeCloneMap.get(edge.getTo()), this.id));
 		}
-		for(User user : project.users) {
-			this.users.add(user);
+		for(RenkanUser user : project.users) {			
+			this.users.add(new RenkanUser(user));
 		}
 	}
 	
@@ -105,7 +105,7 @@
 		return this.edges;
 	}
 	
-	public List<User> getUsers() {
+	public List<RenkanUser> getUsers() {
 		return this.users;
 	}
 
@@ -183,4 +183,62 @@
 		this.updated = updated;
 	}
 	
+	public void addUser(User user) {
+		
+		if(user == null) {
+			// we add an anonymous user
+			// find an unique user name
+			this.addUser(null, null);
+		}
+		else {
+			// if user is already in list do nothing
+			for (RenkanUser renkanUser : this.users) {
+				if(renkanUser.getUserId() != null && renkanUser.getUserId().equals(user.getId())) {
+					return;
+				}
+			}
+			// user not found 
+			this.users.add(new RenkanUser(this.getId(), user.getId(), user.getColor(), user.getUsername()));
+			
+		}
+		
+	}
+	
+	public void addUser(String username, String color) {
+		
+		if(username == null) {
+			//find a new username
+			int i = 0;
+			boolean usernameFound = true;
+			while(i++<1000000 && usernameFound) {
+				username = String.format("%s-%s", Constants.ANONYMOUS_USER_BASE_NAME, i);
+				usernameFound = false;
+				for(RenkanUser renkanUser : this.users) {
+					if(username.equals(renkanUser.getUsername())) {
+						usernameFound = true;
+						break;
+					}
+				}
+			}			
+		}
+		
+		if(color == null) {
+			int i=0;
+			boolean colorFound = true;
+			while(i++<10000000 && colorFound) {
+				color = "#" + ColorGenerator.randomColorHex();
+				colorFound = false;
+				for(RenkanUser renkanUser : this.users) {
+					if(username.equals(renkanUser.getUsername())) {
+						colorFound = true;
+						break;
+					}
+				}
+			}
+		}
+		
+		RenkanUser ruser = new RenkanUser(this.getId(), null, color, username);
+		this.users.add(ruser);
+	}
+	
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/server/src/main/java/org/iri_research/renkan/models/RenkanUser.java	Tue Apr 23 16:54:18 2013 +0200
@@ -0,0 +1,63 @@
+package org.iri_research.renkan.models;
+
+import org.springframework.data.mongodb.core.mapping.Field;
+
+
+public class RenkanUser {
+	
+	@Field(value="user_id")
+	private String userId;
+	private String color;
+	private String username;
+	
+		
+	@SuppressWarnings("unused")
+	private RenkanUser() {
+	}
+	
+	public RenkanUser(String projectId, String userId, String color,
+			String username) {
+		this.userId = userId;
+		this.color = color;
+		this.username = username;
+	}
+
+	public RenkanUser(RenkanUser user) {
+		if(user !=  null) {
+			this.setUserId(user.getUserId());
+			this.setColor(user.getColor());
+			this.setUsername(user.getUsername());
+		}
+	}
+	
+	@Field(value="user_id")
+	public String getUserId() {
+		return userId;
+	}
+	
+	@Field(value="user_id")
+	public void setUserId(String userId) {
+		this.userId = userId;
+	}
+	
+	public String getColor() {
+		return color;
+	}
+	
+	public void setColor(String color) {
+		this.color = color;
+	}
+	
+	public String getUsername() {
+		return username;
+	}
+	
+	public void setUsername(String username) {
+		this.username = username;
+	}
+	
+	public boolean isAnonymous() {
+		return this.getUserId() == null;
+	}
+
+}
--- a/server/src/main/java/org/iri_research/renkan/models/RosterUser.java	Tue May 14 14:10:23 2013 +0200
+++ b/server/src/main/java/org/iri_research/renkan/models/RosterUser.java	Tue Apr 23 16:54:18 2013 +0200
@@ -1,17 +1,19 @@
 package org.iri_research.renkan.models;
 
+import com.fasterxml.jackson.annotation.JsonProperty;
+
 public class RosterUser extends AbstractRenkanModel<String> {
 	
-	private String project_id;
-	private Long site_id;
-	private String client_id;
+	private String projectId;
+	private Long siteId;
+	private String clientId;
 
 	public RosterUser(String id, String title, String description, String uri, String color, String project_id, Long site_id, String client_id) {
 		super(id, title, description, uri, color);
 		
-		this.project_id = project_id;
-		this.site_id = site_id;
-		this.client_id = client_id;
+		this.projectId = project_id;
+		this.siteId = site_id;
+		this.clientId = client_id;
 	}
 	
 	public void setTitle(String title) {
@@ -30,16 +32,19 @@
 		this.color = color;
 	}	
 
-	public String getProject_id() {
-		return project_id;
+	@JsonProperty(value="project_id")
+	public String getProjectId() {
+		return projectId;
 	}
 
-	public Long getSite_id() {
-		return site_id;
+	@JsonProperty(value="site_id")
+	public Long getSiteId() {
+		return siteId;
 	}
 	
-	public String getClient_id() {
-		return client_id;
+	@JsonProperty(value="client_id")
+	public String getClientId() {
+		return clientId;
 	}
 
 	
--- a/server/src/main/java/org/iri_research/renkan/models/User.java	Tue May 14 14:10:23 2013 +0200
+++ b/server/src/main/java/org/iri_research/renkan/models/User.java	Tue Apr 23 16:54:18 2013 +0200
@@ -1,24 +1,86 @@
 package org.iri_research.renkan.models;
 
+import java.util.Collection;
+import java.util.Date;
+
 import org.springframework.data.mongodb.core.mapping.Document;
+import org.springframework.data.mongodb.core.mapping.Field;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.userdetails.UserDetails;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
 
 @Document(collection="users")
-public class User extends AbstractRenkanModel<String> {
+public class User extends AbstractRenkanModel<String> implements UserDetails {
+	
+	private static final long serialVersionUID = 6972038893086220548L;
 	
-	private String project_id;
+	private String email;
+	private String password;
+	private String salt;
+	private String avatar;
+	private boolean enabled;
+	private boolean locked;
+	
+	@Field("expiration_date")
+	private Date expirationDate;
+	
+	@Field("credentials_expiration_date")
+	private Date credentialExpirationDate;
 
-	public User(String id, String title, String description, String uri, String color, String project_id) {
+	public User(String id, String title, String description, String uri, String color) {
 		super(id, title, description, uri, color);
-		
-		this.project_id = project_id;
 	}	
 	
 	public String getColor() {
 		return this.color;
 	}
 
-	public String getProject_id() {
-		return project_id;
+	@Override
+	public Collection<? extends GrantedAuthority> getAuthorities() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	@JsonIgnore
+	public String getPassword() {
+		return this.password;
+	}
+
+	@Override
+	@JsonIgnore
+	public String getUsername() {
+		return this.title;
+	}
+
+	@Override
+	public boolean isAccountNonExpired() {
+		return this.expirationDate == null || this.expirationDate.after(new Date());
+	}
+
+	@Override
+	public boolean isAccountNonLocked() {
+		return !this.locked;
+	}
+
+	@Override
+	public boolean isCredentialsNonExpired() {
+		return this.credentialExpirationDate == null || this.credentialExpirationDate.after(new Date());
+	}
+
+	@Override
+	public boolean isEnabled() {
+		return this.enabled;
+	}
+
+	public String getEmail() {
+		return email;
+	}
+
+	public String getAvatar() {
+		return avatar;
 	}
 	
 }
--- a/server/src/main/java/org/iri_research/renkan/repositories/ProjectsRepositoryCustom.java	Tue May 14 14:10:23 2013 +0200
+++ b/server/src/main/java/org/iri_research/renkan/repositories/ProjectsRepositoryCustom.java	Tue Apr 23 16:54:18 2013 +0200
@@ -10,6 +10,11 @@
 	public int getRevCounter(String projectId);
 	public Map<String, Integer> getCountBySpace();
 	public Map<String, Integer> getCountBySpace(Collection<String> spaceIds);
+
+	public Map<String, Integer> getCountByUser();
+	public Map<String, Integer> getCountByUser(Collection<String> userIds);
+	public Map<String, Integer> getCountByUsername();
+	public Map<String, Integer> getCountByUsername(Collection<String> usernames);
 	
 	public void deleteRecursive(String projectId);
 	public void deleteRecursive(Project project);
--- a/server/src/main/java/org/iri_research/renkan/repositories/ProjectsRepositoryImpl.java	Tue May 14 14:10:23 2013 +0200
+++ b/server/src/main/java/org/iri_research/renkan/repositories/ProjectsRepositoryImpl.java	Tue Apr 23 16:54:18 2013 +0200
@@ -5,8 +5,13 @@
 import java.util.HashMap;
 import java.util.Map;
 
+import org.eclipse.jetty.util.component.AggregateLifeCycle;
+import org.iri_research.renkan.RenkanProperties;
 import org.iri_research.renkan.models.Project;
 import org.iri_research.renkan.models.ProjectRevision;
+import org.iri_research.renkan.models.RenkanUser;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.mongodb.core.MongoTemplate;
 import org.springframework.stereotype.Component;
@@ -18,9 +23,15 @@
 import org.springframework.data.mongodb.core.query.Criteria;
 import org.springframework.data.mongodb.core.query.Update;
 
+import com.mongodb.AggregationOutput;
+import com.mongodb.BasicDBObject;
+import com.mongodb.DBObject;
+
 @Component
 public class ProjectsRepositoryImpl implements ProjectsRepositoryCustom {
 	
+	private final Logger logger = LoggerFactory.getLogger(ProjectsRepositoryImpl.class);
+	
 	@Autowired
 	private ProjectsRepository projectsRepository;
 
@@ -34,10 +45,15 @@
 	private ProjectRevisionsRepository projectRevisionsRepository;
 
 	
-	private class GroupResult {
+	private class GroupSpaceResult {
 		public String space_id;
 		public int count;		
 	}
+
+	private class GroupUsernameResult {
+		public String username;
+		public int count;		
+	}
 	
 	@Autowired
 	private MongoTemplate mongoTemplate;
@@ -62,14 +78,14 @@
 			filter = Criteria.where("space_id").in(spaceIds);
 		}
 		
-		GroupByResults<GroupResult> groupResult = this.mongoTemplate.group(
+		GroupByResults<GroupSpaceResult> groupResult = this.mongoTemplate.group(
 				filter,
 				this.mongoTemplate.getCollectionName(Project.class),
 				GroupBy.key("space_id").initialDocument("{ count: 0 }").reduceFunction("function(doc, prev) { prev.count += 1; }"),
-				GroupResult.class);
+				GroupSpaceResult.class);
 		
 		HashMap<String, Integer> res = new HashMap<>();
-		for (GroupResult gr : groupResult) {
+		for (GroupSpaceResult gr : groupResult) {
 			res.put(gr.space_id, new Integer(gr.count));
 		}
 		
@@ -123,4 +139,49 @@
 			this.projectsRepository.delete(p);
 		}
 	}
+
+
+	@Override
+	public Map<String, Integer> getCountByUser() {
+		return getCountByUser(null);
+	}
+
+
+	@Override
+	public Map<String, Integer> getCountByUser(Collection<String> userIds) {
+		
+		Criteria filter = null;
+		
+		if(userIds != null) {
+			filter = Criteria.where("users.user_id").in(userIds);
+		}
+		
+		DBObject projectOp = new BasicDBObject("$project", new BasicDBObject("users", 1));
+		DBObject unwindOp = new BasicDBObject("$unwind","$users");
+		DBObject groupOpFields = new BasicDBObject("_id", "$users.user_id");
+		groupOpFields.put("count", new BasicDBObject("$sum", 1));
+		DBObject groupOp = new BasicDBObject("$group",groupOpFields);
+		
+		AggregationOutput output = this.projectsRepository.getCollection().aggregate(projectOp, unwindOp, groupOp);
+		HashMap<String, Integer> res = new HashMap<>();
+		
+		for (DBObject groupRes : output.results()) {
+			res.put((String)groupRes.get("_id"), (Integer)groupRes.get("count"));
+		}
+				
+		return res;
+	}
+
+
+	@Override
+	public Map<String, Integer> getCountByUsername() {
+		return this.getCountByUsername(null);
+	}
+
+
+	@Override
+	public Map<String, Integer> getCountByUsername(Collection<String> usernames) {
+		// TODO Auto-generated method stub
+		return null;
+	}
 }
--- a/server/src/main/java/org/iri_research/renkan/repositories/UsersRepository.java	Tue May 14 14:10:23 2013 +0200
+++ b/server/src/main/java/org/iri_research/renkan/repositories/UsersRepository.java	Tue Apr 23 16:54:18 2013 +0200
@@ -1,7 +1,14 @@
 package org.iri_research.renkan.repositories;
 
+import java.util.List;
+
 import org.iri_research.renkan.models.User;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
 
 public interface UsersRepository extends IRenkanRepository<User, String> {
+	
+	public List<User> findByTitle(String title);
+	public Page<User> findByTitle(String title, Pageable p);
 
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/server/src/main/java/org/iri_research/renkan/services/RenkanUserDetailsService.java	Tue Apr 23 16:54:18 2013 +0200
@@ -0,0 +1,29 @@
+package org.iri_research.renkan.services;
+
+import java.util.List;
+
+import org.iri_research.renkan.models.User;
+import org.iri_research.renkan.repositories.UsersRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.security.core.userdetails.UserDetailsService;
+import org.springframework.security.core.userdetails.UsernameNotFoundException;
+import org.springframework.stereotype.Service;
+
+@Service
+public class RenkanUserDetailsService implements UserDetailsService {
+
+	@Autowired
+	private UsersRepository usersRepository;
+	
+	@Override
+	public UserDetails loadUserByUsername(String username)
+			throws UsernameNotFoundException {
+		List<User> res = this.usersRepository.findByTitle(username);
+		if(res == null || res.size() == 0) {
+			throw new UsernameNotFoundException(String.format("User {0} not found.", username));
+		}
+		return res.get(0);
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/server/src/main/java/org/iri_research/renkan/utils/ColorGenerator.java	Tue Apr 23 16:54:18 2013 +0200
@@ -0,0 +1,24 @@
+package org.iri_research.renkan.utils;
+
+import java.awt.Color;
+import java.util.Random;
+
+public class ColorGenerator {
+	
+	public static Color randomColor() {
+		
+		Random rand = new Random();
+		
+		float r = rand.nextFloat()*0.5f + 0.5f;
+		float g = rand.nextFloat()*0.5f + 0.5f;
+		float b = rand.nextFloat()*0.5f + 0.5f;
+		
+		return new Color(r, g, b);
+	}
+	
+	public static String randomColorHex() {
+		Color resColor = ColorGenerator.randomColor();
+		return Integer.toHexString(resColor.getRGB());
+	}
+
+}
--- a/server/src/main/webapp/WEB-INF/applicationContext.xml	Tue May 14 14:10:23 2013 +0200
+++ b/server/src/main/webapp/WEB-INF/applicationContext.xml	Tue Apr 23 16:54:18 2013 +0200
@@ -69,6 +69,7 @@
     <context:component-scan base-package="org.iri_research.renkan.rest" />
     <context:component-scan base-package="org.iri_research.renkan.coweb" />
     <context:component-scan base-package="org.iri_research.renkan.forms" />
+    <context:component-scan base-package="org.iri_research.renkan.management" />
     
     <!--mvc:annotation-driven>
         <mvc:argument-resolvers>
--- a/server/src/main/webapp/WEB-INF/i18n/messages_en.properties	Tue May 14 14:10:23 2013 +0200
+++ b/server/src/main/webapp/WEB-INF/i18n/messages_en.properties	Tue Apr 23 16:54:18 2013 +0200
@@ -44,12 +44,14 @@
 
 renkanAdmin.space_add = Add space
 renkanAdmin.space_edit = Edit space
-renkanAdmin.space_delete = Delete space
+renkanAdmin.space_delete = Del. space
 renkanIndex.space_url = Url
 renkanAdmin.space_confirm_delete = Do you want to delete the space entitled "{0}" ?
 
 renkanAdmin.object_name = Name
+renkanAdmin.object_created = Created
 renkanAdmin.object_edit = Edit
+renkanAdmin.object_proj_count = Renkan count
 renkanAdmin.object_delete = Delete
 renkanAdmin.object_edit_link = Edit
 renkanAdmin.object_delete_link = Del.
@@ -64,6 +66,15 @@
 renkanAdmin.form.space.format = Format
 renkanAdmin.form.space.compact = Compact
 
+
+renkanAdmin.user_objects_name = Users
+renkanAdmin.user_add = Add user
+renkanAdmin.user_edit = Edit user
+renkanAdmin.user_delete = Del. user
+renkanIndex.user_url = Url
+renkanAdmin.user_confirm_delete = Do you want to delete the user with username "{0}" ?
+
+
 renkan.error.title.empty = Title must not be empty or null
 renkan.error.bin_config.json = bin config field must contain a valid json
 
--- a/server/src/main/webapp/WEB-INF/i18n/messages_fr.properties	Tue May 14 14:10:23 2013 +0200
+++ b/server/src/main/webapp/WEB-INF/i18n/messages_fr.properties	Tue Apr 23 16:54:18 2013 +0200
@@ -48,6 +48,8 @@
 renkanAdmin.space_confirm_delete = Confirmez-vous l'effacement de l'espace intitulé "{0}" ?
 
 renkanAdmin.object_name = Nom
+renkanAdmin.object_created = Date Crea.
+renkanAdmin.object_proj_count = Nb. renkan
 renkanAdmin.object_edit = Modif.
 renkanAdmin.object_delete = Eff.
 renkanAdmin.object_edit_link = Modif.
@@ -63,6 +65,16 @@
 renkanAdmin.form.space.format = Formatter
 renkanAdmin.form.space.compact = Compacter
 
+renkanAdmin.user_objects_name = Utilisateurs
+renkanAdmin.user_add = Ajout utilisateur
+renkanAdmin.user_edit = Edition utilisateur
+renkanAdmin.user_delete = Delete space
+renkanIndex.user_url = Url
+renkanAdmin.user_confirm_delete = Do you want to delete the user with username "{0}" ?
+
+
+
+
 renkan.error.title.empty = Le champ titre ne doit pas être vide
 renkan.error.bin_config.json = le champ bin config doit contenir un json valide
 
--- a/server/src/main/webapp/WEB-INF/templates/admin/spacesList.html	Tue May 14 14:10:23 2013 +0200
+++ b/server/src/main/webapp/WEB-INF/templates/admin/spacesList.html	Tue Apr 23 16:54:18 2013 +0200
@@ -39,27 +39,27 @@
         </div>
         <div id="objects-content">
           <ul class="object-tools">
-            <li><a href="spacesAdd.html" th:href="@{/admin/spaces/edit/}" th:text="#{renkanAdmin.space_add}">Add space</a></li>
+            <li><a href="spaceAdd.html" th:href="@{/admin/users/edit/}" th:text="#{renkanAdmin.user_add}">Add user</a></li>
           </ul>
           <table>
             <thead>
               <tr>
-                <th th:text="#{renkanAdmin.object_name}" class="spaces-table-title">Name</th>
-                <th th:text="#{renkanAdmin.object_name}" class="spaces-table-created">Created</th>
-                <th th:text="#{renkanIndex.space_proj_count}">Project count</th>
-                <th th:text="#{renkanIndex.space_url}">url</th>
-                <th th:text="#{renkanAdmin.object_edit}" class="spaces-table-actions">Edit</th>
-                <th th:text="#{renkanAdmin.object_delete}" class="spaces-table-actions">Delete</th>
+                <th th:text="#{renkanAdmin.object_name}" class="object-table-title">Name</th>
+                <th th:text="#{renkanAdmin.object_created}" class="object-table-created">Created</th>
+                <th th:text="#{renkanAdmin.space_proj_count}" class="object-proj-count">Project count</th>
+                <th th:text="#{renkanIndex.space_url}" class="object-url">url</th>
+                <th th:text="#{renkanAdmin.object_edit}" class="object-table-actions">Edit</th>
+                <th th:text="#{renkanAdmin.object_delete}" class="object-table-actions">Delete</th>
               </tr>
             </thead>
             <tbody>
               <tr th:each="object: ${page.content}" th:with="spaceProjCount=${#maps.containsKey(projectsCount, object.id)}? ${projectsCount[object.id]} : 0">
-                <td th:text="${object.title}" class="spaces-table-title" >title</td>
-                <td th:text="${object.created}?${#dates.format(object.created, #messages.msg('date.format'))}:'n/a'" class="spaces-table-created">created</td>
-                <td th:text="${spaceProjCount}">nb. proj</td>
-                <td><a href="../renkanIndex.html" th:href="@{'/s/'+${object.id}}" th:text="#{renkanIndex.space_url}">url</a></td>
-                <td><a href="spaceEdit.html" th:href="@{'/admin/spaces/edit/'+${object.id}}" th:text="#{renkanAdmin.object_edit_link}" class="spaces-table-actions">Edit</a></td>
-                <td><a href="#" th:if="${spaceProjCount==0}" th:href="@{'/admin/spaces/delete/'+${object.id}}" th:text="#{renkanAdmin.object_delete_link}" class="spaces-table-actions">Delete</a><span th:if="${spaceProjCount>0}" class="spaces-table-actions spaces-table-actions-disabled" th:text="#{renkanAdmin.object_delete_link}">Delete</span></td>
+                <td th:text="${object.title}" class="object-table-title" >title</td>
+                <td th:text="${object.created}?${#dates.format(object.created, #messages.msg('date.format'))}:'n/a'" class="object-table-created">created</td>
+                <td th:text="${spaceProjCount}" class="object-proj-count">nb. proj</td>
+                <td class="object-url"><a href="../renkanIndex.html" th:href="@{'/s/'+${object.id}}" th:text="#{renkanIndex.space_url}" >url</a></td>
+                <td><a href="spaceEdit.html" th:href="@{'/admin/spaces/edit/'+${object.id}}" th:text="#{renkanAdmin.object_edit_link}" class="object-table-actions">Edit</a></td>
+                <td><a href="#" th:if="${spaceProjCount==0}" th:href="@{'/admin/spaces/delete/'+${object.id}}" th:text="#{renkanAdmin.object_delete_link}" class="object-table-actions">Delete</a><span th:if="${spaceProjCount>0}" class="object-table-actions object-table-actions-disabled" th:text="#{renkanAdmin.object_delete_link}">Delete</span></td>
               </tr>
             </tbody>
           </table>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/server/src/main/webapp/WEB-INF/templates/admin/userEdit.html	Tue Apr 23 16:54:18 2013 +0200
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" >
+  <head>
+    <title>Renkan Admin - edit user</title>
+    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+    <meta charset="utf-8"/>
+    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0"/>
+
+    <link rel="shortcut icon" href="../../../static/img/favicon.ico" th:href="@{/static/img/favicon.ico}" />
+
+    <link href="../../../static/css/style.css" rel="stylesheet" th:href="@{/static/css/style.css}"/>
+    <link href="../../../static/css/index.css" rel="stylesheet" th:href="@{/static/css/index.css}"/>
+    <link href='../../../static/css/spectrum.css' rel="stylesheet" th:href="@{/static/css/spectrum.css}"/>
+    
+    <script type="text/javascript" src="../../../static/lib/jquery.min.js" th:src="@{/static/lib/jquery.min.js}" ></script>
+    <script type="text/javascript" src="../../../static/lib/jquery-ui.min.js" th:src="@{/static/lib/jquery-ui.min.js}" ></script>
+    <script type="text/javascript" src="../../../static/lib/i18n/jquery-ui-i18n.min.js" th:src="@{/static/lib/i18n/jquery-ui-i18n.min.js}" ></script>    
+    <script type="text/javascript" src='../../../static/lib/spectrum.js' th:src="@{/static/lib/spectrum.js}"></script>
+    <script th:remove="all" type="text/javascript" src="../../../static/js/thymol.js"></script>
+  </head>
+  <body>
+    <div id="container">
+      <div id="wrapper">
+        <header id="header">
+            <h1><a href="renkanIndex.html" th:href="@{/admin}" th:text="#{renkanAdmin.renkan_admin}" id="home-link">Renkan administration</a></h1>
+            <div id="headerNav" th:include="fragment/pageFragment :: headerNavFragment"></div>
+        </header>
+        <h2><a href="userList.html" th:href="@{/admin/users}" th:text="#{renkanAdmin.object_list(#{renkanAdmin.user_objects_name})}">Users List</a>&nbsp;/&nbsp;<span th:text="#{renkanAdmin.user_edit}">Edit user</span></h2>
+        <div th:include="fragment/spaceForm::spaceFormFragment" id="inner-container">
+        </div>
+      </div>
+      <footer id="footer" th:substituteby="fragment/pageFragment::footerFragment">
+        <div id="version">© <span class="version-date">2013</span> <a href="http://www.iri.centrepompidou.fr" target="_blanck">IRI</a> - Version <span class="version-version">0.0</span></div>
+      </footer>      
+    </div>
+  </body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/server/src/main/webapp/WEB-INF/templates/admin/usersList.html	Tue Apr 23 16:54:18 2013 +0200
@@ -0,0 +1,70 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" >
+  <head>
+    <title>Renkan Admin - Users</title>
+    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+    <meta charset="utf-8"/>
+    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0"/>
+
+    <link rel="shortcut icon" href="../../../static/img/favicon.ico" th:href="@{/static/img/favicon.ico}"/>
+
+    <link href="../../../static/css/style.css" rel="stylesheet" th:href="@{/static/css/style.css}"/>
+    <link href="../../../static/css/index.css" rel="stylesheet" th:href="@{/static/css/index.css}"/>
+    
+    <script th:remove="all" type="text/javascript" src="../../../static/lib/jquery.min.js"></script>
+    <script th:remove="all" type="text/javascript" src="../../../static/js/thymol.js"></script>
+  </head>
+  <body>
+    <div id="container">
+      <div id="wrapper">
+        <header id="header">
+            <h1><a href="renkanIndex.html" th:href="@{/admin}" th:text="#{renkanAdmin.renkan_admin}" id="home-link">Renkan administration</a></h1>
+            <div id="headerNav" th:include="fragment/pageFragment :: headerNavFragment"></div>
+        </header>
+        <h2 th:text="#{renkanAdmin.object_list(#{renkanAdmin.user_objects_name})}">List of objects</h2>        
+        <div th:include="fragment/paginationFragment :: paginationFragment" class="pagination-container">
+          <div>               
+            <a href="#?p.page=1">&lt;&lt;</a>                    
+            <a href="#?p.page=3">&lt;</a>
+            <span>...</span>
+            <a href="#?p.page=2">2</a>
+            <a href="#?p.page=3">3</a>
+            <span>4</span>
+            <a href="#?p.page=5">5</a>
+            <a href="#?p.page=6">6</a>
+            <span>...</span>
+            <a href="#?p.page=5">&gt;</a>
+            <a href="#?p.page=7">&gt;&gt;</a> 
+          </div>
+        </div>
+        <div id="objects-content">
+          <ul class="object-tools">
+            <li><a href="userEdit.html" th:href="@{/admin/spaces/edit/}" th:text="#{renkanAdmin.space_add}">Add space</a></li>
+          </ul>
+          <table>
+            <thead>
+              <tr>
+                <th th:text="#{renkanAdmin.object_name}" class="object-table-title">Username</th>
+                <th th:text="#{renkanAdmin.object_proj_count}" class="object-proj-count">Project count</th>
+                <th th:text="#{renkanAdmin.object_edit}" class="object-table-actions">Edit</th>
+                <th th:text="#{renkanAdmin.object_delete}" class="object-table-actions">Delete</th>
+              </tr>
+            </thead>
+            <tbody>
+              <tr th:each="object: ${page.content}" th:with="userProjCount=${#maps.containsKey(projectsCount, object.id)}? ${projectsCount[object.id]} : 0">
+                <td th:text="${object.title}" class="object-table-title" >username</td>
+                <td th:text="${userProjCount}" class="object-proj-count">nb. proj</td>
+                <td><a href="userEdit.html" th:href="@{'/admin/users/edit/'+${object.id}}" th:text="#{renkanAdmin.object_edit_link}" class="object-table-actions">Edit</a></td>
+                <td><a href="#" th:if="${userProjCount==0}" th:href="@{'/admin/users/delete/'+${object.id}}" th:text="#{renkanAdmin.object_delete_link}" class="users-table-actions">Delete</a><span th:if="${userProjCount>0}" class="object-table-actions object-table-actions-disabled" th:text="#{renkanAdmin.object_delete_link}">Delete</span></td>
+              </tr>
+            </tbody>
+          </table>
+        </div>
+        
+      </div>
+      <footer id="footer" th:substituteby="fragment/pageFragment::footerFragment">
+        <div id="version">© <span class="version-date">2013</span> <a href="http://www.iri.centrepompidou.fr" target="_blanck">IRI</a> - Version <span class="version-version">0.0</span></div>
+      </footer>
+    </div>
+  </body>
+</html>
\ No newline at end of file
--- a/server/src/main/webapp/static/css/index.css	Tue May 14 14:10:23 2013 +0200
+++ b/server/src/main/webapp/static/css/index.css	Tue Apr 23 16:54:18 2013 +0200
@@ -239,24 +239,24 @@
     text-decoration: none;
 }
 
-.spaces-table-title {
+.object-table-title {
 	width: 250px;
 }
-.spaces-table-created {
+.object-table-created {
     width: 120px;
 }
 
-.spaces-table-actions {
+.object-table-actions {
     width: 40px;
 }
 
-.spaces-table-actions-disabled, .spaces-table-actions-disabled:link, .spaces-table-actions-disabled:visited, .spaces-table-actions-disabled:hover, .spaces-table-actions-disabled:active, .spaces-table-actions-disabled:focus {
+.object-table-actions-disabled, .object-table-actions-disabled:link, .object-table-actions-disabled:visited, .object-table-actions-disabled:hover, .object-table-actions-disabled:active, .object-table-actions-disabled:focus {
 	color: gray;
 	text-decoration: none;
 	cursor: default;
 }
 
-td.spaces-table-created {
+td.object-table-created {
 	text-align: center;
 }
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/server/src/main/webapp/static/lib/i18n/jquery-ui-i18n.min.js	Tue Apr 23 16:54:18 2013 +0200
@@ -0,0 +1,6 @@
+/*! jQuery UI - v1.10.2 - 2013-03-14
+* http://jqueryui.com
+* Includes: jquery.ui.datepicker-af.js, jquery.ui.datepicker-ar-DZ.js, jquery.ui.datepicker-ar.js, jquery.ui.datepicker-az.js, jquery.ui.datepicker-be.js, jquery.ui.datepicker-bg.js, jquery.ui.datepicker-bs.js, jquery.ui.datepicker-ca.js, jquery.ui.datepicker-cs.js, jquery.ui.datepicker-cy-GB.js, jquery.ui.datepicker-da.js, jquery.ui.datepicker-de.js, jquery.ui.datepicker-el.js, jquery.ui.datepicker-en-AU.js, jquery.ui.datepicker-en-GB.js, jquery.ui.datepicker-en-NZ.js, jquery.ui.datepicker-eo.js, jquery.ui.datepicker-es.js, jquery.ui.datepicker-et.js, jquery.ui.datepicker-eu.js, jquery.ui.datepicker-fa.js, jquery.ui.datepicker-fi.js, jquery.ui.datepicker-fo.js, jquery.ui.datepicker-fr-CA.js, jquery.ui.datepicker-fr-CH.js, jquery.ui.datepicker-fr.js, jquery.ui.datepicker-gl.js, jquery.ui.datepicker-he.js, jquery.ui.datepicker-hi.js, jquery.ui.datepicker-hr.js, jquery.ui.datepicker-hu.js, jquery.ui.datepicker-hy.js, jquery.ui.datepicker-id.js, jquery.ui.datepicker-is.js, jquery.ui.datepicker-it.js, jquery.ui.datepicker-ja.js, jquery.ui.datepicker-ka.js, jquery.ui.datepicker-kk.js, jquery.ui.datepicker-km.js, jquery.ui.datepicker-ko.js, jquery.ui.datepicker-ky.js, jquery.ui.datepicker-lb.js, jquery.ui.datepicker-lt.js, jquery.ui.datepicker-lv.js, jquery.ui.datepicker-mk.js, jquery.ui.datepicker-ml.js, jquery.ui.datepicker-ms.js, jquery.ui.datepicker-nb.js, jquery.ui.datepicker-nl-BE.js, jquery.ui.datepicker-nl.js, jquery.ui.datepicker-nn.js, jquery.ui.datepicker-no.js, jquery.ui.datepicker-pl.js, jquery.ui.datepicker-pt-BR.js, jquery.ui.datepicker-pt.js, jquery.ui.datepicker-rm.js, jquery.ui.datepicker-ro.js, jquery.ui.datepicker-ru.js, jquery.ui.datepicker-sk.js, jquery.ui.datepicker-sl.js, jquery.ui.datepicker-sq.js, jquery.ui.datepicker-sr-SR.js, jquery.ui.datepicker-sr.js, jquery.ui.datepicker-sv.js, jquery.ui.datepicker-ta.js, jquery.ui.datepicker-th.js, jquery.ui.datepicker-tj.js, jquery.ui.datepicker-tr.js, jquery.ui.datepicker-uk.js, jquery.ui.datepicker-vi.js, jquery.ui.datepicker-zh-CN.js, jquery.ui.datepicker-zh-HK.js, jquery.ui.datepicker-zh-TW.js
+* Copyright 2013 jQuery Foundation and other contributors; Licensed MIT */
+jQuery(function(e){e.datepicker.regional.af={closeText:"Selekteer",prevText:"Vorige",nextText:"Volgende",currentText:"Vandag",monthNames:["Januarie","Februarie","Maart","April","Mei","Junie","Julie","Augustus","September","Oktober","November","Desember"],monthNamesShort:["Jan","Feb","Mrt","Apr","Mei","Jun","Jul","Aug","Sep","Okt","Nov","Des"],dayNames:["Sondag","Maandag","Dinsdag","Woensdag","Donderdag","Vrydag","Saterdag"],dayNamesShort:["Son","Maa","Din","Woe","Don","Vry","Sat"],dayNamesMin:["So","Ma","Di","Wo","Do","Vr","Sa"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.af)}),jQuery(function(e){e.datepicker.regional["ar-DZ"]={closeText:"إغلاق",prevText:"&#x3C;السابق",nextText:"التالي&#x3E;",currentText:"اليوم",monthNames:["جانفي","فيفري","مارس","أفريل","ماي","جوان","جويلية","أوت","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesShort:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesMin:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],weekHeader:"أسبوع",dateFormat:"dd/mm/yy",firstDay:6,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional["ar-DZ"])}),jQuery(function(e){e.datepicker.regional.ar={closeText:"إغلاق",prevText:"&#x3C;السابق",nextText:"التالي&#x3E;",currentText:"اليوم",monthNames:["كانون الثاني","شباط","آذار","نيسان","مايو","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesShort:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesMin:["ح","ن","ث","ر","خ","ج","س"],weekHeader:"أسبوع",dateFormat:"dd/mm/yy",firstDay:6,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.ar)}),jQuery(function(e){e.datepicker.regional.az={closeText:"Bağla",prevText:"&#x3C;Geri",nextText:"İrəli&#x3E;",currentText:"Bugün",monthNames:["Yanvar","Fevral","Mart","Aprel","May","İyun","İyul","Avqust","Sentyabr","Oktyabr","Noyabr","Dekabr"],monthNamesShort:["Yan","Fev","Mar","Apr","May","İyun","İyul","Avq","Sen","Okt","Noy","Dek"],dayNames:["Bazar","Bazar ertəsi","Çərşənbə axşamı","Çərşənbə","Cümə axşamı","Cümə","Şənbə"],dayNamesShort:["B","Be","Ça","Ç","Ca","C","Ş"],dayNamesMin:["B","B","Ç","С","Ç","C","Ş"],weekHeader:"Hf",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.az)}),jQuery(function(e){e.datepicker.regional.be={closeText:"Зачыніць",prevText:"&larr;Папяр.",nextText:"Наст.&rarr;",currentText:"Сёньня",monthNames:["Студзень","Люты","Сакавік","Красавік","Травень","Чэрвень","Ліпень","Жнівень","Верасень","Кастрычнік","Лістапад","Сьнежань"],monthNamesShort:["Сту","Лют","Сак","Кра","Тра","Чэр","Ліп","Жні","Вер","Кас","Ліс","Сьн"],dayNames:["нядзеля","панядзелак","аўторак","серада","чацьвер","пятніца","субота"],dayNamesShort:["ндз","пнд","аўт","срд","чцв","птн","сбт"],dayNamesMin:["Нд","Пн","Аў","Ср","Чц","Пт","Сб"],weekHeader:"Тд",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.be)}),jQuery(function(e){e.datepicker.regional.bg={closeText:"затвори",prevText:"&#x3C;назад",nextText:"напред&#x3E;",nextBigText:"&#x3E;&#x3E;",currentText:"днес",monthNames:["Януари","Февруари","Март","Април","Май","Юни","Юли","Август","Септември","Октомври","Ноември","Декември"],monthNamesShort:["Яну","Фев","Мар","Апр","Май","Юни","Юли","Авг","Сеп","Окт","Нов","Дек"],dayNames:["Неделя","Понеделник","Вторник","Сряда","Четвъртък","Петък","Събота"],dayNamesShort:["Нед","Пон","Вто","Сря","Чет","Пет","Съб"],dayNamesMin:["Не","По","Вт","Ср","Че","Пе","Съ"],weekHeader:"Wk",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.bg)}),jQuery(function(e){e.datepicker.regional.bs={closeText:"Zatvori",prevText:"&#x3C;",nextText:"&#x3E;",currentText:"Danas",monthNames:["Januar","Februar","Mart","April","Maj","Juni","Juli","August","Septembar","Oktobar","Novembar","Decembar"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aug","Sep","Okt","Nov","Dec"],dayNames:["Nedelja","Ponedeljak","Utorak","Srijeda","Četvrtak","Petak","Subota"],dayNamesShort:["Ned","Pon","Uto","Sri","Čet","Pet","Sub"],dayNamesMin:["Ne","Po","Ut","Sr","Če","Pe","Su"],weekHeader:"Wk",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.bs)}),jQuery(function(e){e.datepicker.regional.ca={closeText:"Tanca",prevText:"Anterior",nextText:"Següent",currentText:"Avui",monthNames:["gener","febrer","març","abril","maig","juny","juliol","agost","setembre","octubre","novembre","desembre"],monthNamesShort:["gen","feb","març","abr","maig","juny","jul","ag","set","oct","nov","des"],dayNames:["diumenge","dilluns","dimarts","dimecres","dijous","divendres","dissabte"],dayNamesShort:["dg","dl","dt","dc","dj","dv","ds"],dayNamesMin:["dg","dl","dt","dc","dj","dv","ds"],weekHeader:"Set",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.ca)}),jQuery(function(e){e.datepicker.regional.cs={closeText:"Zavřít",prevText:"&#x3C;Dříve",nextText:"Později&#x3E;",currentText:"Nyní",monthNames:["leden","únor","březen","duben","květen","červen","červenec","srpen","září","říjen","listopad","prosinec"],monthNamesShort:["led","úno","bře","dub","kvě","čer","čvc","srp","zář","říj","lis","pro"],dayNames:["neděle","pondělí","úterý","středa","čtvrtek","pátek","sobota"],dayNamesShort:["ne","po","út","st","čt","pá","so"],dayNamesMin:["ne","po","út","st","čt","pá","so"],weekHeader:"Týd",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.cs)}),jQuery(function(e){e.datepicker.regional["cy-GB"]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["Ionawr","Chwefror","Mawrth","Ebrill","Mai","Mehefin","Gorffennaf","Awst","Medi","Hydref","Tachwedd","Rhagfyr"],monthNamesShort:["Ion","Chw","Maw","Ebr","Mai","Meh","Gor","Aws","Med","Hyd","Tac","Rha"],dayNames:["Dydd Sul","Dydd Llun","Dydd Mawrth","Dydd Mercher","Dydd Iau","Dydd Gwener","Dydd Sadwrn"],dayNamesShort:["Sul","Llu","Maw","Mer","Iau","Gwe","Sad"],dayNamesMin:["Su","Ll","Ma","Me","Ia","Gw","Sa"],weekHeader:"Wy",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional["cy-GB"])}),jQuery(function(e){e.datepicker.regional.da={closeText:"Luk",prevText:"&#x3C;Forrige",nextText:"Næste&#x3E;",currentText:"Idag",monthNames:["Januar","Februar","Marts","April","Maj","Juni","Juli","August","September","Oktober","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aug","Sep","Okt","Nov","Dec"],dayNames:["Søndag","Mandag","Tirsdag","Onsdag","Torsdag","Fredag","Lørdag"],dayNamesShort:["Søn","Man","Tir","Ons","Tor","Fre","Lør"],dayNamesMin:["Sø","Ma","Ti","On","To","Fr","Lø"],weekHeader:"Uge",dateFormat:"dd-mm-yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.da)}),jQuery(function(e){e.datepicker.regional.de={closeText:"Schließen",prevText:"&#x3C;Zurück",nextText:"Vor&#x3E;",currentText:"Heute",monthNames:["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],monthNamesShort:["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],dayNames:["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],dayNamesShort:["So","Mo","Di","Mi","Do","Fr","Sa"],dayNamesMin:["So","Mo","Di","Mi","Do","Fr","Sa"],weekHeader:"KW",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.de)}),jQuery(function(e){e.datepicker.regional.el={closeText:"Κλείσιμο",prevText:"Προηγούμενος",nextText:"Επόμενος",currentText:"Τρέχων Μήνας",monthNames:["Ιανουάριος","Φεβρουάριος","Μάρτιος","Απρίλιος","Μάιος","Ιούνιος","Ιούλιος","Αύγουστος","Σεπτέμβριος","Οκτώβριος","Νοέμβριος","Δεκέμβριος"],monthNamesShort:["Ιαν","Φεβ","Μαρ","Απρ","Μαι","Ιουν","Ιουλ","Αυγ","Σεπ","Οκτ","Νοε","Δεκ"],dayNames:["Κυριακή","Δευτέρα","Τρίτη","Τετάρτη","Πέμπτη","Παρασκευή","Σάββατο"],dayNamesShort:["Κυρ","Δευ","Τρι","Τετ","Πεμ","Παρ","Σαβ"],dayNamesMin:["Κυ","Δε","Τρ","Τε","Πε","Πα","Σα"],weekHeader:"Εβδ",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.el)}),jQuery(function(e){e.datepicker.regional["en-AU"]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional["en-AU"])}),jQuery(function(e){e.datepicker.regional["en-GB"]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional["en-GB"])}),jQuery(function(e){e.datepicker.regional["en-NZ"]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional["en-NZ"])}),jQuery(function(e){e.datepicker.regional.eo={closeText:"Fermi",prevText:"&#x3C;Anta",nextText:"Sekv&#x3E;",currentText:"Nuna",monthNames:["Januaro","Februaro","Marto","Aprilo","Majo","Junio","Julio","Aŭgusto","Septembro","Oktobro","Novembro","Decembro"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aŭg","Sep","Okt","Nov","Dec"],dayNames:["Dimanĉo","Lundo","Mardo","Merkredo","Ĵaŭdo","Vendredo","Sabato"],dayNamesShort:["Dim","Lun","Mar","Mer","Ĵaŭ","Ven","Sab"],dayNamesMin:["Di","Lu","Ma","Me","Ĵa","Ve","Sa"],weekHeader:"Sb",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.eo)}),jQuery(function(e){e.datepicker.regional.es={closeText:"Cerrar",prevText:"&#x3C;Ant",nextText:"Sig&#x3E;",currentText:"Hoy",monthNames:["Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"],monthNamesShort:["Ene","Feb","Mar","Abr","May","Jun","Jul","Ago","Sep","Oct","Nov","Dic"],dayNames:["Domingo","Lunes","Martes","Miércoles","Jueves","Viernes","Sábado"],dayNamesShort:["Dom","Lun","Mar","Mié","Juv","Vie","Sáb"],dayNamesMin:["Do","Lu","Ma","Mi","Ju","Vi","Sá"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.es)}),jQuery(function(e){e.datepicker.regional.et={closeText:"Sulge",prevText:"Eelnev",nextText:"Järgnev",currentText:"Täna",monthNames:["Jaanuar","Veebruar","Märts","Aprill","Mai","Juuni","Juuli","August","September","Oktoober","November","Detsember"],monthNamesShort:["Jaan","Veebr","Märts","Apr","Mai","Juuni","Juuli","Aug","Sept","Okt","Nov","Dets"],dayNames:["Pühapäev","Esmaspäev","Teisipäev","Kolmapäev","Neljapäev","Reede","Laupäev"],dayNamesShort:["Pühap","Esmasp","Teisip","Kolmap","Neljap","Reede","Laup"],dayNamesMin:["P","E","T","K","N","R","L"],weekHeader:"näd",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.et)}),jQuery(function(e){e.datepicker.regional.eu={closeText:"Egina",prevText:"&#x3C;Aur",nextText:"Hur&#x3E;",currentText:"Gaur",monthNames:["urtarrila","otsaila","martxoa","apirila","maiatza","ekaina","uztaila","abuztua","iraila","urria","azaroa","abendua"],monthNamesShort:["urt.","ots.","mar.","api.","mai.","eka.","uzt.","abu.","ira.","urr.","aza.","abe."],dayNames:["igandea","astelehena","asteartea","asteazkena","osteguna","ostirala","larunbata"],dayNamesShort:["ig.","al.","ar.","az.","og.","ol.","lr."],dayNamesMin:["ig","al","ar","az","og","ol","lr"],weekHeader:"As",dateFormat:"yy-mm-dd",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.eu)}),jQuery(function(e){e.datepicker.regional.fa={closeText:"بستن",prevText:"&#x3C;قبلی",nextText:"بعدی&#x3E;",currentText:"امروز",monthNames:["فروردين","ارديبهشت","خرداد","تير","مرداد","شهريور","مهر","آبان","آذر","دی","بهمن","اسفند"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["يکشنبه","دوشنبه","سه‌شنبه","چهارشنبه","پنجشنبه","جمعه","شنبه"],dayNamesShort:["ی","د","س","چ","پ","ج","ش"],dayNamesMin:["ی","د","س","چ","پ","ج","ش"],weekHeader:"هف",dateFormat:"yy/mm/dd",firstDay:6,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.fa)}),jQuery(function(e){e.datepicker.regional.fi={closeText:"Sulje",prevText:"&#xAB;Edellinen",nextText:"Seuraava&#xBB;",currentText:"Tänään",monthNames:["Tammikuu","Helmikuu","Maaliskuu","Huhtikuu","Toukokuu","Kesäkuu","Heinäkuu","Elokuu","Syyskuu","Lokakuu","Marraskuu","Joulukuu"],monthNamesShort:["Tammi","Helmi","Maalis","Huhti","Touko","Kesä","Heinä","Elo","Syys","Loka","Marras","Joulu"],dayNamesShort:["Su","Ma","Ti","Ke","To","Pe","La"],dayNames:["Sunnuntai","Maanantai","Tiistai","Keskiviikko","Torstai","Perjantai","Lauantai"],dayNamesMin:["Su","Ma","Ti","Ke","To","Pe","La"],weekHeader:"Vk",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.fi)}),jQuery(function(e){e.datepicker.regional.fo={closeText:"Lat aftur",prevText:"&#x3C;Fyrra",nextText:"Næsta&#x3E;",currentText:"Í dag",monthNames:["Januar","Februar","Mars","Apríl","Mei","Juni","Juli","August","September","Oktober","November","Desember"],monthNamesShort:["Jan","Feb","Mar","Apr","Mei","Jun","Jul","Aug","Sep","Okt","Nov","Des"],dayNames:["Sunnudagur","Mánadagur","Týsdagur","Mikudagur","Hósdagur","Fríggjadagur","Leyardagur"],dayNamesShort:["Sun","Mán","Týs","Mik","Hós","Frí","Ley"],dayNamesMin:["Su","Má","Tý","Mi","Hó","Fr","Le"],weekHeader:"Vk",dateFormat:"dd-mm-yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.fo)}),jQuery(function(e){e.datepicker.regional["fr-CA"]={closeText:"Fermer",prevText:"Précédent",nextText:"Suivant",currentText:"Aujourd'hui",monthNames:["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],monthNamesShort:["janv.","févr.","mars","avril","mai","juin","juil.","août","sept.","oct.","nov.","déc."],dayNames:["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],dayNamesShort:["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],dayNamesMin:["D","L","M","M","J","V","S"],weekHeader:"Sem.",dateFormat:"yy-mm-dd",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional["fr-CA"])}),jQuery(function(e){e.datepicker.regional["fr-CH"]={closeText:"Fermer",prevText:"&#x3C;Préc",nextText:"Suiv&#x3E;",currentText:"Courant",monthNames:["Janvier","Février","Mars","Avril","Mai","Juin","Juillet","Août","Septembre","Octobre","Novembre","Décembre"],monthNamesShort:["Jan","Fév","Mar","Avr","Mai","Jun","Jul","Aoû","Sep","Oct","Nov","Déc"],dayNames:["Dimanche","Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi"],dayNamesShort:["Dim","Lun","Mar","Mer","Jeu","Ven","Sam"],dayNamesMin:["Di","Lu","Ma","Me","Je","Ve","Sa"],weekHeader:"Sm",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional["fr-CH"])}),jQuery(function(e){e.datepicker.regional.fr={closeText:"Fermer",prevText:"Précédent",nextText:"Suivant",currentText:"Aujourd'hui",monthNames:["Janvier","Février","Mars","Avril","Mai","Juin","Juillet","Août","Septembre","Octobre","Novembre","Décembre"],monthNamesShort:["Janv.","Févr.","Mars","Avril","Mai","Juin","Juil.","Août","Sept.","Oct.","Nov.","Déc."],dayNames:["Dimanche","Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi"],dayNamesShort:["Dim.","Lun.","Mar.","Mer.","Jeu.","Ven.","Sam."],dayNamesMin:["D","L","M","M","J","V","S"],weekHeader:"Sem.",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.fr)}),jQuery(function(e){e.datepicker.regional.gl={closeText:"Pechar",prevText:"&#x3C;Ant",nextText:"Seg&#x3E;",currentText:"Hoxe",monthNames:["Xaneiro","Febreiro","Marzo","Abril","Maio","Xuño","Xullo","Agosto","Setembro","Outubro","Novembro","Decembro"],monthNamesShort:["Xan","Feb","Mar","Abr","Mai","Xuñ","Xul","Ago","Set","Out","Nov","Dec"],dayNames:["Domingo","Luns","Martes","Mércores","Xoves","Venres","Sábado"],dayNamesShort:["Dom","Lun","Mar","Mér","Xov","Ven","Sáb"],dayNamesMin:["Do","Lu","Ma","Mé","Xo","Ve","Sá"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.gl)}),jQuery(function(e){e.datepicker.regional.he={closeText:"סגור",prevText:"&#x3C;הקודם",nextText:"הבא&#x3E;",currentText:"היום",monthNames:["ינואר","פברואר","מרץ","אפריל","מאי","יוני","יולי","אוגוסט","ספטמבר","אוקטובר","נובמבר","דצמבר"],monthNamesShort:["ינו","פבר","מרץ","אפר","מאי","יוני","יולי","אוג","ספט","אוק","נוב","דצמ"],dayNames:["ראשון","שני","שלישי","רביעי","חמישי","שישי","שבת"],dayNamesShort:["א'","ב'","ג'","ד'","ה'","ו'","שבת"],dayNamesMin:["א'","ב'","ג'","ד'","ה'","ו'","שבת"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.he)}),jQuery(function(e){e.datepicker.regional.hi={closeText:"बंद",prevText:"पिछला",nextText:"अगला",currentText:"आज",monthNames:["जनवरी ","फरवरी","मार्च","अप्रेल","मई","जून","जूलाई","अगस्त ","सितम्बर","अक्टूबर","नवम्बर","दिसम्बर"],monthNamesShort:["जन","फर","मार्च","अप्रेल","मई","जून","जूलाई","अग","सित","अक्ट","नव","दि"],dayNames:["रविवार","सोमवार","मंगलवार","बुधवार","गुरुवार","शुक्रवार","शनिवार"],dayNamesShort:["रवि","सोम","मंगल","बुध","गुरु","शुक्र","शनि"],dayNamesMin:["रवि","सोम","मंगल","बुध","गुरु","शुक्र","शनि"],weekHeader:"हफ्ता",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.hi)}),jQuery(function(e){e.datepicker.regional.hr={closeText:"Zatvori",prevText:"&#x3C;",nextText:"&#x3E;",currentText:"Danas",monthNames:["Siječanj","Veljača","Ožujak","Travanj","Svibanj","Lipanj","Srpanj","Kolovoz","Rujan","Listopad","Studeni","Prosinac"],monthNamesShort:["Sij","Velj","Ožu","Tra","Svi","Lip","Srp","Kol","Ruj","Lis","Stu","Pro"],dayNames:["Nedjelja","Ponedjeljak","Utorak","Srijeda","Četvrtak","Petak","Subota"],dayNamesShort:["Ned","Pon","Uto","Sri","Čet","Pet","Sub"],dayNamesMin:["Ne","Po","Ut","Sr","Če","Pe","Su"],weekHeader:"Tje",dateFormat:"dd.mm.yy.",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.hr)}),jQuery(function(e){e.datepicker.regional.hu={closeText:"bezár",prevText:"vissza",nextText:"előre",currentText:"ma",monthNames:["Január","Február","Március","Április","Május","Június","Július","Augusztus","Szeptember","Október","November","December"],monthNamesShort:["Jan","Feb","Már","Ápr","Máj","Jún","Júl","Aug","Szep","Okt","Nov","Dec"],dayNames:["Vasárnap","Hétfő","Kedd","Szerda","Csütörtök","Péntek","Szombat"],dayNamesShort:["Vas","Hét","Ked","Sze","Csü","Pén","Szo"],dayNamesMin:["V","H","K","Sze","Cs","P","Szo"],weekHeader:"Hét",dateFormat:"yy.mm.dd.",firstDay:1,isRTL:!1,showMonthAfterYear:!0,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.hu)}),jQuery(function(e){e.datepicker.regional.hy={closeText:"Փակել",prevText:"&#x3C;Նախ.",nextText:"Հաջ.&#x3E;",currentText:"Այսօր",monthNames:["Հունվար","Փետրվար","Մարտ","Ապրիլ","Մայիս","Հունիս","Հուլիս","Օգոստոս","Սեպտեմբեր","Հոկտեմբեր","Նոյեմբեր","Դեկտեմբեր"],monthNamesShort:["Հունվ","Փետր","Մարտ","Ապր","Մայիս","Հունիս","Հուլ","Օգս","Սեպ","Հոկ","Նոյ","Դեկ"],dayNames:["կիրակի","եկուշաբթի","երեքշաբթի","չորեքշաբթի","հինգշաբթի","ուրբաթ","շաբաթ"],dayNamesShort:["կիր","երկ","երք","չրք","հնգ","ուրբ","շբթ"],dayNamesMin:["կիր","երկ","երք","չրք","հնգ","ուրբ","շբթ"],weekHeader:"ՇԲՏ",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.hy)}),jQuery(function(e){e.datepicker.regional.id={closeText:"Tutup",prevText:"&#x3C;mundur",nextText:"maju&#x3E;",currentText:"hari ini",monthNames:["Januari","Februari","Maret","April","Mei","Juni","Juli","Agustus","September","Oktober","Nopember","Desember"],monthNamesShort:["Jan","Feb","Mar","Apr","Mei","Jun","Jul","Agus","Sep","Okt","Nop","Des"],dayNames:["Minggu","Senin","Selasa","Rabu","Kamis","Jumat","Sabtu"],dayNamesShort:["Min","Sen","Sel","Rab","kam","Jum","Sab"],dayNamesMin:["Mg","Sn","Sl","Rb","Km","jm","Sb"],weekHeader:"Mg",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.id)}),jQuery(function(e){e.datepicker.regional.is={closeText:"Loka",prevText:"&#x3C; Fyrri",nextText:"Næsti &#x3E;",currentText:"Í dag",monthNames:["Janúar","Febrúar","Mars","Apríl","Maí","Júní","Júlí","Ágúst","September","Október","Nóvember","Desember"],monthNamesShort:["Jan","Feb","Mar","Apr","Maí","Jún","Júl","Ágú","Sep","Okt","Nóv","Des"],dayNames:["Sunnudagur","Mánudagur","Þriðjudagur","Miðvikudagur","Fimmtudagur","Föstudagur","Laugardagur"],dayNamesShort:["Sun","Mán","Þri","Mið","Fim","Fös","Lau"],dayNamesMin:["Su","Má","Þr","Mi","Fi","Fö","La"],weekHeader:"Vika",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.is)}),jQuery(function(e){e.datepicker.regional.it={closeText:"Chiudi",prevText:"&#x3C;Prec",nextText:"Succ&#x3E;",currentText:"Oggi",monthNames:["Gennaio","Febbraio","Marzo","Aprile","Maggio","Giugno","Luglio","Agosto","Settembre","Ottobre","Novembre","Dicembre"],monthNamesShort:["Gen","Feb","Mar","Apr","Mag","Giu","Lug","Ago","Set","Ott","Nov","Dic"],dayNames:["Domenica","Lunedì","Martedì","Mercoledì","Giovedì","Venerdì","Sabato"],dayNamesShort:["Dom","Lun","Mar","Mer","Gio","Ven","Sab"],dayNamesMin:["Do","Lu","Ma","Me","Gi","Ve","Sa"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.it)}),jQuery(function(e){e.datepicker.regional.ja={closeText:"閉じる",prevText:"&#x3C;前",nextText:"次&#x3E;",currentText:"今日",monthNames:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],monthNamesShort:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],dayNames:["日曜日","月曜日","火曜日","水曜日","木曜日","金曜日","土曜日"],dayNamesShort:["日","月","火","水","木","金","土"],dayNamesMin:["日","月","火","水","木","金","土"],weekHeader:"週",dateFormat:"yy/mm/dd",firstDay:0,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"年"},e.datepicker.setDefaults(e.datepicker.regional.ja)}),jQuery(function(e){e.datepicker.regional.ka={closeText:"დახურვა",prevText:"&#x3c; წინა",nextText:"შემდეგი &#x3e;",currentText:"დღეს",monthNames:["იანვარი","თებერვალი","მარტი","აპრილი","მაისი","ივნისი","ივლისი","აგვისტო","სექტემბერი","ოქტომბერი","ნოემბერი","დეკემბერი"],monthNamesShort:["იან","თებ","მარ","აპრ","მაი","ივნ","ივლ","აგვ","სექ","ოქტ","ნოე","დეკ"],dayNames:["კვირა","ორშაბათი","სამშაბათი","ოთხშაბათი","ხუთშაბათი","პარასკევი","შაბათი"],dayNamesShort:["კვ","ორშ","სამ","ოთხ","ხუთ","პარ","შაბ"],dayNamesMin:["კვ","ორშ","სამ","ოთხ","ხუთ","პარ","შაბ"],weekHeader:"კვირა",dateFormat:"dd-mm-yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.ka)}),jQuery(function(e){e.datepicker.regional.kk={closeText:"Жабу",prevText:"&#x3C;Алдыңғы",nextText:"Келесі&#x3E;",currentText:"Бүгін",monthNames:["Қаңтар","Ақпан","Наурыз","Сәуір","Мамыр","Маусым","Шілде","Тамыз","Қыркүйек","Қазан","Қараша","Желтоқсан"],monthNamesShort:["Қаң","Ақп","Нау","Сәу","Мам","Мау","Шіл","Там","Қыр","Қаз","Қар","Жел"],dayNames:["Жексенбі","Дүйсенбі","Сейсенбі","Сәрсенбі","Бейсенбі","Жұма","Сенбі"],dayNamesShort:["жкс","дсн","ссн","срс","бсн","жма","снб"],dayNamesMin:["Жк","Дс","Сс","Ср","Бс","Жм","Сн"],weekHeader:"Не",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.kk)}),jQuery(function(e){e.datepicker.regional.km={closeText:"ធ្វើ​រួច",prevText:"មុន",nextText:"បន្ទាប់",currentText:"ថ្ងៃ​នេះ",monthNames:["មករា","កុម្ភៈ","មីនា","មេសា","ឧសភា","មិថុនា","កក្កដា","សីហា","កញ្ញា","តុលា","វិច្ឆិកា","ធ្នូ"],monthNamesShort:["មករា","កុម្ភៈ","មីនា","មេសា","ឧសភា","មិថុនា","កក្កដា","សីហា","កញ្ញា","តុលា","វិច្ឆិកា","ធ្នូ"],dayNames:["អាទិត្យ","ចន្ទ","អង្គារ","ពុធ","ព្រហស្បតិ៍","សុក្រ","សៅរ៍"],dayNamesShort:["អា","ច","អ","ពុ","ព្រហ","សុ","សៅ"],dayNamesMin:["អា","ច","អ","ពុ","ព្រហ","សុ","សៅ"],weekHeader:"សប្ដាហ៍",dateFormat:"dd-mm-yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.km)}),jQuery(function(e){e.datepicker.regional.ko={closeText:"닫기",prevText:"이전달",nextText:"다음달",currentText:"오늘",monthNames:["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],monthNamesShort:["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],dayNames:["일요일","월요일","화요일","수요일","목요일","금요일","토요일"],dayNamesShort:["일","월","화","수","목","금","토"],dayNamesMin:["일","월","화","수","목","금","토"],weekHeader:"Wk",dateFormat:"yy-mm-dd",firstDay:0,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"년"},e.datepicker.setDefaults(e.datepicker.regional.ko)}),jQuery(function(e){e.datepicker.regional.ky={closeText:"Жабуу",prevText:"&#x3c;Мур",nextText:"Кий&#x3e;",currentText:"Бүгүн",monthNames:["Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь"],monthNamesShort:["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек"],dayNames:["жекшемби","дүйшөмбү","шейшемби","шаршемби","бейшемби","жума","ишемби"],dayNamesShort:["жек","дүй","шей","шар","бей","жум","ише"],dayNamesMin:["Жк","Дш","Шш","Шр","Бш","Жм","Иш"],weekHeader:"Жум",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.ky)}),jQuery(function(e){e.datepicker.regional.lb={closeText:"Fäerdeg",prevText:"Zréck",nextText:"Weider",currentText:"Haut",monthNames:["Januar","Februar","Mäerz","Abrëll","Mee","Juni","Juli","August","September","Oktober","November","Dezember"],monthNamesShort:["Jan","Feb","Mäe","Abr","Mee","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],dayNames:["Sonndeg","Méindeg","Dënschdeg","Mëttwoch","Donneschdeg","Freideg","Samschdeg"],dayNamesShort:["Son","Méi","Dën","Mët","Don","Fre","Sam"],dayNamesMin:["So","Mé","Dë","Më","Do","Fr","Sa"],weekHeader:"W",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.lb)}),jQuery(function(e){e.datepicker.regional.lt={closeText:"Uždaryti",prevText:"&#x3C;Atgal",nextText:"Pirmyn&#x3E;",currentText:"Šiandien",monthNames:["Sausis","Vasaris","Kovas","Balandis","Gegužė","Birželis","Liepa","Rugpjūtis","Rugsėjis","Spalis","Lapkritis","Gruodis"],monthNamesShort:["Sau","Vas","Kov","Bal","Geg","Bir","Lie","Rugp","Rugs","Spa","Lap","Gru"],dayNames:["sekmadienis","pirmadienis","antradienis","trečiadienis","ketvirtadienis","penktadienis","šeštadienis"],dayNamesShort:["sek","pir","ant","tre","ket","pen","šeš"],dayNamesMin:["Se","Pr","An","Tr","Ke","Pe","Še"],weekHeader:"Wk",dateFormat:"yy-mm-dd",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.lt)}),jQuery(function(e){e.datepicker.regional.lv={closeText:"Aizvērt",prevText:"Iepr",nextText:"Nāka",currentText:"Šodien",monthNames:["Janvāris","Februāris","Marts","Aprīlis","Maijs","Jūnijs","Jūlijs","Augusts","Septembris","Oktobris","Novembris","Decembris"],monthNamesShort:["Jan","Feb","Mar","Apr","Mai","Jūn","Jūl","Aug","Sep","Okt","Nov","Dec"],dayNames:["svētdiena","pirmdiena","otrdiena","trešdiena","ceturtdiena","piektdiena","sestdiena"],dayNamesShort:["svt","prm","otr","tre","ctr","pkt","sst"],dayNamesMin:["Sv","Pr","Ot","Tr","Ct","Pk","Ss"],weekHeader:"Nav",dateFormat:"dd-mm-yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.lv)}),jQuery(function(e){e.datepicker.regional.mk={closeText:"Затвори",prevText:"&#x3C;",nextText:"&#x3E;",currentText:"Денес",monthNames:["Јануари","Февруари","Март","Април","Мај","Јуни","Јули","Август","Септември","Октомври","Ноември","Декември"],monthNamesShort:["Јан","Фев","Мар","Апр","Мај","Јун","Јул","Авг","Сеп","Окт","Ное","Дек"],dayNames:["Недела","Понеделник","Вторник","Среда","Четврток","Петок","Сабота"],dayNamesShort:["Нед","Пон","Вто","Сре","Чет","Пет","Саб"],dayNamesMin:["Не","По","Вт","Ср","Че","Пе","Са"],weekHeader:"Сед",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.mk)}),jQuery(function(e){e.datepicker.regional.ml={closeText:"ശരി",prevText:"മുന്നത്തെ",nextText:"അടുത്തത് ",currentText:"ഇന്ന്",monthNames:["ജനുവരി","ഫെബ്രുവരി","മാര്‍ച്ച്","ഏപ്രില്‍","മേയ്","ജൂണ്‍","ജൂലൈ","ആഗസ്റ്റ്","സെപ്റ്റംബര്‍","ഒക്ടോബര്‍","നവംബര്‍","ഡിസംബര്‍"],monthNamesShort:["ജനു","ഫെബ്","മാര്‍","ഏപ്രി","മേയ്","ജൂണ്‍","ജൂലാ","ആഗ","സെപ്","ഒക്ടോ","നവം","ഡിസ"],dayNames:["ഞായര്‍","തിങ്കള്‍","ചൊവ്വ","ബുധന്‍","വ്യാഴം","വെള്ളി","ശനി"],dayNamesShort:["ഞായ","തിങ്ക","ചൊവ്വ","ബുധ","വ്യാഴം","വെള്ളി","ശനി"],dayNamesMin:["ഞാ","തി","ചൊ","ബു","വ്യാ","വെ","ശ"],weekHeader:"ആ",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.ml)}),jQuery(function(e){e.datepicker.regional.ms={closeText:"Tutup",prevText:"&#x3C;Sebelum",nextText:"Selepas&#x3E;",currentText:"hari ini",monthNames:["Januari","Februari","Mac","April","Mei","Jun","Julai","Ogos","September","Oktober","November","Disember"],monthNamesShort:["Jan","Feb","Mac","Apr","Mei","Jun","Jul","Ogo","Sep","Okt","Nov","Dis"],dayNames:["Ahad","Isnin","Selasa","Rabu","Khamis","Jumaat","Sabtu"],dayNamesShort:["Aha","Isn","Sel","Rab","kha","Jum","Sab"],dayNamesMin:["Ah","Is","Se","Ra","Kh","Ju","Sa"],weekHeader:"Mg",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.ms)}),jQuery(function(e){e.datepicker.regional.nb={closeText:"Lukk",prevText:"&#xAB;Forrige",nextText:"Neste&#xBB;",currentText:"I dag",monthNames:["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember"],monthNamesShort:["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des"],dayNamesShort:["søn","man","tir","ons","tor","fre","lør"],dayNames:["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],dayNamesMin:["sø","ma","ti","on","to","fr","lø"],weekHeader:"Uke",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.nb)
+}),jQuery(function(e){e.datepicker.regional["nl-BE"]={closeText:"Sluiten",prevText:"←",nextText:"→",currentText:"Vandaag",monthNames:["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"],monthNamesShort:["jan","feb","mrt","apr","mei","jun","jul","aug","sep","okt","nov","dec"],dayNames:["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],dayNamesShort:["zon","maa","din","woe","don","vri","zat"],dayNamesMin:["zo","ma","di","wo","do","vr","za"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional["nl-BE"])}),jQuery(function(e){e.datepicker.regional.nl={closeText:"Sluiten",prevText:"←",nextText:"→",currentText:"Vandaag",monthNames:["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"],monthNamesShort:["jan","feb","mrt","apr","mei","jun","jul","aug","sep","okt","nov","dec"],dayNames:["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],dayNamesShort:["zon","maa","din","woe","don","vri","zat"],dayNamesMin:["zo","ma","di","wo","do","vr","za"],weekHeader:"Wk",dateFormat:"dd-mm-yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.nl)}),jQuery(function(e){e.datepicker.regional.nn={closeText:"Lukk",prevText:"&#xAB;Førre",nextText:"Neste&#xBB;",currentText:"I dag",monthNames:["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember"],monthNamesShort:["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des"],dayNamesShort:["sun","mån","tys","ons","tor","fre","lau"],dayNames:["sundag","måndag","tysdag","onsdag","torsdag","fredag","laurdag"],dayNamesMin:["su","må","ty","on","to","fr","la"],weekHeader:"Veke",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.nn)}),jQuery(function(e){e.datepicker.regional.no={closeText:"Lukk",prevText:"&#xAB;Forrige",nextText:"Neste&#xBB;",currentText:"I dag",monthNames:["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember"],monthNamesShort:["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des"],dayNamesShort:["søn","man","tir","ons","tor","fre","lør"],dayNames:["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],dayNamesMin:["sø","ma","ti","on","to","fr","lø"],weekHeader:"Uke",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.no)}),jQuery(function(e){e.datepicker.regional.pl={closeText:"Zamknij",prevText:"&#x3C;Poprzedni",nextText:"Następny&#x3E;",currentText:"Dziś",monthNames:["Styczeń","Luty","Marzec","Kwiecień","Maj","Czerwiec","Lipiec","Sierpień","Wrzesień","Październik","Listopad","Grudzień"],monthNamesShort:["Sty","Lu","Mar","Kw","Maj","Cze","Lip","Sie","Wrz","Pa","Lis","Gru"],dayNames:["Niedziela","Poniedziałek","Wtorek","Środa","Czwartek","Piątek","Sobota"],dayNamesShort:["Nie","Pn","Wt","Śr","Czw","Pt","So"],dayNamesMin:["N","Pn","Wt","Śr","Cz","Pt","So"],weekHeader:"Tydz",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.pl)}),jQuery(function(e){e.datepicker.regional["pt-BR"]={closeText:"Fechar",prevText:"&#x3C;Anterior",nextText:"Próximo&#x3E;",currentText:"Hoje",monthNames:["Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],monthNamesShort:["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"],dayNames:["Domingo","Segunda-feira","Terça-feira","Quarta-feira","Quinta-feira","Sexta-feira","Sábado"],dayNamesShort:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],dayNamesMin:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional["pt-BR"])}),jQuery(function(e){e.datepicker.regional.pt={closeText:"Fechar",prevText:"&#x3C;Anterior",nextText:"Seguinte",currentText:"Hoje",monthNames:["Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],monthNamesShort:["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"],dayNames:["Domingo","Segunda-feira","Terça-feira","Quarta-feira","Quinta-feira","Sexta-feira","Sábado"],dayNamesShort:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],dayNamesMin:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],weekHeader:"Sem",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.pt)}),jQuery(function(e){e.datepicker.regional.rm={closeText:"Serrar",prevText:"&#x3C;Suandant",nextText:"Precedent&#x3E;",currentText:"Actual",monthNames:["Schaner","Favrer","Mars","Avrigl","Matg","Zercladur","Fanadur","Avust","Settember","October","November","December"],monthNamesShort:["Scha","Fev","Mar","Avr","Matg","Zer","Fan","Avu","Sett","Oct","Nov","Dec"],dayNames:["Dumengia","Glindesdi","Mardi","Mesemna","Gievgia","Venderdi","Sonda"],dayNamesShort:["Dum","Gli","Mar","Mes","Gie","Ven","Som"],dayNamesMin:["Du","Gl","Ma","Me","Gi","Ve","So"],weekHeader:"emna",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.rm)}),jQuery(function(e){e.datepicker.regional.ro={closeText:"Închide",prevText:"&#xAB; Luna precedentă",nextText:"Luna următoare &#xBB;",currentText:"Azi",monthNames:["Ianuarie","Februarie","Martie","Aprilie","Mai","Iunie","Iulie","August","Septembrie","Octombrie","Noiembrie","Decembrie"],monthNamesShort:["Ian","Feb","Mar","Apr","Mai","Iun","Iul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Duminică","Luni","Marţi","Miercuri","Joi","Vineri","Sâmbătă"],dayNamesShort:["Dum","Lun","Mar","Mie","Joi","Vin","Sâm"],dayNamesMin:["Du","Lu","Ma","Mi","Jo","Vi","Sâ"],weekHeader:"Săpt",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.ro)}),jQuery(function(e){e.datepicker.regional.ru={closeText:"Закрыть",prevText:"&#x3C;Пред",nextText:"След&#x3E;",currentText:"Сегодня",monthNames:["Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь"],monthNamesShort:["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек"],dayNames:["воскресенье","понедельник","вторник","среда","четверг","пятница","суббота"],dayNamesShort:["вск","пнд","втр","срд","чтв","птн","сбт"],dayNamesMin:["Вс","Пн","Вт","Ср","Чт","Пт","Сб"],weekHeader:"Нед",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.ru)}),jQuery(function(e){e.datepicker.regional.sk={closeText:"Zavrieť",prevText:"&#x3C;Predchádzajúci",nextText:"Nasledujúci&#x3E;",currentText:"Dnes",monthNames:["január","február","marec","apríl","máj","jún","júl","august","september","október","november","december"],monthNamesShort:["Jan","Feb","Mar","Apr","Máj","Jún","Júl","Aug","Sep","Okt","Nov","Dec"],dayNames:["nedeľa","pondelok","utorok","streda","štvrtok","piatok","sobota"],dayNamesShort:["Ned","Pon","Uto","Str","Štv","Pia","Sob"],dayNamesMin:["Ne","Po","Ut","St","Št","Pia","So"],weekHeader:"Ty",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.sk)}),jQuery(function(e){e.datepicker.regional.sl={closeText:"Zapri",prevText:"&#x3C;Prejšnji",nextText:"Naslednji&#x3E;",currentText:"Trenutni",monthNames:["Januar","Februar","Marec","April","Maj","Junij","Julij","Avgust","September","Oktober","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Avg","Sep","Okt","Nov","Dec"],dayNames:["Nedelja","Ponedeljek","Torek","Sreda","Četrtek","Petek","Sobota"],dayNamesShort:["Ned","Pon","Tor","Sre","Čet","Pet","Sob"],dayNamesMin:["Ne","Po","To","Sr","Če","Pe","So"],weekHeader:"Teden",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.sl)}),jQuery(function(e){e.datepicker.regional.sq={closeText:"mbylle",prevText:"&#x3C;mbrapa",nextText:"Përpara&#x3E;",currentText:"sot",monthNames:["Janar","Shkurt","Mars","Prill","Maj","Qershor","Korrik","Gusht","Shtator","Tetor","Nëntor","Dhjetor"],monthNamesShort:["Jan","Shk","Mar","Pri","Maj","Qer","Kor","Gus","Sht","Tet","Nën","Dhj"],dayNames:["E Diel","E Hënë","E Martë","E Mërkurë","E Enjte","E Premte","E Shtune"],dayNamesShort:["Di","Hë","Ma","Më","En","Pr","Sh"],dayNamesMin:["Di","Hë","Ma","Më","En","Pr","Sh"],weekHeader:"Ja",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.sq)}),jQuery(function(e){e.datepicker.regional["sr-SR"]={closeText:"Zatvori",prevText:"&#x3C;",nextText:"&#x3E;",currentText:"Danas",monthNames:["Januar","Februar","Mart","April","Maj","Jun","Jul","Avgust","Septembar","Oktobar","Novembar","Decembar"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Avg","Sep","Okt","Nov","Dec"],dayNames:["Nedelja","Ponedeljak","Utorak","Sreda","Četvrtak","Petak","Subota"],dayNamesShort:["Ned","Pon","Uto","Sre","Čet","Pet","Sub"],dayNamesMin:["Ne","Po","Ut","Sr","Če","Pe","Su"],weekHeader:"Sed",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional["sr-SR"])}),jQuery(function(e){e.datepicker.regional.sr={closeText:"Затвори",prevText:"&#x3C;",nextText:"&#x3E;",currentText:"Данас",monthNames:["Јануар","Фебруар","Март","Април","Мај","Јун","Јул","Август","Септембар","Октобар","Новембар","Децембар"],monthNamesShort:["Јан","Феб","Мар","Апр","Мај","Јун","Јул","Авг","Сеп","Окт","Нов","Дец"],dayNames:["Недеља","Понедељак","Уторак","Среда","Четвртак","Петак","Субота"],dayNamesShort:["Нед","Пон","Уто","Сре","Чет","Пет","Суб"],dayNamesMin:["Не","По","Ут","Ср","Че","Пе","Су"],weekHeader:"Сед",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.sr)}),jQuery(function(e){e.datepicker.regional.sv={closeText:"Stäng",prevText:"&#xAB;Förra",nextText:"Nästa&#xBB;",currentText:"Idag",monthNames:["Januari","Februari","Mars","April","Maj","Juni","Juli","Augusti","September","Oktober","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aug","Sep","Okt","Nov","Dec"],dayNamesShort:["Sön","Mån","Tis","Ons","Tor","Fre","Lör"],dayNames:["Söndag","Måndag","Tisdag","Onsdag","Torsdag","Fredag","Lördag"],dayNamesMin:["Sö","Må","Ti","On","To","Fr","Lö"],weekHeader:"Ve",dateFormat:"yy-mm-dd",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.sv)}),jQuery(function(e){e.datepicker.regional.ta={closeText:"மூடு",prevText:"முன்னையது",nextText:"அடுத்தது",currentText:"இன்று",monthNames:["தை","மாசி","பங்குனி","சித்திரை","வைகாசி","ஆனி","ஆடி","ஆவணி","புரட்டாசி","ஐப்பசி","கார்த்திகை","மார்கழி"],monthNamesShort:["தை","மாசி","பங்","சித்","வைகா","ஆனி","ஆடி","ஆவ","புர","ஐப்","கார்","மார்"],dayNames:["ஞாயிற்றுக்கிழமை","திங்கட்கிழமை","செவ்வாய்க்கிழமை","புதன்கிழமை","வியாழக்கிழமை","வெள்ளிக்கிழமை","சனிக்கிழமை"],dayNamesShort:["ஞாயிறு","திங்கள்","செவ்வாய்","புதன்","வியாழன்","வெள்ளி","சனி"],dayNamesMin:["ஞா","தி","செ","பு","வி","வெ","ச"],weekHeader:"Не",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.ta)}),jQuery(function(e){e.datepicker.regional.th={closeText:"ปิด",prevText:"&#xAB;&#xA0;ย้อน",nextText:"ถัดไป&#xA0;&#xBB;",currentText:"วันนี้",monthNames:["มกราคม","กุมภาพันธ์","มีนาคม","เมษายน","พฤษภาคม","มิถุนายน","กรกฎาคม","สิงหาคม","กันยายน","ตุลาคม","พฤศจิกายน","ธันวาคม"],monthNamesShort:["ม.ค.","ก.พ.","มี.ค.","เม.ย.","พ.ค.","มิ.ย.","ก.ค.","ส.ค.","ก.ย.","ต.ค.","พ.ย.","ธ.ค."],dayNames:["อาทิตย์","จันทร์","อังคาร","พุธ","พฤหัสบดี","ศุกร์","เสาร์"],dayNamesShort:["อา.","จ.","อ.","พ.","พฤ.","ศ.","ส."],dayNamesMin:["อา.","จ.","อ.","พ.","พฤ.","ศ.","ส."],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.th)}),jQuery(function(e){e.datepicker.regional.tj={closeText:"Идома",prevText:"&#x3c;Қафо",nextText:"Пеш&#x3e;",currentText:"Имрӯз",monthNames:["Январ","Феврал","Март","Апрел","Май","Июн","Июл","Август","Сентябр","Октябр","Ноябр","Декабр"],monthNamesShort:["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек"],dayNames:["якшанбе","душанбе","сешанбе","чоршанбе","панҷшанбе","ҷумъа","шанбе"],dayNamesShort:["якш","душ","сеш","чор","пан","ҷум","шан"],dayNamesMin:["Як","Дш","Сш","Чш","Пш","Ҷм","Шн"],weekHeader:"Хф",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.tj)}),jQuery(function(e){e.datepicker.regional.tr={closeText:"kapat",prevText:"&#x3C;geri",nextText:"ileri&#x3e",currentText:"bugün",monthNames:["Ocak","Şubat","Mart","Nisan","Mayıs","Haziran","Temmuz","Ağustos","Eylül","Ekim","Kasım","Aralık"],monthNamesShort:["Oca","Şub","Mar","Nis","May","Haz","Tem","Ağu","Eyl","Eki","Kas","Ara"],dayNames:["Pazar","Pazartesi","Salı","Çarşamba","Perşembe","Cuma","Cumartesi"],dayNamesShort:["Pz","Pt","Sa","Ça","Pe","Cu","Ct"],dayNamesMin:["Pz","Pt","Sa","Ça","Pe","Cu","Ct"],weekHeader:"Hf",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.tr)}),jQuery(function(e){e.datepicker.regional.uk={closeText:"Закрити",prevText:"&#x3C;",nextText:"&#x3E;",currentText:"Сьогодні",monthNames:["Січень","Лютий","Березень","Квітень","Травень","Червень","Липень","Серпень","Вересень","Жовтень","Листопад","Грудень"],monthNamesShort:["Січ","Лют","Бер","Кві","Тра","Чер","Лип","Сер","Вер","Жов","Лис","Гру"],dayNames:["неділя","понеділок","вівторок","середа","четвер","п’ятниця","субота"],dayNamesShort:["нед","пнд","вів","срд","чтв","птн","сбт"],dayNamesMin:["Нд","Пн","Вт","Ср","Чт","Пт","Сб"],weekHeader:"Тиж",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.uk)}),jQuery(function(e){e.datepicker.regional.vi={closeText:"Đóng",prevText:"&#x3C;Trước",nextText:"Tiếp&#x3E;",currentText:"Hôm nay",monthNames:["Tháng Một","Tháng Hai","Tháng Ba","Tháng Tư","Tháng Năm","Tháng Sáu","Tháng Bảy","Tháng Tám","Tháng Chín","Tháng Mười","Tháng Mười Một","Tháng Mười Hai"],monthNamesShort:["Tháng 1","Tháng 2","Tháng 3","Tháng 4","Tháng 5","Tháng 6","Tháng 7","Tháng 8","Tháng 9","Tháng 10","Tháng 11","Tháng 12"],dayNames:["Chủ Nhật","Thứ Hai","Thứ Ba","Thứ Tư","Thứ Năm","Thứ Sáu","Thứ Bảy"],dayNamesShort:["CN","T2","T3","T4","T5","T6","T7"],dayNamesMin:["CN","T2","T3","T4","T5","T6","T7"],weekHeader:"Tu",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.vi)}),jQuery(function(e){e.datepicker.regional["zh-CN"]={closeText:"关闭",prevText:"&#x3C;上月",nextText:"下月&#x3E;",currentText:"今天",monthNames:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],monthNamesShort:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],dayNames:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],dayNamesShort:["周日","周一","周二","周三","周四","周五","周六"],dayNamesMin:["日","一","二","三","四","五","六"],weekHeader:"周",dateFormat:"yy-mm-dd",firstDay:1,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"年"},e.datepicker.setDefaults(e.datepicker.regional["zh-CN"])}),jQuery(function(e){e.datepicker.regional["zh-HK"]={closeText:"關閉",prevText:"&#x3C;上月",nextText:"下月&#x3E;",currentText:"今天",monthNames:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],monthNamesShort:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],dayNames:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],dayNamesShort:["周日","周一","周二","周三","周四","周五","周六"],dayNamesMin:["日","一","二","三","四","五","六"],weekHeader:"周",dateFormat:"dd-mm-yy",firstDay:0,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"年"},e.datepicker.setDefaults(e.datepicker.regional["zh-HK"])}),jQuery(function(e){e.datepicker.regional["zh-TW"]={closeText:"關閉",prevText:"&#x3C;上月",nextText:"下月&#x3E;",currentText:"今天",monthNames:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],monthNamesShort:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],dayNames:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],dayNamesShort:["周日","周一","周二","周三","周四","周五","周六"],dayNamesMin:["日","一","二","三","四","五","六"],weekHeader:"周",dateFormat:"yy/mm/dd",firstDay:1,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"年"},e.datepicker.setDefaults(e.datepicker.regional["zh-TW"])});
\ No newline at end of file
--- a/server/src/test/java/org/iri_research/renkan/test/repositories/ProjectsRepositoryTest.java	Tue May 14 14:10:23 2013 +0200
+++ b/server/src/test/java/org/iri_research/renkan/test/repositories/ProjectsRepositoryTest.java	Tue Apr 23 16:54:18 2013 +0200
@@ -13,11 +13,14 @@
 import org.iri_research.renkan.models.Project;
 import org.iri_research.renkan.models.ProjectRevision;
 import org.iri_research.renkan.models.Space;
+import org.iri_research.renkan.models.User;
 import org.iri_research.renkan.repositories.EdgesRepository;
 import org.iri_research.renkan.repositories.NodesRepository;
 import org.iri_research.renkan.repositories.ProjectRevisionsRepository;
 import org.iri_research.renkan.repositories.ProjectsRepository;
 import org.iri_research.renkan.repositories.SpacesRepository;
+import org.iri_research.renkan.repositories.UsersRepository;
+import org.iri_research.renkan.utils.ColorGenerator;
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
@@ -61,18 +64,22 @@
 	private EdgesRepository edgesRepository;
 	
 	@Autowired
+	private UsersRepository usersRepository;
+	
+	@Autowired
 	private ProjectRevisionsRepository projectRevisionsRepository;
 	
 	@Autowired
 	private MongoTemplate mongoTemplate;
 	
 	private ArrayList<Project> testProjects = new ArrayList<Project>();
-	private List<Node> testNodes = new ArrayList<Node>();
+	private List<Node> testNodes = new ArrayList<>();
 	private List<Edge> testEdges = new ArrayList<>();
+	private List<User> testUsers = new ArrayList<>();
 	
 	private Date creationDate = new Date();
 	
-	private List<String> spaceIds = new ArrayList<>(); 
+	private List<String> spaceIds = new ArrayList<>();	
 	
 	private Project copyProject;
 	
@@ -83,19 +90,36 @@
 	public void setup() {
 
 		logger.debug("Setup");
+		
+		// CREATE USERS
+		for(int i=0; i<SPACE_NB; i++) {
+			this.testUsers.add(new User(UUID.randomUUID().toString(), "test_user"+(i+1), "Test user " + (i+1), "http://www.iri.centrepompidou.fr/users/test_user"+(i+1), "#"+ColorGenerator.randomColorHex()));
+		}
+		usersRepository.save(this.testUsers);
+		
+		
 		ArrayList<Project> pl = new ArrayList<Project>();
 		Space testSpace = null;
 		for(int i=0; i<SPACE_NB; i++) {
 			spaceIds.add(UUID.randomUUID().toString());
 			testSpace = new Space(this.spaceIds.get(i), "test space " + i, "Test space " + i, null, null, null, "test_user", null, this.creationDate);
 			testSpace = spacesRepository.save(testSpace);
-			for(int j=0; j<SPACE_NB-1-i; j++) {
-				pl.add(new Project(testSpace.getId(), UUID.randomUUID().toString(), "test project "+((SPACE_NB-1)*i+j+1), "desc"+((SPACE_NB-1)*i+j+1), "http://localhost:8080/rest/projects/id"+((SPACE_NB-1)*i+j+1), this.creationDate));
+			for(int j=0; j<SPACE_NB-1-i; j++) {				
+				final Project project = new Project(testSpace.getId(), UUID.randomUUID().toString(), "test project "+((SPACE_NB-1)*i+j+1), "desc"+((SPACE_NB-1)*i+j+1), "http://localhost:8080/rest/projects/id"+((SPACE_NB-1)*i+j+1), this.creationDate);
+				pl.add(project);
+				for(int k=0; k<SPACE_NB-j; k++) {
+					project.addUser(this.testUsers.get(k));
+				}
+				for(int k=SPACE_NB-j; k<SPACE_NB; k++) {
+					project.addUser(null,null);
+				}
 			}
 		}
+		
 		for(Project p: projectsRepository.save(pl)) {
 			this.testProjects.add(p);
 		}
+		
 		copyProject = this.testProjects.get(0);
 		
 		for(int i=0;i<3;i++) {
@@ -103,15 +127,14 @@
 			node = this.nodesRepository.save(node);
 			copyProject.getNodes().add(node);
 			this.testNodes.add(node);
-		}
-		
+		}		
 		for(int i=0;i<3;i++) {
 			Edge edge = new Edge("Node"+i, "Node"+i, "Node "+i, "http://renkan.org/edges/edge"+i, "#ffff0"+i, this.testNodes.get((i+2)%3), this.testNodes.get(i), "test_user", copyProject.getId());
 			edge = this.edgesRepository.save(edge);
 			copyProject.getEdges().add(edge);
 			this.testEdges.add(edge);
 		}
-		
+				
 		this.projectsRepository.save(copyProject);
 
 	}
@@ -124,6 +147,7 @@
 		projectRevisionsRepository.deleteAll();
 		projectsRepository.deleteAll();
 		spacesRepository.deleteAll();
+		usersRepository.deleteAll();
 	}
 	
 	@Test
@@ -226,6 +250,43 @@
 			Assert.assertNull("other space id has no project i.e count is null", groupRes.get(this.spaceIds.get(i)));
 		}
 	}
+
+	@Test
+	public void testGetCountByUser() {
+		
+		Map<String, Integer> groupRes = projectsRepository.getCountByUser();
+		
+		Assert.assertNotNull("GroupRes not null", groupRes);
+		Assert.assertEquals("Group res size", testProjects.size()+1, groupRes.size());
+		
+		for(int i=0;i<testProjects.size()+1;i++) {
+			Integer count = groupRes.get(this.testProjects.get(i).getId());
+			Assert.assertNotNull("count not null", count);
+			Assert.assertEquals("Nb of user/project", testProjects.size()-i, count.intValue());
+		}
+		
+		//Assert.assertNull("Last space id has no project i.e count is null", groupRes.get(this.spaceIds.get(SPACE_NB-1)));		
+	}
+	
+	@Test
+	public void testGetCountByUserFilter() {
+		
+		List<String> spacesIdsFilter = Arrays.asList(this.spaceIds.get(0));
+		
+		Map<String, Integer> groupRes = projectsRepository.getCountBySpace(spacesIdsFilter);
+		
+		Assert.assertNotNull("GroupRes not null", groupRes);
+		Assert.assertEquals("Group res size", 1, groupRes.size());
+		
+		Integer count = groupRes.get(this.spaceIds.get(0));
+		Assert.assertNotNull("count not null", count);
+		Assert.assertEquals("Nb of project/space", 2, count.intValue());
+		
+		for(int i=1; i<SPACE_NB; i++) {
+			Assert.assertNull("other space id has no project i.e count is null", groupRes.get(this.spaceIds.get(i)));
+		}
+	}
+	
 	
 	@Test
 	public void testCopyProjectCreation() {
--- a/server/src/test/resources/log4j.xml	Tue May 14 14:10:23 2013 +0200
+++ b/server/src/test/resources/log4j.xml	Tue Apr 23 16:54:18 2013 +0200
@@ -17,6 +17,9 @@
   <logger name="org.springframework.test">
       <level value="DEBUG" />
   </logger>
+  <logger name="org.springframework.data.mongodb">
+      <level value="DEBUG" />
+  </logger>
   <root> 
     <priority value ="WARN" /> 
     <appender-ref ref="console" />