// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.

/**
 * All your attribute manipulation needs in one place.
 * Extends the regular Map interface by automatically coercing non-string
 * values to strings.
 */
abstract class AttributeMap implements Map<String, String> {
  void operator []=(String key, value);
}

/**
 * All your element measurement needs in one place
 */
abstract class ElementRect {
  // Relative to offsetParent
  ClientRect get client;
  ClientRect get offset;
  ClientRect get scroll;
  // In global coords
  ClientRect get bounding;
  // In global coords
  List<ClientRect> get clientRects;
}

abstract class NodeSelector {
  Element query(String selectors);
  List<Element> queryAll(String selectors);
}

abstract class CSSClassSet implements Set<String> {
  /**
   * Adds the class [token] to the element if it is not on it, removes it if it
   * is.
   */
  bool toggle(String token);

  /**
   * Returns [:true:] classes cannot be added or removed from this
   * [:CSSClassSet:].
   */
  bool get frozen;
}

/// @domName Element
abstract class Element implements Node, NodeSelector {
  factory Element.html(String html) =>
      _ElementFactoryProvider.createElement_html(html);
  factory Element.tag(String tag) =>
      _ElementFactoryProvider.createElement_tag(tag);

  AttributeMap get attributes;
  void set attributes(Map<String, String> value);

  /**
   * @domName childElementCount, firstElementChild, lastElementChild,
   *   children, Node.nodes.add
   */
  List<Element> get elements;

  void set elements(Collection<Element> value);

  /** @domName className, classList */
  CSSClassSet get classes;

  void set classes(Collection<String> value);

  AttributeMap get dataAttributes;
  void set dataAttributes(Map<String, String> value);

  /**
   * Adds the specified text as a text node after the last child of this.
   */
  void addText(String text);

  /**
   * Parses the specified text as HTML and adds the resulting node after the
   * last child of this.
   */
  void addHTML(String html);

  /**
   * @domName getClientRects, getBoundingClientRect, clientHeight, clientWidth,
   * clientTop, clientLeft, offsetHeight, offsetWidth, offsetTop, offsetLeft,
   * scrollHeight, scrollWidth, scrollTop, scrollLeft
   */
  Future<ElementRect> get rect;

  /** @domName Window.getComputedStyle */
  Future<CSSStyleDeclaration> get computedStyle;

  /** @domName Window.getComputedStyle */
  Future<CSSStyleDeclaration> getComputedStyle(String pseudoElement);

  Element clone(bool deep);

  Element get parent;

  /**
   * Experimental support for [web components][wc]. This field stores a
   * reference to the component implementation. It was inspired by Mozilla's
   * [x-tags][] project. Please note: in the future it may be possible to
   * `extend Element` from your class, in which case this field will be
   * deprecated and will simply return this [Element] object.
   *
   * [wc]: http://dvcs.w3.org/hg/webcomponents/raw-file/tip/explainer/index.html
   * [x-tags]: http://x-tags.org/
   */
  var xtag;


  /**
   * @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent
   */
  ElementEvents get on;

  /** @domName HTMLElement.children */
  abstract HTMLCollection get $dom_children;

  /** @domName HTMLElement.contentEditable */
  String contentEditable;

  /** @domName HTMLElement.dir */
  String dir;

  /** @domName HTMLElement.draggable */
  bool draggable;

  /** @domName HTMLElement.hidden */
  bool hidden;

  /** @domName HTMLElement.id */
  String id;

  /** @domName HTMLElement.innerHTML */
  String innerHTML;

  /** @domName HTMLElement.isContentEditable */
  abstract bool get isContentEditable;

  /** @domName HTMLElement.lang */
  String lang;

  /** @domName HTMLElement.outerHTML */
  abstract String get outerHTML;

  /** @domName HTMLElement.spellcheck */
  bool spellcheck;

  /** @domName HTMLElement.tabIndex */
  int tabIndex;

  /** @domName HTMLElement.title */
  String title;

  /** @domName HTMLElement.translate */
  bool translate;

  /** @domName HTMLElement.webkitdropzone */
  String webkitdropzone;

  /** @domName HTMLElement.click */
  void click();

  /** @domName HTMLElement.insertAdjacentElement */
  Element insertAdjacentElement(String where, Element element);

  /** @domName HTMLElement.insertAdjacentHTML */
  void insertAdjacentHTML(String where, String html);

  /** @domName HTMLElement.insertAdjacentText */
  void insertAdjacentText(String where, String text);

  static const int ALLOW_KEYBOARD_INPUT = 1;

  /** @domName Element.childElementCount */
  abstract int get $dom_childElementCount;

  /** @domName Element.className */
  String $dom_className;

  /** @domName Element.clientHeight */
  abstract int get $dom_clientHeight;

  /** @domName Element.clientLeft */
  abstract int get $dom_clientLeft;

  /** @domName Element.clientTop */
  abstract int get $dom_clientTop;

  /** @domName Element.clientWidth */
  abstract int get $dom_clientWidth;

  /** @domName Element.dataset */
  abstract Map<String, String> get dataset;

  /** @domName Element.firstElementChild */
  abstract Element get $dom_firstElementChild;

  /** @domName Element.lastElementChild */
  abstract Element get $dom_lastElementChild;

  /** @domName Element.nextElementSibling */
  abstract Element get nextElementSibling;

  /** @domName Element.offsetHeight */
  abstract int get $dom_offsetHeight;

  /** @domName Element.offsetLeft */
  abstract int get $dom_offsetLeft;

  /** @domName Element.offsetParent */
  abstract Element get offsetParent;

  /** @domName Element.offsetTop */
  abstract int get $dom_offsetTop;

  /** @domName Element.offsetWidth */
  abstract int get $dom_offsetWidth;

  /** @domName Element.previousElementSibling */
  abstract Element get previousElementSibling;

  /** @domName Element.scrollHeight */
  abstract int get $dom_scrollHeight;

  /** @domName Element.scrollLeft */
  int $dom_scrollLeft;

  /** @domName Element.scrollTop */
  int $dom_scrollTop;

  /** @domName Element.scrollWidth */
  abstract int get $dom_scrollWidth;

  /** @domName Element.style */
  abstract CSSStyleDeclaration get style;

  /** @domName Element.tagName */
  abstract String get tagName;

  /** @domName Element.blur */
  void blur();

  /** @domName Element.focus */
  void focus();

  /** @domName Element.getAttribute */
  String $dom_getAttribute(String name);

  /** @domName Element.getBoundingClientRect */
  ClientRect $dom_getBoundingClientRect();

  /** @domName Element.getClientRects */
  List<ClientRect> $dom_getClientRects();

  /** @domName Element.getElementsByClassName */
  List<Node> $dom_getElementsByClassName(String name);

  /** @domName Element.getElementsByTagName */
  List<Node> $dom_getElementsByTagName(String name);

  /** @domName Element.hasAttribute */
  bool $dom_hasAttribute(String name);

  /** @domName Element.querySelector */
  Element $dom_querySelector(String selectors);

  /** @domName Element.querySelectorAll */
  List<Node> $dom_querySelectorAll(String selectors);

  /** @domName Element.remove */
  void remove();

  /** @domName Element.removeAttribute */
  void $dom_removeAttribute(String name);

  /** @domName Element.scrollByLines */
  void scrollByLines(int lines);

  /** @domName Element.scrollByPages */
  void scrollByPages(int pages);

  /** @domName Element.scrollIntoViewIfNeeded */
  void scrollIntoView([bool centerIfNeeded]);

  /** @domName Element.setAttribute */
  void $dom_setAttribute(String name, String value);

  /** @domName Element.webkitMatchesSelector */
  bool matchesSelector(String selectors);

  /** @domName Element.webkitRequestFullScreen */
  void webkitRequestFullScreen(int flags);

  /** @domName Element.webkitRequestFullscreen */
  void webkitRequestFullscreen();

  /** @domName Element.webkitRequestPointerLock */
  void webkitRequestPointerLock();

}

abstract class ElementEvents implements Events {

  EventListenerList get abort;

  EventListenerList get beforeCopy;

  EventListenerList get beforeCut;

  EventListenerList get beforePaste;

  EventListenerList get blur;

  EventListenerList get change;

  EventListenerList get click;

  EventListenerList get contextMenu;

  EventListenerList get copy;

  EventListenerList get cut;

  EventListenerList get doubleClick;

  EventListenerList get drag;

  EventListenerList get dragEnd;

  EventListenerList get dragEnter;

  EventListenerList get dragLeave;

  EventListenerList get dragOver;

  EventListenerList get dragStart;

  EventListenerList get drop;

  EventListenerList get error;

  EventListenerList get focus;

  EventListenerList get input;

  EventListenerList get invalid;

  EventListenerList get keyDown;

  EventListenerList get keyPress;

  EventListenerList get keyUp;

  EventListenerList get load;

  EventListenerList get mouseDown;

  EventListenerList get mouseMove;

  EventListenerList get mouseOut;

  EventListenerList get mouseOver;

  EventListenerList get mouseUp;

  EventListenerList get mouseWheel;

  EventListenerList get paste;

  EventListenerList get reset;

  EventListenerList get scroll;

  EventListenerList get search;

  EventListenerList get select;

  EventListenerList get selectStart;

  EventListenerList get submit;

  EventListenerList get touchCancel;

  EventListenerList get touchEnd;

  EventListenerList get touchEnter;

  EventListenerList get touchLeave;

  EventListenerList get touchMove;

  EventListenerList get touchStart;

  EventListenerList get transitionEnd;

  EventListenerList get fullscreenChange;

  EventListenerList get fullscreenError;
}
