﻿var TextEntryState = {
    "Active": 0,
    "Inactive": 1,
    "Error": 2
};

var TextEntryProperty = {
    "RelValue": "rel",
    "ParentRelValue": "parent-rel-value"
};

function TextEntryManager(relValue, cssInactive, cssActive, cssError) {
    this.m_RelValue = relValue;
    
    this.m_CssClassInactive = cssInactive;
    this.m_CssClassActive = cssActive;
    this.m_CssClassError = cssError;

    this.m_FocusDelegate = CreateDelegate(this, this.ElementOnFocusHandler);
    this.m_BlurDelegate = CreateDelegate(this, this.ElementOnBlurHandler);
}

TextEntryManager.prototype.RegisterElements = function() {
    var pageElements = document.getElementsByTagName('INPUT');
    for (index = 0; index < pageElements.length; index++) {
        var pageElement = pageElements[index];
        if (pageElement.type != 'hidden' && pageElement.type != 'checkbox' && pageElement.getAttribute(TextEntryProperty.RelValue).indexOf(this.m_RelValue) > -1) {
            this.RegisterElement(pageElement);
        }
    }
};

TextEntryManager.prototype.RegisterElement = function(element) {
    AddHandler(element, 'focus', this.m_FocusDelegate);
    AddHandler(element, 'blur', this.m_BlurDelegate);
};

TextEntryManager.prototype.SetTextEntryState = function(element, state) {
    switch (state) {
        case TextEntryState.Active:
            element.className = this.m_CssClassActive;
            break;
        case TextEntryState.Inactive:
            element.className = this.m_CssClassInactive;
            break;
        case TextEntryState.Error:
            element.className = this.m_CssClassError;
            break;
    }
};

TextEntryManager.prototype.ElementOnFocusHandler = function(e) {
    e = e || window.event;
    var element = e.srcElement || e.target;

    //    var parentRelValue = element.getAttribute(TextEntryProperty.ParentRelValue);
    var parentRelValue = 'text-entry-manager-subscriber-parent';
    if (parentRelValue != null) {
        element = this.FindTopNode(element, parentRelValue);
    }

    this.SetTextEntryState(element, TextEntryState.Active);
};

TextEntryManager.prototype.ElementOnBlurHandler = function(e) {
    e = e || window.event;
    var element = e.srcElement || e.target;

    // var parentRelValue = element.getAttribute(TextEntryProperty.ParentRelValue);
    var parentRelValue = 'text-entry-manager-subscriber-parent';
    if (parentRelValue != null) {
        element = this.FindTopNode(element, parentRelValue);
    }

    this.SetTextEntryState(element, TextEntryState.Inactive);
};

TextEntryManager.prototype.FindTopNode = function(element, relValue) {
    if (element.getAttribute(TextEntryProperty.RelValue).indexOf(relValue) > -1) {
        return element;
    }
    else {
        return this.FindTopNode(element.parentNode, relValue);
    }
}
