package com.revolsys.ui.html.fields;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import com.revolsys.record.io.format.xml.XmlWriter;
import com.revolsys.ui.html.domain.Region;
import com.revolsys.ui.html.form.Form;
import com.revolsys.util.HtmlAttr;
import com.revolsys.util.HtmlElem;
public class RegionField extends Field {
private String countryCode;
private List<Region> regions = new ArrayList<>();
private String stringValue;
public RegionField(final String name, final boolean required) {
super(name, required);
}
@Override
public boolean hasValue() {
return this.stringValue != null && !this.stringValue.equals("");
}
@Override
public void initialize(final Form form, final HttpServletRequest request) {
this.stringValue = request.getParameter(getName());
}
@Override
public boolean isValid() {
boolean valid = true;
if (!super.isValid()) {
valid = false;
} else if (hasValue()) {
if (this.regions.size() > 0) {
final Region region = Region.getRegionByName(this.countryCode, this.stringValue);
if (region == null) {
addValidationError("Invalid Value");
valid = false;
} else {
setValue(region.getName());
}
} else {
setValue(this.stringValue);
}
}
return valid;
}
@Override
public void postInit(final HttpServletRequest request) {
final CountryField countryField = (CountryField)getForm().getField("country");
this.countryCode = countryField.getCountryCode();
if (this.countryCode != null) {
this.regions = Region.getRegions(this.countryCode);
}
if (this.stringValue == null) {
setValue(getInitialValue(request));
}
}
@Override
public void serializeElement(final XmlWriter out) {
if (this.regions.size() > 0) {
serializeSelectField(out);
} else {
serializeTextField(out);
}
}
private void serializeOptions(final XmlWriter out) {
for (final Region region : this.regions) {
out.startTag(HtmlElem.OPTION);
if (region.getName().equals(this.stringValue)) {
out.attribute(HtmlAttr.SELECTED, "true");
}
out.text(region.getName());
out.endTag(HtmlElem.OPTION);
}
}
/**
* @param out
* @throws IOException
*/
private void serializeSelectField(final XmlWriter out) {
out.startTag(HtmlElem.SELECT);
out.attribute(HtmlAttr.NAME, getName());
serializeOptions(out);
out.endTag(HtmlElem.SELECT);
}
private void serializeTextField(final XmlWriter out) {
out.startTag(HtmlElem.INPUT);
out.attribute(HtmlAttr.NAME, getName());
out.attribute(HtmlAttr.TYPE, "text");
out.attribute(HtmlAttr.CLASS, "form-control input-sm");
out.attribute(HtmlAttr.SIZE, "30");
out.attribute(HtmlAttr.MAX_LENGTH, "30");
if (this.stringValue != null) {
out.attribute(HtmlAttr.VALUE, this.stringValue);
}
out.endTag(HtmlElem.INPUT);
}
@Override
public void setValue(final Object value) {
super.setValue(value);
this.stringValue = null;
if (this.regions.size() > 0) {
if (value != null) {
Region region = Region.getRegionByName(this.countryCode, (String)value);
if (region == null) {
region = Region.getRegionByCode(this.countryCode, (String)value);
}
if (region != null) {
this.stringValue = region.getName();
}
}
}
}
}