var urlRegex = new RegExp();	urlRegex.compile("^[A-Za-z]+://[A-Za-z0-9-_]+\\.[A-Za-z0-9-~_%\$&\?\/.+=:]+");
var emailRegex = new RegExp(); // /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
    urlRegex.compile("^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$");
var phoneRegex = /^([0-9(\)+\-])+$/; 
var numericRegex  = /^\d+$/;
var toolbarNameRegex = /^[a-zA-Z0-9]{1}[a-zA-Z0-9_\-\\. ']+$/;
var passwordRegex = /^[a-zA-Z0-9]+([\(\)!@#\$%\^&\-=\+`~;"',\._]|[a-zA-Z0-9])+$/;

var Validation =
{
    Email: function(elemValue) {
        return (emailRegex.test(Validation.StringTrim(elemValue)));
    },
    EmailValidator: function(source, args) {
        args.IsValid = Validation.Email(args.Value);
    },
    Url: function(elemValue) {
        return (urlRegex.test(Validation.StringTrim(elemValue))) && (elemValue.length < 2048);
    },
    UrlValidator: function(source, args) {
        args.IsValid = Validation.Url(args.Value);
    },
    IsNumeric: function(elemValue) {
        return numericRegex.test(elemValue);
    },
    NumericValidator: function(source, args) {
        args.IsValid = Validation.IsNumeric(args.Value);
    },
    Phone: function(value) {
        return phoneRegex.test(value);
    },
    PhoneValidator: function(source, args) {
        args.IsValid = Validation.Phone(args.Value);
    },
    ToolbarNameHasToolbar: function(value) {
        return value.toLowerCase().indexOf('toolbar') < 0;
    },
    ToolbarNameHasToolbarValidator: function(source, args) {
        args.IsValid = Validation.ToolbarNameHasToolbar(args.Value);
    },
    ToolbarName: function(value) {
        return toolbarNameRegex.test(value);
    },
    ToolbarNameValidator: function(source, args) {
        args.IsValid = Validation.ToolbarName(args.Value);
    },
    Password: function(value) {
        return passwordRegex.test(value);
    },
    PasswordValidator: function(source, args) {
        args.IsValid = Validation.Password(args.Value);
    },
    PasswordLength: function(value) {
        return (value.length > 5 && value.length < 25);
    },
    PasswordLengthValidator: function(source, args) {
        args.IsValid = Validation.PasswordLength(args.Value);
    },
    ToolbarNameExistValidator: function(source, args) {
        args.IsValid = Validation.IsToolbarNameExists(args.Value);
    },
    ToolbarNameTMValidator: function(source, args) {
        name = args.Value;
        var xmlDoc = Validation.GetToolbarNameTMValidationDoc(name);
        //IsValid value
        args.IsValid = eval(xmlDoc.getElementsByTagName("IsValid")[0].childNodes[0].nodeValue.toLowerCase());
        //default error message
        if (!args.IsValid) { source.innerHTML = xmlDoc.getElementsByTagName("ErrorMessage")[0].childNodes[0].nodeValue; }
    },
    TMValidator: function(source, args) {
        var xmlDoc = WebServices.Call('/ClientServices/ValidationServices.asmx', 'ValidateTMName',
					new Array({ name: 'Text', value: args.Value }), null, null, false);
        args.IsValid = (typeof xmlDoc == "undefined") ? false : (xmlDoc.nodeValue.toLowerCase() == 'true');
    },
    GetToolbarNameTMValidationDoc: function(name) {
        return WebServices.Call('/ClientServices/ValidationServices.asmx', 'ValidateToolbarNameTM',
					new Array({ name: 'Name', value: name }), null, null, false, true);
    },
    LoginValidator: function(source, login, pwd) {
        var xmlDoc = Validation.GetLoginValidatorValidationDoc(login, pwd);
        //IsValid value
        var isValid = eval(xmlDoc.getElementsByTagName("IsValid")[0].childNodes[0].nodeValue.toLowerCase());
        //default error message
        if (!isValid) { source.innerHTML = xmlDoc.getElementsByTagName("ErrorMessage")[0].childNodes[0].nodeValue; }
        return isValid;
    },
    GetLoginValidatorValidationDoc: function(login, pwd) {
        return WebServices.Call('/ClientServices/ValidationServices.asmx', 'ValidateLogin',
					new Array({ name: 'Login', value: login }, { name: 'Password', value: pwd }), null, null, false, true);
    },
    IsToolbarNameExists: function(name) {
        var xmlDoc = WebServices.Call('/ClientServices/ValidationServices.asmx', 'ValidateToolbarName',
					new Array({ name: 'Name', value: name }), null, null, false);
        return (typeof xmlDoc == "undefined") ? false : (xmlDoc.nodeValue.toLowerCase() == 'false');
    },
    SearchEngines: function(uri) {
        var xmlDoc = WebServices.Call('/ClientServices/ValidationServices.asmx', 'ValidateSearchEngine',
					new Array({ name: 'input', value: uri }), null, null, false);
        return (typeof xmlDoc == "undefined") ? false : (xmlDoc.nodeValue.toLowerCase() == 'true');
    },
    StringTrim: function(str) {
        return (!str) ? "" : str.replace(/\s/g, '');
    },
    ValidateNumeric: function(e) {
        var key = e.keyCode || e.which;
        if (key == 8 || key == 9 || key == 46) { return true; }
        if ((Site.SrcElement(e).value.length == 0 && key == 48) || (key < 48 || key > 57)) { return false; }
        return true;
    },
    StringLengthValidator: function(source, args) {
        controlToValidate = document.getElementById(source.controltovalidate);
        minLength = controlToValidate.getAttribute("minValueLength") | 0;
        maxLength = controlToValidate.getAttribute("maxValueLength");
        args.IsValid = args.Value.length >= minLength && args.Value.length <= maxLength;
    }

};
