package org.akaza.openclinica.view.form;
import org.akaza.openclinica.bean.submit.ResponseOptionBean;
import org.akaza.openclinica.i18n.util.ResourceBundleProvider;
import org.jdom.Element;
import java.util.List;
import java.util.Random;
/**
* Using the Decorator design pattern, this class adds functionality to
* DataEntryInputGenerator. The functionality is necessary for printing CRFs.
*/
public class DataEntryDecorator {
private final DataEntryInputGenerator inputGenerator = new DataEntryInputGenerator();
public Element createCheckboxTag(Element tdCell, Integer itemId, List options, Integer tabNumber, boolean includeLabel, String dbValue,
String defaultValue, boolean isHorizontal, boolean hasSavedData) {
// The input element
Element element;
// the span element that contains the input element
Element spanElement;
String[] arrayOfValues = new String[] {};
int count = 0;
// Handles lone Strings, or Strings separated by commas
if (dbValue != null && dbValue.length() > 0) {
synchronized (inputGenerator) {
arrayOfValues = inputGenerator.handleSplitString(dbValue);
}
} else if (!hasSavedData && defaultValue != null && defaultValue.length() > 0) {
synchronized (inputGenerator) {
arrayOfValues = inputGenerator.handleSplitString(defaultValue);
}
}
for (Object responseOptBean : options) {
spanElement = new Element("span");
spanElement.setAttribute("style", "float:left;clear:both");
synchronized (inputGenerator) {
element = inputGenerator.initializeInputElement("checkbox", itemId, tabNumber);
}
spanElement.addContent(element);
String value = ((ResponseOptionBean) responseOptBean).getValue();
String forDefVal = ((ResponseOptionBean) responseOptBean).getText();
element.setAttribute("value", value);
// It's checked if its value equals the DB value
if (dbValue != null && dbValue.length() > 0) {
// && value.equalsIgnoreCase(dbValue)
for (String string : arrayOfValues) {
if (value.equalsIgnoreCase(string)) {
element.setAttribute("checked", "checked");
}
}
} else if (!hasSavedData && defaultValue != null && defaultValue.length() > 0) {
// && value.equalsIgnoreCase(dbValue)
for (String string : arrayOfValues) {
if (forDefVal.equalsIgnoreCase(string) || value.equalsIgnoreCase(string)) {
element.setAttribute("checked", "checked");
}
}
}
tdCell.addContent(spanElement);
if (includeLabel) {
spanElement.addContent(((ResponseOptionBean) responseOptBean).getText());
}
}// end for each option
return tdCell;
}
public Element createRadioButtonTag(Element tdCell, Integer itemId, List options, Integer tabNumber, boolean includeLabel, String dbValue,
String defaultValue, boolean isHorizontal, boolean hasSavedData) {
// the input element
Element element;
// the span element that contains the input element
Element spanElement;
// for the preview, where the item id is 0, we have to generate random
// IDs,
// so that the input elements will have unique IDs
if (itemId == 0) {
Random rand = new Random();
itemId = rand.nextInt(10000) + 1;
}
// Do not use the default value if there is a valid database value
boolean hasData = dbValue != null && dbValue.length() > 0;
for (Object responseOptBean : options) {
spanElement = new Element("span");
spanElement.setAttribute("style", "float:left;clear:both");
synchronized (inputGenerator) {
element = inputGenerator.initializeInputElement("radio", itemId, tabNumber);
}
spanElement.addContent(element);
String value = ((ResponseOptionBean) responseOptBean).getValue();
String forDefVal = ((ResponseOptionBean) responseOptBean).getText();
element.setAttribute("value", value);
// It's checked if its value equals the DB value
if (dbValue != null && dbValue.length() > 0 && value.equalsIgnoreCase(dbValue)) {
element.setAttribute("checked", "checked");
}
if (!hasSavedData && defaultValue != null && (forDefVal.equalsIgnoreCase(defaultValue) || value.equalsIgnoreCase(defaultValue))) {
element.setAttribute("checked", "checked");
}
// dealing with IE/repetition model library bug
if (isHorizontal) {
element.setAttribute("onclick", "if(detectIEWindows(navigator.userAgent)){this.checked=true; unCheckSiblings(this,'horizontal');}");
} else {
element.setAttribute("onclick", "if(detectIEWindows(navigator.userAgent)){this.checked=true; unCheckSiblings(this,'vertical');}");
}
tdCell.addContent(spanElement);
spanElement.addContent(" ");
if (includeLabel) {
spanElement.addContent(((ResponseOptionBean) responseOptBean).getText());
}
}
return tdCell;
}
// Create a span element with a class attribute referring to the "alert"
// class.
// This method returns the altered Element object, which contains the span
// element as content
public Element createRequiredAlert(Element tdCell) {
Element alertReq = new Element("span");
alertReq.setAttribute("style", "float:left;clear:both");
alertReq.setAttribute("class", "alert");
alertReq.addContent("*");
tdCell.addContent(alertReq);
return tdCell;
}
// This method creates an "a href" element that contains an img element.
// the link element is designed to generate a discrepancy note. The method
// uses the same markup as the existing discrepancy-note related JSPs.
public Element createDiscrepancyNoteSymbol(Integer numDiscrepancyNotes, Integer tabNumber, Integer itemDataId, Integer itemId, boolean forPrinting) {
Element spanElement = new Element("span");
spanElement.setAttribute("style", "float:left;clear:both");
Element ahref = new Element("a");
// add the href to the span
spanElement.addContent(ahref);
ahref.setAttribute("tabindex", tabNumber + 1000 + "");
ahref.setAttribute("href", "#");
// disable this note for printing
// In the future, this method might be used for more than printing CRFs
// so keep note disabling an option, true or false
StringBuilder clickValue = new StringBuilder("");
if (forPrinting) {
clickValue.append("javascript:void 0");
}
ahref.setAttribute("onClick", clickValue.toString());
Element img = new Element("img");
img.setAttribute("name", "flag_input" + itemId);
String fileName = numDiscrepancyNotes > 0 ? "icon_Note.gif" : "icon_noNote.gif";
img.setAttribute("src", "images/" + fileName);
img.setAttribute("border", "0");
img.setAttribute("alt", ResourceBundleProvider.getWordsBundle().getString("discrepancy_note"));
img.setAttribute("title", ResourceBundleProvider.getWordsBundle().getString("discrepancy_note"));
ahref.addContent(img);
return spanElement;
}
}