FormControl = function (valeur, isRequired)
{
    this.valeur     = valeur;
    this.isRequired = isRequired;

    var regExpEmpty                    = /^$/g;                             // Accepte une chaine vide
    var regExp8Chars                   = /^[0-9a-zA-Z]{8,}$/g;              // Accepte une chaine d'au moins 8 carctères alphanumeriques (pour un mot de passe par exemple).
    var regExpNumeric                  = /[0-9]+/g;                         // Accepte une chaine numérique
    var regExpAlphabetic               = /[a-zA-Z]+/g;                      // Accepte une chaine alphabétique
    var regExpAlphabeticAvecEspaces    = /[\sA-Za-zÀ-Öà-ö]+$/g;             // Accepte une chaine alphabétique accentuées et avec des espaces
    var regExpAlphabeticFull           = /[\s,A-Za-zÀ-Öà-ö\'-]+/g;          // Accepte une chaine alphabétique avec accents, apostrophes, tirets et espaces (\s)
    var regExpAlphanumeric             = /[0-9a-zA-Z]+/g;                   // Accepte une chaine alphanumérique
    var regExpAlphanumericAvecEspaces  = /^[\s0-9A-Za-zÀ-Öà-ö]+/g;           // Accepte une chaine alphanumérique
    var regExpAlphanumericFull         = /[\s,0-9A-Za-zÀ-Öà-ö\'-]+/g;       // Accepte une chaine alphanumérique + ' '
    var regExpInt                      = /^[0-9]+$/g;                       // Accepte une chaine de type 'int'
    var regExpDouble                   = /^[-+]?[0-9]+(\.[0-9]+)?$/g;       // Accepte une chaine de type 'double'
    var regExpFloat                    = /^[-+]?[0-9]+(\.[0-9]+)?([eE][-+]?[0-9]+)?$/g;  // Accepte une chaine de type 'float'
    var regExpTime                     = /^([01][0-9]|2[0123])\:([012345][0-9])(\:([012345][0-9])(.([0-9]{3})+)?)?$/g;         // Accepte une chaine de type 'time'. Ex : 12:51 ou 21:45:35.654
    var regExpFrenchDate               = /^(0[1-9]|[12][0-9]|3[01])[\- \/\.](0[1-9]|1[012])[\- \/\.](19|20)\d\d$/g;  // date au format jj/mm/aaaa ou jj-mm-aaaa ou jj mm aaaa ou jj.mm.aaaa avec aaaa compris entre 1900 et 2099.
    var regExpEnglishDate              = /^(19|20)\d\d[\- \/\.](0[1-9]|1[012])[\- \/\.](0[1-9]|[12][0-9]|3[01])$/g; // idem ci-dessus mais format anglais (Ex : aaaa/mm/jj)
    var regExpBoolean                  = /^true|false$/g;                   // Accepte une chaine de type 'boolean'
    var regExpCodePostal               = /^([A-Z]+[A-Z]?\-)?[0-9]{1,2} ?[0-9]{3}$/g;                            // Accepte une chaine de type 'code postal'. Ex : F-33370 ou 33 370 ou 33370 ou F-1 370
    var regExpTelephoneFixe            = /^(01|02|03|04|05|08|09)[ \.\-]?[0-9]{2}[ \.\-]?[0-9]{2}[ \.\-]?[0-9]{2}[ \.\-]?[0-9]{2}$/g;      // Accepte un numero de téléphone de type 'fixe'. Ex : 01.34.12.52.30 ou 0134125230
    var regExpTelephonePortable        = /^(06)[ \.\-]?[0-9]{2}[ \.\-]?[0-9]{2}[ \.\-]?[0-9]{2}[ \.\-]?[0-9]{2}$/g;          // Accepte un numero de téléphone de type 'portable'.
    var regExpTelephoneNational        = /^(0[123456789])[ \.\-]?[0-9]{2}[ \.\-]?[0-9]{2}[ \.\-]?[0-9]{2}[ \.\-]?[0-9]{2}$/g;      // Accepte un numero de téléphone de type 'national' y compris numéros en '08'.
    var regExpTelephoneInternational   = /^(\+[0-9]{2})[ \.\-]?[0-9][ \.\-]?[0-9]{2}[ \.\-]?[0-9]{2}[ \.\-]?[0-9]{2}[ \.\-]?[0-9]{2}$/g;    // Accepte un numero de téléphone de type 'international'. Ex : (+33) 1 34 12 52 30
    var regExpNumeroSecuriteSociale    = /^[12][ \.\-]?[0-9]{2}[ \.\-]?(0[1-9]|[1][0-2])[ \.\-]?([0-9]{2}|2A|2B)[ \.\-]?[0-9]{3}[ \.\-]?[0-9]{3}[ \.\-]?[0-9]{2}$/g; // Accepte un numero de sécurité sociale français. Ex : 1 85 34 33 354 450 45
    var regExpTVAIntracommunautaire    = /^[A-Z]{2}[ \.\-]?[0-9]{2}[ \.\-]?[0-9]{3}[ \.\-]?[0-9]{3}[ \.\-]?[0-9]{3}$/g;      // Accepte un numero de TVA Intra-communautaire. Ex : FR 02 254 254 254
    var regExpNumeroSiren              = /^[0-9]{3}[ \.\-]?[0-9]{3}[ \.\-]?[0-9]{3}$/g;                            // Accepte un numero SIREN. Ex : 254 254 254
    var regExpNumeroSiret              = /^[0-9]{3}[ \.\-]?[0-9]{3}[ \.\-]?[0-9]{3}[ \.\-]?[0-9]{5}$/g;                    // Accepte un numero SIRET. Ex : 254 254 254 12345
    var regExpCodeApe                  = /^[0-9]{2}[ \.\-]?[0-9]{1} ?[a-zA-Z]$/g;                              // Accepte un code APE. Ex : 25.4Z
    var regExpEmailAdress              = /^[A-Za-z0-9](([_\.\-]?[a-zA-Z0-9]+)*)@([A-Za-z0-9]+)(([\.\-]?[a-zA-Z0-9]+)*)\.([A-Za-z]{2,})$/g;                                     // Accepte une adresse email. Ex : toto@toto.com
    var regExpIpAdress                 = /\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b/g;   // Accepte une adresse ip. Ex : 192.168.0.1
    var regExpDomainName               = /^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6}$/g;                                                   // Accepte un nom de domaine. Ex : toto.com
    var regExpUrl                      = /^(((ht|f)tp(s?))\:\/\/)?(([a-zA-Z0-9]+([@\-\.]?[a-zA-Z0-9]+)*)(\:[a-zA-Z0-9\-\.]+)?@)?(www.|ftp.|[a-zA-Z]+.)?[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,})(\:[0-9]+)?\/?/g;           // Accepte une url ftp, http ou https, avec ou sans login/mot de passe, avec ou sans numero de port. Ex : http://www.toto.com, ftp://toto:toto@ftp.toto.com:21/
    var regExpHexColor                 = /^#[0-9A-Fa-f]{6}$/g; // Accepte une couleur hexadécimale

    this.doesMatchRegularExpression    = doesMatchRegularExpression;
    this.isEmpty                       = isEmpty;
    this.isNotEmpty                    = isNotEmpty;
    this.is8CharsLength                = is8CharsLength;
    this.isNumeric                     = isNumeric;
    this.isAlphabetic                  = isAlphabetic;
    this.isAlphabeticAvecEspaces       = isAlphabeticAvecEspaces;
    this.isAlphabeticFull              = isAlphabeticFull;
    this.isAlphanumeric                = isAlphanumeric;
    this.isAlphanumericAvecEspaces     = isAlphanumericAvecEspaces;
    this.isAlphanumericFull            = isAlphanumericFull;
    this.isInt                         = isInt;
    this.isDouble                      = isDouble;
    this.isFloat                       = isFloat;
    this.isBoolean                     = isBoolean;
    this.isTime                        = isTime;
    this.isDate                        = isDate;
    this.isPostalCode                  = isPostalCode;
    this.isPostalCodeZZ                = isPostalCodeZZ;
    this.isPostalCodeVerifTaille       = isPostalCodeVerifTaille;
    this.isPhoneNumber                 = isPhoneNumber;
    this.isNumeroSecuriteSociale       = isNumeroSecuriteSociale;
    this.isTVAIntracommunautaire       = isTVAIntracommunautaire;
    this.isNumeroSiren                 = isNumeroSiren;
    this.isNumeroSiret                 = isNumeroSiret;
    this.isCodeApe                     = isCodeApe;
    this.isEmail                       = isEmail;
    this.isIpAdress                    = isIpAdress;
    this.isDomainName                  = isDomainName;
    this.isUrl                         = isUrl;
    this.isHexColor                    = isHexColor;


	

    function doesMatchRegularExpression(valeur, isRequired, regularExpression)
    {
        if (!isRequired && valeur.length == 0) {
            return true;
        }
        else {
            return valeur == valeur.match(regularExpression);
        }
    }


    function isEmpty()
    {
        //return doesMatchRegularExpression(this.valeur, true, regExpEmpty);

        return (this.valeur == '');
    }

    function isNotEmpty()
    {
        //return !this.isEmpty();
        return (this.valeur != '');
    }


    function is8CharsLength()
    {
        return doesMatchRegularExpression(this.valeur, this.isRequired, regExp8Chars);
    }

    function IsNumericNoRegexp(sText)
    {
       var ValidChars = "0123456789";
       var IsNumber=true;
       var Char;


       for (i = 0; i < sText.length && IsNumber == true; i++)
          {
          Char = sText.charAt(i);
          if (ValidChars.indexOf(Char) == -1)
             {
             IsNumber = false;
             }
          }
       return IsNumber;

   }

    function isNumeric(min, max)
    {
        longueur = this.valeur.length;

        if (min && max) {
            return ((longueur >= min) && (longueur <= max)) && doesMatchRegularExpression(this.valeur, this.isRequired, regExpNumeric);
        }

        if (min) {
            return (longueur <= max) && doesMatchRegularExpression(this.valeur, this.isRequired, regExpNumeric);
        }
        else if (max) {
            return (longueur >= min) && doesMatchRegularExpression(this.valeur, this.isRequired, regExpNumeric);
        }
        else {
            return doesMatchRegularExpression(this.valeur, this.isRequired, regExpNumeric);
        }
    }


    function isAlphabetic()
    {
        return doesMatchRegularExpression(this.valeur, this.isRequired, regExpAlphabetic);
    }


    function isAlphabeticAvecEspaces()
    {
        return doesMatchRegularExpression(this.valeur, this.isRequired, regExpAlphabeticAvecEspaces);
    }


    function isAlphabeticFull()
    {
        return doesMatchRegularExpression(this.valeur, this.isRequired, regExpAlphabeticFull);
    }


    function isAlphanumeric()
    {
        return doesMatchRegularExpression(this.valeur, this.isRequired, regExpAlphanumeric);
    }


    function isAlphanumericAvecEspaces()
    {
        if (this.valeur == "") return true;
        return doesMatchRegularExpression(this.valeur, this.isRequired, regExpAlphanumericAvecEspaces);
    }


    function isAlphanumericFull()
    {
        return doesMatchRegularExpression(this.valeur, this.isRequired, regExpAlphanumericFull);
    }


    function isInt()
    {
        return doesMatchRegularExpression(this.valeur, this.isRequired, regExpInt);
    }


    function isDouble()
    {
        return doesMatchRegularExpression(this.valeur, this.isRequired, regExpDouble);
    }


    function isFloat()
    {
        return doesMatchRegularExpression(this.valeur, this.isRequired, regExpInt);
    }


    function isBoolean()
    {
        return doesMatchRegularExpression(this.valeur, this.isRequired, regExpBoolean);
    }


    function isTime()
    {
        return doesMatchRegularExpression(this.valeur, this.isRequired, regExpTime);
    }


    function isDate(valeur, mode)
    {
        switch (mode)
        {
            case "fr" :
                return doesMatchRegularExpression(this.valeur, this.isRequired, regExpFrenchDate);
                break;
            case "en" :
                return doesMatchRegularExpression(this.valeur, this.isRequired, regExpEnglishDate);
                break;
            default :
                return doesMatchRegularExpression(this.valeur, this.isRequired, regExpFrenchDate);
                break;
        }
    }


    function isPostalCode()
    {
        return doesMatchRegularExpression(this.valeur, this.isRequired, regExpCodePostal);
    }


    function isPostalCodeZZ()
    {
        if ((this.valeur.charAt(0) + this.valeur.charAt(1)) == "00") {
            return false;
        }
        else {
            return true;
        }
    }


    function isPostalCodeVerifTaille(min, max)
    {
        if ((this.valeur.length < min) || (this.valeur.length > max)) {
            return false;
        }
        else {
            return true;
        }
    }


    function isPhoneNumber(mode)
    {
        if (this.valeur.length == 0) {
            return true; // On ne teste pas si le champ est vide
        }

        if ((this.valeur.length < 10) || (this.valeur.length > 10)) {
            return false;
        }

        switch (mode)
        {
            case "fixe" :
                return doesMatchRegularExpression(this.valeur, this.isRequired, regExpTelephoneFixe);
                break;
            case "port" :
                return doesMatchRegularExpression(this.valeur, this.isRequired, regExpTelephonePortable);
                break;
            case "nati" :
                return doesMatchRegularExpression(this.valeur, this.isRequired, regExpTelephoneNational);
                break;
            case "inte" :
                return doesMatchRegularExpression(this.valeur, this.isRequired, regExpTelephoneInternational);
                break;
            default :
                return doesMatchRegularExpression(this.valeur, this.isRequired, regExpTelephoneNational);
                break;
        }
    }


    function isNumeroSecuriteSociale()
    {
        return doesMatchRegularExpression(this.valeur, this.isRequired, regExpNumeroSecuriteSociale);
    }


    function isTVAIntracommunautaire()
    {
        return doesMatchRegularExpression(this.valeur, this.isRequired, regExpTVAIntracommunautaire);
    }


    function isNumeroSiren()
    {
        return doesMatchRegularExpression(this.valeur, this.isRequired, regExpNumeroSiren);
    }


    function isNumeroSiret()
    {
        return doesMatchRegularExpression(this.valeur, this.isRequired, regExpNumeroSiret);
    }


    function isCodeApe()
    {
        return doesMatchRegularExpression(this.valeur, this.isRequired, regExpCodeApe);
    }


    function isEmail()
    {
        return doesMatchRegularExpression(this.valeur, this.isRequired, regExpEmailAdress);
    }


    function isIpAdress()
    {
        return doesMatchRegularExpression(this.valeur, this.isRequired, regExpIpAdress);
    }


    function isDomainName()
    {
        return doesMatchRegularExpression(this.valeur, this.isRequired, regExpDomainName);
    }


    function isUrl()
    {
        return doesMatchRegularExpression(this.valeur, this.isRequired, regExpUrl);
    }


    function isHexColor()
    {
        return doesMatchRegularExpression(this.valeur, this.isRequired, regExpHexColor);
    }
}



function isDate(d) {
    // Cette fonction permet de vérifier la validité d’une date au format jj/mm/aa ou jj/mm/aaaa

    //if (d == "") // si la variable est vide on retourne faux
        //return false;

    e = new RegExp("^[0-9]{1,2}\/[0-9]{1,2}\/([0-9]{2}|[0-9]{4})$");

    if (!e.test(d)) // On teste l’expression régulière pour valider la forme de la date
        return false; // Si pas bon, retourne faux

    // On sépare la date en 3 variables pour vérification, parseInt() converti du texte en entier
    j = parseInt(d.split("/")[0], 10); // jour
    m = parseInt(d.split("/")[1], 10); // mois
    a = parseInt(d.split("/")[2], 10); // année

    // Si l’année n’est composée que de 2 chiffres on complète automatiquement
    if (a < 1000) {
        if (a < 89)    a+=2000; // Si a < 89 alors on ajoute 2000 sinon on ajoute 1900
        else a+=1900;
    }

    // Définition du dernier jour de février
    // Année bissextile si annnée divisible par 4 et que ce n’est pas un siècle, ou bien si divisible par 400
    if (a%4 == 0 && a%100 !=0 || a%400 == 0) fev = 29;
    else fev = 28;

    // Nombre de jours pour chaque mois
    nbJours = new Array(31,fev,31,30,31,30,31,31,30,31,30,31);

    // Enfin, retourne vrai si le jour est bien entre 1 et le bon nombre de jours, idem pour les mois, sinon retourn faux
    return ( m >= 1 && m <=12 && j >= 1 && j <= nbJours[m-1] );
}


function removeAccents(msg) {
    /* acentos existentes
    é ý ú í ó á ç
    è   ù ì ò à
    ê   û î ô â
            õ ã   ñ
    ë ÿ ü ï ö ä
    */
    msg = msg.replace(/[áàâãä]/g, "a");
    msg = msg.replace(/[éèêë]/g, "e");
    msg = msg.replace(/[íìîï]/g, "i");
    msg = msg.replace(/[óòôõö]/g, "o");
    msg = msg.replace(/[úùûü]/g, "u");
    msg = msg.replace(/[ýÿ]/g, "y");
    msg = msg.replace(/[ç]/g, "c");
    msg = msg.replace(/[ñ]/g, "n");

    msg = msg.replace(/[ÁÀÂÃÄ]/g, "A");
    msg = msg.replace(/[ÉÈÊË]/g, "E");
    msg = msg.replace(/[ÍÌÎÏ]/g, "I");
    msg = msg.replace(/[ÓÒÔÕÖ]/g, "O");
    msg = msg.replace(/[ÚÙÛÜ]/g, "U");
    msg = msg.replace(/[Ý]/g, "Y");
    msg = msg.replace(/[Ç]/g, "C");
    msg = msg.replace(/[Ñ]/g, "N");
    return msg;
}
