# CUI.dom

CUI.dom has functions to manage our dom elements.

### CUI.dom.data(node, key, value)

- node `HTMLElement`
- key `String` | `PlainObject`
- value `Object`

It sets a **value** inside the **node** referenced by the **key**, and returns the **node**

If **value** is undefined, it gets the value referenced by the **key** in the **node**.

If **key** is undefined, it gets an `Object` with all the values in the **node**  

If **key** is an `Object`, *CUI.dom.data* is called once for each *key-value* inside the object. 

#### Examples

```
CUI.dom.data(div, "id", "idValue")
> <div>​</div>​
 
CUI.dom.data(div, "id")
> "idValue"
 
CUI.dom.data(div, {keyOne: "valueOne", keyTwo: "valueTwo"})
> <div></div>​
 
CUI.dom.data(div)
> {id: "myId", keyOne: "valueOne", keyTwo: "valueTwo"}
```

### CUI.dom.removeData(node, key) : `Object`

- node `HTMLElement`
- key `String`

It removes the value referenced by the **key** inside the data of **node** and returns the **node**

#### Example

    CUI.dom.data(div, "id")
    > "myId"
     
    CUI.dom.removeData(div, "id")
    > <div>​</div>​
     
    CUI.dom.data(div, "id")
    > undefined

### CUI.dom.findElements(node, selector, nodeFilter, maxEls, forward, siblingOnly, elements) : `[HTMLElement]`

- node `HTMLElement` (default value: *document.documentElement*)
- selector `String` (default value: *null*)
- nodeFilter `Function` (default value: *false*)
    - It receives **node** as parameter and returns a `Boolean`. **node** will be ignored in the output if it returns *false*
- maxEls `Number` (default value: *null*)
    - Maximum quantity of elements as output
- forward `Boolean` (default value: *true*)
    - If *true* the search will be performed in the node and its next siblings. 
    - If *false* the search will be performed in the node and its previous siblings
    - Also it indicates what order of children nodes will be in the output.
- siblingOnly `Boolean` (default value: *false*)
    - Flag to indicate that only siblings will be in the output and children nodes will be ignored.
- elements `Array` of `HTMLElement` (default value: *[ ]*)
    - Output array.

It gets all the elements inside the **node** (siblings and children) matched by the **selector**

#### Examples

HTML:

```html
    <div class="sibling previous-sibling">
    	<div class="child child-previous-sibling"></div>
    </div>
     
    <div id="div">
        <div class="child first-element">
        	<div class="child child-first-element"></div>
        </div>
        <div class="child second-element"></div>
        <div class="child last-element"></div>
    	<div class="child child-last-element"></div>
    </div>
    
    <div class="sibling next-sibling">
        <div class="child child-next-sibling"></div>    
    </div>
```

Usages:
       
    CUI.dom.findElements(div, ".child")
    > (6) [div.child.first-element, div.child.child-first-element, 
           div.child.second-element, div.child.last-element, 
           div.child.child-last-element, div.child.child-next-sibling]
     
    CUI.dom.findElements(div, ".child", false, 2)
    > (2) [div.child.first-element, div.child.child-first-element]
     
    CUI.dom.findElements(div, ".child", false, 10, false)
    > (6) [div.child.last-element, div.child.child-last-element, 
         div.child.second-element, div.child.first-element, 
         div.child.child-first-element, div.child.child-previous-sibling]
     
    CUI.dom.findElements(div, ".child", false, 10, true, true)
    > []

### CUI.dom.findElement(node, selector, nodeFilter, forward, siblingOnly) : `HTMLElement`

It uses *CUI.dom.findElements* function and returns the first element found. It returns *null* if no element was found.

#### Example

    CUI.dom.findElement(div, ".child")
    > <div class=​"child first-element">​</div>​
     
    CUI.dom.findElement(div, ".no-exist")
    > null

### CUI.dom.findNextElement(node, selector, nodeFilter, forward, siblingOnly) : `HTMLElement`

It uses **CUI.dom.findElement** function and returns the first element found. 
The difference between **CUI.dom.findElement** and this function is that this function also searches for the element inside his parent's siblings and so on.

#### Example
       
    CUI.dom.findNextElement(div, ".sibling", false, false)
    > <div class=​"sibling previous-sibling">​…​</div>​
     
    CUI.dom.findNextElement(div, ".sibling", false, true)
    > <div class="sibling next-sibling">…</div>​

### CUI.dom.findPreviousElement(node, selector, nodeFilter) : `HTMLElement`

It uses **CUI.dom.findNextElement** with the **forward** parameter with *false* as value.

#### Example

    CUI.dom.findPreviousElement(div, ".sibling")
    > <div class="sibling previous-sibling">…</div>​
    
### CUI.dom.findNextVisibleElement(node, selector, forward) : `HTMLElement`

It uses **CUI.dom.findNextElement** with a function as parameter to filter the output node. This node has to be visible. 

### CUI.dom.findPreviousVisibleElement(node, selector : `HTMLElement`

It uses **CUI.dom.findNextVisibleElement** with the **forward** parameter with *false* as value

### CUI.dom.findNextSiblings(node, selector, nodeFilter) : `[HTMLElement]`

It uses **CUI.dom.findElements** with the **forward** parameter with *true* as value and the **siblingOnly** parameter with *true* as value

### CUI.dom.findPreviousSiblings(node, selector, nodeFilter) : `[HTMLElement]`

It uses **CUI.dom.findElements** with the **forward** parameter with *false* as value and the **siblingOnly** parameter with *true* as value

### CUI.dom.children(node, filter) : `[HTMLElement]`

- node `HTMLElement`
- filter `HTMLElement` | `Function` | `String`

It returns an array with all children of **node**

If **filter** is a `String`, it should be a selector.

If **filter** is a `Function`, it should receive **node** as parameter and returns a `Boolean`

#### Examples

    <div id="div">
        <span class="child"></span>
        <div class="child noFilter"></div>
    </div>
     
    CUI.dom.children(div)
    > (2) [span.child, div.child]
     
    CUI.dom.children(div, ".noFilter")
    > [div.child.noFilter]
     
    filterFunction = (node) -> CUI.dom.hasClass(node, "noFilter")
    CUI.dom.children(div, filterFunction)
    > [div.child.noFilter]
     
    CUI.dom.children(div, div.firstElementChild)
    > [span.child]
    

### CUI.dom.firstElementChild(node, selector) : `HTMLElement`

- node `HTMLElement`
- selector `HTMLElement` | `Function` | `String` | *null*

It gets the first child of **node** that returns *true* to **CUI.dom.is** invocation with **node** and **selector** as parameters.

The iteration will be from first child to last child.

Returns the first child if **selector** is null.
Returns *null* if no child were found.

### CUI.dom.lastElementChild(node, selector) : `HTMLElement`

- node `HTMLElement`
- selector `HTMLElement` | `Function` | `String` | *null*

It gets the first child of **node** that returns *true* to **CUI.dom.is** invocation with **node** and **selector** as parameters. 

The iteration will be from last child to first child.

Returns the last child if **selector** is null.
Returns *null* if no child were found.

### CUI.dom.nextElementSibling(node, selector) : `HTMLElement`

- node `HTMLElement`
- selector `HTMLElement` | `Function` | `String` | *null*

It gets the first next sibling of **node** that returns *true* to **CUI.dom.is** invocation with **node** and **selector** as parameters.

Returns *null* if no sibling were found.

### CUI.dom.previousElementSibling(node, selector) : `HTMLElement` 

- node `HTMLElement`
- selector `HTMLElement` | `Function` | `String` | *null*

It gets the first previous sibling of **node** that returns *true* to **CUI.dom.is** invocation with **node** and **selector** as parameters.

Returns *null* if no sibling were found.

### CUI.dom.setAttribute(node, key, value)

- node `HTMLElement`
- key `String`
- value `String` | `Boolean`

It sets an attribute called **key** in the **node** with **value** and returns the **node**

If **value** is *null* or *false* it removes the value inside the **key** attribute.

If **value** is *true*, the value inside the **key** attribute will be **key**

#### Example

    CUI.dom.setAttribute(div, "id", "idValue")
    > <div id=​"idValue">​</div>​
     
    CUI.dom.setAttribute(div, "enabled", true)
    > <div id=​"idValue" enabled=​"enabled">​</div>​
     
    CUI.dom.setAttribute(div, "enabled", false)
    > <div id=​"idValue">​</div>​

### CUI.dom.removeAttribute(node, key)

- node `HTMLElement`
- key `String`

It removes the attribute **key** in the **node** and returns the **node**

#### Example

    CUI.dom.setAttribute(div, "id", "idValue")
    > <div id=​"idValue">​</div>​
     
    CUI.dom.removeAttribute(div, "id")
    > <div>​</div>​

### CUI.dom.getAttribute(node, key) : `String` | `Number` | `PlainObject`

- node `HTMLElement`
- key `String`

It returns the *value* stored inside **key** attribute of **node**

    CUI.dom.setAttribute(div, "id", "idValue")
    > <div id=​"idValue">​</div>​
     
    CUI.dom.getAttribute(div, "id")
    > "idValue"

### CUI.dom.hasAttribute(node, key) : `Boolean`

Returns *false* or *true* if **node** has an attribute called **key**

    CUI.dom.setAttribute(div, "id", "idValue")
    > <div id=​"idValue">​</div>​
        
    CUI.dom.hasAttribute(div, "id")
    > true
    CUI.dom.hasAttribute(div, "no-exists")
    > false

### CUI.dom.setAttributeMap(node, map)

- node `HTMLElement`
- map `PlainObject`
    - key `String`
    - value `String` | `Boolean`
    
It invokes **CUI.dom.setAttribute** once for each **key-value** inside **map**

### CUI.dom.width(element, value) : `Number`

- element `HTMLElement`| `window` | `document`
- value `Number`

It sets the width of the **element** with **value** or it returns the width of **element** if value is not passed as argument.

If element is `window` or `document` it returns the width of the `window`. It's necessary not to pass **value** as argument in this case.

#### Example

    CUI.dom.width(div, 10)
    > {width: 10}
    CUI.dom.width(div)
    > 10
    div
    > <div id=​"div" style=​"width:​ 10px;​">​</div>​
     
    CUI.dom.width(window)
    > 1100
    
### CUI.dom.height(element, value) : `Number`

- element `HTMLElement`| `window` | `document`
- value `Number`

It sets the height of the **element** with **value** or it returns the height of **element** if value is not passed as argument.

If element is `window` or `document` it returns the height of the `window`. It's necessary not to pass **value** as argument in this case.

#### Example

    CUI.dom.height(div, 10)
    > {height: 10}
    CUI.dom.height(div)
    > 10
    div
    > <div id=​"div" style=​"height:​ 10px;​">​</div>​
     
    CUI.dom.height(window)
    > 800


### CUI.dom.replace(node, content) : `HTMLElement`

- node `HTMLElement`
- content `HTMLElement` | `String`

It removes the current content inside **node** and appends the **content** in the **node**

#### Example

    div
    > <div id="div">
        <p></p>
      </div>
     
    CUI.dom.replace(div, span)
    > <div id="div">
        <span></span>
      </div>

### CUI.dom.append(node, content) : `HTMLElement`

- node `HTMLElement`
- content `HTMLElement` | `Node` | `Number` | `Boolean` | `String` | `HTMLCollection` | `NodeList`

It is a extended version of *HTML DOM appendChild()*. It accepts different types of *content* which will be appended in the node.

#### Examples

    div
    > <div>
        <span class="existing-span"></span>
      </div>
    CUI.dom.append(div, span)
    > <div>
        <span class="existing-span"></span>
        <span></span>
      </div>​
       
    spans
    > (3) [span, span, span]
    CUI.dom.append(div, spans)
    > <div>
        <span></span>
        <span></span>​
        <span></span>​
      </div>​
            
    texts
    > (2) ["Hello", "World"]
    CUI.dom.append(div, texts)
    > <div>
        "Hello"
        "World"
      </div>​
      
    nodes
    > (2) [text, text]
    CUI.dom.append(div, nodes)
    > <div>
        "node"
        "nodeTwo"
      </div>​

### CUI.dom.prepend(node, content) : `HTMLElement`

- node `HTMLElement`
- content `HTMLElement` | `Node` | `Number` | `Boolean` | `String` | `HTMLCollection` | `NodeList`

It is a extended version of *HTML DOM insertBefore()*. It accepts different types of **content** which will be inserted before the **node**.

#### Examples

    div
    > <div>
        <span class="existing-span"></span>
      </div>
    CUI.dom.prepend(div, span)
    > <div>
        <span></span>
        <span class="existing-span"></span>
      </div>​
      
*See CUI.dom.append examples, are very similar*

### CUI.dom.remove(element) : `HTMLElement`

- element `HTMLElement`

It removes the **element** and returns it.

#### Example

    div
    > <div>
        ​<span></span>
      ​</div>​
    CUI.dom.remove(span)
    > <span></span>​
    div
    > <div></div>​

### CUI.dom.empty(element) : `HTMLElement`

- element `HTMLElement`

It removes all child elements inside the **element** and returns **element**

    div
    > <div>
        ​<span></span>​
      </div>​
    CUI.dom.empty(div)
    > <div></div>​
    
### CUI.dom.hasClass(element, class) : `Boolean`

- element `HTMLElement`
- class `String`

It returns a `Boolean` depending if the *class* is present in the *classList* of the **element**.
By sending a `String` with the **classes** separated by spaces, it returns *true* if any of those **classes** is present.

#### Examples

    div
    > <div class=​"a-class"></div>​
     
    CUI.dom.hasClass(div, "a-class")
    > true
     
    CUI.dom.hasClass(div, "b-class")
    > false
     
    CUI.dom.hasClass(div, "a-class b-class")
    > true

### CUI.dom.addClass(element, class) : `HTMLElement`

- element `HTMLElement`
- class `String`

It adds the **class** to the *classList* of the **element**. 
It is possible to add a list of classes, by sending a `String` with the **classes** separated by spaces.

#### Examples

    CUI.dom.addClass(div, "a-class")
    > <div class=​a-class"></div>​
     
    CUI.dom.addClass(div, "b-class c-class")
    > <div class="a-class b-class c-class"></div>​

### CUI.dom.removeClass(element, class)

- element `HTMLElement`
- class `String`

It removes the **class** from the *classList* of the **element**. 
It is possible to remove a list of classes, by sending a `String` with the **classes** separated by spaces.

#### Examples

    div
    > <div class="a-class b-class c-class d-class"></div>​
     
    CUI.dom.removeClass(div, "a-class")
    > <div class="b-class c-class d-class"></div>​
     
    CUI.dom.removeClass(div, "b-class c-class")
    > <div class="d-class"></div>​

### CUI.dom.setClass(element, class, on_off) : `Boolean`

- element `HTMLElement`
- class `String`
- on_off `Boolean`

It adds or removes a **class** of the *classList* of the **element** depending the **on_off** argument.

If **on_off** argument is *true*, it adds the **class**

If **on_off** argument is *false*, it removes the **class**

#### Examples

    div
    > <div class=​"a-class b-class">​</div>​
     
    CUI.dom.setClass(div, "c-class", true)
    > true
    div
    > <div class=​"a-class b-class c-class">​</div>​
     
    CUI.dom.setClass(div, "c-class", false)
    > false
    div
    > <div class=​"a-class b-class">​</div>​


### CUI.dom.toggleClass(element, cls) : `Boolean`

- element `HTMLElement`
- class `String`

It adds or removes a **class** of the *classList* of the **element** depending in its current presence.

#### Example

    div
    > <div class=​"a-class"></div>​
     
    CUI.dom.toggleClass(div, "b-class")
    > true
    div
    > <div class=​"a-class b-class">​</div>​
     
    CUI.dom.toggleClass(div, "b-class")
    > false
    div
    > <div class=​"a-class">​</div>​

### CUI.dom.setAria(element, key, value) : `[HTMLElement]`

- element `HTMLElement`
- key `String`
- value `String` | `Boolean`

It invokes **CUI.dom.setAttribute** appending the string "*aria-*" to the **key**. Returns **element**

#### Example

    CUI.dom.setAria(div, "attributekey", "attributeValue")
    > <div aria-attributekey=​"attributeValue">​</div>​  

### CUI.dom.getRelativeOffset(element, untilElement, ignore_margin) : `{parent: [HTMLElement], top: [Number], left: [Number]}`

- element `HTMLElement`
- untilElement `HTMLElement` (default value: *null*)
- ignore_margin `Boolean` (default value: *false*)

It returns the relative offset of the **element** until the **untilElement**.

If **untilElement** is *null*, the offset will be until the *body*.

If **ignore_margin** is *true*, the offset will includes the margin of the **element**.

#### Examples

```html
<div id="parent">
    <div id="child" style="height: 20px;"></div>
    <div id="child_parent" style="padding-top:10px;">
        <p style="margin-top:5px;">Hello world</p>
    </div>
</div>
```

    CUI.dom.getRelativeOffset(p)
    > {parent: body, top: 30, left: 0}
     
    CUI.dom.getRelativeOffset(p, parent)
    > {parent: div#parent, top: 30, left: 0}
     
    CUI.dom.getRelativeOffset(p, child_parent)
    > {parent: div#child_parent, top: 10, left: 0}
     
    CUI.dom.getRelativeOffset(p, child_parent, true)
    > {parent: div#child_parent, top: 15, left: 0}

### CUI.dom.getRelativePosition(element) : `{top: [Number], left: [Number]}`

- element `HTMLElement`

It returns the relative position of the **element**

#### Examples

```html
<div style="margin-left: 50px; margin-top: 100px;">
    <p style="margin-top:50px;">Hello world</p>
</div>
```

    CUI.dom.getRelativePosition(p)
    > {top: 150, left: 50}

### CUI.dom.setAbsolutePosition(element, offset) : `HTMLElement`

- element `HTMLElement`
- offset `Object`
    - left `Number`
    - top `Number`

It sets the absolute position of the **element** with **offset.left** and **offset.top** values. Returns **element**

#### Example

```html
<div style="position: absolute;">
    <span style="position: relative;">Hello world</span>
</div>
```
```
CUI.dom.setAbsolutePosition(div, {top: 10, left: 10})
> <div style="position: absolute; top: 10px; left: 10px;">
      <span style="position: relative;">Hello world</span>
  </div>
 
CUI.dom.setAbsolutePosition(span, {top: 50, left: 30})
> <span style="position: relative; top: 40px; left: 20px;">Hello world</span>
```     
     
### CUI.dom.getNode(node) : `HTMLElement`

- node `Object` | `HTMLElement`

It returns the attribute *DOM* of **node** if it exists and **node** is not *window*, otherwise returns **node**.

### CUI.dom.isNode(node) : `Boolean`

- node `Object` | `HTMLElement`

It returns *true* if **node** is one of the following: `document.documentElement` | `document` | `window` or if **node** has the attribute `nodeType` | `DOM`, otherwise returns *false*

### CUI.dom.waitForDOMRemove(options) : `CUI.Promise`

- options `Object`
    - node `Object` | `HTMLElement` (Checked with *CUI.dom.isNode*)
    - ms `Number` (default 200)
    
It returns a promise, which will be resolved when **node** was removed from the DOM tree.
Parameter **ms** is the quantity of milliseconds to be waited until repeat the recursive function to check if the element was removed.

### CUI.dom.waitForDOMInsert(options) : `CUI.Promise`

- options `Object`
    - node `Object` | `HTMLElement` (Checked with *CUI.dom.isNode*)
    
It returns a promise, which will be resolved when **node** was inserted in the DOM tree.

### CUI.dom.insertChildAtPosition(node, nodeInsert, position)

- node `Object` | `HTMLElement`
- nodeInsert `Object` | `HTMLElement`
- position `Number`

Inserts **nodeInsert** as a child of **node** in the **position**.

#### Example

```
<div class="node">
    <div class="child-1"></div>
    <div class="child-2"></div>
    <div class="child-3"></div>
</div>

newDiv
> <div class="child-new"></div>​

CUI.dom.insertChildAtPosition(div, newDiv, 2)

<div class="node">
    <div class="child-1"></div>
    <div class="child-2"></div>
    <div class="child-new"></div>
    <div class="child-3"></div>
</div>
```

### CUI.dom.insertBefore(node, nodeBefore)

- node `Object` | `HTMLElement`
- nodeBefore `Object` | `HTMLElement`

Inserts **nodeBefore** before **node**

#### Example

```
<div class="node">
    <div class="child-1"></div>
    <div class="child-2"></div>
    <div class="child-3"></div>
</div>

CUI.dom.insertBefore(divChild2, newDiv)

<div class="node">
    <div class="child-1"></div>
    <div class="child-new"></div>
    <div class="child-2"></div>
    <div class="child-3"></div>
</div>
```


### CUI.dom.insertAfter(node, nodeAfter)

- node `Object` | `HTMLElement`
- nodeAfter `Object` | `HTMLElement`

Inserts **nodeAfter** after **node**

#### Example

```
<div class="node">
    <div class="child-1"></div>
    <div class="child-2"></div>
    <div class="child-3"></div>
</div>

CUI.dom.insertAfter(divChild2, newDiv)

<div class="node">
    <div class="child-1"></div>
    <div class="child-2"></div>
    <div class="child-new"></div>
    <div class="child-3"></div>
</div>
```

### CUI.dom.matches(node, selector) : `Boolean`

- node `HTMLElement`
- selector `String`

Returns *true* if **node** matches with **selector**, otherwise returns *false*

### CUI.dom.is(node, selector) : `Boolean`

- node `HTMLElement`
- selector `HTMLElement` | `Function` | `String`

Evaluates **node** depending of **selector** type. 
If **selector** is:
- `HTMLElement`: Returns *true* if **node** is equals to **selector** 
- `Function`: Returns the result of invoke **selector** function with **node** as parameter.
- `String`: Returns the result of invoke the function *CUI.dom.matches* with **node** and **selector** as parameters. 

Returns *false* if **node** is not a `HTMLElement`

#### Examples

```
aFunction: (node) -> return true

div
> <div class="node"></div>

CUI.dom.is(div, aFunction)
> true

CUI.dom.is(div, div)
> true

CUI.dom.is(div, anotherDiv)
> false

CUI.dom.is(div, ".node")
> true

CUI.dom.is(div, ".anotherClass")
> false
```

### CUI.dom.matchSelector(element, selector, trySelf) : `[Node]`

- element `HTMLElement` | *document*
- selector `String`
- trySelf `Boolean` (default *false*)

Returns an array of all the children elements of **element** which matches with **selector**.
If **trySelf** is *true*, it will check if **element** matches as well. 

#### Examples

```
<div class="node">
    <div class="child-1"></div>
    <div class="child-2"></div>
    <div class="child-find"></div>
    <div class="child-3"></div>
</div>

CUI.dom.matchSelector(div, ".child-find")
> [div.child-find]

CUI.dom.matchSelector(div, ".node", false)
> []

CUI.dom.matchSelector(div, ".node", true)
> [div.node]
    
```

### CUI.dom.find(selector) : `[Node]`

- selector `String`

Invokes *CUI.dom.matchSelector* with *document.documentElement* as **element** parameter.

### CUI.dom.elementsUntil(element, selector, untilElement) : `[Node]`

- element `Node` | *window*
- selector `String`
- untilElement `Node` | *window*

Returns an array of elements collected starting from **element** until matches **selector**.
The collection is upwards, and ends at **untilElement**.

#### Examples

```
divNode
> <div class="node">
    <div></div>
    <div></div>
    <div class="parent-3">
        <div class="child-3"></div>
    </div>
</div>
  
CUI.dom.elementsUntil(divChild3, ".parent-3", divNode)
> (2) [div.child-3, div.parent-3]

CUI.dom.elementsUntil(divChild3, ".child-3", divNode)
> [div.child-3]

CUI.dom.elementsUntil(divChild3, ".node", divNode)
> (3) [div.child-3, div.parent-3, div.node]

CUI.dom.elementsUntil(divParent3, ".node", divNode)
> (2) [div.parent-3, div.node]
```

### CUI.dom.parent(element) : `HTMLElement`

- element `HTMLElement` | *document* | *window*

Returns parent's node of **element**.
 
If **element** is *document*, returns *window*

If **element** is *window*, returns *null*

#### Example
```
CUI.dom.parent(divChild)
> <div class="parent">
      <div class="child"></div>
  </div>
```

### CUI.dom.closest(element, selector) : `Node`

- element `Node` | *window*
- selector `String`

Returns the first node which matches the **selector**, starting from **element**.
As *CUI.dom.elementsUntil*, it goes upwards, and ends at *window*.

### CUI.dom.closestUntil(element, selector, untilElement) : `Node`

- element `Node` | *window*
- selector `String`
- untilElement `Node` | *window*

It does the same as *CUI.dom.closest*, with the difference that it ends at **untilElement** instead of *window*.

### CUI.dom.parentsUntil(element, selector, untilElement) : `[Node]`

- element `Node` | *window*
- selector `String`
- untilElement `Node` | *window*

It invokes *CUI.dom.elementsUntil* using parent's node of **element** as first parameter.

### CUI.dom.parents(element, selector, untilElement) : `[Node]`

- element `Node` | *window*
- selector `String`
- untilElement `Node` | *window*

Returns an array of nodes that are the parents of **element** which matches with **selector**, until reach **untilElement**.
The parameter **selector** can be *null*.

### CUI.dom.isInDom(element) : `Boolean`

- element `Node`

Returns *true* if **element** is in the DOM tree, otherwise *false*.

### CUI.dom.replaceWith(node, newNode) : `Node`

- node `Node`
- newNode `Node` | `NodeList`

Replaces **node** with **newNode**. It returns the **node** replaced.

#### Example

```
<div class="container">
    <div class="node"></div>
</div>
 
CUI.dom.replaceWith(divNode, divNewNode)
> <div class="node"></div>
 
<div class="container">
    <div class="newNode"></div>
</div>
```

### CUI.dom.getRect(element) : `DOMRect`

- element `HTMLElement`

Invokes native function **getBoundingClientRect()**

#### Example

```
CUI.dom.getRect(div)
> DOMRect {x: 10, y: 10, width: 100, height: 100, top: 0, …}
```

### CUI.dom.getComputedStyle(element) : `CSSStyleDeclaration `

- element `HTMLElement`

Invokes native function **getComputedStyle**

#### Example

```
CUI.dom.getComputedStyle(div)
> CSSStyleDeclaration {alignContent: "", alignItems: "", alignSelf: "", alignmentBaseline: "", all: "", …}
```

### CUI.dom.setStyle(element, style, append) : `HTMLElement`

- element `HTMLElement`
- style `PlainObject`
    - styleName `String`
    - styleValue `String` | `Number`
- append `String` (optional, default *"px"*)

It sets style **styleName** to the **element** with value **styleValue** for all keys in **style**.
If **styleValue** is a `Number`, **append** will be appended to **styleValue**.

#### Example

```
style = 
  width: 100,
  display: "inline"
  
CUI.dom.setStyle(div, style)
> <div style="width: 100px; display: inline;"></div>
```

### CUI.dom.setStyleOne(element, styleName, styleValue) : `HTMLElement`

- element `HTMLElement`
- styleName `String`
- styleValue `String` | `Number`

It sets style **styleName** to the **element** with value **styleValue**

#### Example

```
CUI.dom.setStyleOne(div, "height", 100)
> <div style="height: 100px;"></div>
```

### CUI.dom.getDimensions(element) : `PlainObject`

- element `HTMLElement`

It returns a very big object with dimensions related attributes. It has 89 keys to be exactly.

#### Example

```
CUI.dom.getDimensions(div)
> {computedStyle: CSSStyleDeclaration, clientBoundingRect: DOMRect, marginTop: 0, marginRight: 0, marginBottom: 0, …}
```

### CUI.dom.getDimension(element, key)

- element `HTMLElement`
- key `String`

It returns the *value* of the attribute **key** inside the object returned by **CUI.dom.getDimensions**.

### CUI.dom.setDimensions(element, dimensions) : `PlainObject`

- element `HTMLElement`
- dimensions `PlainObject`
    - dimensionKey `String`
    - dimensionValue `Number`
    
Sets the style of **element** for different type of **dimensions**.

Available dimensions: *"width"*, *"height"*, *"left"*, *"top"*, *"contentBoxWidth"*, *"contentBoxHeight"*, 
*"borderBoxWidth"*, *"borderBoxHeight"*, *"marginBoxWidth"*, *"marginBoxHeight"*

It's not possible to use two or more Height or Width types.

#### Examples
```
CUI.dom.setDimensions(div, {height: 100, width: 100})
> {width: 100, height: 100}
div
> <div style="width: 100px; height: 100px;"></div>
  
div
> <div style="width: 100px; height: 100px; padding-top: 100px; padding-right: 150px;"></div> 
CUI.dom.setDimensions(div, {contentBoxHeight: 100, contentBoxWidth: 100})
> {width: 250, height: 200}
div
> <div style="width: 250px; height: 200px; padding-top: 100px; padding-right: 150px;"></div>
 
CUI.dom.setDimensions(div, {contentBoxHeight: 100, height: 100})
> Uncaught Error: CUI.dom.setDimensions(docElem,dim): Unable to set contradicting values for height.

```

### CUI.dom.setDimension(element, dimensionKey, dimensionValue) : `PlainObject`

- element `HTMLElement`
- dimensionKey `String`
- dimensionValue `Number`

It's an extension of **CUI.dom.setDimensions** to set only one dimension.

### CUI.dom.parentsScrollable(element) : `[HTMLElement]`

- element `HTMLElement`

It returns all parents of **element** that can have a scroll bar.

### CUI.dom.htmlToNodes(html) : `[Node]`

- html `String`

It returns a node array, generated by **html** string.

#### Examples
```
nodes = CUI.dom.htmlToNodes("<div><h1>Hello!</h1></div><div><h2>Welcome!</h2></div>")
> (2) [div, div]
 
nodes[0]
> <div>
    <h1>Hello!</h1>
  </div>
  
nodes[1]
> <div>
    <h2>Welcome!</h2>
  </div>
```

### CUI.dom.findTextInNodes(nodes, callback, texts) : `[String]`

- nodes `[Node]`
- callback `Function` (optional)
- texts `[String]` (optional, default *[]*)

It returns a `String` array of texts which were found in text nodes inside **nodes** array and its children. It's recursive until reach last children.
The parameter **callback** is a function invoked for each text node found, with two parameters: *textNodeFound* and *textContent* of that node.

#### Examples
```
<div>
    <span>Text node 1</span>
    <div>
        <div>
            <h1>Text node 2</h1>
        </div>
        <div>Text node 3</div>
    </div>
</div>
 
CUI.dom.findTextInNodes([div])
> (3) ["Text node 1", "Text node 2", "Text node 3"]
 

callback = (textNode, textContent) => 
    console.log("TextNode:", textNode, " - TextContent:", textContent)
    
CUI.dom.findTextInNodes([div], callback)
> TextNode: "Text node 1"  - TextContent: Text node 1
> TextNode: "Text node 2"  - TextContent: Text node 2
> TextNode: "Text node 3"  - TextContent: Text node 3
> (3) ["Text node 1", "Text node 2", "Text node 3"]
```

### CUI.dom.getCSSFloatValue(value) : `Number`

- value `String`

It converts **value** into a **Number**, and **value** must have "px" at the end of the string.

#### Examples
```
CUI.dom.getCSSFloatValue("20px")
> 20

CUI.dom.getCSSFloatValue("20")
> 0
```

### CUI.dom.isPositioned(element) : `Boolean`

- element `HTMLElement`

It returns *true* if **element** has the style *position* already set and it's one of these: *"relative"*, *"absolute"*, *"fixed"*
Also, it returns *true* if **element** is *document.body* or *document.documentElement*.

#### Examples
```
CUI.dom.isPositioned(div)
> false
 
CUI.dom.setStyleOne(div, "position", "relative")
> <div style="position: relative;"></div>
CUI.dom.isPositioned(div)
> true
 
CUI.dom.isPositioned(document.body)
> true
```

### CUI.dom.isVisible(element) : `Boolean`

- element `HTMLElement`

It returns *true* if **element** is visible. It's done by checking *visibility* or *display* styles.

#### Example
```
CUI.dom.isVisible(div)
> true

CUI.dom.setStyleOne(div, "display", "none")
> <div style="display:none;"></div>

CUI.dom.isVisible(div)
> false 
```

### CUI.dom.getBoxSizing(element) : `String`

- element `HTMLElement`

It returns the style attribute *boxSizing* of **element**.

#### Example
```
CUI.dom.getBoxSizing(div)
> "border-box"
```

### CUI.dom.isBorderBox(element) : `Boolean`

- element `HTMLElement`

It returns *true* if *boxSizing* style attribute is *"border-box"*

#### Example
```
CUI.dom.getBoxSizing(div)
> "border-box"

CUI.dom.isBorderBox(div)
> true
```

### CUI.dom.isContentBox(element) : `Boolean`

- element `HTMLElement`

It returns *true* if *boxSizing* style attribute is *"content-box"*

#### Example
```
CUI.dom.getBoxSizing(div)
> "border-box"

CUI.dom.isContentBox(div)
> false
```

### CUI.dom.hideElement(element) : `HTMLElement`

- element `HTMLElement`

It hides **element** setting its *display* style attribute to *"none"*.
It returns **element**

#### Example
```
CUI.dom.isVisible(div)
> true
CUI.dom.hideElement(div)
> <div style="display: none;"></div>
CUI.dom.isVisible(div)
> false
```

### CUI.dom.showElement(element) : `HTMLElement`

- element `HTMLElement`

It hides **element** setting its *display* style attribute to *""*.
It returns **element**

#### Example
```
CUI.dom.isVisible(div)
> false
CUI.dom.showElement(div)
> <div style="display: none;"></div>
CUI.dom.isVisible(div)
> true
```

### CUI.dom.removeChildren(element, filter) : `HTMLElement`

- element `HTMLElement`
- filter `HTMLElement` | `Function` | `String`

It removes all children of **element** using **filter** as condition. Refer **CUI.dom.children** for more detail about filter.
It returns **element**


#### Example
```
<div id="div">
    <span class="child"></span>
    <div class="child noFilter"></div>
    <div></div>
</div>

CUI.dom.removeChildren(div, ".noFilter")
> <div id="div">
    <span class="child"></span>
    <div></div>
  </div>
```

### CUI.dom.space(style) : `HTMLElement`

- style `String` (default *null*)

It creates and returns a new element which is a div with a specific class, and it is used to create empty spaces between elements.
The parameter **style** defines what type of space will be created. Available **style** values: *"small"*, *"large"*, *"flexible"* and *null*

#### Example
```
CUI.dom.space()
> <div class="cui-space"></div>
 
CUI.dom.space("small")
> <div class="cui-small-space"></div>

CUI.dom.space("large")
> <div class="cui-large-space"></div>
 
CUI.dom.space("flexible")
> <div class="cui-flexible-space"></div>
```

### CUI.dom.scrollIntoView(element) : `HTMLElement`

This function is similar to *scrollIntoView* native function, but it has improvements.
It returns **element**

### CUI.dom.setClassOnMousemove(options)

- options `Object`
    - element `HTMLElement`
    - class `String`
    - ms `Number` > 0 (default 3000)
    - delayRemove `Function` (optional)
    
It adds a **class** to the **element** when the mouse is hovering over it.
As well after **ms** milliseconds passed of mouse hovering, **delayRemove** is triggered.
Also **delayRemove** is triggered once when the mouse is no longer hovering over the **element**.

### CUI.dom.requestFullscreen(element) : `CUI.Promise`

- element `HTMLElement` | `CUI.DOMElement`

It requests a fullscreen for the **element** via using the *native function* of the browser.
The difference between using this method and the *native function* is that this method will use one of these *native function*s 
available in the browser: *requestFullscreen*, *webkitRequestFullscreen*, *mozRequestFullScreen* and *msRequestFullscreen*.
It returns a promise and it's fulfilled when fullscreen is activated.

### CUI.dom.exitFullscreen() : `CUI.Promise`

It closes fullscreen if it's enabled.
It returns a promise and it's fulfilled when fullscreen is closed.

### CUI.dom.isFullscreen() : `Boolean`

It returns *true* if fullscreen is activated.

### CUI.dom.fullscreenEnabled() : `Boolean`

It returns *true* if fullscreen is enabled.

### CUI.dom.fullscreenElement() : `HTMLElement`

It returns fullscreen element or *undefined* if fullscreen is not activated. 

### CUI.dom.element(tagName, attributes) : `HTMLElement`

- tagName `String`
- attributes `PlainObject`
    - key `String`
    - value `String` | `Boolean`
    
It creates and returns a new **tagName** element, it also invokes **CUI.dom.setAttributeMap** with the new element 
and **attributes** as parameters.

#### Examples
```
CUI.dom.element("div")
> <div></div>
 
attributes = 
    id: "myDiv" 
    enable: true
 
CUI.dom.element("div", attributes)
> <div id="myDiv" enable="enable"></div>
 
CUI.dom.element("h1")
> <h1></h1>
```

### CUI.dom.$element(tagName, className, attributes, noTables) : `HTMLElement`

- tagName `String`
- className `String` (optional)
- attributes `PlainObject` (default: *{}*)
    - key `String`
    - value `String` | `Boolean`
- noTables `Boolean` (default: *false*)

It invokes **CUI.dom.element** to create a new element, but before that it sets the attribute *class* with **className** value if it's defined.
Also, if **noTables** is *true*, it adds a new *class* called "cui-**tagName**" 

#### Examples
```
attributes = 
    id: "myDiv" 
    enable: true
 
CUI.dom.$element("div", "newClass", attributes)
> <div id="myDiv" enable="enable" class="newClass"></div>
 
CUI.dom.$element("div", "newClass", attributes, true)
> <div id="myDiv" enable="enable" class="cui-div newClass"></div>
```

If it's necessary to create elements, it's recommendable to use the following methods instead of this method. 

These methods are wrappers of **CUI.dom.$element** for create common elements.

- CUI.dom.div(className, attributes) : `HTMLElement`
- CUI.dom.video(className, attributes) : `HTMLElement`
- CUI.dom.audio(className, attributes) : `HTMLElement`
- CUI.dom.source(className, attributes) : `HTMLElement`
- CUI.dom.span(className, attributes) : `HTMLElement`
- CUI.dom.table(className, attributes) : `HTMLElement`
- CUI.dom.img(className, attributes) : `HTMLElement`
- CUI.dom.tr(className, attributes) : `HTMLElement`
- CUI.dom.th(className, attributes) : `HTMLElement`
- CUI.dom.td(className, attributes) : `HTMLElement`
- CUI.dom.i(className, attributes) : `HTMLElement`
- CUI.dom.p(className, attributes) : `HTMLElement`
- CUI.dom.pre(className, attributes) : `HTMLElement`
- CUI.dom.ul(className, attributes) : `HTMLElement`
- CUI.dom.a(className, attributes) : `HTMLElement`
- CUI.dom.b(className, attributes) : `HTMLElement`
- CUI.dom.li(className, attributes) : `HTMLElement`
- CUI.dom.label(className, attributes) : `HTMLElement`
- CUI.dom.h1(className, attributes) : `HTMLElement`
- CUI.dom.h2(className, attributes) : `HTMLElement`
- CUI.dom.h3(className, attributes) : `HTMLElement`
- CUI.dom.h4(className, attributes) : `HTMLElement`
- CUI.dom.h5(className, attributes) : `HTMLElement`
- CUI.dom.h6(className, attributes) : `HTMLElement`

#### Examples
```
attributes = 
    id: "myDiv" 
    enable: true
 
CUI.dom.div("aClass", attributes)
> <div id="myDiv" enable="enable" class="aClass"></div>
 
CUI.dom.h1("title")
> <h1 class="title"></h1>
 
CUI.dom.span()
> <span></span>
```

### CUI.dom.text(text, className, attributes) : `HTMLElement`

- text `String`
- className `String`
- attributes `PlainObject`
    - key `String`
    - value `String` | `Boolean`

It invokes **CUI.dom.span** to create a new *span* element using **className** and **attributes** as parameters.
Afterwards it sets the value **text** into *textContent* of the new element.

#### Example
```
CUI.dom.text("This is the content of the span", "newClass")
> <span class="newClass">This is the content of the span</span>
```

### CUI.dom.textEmpty(text)

- text `String`

It invokes **CUI.dom.span** to create a new *span* element using *"italic"* as className parameter.
Afterwards it sets the value **text** into *textContent* of the new element.

#### Example
```
CUI.dom.textEmpty("This is the content of the span")
> <span class="italic">This is the content of the span</span>
```

### CUI.dom.table_one_row()
### CUI.dom.tr_one_row()
### CUI.dom.prepareSetDimensions(element)
### CUI.dom.hasAnimatedClone(node)
### CUI.dom.initAnimatedClone(node, selector)
### CUI.dom.syncAnimatedClone(node)
### CUI.dom.removeAnimatedClone(node)

*Note: All the examples above were made in the browser's console.*