/*< blank basic *******************************************************************/
fValidate.prototype.blank = function()
{
if ( this.typeMismatch( 'text' ) ) return;
if ( this.isBlank() )
{

this.throwError( [this.elem.fName] );
}
}
/*/>*/
/*< select controls *******************************************************************/
fValidate.prototype.select = function()
{
if ( this.typeMismatch( 's1' ) ) return;
if ( this.elem.selectedIndex == 0 )
{
this.throwError( [this.elem.fName] );
}
}
/*/>*/
/*< 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();
}
}
/*/>*/
/*< email web *******************************************************************/
fValidate.prototype.email = function( level )
{
if ( this.typeMismatch( 'text' ) ) return;
if ( typeof level == 'undefined' ) level = 3;
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();
} 
} 
/*/>*/
/*< 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] );
}
}
/*/>*/
/*< 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] );
}
}
/*/>*/
/*< 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==false )
{
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)
{
    this.throwError( [minC, maxC, this.elem[0].fName, count] );
} 
}
}
/*/>*/
/*< phone controls *******************************************************************/
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 );
}
}
}
/*/>*/