define(["layoutManager", "browser", "dom", "css!./emby-input", "registerElement"], function(layoutManager, browser, dom) {
    "use strict";

    function onChange() {
        var label = this.labelElement;
        if (this.value) label.classList.remove("inputLabel-float");
        else {
            supportsFloatingLabel && "date" !== this.type && "time" !== this.type && label.classList.add("inputLabel-float")
        }
    }
    var EmbyInputPrototype = Object.create(HTMLInputElement.prototype),
        inputId = 0,
        supportsFloatingLabel = !1;
    if (Object.getOwnPropertyDescriptor && Object.defineProperty) {
        var descriptor = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, "value");
        if (descriptor && descriptor.configurable) {
            var baseSetMethod = descriptor.set;
            descriptor.set = function(value) {
                baseSetMethod.call(this, value), this.dispatchEvent(new CustomEvent("valueset", {
                    bubbles: !1,
                    cancelable: !1
                }))
            }, Object.defineProperty(HTMLInputElement.prototype, "value", descriptor), supportsFloatingLabel = !0
        }
    }
    EmbyInputPrototype.createdCallback = function() {
        if (this.id || (this.id = "embyinput" + inputId, inputId++), !this.classList.contains("emby-input")) {
            this.classList.add("emby-input");
            var parentNode = this.parentNode,
                document = this.ownerDocument,
                label = document.createElement("label");
            label.innerHTML = this.getAttribute("label") || "", label.classList.add("inputLabel"), label.classList.add("inputLabelUnfocused"), label.htmlFor = this.id, parentNode.insertBefore(label, this), this.labelElement = label, dom.addEventListener(this, "focus", function() {
                onChange.call(this), document.attachIME && document.attachIME(this), label.classList.add("inputLabelFocused"), label.classList.remove("inputLabelUnfocused")
            }, {
                passive: !0
            }), dom.addEventListener(this, "blur", function() {
                onChange.call(this), label.classList.remove("inputLabelFocused"), label.classList.add("inputLabelUnfocused")
            }, {
                passive: !0
            }), dom.addEventListener(this, "change", onChange, {
                passive: !0
            }), dom.addEventListener(this, "input", onChange, {
                passive: !0
            }), dom.addEventListener(this, "valueset", onChange, {
                passive: !0
            }), browser.orsay && this === document.activeElement && document.attachIME && document.attachIME(this)
        }
    }, EmbyInputPrototype.attachedCallback = function() {
        this.labelElement.htmlFor = this.id, onChange.call(this)
    }, EmbyInputPrototype.label = function(text) {
        this.labelElement.innerHTML = text
    }, document.registerElement("emby-input", {
        prototype: EmbyInputPrototype,
        extends: "input"
    })
});