package org.nocket.component.select;
import java.text.MessageFormat;
import org.apache.wicket.Component;
import org.apache.wicket.behavior.Behavior;
import org.apache.wicket.markup.ComponentTag;
import org.apache.wicket.markup.head.CssReferenceHeaderItem;
import org.apache.wicket.markup.head.IHeaderResponse;
import org.apache.wicket.markup.head.JavaScriptHeaderItem;
import org.apache.wicket.markup.head.OnDomReadyHeaderItem;
import org.apache.wicket.model.ResourceModel;
import org.apache.wicket.request.resource.PackageResourceReference;
import org.nocket.component.header.jquery.JQueryDependingReference;
import org.nocket.component.header.jquery.JQueryHelper;
/**
* Behaivor adding c apabilities of Java Script Library Chosen to standard
* Wicket components.
*
* @author blaz02
*
*/
public class JSChosenBehavior extends Behavior {
private static final long serialVersionUID = 1L;
public final static String DATA_PLACEHOLDER_ATTR = "data-placeholder";
public final static String DATA_NORESULT_ATTR = "data-no_results_text";
public final static String DATA_PLACEHOLDER = "data.placeholder";
public final static String DATA_NORESULT = "data.noresult";
public final static String INIT_SCRIPT = "$(\"#{0}_chosen\").remove(); $(\"#{1}\").chosen({2})";
/** configuration of the chosen widget */
private String chosenConfig = "";
/**
* @param chosenConfig
* configuration of the chosen widget
*/
public JSChosenBehavior(String chosenConfig) {
super();
this.chosenConfig = chosenConfig;
}
@Override
public void onComponentTag(Component component, ComponentTag tag) {
tag.append("class", "chosen-select", " ");
tag.append(DATA_PLACEHOLDER_ATTR, new ResourceModel(JSChosenBehavior.DATA_PLACEHOLDER).wrapOnAssignment(
component).getObject(), " ");
tag.append(DATA_NORESULT_ATTR, new ResourceModel(JSChosenBehavior.DATA_NORESULT).wrapOnAssignment(component)
.getObject(), " ");
}
@Override
public void renderHead(Component component, IHeaderResponse response) {
super.renderHead(component, response);
JQueryHelper.initJQuery(response);
response.render(JavaScriptHeaderItem.forReference(new JQueryDependingReference(JSChosenBehavior.class,
"chosen.jquery.js")));
response.render(CssReferenceHeaderItem.forReference(new PackageResourceReference(component.getClass(),
"chosen.css")));
response.render(OnDomReadyHeaderItem.forScript(getInitScript(component.getMarkupId())));
}
private String getInitScript(String id) {
// If html id contains dots in the name, we have to escape them
// in two different ways to build proper JQuery selector.
String chosenId = id.replace(".", "_");
String originalId = id.replace(".", "\\\\.");
return MessageFormat.format(INIT_SCRIPT, chosenId, originalId, chosenConfig);
}
}