/*< blank basic *******************************************************************/fValidate.prototype.blank = function(){	if ( this.typeMismatch( 'text' ) ) return;	if ( this.isBlank() )	{		this.throwError( [this.elem.fName] );	}}/*/>*//*< number numbers *******************************************************************/fValidate.prototype.number = function( type, lb, ub ){	if ( this.typeMismatch( 'text' ) ) return;	var num  = ( type == 0 ) ? parseInt( this.elem.value, 10 ) : parseFloat( this.elem.value );	lb       = this.setArg( lb, 0 );	ub       = this.setArg( ub, Number.infinity );	if ( lb > ub )	{		this.devError( [lb, ub, this.elem.name] );		return;	}	var fail = Boolean( isNaN( num ) || num != this.elem.value );	if ( !fail )	{		switch( true )		{			case ( lb != false && ub != false ) : fail = !Boolean( lb <= num && num <= ub ); break;			case ( lb != false ) : fail = Boolean( num < lb ); break;			case ( ub != false ) : fail = Boolean( num > ub ); break;		}	}	if ( fail )	{		this.throwError( [this.elem.fName] );		return;	}	this.elemPass = true;}/*/>*//*< numeric numbers *******************************************************************/fValidate.prototype.numeric = function( len ){	if ( this.typeMismatch( 'text' ) ) return;	len = this.setArg( len, '*' );	var regex = new RegExp( ( len == '*' ) ? "^\\d+$" : "^\\d{" + parseInt( len, 10 ) + "}\\d*$" );	if ( !regex.test( this.elem.value ) )	{		if ( len == "*" )		{			this.throwError( [this.elem.fName] );		} else {			this.throwError( [len, this.elem.fName], 1 );		}	}}/*/>*//*< length basic *******************************************************************/fValidate.prototype.length = function( len, maxLen ){	if ( this.typeMismatch( 'text' ) ) return;	var vlen = this.elem.value.length;	len		= Math.abs( len );	maxLen	= Math.abs( this.setArg( maxLen, Number.infinity ) );	if ( len > maxLen )	{		this.devError( [len, maxLen, this.elem.name] );		return;	}	if ( len > parseInt( vlen, 10 ) )	{		this.throwError( [this.elem.fName, len] );	}		if ( vlen > maxLen )	{		this.throwError( [this.elem.fName, maxLen, vlen], 1 );	}}/*/>*//*< alnum extended *******************************************************************/fValidate.prototype.alnum = function( minLen, tCase, numbers, spaces, puncs ){	if ( this.typeMismatch( 'text' ) ) return;	tCase = this.setArg( tCase, "a" );		//alert( [minLen,tCase,numbers,spaces,puncs] );	numbers = ( numbers == "true" || numbers == "1" );	spaces = ( spaces == "true" || spaces == "1" );	//alert( [minLen,tCase,numbers,spaces,puncs] );			var okChars = "",		arrE	= ['None','Any','No','No','Any'];	if ( minLen != '*' )	{		minLen =  parseInt( minLen, 10 );		arrE[0] = minLen;	} else {		minLen = 0;	}	switch( tCase.toUpperCase() )	{		case 'U':			okChars += 'A-Z';			arrE[1] =  'UPPER';			break;		case 'L':			okChars += 'a-z';			arrE[1] =  'lower';			break;		case 'C':			okChars += 'A-Z][a-z';			arrE[1] =  'Intial capital';			minLen--;			break;		default:			okChars += 'a-zA-Z';			break;			}	if ( numbers == true )	{		okChars += '0-9';		arrE[2] =  'Yes';	}	if ( spaces == true )	{		okChars += ' ';		arrE[3] =  'Yes';	}	if ( puncs == "any" )	{		arrE[4]  = "Any";	}	else if ( puncs == "none" )	{		arrE[4] = "None";	}	else 	{		puncs = puncs.replace( /pipe/g, "|" );		okChars += puncs;		arrE[4] =  puncs; //.toPattern().replace( /\\/g, "" );	}	var length = ( minLen != "*" )?		"{" + minLen + ",}":		"+";	var regex = ( puncs == "any" ) ?		new RegExp( "^([" + okChars + "]|[^a-zA-Z0-9\\s])" + length + "$" ):		new RegExp( "^[" + okChars + "]" + length + "$" );		if ( !regex.test( this.elem.value ) )	{		this.throwError( [this.elem.value, this.elem.fName, arrE[0], arrE[1], arrE[2], arrE[3], arrE[4]] );	}}/*/>*//*< equalto logical *******************************************************************/fValidate.prototype.equalto = function( oName ){	if ( this.typeMismatch( 'text' ) ) return;	if ( typeof oName == 'undefined' )	{		this.paramError( 'oName' );	}	var otherElem = this.form.elements[oName];	if ( this.elem.value != otherElem.value )	{		this.throwError( [this.elem.fName,otherElem.fName] );				}}/*/>*//*< ssn extended *******************************************************************/fValidate.prototype.ssn = function(){	if ( this.typeMismatch( 'text' ) ) return;	if ( !( /^\d{3}\-\d{2}\-\d{4}$/.test( this.elem.value ) ) )		this.throwError();}/*/>*//*< select controls *******************************************************************/fValidate.prototype.select = function(){	if ( this.typeMismatch( 's1' ) ) return;	if ( this.elem.selectedIndex == 0 )	{		this.throwError( [this.elem.fName] );	}}/*/>*//*< selectm controls *******************************************************************/fValidate.prototype.selectm = function( minS, maxS ){	if ( this.typeMismatch( 'sm' ) ) return;	if ( typeof minS == 'undefined' )	{		this.paramError( 'minS' );	}	if ( maxS == 999 || maxS == '*' || typeof maxS == 'undefined' || maxS > this.elem.length ) maxS = this.elem.length;	var count = 0;		for ( var opt, i = 0; ( opt = this.elem.options[i] ); i++ )	{		if ( opt.selected ) count++;	}	if ( count < minS || count > maxS )	{		this.throwError( [minS, maxS, this.elem.fName, count] );	}}/*/>*//*< selecti controls *******************************************************************/fValidate.prototype.selecti = function( indexes ){		if ( this.typeMismatch( 's1' ) ) return;	if ( typeof indexes == 'undefined' )	{		this.paramError( 'indexes' );		return;	}	indexes = indexes.split( "," );	var selectOK = true;	for ( var i = 0; i < indexes.length; i++ )	{		if ( this.elem.options[indexes[i]].selected )		{			selectOK = false;			break;		}	}	if ( !selectOK )	{		this.throwError( [this.elem.fName] );	}}/*/>*//*< cazip international *******************************************************************/fValidate.prototype.cazip = function(){	var elem = this.elem;	if ( this.typeMismatch( 'text' ) ) return;	elem.value = elem.value.toUpperCase();	if ( !( /^[A-Z][0-9][A-Z] [0-9][A-Z][0-9]$/.test( elem.value ) ) )	{		this.throwError();	}}fValidate.prototype.capost = fValidate.prototype.cazip;/*/>*//*< ukpost international *******************************************************************/fValidate.prototype.ukpost = function(){	var elem = this.elem;	if ( this.typeMismatch( 'text' ) ) return;	elem.value = elem.value.toUpperCase();	if ( !( /^[A-Z]{1,2}\d[\dA-Z] ?\d[A-Z]{2}$/.test( elem.value ) ) )	{		this.throwError();	}}/*/>*//*< germanpost international *******************************************************************/fValidate.prototype.germanpost = function(){	var elem = this.elem;	if ( this.typeMismatch( 'text' ) ) return;	elem.value = elem.value.toUpperCase();	if ( !( /^(?:CH\-)\d{4}$/.test( elem.value ) ) )	{		this.throwError();	}}/*/>*//*< swisspost international *******************************************************************/fValidate.prototype.swisspost = function(){	var elem = this.elem;	if ( this.typeMismatch( 'text' ) ) return;	elem.value = elem.value.toUpperCase();	if ( !( /^(?:D\-)\d{5}$/.test( this.elem.value ) ) )	{		this.throwError();	}}/*/>*//*< email web *******************************************************************/fValidate.prototype.email = function( level ){	if ( this.typeMismatch( 'text' ) ) return;	if ( typeof level == 'undefined' ) level = 0;	var emailPatterns = [		/.+@.+\..+$/i,		/^\w.+@\w.+\.[a-z]+$/i,		/^\w[-_a-z~.]+@\w[-_a-z~.]+\.[a-z]{2}[a-z]*$/i,		/^\w[\w\d]+(\.[\w\d]+)*@\w[\w\d]+(\.[\w\d]+)*\.[a-z]{2,7}$/i		];	if ( ! emailPatterns[level].test( this.elem.value ) )	{		this.throwError();	}	}	/*/>*//*< url web *******************************************************************/fValidate.prototype.url = function( hosts, hostOptional, allowQS ){	if ( this.typeMismatch( 'text' ) ) return;	this.setArg( hosts, "http" );		var front = "^(?:(" + hosts.replace( /\,/g, "|" ) + ")\\:\\/\\/)";	var end   = ( Boolean( allowQS ) == true ) ? "(\\?.*)?$" : "$";	if ( Boolean( hostOptional ) == true ) front += "?";	var regex = new RegExp( front + "([\\w\\d-]+\\.?)+" + end );		if ( !regex.test( this.elem.value ) )	{		this.throwError( [this.elem.fName] );	}}	/*/>*//*< ip web *******************************************************************/fValidate.prototype.ip = function( portMin, portMax ){	if ( this.typeMismatch( 'text' ) ) return;	portMin = this.setArg( portMin, 0 );	portMax = this.setArg( portMax, 99999 );	if ( !( /^\d{1,3}(\.\d{1,3}){3}(:\d+)?$/.test( this.elem.value ) ) )	{		this.throwError();	}	else	{		var part, i = 0, parts = this.elem.value.split( /[.:]/ );		while ( part = parts[i++] )		{			if ( i == 5 ) // Check port			{				if ( part < portMin || part > portMax )				{					this.throwError( [part, portMin, portMax], 1 );				}			}			else if ( part < 0 || part > 255 )			{				this.throwError();			}		}	}}/*/>*//*< decimal numbers *******************************************************************/fValidate.prototype.decimal = function( lval, rval ){	if ( this.typeMismatch( 'text' ) ) return;	var regex = '', elem = this.elem;	if ( lval != '*' ) lval = parseInt( lval, 10 );	if ( rval != '*' ) rval = parseInt( rval, 10 );		if ( lval == 0 )		regex = "^\\.[0-9]{" + rval + "}$";		else if ( lval == '*' )		regex = "^[0-9]*\\.[0-9]{" + rval + "}$";	else if ( rval == '*' )		regex = "^[0-9]{" + lval + "}\\.[0-9]+$";	else		regex = "^[0-9]{" + lval + "}\\.[0-9]{" + rval + "}$";			regex = new RegExp( regex );	if ( !regex.test( elem.value ) )	{		this.throwError( [elem.value,elem.fName] );	}	}/*/>*//*< decimalr numbers *******************************************************************/fValidate.prototype.decimalr = function( lmin, lmax, rmin, rmax ){	if ( this.typeMismatch( 'text' ) ) return;	lmin = ( lmin == '*' )? 0 : parseInt( lmin, 10 );	lmax = ( lmax == '*' )? '': parseInt( lmax, 10 );	rmin = ( rmin == '*' )? 0 : parseInt( rmin, 10 );	rmax = ( rmax == '*' )? '': parseInt( rmax, 10 );	var	decReg = "^[0-9]{"+lmin+","+lmax+"}\\.[0-9]{"+rmin+","+rmax+"}$"	var regex = new RegExp(decReg);	if ( !regex.test( this.elem.value ) )	{		this.throwError( [this.elem.fName] );	}	return true;}/*/>*//*< zip extended *******************************************************************/fValidate.prototype.zip = function( sep ){	if ( this.typeMismatch( 'text' ) ) return;	sep = this.setArg( sep, "- " );	var regex = new RegExp( "^[0-9]{5}(|[" + sep.toPattern() + "][0-9]{4})?$" );	if ( ! regex.test( this.elem.value ) )	{		this.throwError();	}}/*/>*//*< phone extended *******************************************************************/fValidate.prototype.phone = function( format ){	if ( this.typeMismatch( 'text' ) ) return;	format       = this.setArg( format, 0 );	var patterns = [		/^(\(?\d\d\d\)?)?[ -]?\d\d\d[ -]?\d\d\d\d$/,	//	loose		/^(\(\d\d\d\) )?\d\d\d[ -]\d\d\d\d$/			//	strict		];	if ( !patterns[format].test( this.elem.value ) )	{		if ( format == 1 )		{			this.throwError();		} else {			this.throwError( [], 1 );		}	}}/*/>*//*< date datetime *******************************************************************/fValidate.prototype.date = function( formatStr, delim, code, specDate ){	if ( this.typeMismatch( 'text' ) ) return;	if ( typeof formatStr == 'undefined' )	{		this.paramError( 'formatStr' );		return;	}	delim = this.setArg( delim, "/" );	var error	= [this.elem.fName, formatStr.replace( /\//g, delim )];	var format  = formatStr.split( "/" );	var compare = this.elem.value.split( delim );	var order   = new Object();		for ( var i = 0; i < format.length; i++ )	{		switch( format[i].charAt( 0 ).toLowerCase() )		{			case 'm' :				order.months = i;				break;			case 'd' :				order.days = i;				break;			case 'y' :				order.years = i;				break;		}	}	var thisDate = new Date( compare[order.years], compare[order.months]-1, compare[order.days] );	if ( isNaN( thisDate ) || thisDate.getDate() != compare[order.days] || thisDate.getMonth() != compare[order.months]-1 || thisDate.getFullYear().toString().length != formatStr.match( /y/g ).length )	{		this.throwError( error );		return;	}		var compareElem = this.form.elements[specDate];	//error in code commented out//	if ( typeof compareElem != 'undefined' )//	{//		specDate = compareElem.validDate || compareElem.value;//	}	var compareDate = ( specDate == 'today' )?		new Date():		new Date( specDate );	compareDate.setHours(0);	compareDate.setMinutes(0);	compareDate.setSeconds(0);	compareDate.setMilliseconds(0);		var timeDiff = compareDate.getTime() - thisDate.getTime();	//	alert("spec date " + specDate);//	alert("code " + code);//	alert("time diff " + timeDiff);	var dateOk   = false;		switch ( parseInt( code ) ) {		case 1 :	// Before specDate			dateOk	= Boolean( timeDiff > 0 );			error	= 1;			break;		case 2 :	// Before or on specDate			dateOk	= Boolean( ( timeDiff + 86400000 ) > 0 );			error	= 2;			break;		case 3 :	// After specDate			dateOk	= Boolean( timeDiff < 0 );			error	= 3;			break;		case 4 :	// After or on specDate			dateOk	= Boolean( ( timeDiff - 86400000 ) < 0 );			error	= 4;			break;		default : dateOk = true;		}	if ( !dateOk )	{		this.throwError( [specDate], error );	}	this.elem.validDate = thisDate.toString();}	/*/>*//*< money ecommerce *******************************************************************/fValidate.prototype.money = function( ds, grp, dml ){	if ( this.typeMismatch( 'text' ) ) return;		ds  = ( ds == ' ' )  ? false : ds.toPattern();	grp = ( grp == ' ' ) ? false : grp.toPattern();	dml = ( dml == ' ' ) ? false : dml.toPattern();		var moneySyntax, pattern;		switch( true )	{		case Boolean( ds && grp && dml ):		// Dollar sign, grouping, and decimal			pattern		= "^" + ds + "(?:(?:[0-9]{1,3}" + grp + ")(?:[0-9]{3}" + grp + ")*[0-9]{3}|[0-9]{1,3})(" + dml + "[0-9]{2})$";			moneySyntax = ds + "XX" + grp + "XXX" + dml + "XX";			break;		case Boolean( ds && grp && !dml ):		// Dollar sign and grouping			pattern		= "^" + ds + "(?:(?:[0-9]{1,3}" + grp + ")(?:[0-9]{3}" + grp + ")*[0-9]{3}|[0-9]{1,3})$";			moneySyntax = "" + ds + "XX" + grp + "XXX";			break;		case Boolean( ds && !grp && dml ):		// Dollar sign and decimal			pattern		="^" + ds + "[0-9]*(\\.[0-9]{2})$";			moneySyntax ="" + ds + "XXXXX" + dml + "XX";			break;		case Boolean( !ds && grp && dml ):		// Grouping and decimal			pattern		="^(?:(?:[0-9]{1,3}" + grp + ")(?:[0-9]{3}" + grp + ")*[0-9]{3}|[0-9]{1,3})(" + dml + "[0-9]{2})?$";			moneySyntax ="XX" + grp + "XXX" + dml + "XX";			break;		case Boolean( ds && !grp && !dml ):		// Dollar sign only			pattern		="^" + ds + "[0-9]*$";			moneySyntax ="" + ds + "XXXXX";			break;		case Boolean( !ds && grp && !dml ):		// Grouping only			pattern		="^(?:(?:[0-9]{1,3}" + grp + ")(?:[0-9]{3}" + grp + ")*[0-9]{3}|[0-9]{1,3})$";			moneySyntax ="XX" + grp + "XXX";			break;		case Boolean( !ds && !grp && dml ):		// Decimal only			pattern		="^[0-9]*(" + dml + "[0-9]{2})$";			moneySyntax ="XXXXX" + dml + "XX";			break;		case Boolean( !ds && !grp && !dml ):	// No params set, all special chars become optional			pattern		="^.?(?:(?:[0-9]{1,3}.?)(?:[0-9]{3}.?)*[0-9]{3}|[0-9]{1,3})(.[0-9]{2})?$";			moneySyntax ="[?]XX[?]XXX[?XX]";	}				var regex = new RegExp( pattern );	if ( !regex.test( this.elem.value ) )	{		this.throwError( [this.elem.fName, moneySyntax.replace( /\\/g, '' )] );	}}/*/>*//*< checkbox controls *******************************************************************/fValidate.prototype.checkbox = function( minC, maxC ){	if ( this.typeMismatch( 'cb' ) ) return;	if ( typeof minC == 'undefined' )	{		this.paramError( 'minC' );		return;	}	if ( this.elem == this.form.elements[this.elem.name] && !this.elem.checked )	{		this.throwError( [this.elem.fName] );	}	else	{		this.elem = this.form.elements[this.elem.name];		var len   = this.elem.length;		var count = 0;				if ( maxC == 999 || maxC == '*' || typeof maxC == 'undefined' || maxC > this.elem.length )		{			maxC == len;		}		var i = len;		while( i-- > 0 )		{			if ( this.elem[i].checked )			{				count++;			}		}		if ( count < minC || count > maxC )		{			this.throwError( [minC, maxC, this.elem[0].fName, count] );		}				}}/*/>*//*< radio controls *******************************************************************/fValidate.prototype.radio = function(){	if ( this.typeMismatch( 'rg' ) ) return;	if ( this.elem == this.form.elements[this.elem.name] && !this.elem.checked )	{		this.throwError( [this.elem.fName] );	}	else	{		this.elem = this.form.elements[this.elem.name];				for ( var i = 0; i < this.elem.length; i++ )		{			if ( this.elem.item( i ).checked )			{				return;			}		}		this.throwError( [this.elem[0].fName] );	}}/*/>*//*< eitheror logical *******************************************************************/fValidate.prototype.eitheror = function(){	if ( this.typeMismatch( 'hidden' ) ) return;	if ( typeof arguments[0] == 'undefined' )	{		this.paramError( 'delim' );		return;	}	if ( typeof arguments[1] == 'undefined' )	{		this.paramError( 'fields' );		return;	}	var arg, i  = 0,		fields  = new Array(),		field,		nbCount = 0,				args    = arguments[1].split( arguments[0] );			this.elem.fields = new Array();		while ( arg = args[i++] )	{		field = this.form.elements[arg];		fields.push( field.fName );		this.elem.fields.push( field );		if ( !this.isBlank( arg ) )		{			nbCount++;		}	}	if ( nbCount != 1 )	{		this.throwError( [fields.join( "\n\t-" )] );	}}/*/>*//*< atleast logical *******************************************************************/fValidate.prototype.atleast = function(){	if ( this.typeMismatch( 'hidden' ) ) return;	if ( typeof arguments[0] == undefined )	{		this.paramError( 'qty' );		return;	}	if ( typeof arguments[1] == undefined )	{		this.paramError( 'delim' );		return;	}	if ( typeof arguments[2] == undefined )	{		this.paramError( 'fields' );		return;	}	var arg, i  = 0,		fields  = new Array(),		field,		nbCount = 0,		args    = arguments[2].split( arguments[1] );	this.elem.fields = new Array();		while ( arg = args[i++] )	{		field = this.form.elements[arg];		fields.push( field.fName );		this.elem.fields.push( field );		if ( !this.isBlank( arg ) )		{			nbCount++;		}	}	if ( nbCount < arguments[0] )	{		this.throwError( [arguments[0], fields.join( "\n\t-" ), nbCount] );	}}/*/>*//*< allornone logical *******************************************************************/fValidate.prototype.allornone = function(){	if ( this.typeMismatch( 'hidden' ) ) return;	if ( typeof arguments[0] == 'undefined' )	{		this.paramError( 'delim' );		return;	}	if ( typeof arguments[1] == 'undefined' )	{		this.paramError( 'fields' );		return;	}	var arg, i  = 0,		fields  = new Array(),		field,		nbCount = 0,		args    = arguments[1].split( arguments[0] );		this.elem.fields = new Array();	while ( arg = args[i++] )	{		field = this.form.elements[arg];		fields.push( field.fName );		this.elem.fields.push( field );		if ( !this.isBlank( arg ) )		{			nbCount++;		}	}	if ( nbCount > 0 && nbCount < args.length )	{		this.throwError( [fields.join( "\n\t-" ), nbCount] );	}}/*/>*//*< comparison logical *******************************************************************/fValidate.prototype.comparison = function( field1, operator, field2 ){	if ( this.typeMismatch( 'hidden' ) ) return;	var elem1	= this.form.elements[field1],		elem2	= this.form.elements[field2],		value1	= this.getValue( elem1 ),		value2	= this.getValue( elem2 );		i18n	= this.i18n.comparison;		i		= -1;		var operators =	[		['>',	i18n.gt],		['<',	i18n.lt],		['>=',	i18n.gte],		['<=',	i18n.lte],		['==',	i18n.eq],		['!=',	i18n.neq]	];	while( operators[++i][0] != operator ){ }	this.elem.fields = [elem1, elem2];	if ( ! eval( value1 + operator + value2 ) )	{		this.throwError( [elem1.fName, operators[i][1], elem2.fName] );	}}/*/>*//*< file controls *******************************************************************/fValidate.prototype.file = function( extensions, cSens ){	if ( this.typeMismatch( 'file' ) ) return;	if ( typeof extensions == 'undefined' )	{		this.paramError( 'extensions' );		return;	}	cSens = Boolean( cSens ) ? "" : "i";	var regex = new RegExp( "^.+\\.(" + extensions.replace( /,/g, "|" ) + ")$", cSens );	if ( ! regex.test( this.elem.value ) )	{		this.throwError( [extensions.replace( /,/g, "\n" )] );	}}/*/>*//*< custom special *******************************************************************/fValidate.prototype.custom = function( flags, reverseTest ){	if ( this.typeMismatch( 'text' ) ) return;	flags     = ( flags ) ? flags.replace( /[^gim]/ig ) : "";	var regex = new RegExp( this.elem.getAttribute( this.config.pattern ), flags );	if ( !regex.test( this.elem.value ) )	{		this.throwError( [this.elem.fName] );	}	}/*/>*//*< cc ecommerce *******************************************************************/fValidate.prototype.cc = function(){	if ( this.typeMismatch( 'text' ) ) return;	var typeElem = this.form.elements[this.config.ccType];	if ( !typeElem )	{		this.devError( 'noCCType' )		return;	}	var ccType   = typeElem.options[typeElem.selectedIndex].value.toUpperCase();	var types    = {		'VISA'    : /^4\d{12}(\d{3})?$/,		'MC'      : /^5[1-5]\d{14}$/,		'DISC'    : /^6011\d{12}$/,		'AMEX'    : /^3[4|7]\d{13}$/,        		'DINERS'  : /^3[0|6|8]\d{12}$/,		'ENROUTE' : /^2[014|149]\d{11}$/,		'JCB'     : /^3[088|096|112|158|337|528]\d{12}$/,		'SWITCH'  : /^(49030[2-9]|49033[5-9]|49110[1-2]|4911(7[4-9]|8[1-2])|4936[0-9]{2}|564182|6333[0-4][0-9]|6759[0-9]{2})\d{10}(\d{2,3})?$/,		'DELTA'   : /^4(1373[3-7]|462[0-9]{2}|5397[8|9]|54313|5443[2-5]|54742|567(2[5-9]|3[0-9]|4[0-5])|658[3-7][0-9]|659(0[1-9]|[1-4][0-9]|50)|844[09|10]|909[6-7][0-9]|9218[1|2]|98824)\d{10}$/,		'SOLO'    : /^(6334[5-9][0-9]|6767[0-9]{2})\d{10}(\d{2,3})?$/		};	if ( typeElem.validated == false && this.groupError == true ) return;	if ( typeof types[ccType] == 'undefined' && typeElem.validated == false && this.groupError == false )	{		this.devError( [ccType] );		return;	}	this.elem.value = this.elem.value.replace( /[^\d]/g, "" );	if ( !types[ccType].test( this.elem.value ) || !this.elem.value.luhn() )	{		this.throwError( [this.elem.fName] );	}}String.prototype.luhn = function(){	var i = this.length;	var checkSum = "", digit;	while ( digit = this.charAt( --i ) )	{		checkSum += ( i % 2 == 0 ) ? digit * 2 : digit;	}	checkSum = eval( checkSum.split('').join('+') );	return ( checkSum % 10 == 0 );}/*/>*//*	EOF */