var gblValidate = new Array();
gblValidate['required'] = new Array();
gblValidate['required']['test'] = /.+/;
gblValidate['required']['example'] = null;

gblValidate['phone'] =  new Array();
gblValidate['phone']['test'] = /^(\(?[\d]{3}\)?)?[ \-]?[\d]{3}[ \-]?[\d]{4}$/;
gblValidate['phone']['example'] = '(555) 555-5555';

gblValidate['email'] = new Array();
//borrowed this regExp from the php PEAR::Validate 0.3.0 package
gblValidate['email']['test'] = /^[-!#$%&'*+\.\\\/0-9=?A-Z^_`a-z{|}~]+@[-!#$%&'*+\\\/0-9=?A-Z^_`a-z{|}~]+\.[-!#$%&'*+\.\\\/0-9=?A-Z^_`a-z{|}~]+$/;
gblValidate['email']['example'] = 'johnsmith@sampledomain.com';

gblValidate['uszipcode'] = new Array();
gblValidate['uszipcode']['test'] = /^\d{5}(\-\d{4})?$/;
gblValidate['uszipcode']['example'] = "55555";

gblValidate['creditcard'] = new Array();
gblValidate['creditcard']['test'] = /^\d{4}[ \-]?\d{4}[ \-]?\d{4}[ \-]?\d{4}$/;
gblValidate['creditcard']['example'] = "0000-0000-0000-0000";


var TEXT_NODE = 3;
var ELEMENT_NODE = 1;

function validate(_submit)
{
	if(document.getElementById)
	{
		var _form = _submit.parentNode;
		while(_form.tagName != 'FORM' && _form.parentNode) { _form = _form.parentNode; }
		if(_form)
		{
			var _label = _form.getElementsByTagName('label');
			for(var i = 0; i < _label.length; i++)
			{
				var _labelClass = null;
				var _labelFor = null;
				var _alertMessage = _label[i].firstChild.nodeValue;
				//label tags come in two variations
				//1. They have a 'for' attribute that ties them with the corresponding form element
				_labelClass = (document.all) ? (_label[i].className != '') ? _label[i].className : null : _label[i].getAttribute('class');
				
				_labelFor = _label[i].getAttribute('for');
				if(_labelFor == null && document.all)
					_labelFor = (_label[i].attributes['for'].value != '') ? _label[i].attributes['for'].value : null;

				//2. They do not have a 'for' attribute but instead
				//   the form element is a child of the label tag
				if(_labelFor == null)
				{
					for(var k = 0; k < _label[i].childNodes.length; k++)
					{
						if(_label[i].childNodes[k].nodeType == ELEMENT_NODE && (_labelFor == null || _labelFor == ''))
						{
							var _element = _label[i].childNodes[k];
							
							if( 
								(_element.tagName == 'INPUT') || 
								(_element.tagName == 'TEXTAREA') ||
								(_element.tagName == 'SELECT'))
							{
								_labelFor = _element.getAttribute('id');
							}
						}
						else if(_label[i].childNodes[k].nodeType == TEXT_NODE && _alertMessage == null)
						{
							_alertMessage = _label[i].childNodes[k].nodeValue;
						}
					}
				}
				
				if(_labelClass != null && _labelFor != null)
				{
					var _labelClassArray = _labelClass.split(' ');
					var _input = document.getElementById(_labelFor);
					if(
						(_input.tagName == 'INPUT' && 
						(_input.getAttribute('type') == "text" || _input.getAttribute('type') == null)) || 
						(_input.tagName == 'TEXTAREA') ||
						(_input.tagName == 'SELECT'))
					{
						for(var j = 0; j <  _labelClassArray.length; j++)
						{
							if(typeof gblValidate[_labelClassArray[j]]['test'] != 'undefined')
							{
								var tmpRegExp = gblValidate[_labelClassArray[j]]['test'];
								var required = exists(_labelClassArray,'required');
								if(
									tmpRegExp.test(_input.value) != true &&
									(required || _input.value != ''))
								{
									if(required)
										_alertMessage += ' is required';
									if(gblValidate[_labelClassArray[j]]['example'] != null)
									{
										_alertMessage += (required) ? '\nand ' : ' ';
										_alertMessage += 'should be formatted as ' + gblValidate[_labelClassArray[j]]['example'];
									}
									_alertMessage += '.';
									alert(_alertMessage);
									_input.focus();
									if(_input.tagName != 'SELECT')
										_input.select();
									return false;
								}
							}
						}
					}
				}
			}
		}
	}
	return true;
}

function exists(a, x)
{
    for (var i = 0; i < a.length; i++) {
        if (a[i] == x) return true;
    }
    return false;
}
