var QW_VALID_STRING = 0x000;
var QW_VALID_NUMBER = 0x001;
var QW_VALID_EMAIL  = 0x002;

var QW_VALID_FLOAT   = 0x000;
var QW_VALID_INTEGER = 0x010;

var QW_VALID_POSITIVE = 0x100;
var QW_VALID_NOTZERO  = 0x200;

var QW_VALID_lastError = '';
function QW_VALID_getLastError() {
	return QW_VALID_lastError;
}

function QW_VALID_setValidation( field, flags ) {
	field.validationFlags = flags;
}

function QW_VALID_isValidEmail(mail) {
	var pos = mail.indexOf('@');
	if ( pos < 0 )
		return false;
	
	var localpart = mail.substr(0,pos);
	var regexpLocal = new RegExp( "^(\\.|\\+|~|/|'|\\-|_|`|^|\\$|%|&|!|'|\\||\\{|[a-z]|[A-Z]|[0-9])*$", '' );
	if ( !regexpLocal.test(localpart) )
		return false;

	var domainpart = mail.substr(pos+1);
	pos = domainpart.lastIndexOf('.');
	if ( pos < 0 )
		return false;
	var domainmainpart  = domainpart.substr(0,pos);
	var domainextension = domainpart.substr(pos+1);
	var regexpMainpart  = new RegExp( "^(\\.|\\+|~|/|'|\\-|_|`|^|\\$|%|&|!|'|\\||\\{|[a-z]|[A-Z]|[0-9])*$", '' );
	var regexpExtension = new RegExp( "^[a-z][a-z]?[a-z]?$", 'i' );
	
	if ( !regexpMainpart.test(domainmainpart) || !regexpExtension.test(domainextension) )
		return false;
	
	return true;
}

function QW_VALID_isValid( field ) {
	var val = field.value;
	QW_VALID_lastError = '';
	
	var flags = field.validationFlags;
	
	var type       = flags & 0x00F;
	var typeNum    = flags & 0x0F0;
	var typeNumVal = flags & 0xF00;
	
	switch (type) {
		case QW_VALID_STRING: return true;
		case QW_VALID_EMAIL: if ( QW_VALID_isValidEmail(val) ) return true; else { QW_VALID_lastError='E-Mail invalide'; return false; }
		case QW_VALID_NUMBER: {
			if ( (typeNumVal & QW_VALID_INTEGER) == QW_VALID_INTEGER ) {
				var regexp = new RegExp( "^(\\-)?[0-9]+", '' );
				if ( !regexp.test(val) ) { QW_VALID_lastError='Veuillez entrer une valeur entière.'; return false; }
			}
			// QW_VALID_FLOAT
			var regexp = new RegExp( "^(\\-)?([0-9]|([0-9]*(\\.)?[0-9]*))$", '' );
			if ( !regexp.test(val) ) { QW_VALID_lastError='Veuillez entrer une valeur numérique.'; return false; }

			if ( ((typeNumVal & QW_VALID_NOTZERO) == QW_VALID_NOTZERO) && parseFloat(val) == 0 ) { QW_VALID_lastError='Veuillez entrer une valeur non-nulle.'; return false; }
			if ( ((typeNumVal & QW_VALID_POSITIVE) == QW_VALID_POSITIVE) && parseFloat(val) < 0 ) { QW_VALID_lastError='Veuillez entrer une valeur positive.'; return false; }
		}
	}
	
	return true;
}