﻿

function FormValidatorSummaryMessage(summaryid) {
    if (!(this instanceof FormValidatorSummaryMessage)) return new FormValidatorSummaryMessage(summaryid);
    
	this.summaryId=summaryid;
	this.summary=document.getElementById(summaryid);
	this.visible=true;
	this.messages=new Array();
	
    this.Add = function(message) {
        this.messages[this.messages.length]=message;
    }
    this.Render = function() {
        if (this.messages.length>0) {
            for (var i = 0; i < this.messages.length; i++) {
                this.createMessage(this.messages[i]);
            }
        }
        this.show();
    }
    this.createMessage = function(message) {
        this.summary.appendChild(document.createTextNode(message));
        this.summary.appendChild(document.createElement("br"));
    }
    
    this.reset = function() {
	    this.messages=new Array();
	    this.clear();
    }
    this.show = function() {
        if (this.visible) {
            this.summary.style.display = "";
        } else  {
            this.summary.style.display = "none";
        }
    }
    this.clear = function() {
        while (this.summary.childNodes.length>0) {
            var child=this.summary.firstChild;
            this.summary.removeChild(child);
        }
    }
}

function FormValidator(summaryid) {
    this.summaryId=summaryid;
    this.validators=new Array();
    this.summaryMessage=new FormValidatorSummaryMessage(summaryid);
    this.isValid=true;
    
    this.Add = function(validator) {
        this.validators[this.validators.length]=validator;
    }
    this.Validate = function() {
        this.reset();
        this.isValid=true;
        if (this.validators.length>0) {
            for (var i = 0; i < this.validators.length; i++) {
                var validator=this.validators[i];
                if (!validator.Validate()) {
                    this.summaryMessage.Add(validator.Message());
                    this.isValid=false;
                }
            }
        }
        return this.isValid;  
    }
    this.reset = function() {
        if (this.validators.length>0) {
            for (var i = 0; i < this.validators.length; i++) {
                var validator=this.validators[i];
                validator.reset();
            }
            this.summaryMessage.reset();
        }
    }
    this.Render = function() {
        if (this.validators.length>0) {
            for (var i = 0; i < this.validators.length; i++) {
                var validator=this.validators[i];
                validator.Render();
            }
            this.summaryMessage.Render();
        }
    }
}

function BaseFieldValidator(fieldid, labelid, usermessage, color) {
	this.fieldId=fieldid;
	this.labelId=labelid;
	this.field=document.getElementById(fieldid);
	this.label=document.getElementById(labelid);
    this.usermessage=usermessage;
    this.validatormessage="";
    this.color=color;
    //this.style=style;
    this.isValid=false;
}
BaseFieldValidator.method('Message', function () {
    var message=this.usermessage;
    if (message!="") message+=" ";
    message+=this.validatormessage;
    return message;
});

BaseFieldValidator.method('Validate', function () {
    this.validatormessage="";
    this.isValid=true;
});
BaseFieldValidator.method('Render', function () {
    this.mark(); 
    this.createMessage();
});
BaseFieldValidator.method('reset', function () {
    this.clear(); 
});
BaseFieldValidator.method('mark', function () {
    if (!this.isValid) {
        //this.field.className=this.style;
        this.field.style.background = this.color;
    } else {
        //this.field.className="";
        this.field.style.background = "White";
    }
});
BaseFieldValidator.method('createMessage', function () {
    if (!this.isValid) {
        var message=this.Message();
        if (message.length != 0) {
            this.label.appendChild(document.createElement("br"));
            this.label.appendChild(document.createTextNode(message));
        }
    } else {
        this.clear();
    }
});
BaseFieldValidator.method('clear', function () {
    while (this.label.childNodes.length>0) {
        var child=this.label.firstChild;
        this.label.removeChild(child);
    }
});


function RequiredFieldValidator(fieldid, labelid, usermessage, color) {
	this.fieldId=fieldid;
	this.labelId=labelid;
	this.field=document.getElementById(fieldid);
	this.label=document.getElementById(labelid);
    this.usermessage=usermessage;
    this.validatormessage="";
    this.color=color;
    //this.style="";
    this.isValid=false;
}

RequiredFieldValidator.inherits(BaseFieldValidator);

RequiredFieldValidator.method('Validate', function () {
    this.validatormessage="";
    
    this.isValid=true;
    if (this.field.value.length == 0) {
        this.validatormessage = "Dit gegeven is vereist."
        this.isValid=false;
    }
    return this.isValid;   
});

//RequiredFieldValidator.prototype = new BaseFieldValidator();
//RequiredFieldValidator.prototype.constructor = RequiredFieldValidator;
//RequiredFieldValidator.prototype.baseClass = BaseFieldValidator.prototype.constructor;

function UserNameFieldValidator(fieldid, labelid, usermessage, color) {
	this.fieldId=fieldid;
	this.labelId=labelid;
	this.field=document.getElementById(fieldid);
	this.label=document.getElementById(labelid);
    this.usermessage=usermessage;
    this.validatormessage="";
    this.color=color;
    //this.style="";
    this.isValid=false;
}

UserNameFieldValidator.inherits(BaseFieldValidator);

UserNameFieldValidator.method('Validate', function () {
    this.validatormessage = "";
    var illegalChars = /\W/; // allow letters, numbers, and underscores
 
    this.isValid=true;
    if (this.field.value != "") {
        if ((this.field.value.length < 5) || (this.field.value.length > 15)) {
            this.validatormessage = "De gebruikersnaam heeft niet de juiste lengte (lengte alleen tussen 5 en 15 tekens).";
            this.isValid=false;
        } else if (illegalChars.test(field.value)) {
            this.validatormessage = "De gebruikersnaam bevat ongeldige tekens (alleen letters, cijfers en spaties).";
            this.isValid=false;
        } 
    }
    return this.isValid;   
});

function PasswordFieldValidator(fieldid, labelid, usermessage, color) {
	this.fieldId=fieldid;
	this.labelId=labelid;
	this.field=document.getElementById(fieldid);
	this.label=document.getElementById(labelid);
    this.usermessage=usermessage;
    this.validatormessage="";
    this.color=color;
    //this.style="";
    this.isValid=false;
}

PasswordFieldValidator.inherits(BaseFieldValidator);

PasswordFieldValidator.method('Validate', function () {
    this.validatormessage = "";
    var illegalChars = /[\W_]/; // allow only letters and numbers 
 
    this.isValid=true;
    if (this.field.value != "") {
        if ((this.field.value.length < 7) || (this.field.value.length > 15)) {
            this.validatormessage = "Het wachtwoord heeft niet de juiste lengte (lengte alleen tussen 7 en 15 tekens).";
            this.isValid=false;
        } else if (illegalChars.test(this.field.value)) {
            this.validatormessage = "Het wachtwoord bevat ongeldige tekens (alleen letters, cijfers en spaties).";
            this.isValid=false;
        } else if (!((this.field.value.search(/(a-z)+/)) && (this.field.value.search(/(0-9)+/)))) {
            this.validatormessage = "Het wachtwoord dient tenminste 1 cijfer te bevatten.";
            this.isValid=false;
        }
    }
    return this.isValid;   
});

function EmailFieldValidator(fieldid, labelid, usermessage, color) {
	this.fieldId=fieldid;
	this.labelId=labelid;
	this.field=document.getElementById(fieldid);
	this.label=document.getElementById(labelid);
    this.usermessage=usermessage;
    this.validatormessage="";
    this.color=color;
    //this.style="";
    this.isValid=false;
}

EmailFieldValidator.inherits(BaseFieldValidator);

EmailFieldValidator.method('Validate', function () {
    this.validatormessage="";
    var tfld = trim(this.field.value);                        // value of field with whitespace trimmed off
    var filter = /^[^@]+@[^@.]+\.[^@]*\w\w$/ ;
    var illegalChars= /[\(\)\<\>\,\;\:\\\"\[\]]/ ;
    
    this.isValid=true;
    if (this.field.value != "") {
        if (!filter.test(tfld)) {              //test illegal characters
            this.validatormessage = "Het emailadres heeft een ongeldig formaat (ontvanger@domeinnaam).";
            this.isValid=false;
        } else if (this.field.value.match(illegalChars)) {
            this.validatormessage = "Het emailadres bevat ongeldige tekens (geen '()<>,;:\\\"[]' tekens toegestaan).";
            this.isValid=false;
        }
    }
    return this.isValid;   
});

function PhoneFieldValidator(fieldid, labelid, usermessage, color) {
	this.fieldId=fieldid;
	this.labelId=labelid;
	this.field=document.getElementById(fieldid);
	this.label=document.getElementById(labelid);
    this.usermessage=usermessage;
    this.validatormessage="";
    this.color=color;
    //this.style="";
    this.isValid=false;
}

PhoneFieldValidator.inherits(BaseFieldValidator);

PhoneFieldValidator.method('Validate', function () {
    this.validatormessage = "";
    var stripped = this.field.value.replace(/[\(\)\.\-\ ]/g, '');     

    this.isValid=true;
    if (this.field.value != "") {
        if (isNaN(parseInt(stripped))) {
            this.validatormessage = "Het telefoonnummer heeft een ongeldig formaat (alleen cijfers en '().- ' toegestaan).";
            this.isValid=false;
        } else if (!(stripped.length == 10)) {
            this.validatormessage = "Het telefoonnummer heeft niet de juiste lengte (lengte alleen 10 tekens. Controleer of het kengetal is ingevuld).";
            this.isValid=false;
        }
    }
    return this.isValid;   
});

function StrongTextFieldValidator(fieldid, labelid, usermessage, color) {
	this.fieldId=fieldid;
	this.labelId=labelid;
	this.field=document.getElementById(fieldid);
	this.label=document.getElementById(labelid);
    this.usermessage=usermessage;
    this.validatormessage="";
    this.color=color;
    //this.style="";
    this.isValid=false;
}

StrongTextFieldValidator.inherits(BaseFieldValidator);

StrongTextFieldValidator.method('Validate', function () {
    this.validatormessage="";
    var tfld = trim(this.field.value);  // value of field with whitespace trimmed off
    var illegalChars= /[\(\)\<\>\,\;\:\\\"\'\[\]]/ ;
    
    this.isValid=true;
    if (this.field.value != "") {
        if (this.field.value.match(illegalChars)) {
            this.validatormessage = "De tekst bevat ongeldige tekens (geen '()<>,;:\\\"\'[]' toegestaan).";
            this.isValid=false;
        }
    }
    return this.isValid;   
});

function WeakTextFieldValidator(fieldid, labelid, usermessage, color) {
	this.fieldId=fieldid;
	this.labelId=labelid;
	this.field=document.getElementById(fieldid);
	this.label=document.getElementById(labelid);
    this.usermessage=usermessage;
    this.validatormessage="";
    this.color=color;
    //this.style="";
    this.isValid=false;
}

WeakTextFieldValidator.inherits(BaseFieldValidator);

WeakTextFieldValidator.method('Validate', function () {
    this.validatormessage="";
    var illegalChars= /[\<\>\;\\\'\"]/ ;
    
    this.isValid=true;
    if (this.field.value != "") {
        if (this.field.value.match(illegalChars)) {
            this.validatormessage = "De tekst bevat ongeldige tekens (geen '<>;\\\'\"' toegestaan).";
            this.isValid=false;
        }
    }
    return this.isValid;   
});

function DateFieldValidator(fieldid, labelid, usermessage, color) {
	this.fieldId=fieldid;
	this.labelId=labelid;
	this.field=document.getElementById(fieldid);
	this.label=document.getElementById(labelid);
    this.usermessage=usermessage;
    this.validatormessage="";
    this.color=color;
    //this.style="";
    this.isValid=false;
}

DateFieldValidator.inherits(BaseFieldValidator);

DateFieldValidator.method('Validate', function () {
    this.validatormessage="";
    
    this.isValid=true;
    if (this.field.value != "") {
        if (!checkDateNL(this.field.value)) {              //test for illegal characters
            this.validatormessage = "De datum heeft een ongeldig formaat (gebruik dd-mm-jjjj).";
            this.isValid=false;
        }
    }
    return this.isValid;   
});

function PercentageFieldValidator(fieldid, labelid, usermessage, color) {
	this.fieldId=fieldid;
	this.labelId=labelid;
	this.field=document.getElementById(fieldid);
	this.label=document.getElementById(labelid);
    this.usermessage=usermessage;
    this.validatormessage="";
    this.color=color;
    //this.style="";
    this.isValid=false;
}

PercentageFieldValidator.inherits(BaseFieldValidator);

PercentageFieldValidator.method('Validate', function () {
    this.validatormessage="";
    
    this.isValid=true;
    if (this.field.value != "") {
        if (!checkNumericUS(this.field.value)) {
            this.validatormessage = "Het percentage heeft een ongeldig formaat.";
            this.isValid=false;
        }
    }
    return this.isValid;   
});

function NumericFieldValidator(fieldid, labelid, usermessage, color) {
	this.fieldId=fieldid;
	this.labelId=labelid;
	this.field=document.getElementById(fieldid);
	this.label=document.getElementById(labelid);
    this.usermessage=usermessage;
    this.validatormessage="";
    this.color=color;
    //this.style="";
    this.isValid=false;
}

NumericFieldValidator.inherits(BaseFieldValidator);

NumericFieldValidator.method('Validate', function () {
    this.validatormessage="";
    
    this.isValid=true;
    if (this.field.value != "") {
        if (!checkNumericUS(this.field.value)) {
            this.validatormessage = "De numerieke waarde heeft een ongeldig formaat.";
            this.isValid=false;
        }
    }
    return this.isValid;   
});

function MoneyFieldValidator(fieldid, labelid, usermessage, color) {
	this.fieldId=fieldid;
	this.labelId=labelid;
	this.field=document.getElementById(fieldid);
	this.label=document.getElementById(labelid);
    this.usermessage=usermessage;
    this.validatormessage="";
    this.color=color;
    //this.style="";
    this.isValid=false;
}

MoneyFieldValidator.inherits(BaseFieldValidator);

MoneyFieldValidator.method('Validate', function () {
    this.validatormessage="";
    
    this.isValid=true;
    if (this.field.value != "") {
        if (!checkNumericUS(this.field.value)) {
            this.validatormessage = "Het bedrag heeft een ongeldig formaat (gebruik 99999.99).";
            this.isValid=false;
        }
    }
    return this.isValid;   
});

function DateFieldRangeValidator(fieldid, labelid, usermessage, color, startdate, enddate) {
	this.fieldId=fieldid;
	this.labelId=labelid;
	this.field=document.getElementById(fieldid);
	this.label=document.getElementById(labelid);
    this.usermessage=usermessage;
    this.validatormessage="";
    this.color=color;
    //this.style="";
    this.isValid=false;
	this.startdate=startdate;
	this.enddate=enddate;
}

DateFieldRangeValidator.inherits(BaseFieldValidator);

DateFieldRangeValidator.method('Validate', function () {
    this.validatormessage="";
    
    this.isValid=true;
    if (checkDateNL(this.field.value)) {
        var parsedDate=parseDateNL(this.field.value);
        if (isDate(startdate) && isDate(enddate)) {
            if ((parsedDate < this.startdate) || (parsedDate > this.enddate)) {
                this.validatormessage = "De datum dient binnen het bereik van "+ convertDateToStringNL(startdate)+" tot en met "+ convertDateToStringNL(this.enddate)+" te liggen.";
                this.isValid=false;
            }        
        } else if (isDate(this.startdate)) {
            if ((parsedDate < this.startdate)) { 
                this.validatormessage = "De datum dient vanaf "+ convertDateToStringNL(this.startdate)+" te liggen.";
                this.isValid=false;
            }        
        } else if (isDate(this.enddate)) {
            if ((parsedDate > this.enddate)) {
                this.validatormessage = "De datum dient tot en met "+ convertDateToStringNL(this.enddate)+" te liggen.";
                this.isValid=false;
            }        
        }
    }
    return this.isValid;   
});

function NumericFieldRangeValidator(fieldid, labelid, usermessage, color, minvalue, maxvalue) {
	this.fieldId=fieldid;
	this.labelId=labelid;
	this.field=document.getElementById(fieldid);
	this.label=document.getElementById(labelid);
    this.usermessage=usermessage;
    this.validatormessage="";
    this.color=color;
    //this.style="";
    this.isValid=false;
	this.minvalue=minvalue;
	this.maxvalue=maxvalue;
}

NumericFieldRangeValidator.inherits(BaseFieldValidator);

NumericFieldRangeValidator.method('Validate', function () {
    this.validatormessage="";
    
    this.isValid=true;
    if (checkNumericNL(this.field.value)) {
        var parsedNumeric=parseNumericUS(this.field.value);
        if (isNumeric(this.minvalue) && isNumeric(this.maxvalue)) {
            if ((parsedNumeric < this.minvalue) || (parsedNumeric > this.maxvalue)) {
                this.validatormessage = "De numerieke waarde dient binnen het bereik van "+ convertDateToNumericUS(this.minvalue)+" tot en met "+ convertDateToNumericUS(this.maxvalue)+" te liggen.";
                this.isValid=false;
            }        
        } else if (isNumeric(this.minvalue)) {
            if ((parsedNumeric < this.minvalue)) { 
                this.validatormessage = "De numerieke waarde dient vanaf "+ convertDateToNumericUS(this.minvalue)+" te liggen.";
                this.isValid=false;
            }        
        } else if (isNumeric(this.maxvalue)) {
            if ((parsedNumeric > this.maxvalue)) {
                this.validatormessage = "De numerieke waarde dient tot en met "+ convertDateToNumericUS(this.maxvalue)+" te liggen.";
                this.isValid=false;
            }        
        }
    }
    return this.isValid;   
});

//--- Utility Helpers

