///////////////////////////////////////////////////////////////////////////////
// Form Validation Module
// Author: Teslya Sergey
// 2006-11-14: Teslya Sergey - compatibility with Firefox Added
/*
<input required="true" datatype="number|date|float" fieldname="Start Date">

*/

var errorString;

////////////////////////////////////////////////
//// Error Handling Routines

function addErrorMessage(sMsg) {
    errorString += sMsg+'\r\n';
}

function resetStyle(el) {
    // el.style.backgroundColor = "";
    el.className = "";
}

function setErrorStyle(el) {
    // el.style.backgroundColor = "yellow";
    el.className = "required";
    el.focus();
}

///////////////////////////////////////////////////
////    Data Type checking routines

function isNumber(el) {
    if (parseInt(el.value) != el.value) {
        var fieldname;
        if (el.getAttribute('fieldname') != undefined) {
            fieldname = '"' + el.getAttribute('fieldname') + '" ';
        } else {fieldname = '';}
        addErrorMessage('Field ' + fieldname + 'must be a number.');
        // addErrorMessage('Field "' + el.name + '" must be a number');
        return false;
    } else {
        return true;
    }
}

//02/27/07 - Ivanenko - isFloatNumber function added
function isFloatNumber(el) {
    if (parseFloat(el.value) != el.value) {
        var fieldname;
        if (el.getAttribute('fieldname') != undefined) {
            fieldname = '"' + el.getAttribute('fieldname') + '" ';
        } else {fieldname = '';}
        addErrorMessage('Field ' + fieldname + 'must be a number.');
        // addErrorMessage('Field "' + el.name + '" must be a number');
        return false;
    } else {
        return true;
    }
}

function isDate (el) {
    var RE = new RegExp("^(\\d+)/(\\d+)/(\\d+)$");
    var res = RE.exec(el.value);
    var a = true;
    if (res) {
        if (res[3] < 1760 || res[3] > 9000) {
            a = false;
        }
        if (a && (res[1] < 1 || res[1] > 12 || res[2] < 1 || res[2] > 31)) {
            a = false;
        }
        if (a && (res[2] > 30 && (res[1] == 4 || res[1] == 6 || res[1] == 9 || res[1] == 11))) {
            a = false;
        }
        if (a && (res[2] > 28 && res[1] == 2 && (res[3] % 4 != 0))) {
            a = false;
        }
        if (a && (res[2] > 29 && res[1] == 2 && (res[3] % 4 == 0))) {
            a = false;
        }
    } else {
        a = false;
    }
    if (a) {
        return true;
    } else {
        addErrorMessage('Please, enter a date in format: "mm/dd/yyyy"');
        return false;
    }
}

function checkRequired(el) {
    if (el.getAttribute('required') == 'true' && el.value == '') {
        var fieldname;
        if (el.getAttribute('fieldname') != undefined) {
            fieldname = '"' + el.getAttribute('fieldname') + '": ';
        } else {
            fieldname = '';
        }
        addErrorMessage(fieldname+'required value missing');
        return false;
    }
    return true;
}

//02/27/07 - Ivanenko - isFloatNumber function checking added
function checkCorrect(el) {
    if (el.value == "") {return true;} // empty values treat as to be correct.
    switch (el.getAttribute('datatype')) {
        case 'number':
        return isNumber(el);
        break;
        case 'date':
        return isDate(el);
        break;
        case 'float':
        return isFloatNumber(el);
        break;
        default: return true;
    }
}

function checkFormElement (el) {
    resetStyle(el);
    requiredOk = checkRequired(el);
    correctOk = checkCorrect(el);
    result = requiredOk&&correctOk;
    if (!result) {
        setErrorStyle(el);
    }
    return result;
}

function checkForm (frm) {
    errorString = '';
    isCorrect = true;
    for (i=frm.elements.length-1; i>=0; i-- ) {
        result = checkFormElement(frm.elements[i]);
        isCorrect = isCorrect && result;
    }
    if (!isCorrect) { alert(errorString); return isCorrect;}
    // return isCorrect;
}