// This function is called when the form inputs lose focus (or change). We only call the main checkForm method once the form has already been submitted
function reCheckForm(form) {
    var formID = form.id;
    if (document.getElementById(formID + 'Checked') != null) {
        checkForm(form);
    }
    return;
}

function reCheckClass(className) {

    if (document.getElementById(className + 'Checked') != null) {
        checkClass(className);
    }
    return;
}

// The main method that does the checking
function checkForm(form) {

    // We're passed a form - get the id of that form
    var formID = form.id;

    // If this is the first time this method has been called we add a hidden input to the form to say that it's already been checked
    if (document.getElementById(formID + 'Checked') == null) {
        var formChecked = document.createElement('input');
        formChecked.setAttribute('id', formID + 'Checked');
        formChecked.style.display = "none";
        form.appendChild(formChecked);
    }

    // Start off hoping things are good
    var valid = true;

    // Loop through the elements within the form
    for (var i = 0; i < form.elements.length; i++) {
        // Look at each element one by one
        var element = form.elements[i];

    }

    return valid;
}

function checkClass(className) {


    // If this is the first time this method has been called we add a hidden input to the form to say that it's already been checked
    if (document.getElementById(className + 'Checked') == null) {
        var formChecked = document.createElement('input');
        formChecked.setAttribute('id', className + 'Checked');
        formChecked.style.display = "none";
        document.forms[0].appendChild(formChecked);
    }

    // Start off hoping things are good
    var valid = true;

    // Loop through the elements within the form
    $j("." + className).each(function (elem) {
        if (!checkElement(this, className))
            valid = false;
    });


    return valid;
}

function checkElement(element, formID) {
    var valid = true;
	var watermarkText=element.defaultValue;
	if ($j!=null)
	{
		if ($j("#" + element.id).Watermark!=null)
		{
			watermarkText=$j.Watermark.GetText(element.id);
		}
	}
    // Do we have a 'formError' field? If not skip the checks
    if (element.getAttribute("formError") != null) {
        // The checks
        var formError;
        // Check the text boxes first
        if (element.type == "text" || element.type == "textarea") {
            var fieldType = element.getAttribute("fieldType");
            // If the 'fieldtype' is email...
            if (fieldType == "email") {
                // Check email
                if (element.value == "" || element.value ==watermarkText) {
                    valid = false;
                    formError = createWarning(element, formID);
                } else {
                    destroyWarning(element);
                    var emailCheck = checkEmail(element.id);
                    if (!emailCheck.good) {
                        valid = false;
                        formError = createWarning(element, formID);
                        if (emailCheck.message != "") {
                            formError.innerHTML = emailCheck.message;
                            calculatePosition(element, formError);
                        }
                    } else {
                        destroyWarning(element);
                    }
                }
            } else if (fieldType == "phone") {
                // Check phone
                if (element.value == "" || element.value ==watermarkText) {
                    valid = false;
                    formError = createWarning(element, formID);
                } else {
                    if (!checkPhoneEx(element.id)) {
                        valid = false;
                        formError = createWarning(element, formID);
                    } else {
                        destroyWarning(element);
                    }
                }
            } else {
                // Check a standard text box - make sure it's not empty and doesn't have the default value set
                if (element.value == "" || element.value ==watermarkText) {
                    valid = false;
                    formError = createWarning(element, formID);
                } else {
                    destroyWarning(element);
                }
            }
        } else if (element.type == "select-one" || element.type == "select") {
            // Check the selected index isn't 0
            if (element.selectedIndex == 0) {
                valid = false;
                formError = createWarning(element, formID);
            } else {
                destroyWarning(element);
            }
        } else if (element.type == "checkbox") {
            // Check that any checkboxes with formErrors are checked
            if (element.checked == 0) {
                valid = false;
                formError = createWarning(element, formID);
            } else {
                destroyWarning(element);
            }
        }
    }
    return valid;
}
function createWarning(element, formID) {

    // Try to get the formError div
    var formError = document.getElementById(element.id + 'Error');
    // Variable to see if we've created a new formError or not (if we have make a new arrow later, if not, don't)
    var newError = false;
    // If there isn't one create it
    if (formError == null) {
        newError = true;
        formError = document.createElement('div');
        formError.setAttribute('id', element.id + 'Error');
        // IE workaround for having different class name
        var isIE = /*@cc_on!@*/false;
        var elClass = isIE ? 'className' : 'class';
        formError.setAttribute(elClass, 'formErrorBox');
        formError.style.position = "absolute";
        formError.style.display = "block";
        // Set the message
        try {
            var error = element.getAttribute("formError");
            formError.innerHTML = error;
        } catch (err) {
            // No error handling on this - if there's no error message we just don't display it
        }
        // Another ie workaround
        if (isIE) {
            element.style.position = "relative";
        }
        //formError.style.zIndex = parseInt(formError.style.zIndex) + 1; 
        document.body.appendChild(formError);
    }
    // Do the positioning (which includes creating the triangles)
    calculatePosition(element, formError, formID, newError);

    return formError;

}

function calculatePosition(element, formError, formID, newError) {

    // Positioning (has to come after we've added the element to the page)
    formError.style.top = element.offsetTop + 'px';
    var errorPosition = element.getAttribute("errorPosition");
    var arrow;
    var offSet = 0;
    if (errorPosition != null) {
        var errorPosElements = new Array();
        errorPosElements = errorPosition.split(",");
        if (errorPosElements.length > 1) {
            try {
                offSet = parseInt(errorPosElements[1]);
            } catch (err) {
                offSet = 0;
            }
            errorPosition = errorPosElements[0];
        } else {
            offSet = 0;
        }
    }
    if (errorPosition != null && errorPosition == "left") {
        var leftStart = element.offsetLeft - formError.offsetWidth - 20 - offSet;
        if (leftStart < 0) {
            leftStart = element.offsetWidth + element.offsetLeft + 20 + offSet;
            if (newError) {
                arrow = createLHSArrow(element, formID);
            } else {
                arrow = document.getElementById(element.id + 'Arrow');
            }
            arrow.style.left = element.offsetWidth + element.offsetLeft + 5 + offSet + 'px';
        } else {
            if (newError) {
                arrow = createRHSArrow(element, formID);
            } else {
                arrow = document.getElementById(element.id + 'Arrow');
            }
            arrow.style.left = element.offsetLeft - 20 - offSet + 'px';
        }
        formError.style.left = leftStart + 'px';
    } else {
        formError.style.left = element.offsetWidth + element.offsetLeft + 20 + offSet + 'px';
        if (newError) {
            arrow = createLHSArrow(element, formID);
        } else {
            arrow = document.getElementById(element.id + 'Arrow');
        }
        arrow.style.left = element.offsetWidth + element.offsetLeft + 5 + offSet + 'px';
    }
    arrow.style.top = element.offsetTop + 'px';
}

function createLHSArrow(element, formID) {
    // Create the pointer div (RHS)
    var leftArrow = document.createElement('div');
    leftArrow.setAttribute('id', element.id + 'Arrow');
    // IE workaround for having different class name
    var isIE = /*@cc_on!@*/false;
    var elClass = isIE ? 'className' : 'class';
    //leftArrow.setAttribute(elClass, formID + 'LeftArrow');
    leftArrow.setAttribute(elClass, 'LeftArrow');
    leftArrow.style.position = "absolute";
    leftArrow.style.display = "block";
    document.body.appendChild(leftArrow);
    return leftArrow;
}

function createRHSArrow(element, formID) {
    // Create the pointer div (LHS)
    var rightArrow = document.createElement('div');
    rightArrow.setAttribute('id', element.id + 'Arrow');
    // IE workaround for having different class name
    var isIE = /*@cc_on!@*/false;
    var elClass = isIE ? 'className' : 'class';
    //rightArrow.setAttribute(elClass, formID + 'RightArrow');
    rightArrow.setAttribute(elClass, 'RightArrow');
    rightArrow.style.position = "absolute";
    rightArrow.style.display = "block";
    document.body.appendChild(rightArrow);
    return rightArrow;
}


function destroyWarning(element) {

    var hiddenError = document.getElementById(element.id + 'Error');
    if (hiddenError != null) {
        document.body.removeChild(hiddenError);
        var hiddenArrow = document.getElementById(element.id + 'Arrow');
        if (hiddenArrow != null) {
            document.body.removeChild(hiddenArrow);
        }
    }

}

