package org.akaza.openclinica.control.submit; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collection; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.ResourceBundle; import java.util.Set; import javax.servlet.http.HttpServletResponse; import org.akaza.openclinica.bean.core.ResolutionStatus; import org.akaza.openclinica.bean.core.Role; import org.akaza.openclinica.bean.core.Status; import org.akaza.openclinica.bean.core.SubjectEventStatus; import org.akaza.openclinica.bean.login.StudyUserRoleBean; import org.akaza.openclinica.bean.login.UserAccountBean; import org.akaza.openclinica.bean.managestudy.StudyBean; import org.akaza.openclinica.bean.managestudy.StudyEventBean; import org.akaza.openclinica.bean.managestudy.StudyEventDefinitionBean; import org.akaza.openclinica.bean.managestudy.StudyGroupClassBean; import org.akaza.openclinica.bean.managestudy.StudySubjectBean; import org.akaza.openclinica.bean.submit.EventCRFBean; import org.akaza.openclinica.bean.submit.SubjectBean; import org.akaza.openclinica.control.AbstractTableFactory; import org.akaza.openclinica.control.DefaultActionsEditor; import org.akaza.openclinica.dao.managestudy.DiscrepancyNoteDAO; import org.akaza.openclinica.dao.managestudy.EventDefinitionCRFDAO; import org.akaza.openclinica.dao.managestudy.ListDiscNotesSubjectFilter; import org.akaza.openclinica.dao.managestudy.ListDiscNotesSubjectSort; import org.akaza.openclinica.dao.managestudy.StudyDAO; import org.akaza.openclinica.dao.managestudy.StudyEventDAO; import org.akaza.openclinica.dao.managestudy.StudyEventDefinitionDAO; import org.akaza.openclinica.dao.managestudy.StudyGroupClassDAO; import org.akaza.openclinica.dao.managestudy.StudyGroupDAO; import org.akaza.openclinica.dao.managestudy.StudySubjectDAO; import org.akaza.openclinica.dao.submit.EventCRFDAO; import org.akaza.openclinica.dao.submit.SubjectDAO; import org.akaza.openclinica.dao.submit.SubjectGroupMapDAO; import org.akaza.openclinica.i18n.util.ResourceBundleProvider; import org.apache.commons.lang.StringUtils; import org.jmesa.core.filter.FilterMatcher; import org.jmesa.core.filter.MatcherKey; import org.jmesa.facade.TableFacade; import org.jmesa.limit.Filter; import org.jmesa.limit.FilterSet; import org.jmesa.limit.Limit; import org.jmesa.limit.Sort; import org.jmesa.limit.SortSet; import org.jmesa.view.component.Row; import org.jmesa.view.editor.BasicCellEditor; import org.jmesa.view.editor.CellEditor; import org.jmesa.view.html.HtmlBuilder; import org.jmesa.view.html.editor.DroplistFilterEditor; public class ListDiscNotesSubjectTableFactory extends AbstractTableFactory { private StudyEventDefinitionDAO studyEventDefinitionDao; private StudySubjectDAO studySubjectDAO; private SubjectDAO subjectDAO; private StudyEventDAO studyEventDAO; private StudyGroupClassDAO studyGroupClassDAO; private SubjectGroupMapDAO subjectGroupMapDAO; private StudyGroupDAO studyGroupDAO; private StudyDAO studyDAO; private EventCRFDAO eventCRFDAO; private EventDefinitionCRFDAO eventDefintionCRFDAO; private DiscrepancyNoteDAO discrepancyNoteDAO; private StudyBean studyBean; private String[] columnNames = new String[] {}; private ArrayList<StudyEventDefinitionBean> studyEventDefinitions; private ArrayList<StudyGroupClassBean> studyGroupClasses; private StudyUserRoleBean currentRole; private UserAccountBean currentUser; private ResourceBundle resword; private ResourceBundle resformat; private ResourceBundle resterm; private String module; private Integer resolutionStatus; private Integer discNoteType; private Boolean studyHasDiscNotes; private Set<Integer> resolutionStatusIds; final HashMap<Integer, String> imageIconPaths = new HashMap<Integer, String>(8); final HashMap<Integer, String> discNoteIconPaths = new HashMap<Integer, String>(8); public ListDiscNotesSubjectTableFactory(ResourceBundle resterm) { this.resterm = resterm; imageIconPaths.put(1, "images/icon_Scheduled.gif"); imageIconPaths.put(2, "images/icon_NotStarted.gif"); imageIconPaths.put(3, "images/icon_InitialDE.gif"); imageIconPaths.put(4, "images/icon_DEcomplete.gif"); imageIconPaths.put(5, "images/icon_Stopped.gif"); imageIconPaths.put(6, "images/icon_Skipped.gif"); imageIconPaths.put(7, "images/icon_Locked.gif"); imageIconPaths.put(8, "images/icon_Signed.gif"); discNoteIconPaths.put(1, "<img name='icon_Note' src='images/icon_Note.gif' border='0' alt='" + resterm.getString("Open") + "' title='" + resterm.getString("Open") + "' align='left'/>"); discNoteIconPaths.put(2, "<img name='icon_flagYellow' src='images/icon_flagYellow.gif' border='0' alt='" + resterm.getString("Updated") + "' title='" + resterm.getString("Updated") + "' align='left'/>"); discNoteIconPaths.put(3, "<img name='icon_flagGreen' src='images/icon_flagGreen.gif' border='0' alt='" + resterm.getString("Resolved") + "' title='" + resterm.getString("Resolved") + "' align='left'/>"); discNoteIconPaths.put(4, "<img name='icon_flagBlack' src='images/icon_flagBlack.gif' border='0' alt='" + resterm.getString("Closed") + "' title='" + resterm.getString("Closed") + "' align='left'/>"); discNoteIconPaths.put(5, "<img name='icon_flagWhite' src='images/icon_flagWhite.gif' border='0' alt='" + resterm.getString("Not_Applicable") + "' title='" + resterm.getString("Not_Applicable") + "' align='left'/>"); } @Override protected String getTableName() { return "listDiscNotes"; } @Override protected void configureColumns(TableFacade tableFacade, Locale locale) { resword = ResourceBundleProvider.getWordsBundle(locale); resformat = ResourceBundleProvider.getFormatBundle(locale); tableFacade.setColumnProperties(columnNames); Row row = tableFacade.getTable().getRow(); configureColumn(row.getColumn(columnNames[0]), resword.getString("study_subject_ID"), null, null); configureColumn(row.getColumn(columnNames[1]), resword.getString("subject_status"), new StatusCellEditor(), new StatusDroplistFilterEditor()); configureColumn(row.getColumn(columnNames[2]), "Site ID", null, null); // study event definition columns for (int i = 3; i < columnNames.length - 1; i++) { StudyEventDefinitionBean studyEventDefinition = studyEventDefinitions.get(i - 3); configureColumn(row.getColumn(columnNames[i]), studyEventDefinition.getName(), new StudyEventDefinitionMapCellEditor(), new SubjectEventStatusDroplistFilterEditor(), true, false); } String actionsHeader = resword.getString("rule_actions") + "               "; configureColumn(row.getColumn(columnNames[columnNames.length - 1]), actionsHeader, new ActionsCellEditor(), new DefaultActionsEditor(locale), true, false); } @Override public void configureTableFacade(HttpServletResponse response, TableFacade tableFacade) { super.configureTableFacade(response, tableFacade); // getColumnNames(); getColumnNamesMap(); tableFacade.addFilterMatcher(new MatcherKey(Character.class), new CharFilterMatcher()); tableFacade.addFilterMatcher(new MatcherKey(Status.class), new StatusFilterMatcher()); // tableFacade.addFilterMatcher(new MatcherKey(Integer.class), new // SubjectEventStatusFilterMatcher()); for (int i = 3; i < columnNames.length - 1; i++) { tableFacade.addFilterMatcher(new MatcherKey(Integer.class, columnNames[i]), new SubjectEventStatusFilterMatcher()); } } @Override public void configureTableFacadePostColumnConfiguration(TableFacade tableFacade) { ListDiscNotesSubjectTableToolbar toolbar = new ListDiscNotesSubjectTableToolbar(getStudyEventDefinitions()); toolbar.setStudyHasDiscNotes(studyHasDiscNotes); toolbar.setDiscNoteType(discNoteType); toolbar.setResolutionStatus(resolutionStatus); toolbar.setResword(resword); toolbar.setModule(module); tableFacade.setToolbar(toolbar); } @Override public void setDataAndLimitVariables(TableFacade tableFacade) { StudyBean study = this.getStudyBean(); Limit limit = tableFacade.getLimit(); ListDiscNotesSubjectFilter subjectFilter = getSubjectFilter(limit); subjectFilter.addFilter("dn.discrepancy_note_type_id", this.discNoteType); StringBuffer constraints = new StringBuffer(); if (this.discNoteType > 0 && this.discNoteType < 10) { constraints.append(" and dn.discrepancy_note_type_id=" + this.discNoteType); } if (this.resolutionStatusIds != null && this.resolutionStatusIds.size() > 0) { String s = " and ("; for (Integer resolutionStatusId : this.resolutionStatusIds) { s += "dn.resolution_status_id = " + resolutionStatusId + " or "; } s = s.substring(0, s.length() - 3) + " )"; subjectFilter.addFilter("dn.resolution_status_id", s); constraints.append(s); } if (!limit.isComplete()) { int totalRows = getStudySubjectDAO().getCountWithFilter(subjectFilter, study); tableFacade.setTotalRows(totalRows); } ListDiscNotesSubjectSort subjectSort = getSubjectSort(limit); int rowStart = limit.getRowSelect().getRowStart(); int rowEnd = limit.getRowSelect().getRowEnd(); Collection<StudySubjectBean> items = getStudySubjectDAO().getWithFilterAndSort(study, subjectFilter, subjectSort, rowStart, rowEnd); Collection<HashMap<Object, Object>> theItems = new ArrayList<HashMap<Object, Object>>(); boolean hasDN = false; for (StudySubjectBean studySubjectBean : items) { HashMap<Object, Object> theItem = new HashMap<Object, Object>(); theItem.put("studySubject", studySubjectBean); theItem.put("studySubject.label", studySubjectBean.getLabel()); theItem.put("studySubject.status", studySubjectBean.getStatus()); theItem.put("enrolledAt", ((StudyBean) getStudyDAO().findByPK(studySubjectBean.getStudyId())).getIdentifier()); // Get All study events for this study subject and then put list in // HashMap with study event definition id as // key and a list of study events as the value. List<StudyEventBean> allStudyEventsForStudySubject = getStudyEventDAO().findAllByStudySubject(studySubjectBean); HashMap<Integer, List<StudyEventBean>> allStudyEventsForStudySubjectBySedId = new HashMap<Integer, List<StudyEventBean>>(); theItem.put("isSignable", isSignable(allStudyEventsForStudySubject)); for (StudyEventBean studyEventBean : allStudyEventsForStudySubject) { if (allStudyEventsForStudySubjectBySedId.get(studyEventBean.getStudyEventDefinitionId()) == null) { ArrayList<StudyEventBean> a = new ArrayList<StudyEventBean>(); a.add(studyEventBean); allStudyEventsForStudySubjectBySedId.put(studyEventBean.getStudyEventDefinitionId(), a); } else { allStudyEventsForStudySubjectBySedId.get(studyEventBean.getStudyEventDefinitionId()).add(studyEventBean); } } for (StudyEventDefinitionBean studyEventDefinition : getStudyEventDefinitions()) { List<StudyEventBean> studyEvents = allStudyEventsForStudySubjectBySedId.get(studyEventDefinition.getId()); SubjectEventStatus subjectEventStatus = null; HashMap<ResolutionStatus, Integer> discCounts = new HashMap<ResolutionStatus, Integer>(); studyEvents = studyEvents == null ? new ArrayList<StudyEventBean>() : studyEvents; if (studyEvents.size() < 1) { subjectEventStatus = SubjectEventStatus.NOT_SCHEDULED; } else { for (StudyEventBean studyEventBean : studyEvents) { discCounts = countAll(discCounts, studyEventBean, constraints, study.isSite(study.getParentStudyId())); hasDN = hasDN == false ? discCounts.size() > 0 : hasDN; if (studyEventBean.getSampleOrdinal() == 1) { subjectEventStatus = studyEventBean.getSubjectEventStatus(); // break; } } } theItem.put("sed_" + studyEventDefinition.getId() + "_discCounts", discCounts); theItem.put("sed_" + studyEventDefinition.getId(), subjectEventStatus.getId()); theItem.put("sed_" + studyEventDefinition.getId() + "_studyEvents", studyEvents); theItem.put("sed_" + studyEventDefinition.getId() + "_object", studyEventDefinition); } theItems.add(theItem); } // Do not forget to set the items back on the tableFacade. tableFacade.setItems(theItems); setStudyHasDiscNotes(hasDN); } private Boolean isSignable(List<StudyEventBean> allStudyEventsForStudySubject) { boolean isSignable = true; boolean isRequiredUncomplete; for (StudyEventBean studyEventBean : allStudyEventsForStudySubject) { if (studyEventBean.getSubjectEventStatus() == SubjectEventStatus.DATA_ENTRY_STARTED) { isSignable = false; break; } else { isRequiredUncomplete = eventHasRequiredUncompleteCRFs(studyEventBean); if (isRequiredUncomplete) { isSignable = false; break; } } } return isSignable; } @SuppressWarnings("unchecked") private boolean eventHasRequiredUncompleteCRFs(StudyEventBean studyEventBean) { List<EventCRFBean> eventCrfBeans = new ArrayList<EventCRFBean>(); eventCrfBeans.addAll(getEventCRFDAO().findAllByStudyEvent(studyEventBean)); // If the EventCRFBean has a completionStatusId of 0 (indicating that it // is not complete), // then find out whether it's required. If so, then return from the // method false. for (EventCRFBean crfBean : eventCrfBeans) { if (crfBean != null && crfBean.getCompletionStatusId() == 0) { if (getEventDefintionCRFDAO().isRequiredInDefinition(crfBean.getCRFVersionId(), studyEventBean)) { return true; } } } return false; } private void getColumnNamesMap() { ArrayList<String> columnNamesList = new ArrayList<String>(); columnNamesList.add("studySubject.label"); columnNamesList.add("studySubject.status"); columnNamesList.add("enrolledAt"); for (StudyEventDefinitionBean studyEventDefinition : getStudyEventDefinitions()) { columnNamesList.add("sed_" + studyEventDefinition.getId()); } columnNamesList.add("actions"); columnNames = columnNamesList.toArray(columnNames); } protected ListDiscNotesSubjectFilter getSubjectFilter(Limit limit) { ListDiscNotesSubjectFilter listDiscNotesSubjectFilter = new ListDiscNotesSubjectFilter(); FilterSet filterSet = limit.getFilterSet(); Collection<Filter> filters = filterSet.getFilters(); for (Filter filter : filters) { String property = filter.getProperty(); String value = filter.getValue(); listDiscNotesSubjectFilter.addFilter(property, value); } return listDiscNotesSubjectFilter; } /** * A very custom way to sort the items. The PresidentSort acts as a command * for the Hibernate criteria object. There are probably many ways to do * this, but this is the most flexible way I have found. The point is you * need to somehow take the Limit information and sort the rows. * * @param limit * The Limit to use. */ protected ListDiscNotesSubjectSort getSubjectSort(Limit limit) { ListDiscNotesSubjectSort listDiscNotesSubjectSort = new ListDiscNotesSubjectSort(); SortSet sortSet = limit.getSortSet(); Collection<Sort> sorts = sortSet.getSorts(); for (Sort sort : sorts) { String property = sort.getProperty(); String order = sort.getOrder().toParam(); listDiscNotesSubjectSort.addSort(property, order); } return listDiscNotesSubjectSort; } @SuppressWarnings("unchecked") private ArrayList<StudyEventDefinitionBean> getStudyEventDefinitions() { if (this.studyEventDefinitions == null) { if (studyBean.getParentStudyId() > 0) { StudyBean parentStudy = (StudyBean) getStudyDAO().findByPK(studyBean.getParentStudyId()); studyEventDefinitions = getStudyEventDefinitionDao().findAllByStudy(parentStudy); } else { studyEventDefinitions = getStudyEventDefinitionDao().findAllByStudy(studyBean); } } return this.studyEventDefinitions; } public StudyEventDefinitionDAO getStudyEventDefinitionDao() { return studyEventDefinitionDao; } public void setStudyEventDefinitionDao(StudyEventDefinitionDAO studyEventDefinitionDao) { this.studyEventDefinitionDao = studyEventDefinitionDao; } public StudyBean getStudyBean() { return studyBean; } public void setStudyBean(StudyBean studyBean) { this.studyBean = studyBean; } public StudySubjectDAO getStudySubjectDAO() { return studySubjectDAO; } public void setStudySubjectDAO(StudySubjectDAO studySubjectDAO) { this.studySubjectDAO = studySubjectDAO; } public SubjectDAO getSubjectDAO() { return subjectDAO; } public void setSubjectDAO(SubjectDAO subjectDAO) { this.subjectDAO = subjectDAO; } public StudyEventDAO getStudyEventDAO() { return studyEventDAO; } public void setStudyEventDAO(StudyEventDAO studyEventDAO) { this.studyEventDAO = studyEventDAO; } public StudyGroupClassDAO getStudyGroupClassDAO() { return studyGroupClassDAO; } public void setStudyGroupClassDAO(StudyGroupClassDAO studyGroupClassDAO) { this.studyGroupClassDAO = studyGroupClassDAO; } public SubjectGroupMapDAO getSubjectGroupMapDAO() { return subjectGroupMapDAO; } public void setSubjectGroupMapDAO(SubjectGroupMapDAO subjectGroupMapDAO) { this.subjectGroupMapDAO = subjectGroupMapDAO; } public StudyDAO getStudyDAO() { return studyDAO; } public void setStudyDAO(StudyDAO studyDAO) { this.studyDAO = studyDAO; } public StudyUserRoleBean getCurrentRole() { return currentRole; } public void setCurrentRole(StudyUserRoleBean currentRole) { this.currentRole = currentRole; } public EventCRFDAO getEventCRFDAO() { return eventCRFDAO; } public void setEventCRFDAO(EventCRFDAO eventCRFDAO) { this.eventCRFDAO = eventCRFDAO; } public EventDefinitionCRFDAO getEventDefintionCRFDAO() { return eventDefintionCRFDAO; } public void setEventDefintionCRFDAO(EventDefinitionCRFDAO eventDefintionCRFDAO) { this.eventDefintionCRFDAO = eventDefintionCRFDAO; } public StudyGroupDAO getStudyGroupDAO() { return studyGroupDAO; } public void setStudyGroupDAO(StudyGroupDAO studyGroupDAO) { this.studyGroupDAO = studyGroupDAO; } public DiscrepancyNoteDAO getDiscrepancyNoteDAO() { return discrepancyNoteDAO; } public void setDiscrepancyNoteDAO(DiscrepancyNoteDAO discrepancyNoteDAO) { this.discrepancyNoteDAO = discrepancyNoteDAO; } public ResourceBundle getResword() { return resword; } public void setResword(ResourceBundle resword) { this.resword = resword; } public ResourceBundle getResterm() { return resterm; } public void setResterm(ResourceBundle resterm) { this.resterm = resterm; } public String getModule() { return module; } public void setModule(String module) { this.module = module; } public UserAccountBean getCurrentUser() { return currentUser; } public Integer getResolutionStatus() { return resolutionStatus; } public void setResolutionStatus(Integer resolutionStatus) { this.resolutionStatus = resolutionStatus; } public Integer getDiscNoteType() { return discNoteType; } public void setDiscNoteType(Integer discNoteType) { this.discNoteType = discNoteType; } public Boolean isStudyHasDiscNotes() { return studyHasDiscNotes; } public void setStudyHasDiscNotes(Boolean studyHasDiscNotes) { this.studyHasDiscNotes = studyHasDiscNotes; } public void setCurrentUser(UserAccountBean currentUser) { this.currentUser = currentUser; } private class CharFilterMatcher implements FilterMatcher { public boolean evaluate(Object itemValue, String filterValue) { String item = StringUtils.lowerCase(String.valueOf(itemValue)); String filter = StringUtils.lowerCase(String.valueOf(filterValue)); if (StringUtils.contains(item, filter)) { return true; } return false; } } public class StatusFilterMatcher implements FilterMatcher { public boolean evaluate(Object itemValue, String filterValue) { String item = StringUtils.lowerCase(String.valueOf(((Status) itemValue).getId())); String filter = StringUtils.lowerCase(String.valueOf(filterValue)); if (filter.equals(item)) { return true; } return false; } } public class SubjectEventStatusFilterMatcher implements FilterMatcher { public boolean evaluate(Object itemValue, String filterValue) { String item = StringUtils.lowerCase(String.valueOf(itemValue)); String filter = StringUtils.lowerCase(String.valueOf(filterValue)); if (filter.equals(item)) { return true; } return false; } } public class SubjectGroupFilterMatcher implements FilterMatcher { public boolean evaluate(Object itemValue, String filterValue) { String item = StringUtils.lowerCase(String.valueOf(itemValue).trim()); String filter = StringUtils.lowerCase(String.valueOf(filterValue.trim())); if (filter.equals(item)) { return true; } return false; } } private class StatusCellEditor implements CellEditor { public Object getValue(Object item, String property, int rowcount) { StudySubjectBean studySubject = (StudySubjectBean) new BasicCellEditor().getValue(item, "studySubject", rowcount); return studySubject.getStatus().getName(); } } private class StatusDroplistFilterEditor extends DroplistFilterEditor { @Override protected List<Option> getOptions() { List<Option> options = new ArrayList<Option>(); for (Object status : Status.toActiveArrayList()) { ((Status) status).getName(); options.add(new Option(String.valueOf(((Status) status).getId()), ((Status) status).getName())); } return options; } } private class SubjectEventStatusDroplistFilterEditor extends DroplistFilterEditor { @Override protected List<Option> getOptions() { List<Option> options = new ArrayList<Option>(); for (Object subjectEventStatus : SubjectEventStatus.toArrayList()) { ((SubjectEventStatus) subjectEventStatus).getName(); options.add(new Option(String.valueOf(((SubjectEventStatus) subjectEventStatus).getId()), ((SubjectEventStatus) subjectEventStatus).getName())); } return options; } } private class StudyEventDefinitionMapCellEditor implements CellEditor { StudyEventDefinitionBean studyEventDefinition; StudySubjectBean studySubjectBean; SubjectEventStatus subjectEventStatus; List<StudyEventBean> studyEvents; SubjectBean subject; HashMap<ResolutionStatus, Integer> discCounts; private String getCount() { return studyEvents.size() < 2 ? "" : " x" + String.valueOf(studyEvents.size() + ""); } @SuppressWarnings("unchecked") public Object getValue(Object item, String property, int rowcount) { studyEvents = (List<StudyEventBean>) ((HashMap<Object, Object>) item).get(property + "_studyEvents"); studyEventDefinition = (StudyEventDefinitionBean) ((HashMap<Object, Object>) item).get(property + "_object"); subjectEventStatus = SubjectEventStatus.get((Integer) ((HashMap<Object, Object>) item).get(property)); subject = (SubjectBean) ((HashMap<Object, Object>) item).get("subject"); studySubjectBean = (StudySubjectBean) ((HashMap<Object, Object>) item).get("studySubject"); discCounts = (HashMap<ResolutionStatus, Integer>) ((HashMap<Object, Object>) item).get(property + "_discCounts"); StringBuilder url = new StringBuilder(); url.append("<table><tr><td><img src='" + imageIconPaths.get(subjectEventStatus.getId()) + "' border='0'>"); url.append(getCount() + "</td></tr>"); url.append("<tr>"); for (ResolutionStatus key : discCounts.keySet()) { url.append("<td>"); url.append(discNoteIconPaths.get(key.getId()) + "(" + discCounts.get(key) + ")"); url.append("</td>"); } if (discCounts.keySet().size() <= 1) { url.append("<td>"); url.append("<img border=\"0\" src=\"images/icon_transparent.gif\"/>  "); url.append("</td>"); url.append("<td>"); url.append("<img border=\"0\" src=\"images/icon_transparent.gif\"/>  "); if (studyEventDefinition.getName().length() > 9) { int totNumOfSpaces = studyEventDefinition.getName().length() - 9; for (int i = 0; i < totNumOfSpaces; i++) { url.append(" "); } } url.append("</td>"); } url.append("</tr></table>"); return url.toString(); } } private class ActionsCellEditor implements CellEditor { @SuppressWarnings("unchecked") public Object getValue(Object item, String property, int rowcount) { String value = ""; StudySubjectBean studySubjectBean = (StudySubjectBean) ((HashMap<Object, Object>) item).get("studySubject"); Integer studySubjectId = studySubjectBean.getId(); if (studySubjectId != null) { StringBuilder url = new StringBuilder(); url.append(viewNotesLinkBuilder(studySubjectBean)); url.append(downloadNotesLinkBuilder(studySubjectBean)); value = url.toString(); } return value; } } private String viewNotesLinkBuilder(StudySubjectBean studySubject) { HtmlBuilder actionLink = new HtmlBuilder(); if (this.getResolutionStatus() >= 1 && this.getResolutionStatus() <= 5) { actionLink.a().href( "ViewNotes?viewForOne=y&id=" + studySubject.getId() + "&resolutionStatus=" + resolutionStatus + "discNoteType=" + discNoteType + "&module=" + module + "&listNotes_f_studySubject.label=" + studySubject.getLabel()); actionLink.append("onMouseDown=\"javascript:setImage('bt_View1','images/bt_View_d.gif');\""); actionLink.append("onMouseUp=\"javascript:setImage('bt_View1','images/bt_View.gif');\"").close(); actionLink.img().name("bt_View1").src("images/bt_View.gif").border("0").alt(resword.getString("view")).title(resword.getString("view")).append( "hspace=\"4\" style=\"float:left\" width=\"24 \" height=\"15\" align=\"left\"").end().aEnd(); actionLink.append("   "); } else { actionLink.a().href( "ViewNotes?viewForOne=y&id=" + studySubject.getId() + "&module=" + module + "&listNotes_f_studySubject.label=" + studySubject.getLabel()); actionLink.append("onMouseDown=\"javascript:setImage('bt_View1','images/bt_View_d.gif');\""); actionLink.append("onMouseUp=\"javascript:setImage('bt_View1','images/bt_View.gif');\"").close(); actionLink.img().name("bt_View1").src("images/bt_View.gif").border("0").alt(resword.getString("view")).title(resword.getString("view")).append( "hspace=\"2\" style=\"float:left\" width=\"24 \" height=\"15\" align=\"left\"").end().aEnd(); actionLink.append("   "); } return actionLink.toString(); } private String downloadNotesLinkBuilder(StudySubjectBean studySubject) { HtmlBuilder actionLink = new HtmlBuilder(); if (this.isStudyHasDiscNotes()) { if (this.getResolutionStatus() >= 1 && this.getResolutionStatus() <= 5) { actionLink.a().href( "javascript:openDocWindow('ChooseDownloadFormat?subjectId=" + studySubject.getId() + "&discNoteType=" + discNoteType + "&resolutionStatus=" + resolutionStatus + "')").close(); actionLink.img().name("bt_Download").src("images/bt_Download.gif").border("0").alt(resword.getString("download_discrepancy_notes")).title( resword.getString("download_discrepancy_notes")).append("hspace=\"4\" width=\"24 \" height=\"15\"").end().aEnd(); actionLink.append("   "); } else { actionLink.a().href( "javascript:openDocWindow('ChooseDownloadFormat?subjectId=" + studySubject.getId() + "&discNoteType=" + discNoteType + "&module=" + module + "')").close(); actionLink.img().name("bt_View1").src("images/bt_Download.gif").border("0").alt(resword.getString("download_discrepancy_notes")).title( resword.getString("download_discrepancy_notes")).append("hspace=\"2\" width=\"24 \" height=\"15\"").end().aEnd(); actionLink.append("   "); } } return actionLink.toString(); } private String reAssignStudySubjectLinkBuilder(StudySubjectBean studySubject) { HtmlBuilder actionLink = new HtmlBuilder(); actionLink.a().href("ReassignStudySubject?id=" + studySubject.getId()); actionLink.append("onMouseDown=\"javascript:setImage('bt_Reassign1','images/bt_Reassign_d.gif');\""); actionLink.append("onMouseUp=\"javascript:setImage('bt_Reassign1','images/bt_Reassign.gif');\"").close(); actionLink.img().name("bt_Reassign1").src("images/bt_Reassign.gif").border("0").alt(resword.getString("reassign")).title(resword.getString("reassign")).append("hspace=\"2\"").end().aEnd(); actionLink.append("   "); return actionLink.toString(); } private String restoreStudySubjectLinkBuilder(StudySubjectBean studySubject) { HtmlBuilder actionLink = new HtmlBuilder(); actionLink.a().href( "RestoreStudySubject?action=confirm&id=" + studySubject.getId() + "&subjectId=" + studySubject.getSubjectId() + "&studyId=" + studySubject.getStudyId()); actionLink.append("onMouseDown=\"javascript:setImage('bt_Restor3','images/bt_Restore_d.gif');\""); actionLink.append("onMouseUp=\"javascript:setImage('bt_Restor3','images/bt_Restore_d.gif');\"").close(); actionLink.img().name("bt_Restore1").src("images/bt_Remove.gif").border("0").alt(resword.getString("restore")).title(resword.getString("restore")).align("left").append("hspace=\"6\"").end() .aEnd(); return actionLink.toString(); } private String eventDivBuilder(SubjectBean subject, Integer rowCount, List<StudyEventBean> studyEvents, StudyEventDefinitionBean sed, StudySubjectBean studySubject) { String studySubjectLabel = studySubject.getLabel(); String divWidth = studyEvents.size() >= 3 ? "540" : studyEvents.size() == 2 ? "360" : "180"; HtmlBuilder eventDiv = new HtmlBuilder(); eventDiv.table(0).border("0").cellpadding("0").cellspacing("0").close(); // Lock Div eventDiv.div().id("Lock_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount).style( "position: absolute; visibility: hidden; z-index: 3; width: 50px; height: 30px; top: 0px;").close(); lockLinkBuilder(eventDiv, studySubjectLabel, rowCount, studyEvents, sed); eventDiv.divEnd(); eventDiv.tr(0).valign("top").close().td(0).close(); // Event Div eventDiv.div().id("Event_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount).style( "position: absolute; visibility: hidden; z-index: 3;width:" + divWidth + "px; top: 0px; float: left;").close(); eventDiv.div().styleClass("box_T").close().div().styleClass("box_L").close().div().styleClass("box_R").close().div().styleClass("box_B").close().div() .styleClass("box_TL").close().div().styleClass("box_TR").close().div().styleClass("box_BL").close().div().styleClass("box_BR").close(); eventDiv.div().styleClass("tablebox_center").close(); eventDiv.div().styleClass("ViewSubjectsPopup").style("color: rgb(91, 91, 91);").close(); eventDiv.table(0).border("0").cellpadding("0").cellspacing("0").close(); eventDiv.tr(0).valign("top").close(); if (studyEvents.size() > 1) { repeatingEventDivBuilder(eventDiv, subject, rowCount, studyEvents, sed, studySubject); } else { singleEventDivBuilder(eventDiv, subject, rowCount, studyEvents, sed, studySubject); } return eventDiv.toString(); } private void repeatingEventDivBuilder(HtmlBuilder eventDiv, SubjectBean subject, Integer rowCount, List<StudyEventBean> studyEvents, StudyEventDefinitionBean sed, StudySubjectBean studySubject) { String tableHeaderRowStyleClass = "table_header_row"; String tableHeaderRowLeftStyleClass = "table_header_row_left"; String add_another_occurrence = resword.getString("add_another_occurrence"); String click_for_more_options = resword.getString("click_for_more_options"); String schedule = resword.getString("schedule"); String view = resword.getString("view")+"/"+resword.getString("enter_data"); String edit = resword.getString("edit"); String remove = resword.getString("remove"); String occurrence_x_of = resword.getString("ocurrence"); String subjectText = resword.getString("subject"); String eventText = resword.getString("event"); String status = resword.getString("status"); StudyEventBean defaultEvent = studyEvents.get(0); String studySubjectLabel = studySubject.getLabel(); Status eventSysStatus = studySubject.getStatus(); Integer studyEventsSize = studyEvents.size(); eventDiv.td(0).styleClass(tableHeaderRowLeftStyleClass).colspan("2").close(); eventDiv.append(subjectText).append(": ").append(studySubjectLabel).br(); eventDiv.append(eventText).append(": ").append(sed.getName()).br(); eventDiv.tdEnd(); eventDiv.td(0).styleClass(tableHeaderRowLeftStyleClass).align("right").colspan("3").close(); divCloseRepeatinglinkBuilder(eventDiv, studySubjectLabel, rowCount, studyEvents, sed); eventDiv.br(); if (eventSysStatus != Status.DELETED && eventSysStatus != Status.AUTO_DELETED && studyBean.getStatus() == Status.AVAILABLE) { eventDiv.span().styleClass("font-weight: normal;").close(); eventDiv.ahref("CreateNewStudyEvent?studySubjectId=" + studySubject.getId() + "&studyEventDefinition=" + sed.getId(), add_another_occurrence); } eventDiv.nbsp().nbsp().nbsp(); for (int i = 1; i <= studyEventsSize; i++) { eventDiv.ahref("javascript:StatusBoxSkip('" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "'," + studyEventsSize + "," + i + ");", String.valueOf(i)); if (i < studyEventsSize) { eventDiv.append("|"); } } eventDiv.spanEnd(); eventDiv.tdEnd().trEnd(0); eventDiv.tr(0).close(); // <td>...</td> eventDiv.td(0).id("Scroll_off_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "_back").styleClass("statusbox_scroll_L_dis").width("20") .close(); eventDiv.img().src("images/arrow_status_back_dis.gif").border("0").close(); eventDiv.tdEnd(); // <td>...</td> eventDiv.td(0).id("Scroll_on_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "_back").styleClass("statusbox_scroll_L").width("20").style( "display: none;").close(); // <div>...</div> eventDiv.div().id("bt_Scroll_Event_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "_back").style("display: none;").close(); eventDiv.a().href("javascript:StatusBoxBack('" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "'," + studyEventsSize + ");").close(); eventDiv.img().src("images/arrow_status_back.gif").border("0").close(); eventDiv.aEnd(); eventDiv.divEnd(); // <div>...</div> eventDiv.div().id("bt_Scroll_Event_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "_back_dis").close(); eventDiv.img().src("images/arrow_status_back_dis.gif").border("0").close(); eventDiv.divEnd(); eventDiv.tdEnd(); for (int i = 0; i < studyEvents.size(); i++) { StudyEventBean studyEventBean = studyEvents.get(i); // <td>...</td> eventDiv.td(0).id("Event_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "_" + (i + 1)).valign("top").width("180"); if (i + 1 > 3) { eventDiv.style("display: none;"); } eventDiv.close(); // <table>...</table> eventDiv.table(0).border("0").cellpadding("0").cellspacing("0").close(); // <tr><td>...</td></tr> eventDiv.tr(0).valign("top").close(); eventDiv.td(0).styleClass(tableHeaderRowStyleClass).colspan("2").close(); eventDiv.bold().append(occurrence_x_of).append("#" + (i + 1) + " of " + studyEventsSize).br(); eventDiv.append(formatDate(studyEventBean.getDateStarted())).br(); eventDiv.append(status + ": " + studyEventBean.getSubjectEventStatus().getName()); eventDiv.boldEnd().tdEnd().trEnd(0); // <tr><td><table>...</table></td></tr> eventDiv.tr(0).id("Menu_on_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "_" + (i + 1)).styleClass("display: none").close(); eventDiv.td(0).colspan("2").close(); eventDiv.table(0).border("0").cellpadding("0").cellspacing("0").close(); linksDivBuilder(eventDiv, subject, rowCount, studyEvents, sed, studySubject, studyEventBean); eventDiv.tableEnd(0).tdEnd().trEnd(0); eventDiv.tableEnd(0); eventDiv.tdEnd(); } // <td>...</td> eventDiv.td(0).id("Scroll_off_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "_next").styleClass("statusbox_scroll_R_dis").width("20") .close(); eventDiv.img().src("images/arrow_status_next_dis.gif").border("0").close(); eventDiv.tdEnd(); // <td>...</td> eventDiv.td(0).id("Scroll_on_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "_next").styleClass("statusbox_scroll_R").width("20").style( "display: none;").close(); // <div>...</div> eventDiv.div().id("bt_Scroll_Event_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "_next").close(); eventDiv.a().href("javascript:StatusBoxNext('" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "'," + studyEventsSize + ");").close(); eventDiv.img().src("images/arrow_status_next.gif").border("0").close(); eventDiv.aEnd(); eventDiv.divEnd(); // <div>...</div> eventDiv.div().id("bt_Scroll_Event_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "_next_dis").style("display: none;").close(); eventDiv.img().src("images/arrow_status_next_dis.gif").border("0").close(); eventDiv.divEnd(); eventDiv.tdEnd().trEnd(0); eventDiv.tr(0).id("Menu_off_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount).style("").close(); eventDiv.td(0).styleClass("table_cell_left").colspan(String.valueOf(studyEventsSize)).close().append("<i>").append(click_for_more_options).append( "</i>").tdEnd(); eventDiv.trEnd(0); eventDiv.tableEnd(0); eventDiv.divEnd().divEnd().divEnd().divEnd().divEnd().divEnd().divEnd().divEnd().divEnd().divEnd().divEnd(); repeatingIconLinkBuilder(eventDiv, studySubjectLabel, rowCount, studyEvents, sed); } private void linksDivBuilder(HtmlBuilder eventDiv, SubjectBean subject, Integer rowCount, List<StudyEventBean> studyEvents, StudyEventDefinitionBean sed, StudySubjectBean studySubject, StudyEventBean currentEvent) { Status eventSysStatus = studySubject.getStatus(); SubjectEventStatus eventStatus = currentEvent.getSubjectEventStatus(); String studyEventId = String.valueOf(currentEvent.getId()); String view = resword.getString("view")+"/"+resword.getString("enter_data"); String edit = resword.getString("edit"); String remove = resword.getString("remove");; if (eventSysStatus.getId() == Status.AVAILABLE.getId() || eventSysStatus == Status.SIGNED) { if (eventStatus == SubjectEventStatus.COMPLETED) { eventDiv.tr(0).valign("top").close(); eventDiv.td(0).styleClass("table_cell").close(); enterDataForStudyEventLinkBuilder(eventDiv, studyEventId, view); eventDiv.tdEnd().trEnd(0); if ((currentRole.getRole() == Role.STUDYDIRECTOR || currentUser.isSysAdmin()) && studyBean.getStatus() == Status.AVAILABLE) { eventDiv.tr(0).valign("top").close(); eventDiv.td(0).styleClass("table_cell").close(); updateStudyEventLinkBuilder(eventDiv, studySubject.getId(), studyEventId, edit); eventDiv.tdEnd().trEnd(0); eventDiv.tr(0).valign("top").close(); eventDiv.td(0).styleClass("table_cell").close(); removeStudyEventLinkBuilder(eventDiv, studySubject.getId(), studyEventId, remove); eventDiv.tdEnd().trEnd(0); } } else if (eventStatus == SubjectEventStatus.LOCKED) { if (currentRole.getRole() == Role.STUDYDIRECTOR || currentUser.isSysAdmin()) { eventDiv.tr(0).valign("top").close(); eventDiv.td(0).styleClass("table_cell").close(); enterDataForStudyEventLinkBuilder(eventDiv, studyEventId, view); eventDiv.tdEnd().trEnd(0); if (studyBean.getStatus() == Status.AVAILABLE) { eventDiv.tr(0).valign("top").close(); eventDiv.td(0).styleClass("table_cell").close(); removeStudyEventLinkBuilder(eventDiv, studySubject.getId(), studyEventId, remove); eventDiv.tdEnd().trEnd(0); } } } else { eventDiv.tr(0).valign("top").close(); eventDiv.td(0).styleClass("table_cell_left"); enterDataForStudyEventLinkBuilder(eventDiv, studyEventId, view); eventDiv.tdEnd().trEnd(0); if ((currentRole.getRole() == Role.STUDYDIRECTOR || currentUser.isSysAdmin()) && studyBean.getStatus() == Status.AVAILABLE) { eventDiv.tr(0).valign("top").close(); eventDiv.td(0).styleClass("table_cell_left").close(); updateStudyEventLinkBuilder(eventDiv, studySubject.getId(), studyEventId, edit); eventDiv.tdEnd().trEnd(0); eventDiv.tr(0).valign("top").close(); eventDiv.td(0).styleClass("table_cell_left").close(); removeStudyEventLinkBuilder(eventDiv, studySubject.getId(), studyEventId, remove); eventDiv.tdEnd().trEnd(0); } } } if (eventSysStatus == Status.DELETED || eventSysStatus == Status.AUTO_DELETED) { eventDiv.tr(0).valign("top").close(); eventDiv.td(0).styleClass("table_cell").close(); enterDataForStudyEventLinkBuilder(eventDiv, studyEventId, view); eventDiv.tdEnd().trEnd(0); } } private void singleEventDivBuilder(HtmlBuilder eventDiv, SubjectBean subject, Integer rowCount, List<StudyEventBean> studyEvents, StudyEventDefinitionBean sed, StudySubjectBean studySubject) { String tableHeaderRowStyleClass = "table_header_row"; String tableHeaderRowLeftStyleClass = "table_header_row_left"; String add_another_occurrence = resword.getString("add_another_occurrence"); String click_for_more_options = resword.getString("click_for_more_options"); String schedule = resword.getString("schedule"); String view = resword.getString("view")+"/"+resword.getString("enter_data"); String edit = resword.getString("edit"); String remove = resword.getString("remove"); String occurrence_x_of = resword.getString("ocurrence"); String subjectText = resword.getString("subject"); String eventText = resword.getString("event"); String status = resword.getString("status"); SubjectEventStatus eventStatus = studyEvents.size() == 0 ? SubjectEventStatus.NOT_SCHEDULED : studyEvents.get(0).getSubjectEventStatus(); String studyEventName = studyEvents.size() == 0 ? "" : studyEvents.get(0).getName(); String studyEventId = studyEvents.size() == 0 ? "" : String.valueOf(studyEvents.get(0).getId()); Status eventSysStatus = studySubject.getStatus(); String studySubjectLabel = studySubject.getLabel(); eventDiv.td(0).styleClass(tableHeaderRowLeftStyleClass).close(); eventDiv.append(subjectText).append(": ").append(studySubjectLabel).br(); eventDiv.append(eventText).append(": ").append(sed.getName()).br(); if (!sed.isRepeating()) { eventDiv.append(resword.getString("status")).append(":").append(eventStatus.getName()).br(); eventDiv.tdEnd(); eventDiv.td(0).styleClass(tableHeaderRowLeftStyleClass).align("right").close(); linkBuilder(eventDiv, studySubjectLabel, rowCount, studyEvents, sed); eventDiv.tdEnd(); } else { eventDiv.tdEnd(); eventDiv.td(0).styleClass(tableHeaderRowLeftStyleClass).align("right").close(); linkBuilder(eventDiv, studySubjectLabel, rowCount, studyEvents, sed); eventDiv.tdEnd(); eventDiv.tr(0).valign("top").close(); eventDiv.td(0).styleClass(tableHeaderRowStyleClass).colspan("2").close(); eventDiv.bold().append(occurrence_x_of).append("#1 of 1").br(); if (studyEvents.size() > 0) { eventDiv.append(formatDate(studyEvents.get(0).getDateStarted())).br(); eventDiv.append(status + " : " + studyEvents.get(0).getSubjectEventStatus().getName()); } else { eventDiv.append(status + " : " + SubjectEventStatus.NOT_SCHEDULED.getName()); } eventDiv.boldEnd().tdEnd().trEnd(0); if (eventStatus != SubjectEventStatus.NOT_SCHEDULED && eventSysStatus != Status.DELETED && eventSysStatus != Status.AUTO_DELETED) { eventDiv.tr(0).close().td(0).styleClass("table_cell_left").close(); eventDiv.ahref("CreateNewStudyEvent?studySubjectId=" + studySubject.getId() + "&studyEventDefinition=" + sed.getId(), add_another_occurrence); eventDiv.tdEnd().trEnd(0); } } eventDiv.trEnd(0); eventDiv.tr(0).id("Menu_off_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount).style("display: all").close(); eventDiv.td(0).styleClass("table_cell_left").colspan("2").close().append("<i>").append(click_for_more_options).append("</i>").tdEnd(); eventDiv.trEnd(0); eventDiv.tr(0).id("Menu_on_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount).style("display: none").close(); eventDiv.td(0).colspan("2").close(); eventDiv.table(0).border("0").cellpadding("0").cellspacing("0").close(); if (eventSysStatus.getId() == Status.AVAILABLE.getId() || eventSysStatus == Status.SIGNED) { if (eventStatus == SubjectEventStatus.NOT_SCHEDULED && currentRole.getRole() != Role.MONITOR) { eventDiv.tr(0).valign("top").close(); eventDiv.td(0).styleClass("table_cell_left").close(); createNewStudyEventLinkBuilder(eventDiv, studySubject.getId(), sed, schedule); eventDiv.tdEnd().trEnd(0); } else if (eventStatus == SubjectEventStatus.COMPLETED) { eventDiv.tr(0).valign("top").close(); eventDiv.td(0).styleClass("table_cell_left").close(); enterDataForStudyEventLinkBuilder(eventDiv, studyEventId, view); eventDiv.tdEnd().trEnd(0); if ((currentRole.getRole() == Role.STUDYDIRECTOR || currentUser.isSysAdmin()) && studyBean.getStatus() == Status.AVAILABLE) { eventDiv.tr(0).valign("top").close(); eventDiv.td(0).styleClass("table_cell_left").close(); updateStudyEventLinkBuilder(eventDiv, studySubject.getId(), studyEventId, edit); eventDiv.tdEnd().trEnd(0); eventDiv.tr(0).valign("top").close(); eventDiv.td(0).styleClass("table_cell_left").close(); removeStudyEventLinkBuilder(eventDiv, studySubject.getId(), studyEventId, remove); eventDiv.tdEnd().trEnd(0); } } else if (eventStatus == SubjectEventStatus.LOCKED) { eventDiv.tdEnd().trEnd(0); if (currentRole.getRole() == Role.STUDYDIRECTOR || currentUser.isSysAdmin()) { eventDiv.tr(0).valign("top").close(); eventDiv.td(0).styleClass("table_cell_left").close(); enterDataForStudyEventLinkBuilder(eventDiv, studyEventId, view); eventDiv.tdEnd().trEnd(0); if (studyBean.getStatus() == Status.AVAILABLE) { eventDiv.tr(0).valign("top").close(); eventDiv.td(0).styleClass("table_cell_left").close(); removeStudyEventLinkBuilder(eventDiv, studySubject.getId(), studyEventId, remove); eventDiv.tdEnd().trEnd(0); } } } else { eventDiv.tr(0).valign("top").close(); eventDiv.td(0).styleClass("table_cell_left"); enterDataForStudyEventLinkBuilder(eventDiv, studyEventId, view); eventDiv.tdEnd().trEnd(0); if ((currentRole.getRole() == Role.STUDYDIRECTOR || currentUser.isSysAdmin()) && studyBean.getStatus() == Status.AVAILABLE) { eventDiv.tr(0).valign("top").close(); eventDiv.td(0).styleClass("table_cell_left").close(); updateStudyEventLinkBuilder(eventDiv, studySubject.getId(), studyEventId, edit); eventDiv.tdEnd().trEnd(0); eventDiv.tr(0).valign("top").close(); eventDiv.td(0).styleClass("table_cell_left").close(); removeStudyEventLinkBuilder(eventDiv, studySubject.getId(), studyEventId, remove); eventDiv.tdEnd().trEnd(0); } } } if (eventSysStatus == Status.DELETED || eventSysStatus == Status.AUTO_DELETED) { eventDiv.tr(0).valign("top").close(); eventDiv.td(0).styleClass("table_cell_left").close(); enterDataForStudyEventLinkBuilder(eventDiv, studyEventId, view); eventDiv.tdEnd().trEnd(0); } eventDiv.tableEnd(0).tdEnd().trEnd(0); eventDiv.tableEnd(0); eventDiv.divEnd().divEnd().divEnd().divEnd().divEnd().divEnd().divEnd().divEnd().divEnd().divEnd().divEnd(); iconLinkBuilder(eventDiv, studySubjectLabel, rowCount, studyEvents, sed); } private void updateStudyEventLinkBuilder(HtmlBuilder builder, Integer studySubjectId, String studyEventId, String edit) { String href1 = "UpdateStudyEvent?event_id=" + studyEventId + "&ss_id=" + studySubjectId; builder.a().href(href1); builder.close(); builder.img().src("images/bt_Edit.gif").border("0").align("left").close().aEnd(); builder.nbsp().nbsp().a().href(href1); builder.close().append(edit).aEnd(); } private void removeStudyEventLinkBuilder(HtmlBuilder builder, Integer studySubjectId, String studyEventId, String remove) { String href1 = "RemoveStudyEvent?action=confirm&id=" + studyEventId + "&studySubId=" + studySubjectId; builder.a().href(href1); builder.close(); builder.img().src("images/bt_Remove.gif").border("0").align("left").close().aEnd(); builder.nbsp().nbsp().a().href(href1); builder.close().append(remove).aEnd(); } private void createNewStudyEventLinkBuilder(HtmlBuilder builder, Integer studySubjectId, StudyEventDefinitionBean sed, String schedule) { String href1 = "CreateNewStudyEvent?studySubjectId=" + studySubjectId + "&studyEventDefinition=" + sed.getId(); builder.a().href(href1); builder.close(); builder.img().src("images/bt_Schedule.gif").border("0").align("left").close().aEnd(); builder.nbsp().nbsp().a().href(href1); builder.close().append(schedule).aEnd(); } private void enterDataForStudyEventLinkBuilder(HtmlBuilder builder, String studyEventId, String view) { String href1 = "EnterDataForStudyEvent?eventId=" + studyEventId; builder.a().href(href1); builder.close(); builder.img().src("images/bt_View.gif").border("0").align("left").close().aEnd(); builder.nbsp().nbsp().a().href(href1); builder.close().append(view).aEnd(); } private void lockLinkBuilder(HtmlBuilder builder, String studySubjectLabel, Integer rowCount, List<StudyEventBean> studyEvents, StudyEventDefinitionBean sed) { String href1 = "javascript:leftnavExpand('Menu_on_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "'); "; String href2 = "javascript:leftnavExpand('Menu_off_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "'); "; String onmouseover = "layersShowOrHide('visible','Event_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "'); "; onmouseover += "javascript:setImage('ExpandIcon_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "','images/icon_collapse.gif');"; String onClick1 = "layersShowOrHide('hidden','Lock_all'); "; String onClick2 = "layersShowOrHide('hidden','Event_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "'); "; String onClick3 = "layersShowOrHide('hidden','Lock_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "'); "; String onClick4 = "javascript:setImage('ExpandIcon_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "','images/icon_blank.gif'); "; builder.a().href(href1 + href2); builder.onmouseover(onmouseover); builder.onclick(onClick1 + onClick2 + onClick3 + onClick4); builder.close(); builder.img().src("images/spacer.gif").border("0").append("height=\"30\"").width("50").close().aEnd(); } private void repeatingIconLinkBuilder(HtmlBuilder builder, String studySubjectLabel, Integer rowCount, List<StudyEventBean> studyEvents, StudyEventDefinitionBean sed) { String href1 = "javascript:ExpandEventOccurrences('" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "'," + studyEvents.size() + "); "; // String href1 = "javascript:leftnavExpand('Menu_on_" + // studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "'); "; String href2 = "javascript:leftnavExpand('Menu_off_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "'); "; String onmouseover = "moveObject('Event_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "', event); "; onmouseover += "setImage('ExpandIcon_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "','images/icon_expand.gif');"; String onmouseout = "layersShowOrHide('hidden','Event_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "'); "; onmouseout += "setImage('ExpandIcon_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "','images/icon_blank.gif');"; String onClick1 = "layersShowOrHide('visible','Lock_all'); "; String onClick2 = "LockObject('Lock_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "',event); "; builder.a().href(href1 + href2); builder.onmouseover(onmouseover); builder.onmouseout(onmouseout); builder.onclick(onClick1 + onClick2); builder.close(); } private void iconLinkBuilder(HtmlBuilder builder, String studySubjectLabel, Integer rowCount, List<StudyEventBean> studyEvents, StudyEventDefinitionBean sed) { String href1Repeating = "javascript:ExpandEventOccurrences('" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "'," + studyEvents.size() + "); "; String href1 = "javascript:leftnavExpand('Menu_on_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "'); "; String href2 = "javascript:leftnavExpand('Menu_off_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "'); "; String onmouseover = "moveObject('Event_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "', event); "; onmouseover += "setImage('ExpandIcon_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "','images/icon_expand.gif');"; String onmouseout = "layersShowOrHide('hidden','Event_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "'); "; onmouseout += "setImage('ExpandIcon_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "','images/icon_blank.gif');"; String onClick1 = "layersShowOrHide('visible','Lock_all'); "; String onClick2 = "LockObject('Lock_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "',event); "; String href = studyEvents.size() > 1 ? href1Repeating + href2 : href1 + href2; builder.a().href(href); builder.onmouseover(onmouseover); builder.onmouseout(onmouseout); builder.onclick(onClick1 + onClick2); builder.close(); } private void divCloseRepeatinglinkBuilder(HtmlBuilder builder, String studySubjectLabel, Integer rowCount, List<StudyEventBean> studyEvents, StudyEventDefinitionBean sed) { String href1 = "javascript:ExpandEventOccurrences('" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "'," + studyEvents.size() + "); "; String href2 = "javascript:leftnavExpand('Menu_off_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "'); "; String onClick1 = "layersShowOrHide('hidden','Lock_all'); "; String onClick2 = "layersShowOrHide('hidden','Event_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "'); "; String onClick3 = "layersShowOrHide('hidden','Lock_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "'); "; String onClick4 = "javascript:setImage('ExpandIcon_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "','images/icon_blank.gif'); "; builder.a().href(href1 + href2); builder.onclick(onClick1 + onClick2 + onClick3 + onClick4); builder.close().append("X").aEnd(); } private void linkBuilder(HtmlBuilder builder, String studySubjectLabel, Integer rowCount, List<StudyEventBean> studyEvents, StudyEventDefinitionBean sed) { String href1 = "javascript:leftnavExpand('Menu_on_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "'); "; String href2 = "javascript:leftnavExpand('Menu_off_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "'); "; String onClick1 = "layersShowOrHide('hidden','Lock_all'); "; String onClick2 = "layersShowOrHide('hidden','Event_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "'); "; String onClick3 = "layersShowOrHide('hidden','Lock_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "'); "; String onClick4 = "javascript:setImage('ExpandIcon_" + studySubjectLabel + "_" + sed.getId() + "_" + rowCount + "','images/icon_blank.gif'); "; builder.a().href(href1 + href2); builder.onclick(onClick1 + onClick2 + onClick3 + onClick4); builder.close().append("X").aEnd(); } private String formatDate(Date date) { String format = resformat.getString("date_format_string"); SimpleDateFormat sdf = new SimpleDateFormat(format); return sdf.format(date); } public Set<Integer> getResolutionStatusIds() { return resolutionStatusIds; } public void setResolutionStatusIds(Set<Integer> resolutionStatusIds) { this.resolutionStatusIds = resolutionStatusIds; } public HashMap<ResolutionStatus, Integer> countAll(HashMap<ResolutionStatus, Integer> discCounts, StudyEventBean studyEvent, StringBuffer constraints, boolean isSite) { HashMap<ResolutionStatus, Integer> temp = new HashMap<ResolutionStatus, Integer>(); temp = getDiscrepancyNoteDAO().countByEntityTypeAndStudyEventWithConstraints("itemData", studyEvent, constraints, isSite); this.getTotal(discCounts, temp); temp = getDiscrepancyNoteDAO().countByEntityTypeAndStudyEventWithConstraints("subject", studyEvent, constraints, isSite); this.getTotal(discCounts, temp); temp = getDiscrepancyNoteDAO().countByEntityTypeAndStudyEventWithConstraints("eventCrf", studyEvent, constraints, isSite); this.getTotal(discCounts, temp); temp = getDiscrepancyNoteDAO().countByEntityTypeAndStudyEventWithConstraints("StudySub", studyEvent, constraints, isSite); this.getTotal(discCounts, temp); temp = getDiscrepancyNoteDAO().countByEntityTypeAndStudyEventWithConstraints("studyEvent", studyEvent, constraints, isSite); this.getTotal(discCounts, temp); return discCounts; } public HashMap<ResolutionStatus, Integer> getTotal(HashMap<ResolutionStatus, Integer> discCounts, HashMap<ResolutionStatus, Integer> discCountsTemp) { if(discCountsTemp.size()>0) { for(int i=1; i<6; ++i) { Integer c = 0; if(discCounts.get(ResolutionStatus.get(i))!=null) { c = discCounts.get(ResolutionStatus.get(i)); } if(discCountsTemp.get(ResolutionStatus.get(i))!=null) { discCounts.put(ResolutionStatus.get(i), c+discCountsTemp.get(ResolutionStatus.get(i))); } } } return discCounts; } }