var errorColor = "#D30000";
var okColor = "";

/** Validates the form, runs through aElementsToValidate, and checks all the elements for errors (errors are defined by the individual functions) **/
function validateForm()
{	
	var everythingOK = true;
	var errorAlert = "";
	
	for(i in aElementsToValidate)
	{
		var elementError = false;
		var element = aElementsToValidate[i];
		var type = element[1];
		
		if(type == "fckEditor")
		{
			var oEditor = FCKeditorAPI.GetInstance(element[0]);
			/** Resets the backgroundColor to the okColor **/
			oEditor.EditorDocument.body.style.cssText += 'background-color: '+okColor+';' ;
		}
		else if(type != "checkbox")
		{
			var obj = document.getElementById(element[0]);
			/** Resets the borderColor to the okColor **/
			obj.style.borderStyle = "";
			obj.style.borderColor = okColor;
		}
		
		if(type == "text")
		{
			if(!validateText(element))
			{
				elementError = true;
			}
		}
		else if(type == "select")
		{
			if(!validateSelect(element))
			{
				elementError = true;
			}
		}
		else if(type == "fckEditor")
		{
			if(!validateFCKEditor(element))
			{
				elementError = true;
			}
		}
		else if(type == "numeric")
		{
			if(!validateNumeric(element))
			{
				elementError = true;
			}
		}
		else if(type == "numericRange")
		{
			if(!validateNumericRange(element))
			{
				elementError = true;
			}
		}
		else if(type == "email")
		{
			if(!validateEmail(element))
			{
				elementError = true;
			}
		}
		else if(type == "ip")
		{
			if(!validateIP(element))
			{
				elementError = true;
			}
		}
		else if(type == "stringValid")
		{
			if(!validateStringValid(element))
			{
				elementError = true;
			}
		}
		else if(type == "match")
		{
			if(!validateMatch(element))
			{
				elementError = true;
			}
		}
		else if(type == "phone")
		{
			if(!validatePhone(element))
			{
				elementError = true;
			}
		}
		else if(type == "checkbox")
		{
			if(!validateCheckbox(element))
			{
				elementError = true;
			}
		}
		else if(type == "inputLength")
		{
			if(!validateInputLength(element))
			{
				elementError = true;
			}
		}				
		
		/** We show the user where the error was, if any **/
		if(elementError && type == "fckEditor")
		{
			everythingOK = false;
			oEditor.EditorDocument.body.style.cssText += 'background-color: '+errorColor+';' ;			
		}
		else if(elementError && type == "checkbox")
		{
			everythingOK = false;
			errorAlert = element[2][0] + "\n";
			
//			alert(element[2][0]);
		}
		else if(elementError)
		{
			everythingOK = false;
			obj.style.borderStyle = "solid";
			obj.style.borderColor = errorColor;
		}
	}
	
	/** We display an alert box with the errors **/
	if(!everythingOK)
	{
		alert("Indtast venligst korrekt data i de markede røde felter\n"+errorAlert);
	}
	
	return everythingOK;
}

/** Validates the input element to see if text has been entered **/
function validateText(element)
{
	obj = document.getElementById(element[0]);
	
	var everythingOK = true;
	/** If invalidValues haven't been specified we just check the element for no text **/
	if((element[2] == undefined || element[2] == "") && obj.value == "")
	{
		/** If the text amounted to nothing we return false and marks the input box **/
		everythingOK = false;
	}
	
	/** If the invalidValues array contains data, then we check the element against this **/
	if(element[2] != undefined && element[2].length > 0)
	{
		for(x in element[2])
		{
			if(obj.value == element[2][x])
			{
				everythingOK = false;
			}
		}
	}
	
	return everythingOK;
}

/** Validates the input element to see if text has been entered **/
function validateStringValid(element)
{
	obj = document.getElementById(element[0]);
	
	var everythingOK = true;
	
	var value = obj.value;
	
	/** First we check if the element is allowed to be empty **/
	if(element[2] != undefined && element[2][0] != "emptyOK" && value == "")
	{
		everythingOK = false;
	}
	
	/** If the validValues array contains data, then we check the element against this **/
	if(everythingOK && element[3] != undefined && element[3].length > 0)
	{
		for(i=0;i<value.length;i++)
		{
			if(!in_array(value.charAt(i), element[3]))
			{
				everythingOK = false;
			}
		}
	}
	
	return everythingOK;
}

/** Validates the input element to see if the correct numeric values have been entered **/
function validateNumeric(element)
{
	obj = document.getElementById(element[0]);
	
	var everythingOK = true;
	
	/** Checks if the element value is equal to nothing **/
	if(obj.value == "")
	{
		everythingOK = false;
	}
	
	/** Creating the test string **/
	var validChars = "";
	for(x in element[3])
	{
		validChars += element[3][x];
	}
	
	validChars += "0123456789.";
	
	/** Checks if the string contains any char that isn't valid **/
	for (i = 0; i < obj.value.length && everythingOK == true; i++) 
	{ 
		Char = obj.value.charAt(i); 
		if (validChars.indexOf(Char) == -1) 
		{
			everythingOK = false;
		}
	}
	
	return everythingOK;
}

/** Validates the input element to see if the correct numeric ranges have been entered, based on the valid array **/
function validateNumericRange(element)
{
	obj = document.getElementById(element[0]);
	
	var everythingOK = true;
	
	/** Checks if the element value is equal to nothing **/
	if(obj.value == "")
	{
		everythingOK = false;
	}
	
	/** First we check if the input is indeed numeric **/
	
	/** Creating the test string **/
	var validChars = "0123456789";
	
	/** Checks if the string contains any char that isn't valid **/
	for (i = 0; i < obj.value.length && everythingOK == true; i++) 
	{ 
		Char = obj.value.charAt(i); 
		if (validChars.indexOf(Char) == -1) 
		{
			everythingOK = false;
		}
	}
	
	/** If the input was numeric we can now check if it's within the valid range **/
	if(everythingOK)
	{
		for (x in element[3])
		{
			var range = element[3][x].split("-");
			/** We need a range otherwise the creator malformed his variables **/
			if(range.length == 2)
			{
				/** If the input is outside the range, we have an error **/
				if(Number(obj.value) < range[0] || Number(obj.value) > range[1])
				{
					everythingOK = false;
				}
			}
		}
	}
	
	return everythingOK;
}

/** Validates a select box, and checks if any of the given values after the 2nd (1st. id, 2nd type) have been used, thus causing the validation to fail **/
function validateSelect(element)
{
	obj = document.getElementById(element[0]);
	
	var everythingOK = true;
	
	selectedIndex = obj.selectedIndex;
	
	for(x in element[2])
	{
		if(obj.options[selectedIndex].value == element[2][x])
		{
			everythingOK = false;
		}
	}
	
	return everythingOK;
}

/** Validates the FCKEditor to see if text has been entered **/
function validateFCKEditor(element)
{
	
	var oEditor = FCKeditorAPI.GetInstance(element[0]);
	var oDOM = oEditor.EditorDocument;
	var strFCKEditorText = "";
	
	var everythingOK = true;
	
	if (document.all)// If I.E.
	{
		strFCKEditorText = oDOM.body.innerText;
	}
	else
	{
		var r = oDOM.createRange();
		r.selectNodeContents(oDOM.body);
		strFCKEditorText = r.toString();
	}
	
	/** Checks if the text is equal to nothing **/
	if(strFCKEditorText == "")
	{
		/** If the text amounted to nothing we return false **/
		everythingOK = false;
	}
	
	return everythingOK;
	
}

/** Validates the input element, to see if the content is a valid email **/
function validateEmail(element)
{
	
	var email = /^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$/
	
	obj = document.getElementById(element[0]);
	
	var everythingOK = true;
	/** Checks if the content is an email **/
	if(obj.value.search(email) == -1)
	{
		everythingOK = false;
	}
	
	return everythingOK;
}

function validateIP(element)
{
	obj = document.getElementById(element[0]);
	
	var everythingOK = true;
	
	/** If value isn't null **/
	if(obj.value != "")
	{
		var aIps = obj.value.split("-");
		/** We only want one ip or one ip range **/
		if(aIps.length <= 2)
		{
			/** Checks if the content is a valid ip/ip-range **/
			for(x in aIps)
			{
				var ip = aIps[x].split(".");
				/** An IP has 4 number collections **/
				if(ip.length == 4)
				{
					count = 1;
					for(y in ip)
					{
						testValue = Number(ip[y]);
						if(count == 1 && (isNaN(testValue) || testValue > 254 || testValue < 0))
						{
							everythingOK = false;
						}
						else if(isNaN(testValue) || testValue > 255 || testValue < 0)
						{
							everythingOK = false;
						}
						count++;
					}
					
					/** Now we could start checking for all the reserved ips ... **/
					if(Number(ip[0]) == 255 && Number(ip[1]) == 255 && Number(ip[2]) == 255 && Number(ip[3]) == 255)
					{
						everythingOK = false;
					}
				}
				else
				{
					everythingOK = false;
				}
		
			}
			
			/** Checking if the ip-range is valid **/
			if(aIps.length == 2)
			{
				var ip = aIps[0].split(".");
				var ip2 = aIps[1].split(".");
				
				if(ip[0] <= ip2[0])
				{
					if(ip[1] <= ip2[1])
					{
						if(ip[2] <= ip2[2])
						{
							if(ip[3] < ip2[3])
							{
								/** OK **/
							}
							else
							{
								everythingOK = false;
							}
						}						
					}						
				}
			}
				
		}
		else
		{
			everythingOK = false;
		}
	
	}
	else
	{
		everythingOK = false;
	}
	
	return everythingOK;	
}

/** Checks if the value of element[0] matches that of element[2][0] **/
function validateMatch(element)
{
	if(document.getElementById(element[0]).value == document.getElementById(element[2][0]).value)
	{
		return true;
	}
	else
	{
		return false;
	}
}

/** Checks if the value of element[0] is a valid phone nr **/
function validatePhone(element)
{
	obj = document.getElementById(element[0]);
	
	var everythingOK = true;
	
	/** We remove all white spaces **/
	var value = obj.value.replace(/ /g, "");
	
	/** We remove all (+)plus signs **/
	value = value.replace("+", "");
	
	/** We check if the element isn't allowed to be empty and if it's not equal in length to element[2][1] - If so, we have an error **/
	if(element[2][0] != "emptyOK" && (value.length == 0 || value.length > element[2][1]))
	{
		everythingOK = false;
	}
	/** We check if the element is allowed to be empty, but isn't and is neither equal in length to element[2][1] - If so, we have an error **/
	else if (element[2][0] == "emptyOK" && value.length != 0 && value.length > element[2][1])
	{
		everythingOK = false;
	}
	
	/** If we're still ok, then we check if the element value contains any data that it shouldn't (ie. we check it against the valid chars) **/
	if(everythingOK && element[3] != undefined && element[3].length > 0)
	{
		for(i=0;i<value.length;i++)
		{
			if(!in_array(value.charAt(i), element[3]))
			{
				everythingOK = false;
			}
		}
	}
	
	return everythingOK;	
}

/** Validates a checkbox - Checks if it's checked (if checked there's no error) **/
function validateCheckbox(element)
{
	obj = document.getElementById(element[0]);
	
	if(obj.checked == 1)
	{
		return true;
	}
	else
	{
		return false;
	}
}

/** Validates an input element - Checks if the element has the correct amount of chars input **/
function validateInputLength(element)
{
	obj = document.getElementById(element[0]).value;
	
	var number_to_validate = element[2][1];
	
	if(element[2][0] == "emptyOK")
	{
		if(obj.length == 0 || obj.length >= Number(number_to_validate))
		{
			return true;
		}
		else
		{
			return false;
		}
	}
	else if(element[2][0] == "emptyNotOK")
	{
		if(obj.length == 0 || obj.length < Number(number_to_validate))
		{
			return false;
		}
		else
		{
			return true;
		}
	}
}
