// Prototypes
FormValidator.prototype.Validate					= Validate;
FormValidator.prototype.ValidateBasicDataList		= ValidateBasicDataList;
FormValidator.prototype.ValidateTimeForm			= ValidateTimeForm;
FormValidator.prototype.ValidateDateForm			= ValidateDateForm;
FormValidator.prototype.ValidateSensorDataForm		= ValidateSensorDataForm;
FormValidator.prototype.ValidateEventDataForm		= ValidateEventDataForm;
FormValidator.prototype.ValidateActionDataForm		= ValidateActionDataForm;
FormValidator.prototype.ValidateAlertsForm			= ValidateAlertsForm;
FormValidator.prototype.ValidateLoginForm			= ValidateLoginForm;
FormValidator.prototype.ValidateSearchBar			= ValidateSearchBar;
FormValidator.prototype.ValidateReportForm			= ValidateReportForm;
FormValidator.prototype.ValidatePeriodForm			= ValidatePeriodForm;
FormValidator.prototype.ValidateSensorsList			= ValidateSensorsList;
FormValidator.prototype.ValidateUsersList			= ValidateUsersList;
FormValidator.prototype.ValidateMachinesList		= ValidateMachinesList;
FormValidator.prototype.ValidateTaskPeriodForm		= ValidateTaskPeriodForm;
FormValidator.prototype.ValidateImplementationForm	= ValidateImplementationForm;
FormValidator.prototype.ValidateClientForm			= ValidateClientForm;
FormValidator.prototype.ValidatePeriodForm2			= ValidatePeriodForm2; // End time ins't mandatory
FormValidator.prototype.ValidateMachineForm			= ValidateMachineForm;
FormValidator.prototype.ValidateUserForm			= ValidateUserForm;

// Constructors
function FormValidator(name, type)
{
	this.Type 		= type;
	this.Name		= name;
	this.Text		= "";
}

function FormValidator(name, type, text)
{
	this.Type 		= type;
	this.Name		= name;
	this.Text		= text;
}

// Class Members
function Validate()
{
	switch(this.Type)
	{
		case "BasicDataList":
			return this.ValidateBasicDataList();
		case "SensorsList":
			return this.ValidateSensorsList();
		case "UsersList":
			return this.ValidateUsersList();
		case "MachinesList":
			return this.ValidateMachinesList();
		case "Date":
			return this.ValidateDateForm();
		case "Time":
			return this.ValidateTimeForm();
		case "SensorDataForm":
			return this.ValidateSensorDataForm();
		case "EventDataForm":
			return this.ValidateEventDataForm();
		case "ActionDataForm":
			return this.ValidateActionDataForm();
		case "AlertsForm":
			return this.ValidateAlertsForm();
		case "LoginForm":
			return this.ValidateLoginForm();
		case "SearchBar":
			return this.ValidateSearchBar();
		case "ReportForm":
			return this.ValidateReportForm();
		case "PeriodForm":
			return this.ValidatePeriodForm();
		case "PeriodForm2":
			return this.ValidatePeriodForm2();
		case "TaskPeriodForm":
			return this.ValidateTaskPeriodForm();
		case "ImplementationForm":
			return this.ValidateImplementationForm();
		case "ClientForm":
			return this.ValidateClientForm();
		case "MachineForm":
			return this.ValidateMachineForm();
		case "UserForm":
			return this.ValidateUserForm();
		default:
			break;
	}
	return true;
}

function ValidateUserForm()
{
	success	= true;
	success	= success && ValidateString(this.Name + "_FirstName", "Please enter a first name.");
	success	= success && ValidateString(this.Name + "_LastName", "Please enter a last name.");
	success	= success && ValidateString(this.Name + "_EmailAddress", "Please enter a email.");
	if (document.getElementById(this.Name + "_PhoneNumber").value != "")
		success	= success && ValidatePhoneNumber(this.Name + "_PhoneNumber", "Please enter a valid phone number.");
	success	= success && ValidateString(this.Name + "_UserName", "Please enter a username.");
	success	= success && ValidateString(this.Name + "_Password", "Please enter a password.");
	success	= success && ValidateString(this.Name + "_ConfirmedPassword", "Please confirm the password.");
	if (document.getElementById(this.Name + "_Password").value != document.getElementById(this.Name + "_ConfirmedPassword").value)
	{
		alert("Password and Confirmed password are not the same.");
		return false;
	}
	return success;
}

function ValidateMachineForm()
{
	success	= true;
	success	= success && ValidateString(this.Name + "_SerialNumber", "Please enter a serial number.");
	success	= success && ValidateString(this.Name + "_PhoneNumber", "Please enter a phone number.");
	switch (document.getElementById(this.Name + "_Type").value)
	{
		case "2":
			break;
		default:
			success	= success && ValidateString(this.Name + "_Login", "Please enter a login name.");
			success	= success && ValidateString(this.Name + "_Password", "Please enter a password.");
			success	= success && ValidateString(this.Name + "_ConfirmedPassword", "Please confirm the password.");
			if (document.getElementById(this.Name + "_Password").value != document.getElementById(this.Name + "_ConfirmedPassword").value)
			{
				alert("Password and Confirmed password are not the same.");
				return false;
			}
			priority	= document.getElementById(this.Name + "_Priority").value;
			if (priority.indexOf("2") >= 0)
			{
				return confirm("Caution!!! This option costs! Continue?");
			}
			break;
	}
	return success;
}

function ValidateClientForm()
{
	success	= true;
	success	= success && ValidateString(this.Name + "_Name", "Please enter a name for the client");
	success	= success && ValidateString(this.Name + "_EmailAddress", "Please enter an email for the default user");
	success	= success && ValidateString(this.Name + "_EmailAddress", "Please confirm the email for the default user");
	if (document.getElementById(this.Name + "_EmailAddress").value != document.getElementById(this.Name + "_ConfirmedEmailAddress").value)
	{
		alert("Email Address and Confirmed Email Address are not the same");
		success	= false;
	}
	if (document.getElementById(this.Name + "_Password").value != document.getElementById(this.Name + "_ConfirmedPassword").value)
	{
		alert("Password and Confirmed Password are not the same");
		success	= false;
	}
	return success;
}

function ValidateImplementationForm()
{
	success	= true;
	success	= success && ValidateString(this.Name + "_Description", "Please enter a name for the implementation");
	return success;
}

function ValidateSensorsList()
{
	success	= true;
	success	= success && ValidateString(this.Name + "Sensors_List", this.Text == null ? "Please select at least one sensor" : this.Text);
	return success;
}

function ValidateUsersList()
{
	success	= true;
	success	= success && ValidateString(this.Name + "Users_List", "Please select at least one user");
	return success;
}

function ValidateMachinesList()
{
	success	= true;
	success	= success && ValidateString(this.Name + "Machines_List", "Please select at least one device");
	return success;
}

function ValidateTaskPeriodForm()
{
	success = true;
	success	= success && ValidateString(this.Name + "Name", "Please enter a name for the task.");	
	success = success && ValidateDateTime(this.Name + "_StartTime", "Invalid Start Time");
	switch (document.getElementById(this.Name + "Period").value)
	{
		case "Daily":
			break;
		case "Weekly":
			if (document.getElementById(this.Name + "WeekDaysList").value == "")
			{
					alert("Please select at least one day.");
					return false;
			}
			break;
		case "Monthly":
			break;
	}
	switch (document.getElementById(this.Name + "Task").value)
	{
		case "GenerateReports":
			addresses	= document.getElementById(this.Name + "ReportsForm_Emails");
			if (addresses.value == "Enter email addresses separated by semicolon")
			{
				if (!document.getElementById(this.Name + "ReportsForm_PersonalMail").checked)
				{
					alert("Please select at least one person to receive the email.");
					return false;
				}
				else addresses.value = "";
			}
			break;
	}
	return success;
}

function ValidateReportForm()
{
	success = true;
	showGraphs	= document.getElementById(this.Name + "ShowGraphs");
	if (showGraphs.disabled) showGraphs.selectedIndex	= 0;
	if (document.getElementById(this.Name + "SerialNumber").length == 0)
	{
		alert("Invalid serial number.");
		return false;
	}
	success	= success && ValidateString(this.Name + "SensorsList", "Please select at least one sensor.");	
	return success;
}

function ValidateSearchBar()
{
	success = true;
	success	= success && ValidateString(this.Name + "_SearchText", "Please enter the text to search");
	if (success) location.href	= "../Main/SearchResults.aspx?text=" + document.getElementById(this.Name + "_SearchText").value;
	return false;
}

function ValidateLoginForm()
{
	success = true;
	success	= success && ValidateString(this.Name + "UserName", "Please enter a username.");
	success	= success && ValidateString(this.Name + "Password", "Please enter a password.");
	return success;
}

function ValidateBasicDataList()
{
	success	= true;
	success	= success && ValidateString(this.Name + "HiddenListValue", this.Text);
	return success;
}

function ValidateSensorDataForm()
{
	success	= true;
	success	= success && ValidateString(this.Name + "_Description", "Please insert a description for the sensor");
	success	= success && ValidateFloat(this.Name + "_CalibrationA", "Invalid calibration value (A)");
	success	= success && ValidateFloat(this.Name + "_CalibrationB", "Invalid calibration value (B)");
	success	= success && ValidateFloat(this.Name + "_CalibrationC", "Invalid calibration value (C)");
	success	= success && ValidateFloat(this.Name + "_CalibrationD", "Invalid calibration value (D)");
	success	= success && ValidateFloat(this.Name + "_CalibrationE", "Invalid calibration value (E)");
	return success;
}

function ValidateEventDataForm()
{
	success	= true;
	success	= success && ValidateString(this.Name + "_Description", "Please insert a description for the event");
	switch (document.getElementById(this.Name + "_Type").value)
	{
		case "Sensor":
			switch (document.getElementById(this.Name + "_SelectedEventForm__ComparedValue").value)
			{
				case "Variable":
				case "Trigger":
					if (document.getElementById(this.Name + "_SelectedEventForm__VectorTrigger").checked)
					{
						success	= success && ValidateFloat(this.Name + "_SelectedEventForm__VectorTriggerX", "Invalid trigger value (X)");
						success	= success && ValidateFloat(this.Name + "_SelectedEventForm__VectorTriggerY", "Invalid trigger value (Y)");
					}
					break;
				case "Counter":
				case "Sensor":
					break;
				case "String":
					success	= success && ValidateString(this.Name + "_SelectedEventForm__InputValue", "Please enter an trigger string");
					break;
			}
			break;
		case "Counter":
			switch (document.getElementById(this.Name + "_SelectedEventForm__ComparedValue").value)
			{
				case "Variable":
					break;
				case "Trigger":
					success	= success && ValidateFloat(this.Name + "_SelectedEventForm__InputValue", "Invalid trigger value");
					break;
			}
			break;
		case "Variable":
			switch (document.getElementById(this.Name + "_SelectedEventForm__ComparedValue").value)
			{
				case "Variable":
				case "Counter":
					break;
				case "Trigger":
					success	= success && ValidateFloat(this.Name + "_SelectedEventForm__InputValue", "Invalid trigger value");
					break;
			}
			break;
		case "State":
			break;
		case "Combined":
			break;
	}
	return success;
}

function ValidateActionDataForm()
{
	success	= true;
	success	= success && ValidateFloat(this.Name + "_Relative", "Invalid relative value");
	action	= document.getElementById(this.Name + "_Action");
	switch(parseInt(action.value))
	{
		case ActionTypes.EVENT_MATRIX_LOG_SENSOR:
		case ActionTypes.EVENT_MATRIX_REDUCE_LOGGING:
		case ActionTypes.EVENT_MATRIX_ALARM_LED_SET:
		case ActionTypes.EVENT_MATRIX_ALARM_LED_CLEAR:
		case ActionTypes.EVENT_MATRIX_DIGOUT_SET:
		case ActionTypes.EVENT_MATRIX_DIGOUT_CLEAR:
		case ActionTypes.EVENT_MATRIX_DIGOUT_TOGGLE:
		case ActionTypes.EVENT_MATRIX_FLAG_SET:
		case ActionTypes.EVENT_MATRIX_FLAG_CLEAR:
		case ActionTypes.EVENT_MATRIX_FLAG_TOGGLE:
		case ActionTypes.EVENT_MATRIX_LOG_FLAG:
		case ActionTypes.EVENT_MATRIX_COUNTER_INC:
		case ActionTypes.EVENT_MATRIX_COUNTER_DEC:
		case ActionTypes.EVENT_MATRIX_COUNTER_RESET:
		case ActionTypes.EVENT_MATRIX_LOG_COUNTER:
		case ActionTypes.EVENT_MATRIX_DOWNLOAD_START:
		case ActionTypes.EVENT_MATRIX_DOWNLOAD_ABORT:
		case ActionTypes.EVENT_MATRIX_ASSIGN_VARIABLE:
		case ActionTypes.EVENT_MATRIX_CLEAR_VARIABLE:
		case ActionTypes.EVENT_MATRIX_LOG_VARIABLE:
		case ActionTypes.EVENT_MATRIX_SOCKET_ALARM_SET:
		case ActionTypes.EVENT_MATRIX_SOCKET_ALARM_CLR:
		case ActionTypes.EVENT_MATRIX_SOCKET_STREAM:
		case ActionTypes.EVENT_MATRIX_COUNTER_ASSIGN:
		case ActionTypes.EVENT_MATRIX_VARIABLE_ASSIGN:
			break;
		case ActionTypes.EVENT_MATRIX_SMS:
			success	= success && ValidateString(this.Name + "_OutputText1", "Please insert a phone number");
			success	= success && ValidateString(this.Name + "_OutputText2", "Please insert a text");
			success = success && confirm("Caution!!! This option costs! Continue?");
			break;
		case ActionTypes.EVENT_MATRIX_STREAM:
			success	= success && ValidateString(this.Name + "_OutputText2", "Please insert a text");
			break;
		case ActionTypes.EVENT_MATRIX_EMAIL:
			success	= success && ValidateString(this.Name + "_OutputText1", "Please insert a email address");
			success	= success && ValidateString(this.Name + "_OutputText2", "Please insert a text");
			break;
		case ActionTypes.EVENT_MATRIX_SBD:
			success	= success && ValidateString(this.Name + "_OutputText1", "Please insert a email address");
			success	= success && ValidateString(this.Name + "_OutputText2", "Please insert a text");
			success = success && confirm("Caution!!! This option costs! Continue?");
			break;
		case ActionTypes.EVENT_MATRIX_DATAGRAM:
			success	= success && ValidateString(this.Name + "_OutputText1", "Please insert an ip address with port");
			success	= success && ValidateAddress(this.Name + "_OutputText1", "Invalid Address");
			success	= success && ValidateString(this.Name + "_OutputText2", "Please insert a text");
			break;
		default:
			break;
	}
	return success;
}

function ValidateDateForm()
{
	success	= true;
	success	= success && ValidateDate(this.Name + "StartYear", this.Name + "StartMonth", this.Name + "StartDay", "Invalid date");
	return success;
}

function ValidatePeriodForm()
{
	success	= true;
	success	= success && ValidateDateTime(this.Name + "_StartTime", "Invalid start time");
	success	= success && ValidateDateTime(this.Name + "_EndTime", "Invalid end time");
	try
	{
		startTime1	= document.getElementById(this.Name + "_StartTime").value;
		day			= parseInt(startTime1.substr(0, 2), 10);
		month		= parseInt(startTime1.substr(3, 2), 10);
		year		= parseInt(startTime1.substr(6, 4), 10);
		hour		= parseInt(startTime1.substr(11, 2), 10);
		minute		= parseInt(startTime1.substr(14, 2), 10);
		startTime	= new Date(year, month - 1, day, hour, minute);
		endTime1	= document.getElementById(this.Name + "_EndTime").value;
		day			= parseInt(endTime1.substr(0, 2), 10);
		month		= parseInt(endTime1.substr(3, 2), 10);
		year		= parseInt(endTime1.substr(6, 4), 10);
		hour		= parseInt(endTime1.substr(11, 2), 10);
		minute		= parseInt(endTime1.substr(14, 2), 10);
		endTime		= new Date(year, month - 1, day, hour, minute);
		if (startTime >= endTime) throw "";
	}
	catch (e)
	{
		alert("Invalid time interval");
		return false;
	}
	return success;
}

function ValidatePeriodForm2()
{
	success	= true;
	success	= success && ValidateDateTime(this.Name + "_StartTime", "Invalid start time");
	if (document.getElementById(this.Name + "_EndTime").value != "")
	{
		success	= success && ValidateDateTime(this.Name + "_EndTime", "Invalid end time");
		try
		{
			startTime1	= document.getElementById(this.Name + "_StartTime").value;
			day			= parseInt(startTime1.substr(0, 2), 10);
			month		= parseInt(startTime1.substr(3, 2), 10);
			year		= parseInt(startTime1.substr(6, 4), 10);
			hour		= parseInt(startTime1.substr(11, 2), 10);
			minute		= parseInt(startTime1.substr(14, 2), 10);
			startTime	= new Date(year, month - 1, day, hour, minute);
			endTime1	= document.getElementById(this.Name + "_EndTime").value;
			day			= parseInt(endTime1.substr(0, 2), 10);
			month		= parseInt(endTime1.substr(3, 2), 10);
			year		= parseInt(endTime1.substr(6, 4), 10);
			hour		= parseInt(endTime1.substr(11, 2), 10);
			minute		= parseInt(endTime1.substr(14, 2), 10);
			endTime		= new Date(year, month - 1, day, hour, minute);
			if (startTime >= endTime) throw "";
		}
		catch (e)
		{
			alert("Invalid time interval");
			return false;
		}
	}
	return success;
}

function ValidateTimeForm()
{
	success	= true;
	success	= success && ValidateTime(this.Name + "StartYear", this.Name + "StartMonth", this.Name + "StartDay", this.Name + "StartHour", this.Name + "StartMinute", "Invalid start time");
	success	= success && ValidateTime(this.Name + "EndYear", this.Name + "EndMonth", this.Name + "EndDay", this.Name + "EndHour", this.Name + "EndMinute", "Invalid end time");
	try
	{
		startDate	= new Date(document.getElementById(this.Name + "StartYear").value,
							document.getElementById(this.Name + "StartMonth").value - 1,
							document.getElementById(this.Name + "StartDay").value,
							document.getElementById(this.Name + "StartHour").value,
							document.getElementById(this.Name + "StartMinute").value);
		endDate		= new Date(document.getElementById(this.Name + "EndYear").value,
							document.getElementById(this.Name + "EndMonth").value - 1,
							document.getElementById(this.Name + "EndDay").value,
							document.getElementById(this.Name + "EndHour").value,
							document.getElementById(this.Name + "EndMinute").value);
		if (startDate >= endDate) throw "";
	}
	catch (e)
	{
		alert("Invalid time interval");
		return false;
	}
	return success;
}

function ValidateAlertsForm()
{
	return false;
}

// General functions
function ValidateDateTime(dateTime, message)
{
	try
	{
		time1	= document.getElementById(dateTime).value;
		day		= parseInt(time1.substr(0, 2), 10);
		month	= parseInt(time1.substr(3, 2), 10);
		year	= parseInt(time1.substr(6, 4), 10);
		hour	= parseInt(time1.substr(11, 2), 10);
		minute	= parseInt(time1.substr(14, 2), 10);
		if (time1.substr(2, 1) != '.' || time1.substr(5, 1) != '.' || time1.substr(10, 1) != ' ' || time1.substr(13, 1) != ':') throw message;
		time	= new Date(year, month - 1, day, hour, minute);
		if (time.getDate() != day) throw message;
	}
	catch (e)
	{
		alert(message);
		return false;
	}
	return true;
}

function ValidateDate(yearName, monthName, dayName, message)
{
	try
	{
		date = new Date(document.getElementById(yearName).value,
						document.getElementById(monthName).value - 1,
						document.getElementById(dayName).value);
		if (date.getDate() != document.getElementById(dayName).value) throw message;
	}
	catch (e)
	{
		alert(message);
		return false;
	}
	return true;
}

function ValidateTime(yearName, monthName, dayName, hourName, minuteName, message)
{
	try
	{
		date = new Date(document.getElementById(yearName).value,
						document.getElementById(monthName).value - 1,
						document.getElementById(dayName).value,
						document.getElementById(hourName).value,
						document.getElementById(minuteName).value);
		if (date.getDate() != document.getElementById(dayName).value) throw message;
	}
	catch (e)
	{
		alert(message);
		return false;
	}
	return true;
}

function ValidateInt(name, message)
{
	strVal	= document.getElementById(name).value;
	val		= parseInt(strVal, 10);
	if (strVal != val.toString())
	{
		alert(message);
		return false;
	}
	return true;
}

function ValidateFloat(name, message)
{
	strVal	= document.getElementById(name).value;
	val		= parseFloat(strVal);
	if (strVal != val.toString())
	{
		alert(message);
		return false;
	}
	return true;
}

function ValidateString(name, message)
{
	val	= document.getElementById(name).value;
	if (val == "")
	{
		alert(message);
		return false;
	}
	return true;
}

function ValidatePhoneNumber(name, message)
{
	val	= document.getElementById(name).value;
	reg	= /^([1-9]{1})(\d{8,16})$/;
	if (!reg.test(val))
	{
		alert(message);
		return false;
	}
	return true;
}

function ValidateIP(name, message)
{
	val	= document.getElementById(name).value;
	reg	= /^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3}):(\d{1,7})$/;
	var	ipArray	= val.match(reg);
	if (ipArray == null
		|| (ipArray[1] == 0 && ipArray[2] == 0 && ipArray[3] == 0 && ipArray[4] == 0)
		|| (ipArray[1] == 255 && ipArray[2] == 255 && ipArray[3] == 255 && ipArray[4] == 255))
	{
		alert(message);
		return false;
	}
	for (i = 1; i < 5; i++)
	{
		segment = ipArray[i];
		if (segment > 255)
		{
			alert(message);
			return false;
		}
	}
	return true;
}

function ValidateAddress(name, message)
{
	val	= document.getElementById(name).value;
	reg	= /^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3}):(\d{1,7})$/;
	var	ipArray	= val.match(reg);
	// if no ip match, try to match an URL
	if (ipArray == null)
	{
		reg		= /^[a-zA-Z]([-\w\.]+)+(:\d{1,5})$/; // https?://([-\w\.]+)+(:\d+)?(/([\w/_\.]*(\?\S+)?)?)? sau [A-Za-z]+://[A-Za-z0-9-_]+\\.[A-Za-z0-9-_%&\?\/.=]+
		ipArray	= val.match(reg);
		// if is not a valid URL
		if (ipArray == null)
		{
			alert(message);
			return false;
		}
	}
	else
		// if ip = 0.0.0.0 or 255.255.255.255
		if ((ipArray[1] == 0 && ipArray[2] == 0 && ipArray[3] == 0 && ipArray[4] == 0) || (ipArray[1] == 255 && ipArray[2] == 255 && ipArray[3] == 255 && ipArray[4] == 255))
		{
			alert(message);
			return false;
		}
		for (i = 1; i < 5; i++)
		{
			segment = ipArray[i];
			if (segment > 255)
			{
				alert(message);
				return false;
			}
		}
	
	if (ipArray.length > 0 && ipArray[ipArray.length - 1] > 65535)
	{
		alert(message); alert("Invalid port");
		return false;
	}
	return true;
}