function DateTester(aIso)
{
	this.mIso = aIso;
	this.test = DateTester_test;
}

function DateTester_test(aValue)
{
	var lPattern = null;
	var lYear = null;
	var lDay = null;
	var lMonth = null;

	if ( this.mIso )
	{
		// ISO: yyyy-mm-dd
		
		lPattern = new RegExp(/^(\d{4})[\-](0?[0-9]|1[0-2])[\-](0?[0-9]|1[0-9]|2[0-9]|3[0-1])$/);
		lMatchArray = lPattern.exec(aValue);
		if ( lMatchArray == null )
		{
			return false;
		} 
		
		lYear  = lMatchArray[1];
		lMonth = lMatchArray[2];
		lDay   = lMatchArray[3];
	}
	else
	{
		// USA: mm/dd/yyyy or mm-dd-yyyy
		
		lPattern = new RegExp(/^(0?[0-9]|1[0-2])[\-\/](0?[0-9]|1[0-9]|2[0-9]|3[0-1])[\-\/](\d{4})$/);
		lMatchArray = lPattern.exec(aValue);	
		if ( lMatchArray == null )
		{
			return false;
		} 
		
		lMonth = lMatchArray[1];
		lDay   = lMatchArray[2];
		lYear  = lMatchArray[3];
	}
	
	if (lMonth < 1 || lMonth > 12 || lDay < 1 || lDay > 31 )
	{
		return false;
	}
	
	lValidLengths = new Array( 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 );
	
	if ( lYear / 4 == parseInt( lYear / 4 ) )
	{
		lValidLengths[1] = 29;
	}

	if ( lValidLengths[lMonth - 1] < lDay )
	{
		return false;
	}
	
	return true;
}

function cancelEdit(aUrl)
{
	document.location = aUrl;
}

function checkField(aElement)
{
	var lSuccess = true;
	
	var lNodeName = aElement.nodeName.toUpperCase();
	var lType = aElement.getAttribute('type');
		
	if ( lNodeName == 'SELECT' )
	{
		aElement.className = "input_optional";
		var lRegText = aElement.getAttribute('re');
		if (lRegText != null) 
		{
			var lRegularExpression = _getRegEx(lRegText);
			var lValue = aElement.value;
			if ( lValue == "" ) 
			{
				lSuccess = false;
				aElement.className = "input_warning";
		   	}
			else 
			{
				aElement.className = "input_correct";
		   	}
		}
	}
	else if ( lNodeName == 'TEXTAREA' || lType == "text" || lType == "password" || lType == "textarea" ) 
	{
		aElement.className = "input_optional";
		var lIsOptional = false;
		var lRegText = aElement.getAttribute('re');
		if ( lRegText == null )
		{
			lRegText = aElement.getAttribute('nre');
			lIsOptional = true;
		}
		
		if (lRegText != null) 
		{
			var lRegularExpression = _getRegEx(lRegText);
			var lValue = aElement.value;
			if ( lValue == "" ) 
			{
				if ( ! lIsOptional )
				{
					lSuccess = false;
					aElement.className = "input_warning";
				}
		   	}
			else 
			{
				var lIsMatch = lRegularExpression.test( lValue );
				if ( ! lIsMatch )
				{
					lSuccess = false;
					aElement.className = "input_warning";
				}
				else
				{
					aElement.className = "input_correct";
				}
		   	}
		}
		
		var lTwin = aElement.getAttribute('pver');
		if ( lTwin != null )
		{
			lTwinElement = aElement.form.elements[lTwin];
			if ( null != lTwinElement && lTwinElement.value != aElement.value )
			{
				lSuccess = false;
				aElement.className = "input_warning";				
			}
		}
		
	}	

	
	return lSuccess;
}

function checkForm(aForm) 
{
	if ( aForm == null )
	{
		return false;	
	}
	
	var lHaveErrors = false;
	for ( lIndex = 0; lIndex < aForm.length; lIndex++) 
	{
		var lElement = aForm.elements[lIndex];
		var lSuccess = checkField(lElement);
		if ( false == lSuccess )
		{
			lHaveErrors = true;
		}
     }

	if ( lHaveErrors ) 
	{
   		alert("One or more fields have incorrect values.\nPlease correct them.");
   		return false;
	}
	
	aForm.submit();
	return true;
}

function _getRegEx(aRegExpText) 
{
   
   var lRegExpType = typeof(aRegExpText);
   
   if ( lRegExpType.toUpperCase() == "FUNCTION")
   {
       return lRegExpType;
   }
   else if (lRegExpType.toUpperCase() == "STRING") 
   {
   	 	switch (aRegExpText) 
   	 	{
   	 	case "name":
   	 		return  new RegExp(/^[a-zA-z\' ]{1,20}$/);   
   	 	case "firstname":
   	 		return  new RegExp(/^[a-zA-z\' ]{1,20}$/);  
   	 	case "lastname":
   	 		return  new RegExp(/^[a-zA-z\' ]{1,30}$/);  	 		
   	 	case "password":
   	 		return  new RegExp(/^[a-zA-Z0-9]{4,15}$/);
   	 	case "username":
   	 		return  new RegExp(/^[a-zA-Z0-9]{4,20}$/);
   	 	case "title":
   	 		return  new RegExp(/^[a-zA-Z0-9]{1,25}$/);
   	 		
  		case "email":
    		return  new RegExp(/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,5})+$/);
	
    	case "phone":
    	case "fax":
  		case "tel":
    		return new RegExp(/^((1?[\- ]?\(?\d{3}\)?[\- ]?)?\d{3}[\- ]?\d{4}){1}( [\w ]{1,7})?$/ );

    	case "phoneext":
    		return new RegExp(/^\d{0,4}$/ );
    		
  		case "date":
  		case "usadate":
    		return new DateTester(false);	// mm/dd/yyyy or mm-dd-yyyy

    	case "isodate":
    		return new new DateTester(true);	// yyyy-mm-dd

    	case "time":
    		return new RegExp(/^(0?[1-9]|1[0-2])[:]([0-5][0-9])([ ][aApP][mM])$/);
    	

    	case "perc":
				return new RegExp(/^(\d{1,3})$/);
				
		case "ssn":
				return new RegExp(/^\d{3}\-{1}\d{2}\-{1}\d{4}$/);

  		case "text":
    		return new RegExp(/^([a-z]|[A-Z]|-|,|\!|\.|\s|\d|_|&|'|\$)+$/);
    	
    	case "text255":
    		return new RegExp(/^([a-z]|[A-Z]|-|,|\.|\s|\d|_|&|'){1,255}$/);
    			
    	case "text150":
    		return new RegExp(/^([a-z]|[A-Z]|-|,|\.|\s|\d|_|&|'){1,150}$/);
    		
    	case "text80":
    		return new RegExp(/^([a-z]|[A-Z]|-|,|\.|`|"|\s|\d|_|&|'){1,80}$/);

    	case "text50":
    		return new RegExp(/^([a-z]|[A-Z]|-|,|\.|\s|\d|_|&|'){1,50}$/);
    		
    	case "text40":
    		return new RegExp(/^([a-z]|[A-Z]|-|,|\.|\s|\d|_|&|'){1,40}$/);
    		
    	case "text30":
    		return new RegExp(/^([a-z]|[A-Z]|-|,|\.|\s|\d|_|&|'){1,30}$/);

    	case "text25":
    		return new RegExp(/^([a-z]|[A-Z]|-|,|\.|\s|\d|_|&|'){1,25}$/);
    		
    	case "text20":
    		return new RegExp(/^([a-z]|[A-Z]|-|,|\.|\s|\d|_|&|'){1,20}$/);
    		
    	case "text10":
    		return new RegExp(/^([a-z]|[A-Z]|-|,|\.|\s|\d|_|&|'){1,10}$/);
    		
    	case "text3":
    		return new RegExp(/^([a-z]|[A-Z]|-|,|\.|\s|\d|_|&|'){1,3}$/);
  		
    	case "money":
    		return new RegExp(/^\d+([\.]\d\d)?$/);

    	case "year":
    		return new RegExp(/^\d{4}$/);
    		
    	case "zip":
    	case "zipcode":
		case "postalzip":
			return new RegExp(/^\d{5}(\-\d{4})?$/);
		    break;

  		default:
       		nBegin = 0; 
       		nEnd = aRegExpText.length - 1;
       		if (aRegExpText.charAt(0) == "/")
       		{
       			nBegin = 1;
       		}
       		if ( aRegExpText.charAt(aRegExpText.length - 1) == "/" ) 
       		{
       			nEnd = aRegExpText.length-1;
       		}
       		
       		return new RegExp( aRegExpText.slice(nBegin, nEnd) );
    	}
   	}
}

function markNeed() 
{
	if (document.forms.length > 0) 
	{
		var lForms = document.forms[0];
		for ( lIndex = 0; lIndex < lForms.length; lIndex++) 
		{
			
			var lElement = lForms.elements[lIndex];
			if (    ( lElement.type == "text") 
			     || ( lElement.type == "password") 
			     || ( lElement.type == "textarea") 
			     || ( lElement.type.charAt(0) == "s")) 
			{
				var lRegEx = lElement.getAttribute('re');
   				if (lRegEx != null)
   				{
   	 				lElement.className = "input_required";
   				}
   				else
   				{
					var lRegEx = lElement.getAttribute('nre');
	   				if (lRegEx != null)
	   				{
	   	 				lElement.className = "input_optional";
	   				}   					
   				}
         	}
      	}
   	}
}
