
function validate_form( fRef )
{
	var errors=0;

	resetError( fRef.freetrial30 );
	if ( !fRef.freetrial30.checked )
	{
		setError1( fRef.freetrial30, "Bitte ankreuzen wenn Sie sich f&uuml; die kostenloser Probe anmeldem m&ouml;chten.", errors );
		errors++;
	}

	// this check could be much stronger
	resetError( fRef.newdomain );
        match=fRef.newdomain.value.match(/^ *([^ ].+[^ ]) *$/);
        if ( match==null )
        {
                setError1( fRef.newdomain, "Bitte ausf&uuml;llen.", errors );
		errors++;
        }
        else fRef.newdomain.value=match[1];

	resetError( fRef.name );
	match=fRef.name.value.match(/^ *([^ ].+[^ ]) *$/);
        if ( match==null )
	{
		setError1( fRef.name, "Bitte ausf&uuml;llen.", errors );
		errors++;
	}
	else fRef.name.value=match[1];

	resetError( fRef.country );	
	if ( fRef.country.value=="0" )
	{
		setError1( fRef.country, "Bitte w&auml;hlen.", errors );
		errors++;
	}

	resetError( fRef.email );
	// this could be a much more stringent check
	match=fRef.email.value.match(/^ *([^ ].+[^ ]) *$/);
        if ( match==null )
        {
                setError1( fRef.email, "Bitte ausf&uuml;llen.", errors );
                errors++;
        }
        else fRef.email.value=match[1];

	//resetError( fRef.language );
        //if ( fRef.language.value=="0" )
        //{
        //      setError1( fRef.language, "Please select a language.", errors );
        //        errors++;
        //}

        resetError( fRef.where );
        if ( fRef.where.value==1 )
        {
                match=fRef.otherwhere.value.match(/^ *([^ ].+[^ ]) *$/);
                if ( match==null )
                {
                        setError1( fRef.where, "Please indicate where you heard about us.", errors );
                        errors++;
                }
        }

/*
	resetError( fRef.addr4 );
        match=fRef.addr1.value.match(/^ *([^ ].+[^ ]) *$/);
        if ( match==null )
        {
                setError1( fRef.addr4, "Your mailing address appears to be incomplete.", errors );
                errors++;
        }
        else fRef.addr1.value=match[1];	

        match=fRef.addr2.value.match(/^ *([^ ].+[^ ]) *$/);
        if ( match==null )
        {
                setError1( fRef.addr4, "Your mailing address appears to be incomplete.", errors );
                errors++;
        }
        else fRef.addr2.value=match[1]; */

	havevalid=0;
        for( i=0; i<fRef.mxw.length; i++ )
        {
                resetError( fRef.mxw[i] );
                resetError( fRef.mx[i] );

                // skip any empty entries.
                if ( fRef.mxw[i].value.length==0 && fRef.mx[i].value.length==0 ) continue;

                // weight specified without mxhost or vice versa
                if ( (fRef.mxw[i].value.length>0)!=(fRef.mx[i].value.length>0) )
                {
                        setError1( fRef.mxw[i], 'Sie m&uuml;ssen MX Gewicht und MX Host eingeben.', errors);
                        errors++;
                        continue;
                }

                v=fRef.mxw[i].value.match(/^ *([0-9]{1,3}) *$/);
                if ( v==null )
                {
                        setError1( fRef.mxw[i], "Bitte geben Sie 0-999 ein.", errors );
                        errors++;
                        continue;
                }
                else fRef.mxw[i].value=parseInt(v[1]);

                v=valid_mx( fRef.mx[i].value );
                if ( v==null )
                {
                        setError1( fRef.mx[i], 'Eine MX Adresse must be a valid IP-address (aaa.bbb.ccc.ddd) or a valid hostname.', errors );
                        errors++;
                        continue;
                }
                else fRef.mx[i].value=v;

                havevalid++;
        }

        if ( errors==0 && havevalid==0 )
        {
                setError( fRef.mx[0], "" );
                setError1( fRef.mxw[0], "You need to specify at least one valid MX host.", errors );
                errors++;
        }

	// construct array strings for php; although php works great with names a la 'xxxx[]', these aren't working very well in javascript ....
        if ( errors==0 )
        {
                var weights = new String();
                var mxnames = new String();

                for( i=0; i<fRef.mx.length; i++ )
                {
                        if ( fRef.mx[i].value.length>0 )
                        {
                                if ( weights.length>0 ) { weights+=','; mxnames+=','; }
                                weights+=fRef.mxw[i].value;
                                mxnames+=fRef.mx[i].value;
                        }
                }

                fRef.weights.value=weights;
                fRef.mxnames.value=mxnames;
        }


	return errors==0;
}
