
/****************************
 Confirm the Presence of Values in Form Fields
 Version: 1.2
 Change Date: 2006-05-16 (YYYY-MM-DD)
 
 How it works:
 1) loops through all <span.required> tags in a <form>
 2) checks to see if <span.required> child <input, textarea, or select> fields have values
 3) if <span.required> has a daughter <span.( email|number|currency|date|year|phone )>
      check to see if the daughter type validates
 4) alerts the value of <input title="blah"> to the user.
 5) returns false
 
 Use:
 	<form onsubmit="return IFs.formvalidate(this);">
		<span class="required">
			<input type="whatever" title="Helpful message">                          <- value is required
		</span>
		<span class="required">
			<span class="date"><input type="text" title="Helpful message"></span>    <- valid date (00/00/0000) is required
		</span>
		<span class="required">
			<span class="phone"><input type="text" title="Helpful message"></span>   < 
			<span class="email"><input type="text" title="Helpful message"></span>   <- any one of 3 is required, valid phone or email is checked
			<input type="whatever" title="Helpful message">                          < 
		</span>
		<input type="whatever">                                                    <- not required
		<input type="whatever">                                                    <- not required
		<input type="submit">
	</form>
	<script type="text/javascript" src="IFscript.formvalidate.js"></script>

 Returns: true or false and alerts the tile of the erroneous form field
****************************/

// Take care of any features used by this function
if (!IFs) var IFs = new Array();
if (!IFs.global) IFs.global = new Array();
if (!IFs.global.dbo) IFs.global.dbo = new Array();

// Create 
IFs.formvalidateParams = new Array();
IFs.formvalidateParams.reqClassName = 'required';

IFs.formvalidate = function(domLocator)
{
	// Alert the funciton has started:
	IFs.global.dbo.value = 'IFs.formvalidate()\n	form id="' +domLocator.id+ '"\n';


	// Find all spans in <form>
	var childSpans = domLocator.getElementsByTagName('SPAN');
	IFs.global.dbo.value += 'total <span> =' + childSpans.length +'\n';


	// identify spans.required
	var reqSpans = new Array();
	for (var i = 0; i < childSpans.length; i++)
	{
		if (childSpans[i].className == IFs.formvalidateParams.reqClassName) reqSpans.push(childSpans[i]);
	}
	IFs.global.dbo.value += 'total <spans.required> =' + reqSpans.length +'\n';


	// for each <span.required> do this
	for (var i = 0; i < reqSpans.length; i++)
	{
		IFs.global.dbo.value += 'reqSpans[' + i + ']';
		
		// set a pass/fail check variable (for this <span> only)
		IFs.formvalidateParams.isOK = 0;
		IFs.formvalidateParams.alertMsg = 0;
		
		// for each child <input>
		for ( var j = 0; j < reqSpans[i].getElementsByTagName('INPUT').length; j++)
		{
			IFs.global.dbo.value += '\n	.gebtn("INPUT")['+j+']';
			// if it's a text-type of field, do this
			if ( (reqSpans[i].getElementsByTagName('INPUT')[j].type == 'text') || (reqSpans[i].getElementsByTagName('INPUT')[j].type == 'password') || (reqSpans[i].getElementsByTagName('INPUT')[j].type == 'file') )
			{
				IFs.global.dbo.value += '.type="' + reqSpans[i].getElementsByTagName('INPUT')[j].type + '"';
				IFs.global.dbo.value += ', .value="' + reqSpans[i].getElementsByTagName('INPUT')[j].value + '"';

				// add findings to reqSpans[i] pass/fail check variable
				// if there is a value
				if (reqSpans[i].getElementsByTagName('INPUT')[j].value)
				{
					// check value for correct formatting
					if (IFs.formvalidateType( reqSpans[i].getElementsByTagName('INPUT')[j] ))
					{
						// tell our script that everything has passed OK for this one
						IFs.formvalidateParams.isOK++;
					}
					else
					{ // otherwise set the error message value
						IFs.formvalidateParams.alertMsg = reqSpans[i].getElementsByTagName('INPUT')[j].title;
					}
				}
				else // otherwise set the error message value
				{
					IFs.formvalidateParams.alertMsg = reqSpans[i].getElementsByTagName('INPUT')[j].title;
				}
			}
			
			// if it's a check-type field, do this
			if ( (reqSpans[i].getElementsByTagName('INPUT')[j].type == 'radio') || (reqSpans[i].getElementsByTagName('INPUT')[j].type == 'checkbox') )
			{
				IFs.global.dbo.value += '.checked['+ j +'] = '+ reqSpans[i].getElementsByTagName('INPUT')[j].checked;

				// add findings to reqSpans[i] pass/fail check variable
				if (reqSpans[i].getElementsByTagName('INPUT')[j].checked)
				{
					IFs.formvalidateParams.isOK++;
				}
				else
				{
					IFs.formvalidateParams.alertMsg = reqSpans[i].getElementsByTagName('INPUT')[j].title;
				}
			}
		}
		
		// for each child <select>
		for ( var j = 0; j < reqSpans[i].getElementsByTagName('SELECT').length; j++)
		{
			IFs.global.dbo.value += '\n	.gebtn("SELECT")['+j+']';
			IFs.global.dbo.value += '.value="' + reqSpans[i].getElementsByTagName('SELECT')[j].value +'"';

			// add findings to reqSpans[i] pass/fail check variable
			if (reqSpans[i].getElementsByTagName('SELECT')[j].value)
			{
				IFs.formvalidateParams.isOK++;
			}
			else
			{
				IFs.formvalidateParams.alertMsg = reqSpans[i].getElementsByTagName('SELECT')[j].title;
			}
		}
		
		// for each child <textarea>
		for ( var j = 0; j < reqSpans[i].getElementsByTagName('TEXTAREA').length; j++)
		{
			IFs.global.dbo.value += '\n	.gebtn("TEXTAREA")['+j+']';
			IFs.global.dbo.value += '.value="' + reqSpans[i].getElementsByTagName('TEXTAREA')[j].value +'"';

			// add findings to reqSpans[i] pass/fail check variable
			if (reqSpans[i].getElementsByTagName('TEXTAREA')[j].value)
			{
				IFs.formvalidateParams.isOK++;
			}
			else
			{
				IFs.formvalidateParams.alertMsg = reqSpans[i].getElementsByTagName('TEXTAREA')[j].title;
			}
		}

		IFs.global.dbo.value += '\n	(IFs.formvalidateParams.isOK == '+ IFs.formvalidateParams.isOK +')\n';
		
		// if reqSpans[i] pass/fail check variable doesn't pass
		if (IFs.formvalidateParams.isOK < 1)
		{
			alert(IFs.formvalidateParams.alertMsg);
			return false;
		}
	}
	
	return true;
}

IFs.formvalidateType = function ( domLocator )
{
	IFs.global.dbo.value += '\nIFs.formvalidateType ( domLocator.tagName = ' + domLocator.tagName +')\n{ ********\n';
	
	IFs.formvalidateType.badTotal = 0;
	if ( domLocator.value )
	{
		if ( domLocator.parentNode.tagName == 'SPAN' )
		{
			if (domLocator.parentNode.className != 'required')
			{
				IFs.global.dbo.value += '	domLocator.value = ' + domLocator.value +'\n';
				IFs.global.dbo.value += '	domLocator.parentNode.className = ' + domLocator.parentNode.className +'\n';

				switch ( domLocator.parentNode.className )
				{
					case 'email' :
						if (domLocator.value.indexOf('@') < 1)
						{
							IFs.global.dbo.value += '	return false:  @ did not appear after the first chacracter\n';
							return false;
						}
						if (domLocator.value.substr( domLocator.value.indexOf('@'), domLocator.value.length ).indexOf('.') < 2 )
						{
							IFs.global.dbo.value += '	return false:  . did not appear after @\n';
							return false;
						}
						
						IFs.global.dbo.value += '	return true:  _@_._ format OK\n';
						IFs.global.dbo.value += '} ********\n'; return true;
						break;

					case 'number' :
						IFs.formvalidateParams.testNumber = parseInt(domLocator.value);
						if ( !isNaN( IFs.formvalidateParams.testNumber ) )
						{
							IFs.global.dbo.value += '	return true:  is a number\n';
							IFs.global.dbo.value += '} ********\n'; return true;
						}
						IFs.global.dbo.value += '	return false:  is not a number\n';
						IFs.global.dbo.value += '} ********\n'; return false;
						break;

					case 'currency' :
						IFs.formvalidateParams.testNumber = parseInt(domLocator.value);
						if ( !isNaN( IFs.formvalidateParams.testNumber ) )
						{
							IFs.global.dbo.value += '	return true:  is a number\n';
							IFs.global.dbo.value += '} ********\n'; return true;
						}
						IFs.global.dbo.value += '	return false:  is not a number\n';
						IFs.global.dbo.value += '} ********\n'; return false;
						break;

					case 'date' :
						if ( domLocator.value.match( /\d{2}\D\d{2}\D\d{4}/ ) != null )
						{
							IFs.global.dbo.value += '	return true:  00/00/0000 format OK\n';
							IFs.global.dbo.value += '} ********\n'; return true;
						}
						IFs.global.dbo.value += '	return false:  date not formatted as 00/00/0000\n';
						IFs.global.dbo.value += '} ********\n'; return false;
						break;

					case 'year' :
						IFs.formvalidateParams.testNumber = parseInt(domLocator.value);
						if ( (domLocator.value.length == 4) && (!isNaN( IFs.formvalidateParams.testNumber )) )
						{
							IFs.global.dbo.value += '	return true:  0000 format OK\n';
							IFs.global.dbo.value += '} ********\n'; return true;
						}
						IFs.global.dbo.value += '	return false:  year not formatted as 0000\n';
						IFs.global.dbo.value += '} ********\n'; return false;
						break;

					case 'phone' :
						if ( domLocator.value.match( /\d{3}\D[1-9]\d{2}\D\d{4}/ ) != null )
						{
							IFs.global.dbo.value += '	return true:  000-000-0000 format OK\n';
							IFs.global.dbo.value += '} ********\n'; return true;
						}
						IFs.global.dbo.value += '	return false:  phone not formatted as 000-000-0000\n';
						IFs.global.dbo.value += '} ********\n'; return false;
						break;

					default :
						IFs.global.dbo.value += '	return true:  parentNode.className unrecognized\n';
						IFs.global.dbo.value += '} ********\n'; return true;
						break;
						
					return true;
				}
			}
			else
			{
				IFs.global.dbo.value += '	return true:  parentNode.className == "required"\n';
				IFs.global.dbo.value += '} ********\n'; return true;
			}
		}
		else
		{
			IFs.global.dbo.value += '	return true:  parentNode.tagName != "SPAN"\n';
			IFs.global.dbo.value += '} ********\n'; return true;
		}
	}
	else
	{
		IFs.global.dbo.value += '	return false:  !value\n';
		IFs.global.dbo.value += '} ********\n'; return false;
	}
}
