/*
 * Copyright (c) 2002 BSW (info@bsw.dk)
 * Please use this script everywhere you like, but keep this header intact.
 * I have only testet it with IE 6.0+, but it should work with any Internet explorer.
 * Comments and questions try my e-mail.
*/



var BIT_NOT_EMPTY = Number(1);
var BIT_ONE_SELECTED=Number(2);
var BIT_VALID_EMAIL=Number(4);
var BIT_VALID_DATE=Number(8);
var BIT_CONDITIONAL_FILL=Number(16);
var BIT_CONDITIONAL_ONE_SELECTED=Number(32);
var BIT_DONT_SELECT=Number(64);
var BIT_MAX_LENGTH=Number(128);
var BIT_MIN_LENGTH=Number(256);
var BIT_CHECK_ALPHANUM=Number(512);
var BIT_CHECK_NUM=Number(1024);
var BIT_CHECK_ALPHA=Number(2048);
var BIT_CHECK_LESS_THAN=Number(4096);
var BIT_CHECK_GREATER_THAN=Number(8192);
var BIT_CHECK_BETWEEN_NUMBERS=Number(16384);

var FLD_TYPE_TEXT="text";
var FLD_TYPE_SELECT="select-one";
var FLD_TYPE_SELECT_MULTIPLE="select-multiple";
var FLD_TYPE_RADIO="radio";
var FLD_TYPE_CHECKBOX="checkbox";
var FLD_TYPE_PASSWORD="password";

var ERR_MSG_START="Gelieve volgende veld(en) in te vullen vooraleer het document verstuurd kan worden:\t\t\t\t\t";
var ERR_SEP="\n_____________________________________________________\n\n";
var ERR_MSG_END="Druk opnieuw op verzenden na aanvulling van de lege velden";

function getErrorMessage(label,bits2,valueCH)
{
        var ret="";
        bits=parseInt(bits2);

        if(Number(bits & BIT_NOT_EMPTY)==BIT_NOT_EMPTY||Number(bits & BIT_CONDITIONAL_FILL)==BIT_CONDITIONAL_FILL)
        {
                ret=ret+", mag niet leeg zijn";
        }
        if(Number(bits & BIT_ONE_SELECTED)==BIT_ONE_SELECTED||Number(bits & BIT_CONDITIONAL_ONE_SELECTED)==BIT_CONDITIONAL_ONE_SELECTED)
        {
                ret=ret+", er dient minstens 1 optie geselecteerd te worden";
        }

        if(Number(bits & BIT_VALID_EMAIL)==BIT_VALID_EMAIL)
        {
                ret=ret+", moet een geldig e-mailadres bevatten";
        }
        if(Number(bits & BIT_VALID_DATE)==BIT_VALID_DATE)
        {
                ret=ret+", moet een geldige datum bevatten";
        }
        if(Number(bits & BIT_DONT_SELECT)==BIT_DONT_SELECT)
        {
                ret=ret+", selecteer een optie";
        }
        if(Number(bits & BIT_MAX_LENGTH)==BIT_MAX_LENGTH)
        {
                ret=ret+", moet minder dan "+valueCH+" karakters bevatten";
        }
        if(Number(bits & BIT_MIN_LENGTH)==BIT_MIN_LENGTH)
        {
                ret=ret+", moet minstens "+valueCH+" karakters lang zijn";
        }
        if(Number(bits & BIT_CHECK_ALPHANUM)==BIT_CHECK_ALPHANUM)
        {
                ret=ret+", enkel alfanumerische karakters toegelaten";
        }
        if(Number(bits & BIT_CHECK_NUM)==BIT_CHECK_NUM)
        {
                ret=ret+", enkel cijfers toegelaten";
        }
        if(Number(bits & BIT_CHECK_ALPHA)==BIT_CHECK_ALPHA)
        {
                ret=ret+", enkel letters toegelaten";
        }
        if(Number(bits & BIT_CHECK_LESS_THAN)==BIT_CHECK_LESS_THAN)
        {
                ret=ret+", waarde moet kleiner zijn dan "+valueCH;
        }
        if(Number(bits & BIT_CHECK_GREATER_THAN)==BIT_CHECK_GREATER_THAN)
        {
                ret=ret+", waarde moet groter zijn dan "+valueCH;
        }
        if(Number(bits & BIT_CHECK_BETWEEN_NUMBERS)==BIT_CHECK_BETWEEN_NUMBERS)
        {
                ret=ret+", waarde moet liggen tussen "+valueCH.split('-')[0]+' en '+valueCH.split('-')[1];
        }

        ret=ret.substr(1);
        ret= "• " + label+": "+ret;

        return ret;
}

function checkNumberBetween(field,min,max)
{
        var ret=0;
        if(!isNaN(field.value))
        {
                if(Number(field.value)>=min)
                {

                        if(Number(field.value)>max)
                        {

                          ret= BIT_CHECK_BETWEEN_NUMBERS;
                        }

                }
                else
                {
                          ret= BIT_CHECK_BETWEEN_NUMBERS;
                }

        }
        else
        {
                ret= BIT_CHECK_BETWEEN_NUMBERS;
        }

        return ret;
}

function checkNotEmpty(field)
{
        var ret=0;

        if(field.type==FLD_TYPE_TEXT || field.type==FLD_TYPE_PASSWORD)
        {
                if(field.value=='')
                {
                        ret=ret | BIT_NOT_EMPTY;
                }

        }
        return ret;
}




function checkValidEmail(field)
{
        var ret=0;
        var reg="[a-zA-Z0-9_+\.]*@[a-zA-Z0-9_+\.]{1,}\.[a-zA-Z]{2,}$";
        var localValid=true;
        var valu=0;


        if(field.type==FLD_TYPE_TEXT)
        {
                if(field.value!='')
                {
                valu=field.value.search(reg);
                if(valu!=0)
                {
                        localValid=false;
                }


                }

        }
        if(localValid==false)
        {
                ret= BIT_VALID_EMAIL;
        }
        return ret;

}

function validateField(form,fieldN,bits2,fieldCH,ValueCH)
{
        var ret=0;
        var field;
        bits=parseInt(bits2,10);
        field=form.elements[fieldN];

        if(Number(bits & BIT_NOT_EMPTY)==BIT_NOT_EMPTY)
        {

                ret=ret | checkNotEmpty(field);


        }

        if(Number(bits & BIT_ONE_SELECTED)==BIT_ONE_SELECTED)
        {
                //field=form.elements[fieldN];
                if(field.type==FLD_TYPE_SELECT)
                {
                        field=form.elements[fieldN];
                        if(field.options.selectedIndex==-1)
                        {
                                ret= ret | BIT_ONE_SELECTED;
                        }
                }
                else if(field.type==FLD_TYPE_SELECT_MULTIPLE)
                {
                        field=form.elements[fieldN];
                        var localSel=false;



                        for(x=0;x<field.options.length;x++)
                        {

                                if(field.options[x].selected==true)
                                {

                                        localSel=true;
                                }
                        }
                        if(localSel==false)
                        {
                                ret= ret | BIT_ONE_SELECTED;
                        }

                }
                else // if(field.type==FLD_TYPE_RADIO || field.type==FLD_TYPE_CHECKBOX)
                {
                        var localSelected=false;
                        //field=form.elements[fields[xy].field];
                        for(x=0;x<form.elements.length;x++)
                        {
                                field=form.elements[x];
                                if(field.name==fieldN)
                                {
                                        if(field.checked==true)
                                        {
                                                localSelected=true;
                                        }
                                }
                        }
                        if(localSelected==false)
                        {
                                ret= ret | BIT_ONE_SELECTED;
                        }
                }

        }

        if(Number(bits & BIT_VALID_EMAIL)==BIT_VALID_EMAIL)
        {
                //field=form.elements[fieldN];
                ret=ret | checkValidEmail(field);

        }
        if(Number(bits & BIT_VALID_DATE)==BIT_VALID_DATE)
        {
                var localValid=true;
                if(field.type==FLD_TYPE_TEXT)
                {
                        if(field.value!='')
                        {

                                if(field.value.length<10||field.value.length>10)
                                {
                                        localValid=false;
                                }
                                else
                                {
                                        //Insure that 3d and 5th position is seperator
                                        if(field.value.substr(2,1)!='-')
                                        {
                                                localValid=false;
                                        }
                                        if(field.value.substr(5,1)!='-')
                                        {
                                                localValid=false;
                                        }
                                        //for european format
                                        if(field.value.substr(0,2)>31||field.value.substr(3,2)>12)
                                        //for us format
                                        //if(field.value.substr(0,2)>12||field.value.substr(3,2)>31)
                                        {
                                                localValid=false;
                                        }
                                        //check for numbers and valid characters in date
                                        var charpos = field.value.search("[^0-9\-]");
                                        if(field.value.length > 0 &&  charpos >= 0)
                                        {
                                                localValid=false;
                                        }
                                }
                        }


                }

                if(localValid==false)
                {
                        ret= ret | BIT_VALID_DATE;
                }
        }
        if(Number(bits & BIT_CONDITIONAL_FILL)==BIT_CONDITIONAL_FILL)
        {
                for(x=0;x<form.elements.length;x++)
                {
                        field=form.elements[x];
                        if(field.name==fieldCH)
                        {
                                if(field.checked==true)
                                {
                                        if(field.value==ValueCH)
                                        {
                                                field2=form.elements[fieldN];
                                                if(field2.value=='')
                                                {
                                                        ret=ret | BIT_CONDITIONAL_FILL;
                                                }
                                        }
                                }
                        }
                }

        }
        if(Number(bits & BIT_CONDITIONAL_ONE_SELECTED)==BIT_CONDITIONAL_ONE_SELECTED)
        {
                var localSelected=false;
                var checkedCount=0;
                for(x=0;x<form.elements.length;x++)
                {
                        field=form.elements[x];
                        if(field.name==fieldCH)
                        {
                                if(field.checked==true)
                                {
                                        checkedCount++;
                                        if(field.value==ValueCH)
                                        {
                                                field2=form.elements[fieldN];
                                                for(fg=0;fg<field2.length;fg++)
                                                {
                                                        if(field2[fg].checked==true)
                                                        {
                                                                localSelected=true;
                                                        }
                                                }

                                        }
                                        else
                                        {
                                        localSelected=true;
                                        }
                                }
                        }

                }
                if(checkedCount==0)
                {
                        localSelected=true;
                }
                if(localSelected==false)
                {
                        ret= ret | BIT_CONDITIONAL_ONE_SELECTED;
                }
        }
        if(Number(bits & BIT_DONT_SELECT)==BIT_DONT_SELECT)
        {
                field=form.elements[fieldN];
                if(field.value==ValueCH)
                {
                        ret= ret | BIT_DONT_SELECT;
                }
        }
        if(Number(bits & BIT_MAX_LENGTH)==BIT_MAX_LENGTH)
        {
                field=form.elements[fieldN];
                if(eval(field.value.length)>eval(ValueCH))
                {
                        ret= ret | BIT_MAX_LENGTH;
                }
        }
        if(Number(bits & BIT_MIN_LENGTH)==BIT_MIN_LENGTH)
        {
                field=form.elements[fieldN];
                if(eval(field.value.length)<eval(ValueCH))
                {
                        ret= ret | BIT_MIN_LENGTH;
                }
        }
        if(Number(bits & BIT_CHECK_ALPHANUM)==BIT_CHECK_ALPHANUM)
        {
                field=form.elements[fieldN];
                var charpos=field.value.search("[^A-Za-z0-9]");
                if(field.value.length > 0 && charpos >= 0)
                {
                        ret= ret | BIT_CHECK_ALPHANUM;
                }
        }
        if(Number(bits & BIT_CHECK_NUM)==BIT_CHECK_NUM)
        {
                field=form.elements[fieldN];
                var charpos=field.value.search("[^0-9]")
                if(field.value.length > 0 &&  charpos >= 0)
                {
                        ret= ret | BIT_CHECK_NUM;
                }
        }
        if(Number(bits & BIT_CHECK_ALPHA)==BIT_CHECK_ALPHA)
        {
                field=form.elements[fieldN];
                var charpos=field.value.search("[^A-Za-z]")
                if(field.value.length > 0 &&  charpos >= 0)
                {
                        ret= ret | BIT_CHECK_ALPHA;
                }
        }
        if(Number(bits & BIT_CHECK_LESS_THAN)==BIT_CHECK_LESS_THAN)
        {
                field=form.elements[fieldN];
                if(!isNaN(field.value))
                {
                        if(eval(field.value)>=eval(ValueCH))
                        {
                                ret= ret | BIT_CHECK_LESS_THAN;
                        }
                }
        }
        if(Number(bits & BIT_CHECK_GREATER_THAN)==BIT_CHECK_GREATER_THAN)
        {
                field=form.elements[fieldN];
                if(!isNaN(field.value))
                {
                        if(eval(field.value)<=eval(ValueCH))
                        {
                                ret= ret | BIT_CHECK_GREATER_THAN;
                        }
                }
        }
        if(Number(bits & BIT_CHECK_BETWEEN_NUMBERS)==BIT_CHECK_BETWEEN_NUMBERS)
        {
                        field=form.elements[fieldN];
                        ;
                        var min=Number(ValueCH.split('-')[0]);

                        var max=Number(ValueCH.split('-')[1])

                        ret=ret | checkNumberBetween(field,min,max);
        }

        return ret;
}


function fieldValidation(field1,label1,bits1,condition1,value1)
{
        this.field=field1;
        this.label=label1;
        this.bits=bits1;
        this.condition=condition1;
        this.value=value1;
        return this;
}

function validateForm(form,fields)
{
var ret=true;
var errMsg=ERR_MSG_START+ERR_SEP;
var err=false;
var valid=0;

        for(xy=0;xy<fields.length;xy++)
        {

                valid=validateField(form,fields[xy].field,fields[xy].bits,fields[xy].condition,fields[xy].value);

                if(valid!=0)
                {
                        err=true;
                        errMsg=errMsg+getErrorMessage(fields[xy].label,valid,fields[xy].value)+"\n";
                }
         }


errMsg=errMsg+ERR_SEP+ERR_MSG_END;
if(err==true)
{
        alert(errMsg);
        ret=false;
}
else
{        
        form.submit();
        ret=true;
}        
        return ret;

}