	
	var validationErrorMsg = ""
	var onValidateCallFunction = new Array()
	
	//aggiunge un comando da eseguire nel momento in cui eseguo la validazione
	function onValidateAdd( addFunction ){
		onValidateCallFunction[onValidateCallFunction.length+1] = addFunction
	}
	
	//esegue i comandi aggiunti dai vari plugins al momento della validazione
	function onValidate(){
		for( var i = 0; i < onValidateCallFunction.length; i++ )
			eval( onValidateCallFunction[i] )
	}

	
	function Validator( form_name, validationError ){
	    validationErrorMsg = validationError
		this.form_obj = document.forms[ form_name ];	
		this.name = form_name
		this.form_obj.onsubmit = validate_form
		this.addValidation = addValidation;
		this.addErrorNode = addErrorNode
		
	}
	
	function deleteErrorNode( node ){
		
		// get a reference to an existing object
		divNode = document.getElementById( node )
		// empty this object of its children
		nodelist = divNode.childNodes
		// now loop and remove them all
		c = nodelist.length;	// needed because changes dynamically
		for(i = 0; i < c; i++){
			this_node = nodelist[0]	// reference changes dynamically
			removed_node = divNode.removeChild(this_node)
		}
		// alternate method
		while( divNode.hasChildNodes() == true ){
			divNode.removeChild( divNode.childNodes[0] )
		}
	}
	
	function addErrorNode( name, error ){
		
		node = "error_" + this.name + name
		error_table =  document.getElementById( this.name + name )
		error_validation_string = document.createTextNode( error )
		brNode = document.createElement("br")
		
		errorNode = document.getElementById( node );
		errorNode.appendChild( error_validation_string )
		errorNode.appendChild( brNode )
		error_table.style.position = "relative"

		
	}
	
	function addValidation( inputName, validation, errorMsg, printName ){
		
		for( var i = 0; i < this.form_obj.elements.length; i++ ){
			var input_obj = this.form_obj.elements[ i ]
			if( input_obj.name == inputName ){
				if( input_obj.validation == null )
					input_obj.validation = new Array( )
					validationArray = new Array( validation, errorMsg, printName )
					input_obj.validation.push( validationArray )
			}
		}
	}
		
	function validate_form( ){
	
		var errorString = ""
		
		//richiama tutte le funzioni da eseguire prima della validazione
		onValidate()

		var form_obj = document.forms[ this.name ]
		form_obj.is_ok = true
	
		for( var i = 0; i < form_obj.elements.length; i++ ){
	
			if( form_obj.elements[ i ].validation != null ){
								
				deleteErrorNode( "error_" + form_obj.name + form_obj.elements[ i ].name )
	
				error_table = document.getElementById( form_obj.name + form_obj.elements[ i ].name )
				error_table.style.position = "absolute"
	
				for( var j = 0; j < form_obj.elements[ i ].validation.length; j++ ){
	
					validation = form_obj.elements[ i ].validation[ j ]
	
					if( validate = validate_input( form_obj.elements[ i ].value, validation[ 0 ], validation[ 1 ] ) ){

						error_validation_string = document.createTextNode( validate )
						
						brNode = document.createElement("br")
						
						errorNode = document.getElementById( "error_" + form_obj.name + form_obj.elements[ i ].name );
						errorNode.appendChild( error_validation_string )
						errorNode.appendChild( brNode )
						error_table.style.position = "relative"

						if( errorString )
							errorString += "\n"
							
						errorString += form_obj.elements[ i ].printName + " : " + validate
						
						form_obj.is_ok = false
					}
				}
			}
		}
		
		if( form_obj.is_ok == false )
			alert( validationErrorMsg )
	
		return form_obj.is_ok
	}
	
	function validate_input( value, validation, errorMsg ){

		var equal_position = validation.search( "=" ); 
		  
		if( equal_position >= 0 ){ 
			var validation_command = validation.substring( 0,equal_position ); 
			var validation_value = validation.substr( equal_position + 1 ); 
		} 
		else{
			var validation_command = validation; 
			var validation_value = ""; 
		}
	    
		
		

		switch( validation_command ){
			case "req":	if( value.length == 0 ) return errorMsg; break
			case "email": if ( value.length > 0 && value.search( /^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/) )
							return errorMsg; break
			case "maxlen": 	if( value.length > validation_value ) 	return errorMsg; break
		    case "minlen": 	if( value.length < validation_value ) 	return errorMsg; break
			case "greater":	if( parseFloat( value ) <= parseFloat( validation_value ) ) return errorMsg; break
			case "less":    if( parseFloat( value ) >= parseFloat( validation_value ) ) return errorMsg; break
	        case "alphanum":if( value.length > 0 && value.search("[^A-Za-z0-9]") >= 0 ) return errorMsg; break
			case "numeric":	 if( value.length > 0 && value.search("[^0-9]") >= 0 ) return errorMsg; break
			case "char":	if( value.length > 0 && value.search("[^A-Za-z]") >= 0 ) return errorMsg; break
			case "regexp": 	if( validation_value.length > 0 && !value.match( validation_value ) ) return errorMsg; break
			case "nregexp": if( validation_value.length > 0 && value.match( validation_value ) ) return errorMsg; break
			case "allow_ext": if( value.length > 0 ) if( f_ext = value.match(/(.{3}$)/)[1] )	if( validation_value.search( f_ext ) == -1 ) return errorMsg.replace(/\|/g,","); break
			case "deny_ext":  if( value.length > 0 )	if( f_ext = value.match(/(.{3}$)/)[1] )	if( validation_value.search( f_ext ) != -1 ) return errorMsg.replace(/\|/g,","); break
			default: alert( "Validation string: " + validation + " not found" )
		}
		
	}
	
	
	function collapseRow( img, id, collapse_url, expand_url ){
		var id
		if( id = document.getElementById(id) ){
			if( id.style.visibility=='hidden' ){
				id.style.visibility='visible'
				id.style.position='relative'
				img.src=collapse_url
			}else{
				id.style.visibility='hidden'
				id.style.position='absolute'
				img.src=expand_url
			}
		}
	}