function fadeFieldFocus(objInput) {
    if (!objInput.userTyped) {
        objInput.className = objInput.className.replace(/(\s)?fadeIn/, '');

        objInput.valueChangeIgnore = true;
        objInput.oldValue = '';
        objInput.value = '';
        objInput.valueChangeIgnore = false;
    }
}

function fadeFieldBlur(objInput, text) {
    if (!objInput.userTyped || objInput.value.length == 0) {
        if (objInput.className.indexOf('fadeIn') == -1) {
            objInput.className += ' fadeIn';
        }

        objInput.valueChangeIgnore = true;
        objInput.oldValue = text;
        objInput.value = text;
        objInput.valueChangeIgnore = false;
        objInput.userTyped = false;
    }
}

function clearFadeFields(objForm) {
    if (objForm) {
        for (var i = 0; i < objForm.elements.length; ++i) {
            var elem = objForm.elements[i];
            if (elem.tagName.toUpperCase() == 'INPUT' && (elem.type.toLowerCase() == 'text' || elem.type.toLowerCase() == 'password') && typeof(elem.onblur) == 'function') {
                fadeFieldBlur(elem, '');
            }
        }
    
        return true;
    } else {
        return false;
    }
}

function initFadeFields(objForm) {
    var oldOnLoad = window.onload;
    window.onload = function() {
        if (typeof(oldOnLoad) == 'function') oldOnLoad();

        if (objForm) {
            for (var i = 0; i < objForm.elements.length; ++i) {
                var elem = objForm.elements[i];
                if (elem.tagName.toUpperCase() == 'INPUT' && (elem.type.toLowerCase() == 'text' || elem.type.toLowerCase() == 'password') && typeof(elem.onblur) == 'function') {
                    elem.oldValue = elem.value;
                    if (elem.value != '') {
                        elem.userTyped = true;
                        elem.className = elem.className.replace(/(\s)?fadeIn/, '');
                    }

                    // To monitor the change in value, a 0.5s timeout is created for each monitored input
                    // Not ideal, but this is the only way to make it work cross-browser with autocomplete.
                    eval(
                        "elem.onchangemonitor = function () {\n" +
                        "    var objInput = document.getElementById('" + elem.id + "');\n" +
                        "    if (objInput) {\n" +
                        "        if (objInput.oldValue != objInput.value) {\n" +
                        "            objInput.oldValue = objInput.value;\n" +
                        "            if (!objInput.valueChangeIgnore) {\n" +
                        "                if (objInput.value == '' && document.activeElement != objInput) {\n" +
                        "                    objInput.onblur();\n" +
                        "                } else {\n" +
                        "                    objInput.userTyped = true;\n" +
                        "                    objInput.className = objInput.className.replace(/(\s)?fadeIn/, '');\n" +
                        "                }\n" +
                        "            }\n" +
                        "        }\n" +
                        "        setTimeout(objInput.onchangemonitor, 500);\n" +
                        "    }\n" +
                        "};\n"
                    );

                    setTimeout(elem.onchangemonitor, 500);

                    // Call onblur to perform className change
                    elem.onblur();
                }
            }
        }
    }
}