/*
 * Copyright 2008 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/**
 * @fileoverview Definitions for all the extensions over
 *  W3C's DOM specification by Gecko. This file depends on
 *  w3c_dom2.js.
 *
 * When a non-standard extension appears in both Gecko and IE, we put
 * it in gecko_dom.js
 *
 * @externs
 */

// TODO: Almost all of it has not been annotated with types.

// Gecko DOM;

/**
 * Mozilla only???
 * @constructor
 * @extends {HTMLElement}
 */
function HTMLSpanElement() {}

/**
 * @see https://developer.mozilla.org/en/Components_object
 */
Window.prototype.Components;

/**
 * @type Window
 * @see https://developer.mozilla.org/en/DOM/window.content
 */
Window.prototype.content;

/**
 * @type {boolean}
 * @see https://developer.mozilla.org/en/DOM/window.closed
 */
Window.prototype.closed;

/** @see https://developer.mozilla.org/en/DOM/window.controllers */
Window.prototype.controllers;

/** @see https://developer.mozilla.org/en/DOM/window.crypto */
Window.prototype.crypto;

/**
 * Gets/sets the status bar text for the given window.
 * @type {string}
 * @see https://developer.mozilla.org/en/DOM/window.defaultStatus
 */
Window.prototype.defaultStatus;

/** @see https://developer.mozilla.org/en/DOM/window.dialogArguments */
Window.prototype.dialogArguments;

/** @see https://developer.mozilla.org/en/DOM/window.directories */
Window.prototype.directories;

/**
 * @type {!Document}
 * @see https://developer.mozilla.org/en/DOM/window.document
 */
Window.prototype.document;

Window.prototype.eval;

/**
 * @type {HTMLObjectElement|HTMLIFrameElement|null}
 * @see https://developer.mozilla.org/en/DOM/window.frameElement
 */
Window.prototype.frameElement;

/**
 * Allows lookup of frames by index or by name.
 * @type {?Object}
 * @see https://developer.mozilla.org/en/DOM/window.frames
 */
Window.prototype.frames;

/**
 * @type {boolean}
 * @see https://developer.mozilla.org/en/DOM/window.fullScreen
 */
Window.prototype.fullScreen;

/**
 * @see https://developer.mozilla.org/en/DOM/Storage#globalStorage
 */
Window.prototype.globalStorage;

/**
 * @type {!History}
 * @see https://developer.mozilla.org/en/DOM/window.history
 */
Window.prototype.history;

/**
 * Returns the number of frames (either frame or iframe elements) in the
 * window.
 *
 * @type {number}
 * @see https://developer.mozilla.org/en/DOM/window.length
 */
Window.prototype.length;

/**
 * @type {!Location}
 * @implicitCast
 * @see https://developer.mozilla.org/en/DOM/window.location
 */
Window.prototype.location;

/**
 * @see https://developer.mozilla.org/en/DOM/window.locationbar
 */
Window.prototype.locationbar;

/**
 * @see https://developer.mozilla.org/en/DOM/window.menubar
 */
Window.prototype.menubar;

/**
 * @type {string}
 * @see https://developer.mozilla.org/en/DOM/window.name
 */
Window.prototype.name;

/**
 * @type {Navigator}
 * @see https://developer.mozilla.org/en/DOM/window.navigator
 */
Window.prototype.navigator;

/**
 * @type {?Window}
 * @see https://developer.mozilla.org/en/DOM/window.opener
 */
Window.prototype.opener;

/**
 * @type {!Window}
 * @see https://developer.mozilla.org/en/DOM/window.parent
 */
Window.prototype.parent;

/** @see https://developer.mozilla.org/en/DOM/window.personalbar */
Window.prototype.personalbar;

/** @see https://developer.mozilla.org/en/DOM/window.pkcs11 */
Window.prototype.pkcs11;

/** @see https://developer.mozilla.org/en/DOM/window */
Window.prototype.returnValue;

/** @see https://developer.mozilla.org/en/DOM/window.scrollbars */
Window.prototype.scrollbars;

/**
 * @type {number}
 * @see https://developer.mozilla.org/En/DOM/window.scrollMaxX
 */
Window.prototype.scrollMaxX;

/**
 * @type {number}
 * @see https://developer.mozilla.org/En/DOM/window.scrollMaxY
 */
Window.prototype.scrollMaxY;

/**
 * @type {!Window}
 * @see https://developer.mozilla.org/en/DOM/window.self
 */
Window.prototype.self;

/** @see https://developer.mozilla.org/en/DOM/Storage#sessionStorage */
Window.prototype.sessionStorage;

/** @see https://developer.mozilla.org/en/DOM/window.sidebar */
Window.prototype.sidebar;

/**
 * @type {?string}
 * @see https://developer.mozilla.org/en/DOM/window.status
 */
Window.prototype.status;

/** @see https://developer.mozilla.org/en/DOM/window.statusbar */
Window.prototype.statusbar;

/** @see https://developer.mozilla.org/en/DOM/window.toolbar */
Window.prototype.toolbar;

/**
 * @type {!Window}
 * @see https://developer.mozilla.org/en/DOM/window.self
 */
Window.prototype.top;

/**
 * @type {!Window}
 * @see https://developer.mozilla.org/en/DOM/window.self
 */
Window.prototype.window;

/**
 * @param {*} message
 * @see https://developer.mozilla.org/en/DOM/window.alert
 */
Window.prototype.alert = function(message) {};

/**
 * Decodes a string of data which has been encoded using base-64 encoding.
 *
 * @param {string} encodedData
 * @see https://developer.mozilla.org/en/DOM/window.atob
 * @nosideeffects
 */
Window.prototype.atob = function(encodedData) {};

/** @see https://developer.mozilla.org/en/DOM/window.back */
Window.prototype.back = function() {};

/** @see https://developer.mozilla.org/en/DOM/window.blur */
Window.prototype.blur = function() {};

/**
 * @param {string} stringToEncode
 * @return {string}
 * @see https://developer.mozilla.org/en/DOM/window.btoa
 * @nosideeffects
 */
Window.prototype.btoa = function(stringToEncode) {};

/** @deprecated */
Window.prototype.captureEvents;

/**
 * @param {number|undefined?} intervalID
 * @see https://developer.mozilla.org/en/DOM/window.clearInterval
 */
Window.prototype.clearInterval = function(intervalID) {};

/**
 * @param {number|undefined?} timeoutID
 * @see https://developer.mozilla.org/en/DOM/window.clearTimeout
 */
Window.prototype.clearTimeout = function(timeoutID) {};

/** @see https://developer.mozilla.org/en/DOM/window.close */
Window.prototype.close = function() {};

/**
 * @param {*} message
 * @return {boolean}
 */
Window.prototype.confirm = function(message) {};

/**
 * @param {string} regular
 * @return {string}
 * @see https://developer.mozilla.org/en/DOM/window.escape
 * @nosideeffects
 */
Window.prototype.escape = function(regular) {};

/** @see https://developer.mozilla.org/en/DOM/window.find */
Window.prototype.find;

/** @see https://developer.mozilla.org/en/DOM/window.focus */
Window.prototype.focus = function() {};

/** @see https://developer.mozilla.org/en/DOM/window.forward */
Window.prototype.forward = function() {};

/** @see https://developer.mozilla.org/en/DOM/window.getAttention */
Window.prototype.getAttention = function() {};

/**
 * @param {Element} element
 * @param {?string} pseudoElt
 * @return {CSSStyleDeclaration}
 * @nosideeffects
 */
Window.prototype.getComputedStyle = function(element, pseudoElt) {};

/**
 * @return {Selection}
 * @see https://developer.mozilla.org/en/DOM/window.getSelection
 * @nosideeffects
 */
Window.prototype.getSelection = function() {};

/** @see https://developer.mozilla.org/en/DOM/window.home */
Window.prototype.home = function() {};

Window.prototype.openDialog;
Window.prototype.releaseEvents;
Window.prototype.scrollByLines;
Window.prototype.scrollByPages;

/**
 * @param {Function|string} callback
 * @param {number} delay
 * @param {...*} var_args
 * @return {number}
 */
Window.prototype.setInterval;

/**
 * @param {Function|string} callback
 * @param {number} delay
 * @param {...*} var_args
 * @return {number}
 */
Window.prototype.setTimeout = function(callback, delay, var_args) {};

/**
 * @param {string} uri
 * @param {?=} opt_arguments
 * @param {string=} opt_options
 * @see https://developer.mozilla.org/en/DOM/window.showModalDialog
 */
Window.prototype.showModalDialog;

Window.prototype.sizeToContent;

/**
 * @see http://msdn.microsoft.com/en-us/library/ms536769(VS.85).aspx
 */
Window.prototype.stop = function() {};

/**
 * @param {string} escaped
 * @return {string}
 * @see https://developer.mozilla.org/en/DOM/window.unescape
 * @nosideeffects
 */
Window.prototype.unescape = function(escaped) {};

Window.prototype.updateCommands;

// properties of Document

/**
 * @see https://developer.mozilla.org/en/DOM/document.alinkColor
 * @type {string}
 */
Document.prototype.alinkColor;

/**
 * @see https://developer.mozilla.org/en/DOM/document.anchors
 * @type {HTMLCollection}
 */
Document.prototype.anchors;

/**
 * @see https://developer.mozilla.org/en/DOM/document.applets
 * @type {HTMLCollection}
 */
Document.prototype.applets;
/** @type {boolean} */ Document.prototype.async;
/** @type {string?} */ Document.prototype.baseURI;
Document.prototype.baseURIObject;

/**
 * @see https://developer.mozilla.org/en/DOM/document.bgColor
 * @type {string}
 */
Document.prototype.bgColor;

/** @type {HTMLBodyElement} */ Document.prototype.body;
Document.prototype.characterSet;

/**
 * @see https://developer.mozilla.org/en/DOM/document.compatMode
 * @type {string}
 */
Document.prototype.compatMode;

Document.prototype.contentType;
/** @type {string} */ Document.prototype.cookie;
Document.prototype.defaultView;

/**
 * @see https://developer.mozilla.org/en/DOM/document.designMode
 * @type {string}
 */
Document.prototype.designMode;

Document.prototype.documentURIObject;

/**
 * @see https://developer.mozilla.org/en/DOM/document.domain
 * @type {string}
 */
Document.prototype.domain;

/**
 * @see https://developer.mozilla.org/en/DOM/document.embeds
 * @type {HTMLCollection}
 */
Document.prototype.embeds;

/**
 * @see https://developer.mozilla.org/en/DOM/document.fgColor
 * @type {string}
 */
Document.prototype.fgColor;

/** @type {Element} */ Document.prototype.firstChild;

/**
 * @see https://developer.mozilla.org/en/DOM/document.forms
 * @type {HTMLCollection}
 */
Document.prototype.forms;

/** @type {number} */ Document.prototype.height;
/** @type {Array} */ Document.prototype.images;

/**
 * @type {string}
 * @see https://developer.mozilla.org/en/DOM/document.lastModified
 */
Document.prototype.lastModified;

/**
 * @type {string}
 * @see https://developer.mozilla.org/en/DOM/document.linkColor
 */
Document.prototype.linkColor;

/**
 * @see https://developer.mozilla.org/en/DOM/document.links
 * @type {HTMLCollection}
 */
Document.prototype.links;

/**
 * @type {!Location}
 * @implicitCast
 */
Document.prototype.location;

/**
 * @type {string}
 * @see https://developer.mozilla.org/en/DOM/Using_the_Page_Visibility_API
 */
Document.prototype.mozVisibilityState;

Document.prototype.namespaceURI;
Document.prototype.nodePrincipal;
Document.prototype.plugins;
Document.prototype.popupNode;

/**
 * @type {string}
 * @see https://developer.mozilla.org/en/DOM/document.referrer
 */
Document.prototype.referrer;

/**
 * @see https://developer.mozilla.org/en/DOM/document.styleSheets
 */
Document.prototype.styleSheets;

/** @type {?string} */ Document.prototype.title;
Document.prototype.tooltipNode;
/** @type {string} */ Document.prototype.URL;

/**
 * @type {string}
 * @see https://developer.mozilla.org/en/DOM/document.vlinkColor
 */
Document.prototype.vlinkColor;

/** @type {number} */ Document.prototype.width;

// Methods of Document
/**
 * @see https://developer.mozilla.org/en/DOM/document.clear
 */
Document.prototype.clear = function() {};

/**
 * @see https://developer.mozilla.org/en/DOM/document.close
 */
Document.prototype.close;

/**
 * @see https://developer.mozilla.org/en/DOM/document.createElementNS
 * @param {string} namespaceURI
 * @param {string} qualifiedName
 * @return {!Element}
 */
Document.prototype.createElementNS = function(namespaceURI, qualifiedName) {};

/**
 * @param {string} type
 * @return {Event}
 */
Document.prototype.createEvent = function(type) {};
Document.prototype.createNSResolver;
/** @return {Range} */ Document.prototype.createRange = function() {};
Document.prototype.createTreeWalker;

Document.prototype.evaluate;

/**
 * @param {string} commandName
 * @param {?boolean=} opt_showUi
 * @param {*=} opt_value
 * @see https://developer.mozilla.org/en/Rich-Text_Editing_in_Mozilla#Executing_Commands
 */
Document.prototype.execCommand;

/**
 * @param {string} s id.
 * @return {HTMLElement}
 * @nosideeffects
 * @see https://developer.mozilla.org/en/DOM/document.getElementById
 */
Document.prototype.getElementById = function(s) {};

/**
 * @param {string} name
 * @return {!NodeList}
 * @nosideeffects
 * @see https://developer.mozilla.org/en/DOM/document.getElementsByClassName
 */
Document.prototype.getElementsByClassName = function(name) {};

/**
 * @param {string} name
 * @return {!NodeList}
 * @nosideeffects
 * @see https://developer.mozilla.org/en/DOM/document.getElementsByName
 */
Document.prototype.getElementsByName = function(name) {};

/**
 * @param {string} namespace
 * @param {string} name
 * @return {!NodeList}
 * @nosideeffects
 * @see https://developer.mozilla.org/en/DOM/document.getElementsByTagNameNS
 */
Document.prototype.getElementsByTagNameNS = function(namespace, name) {};

/**
 * @param {Node} externalNode
 * @param {boolean} deep
 * @return {Node}
 */
Document.prototype.importNode = function(externalNode, deep) {};

/** @param {string} uri */
Document.prototype.load = function(uri) {};
Document.prototype.loadOverlay;

/**
 * @see https://developer.mozilla.org/en/DOM/document.open
 */
Document.prototype.open;

/**
 * @see https://developer.mozilla.org/en/Midas
 * @see http://msdn.microsoft.com/en-us/library/ms536676(VS.85).aspx
 */
Document.prototype.queryCommandEnabled;

/**
 * @see https://developer.mozilla.org/en/Midas
 * @see http://msdn.microsoft.com/en-us/library/ms536678(VS.85).aspx
 */
Document.prototype.queryCommandIndeterm;

/**
 * @see https://developer.mozilla.org/en/Midas
 * @see http://msdn.microsoft.com/en-us/library/ms536679(VS.85).aspx
 */
Document.prototype.queryCommandState;

/**
 * @see https://developer.mozilla.org/en/DOM/document.queryCommandSupported
 * @see http://msdn.microsoft.com/en-us/library/ms536681(VS.85).aspx
 * @param {string} command
 * @return {?} Implementation-specific.
 */
Document.prototype.queryCommandSupported;

/**
 * @see https://developer.mozilla.org/en/Midas
 * @see http://msdn.microsoft.com/en-us/library/ms536683(VS.85).aspx
 */
Document.prototype.queryCommandValue;

/**
 * @see https://developer.mozilla.org/en/DOM/document.write
 * @param {string} text
 */
Document.prototype.write = function(text) {};

/**
 * @see https://developer.mozilla.org/en/DOM/document.writeln
 * @param {string} text
 */
Document.prototype.writeln = function(text) {};

Document.prototype.ononline;
Document.prototype.onoffline;

// XUL
/**
 * @see http://developer.mozilla.org/en/DOM/document.getBoxObjectFor
 * @return {BoxObject}
 * @nosideeffects
 */
Document.prototype.getBoxObjectFor = function(element) {};

// From:
// http://lxr.mozilla.org/mozilla1.8/source/dom/public/idl/range/nsIDOMNSRange.idl

/**
 * @param {string} tag
 * @return {DocumentFragment}
 */
Range.prototype.createContextualFragment;

/**
 * @param {Node} parent
 * @param {number} offset
 * @return {boolean}
 * @nosideeffects
 */
Range.prototype.isPointInRange;

/**
 * @param {Node} parent
 * @param {number} offset
 * @return {number}
 * @nosideeffects
 */
Range.prototype.comparePoint;

/**
 * @param {Node} n
 * @return {boolean}
 * @nosideeffects
 */
Range.prototype.intersectsNode;

/**
 * @param {Node} n
 * @return {number}
 * @nosideeffects
 */
Range.prototype.compareNode;


/** @constructor */
function Selection() {}

/**
 * @type {Node}
 * @see https://developer.mozilla.org/en/DOM/Selection/anchorNode
 */
Selection.prototype.anchorNode;

/**
 * @type {number}
 * @see https://developer.mozilla.org/en/DOM/Selection/anchorOffset
 */
Selection.prototype.anchorOffset;

/**
 * @type {Node}
 * @see https://developer.mozilla.org/en/DOM/Selection/focusNode
 */
Selection.prototype.focusNode;

/**
 * @type {number}
 * @see https://developer.mozilla.org/en/DOM/Selection/focusOffset
 */
Selection.prototype.focusOffset;

/**
 * @type {boolean}
 * @see https://developer.mozilla.org/en/DOM/Selection/isCollapsed
 */
Selection.prototype.isCollapsed;

/**
 * @type {number}
 * @see https://developer.mozilla.org/en/DOM/Selection/rangeCount
 */
Selection.prototype.rangeCount;

/**
 * @param {Range} range
 * @return {undefined}
 * @see https://developer.mozilla.org/en/DOM/Selection/addRange
 */
Selection.prototype.addRange = function(range) {};

/**
 * @param {number} index
 * @return {Range}
 * @see https://developer.mozilla.org/en/DOM/Selection/getRangeAt
 * @nosideeffects
 */
Selection.prototype.getRangeAt = function(index) {};

/**
 * @param {Node} node
 * @param {number} index
 * @return {undefined}
 * @see https://developer.mozilla.org/en/DOM/Selection/collapse
 */
Selection.prototype.collapse = function(node, index) {};

/**
 * @return {undefined}
 * @see https://developer.mozilla.org/en/DOM/Selection/collapseToEnd
 */
Selection.prototype.collapseToEnd = function() {};

/**
 * @return {undefined}
 * @see https://developer.mozilla.org/en/DOM/Selection/collapseToStart
 */
Selection.prototype.collapseToStart = function() {};

/**
 * @param {Node} node
 * @param {boolean} partlyContained
 * @return {boolean}
 * @see https://developer.mozilla.org/en/DOM/Selection/containsNode
 * @nosideeffects
 */
Selection.prototype.containsNode = function(node, partlyContained) {};

/**
 * @see https://developer.mozilla.org/en/DOM/Selection/deleteFromDocument
 */
Selection.prototype.deleteFromDocument = function() {};

/**
 * @param {Node} parentNode
 * @param {number} offset
 * @see https://developer.mozilla.org/en/DOM/Selection/extend
 */
Selection.prototype.extend = function(parentNode, offset) {};

/**
 * @see https://developer.mozilla.org/en/DOM/Selection/removeAllRanges
 */
Selection.prototype.removeAllRanges = function() {};

/**
 * @param {Range} range
 * @see https://developer.mozilla.org/en/DOM/Selection/removeRange
 */
Selection.prototype.removeRange = function(range) {};

/**
 * @param {Node} parentNode
 * @see https://developer.mozilla.org/en/DOM/Selection/selectAllChildren
 */
Selection.prototype.selectAllChildren;

/**
 * @see https://developer.mozilla.org/en/DOM/Selection/selectionLanguageChange
 */
Selection.prototype.selectionLanguageChange;

/** @type {NamedNodeMap} */ Element.prototype.attributes;
Element.prototype.baseURIObject;
/** @type {!NodeList} */ Element.prototype.childNodes;

/**
 * @type {!NodeList}
 * @see https://developer.mozilla.org/en/DOM/element.children
 */
Element.prototype.children;

/**
 * @type {string}
 * @implicitCast
 */
Element.prototype.className;
/** @type {string} */ Element.prototype.dir;

/**
 * Firebug sets this property on elements it is inserting into the DOM.
 * @type {boolean}
 */
Element.prototype.firebugIgnore;

/** @type {Node} */ Element.prototype.firstChild;
/**
 * @type {string}
 * @implicitCast
 */
Element.prototype.id;
/**
 * @type {string}
 * @implicitCast
 */
Element.prototype.innerHTML;
/** @type {string} */ Element.prototype.lang;
/** @type {Node} */ Element.prototype.lastChild;
Element.prototype.localName;
Element.prototype.name;
Element.prototype.namespaceURI;
/** @type {Node} */ Element.prototype.nextSibling;
Element.prototype.nodeName;
Element.prototype.nodePrincipal;
/** @type {number} */ Element.prototype.nodeType;
Element.prototype.nodeValue;
/** @type {Document} */ Element.prototype.ownerDocument;
/** @type {Node} */ Element.prototype.parentNode;
Element.prototype.prefix;
/** @type {Node} */ Element.prototype.previousSibling;
/** @type {CSSStyleDeclaration} */ Element.prototype.style;
/**
 * @type {number}
 * @implicitCast
 */
Element.prototype.tabIndex;

/**
 * @type {string}
 * @implicitCast
 */
Element.prototype.textContent;
/** @type {string} */ Element.prototype.title;

/**
 * @param {Node} child
 * @return {Node} appendedElement.
 * @override
 */
Element.prototype.appendChild = function(child) {};

/**
 * @override
 * @return {Element}
 */
Element.prototype.cloneNode = function(deep) {};

/** @override */
Element.prototype.dispatchEvent = function(event) {};

/** @return {undefined} */
Element.prototype.blur = function() {};

/** @return {undefined} */
Element.prototype.click = function() {};

/** @return {undefined} */
Element.prototype.focus = function() {};

/**
 * @return {boolean}
 * @override
 * @nosideeffects
 */
Element.prototype.hasAttributes = function() {};

/**
 * @return {boolean}
 * @override
 * @nosideeffects
 */
Element.prototype.hasChildNodes = function() {};

/** @override */
Element.prototype.insertBefore = function(insertedNode, adjacentNode) {};

/**
 * @return {undefined}
 * @override
 */
Element.prototype.normalize = function() {};

/**
 * @param {Node} removedNode
 * @return {Node}
 * @override
 */
Element.prototype.removeChild = function(removedNode) {};

/** @override */
Element.prototype.removeEventListener = function(type, handler, useCapture) {};

/** @override */
Element.prototype.replaceChild = function(insertedNode, replacedNode) {};

/** @type {number} */
HTMLInputElement.prototype.selectionStart;

/** @type {number} */
HTMLInputElement.prototype.selectionEnd;

/**
 * @param {number} selectionStart
 * @param {number} selectionEnd
 * @see http://www.whatwg.org/specs/web-apps/current-work/multipage/editing.html#dom-textarea/input-setselectionrange
 */
HTMLInputElement.prototype.setSelectionRange =
    function(selectionStart, selectionEnd) {};

/** @type {number} */
HTMLTextAreaElement.prototype.selectionStart;

/** @type {number} */
HTMLTextAreaElement.prototype.selectionEnd;

/**
 * @param {number} selectionStart
 * @param {number} selectionEnd
 * @see http://www.whatwg.org/specs/web-apps/current-work/multipage/editing.html#dom-textarea/input-setselectionrange
 */
HTMLTextAreaElement.prototype.setSelectionRange =
    function(selectionStart, selectionEnd) {};

/** @constructor */
function Navigator() {}

/**
 * @type {string}
 * @see https://developer.mozilla.org/en/Navigator.appCodeName
 */
Navigator.prototype.appCodeName;

/**
 * @type {string}
 * @see https://developer.mozilla.org/en/Navigator.appVersion
 */
Navigator.prototype.appName;

/**
 * @type {string}
 * @see https://developer.mozilla.org/en/Navigator.appVersion
 */
Navigator.prototype.appVersion;

/**
 * @type {string}
 * @see https://developer.mozilla.org/en/Navigator.buildID
 */
Navigator.prototype.buildID;

/**
 * @type {boolean}
 * @see https://developer.mozilla.org/en/Navigator.cookieEnabled
 */
Navigator.prototype.cookieEnabled;

/**
 * @type {string}
 * @see https://developer.mozilla.org/en/Navigator.language
 */
Navigator.prototype.language;

/**
 * @type {MimeTypeArray}
 * @see https://developer.mozilla.org/en/Navigator.mimeTypes
 */
Navigator.prototype.mimeTypes;

/**
 * @type {boolean}
 * @see https://developer.mozilla.org/en/Navigator.onLine
 */
Navigator.prototype.onLine;

/**
 * @type {string}
 * @see https://developer.mozilla.org/en/Navigator.oscpu
 */
Navigator.prototype.oscpu;

/**
 * @type {string}
 * @see https://developer.mozilla.org/en/Navigator.platform
 */
Navigator.prototype.platform;

/**
 * @type {PluginArray}
 * @see https://developer.mozilla.org/en/Navigator.plugins
 */
Navigator.prototype.plugins;

/**
 * @type {string}
 * @see https://developer.mozilla.org/en/Navigator.product
 */
Navigator.prototype.product;

/**
 * @type {string}
 * @see https://developer.mozilla.org/en/Navigator.productSub
 */
Navigator.prototype.productSub;

/**
 * @type {string}
 * @see https://developer.mozilla.org/en/Navigator.securityPolicy
 */
Navigator.prototype.securityPolicy;

/**
 * @type {string}
 * @see https://developer.mozilla.org/en/Navigator.userAgent
 */
Navigator.prototype.userAgent;

/**
 * @type {string}
 * @see https://developer.mozilla.org/en/Navigator.vendor
 */
Navigator.prototype.vendor;

/**
 * @type {string}
 * @see https://developer.mozilla.org/en/Navigator.vendorSub
 */
Navigator.prototype.vendorSub;

/**
 * @type {function(): boolean}
 * @see https://developer.mozilla.org/en/Navigator.javaEnabled
 * @nosideeffects
 */
Navigator.prototype.javaEnabled = function() {};

/**
 * @constructor
 * @see https://developer.mozilla.org/en/DOM/PluginArray
 */
function PluginArray() {}

/** @type {number} */
PluginArray.prototype.length;

/**
 * @param {number} index
 * @return {Plugin}
 */
PluginArray.prototype.item = function(index) {};

/**
 * @param {string} name
 * @return {Plugin}
 */
PluginArray.prototype.namedItem = function(name) {};

/** @param {boolean=} reloadDocuments */
PluginArray.prototype.refresh = function(reloadDocuments) {};

/** @constructor */
function MimeTypeArray() {}

/**
 * @param {number} index
 * @return {MimeType}
 */
MimeTypeArray.prototype.item = function(index) {};

/**
 * @type {number}
 * @see https://developer.mozilla.org/en/DOM/window.navigator.mimeTypes
 */
MimeTypeArray.prototype.length;

/**
 * @param {string} name
 * @return {MimeType}
 */
MimeTypeArray.prototype.namedItem = function(name) {};

/** @constructor */
function MimeType() {}

/** @type {string} */
MimeType.prototype.description;

/** @type {Plugin} */
MimeType.prototype.enabledPlugin;

/** @type {string} */
MimeType.prototype.suffixes;

/** @type {string} */
MimeType.prototype.type;

/** @constructor */
function Plugin() {}

/** @type {string} */
Plugin.prototype.description;

/** @type {string} */
Plugin.prototype.filename;

/** @type {number} */
Plugin.prototype.length;

/** @type {string} */
Plugin.prototype.name;

/** @constructor */
function BoxObject() {}

/** @type {Element} */
BoxObject.prototype.element;

/** @type {number} */
BoxObject.prototype.screenX;

/** @type {number} */
BoxObject.prototype.screenY;

/** @type {number} */
BoxObject.prototype.x;

/** @type {number} */
BoxObject.prototype.y;

/** @type {number} */
BoxObject.prototype.width;


/**
 * @type {number}
 * @see http://www.google.com/codesearch/p?hl=en#eksvcKKj5Ng/mozilla/dom/public/idl/html/nsIDOMNSHTMLImageElement.idl&q=naturalWidth
 */
HTMLImageElement.prototype.naturalWidth;

/**
 * @type {number}
 * @see http://www.google.com/codesearch/p?hl=en#eksvcKKj5Ng/mozilla/dom/public/idl/html/nsIDOMNSHTMLImageElement.idl&q=naturalHeight
 */
HTMLImageElement.prototype.naturalHeight;
