var FormValidator = function( idForm, arrFields ) {
	var _aForm = document.getElementById( idForm );
	var _arrFields = arrFields;

	this.checkString = function( str, length, maxLength, minLength, pattern ) {
		if( maxLength && ( str.length > maxLength ) ) {
			throw new MessageError( 'error in validation string' );
		}
		if( minLength && ( str.length < minLength ) ) {
			throw new MessageError( 'error in validation string' );
		}
		if( length && ( str.length != length ) ){
			throw new MessageError( 'error in validation string' );
		}
		
		if( pattern ) {
			var result = pattern.test( str );
			if( !result ){
				throw new MessageError( 'error in validation string' );
			}
		}
	}
	
	this.checkAnyURI = function( str ) {
		if( ! str.length ){
			throw new MessageError( 'error in validation any url' );
		}
	}
	this.checkEmail = function( str ) {
		if( 0 == str.length ){
			throw new MessageError( 'error in validation email' );
		}else{
			var pattern = /[0-9a-z_]+@[0-9a-z\-]+/i
			var result = pattern.test( str );
			if( !result ){
				throw new MessageError( 'error in validation email' );
			}
		}
	}
	
	this.checkPositiveInteger = function( i, maxI, minI ) {
		if( !YAHOO.lang.isNumber( i ) || ( i < 0 ) ){
				throw new MessageError( 'error in validation unsigned byte' );
		}
		if( maxI && ( i > maxI ) ) {
			throw new MessageError( 'error in validation unsigned byte' );
		}
		if( minI && ( i < minI ) ) {
			throw new MessageError( 'error in validation unsigned byte' );
		}
	}
	
	this.checkPasswordConfirm = function( str, str1 ) {
		if( str != str1  ){
			throw new MessageError( 'error in validation unsigned byte' );
		}
	}
	this.checkSelect = function( str, arr ) {
		if( arr ){
		alert(0)
			var found = false;
			for( var i = 0; i < arr.length; ++i ) {
				if( arr[i] == str ) {
					found = true;
				}
			}
			if( !found ) {
				throw new MessageError( 'error in validation string' );
			}
		}else{
			if( str == 'null'  ){
				throw new MessageError( 'error in validation string' );
			}
		}
	}
	
	this.checkIsValid = function() {
		for( var i = 0; i < _arrFields.length; ++i ) {
			var oF;
			try {
				switch( _arrFields[i].type ) {
					case "xs:string":
						oF = _aForm[ _arrFields[i].name ];
			  		this.checkString( oF.value, _arrFields[i].length, _arrFields[i].maxLength, _arrFields[i].minLength, _arrFields[i].pattern );
			  	break;
					case "xs:anyURI":
						oF = _aForm[ _arrFields[i].name ];
				  	this.checkAnyURI( oF.value );
				  break;
					case "xs:positiveInteger":
						oF = _aForm[ _arrFields[i].name ];
				  	this.checkPositiveInteger( parseInt( oF.value), _arrFields[i].maxInclusive,_arrFields[i].minInclusive  );
					break;
					case "select":
						oF = _aForm[ _arrFields[i].name ];
			  		this.checkSelect( oF.value, _arrFields[i].values );
			  	break;
					case "email":
						oF = _aForm[ _arrFields[i].name ];
			  		this.checkEmail( oF.value, _arrFields[i].values );
			  	break;
					case "password":
						oF = _aForm[ _arrFields[i].name ];
						oF1 = _aForm[ _arrFields[i].congruous ];
			  		this.checkPasswordConfirm( oF.value, oF1.value );
			  	break;
					case "radio":
					 	var oField = _aForm[ _arrFields[i].name ];
						for( var j = 0; j < oField.length; ++j ) {
								if( oField[j].checked == true ) {
									oF = oField[j];
								}
						}
						try {
			  			this.checkSelect( oF.value, _arrFields[i].values );
					 	}
					 	catch( e ) {
					 		oF = oField[0];
					 		throw new MessageError( 'error' );
					 	}
			  	break;
					default:
						throw new MessageError( 'Validator of type '+ _arrFields[i].type + ' is not inplemented yet' );
				}
			}
			catch( e ) {
				if( 'strict' == _arrFields[i].stringency ) {
					throw new MessageFormError( _arrFields[i].comment, oF );
				}
				if( 'recomendation' == _arrFields[i].stringency ) {
					if( !confirm(  _arrFields[i].comment ) ) {
						return false;
					}
				}
			}
		}
		return true;
	}
}



var FormValidatorMessageRepresentation = function( oForm, oQue, classError ) {
	var _oForm = oForm;
	var _oQue = oQue;
	var _classError = classError;

	this.show = function( oEvent, arrArgs ) {
		var _oMess = arrArgs[0];
		if( ! _oMess instanceof MessageFormError ) {
			return;
		} 
		for( var i = 0; i < _oForm.elements.length; ++i ) {
			YAHOO.util.Dom.removeClass( _oForm.elements[ i ].parentNode, _classError );
		}
		YAHOO.util.Dom.addClass( _oMess.oField.parentNode, _classError );
	}

	
	oQue.subscribeRepresentation( this );
}
YAHOO.lang.extend( FormValidatorMessageRepresentation, MessageRepresentationBase );