/**
 * @author Wim
 */
function SCZValidator(){

}

SCZValidator.prototype.showVerzenden = function(){
    // maak de Verzenden knop zichtbaar; heeft id inschrijvingVerzenden
    // op te roepen in onLoad event
    // de knop staat niet op alle pagina's
    var knop = document.getElementById("inschrijvingVerzenden");
    if (knop) {
        knop.style.visibility = "visible";
        //alert ("knoppeke getoond");
    }
}

SCZValidator.prototype.isValidRadio = function(elementName, label){
    // gegeven de naam van een radio button
    // ga na of er minstens 1 waarde aangekruist is
    // Label is de zichtbare naam van het veld gebruikt in de foutboodschap
    
    var iCheckedCount = 0;
    var knoppen = document.getElementsByName(elementName);
    for (var i = 0; i < knoppen.length; i++) {
        if (knoppen[i].checked) 
            iCheckedCount++;
    }
    if (iCheckedCount == 0) {
        return {
            code: false,
            msg: "Vink één waarde aan voor " + label + "."
        }
    }
    else {
        return {
            code: true,
            msg: ""
        }
    }
    
}

SCZValidator.prototype.isValidCheckbox = function( elementName, label){
  //gegeven de naam van een checkbox
  //ga na of de checkbox geselecteerd is
  // Label is de zichtbare naam van het veld gebruikt in de foutboodschap
  var checkbox = document.getElementById( elementName );
  if ( checkbox.checked ){
    return {
      code: true,
      msg: ""
    }
  } else {
    return {
      code: false, 
      msg: label
    }
  }
}
SCZValidator.prototype.isValidText = function(elementID, label, minChars){
    // gegeven de ID van een input veld (elementID)
    // ga na of het een correcte tekst veld is
    // Moet verplicht starten met karakter en moet minstens minChars karakters bevatten
    // Achteraan mogen er nog wat spaties extra staan
    // Eerste karakter mag speciaal zijn doch geen spatie
    // Er moeten voldoende normale letters in staan
    // Label is de zichtbare naam van het veld gebruikt in de foutboodschap
    //
    var elementStr = document.getElementById(elementID).value;
    var pattern;
    var regExp;
    // bepaal de regexp
    if (minChars < 1) {
        pattern = "^(\\S)+(.)*$";
    }
    else {
        pattern = "^(\\S)+((.)*[A-Za-z]){" + (minChars - 1) + ",}(.)*$";
    }
    regExp = new RegExp(pattern, "");
    if (!elementStr.match(regExp)) {
        return {
            code: false,
            msg: "Het veld " + label + " dient minstens " + minChars + " letters te bevatten en mag niet starten met blanko."
        }
    }
    else {
        return {
            code: true,
            msg: ""
        }
    }
}

SCZValidator.prototype.isValidPostcode = function(elementID, label){
    // gegeven de ID van een input veld (elementID)
    // ga na of het een correcte postcode is
    // Als er maar 4 tekens minstens in staan
    // Label is de zichtbare naam van het veld gebruikt in de foutboodschap
    //
    var elementStr = document.getElementById(elementID).value;
    var pattern = /^(\S)+((.)*[A-Za-z0-9]){3,}$/;
    if (!elementStr.match(pattern)) {
        return {
            code: false,
            msg: "Het veld " + label + " dient een geldige postcode te bevatten met minstens 4 letters of cijfers."
        }
    }
    else {
        return {
            code: true,
            msg: ""
        }
    }
}

SCZValidator.prototype.isValidPhone = function(elementID, label){
    // gegeven de ID van een input veld (elementID)
    // ga na of het een correcte telefoon is
    // Als er maar 9 cijfers minstens in staan en nog wat /, . en blanko en - en ( en ) en +
    // Label is de zichtbare naam van het veld gebruikt in de foutboodschap
    //
    var elementStr = document.getElementById(elementID).value;
    var pattern = /^([\/\. \-\(\)\+]*[0-9]){9,}$/;
    if (!elementStr.match(pattern)) {
        return {
            code: false,
            msg: "Het veld " + label + " dient een geldig telefoonnummer te bevatten met minstens 9 cijfers."
        }
    }
    else {
        return {
            code: true,
            msg: ""
        }
    }
}
SCZValidator.prototype.isValidEmail = function(elementID, label){
    // gegeven de ID van een input veld (elementID)
    // ga na of het een correcte email adres is
    // Moet verplicht een @ bevatten
    // voor de @ een aantal letters, eventueel _ of . en letters
    // na de @ nog minstens 2 componenten gescheiden door .
    // het stuk na @ zo goed als alles bevatten
    // achteraan 2 of 3 letters
	//
    // Label is de zichtbare naam van het veld gebruikt in de foutboodschap
    //
    var elementStr = document.getElementById(elementID).value;
    var pattern = /^([A-Za-z1-9])+((-|_|\.)([A-Za-z1-9])+)*@[^\.]+.*[^\.]+\.([A-Za-z]){2,3}$/;
    if (!elementStr.match(pattern)) {
        return {
            code: false,
            msg: "Het veld " + label + " dient een geldig email adres te bevatten.  Vergeet de @ niet."
        }
    }
    else {
        return {
            code: true,
            msg: ""
        }
    }
}

SCZValidator.prototype.isValidDate = function(elementID, label){
    // gegeven de ID van een input veld (elementID)
    // ga na of het een correcte datum bevat dd/mm/yyyy
    // Label is de zichtbare naam van het veld gebruikt in de foutboodschap	
    var testDateStr = document.getElementById(elementID).value;
    // Regular expression used to check if date is in correct format
    var pattern = /^([0-3]?[0-9])\/((0|1)?[0-9])\/((19|20)[0-9]{2})$/;
    var matchResult;
    var inpDD;
    var inpMM;
    var inpYYYY;
    if (matchResult = testDateStr.match(pattern)) {
        // de input string opsplitsen in zijn drie componenten
        inpDD = matchResult[1];
        inpMM = matchResult[2];
        inpYYYY = matchResult[4];
        var day = inpDD - 0; // omzetten naar number
        // Attention! Javascript consider months in the range 0 - 11
        var month = inpMM - 1;
        var year = inpYYYY - 0;
        // hoeveel dagen zitten er in de maand
        // neem de 1ste van de volgende maand en verminder met 1 dag
        var d = new Date(year, month + 1, 1, 1, 1, 1, 1);
        var dd = d.valueOf();
        // 1 dag achteruit gaan - zo kennen we het aantal dagen in de maand
        dd = dd - (1000 * 60 * 60 * 24);
        var ddd = new Date(dd);
        var aantalDagenInMaand = ddd.getDate();
        // This instruction will create a date object
        var source_date = new Date(year, month, day);
        
        if (year != source_date.getFullYear()) {
            return {
                code: false,
                msg: "Ongeldige datum.  Denk eraan: deze maand heeft " + aantalDagenInMaand + " dagen."
            }
        }
        
        if (month != source_date.getMonth()) {
            return {
                code: false,
                msg: "Ongeldige datum.  Denk eraan: deze maand heeft " + aantalDagenInMaand + " dagen."
            }
        }
        
        if (day != source_date.getDate()) {
            return {
                code: false,
                msg: "Ongeldige datum.  Denk eraan: deze maand heeft " + aantalDagenInMaand + " dagen."
            }
        }
    }
    else {
        return {
            code: false,
            msg: "De invoer is niet herkenbaar als datum."
        }
    }
    
    return {
        code: true,
        msg: ""
    }
}
SCZValidator.prototype.displayFout = function(elementID, validatieObj){
    // gegeven de ID van een foutveld
    // gegeven een validatieObject (berekend door isValid...)
    // zet of verwijder het uitroepteken + de foutboodschap
    //
    var foutElement;
    
    foutElement = document.getElementById(elementID);
    if (!validatieObj.code) {
		foutElement.style.display = "inline";
        foutElement.style.color = "red";
        foutElement.style.cursor = "help";
        foutElement.onmouseover = new Function("Tip('" + validatieObj.msg + "', DELAY, 0, FADEIN, 500, SHADOW, true);");
    }
    else {
		foutElement.style.display = "none";
    }
}
SCZValidator.prototype.isInschrijvingValid = function(kind){
    // valideer de gegevens van een inschrijving
    // kind: geeft aan op welke lijst men inschrijft
    //   - zwemschool
    //   - competitie
    //   - recreatie
    //   - volwassenen
    //   - aquagym
    var validatieObj;
    var bSingleErrorFound;
    
    
    bSingleErrorFound = false;
    // Valideer de velden die steeds aanwezig zijn
    // Valideer voornaam - minstens 2 karakters lang
    validatieObj = this.isValidText("voornaam", "voornaam", 2);
    this.displayFout("error_voornaam", validatieObj);
    if (!validatieObj.code) {
        bSingleErrorFound = true;
    }
    // valideer naam - minstens 3 karakters lang
    validatieObj = this.isValidText("naam", "naam", 3);
    this.displayFout("error_naam", validatieObj);
    if (!validatieObj.code) {
        bSingleErrorFound = true;
    }
    // valideer straat - minstens 5 karakters
    validatieObj = this.isValidText("adres", "adres", 5);
    this.displayFout("error_adres", validatieObj);
    if (!validatieObj.code) {
        bSingleErrorFound = true;
    }
    // valideer postcode - minstens 4 karakters
    validatieObj = this.isValidPostcode("postcode", "postcode");
    this.displayFout("error_postcode", validatieObj);
    if (!validatieObj.code) {
        bSingleErrorFound = true;
    }
    // valideer gemeente - minstens 3 karakters
    validatieObj = this.isValidText("gemeente", "gemeente", 3);
    this.displayFout("error_gemeente", validatieObj);
    if (!validatieObj.code) {
        bSingleErrorFound = true;
    }
    // valideer geboortedatum
    validatieObj = this.isValidDate("geboortedatum", "geboortedatum");
    this.displayFout("error_geboortedatum", validatieObj);
    if (!validatieObj.code) {
        bSingleErrorFound = true;
    }
    // valideer geboorteplaats - minstens 3 karakters
    validatieObj = this.isValidText("geboorteplaats", "geboorteplaats", 3);
    this.displayFout("error_geboorteplaats", validatieObj);
    if (!validatieObj.code) {
        bSingleErrorFound = true;
    }
    // valideer telefoon 
    validatieObj = this.isValidPhone("telefoon", "telefoon");
    this.displayFout("error_telefoon", validatieObj);
    if (!validatieObj.code) {
        bSingleErrorFound = true;
    }
    // valideer gsm 
    validatieObj = this.isValidPhone("gsm", "gsm");
    this.displayFout("error_gsm", validatieObj);
    if (!validatieObj.code) {
        bSingleErrorFound = true;
    }
    // valideer email
    validatieObj = this.isValidEmail("email", "email");
    this.displayFout("error_email", validatieObj);
    if (!validatieObj.code) {
        bSingleErrorFound = true;
    }
    // valideer sos telefoon
    validatieObj = this.isValidPhone("sos", "sos");
    this.displayFout("error_sos", validatieObj);
    if (!validatieObj.code) {
        bSingleErrorFound = true;
    }
    // valideer het geslacht
    validatieObj = this.isValidRadio("geslacht", "geslacht");
    this.displayFout("error_geslacht", validatieObj);
    if (!validatieObj.code) {
        bSingleErrorFound = true;
    }
    // valideer taal
    validatieObj = this.isValidCheckbox( "language_check", "Ik spreek en versta Nederlands");
    this.displayFout("error_language_check", validatieObj);
    if (!validatieObj.code) {
      bSingleErrorFound = true;
    }
    
    // in geval van zwemschool bijkomende validaties doen
    if (kind == "zwemschool") {
        // hoofd onder water ?
        validatieObj = this.isValidRadio("onderwater", "Ik durf mijn hoofd onder water steken");
        this.displayFout("error_onderwater", validatieObj);
        if (!validatieObj.code) {
            bSingleErrorFound = true;
        }
        // drijven ?
        validatieObj = this.isValidRadio("drijven", "Ik drijf");
        this.displayFout("error_drijven", validatieObj);
        if (!validatieObj.code) {
            bSingleErrorFound = true;
        }
        // schoolslag ?
        validatieObj = this.isValidRadio("schoolslag", "Ik kan schoolslag zwemmen");
        this.displayFout("error_schoolslag", validatieObj);
        if (!validatieObj.code) {
            bSingleErrorFound = true;
        }
        // crawl ?
        validatieObj = this.isValidRadio("crawl", "Ik kan crawl zwemmen");
        this.displayFout("error_crawl", validatieObj);
        if (!validatieObj.code) {
            bSingleErrorFound = true;
        }
        // rugslag ?
        validatieObj = this.isValidRadio("rugslag", "Ik kan rugslag zwemmen");
        this.displayFout("error_rugslag", validatieObj);
        if (!validatieObj.code) {
            bSingleErrorFound = true;
        }
        // vlinder ?
        validatieObj = this.isValidRadio("vlinder", "Ik kan vlinderslag zwemmen");
        this.displayFout("error_vlinder", validatieObj);
        if (!validatieObj.code) {
            bSingleErrorFound = true;
        }
    }
    
    if (bSingleErrorFound) {
        alert("Het formulier bevat 1 of meer fouten.  \nGa met de muis over de rode ! voor meer uitleg.");
    };
    return (!bSingleErrorFound);
}

var mySCZValidator;
function initInschrijving(){
    mySCZValidator = new SCZValidator();
    mySCZValidator.showVerzenden();
}

