TR.FormValidation = function(){}

var p = TR.FormValidation.prototype;

p.emailRegex = /^[a-zA-Z][\w\.-]*[a-zA-Z0-9]@[a-zA-Z0-9][\w\.-]*[a-zA-Z0-9]\.[a-zA-Z][a-zA-Z\.]*[a-zA-Z]$/;

p.setErroneous = function( element, okayMessage, errorMessage, 
                            hasError, options ) {
    options = options || {}
    var errorField = $( "#" +element.attr("id") + "_validation_error")

    function setValidationMessage(html) {
        if( errorField) {
            errorField.html(html);
            errorField.removeClass("validationMessageUnvalidated")
            if( hasError ) {
                errorField.addClass("validationMessageError")
                errorField.removeClass("validationMessageSuccess")                    
            } else {
                errorField.addClass("validationMessageSuccess")                    
                errorField.removeClass("validationMessageError")                                        
            }
        }
    }
    
    if( hasError ) {
        setValidationMessage( errorMessage )

        element.addClass( "validationError")
        element.removeClass("validationSuccess")
        if( this.errors ) {
            this.errors.push(
                { /*"element": element,*/
                  "error": errorMessage }
            );
        }
    } else {
        setValidationMessage( okayMessage )
        element.removeClass("validationError")
        element.addClass("validationSuccess")
    }        
}
    
p.validateLength =  function(element, value, options ) {
    var minLength = options["min_length"] || 1;
    var maxLength = options["max_length"];
    var message = options["message"];
    if( !message ) {
        if( !maxLength ) {
            message = "Mindestens " + minLength + " Zeichen";
        } else {
            message = "Zwischen " + minLength + " und " + maxLength + 
                      " Zeichen";
        }
    }
    this.setErroneous( element, "", message, 
                                    !value ||
                                    ( value.length < minLength ) || 
                                    ( value.length > maxLength ));
}
    
p.validateEmail = function(element,value,options ) {
    var message = options["message"] || 
                  "Bitte gib eine g&uuml;ltige Mailadresse an."
    this.setErroneous( 
            element, "", message, 
            !value.match(this.emailRegex))
}

p.validatePasswordRepeat = function(element,value,options) {
    var passwdField = $("#"+options["password_field_id"]);
    var repeatField = $("#"+options["field_id"]);
    
    var err = !( (passwdField.val() && passwdField.val().length > 0 ) && 
                 (passwdField.val() == repeatField.val()) );
    this.setErroneous( passwdField, "", "Passw&ouml;rter stimmen nicht &uuml;berein",
                        err );
    this.setErroneous( repeatField, "", "Passw&ouml;rter stimmen nicht &uuml;berein",
                       err );
}

p.addGenericValidation = function(methodName, fieldId, options ) {
    this.validations = this.validations || []
    var occasion = "update";
    var that = this        
    if( options["on"]) {
        occasion = options["on"];
        delete options["on"]
    }

    if( occasion == "update" ) {
        $("#"+fieldId).keyup(function() {
            that[methodName]($(this), this.value, options);
        });
    }
    
    if( occasion == "update" || occasion == "blur" ) {
        $( "#" +fieldId).blur( function() { 
             that[methodName]($(this), this.value, options);
        })

    }
    
    this.validations.push({
        func: methodName,
        fieldId: fieldId,
        options: options
    })      
    
}
    
p.resetErrors = function() {
    this.errors = []
}
    
p.validateAll = function() {
    this.resetErrors();
    var that = this;
    $(this.validations).each(function(val){
        val = that.validations[val]
        var element = document.getElementById(val["fieldId"])
        that[val["func"]]($(element), element.value, val["options"])
    })

    return this.errors.length == 0;
}
    
p.addEmailValidation = function(fieldId, options) {
        this.addGenericValidation("validateEmail", fieldId, options);
}
    
p.addLengthValidation = function(fieldId, options) {
        this.addGenericValidation("validateLength", fieldId, options);
}
