﻿function InitCValidator() {
    if (typeof (Page_Validators) != "undefined") {
        $(Page_Validators).each(function() {
            var o = $(this);
            if (o.attr("CV") != undefined) {
                var target = $("#" + o.attr("Target"));
                var sender = this;
                var vfunction = this.clientvalidationfunction;
                var f = function(e) {
                    var key = window.event ? e.keyCode : e.which;
                    if (key == 9) {
                        return;
                    }
                    o.css("visibility", "visible");
                    o.css("color", "");
                    var args = { Value: target.val(), IsValid: true };
                    eval(vfunction + "(sender, args) ;")
                };
                if (target[0].type == "checkbox") {
                    target.click(f);
                }
                else {
                    /* The keyup + change events toghether account for pretty much any
                    * control. Specifically, change is required for drop down lists. */
                    target.keyup(f).change(f);
                }
            }
        })
    }
}


function RegValid(rule, sender, args) {
    var rx = new RegExp(rule.Expression);
    var matches = rx.exec(args.Value);
    args.IsValid = (matches != null && args.Value == matches[0]);

}

function CheckBoxValidator(rule, sender, args) {
    var o = $(sender);
    var target = $("#" + o.attr("Target"));
    args.IsValid = target.attr('checked');   //target[0].checked;

}


function FunctionValid(rule, sender, args) {
    eval(rule.Function + "(rule,sender, args) ;")
}

function MiniLength(rule, sender, args) {
    if (args.Value.length < rule.MiniLength) {
        args.IsValid = false;
    }
}

function GetRules(jsender) {
    var rules;
    eval("rules = " + jsender.attr("Rule"));
    return rules;
}

function InValidMsg(jsender, rule) {
    if (rule.Msg == "") {
        jsender.html("<span>&nbsp;</span>");
    }
    else {
        jsender.html("<span>" + rule.Msg + "</span>");
    }
    jsender.attr("class", "InValidMsg");
    jsender.css("visibility", "visible");
}

function ValidMsg(jsender) {
    jsender.html("<span> </span>");
    jsender.css("visibility", "visible");
    jsender.attr("class", "ValidMsg");
}

function VCheck(sender, args) {
 
    ///Because we cancel ControlToValidator so args value is empty
    var o = $(sender);

    var requiredFunction = o.attr("CIRF");
    if (requiredFunction != undefined) {
        var k = true;
        eval("k=" + requiredFunction + "(sender);");
        if (!k) {
            ValidMsg(o);
            return;
        }
    }
    var target = $("#" + o.attr("Target"));
    args.Value = target.val();
    var rules = GetRules(o);
    for (key in rules) {
        var rule = rules[key];
        if (rule.Type == 1) {
            if (args.Value == "") {
                args.IsValid = false;
                InValidMsg(o, rule);
                break;
            }
        }
        else if (rule.Type == 2) {
            RegValid(rule, sender, args)
            if (!args.IsValid) {
                InValidMsg(o, rule);
                break;
            }
        }
        else if (rule.Type == 3) {
            MiniLength(rule, sender, args)
            if (!args.IsValid) {
                InValidMsg(o, rule);
                break;
            }
        }
        else if (rule.Type == 4) {
            CheckBoxValidator(rule, sender, args)
            if (!args.IsValid) {
                InValidMsg(o, rule);
                break;
            }
        }
        else if (rule.Type == 10) {
            FunctionValid(rule, sender, args)
            if (!args.IsValid) {
                InValidMsg(o, rule);
                break;
            }
        }

    }
    if (args.IsValid) {
        ValidMsg(o);
    }
}


$(document).ready(function() {
    InitCValidator();
})
