
/*
 *  Algemene Javascript functies
 */


var t_tekst     = 1;
var t_datum     = 2;
var t_keuze     = 3;
var t_nummer    = 4;
var t_bedrag    = 5;
var t_meerkeuze = 6;

/*
 *
 * DHTML Functies
 *
 */


/*
 ************************************************************************************
 * Validatie Functies
 ************************************************************************************
 */

/*
 * isNummer( nummer)    Controleert of de gegeven string een juist nummer is
 *
 * returned             true wanneer het een goed nummer is anders false
 */

function isNummer( nummer)
{
    var i;

    nummer = trim( nummer);

    /* Een leeg nummer is geen nummer */
    if( isLeeg( nummer))     return false;

    /* Kijk of het nummer alleen uit cijfers bestaat */
    for( i = 0; i < nummer.length; i++) {
         if( nummer.charAt(i) < '0'  ||  nummer.charAt(i) > '9')    return( false);
    }

    /* Geen fout gevonden */
    return( true);
}




    /*
     * isGetal( getal)      Controleert of de gegevenstring een juist getal is
     *
     * returned             true wanneer het een goed getal is anders false
     */

    function isGetal( getal){
        var i, aantalKommas;

        getal = trim( getal);
	    aantalKommas = 0;

        /* Een leeg getal is geen nummer */
        if( isLeeg( getal))     return false;

        /* Kijk of het nummer alleen uit cijfers komma's en punten bestaat */
        for( i = 0; i < getal.length; i++) {
		    if( getal.charAt(i) == ',') {
		 	    aantalKommas += 1;
		    }
            if( (getal.charAt(i) < '0'  ||  getal.charAt(i) > '9')  &&  getal.charAt(i) != '.')    return( false);
        }

        /* Geen fout gevonden */
        return( aantalKommas <= 1);
    }


    function isTelefoonnummer( str) {
        return str.match( /^[^A-Za-z]+$/);
    }


    function postcodeOK( postcode, formaat){
      var goed, pcPos, pcChar, fmtPos, fmtChar, nieuw;

      /* Lege formaat string? dan is alles goed */
      if( formaat == null  ||  formaat == '') return postcode;

      nieuw = '';
      fmtPos = 0;
      pcPos  = 0;
      goed   = true;
      while( fmtPos < formaat.length  &&  pcPos <= postcode.length  &&  goed) {
          fmtChar = formaat.charAt( fmtPos);
          pcChar  = postcode.charAt( pcPos);
          kopieer = true;

          if( fmtChar == '9') {
              goed = (pcChar >= '0' &&  pcChar <= '9');
          }
          else if( fmtChar == 'a' ||  fmtChar == 'A') {
              goed = ((pcChar >= '0'  &&  pcChar <= '9')  ||  (pcChar >= 'a' &&  pcChar <= 'z')  ||  (pcChar >= 'A'  &&  pcChar <= 'Z'));
          }
          else if( fmtChar == '*') {          /* We hebben een ster, dus we zijn klaar, kopieer de rest van de postcode */
              nieuw  += postcode.substring( pcPos, postcode.length);
              fmtPos += 1;
              pcPos   = postcode.length;
              kopieer = false;
          }
          else if( fmtChar != pcChar) {       /* We hebben niet het gewenst format character, dus voeg het toe aan de nieuwe */
              nieuw  += fmtChar;
              fmtPos += 1;
              kopieer = false;
          }

          if( goed  &&  kopieer) {
              nieuw += pcChar;
              pcPos += 1;
              fmtPos += 1;
          }
      }

      goed = (pcPos == postcode.length  &&  fmtPos == formaat.length);
      return (goed ? nieuw : null);
  }


    function isPostcode( str){
        return str.match( /^\d{4} ?[A-Z]{2}$/i);
    }



function isIEObject(a){
    return isObject(a) && typeof a.constructor != 'function';
}

function isFunction(a){
    return typeof a == 'function';
}

function isObject(a) {
    return (typeof a == 'object' && !!a) || isFunction(a);
}

function isArray(a){
    return isObject(a) && a.constructor == Array;
}
 
 

/*
 * isDatum( dag, maand, jaar)    Controleert of de gegevens strings samen een juiste datum vormen
 *
 * returned                      true wanneer het een goed datum is anders false
 */

function isDatum( dag, maand, jaar)
{
    var dagenInMaand =  new Array( 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);

    /* Als alle waarden leeg zijn beschouwen we dit als een goede datum */
    if( dag == ''  &&  maand == ''  &&  jaar == '')     return true;

    /* Controleer eerst of het allemaal nummers zijn */
    if( !isNummer( dag)  ||  !isNummer( maand)  ||  !isNummer( jaar))    return( false);

    /* Controleer range van de maand */
    if( maand < 1  ||  maand > 12 )    return( false);

    /* Controleer het jaar */
    if( jaar < 1870  ||  jaar > 2100)  return( false);

    /* Controleer op een schrikkeljaar */
    if( maand == 2  &&  dag == 29) {
       if(!(jaar % 4 == 0  &&  (jaar % 100 != 0   ||  jaar % 400 == 0))) return false;    /* We hebben geen schrikkeljaar */
    }

    /* Controleer de dag */
    if( dag < 1  ||  dag > dagenInMaand[maand - 1])  return( false);

    /* Als we hier zijn is de datum goed */
    return( true);
}



/*
 * isLeeg( string)    Controleert of de gegeven string leeg is of alleen maar spaties bevat
 *
 * returned           true wanneer de string leeg is anders false
 */

function isLeeg( deString)
{
   return( trim( deString).length == 0);
}


function isChecked( radios)
{
    for(i=0; i<radios.length; i++) if(radios[i].checked) return true;
    return false;
}


/* eersteKapitaal    Maakt van de eerste letter in de gegeven string en hoofdletter en geeft de nieuwe string terug */

function eersteKapitaal( str)
{
    var nw;

    /* Null string wordt leeg */
    if( str == null) {
        return '';
    }

    str = String( str);
    nw = '';

    /* Eerste letter wordt hoofdletter */
    if( str.length >= 1) {
        nw += str.charAt(0).toUpperCase();
    }

    /* Rest zo laten */
    if( str.length >= 2) {
        nw += str.substr( 1, str.length - 1);
    }

    return nw;
}


/*
 * vergelijkDatum( dag1, maand1, jaar1, dag2, maand2, jaar2)
 *       Vergelijkt twee datums en returned de volgende waarden:
 *       -1  :  datum1 is kleiner dan datum2
 *       0   :  datum1 en datum2 zijn gelijk
 *       1   ;  datum1 is groter dan datum2
 */

function vergelijkDatums( dag1, maand1, jaar1, dag2, maand2, jaar2)
{
    var datum1, datum2;

    if( dag1 == dag2  &&  maand1 == maand2  &&  jaar1 == jaar2) {
        return 0;
    }

    datum1 = new Date( jaar1, maand1 - 1, dag1);
    datum2 = new Date( jaar2, maand2 - 1, dag2);

    if( datum1 < datum2) {
        return -1;
    }
    else {
        return 1;
    }
}



/*
 * completeURL()    returned een complete URL op basis van het gegeven relatieve pad
 */

function completeURL( bestand)
{
    var  l, url;

    l = window.location;
    url = l.protocol + '//' + l.hostname + '/' + l.pathname;

    return url.substring( 0, url.lastIndexOf('/')) + '/' + bestand;

}



/*
 * telWoorden()    returned het aantal woorden in een tekst
 */

function telWoorden(strtekst){

	var r = 0;
	a=strtekst.replace('\n',' ');
	a=a.split(' ');
	for (z=0; z<a.length; z++) {if (a[z].length > 0) r++;}
	
	return r;

}


/*
 * formatDatum		Formateert een datum als 'yyyy-mm-dd'
 */

function formatDatum( dag, maand, jaar)
{
	if( isLeeg(dag)  &&  isLeeg( maand)  &&  isLeeg( jaar)) {
		return '';
	}

	if( dag.length == 1)    dag = '0' + dag.toString();
	if( maand.length == 1)  maand = '0' + maand.toString();
	while( jaar.length < 4) { jaar = '0' + jaar.toString()};

	return( jaar + '-' + maand + '-' + dag);
}

 /*
 * type2Str( formulier, veldType, veldNaam)
 *           Converteert het gegeven type naar de veldNaam met het gegeven type (gedefinieerd in functies.asp) naar
 *           een string, zodat deze gebruikt kan worden om de string in de database op te slaan. De functie is gelijk
 *           aan de ASP functie type2Str
 *
 */

function type2Str( frm, veldType, naam)
{
    var veld, i, waarde;

    veld = frm.elements[naam];
    switch( Number( veldType)) {
        case t_tekst:
        case t_nummer:
        case t_bedrag:
            return veld.value;


        /* Voor select lijsten moeten we alle opties na gaan en voor elke gekozen optie voegen we toe */
        /* aan de string (gescheiden door ,) */
        case t_keuze:
            waarde = '';
            if( typeof( veld.options) != "undefined") {
                for(i = 0; i < veld.options.length; i++) {
                    if (veld.options[i].selected) {
                        if( waarde != '')   waarde += ',';

                        waarde += veld.options[i].value;
                    }
                }
            }
            return waarde;

        /* Voor een meerkeuze moeten we alle velden achter elkaar plakken */
        case t_meerkeuze:
            waarde = '';
            for( i = 0; i < frm.elements.length; i++) {
                if( frm.elements[i].name == naam  &&  frm.elements[i].checked) {
                    if( waarde != '') {
                        waarde += ',';
                    }
                    waarde += frm.elements[i].value;
                }
            }
            return waarde;

        case t_datum:
            if( typeof( frm.elements[naam + 'Dag'].value) != "undefined"  &&  typeof( frm.elements[naam + 'Maand'].value) != "undefined"  &&  typeof( frm.elements[naam + 'Jaar'].value) != "undefined") {
                return datum2Str( trim( frm.elements[naam + 'Dag'].value), trim( frm.elements[naam + 'Maand'].value), trim( frm.elements[naam + 'Jaar'].value));
            }
            else {
                return '';
            }

        default:
            return '';
    }
}


/*
 * controleerVeld( formulier, naam, veldType, magLeegZijn)
 *                  Controleert het veld met de gegeven naam in het meegegeven formulier object. Het veldType is
 *                  het veldtype zoals gedefinieerd is in functies.asp. Magleegzijn is een boolean die aangeeft of
 *                  het veld leeg mag zijn. Het controleert velden die aangemaakt zijn met de ASP functie maakInputVeld.
 *
 * returned:        '' wanneer alles goed is, anders een foutmelding
 */

function controleerVeldType( frm, naam, omschrijving, veldType, magLeegZijn)
{
    var veldIsLeeg, foutMelding, i;

    /* Converteer het veldType naar een integer */
    veldType = Number( veldType);

    if( veldType == t_datum) {
        veldIsLeeg = isLeeg( frm.elements[naam + 'Dag'].value)  &&  isLeeg( frm.elements[naam + 'Maand'].value)  &&  isLeeg( frm.elements[naam + 'Jaar'].value);
    }
    else if( veldType == t_keuze) {
        veldIsLeeg = (typeof( frm.elements[naam].options) == "undefined"  ||  frm.elements.selectedIndex < 0);
    }
    /* Bij een meerkeuze veld moeten wel alle checkboxes met de gegeven naam controleren */
    else if( veldType == t_meerkeuze) {
        veldIsLeeg = true;
        for( i = 0; i < frm.elements.length  &&  veldIsLeeg; i++) {
            if( frm.elements[i].name == naam  &&  frm.elements[i].checked) {
                veldIsLeeg = false;
            }
        }
    }
    else {
        veldIsLeeg = isLeeg( frm.elements[naam].value);
    }

    if( veldIsLeeg) {
        foutMelding = magLeegZijn ? '' : 'Het veld ' + omschrijving + ' mag niet leeg zijn.';
    }
    else {
        foutMelding = '';

        switch( veldType) {
            case t_keuze:
            case t_meerkeuze:
            case t_tekst:
                break;

            case t_datum:
                if( !isDatum( frm.elements[naam + 'Dag'].value, frm.elements[naam + 'Maand'].value, frm.elements[naam + 'Jaar'].value)) {
                    foutMelding = 'U heeft een onjuiste datum ingevuld voor veld ' + omschrijving + '.';
                }
                break;

            case t_nummer:
                if( !isNummer( frm.elements[naam].value)) {
                    foutMelding = 'U heeft een onjuiste getal ingevuld voor veld ' + omschrijving + '.';
                }
                break;

            case t_bedrag:
                if( !isBedrag( frm.elements[naam].value)) {
                    foutMelding = 'U heeft een onjuiste bedrag ingevuld voor veld ' + omschrijving + '.';
                }
                break;

            default:
                foutMelding = '!!!Onbekend type (' + veldType + ') voor veld ' + omschrijving + '.';
                break;
        }
    }

    return foutMelding;
}

function getElementsByClassName(clsName){ 
	var arr = new Array(); 
	var elems = document.getElementsByTagName("*");
	for ( var cls, i = 0; ( elem = elems[i] ); i++ ){
		if ( elem.className == clsName ){
			arr[arr.length] = elem;
		}
	}
	return arr;
}

/*
 * Zorgt ervoor dat de onchange handler aangeroepen wordt voor alle velden die gewijzigd zijn. Dit omdat IE 5 pas een onChange
 * genereerd wanneer het scherm wordt gesloten, i.p.v. voor de submit
 */

function forceChange( frm)
{
    var     i, veld, eerste;

/*
    for( i = 0; i < frm.elements.length  &&  !eerste; i++) {
        veld = frm.elements[i];

        if( document.defaultView.getComputedStyle( veld, "").getPropertyValue("visibility");
           (veld.type == 'checkbox'   ||  veld.type == 'radio'  ||  veld.type == 'select-multiple'  ||
            veld.type == 'select-one' ||  veld.type == 'text'   ||  veld.type == 'textarea')) {
                eerste = veld;
        }
    }

    if( eerste) {
        eerste.blur();
        eerste.focus();
    }
*/
}



/*
 * verstuurFormulier    Verstuurt het gegeven formulier, zet het gegeven veld op de gegeven waarde en returned false,
 *                      zodat het in een onClick handler meegenomen kan worden
 */

function verstuurFormulier( formulier, veldNaam, waarde)
{
    formulier[veldNaam].value = waarde;
    formulier.submit();

    return false;
}



/*
 * confirmUnload        Koppel aan window.onbeforeunload om afsluiten te bevestigen
 *                      Omzeilen door blnConfirmUnload op 'false'te zetten
 */

var blnConfirmUnload =true;
function confirmUnload(){
        if(blnConfirmUnload){                
                var message = "Uw eventuele wijzigingen worden niet opgeslagen.";                
                window.event.returnValue = message;                
        }

}



var typeSelectBuffer = '';      // Wordt gebruikt in typeSelect en typeSelectInit
var typeSelectTijd   = 0;       // Laatste keer dat er iets is toegevoegd aan de buffer



/*
 * typeSelect()     Wordt aangeroepen vanuit de keyPress handler van select form elementen
 *                  Het stop alle ingetyped letters in typeSelectBuffer en zoek het eerste element in de lijst op
 *                  die met deze letters beginnen.
 */

function typeSelect( netscapeEvent)
{
    var  letter, code, veld, gevonden, optie, tijd, nu, passEvent;

    /* Haal het veld en de toets op in Netscape */
    if( typeof( netscapeEvent) != 'undefined') {
        code   = netscapeEvent.which;
        veld   = netscapeEvent.target;
    }
    /* Doe het voor internet explorer */
    else if( typeof( window.event) != 'undefined') {
        code   = window.event.keyCode;
        veld   = window.event.srcElement;
    }

    /* Event is onbekend, dus laat de browser het afhandelen */
    else {
        return true;
    }

    /* Wanneer het geen letter of cijfer betreft wijzig dan het veld */
    letter = String.fromCharCode( code).toLowerCase();
    if( !(letter >= 'a'  &&  letter <= 'z')  &&  !(letter >= '0'  &&  letter <= '9')) {
        /* Als we een onchange handler hebben, roep die dan aan */
        if( (letter == '\n' ||  letter == '\r')  &&  typeof( veld.onchange) == "function") {
            veld.onchange();
            return false;
        }

        typeSelectBuffer = '';
        return false;
    }

    /* Wanneer het al heel lang geleden is nadat de laatste keer een letter is getyped wis dan de buffer */
    nu = new Date();
    if( nu.getTime() - typeSelectTijd >= (2 * 1000)) {        /* 2 seconden */
        typeSelectBuffer = '';
    }
    typeSelectTijd = nu.getTime();

    typeSelectBuffer += letter.toLowerCase();

    gevonden = -1;

    /* Zoek het item op dat begint met de string uit typeSelect buffer */
    for( optie = 0; optie < veld.options.length  &&  gevonden < 0; optie++) {
        if( veld.options[optie].text.substring(0, typeSelectBuffer.length).toLowerCase() == typeSelectBuffer) {
            gevonden = optie;
        }
    }

    /* Als we een item gevonden hebben, selecteer die dan */
    if( gevonden >= 0) {
        veld.options[gevonden].selected = true;
        veld.value = veld.options[gevonden].value;
        veld.selectedIndex = gevonden;
    }

    return false;
}



/*
 * initTypeSelect()   Wordt aangeroepen vanuit de focus handler van een select veld. Zet de typeSelectBuffer op leeg
 *                    zodat in elke select met een nieuwe buffer wordt begonnen
 */

function initTypeSelect()
{
    typeSelectBuffer = '';
}

gSchermGewijzigd = false;   /* Globale variabele die bijhoudt of het scherm gewijzigd is, wordt gewijzigd in de functie markeerAlsGewijzigd */



/* markeerAlsGewijzigd()    Deze functie wordt aangeroepen vanuit de onChange event handler en zet de waarde van de globale
 *                          variabele gSchermGewijzigd op true. Als de parent van dit scherm ook een gSchermGewijzigd variabele
 *                          heeft wordt deze ook gewijzigd (in het geval van IFrames)
 */

function markeerAlsGewijzigd()
{
    /* Als we niet in de submitfase zijn moeten we de gewijzigd vlag zetten */
    window.gSchermGewijzigd = true;
    if( typeof( parent.gSchermGewijzigd) == 'boolean') {
        parent.gSchermGewijzigd = true;
    }
}



/*
 * voegEventToe( hetObject, hetEvent, deFunctie)
 *                  hetEvent is b.v. 'change', 'mouseup' (dus zonder on)
 *                  Voegt een event toe aan een object. Eerst wordt gekeken of het IE of Netscape betreft. Aan de
 *                  hand daarvan wordt een andere functie aangeroepen.
 */

function voegEventToe( hetObject, hetEvent, deFunctie)
{
    /*  Probeer eerst de addEventListener methode (voor Netscape 6 o.a.) */
    if( typeof( hetObject.addEventListener) != 'undefined') {
        hetObject.addEventListener( hetEvent, deFunctie, true);
    }
    /* Probeer anders de attachEvent (voor IE 5 o.a.) */
    else if( typeof( hetObject.attachEvent) != 'undefined') {
        if( !hetObject.attachEvent( 'on' + hetEvent, deFunctie)) {
            alert('Fout tijdens attachen van event');
        }
    }
    /* Als die er ook niet is kunnen we niets doen */
}



/*
 * initForms()          Doet een initialisatie van alle formulieren in het huidige document.
 *                      Het zet de handlers voor alle select elementen:
 *                         onFocus wordt initTypeSelect
 *                         onKeyPress wordt typeSelect
 *                      Het selecteer het eerste text veld van het eerste formulier die niet leeg is waneer
 *                      selecteerEerste true is.
 */

function initForms( selecteerEerste)
{
    var     formulier, formNr, veldNr, veld, eerste;

    eerste = null;

    for( formNr = 0; formNr < document.forms.length; formNr++) {
        formulier = document.forms[formNr];

        for( veldNr = 0; veldNr < formulier.elements.length; veldNr++) {
            veld = formulier.elements[veldNr];

            /* Voeg een onchange handler toe */
            if( veld.type == 'checkbox'   ||  veld.type == 'radio'  ||  veld.type == 'select-multiple'  ||
                veld.type == 'select-one' ||  veld.type == 'text'   ||  veld.type == 'textarea') {
                    voegEventToe( veld, 'change', markeerAlsGewijzigd);
            }

            /*  We hoeven alleen de select velden maar te hebben voor de typeSelect */
            if( veld.type == 'select-one') {
                veld.onfocus    = initTypeSelect;
                veld.onkeypress = typeSelect;
            }

            /* Zoek het eerste text veld */
            if( eerste == null  &&  veld.type == 'text'  &&  veld.value != '') {
                eerste = veld;
            }
        }
    }

    /* Wanneer er een tekstveld gevonden is selecteerd dan de tekst hier van */
    if( eerste != null  &&  selecteerEerste) {
        eerste.select();
    }
}


/*****************************************************/
/*    OOK IN ASP                                     */
/*****************************************************/


/*
 * isGeldigEmailadres( deString)    Controleert of de gegeven string een goed emailadres is
 *
 * returned                         true wanneer de string een geldig emailadres is
 */

function isGeldigEmailadres( deString)
{
   var EmailOk  = true
   var AtSym    = deString.indexOf('@')
   var Period   = deString.lastIndexOf('.')
   var Space    = deString.indexOf(' ')
   var Length   = deString.length - 1   // Array is from 0 to length-1

   if ((AtSym < 1) ||                   // '@' cannot be in first position
   (Period <= AtSym+1) ||               // Must be atleast one valid char btwn '@' and '.'
   (Period == Length ) ||               // Must be atleast one valid char after '.'
   (Space  != -1))                      // No empty spaces permitted
   {
     EmailOk = false
   }
   return EmailOk;
}






/*
 * trim( string)     Haalt alle spaties aan het begin en het eind van een string weg
 */

function trim( deString)
{
    deString = String( deString);

    /* Verwijder alle spaties aan het begin */
    while( isSpatie( deString.charAt(0))) {
        deString = deString. substring( 1, deString.length);
    }

    /* Verwijder de spaties aan het eind */
    while( isSpatie( deString.charAt( deString.length - 1))) {
        deString = deString.substring( 0, deString.length - 1);
    }

    return( deString);
}




/*
 * isSpatie()   Controleer of het karakter een spatie, tab of nieuwe regel is
 */

function isSpatie( karakter)
{
    karakter = String( karakter);

    return( karakter == ' '   ||   karakter == '\n'  ||  karakter == '\r'  ||  karakter == '\t');
}



/*
 * datum2Str  Converteert een datum naar een string, die vervolgens weer gelezen kan worden door
 *            str2Datum. Deze functie kan worden gebruikt om datums als strings op te slaan in de
 *            database
 */

function datum2Str( dag, maand, jaar)
{
    if( dag == null  ||  maand == null  ||  jaar == null  ||  String( dag) == ''  ||  String( maand) == ''  ||  String( jaar) == '') {
        return( '');
    }
    else {
        return( String( dag) + '-' + String( maand) + '-' + String( jaar));
    }
}


/* -----------------19-8-2002 16:15------------------
  functies voor de autotab
 --------------------------------------------------*/

/*
 * autoTab    Kan worden opgeroepen vanuit de keyUp handler van een veld als
 *            onKeyUp="autoTab( this, 2, event)"
 */

function autoTab(input,len, e) {
    var isNN = (navigator.appName.indexOf("Netscape")!=-1);
    var keyCode = (isNN) ? e.which : e.keyCode;
    var filter = (isNN) ? [0,8,9] : [0,8,9,16,17,18,37,38,39,40,46];

    if(input.value.length >= len && !containsElement(filter,keyCode)) {
        input.value = input.value.slice(0, len);
        input.form[(getIndex(input)+1) % input.form.length].select();
        input.form[(getIndex(input)+1) % input.form.length].focus();
    }
}


function containsElement(arr, ele) {
    var found = false, index = 0;

    while(!found && index < arr.length)
    if(arr[index] == ele)
        found = true;
    else
        index++;

    return found;
}


function getIndex(input) {
    var index = -1, i = 0, found = false;

    while (i < input.form.length && index == -1)
        if (input.form[i] == input)
            index = i;
        else
            i++;

    return index;
}

function vulViaBeginJaar(elemNaam){
        if( formulier[elemNaam+'_vanmaand'].value == 0) {
        formulier[elemNaam+'_vanmaand'].value = 1;
                if( formulier[elemNaam+'_totmaand'].value == 0) {
                        formulier[elemNaam+'_totmaand'].value = 12;
                }
        }

        if( formulier[elemNaam+'_totmaand'].value == 0) {
                formulier[elemNaam+'_totmaand'].value =  formulier[elemNaam+'_vanmaand'].value;
        }

        if( formulier[elemNaam+'_vandag'].value == 0) {
                formulier[elemNaam+'_vandag'].value = 1
        }

        if( formulier[elemNaam+'_totjaar'].value == 0 || formulier[elemNaam+'_totjaar'].value.length < formulier[elemNaam+'_vanjaar'].value.length) {
                formulier[elemNaam+'_totjaar'].value = formulier[elemNaam+'_vanjaar'].value;
        }

        if( formulier[elemNaam+'_totdag'].value == 0) {
                formulier[elemNaam+'_totdag'].value = dagenPerMaand( formulier[elemNaam+'_totmaand'].value, formulier[elemNaam+'_totjaar'].value);
        }

        vulDatum(elemNaam+'_tot');
}


//
// dagenPerMaand   Returned het aantal dagen dat in een maand voorkomt
//
function dagenPerMaand( maand, jaar){
        var dagen = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];

        if( maand == 2  &&  (jaar % 4 == 0  && !( jaar % 100 == 0   &&  jaar % 400 != 0))) {
        return 29;
        }
        else {
        return dagen[maand - 1];
        }
}

function maakGelijk( bron, doel){
        if( isLeeg( doel.value) || doel.value.length < bron.value.length) {
        doel.value = bron.value;
        }
}




/*
 * inArray()    Returned true wanneer de gegeven waarde zich in het array bevindt
 */

function inArray( reeks, waarde)
{
    var   i;

    for( i = 0; i < reeks.length; i++) {
        if( waarde == reeks[i])     return true;
    }

    return false;
}

/*
 * Functies voor Formulier:
 */


function verwijderElement( reeks, index)
{
    var i;

    grootte = reeks.length - 1;
    for( i = index; i < grootte; i++) {
        reeks[i] = reeks[i + 1];
    }
    reeks.length = grootte;
}


function verwijderSelectRij(elem){
       var i, objSel;

		objSel = document.forms['formulier'].elements[elem];
       // Kijk eerst of er iets is geselecteerd
        if( objSel.selectedIndex >= 0) {
            for(i=objSel.length-1; i > -1; i--){
                if (objSel.options[i].selected) {objSel.options[i] = null;}
            }
        }
        vulHiddenField(elem);
        return false;


}

function openPopup(name, target, params){
       var w = window.open(target, name, params);
       w.focus();
       return w;
}

function openLOVPopup(name, target, params, relVeld){

       var w;

       if(relVeld!=''){
                if(formulier['fld_'+relVeld].value == ''){
                        alert('Kies eerst ' + relVeld + '.');
                        return false;
                }
                target += '&ovid='+ formulier['fld_'+relVeld].value;
       }
       w = openPopup(name, target, params) ;
       return w;
}


function leegSelect(elem) {
   var objSel
   objSel = formulier[elem]

   for(i=objSel.length; i > -1; i--){
        objSel.options[i] = null;
   }
}


/*
 * voegToeAanSelect		Voegt een item met het gegeven ID en de gegeven tekst toe onderaan
 *						de select list. deSelect is de naam van de select box, het hidden
 *						veld behorende bij deze selectbox wordt ook bijgewerkt.
 *
 *						Hierbij moeten deze elementen in een form met de naam 'formulier' staan
 */

function voegToeAanSelect( deSelect, id, tekst)
{
	var optie
	var objSel

	objSel = document.forms['formulier'].elements[ deSelect];
	objSel.options[ objSel.options.length] = new Option( tekst, id);

	vulHiddenField( deSelect);
}



function vulSelect(elem, refObj) {

        var i, optie
        var objSel
        objSel = formulier[elem]

        for(i=0; i < refObj.length; i++){
                if(refObj.options[i].text.length>0){
                    optie = new Option( refObj.options[i].text, refObj.options[i].value);
                    objSel.options[i] = optie;
                }
        }
        vulHiddenField(elem);

}



/*
 * vulHiddenField		Werkt een hidden veld bij dat hoort bij een select box. De ID's worden in het veld
 *						geplaatst met daartussen '|sep|'. Het hidden veld heeft de naam 'fld_elementnaam'
 *
 *						Hierbij moeten deze elementen in een form met de naam 'formulier' staan
 */

function vulHiddenField(elem)
{
	var str, i;
	var objSel;

	objSel = document.forms['formulier'].elements[elem];

	str = '';
	for(i = 0; i < objSel.length; i++) {
		if(i > 0) { str += '|sep|'; }
		str += objSel.options[i].value;
	}
	document.forms['formulier'].elements['fld_'+elem].value = str;
}




function vulHiddenField2(elem){

        var str
        str = '';
        if( formulier[elem].length == undefined){
            
        }else{
            for(i=0; i < formulier[elem].length; i++){
                    if (formulier[elem][i].checked) {
                            if(str.length>0) {str += '|sep|';}
                            str += formulier[elem][i].value
                   }
            }
        }

        formulier['fld_'+elem].value = str;
}

function vulDatum(elem) {

        var dag, maand, jaar

        dag = document.forms['formulier'].elements[elem+'dag'].value;
        if (dag.charAt(0) == '0') {dag = dag.charAt(1);}
        maand = document.forms['formulier'].elements[elem+'maand'].value;
        if (maand.charAt(0) == '0') {maand = maand.charAt(1);}
        jaar = document.forms['formulier'].elements[elem+'jaar'].value;

        if(isLeeg(dag)||isLeeg(maand)||isLeeg(jaar)){
                 document.forms['formulier'].elements['fld_'+elem].value = ''
        }
        else{
                document.forms['formulier'].elements['fld_'+elem].value = dag + '-' + maand + '-' + jaar;
        }
}

var req, oldval

function verwijderRij(formID, veldLijstID, elem, blnIsOuderLijst){

       var url
       var val

        if(blnIsOuderLijst!='' &&  formulier[elem].selectedIndex >= 0) {
                if(confirm('Indien U dit veld wijzigt worden ingevoerde waarde in gerelateerde velden bijgewerkt. Wilt u dit?')) {
                                verwijderSelectRij(elem);
                                val = formulier['fld_'+elem].value;
                                laadXMLDoc(formID, veldLijstID, val);
                }
       }
        else{
                verwijderSelectRij(elem);
        }
}


function vulKinderen(formID, veldLijstID, obj, blnIsOuderLijst, vraagBevestiging) {

        if(blnIsOuderLijst!='') {

                if( !vraagBevestiging  ||  confirm('Indien U dit veld wijzigt worden ingevoerde waarde in gerelateerde velden bijgewerkt. Wilt u dit?')) {
                        laadXMLDoc(formID, veldLijstID, obj.value);
                }
                else{
                        obj.value = oldval;
                }
        }
}

function laadXMLDoc(formID, veldLijstID, val) {

        var url = 'ouderLijst.asp?frmid='+ formID + '&vlid=' + veldLijstID + '&val=' + val;

        if (window.XMLHttpRequest) {
                req = new XMLHttpRequest();
                req.onreadystatechange = leesKinderen;
                req.open("GET", url, true);
                req.send(null);
        } else if (window.ActiveXObject) {
                isIE = true;
                req = new ActiveXObject("Microsoft.XMLHTTP");
                if (req) {
                       req.onreadystatechange = leesKinderen;
                        }
                req.open("GET", url, true);
                req.send();
                }
 }



function leesKinderen() {
        if (req.readyState == 4) {
                if (req.status == 200) {
                        verwerkKinderen(req.responseText);
                } else {
                  alert(req.statusText);
                }
        }
}

function verwerkKinderen(str) {

        var arrVelden, arrOpties, arrOptie, arrMeta
        var fld, type, geselecteerd, jx
        var objSel, optie, blnBestaat
        arrVelden = str.split('<veld>');

         for(var ix = 1; ix < arrVelden.length; ix++) {
                arrOpties = arrVelden[ix].split('<option>');
                arrMeta = arrOpties[0].split('_');
                type = arrMeta[0];
                fld = arrMeta[1];
                /*lov*/
                if(type=='12'  &&  document.formulier.elements['fld_'+fld]){
                        fld = 'fld_'+ fld;
                        objSel = document.formulier.elements[fld];
                        geselecteerd = objSel.options[objSel.selectedIndex].text;
                        leegSelect(fld);
                        for(var jx = 1; jx < arrOpties.length; jx++) {
                            arrOptie = arrOpties[jx].split('<waarde>');
                            optie = new Option( arrOptie[1], arrOptie[0]);
                            objSel.options[jx-1] = optie;
                            if ( arrOptie[1] == geselecteerd ) {
                              objSel.options[jx-1].selected = true;
                            }
                        }
                }
                else if(type=='3'  &&  document.formulier.elements[fld]){
                        objSel = formulier[fld];
                        for(var jx = objSel.length -1; jx > -1; jx--) {
                                blnBestaat = false;
                                for(var k = 0; k < arrOpties.length && !blnBestaat; k++) {
                                   arrOptie = arrOpties[k].split('<waarde>');
                                   if(objSel.options[jx].value == arrOptie[0]){
                                         blnBestaat = true;
                                   }
                                }
                                if(!blnBestaat) {objSel.options[jx] = null;}
                        }
                        vulHiddenField(fld);
                }


        }
}

function isFormNummer( nummer)
{
    var i;

    nummer = trim( nummer);

    /* Kijk of het nummer alleen uit cijfers bestaat */
    if((nummer.charAt(0) < '0'  ||  nummer.charAt(0) > '9') && nummer.charAt(0) > '-') return( false);
    for( i = 1; i < nummer.length; i++) {
         if( nummer.charAt(i) < '0'  ||  nummer.charAt(i) > '9')    return( false);
    }

    if(nummer< -2147483648 || nummer > 2147483647) return( false);

    /* Geen fout gevonden */
    return( true);
}


function enableElementsByClassName(class_name, bnlEnable)
{
  var all_obj,ret_obj=new Array(),j=0,teststr;

  if(document.all)all_obj=document.all;
  else if(document.getElementsByTagName && !document.all)
    all_obj=document.getElementsByTagName("*");

  for(i=0;i<all_obj.length;i++)
  {
     if(all_obj[i].className == class_name){
        all_obj[i].disabled = (bnlEnable) ? false: true;
        j++;
      }
  }
  return ret_obj;
}

function disableElementsByClassName(class_name)
{
  var all_obj,ret_obj=new Array(),j=0,teststr;

  if(document.all)all_obj=document.all;
  else if(document.getElementsByTagName && !document.all)
    all_obj=document.getElementsByTagName("*");

  for(i=0;i<all_obj.length;i++)
  {
     if(all_obj[i].className == class_name){
        all_obj[i].disabled = true;
        j++;
      }
  }
  return ret_obj;
}

function PageQuery(q) {
if(q.length > 1) this.q = q.substring(1, q.length);
else this.q = null;
this.keyValuePairs = new Array();
if(q) {
for(var i=0; i < this.q.split("&").length; i++) {
this.keyValuePairs[i] = this.q.split("&")[i];
}
}
this.getKeyValuePairs = function() { return this.keyValuePairs; }
this.getValue = function(s) {
for(var j=0; j < this.keyValuePairs.length; j++) {
if(this.keyValuePairs[j].split("=")[0] == s)
return this.keyValuePairs[j].split("=")[1];
}
return false;
}
this.getParameters = function() {
var a = new Array(this.getLength());
for(var j=0; j < this.keyValuePairs.length; j++) {
a[j] = this.keyValuePairs[j].split("=")[0];
}
return a;
}
this.getLength = function() { return this.keyValuePairs.length; } 
}
function queryString(key){
var page = new PageQuery(window.location.search); 
return unescape(page.getValue(key)); 
}

function HTMLEncode(t) {
    var t = t.toString();
    var h = [["&","&amp;"], ["\"","&quot;"] ,["<","&lt;"], [">","&gt;"]];
    var hl = h.length;
    var tl = t.length;
    var d = "";
    var i = 0;
    if (t) {
        while (i<tl) {
            var c = t.charAt(i++);
            var r = 0;
            for (j=0; j<hl; ++j) {
                if (c == h[j][0]) {
                    d += h[j][1];
                    r = 1;
                    break;
                }
            }
            if (!r) d += c;
        }
    }
    return d;
}



/*
 * vraagAttachment	Toont een popup waarin de gebruiker een attachment kan invoeren. Na het invoeren
 *                  wordt de meegegeven javascript functie (als string) aangeroepen met het ID
 *                  van het zojuist aangemaakte attachment. Deze functie krijgt als parameters
 *                  ID, omschrijving en mimeType mee
 */

function vraagAttachment( popup, popupparam, functie)
{
  if(isLeeg(popup)) popup = '../prog/vraagAttachment.asp';
  if(isLeeg(popupparam)) popupparam = 'width=400,height=200';
  popup += (popup.indexOf('?')>-1)?'&':'?';
  popup += 'vulFunctie=' + functie;
  openPopup( 'attachment', popup, popupparam);
}




/*
 * editor_voetnoot  Wordt aangeroepen vanuit de editon box om de gesecteerde tekst in een
 *          span met class "voetnoot" te zetten
 */

function editor_voetnoot( deEditor)
{
    var inhoud;


    inhoud = deEditor.getSelectedHTMLData();

    deEditor.insertHTMLData( '<div class="voetnoot"><p>' + inhoud + '</p></div>');
    deEditor.pumpEvents();
}

function editor_voetnoot_njp( deEditor)
{
    var inhoud;


    inhoud = deEditor.getSelectedHTMLData();

    deEditor.insertHTMLData( '{noot x: ' + inhoud + '}');
    deEditor.pumpEvents();
}


function editor_ommisie( deEditor)
{
    var inhoud;


    inhoud = deEditor.getSelectedHTMLData();

    deEditor.insertHTMLData('(…)');
    deEditor.pumpEvents();
}

function editor_ommisiered( deEditor)
{
    var inhoud;


    inhoud = deEditor.getSelectedHTMLData();

    deEditor.insertHTMLData( '(…; Red.)');
    deEditor.pumpEvents();
}
/*
 * editor_citaat Wordt aangeroepen vanuit de editon box om de gesecteerde tekst in een
 *               span met class "citaat" te zetten
 */

function editor_citaat( deEditor)
{
    var inhoud;

    inhoud = deEditor.getSelectedHTMLData();

    deEditor.insertHTMLData( '<div class="citaat">' + inhoud + '</div>');
    deEditor.pumpEvents();
}



/*
 * editor_aantekening Wordt aangeroepen vanuit de editon box om de gesecteerde tekst in een
 *                    div met class "aantekening" te zetten
 */

function editor_aantekening( deEditor)
{
    var inhoud;

    inhoud = deEditor.getSelectedHTMLData();

    deEditor.insertHTMLData( '<div class="aantekening">' + inhoud + '</div>');
    deEditor.pumpEvents();
}


function editor_raster( deEditor)
{
    var inhoud;

    inhoud = deEditor.getSelectedHTMLData();

    deEditor.insertHTMLData( '<raster>' + inhoud + '</raster>');
    deEditor.pumpEvents();
}

var koppenEditor;							// Globale variable bedoeld om de huidige editor op te slaan








/*
 * voegKopToe		De kop wordt in de koppenEditor geplaatst. Zie editor_koppen
 */

function voegKopToe( kop, isKop)
{
    if( isKop) {
      koppenEditor.insertHTMLData('<h2>' + kop + '</h2>');
    }
    else {
      koppenEditor.insertHTMLData('<p>' + kop + '</p>');
    }

    koppenEditor.pumpEvents();
}


/*
 * editor_smallcaps     Pakt de geslecteerde text uit de editor en plakt er de smallcaps span omheen
 *
 */

function editor_smallcaps( deEditor)
{
    var inhoud;

    inhoud = deEditor.getSelectedHTMLData();

    deEditor.insertHTMLData( '<span class="kleinkapitaal">' + inhoud + '</span>');
    deEditor.pumpEvents();

}

function editor_legeparagraaf( deEditor)
{

    deEditor.insertHTMLData( '<p>&#182;</p>');
    deEditor.pumpEvents();

}



/*
 * editor_kapitaal     Pakt de geslecteerde text uit de editor en plakt er de kapitaal span omheen
 *
 */

function editor_kapitaal( deEditor)
{
    var inhoud;

    inhoud = deEditor.getSelectedHTMLData();

    deEditor.insertHTMLData( '<span class="kapitaal">' + inhoud + '</span>');
    deEditor.pumpEvents();

}

    // Functie opent een window waarin xref gekozen kan worden
    // Er staat nog een productpad in wat er eigenlijk uit moet
    function openRef( deEditor){
        var huidig;
    	 	xrefEditor = deEditor;
        huidig = deEditor.getCurrentElement();

        if( huidig.substring( 0, 5) == "<xref") {
            alert('U kunt hier geen link maken.');
        }
        else {
            var schermNaam, nu, scherm, url;
            var breedte, hoogte;
            var veld;


            url = virDir + '/toepassingen/sdu/ASP/pvd/xref.asp?functie=insertRef&veld=' + deEditor.id;
            schermnaam = 'X-Link';
            breedte = '600';
            hoogte  = '550';

            scherm = window.open( url, schermNaam, 'scrollbars=yes,resizable=no,menubar=no,status=yes,top=100,left=100,width=' + breedte +  ',height=' + hoogte);
            return false;
        }
    }

    //Functie plaatst xref
    function insertRef(id, tekst){
        var xlink, deEditor;


        xlink = '<xref idref="' + id + '">' + ' ' + tekst + '</xref>';

        xrefEditor.insertHTMLData(xlink );
        xrefEditor.pumpEvents();

    }


function editor_beeldDB ( deEditor)
{

    beelddbEditor = deEditor;
    openPopup( 'Beelddatabank', '../prog/beelddatabank.asp?editor=' + deEditor, 'width=500,height=500', 'status=yes');

}

function editor_spec_char( deEditor)
{
      url = '../prog/speciaalKarakter.asp';
      schermNaam = 'Specialcharacters';
      breedte = '650';
      hoogte  = '400';
      specCharEditor = deEditor;

      scherm = window.open( url, schermNaam, 'scrollbars=yes,resizable=yes,menubar=no,status=yes,width=' + breedte +  ',height=' + hoogte);
      return false;

}

function editor_voegtoe_spec_char( str)
{
	specCharEditor.insertHTMLData( str);
	specCharEditor.pumpEvents();
}
	

function editor_voegtoe_beeldDB ( hetID, beeldID, altText, pad)
{    
    beelddbEditor.insertHTMLData('<img src="' + pad + '/asp/toonImage.asp?id=' + hetID + '" imageid="' + hetID + '" beeldid="' + beeldID + '" /><br/><span class="onderschrift">' + altText + '</span>')
    beelddbEditor.pumpEvents();
}


function insertRefInList(id, tekst) {
	
	var recString = id + '##recsep##' + tekst;
	neemOver('verwijzing', recString, recString, '');
	
	
	
}



/*============ DE ONKEYPRESS HANDLER ===========================================

This routine enables standard keys to be used as hotkeys to either invoke a
link, or to fire some JavaScript code.  The hotkey should be pressed down at the
aame time as either the control key, the alt key, or the Mac metakey.

   Calling Sequence: <body onkeydown="hotKeys(event);">

Don't worry about the parameter - just call as above.

A hot key may either have a link associated with it, or some JavaScript code
(typically a function).

Note that because of the different keyboard layouts in use, and because of the
way that JavaScript handles keyboard events, it is best to limit your range of
hotkeys to the following characters:

   0 to 9
   A to Z
   a to z
   - . ,

Author:     John Gardner
Date:       September 2004

Note that some of the techniques here have been picked up from Chapter 9 of
"JavaScript and DHTML Cookbook", by Danny Goodman, published by O'Reilly.

The routine should degrade gracefully in older browsers.

The action keys are specified in a table. To add a new key, add a new array
element - e.g. KeyActions [2]. The code below has been set up for the example
page:

    htt://www.braemoor.co.uk/software/hotkeys.shtml

Modify it as required for your web page.

The three parts of the array element are as follows:

   character:      the hot key
   actionType:     either "link" or "code"
   param:          either the URL for a hyperlink or the JavaScript code.

When using hot keys in forms for buttons, radiobuttons, or checkboxes, ensure
that you provide each with id and name attributes, with the same value. e.g.

     document.myform.submit.click();
     document.myform.reset.click();
     document.myform.radio[2].checked=true;

==============================================================================*/

// This array should be set up as required for YOUR web page.

var keyActions = new Array ();
/*
keyActions [0] = {character:  "2",
                  actionType: "link",
                  param:      "../error404.html"};

keyActions [1] = {character:  "L",
                  actionType: "code",
                  param:      "openPopup('images/image.jpg','The Fouda Blanc Sangle');"};
*/

// End of user defined array

document.onkeydown = hotKeys;

function hotKeys () {
  var event = window.event;
  event = (event) ? event : ((window.event) ? event : null);

  if (event) {
    // Hotkeys require that either the control key or the alt key is being held down
    if (event.ctrlKey || event.altKey || event.metaKey) {

      // Pick up the Unicode value of the character of the depressed key.
      var charCode = (event.charCode) ? event.charCode : ((event.which) ? event.which : event.keyCode);

      // Convert Unicode character to its lowercase ASCII equivalent
      var myChar = String.fromCharCode (charCode).toLowerCase();

      // Convert it back into uppercase if the shift key is being held down
      if (event.shiftKey) {myChar = myChar.toUpperCase();}

      // Now scan through the user-defined array to see if character has been defined.
      for (var i = 0; i < keyActions.length; i++) {

        // See if the next array element contains the Hotkey character
        if (keyActions[i].character == myChar) {

          // Yes - pick up the action from the table
          var action;

          // If the action is a hyperlink, create JavaScript instruction in an anonymous function
          if (keyActions[i].actionType.toLowerCase() == "link") {
            action = new Function ('location.href  ="' + keyActions[i].param + '"');
          }

          // If the action is JavaScript, embed it in an anonymous function
          else if (keyActions[i].actionType.toLowerCase()  == "code") {
            action = new Function (keyActions[i].param);
          }

          // Error - unrecognised action.
          else {
            alert ('Hotkey Function Error: Action should be "link" or "code"');
            break;
          }

          // At last perform the required action from within an anonymous function.
          action ();
          return false;

          // Hotkey actioned - exit from the for loop.
          break;
        }
      }
    }
  }  
}
/*============================================================================*/


function kiesDatum( dag, maand, jaar, veldnaam)
{
	var	scherm, url;

	url = 'selecteerDatum.asp?dag='+dag+'&maand='+maand+'&jaar='+jaar+'&veld='+veldnaam;
  scherm = window.open( url, 'kiesdatum', 'top=200,left=450,width=180,height=220,scrollbars=no');
	scherm.focus();
}


function vulDatumUitKalender( dag, maand, jaar, veldnaam)
{
	
	document.getElementById(veldnaam+'dag').value = dag;
	document.getElementById(veldnaam+'maand').value = maand;
	document.getElementById(veldnaam+'jaar').value = jaar;	
	vulDatum(veldnaam);
	
}

/*=============================================================================*/



