
function SmartGetSelectedDate(bdpId, controlType)
{
	if(controlType == "SmartControls.SmartDatePicker")
	{
		var o_date_picker	= document.getElementById(bdpId);
		var o_input			= o_date_picker.firstChild;
		CalendarTextChanged(o_input, o_input.Calendar.Params);
		o_input.Calendar.IsChangTextCalled = true;
		var date			= o_input.Calendar.SelectedDate;
		
		return date;
	}
}

function SmartCompareValidatorEvaluateIsValid(val)
{
	var date1 = SmartGetSelectedDate(val.controltovalidate, val.controltype);
	var value;
	if (date1 == null)value = "";
	else value = (date1.getMonth()+1) + "/" + date1.getDate() + "/" + date1.getFullYear();
	var compareTo = "";
	if (null == document.all[val.controltocompare])
	{
		compareTo = val.valuetocompare;
	}
	else
	{
		var date2 = SmartGetSelectedDate(val.controltocompare, val.controltocomparetype);
		if (date2 == null)compareTo = "";
		else compareTo = (date2.getMonth()+1) + "/" + date2.getDate() + "/" + date2.getFullYear();
	}
	return SmartValidatorCompare(value, compareTo, val.operator, val);
}

function SmartValidatorCompare(operand1, operand2, operator, val)
{
	var dataType = val.type;
	var op1 = ValidatorConvert(operand1, dataType, val);
	var op2 = ValidatorConvert(operand2, dataType, val);
	if(op1 == null && op2 == null || operator == "DataTypeCheck")return true;
	switch (operator)
	{
		case "NotEqual":return (op1 != op2);
		case "GreaterThan":return (op1 > op2);
		case "GreaterThanEqual":return (op1 >= op2);
		case "LessThan":return (op1 < op2);
		case "LessThanEqual":return (op1 <= op2);
		default:return (op1 == op2);
	}
}

function SmartDifferenceValidatorEvaluateIsValid(val)
{
	var date = SmartGetSelectedDate(val.controltovalidate, val.controltype);
	var date2 = SmartGetSelectedDate(val.controltocompare, val.controltocomparetype);
	if(date == null && date2 == null)return true;
	else if(date == null || date2 == null)return false;
	var dayAsMs = 1000 * 60 * 60 * 24;
	var dateAsMs = date.getTime();
	var date2AsMs = date2.getTime();
	var days = Math.round((date2AsMs - dateAsMs)/dayAsMs) + "";
	var compareTo = val.difference;
	return ValidatorCompare(days, compareTo, val.operator, val);
}

function SmartCustomValidatorEvaluateIsValid(val)
{
	var date = SmartGetSelectedDate(val.controltovalidate);
	if(date == null)return true;
	var args =
	{
		Value:date, IsValid:true
	};
	if(typeof(val.clientvalidationfunction) == "string")eval(val.clientvalidationfunction + "(date, args) ;");
	return args.IsValid;
}

function SmartRegularExpressionValidatorEvaluateIsValid(val)
{
	var o_span			= document.getElementById(val.controltovalidate);
	var o_input			= o_span.firstChild;
	var value			= o_input.value;
	if(ValidatorTrim(value).length == 0)return true;
	var rx = new RegExp(val.validationexpression);
	var matches = rx.exec(value);
	return (matches != null && value == matches[0]);
}

function SmartRequiredFieldValidatorEvaluateIsValid(val)
{
	var selectedDate = SmartGetSelectedDate(val.controltovalidate, val.controltype);
	return (!(selectedDate == null));
}

function SmartRangeValidatorEvaluateIsValid(val)
{
	var o_selected_date = SmartGetSelectedDate(val.controltovalidate, val.controltype);	
	if (o_selected_date == null) return true;
	var o_date_picker	= document.getElementById(val.controltovalidate);
	var o_input			= o_date_picker.firstChild;
	var s_value = o_input.Calendar.FormatDate(o_selected_date, "dd/MM/yyyy", o_input.Calendar.aMonthsName, o_input.Calendar.aDayNames, o_input.Calendar.aLongMonthsName, o_input.Calendar.aLongDayNames);
	return (ValidatorCompare(s_value, val.minimumvalue, "GreaterThanEqual", val) && ValidatorCompare(s_value, val.maximumvalue, "LessThanEqual", val));
}

