# DosDom
Simple API to work with DOM

```
const isTouchDevice = "ontouchstart" in document.documentElement;

```

### applyCss - add new css style if no html element with id exists

```export function applyCss(id: string, css: string) {
    if (document.getElementById(id) === null) {
        const style = document.createElement("style") as HTMLStyleElement;
        style.id = id;
        style.innerHTML = css;
        document.head.appendChild(style);
    }
}

```

### createDiv - typesafe shortcut for creating HTMLDivElement

```export function createDiv(className?: string, css?: string): HTMLDivElement {
    const el = document.createElement("div") as HTMLDivElement;

    if (className !== undefined) {
        el.className = className;
    }

    if (css !== undefined) {
        applyCss(className + "-style", css);
    }

    return el;
}

```

### addButtonListener - create touch & mouse listeners that send onPress & onRelease
events

```export function addButtonListener(el: HTMLElement,
                                  onPress: () => void,
                                  onRelease: () => void) {
    let isTouchHeld = false;

    if (isTouchDevice) {
        const heldTouches: { [index: string]: number } = {};
        const multitouch = (event: TouchEvent) => {
            if (event.target !== el) {
                return;
            }

            const touches = event.changedTouches;
```

tslint:disable-next-line:prefer-for-of

```            for (let touchIndex = 0; touchIndex < touches.length; touchIndex++) {
                const main = touches[touchIndex];
                const identifier = main.identifier;

                switch (event.type) {
                    case "touchstart": {
                        if (Object.keys(heldTouches).length === 0) {
                            onPress();
                        }
                        heldTouches[identifier] = 1;
                    }                  break;
                    case "touchend": {
                        delete heldTouches[identifier];
                        if (Object.keys(heldTouches).length === 0) {
                            onRelease();
                        }
                    }                break;
                    default: return;
                }

                isTouchHeld = Object.keys(heldTouches).length > 0;
                event.preventDefault();
            }
        };

        el.addEventListener("touchmove", multitouch, true);
        el.addEventListener("touchstart", multitouch, true);
        el.addEventListener("touchend", multitouch, true);
    }

    let isMousePressed = false;
    const onMouseButtonDown = (event: any) => {
        if (isTouchHeld || event.button !== 0 || event.target !== el) {
            return;
        }
        isMousePressed = true;
        onPress();
        event.preventDefault();
    };
    const onMouseButtonUp = (event: any) => {
        if (isTouchHeld || !isMousePressed || event.button !== 0) {
            return;
        }
        isMousePressed = false;
        onRelease();
        event.preventDefault();
    };

    const onMouseLeave = (event: any) => {
        if (isTouchHeld || !isMousePressed || event.button !== 0) {
            return;
        }
        isMousePressed = false;
        onRelease();
    };

    el.addEventListener("mousedown", onMouseButtonDown, true);
    el.addEventListener("mouseup", onMouseButtonUp, true);
    el.addEventListener("mouseleave", onMouseLeave, true);
}

```


