// javascript generic validation
// written by brandon burkett for elemental blend
// april 25 2006

// 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 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;
		}

		

	},

	// initalizer function
	init: function()
	{		
		// get all inputs
		if(document.getElementsByTagName('input'))
		{
			inputs = document.getElementsByTagName('input');
		}

		// for all inputs within form
		for(i=0;i<inputs.length;i++)
		{
			// add event to inputs with type button
			if(inputs[i].type == 'button')
			{
				var thisElem = document.getElementById(inputs[i].getAttribute('id'));
				formValidate.addEvent(thisElem,'click',formValidate.getFields);
			}
		}			
		
	},

	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
		
		thisId = targ.getAttribute('id'); // get id of element that fired event
		
		// get all forms
		if(document.getElementsByTagName('form'))
		{
			forms = document.getElementsByTagName('form');			
		}
		
		//for each form
		for(y=0;y<forms.length;y++)
		{
			// get form id
			var formId = forms[y].getAttribute('id');
			
			// get all inputs
			if(forms[y].getElementsByTagName('input'))
			{
				inputs = forms[y].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 == 'button')
				{
					if(thisElem.getAttribute('id') == thisId)
					{ // if the button fired the event, validate only the form that fired the event
						launchForm = formId;
					}
				}					
					
			} // end input for loop 

			// get all textarea
			if(forms[y].getElementsByTagName('textarea'))
			{
				inputs = forms[y].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(forms[y].getElementsByTagName('select'))
			{
				inputs = forms[y].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	 

			
		} // end form for loop

		formValidate.validateFields(launchForm, fields, thisId)
		
	},

	validateFields: function(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.background = originalBG;
			
			if(fieldType == 'radio')
			{
				document.getElementById(clearElem.name+"Span").style.background = radioOriginalBG;
			}

			// clear error message
			var errorDiv = document.getElementById('formMessage');
			errorDiv.innerHTML = '';

			// 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 zip 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 zip 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(errorId,errorMsg)
		}
		else
		{
			formValidate.submitForm(thisFormId,buttonId);
		}

	},

	displayMessage: function(errorId,errorMsg)
	{
		var errorElem = document.getElementById('formMessage');
		errorElem.innerHTML = errorMsg;

		var fieldElem = document.getElementById(errorId);
		fieldElem.style.background = errorBG;
				
	},

	submitForm: function(formId,buttonId)
	{
		var button = document.getElementById(buttonId);
		var form = document.getElementById(formId);

		button.value = "Processing...";
		button.disabled = true;
		
		form.submit();
	}
	

}
