Type.registerNamespace("Graph");

Graph.ValidationHighlightExtender = function(element)
{
    Graph.ValidationHighlightExtender.initializeBase(this, [element]);

    this._isValid = null;
    this._ctlSpan = null;
};

Graph.ValidationHighlightExtender.prototype =
{
    initialize: function()
    {
        Graph.ValidationHighlightExtender.callBaseMethod(this, "initialize");

        this._ctlValidator = jQuery("#" + this.get_validatorId());

        if (this._ctlValidator.length > 0)
        {
            var validator = this._ctlValidator[0];
            if (validator.evaluationfunction)
            {
                this._originalValidationMethod = Function.createDelegate(validator, validator.evaluationfunction);
                this._validationMethodOverride = Function.createDelegate(this, this._onvalidate);
                validator.evaluationfunction = this._validationMethodOverride;
            }
        }

        this.applayStyle();
        if (Graph.Errors.FocusedOnFirst == false)
        {
            this.setFocus();
        }
    },

    dispose: function()
    {
        if (this._ctlValidator.length > 0)
        {
            $clearHandlers(this._ctlValidator[0]);
        }

        Graph.ValidationHighlightExtender.callBaseMethod(this, "dispose");
    },

    get_validatorId: function()
    {
        return this._validatorId;
    },

    set_validatorId: function(value)
    {
        this._validatorId = value;
    },

    get_isValid: function()
    {
        return this._isValid;
    },

    set_isValid: function(value)
    {
        if (this._isValid != value)
        {
            this._isValid = value;
        }

        this.applayStyle();
        if (Graph.Errors.FocusedOnFirst == false)
        {
            this.setFocus();
        }
    },

    getSpan: function()
    {
        if (this._ctlSpan == null)
        {
            this._ctlSpan = jQuery(this.get_element());
        }

        return this._ctlSpan;
    },

    getErrorLine: function()
    {
        var parent = this.getSpan().parents("#errorLine:first");
        if (parent.length == 0)
        {
            parent = this.getSpan().parents(".form-line:first");
        }
        return parent;
    },

    getFocusLine: function()
    {
        var parent = parent = this.getSpan().parents("#focusLine:first");
        if (parent.length == 0)
        {
            this.getSpan().parents("#errorLine:first");
        }
        if (parent.length == 0)
        {
            parent = this.getSpan().parents(".form-line:first");
        }
        return parent;
    },

    _onvalidate: function(val)
    {
        var result = this._originalValidationMethod(val);
        this.set_isValid(result);
        return result;
    },

    applayStyle: function()
    {
        if (this.get_isValid())
        {
            this.getErrorLine().removeClass("m-error");
        }
        else
        {
            this.getErrorLine().addClass("m-error");
        }
    },

    setFocus: function()
    {
        if (this.get_isValid() == false)
        {
            var element = this.getFocusLine().find(":input:visible").not(function(index)
            {
                return jQuery(this).css("visibility") == "hidden";
            }).first();

            if (element.length > 0)
            {
                element.select().focus();
                Graph.Errors.FocusedOnFirst = true;
            }
        }
    }
};

Graph.ValidationHighlightExtender.registerClass("Graph.ValidationHighlightExtender", Sys.UI.Behavior);

if (typeof (Sys) != "undefined")
{
    Sys.Application.notifyScriptLoaded();
}


