/**
 * $Id: formvalid.js 81136 2009-03-17 10:27:32Z jussil $
 *
 * formvalid.js
 *
 * versio $Revision: 81136 $
 *
 * vko 45 2001,
 * @author  Jussi Löf  / Ambientia Ltd.
 *
 * mahdolliset tarkastustyypit:
 *
 * email = onko valid email osoite
 * luku = onko lukuarvo
 * teksti = hyväksytyt merkit: "A-Ö,a-ö,-"
 * seka = syöte saa sisältää numeroita, kirjaimia
 *
 * minimi / maksimi  = numeerisille  mini ja maksi arvo
 *                     tekstille mini ja maksi pituus
 * jos minimiä ei määritelty tai se on 0 , kenttä ei ole pakollinen
 *
 * Virheilmoituksen asettaminen tekee kentästä pakollisen.
 * radio ja checkboxit saa pakolliseksi asettamalla niihin virheilmoituksen
 * eivät tarvitse tyypitystä!
 *
 * password kenttien yhteneväisyys tarkastetaan aina kun on olemassa
 * enemmän kuin yksi saman niminen password-kenttä.
 *
 * salasanan lyhin pituus säädetään funktiolla:
 *     asetaSalasananMinimiPituus(kaavake, kentta, minimiPituus, virheIlmoitus)
 *
 *
 */
 
 /* virhe ilmoitukset */
 var ILMOITA_VIRHEET = true;
 var EI_OLLUT_NUMEERINEN = "arvon tulee olla numeerinen!"
 var LIIAN_PIENI_LUKU = "antamasi arvo oli liian pieni"
 var LIIAN_SUURI_LUKU = "arvo oli liian suuri"
 var EI_AAKKONEN = "kelpuutan vain aakkosia a-ö"
 var LIIAN_LYHYT_TEKSTI = "puutteellinen tekstikentän arvo!"
 var LIIAN_PITKA_TEKSTI = "antamasi teksti oli liian pitkä"
 var VIRHEELLINEN_EMAIL = "virheellinen e-mail osoite!"
 var PAKOLLINEN_KENTTA = "Jätit pakollisen kentän syöttämättä!"
 var PAKOLLINEN_VALINTA = "Jätit pakollisen valinnan tekemättä!"
 var SALASANAT_EI_TASMANNEET = "Salasanat eivät täsmänneet!"
 var LIIAN_LYHYT_SALASANA = "Valitse pidempi salasana"
  
 /* debug virhe ilmoitukset */
 var DEBUG = true;
  
    function kenttaOlemassa(kaavake, kentta)
    {
        if ( !document[kaavake] )
        {
            if (DEBUG) alert("FORMia nimeltään " + kaavake + " ei löydy.");
            return false;
        }
        if ( !document[kaavake][kentta] )
        {
            if (DEBUG) alert(kaavake+" ei sisällä kenttää nimeltä " + kentta);
            return false;
        }
        return true;
    }
 
    function virheIlmoitus(kentta, default_ilmoitus)
    {
        if ( !ILMOITA_VIRHEET ) return false;
        
        if ( kentta.virheIlmoitus )
            alert( kentta.virheIlmoitus );
        else
            alert( default_ilmoitus );
            
        kentta.focus();
    }
    
    function varmistus(kentta)
    {
        if ( kentta.varmistus )
        {
            if ( confirm( kentta.varmistus ) )
                return true;
            else
                return false;
        }
        kentta.focus();
    }
 
 
    function tyypita(kaavake, kentta, tyyppi, minimi, maksimi)
    {
        if ( !kenttaOlemassa(kaavake, kentta) ) return false;
        if ( DEBUG )
        {
            if (  document[kaavake][kentta].type == "radio" || document[kaavake][kentta].type == "checkbox"  )
            {
                alert("radio tai checkboxia ei voi tyypittää!");
                return false;
            }
            if ( !tyyppi )
            {
                alert("SYNTAKSI: tyypita(\"formin nimi\",\"kentän nimi\",\"tyyppi\", minimi, maksimi)");
                return false;
            }
        }

        document[kaavake][kentta].tyyppi = tyyppi;

        if ( minimi ) document[kaavake][kentta].minimi = minimi;

        if ( maksimi ) document[kaavake][kentta].maksimi = maksimi;
        
        return true;
    }
    
    
    function asetaSalasananMinimiPituus(kaavake, kentta, minimiPituus, virheIlmoitus)
    {
        if ( !document[kaavake] )
        {
            if (DEBUG) alert("FORMia nimeltään " + kaavake + " ei löydy.");
            return false;
        }
        if ( !document[kaavake][kentta].length )
        {
            if (DEBUG) alert("SALASANAN tarkastus vaatii vähintään 2 saman nimistä kenttää!");
            return false;
        }
        document[kaavake][kentta][1].salasananPituus = minimiPituus;
        document[kaavake][kentta][1].virheIlmoitus = virheIlmoitus;
    }
    
    function asetaVirheIlmoitus(kaavake, kentta, virheIlmoitus)
    {
        if ( !kenttaOlemassa(kaavake, kentta) ) return false;

        if ( DEBUG && !virheIlmoitus )
        {
            alert("SYNTAKSI: asetaVirheIlmoitus(\"formin nimi\",\"kentän nimi\",\"virheilmoitusteksti\"");
            return false;
        }
        
        if ( document[kaavake][kentta].length )
        {
            document[kaavake][kentta][0].virheIlmoitus = virheIlmoitus;
        }
        else
        {
            document[kaavake][kentta].virheIlmoitus = virheIlmoitus;
            if (!document[kaavake][kentta].minimi) document[kaavake][kentta].minimi = 1;
        }
        return true;
    }
    
    function asetaVarmistus(kaavake, kentta, varmistus)
    {
        if ( !kenttaOlemassa(kaavake, kentta) ) return false;
        if ( DEBUG && !varmistus )
        {
           alert("SYNTAKSI: asetaVirheIlmoitus(\"formin nimi\",\"kentän nimi\",\"varmistusteksti\"");
           return false;
        }
        
        if ( document[kaavake][kentta].length )
            document[kaavake][kentta][0].varmistus = varmistus;
        else
            document[kaavake][kentta].varmistus = varmistus;
        
        return true;
    }
    
    
    function tarkasta(kaavake)
    {   
        if ( DEBUG && !kaavake )
        {
            alert("SYNTAKSI: tarkasta(\"formin nimi\" tai this -määre)");
        }
    
        var query = "?"

        for (i = 0; i < kaavake.length; i++)
        {
        
            var tarkastustyyppi = "ei_mitaan";
            if ( kaavake[i].tyyppi ) tarkastustyyppi = kaavake[i].tyyppi;
            
            if ( kaavake[i].value ) //tarkastetaan arvoja vain jos niitä on
            {
            //---tarkastaja
            

            
                switch(tarkastustyyppi)
                {               
                    case "luku":
                        if ( kaavake[i].value.match(/[^0-9]/) )
                        {
                            virheIlmoitus(kaavake[i],EI_OLLUT_NUMEERINEN);
                            return false;
                        }  
                        /* Ei-toiminnalliset 
                        if ( kaavake[i].minimi && (kaavake[i].value < kaavake[i].minimi) )
                        {
                            virheIlmoitus(kaavake[i],LIIAN_PIENI_LUKU);
                            return false;
                        }
                        if ( kaavake[i].maksimi && (kaavake[i].value > kaavake[i].maksimi) )
                        {
                            virheIlmoitus(kaavake[i],LIIAN_SUURI_LUKU);
                            return false;
                        }
                        */
                        //tähän asti pääsee vain kelvollinen numeerinen arvo
                        break;
                        
                    case "teksti":
                        if ( kaavake[i].value.match(/[^A-Za-zåÅäÄöÖ \-]/) )
                        {
                            virheIlmoitus(kaavake[i],EI_AAKKONEN);
                            return false;
                        }   
                    case "seka":
                        if ( kaavake[i].minimi && (kaavake[i].value.length < kaavake[i].minimi) )
                        {
                            virheIlmoitus(kaavake[i],LIIAN_LYHYT_TEKSTI);
                            return false;
                        }
                        if ( kaavake[i].maksimi && (kaavake[i].value.length > kaavake[i].maksimi) )
                        {
                            virheIlmoitus(kaavake[i],LIIAN_PITKA_TEKSTI);
                            return false;
                        }
                        //tähän asti pääsee vain kelvollinen teksti
                        break;
                        
                    case "email":
                        //var validEmail = /^(\w+(?:\.\w+)*)@((?:\w+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i
                        var validEmail = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9])+$/;
                        if ( !validEmail.test(kaavake[i].value) )
                        {
                            virheIlmoitus(kaavake[i],VIRHEELLINEN_EMAIL);
                            return false;
                        }
                        //läpi pääsee vain oikeellinen email osoite
                        break;
                        
                    case "ei_mitaan":
                        //checkboxit, radiot ja ne joilla ei ole tyypitystä
                        if ( kaavake[i].type == "checkbox" && kaavake[i].minimi )
                        {
                            if (!kaavake[i].checked)
                            {
                                virheIlmoitus(kaavake[i],PAKOLLINEN_VALINTA);
                                return false;
                            }
                        }

                        if ( kaavake[i].type == "radio" )
                        {
                            var radioChecked = 0;
                            
                            for (j = 0; j < document[kaavake.name][kaavake[i].name].length; j++)
                            {
                                if ( document[kaavake.name][kaavake[i].name][j].checked ) radioChecked ++;
                            }
                            
                            if (!radioChecked && document[kaavake.name][kaavake[i].name][0].virheIlmoitus )
                            {
                                virheIlmoitus(document[kaavake.name][kaavake[i].name][0],PAKOLLINEN_VALINTA);
                                return false;
                            }
                            
                            if (document[kaavake.name][kaavake[i].name][0].varmistus)
                                if ( !varmistus(document[kaavake.name][kaavake[i].name][0]) ) return false; 
                        }
                        
                        if ( kaavake[i].type == "password" && document[kaavake.name][kaavake[i].name].length)
                        {
                          //password kaavake jota on useampi kuin yksi saman niminen kenttä, tarkistetaan
                          //kenttien yhteneväisyys automaattisesti  
                            var edellinenKentta = document[kaavake.name][kaavake[i].name][0].value;
                                                        
                            if (document[kaavake.name][kaavake[i].name][1].salasananPituus)
                            {
                                if (edellinenKentta.length < document[kaavake.name][kaavake[i].name][1].salasananPituus)
                                {
                                    virheIlmoitus(document[kaavake.name][kaavake[i].name][1],LIIAN_LYHYT_SALASANA);
                                    kaavake.reset();
                                    return false;
                                }
                            }
                            
                            for(j = 0; j < document[kaavake.name][kaavake[i].name].length; j++)
                            {
                               if (document[kaavake.name][kaavake[i].name][j].value != edellinenKentta)
                               {
                                    virheIlmoitus(document[kaavake.name][kaavake[i].name][0],SALASANAT_EI_TASMANNEET);
                                    kaavake.reset();
                                    return false;
                               }        
                               edellinenKentta = document[kaavake.name][kaavake[i].name][j].value;
                            }
                        }
                        
                    default:
                        //kaikki kelpaa
                }
            //---(eof) tarkastaja
            }
            else  //jos mitään arvoa ei ollut
            {
                if ( kaavake[i].minimi ) // mutta jotain kuitenkin pitäis olla
                {
                    virheIlmoitus(kaavake[i],PAKOLLINEN_KENTTA);
                    return false;
                }
               
                if ( kaavake[i].varmistus )
                    if ( !varmistus(kaavake[i]) ) return false;
                    
                if ( kaavake[i].type == "password" && document[kaavake.name][kaavake[i].name].length)
                {
                    if (document[kaavake.name][kaavake[i].name][1].salasananPituus)
                    {
                        virheIlmoitus(document[kaavake.name][kaavake[i].name][1],LIIAN_LYHYT_SALASANA);
                        return false;
                    }
                }
            }
            

        }
        //tarkastukset menivät läpi
        return true;
    }
