// Validate from
function validateForm(formObject,requiredType,requiredValue,requiredClassTag,requiredAlertObjectId) 
{	
	// Veriables
	var valid = true;
	var requiredConfirmationObjects = new Object();	
	var requiredOrObjects = new Object();	
	var countOrObjects = new Object();
	
	// Set in-valid message
	function setInvalidMessage(_id,_valid)
	{
		if(document.getElementById(_id))
		{
			if(!_valid)
				document.getElementById(_id).style.display = "block";
			else
				document.getElementById(_id).style.display = "none";
		}
	}
	
	// Set in-valid highligh
	function setInvalid(invalidObject,lableId,verifyDefaultValue) 
	{
		var defaultValueFunction = '';
		if(verifyDefaultValue) 
			defaultValueFunction = ";if(this.value==this.defaultValue || this.value=='REQUIRED') this.value='';";
		
		if(lableId != null) 
		{
			if(requiredType == 'class') 
			{
				document.getElementById(lableId).className = invalidObject.className.replace(RegExp(" "+requiredValue),''); 			
				if (invalidObject.type == 'checkbox' || invalidObject.type == 'radio')
				{ 
					if(formObject[invalidObject.name].length) 
						for(var r=0; r < formObject[invalidObject.name].length; r++)
							formObject[invalidObject.name][r].onfocus = new Function("document.getElementById('"+lableId+"').className='"+invalidObject.className+"'"+defaultValueFunction);	
				}
				else  
					invalidObject.onfocus = new Function("document.getElementById('"+lableId+"').className='"+invalidObject.className+"'"+defaultValueFunction);							
				
				document.getElementById(lableId).className += ' '+requiredValue;
			} 
			else if(requiredType == 'color') 
			{
				document.getElementById(lableId).style.color = requiredValue;				
				if (invalidObject.type == 'checkbox' || invalidObject.type == 'radio') 
				{
					if(formObject[invalidObject.name].length)
						for(var r=0; r < formObject[invalidObject.name].length; r++) 
							formObject[invalidObject.name][r].onfocus = new Function("document.getElementById('"+lableId+"').style.color=''"+defaultValueFunction);	
				}
				else 
					invalidObject.onfocus = new Function("document.getElementById('"+lableId+"').style.color=''"+defaultValueFunction);
			}
		} 
		else 
		{
			if(requiredType == 'class') 
			{
				invalidObject.className = invalidObject.className.replace(RegExp(" "+requiredValue),''); 
				if (invalidObject.type == 'checkbox' || invalidObject.type == 'radio') 
				{
					if(formObject[invalidObject.name].length) 
						for(var r=0; r < formObject[invalidObject.name].length; r++)
							formObject[invalidObject.name][r].onfocus = new Function("this.className='"+invalidObject.className+"'"+defaultValueFunction);
				}
				else 					
					invalidObject.onfocus = new Function("this.className='"+invalidObject.className+"'"+defaultValueFunction);
				invalidObject.className += ' '+requiredValue;
			} 
			else if(requiredType == 'color') 
			{
				invalidObject.style.color = requiredValue; 
				if (invalidObject.type == 'checkbox' || invalidObject.type == 'radio') 
				{
					if(formObject[invalidObject.name].length) 
						for(var r=0; r < formObject[invalidObject.name].length; r++)
							formObject[invalidObject.name][r].onfocus = new Function("this.style.color=''"+defaultValueFunction);	
				}
				else 
					invalidObject.onfocus = new Function("this.style.color=''"+defaultValueFunction);
			}
		}
	}

	// Scan form
	for (var i = 0; i < formObject.length; i++) 
	{
		if (formObject[i].className.match(RegExp("^"+requiredClassTag+"|\ "+requiredClassTag+""))) 
		{
				// Get attributes
				var inputValid = true;
				var classExplode = formObject[i].className.split(' '); 
				for (var c = 0; c < classExplode.length; c++) 
				{
					if(classExplode[c].match(RegExp("^"+requiredClassTag+""))) 
					{
						var requiredAttributes = classExplode[c].split('_');
						break;
					}
				}
				var verifyOptional = false;
				var verifyEmail = false;
				var verifyDefaultValue = false;
				var verifyConfirm = null;
				var verifyOr = null;
				var verifyMax = null;
				var verifyMin = null;
				var verifyCharcterCount = null;				
				var verifyLableID = null;
				var verifyMessageID = null;
				var verifyVerification = null;				
					
				// Scan attributes	
				for (var a=0; a < requiredAttributes.length; a++) 
				{

					if(requiredAttributes[a].match('email'))
						verifyEmail = true;
						
					else if(requiredAttributes[a] == 'o')
						verifyOptional = true;	
						
					else if(requiredAttributes[a] == 'd')
						verifyDefaultValue = true;		
					
					else if(requiredAttributes[a].match(/^or[0-9]+/)) 
						verifyOr = requiredAttributes[a].replace(/^or/,'');
						
					else if(requiredAttributes[a].match(/^max[0-9]+/)) 
						verifyMax= parseInt(requiredAttributes[a].replace(/^max/,''));	
						
					else if(requiredAttributes[a].match(/^min[0-9]+/)) 
						verifyMin= parseInt(requiredAttributes[a].replace(/^min/,''));	
					
					else if(requiredAttributes[a].match(/^c[0-9]+/)) 
						verifyConfirm = requiredAttributes[a].replace(/^c/,'');
					
					else if(requiredAttributes[a].match(/^vn[0-9]+/)) 
						verifyVerification = requiredAttributes[a].replace(/^vn/,'');
					
					else if(requiredAttributes[a].match(/^n[0-9]+/))
						verifyCharcterCount = parseInt(requiredAttributes[a].replace(/^n/,''));				
					
					else if(requiredAttributes[a].match(/^l-/)) 
						verifyLableID = requiredAttributes[a].replace(/^l-/,'');
						
					else if(requiredAttributes[a].match(/^m-/)) 
					{
						verifyMessageID = requiredAttributes[a].replace(/^m-/,'');							
						setInvalidMessage(verifyMessageID,true);
					}
				}		
				
				
				// Verify
				if(verifyVerification != null) 
				{
					if(formObject[i].value != verifyVerification) 
					{	
						setInvalid(formObject[i],verifyLableID,verifyDefaultValue);
						inputValid = false;
					}
				} 	
								
				// Email
				else if (verifyEmail) 
				{
					if(formObject[i].type == 'textarea') 
					{
						var emails = formObject[i].value.replace(/^,|,$/,'').split(',');
						for (var e = 0; e < emails.length; e++) 
						{
							emails[e] = emails[e].replace(/^\s+|\s+$/g,"");
							if (!emails[e].match(/\b(^(\S+@).+((\.com)|(\.net)|(\.edu)|(\.mil)|(\.gov)|(\.org)|(\..{2,2}))$)\b/gi)) 
							{
								setInvalid(formObject[i],verifyLableID,verifyDefaultValue);
								setInvalidMessage(verifyMessageID,false);
								inputValid = false;
							}	
						}					
					} 
					else 
					{				
						if (!formObject[i].value.match(/\b(^(\S+@).+((\.com)|(\.net)|(\.edu)|(\.mil)|(\.gov)|(\.org)|(\..{2,2}))$)\b/gi) && (!verifyOptional || (verifyOptional && formObject[i].value !=''))) 
						{
							setInvalid(formObject[i],verifyLableID,verifyDefaultValue);
							setInvalidMessage(verifyMessageID,false);
							inputValid = false;
						}
					}				
				} 			

				// Radio
				else if (formObject[i].type == 'radio') 
				{	
					var validateButton = false;
					if(formObject[formObject[i].name].length) 
					{
						for(var r=0; r < formObject[formObject[i].name].length; r++) 
						{
							if(formObject[formObject[i].name][r].checked) 
							{
								validateButton = true;
								break;
							}
						}	
					} 
					else 
					{
						if(formObject[i].checked) 
							validateButton = true;						
					}
					if (!validateButton) 
					{
						setInvalid(formObject[i],verifyLableID,verifyDefaultValue);
						setInvalidMessage(verifyMessageID,false);
						inputValid = false;
					}
				}				

				// Checkbox	
				else if (formObject[i].type == 'checkbox') 
				{
					var validateButton = false;
					if(formObject[formObject[i].name].length) 
					{
						for(var r=0; r < formObject[formObject[i].name].length; r++) 
						{
							if(formObject[formObject[i].name][r].checked) 
							{
								validateButton = true;
								break;
							}
						}	
					}
					else 
					{
						if(formObject[i].checked) 
							validateButton = true;
					}
					if (!validateButton) 
					{
						setInvalid(formObject[i],verifyLableID,verifyDefaultValue);
						setInvalidMessage(verifyMessageID,false);
						inputValid = false;
					}	
				}					

				// Select
				else if (formObject[i].type == 'select-one' || formObject[i].type == 'select') 
				{
					if (formObject[i].value == '') 
					{
						setInvalid(formObject[i],verifyLableID,verifyDefaultValue);
						setInvalidMessage(verifyMessageID,false);
						inputValid = false;
					}
				}				

				// File 
				else if (formObject[i].type == 'file') 
				{
					if (formObject[i].value == '') 
					{
						setInvalid(formObject[i],verifyLableID,verifyDefaultValue);
						setInvalidMessage(verifyMessageID,false);
						inputValid = false;
					}	
				}			

				// Text & Text Area
				else if (formObject[i].type == 'password' || formObject[i].type == 'text' || formObject[i].type == 'textarea' || formObject[i].type == 'hidden') 
				{					

					// Number of charecters
					if (verifyCharcterCount != null) 
					{
						if (formObject[i].value.length != verifyCharcterCount) 
						{
							setInvalid(formObject[i],verifyLableID,verifyDefaultValue);
							setInvalidMessage(verifyMessageID,false);
							inputValid = false;
						}
					} 					

					// Empty
					else if (!verifyOptional && (formObject[i].value == '' || (verifyDefaultValue && formObject[i].defaultValue == formObject[i].value))) 
					{
						setInvalid(formObject[i],verifyLableID,verifyDefaultValue);
						setInvalidMessage(verifyMessageID,false);
						inputValid = false;
					}	
					
				}
				
				// Confirmation
				if(verifyConfirm != null) 
				{
					if(requiredConfirmationObjects[verifyConfirm]) 
					{					
						if (requiredConfirmationObjects[verifyConfirm] != formObject[i].value) 
						{
								setInvalid(formObject[i],verifyLableID,verifyDefaultValue);
								setInvalidMessage(verifyMessageID,false);
								inputValid = false;
						}
					} 
					
					else 
						requiredConfirmationObjects[verifyConfirm] = formObject[i].value;					
				}
				
				// Or
				if(verifyOr != null && inputValid)
					requiredOrObjects[verifyOr] = inputValid;  
				
				else if(verifyOr != null && !requiredOrObjects[verifyOr])
					requiredOrObjects[verifyOr] = inputValid; 
					
				
				// Max
				if(verifyMax != null && verifyOr != null)					
				{	
					if(!countOrObjects['max'])
						countOrObjects['max'] = new Object();
								
					if(countOrObjects['max'][verifyOr])
						countOrObjects['max'][verifyOr] += (formObject[i].value != '') ? parseInt(formObject[i].value) : 0; 
					else 
						countOrObjects['max'][verifyOr] = (formObject[i].value != '') ? parseInt(formObject[i].value) : 0; 
					if(countOrObjects['max'][verifyOr] > verifyMax)
						valid = false;	
				}
				
				// Min
				if(verifyMin != null && verifyOr != null)					
				{	
					if(!countOrObjects['min'])
						countOrObjects['min'] = new Object();
								
					if(!countOrObjects['min'][verifyOr])
					{
						countOrObjects['min'][verifyOr] = new Object();
						countOrObjects['min'][verifyOr]['t'] = verifyMin;
						countOrObjects['min'][verifyOr]['c'] = (formObject[i].value != '') ? parseInt(formObject[i].value) : 0; 
					}
					else 
						countOrObjects['min'][verifyOr]['c'] += (formObject[i].value != '') ? parseInt(formObject[i].value) : 0;
				}
				
				// Set valid
				if(!inputValid && verifyOr == null)
					valid = inputValid;
				
		}
	}	
	
	// Verify or's
	for(id in requiredOrObjects) 
	{
		if(!requiredOrObjects[id]) 
		{
			valid = false;
			break;	
		}
	}
	
	// Verify or's min
	if(countOrObjects['min'])
	{
		for(id in countOrObjects['min']) 
		{
			if (countOrObjects['min'][id]['t'] > countOrObjects['min'][id]['c'])
			{
				valid = false;
				break;	
			}
		}
	}

	// Required Alert
	if (requiredAlertObjectId != '') 
	{
		if (!valid)
			document.getElementById(requiredAlertObjectId).style.display = "block";
		else
			document.getElementById(requiredAlertObjectId).style.display = "none";
		
	} 	
	
	return valid;
}

// Validate from and submit 
function validateFormSubmit(formObject,requiredType,requiredValue,requiredClassTag,requiredAlertObjectId) 
{
 if(validateForm(formObject,requiredType,requiredValue,requiredClassTag,requiredAlertObjectId))
 	formObject.submit();
}

// Validate from and preview
function validateFormPreview(formObject,requiredType,requiredValue,requiredClassTag,requiredAlertObjectId,previewUrl,width,height,scrollBar,resize) 
{
 if(validateForm(formObject,requiredType,requiredValue,requiredClassTag,requiredAlertObjectId))
 {
	 // Get
	 var currentAction = formObject.action;
	 var currentTarget = formObject.target;
	 
	// Set
	formObject.action = previewUrl;
	formObject.target = 'formsubmitwindow';	
	
	// Open Window
	function openWindow(loadUrl,pageWidth,pageHeight,toolBar,menuBar,locationBar,scrollBar,resize) 
	{
		var intWidth = pageWidth;
		var intHeight = pageHeight;
		var intLeft = (screen.availWidth / 2) - (intWidth / 2 );
		var intTop = (screen.availHeight / 2) - (intHeight / 2 );
		var setToolBar = 'no';	if (toolBar) { var setToolBar = 'yes'; }
		var setMenuBar = 'no';	if (menuBar) { var setMenuBar = 'yes'; }	
		var setLocationBar = 'no';	if (locationBar) { var setLocationBar = 'yes'; }	
		var setScrollBar = 'no';	if (scrollBar) { var setScrollBar = 'yes'; }
		var setResize = 'no';	if (resize) { var setResize = 'yes'; }	
		var openWin = window.open(loadUrl, "formsubmitwindow", 'toolBar='+setToolBar+',menubar='+setMenuBar+',locationbar='+setLocationBar+',scrollbars='+setScrollBar+',resizable='+setResize+',width='+pageWidth+',height='+pageHeight+', screenX=' + intLeft + ',screenY=' + intTop + ',left=' + intLeft + ',top= ' + intTop + ''); 
		openWin.focus();
	}		
	
	// Submit
	openWindow('',width,height,false,false,false,scrollBar,resize); 	
	formObject.submit();			
	
	// Reset
	formObject.action = currentAction;
	formObject.target = currentTarget;
 }
}
