﻿function bindEvents(form)
{
    var elements = getValidatedFields(form);
    for(var i = 0; i < elements.length; i++)
        elements[i].item.onchange = genericItemValidate.bind(
            elements[i].item, elements[i], elements[i]);
    form.onsubmit = validateForm.bind(form, elements);
}

function validateForm(elements)
{
    var _isValid = true;
    for(var i = 0; i < elements.length; i++)
        _isValid &= genericItemValidate(elements[i], elements[i]);
    
    return (_isValid > 0) ? true : false;
}

function getValidatedFields(form)
{
    var inputs = form.getElementsByTagName("INPUT");
    var elements = [];
    
    for(var i = 0; i < inputs.length; i++)
    {
        var ra = inputs[i].getAttribute("required");
        var mpa = inputs[i].getAttribute("match-pattern");
        var mda = inputs[i].getAttribute("match-type");
        
        if((ra != null && ra != "") ||
           (mpa != null && mpa != "") || 
           (mda != null && mda != ""))
            elements.push({ item: inputs[i], required: (ra == "required"), 
                matchPattern: mpa, matchDataType: mda });           
    }
    return elements;
}

function genericItemValidate(element, metaData)
{
    var _hasValidationError = false;
    var _message = "";
    var value = element.item.value;
    
    if(metaData.required && (value == null || value == "")) {
        _hasValidationError = true; 
        _message = "Поле обязательно для заполнения. ";
    }    
    if(metaData.matchPattern != null && metaData.matchPattern != "") {
        var r = new RegExp(metaData.matchPattern);
        r.multiline = true;
        r.ignoreCase = true;
        if(r.exec(value) == null) {
            _hasValidationError = true;
            _message += "Введите допустимое значение. ";
        }    
    }
    if(metaData.matchDataType != null && 
        metaData.matchDataType != "") {
        
        switch(metaData.matchDataType)
        {
            case "int":
                if(isNaN(parseInt(value))) {
                   _hasValidationError = true;
                   _message += "Введите допустимое число. "; 
                }
                break;
            case "float":
                if(isNaN(parseFloat(value))) {
                   _hasValidationError = true;
                   _message += "Введите допустимое число. "; 
                }
                break;
            case "datetime":
                // будем валидировать на стороне сервера
                break;
        }    
    }
    if(_hasValidationError)
        appendValidationMessage(element, _message);
    else
        removeValidationMessage(element);   
    return !_hasValidationError;
}

function appendValidationMessage(element, message)
{
    if(element.errorMessage != null)
        return;
        
    element.item.focus();
    var par = element.item.parentNode;
    var sibling = element.item.nextSibling;
    // это должно перегружаться
    var item = document.createElement("img");
    item.src = "/resources/images/error.gif";
    item.alt = "";
    item.style.marginLeft = "3px";
    item.title = message;
    element.errorMessage = item;
    
    if(sibling == null)
        par.appendChild(item);
    else
        par.insertBefore(item, sibling);
}

function removeValidationMessage(element)
{
    var msg = element.errorMessage;
    if(msg == null)
        return;
    
    element.errorMessage = null;
    msg.parentNode.removeChild(msg);
}
