//Neppa:
//(weiter unten: neue Merlin-Version)
var Verify = Class.create();

Verify.prototype = {
    initialize: function(element, method) {
        var defaults = {
            url: '/lib/verify.php',
            method: method,
            class_success: 'verify_success',
            class_failure: 'verify_failure',
            nameing: 'append',
            name_append: '_error',
            name_prepend: ''
        };
        this.options = Object.extend(defaults, arguments[2] || {});

        this.element  = $(element);

        if (typeof this.element != "object") {
            alert("Es wurde kein Formular mit der ID " + element + " gefunden");
            return false;
        }

        var tmpArray = Element.descendants(this.element);

        if (tmpArray.length < 1) {
            alert("Es wurden keine Eingabefelder in dem Formular gefunden");
            return false;
        } else {
            this.inputElements = new Array();
            for (var i=0; i<tmpArray.length; i++) {
                var tmpElement = tmpArray[i];
                switch (tmpElement.tagName.toLowerCase()) {
                    case "input":
                        if (tmpElement.type != "hidden") {
                            this.inputElements.push(tmpElement);
                        }
                    break;
                    case "textarea":
                    case "select":
                        this.inputElements.push(tmpElement);
                    break;
                }
            }
        }

        this.eventSubmit  = this.formSubmitted.bindAsEventListener(this);
        Event.observe(this.element, "submit", this.eventSubmit);
    },

    formSubmitted: function(event) {

        var parameter = Object.extend(this.element.serialize(true), {method:this.options.method});
        this.element.disable();

        new Ajax.Request(this.options.url, {
            method:'post',
            parameters:parameter,
            onComplete:function(transport, answer) {
                this.element.enable();

                if (answer == null) {
                    alert("500 Internal Server Error: Invalid JSON");
                    return false;
                }
                if (answer.error) {
                    alert("500 Internal Server Error: Invalid function call");
                } else {
                    if (answer.success) {
                        this.element.submit();
                    } else {
                        var tmpValues = answer.values;
                        for (var key in tmpValues) {
                            if (typeof tmpValues[key] == "object") {
                                var item = tmpValues[key];

                                var tmpName = (this.options.nameing == "prepend") ? this.options.name_prepend : "";
                                tmpName += key;
                                tmpName += (this.options.nameing == "append") ? this.options.name_append : "";
                                var tmpErrorElement = $(tmpName);

                                if (item.error === true) {
                                    if (tmpErrorElement) {
                                        tmpErrorElement.innerHTML = item.errorMessage;
                                        tmpErrorElement.show();
                                    } else {
                                        new Insertion.After(key, '<div id="'+tmpName+'" style="display:block; color:red; font-weight:bold;">'+item.errorMessage+'</div>');
                                    }
                                    if ($(key)) {
                                        Element.addClassName(key, this.options.class_failure);
                                        Element.removeClassName(key, this.options.class_success);
                                    }
                                } else {
                                    if (tmpErrorElement) {
                                        tmpErrorElement.hide();
                                    }
                                    if ($(key)) {
                                        Element.addClassName(key, this.options.class_success);
                                        Element.removeClassName(key, this.options.class_failure);
                                    }
                                }

                            }
                        }
                    }
                }
            }.bind(this)
        });
    }
}

//NEU IN MERLIN:
//(muss noch weiter generalisiert werden:)
var DoolaoDisplayErrors = Class.create({
    map: null,

    initialize: function(map) {
        this.map = map;
    },

    displayErrors: function(errors) {
        this.verified = true;


        errors.each(function(element) {
            var field = element.key;

            if (!Object.isUndefined(this.map[field])) {
                field = this.map[field];
            }

            if ($(field + '_error')) {
                $(field + '_error').update('');
            }
        }.bind(this));

        this.showError = {};

        errors.each(function(element) {
            var field = element.key;
            var error = element.value;

            if (Object.isUndefined(this.map[field])) {
                var errorElement = $(field + '_error');

                var mapped = false;
            } else {
                var errorElement = $(this.map[field] + '_error');

                field = this.map[field];

                var mapped = true;
            }

            if (error.verified && Object.isUndefined(this.showError[field])) {
                if (errorElement) {
                    errorElement.update('');
                    errorElement.hide();
                }

                return;
            }

            if (!$(field)) {
                return;
            }

            if (error.messages.length < 1) {
                return;
            }

            if (mapped) {
                this.showError[field] = true;
            }

            if (!errorElement) {
                $(field).insert({after: new Element('div', { id: field + '_error', 'class': 'form_error_messages'})});
                $(field).insert({after: new Element('br', { 'class': 'clearboth'})});
                errorElement = $(field + '_error');
            }

            var message = errorElement.innerHTML;
            for (var i=0; i<error.messages.length; ++i) {
                message += error.messages[i]  + '<br />';
            }

            errorElement.update(message).show();

            this.verified = false;
        }.bind(this));

        return this.verified;
    }
});