// -----------------------------------------------------------------------------
// Generic Form Validation
//
// Copyright (C) 2000 Jacob Hage - [jacobhage@hotmail.com]
// Distributed under the terms of the GNU Library General Public License
// -----------------------------------------------------------------------------

// -----------------------------------------------------------------------------
// Initializing script  - setting global variables
// -----------------------------------------------------------------------------
var checkObjects        = new Array();     // Array containing the objects to validate.
var errors                = "";             // Variable holding the error message.
var returnVal            = false;         // General return value. The validated form will only be submitted if true.
var language            = new Array();     // Language independent error messages!
var selectecLanguage    = "italiano";    // Choose between "english", "danish", "dutch", "french", "spanish", "russian", "portuguese"
language.english        = new Array();
language.danish            = new Array();
language.dutch            = new Array();
language.french            = new Array();
language.spanish        = new Array();
language.russian        = new Array();
language.portuguese        = new Array();
language.swedish        = new Array();
language.polish            = new Array();
language.brazport        = new Array(); // Brazilian Portuguese
language.italiano        = new Array(); // Brazilian Portuguese

// Error messages in italiano:
    language.italiano.header        = "Si è verificato il seguente errore(i):"
    language.italiano.start        = "->";
    language.italiano.field        = " Il campo ";
    language.italiano.require    = " è obbligatorio";
    language.italiano.min        = " e deve contenere almeno ";
    language.italiano.max        = " e non deve contenere più di ";
    language.italiano.minmax        = " e non più di ";
    language.italiano.chars        = " caratteri";
    language.italiano.num        = " e deve contenere un numero";
    language.italiano.email        = " deve contenere un indirizzo e-mail valido";
    language.italiano.sino        = " deve contenere SI o NO";       //aggiunto da me

// Error messages in english:
    language.english.header        = "The following error(s) occured:"
    language.english.start        = "->";
    language.english.field        = " Field ";
    language.english.require    = " is required";
    language.english.min        = " and must consist of at least ";
    language.english.max        = " and must not contain more than ";
    language.english.minmax        = " and no more than ";
    language.english.chars        = " characters";
    language.english.num        = " and must contain a number";
    language.english.email        = " must contain a valid e-mail address";
    
// Error messages in Danish:
    language.danish.header        = "Der opstod f\370lgende fejl:";
    language.danish.start        = "->";
    language.danish.field        = " Feltet ";
    language.danish.require        = " skal udfyldes";
    language.danish.min            = " og skal best\345 af mindst ";
    language.danish.max            = " og m\345 ikke best\345 af flere end ";
    language.danish.minmax        = " og ikke flere " // English: " and no more than ";
    language.danish.chars        = " tegn";
    language.danish.num            = " og m\345 kun best\345 af tal";
    language.danish.email        = " skal indeholde en korrekt e-mail addresse";
    
// Error messages in Dutch: 
    language.dutch.header        = "De volgende fout(en) zitten in het formulier:"
    language.dutch.start        = "->";
    language.dutch.field        = " Veld ";
    language.dutch.require        = " is verplicht";
    language.dutch.min            = " en moet bestaan uit minstens";
    language.dutch.max            = " en moet bestaan uit meer dan";
    language.dutch.minmax        = " en niet meer dan";
    language.dutch.chars        = " karakters";
    language.dutch.num            = " en moet een nummer zijn";
    language.dutch.email        = " moet een geldig e-mail adres zijn.";

// Error messages in French: 
    language.french.header        = "L'erreur suivante s'est produite: "
    language.french.start        = "->";
    language.french.field        = " Le champs ";
    language.french.require        = " est obligatoire";
    language.french.min            = " et doit contenir au moins ";
    language.french.max            = " et ne doit pas contenir plus de ";
    language.french.minmax        = " et pas plus de ";
    language.french.chars        = " caract\350res";
    language.french.num            = " et doit contenir un nombre ";
    language.french.email        = " doit contenir une adresse e-mail valide";

// Error messages in Spanish: 
    language.spanish.header        = "Se ha producido un error:"
    language.spanish.start        = "->";
    language.spanish.field        = " El campo ";
    language.spanish.require    = " es obligatorio";
    language.spanish.min        = " y debe contener al menos ";
    language.spanish.max        = " y no debe contener m\341s de ";
    language.spanish.minmax        = " y no m\341s de ";
    language.spanish.chars        = " caracteres";
    language.spanish.num        = " y debe contener un n\372mero";
    language.spanish.email        = " debe contener una direcci\363n de e-mail v\341lida";
    
// Error messages in russian: 
    language.russian.header        = " Âîçíèêëà Îøèáêà(è):"
    language.russian.start        = "->";
    language.russian.field        = " Ïîëå ";
    language.russian.require    = " îáÿçàòåëüíî";
    language.russian.min        = " è äîëæíî ñîäåðæàòü íå ìåíåå ";
    language.russian.max        = " è íå äîëæíî ñîäåðæàòü áîëåå ";
    language.russian.minmax        = " è íå áîëåå ";
    language.russian.chars        = " çíàêîâ";
    language.russian.num        = " è äîëæíî ñîäåðæàòü ÷èñëîâîå çíà÷åíèå";
    language.russian.email        = " äîëæíî ñîäåðæàòü äåéñòâèòåëüíûé e-mail àäðåñ";
    
// Error messages in portuguese: 
    language.portuguese.header    = "O(s) seguinte(s) erro(s) ocorreu(am):"
    language.portuguese.start    = "->";
    language.portuguese.field    = " Campo ";
    language.portuguese.require    = " e' necessario";
    language.portuguese.min        = " e deve conter pelo menos ";
    language.portuguese.max        = " e nao deve conter mais de ";
    language.portuguese.minmax    = " e nao mais que ";
    language.portuguese.chars    = " caracteres";
    language.portuguese.num        = " e deve conter numero";
    language.portuguese.email    = " deve conter um e-mail valido";

// Error messages in Swedish: 
    language.swedish.header        = "Fšljande fel uppstod:";
    language.swedish.start        = "->";
    language.swedish.field        = " FŠltet ";
    language.swedish.require    = " mŒste fyllas i";
    language.swedish.min        = " och skall bestŒ av minst ";
    language.swedish.max        = " och skall inte bestŒ av fler Šn ";
    language.swedish.minmax        = " och inte fler Šn ";
    language.swedish.chars        = " tecken";
    language.swedish.num        = " och mŒste innehŒlla ett nummer";
    language.swedish.email        = " mŒste innehŒlla en korrekt epost adress";

// Error messages in polish: 
    language.polish.header        = "Wyst¹pi³ nastêpuj¹cy b³¹d(b³êdy):"
    language.polish.start        = "* ";
    language.polish.field        = " Pole <";
    language.polish.require        = "> jest wymagane";
    language.polish.min            = " i musi zawieraæ conajmniej ";
    language.polish.max            = " i nie mo¿e zawieraæ wiêcej ni¿ ";
    language.polish.minmax        = " i nie wiêcej ni¿ ";
    language.polish.chars        = " znaki";
    language.polish.num            = " i musi zawieraæ liczbê";
    language.polish.email        = " musi zawieraæ prawid³owy adres e-mail";

// Error messages in brazilian portuguese: 
    language.brazport.header    = "O(s) seguinte(s) erro(s) ocorreu(ram):"
    language.brazport.start        = "->";
    language.brazport.field        = " O campo ";
    language.brazport.require    = " é obrigatório";
    language.brazport.min        = " e deve ser composto de no mínimo por ";
    language.brazport.max        = " e não deve conter mais de ";
    language.brazport.minmax    = " e não mais de ";
    language.brazport.chars        = " caracteres";
    language.brazport.num        = " e deve conter um número";
    language.brazport.email        = " deve conter um endereço de e-mail válido";

// -----------------------------------------------------------------------------
// define - Call this function in the beginning of the page. I.e. onLoad.
//
// n = name of the input field (Required)
// type= string, num, email (Required)
// min = the value must have at least [min] characters (Optional)
// max = the value must have maximum [max] characters (Optional)
// d = (Optional)
// -----------------------------------------------------------------------------
function define(n,type,HTMLname,min,max,d){
    var p;
    var i;
    var x;
    if(!d) d=document;
    if((p=n.indexOf("?"))>0&&parent.frames.length){
        d=parent.frames[n.substring(p+1)].document;
        n=n.substring(0,p);
    }
    if(!(x=d[n])&&d.all) x=d.all[n];
    
      for (i=0;!x&&i<d.forms.length;i++){
          x=d.forms[i][n];
      }
    for(i=0;!x&&d.layers&&i<d.layers.length;i++){
        x=define(n,type,HTMLname,min,max,d.layers[i].document);
        return x;        
    }
    
    // Create Object. The name will be "V_something" where something is the "n" parameter above.
    eval("V_"+n+" = new formResult(x,type,HTMLname,min,max);");
    checkObjects[eval(checkObjects.length)] = eval("V_"+n);
}

// -----------------------------------------------------------------------------
// formResult - Used internally to create the objects
// -----------------------------------------------------------------------------
function formResult(form,type,HTMLname,min,max){
    this.form = form;
    this.type = type;
    this.HTMLname = HTMLname;
    this.min  = min;
    this.max  = max;
}

// -----------------------------------------------------------------------------
// validate - Call this function onSubmit and return the "returnVal". (onSubmit="validate();return returnVal;")
// -----------------------------------------------------------------------------
function validate(){
    if(checkObjects.length>0){
        errorObject = "";
    
        for(i=0;i<checkObjects.length;i++){
            validateObject             = new Object();
            validateObject.form     = checkObjects[i].form;
            validateObject.HTMLname = checkObjects[i].HTMLname;
            validateObject.val         = checkObjects[i].form.value;
            validateObject.len         = checkObjects[i].form.value.length;
            validateObject.min         = checkObjects[i].min;
            validateObject.max         = checkObjects[i].max;
            validateObject.type     = checkObjects[i].type;

            //Debug alert line
            //alert("validateObject: "+validateObject+"\nvalidateObject.val: "+validateObject.val+"\nvalidateObject.len: "+validateObject.len+"\nvalidateObject.min,validateObject.max: "+validateObject.min+","+validateObject.max+"\nvalidateObject.type: "+validateObject.type);
            
            // Checking input. If "min" and/or "max" is defined the input has to be within the specific range
            if(validateObject.type == "num" || validateObject.type == "string"){
                if((validateObject.type == "num" && validateObject.len <= 0) || (validateObject.type == "num" && isNaN(validateObject.val))){errors+=language[selectecLanguage].start+language[selectecLanguage].field+validateObject.HTMLname+language[selectecLanguage].require+language[selectecLanguage].num+"\n";
                } else if (validateObject.min && validateObject.max && (validateObject.len < validateObject.min || validateObject.len > validateObject.max)){errors+=language[selectecLanguage].start+language[selectecLanguage].field+validateObject.HTMLname+language[selectecLanguage].require+language[selectecLanguage].min+validateObject.min+language[selectecLanguage].minmax+validateObject.max+language[selectecLanguage].chars+"\n";
                } else if (validateObject.min && !validateObject.max && (validateObject.len < validateObject.min)){errors+=language[selectecLanguage].start+language[selectecLanguage].field+validateObject.HTMLname+language[selectecLanguage].require+language[selectecLanguage].min+validateObject.min+language[selectecLanguage].chars+"\n";
                } else if (validateObject.max && !validateObject.min &&(validateObject.len > validateObject.max)){errors+=language[selectecLanguage].start+language[selectecLanguage].field+validateObject.HTMLname+language[selectecLanguage].require+language[selectecLanguage].max+validateObject.max+language[selectecLanguage].chars+"\n";
                } else if (!validateObject.min && !validateObject.max && validateObject.len <= 0){errors+=language[selectecLanguage].start+language[selectecLanguage].field+validateObject.HTMLname+language[selectecLanguage].require+"\n";
                }
            } else if(validateObject.type == "email"){
                // Checking existense of "@" and ".". The length of the input must be at least 5 characters. The "." must neither be preceding the "@" nor follow it.
                if((validateObject.val.indexOf("@") == -1) || (validateObject.val.charAt(0) == ".") || (validateObject.val.charAt(0) == "@") ||(validateObject.len < 6) || (validateObject.val.indexOf(".") == -1) || (validateObject.val.charAt(validateObject.val.indexOf("@")+1) == ".") || (validateObject.val.charAt(validateObject.val.indexOf("@")-1) == ".")){errors+=language[selectecLanguage].start+language[selectecLanguage].field+validateObject.HTMLname+language[selectecLanguage].email+"\n";}
            }

// aggiunto da me  per gestire campi logici si/no
            else if(validateObject.type == "sino"){
                // controlla se le parole "si" e "no" sono presenti.
                if((validateObject.val.toLowerCase() != "si") && (validateObject.val.toLowerCase() != "no") ){errors+=language[selectecLanguage].start+language[selectecLanguage].field+validateObject.HTMLname+language[selectecLanguage].sino+"\n";}
            }
// fine aggiunto da me

        }
    }
    // Used to set the state of the returnVal. If errors -> show error messages in chosen language
    if(errors){
        alert(language[selectecLanguage].header.concat("\n"+errors));
        errors = "";
        returnVal = false;
    } else {
        returnVal = true;
    }
}

/* -------------------------------------------------------------------------------------
   --- Libreria di Proprieta' e Metodi aggiuntivi per JavaScript                       -
   --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
   --- Gli script che seguono sono gratuiti e liberi da Copyright.                     -
   --- Il riutilizzo e la modifica sono consentiti senza alcuna limitazione sia per    -
   --- usi amatoriali che professionali.                                               -
   ---                                                                                 -
   --- Questa libreria e' disponibile alla URL: http://www.jsdir.com/LibreriaJs        -
   ---                                                                                 -
   --- Generata il: Martedi' 19 Dicembre  2006 - 4:40:53 PM                            -
   ---                                                                                 -
   --- E' fatta richiesta all'utilizzatore di lasciare inalterato questo commento      -
   --- iniziale quale "credit" per i realizzatori, ed i commenti successivi per dar    -
   --- modo, a successivi utilizzatori, di capire il funzionamento dei metodi e di     -
   --- reperire il sorgente originale con i relativi aggiornamenti.                    -
   ---                                                                                 -
   ---                                                         webmasterATjsdir.com     -
   ---                                                                                 -
   ---------------------------------------------------------------------------------- */

/* -----------------------------------------------------------------------------------
------- Trim(), LTrim(), RTrim() -----------------------------------------------------
------- 
------- Metodi per l'oggetto String, restituiscono la stringa cui sono applicati
------- senza spazi iniziali e/o finali:
------- 
------- str_a = stringa.Trim();
-------       str_a contiene il valore di stringa senza spazi iniziali ne' finali
------- 
------- str_a = stringa.LTrim();
-------       str_a contiene il valore di stringa senza spazi iniziali
------- 
------- str_a = stringa.RTrim();
-------       str_a contiene il valore di stringa senza spazi finali
------- 
------- N.B.
------- [\s] nelle RegExp contiene sia gli spazi che i ritorni a capo, avanzamento riga
------- tabulatore, tabulatore verticale. Tutti questi caratteri, se presenti, verranno
------- eliminati.
-------                                                                            --- */
function Trim() {
   return this.replace(/\s+$|^\s+/g,"");
   }

function LTrim() {
   return this.replace(/^\s+/,"");
   }

function RTrim() {
   return this.replace(/\s+$/,"");
   }
  
String.prototype.Trim=Trim;  
String.prototype.RTrim=RTrim;  
String.prototype.LTrim=LTrim;  
/* ----------------------------------------------------------------------------------- */
