// Data Array functions javascript include v1.0

// (c) 2003 P.de Wit, leek (pdw@banjer.net)

// -- Code starts here (no changes required from here) --



// Statics

    DA_HEADER=0;
    DA_FIELDNAME=0;
    DA_FIELDTYPE=1;
    DA_FIELDWIDTH=2;

    DA_FILEPATH='download/';
    DA_IMAGEPATH='images/';

    DA_DATEDELIM='-';                                           // change this if you want a different date delimiter
    DA_HEADERCLASS='tableHeader';
    DA_TABLECLASS='table';
    DA_TABLEWIDTH='100%';

    DA_WEEKDAYS='zondag|maandag|dinsdag|woensdag|donderdag|vrijdag|zaterdag';
    DA_MONTHS='januari|februari|maart|april|mei|juni|juli|augustus|september|oktober|november|december';
    DA_JULDAY=86400000;

// Error messages
    errData=new Array();
    errData[0]='Fout: Veld-definitie is niet beschikbaar of niet correct';
    errData[1]='Fout: Aantal velden in record komt niet overeen met veld-definitie';
    errData[2]='Fout: Onbekend veldnummer';
    errData[3]='Fout: Onbekend recordnummer';
    errData[4]='<i>- geen gegevens gevonden die voldoen aan de genoemde criteria -</i>';


// functions
    function DA_add(daTable,daRecord) {                         // add record to Data-Array

        if (daTable.length == 0) handleError(0,'');
        else {

            // determine number of fields in header
            daHeader=DA_record(daTable,DA_HEADER);
            var numFields=daHeader.length;
            // test if new record has the same amount of fields
            newRecord=daRecord.split(';');
            if (newRecord.length != numFields) handleError(1,daRecord);

            // convert dates to dateObjects
            finalRecord='';
            for (i=0; i < numFields; i++) {                    // get columns
                fieldData=newRecord[i];
                if(DA_headerData(daTable,i,DA_FIELDTYPE) == 'date') fieldData=date2Julian(fieldData);
                if (finalRecord != '') finalRecord +=';';
                finalRecord +=fieldData;
            }

            // add record
            var tIndex=daTable.length;
            daTable[tIndex]=finalRecord;
        }
    }


    function DA_headerData(daTable,fieldIndex,type){            // get field name or type from header

        if (daTable.length == 0) handleError(0,'');
        else {

            // get header record
            daHeader=DA_record(daTable,DA_HEADER);
            if (fieldIndex > daHeader.length) handleError(2,fieldIndex);
            strData=''+daHeader[fieldIndex]

            // get recordType element from record
            recordType = type ? type : DA_FIELDNAME;
            headerElements=strData.split('|');
            if (headerElements.length !=3) handleError(0,strData);
            return headerElements[recordType];
        }
    }


    function DA_record(daTable,recordIndex) {                   // return record as an Array

        if(recordIndex >= daTable.length) handleError(3,recordIndex);
        else {
            strData=''+daTable[recordIndex];
            daRecord=strData.split(';');
            return daRecord;
        }
    }

    function DA_field(daRecord,fieldIndex) {
        if (daRecord!='undefined') {
            if(fieldIndex >= daRecord.length) handleError(2,fieldIndex);
            else {
                strData=''+daRecord[fieldIndex];
               // daField=strData.split(';');
                return strData;
            }
        } else return '';
    }

    function DA_sort(daTable,fieldIndex,sortDirection) {
        var thisCol=(fieldIndex) ? 0:fieldIndex;
        var numRecords=daTable.length-1;
        var fieldType=DA_headerData(daTable,fieldIndex,DA_FIELDTYPE)

        // build index pointer array for choosen fieldindex
    sortIndex=new Array();
        for (thisRecord=1; thisRecord <= numRecords; thisRecord++) {
            thisKey=stripSpaces(DA_field(DA_record(daTable,thisRecord),thisCol));

       if (fieldType=='date' && isNaN(thisKey)) thisKey=0;
            sortIndex[thisRecord]=thisKey+'|'+thisRecord;
        }
        sortIndex.sort();
        if (sortDirection) {
            if (sortDirection=='desc') sortIndex.reverse();
        }
        // rebuild table based on sorted index
        sortedTable= new Array();
        sortedTable[0]=daTable[0];
        for (thisRecord=1; thisRecord <= numRecords; thisRecord++) {
            strTmp=''+sortIndex[thisRecord-1]
            thisIndex=strTmp.split('|');
            sortedTable[thisRecord]=daTable[thisIndex[1]];
        }
        return sortedTable;
    }

    function DA_table(daTable){                // build HTML table based on records

    daHeader=DA_record(daTable,DA_HEADER);
    var numCols=daHeader.length;

    theseRecords=new Array();
    theseRecords=theseRecords.concat(daTable);

    var numRecords=theseRecords.length-1;
    if (numRecords==0) {
      document.write(errData[4]+'<br>');
      return;
    }

        // build table header
        document.write('<TABLE '+DA_TABLEWIDTH+'><TR class="'+DA_TABLECLASS+'"><TR class="'+DA_HEADERCLASS+'">');

        for (i=0; i < numCols; i++) {                       // get column titles
            colWidth=DA_headerData(daTable,i,DA_FIELDWIDTH)
            colWidth= colWidth=='' ? '*' : colWidth+'%';
            document.write('<TD width='+colWidth+'>'+DA_headerData(daTable,i,DA_FIELDNAME)+'</TD>');
        }
        document.write('</TR>\n');

        //fill in records

        for (thisRecord=1; thisRecord <= numRecords; thisRecord++) {


            currentRecord=DA_record(theseRecords,thisRecord)
            document.write('<TR class="table">');

            for (i=0; i < numCols; i++) {                   // get field data
                fieldData=''+DA_field(currentRecord,i);

                if(DA_headerData(daTable,i,DA_FIELDTYPE) == 'date'){
                     fieldData= (!isNaN(fieldData))? fieldData=date2Str(julian2Date(fieldData)) : '--';
                 }

                if(DA_headerData(daTable,i,DA_FIELDTYPE) == 'URL'){

                    var thisURL=''+fieldData;

                    // get optional parameters
                    fieldElem=thisURL.split('|');
                    thisURL=''+fieldElem[0];

                    var URLText=(fieldElem.length > 1) ? fieldElem[1] : thisURL;
                    fieldData='<a href='+thisURL+'>'+fileText+'</a>';
                }

                if(DA_headerData(daTable,i,DA_FIELDTYPE) == 'file'){

                    var fileName=''+fieldData;
                    if (!fileName=='') {

                        // get optional parameters
                        fieldElem=fileName.split('|');
                        fileName=''+fieldElem[0];

                        var fileText=(fieldElem.length > 1) ? fieldElem[1] : '';
                        var hasIcon= (fieldElem.length > 2) ? (fieldElem[2]=='true') : true;

                        // get extention
                        if (hasIcon) {
                            var extentionPos=fileName.lastIndexOf('.');
                            var extention=(extentionPos) ? fileName.slice(extentionPos+1) : '';
                            extention=extention.toLowerCase();
                            var iconFile='icon_'+extention+'.gif';
                            fieldData='<a href='+DA_FILEPATH+fileName+' target=_new><img src='+DA_IMAGEPATH+iconFile+' alt="Klik hier om '+fileName+' te downloaden of te openen">'+fileText+'</a>';
                        }
                        else fieldData='<a href='+DA_FILEPATH+fileName+' target=_new>'+fileText+'</a>';
                }

                }
                document.write('<TD>'+fieldData +'&nbsp;</TD>');
            }
            document.write('</TR>');
        }
        document.write('</TABLE>');
        theseRecords=null;
    }

function DA_find (daTable,searchFor,inField, maxRows) {
        daHeader=DA_record(daTable,DA_HEADER);
        var numRecords=daTable.length-1;
        var numCols=daHeader.length;

        if ( numRecords < 0) { handleError(0,''); daTable=new Array() }

        //var thisRecord=0;
        theseRecords=new Array();
        theseRecords[0]=daTable[0];

        searchFor = (searchFor) ? searchFor.toLowerCase() : false;
        inField = (inField) ? inField : 0;
        if (!maxRows) maxRows=-1

        maxRows = (maxRows > -1) ? maxRows : numRecords;
        if (maxRows > numRecords) maxRows =numRecords;
        var foundRows=0;

        // find records to display
        for (i=1; (i <= numRecords && foundRows < maxRows); i++) {

            if (searchFor==false) {                         // no search, just add
                if (daTable[i]) {
                  foundRows++;
                  theseRecords[foundRows]=daTable[i];
                }
            }
            else {                                          //search
                var strData=''+daTable[i];
                if (inField > 0 && inField < numCols ) {
                    tmpRecord=strData.split(';');;
                    var strData=tmpRecord[inField-1];
                }

                if (searchFor.indexOf('(')==0) {            // evaluation
                    var condition=searchFor.slice(1,searchFor.length-1);

                    if (condition.length > 2) {

                        var opPos= (condition.indexOf('=')==-1)? 1: condition.indexOf('=')+1;
                        var operation=condition.substring(0,opPos);
                        var exprValue=condition.slice(opPos);
                        if(DA_headerData(daTable,inField-1,DA_FIELDTYPE) == 'date'){
                            exprValue=date2Julian(dateAdd(exprValue,-1));
                            fieldData=strData;

                        }
                        if (eval('fieldData'+operation+'exprValue')) {  //match
                            foundRows++;
                            theseRecords[foundRows]=daTable[i];
                        }
                    }
                }
                else{
                    strTMP=''+strData;
                    strTMP=strTMP.toLowerCase();          // not case sensitive text search
                    if (strTMP.indexOf(searchFor) > -1){   // found
                        foundRows++;
                        theseRecords[foundRows]=daTable[i];
                    }
                }

            }

          }
   return theseRecords;
}


// Error handling
    function handleError(errIndex,subject) {                    // error handling
        if (errIndex < errData.length) alert(errData[errIndex]+'\n'+subject);
        else alert('Error in Data-Array, code='+errIndex);
    }

// query strings support
  function requestQueryString(thisKey) {
    var queryString = ''+unescape(location.search.slice(1));

    if (thisKey) {
        var thisParam,theValue, theKey;
        var params = queryString.split('&');
        for(var i = 0; i < params.length; i++) {
          thisParam=""+params[i];
          keyValue=thisParam.split('=');
          theKey=keyValue[0];

          if (thisKey == theKey) {
            theValue= ""+keyValue[1];
            return theValue;
            break;
        }
        }
    }
    else return queryString;
}


// Strings suport
    function jsEsc(str, bEnclose) {
        if(str == null) return 'null';
        str = new String(str);
        str = str.replace(/\\/g, "\\\\");
        str = str.replace(/\'/g, "\\'");
        str = str.replace(/\"/g, "\\\"");
        str = str.replace(/\n/g, "\\n");
        str = str.replace(/\r/g, "\\r");
        str = str.replace(/\t/g, "\\t");
        return (bEnclose == false) ? str : "'" + str + "'";
    }

    function stripSpaces(str) {
        if(str == null) return 'null';
        str = new String(str);
        str = str.replace(/[ ]/g,'');
        return str;
    }

    function fixedDigits(numData, size) {
        var strData = '' + numData;
        var newData = '';
        var trailerLength = size - strData.length;
        for(var i = 0; i < trailerLength; i++)
          newData += '0';
        newData += strData;
        return newData;
    }

// Date suport

    function now() {
        var dateNow=new Date();
        return dateNow;
    }

    function date2Str(thisDate) {
        (thisDate == 'now') ? dateObj=new Date() :  dateObj=new Date(Y2kStr(thisDate));
        if(!typeof dateObj== 'object') strDate="- -";
        else {
            var x=""+(dateObj.getDate());
            (x.length < 2) ? strDate="0"+x +"-"  :  strDate=x+''+DA_DATEDELIM+' ';
            var x=""+(dateObj.getMonth()+1);
            (x.length < 2) ? strDate+="0"+x  : strDate+=x;
            strDate+="-"+dateObj.getFullYear();
        }
        return strDate;
    }

    function str2Date(strDate) {
        dateObj=new Date(Y2kStr(strDate));
        return dateObj;
    }

    function date2Julian(thisDate) {
        (thisDate == 'now') ? dateObj=new Date() :  dateObj=new Date(Y2kStr(thisDate));
        return dateObj.valueOf();
    }

    function julian2Date(thisJulian) {
        var numJulian=1*thisJulian;
        dateObj=new Date(numJulian);
        return dateObj;
    }

      function dateAdd(thisDate,daysDelta) {
  var dateJul=1*date2Julian(thisDate);
  var dateJul=dateJul+(daysDelta *24*60*60*1000);
  dateObj=julian2Date(dateJul);
  return dateObj;
    }

    function Y2kStr(strDate) {
        if (typeof strDate == 'string') {
            dElements=strDate.split('-');
            if (dElements.length < 3) dElements=strDate.split('/');
            if (dElements.length == 3){
                var year= dElements[2];
                if (year.length < 3) year='20'+year;
                strDate=dElements[1]+'/'+dElements[0]+'/'+ year;
            }
            else strDate='';
        }
        return strDate;
    }


    function weekDay(thisDate) {
        weekDayIndex=DA_WEEKDAYS.split('|');
        var weekDay=weekDayIndex[thisDate.getDay()];
        return weekDay;
    }

    function monthName(thisDate) {
        monthNameIndex=DA_MONTHS.split('|');
        var monthName=monthNameIndex[thisDate.getMonth()];
        return monthName;
    }

