
/*
Copyright (c) 2003-2005, Mike Collins and Intervalia, Inc.
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:

 * Redistributions of source code must retain the above copyright
   notice, this list of conditions and the following disclaimer.
 * Redistributions in binary form must reproduce the above copyright
   notice, this list of conditions and the following disclaimer in
   the documentation and/or other materials provided with the
   distribution.
 * Neither the name of the Intervalia, Inc nor the names of its 
   contributors may be used to endorse or promote products derived 
   from this software without specific prior written permission.
 * An modifications of source code must be resubmited to Intervalia, Inc
   Updates and corrections will be made as needed and possible to the
   official version of this file. Submissions are to be sent to
   code@intervalia.com
   
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CYBERLIFE TECHNOLOGY 
LTD OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

function FV_ValidateForm( formObj, _error )
{
	var retVal = true;
	var msg = "";
	var errorIndex = 0;
	if( _error )
	{
		msg += "\r\n* "+_error;
		retVal = false;
	}
	//var before = new Date();

	var elements = formObj.elements;
	for( var i = 0; i < elements.length; i++ )
	{
		var item = elements[i];
		if( !item.readOnly && item.type != "hidden" )
		{
			var ok = false;
			var validator = item.getAttribute("validator");
			if(  validator )
			{
				var required = item.getAttribute("required");
				if( required == false || required == "false" )
				{
					if( item.value.length == 0 )
						ok = true;
				}

				if( ok == false )
				{
					var value = item.value;
					var checked = item.checked;
					var list = validator.split( "(" );
					var func = list[0];
					var p = validator.substr(func.length+1);
					var p = p.substr(0,p.length-1);
					var params = p.split( "," );
					//alert( "Validator = ["+validator+"]\r\nfunc = ["+func+"]\r\nValue = ["+value+"]\r\nparams = ["+params+"]\r\np = ["+p+"]\r\nchecked = ["+checked+"]" );
					var funcRet = true;
					switch( func )
					{
					case "checked":
						funcRet = FV_Checked( checked, params[0] );
						break;

					case "minmax":
						funcRet = FV_MinMax( value, parseFloat(params[0]), parseFloat(params[1]), parseFloat(params[2]) );
						break;

					case "minlen":
						funcRet = FV_MinLen( value, parseFloat(p) );
						break;

					case "min":
						funcRet = FV_MinMax( value, parseFloat(params[0]), null, parseFloat(params[1]) );
						break;

					case "forceval":
						funcRet = FV_ForceValue( value, params[0] );
						break;

					case "maxlen":
						funcRet = FV_MaxLen( value, parseFloat(p) );
						break;

					case "regex":
						funcRet = FV_Regex( value, p );
						break;

					case "date":
						funcRet = FV_Date( value, p );
						break;

					case "email":
						funcRet = FV_Email( value );
						break;

					case "usphone":
						funcRet = FV_USPhone( value );
						break;

					case "match":
						funcRet = FV_Match( value, item, p );
						break;
					}
					
					if( funcRet == false )
					{
						msg += "\r\n* "+item.title;
						retVal = false;
					}
				}
			}
		}
	}

//	var after = new Date();
//	var diff = after.valueOf() - before.valueOf();
//	alert( "diff = "+diff );

	if( retVal != true )
	{
		var message = "Please correct these errors:\r\n"+msg;
		alert( message );
	}

	return retVal;
}

function FV_Checked( checked, param )
{
	retVal = false;
	
	if( param == "true" && checked )
	{
		retVal = true;
	}
	else
	if( param != "true" && !checked )
	{
		retVal = true;
	}
	
	return retVal;
}

function FV_MinMax( value, min, max, dec )
{
	//alert( value+"\r\n"+min+"\r\n"+max )

	if( isNaN(value) || isNaN(min) )
		return false;

	if( max == null )
	{
		if( (value < min) )
			return false;
	}
	else
	{
		if( (value < min) || isNaN(max) || (value > max) )
			return false;
	}

	if( !isNaN( dec ) )
	{
		if( dec < 0 || dec > 5 )
			return false;

		var sides = value.toString().split( "." );
		if( sides.length == 2 )
		{
			if( sides[1].length > dec )
				return false;
		}
	}

	return true;
}

function FV_ForceValue( value, force )
{
	var retVal = false;

	if( value == force)
		retVal = true;
	
	return retVal;
}

function FV_MinLen( value, minLen )
{
	var retVal = false;
	if( typeof( value ) == "string" )
	{
		if( value.length >= minLen )
			retVal = true;
	}
	
	return retVal;
}

function FV_MaxLen( value, maxLen )
{
	var retVal = false;
	if( typeof( value ) == "string" )
	{
		if( value.length <= maxLen )
			retVal = true;
	}
	
	return retVal;
}

function FV_Regex( value, exp )
{
	try
	{
		var re = new RegExp( exp );
		return re.test( value );
	}
	
	catch( e )
	{
	}
	
	return false;
}

function FV_Date( value, exp )
{
	var dVal = "^"+exp+"$"
	dVal = dVal.replace( /Y/g, "\\d{4}" );
	dVal = dVal.replace( /M/g, "\\d{2}" );
	dVal = dVal.replace( /D/g, "\\d{2}" );
	retVal = FV_Regex( value, dVal );
	if( retVal )
	{
		/*
		var sep = exp.substr( 1, 1 );
		dArray = dStr.split( sep );
		exec
		tempDate = new Date( dArray[0], dArray[1]-1, dArray[2] );\r\n";
		*/
		var s;
		var re = new RegExp(dVal,"ig");
		var arr = re.exec(value);
		s  = "$1 contains: "+RegExp.$1+"\n";
		s += "$2 contains: "+RegExp.$2+"\n";
		s += "$3 contains: "+RegExp.$3;
		alert( s );
	}
	
	return retVal;
}

function FV_Email( value )
{
	if( value.indexOf( ".." ) < 0 )
	{
		var email = "^[\\w-_][\\w-_\.]*\@[\\w-_\.]*[\\w-_][\.][a-zA-Z]{2,5}$"
		return FV_Regex( value, email );
	}
	
	return false;
}

function FV_USPhone( value )
{
	var phone = "^(\\d{1}[-])?\\d{3}[-]\\d{3}[-]\\d{4}$"
	var retVal = FV_Regex( value, phone )
	if( !retVal )
	{
		phone = "^(\\d{3}[-])?\\d{3}[-]\\d{4}$"
		retVal = FV_Regex( value, phone )
		if( !retVal )
		{
			phone = "^\[(]\\d{3}[)][- ]\\d{3}[-]\\d{4}$"
			retVal = FV_Regex( value, phone )
		}
	}
	
	return retVal;
}

function FV_Match( value, item, otherItem )
{
	var retVal = false;
	if( value == item.form.elements[otherItem].value )
		retVal = true;
	
	return retVal;
}

function onlyNumbers( allowPeriod )
{
	retVal = true;

	if( event.keyCode == 46 && allowPeriod )
	{
		retVal = true;
	} else
	if( event.keyCode > 57 || event.keyCode < 48 )
	{
		retVal = false;
	}

	return retVal;
}
/*
function allowNumbersKD( allowPeriod )
{
	retVal = true;

	switch( event.keyCode )
	{
		// Allow general movement keys and keypad keys
		case 8:		//Backspace
		case 9:		// Tab
		case 13:	// Enter
		case 16:	// Shift
		case 17:	// Ctrl
		case 18:	// Alt
		case 20:	// Caps lock
		case 27:	// Esc
		case 33:	// Page Up
		case 34:	// Page Down
		case 35:	// End
		case 36:	// Home
		case 37:	// Arrow Left
		case 38:	// Arrow Up
		case 39:	// Arrow Right
		case 40:	// Arrow Down
		case 45:	// Insert Key
		case 46:	// Delete Key
		case 96:	// KP 0
		case 97:	// KP 1
		case 98:	// KP 2
		case 99:	// KP 3
		case 100:	// KP 4
		case 101:	// KP 5
		case 102:	// KP 6
		case 103:	// KP 7
		case 104:	// KP 8
		case 105:	// KP 9
		case 144:	// Num lock
			if( event.altKey )
			{
				retVal = false;
			}
			break;

		case 190:	// Period
		case 110:	// KP Period
			retVal = allowPeriod;
			break;

		// Allow number keys as long as shift, ctrl and alt are not pressed
		case 48:	// 0
		case 49:	// 1
		case 50:	// 2
		case 51:	// 3
		case 52:	// 4
		case 53:	// 5
		case 54:	// 6
		case 55:	// 7
		case 56:	// 8
		case 57:	// 9
			if( !event.shiftKey && !event.cltrKey && !event.altKey )
			{
				// If the shift, ctrl and alt keys are not pressed
				// Then let this key through
				retVal = true;
			} else
			{
				// Otherwise stop the key.
				retVal = false;
			}
			break;

		// Do not allow most keys through.
		default:
			retVal = false;
			break;
	}

	event.returnValue = retVal;
	return retVal;
}
*/
