changeset 75:e5697f7775b2

Display columns named "source" and "year" and implement filter & sorting on them. Hide the column "Start Year"
author Calvin Yeh <cyeh@mpiwg-berlin.mpg.de>
date Mon, 27 Mar 2017 17:50:58 +0200
parents 92cb98332794
children 6ad066ddf3fe
files src/main/java/de/mpiwg/gazetteer/db/DBBook.java src/main/java/de/mpiwg/web/books/SortBooksBySource.java src/main/java/de/mpiwg/web/books/SortBooksByStartYear.java src/main/java/de/mpiwg/web/books/SortBooksByYear.java src/main/java/de/mpiwg/web/jsp/BooksPage.java src/main/java/de/mpiwg/web/jsp/JSPProxy.java src/main/webapp/pages/books.jsp
diffstat 7 files changed, 486 insertions(+), 333 deletions(-) [+]
line wrap: on
line diff
--- a/src/main/java/de/mpiwg/gazetteer/db/DBBook.java	Mon Mar 27 17:11:45 2017 +0200
+++ b/src/main/java/de/mpiwg/gazetteer/db/DBBook.java	Mon Mar 27 17:50:58 2017 +0200
@@ -15,26 +15,27 @@
 	private String edition = "";
 	private String volume = "";
 	private String dynasty = "";
-	
+
 	private String level1 = "";
 	private String level2 = "";
 	private String admin_type = "";
 	private String in_jibengujiku = "";
-	
+
 	private Integer start_year = 0;
 	private Integer end_year = 0;
 	private String comments = "";
 	private String toc_correction = "";
-	
-	
-	
+
+	private Integer year = 0;
+	private Integer source = "";
+
 
 	private DBSectionVersion currentSectionVersion;
-	
+
 	public DBBook() {
-		
+
 	}
-	
+
 	public DBBook(ResultSet rs) throws SQLException{
 		this.name = rs.getString("name");
 		this.id = rs.getString("id");
@@ -44,23 +45,24 @@
 		this.edition = rs.getString("edition");
 		this.volume = rs.getString("volume");
 		this.dynasty = rs.getString("dynasty");
-		
+
 		this.level1 = rs.getString("level1");
 		this.level2 = rs.getString("level2");
-		
+
 		this.admin_type = rs.getString("admin_type");
 		this.in_jibengujiku = rs.getString("in_jibengujiku");
-		
+
 		this.start_year = rs.getInt("start_year");
 		this.end_year = rs.getInt("end_year");
 		this.comments = rs.getString("comments");
-		
+
 		this.toc_correction = rs.getString("toc_correction");
-		
-		
-		
+
+    this.year = rs.getInt("year");
+		this.source = rs.getString("source");
+
 	}
-	
+
 	@Override
 	public int compareTo(DBBook o) {
 		return this.getName().compareTo(o.getName());
@@ -75,7 +77,7 @@
 		this.toc_correction = toc_correction;
 	}
 
-	
+
 	public String getId() {
 		return id;
 	}
@@ -111,8 +113,8 @@
 	public void setComments(String comments){
 		this.comments = comments;
 	}
-	
-	
+
+
 	public String getPeriod() {
 		return period;
 	}
@@ -232,6 +234,22 @@
 		this.currentSectionVersion = currentSectionVersion;
 	}
 
-	
-	
+	public Integer getYear() {
+		return this.year;
+	}
+
+
+	public void setYear(Integer pYear) {
+		this.year = pYear;
+	}
+
+	public String getSource() {
+		return this.source;
+	}
+
+
+	public void setSource(String pSource) {
+		this.source = pSource;
+	}
+
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/de/mpiwg/web/books/SortBooksBySource.java	Mon Mar 27 17:50:58 2017 +0200
@@ -0,0 +1,17 @@
+package de.mpiwg.web.books;
+
+import java.util.Comparator;
+
+import de.mpiwg.gazetteer.db.DBBook;
+
+
+public class SortBooksBySource implements Comparator<DBBook>{
+
+	public int compare(DBBook o1, DBBook o2) {
+		if(o1 == null || o2 == null){
+			return o1.getName().compareTo(o2.getName());
+		}
+		return o1.getSource().compareTo(o2.getSource());
+	}
+
+}
--- a/src/main/java/de/mpiwg/web/books/SortBooksByStartYear.java	Mon Mar 27 17:11:45 2017 +0200
+++ b/src/main/java/de/mpiwg/web/books/SortBooksByStartYear.java	Mon Mar 27 17:50:58 2017 +0200
@@ -6,12 +6,14 @@
 
 
 public class SortBooksByStartYear implements Comparator<DBBook>{
-	
+
 	public int compare(DBBook o1, DBBook o2) {
+
 		if(o1 == null || o2 == null){
-			return o1.getName().compareTo(o2.getName());	
+			return o1.getName().compareTo(o2.getName());
 		}
+		
 		return o1.getStart_year().compareTo(o2.getStart_year());
 	}
 
-}
\ No newline at end of file
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/de/mpiwg/web/books/SortBooksByYear.java	Mon Mar 27 17:50:58 2017 +0200
@@ -0,0 +1,19 @@
+package de.mpiwg.web.books;
+
+import java.util.Comparator;
+
+import de.mpiwg.gazetteer.db.DBBook;
+
+
+public class SortBooksByYear implements Comparator<DBBook>{
+
+	public int compare(DBBook o1, DBBook o2) {
+
+		if(o1 == null || o2 == null){
+			return o1.getName().compareTo(o2.getName());
+		}
+
+		return o1.getYear().compareTo(o2.getYear());
+	}
+
+}
--- a/src/main/java/de/mpiwg/web/jsp/BooksPage.java	Mon Mar 27 17:11:45 2017 +0200
+++ b/src/main/java/de/mpiwg/web/jsp/BooksPage.java	Mon Mar 27 17:50:58 2017 +0200
@@ -32,11 +32,11 @@
 public class BooksPage extends AbstractJSPPage{
 
 	private static Logger logger = Logger.getLogger(BooksPage.class);
-	
+
 	public static String bean = "booksBean";
 	public static String page = "pages/books.jsp";
 	private List<DBBook> completeBookList;
-	
+
 	private List<DBBook> filteredBookList;
 	private List<DBBook> displayBookList;
 
@@ -47,7 +47,7 @@
 
 
 	private String tocBookId = new String();
-	
+
 	private String bookNameFilter = new String();
 	private String dynastyFilter = new String();
 	private String adminTypeFilter = new String();
@@ -57,17 +57,19 @@
 	private String editionFilter = new String();
 	private String lastEditorFilter = new String();
 	private String editTimeFilter = new String();
+	private String yearFilter = new String();
+	private String sourceFilter = new String();
 
-	
+
 
 
 	private String filteringMessage;
-	
+
 
 	public void loadParameters(HttpServletRequest request, HttpServletResponse response){
 		this.request = request;
 		this.response = response;
-		
+
 		this.tocBookId = getParameter("tocBookId");
 		this.bookNameFilter = getParameter("bookNameFilter");
 		this.dynastyFilter = getParameter("dynastyFilter");
@@ -78,17 +80,19 @@
 		this.editionFilter = getParameter("editionFilter");
 		this.lastEditorFilter = getParameter("lastEditorFilter");
 		this.editTimeFilter = getParameter("editTimeFilter");
-	
+		this.yearFilter = getParameter("yearFilter");
+		this.sourceFilter = getParameter("sourceFilter");
+
 	}
-	
-	
+
+
 
 	public void filter(){
-		
+
 		this.filteredBookList = new ArrayList<DBBook>();
 		for(DBBook book : this.completeBookList){
 			if(!this.filteredBookList.contains(book)){
-				
+
 				if( //(StringUtils.isEmpty(dynastyFilter) || StringUtils.startsWith(book.getDynasty(), dynastyFilter)) &&
 					(StringUtils.isEmpty(level1Filter) || StringUtils.contains(book.getLevel1(), level1Filter)) &&
 					(StringUtils.isEmpty(level2Filter) || StringUtils.contains(book.getLevel2(), level2Filter)) &&
@@ -96,7 +100,9 @@
 					(StringUtils.isEmpty(editionFilter) || StringUtils.contains(book.getEdition(), editionFilter)) &&
 					(StringUtils.isEmpty(bookNameFilter) || StringUtils.contains(book.getName(), bookNameFilter)) &&
 					(StringUtils.isEmpty(dynastyFilter) || StringUtils.contains(book.getDynasty(), dynastyFilter)) &&
-					(StringUtils.isEmpty(adminTypeFilter) || StringUtils.contains(book.getAdmin_type(), adminTypeFilter))	
+					(StringUtils.isEmpty(adminTypeFilter) || StringUtils.contains(book.getAdmin_type(), adminTypeFilter)) &&
+          (StringUtils.isEmpty(yearFilter) || StringUtils.contains(book.getYear(), yearFilter)) &&
+					(StringUtils.isEmpty(sourceFilter) || StringUtils.contains(book.getSource(), sourceFilter))
 					){
 						String lastEditor = new String();
 						String editTime = new String();
@@ -104,21 +110,21 @@
 							lastEditor = book.getCurrentSectionVersion().getEditor();
 							editTime = book.getCurrentSectionVersion().getDate();
 						}
-						
+
 						if( (StringUtils.isEmpty(lastEditorFilter) || StringUtils.contains(lastEditor, lastEditorFilter)) &&
 							(StringUtils.isEmpty(editTimeFilter) || StringUtils.contains(editTime, editTimeFilter))
-								
+
 							){
 								this.filteredBookList.add(book);
-							
+
 							}
-							
+
 					//this.filteredBookList.add(book);
-					
-				}	
+
+				}
 			}
 		}
-		
+
 		if(completeBookList.size() > 0){
 			this.filteringMessage = this.filteredBookList.size() + " book(s) listed after filtering";
 			this.paginator.setCurrentPage(0);
@@ -127,17 +133,17 @@
 		}else{
 			this.filteredBookList = null;
 		}
-		
+
 	}
-	
-	
+
+
 	private void updateCurrentBooks() {
 		// update displayBookList using paginator
-		
+
 		this.paginator.initCount();
 		int startRecord = this.paginator.getCurrentPage()
 				* this.paginator.getItemsPerPage();
-		
+
 		if(this.paginator.getNumberOfPages() == 0){
 			this.displayBookList = new ArrayList<DBBook>();
 		}else if((this.paginator.getCurrentPage() + 1) == this.paginator.getNumberOfPages()){
@@ -145,15 +151,15 @@
 			if(mod == 0){
 				this.displayBookList = filteredBookList.subList(startRecord, startRecord + this.paginator.getItemsPerPage());
 			}else{
-				this.displayBookList = filteredBookList.subList(startRecord, startRecord + mod);	
+				this.displayBookList = filteredBookList.subList(startRecord, startRecord + mod);
 			}
-			
+
 		}else{
-			this.displayBookList = filteredBookList.subList(startRecord, startRecord + this.paginator.getItemsPerPage());	
+			this.displayBookList = filteredBookList.subList(startRecord, startRecord + this.paginator.getItemsPerPage());
 		}
-		
+
 	}
-	
+
 
 	public List<DBBook> getDisplayBookList() {
 		return displayBookList;
@@ -165,7 +171,7 @@
 		this.displayBookList = displayBookList;
 	}
 
-	
+
 	public String getDynastyFilter() {
 		return dynastyFilter;
 	}
@@ -195,7 +201,25 @@
 		this.level1Filter = level1Filter;
 	}
 
-	
+	public String getYearFilter() {
+		return yearFilter;
+	}
+
+
+	public void setYearFilter(String yearFilter) {
+		this.yearFilter = yearFilter;
+	}
+
+	public String getSourceFilter() {
+		return yearFilter;
+	}
+
+
+	public void setSourceFilter(String sourceFilter) {
+		this.sourceFilter = sourceFilter;
+	}
+
+
 	public String getTocBookId() {
 		return tocBookId;
 	}
@@ -212,7 +236,7 @@
 		this.bookNumber = bookNumber;
 	}
 
-	
+
 	public List<DBBook> getCompleteBookList() {
 		return completeBookList;
 	}
@@ -221,70 +245,70 @@
 		if(this.completeBookList == null){
 			this.forceLoadBooks();
 			this.filteringMessage = null;
-		} 
+		}
 	}
-	
+
 	public void forceLoadBooks(){
 		logger.debug("force loadBooks");
 
 		this.loadSectionsVersion();
-		
+
 		this.completeBookList = new ArrayList<DBBook>();
 		if(getSessionBean().getUser() != null){
 			logger.debug("loading book list");
 			// === load book table from db ==
-			
-			for(DBBook book : DBService.getInstance().getBooks()){		
+
+			for(DBBook book : DBService.getInstance().getBooks()){
 				// set editor and date (current version)
 				book.setCurrentSectionVersion(sectionVersionMap.get(book.getId()));
-				
+
 				this.completeBookList.add(book);
-			}	
-			
+			}
+
 			this.setBookNumber(this.completeBookList.size());
-			
+
 		}
-		
+
 		sortByBookIdUp();	//bookId ascend as default sorting
 		// Note that every sortXYZ() function has filter() in it, so it will also force reload filteredList and displayList
-		
-		
-	
-		
+
+
+
+
 	}
-	
+
 	private void loadSectionsVersion(){
 		this.sectionVersionMap = new HashMap<String, DBSectionVersion>();
-		
+
 		try {
 			for(DBSectionVersion sv : DBService.getInstance().getSectionVersionList()){
 				this.sectionVersionMap.put(sv.getBooks_id(), sv);
-			}	
+			}
 		} catch (Exception e) {
 			addMsg("There is an internal error: " + e.getLocalizedMessage());
 			e.printStackTrace();
 		}
-		
-		
+
+
 	}
 
 	public void setTocCorrection() {
-		String tocBookId = this.getTocBookId();		
+		String tocBookId = this.getTocBookId();
 		logger.debug("tocFinishedBookId=" + tocBookId);
 		try {
 			// update toc correction status to DB
 			DBService.getInstance().updateTocCorrection(tocBookId, "1");
-	
+
 			// update toc correction status
 			DBService.getInstance().getBook(tocBookId).setTocCorrection("1");
-			
+
 		}catch (Exception e) {
 			addMsg("There is an internal error: " + e.getLocalizedMessage());
 			e.printStackTrace();
-		} 
-	
+		}
+
 		//logger.debug("toc_correction:"+DBService.getInstance().getBook(tocBookId).getTocCorrection());
-		
+
 	}
 
 
@@ -294,34 +318,34 @@
 		try {
 			DBService.getInstance().updateTocCorrection(tocBookId, "0");
 			DBService.getInstance().getBook(tocBookId).setTocCorrection("0");
-			
+
 		}catch (Exception e) {
 			addMsg("There is an internal error: " + e.getLocalizedMessage());
 			e.printStackTrace();
-		}	
-		
-	}	
+		}
+
+	}
 
 	public void saveComment() {
-		
+
 		String bookComment = getParameter("bookComment");
 		String currentBookId = getParameter("currentBookId");
-		
+
 		logger.debug("saveComment. currentBookId=" + currentBookId + ", bookComment: "+ bookComment);
-	
+
 		try {
 			DBService.getInstance().updateComment(currentBookId, bookComment);
 			//DBService.getInstance().getBook(currentBookId).setComments(bookComment);
-			
+
 		} catch (Exception e) {
 			addMsg("There is an internal error: " + e.getLocalizedMessage());
 			e.printStackTrace();
 		}
-				
+
 	}
 
-	
-	
+
+
 	public void sortByBookIdUp() {
 		Collections.sort(this.completeBookList, new SortBooksByBookId());
 		filter();
@@ -337,18 +361,18 @@
 		Collections.sort(this.completeBookList, new SortBooksByName());
 		filter();
 	}
-	
+
 	public void sortByBookNameDown(){
 		Collections.sort(this.completeBookList, new SortBooksByName());
 		Collections.reverse(completeBookList);
 		filter();
 	}
-	
+
 	public void sortByLevel1Up(){
 		Collections.sort(this.completeBookList, new SortBooksByLevel1());
 		filter();
 	}
-	
+
 	public void sortByLevel1Down(){
 		Collections.sort(this.completeBookList, new SortBooksByLevel1());
 		Collections.reverse(completeBookList);
@@ -358,51 +382,51 @@
 		Collections.sort(this.completeBookList, new SortBooksByLevel2());
 		filter();
 	}
-	
+
 	public void sortByLevel2Down(){
 		Collections.sort(this.completeBookList, new SortBooksByLevel2());
 		Collections.reverse(completeBookList);
 		filter();
 	}
-	
+
 	public void sortByPeriodUp(){
 		Collections.sort(this.completeBookList, new SortBooksByPeriod());
 		filter();
 	}
-	
+
 	public void sortByPeriodDown(){
 		Collections.sort(this.completeBookList, new SortBooksByPeriod());
 		Collections.reverse(completeBookList);
 		filter();
 	}
-	
+
 	public void sortByAdminTypeUp(){
 		Collections.sort(this.completeBookList, new SortBooksByAdminType());
 		filter();
 	}
-	
+
 	public void sortByAdminTypeDown(){
 		Collections.sort(this.completeBookList, new SortBooksByAdminType());
 		Collections.reverse(completeBookList);
 		filter();
 	}
-	
+
 	public void sortByStartYearUp(){
 		Collections.sort(this.completeBookList, new SortBooksByStartYear());
 		filter();
 	}
-	
+
 	public void sortByStartYearDown(){
 		Collections.sort(this.completeBookList, new SortBooksByStartYear());
 		Collections.reverse(completeBookList);
 		filter();
 	}
-	
+
 	public void sortByDynastyUp(){
 		Collections.sort(this.completeBookList, new SortBooksByDynasty());
 		filter();
 	}
-	
+
 	public void sortByDynastyDown(){
 		Collections.sort(this.completeBookList, new SortBooksByDynasty());
 		Collections.reverse(completeBookList);
@@ -412,31 +436,31 @@
 		Collections.sort(this.completeBookList, new SortBooksByEdition());
 		filter();
 	}
-	
+
 	public void sortByEditionDown(){
 		Collections.sort(this.completeBookList, new SortBooksByEdition());
 		Collections.reverse(completeBookList);
 		filter();
 	}
 
-	
-	
+
+
 	public void sortByEditorUp(){
 		Collections.sort(this.completeBookList, new SortBooksByEditor());
 		filter();
 	}
-	
+
 	public void sortByEditorDown(){
 		Collections.sort(this.completeBookList, new SortBooksByEditor());
 		Collections.reverse(completeBookList);
 		filter();
 	}
-	
+
 	public void sortByDateUp(){
 		Collections.sort(this.completeBookList, new SortBooksByDate());
 		filter();
 	}
-	
+
 	public void sortByDateDown(){
 		Collections.sort(this.completeBookList, new SortBooksByDate());
 		Collections.reverse(completeBookList);
@@ -447,13 +471,35 @@
 		Collections.sort(this.completeBookList, new SortBooksByTocCorrection());
 		filter();
 	}
-	
+
 	public void sortByTocCorrectionDown(){
 		Collections.sort(this.completeBookList, new SortBooksByTocCorrection());
 		Collections.reverse(completeBookList);
 		filter();
 	}
-	
+
+	public void sortByYearUp(){
+		Collections.sort(this.completeBookList, new SortBooksByYear());
+		filter();
+	}
+
+	public void sortByYearDown(){
+		Collections.sort(this.completeBookList, new SortBooksByYear());
+		Collections.reverse(completeBookList);
+		filter();
+	}
+
+	public void sortBySourceUp(){
+		Collections.sort(this.completeBookList, new SortBooksBySource());
+		filter();
+	}
+
+	public void sortBySourceDown(){
+		Collections.sort(this.completeBookList, new SortBooksBySource());
+		Collections.reverse(completeBookList);
+		filter();
+	}
+
 	public String getBookNameFilter() {
 		return bookNameFilter;
 	}
@@ -539,7 +585,7 @@
 	public void setPaginator(DataPaginator paginator) {
 		this.paginator = paginator;
 	}
-	
+
 
 
 	public String getFilteringMessage() {
--- a/src/main/java/de/mpiwg/web/jsp/JSPProxy.java	Mon Mar 27 17:11:45 2017 +0200
+++ b/src/main/java/de/mpiwg/web/jsp/JSPProxy.java	Mon Mar 27 17:50:58 2017 +0200
@@ -4,9 +4,9 @@
 import org.apache.log4j.Logger;
 
 public class JSPProxy extends AbstractJSPPage {
-	
+
 	private static Logger logger = Logger.getLogger(JSPProxy.class);
-	
+
 	private String action;
 	private String bean;
 
@@ -20,18 +20,18 @@
 		    }
 		}*/
 	}
-	
-	
+
+
 	public String processRequest(){
-		
+
 		logger.info("processRequest [bean= " + bean + ", action=" + action +"]");
-		
+
 		try{
-			
-			
+
+
 			if(StringUtils.equals(bean, "loginBean")){
 				getSessionBean().loadParameters(request, response);
-			
+
 				if(StringUtils.equals(action, "login")){
 					getSessionBean().login();
 				}else if(StringUtils.equals(action, "logout")){
@@ -40,23 +40,23 @@
 				//return TopicListPage.page;	// the new home page?
 				// return "pages/home.jsp";
 				return BooksPage.page;
-				
+
 			} else if (getSessionBean() == null || getSessionBean().getUser() == null) {
 				// return to home page where will ask user to login.
-				
+
 				// alert session timeout
 				getSessionBean().addMsg("Timeout or Logout at another page! Please login again.");
-				
+
 				//return TopicListPage.page;	// the new home page?
 				//return "pages/home.jsp";
 				return BooksPage.page;
 			}
-		
-			
+
+
 			if(StringUtils.equals(bean, BranchPage.bean)){
-				
+
 				getSessionBean().getBranchPage().loadParameters(request, response);
-				
+
 				if(StringUtils.equals(action, "addContributor")){
 					getSessionBean().getBranchPage().addContributor();
 				}else if(StringUtils.equals(action, "removeContributor")){
@@ -70,35 +70,35 @@
 				}else if (StringUtils.equals(action, "forceReloadBranch")) {
 					getSessionBean().getBranchPage().forceReloadBranch();
 				}
-				
-				
+
+
 				return BranchPage.page;
-				
-				
+
+
 			} else if(StringUtils.equals(bean, CreateFilePage.bean)){
-				
+
 				getSessionBean().getCreateFilePage().loadParameters(request, response);
-				
+
 				if(StringUtils.equals(action, "loadSection")){
 					getSessionBean().getCreateFilePage().loadSection();
 				}else if(StringUtils.equals(action, "reset")){
 					getSessionBean().getCreateFilePage().reset();
 				}
-				
+
 				return CreateFilePage.page;
-	
+
 			} else if(StringUtils.equals(bean, HomePage.bean)){
-				
+
 				getSessionBean().getHomePage().loadParameters(request, response);
-				
+
 				if(StringUtils.equals(action, "deleteBranch")){
 					getSessionBean().getHomePage().deleteBranch();
 				} else if(StringUtils.equals(action, "reloadBranches")){
 					getSessionBean().getHomePage().reloadBranches();
-				} 
+				}
 				// zoe add for sorting in home page, which shows user's branches
 				else if (StringUtils.equals(action, "forceReloadBranches")) {
-					getSessionBean().getHomePage().forceLoadBranches();;		
+					getSessionBean().getHomePage().forceLoadBranches();;
 				} else if(StringUtils.equals(action, "filter")){
 					getSessionBean().getHomePage().filter();
 				}
@@ -114,7 +114,7 @@
 					getSessionBean().getHomePage().sortByBookIdUp();
 				} else if(StringUtils.equals(action, "sortByBookIdDown")) {
 					getSessionBean().getHomePage().sortByBookIdDown();
-				
+
 				} else if(StringUtils.equals(action, "sortByLevel1Up")) {
 					getSessionBean().getHomePage().sortByLevel1Up();
 				} else if(StringUtils.equals(action, "sortByLevel1Down")) {
@@ -123,7 +123,7 @@
 					getSessionBean().getHomePage().sortByLevel2Up();
 				} else if(StringUtils.equals(action, "sortByLevel2Down")) {
 					getSessionBean().getHomePage().sortByLevel2Down();
-					
+
 				} else if(StringUtils.equals(action, "sortByAdminTypeUp")) {
 					getSessionBean().getHomePage().sortByAdminTypeUp();
 				} else if(StringUtils.equals(action, "sortByAdminTypeDown")) {
@@ -136,8 +136,8 @@
 					getSessionBean().getHomePage().sortBySectionStartPageUp();
 				} else if(StringUtils.equals(action, "sortBySectionStartPageDown")) {
 					getSessionBean().getHomePage().sortBySectionStartPageDown();
-					
-					
+
+
 				} else if(StringUtils.equals(action, "sortByPeriodUp")) {
 					getSessionBean().getHomePage().sortByPeriodUp();
 				} else if(StringUtils.equals(action, "sortByPeriodDown")) {
@@ -159,19 +159,19 @@
 				} else if(StringUtils.equals(action, "sortByPublishedInDataverseDown")) {
 					getSessionBean().getHomePage().sortByPublishedInDataverseDown();
 				}
-				
+
 				return HomePage.page;
-				
-			
+
+
 			}else if(StringUtils.equals(bean, SearchPage.bean)){
 				getSessionBean().getSearchPage().loadParameters(request, response);
-				
+
 				if(StringUtils.equals(action, "search")){
 					getSessionBean().getSearchPage().search();
 				} else if(StringUtils.equals(action, "filter")){
 					getSessionBean().getSearchPage().filter();
-					
-				
+
+
 				//PAGINATOR
 				} else if(StringUtils.equals(action, "firstPage")){
 					getSessionBean().getSearchPage().firstPage();
@@ -185,7 +185,7 @@
 					getSessionBean().getSearchPage().fastForward();
 				} else if(StringUtils.equals(action, "lastPage")){
 					getSessionBean().getSearchPage().lastPage();
-				
+
 				//SORTING
 				} else if(StringUtils.equals(action, "sortByBookIdUp")){
 					getSessionBean().getSearchPage().sortByBookIdUp();
@@ -211,7 +211,7 @@
 					getSessionBean().getSearchPage().sortBySectionNameUp();
 				} else if(StringUtils.equals(action, "sortBySectionNameDown")){
 					getSessionBean().getSearchPage().sortBySectionNameDown();
-				
+
 				} else if(StringUtils.equals(action, "sortByLevel1Up")){
 					getSessionBean().getSearchPage().sortByLevel1Up();
 				} else if(StringUtils.equals(action, "sortByLevel1Down")){
@@ -220,52 +220,52 @@
 					getSessionBean().getSearchPage().sortByLevel2Up();
 				} else if(StringUtils.equals(action, "sortByLevel2Down")){
 					getSessionBean().getSearchPage().sortByLevel2Down();
-						
+
 				} else if(StringUtils.equals(action, "sortByAdminTypeUp")){
 					getSessionBean().getSearchPage().sortByAdminTypeUp();
 				} else if(StringUtils.equals(action, "sortByAdminTypeDown")){
 					getSessionBean().getSearchPage().sortByAdminTypeDown();
-				
+
 				} else if(StringUtils.equals(action, "sortByStartPageUp")){
 					getSessionBean().getSearchPage().sortByStartPageUp();
 				} else if(StringUtils.equals(action, "sortByStartPageDown")){
 					getSessionBean().getSearchPage().sortByStartPageDown();
-				} 
-					
+				}
+
 				return SearchPage.page;
-				
+
 			} else if(StringUtils.equals(bean, FullTextSearchPage.bean)){
 				getSessionBean().getFullTextSearchPage().loadParameters(request, response);
-					
+
 				if(StringUtils.equals(action, "search")){
 					getSessionBean().getFullTextSearchPage().search();
 				} else if(StringUtils.equals(action, "filter")){
 					getSessionBean().getFullTextSearchPage().filter();
 				} else if(StringUtils.equals(action, "save")){
 					getSessionBean().getFullTextSearchPage().save();
-				
-				
+
+
 				} else if(StringUtils.equals(action, "saveFiltered")){
 					getSessionBean().getFullTextSearchPage().saveFilteredList();;
-			
-					
+
+
 				} else if(StringUtils.equals(action, "removeFocusedContent")){
 					getSessionBean().getFullTextSearchPage().removeFocusedContent(true);
 				} else if(StringUtils.equals(action, "recoverFocusedContent")){
 					getSessionBean().getFullTextSearchPage().removeFocusedContent(false);
-					
+
 				// for searching in batch keywords
 				} else if(StringUtils.equals(action, "searchBatch")){
 					getSessionBean().getFullTextSearchPage().searchBatch();
-				
+
 				// load existing searching result
 				} else if(StringUtils.equals(action, "loadFile")) {
 					getSessionBean().getFullTextSearchPage().loadFile();
-					
+
 				// delete existing searching result
 				} else if(StringUtils.equals(action, "deleteFile")) {
 					getSessionBean().getFullTextSearchPage().deleteFile();
-					
+
 				//PAGINATOR
 				} else if(StringUtils.equals(action, "firstPage")){
 					getSessionBean().getFullTextSearchPage().firstPage();
@@ -279,7 +279,7 @@
 					getSessionBean().getFullTextSearchPage().fastForward();
 				} else if(StringUtils.equals(action, "lastPage")){
 					getSessionBean().getFullTextSearchPage().lastPage();
-				
+
 				//SORTING
 				} else if(StringUtils.equals(action, "sortByInxUp")){
 					getSessionBean().getFullTextSearchPage().sortByInxUp();
@@ -305,7 +305,7 @@
 					getSessionBean().getFullTextSearchPage().sortBySectionNameUp();
 				} else if(StringUtils.equals(action, "sortBySectionNameDown")){
 					getSessionBean().getFullTextSearchPage().sortBySectionNameDown();
-				
+
 				} else if(StringUtils.equals(action, "sortByLevel1Up")){
 					getSessionBean().getFullTextSearchPage().sortByLevel1Up();
 				} else if(StringUtils.equals(action, "sortByLevel1Down")){
@@ -318,29 +318,29 @@
 					getSessionBean().getFullTextSearchPage().sortByAdminTypeUp();
 				} else if(StringUtils.equals(action, "sortByAdminTypeDown")){
 					getSessionBean().getFullTextSearchPage().sortByAdminTypeDown();
-				
+
 				} else if(StringUtils.equals(action, "sortByStartPageUp")){
 					getSessionBean().getFullTextSearchPage().sortByStartPageUp();
 				} else if(StringUtils.equals(action, "sortByStartPageDown")){
 					getSessionBean().getFullTextSearchPage().sortByStartPageDown();
-				} 
-					
-				
+				}
+
+
 				return FullTextSearchPage.page;
-				
-				
+
+
 			} else if(StringUtils.equals(bean, TopicListPage.bean)){
 				getSessionBean().getTopicListPage().loadParameters(request, response);
-							
+
 				if(StringUtils.equals(action, "forceLoadTopics")){
 					getSessionBean().getTopicListPage().forceLoadTopics();
-				
+
 				} else if(StringUtils.equals(action, "deleteTopic")){
 					getSessionBean().getTopicListPage().deleteTopic();
 				} else if(StringUtils.equals(action, "createTopic")){
 					Long userId = getSessionBean().getUser().getId();
-					getSessionBean().getTopicListPage().createTopic(userId);	
-					
+					getSessionBean().getTopicListPage().createTopic(userId);
+
 				} else if(StringUtils.equals(action, "sortByTopicIdUp")) {
 					getSessionBean().getTopicListPage().sortByTopicIdUp();
 				} else if(StringUtils.equals(action, "sortByTopicIdDown")) {
@@ -365,77 +365,77 @@
 					getSessionBean().getTopicListPage().sortByLastModifiedUp();
 				} else if(StringUtils.equals(action, "sortByLastModifiedDown")) {
 					getSessionBean().getTopicListPage().sortByLastModifiedDown();
-				}  
-		
-					
+				}
+
+
 				return TopicListPage.page;
-					
-			
+
+
 			} else if(StringUtils.equals(bean, TopicPage.bean)){
 				getSessionBean().getTopicPage().loadParameters(request, response);
-							
+
 				if(StringUtils.equals(action, "forceLoadTopicSectionRelation")){
 					getSessionBean().getTopicPage().forceLoadTopicSectionRelation();
-				
+
 				} else if(StringUtils.equals(action, "filter")){
 					getSessionBean().getTopicPage().filter();
-		
-				} else 
-					
+
+				} else
+
 				/* ====
-				 *  topic information, which are relevant to topicListPage 
-				 * can improved by not always calling getTopicListPage().forceLoadTopics() but rather updating the changed/modified topic in topicList. 
+				 *  topic information, which are relevant to topicListPage
+				 * can improved by not always calling getTopicListPage().forceLoadTopics() but rather updating the changed/modified topic in topicList.
 				 * */
 				if(StringUtils.equals(action, "addContributor")){
 					getSessionBean().getTopicPage().addContributor();
 					//getSessionBean().getTopicListPage().forceLoadTopics();
-				
+
 				} else if(StringUtils.equals(action, "removeContributor")){
 					getSessionBean().getTopicPage().removeContributor();
 					//getSessionBean().getTopicListPage().forceLoadTopics();
-					
+
 				} else if( StringUtils.equals(action ,"updateDescription")) {
 					getSessionBean().getTopicPage().updateDescription();
 					//getSessionBean().getTopicListPage().forceLoadTopics();
-					
+
 				} else if( StringUtils.equals(action ,"updateKeywords")) {
 					getSessionBean().getTopicPage().updateKeywords();
 					//getSessionBean().getTopicListPage().forceLoadTopics();
-			
-					
+
+
 				/* ====== */
-					
-					
+
+
 				} else if( StringUtils.equals(action ,"deleteSection")) {
 					getSessionBean().getTopicPage().deleteSection(getLongParameter("sectionId"));
-				
-				
+
+
 				} else if(StringUtils.equals(action, "addSection")) {
 					Long selectedSectionId = getLongParameter("selectedSectionId");
 					Long selectedTopicId = getLongParameter("selectedTopicId");
 					getSessionBean().getTopicPage().addSectionToTopic(selectedSectionId, selectedTopicId);
-					
+
 					// TODO it's possible to add a section into a topic in the task page, so need to modify here...
-					
+
 					getSessionBean().getSearchPage().updateTopicSectionRelation();
-					
+
 					String sourceBean = getParameter("sourceBean");
 					if (StringUtils.equals(sourceBean, "home")) {
 						return HomePage.page;
 					} else if (StringUtils.equals(sourceBean, "search")) {
 						return SearchPage.page;
 					}
-					
+
 					return SearchPage.page;
-				
+
 				} else if(StringUtils.equals(action, "addAllSections")) {
 					Long selectedTopicId = getLongParameter("selectedTopicId");
 					getSessionBean().getTopicPage().addAllSectionsToTopic(getSessionBean().getSearchPage().getFilteredSectionList(), selectedTopicId);
 					getSessionBean().getSearchPage().updateTopicSectionRelation();
-					
+
 					return SearchPage.page;
-					
-					
+
+
 				//SORTING
 				} else if(StringUtils.equals(action, "sortByBookIdUp")){
 					getSessionBean().getTopicPage().sortByBookIdUp();
@@ -457,7 +457,7 @@
 					getSessionBean().getTopicPage().sortBySectionNameUp();
 				} else if(StringUtils.equals(action, "sortBySectionNameDown")){
 					getSessionBean().getTopicPage().sortBySectionNameDown();
-				
+
 				} else if(StringUtils.equals(action, "sortByLevel1Up")){
 					getSessionBean().getTopicPage().sortByLevel1Up();
 				} else if(StringUtils.equals(action, "sortByLevel1Down")){
@@ -466,39 +466,39 @@
 					getSessionBean().getTopicPage().sortByLevel2Up();
 				} else if(StringUtils.equals(action, "sortByLevel2Down")){
 					getSessionBean().getTopicPage().sortByLevel2Down();
-				
-			
+
+
 				} else if(StringUtils.equals(action, "sortByAdminTypeUp")){
 					getSessionBean().getTopicPage().sortByAdminTypeUp();
 				} else if(StringUtils.equals(action, "sortByAdminTypeDown")){
 					getSessionBean().getTopicPage().sortByAdminTypeDown();
-				
+
 				} else if(StringUtils.equals(action, "sortByStartPageUp")){
 					getSessionBean().getTopicPage().sortByStartPageUp();
 				} else if(StringUtils.equals(action, "sortByStartPageDown")){
 					getSessionBean().getTopicPage().sortByStartPageDown();
-				} 
-				
+				}
+
 				return TopicPage.page;
-					
-			
+
+
 			} else if(StringUtils.equals(bean, BooksPage.bean)){
 				getSessionBean().getBooksPage().loadParameters(request, response);
-				
+
 				if(StringUtils.equals(action, "setTocCorrection")){
 					getSessionBean().getBooksPage().setTocCorrection();
 				} else if (StringUtils.equals(action, "unSetTocCorrection")){
 					getSessionBean().getBooksPage().unSetTocCorrection();
-					
+
 				} else if(StringUtils.equals(action, "saveComment")){
 					getSessionBean().getBooksPage().saveComment();
-				
+
 				} else if (StringUtils.equals(action, "forceReloadBooks")) {
-					getSessionBean().getBooksPage().forceLoadBooks();		
+					getSessionBean().getBooksPage().forceLoadBooks();
 				} else if(StringUtils.equals(action, "filter")){
 					getSessionBean().getBooksPage().filter();
-					
-					
+
+
 				//PAGINATOR
 				} else if(StringUtils.equals(action, "firstPage")){
 					getSessionBean().getBooksPage().firstPage();
@@ -512,81 +512,91 @@
 					getSessionBean().getBooksPage().fastForward();
 				} else if(StringUtils.equals(action, "lastPage")){
 					getSessionBean().getBooksPage().lastPage();
-					
+
 				// Sorting
 				} else if(StringUtils.equals(action, "sortByBookIdUp")){
 					getSessionBean().getBooksPage().sortByBookIdUp();
 				} else if(StringUtils.equals(action, "sortByBookIdDown")){
 					getSessionBean().getBooksPage().sortByBookIdDown();
-					
+
 				} else if(StringUtils.equals(action, "sortByBookNameUp")){
 					getSessionBean().getBooksPage().sortByBookNameUp();
 				} else if(StringUtils.equals(action, "sortByBookNameDown")){
 					getSessionBean().getBooksPage().sortByBookNameDown();
-					
+
 				} else if(StringUtils.equals(action, "sortByLevel1Up")){
 					getSessionBean().getBooksPage().sortByLevel1Up();
 				} else if(StringUtils.equals(action, "sortByLevel1Down")){
 					getSessionBean().getBooksPage().sortByLevel1Down();
-					
+
 				} else if(StringUtils.equals(action, "sortByLevel2Up")){
 					getSessionBean().getBooksPage().sortByLevel2Up();
 				} else if(StringUtils.equals(action, "sortByLevel2Down")){
 					getSessionBean().getBooksPage().sortByLevel2Down();
-					
+
 				} else if(StringUtils.equals(action, "sortByPeriodUp")){
 					getSessionBean().getBooksPage().sortByPeriodUp();
 				} else if(StringUtils.equals(action, "sortByPeriodDown")){
 					getSessionBean().getBooksPage().sortByPeriodDown();
-					
+
 				} else if(StringUtils.equals(action, "sortByDynastyUp")){
 					getSessionBean().getBooksPage().sortByDynastyUp();
 				} else if(StringUtils.equals(action, "sortByDynastyDown")){
 					getSessionBean().getBooksPage().sortByDynastyDown();
-					
+
 				} else if(StringUtils.equals(action, "sortByAdminTypeUp")){
 					getSessionBean().getBooksPage().sortByAdminTypeUp();
 				} else if(StringUtils.equals(action, "sortByAdminTypeDown")){
 					getSessionBean().getBooksPage().sortByAdminTypeDown();
-				
+
 				} else if(StringUtils.equals(action, "sortByStartYearUp")){
 					getSessionBean().getBooksPage().sortByStartYearUp();
 				} else if(StringUtils.equals(action, "sortByStartYearDown")){
 					getSessionBean().getBooksPage().sortByStartYearDown();
-				
+
 				} else if(StringUtils.equals(action, "sortByEditionUp")){
 					getSessionBean().getBooksPage().sortByEditionUp();
 				} else if(StringUtils.equals(action, "sortByEditionDown")){
 					getSessionBean().getBooksPage().sortByEditionDown();
-				
+
 				} else if(StringUtils.equals(action, "sortByTocCorrectionUp")){
 					getSessionBean().getBooksPage().sortByTocCorrectionUp();
 				} else if(StringUtils.equals(action, "sortByTocCorrectionDown")){
 					getSessionBean().getBooksPage().sortByTocCorrectionDown();
-				
+
 				} else if(StringUtils.equals(action, "sortByEditorUp")){
 					getSessionBean().getBooksPage().sortByEditorUp();
 				} else if(StringUtils.equals(action, "sortByEditorDown")){
 					getSessionBean().getBooksPage().sortByEditorDown();
-				
+
 				} else if(StringUtils.equals(action, "sortByDateUp")){
 					getSessionBean().getBooksPage().sortByDateUp();
 				} else if(StringUtils.equals(action, "sortByDateDown")){
 					getSessionBean().getBooksPage().sortByDateDown();
+				} else if(StringUtils.equals(action, "sortByYearUp")){
+					getSessionBean().getBooksPage().sortByYearUp();
+				} else if(StringUtils.equals(action, "sortByYearDown")){
+					getSessionBean().getBooksPage().sortByYearDown();
+				} else if(StringUtils.equals(action, "sortBySourceUp")){
+					getSessionBean().getBooksPage().sortBySourceUp();
+				} else if(StringUtils.equals(action, "sortBySourceDown")){
+					getSessionBean().getBooksPage().sortBySourceDown();
 				}
-				
+
+
+
 				return BooksPage.page;
 			}
-			
+
 		}catch(Exception e){
 			e.printStackTrace();
 			addMsg("There is an internal error: " + e.getLocalizedMessage());
-			
+
 			//return TopicListPage.page;
 			return HomePage.page;
 		}
-		
-	
+
+
 		//Default Page:
 		//return TopicListPage.page;	// will be the new home page?
 		return HomePage.page;
--- a/src/main/webapp/pages/books.jsp	Mon Mar 27 17:11:45 2017 +0200
+++ b/src/main/webapp/pages/books.jsp	Mon Mar 27 17:50:58 2017 +0200
@@ -10,22 +10,22 @@
 
 <head>
 
-	<jsp:include page="../componentes/headContent.jsp"/>	
+	<jsp:include page="../componentes/headContent.jsp"/>
 
 <script>
 
 	function setComment(t) {
 		var notes = t.value;
 		//var bookId = t.name;
-		
+
 		var theForm = document.forms['booksForm'];
 	    var input = document.createElement('input');
 	    input.type = 'hidden';
 	    input.name = 'bookComment';
 	    input.value = notes;
-	    theForm.appendChild(input); 
+	    theForm.appendChild(input);
 	}
-	
+
 </script>
 </head>
 
@@ -36,31 +36,31 @@
 				action="<%=sessionBean.getApplicationBean().getRootServer()%>/proxy.jsp"
 				method="post"
 				class="contentForm">
-		<input name="bean" type="hidden" value="booksBean" /> 
-					
+		<input name="bean" type="hidden" value="booksBean" />
+
 		<% if(sessionBean.getUser() == null) { %>
 			<label class="subTitel">You must login!</label>
 		<% } else {
-			if (sessionBean.getBooksPage().getCompleteBookList() == null){ 
+			if (sessionBean.getBooksPage().getCompleteBookList() == null){
 				sessionBean.getBooksPage().loadParameters(request, response);
 				sessionBean.getBooksPage().loadBooks();
 			}
-			
+
 		%>
-		
+
 		<div class="subTitel">List of Books
 			<input type="image"
 					onclick="setAction('forceReloadBooks', 'booksForm');"
 			src="<%=sessionBean.getApplicationBean().getRefreshImage()%>" width="20" height="20"/>
-			
+
 			<p class="label"><%= sessionBean.getBooksPage().getBookNumber() %> books in Chinese Local Gazetteers </p>
 			<p class="label"><%= (StringUtils.isNotEmpty(sessionBean.getBooksPage().getFilteringMessage())) ? sessionBean.getBooksPage().getFilteringMessage() : ""%> </p>
 		</div>
-		
+
 			<jsp:include page="../componentes/paginator.jsp">
 				<jsp:param name="formName" value="booksForm"/>
-			</jsp:include> 
-				
+			</jsp:include>
+
 			<div class="tableDiv double-scroll">
 				<table class="pageTable">
 					<tr>
@@ -71,20 +71,20 @@
 									<td>
 										<table>
 											<tr><td>
-												<input type="image" 
+												<input type="image"
 													onclick="setAction('sortByBookIdUp', 'booksForm');"
-													src="<%=sessionBean.getApplicationBean().getUpImage()%>"/>										
+													src="<%=sessionBean.getApplicationBean().getUpImage()%>"/>
 											</td></tr>
 											<tr><td>
 												<input type="image"
 													onclick="setAction('sortByBookIdDown', 'booksForm');"
-													src="<%=sessionBean.getApplicationBean().getDownImage()%>"/>																				
+													src="<%=sessionBean.getApplicationBean().getDownImage()%>"/>
 											</td></tr>
 										</table>
 									</td>
 								</tr>
 							</table>
-					
+
 						</td>
 						<td>
 							<table class="sortTable">
@@ -95,12 +95,12 @@
 											<tr><td>
 												<input type="image"
 													onclick="setAction('sortByBookNameUp', 'booksForm');"
-													src="<%=sessionBean.getApplicationBean().getUpImage()%>"/>										
+													src="<%=sessionBean.getApplicationBean().getUpImage()%>"/>
 											</td></tr>
 											<tr><td>
 												<input type="image"
 													onclick="setAction('sortByBookNameDown', 'booksForm');"
-													src="<%=sessionBean.getApplicationBean().getDownImage()%>"/>																	
+													src="<%=sessionBean.getApplicationBean().getDownImage()%>"/>
 											</td></tr>
 										</table>
 									</td>
@@ -108,15 +108,15 @@
 								<tr>
 									<td>
 										<input type="text" name="bookNameFilter" value="<%= sessionBean.getBooksPage().getBookNameFilter()%>" size="10"/>
-									</td>									
+									</td>
 									<td>
 										<input type="image"
 											onclick="setAction('filter', 'booksForm');"
 											src="<%=sessionBean.getApplicationBean().getFilterImage()%>"/>
-									</td>							
+									</td>
 								</tr>
 							</table>
-						</td> 
+						</td>
 						<td>
 							<table class="sortTable">
 								<tr>
@@ -126,12 +126,12 @@
 											<tr><td>
 												<input type="image"
 													onclick="setAction('sortByEditionUp', 'booksForm');"
-													src="<%=sessionBean.getApplicationBean().getUpImage()%>"/>										
+													src="<%=sessionBean.getApplicationBean().getUpImage()%>"/>
 											</td></tr>
 											<tr><td>
 												<input type="image"
 													onclick="setAction('sortByEditionDown', 'booksForm');"
-													src="<%=sessionBean.getApplicationBean().getDownImage()%>"/>																	
+													src="<%=sessionBean.getApplicationBean().getDownImage()%>"/>
 											</td></tr>
 										</table>
 									</td>
@@ -139,12 +139,12 @@
 								<tr>
 									<td>
 										<input type="text" name="editionFilter" value="<%= sessionBean.getBooksPage().getEditionFilter()%>" size="10"/>
-									</td>									
+									</td>
 									<td>
 										<input type="image"
 											onclick="setAction('filter', 'booksForm');"
 											src="<%=sessionBean.getApplicationBean().getFilterImage()%>"/>
-									</td>							
+									</td>
 								</tr>
 							</table>
 						</td>
@@ -157,12 +157,12 @@
 											<tr><td>
 												<input type="image"
 													onclick="setAction('sortByLevel1Up', 'booksForm');"
-													src="<%=sessionBean.getApplicationBean().getUpImage()%>"/>										
+													src="<%=sessionBean.getApplicationBean().getUpImage()%>"/>
 											</td></tr>
 											<tr><td>
 												<input type="image"
 													onclick="setAction('sortByLevel1Down', 'booksForm');"
-													src="<%=sessionBean.getApplicationBean().getDownImage()%>"/>																	
+													src="<%=sessionBean.getApplicationBean().getDownImage()%>"/>
 											</td></tr>
 										</table>
 									</td>
@@ -170,12 +170,12 @@
 								<tr>
 									<td>
 										<input type="text" name="level1Filter" value="<%= sessionBean.getBooksPage().getLevel1Filter()%>" size="5"/>
-									</td>									
+									</td>
 									<td>
 										<input type="image"
 											onclick="setAction('filter', 'booksForm');"
 											src="<%=sessionBean.getApplicationBean().getFilterImage()%>"/>
-									</td>							
+									</td>
 								</tr>
 							</table>
 						</td>
@@ -188,12 +188,12 @@
 											<tr><td>
 												<input type="image"
 													onclick="setAction('sortByLevel2Up', 'booksForm');"
-													src="<%=sessionBean.getApplicationBean().getUpImage()%>"/>										
+													src="<%=sessionBean.getApplicationBean().getUpImage()%>"/>
 											</td></tr>
 											<tr><td>
 												<input type="image"
 													onclick="setAction('sortByLevel2Down', 'booksForm');"
-													src="<%=sessionBean.getApplicationBean().getDownImage()%>"/>																	
+													src="<%=sessionBean.getApplicationBean().getDownImage()%>"/>
 											</td></tr>
 										</table>
 									</td>
@@ -201,12 +201,12 @@
 								<tr>
 									<td>
 										<input type="text" name="level2Filter" value="<%= sessionBean.getBooksPage().getLevel2Filter()%>" size="5"/>
-									</td>									
+									</td>
 									<td>
 										<input type="image"
 											onclick="setAction('filter', 'booksForm');"
 											src="<%=sessionBean.getApplicationBean().getFilterImage()%>"/>
-									</td>							
+									</td>
 								</tr>
 							</table>
 						</td>
@@ -219,12 +219,12 @@
 											<tr><td>
 												<input type="image"
 													onclick="setAction('sortByPeriodUp', 'booksForm');"
-													src="<%=sessionBean.getApplicationBean().getUpImage()%>"/>										
+													src="<%=sessionBean.getApplicationBean().getUpImage()%>"/>
 											</td></tr>
 											<tr><td>
 												<input type="image"
 													onclick="setAction('sortByPeriodDown', 'booksForm');"
-													src="<%=sessionBean.getApplicationBean().getDownImage()%>"/>																	
+													src="<%=sessionBean.getApplicationBean().getDownImage()%>"/>
 											</td></tr>
 										</table>
 									</td>
@@ -232,12 +232,12 @@
 								<tr>
 									<td>
 										<input type="text" name="periodFilter" value="<%= sessionBean.getBooksPage().getPeriodFilter()%>" size="5"/>
-									</td>									
+									</td>
 									<td>
 										<input type="image"
 											onclick="setAction('filter', 'booksForm');"
 											src="<%=sessionBean.getApplicationBean().getFilterImage()%>"/>
-									</td>							
+									</td>
 								</tr>
 							</table>
 						</td>
@@ -250,12 +250,12 @@
 											<tr><td>
 												<input type="image"
 													onclick="setAction('sortByDynastyUp', 'booksForm');"
-													src="<%=sessionBean.getApplicationBean().getUpImage()%>"/>										
+													src="<%=sessionBean.getApplicationBean().getUpImage()%>"/>
 											</td></tr>
 											<tr><td>
 												<input type="image"
 													onclick="setAction('sortByDynastyDown', 'booksForm');"
-													src="<%=sessionBean.getApplicationBean().getDownImage()%>"/>																	
+													src="<%=sessionBean.getApplicationBean().getDownImage()%>"/>
 											</td></tr>
 										</table>
 									</td>
@@ -263,12 +263,12 @@
 								<tr>
 									<td>
 										<input type="text" name="dynastyFilter" value="<%= sessionBean.getBooksPage().getDynastyFilter()%>" size="5"/>
-									</td>									
+									</td>
 									<td>
 										<input type="image"
 											onclick="setAction('filter', 'booksForm');"
 											src="<%=sessionBean.getApplicationBean().getFilterImage()%>"/>
-									</td>							
+									</td>
 								</tr>
 							</table>
 						</td>
@@ -281,12 +281,12 @@
 											<tr><td>
 												<input type="image"
 													onclick="setAction('sortByAdminTypeUp', 'booksForm');"
-													src="<%=sessionBean.getApplicationBean().getUpImage()%>"/>										
+													src="<%=sessionBean.getApplicationBean().getUpImage()%>"/>
 											</td></tr>
 											<tr><td>
 												<input type="image"
 													onclick="setAction('sortByAdminTypeDown', 'booksForm');"
-													src="<%=sessionBean.getApplicationBean().getDownImage()%>"/>																	
+													src="<%=sessionBean.getApplicationBean().getDownImage()%>"/>
 											</td></tr>
 										</table>
 									</td>
@@ -294,43 +294,85 @@
 								<tr>
 									<td>
 										<input type="text" name="adminTypeFilter" value="<%= sessionBean.getBooksPage().getAdminTypeFilter()%>" size="5"/>
-									</td>									
+									</td>
 									<td>
 										<input type="image"
 											onclick="setAction('filter', 'booksForm');"
 											src="<%=sessionBean.getApplicationBean().getFilterImage()%>"/>
-									</td>							
+									</td>
 								</tr>
 							</table>
 						</td>
 						<td>
 							<table class="sortTable">
 								<tr>
-									<td><label class="tableTitle">Start Year</label></td>
+									<td><label class="tableTitle">Year</label></td>
 									<td>
 										<table>
 											<tr><td>
 												<input type="image"
-													onclick="setAction('sortByStartYearUp', 'booksForm');"
-													src="<%=sessionBean.getApplicationBean().getUpImage()%>"/>										
+													onclick="setAction('sortByYearUp', 'booksForm');"
+													src="<%=sessionBean.getApplicationBean().getUpImage()%>"/>
 											</td></tr>
 											<tr><td>
 												<input type="image"
-													onclick="setAction('sortByStartYearDown', 'booksForm');"
-													src="<%=sessionBean.getApplicationBean().getDownImage()%>"/>																	
+													onclick="setAction('sortByYearDown', 'booksForm');"
+													src="<%=sessionBean.getApplicationBean().getDownImage()%>"/>
 											</td></tr>
 										</table>
 									</td>
 								</tr>
+								<tr>
+									<td>
+										<input type="text" name="yearFilter" value="<%= sessionBean.getBooksPage().getYearFilter()%>" size="5"/>
+									</td>
+									<td>
+										<input type="image"
+											onclick="setAction('filter', 'booksForm');"
+											src="<%=sessionBean.getApplicationBean().getFilterImage()%>"/>
+									</td>
+								</tr>
 							</table>
 						</td>
-						
+
+						<td>
+							<table class="sortTable">
+								<tr>
+									<td><label class="tableTitle">Source</label></td>
+									<td>
+										<table>
+											<tr><td>
+												<input type="image"
+													onclick="setAction('sortBySourceUp', 'booksForm');"
+													src="<%=sessionBean.getApplicationBean().getUpImage()%>"/>
+											</td></tr>
+											<tr><td>
+												<input type="image"
+													onclick="setAction('sortBySourceDown', 'booksForm');"
+													src="<%=sessionBean.getApplicationBean().getDownImage()%>"/>
+											</td></tr>
+										</table>
+									</td>
+								</tr>
+								<tr>
+									<td>
+										<input type="text" name="sourceFilter" value="<%= sessionBean.getBooksPage().getSourceFilter()%>" size="5"/>
+									</td>
+									<td>
+										<input type="image"
+											onclick="setAction('filter', 'booksForm');"
+											src="<%=sessionBean.getApplicationBean().getFilterImage()%>"/>
+									</td>
+								</tr>
+							</table>
+						</td>
+
 						<td><label class="tableTitle">Edit TOC</label></td> <!-- go to toc page -->
 						<td>
 							<table class="sortTable">
 								<tr>
 									<td><label class="tableTitle">TOC Done
-										
+
 										</label>
 									</td>
 									<td>
@@ -338,12 +380,12 @@
 											<tr><td>
 												<input type="image"
 													onclick="setAction('sortByTocCorrectionUp', 'booksForm');"
-													src="<%=sessionBean.getApplicationBean().getUpImage()%>"/>										
+													src="<%=sessionBean.getApplicationBean().getUpImage()%>"/>
 											</td></tr>
 											<tr><td>
 												<input type="image"
 													onclick="setAction('sortByTocCorrectionDown', 'booksForm');"
-													src="<%=sessionBean.getApplicationBean().getDownImage()%>"/>																	
+													src="<%=sessionBean.getApplicationBean().getDownImage()%>"/>
 											</td></tr>
 										</table>
 									</td>
@@ -359,12 +401,12 @@
 											<tr><td>
 												<input type="image"
 													onclick="setAction('sortByEditorUp', 'booksForm');"
-													src="<%=sessionBean.getApplicationBean().getUpImage()%>"/>										
+													src="<%=sessionBean.getApplicationBean().getUpImage()%>"/>
 											</td></tr>
 											<tr><td>
 												<input type="image"
 													onclick="setAction('sortByEditorDown', 'booksForm');"
-													src="<%=sessionBean.getApplicationBean().getDownImage()%>"/>																	
+													src="<%=sessionBean.getApplicationBean().getDownImage()%>"/>
 											</td></tr>
 										</table>
 									</td>
@@ -372,12 +414,12 @@
 								<tr>
 									<td>
 										<input type="text" name="lastEditorFilter" value="<%= sessionBean.getBooksPage().getLastEditorFilter()%>" size="7"/>
-									</td>									
+									</td>
 									<td>
 										<input type="image"
 											onclick="setAction('filter', 'booksForm');"
 											src="<%=sessionBean.getApplicationBean().getFilterImage()%>"/>
-									</td>							
+									</td>
 								</tr>
 							</table>
 						</td>
@@ -390,12 +432,12 @@
 											<tr><td>
 												<input type="image"
 													onclick="setAction('sortByDateUp', 'booksForm');"
-													src="<%=sessionBean.getApplicationBean().getUpImage()%>"/>										
+													src="<%=sessionBean.getApplicationBean().getUpImage()%>"/>
 											</td></tr>
 											<tr><td>
 												<input type="image"
 													onclick="setAction('sortByDateDown', 'booksForm');"
-													src="<%=sessionBean.getApplicationBean().getDownImage()%>"/>																	
+													src="<%=sessionBean.getApplicationBean().getDownImage()%>"/>
 											</td></tr>
 										</table>
 									</td>
@@ -403,12 +445,12 @@
 								<tr>
 									<td>
 										<input type="text" name="editTimeFilter" value="<%= sessionBean.getBooksPage().getEditTimeFilter()%>" size="9"/>
-									</td>									
+									</td>
 									<td>
 										<input type="image"
 											onclick="setAction('filter', 'booksForm');"
 											src="<%=sessionBean.getApplicationBean().getFilterImage()%>"/>
-									</td>							
+									</td>
 								</tr>
 							</table>
 						</td>
@@ -416,17 +458,17 @@
 							<table class="sortTable">
 								<tr>
 									<td><label class="tableTitle">Comments</label></td>
-									
+
 								</tr>
 							</table>
 						</td>
-					
-						
-					</tr>	
-					
-					
+
+
+					</tr>
+
+
 					<% for (DBBook book : sessionBean.getBooksPage().getDisplayBookList() ) {%>
-					
+
 					<tr>
 						<!-- books info -->
 						<td><%=book.getId() %></td>
@@ -437,51 +479,50 @@
 						<td><%=book.getPeriod() %></td>
 						<td><%=book.getDynasty() %></td>
 						<td><%=book.getAdmin_type() %></td>
-						<td><%=book.getStart_year() %></td>
+						<td><%=book.getYear() %></td>
 						<td><a href="<%=sessionBean.getApplicationBean().getTocInterfaceUrl()%>/check_sections_details.php?book_id=<%=book.getId() %>&amp;count=10000&amp;sessionId=<%= session.getId()%>" target="blank">
 						Edit TOC</a></td>
-						
-						<td>						
-						
+
+						<td>
+
 						<% if ( book.getTocCorrection().equals("1") ) { %>
-							<input type="image"	onclick="setAction0('unSetTocCorrection', 'booksForm', 'tocBookId', '<%=book.getId() %>');"	
+							<input type="image"	onclick="setAction0('unSetTocCorrection', 'booksForm', 'tocBookId', '<%=book.getId() %>');"
 								src="<%=sessionBean.getApplicationBean().getCheckboxCheckedImage()%>" width="20" height="20"/>
-							
+
 						<% } else { %>
-							<input type="image" onclick="setAction0('setTocCorrection', 'booksForm', 'tocBookId', '<%=book.getId() %>');"	
+							<input type="image" onclick="setAction0('setTocCorrection', 'booksForm', 'tocBookId', '<%=book.getId() %>');"
 								src="<%=sessionBean.getApplicationBean().getCheckboxUncheckedImage()%>" width="20" height="20"/>
-						
+
 						<% } %>
-						
+
 						</td>
-						
+
 						<td><%= (book.getCurrentSectionVersion() == null) ? "" : book.getCurrentSectionVersion().getEditor() %></td>
 						<td><%= (book.getCurrentSectionVersion() == null) ? "" : book.getCurrentSectionVersion().getDate() %></td>
-						
-						<td>			
+
+						<td>
 							<textarea rows="2" cols="15" maxlength="100" name='<%=book.getId()%>' onchange="setComment(this)" ><%=book.getComments()%></textarea>
-							<input type="image" alt="save comment" 
-								onclick="setAction0('saveComment', 'booksForm', 'currentBookId', '<%=book.getId()%>');" 
-								src="<%=sessionBean.getApplicationBean().getSaveImage()%>" width="20" height="20"/>							
-							
+							<input type="image" alt="save comment"
+								onclick="setAction0('saveComment', 'booksForm', 'currentBookId', '<%=book.getId()%>');"
+								src="<%=sessionBean.getApplicationBean().getSaveImage()%>" width="20" height="20"/>
+
 						</td>
-						
+
 					</tr>
-					
+
 					<% } %>
 				</table>
-				
+
 				<jsp:include page="../componentes/paginator.jsp">
 					<jsp:param name="formName" value="booksForm"/>
 				</jsp:include>
-				
+
 			</div>
-		
-					
+
+
 		<% } %>
 		</form>
 	</div>
-	
+
 </body>
 </html>
-