﻿////////////////////////////// Public Block ////////////////////////////////////////////////////////////////////
function customValidator(validateFunction, control, args) {
    if (typeof (validateFunction) != 'function') {
        throw 'Validatin Function is invalid.'
    }
    if (args) {
        var element = $('#' + control.controltovalidate);
        args.IsValid = validateFunction(element);
        return args.IsValid;
    }
    else {
        if (control)
        {
            var element = $('#' + control.id);
            return validateFunction(element);
        }
    }
}
function validateRequired(control, args) {
    return customValidator(validateRequiredElement, control, args);
}
function validateRequiredConditional(control, isError, args)
{
	if (isError)
	{
        var element = $('#' + control.id);
        setErrorStyle(element);
        return false;
	}
	return customValidator(validateRequiredElement, control, args);
}
function validateRequiredCaptcha(control, captcha, args)
{
	return captcha ?  validateCaptchaAfterSubmit(control, captcha) : customValidator(validateRequiredCaptchaElement, control, args);
}
function validateNumeric(control, args)
{
    return customValidator(validateNumberElement, control, args);
}

function validateEmail(control, args) {
    return customValidator(validateEmailElement, control, args);
}

function validateCaptcha(control, args) {
    customValidator(validateCaptchaElement, control, args);
}

function validateCaptchaAfterSubmit(control, captcha) {
        var element = $('#' + control.id);

        validateRequiredElement(element);

        var serverValidationHasError = $('#' + captcha.id + "> :hidden")[0].value;
        if (serverValidationHasError == 'True') {
        	setErrorStyle(element);
        	element.val(element.attr("emptyValue"));
        } 
}

function onControlFocus(control)
{
    var element = $(control);
    if (element.val() == element.attr("emptyValue")) {
        element.val('');
        element.attr('maxlength', element.attr('defaultmaxlength'));
    }
    setValidStyle(element);
}

function refreshCaptcha(clientId) {
    try {
        element = $('#' + clientId);
        var captchaId = element.attr("id_captcha");
        var isSession = element.attr("is_session") == "1";

        var captcha = $('#' + clientId + " > img")[0];
        var width = $(captcha).attr("width");
        var height = $(captcha).attr("height");

        //captcha.src = "captcha.get?id=00000000-0000-0000-0000-000000000000";
        //captcha.src = "";
        //captcha.src = "/App_Themes/Default/Images/loader.gif";
        
        // nneded for FF
        captcha.src = "/App_Themes/Default/Images/empty_captcha.jpg";
        //$(captcha).attr("width", height);

        captcha.src = invokeGetNewCaptha(captchaId, isSession, width, height);
        //setTimeout($(captcha).attr("width", width), 100);
    }
    catch (e) {
    }
}

////////////////////////////// Internal Block //////////////////////////////////////////////////////////////////
function validateCompare(element) {
    //alert("V Comparer");
    var el = $(element);
    var v1 = el.val();
    var v2 = $("#" + el.attr("comparewith")).val();
    if (v1 == v2 && v1 != "")
    {
        setValidStyle(el);
        return true;
    }
    else {
        setErrorStyle(el);
        return false;
    }
   
}

function validateCompare1(element, element2) {
    //alert("V Comparer");
    var el = $(element);
    var v1 = el.val();
    var v2 = element2.val();
    if (v1 == v2)
    {
    	if (v1 == '')
    	{
    		setDefaultStyle(el);
    		setDefaultStyle($(element2));
    	}
    	else
    	{
    		setValidStyle(el);
    		setValidStyle($(element2));
    	}
        return true;
    }
    else {
        setErrorStyle(el);
        return false;
    }

}


function validateNumberElement(element)
{
    var maxNumber = parseInt( element.attr( "maxNumber" ), 10 );
    var minNumber = parseInt( element.attr( "minNumber" ), 10 );
  
    var original = element.val();
    var value = parseInt(original, 10 );
    
    if(!isNaN(value) && compareWithLeadingZero(original))
    {
        if(  ( value  >=  minNumber ) && ( value <= maxNumber ) )
        {
            setValidStyle( element );
            return true;
        }
    }
    else
    {
        if (original == "") {
            return prepareToDefaultStyle(element, true)
        }
    }

    setErrorStyle( element );
    return false;
}

function validateEmailElement( element )
{
    var original = element.val();
    var reg = new RegExp("^[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+(?:.[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)*@([a-zA-Z0-9]+[.-])+([a-zA-Z]{2,4})$");
//    var reg = new RegExp("^([a-zA-Z0-9-_]*.)+[a-zA-Z0-9-_]+@([a-zA-Z0-9.-_]+[.])*([a-zA-Z]{2,4})$");
    var result = reg.test( original );
    var regArray = original.split( '@' );
    
    if( result && regArray.length == 2 && regArray[0].length <= 64 && regArray[1].length <= 255 )
    {
        setValidStyle( element );
        return true;
    }
    else
    {
        if (original == "" ) {
            return prepareToDefaultStyle(element, true)
        }
    }
    setErrorStyle( element );
    return false;
}

function validateRequiredElement( element ) {
    var original = element.val();
    if (original != "" && original != element.attr("emptyValue") && !isDangerousString(original) && original != "(___) ___-____" )
    {
        setValidStyle( element );
        return true;
    }
    else {
        if (original == "" || original == "(___) ___-____") {
            return prepareToDefaultStyle(element, true)
        }
        setErrorStyle(element);
        return false;
    }
}

function validateRequiredCaptchaElement(element)
{
	var original = element.val();
	if (original != "" && original != element.attr("emptyValue") && !isDangerousString(original) && original != "(___) ___-____")
	{
		setValidStyle(element);
		return true;
	}
	else
	{
		if (original == "" || original == element.attr("emptyValue") || original == "(___) ___-____")
		{
			return prepareToDefaultStyle(element, true)
		}
		setErrorStyle(element);
		return false;
	}
}

function validateCaptchaElement(element) {
    var original = element.val();
    var captchaId;

    try {
        var captchaSrc = element.parent().parent().children()[0].children[0].children[0].src;
        var isSession = false;
        var params = captchaSrc.split('?')[1].split('&');
        captchaId = params[0].split('=')[1];
        if (params.length > 1){
            isSession = params[1].split('=')[0]=='session';
        }
    }
    catch(e) {
    }

    if (original != "" && original != element.attr("emptyValue")
        && !isDangerousString(original)
        && invokeValidateCaptcha(captchaId, isSession, original)) {        
        setValidStyle(element);
        return true;
    }
    else {
        if (original == "") {
            return prepareToDefaultStyle(element, true)
        }
        setErrorStyle(element);
        return false;        
    }
}

function compareWithLeadingZero(val) {
    for (var i = 0; i < val.length; i++) {
        if (!(val.charAt(i) >= '0' && val.charAt(i) <= '9')) {
            return false;
        }
    }

    return true;
}

function prepareToDefaultStyle(element, required) {
    element.attr('defaultmaxlength', element.attr('maxlength'));
    //element.removeAttr('maxlength');
    element.attr("value", element.attr("emptyValue"));
    setDefaultStyle(element);
    return !required;
}

function isDangerousString(value) { 
/*  CrossSiteScriptingValidation
    startingChars = new char[] { '<', '&' };
    internal static bool IsDangerousString(string s, out int matchIndex)
{
    matchIndex = 0;
    int startIndex = 0;
    while (true)
    {
        int num2 = s.IndexOfAny(startingChars, startIndex);
        if (num2 < 0)
        {
            return false;
        }
        if (num2 == (s.Length - 1))
        {
            return false;
        }
        matchIndex = num2;
        char ch = s[num2];
        if (ch != '&')
        {
            if ((ch == '<') && ((IsAtoZ(s[num2 + 1]) || (s[num2 + 1] == '!')) || ((s[num2 + 1] == '/') || (s[num2 + 1] == '?'))))
            {
                return true;
            }
        }
        else if (s[num2 + 1] == '#')
        {
            return true;
        }
        startIndex = num2 + 1;
    }
}*/

    //var reg = new RegExp("<[^>]*>");
    var reg = new RegExp("<[a-zA-Z!/?]+");
    return reg.test(value) || value.indexOf('&#') != -1;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function invokeValidateCaptcha(id, isSession, value) {
    var result = false;
    
    var webServiceURL = "Services/Handlers.asmx/ValidateCaptcha";
    var jsonData = "{'id':'" + id + "', 'isSession':'" + isSession + "', 'value':'" + value + "'}";
    
    getJsonAjaxObject(webServiceURL, jsonData);
    return result;
    
    function getJsonAjaxObject(webServiceURL, jsonData) {
        $.ajax(
            {
                type: "POST",
                contentType: "application/json; charset=utf-8",
                url: webServiceURL,
                data: jsonData,
                async: false,
                success: onSuccess,
                error: onError
            }
        );
    }
    function onSuccess(msg) {
        var object = eval("(" + msg + ")");
        if (object && object.d) {
            result = object.d;
        }
    }

    function onError(XMLHttpRequest, textStatus, errorThrown) {
    }
}

function invokeGetNewCaptha(id, isSession, width, height) {
    var result = "";

    var webServiceURL = "Services/Handlers.asmx/GetNewCaptcha";
    var jsonData = "{'id':'" + id + "', 'isSession':'" + isSession + "', 'width':'" + width + "', 'height':'" + height + "'}";
    getJsonAjaxObject(webServiceURL, jsonData);
    return result;

    function getJsonAjaxObject(webServiceURL, jsonData) {
        $.ajax(
            {
                type: "POST",
                contentType: "application/json; charset=utf-8",
                url: webServiceURL,
                data: jsonData,
                async: false,
                success: onSuccess,
                error: onError
            }
        );
    }
    function onSuccess(msg) {
        var object = eval("(" + msg + ")");
        if (object && object.d) {
            result = object.d;
        }
    }

    function onError(XMLHttpRequest, textStatus, errorThrown) {
    }
}


function validatesubmit(valGroup, lblMessage) {
    var validators = this.Page_Validators;

    var result = true;

    for (var i = 0; i < validators.length; i++)
    {
    	if (valGroup && valGroup != validators[i].validationGroup) continue;
        var el = $("#" + validators[i].controltovalidate);
        if (validators[i].clientvalidationfunction == "validateRequired") {
            if (!validateRequired(validators[i], validators[i])) {
                setErrorStyle(el);
                result = false;
            }
            else {
                setValidStyle(el);
            }
        }
        if (validators[i].clientvalidationfunction == "validateNumeric") {
            if (!validateNumeric(validators[i], validators[i])) {
                setErrorStyle(el);
                result = false;
            }
            else {
                setValidStyle(el);
            }
        }
        if (validators[i].clientvalidationfunction == "validateEmail") {
            if (!validateEmail(validators[i], validators[i])) {
                setErrorStyle(el);
                result = false;
            }
            else {
                setValidStyle(el);
            }
        }
        if (validators[i].clientvalidationfunction == "validateCompare") {
            var el2 = $("#" + el.attr("comparewith"));
            if (!validateCompare(el)) {
                //setErrorStyle(el);
                setErrorStyle(el2);
                result = false;
            }
            else {
                setValidStyle(el);
                setValidStyle(el2);
            }
        }
    }
    if (!result && lblMessage)
    {
    	$('#' + lblMessage).html("Please fill in all required fields").show();
    }
    return result;
}
