function CampoFormulario(modo, msg, msgmodo, noobligatorio, parar) {
    this.modo = modo;                               // modo de comprobacion (tipo de dato), ver atributo Validador.val_func_set
    this.msg = msg;                                 // msg si error de obligatorio-tipo
    this.msgmodo = msgmodo || '';                   // opcional, msg si error de comprobacion de modo
    this.noobligatorio = noobligatorio || false;    // opcional, flag de campo no obligatorio (no comprobar tipo a menos que se rellene)
    this.parar = parar || false;                    // opcional, flag de parada si error de obligatorio-tipo
    this.validacion=true;
}


function Validador() {
    this.val_func_set = {
        'EMAIL'             : validamail,
        'TELEFONO'          : validaTelefono,
        'FECHA'             : validaFecha,
        'ALFANUMERICO'      : validaAlfanumerico,
        'ALFABETICO'        : validaAlfabetico,
        'NUMERICO'          : validaNumerico,
        'PASSW'             : validaPassword,
        'PAGINAWEB'         : validaWebBlog,
        'ENTEROPOS'         : validaEnteroPos,
        'ENTEROPOSYCERO'    : validaEnteroPos0,
        'IMPORTE'           : validaImporte,
        'IMPORTECERO'       : validaImporteCero,
        'TAMANYO'			: validaTamanyo
        /* ... extender ... */
    };
}
Validador.prototype.validar = function(form,campos) {
    var res={};	// Problemas con GMaps (reescribe Array) //new Array();
    var contenido;
    var num_obligatorios_completos=0;
    var ok=true;
    var detener = false;

    for (var campo in campos) {
        var fck   = campos[campo].modo == 'FCK';
        var modo  = campos[campo].modo;
        var parar = campos[campo].parar;

        if (fck == false) {
            if (contenido = obtenerValor(form.name,campo)) {
                if (!campos[campo].noobligatorio) num_obligatorios_completos ++;
                var fcheck = null;
                if (fcheck = this.val_func_set[modo]) {
                    if (!fcheck(contenido)) {
                        if (!detener) res[campo] = modo;
                        campos[campo].validacion=false;
                        ok = false;
                        if (parar) detener = true;
                    }
                }
            } else {
                if (!campos[campo].noobligatorio) {
                    if (!detener) res[campo] = "o";   // es obligatorio
                    campos[campo].validacion=false;
                    ok = false;
                    if (parar) detener = true;
                }
            }
        } else {
            var oEditor = FCKeditorAPI.GetInstance(campo) ;
            contenido = oEditor.GetXHTML()
            if (contenido) {
                if (!campos[campo].noobligatorio) num_obligatorios_completos ++;
            } else {
                if (!campos[campo].noobligatorio) {
                    if (!detener) res[campo] = "o";   // es obligatorio
                    ok = false;
                    campos[campo].validacion=false;
                    if (parar) detener = true;
                }
            }
        }

    }

    return new Array(num_obligatorios_completos, res, ok);
}
Validador.prototype.validar_al_vuelo = function(form,campo,modo,msg,msgmodo,noobligatorio) {
    var lista_campos = new Object();
    lista_campos[campo]=new CampoFormulario(modo, msg, msgmodo, noobligatorio, false);
    var resarr = this.validar(form, lista_campos);
    this.informar(form, lista_campos, resarr);
}
Validador.prototype.informar = function(form,campos,resarr,msg_generico,defmsg) {
    var str = "";
    num_obligatorios_completos = resarr[0];
    if (num_obligatorios_completos || !msg_generico) {
        // agregar mensaje de cada campo
        var res = resarr[1];
        for (var campo in res) {
            if (res[campo] == 'o') str += "\n"+campos[campo].msg;
            else str += "\n"+campos[campo].msgmodo;
        }
    } else {
        // ningun obligatorio rellenado: mensaje generico
        if (defmsg) str = defmsg;
    }
    if (str) alert(str);
}
Validador.prototype.addError = function(campos, resarr, campo, msgerror) {
    if (campos[campo].validacion) {
        resarr[1][campo] = "error";
        campos[campo].validacion = false;
    }
    resarr[2] = false
    campos[campo].msgmodo = msgerror
}
