﻿function ShowValidationErrors(form, result) {
    if (result.errors) {
        var errorList = [];
        for (var i in result.errors) {
            var error = result.errors[i];
            var key = error.Key;
            if (key === '_FORM' || key === '') {
                for (var i in form.validate().settings.rules) {
                    key = i;
                    break;
                }
            }
            if (key === '_FORM' || key === '') {
                key = $(form).children('input:first').attr('id');
            }
            if (key === undefined) {
                $.saturneoNotification(error.Message);
            } else {
                if (key in errorList) {
                    errorList[key] += '<br/>' + error.Message;
                } else {
                    errorList[key] = error.Message;
                }
            }
        }
        $(form).validate().showErrors(errorList);
    }
    if (result.message) {
        $.saturneoNotification(result.message);
        //alert(results.message);
    }
}

function ShowResultMessages(form, result) {
    if (result.ControlMessages) {
        var errorList = [];
        for (var i in result.ControlMessages) {
            var message = result.ControlMessages[i];
            var key = message.ControlName;
            if (key === '_FORM' || key === '') {
                for (var i in form.validate().settings.rules) {
                    key = i;
                    break;
                }
            }
            if (key === '_FORM' || key === '') {
                    key = $(form).children('input:first').attr('id');
            }
            // TODO : test Level (error or warning)
            if (key === undefined) {
                $.saturneoNotification(message.Message);
            } else {
                if (key in errorList) {
                    errorList[key] += '<br/>' + message.Message;
                } else {
                    errorList[key] = message.Message;
                }
            }
        }
        $(form).validate().showErrors(errorList);
    }
    if (result.message) {
        //alert(results.message);
        $.saturneoNotification(results.message);
    }
}


var FormValidation = function() {
}

FormValidation.ShowErrors = function(form, result) {
    if (result.errors) {
        var errorList = [];
        for (var i in result.errors) {
            var error = result.errors[i];

            // only display
            if (form.find('#' + error.Key).length) {
                if (error.Key in errorList) {
                    errorList[error.Key] += '<br/>' + error.Message;
                } else {
                    errorList[error.Key] = error.Message;
                }
            }
        }
        $(form).validate().showErrors(errorList);
    }
    if (result.message) {
        //alert(results.message);
        $.saturneoNotification(result.message);
    }
}


FormValidation.FindContainerForError = function(orderedContainers, errors, found) {
    if (orderedContainers == null)
        return null;
    if (errors == null)
        return null;

    for (var c = 0; c < orderedContainers.length; c++) {
        var container = $(orderedContainers[c].container);
        if (container == null || typeof container == 'undefined')
            continue;

        for (var e = 0; e < errors.length; e++) {
            if (errors[e].Key) {
                if (container.find('#' + errors[e].Key).length > 0) {
                    if (found != null && typeof found != 'undefined')
                        found(container, orderedContainers[c].data);
                    return true;
                }
            }
        }
    }

    return null;
}


// Supplies with validation message placement mechanism.
//
// By default, places message it on the right of the validated element.
// error    : [Mandatory] validation error element (which will display the error).
// element  : [Mandatory] element on which the error occured or method returning any element. The error will be placed next to it.
// location : [Not mandatory] a method used to place the error message. The method takes (element) as arguments and returns {left:x,top:y}.
//            possible values :  
//              - FormValidation.PlaceErrors.Right
//              - FormValidation.PlaceErrors.Bottom
//              - custom function function(element) returning {left:x, top:y}
FormValidation.PlaceErrors = function (options) {
    var error = options['error'];
    var element = options['element'];
    var location = options['location'];

    if (typeof element == 'function')
        element = element();

    var position = null;
    if (typeof location == 'function') {
        var result = location(element);
        if (result)
            position = result;
    }

    if (position == null)
        position = FormValidation.PlaceErrors.Bottom(element);

    error.appendTo($(element).parent());
    error.css({
        position: "absolute",
        marginLeft: 10,
        marginTop: 1,
        top: position.top
    });
}

// Returns coordinates to the right of the element (for error message location)
FormValidation.PlaceErrors.Right = function( element) {
    var pos = element.position();
    return  { left: pos.left + element.width() + 5, top: pos.top };
}

// Returns coordinates below the element (for error message location)
FormValidation.PlaceErrors.Bottom = function(element) {
    var pos = element.position();
    return { left: pos.left, top: pos.top + element.outerHeight(false) + 10 };
}

// RBOY : please, do not use this method which doesn't necessary makes code clearer
// TODO (RBOY) : this method will be eventually delete.
FormValidation.InitializeRules=function(formSelector, rulesSet) {
    var validator = $(formSelector).validate({
        rules: rulesSet,
        errorPlacement: function(error, element) {
            var pos = element.position();
            var offsLeft = pos.left;
            var offsTop = pos.top + element.outerHeight(false) + 10;
            error.appendTo(element.parent());
            error.css({ position: "absolute",
                marginLeft: 1, marginTop: 1,
                top: offsTop, left: offsLeft
            });
        },
        errorClass: "errorBubble"
    });
}

FormValidation.Validate = function(formSelector) {
    var form = $(formSelector);
    var validator = form.validate();
    var bValid = validator.form();
    return bValid;
}

function ProcessJsonResult(form, result) {
    if (result.Notification) {
        //alert(result.Notification);
        $.saturneoNotification(result.Notification);
    }

    FormValidation.ShowErrors(form, result);

    if (result.ControlMessages) {
        var errorList = [];
        for (var m in result.ControlMessages) {
            var message = result.ControlMessages[m];
            var name = message.ControlName;
            if (name == "") {
                name = "passwordField";
            }
            if (name in errorList) {
                errorList[name] += '<br/>' + message.Message;
            } else {
                errorList[name] = message.Message;
            }
            // TODO - gérer Message.Level
        }
        $(form).validate().showErrors(errorList);
    }
 
    if (result.ControlUpdates) {
        for (var u in result.ControlUpdates) {
            var update = result.ControlUpdates[u];
            if (typeof update.ControlName != 'undefined') {
                var control = $('#' + update.ControlName);
                if (typeof update.Value != 'undefined')
                    control.attr("value", update.Value);
                else if (typeof update.InnerHtml != 'undefined')
                    control.html(update.InnerHtml);
            }
        }
    }
}

