// JavaScript Document

this._errorImgUrl = "";
this._validImgUrl = "";
this._iconClass = "";

function formValidatorSetUp ( setUp )
{
	_errorImgUrl = setUp[0];
	_validImgUrl = setUp[1];
	_iconClass = setUp[2];
}

function hideForm ( formName )
{
	document.forms[formName].style.display = 'none';
}

/*
 ************************************************************************
 ************************************************************************
																		*/

function addWarning ( objID )
{
	var errorObj = document.createElement( 'img' );
	errorObj.setAttribute( 'src', _errorImgUrl );
	errorObj.setAttribute( 'alt', "error" );
	errorObj.setAttribute( 'class', _iconClass );
	
	var txt = document.getElementById( objID ).innerHTML;
	txt = txt.replace(/<.*>/,"");
	
	document.getElementById( objID ).innerHTML = "";
	var txtObj = document.createTextNode( txt );
				
	document.getElementById( objID ).appendChild( errorObj );
	document.getElementById( objID ).appendChild( txtObj );
}


function removeWarning ( objID )
{
	var txt = document.getElementById( objID ).innerHTML;
	txt = txt.replace(/<.*>/,"");
	document.getElementById( objID ).innerHTML = "";
	var txtObj = document.createTextNode( txt );
	document.getElementById( objID ).appendChild( txtObj );
}

/*
 ************************************************************************
 ************************************************************************
																		*/

function validTextField ( text, minLength )
{
	var res = true;
	if ( trim(text).length < minLength )
		res = false;
	return res;
}

function validEmailField ( email )
{
	var reg = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;
	var res = reg.test( trim(email) );
	return res;
}

function getGroupElements ( form, groupName )
{
	var res = new Array();
	for ( var i=0; i < document.forms[form].elements.length; i++ )
	{
		if ( document.forms[form].elements[i].name.indexOf(":G"+groupName) != -1 )
			res.push(document.forms[form].elements[i]);
	}	
	return res;
}

/*
 ************************************************************************
 ************************************************************************
																		*/

function validSelectMenu ( form, menuName, menuValue )
{
	var valid = true;
	
	if ( menuName.indexOf( ':Max' ) != -1 )
	{
		var selCount = 0;
		var selLimit = menuName.substring( menuName.indexOf( ':Max' )+4, menuName.indexOf( ':', menuName.indexOf( ':Max' )+1 ) );
		selLimit = parseInt (selLimit);
		
		for ( var i = 0; i < document.forms[form].elements[menuName].options.length; i++ )
		{
			if ( document.forms[form].elements[menuName].options[i].selected )
				selCount++;
		}
		
		if ( selCount > selLimit || selCount == 0 )
			valid = false;
		
	} else {
		if ( menuValue == '' )
			valid = false;
	}
	
	return valid;
}


/*
 ************************************************************************
 ************************************************************************
																		*/

function validCheckBox ( obj, group, policy, form )
{
	//alert (obj + ',' + group + ',' + policy + ',' + form);
	
	var res = true;
	
	if ( group != null )
	{
		var objList = getGroupElements ( form, group );
		
		var isGroupChecked = false;
		
		if (policy == "AND")
			isGroupChecked = true;
		
		if (policy == "OR")
			isGroupChecked = false;
		
		for ( var i=0; i < objList.length; i++ )
		{
			if ( objList[i].checked && policy == "OR" )
			{
				isGroupChecked = true;
				break;
			}
			if ( !objList[i].checked && policy == "AND" )
			{
				isGroupChecked = false;
				break;
			}
		}
		res = isGroupChecked;
	}else{
		res = obj.checked;
	}	
	
	//alert (obj.name + " // " + group + "-" + policy + "=" + res);
	
	return res;	
}


function getGroupName ( objName )
{
	var groupName = null;
	var groupNameIndex = objName.indexOf(':G');
	
	if ( groupNameIndex != -1 )
	{
		groupName = objName.substring( groupNameIndex+2, objName.indexOf('-',groupNameIndex+1) );
		
		var policyIndex = objName.indexOf('-',groupNameIndex+1);
		var groupPolicy = objName.substring( policyIndex+1, objName.indexOf(':',policyIndex+1) );
		//alert (objName + " -> " + (policyIndex+1) + "," + objName.indexOf(':',policyIndex+1) + " = " + groupPolicy);
		groupName = new Array(groupName, groupPolicy);
		//alert (groupName[0]+","+groupName[1]);
	}	
	return groupName;
}

/*
 ************************************************************************
 ************************************************************************
																		*/
																		
function getTargetLabel ( fieldName )
{
	return 	fieldName.substring( 0, fieldName.indexOf('-') );
}
																		
function getGroupTargetLabel ( fieldName )
{
	return 	fieldName.substring( fieldName.indexOf('-T') + 2 );
}

/*
 ************************************************************************
 ************************************************************************
																		*/

function validate ( formNameToValidate )
{
	var form = document.forms[formNameToValidate];
	var hasError = false;
	
	var checkedGroups = new Array();
	
	for ( var i=0; i < form.elements.length; i++ )
	{
		
		if ( form.elements[i].name.indexOf('-mandatory') != -1 )
		{
			var elmtTag = form.elements[i].tagName;		
			var isValid = true;			
			var labelTarget = "";
			
			switch (elmtTag)
			{
				case "INPUT":
					switch ( form.elements[i].type )
					{
						case "file":
						case "text":
							if ( form.elements[i].name.indexOf('email') != -1 )
							{
								//email text field
								isValid = validEmailField ( form.elements[i].value );
								labelTarget = getTargetLabel( form.elements[i].name );
								if ( !isValid )
								{
									hasError = true;
									addWarning ( labelTarget );
								}else{
									removeWarning( labelTarget );
								}
							}else{
								//regular text field
								isValid = validTextField ( form.elements[i].value, 2 );
								labelTarget = getTargetLabel( form.elements[i].name );
								if ( !isValid )
								{
									hasError = true;
									addWarning ( labelTarget );
								}else{
									removeWarning( labelTarget );
								}
							}
						break;
						
						case "checkbox":							
							var gp = getGroupName( form.elements[i].name );
							//alert("gp: " + gp[0] + "," + gp[1]);
							if ( gp != null )
							{
								gp_p = gp[1];
								gp = gp[0];								
								if ( !in_array(gp, checkedGroups) )
								{
									isValid = validCheckBox ( form.elements[i], gp, gp_p, formNameToValidate );									
									labelTarget = getGroupTargetLabel( form.elements[i].name );
									if ( !isValid )
									{
										addWarning ( labelTarget );
										hasError = true;
									}else{
										removeWarning( labelTarget );
									}
											
									checkedGroups.push(gp);
								}else{ 
									//alert ('group already checked');
								}
							}else{
								isValid = validCheckBox ( form.elements[i], null, null, formNameToValidate );	
								labelTarget = getTargetLabel( form.elements[i].name );
								if ( !isValid )
								{
									addWarning ( labelTarget );
									hasError = true;
								}else{
									removeWarning( labelTarget );
								}
							}
						break;
					}				
				break;
				
				//-----------------------------//
				
				case "TEXTAREA":
					isValid = validTextField ( form.elements[i].value, 5 );
					labelTarget = getTargetLabel( form.elements[i].name );
					if ( !isValid )
					{
						addWarning ( labelTarget );
						hasError = true;
					}else{
						removeWarning( labelTarget );
					}
				break;
				
				//-----------------------------//
				
				case "SELECT":
					isValid = validSelectMenu ( formNameToValidate, form.elements[i].name, form.elements[i].value );
					labelTarget = getTargetLabel( form.elements[i].name );
					if ( !isValid )
					{
						addWarning ( labelTarget );
						hasError = true;
					}else{
						removeWarning( labelTarget );
					}
				break;	
			}
			
		}
	}
	
	
	if ( !hasError ) 
	{ 
		document.getElementById( 'warning' ).style.display = 'none';
		form.submit();
	}else{
		document.getElementById( 'warning' ).innerHTML = 
											'Please correct or complete the fields marked with ' +
											'<img src="'+_errorImgUrl+'" alt="error" class="'+_iconClass+'"/>' +
											'and submit your details again.';
		document.getElementById( 'warning' ).style.display = 'block';
	}
	
}
