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 =  "#ff0000";
		document.getElementById(label_Id).style.fontWeight =  'bold';
	}
	else
	{
		document.getElementById(label_Id).style.color =  "#000000";
		document.getElementById(label_Id).style.fontWeight =  'normal';
	}
}

validation.isEmailAddress = function (str)
{
	var at = "@";
	var dot = ".";

	if (null == str)
		return false;
		
	var lat = str.indexOf(at);
	var lstr = str.length;
	var ldot = str.indexOf(dot);

	// checks if @ or . symbol can be found
	if ( (lat <= 0) || (ldot <= 0) )
		return false;

	// multiple @ symbols
	if ( 2 != (str.split(at)).length )
		return false;

	// TODO: need to do a check to make sure no two dots follow each other, ex: ..com
	// checks if only one . is after @ symbol
	//if ( 2 != ((str.substring(lat, lstr)).split(dot)).length )
	//	return false;

	// checks if . is last value of string
	if (dot == str.charAt(lstr - 1))
		return false;

	// space is found in the email address string
	if (str.indexOf(" ") != -1)
		return false;
		
	return true;
}


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.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);
		}
		// Handle radio
		else if (validation.is_radio(item)) {
			validated = (item.checked && regex.test(item.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 == "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;
}
