// javascript generic validation
// written by brandon burkett for elemental blend
// released: 10-04-2006
// version 2.03

// minor globals for reusability
var originalBG = '#FFFFFF';
var errorBG = '#fff9e2';

var radioOriginalBG = '#FFFFFF';
var radioErrorBG = '#fff9e2';

// validate types
var validationSet = 
{
	'state':
	{
		'regexp': /^[a-zA-Z][a-zA-Z]$/,
		'error': 'Please enter a valid state.  Ex. TX'
	},
	
	'phone': 
	{
		'regexp': /^[- ()0-9+]+$/,
		'error': 'Please enter a valid phone number.  Ex. 806-123-4567'
	},

	'price': 
	{
		'regexp': /^[.0-9]+$/,
		'error': 'Please enter a valid amount.  Ex. 19.95'
	},

	'integer': 
	{
		'regexp': /^[0-9]+$/,
		'error': 'Please enter a number.  Ex. 10001'
	},

	'email':
	{
		'regexp': /^.+?@.+?\..+$/,
		'error': 'Please enter a valid email address. Ex. name@domain.com'
	},

	'zip': 
	{
		'regexp': /^[0-9][0-9][0-9][0-9][0-9]$/,
		'error': 'Please enter a valid zip code.  Ex. 79414'
	},

	'date': 
	{
		'regexp': /^[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]$/,
		'error': 'Please enter a valid date.  Ex. 05-27-2006'
	},

	'required': 
	{
		'regexp': /.+?/,
		'error': 'This information is required.'
	},

	'radio': 
	{
		'regexp': /.+?/,
		'error': 'Please select one.'
	},

	'select': 
	{
		'regexp': /.+?/,
		'error': 'Please select one.'
	}
	
}


// form structure
var formValidate = 
{
	// will add an event to id/element
	addEvent: function(elem, eventType, funct)
	{
		if(elem.addEventListener)
		{
			elem.addEventListener(eventType,funct,false);
		}
		else if(elem.attachEvent)
		{
			elem.attachEvent('on'+eventType, funct);
		}
		else
		{
			elem['on'+eventType] = funct;
		}
	},
	
	stopEvent: function(e) 
	{
		if (e.stopPropagation) 
		{
	    	e.stopPropagation();   // for DOM-friendly browsers
	    	e.preventDefault();
	  	}
		else
		{
	    	e.returnValue = false; // for IE
	    	e.cancelBubble = true;
	  	}
	},

	// initalizer function
	init: function()
	{
		
		// get all forms
		if(document.getElementsByTagName('form'))
		{
			htmlForms = document.getElementsByTagName('form');
		}

		// for all forms
		for(i=0;i<htmlForms.length;i++)
		{
			// get html object and id			
			var thisElem = document.getElementById(htmlForms[i].getAttribute('id'));
			var thisId = thisElem.getAttribute('id');					
				
			// add event
			formValidate.addEvent(thisElem,'submit',formValidate.getFields);			
		}
		
		
	},

	// action when button is clicked
	getFields: function(e)
	{
		// globals
		var fields = new Array();
		
		var launchForm = false;
		
		// get event for multiple browsers
		if(!e)
		{
			e = window.event;
		}
		if(e.target)
		{
			targ = e.target;
		}
		else if(e.srcElement)
		{
			targ = e.srcElement;
		}
		if(targ.nodeType == 3) // defeat Safari bug
		{
			targ = targ.parentNode;
		}
		// end get e
		
		// check for text field enter key submit
		if(targ.getAttribute('type') == 'text' || targ.getAttribute('type') == 'password')
		{
			while(targ.tagName != 'FORM')
			{
				targ = targ.parentNode;
			}
		}		
		
		formId = targ.getAttribute('id'); // get id of form that fired event
		
		// get all inputs
		if(targ.getElementsByTagName('input'))
		{
			inputs = targ.getElementsByTagName('input');

			// for all inputs within form
			for(i=0;i<inputs.length;i++)
			{
				var thisElem = document.getElementById(inputs[i].getAttribute('id'));
				
				if(thisElem.type == 'text')
				{
					fields.push(formId+"-"+inputs[i].getAttribute('id')+"-text");
				}
				else if(thisElem.type == 'password')
				{
					fields.push(formId+"-"+inputs[i].getAttribute('id')+"-password");
				}
				else if(thisElem.type == 'file')
				{
					fields.push(formId+"-"+inputs[i].getAttribute('id')+"-file");
				}
				else if(thisElem.type == 'radio')
				{
					fields.push(formId+"-"+inputs[i].getAttribute('id')+"-radio");
				}
				else if(thisElem.type == 'submit')
				{
					// save submit button for later
					submitId = thisElem.getAttribute('id');										
				}					
					
			} // end input for loop 

			// get all textarea
			if(targ.getElementsByTagName('textarea'))
			{
				inputs = targ.getElementsByTagName('textarea');
			}

			// for all textarea within form
			for(i=0;i<inputs.length;i++)
			{
				var thisElem = document.getElementById(inputs[i].getAttribute('id'));
				fields.push(formId+"-"+inputs[i].getAttribute('id')+"-textarea");								
			} // end textarea for loop 

			// get all select
			if(targ.getElementsByTagName('select'))
			{
				inputs = targ.getElementsByTagName('select');
			}

			// for all selects within form
			for(i=0;i<inputs.length;i++)
			{
				var thisElem = document.getElementById(inputs[i].getAttribute('id'));
				fields.push(formId+"-"+inputs[i].getAttribute('id')+"-select");								
			} // end select for loop	 

			formValidate.validateFields(e,formId, fields, submitId);
		} // end targ if
	},

	// compare fields against their validation type
	validateFields: function(e,thisFormId, fields, buttonId)
	{
		//globals
		var validForm = true;
		var errorMsg;
		var errorId;
		var isChecked = new Array();
		
		//loop through all fields within form
		for(i=0;i<fields.length;i++)
		{
			var formField = fields[i].split('-');
			var fieldId = formField[1];
			var formId = formField[0];
			var fieldType = formField[2];

			// return the default bg back to the original color
			var clearElem = document.getElementById(fieldId);
			clearElem.style.backgroundColor = originalBG;
					
			if(fieldType == 'radio')
			{
				document.getElementById(clearElem.name+"Span").style.background = radioOriginalBG;
			}			

			// split form id to tell if it is required or not
			var idArray = fieldId.split('_');
			

			// only validate field if within thisForm
			if(formId == thisFormId)
			{
				// start text
				if(fieldType == 'text' || fieldType == 'password' || fieldType == 'file')
				{
					// check fields with email as part of there id
					if(idArray[0].match('email') && idArray[1] == 'required')
					{
						var fieldElem = document.getElementById(fieldId);
						var re = validationSet['email']['regexp'];

						if(!fieldElem.value.match(re))
						{
							errorMsg = validationSet['email']['error'];
							validForm = false;
							errorId = fieldId;
						}
											
					}

					// check fields with phone as part of there id
					else if(idArray[0].match('phone') && idArray[1] == 'required')
					{
						var fieldElem = document.getElementById(fieldId);
						var re = validationSet['phone']['regexp'];

						if(!fieldElem.value.match(re))
						{
							errorMsg = validationSet['phone']['error'];
							validForm = false;
							errorId = fieldId;
						}
											
					}

					// check fields with state as part of there id
					else if(idArray[0].match('state') && idArray[1] == 'required')
					{
						var fieldElem = document.getElementById(fieldId);
						var re = validationSet['state']['regexp'];

						if(!fieldElem.value.match(re))
						{
							errorMsg = validationSet['state']['error'];
							validForm = false;
							errorId = fieldId;
						}
										
					}

					// check fields with zip as part of there id
					else if(idArray[0].match('zip') && idArray[1] == 'required')
					{
						var fieldElem = document.getElementById(fieldId);
						var re = validationSet['zip']['regexp'];

						if(!fieldElem.value.match(re))
						{
							errorMsg = validationSet['zip']['error'];
							validForm = false;
							errorId = fieldId;
						}
										
					}

					// check fields with date as part of there id
					else if(idArray[0].match('date') && idArray[1] == 'required')
					{
						var fieldElem = document.getElementById(fieldId);
						var re = validationSet['date']['regexp'];

						if(!fieldElem.value.match(re))
						{
							errorMsg = validationSet['date']['error'];
							validForm = false;
							errorId = fieldId;
						}
										
					}

					// check fields with integer as part of there id
					else if(idArray[0].match('integer') && idArray[1] == 'required')
					{
						var fieldElem = document.getElementById(fieldId);
						var re = validationSet['integer']['regexp'];

						if(!fieldElem.value.match(re))
						{
							errorMsg = validationSet['integer']['error'];
							validForm = false;
							errorId = fieldId;
						}
										
					}

					// check fields with price as part of there id
					else if(idArray[0].match('price') && idArray[1] == 'required')
					{
						var fieldElem = document.getElementById(fieldId);
						var re = validationSet['price']['regexp'];

						if(!fieldElem.value.match(re))
						{
							errorMsg = validationSet['price']['error'];
							validForm = false;
							errorId = fieldId;
						}
										
					}

					// check fields with required as part of there id
					else if(idArray[1] == ('required'))
					{
						var fieldElem = document.getElementById(fieldId);
						var re = validationSet['required']['regexp'];

						if(!fieldElem.value.match(re))
						{
							errorMsg = validationSet['required']['error'];
							validForm = false;
							errorId = fieldId;
						}
										
					}
					
				} // end text

				// text area
				if(fieldType == 'textarea')
				{
					if(idArray[1] == ('required'))
					{
						var fieldElem = document.getElementById(fieldId);
						var re = validationSet['required']['regexp'];

						if(!fieldElem.value.match(re))
						{
							errorMsg = validationSet['required']['error'];
							validForm = false;
							errorId = fieldId;
						}
										
					}

				} // end text area

				// select
				if(fieldType == 'select')
				{
					if(idArray[1] == ('required'))
					{
						var fieldElem = document.getElementById(fieldId);
						var re = validationSet['select']['regexp'];

						if(!fieldElem.value.match(re))
						{
							errorMsg = validationSet['select']['error'];
							validForm = false;
							errorId = fieldId;
						}
										
					}

				} // end select

				// radio buttons
				if(fieldType == 'radio')
				{
					if(idArray[1] == ('required'))
					{
						var fieldElem = document.getElementById(fieldId);
						var thisForm = document.getElementById(formId);
											
						
						
						if(!fieldElem.checked)
						{
							isChecked.push(fieldElem.name+"-"+fieldId+"-"+formId+"-invalid");							
						}
						else
						{
							isChecked.push(fieldElem.name+"-"+fieldId+"-"+formId+"-valid");								
						}
												

																
					}

				} // end radio buttons
				
				
			} // end form if	
			
		} // end for loop

		// process radio buttons after main loop
		if(isChecked.length > 0)
		{
			// copy oringal array
			var invalidArray = new Array();
			for (var u = 0; u < isChecked.length; u++) 
			{
		        invalidArray[u] = isChecked[u];
		    }
			
			for(x=0;x<isChecked.length;x++)
			{
				var thisItem = isChecked[x].split('-');
				var thisName = thisItem[0];
				var thisId = thisItem[1];
				var thisForm = thisItem[2];
				var status = thisItem[3];

				if(status == 'valid')
				{
					for(a=0;a<invalidArray.length;a++)
					{
						var invalidItem = invalidArray[a].split('-');
						if(thisName == invalidItem[0]);
						{
							invalidArray[a] = false;
						}
					}
				}
				
			}

		
			for(x=0;x<invalidArray.length;x++)
			{
				if(invalidArray[x] != false)
				{
					var thisItem = invalidArray[x].split('-');
					var thisName = thisItem[0];
					var thisId = thisItem[1];
					var thisForm = thisItem[2];
					var status = thisItem[3];

					var thisElem = document.getElementById(thisId);

					if(thisId != false)
					{
						errorMsg = validationSet['radio']['error'];
						validForm = false;
						errorId = thisElem.name+"Span";
					}
				}		
				
			}
	
		}
		

		if(validForm == false)
		{
			formValidate.displayMessage(e,errorId,errorMsg);
		}
		else
		{
			formValidate.submitForm(thisFormId,buttonId);
		}

	},

	// output the error message and highlight field
	displayMessage: function(e,errorId,errorMsg)
	{
		// get labels
		if(document.getElementsByTagName('label'))
		{
			labels = document.getElementsByTagName('label');
		}

		// get inner html of label with specific for attribute
		for(i=0;i<labels.length;i++)
		{
			// add event to inputs with type button
			if(labels[i].htmlFor == errorId)
			{
				var thisLabelValue = labels[i].innerHTML;
			}
		}

		thisLabelValue = thisLabelValue.replace('<em>*</em>','').replace('<EM>*</EM>','');
		alert(thisLabelValue+': '+errorMsg);

		var fieldElem = document.getElementById(errorId);
		fieldElem.style.background = errorBG;
		fieldElem.focus();
		formValidate.stopEvent(e);				
	},

	// update button so it is only clicked once
	submitForm: function(formId,buttonId)
	{
		var button = document.getElementById(buttonId);
		var form = document.getElementById(formId);

		button.value = "Processing...";
		button.disabled = true;
	}
	

}
