/** Runs the script. */
    public void handleEvent(Event evt) {
      Element elt = (Element) evt.getCurrentTarget();
      // Evaluate the script
      String script = handlerElement.getTextContent();
      if (script.length() == 0) return;

      DocumentLoader dl = bridgeContext.getDocumentLoader();
      AbstractDocument d = (AbstractDocument) handlerElement.getOwnerDocument();
      int line = dl.getLineNumber(handlerElement);
      final String desc =
          Messages.formatMessage(
              HANDLER_SCRIPT_DESCRIPTION,
              new Object[] {d.getDocumentURI(), eventNamespaceURI, eventType, new Integer(line)});

      // Find the scripting language
      String lang =
          handlerElement.getAttributeNS(null, SVGConstants.SVG_CONTENT_SCRIPT_TYPE_ATTRIBUTE);
      if (lang.length() == 0) {
        Element e = elt;
        while (e != null
            && (!SVGConstants.SVG_NAMESPACE_URI.equals(e.getNamespaceURI())
                || !SVGConstants.SVG_SVG_TAG.equals(e.getLocalName()))) {
          e = SVGUtilities.getParentElement(e);
        }
        if (e == null) return;

        lang = e.getAttributeNS(null, SVGConstants.SVG_CONTENT_SCRIPT_TYPE_ATTRIBUTE);
      }

      runEventHandler(script, evt, lang, desc);
    }
 /** Tells whether the given SVG document is dynamic. */
 public static boolean isDynamicDocument(BridgeContext ctx, Document doc) {
   Element elt = doc.getDocumentElement();
   if ((elt != null) && SVGConstants.SVG_NAMESPACE_URI.equals(elt.getNamespaceURI())) {
     if (elt.getAttributeNS(null, SVGConstants.SVG_ONABORT_ATTRIBUTE).length() > 0) {
       return true;
     }
     if (elt.getAttributeNS(null, SVGConstants.SVG_ONERROR_ATTRIBUTE).length() > 0) {
       return true;
     }
     if (elt.getAttributeNS(null, SVGConstants.SVG_ONRESIZE_ATTRIBUTE).length() > 0) {
       return true;
     }
     if (elt.getAttributeNS(null, SVGConstants.SVG_ONUNLOAD_ATTRIBUTE).length() > 0) {
       return true;
     }
     if (elt.getAttributeNS(null, SVGConstants.SVG_ONSCROLL_ATTRIBUTE).length() > 0) {
       return true;
     }
     if (elt.getAttributeNS(null, SVGConstants.SVG_ONZOOM_ATTRIBUTE).length() > 0) {
       return true;
     }
     return isDynamicElement(ctx, doc.getDocumentElement());
   }
   return false;
 }
  /** Removes the scripting listeners from the given element. */
  protected void removeScriptingListenersOn(Element elt) {
    String eltNS = elt.getNamespaceURI();
    String eltLN = elt.getLocalName();
    if (SVGConstants.SVG_NAMESPACE_URI.equals(eltNS)
        && SVG12Constants.SVG_HANDLER_TAG.equals(eltLN)) {
      // For this 'handler' element, remove the handler for the given
      // event type.
      AbstractElement tgt = (AbstractElement) elt.getParentNode();
      String eventType =
          elt.getAttributeNS(
              XMLConstants.XML_EVENTS_NAMESPACE_URI, XMLConstants.XML_EVENTS_EVENT_ATTRIBUTE);
      String eventNamespaceURI = XMLConstants.XML_EVENTS_NAMESPACE_URI;
      if (eventType.indexOf(':') != -1) {
        String prefix = DOMUtilities.getPrefix(eventType);
        eventType = DOMUtilities.getLocalName(eventType);
        eventNamespaceURI = ((AbstractElement) elt).lookupNamespaceURI(prefix);
      }

      EventListener listener =
          (EventListener) handlerScriptingListeners.put(eventNamespaceURI, eventType, elt, null);
      tgt.removeEventListenerNS(eventNamespaceURI, eventType, listener, false);
    }

    super.removeScriptingListenersOn(elt);
  }
  /** Tells whether the given SVG element is dynamic. */
  public static boolean isDynamicElement(Element elt, BridgeContext ctx, List bridgeExtensions) {
    Iterator i = bridgeExtensions.iterator();
    while (i.hasNext()) {
      BridgeExtension bridgeExtension = (BridgeExtension) i.next();
      if (bridgeExtension.isDynamicElement(elt)) {
        return true;
      }
    }
    if (SVGConstants.SVG_NAMESPACE_URI.equals(elt.getNamespaceURI())) {
      if (elt.getAttributeNS(null, SVGConstants.SVG_ONKEYUP_ATTRIBUTE).length() > 0) {
        return true;
      }
      if (elt.getAttributeNS(null, SVGConstants.SVG_ONKEYDOWN_ATTRIBUTE).length() > 0) {
        return true;
      }
      if (elt.getAttributeNS(null, SVGConstants.SVG_ONKEYPRESS_ATTRIBUTE).length() > 0) {
        return true;
      }
      if (elt.getAttributeNS(null, SVGConstants.SVG_ONLOAD_ATTRIBUTE).length() > 0) {
        return true;
      }
      if (elt.getAttributeNS(null, SVGConstants.SVG_ONERROR_ATTRIBUTE).length() > 0) {
        return true;
      }
      if (elt.getAttributeNS(null, SVGConstants.SVG_ONACTIVATE_ATTRIBUTE).length() > 0) {
        return true;
      }
      if (elt.getAttributeNS(null, SVGConstants.SVG_ONCLICK_ATTRIBUTE).length() > 0) {
        return true;
      }
      if (elt.getAttributeNS(null, SVGConstants.SVG_ONFOCUSIN_ATTRIBUTE).length() > 0) {
        return true;
      }
      if (elt.getAttributeNS(null, SVGConstants.SVG_ONFOCUSOUT_ATTRIBUTE).length() > 0) {
        return true;
      }
      if (elt.getAttributeNS(null, SVGConstants.SVG_ONMOUSEDOWN_ATTRIBUTE).length() > 0) {
        return true;
      }
      if (elt.getAttributeNS(null, SVGConstants.SVG_ONMOUSEMOVE_ATTRIBUTE).length() > 0) {
        return true;
      }
      if (elt.getAttributeNS(null, SVGConstants.SVG_ONMOUSEOUT_ATTRIBUTE).length() > 0) {
        return true;
      }
      if (elt.getAttributeNS(null, SVGConstants.SVG_ONMOUSEOVER_ATTRIBUTE).length() > 0) {
        return true;
      }
      if (elt.getAttributeNS(null, SVGConstants.SVG_ONMOUSEUP_ATTRIBUTE).length() > 0) {
        return true;
      }
    }

    for (Node n = elt.getFirstChild(); n != null; n = n.getNextSibling()) {
      if (n.getNodeType() == Node.ELEMENT_NODE) {
        if (isDynamicElement(ctx, (Element) n)) {
          return true;
        }
      }
    }
    return false;
  }