goog.dom.FontSizeMonitor.EventType.CHANGE
event.
Example usage:
var fms = new goog.dom.FontSizeMonitor(); goog.events.listen(fms, goog.dom.FontSizeMonitor.EventType.CHANGE, function(e) { alert('Font size was changed'); });
<div>1<span>2</span>3</div>Will return the following nodes:
[div, 1, span, 2, 3]
With the following depths
[1, 1, 2, 2, 1]
Imagining |
represents iterator position, the traversal stops at
each of the following locations:
<div>|1|<span>|2|</span>3|</div>The iterator can also be used in reverse mode, which will return the nodes and states in the opposite order. The depths will be slightly different since, like in normal mode, the depth is computed *after* the last move. Lastly, it is possible to create an iterator that is unconstrained, meaning that it will continue iterating until the end of the document instead of until exiting the start node.
<div>1<span>2</span>3</div>Will return the following nodes:
[div, 1, span, 2, span, 3, div]
With the following states:
[START, OTHER, START, OTHER, END, OTHER, END]
And the following depths
[1, 1, 2, 2, 1, 1, 0]
Imagining |
represents iterator position, the traversal stops at
each of the following locations:
<div>|1|<span>|2|</span>|3|</div>|The iterator can also be used in reverse mode, which will return the nodes and states in the opposite order. The depths will be slightly different since, like in normal mode, the depth is computed *after* the given node. Lastly, it is possible to create an iterator that is unconstrained, meaning that it will continue iterating until the end of the document instead of until exiting the start node.
goog.events.EventType.RESIZE
event when the viewport size
changes. Handlers can call goog.dom.ViewportSizeMonitor#getSize
to
get the new viewport size.
Use this class if you want to execute resize/reflow logic each time the
user resizes the browser window. This class is guaranteed to only dispatch
RESIZE
events when the pixel dimensions of the viewport change.
(Internet Explorer fires resize events if any element on the page is resized,
even if the viewport dimensions are unchanged, which can lead to infinite
resize loops.)
Example usage:
var vsm = new goog.dom.ViewportSizeMonitor(); goog.events.listen(vsm, goog.events.EventType.RESIZE, function(e) { alert('Viewport size changed to ' + vsm.getSize()); });Manually verified on IE6, IE7, FF2, Opera 11, Safari 4 and Chrome.
![]()
Enum of browser capabilities.
Constants:
|
Code » | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]()
Constants for the nodeType attribute in the Node interface.
These constants match those specified in the Node interface. These are
usually present on the Node object in recent browsers, but not in older
browsers (specifically, early IEs) and thus are given here.
In some browsers (early IEs), these are not defined on the Node object,
so they are provided here.
See http://www.w3.org/TR/DOM-Level-2-Core/core.html#ID-1950641247
Constants:
|
Code » | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]()
Constants for selection endpoints.
Constants:
|
Code » | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]()
Types of ranges.
Constants:
|
Code » | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]()
Enum of all html tag names specified by the W3C HTML4.01 and HTML5
specifications.
Constants:
|
Code » | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]()
There are three types of token:
START_TAG + END_TAG = 0 and
that OTHER = 0 .
Constants:
|
Code » |
Use
goog.dom.getElement instead.
Alias for getElement.
|
code » | |||||
![]()
Use
goog.dom.getElementsByTagNameAndClass instead.
Alias for getElementsByTagNameAndClass .
Arguments:
Returns: {length: number
} Array-like list of elements (only a length
property and numerical indices are guaranteed to exist).
|
code » | |||||
Use
goog.dom.createDom instead.
Alias for createDom .
Arguments:
Returns: !Element
Reference to a DOM node.
|
code » | |||||
![]()
Appends a node with text or other nodes.
Arguments:
|
code » | |||||
![]()
Appends a child to a node.
|
code » | |||||
![]()
Appends a node with text or other nodes.
|
code » | |||||
Determines if the given node can contain children, intended to be used for
HTML generation.
IE natively supports node.canHaveChildren but has inconsistent behavior.
Prior to IE8 the base tag allows children and in IE9 all nodes return true
for canHaveChildren.
In practice all non-IE browsers allow you to add children to any node, but
the behavior is inconsistent:
var a = document.createElement('br'); a.appendChild(document.createTextNode('foo')); a.appendChild(document.createTextNode('bar')); console.log(a.childNodes.length); // 2 console.log(a.innerHTML); // Chrome: "", IE9: "foobar", FF3.5: "foobar"For more information, see: http://dev.w3.org/html5/markup/syntax.html#syntax-elements TODO(user): Rename shouldAllowChildren() ? |
code » | |||||
Prefer the standardized (http://www.w3.org/TR/selectors-api/), native and
fast W3C Selectors API.
|
code » | |||||
Compares the document order of two nodes, returning 0 if they are the same
node, a negative number if node1 is before node2, and a positive number if
node2 is before node1. Note that we compare the order the tags appear in the
document so in the tree text the B node is considered to be
before the I node.
|
code » | |||||
Utility function to compare the position of two nodes, when
textNode 's parent is an ancestor of node . If this entry
condition is not met, this function will attempt to reference a null object.
|
code » | |||||
Utility function to compare the position of two nodes known to be non-equal
siblings.
|
code » | |||||
Whether a node contains another node.
|
code » | |||||
Returns a dom node with a set of attributes. This function accepts varargs
for subsequent nodes to be added. Subsequent nodes will be added to the
first node as childNodes.
So:
createDom('div', null, createDom('p'), createDom('p'));
would return a div with two child paragraphs
Arguments:
Returns: !Element
Reference to a DOM node.
|
code » | |||||
Helper for
createDom .
|
code » | |||||
Creates a new element.
|
code » | |||||
Create a table.
|
code » | |||||
Create a table.
|
code » | |||||
![]()
Creates a new text node.
|
code » | |||||
Find the deepest common ancestor of the given nodes.
Arguments:
Returns: Node
The common ancestor of the nodes, or null if there is none.
null will only be returned if two or more of the nodes are from different
documents.
|
code » | |||||
Finds the first descendant node that matches the filter function, using
a depth first search. This function offers the most general purpose way
of finding a matching element. You may also wish to consider
goog.dom.query which can express many matching criteria using
CSS selector expressions. These expressions often result in a more
compact representation of the desired result.
|
code » | |||||
Finds all the descendant nodes that match the filter function, using a
a depth first search. This function offers the most general-purpose way
of finding a set of matching elements. You may also wish to consider
goog.dom.query which can express many matching criteria using
CSS selector expressions. These expressions often result in a more
compact representation of the desired result.
@param {Node} root The root of the tree to search.
|
code » | |||||
Finds the first or all the descendant nodes that match the filter function,
using a depth first search.
Arguments:
Returns: boolean
Whether the search is complete or not. True in case findOne
is true and the node is found. False otherwise.
|
code » | |||||
Flattens an element. That is, removes it and replace it with its children.
Does nothing if the element is not in the document.
|
code » | |||||
Determines the active element in the given document.
|
code » | |||||
Walks up the DOM hierarchy returning the first ancestor that passes the
matcher function.
Arguments:
Returns: Node
DOM node that matched the matcher, or null if there was
no match.
|
code » | |||||
Walks up the DOM hierarchy returning the first ancestor that has the passed
class name. If the passed element matches the specified criteria, the
element itself is returned.
|
code » | |||||
Walks up the DOM hierarchy returning the first ancestor that has the passed
tag name and/or class name. If the passed element matches the specified
criteria, the element itself is returned.
Arguments:
Returns: Element
The first ancestor that matches the passed criteria, or
null if no match is found.
|
code » | |||||
Returns an array containing just the element children of the given element.
|
code » | |||||
Gets the document object being used by the dom library.
Returns: !Document
Document object.
|
code » | |||||
Calculates the height of the document.
Returns: number
The height of the current document.
|
code » | |||||
Calculates the height of the document of the given window.
Function code copied from the opensocial gadget api:
gadgets.window.adjustHeight(opt_height)
|
code » | |||||
Gets the document scroll distance as a coordinate object.
Returns: !goog.math.Coordinate
Object with values 'x' and 'y'.
|
code » | |||||
Gets the document scroll element.
Returns: !Element
Scrolling element.
|
code » | |||||
Helper for
getDocumentScrollElement .
|
code » | |||||
Helper for
getDocumentScroll .
Arguments:
Returns: !goog.math.Coordinate
Object with values 'x' and 'y'.
|
code » | |||||
Gets the DomHelper object for the document where the element resides.
Arguments:
Returns: !goog.dom.DomHelper
The DomHelper.
|
code » | |||||
Gets an element from the current document by element id.
If an Element is passed in, it is returned.
|
code » | |||||
Returns the first element with the provided className.
|
code » | |||||
Gets an element by id from the given document (if present).
If an element is given, it is returned.
|
code » | |||||
![]()
Returns a static, array-like list of the elements with the provided
className.
|
code » | |||||
![]()
Looks up elements by both tag and class name, using browser native functions
(
querySelectorAll , getElementsByTagName or
getElementsByClassName ) where possible. This function
is a useful, if limited, way of collecting a list of DOM elements
with certain characteristics. goog.dom.query offers a
more powerful and general solution which allows matching on CSS3
selector expressions, but at increased cost in code size. If all you
need is particular tags belonging to a single class, this function
is fast and sleek.
Note that tag names are case sensitive in the SVG namespace, and this
function converts opt_tag to uppercase for comparisons. For queries in the
SVG namespace you should use querySelector or querySelectorAll instead.
https://bugzilla.mozilla.org/show_bug.cgi?id=963870
https://bugs.webkit.org/show_bug.cgi?id=83438
Arguments:
Returns: {length: number
} Array-like list of elements (only a length
property and numerical indices are guaranteed to exist).
|
code » | |||||
![]()
Helper for
getElementsByTagNameAndClass .
Arguments:
Returns: {length: number
} Array-like list of elements (only a length
property and numerical indices are guaranteed to exist).
|
code » | |||||
Returns the first child node that is an element.
|
code » | |||||
Cross-browser function for getting the document element of a frame or iframe.
|
code » | |||||
Cross-browser function for getting the window of a frame or iframe.
|
code » | |||||
Returns the last child node that is an element.
|
code » | |||||
Returns the first node that is an element in the specified direction,
starting with
node .
|
code » | |||||
Returns the first next sibling that is an element.
|
code » | |||||
Returns the next node in source order from the given node.
|
code » | |||||
Returns the node at a given offset in a parent node. If an object is
provided for the optional third parameter, the node and the remainder of the
offset will stored as properties of this object.
Arguments:
Returns: Node
The node at the given offset.
|
code » | |||||
Returns the text length of the text contained in a node, without markup. This
is equivalent to the selection length if the node was selected, or the number
of cursor movements to traverse the node. Images & BRs take one space. New
lines are ignored.
|
code » | |||||
Returns the text offset of a node relative to one of its ancestors. The text
length is the same as the length calculated by goog.dom.getNodeTextLength.
|
code » | |||||
Gets the outerHTML of a node, which islike innerHTML, except that it
actually contains the HTML of the node itself.
|
code » | |||||
Returns the owner document for a node.
|
code » | |||||
Use
goog.dom.getDocumentScroll instead.
Gets the page scroll distance as a coordinate object.
Arguments:
Returns: !goog.math.Coordinate
Object with values 'x' and 'y'.
|
code » | |||||
Returns an element's parent, if it's an Element.
|
code » | |||||
Gives the devicePixelRatio, or attempts to determine if not present.
By default, this is the same value given by window.devicePixelRatio. If
devicePixelRatio is not defined, the ratio is calculated with
window.matchMedia, if present. Otherwise, gives 1.0.
This function is cached so that the pixel ratio is calculated only once
and only calculated when first requested.
Returns: number
The number of actual pixels per virtual pixel.
|
code » | |||||
Returns the first previous sibling that is an element.
|
code » | |||||
Returns the previous node in source order from the given node.
|
code » | |||||
Returns the text content of the current node, without markup.
Unlike
getTextContent this method does not collapse whitespaces
or normalize lines breaks.
|
code » | |||||
Gets an element by id, asserting that the element is found.
This is used when an element is expected to exist, and should fail with
an assertion error if it does not (if assertions are enabled).
|
code » | |||||
Ensures an element with the given className exists, and then returns the
first element with the provided className.
|
code » | |||||
Helper function for getRequiredElementHelper functions, both static and
on DomHelper. Asserts the element with the given id exists.
|
code » | |||||
Returns the text content of the current node, without markup and invisible
symbols. New lines are stripped and whitespace is collapsed,
such that each character would be visible.
In browsers that support it, innerText is used. Other browsers attempt to
simulate it via node traversal. Line breaks are canonicalized in IE.
|
code » | |||||
![]()
Recursive support function for text content retrieval.
|
code » | |||||
Gets the dimensions of the viewport.
Gecko Standards mode:
docEl.clientWidth Width of viewport excluding scrollbar.
win.innerWidth Width of viewport including scrollbar.
body.clientWidth Width of body element.
docEl.clientHeight Height of viewport excluding scrollbar.
win.innerHeight Height of viewport including scrollbar.
body.clientHeight Height of document.
Gecko Backwards compatible mode:
docEl.clientWidth Width of viewport excluding scrollbar.
win.innerWidth Width of viewport including scrollbar.
body.clientWidth Width of viewport excluding scrollbar.
docEl.clientHeight Height of document.
win.innerHeight Height of viewport including scrollbar.
body.clientHeight Height of viewport excluding scrollbar.
IE6/7 Standards mode:
docEl.clientWidth Width of viewport excluding scrollbar.
win.innerWidth Undefined.
body.clientWidth Width of body element.
docEl.clientHeight Height of viewport excluding scrollbar.
win.innerHeight Undefined.
body.clientHeight Height of document element.
IE5 + IE6/7 Backwards compatible mode:
docEl.clientWidth 0.
win.innerWidth Undefined.
body.clientWidth Width of viewport excluding scrollbar.
docEl.clientHeight 0.
win.innerHeight Undefined.
body.clientHeight Height of viewport excluding scrollbar.
Opera 9 Standards and backwards compatible mode:
docEl.clientWidth Width of viewport excluding scrollbar.
win.innerWidth Width of viewport including scrollbar.
body.clientWidth Width of viewport excluding scrollbar.
docEl.clientHeight Height of document.
win.innerHeight Height of viewport including scrollbar.
body.clientHeight Height of viewport excluding scrollbar.
WebKit:
Safari 2
docEl.clientHeight Same as scrollHeight.
docEl.clientWidth Same as innerWidth.
win.innerWidth Width of viewport excluding scrollbar.
win.innerHeight Height of the viewport including scrollbar.
frame.innerHeight Height of the viewport exluding scrollbar.
Safari 3 (tested in 522)
docEl.clientWidth Width of viewport excluding scrollbar.
docEl.clientHeight Height of viewport excluding scrollbar in strict mode.
body.clientHeight Height of viewport excluding scrollbar in quirks mode.
Arguments:
Returns: !goog.math.Size
Object with values 'width' and 'height'.
|
code » | |||||
Helper for
getViewportSize .
Arguments:
Returns: !goog.math.Size
Object with values 'width' and 'height'.
|
code » | |||||
Gets the window object associated with the given document.
Arguments:
Returns: !Window
The window associated with the given document.
|
code » | |||||
Helper for
getWindow .
|
code » | |||||
Returns true if the element has a bounding rectangle that would be visible
(i.e. its width and height are greater than zero).
|
code » | |||||
Returns true if the element has a specified tab index.
|
code » | |||||
Converts an HTML string into a document fragment. The string must be
sanitized in order to avoid cross-site scripting. For example
goog.dom.htmlToDocumentFragment('<img src=x onerror=alert(0)>')
triggers an alert in all browsers, even if the returned document fragment
is thrown away immediately.
|
code » | |||||
Helper for
htmlToDocumentFragment .
|
code » | |||||
![]()
Insert a child at a given index. If index is larger than the number of child
nodes that the parent currently has, the node is inserted as the last child
node.
|
code » | |||||
![]()
Inserts a new node after an existing reference node (i.e. as the next
sibling). If the reference node has no parent, then does nothing.
|
code » | |||||
![]()
Inserts a new node before an existing reference node (i.e. as the previous
sibling). If the reference node has no parent, then does nothing.
|
code » | |||||
Returns true if the browser is in "CSS1-compatible" (standards-compliant)
mode, false otherwise.
Returns: boolean
True if in CSS1-compatible mode.
|
code » | |||||
Returns true if the browser is in "CSS1-compatible" (standards-compliant)
mode, false otherwise.
|
code » | |||||
Whether the object looks like an Element.
Arguments:
Returns: boolean
Whether the object looks like an Element.
|
code » | |||||
Returns true if the element can be focused, i.e. it has a tab index that
allows it to receive keyboard focus (tabIndex >= 0), or it is an element
that natively supports keyboard focus.
|
code » | |||||
Returns true if the element has a tab index that allows it to receive
keyboard focus (tabIndex >= 0), false otherwise. Note that some elements
natively support keyboard focus, even if they have no tab index.
|
code » | |||||
Whether the object looks like a DOM node.
Arguments:
Returns: boolean
Whether the object looks like a DOM node.
|
code » | |||||
Returns true if the object is a
NodeList . To qualify as a NodeList,
the object must have a numeric length property and an item function (which
has type 'string' on IE for some reason).
|
code » | |||||
Returns true if the element's tab index allows the element to be focused.
|
code » | |||||
Returns true if the specified value is a Window object. This includes the
global window for HTML pages, and iframe windows.
Arguments:
Returns: boolean
Whether the variable is a window.
|
code » | |||||
Calculates a mediaQuery to check if the current device supports the
given actual to virtual pixel ratio.
|
code » | |||||
Returns true if the element is focusable even when tabIndex is not set.
|
code » | |||||
![]()
This is an all-software query selector. Use
document.querySelector. See
https://developer.mozilla.org/en-US/docs/DOM/Document.querySelector .
Returns nodes which match the given CSS3 selector, searching the
entire document by default but optionally taking a node to scope
the search by.
dojo.query() is the swiss army knife of DOM node manipulation in
Dojo. Much like Prototype's "$$" (bling-bling) function or JQuery's
"$" function, dojo.query provides robust, high-performance
CSS-based node selector support with the option of scoping searches
to a particular sub-tree of a document.
Supported Selectors:
--------------------
dojo.query() supports a rich set of CSS3 selectors, including:
* class selectors (e.g., `.foo`)
* node type selectors like `span`
* ` ` descendant selectors
* `>` child element selectors
* `#foo` style ID selectors
* `*` universal selector
* `~`, the immediately preceded-by sibling selector
* `+`, the preceded-by sibling selector
* attribute queries:
| * `[foo]` attribute presence selector
| * `[foo='bar']` attribute value exact match
| * `[foo~='bar']` attribute value list item match
| * `[foo^='bar']` attribute start match
| * `[foo$='bar']` attribute end match
| * `[foo*='bar']` attribute substring match
* `:first-child`, `:last-child` positional selectors
* `:empty` content empty selector
* `:empty` content empty selector
* `:nth-child(n)`, `:nth-child(2n+1)` style positional calculations
* `:nth-child(even)`, `:nth-child(odd)` positional selectors
* `:not(...)` negation pseudo selectors
Any legal combination of these selectors will work with
`dojo.query()`, including compound selectors ("," delimited).
Very complex and useful searches can be constructed with this
palette of selectors.
Unsupported Selectors:
----------------------
While dojo.query handles many CSS3 selectors, some fall outside of
what's reasonable for a programmatic node querying engine to
handle. Currently unsupported selectors include:
* namespace-differentiated selectors of any form
* all `::` pseudo-element selectors
* certain pseudo-selectors which don't get a lot of day-to-day use:
| * `:root`, `:lang()`, `:target`, `:focus`
* all visual and state selectors:
| * `:root`, `:active`, `:hover`, `:visited`, `:link`,
`:enabled`, `:disabled`, `:checked`
* `:*-of-type` pseudo selectors
dojo.query and XML Documents:
-----------------------------
`dojo.query` currently only supports searching XML documents
whose tags and attributes are 100% lower-case. This is a known
limitation and will [be addressed soon]
(http://trac.dojotoolkit.org/ticket/3866)
Non-selector Queries:
---------------------
If something other than a String is passed for the query,
`dojo.query` will return a new array constructed from
that parameter alone and all further processing will stop. This
means that if you have a reference to a node or array or nodes, you
can quickly construct a new array of nodes from the original by
calling `dojo.query(node)` or `dojo.query(array)`.
example:
search the entire document for elements with the class "foo":
| dojo.query(".foo");
these elements will match:
|
|
|
example:
search the entire document for elements with the classes "foo" *and*
"bar":
| dojo.query(".foo.bar");
these elements will match:
|
while these will not:
|
|
example:
find `` elements which are descendants of paragraphs and
which have a "highlighted" class:
| dojo.query("p span.highlighted");
the innermost span in this fragment matches:
|
| ... | ... | | example: find all odd table rows inside of the table `#tabular_data`, using the `>` (direct child) selector to avoid affecting any nested tables: | dojo.query("#tabular_data > tbody > tr:nth-child(odd)");
Arguments:
Returns: {length: number
} The elements that matched the query.
|
code » | |||||
![]()
Removes all the child nodes on a DOM node.
Arguments:
|
code » | |||||
Removes a node from its parent.
|
code » | |||||
![]()
Replaces a node in the DOM tree. Will do nothing if
oldNode has no
parent.
|
code » | |||||
![]()
Enables or disables keyboard focus support on the element via its tab index.
Only elements for which
goog.dom.isFocusableTabIndex returns true
(or elements that natively support keyboard focus, like form elements) can
receive keyboard focus. See http://go/tabindex for more info.
|
code » | |||||
![]()
Sets multiple properties on a node.
|
code » | |||||
![]()
Sets the text content of a node, with cross-browser support.
|
code » |
![]()
Alias for goog.dom.form.element.getValue
|
Code » | |
![]()
No description.
|
Code » | |
![]()
No description.
|
Code » | |
![]()
No description.
|
Code » | |
![]()
Typedef for use with goog.dom.createDom and goog.dom.append.
|
Code » | |
![]()
No description.
|
Code » | |
![]()
Whether we know the compatibility mode at compile time.
|
Code » | |
![]()
No description.
|
Code » | |
![]()
Map of attributes that should be set using
element.setAttribute(key, val) instead of element[key] = val. Used
by goog.dom.setProperties.
|
Code » | |
![]()
No description.
|
Code » | |
![]()
No description.
|
Code » | |
![]()
No description.
|
Code » | |
![]()
No description.
|
Code » | |
![]()
Map of tags which have predefined values with regard to whitespace.
|
Code » | |
![]()
No description.
|
Code » | |
![]()
No description.
|
Code » | |
![]()
No description.
|
Code » | |
![]()
No description.
|
Code » | |
![]()
Map of tags whose content to ignore when calculating text length.
|
Code » | |
![]()
No description.
|
Code » | |
![]()
No description.
|
Code » | |
![]()
No description.
|
Code » | |
![]()
No description.
|
Code » | |
![]()
No description.
|
Code » | |
![]()
No description.
|
Code » | |
![]()
No description.
|
Code » | |
![]()
No description.
|
Code » | |
![]()
No description.
|
Code » | |
![]()
No description.
|
Code » | |
![]()
No description.
|
Code » | |
![]()
No description.
|
Code » | |
![]()
No description.
|
Code » | |
![]()
No description.
|
Code » | |
![]()
No description.
|
Code » | |
![]()
No description.
|
Code » | |
Cached default DOM helper.
|
Code » | |
![]()
No description.
|
Code » | |
![]()
No description.
|
Code » | |
![]()
No description.
|
Code » | |
![]()
No description.
|
Code » | |
![]()
No description.
|
Code » | |
![]()
No description.
|
Code » | |
![]()
No description.
|
Code » | |
![]()
No description.
|
Code » | |
![]()
No description.
|
Code » | |
![]()
No description.
|
Code » | |
![]()
No description.
|
Code » | |
![]()
No description.
|
Code » | |
![]()
No description.
|
Code » | |
![]()
No description.
|
Code » | |
![]()
No description.
|
Code » | |
![]()
No description.
|
Code » | |
![]()
No description.
|
Code » | |
![]()
No description.
|
Code » | |
![]()
No description.
|
Code » | |
![]()
No description.
|
Code » | |
![]()
No description.
|
Code » |