//<script language="javascript">
/*=============================================================================
 WebSolvers Framework Library
 Copyright 2003, WebSolvers, Inc., All Rights Reserved.                

 Library Validation (Basic Types)
 Cross-Browser/Platform common Validation library for basic variables
 
 Revision History:
 6-4-03 Created

 Supports
 Library_Validation

 Provides
 The following validation types are provided
	ltrim
	rtrim
	trim
	str([min len], [max len])
	int([min], [max])
	float([min], [max])
	date
	time
	email
	

  Notes:
=============================================================================

 The WebSolvers Framework Library may be used and/or modified by anyone owning
 the original work as it was incorporated into an original development project
 so long as this copyright notice and the comments above remain intact.  

 By using this code you agree to indemnify WebSolvers, Inc. from any liability
 that might arise from its use.

 This code may not be sold exclusively or as a part of other code without prior 
 written consent and is expressly forbidden.

 Obtain permission before redistributing this software over the Internet or 
 in any other medium. In all cases the copyright and header must remain intact. 
============================================================================= */

//======================================================================================
//                                 Internal Routines
//======================================================================================

function validator_String(value, max, min) {
	max = ((max != null) && !isNaN(parseInt(max,10)) ? parseInt(max,10) : Number.POSITIVE_INFINITY);
	min = ((min != null) && !isNaN(parseInt(min,10)) ? parseInt(min,10) : 0);
	if(max < min) {
		var h = max;
		max = min;
		min = h;
	}
	var str = '';
	
	if(value || value == 0)
		str = value.toString();

	if(!str)
		return new Array(' is not a string', value);
	if(str.length > max)
		return new Array(' cannot have more than ' + max +' characters.', value);
	if(str.length < min)
		return new Array(' must have at least ' + min + ' characters.', value);
		
	return new Array('', str);
}

function validator_Integer(value, max, min) {
	max = ((max != null) && !isNaN(parseInt(max,10)) ? parseInt(max,10) : Number.POSITIVE_INFINITY);
	min = ((min != null) && !isNaN(parseInt(min,10)) ? parseInt(min,10) : Number.NEGATIVE_INFINITY);
	if(max < min) {
		var h = max;
		max = min;
		min = h;
	}
	
	var num = cint(value.toString().trim());
	if(isNaN(num))
		return new Array(' is not a valid integer.', value);
	if(num > max)
		return new Array(' cannot be greater than ' + max +'.', value);
	if(num < min)
		return new Array(' can be no less than ' + min + '.', value);
		
	return new Array('', num);
}

function validator_Float(value, max, min) {
	max = ((max != null) && !isNaN(parseInt(max,10)) ? parseInt(max,10) : Number.POSITIVE_INFINITY);
	min = ((min != null) && !isNaN(parseInt(min,10)) ? parseInt(min,10) : Number.NEGATIVE_INFINITY);
	if(max < min) {
		var h = max;
		max = min;
		min = h;
	}
	
	value = value.toString().trim();
	if(value.substr(0, 1) == "$" || value.substr(0,1) == "%")
		value = value.substr(1);
	
	var num = parseFloat(value.trim());
	if(isNaN(num))
		return new Array(' is not a valid decimal number.', value);
	if(num > max)
		return new Array(' cannot be greater than ' + max +'.', value);
	if(num < min)
		return new Array(' can be no less than ' + min + '.', value);
		
	return new Array('', num);
}

function validator_Date(value) {
	var y = value.trim();
	var dc = (y.indexOf('/') > -1 ? '/' : (y.indexOf('-') > -1 ? '-' : (y.indexOf('.') > -1 ? '.'
			 : (y.indexOf(',') > -1 ? ',' : (y.indexOf('\\') > -1 ? '\\' : (y.indexOf(' ') > -1 ? ' '
			 : ''))))));
	var m = 0;
	var d = 0;
	var ly = 0;
	if(!dc.length)
		return new Array(' is not a valid date.', value);
			
	y = y.split(dc);
	if(y.length != 3)
		return new Array(' is not a valid date.', value);

	m = parseInt(y[0],10);
	if(isNaN(m) || m < 1)
		return new Array(' is not a valid date.', value);

	d = parseInt(y[1],10);
	if(isNaN(d) || d < 1)
		return new Array(' is not a valid date.', value);
								
	y = parseInt(y[2],10);
	if(isNaN(y) || y < 1)
		return new Array(' is not a valid date.', value);

	// going to be nice and try to handle mangled dates
	// I run two loops to be safe
	for(var i = 0; i < 2; i++) {
		if(m > 12 && y < 13) {
			h = y;
			y = m;
			m = h;
		} else if(m > 12 && d < 13) {
			h = d;
			d = m;
			m = h;
		} else if(m > 12)
			return new Array(' is not a valid date.', value);
			
		if(d > 31 && y < 32) {
			h = y;
			y = d;
			d = h;
		}
	}

	ly=(!(y % 100) && !(y % 400)) || !(y % 4);
		
	if(m == 2 && ly && d > 29)
		return new Array(' is not a valid date.', value);
	else if(m == 2 && d > 28)
		return new Array(' is not a valid date.', value);
	else if((m == 4 || m == 6 || m == 9 || m == 11) && d > 30)
		return new Array(' is not a valid date.', value);
	else if( d > 31)
		return new Array(' is not a valid date.', value);

	return new Array('', m+'/'+d+'/'+y);
}

function validator_Time(value) {
	var h = value.trim().split(' ');
	var a = "";
	var s = 0;
	var m = 0;
	if(h.length > 1) {
		a = h[h.length-1].toLowerCase().trim();
		if(a.length && (a != "am" && a != "pm"))
			return new Array(' is not a valid time.', value);
				
		h = h.slice(0, -1);
	}
	h = h.join('').split(':');
	if(h.length > 3)
		return new Array(' is not a valid time.', value);
			
	if(h.length > 2)
		s = cint(h[2].trim());
	if(h.length > 1)
		m = cint(h[1].trim());
	h = cint(h[0].trim());
		
	if(isNaN(s) || s < 0 || s > 59)
		return new Array(' is not a valid time.', value);

	if(isNaN(m) || m < 0 || m > 59)
		return new Array(' is not a valid time.', value);

	if(isNaN(h) || (a.length && (h > 12 || h < 1)) || (!a.length && (h < 0 || h > 23)))
		return new Array(' is not a valid time.', value);
			
	return new Array('', h+':'+m+':'+s+a);
}

function validator_Email(value) {
	var valid = "abcdefghijklmnopqrstuvwxyz0123456789_.-";
	
	value = value.trim().toLowerCase();
	if(value.indexOf(' ') != -1)
		return new Array(' is not a valid email address.', value);
	var e = value.split('@');
		
	if(e.length != 2)
		return new Array(' is not a valid email address.', value);
	
	for(var l = 0; l < e.length; l++)
		for(var i = 0; i < e[l].length; i++)
			if(valid.indexOf(e[l].substr(i, 1)) == -1)
				return new Array(' is not a valid email address.', value);
	
	e = e[1].split('.');
	if(e.length < 2)
		return new Array(' is not a valid email address.', value);
	
	for(l = 0; l < e.length; l++)
		if(e[l].length < 2)
			return new Array(' is not a valid email address.', value);
	
	return new Array('', value);
}

if(window.validate) {
	validate.addValidator('ltrim', 
		function anonymous(value) {
			var i = 0;
			for(i = 0; i < value.length; i++)
				value[i] = value[i].toString().ltrim();
				
			return new Array('', value);
		});

	validate.addValidator('rtrim', 
		function anonymous(value) {
			var i = 0;
			for(i = 0; i < value.length; i++)
				value[i] = value[i].toString().rtrim();
				
			return new Array('', value);
		});

	validate.addValidator('trim', 
		function anonymous(value) {
			var i = 0;
			for(i = 0; i < value.length; i++)
				value[i] = value[i].toString().trim();
				
			return new Array('', value);
		});

	validate.addValidator('str', function anonymous(value, params, field) {
			var i = 0;
			var ret = null;
			for(i = 0; i < value.length; i++)
				if(value[i] && value[i].toString().length) {
					if((ret = validator_String(value[i], params[0], params[1]))[0].length)
						return ret;
					else
						value[i] = ret[1];
				}
					
			return new Array('', value);
		}, null, 2);
	
	validate.addValidator('int', function anonymous(value, params, field) {
			var i = 0;
			var ret = null;
			for(i = 0; i < value.length; i++)
				if(value[i] && value[i].toString().length) {
					if((ret = validator_Integer(value[i], params[0], params[1]))[0].length)
						return ret;
					else
						value[i] = ret[1];
				}
					
			return new Array('', value);
		}, null, 2);

	validate.addValidator('float', function anonymous(value, params, field) {
			var i = 0;
			var ret = null;
			for(i = 0; i < value.length; i++)
				if(value[i] && value[i].toString().length) {
					if((ret = validator_Float(value[i], params[0], params[1]))[0].length)
						return ret;
					else
						value[i] = ret[1];
				}
					
			return new Array('', value);
		}, null, 2);

	validate.addValidator('date', function anonymous(value, params, field) {
			var i = 0;
			var ret = null;
			for(i = 0; i < value.length; i++)
				if(value[i] && value[i].toString().length) {
					if((ret = validator_Date(value[i]))[0].length)
						return ret;
					else
						value[i] = ret[1];
				}
					
			return new Array('', value);
		}, null, 2);

	validate.addValidator('time', function anonymous(value, params, field) {
			var i = 0;
			var ret = null;
			for(i = 0; i < value.length; i++)
				if(value[i] && value[i].toString().length) {
					if((ret = validator_Time(value[i]))[0].length)
						return ret;
					else
						value[i] = ret[1];
				}
					
			return new Array('', value);
		}, null, 2);

	validate.addValidator('email', function anonymous(value, params, field) {
			var i = 0;
			var ret = null;
			for(i = 0; i < value.length; i++)
				if(value[i] && value[i].toString().length) {
					if((ret = validator_Email(value[i]))[0].length)
						return ret;
					else
						value[i] = ret[1];
				}
					
			return new Array('', value);
		}, null, 2);
}
