///////////////////////////////////////////////////////////////////////////////
// Form Validation Module
// Author: Teslya Sergey
// 2006-11-14: Teslya Sergey - compatibility with Firefox Added
/*
<input required="true" datatype="number|date" fieldname="Start Date">

*/


var errorString;

////////////////////////////////////////////////
//// Error Handling Routines

function addErrorMessage(sMsg) {
    errorString += sMsg+'\r\n';
}

function resetStyle(el) {
    el.style.backgroundColor = "";
}

function setErrorStyle(el) {
    el.style.backgroundColor = "yellow";
    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 isEmail (el) {
    var str = el.value;
    var at="@";
    var dot=".";
    var lat=str.indexOf(at);
    var lstr=str.length;
    var ldot=str.indexOf(dot);
    var res=true
    if (str.indexOf(at)==-1 || str.indexOf(at)==0 || str.indexOf(at)==lstr){
       res=false;
    }
    if (str.indexOf(dot)==-1 || str.indexOf(dot)==0 || str.indexOf(dot)==lstr){
        res=false;
    }
    if (str.indexOf(at,(lat+1))!=-1){
        res=false;
     }
    if (str.substring(lat-1,lat)==dot || str.substring(lat+1,lat+2)==dot){
        res=false;
     }
    if (str.indexOf(dot,(lat+2))==-1){
        res=false;
     }
    if (str.indexOf(" ")!=-1){
        res=false;
    }
    if (res){
        return true;
    }else{
        addErrorMessage('Entered E-mail is invalid');
        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 'floatNumber':
        return isFloatNumber(el);
        case 'email':
        return isEmail(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;
}

function ismaxlength(obj) {
    var mlength=obj.getAttribute? parseInt(obj.getAttribute("maxlength")) : ""
    if (obj.getAttribute && obj.value.length>mlength)
        obj.value=obj.value.substring(0,mlength)
}