﻿/// <reference name="MicrosoftAjax.js"/>

Type.registerNamespace("ProActive");

//ValidatorsManager
ProActive.ValidatorsManager = function(element) {

    this._validators = null;
    this._enterSubmitEnabled = true;

    ProActive.ValidatorsManager.initializeBase(this, [element]);
}

ProActive.ValidatorsManager.prototype = {
    get_ValidationGroup: function() {
        return this._validationGroup;
    },
    set_ValidationGroup: function(value) {
        this._validationGroup = value;
    },
    get_EnterSubmitEnabled: function() {
        return this._enterSubmitEnabled;
    },
    set_EnterSubmitEnabled: function(value) {
        this._enterSubmitEnabled = value;
    },
    /* end Properties */

    /* Utils */
    Check: function() {
        var isValid = true;
        var validatedObject = new Array();
        if (this._validators) {
            for (var index = 0; index < this._validators.length; index++) {
                if ($get(this._validators[index].id) && $get(this._validators[index].id).validationGroup == this._validationGroup) {
                    var fieldId = $get(this._validators[index].id).controltovalidate;
                    if (fieldId != "") {
                        var skip = false;
                        for (var key in validatedObject) {
                            if (validatedObject[key].value == false && validatedObject[key].key == fieldId) {
                                skip = true;
                            }
                        }
                        if (skip) {
                            continue;
                        }

                        Array.add(validatedObject, { key: fieldId, value: this._validators[index].isvalid });
                        if (!this._validators[index].isvalid) {
                            isValid = false;
                            if ($get(fieldId)) {
                                if (!Sys.UI.DomElement.containsCssClass($get(fieldId), "req_field")) {
                                    Sys.UI.DomElement.addCssClass($get(fieldId), "req_field")
                                }
                            }
                        }
                        else {
                            if ($get(fieldId)) {
                                if (Sys.UI.DomElement.containsCssClass($get(fieldId), "req_field")) {
                                    Sys.UI.DomElement.removeCssClass($get(fieldId), "req_field")
                                }
                            }
                        }
                    }

                }
            }
        };
    },
    CheckValidatorForField: function(element) {
        this._validators = element.Validators;
        this.Check();
    },
    CheckValidators: function() {
        this._validators = self.Page_Validators;
        this.Check();
    },
    AttachRealTimeModernValidator: function() {
        var validators = self.Page_Validators;
        var isValid = true;
        var validatedObject = new Array();
        if (validators) {
            for (var index = 0; index < validators.length; index++) {
                if ($get(validators[index].id) &&
                    $get(validators[index].id).validationGroup == this._validationGroup) {
                    var skip = false;
                    for (var key in validatedObject) {
                        if (validatedObject[key].key == $get(validators[index].id).controltovalidate) {
                            skip = true;
                        }
                    }
                    if (skip) {
                        continue;
                    }
                    var controlToValidate = $get($get(validators[index].id).controltovalidate);
                    $addHandler(controlToValidate, 'change', function(holder, el) { return function() { holder.CheckValidatorForField(el); } } (this, controlToValidate));
                    if (controlToValidate.tagName != "textarea" && controlToValidate.getAttribute("type") == 'text') {
                        if (this._enterSubmitEnabled) {
                            $addHandler(controlToValidate, 'keypress', this._enterClickedHandler);
                        }
                    }
                    Array.add(validatedObject, { key: $get(validators[index].id).controltovalidate });
                }
            }
        }
    },
    New_Page_ClientValidate: function(group) {
        var result = this._oldPageClientValidate(group);
        this.CheckValidators();
        return result;
    },
    /* end Utils */

    /* Event handlers */
    _onClick: function(event) {
        var event = event || window.event;
        if (typeof Page_ClientValidate == "function") {
            //Page_ClientValidate(this._validationGroup);
        }
        this.CheckValidators();
    },
    _OnEnterClicked: function(e) {
        if (e.charCode != 13) {
            return;
        } else {
            e.preventDefault();
            if (this.get_element().tagName == 'A') {
                this._onClick(e);
            }
            else {
                this.get_element().click();
            }
        }
    },
    /* end Event handlers */

    initialize: function() {
        ProActive.ValidatorsManager.callBaseMethod(this, 'initialize');

        this._clickHandler = Function.createDelegate(this, this._onClick)
        this._enterClickedHandler = Function.createDelegate(this, this._OnEnterClicked);
        $addHandler(this.get_element(), 'click', this._clickHandler);
        this.AttachRealTimeModernValidator();
        this._oldPageClientValidate = Page_ClientValidate;
        Page_ClientValidate = Function.createDelegate(this, this.New_Page_ClientValidate);
    },
    dispose: function() {
        delete this._clickHandler;
        delete this._enterClickedHandler;
        //Add custom dispose actions here
        ProActive.ValidatorsManager.callBaseMethod(this, 'dispose');
    }
}
ProActive.ValidatorsManager.registerClass('ProActive.ValidatorsManager', Sys.UI.Control);

