function ValidateInclusiveDependency(src, args)
{
	var attr = src.attributes["rel"];
	args.IsValid = true;
	if (attr && typeof(attr.nodeValue) != "undefined")
	{
		var obj = $(attr.nodeValue);
		if (obj)
			args.IsValid = !(!ControlValueIsEmpty(obj) && IsEmpty(args.Value));
	}
}
function ValidateInclusiveDependencyDate(src, args)
{
	var attr = src.attributes["rel"];
	args.IsValid = true;
	if (attr && typeof(attr.nodeValue) != "undefined")
	{
		var obj = $(attr.nodeValue);
		if (obj)
		{
			if (!ControlValueIsEmpty(obj))
				DateIsValid(src, args);
		}
	}
}
function ValidateInclusiveDependencyIfNo(src, args)
{
	var attr = src.attributes["rel"];
	args.IsValid = true;
	if (attr && typeof(attr.nodeValue) != "undefined")
	{
		var obj = $(attr.nodeValue);
		if (obj)
		{
			args.IsValid = !( obj.selectedIndex == 2 && IsEmpty(args.Value) );
		}
	}
}
function ValidateInclusiveDependencyIfYes(src, args)
{
	var attr = src.attributes["rel"];
	args.IsValid = true;
	if (attr && typeof(attr.nodeValue) != "undefined")
	{
		var obj = $(attr.nodeValue);
		if (obj)
		{
			args.IsValid = !( obj.selectedIndex == 1 && IsEmpty(args.Value) );
		}
	}
}
function ValidateInclusiveDependencyIfLess12Months(src, args)
{
	/*
	!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
	*/
	var attr = src.attributes["rel"];
	args.IsValid = true;
	if (attr && typeof(attr.nodeValue) != "undefined")
	{
		var obj = $(attr.nodeValue);
		if (obj && CheckDateByObject(obj))
		{
			var ownerYearObj = obj, ownerMonthObj = $(obj.attributes["rev"].nodeValue);
			if (GetDisplayDateStatus(ownerYearObj, ownerMonthObj, 12))
			{
				args.IsValid = !IsEmpty(args.Value);
			}
		}
	}
}
function ValidateInclusiveDependencyDateIfYes(src, args)
{
	var attr = src.attributes["rel"];
	args.IsValid = true;
	if (attr && typeof(attr.nodeValue) != "undefined")
	{
		var obj = $(attr.nodeValue);
		if (obj)
		{
			if (obj.selectedIndex == 1)
				DateIsValid(src, args);
		}
	}
}
function CheckDateByObject(obj)
{
	var attr = obj.attributes["rev"];
	if (attr && typeof(attr.nodeValue) != "undefined")
	{
		var obj1 = $(attr.nodeValue);
		if (obj1)
		{
			return TwoControlsIsValid1(obj, obj1);
		}
	}
}

function ValidateInclusiveDependencyIfValues(src, args)
{

	var attr = src.attributes["rel"];
	args.IsValid = true;
	if (attr && typeof(attr.nodeValue) != "undefined")
	{
		var value = attr.nodeValue;
		var objId = value.substr(0, value.indexOf("="));
		var values = value.substr(objId.length + 1, value.length);
		var obj = $(objId);
		if (obj)
		{
			if (IsValueInList(obj.options[obj.selectedIndex].value, values) && IsEmpty(args.Value))
				args.IsValid = false;
		}
	}
}

function ValidateInclusiveDependencyIfNotValues(src, args)
{
	var attr = src.attributes["rel"];
	args.IsValid = true;
	if (attr && typeof(attr.nodeValue) != "undefined")
	{
		var value = attr.nodeValue;
		var objId = value.substr(0, value.indexOf("="));
		var values = value.substr(objId.length + 1, value.length);
		var obj = $(objId);
		if (obj)
		{
			if (IsValueInList(obj.options[obj.selectedIndex].value, values) && !IsEmpty(args.Value))
				args.IsValid = false;
		}
	}
}

function ValidateInclusiveDependencyDateIfValues(src, args)
{
	var attr = src.attributes["rel"];
	args.IsValid = true;
	if (attr && typeof(attr.nodeValue) != "undefined")
	{
		var value = attr.nodeValue;
		var objId = value.substr(0, value.indexOf("="));
		var values = value.substr(objId.length + 1, value.length);
		var obj = $(objId);
		if (obj)
		{
			if (IsValueInList(obj.options[obj.selectedIndex].value, values) && IsEmpty(args.Value))
				args.IsValid = false;
		}
	}
}
function IsValueInList(value, listStr)
{
	var list = listStr.split("|");
	for (var i = 0; i < list.length; i++)
		if (value == list[i])
			return true;
	return false;
}
function TwoControlsIsValid(src, args)
{
	var attr = src.attributes["rev"];
	args.IsValid = true;
	if (attr && typeof(attr.nodeValue) != "undefined")
	{
		var obj = $(attr.nodeValue);
		if (obj)
		{
			args.IsValid = !(ControlValueIsEmpty(obj) || IsEmpty(args.Value));
		}
	}
}
function TwoControlsIsValid1(obj1, obj2)
{
	return !ControlValueIsEmpty(obj1) && !ControlValueIsEmpty(obj2);
}

//for two-textboxes control
function ValidateSSN(src, args)
{
	var attr = src.attributes["rel"];
	args.IsValid = true;
	if (attr && typeof(attr.nodeValue) != "undefined")
	{
		var obj = $(attr.nodeValue);
		if (obj)
		{
			args.IsValid = Mod11VerifySSN(args.Value + obj.value) && IsPerson18YearsOld(args.Value);
		}
	}
}

//for two-textboxes control
function Validate2SSN(src, args)
{
	var attr = src.attributes["rel"];
	args.IsValid = true;
	if (attr && typeof(attr.nodeValue) != "undefined")
	{
		var obj = $(attr.nodeValue);
		if (obj)
		{
			var thisValue = args.Value + obj.value;
			var attr1 = src.attributes["rev"];
			if (attr1 && typeof(attr1.nodeValue) != "undefined")
			{
				var controls = attr1.nodeValue.split("|");
				var obj1 = $(controls[0]), obj2 = $(controls[1]);
				if (obj1 && obj2)
					args.IsValid = thisValue != (obj1.value + obj2.value);
			}
		}
	}
}

//for two-textboxes control
function ValidateSSNIsEmpty(src, args)
{
	var attr = src.attributes["rel"];
	args.IsValid = true;
	if (attr && typeof(attr.nodeValue) != "undefined")
	{
		var obj = $(attr.nodeValue);
		if (obj)
		{
			args.IsValid = !(IsEmpty(args.Value) || ControlValueIsEmpty(obj));
		}
	}
}

//for one-textbox control
function n_ValidateSSN(src, args)
{
	args.IsValid = true;
	args.IsValid = Mod11VerifySSN(args.Value) && IsPerson18YearsOld(args.Value);
}
//for one-textbox control
function n_ValidateSSNNorwegian(src, args)
{
	args.IsValid = true;
	args.IsValid = Mod11VerifySSNNorwegian(args.Value) && IsPerson18YearsOld(args.Value);
}
//for one-textbox control
function n_Validate2SSN(src, args)
{
	args.IsValid = true;
	var thisValue = args.Value;
	var attr = src.attributes["rev"];
	if (attr && typeof(attr.nodeValue) != "undefined")
		args.IsValid = thisValue != $(attr.nodeValue).value;
}
function Mod11VerifySSN(ssn)
{
	if (ssn.length != 10) return false;
	var cv = [ 4, 3, 2, 7, 6, 5, 4, 3, 2, 1 ];
	var sum = 0;
	for (var i = 0; i < 10; i++)
	{
		sum += parseInt(ssn.charAt(i)) * cv[i];
	}
	return (sum % 11) == 0;
}
function Mod11VerifySSNNorwegian(ssn)
{
	if (ssn.length != 11) return false;
	var firstCheckDigit = parseInt(ssn.charAt(9)), secondCheckDigit = parseInt(ssn.charAt(10));
	var cv1 = [ 3, 7, 6, 1, 8, 9, 4, 5, 2, 0 ];
	var cv2 = [ 5, 4, 3, 2, 7, 6, 5, 4, 3, 2 ];
	var sum1 = 0;
	var sum2 = 0;
	for (var i = 0; i < 10; i++)
	{
		sum1 += parseInt(ssn.charAt(i)) * cv1[i];
		sum2 += parseInt(ssn.charAt(i)) * cv2[i];
	}

	var firstCheckDigitCalculated = 11 - (sum1 % 11);
	var secondCheckDigitCalculated = 11 - (sum2 % 11);
	
	/* Invalid SSN if we get 10 as weighted mod11. */
	if (firstCheckDigitCalculated == 10 || secondCheckDigitCalculated == 10)
    {
        return false;
    }
    
    /* Weighted mod11 value is 0 if it's calculated to 11. */
    if (firstCheckDigitCalculated == 11)
    {
        firstCheckDigitCalculated = 0;
    }
    if (secondCheckDigitCalculated == 11)
    {
        secondCheckDigitCalculated = 0;
    }
	return firstCheckDigit == firstCheckDigitCalculated && secondCheckDigit == secondCheckDigitCalculated;
}
function IsPerson18YearsOld(src)
{
	var year, month, day;
	try
	{
		day = src.substr(0, 2);
		month = src.substr(2, 2);
		year = parseInt(src.substr(4, 2));
		if (year < 20)
			year += 2018;
		else
			year += 1918;
		var app = new Date(month + "/" + day + "/" + year);
		return app <= new Date();
	}
	catch(e)
	{
		return false;
	}
}

function ValidateCheckBoxList(src, args)
{
	var attr = src.attributes["rel"];
	if (attr)
	{
		var obj = $(attr.nodeValue);
		if (obj);
		{
			//assume that all child controls are type of "check"
			var checked = false;
			var inputs = obj.getElementsByTagName("input");
			for (var i = 0; i < inputs.length; i++)
				checked = checked || inputs[i].checked;
			args.IsValid = checked;
		}
	}
}

function DateIsValid(src, args)
{
	TwoControlsIsValid(src, args);
}

function ValidateNonInclusiveDependency(src, args)
{
	var attr = src.attributes["rel"];
	var values = attr.nodeValue.split("|");
	args.IsValid = true;
	for (var i = 0; i < values.length; i++)
	{
	    if ($(values[i]) && typeof($(values[i]).nodeValue) != "undefined")
    	{
		    var obj = $(values[i]);
	    	if (obj)
    		{
		    	args.IsValid = !ControlValueIsEmpty(obj) || !IsEmpty(args.Value);
		    	if (args.IsValid)
		    	{
		    	    return;
		    	}
	    	}
    	}
	}
}

function ValidateLoanAmountRange(src, args)
{
	args.IsValid = true;
	if (IsEmpty(args.Value))
		return;
	var result = parseInt(args.Value);
	if (!isNaN(result))
		args.IsValid = result >= minLoanAmount && result <= maxLoanAmount;
}

function ControlValueIsEmpty(obj)
{
	switch(obj.tagName.toLowerCase())
	{
		case "select":
			return IsEmpty(obj.options[obj.selectedIndex].value);
			break;
		case "input":
			return IsEmpty(obj.value);
			break;
		default:
			return true;
	}
}
function IsEmpty(value)
{
    if (typeof(value) == "undefined")
    {
        return true;
    }
	var result = value.match(/^\s*(\S+(\s+\S+)*)\s*$/);
	return (result == null) ? true : false;
}
var myPageValidators;
function ValidateAllGroups()
{
	var results = [];
	var result = true;
	myPageValidators = [];
	for (var i = 0; i < Page_Validators.length; i++)
		myPageValidators[i] = Page_Validators[i].isvalid;
	for (var i = 0; i < Page_ValidationSummaries.length; i++)
	{
		results[i] = Page_ClientValidate(Page_ValidationSummaries[i].validationGroup);
		result = result && results[i];
		UpdateValidators();
	}
	for (var i = 0; i < Page_ValidationSummaries.length; i++)
	{
		if (!results[i])
			Page_ValidationSummaries[i].style.display = "block";
	}
	UpdateValidatorsDisplay();
	Page_BlockSubmit = !result;
}
function UpdateValidators()
{
	for (var i = 0; i < myPageValidators.length; i++)
		myPageValidators[i] = myPageValidators[i] && Page_Validators[i].isvalid;
}
function UpdateValidatorsDisplay()
{
	for (var i = 0; i < myPageValidators.length; i++)
	{
		Page_Validators[i].parentNode.className = "normal";
	}
	for (var i = 0; i < myPageValidators.length; i++)
	{
		if (!myPageValidators[i])
			Page_Validators[i].parentNode.className = "cell_with_error";
	}
}
function InitValidateAllButton(id)
{
	var obj = $(id);
	if (obj)
	{
		AddEventListener(obj, "click", function()
		{
			ValidateAllGroups();
		});
	}
}

function RegisterOnChangeControl(id)
{
	var obj = $(id);
	if (obj)
	{
		if (typeof(obj.OnChangeHandlerSet) == "undefined")
		{
			obj.onchange = function()
			{
                GlobalOnChange();
			}
			obj.OnChangeHandlerSet = true;
			
		}
	}
}



function InitOwnerControl(id, targetId, condition, inverseCondition)
{
	var obj = $(id);
	if (obj)
	{
		var data = {ControlId:targetId, Condition: condition, InverseCondition: inverseCondition};
		if (typeof(obj.OnChangeHandlerSet) == "undefined")
		{
			obj.dependentControls = new Array();
			obj.onchange = function()
			{
				for (var i = 0; i < this.dependentControls.length; i++)
				{
					var displayStatus = GetDisplayStatus(this, this.dependentControls[i].Condition);
					if (this.dependentControls[i].InverseCondition)
						displayStatus = !displayStatus;
					if (!displayStatus)
						ClearTableRowControls($(this.dependentControls[i].ControlId));
					SetObjDisplayStatus($(this.dependentControls[i].ControlId), displayStatus);
				}
			}
			obj.OnChangeHandlerSet = true;
		}
		obj.dependentControls[obj.dependentControls.length] = data;
	}
}
function InitOwnerDateControl(yearId, monthId, targetId, condition, inverseCondition)
{
	var obj1 = $(yearId);
	var obj2 = $(monthId);
	if (obj1 && obj2)
	{
		var data = {ControlId:targetId, Condition: condition, InverseCondition: inverseCondition};
		if (typeof(obj1.OnChangeHandlerSet) == "undefined")
		{
			obj1.controlType = "year";
			obj2.controlType = "month";
			
			obj1.monthControl = obj2;
			obj2.yearControl = obj1;
			
			obj1.dependentControls = new Array();
			obj1.onchange = function()
			{
				var dependentControls = this.controlType == "year" ? this.dependentControls : this.yearControl.dependentControls;
				for (var i = 0; i < dependentControls.length; i++)
				{
					var yearObj = this.controlType == "year" ? this : this.yearControl;
					var monthObj = this.controlType == "year" ? this.monthControl : this;
					var displayStatus = GetDisplayDateStatus(yearObj, monthObj, dependentControls[i].Condition);
					if (this.dependentControls[i].InverseCondition)
						displayStatus = !displayStatus;
					if (!displayStatus)
					 
						ClearTableRowControls($(dependentControls[i].ControlId));
					SetObjDisplayStatus($(dependentControls[i].ControlId), displayStatus);
				}
			}
			obj1.OnChangeHandlerSet = true;
			obj2.onchange = obj1.onchange;
		}
		obj1.dependentControls[obj1.dependentControls.length] = data;
	}
}

function GetDisplayStatus(ownerObj, condition)
{
	if (condition == "" && !ControlValueIsEmpty(ownerObj))
		return true;
	else if (condition == "" && ControlValueIsEmpty(ownerObj))
		return false;
	
	return eval(condition);	
}


function GetDisplayStatusold(ownerObj, condition)
{
	if (condition == "" && !ControlValueIsEmpty(ownerObj))
		return true;
	else if (condition == "" && ControlValueIsEmpty(ownerObj))
		return false;
	
	var values = condition.split("|");
	var value = GetControlValue(ownerObj);
	for (var i = 0; i < values.length; i++)
	{
		if (value == values[i])
			return true;
	}
	return false;
}

function GetDisplayDateStatus(ownerYearObj, ownerMonthObj, condition)
{
	if (ownerYearObj.selectedIndex == 0 || ownerMonthObj.selectedIndex == 0)
		return false;
	//condition = amount of months
	var year = parseInt(GetControlValue(ownerYearObj));
	var month = ownerMonthObj.selectedIndex;
	var monthCondition = parseInt(condition);
	
	var today = new Date();
	var todayYear = today.getFullYear();
	var todayMonth = today.getMonth() + 1;
	return ((year * 12) + month + monthCondition) >= (todayYear * 12 + todayMonth);
}
function SetObjDisplayStatus(obj, status) {
//HACK:  NULL (expert)
    if (!obj)
        return;

    if (!status) 
    {
        ClearTableRowControls(obj);
    }   
	obj.className = status ? "trShow" : "trHide";
}
function GetControlValue(obj) {
    try {
        switch (obj.tagName.toLowerCase()) {
            case "select":
                var attr = obj.attributes["rev"];
                if (attr && typeof (attr.nodeValue) != "undefined") {
                    var obj1 = $(attr.nodeValue);
                    if (obj1) {
                        if (obj.options[obj.selectedIndex].value + '' == '' || obj1.options[obj1.selectedIndex].value + '' == '') {
                            return '';
                        }
                        else {
                            return (obj.options[obj.selectedIndex].value + '') + (obj1.options[obj1.selectedIndex].value + '')
                        }
                    }
                    else {
                        return obj.options[obj.selectedIndex].value + '';
                    }
                }
                else {
                    return obj.options[obj.selectedIndex].value + '';
                }
            case "input":
                return obj.value + '';
            case "table":
                var inputs = obj.getElementsByTagName("input");

                for (var i = 0; i < inputs.length; i++) {

                    switch (inputs[i].type) {
                        case "radio":
                            if (inputs[i].checked) {
                                return inputs[i].value + '';
                            }
                            break;
                        case "checkbox":
                            if (inputs.length == 1) {
                                return inputs[i].checked + '';
                            }
                            break;
                    }
                }
            default:
                return "";
        }
    }

    catch (err)
	{ }	
}
function ClearTableRowControls(trObj) {
//HACK: NULL (expert)
    if (!trObj)
        return;
    
	var inputs = trObj.getElementsByTagName("input");
	var dropdowns = trObj.getElementsByTagName("select");
	var defaultValue1;
	
	for (var i = 0; i < inputs.length; i++)
	{
	    switch(inputs[i].type.toLowerCase())
	    {
	        case "text":
	            defaultValue1 =  inputs[i].attributes["DefaultValue"];

	            if (defaultValue1 && typeof(defaultValue1.nodeValue) != "undefined")
	            {
	                inputs[i].value = defaultValue1.nodeValue;
	            }
	            else
	            {
	                inputs[i].value = "";
	            }
	            break;
	        case "radio":
	             defaultValue1 =  inputs[i].attributes["DefaultValue"];

	            if (defaultValue1 && typeof(defaultValue1.nodeValue) != "undefined")
	            {
	                if (defaultValue1.nodeValue == inputs[i].value +'')
	                {
	                    inputs[i].checked = true;
	                }
	                else
	                {
	                    inputs[i].checked = false;
	                }
	            }
	            else
	            {
	                inputs[i].checked = false;
	            }
	        
	           
	            break;
	        case "check":
	            defaultValue1 =  inputs[i].attributes["DefaultValue"];

	            if (defaultValue1 && typeof(defaultValue1.nodeValue) != "undefined")
	            {
	                if (defaultValue1.nodeValue == inputs[i].value +'')
	                {
	                    inputs[i].checked = true;
	                }
	                else
	                {
	                    inputs[i].checked = false;
	                }
	            }
	            else
	            {
	                inputs[i].checked = false;
	            }
	            break;
	    }
	}
	for (var i = 0; i < dropdowns.length; i++)
	{
	    dropdowns[i].selectedIndex = 0;
	    for (var j = 0; j < dropdowns[i].options.length; j++)
	    {
	        defaultValue1 =   dropdowns[i].attributes["DefaultValue"];

	        if (defaultValue1 && typeof(defaultValue1.nodeValue) != "undefined")
	        {
	            if (defaultValue1.nodeValue == dropdowns[i].options[j].value +'')
	            {
		            dropdowns[i].selectedIndex = j;
		        }
		    }  
	    }
    }
}
function ClearControlValue(obj)
{
	switch(obj.tagName.toLowerCase())
	{
		case "select":
			obj.selectedIndex = 0;
			break;
		case "input":
			obj.value = "";
			break;
	}
}
