var validation = {};
validation.debug = false;

validation.message = function (messageFieldId, message) {
	try {
		var thing = document.getElementById(messageFieldId);
		
		var new_text = document.createTextNode(message);
		if (thing.firstChild) {
			thing.replaceChild(new_text, thing.firstChild);
		}
		else {
			thing.appendChild(new_text);
		}		
	}
	catch (e) {
		if (validation.debug) alert("validation.message exception:\nid = " + id + "\nmessage = " + message + "\n" + e.name + "\n" + e.message + "\n" + e);
	}
	return true;
}

validation.highlightLabel = function (validated, label_Id)
{
	if (false == validated)
	{
		document.getElementById(label_Id).style.color =  "#f00";
		document.getElementById(label_Id).style.fontWeight =  'normal';
	}
	else
	{
		document.getElementById(label_Id).style.color =  "";
		document.getElementById(label_Id).style.fontWeight =  'normal';
	}
}

validation.isEmailAddress = function (str)
{
		var toEmailAddress =str;	
		var length = toEmailAddress.length;
		var at = toEmailAddress.indexOf('@');
		var dot = toEmailAddress.lastIndexOf('.');
		var check = length>0 && at>0 && dot>(at+1) && dot<(length-3);
		return check;
}


validation.isNumber = function (str)
{
	if ( (null == str) || (0 == str.length) )
		return false;

	return (!isNaN(parseInt(str)));
	
	//strip out acceptable non-numeric characters
	var stripped = str.replace(/[\(\)\.\-\ ]/g, '');

	for (var i = 0; i < stripped.length; i++)
	{
		if (isNaN(parseInt(stripped.charAt(i))))
			return false;
	}
	
	return true;
}

validation.maxWordsCheck = function (id, message_id, message_text, highlightLabelFlag, label_id, maxWordsAllowed)
{
	var validated = false;
	try
	{
		var item = document.getElementById(id);

		if ("" != item.value)
		{
			var minWords = 1;
			var numOfWords = item.value.split(" ").length;	
			
			if (undefined == maxWordsAllowed)
				maxWordsAllowed = 9999;
					
			if ( (minWords <= numOfWords) && (maxWordsAllowed >= numOfWords) )
				validated = true;
		}
		
		if (true == highlightLabelFlag)
			validation.highlightLabel (validated, label_id);
		
		// Set the message
		if (!validated)
		{
			//alert("failed:\nid = " + id + "\nmessage_id = " + message_id + "\nmessage_text = " + message_text);
			validation.message(message_id, message_text);
		}
		else
		{
			//alert("passed:\nid = " + id + "\nmessage_id = " + message_id + "\nmessage_text = " + message_text);
			validation.message(message_id, "");
		}
	}
	catch (e)
	{
		if (validation.debug) alert("validation.required exception:\nid = " + id + "\nmessage_id = " + message_id + "\nmessage_text = " + message_text + "\n" + e.name + "\n" + e.message + "\n" + e);
	}

	return validated;
}


validation.maxWords = function (id, message_id, message_text, highlightLabelFlag, label_id)
{
	var validated = false;

	try
	{
		var item = document.getElementById(id);

		if ("" != item.value)
		{
			var minWords = 1;
			var maxWords = item.getAttribute("maxWords"); 
			var numOfWords = item.value.split(" ").length;	
			
			if (undefined == maxWords)
				maxWords = 9999;
					
			if ( (minWords <= numOfWords) && (maxWords >= numOfWords) )
				validated = true;
		}
		
		if (true == highlightLabelFlag)
			validation.highlightLabel (validated, label_id);
		
		// Set the message
		if (!validated)
		{
			//alert("failed:\nid = " + id + "\nmessage_id = " + message_id + "\nmessage_text = " + message_text);
			validation.message(message_id, message_text);
		}
		else
		{
			//alert("passed:\nid = " + id + "\nmessage_id = " + message_id + "\nmessage_text = " + message_text);
			validation.message(message_id, "");
		}
	}
	catch (e)
	{
		if (validation.debug) alert("validation.required exception:\nid = " + id + "\nmessage_id = " + message_id + "\nmessage_text = " + message_text + "\n" + e.name + "\n" + e.message + "\n" + e);
	}

	return validated;
}

validation.withinMin = function (id, message_id, message_text, highlightLabelFlag, label_id, min)
{
	var validated = false;

	try
	{		
		var item = document.getElementById(id);
		if (undefined == min)
			min = 0;
					
		if ( (min <= item.value.length)  )
			validated = true;

		if (true == highlightLabelFlag)
			validation.highlightLabel (validated, label_id);
		
		// Set the message
		if (!validated)
		{
			//alert("failed:\nid = " + id + "\nmessage_id = " + message_id + "\nmessage_text = " + message_text);
			validation.message(message_id, message_text);
		}
		else
		{
			//alert("passed:\nid = " + id + "\nmessage_id = " + message_id + "\nmessage_text = " + message_text);
			validation.message(message_id, "");
		}
	}
	catch (e)
	{
		if (validation.debug) alert("validation.required exception:\nid = " + id + "\nmessage_id = " + message_id + "\nmessage_text = " + message_text + "\n" + e.name + "\n" + e.message + "\n" + e);
	}

	return validated;
}

validation.withinMaxMin = function (id, message_id, message_text, highlightLabelFlag, label_id)
{
	var validated = false;

	try
	{
		var item = document.getElementById(id);
		var min = item.getAttribute("min"); 
		var max = item.getAttribute("max");
		
		if (undefined == min)
			min = 0;
			
		if (undefined == max)
			max = 9999;
		
		if ( (min <= item.value.length) && (max >= item.value.length) )
			validated = true;

		if (true == highlightLabelFlag)
			validation.highlightLabel (validated, label_id);
		
		// Set the message
		if (!validated)
		{
			//alert("failed:\nid = " + id + "\nmessage_id = " + message_id + "\nmessage_text = " + message_text);
			validation.message(message_id, message_text);
		}
		else
		{
			//alert("passed:\nid = " + id + "\nmessage_id = " + message_id + "\nmessage_text = " + message_text);
			validation.message(message_id, "");
		}
	}
	catch (e)
	{
		if (validation.debug) alert("validation.required exception:\nid = " + id + "\nmessage_id = " + message_id + "\nmessage_text = " + message_text + "\n" + e.name + "\n" + e.message + "\n" + e);
	}

	return validated;
}

validation.equal = function (id1, id2, message_id, message_text, highlightLabelFlag, label_id1, label_id2)
{
	var validated = false;

	try
	{
		var item1 = document.getElementById(id1);
		var item2 = document.getElementById(id2);
		
		if (item1.value.toLowerCase() == item2.value.toLowerCase())
			validated = true;

		if (true == highlightLabelFlag)
		{
			validation.highlightLabel (validated, label_id1);
			validation.highlightLabel (validated, label_id2);
		}
		
		// Set the message
		if (!validated)
		{
			//alert("failed:\nid = " + id + "\nmessage_id = " + message_id + "\nmessage_text = " + message_text);
			validation.message(message_id, message_text);
		}
		else
		{
			//alert("passed:\nid = " + id + "\nmessage_id = " + message_id + "\nmessage_text = " + message_text);
			validation.message(message_id, "");
		}
	}
	catch (e)
	{
		if (validation.debug) alert("validation.required exception:\nid = " + id + "\nmessage_id = " + message_id + "\nmessage_text = " + message_text + "\n" + e.name + "\n" + e.message + "\n" + e);
	}

	return validated;
}

validation.required = function (id, message_id, message_text, highlightLabelFlag, label_id) {
	var validated = false;
	var regex = new RegExp("[^\\s]+", "m");
	// Get the DOM object
	try {
		var item = document.getElementById(id);
		// Handle text, textarea, hidden
		if (validation.is_text(item)) {
			validated = regex.test(item.value);
		}
		// Handle select
		else if (validation.is_select(item)) {
			validated = regex.test(item.options[item.selectedIndex].value) && regex.test(item.options[item.selectedIndex].innerHTML);
		}
		// Handle radio
		else if (validation.is_radio(item)) {
			// needs to check all the radio buttons in the same group
			var radioGroup = item.getAttribute("name");
			var inputArray = document.getElementsByTagName("input");
			var selectedRadio;
			
			for (var i = 0; i < inputArray.length; i++)
			{
				// first find the radio buttons belonging to the same group
				if (validation.is_radio(inputArray[i]) && (radioGroup == inputArray[i].getAttribute("name")))
				{
					// then check if it is selected
					if (inputArray[i].checked)
						selectedRadio = inputArray[i];
				}
			}

			if (undefined != selectedRadio)
				validated = (selectedRadio.checked && regex.test(selectedRadio.value));
		}
		// Handle checkbox
		else if (validation.is_checkbox(item)) {
			validated = (item.checked && regex.test(item.value));
		}
		// Handle email input fields
		else if (validation.is_email(item))
			validated = validation.isEmailAddress(item.value);
		// Handle number input fields
		else if (validation.is_number(item))
			validated = validation.isNumber(item.value);
		
		if (true == highlightLabelFlag)
			validation.highlightLabel (validated, label_id);

		// Set the message
		if (!validated) {
			//alert("failed:\nid = " + id + "\nmessage_id = " + message_id + "\nmessage_text = " + message_text);
			validation.message(message_id, message_text);
		}
		else {
			//alert("passed:\nid = " + id + "\nmessage_id = " + message_id + "\nmessage_text = " + message_text);
			validation.message(message_id, "");
		}
	}
	catch (e) {
		if (validation.debug) alert("validation.required exception:\nid = " + id + "\nmessage_id = " + message_id + "\nmessage_text = " + message_text + "\n" + e.name + "\n" + e.message + "\n" + e);
	}
	return validated;
}

validation.tag_name = function (dom_object) {
	var tag_name = "";
	try {
		if (dom_object.localName) {
			tag_name = dom_object.localName.toLowerCase();
		}
		else if (dom_object.nodeName) {
			tag_name = dom_object.nodeName.toLowerCase();
		}
	}
	catch (e) {
		if (validation.debug) alert("validation.tag_name exception:\ndom_object = " + dom_object + "\n" + e.name + "\n" + e.message + "\n" + e);
	}
	return tag_name;
}

validation.tag_type = function (dom_object) {
	var tag_type = "";
	try {
		tag_type = dom_object.getAttribute("type").toLowerCase();
	}
	catch (e) {
		if (validation.debug) alert("validation.tag_type exception:\ndom_object = " + dom_object + "\n" + e.name + "\n" + e.message + "\n" + e);
	}
	return tag_type;
}

validation.is_text = function (dom_object) {
	var retval = false;
	try {
		var tag_name = validation.tag_name(dom_object);
		var tag_type = validation.tag_type(dom_object);
		retval = (tag_name == "textarea"
				|| (tag_name == "input" && tag_type == "hidden")
				|| (tag_name == "input" && tag_type == "password")
				|| (tag_name == "input" && tag_type == "text"));
	}
	catch (e) {
		if (validation.debug) alert("validation.is_text exception:\ndom_object = " + dom_object + "\n" + e.name + "\n" + e.message + "\n" + e);
	}
	return retval;
}

validation.is_select = function (dom_object) {
	var retval = false;
	try {
		var tag_name = validation.tag_name(dom_object);
		retval = (tag_name == "select");
	}
	catch (e) {
		if (validation.debug) alert("validation.is_select exception:\ndom_object = " + dom_object + "\n" + e.name + "\n" + e.message + "\n" + e);
	}
	return retval;
}

validation.is_radio = function (dom_object) {
	var retval = false;
	try {
		var tag_name = validation.tag_name(dom_object);
		var tag_type = validation.tag_type(dom_object);
		retval = (tag_name == "input" && tag_type == "radio");
	}
	catch (e) {
		if (validation.debug) alert("validation.is_radio exception:\ndom_object = " + dom_object + "\n" + e.name + "\n" + e.message + "\n" + e);
	}
	return retval;
}

validation.is_checkbox = function (dom_object) {
	var retval = false;
	try {
		var tag_name = validation.tag_name(dom_object);
		var tag_type = validation.tag_type(dom_object);
		retval = (tag_name == "input" && tag_type == "checkbox");
	}
	catch (e) {
		if (validation.debug) alert("validation.is_checkbox exception:\ndom_object = " + dom_object + "\n" + e.name + "\n" + e.message + "\n" + e);
	}
	return retval;
}

validation.is_email = function (dom_object) 
{
	var retval = false;
	try {
		var tag_name = validation.tag_name(dom_object);
		var tag_type = validation.tag_type(dom_object);
		retval = (tag_name == "input" && tag_type == "email");
	}
	catch (e) {
		if (validation.debug) alert("validation.is_email exception:\ndom_object = " + dom_object + "\n" + e.name + "\n" + e.message + "\n" + e);
	}
	return retval;
}

validation.is_number = function (dom_object) 
{
	var retval = false;
	try {
		var tag_name = validation.tag_name(dom_object);
		var tag_type = validation.tag_type(dom_object);
		retval = (tag_name == "input" && tag_type == "number");
	}
	catch (e) {
		if (validation.debug) alert("validation.is_number exception:\ndom_object = " + dom_object + "\n" + e.name + "\n" + e.message + "\n" + e);
	}
	return retval;
}
