/* * GNU LESSER GENERAL PUBLIC LICENSE Copyright (C) 2006 The Lobo Project * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, write to the Free Software Foundation, Inc., * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Contact info: lobochief@users.sourceforge.net */ /* * Created on Jan 14, 2006 */ package com.nvarghese.beowulf.common.cobra.html.domimpl; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import org.mozilla.javascript.Function; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.html2.HTMLCollection; import org.w3c.dom.html2.HTMLFormElement; import com.nvarghese.beowulf.common.cobra.html.FormInput; import com.nvarghese.beowulf.common.cobra.html.HtmlRendererContext; import com.nvarghese.beowulf.common.cobra.html.js.Executor; public class HTMLFormElementImpl extends HTMLAbstractUIElement implements HTMLFormElement { /** * */ public HTMLFormElementImpl(String name) { super(name); } public HTMLFormElementImpl() { super("FORM"); } public Object namedItem(final String name) { try { // TODO: This could use document.namedItem. this.visit(new NodeVisitor() { public void visit(Node node) { if (HTMLFormElementImpl.isInput(node)) { if (name.equals(((Element) node).getAttribute("name"))) { throw new StopVisitorException(node); } } } }); } catch (StopVisitorException sve) { return sve.getTag(); } return null; } public Object item(final int index) { try { this.visit(new NodeVisitor() { private int current = 0; public void visit(Node node) { if (HTMLFormElementImpl.isInput(node)) { if (this.current == index) { throw new StopVisitorException(node); } this.current++; } } }); } catch (StopVisitorException sve) { return sve.getTag(); } return null; } private HTMLCollection elements; public HTMLCollection getElements() { HTMLCollection elements = this.elements; if (elements == null) { elements = new DescendentHTMLCollection(this, new InputFilter(), this.treeLock, false); this.elements = elements; } return elements; } public int getLength() { return this.getElements().getLength(); } public String getName() { return this.getAttribute("name"); } public void setName(String name) { this.setAttribute("name", name); } public String getAcceptCharset() { return this.getAttribute("acceptCharset"); } public void setAcceptCharset(String acceptCharset) { this.setAttribute("acceptCharset", acceptCharset); } public String getAction() { return this.getAttribute("action"); } public void setAction(String action) { this.setAttribute("action", action); } public String getEnctype() { return this.getAttribute("enctype"); } public void setEnctype(String enctype) { this.setAttribute("enctype", enctype); } public String getMethod() { String method = this.getAttribute("method"); if (method == null) { method = "GET"; } return method; } public void setMethod(String method) { this.setAttribute("method", method); } public String getTarget() { return this.getAttribute("target"); } public void setTarget(String target) { this.setAttribute("target", target); } public void submit() { this.submit(null); } private Function onsubmit; public void setOnsubmit(Function value) { this.onsubmit = value; } public Function getOnsubmit() { return this.getEventFunction(this.onsubmit, "onsubmit"); } /** * This method should be called when form submission is done by a submit * button. (Disabled as it can be dangerous) * * @param extraFormInputs * Any additional form inputs that need to be submitted, e.g. the * submit button parameter. */ public final void submit(final FormInput[] extraFormInputs) { Function onsubmit = this.getOnsubmit(); if (onsubmit != null) { // TODO: onsubmit event object? if (!Executor.executeFunction(this, onsubmit, null)) { return; } } HtmlRendererContext context = this.getHtmlRendererContext(); if (context != null) { final ArrayList formInputs = new ArrayList(); if (extraFormInputs != null) { for (int i = 0; i < extraFormInputs.length; i++) { formInputs.add(extraFormInputs[i]); } } this.visit(new NodeVisitor() { public void visit(Node node) { if (node instanceof HTMLElementImpl) { FormInput[] fis = ((HTMLElementImpl) node).getFormInputs(); if (fis != null) { for (int i = 0; i < fis.length; i++) { FormInput fi = fis[i]; if (fi.getName() == null) { throw new IllegalStateException("Form input does not have a name: " + node); } formInputs.add(fi); } } } } }); FormInput[] fia = (FormInput[]) formInputs.toArray(FormInput.EMPTY_ARRAY); String href = this.getAction(); if (href == null) { href = this.getBaseURI(); } try { URL url = this.getFullURL(href); context.submitForm(this.getMethod(), url, this.getTarget(), this.getEnctype(), fia); } catch (MalformedURLException mfu) { this.warn("submit()", mfu); } } } public void reset() { this.visit(new NodeVisitor() { public void visit(Node node) { if (node instanceof HTMLBaseInputElement) { ((HTMLBaseInputElement) node).resetInput(); } } }); } static boolean isInput(Node node) { String name = node.getNodeName().toLowerCase(); return name.equals("input") || name.equals("textarea") || name.equals("select"); } private class InputFilter implements NodeFilter { /* * (non-Javadoc) * * @see org.xamjwg.html.domimpl.NodeFilter#accept(org.w3c.dom.Node) */ public boolean accept(Node node) { return HTMLFormElementImpl.isInput(node); } } }