/**
 *  Does form or field validation via AJAX
 *  Depends on:
 *      lmbFormUtil
 *      lmbAJAXUtil
 */
var lmbValidator = {
    config : new Object(),
    errorListeners : new Array(),
    result : true,
    validationErrorDisplayer : null,
    addErrorListener : function(errField, callback){
        var index = 0;
        try{
            index = this.errorListeners[errField].length;
        }
        catch(e){
            //First time
            this.errorListeners[errField] = new Array();
        }
        this.errorListeners[errField][index] = callback;
    },
    removeErrorListener : function(errField, callback){
        var listeners = this.errorListeners[errField];
        if(listeners){
            for(var i = 0; i < listeners.length; i++){
                if(listeners[i] == callback);
                listeners.splice(i, 1);
                return;
            }
        }
    },
    removeErrorListeners : function(errField){
        this.errorListeners[errField] = null;
    },

    validateForm : function(form){
        if(this.config.errorStyle){
            //Remove errorStyle from elements of this form
            lmbFormUtil.removeStyle(form, this.config.errorStyle);
        }
        var formData = lmbFormUtil.getFormData(form);
        validationService.validate(formData, {async:false, callback:lmbValidator.errorProcessor, errorHandler:lmbValidator.failureProcessor});
        return this.result;
    },

    validateField : function(field){
        if(this.config.errorStyle){
            //Remove errorStyle from elements of this form
            lmbFormUtil.removeStyle(field.form, this.config.errorStyle);
        }
        var formData = lmbFormUtil.getFormData(field.form) + "&ajaxFieldToValidate=" + field.name;
        lmbAJAXUtil.sendPostRequest(this.config.url, formData, false, this.errorProcessor, this.failureProcessor);
        return this.result;
    },

     validateDirectoryForm : function(form){
        if(this.config.errorStyle){
            //Remove errorStyle from elements of this form
            lmbFormUtil.removeStyle(form, this.config.errorStyle);
        }
        var formData = lmbFormUtil.getFormData(form);
        validationService.validateDirectory(formData, {async:false, callback:lmbValidator.errorProcessor, errorHandler:lmbValidator.failureProcessor});
        return this.result;
    } ,

    errorProcessor : function(errorList){
        try{
            //Check if we got any errors
            if(errorList.length == 0){
                //No errors
                lmbValidator.result = true;
            }
            else{
                //There were errors, translate them from DOM objects to JS Objects

                lmbValidator.result = false;
                var validationErrors = new Array();
                for(var i = 0; i < errorList.length; i++){
                    var error = new Object();


                    // Convert all of these to grab the value correctly from the JSON obj.

                    error.errorFieldId = errorList[i].field;
                    error.errorFocusFieldId = errorList[i].errorFocus;
                    error.errorCode = errorList[i].errorCode;
                    error.errorMessage = errorList[i].defaultMessage;
                    //error.errorDetail = errorList[i].getAttribute("detail");
                    error.errorField = document.getElementById(error.errorFieldId);
                    error.errorFocusField = document.getElementById(error.errorFocusFieldId);
                    error.first = (i == 0);
                    error.last = (i == (error.length - 1));
                    validationErrors[validationErrors.length] = error;
                }
                //Fire error listeners
                for(var i = 0; i < validationErrors.length; i++){
                    var fldId = validationErrors[i].errorFieldId;
                    var listeners = lmbValidator.errorListeners[fldId];
                    //lmbUtil.log(listeners);
                    if(listeners){
                        for(var j = 0; j < listeners.length; j++){
                            listeners[j](validationErrors[i]);
                        }
                    }
                    //Now fiere default (all fields) listeners
                    listeners = lmbValidator.errorListeners["lmbValidationErrorDisplayer"];
                    //lmbUtil.log(listeners);
                    if(listeners){
                        for(var j = 0; j < listeners.length; j++){
                            listeners[j](validationErrors[i]);
                        }
                    }
                }
            }
        }
        catch(e){
            var err = new Object();
            err.errorType = "AJAX Failure";
            err.error = e;
            err.responseText = text;
            lmbUtil.log(err);
        }
    },

    failureProcessor : function(status, statusText){
        this.result = false;
        var err = new Object();
        err.errorType = "AJAX Failure";
        err.status = status;
        err.statusText = statusText;
        lmbUtil.log(err);
    }
}
lmbValidator.config.url = "/servlet/LMBServlet?the_action=Validate";
lmbValidator.config.errorStyle = "error";