function getRandomString() {
    var sid = "";
    var chars = new Array ('0','1','2','3','4','5','6','7','8','9','a','b','c','d',
        'e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v'
        ,'w' ,'x','y','z','A','B','C','D','E','F','G','H','I','J','K','L','M',
        'N','O','P','Q','R','S','T','U','V','W','X','Y','Z');
    var charCount = chars.length;
    var random;
    var i=0;

    do {
        random = Math.random();
        random *= charCount;
        random = Math.floor(random);
        random = chars[random];

        sid += random;
        i++;
    }
    while (i < stringLength);

    return sid;
}

function showReturnBox() {
    document.getElementById('retourdatumtekst').style.display = 'block';
    document.getElementById('retourdatumbox').style.display = 'block';
    document.getElementById('retourdatumcal').style.display = 'block';
}

function hideReturnBox() {
    document.getElementById('retourdatumtekst').style.display = 'none';
    document.getElementById('retourdatumbox').style.display = 'none';
    document.getElementById('retourdatumcal').style.display = 'none';
}


YAHOO.namespace("example.calendar");

function handleSelect(type,args,obj) {
    var dates = args[0];
    var date = dates[0];
    var year = date[0], month = date[1], day = date[2];

    var selMonth = document.getElementById("selMonth");
    var selDay = document.getElementById("selDay");
    var selYear = document.getElementById("selYear");

    selMonth.selectedIndex = month-1;
    selDay.selectedIndex = day-1;

    for (var y = 0;y < selYear.options.length;y++) {
        if (selYear.options[y].text == year) {
            selYear.selectedIndex = y;
            break;
        }
    }
    //alert("Datum Selected: ");
    hideLayer("cal1Container");
    //zet de retourdatum op dezelfde datum als deze eerder is
    if (firstload > 0) {
        var selMonthT = document.getElementById("selMonthT");
        var selDayT = document.getElementById("selDayT");
        var selYearT = document.getElementById("selYearT");
        var selMonthvalue = parseInt(selMonth.options[selMonth.selectedIndex].value);
        var selDayvalue = parseInt(selDay.options[selDay.selectedIndex].value);
        var selYearvalue = parseInt(selYear.options[selYear.selectedIndex].innerHTML);
        var selMonthTvalue = parseInt(selMonthT.options[selMonthT.selectedIndex].value);
        var selDayTvalue = parseInt(selDayT.options[selDayT.selectedIndex].value);
        var selYearTvalue = parseInt(selYearT.options[selYearT.selectedIndex].innerHTML)
        if ( (selYearTvalue < selYearvalue) || ((selYearTvalue == selYearvalue) && (selMonthTvalue < selMonthvalue)) ||  ( (selYearTvalue == selYearvalue)&&(selMonthTvalue == selMonthvalue)&&(selDayTvalue < selDayvalue) )  ) {
            selMonthT.selectedIndex = month-1;
            selDayT.selectedIndex = day-1;
            for (var y = 0;y < selYearT.options.length;y++) {
                if (selYearT.options[y].text == year) {
                    selYearT.selectedIndex = y;
                    break;
                }
            }
            updateCalT("false");
        }
    }
    firstload++; //om te kijken of de gebruiker de datum al een keer heeft veranderd
}

function handleSelectT(type,argsT,obj) {
    //retourdatumveranderd = "true";
    var datesT = argsT[0];
    var dateT = datesT[0];
    var yearT = dateT[0], monthT = dateT[1], dayT = dateT[2];

    var selMonthT = document.getElementById("selMonthT");
    var selDayT = document.getElementById("selDayT");
    var selYearT = document.getElementById("selYearT");

    selMonthT.selectedIndex = monthT-1;
    selDayT.selectedIndex = dayT-1;

    for (var y = 0;y < selYearT.options.length;y++) {
        if (selYearT.options[y].text == yearT) {
            selYearT.selectedIndex = y;
            break;
        }
    }
    //alert("Datum Selected: ");
    hideLayer("cal1ContainerT");
    firstload++; //om te kijken of de gebruiker de datum al een keer heeft veranderd
}

function updateCal(firstl) {
    //listener van de pulldownbox is geactiveerd.
    //zet de kalender op de juiste maand
    var selMonth = document.getElementById("selMonth");
    var selDay = document.getElementById("selDay");
    var selYear = document.getElementById("selYear");

    var month = parseInt(selMonth.options[selMonth.selectedIndex].value);
    var day = parseInt(selDay.options[selDay.selectedIndex].value);
    var year = parseInt(selYear.options[selYear.selectedIndex].innerHTML);

    if (! isNaN(month) && ! isNaN(day) && ! isNaN(year)) {
        var date = month + "/" + day + "/" + year;

        YAHOO.example.calendar.cal1.select(date);
        YAHOO.example.calendar.cal1.cfg.setProperty("pagedate", month + "/" + year);
        YAHOO.example.calendar.cal1.render();
    }
    //zet de retourdatum op dezelfde datum als deze eerder is
    if (firstload > 0) {
        var selMonthT = document.getElementById("selMonthT");
        var selDayT = document.getElementById("selDayT");
        var selYearT = document.getElementById("selYearT");
        var selMonthvalue = parseInt(selMonth.options[selMonth.selectedIndex].value);
        var selDayvalue = parseInt(selDay.options[selDay.selectedIndex].value);
        var selYearvalue = parseInt(selYear.options[selYear.selectedIndex].value);
        var selMonthTvalue = parseInt(selMonthT.options[selMonthT.selectedIndex].value);
        var selDayTvalue = parseInt(selDayT.options[selDayT.selectedIndex].value);
        var selYearTvalue = parseInt(selYearT.options[selYearT.selectedIndex].value);
        if ( (selYearTvalue < selYearvalue) || ((selYearTvalue == selYearvalue) && (selMonthTvalue < selMonthvalue)) ||  ( (selYearTvalue == selYearvalue)&&(selMonthTvalue == selMonthvalue)&&(selDayTvalue < selDayvalue) )  ) {
            selMonthT.selectedIndex = month-1;
            selDayT.selectedIndex = day-1;
            for (var y = 0;y < selYearT.options.length;y++) {
                if (selYearT.options[y].text == year) {
                    selYearT.selectedIndex = y;
                    break;
                }
            }
            updateCalT("false");
        }
    }
    if (firstl == "true") {
        firstload++; //om te kijken of de gebruiker de datum al een keer heeft veranderd
    }

}

function updateCalT(firstl) {
    var selMonthT = document.getElementById("selMonthT");
    var selDayT = document.getElementById("selDayT");
    var selYearT = document.getElementById("selYearT");

    var monthT = parseInt(selMonthT.options[selMonthT.selectedIndex].value);
    var dayT = parseInt(selDayT.options[selDayT.selectedIndex].value);
    var yearT = parseInt(selYearT.options[selYearT.selectedIndex].innerHTML);

    if (! isNaN(monthT) && ! isNaN(dayT) && ! isNaN(yearT)) {
        var dateT = monthT + "/" + dayT + "/" + yearT;

        YAHOO.example.calendar.cal1T.select(dateT);
        YAHOO.example.calendar.cal1T.cfg.setProperty("pagedate", monthT + "/" + yearT);
        YAHOO.example.calendar.cal1T.render();
    }
    if (firstl == "true") {
        firstload++; //om te kijken of de gebruiker de datum al een keer heeft veranderd
    }
}

function buttonRollOver() {
    if (formSubmitted == false) {
        var pic = document.getElementById('Zoek');
        pic.src = pic.src.substring(0,pic.src.length - 5) + '2.png';
    }
}
function buttonRollOut() {
    if (formSubmitted == false) {
        var pic = document.getElementById('Zoek');
        pic.src = pic.src.substring(0,pic.src.length - 5) + '1.png';
    }
}
function buttonHit() {
    var pic = document.getElementById('Zoek');
    pic.src = pic.src.substring(0,pic.src.length - 5) + '3.png';
    //pic.style.cursor = 'default';
}
function buttonReset() {
    formSubmitted = false;
    var pic = document.getElementById('Zoek');
    pic.src = pic.src.substring(0,pic.src.length - 5) + '1.png';
    pic.style.cursor = 'hand';
    removeLoader();
    removeLowcostPopup();
}
function removeLowcostPopup() {
    if (document.getElementById('lowcostMask') != null) {
        document.getElementById('lowcostMask').style.display = "none";
        document.getElementById('lowcostPopup').style.display = "none";
    }
}

function stopMouseOver() {
    var pic = document.getElementById('stop');
    pic.src = pic.src.substring(0,pic.src.length - 6) + 'hover.jpg';
}
function stopMouseOut() {
    var pic = document.getElementById('stop');
    pic.src = pic.src.substring(0,pic.src.length - 9) + 'up.jpg';
}

function clearFormField(num) {
    document.getElementById('ysearchinput' + num).value='';
    if (num == 2 && document.getElementById('NLairports')) {
        document.getElementById('NLairports').checked = false;
        toggleMultiCity(document.getElementById('NLairports'));
    }
    ffClearActive = false;
}

function contrlett2() {
    var tekststring = document.getElementById('ysearchinput2').value;

    if (tekststring.length < 3) {
        complete2 = false;
    }
    else {
        complete2 = true;
    }
    if (numSelected[1] > 0) {
        numSelected[1] = 0;
        for (var i in checkedAirports[1]) {
            checkedAirports[1][i] = "   ";
        }
    }
}
function contrlett3() {
    var tekststring = document.getElementById('ysearchinput3').value;
    if (tekststring.length < 3) {
        complete3 = false;
    }
    else {
        complete3 = true;
    }
    if (numSelected[2] > 0) {
        numSelected[2] = 0;
        for (var i in checkedAirports[2]) {
            checkedAirports[2][i] = "   ";
        }
    }
}

function formSubmitHandler() {
    var sid;
    if (!formSubmitted) {
        sid = getRandomString(); // request new sessionID
        if (checksubmitform(sid)) {
            formSubmitted = true;
            showMessage("");
            validate(postdat, sid);
        }
    }
}

function checksubmitform(sid) {
    //alert('loading form values...');
    var autocompheen;
    if (document.getElementById("ysearchinput2") != null) {
        autocompheen = document.getElementById("ysearchinput2").value;
    } else {
        autocompheen = "Nederland en omstreken (NL)"; // if box missing
    }
    var autocompterug = document.getElementById("ysearchinput3").value;

    var oldAutoCompHeen = (autocompheen != null) ? autocompheen : "";
    var oldAutoCompTerug = autocompterug;
    oldAutoCompHeen = oldAutoCompHeen.replace(/\s\(.*\)/g, "");
    oldAutoCompTerug = oldAutoCompTerug.replace(/\s\(.*\)/g, "");

    // Nearby departure airports selected?
    if (numSelected[1] > 0) {
        //alert("index: " + autocompheen.regexIndexOf(/[A-Z]{3}/));
        autocompheen = autocompheen.substring(autocompheen.regexIndexOf(/[A-Z]{3}/),
                        autocompheen.regexIndexOf(/[A-Z]{3}/)+3);
        for (var code in checkedAirports[1]) {
            if (checkedAirports[1][code].indexOf("   ") == -1) { // not blank?
                autocompheen += "," + checkedAirports[1][code];
            }
        }
        autocompheen = oldAutoCompHeen + " (" + autocompheen + ")";
    }
    //alert(autocompheen); return false;

    // Nearby destination airports selected?
    if (numSelected[2] > 0) {
        //alert("index: " + autocompheen.regexIndexOf(/[A-Z]{3}/));
        autocompterug = autocompterug.substring(autocompterug.regexIndexOf(/[A-Z]{3}/),
                        autocompterug.regexIndexOf(/[A-Z]{3}/)+3);
        for (code in checkedAirports[2]) {
            if (checkedAirports[2][code].indexOf("   ") == -1) { // not blank?
                autocompterug += "," + checkedAirports[2][code];
            }
        }
        autocompterug = oldAutoCompTerug + " (" + autocompterug + ")";
    }

    
    var dagheen = document.dates.selDay.value;
    var maandheen = document.dates.selMonth.value;
    var selYear = document.getElementById("selYear");
    var jaarheen = selYear.options[selYear.selectedIndex].innerHTML;
    var dagterug = document.datesT.selDayT.value;
    var maandterug = document.datesT.selMonthT.value;
    var selYearT = document.getElementById("selYearT");
    var jaarterug = selYearT.options[selYearT.selectedIndex].innerHTML;
    var retourenkel;

    if (document.f3 != null) {
        retourenkel = document.f3.enkelRetour.value;
    } else {
        for (i=0; i<2; i++) {
            if(document.f2.r1[i].checked){
                retourenkel = document.f2.r1[i].value;
                break;
            }
        }
    }

    // Check if dates are valid
    if (!checkdate( parseInt(maandheen), parseInt(dagheen), parseInt(jaarheen) )){
        //<?php echo 'alert("'.$set->geldige_heendatum[$taal].'");'; ?>
        alert(errorDepDateInvalid);
        return false;
    }
    if (retourenkel == "Retour" && !checkdate(parseInt(maandterug),
            parseInt(dagterug), parseInt(jaarterug) )){
        alert(errorRetDateInvalid);
        //<?php echo 'alert("'.$set->geldige_retourdatum[$taal].'");'; ?>
        return false;
    }

    var now = new Date();
    var today = new Date(now.getFullYear(), now.getMonth(), now.getDate());
    //alert("now: " + now.getTime() + ", today: " + today.getTime());
    var depdate = new Date(parseInt(jaarheen), parseInt(maandheen)-1, parseInt(dagheen));
    var retdate = new Date(parseInt(jaarterug), parseInt(maandterug)-1, parseInt(dagterug));

    // Check departure date
    var diff = depdate.getTime() - today.getTime();
    var num_days = (((diff / 1000) / 60) / 60) / 24;
    //alert("Number of days diff: " + num_days);
    if (num_days < 0) {
        alert(errorDepDatePast);
        return false;
    }

    // Check return date
    if (retourenkel == "Retour") {
        diff = retdate.getTime() - today.getTime();
        num_days = (((diff / 1000) / 60) / 60) / 24;
        if (num_days < 0) {
            alert(errorRetDatePast);
            return false;
        }
    }

    if (maandheen.length <2) {
        maandheen = "0"+maandheen;
    }
    if (maandterug.length <2) {
        maandterug = "0"+maandterug;
    }

    if (dagheen.length <2) {
        dagheen = "0"+dagheen;
    }
    if (dagterug.length <2) {
        dagterug = "0"+dagterug;
    }

    var datumheenstr = jaarheen +"/"+ maandheen +"/"+ dagheen;
    var datumterugstr = jaarterug +"/"+ maandterug +"/"+ dagterug; 	//  YYYY/MM/DD
    var datumheenint = parseInt(jaarheen + maandheen + dagheen);
    var datumterugint = parseInt(jaarterug + maandterug + dagterug); //YYYMMDD
    var datumheen = datumheenstr;
    var datumterug = datumterugstr;

    if (retourenkel == "Retour" && datumheenint > datumterugint) {
        alert(errorRetDateBeforeDepDate);
        //<?php echo 'alert("'.$set->retourdatum_na_vetrekdaturm[$taal].'");'; ?>
        return false;
    }

    // Check if origin and destination are valid strings (len >= 3)
    if (autocompheen.length < 3){
        //<?php echo 'alert("'.$set->geldige_vertrekstad[$taal].'");'; ?>
        alert(errorInvalidOrigin);
        document.getElementById('ysearchinput2').focus();
        return false;
    }
    if (autocompterug.length < 3){
        //<?php echo 'alert("'.$set->geldige_bestemming[$taal].'");'; ?>
        alert(errorInvalidDestination);
        document.getElementById('ysearchinput3').focus();
        return false;
    }

    //var aantalreiz = document.f1.adults.value;
    numAdults = document.f1.adults.value;
    var prefnonstop = "false";
    var doflexible = "false";
    // document.f1.nonstop.checked;  //false : geen non-stop geprefereed
    // doflexible = document.f1.doflexible.value;
    //aantalkin = 0 //aantalbab = 0 // NB: deze staan nu statisch in de postdata

    // All checks OK > set variable "postdat" and return true.

//    document.getElementById('Zoek').src='images/button-zoek-clicked.gif';
    var autocompheene = urlencode(autocompheen);
    var autocompteruge = urlencode(autocompterug);
    var datumheene = escape(datumheen);
    var datumteruge = escape(datumterug);
    var retourenkele = escape(retourenkel);
    var aantalreize = numAdults;
    var prefnonstope = escape(prefnonstop);

    //<?php echo 'taal ="'.$taal.'";'; ?>
    var taal = "nl";

    if (servletURL == "") {
        servletURL = defaultURL;
    }

    var servlet = servletURL.substring(13,27);
    //alert("servlet: " + servlet);
    postdat = "uq="+sid+"&autocompheen="+autocompheene+"&autocompterug="+autocompteruge+"&datumheen="+datumheene+"&datumterug="+datumteruge+"&retourenkel="+retourenkele+"&aantalreiz="+aantalreize+"&aantalkin=0"+"&aantalbab=0"+"&prefnonstop="+prefnonstope+"&lan="+taal+"&doflexible="+doflexible+"&servleturl="+servlet;
/*
    // NEW: get nearby airports (AJAX):
    var dep = autocompheen.split(/[\\(\\)]/);
    var des = autocompterug.split(/[\\(\\)]/);
    //alert("arr.length: " + arr.length);
    var airport1 = dep[1];
    var airport2 = des[1];
    getNearbyAirports(airport1);
    //getNearbyAirports(2, airport2);

    return false;*/

    // Show overlay mask
    if (window.location.href.indexOf("ref=lowcost") &&
        showLowcostMask && document.getElementById('lowcostMask')) {
        document.getElementById('lowcostMask').style.display = "block";
    }


    //aantalkin = 0  //aantalbab = 0
    return true;
} // checksubmitform

function isMultiAirport(str) {
    // go through all multi-city codes in predefined array
    for (var code in allAirportCodes) {
        //showMessage("code: " + allAirportCodes[code]);
        if (str.indexOf(allAirportCodes[code]) >= 0) {
            return true;
        }
    }
    // airport not in the list, so not multi-city
    return false;
}

function autoCompClickEvent(AC_Widget, widgetNum) {
    // Look up nearby airports
    if (isMultiAirport(AC_Widget._oTextbox.value)) {
        // hide the div
        document.getElementById('multiAirports'+widgetNum).style.visibility = "hidden"
    } else {
        //document.getElementById('nl-omstreken-label').innerHTML = "Search nearby airports"; // TODO: in textfields.js
        var index = AC_Widget._oTextbox.value.regexIndexOf(/[A-Z]{3}/);

        if (index == -1 && verbose) {
            showMessage("regex failed (form-functions.js)");
        }
        var code = AC_Widget._oTextbox.value.substring(index, index+3);
        //alert('code: ' + code);

        //document.getElementById('multiAirports2').style.visibility = "visible";
        getNearbyAirports(code, widgetNum);

        if (document.getElementById('multiAirports'+widgetNum).style.visibility == "hidden") {
            document.getElementById('multiAirports'+widgetNum).style.visibility = "visible";
        } else {
            var t1 = window.setTimeout("toggleNearbyAirports("+widgetNum+")", 500);
        }
    } // end of nearby airport look-up
} // autoCompClickEvent

function showMessage(melding, kleur) {
    var message = document.getElementById("messageBox2");
    if (message == null) {
        message = document.getElementById("messageBox");
    }
//    if (message == null) {
//        alert("message: " + melding);
//        return;
//    }


    if (melding != "") {
        if (melding.length < 120) {
            message.style.height = '25px';
        } else {
            message.style.height = '75px';
        }
    } else {
        message.style.height = '0px';
    }

    message.style.display = 'block';

    if (!frozen) {
        message.innerHTML = melding;
    }

    if (resultLayout && melding != "") {
        //alert('frozen: ' + frozen + ' melding: ' + melding);
        document.getElementById("topBar").style.height = "180px";
        document.getElementById("banner").style.height = "185px";
        //document.getElementById("compact-search").style.top = "-122px";
        //message.style.height = "80px";
    } else if (resultLayout) {
        document.getElementById("topBar").style.height = "107px";
        document.getElementById("banner").style.height = "107px";
        //document.getElementById("compact-search").style.top = "-117px";
        //message.style.height = "0px";
    }

    /*if (!resultLayout) {
        if (melding != "") {
            message.style.marginTop = "0px";
        } else {
            message.style.marginTop = "-2px";
        }
    }*/
}

function freezeMessage() {
    frozen = true;
}

function checkdate( month, day, year ) {
    var myDate = new Date();
    myDate.setFullYear( year, (month - 1), day );
    return ( (myDate.getMonth()+1) == month );
}

function validate(postvalues, sid) {
    // New AJAX request (24-02-2011)
    //  > on success, submitRequest() is called
    //  > on failure, showMessage is called with the error
    newSessionID = sid; // new session ID candidate
    validateRequest("/prepare-request.php", postvalues);
}

function validateRequest(url, params) {
    // Because POST-request was failing, we use the GET-method
    YAHOO.util.Connect.asyncRequest('GET', url+'?'+params,
                   {success:handleSuccessPrepareRequest,
                    failure:handleFailurePrepareRequest});
} // validateRequest

var handleSuccessPrepareRequest = function(o) {
    if (parseResponseXML(o.responseXML)) {
        sessionID = newSessionID;     // set global sessionID
        submitRequest();
    } else {
        formSubmitted = false;
        buttonReset();
    }
}

function handleFailurePrepareRequest() {
    trackError('/handleFailurePrepareRequest/aanvraag-kon-niet-worden-verwerkt');
    alert(errorPrepareRequest);
    formSubmitted = false;
}

// parseResponseXML: returns TRUE when response status == 1
function parseResponseXML(body) {
    if (body == null) {return false;}
    var root = body.documentElement;
    var descNodes = root.getElementsByTagName('description');

    if (descNodes == null || descNodes.length == 0) {
        showMessage(errorParseResponse);
        trackError('parseResponseXML/response invalid');
        return false;
    }

    var desc = descNodes[0];
    var status = desc.getAttribute('status');

    var sugg = new Array();
    var codes = new Array(); //code1, code2, code3;

    if (status == "1") {
        if (verbose) {
            showMessage('request OK...');
        }
        return true;
    }

    // status == 0
    //
    // fout, geef melding op het scherm
    var errStr = desc.getAttribute('errorcode');
    var errorcode;

    try {
        errorcode = parseInt(errStr);
    } catch (e) {
        if (verbose) {
            showMessage("Onbekende error (geen int): " + errStr);
            freezeMessage();
        } else {
            showMessage(errorParseResponse);
            trackError('/error/parseResponseXML/Onbekende error geen int: ' + errStr);
        }
        return false;
    }

    switch (errorcode) {
        case 1:showMessage(errorConnectServer,"rood");break;
        case 2:showMessage(errorDepCityNotRecognized,"rood");break;
        case 3:showMessage(errorDesCityNotRecognized,"rood");break;
        case 4:showMessage(errorIncorrectDepDate,"rood");break;
        case 5:showMessage(errorIncorrectRetDate,"rood");break;
        case 6:break; // already handled by checksubmitrequest
        case 7:showMessage(errorOriginIsDestination,"rood");break;
        default:break;
    }

    if (errorcode == "21" || errorcode == "22") {
        sugg[0] = desc.getAttribute('match1');
        sugg[1] = desc.getAttribute('match2');
        sugg[2] = desc.getAttribute('match3');
        codes[0] = desc.getAttribute('code1');
        codes[1] = desc.getAttribute('code2');
        codes[2] = desc.getAttribute('code3');

        if (errorcode == "21") {
            offerSuggestions(sugg, codes, "vertrekplaats");
        } else {
            offerSuggestions(sugg, codes, "bestemming");
        }
    }
    return false;
} // parseResponseXML

// NEW: handlers for proximate-airport request:
var handleSuccessMultiAirportRequest = function(o) {
    showAirports(o.responseXML);
}
var handleFailureMultiAirportRequest = function(o) {
    if (verbose) {showMessage("req failed.");}
}

// NEW: proximate-airport request function:
function getNearbyAirports(code, widgetNum) {
    //alert(code);
    var maxDistance = 500; // radius = 500 kilometres
    code = code.toUpperCase();
    YAHOO.util.Connect.asyncRequest('GET', 'http://www.chaser.be/data/php/get-proximate-airports.php?'
                                    + 'lan=' + language + '&code='+code
                                    + '&max='+maxDistance + "&widgetnum="+widgetNum,
                                   {success:handleSuccessMultiAirportRequest,
                                    failure:handleFailureMultiAirportRequest});
} // getNearbyAirports

function Airport() {
}

function sortByWeight(a,b) {
    var x = parseFloat(a.weight);
    var y = parseFloat(b.weight);
    return ((x<y) ? 1 : (x>y) ? -1 : 0);
}

function showAirports(body) {
    //alert("test");
    if (body == null) {return false;}
    var root = body.documentElement;
    var proxNodes = root.getElementsByTagName('airports');
    var prox = proxNodes[0];
    var maxListLength = 12;
    
    var widgetNum = prox.getAttribute('widgetnum');
    nearbyAirports[widgetNum] = new Array();
    var airports = new Array();

    for (var i=0; i<40; i++) {
        if (prox.getAttribute('item'+i) == null) {
            break;
        }
        airports[i] = new Airport();
        airports[i].code = prox.getAttribute('item'+i);
        airports[i].name = prox.getAttribute('fullname'+i);
        airports[i].dist = Math.round(parseInt(prox.getAttribute('dist'+i)) / 1000);
        airports[i].weight = parseInt(prox.getAttribute('weight'+i));
        // Modify weight using distance:
        //airports[i].weight = 1/(Math.exp(airports[i].dist / 30)) * airports[i].weight;
        //airports[i].weight = (1/Math.pow(airports[i].dist / 50, 2)) * airports[i].weight;
        airports[i].weight = (1/(airports[i].dist)) * Math.pow(airports[i].weight, 2);

        /*if (airports[i].code == "NRN") {
            //airports[i].weight = 1;
            showMessage("weight NRN: " + airports[i].weight);

        }*/
    }
    //alert("i=" + i + ", weight of airport 0: " + airports[0].weight);
    airports.sort(sortByWeight);

    for (i=0; i<Math.min(airports.length, maxListLength); i++) {
        nearbyAirports[widgetNum][i] = new Airport();
        nearbyAirports[widgetNum][i].name = airports[i].name + " (" + airports[i].dist + " km)";
        nearbyAirports[widgetNum][i].code = airports[i].code;
    }

    return true;
} // showAirports

function applySuggestion(sugg, boxID) {
    document.getElementById('ysearchinput'+boxID).value = sugg;
    showMessage('');
    var sid = getRandomString(); // request new sessionID
    if (checksubmitform(sid)) {
        formSubmitted = true;
        validate(postdat, sid);
    }
}

function offerSuggestions(suggestions, codes, type) {
    var suggList = '<li>' + suggestionsHeader + ':</li>';
    var boxNum = (type == "vertrekplaats") ? 2 : 3;

    for (var s=0; s<suggestions.length; s++) {
       if (suggestions[s] != null) {
           suggList += '<li><a href="" onclick="applySuggestion(\''
             + suggestions[s] + ' (' + codes[s] + ')' + '\',' + boxNum + '); '
             + 'return false;">' + suggestions[s] + ' (' + codes[s] + ')'
             + '</a></li>';
       } // if suggestions[s] != null
    } // for suggestions
    suggList = '<div id="suggestions"><ul>' + suggList + '</ul></div>';
    showMessage(suggList);

    if (document.getElementById('compact-search') != null) {
        document.getElementById('compact-search').style.backgroundColor = '#eee';
    }
    if (document.getElementById('searchbox-slogan') != null) {
        document.getElementById('searchbox-slogan').style.display = "none";
    }

} // offerSuggestions

// Sends a GET request using AJAX
function ajaxGet(url) {
    YAHOO.util.Connect.asyncRequest('GET', url,
                   {success:handleSuccessProxy,
                    failure:handleFailureProxy});
} // ajaxGet

var handleSuccessProxy = function(o) {
    //if (verbose) showMessage('GET proxy OK');
    //buttonReset();
};

var handleFailureProxy = function(o) {
    if (verbose) showMessage('GET proxy failed. ' + o.responseText);

    if(o.responseText.substring(0,34) == "HTTP/1.1 500 Internal Server Error") {
        //showProgressError(requestError); // "Er is een fout opgetreden..."
        showProgressError(errorTemporarilyUnavailable);
        trackError('handleFailureProxy/500 internal server error');
        buttonReset();
        clearInterval(ival1);
        clearInterval(ival2);
        removeLoader();
    }

    //buttonReset();
};

var handleSuccessXML = function(o) {
    var body = o.responseXML;
    var root = body.documentElement;
    var data = root.getElementsByTagName('d');
    var d1 = data[0];
    hstad = d1.getAttribute('hstad');
    tstad = d1.getAttribute('tstad');
    hstad = hstad.toLowerCase();
    tstad = tstad.toLowerCase();
    var hdatum = d1.getAttribute('heend');
    var tdatum = d1.getAttribute('terugd');
    reqHeenDatum = hdatum.substring(0,4)+hdatum.substring(5,7)+hdatum.substring(8,10);
    reqTerugDatum = tdatum.substring(0,4)+tdatum.substring(5,7)+tdatum.substring(8,10);
    initSession();
    //urchinTracker('/zoekopdracht/'+hstad+'/'+tstad);
    _gaq.push(['_trackPageview', '/zoekopdracht/'+hstad+'/'+tstad]);
    //var t = setTimeout("callSdbRetrieve('"+hstad+"','"+tstad+"')", 8000);
};

var handleFailureXML = function(o) {
};

function callSdbRetrieve(heenstad, terugstad) {
    var sdbRetrieveURL = "/scripts/sdb_retrieve.php?origin="
            + heenstad.toUpperCase() + "&dest=" + terugstad.toUpperCase()
            + "&rand=" + parseInt(Math.random()*randMax);
    YAHOO.util.Connect.asyncRequest('GET', sdbRetrieveURL, {success:
                handleSuccessSDB, failure:handleFailureSDB});
}

var handleSuccessSDB = function(o) {
    try {
        var obj = YAHOO.lang.JSON.parse(o.responseText);
    } catch(e) {
        if(verbose){
            showMessage("Error in handleSuccessSDB JSON.parse: " + e.message);
            freezeMessage();
        }
    }

    try {
        var numFlights = obj.length;
        var msg = "";

        for (var f=0; f<numFlights; f++) {
            msg += "Origin: " + obj[f].origin + ", Destination: "
                + obj[f].destination + ", Dep date: " + obj[f].depDate
                + ", Ret date: " + obj[f].retDate
                + ", Price: " + obj[f].price / obj[f].adults + "<BR>"

        }
        showMessage(msg);
        document.getElementById('messageBox2').style.height = 'inherit';
        document.getElementById('messageBox2').style.backgroundColor = '#fff';

    } catch(e) {
        if(verbose){
            showMessage("Error in handleSuccessSDB: " + e.message);
            freezeMessage();
        }
    }
};


var handleFailureSDB = function(o) {
};

function updateInputField(number) {
    var checkedList = checkedAirports[number].join("|");
    var inputField = document.getElementById('ysearchinput'+(number+1));

    if (inputField.value.indexOf("+") > 0) {
        inputField.value = inputField.value.substring(0,inputField.value.indexOf("+")-1);
    }
    if (numSelected[number] > 0) {
        if (numSelected[number] == 1) {
            inputField.value = inputField.value + " + " + checkedList.substr(checkedList.regexIndexOf(/[A-Z]{3}/),3);
        } else {
            inputField.value = inputField.value + " + " + numSelected[number] + " airports";
        }
    }
}

function removeAirports(number) {
    //alert("TODO: implement removeAirports");
    numSelected[number] = 0;
    for (var i in checkedAirports[number]) {
        checkedAirports[number][i] = "   ";
    }
    updateInputField(number);
}

function addAirport(number, checkbox) {
    var myJoin = "|" + checkedAirports[number].join("|") + "|";
    var searchString = "|" + checkbox.value + "|";
    var index = myJoin.indexOf(searchString);

    if (index >= 0) {
        // remove airport from array
        checkedAirports[number][index/4] = "   "; // replace with blanks
        numSelected[number]--;
        return;
    }

    // check size of array
    if (numSelected[number] >= 3) {
        alert("You can select up to 3 nearby airports.")
        checkbox.checked = false;
        return;
    }

    // add airport to array
    //alert("adding airport " + checkbox.value);

    checkedAirports[number][checkedAirports[number].length] = checkbox.value;
    numSelected[number]++;
    
    //alert("checkedAirports len: " + (checkedAirports[number]).length);
}

function toggleNearbyAirports(number, expanded) {
    var airportList = "";
    var check;
/*    // if nothing selected, select the first one in the list
    if (numSelected[number] == 0) {
        checkedAirports[number][0] = nearbyAirports[number][0].code;
        numSelected[number]++;
    }*/

    if (nearbyAirports[number] == null || nearbyAirports[number].length == 0) {
        var place = (number == 1) ? "vertrekplaats" : "bestemming";
        alert("Geen luchthavens gevonden in de buurt van uw " + place);
        return;
    }

    // show popup window
    document.getElementById("airportPopup" + number).style.display = "block";
    document.getElementById("popupNearbyAirports" + number).checked = "checked";

    // build airportList
    for (var i=0; i<nearbyAirports[number].length; i++) {

        if (i == 5 && !expanded) {
            airportList += "<a href='javascript:void(0)' onclick='"
                        + "toggleNearbyAirports("+number+",true)'>meer...</a>";
            break; // stop after 5 iterations
        }

        //check = (i == 0) ? "checked='checked'" : ""; // TODO: comment this line

        if (checkedAirports[number].length > 0) {
            check = "";
            //alert("test 1");
            // Go through the list of checked checkboxes
            for(var index in checkedAirports[number]) {
                //alert("test " + index);
                if (checkedAirports[number][index] == nearbyAirports[number][i].code) {
                    check = "checked='checked'"; // if checked, set "checked"
                }
            }
        }

        airportList += "<input type='checkbox' "+check+"' onclick='addAirport("
                    + number + ",this)' "+ "value='" 
                    + nearbyAirports[number][i].code  + "'><label> "
                    + nearbyAirports[number][i].name + "</label><BR>";
    }
    document.getElementById("airportList" + number).innerHTML = airportList;

    return;
} // toggleNearbyAirports

function toggleMultiCity(checkbox) {
    var multiCity = (checkbox != null) ? checkbox.checked : false;
    
    var newColor = multiCity ? "#000" : "#999"; /* set new text color */
    var cities = {0:'AMS',1:'CRL',2:'BRU',3:'DUS',4:'NRN',5:'EIN',6:'MST',7:'RTM'};

    document.forms[0].AMS.disabled = !multiCity;
    document.forms[0].CRL.disabled = !multiCity;
    document.forms[0].BRU.disabled = !multiCity;
    document.forms[0].DUS.disabled = !multiCity;
    document.forms[0].NRN.disabled = !multiCity;
    document.forms[0].EIN.disabled = !multiCity;
    document.forms[0].MST.disabled = !multiCity;
    document.forms[0].RTM.disabled = !multiCity;

    for (var i=0; i<8; i++) {
        document.getElementById(cities[i] + '-label').style.color = newColor;
    }

    if (multiCity) {
        document.getElementById('ysearchinput2').value= nlPlus + " (NL)"
    }
    else {document.getElementById('ysearchinput2').value='';
        document.getElementById('ysearchinput2').focus();
    }

    trackPageView('/toggleMultiCity/' + multiCity);
}

function searchDifferentDates(depTimeStamp, retTimeStamp) {
    var depDate, retDate;
    // apply offset to dep date
    depDate = new Date(depTimeStamp);
    //alert("New dep date: " + depDate.getFullYear() + "/" + (depDate.getMonth()+1) + "/" + depDate.getDate());
    // apply offset to ret date
    retDate = new Date(retTimeStamp);

    // set dep date form values
    var selMonth = document.getElementById("selMonth");
    var selDay = document.getElementById("selDay");
    var selYear = document.getElementById("selYear");

    selMonth.selectedIndex = depDate.getMonth();
    selDay.selectedIndex = depDate.getDate()-1;

    for (var y = 0;y < selYear.options.length;y++) {
        if (selYear.options[y].text == depDate.getFullYear()) {
            selYear.selectedIndex = y;
            break;
        }
    }
    // set ret date form values
    var selMonthT = document.getElementById("selMonthT");
    var selDayT = document.getElementById("selDayT");
    var selYearT = document.getElementById("selYearT");

    selMonthT.selectedIndex = retDate.getMonth();
    selDayT.selectedIndex = retDate.getDate()-1;

    for (y = 0;y < selYearT.options.length;y++) {
        if (selYearT.options[y].text == retDate.getFullYear()) {
            selYearT.selectedIndex = y;
            break;
        }
    }

    // resubmit form
    if (depDate != depdate || retDate != retdate) {
        trackPageView('/zoekopdracht-via-matrix/');
        formSubmitHandler();
    }
} // searchDifferentDates

function submitRequest() {
    // Check if servlet URL has been set
    if (servletURL == '') {
        //showMessage('Geen servlet url, gebruikt default...');
        servletURL = defaultURL;
    }
    // Check value of IP-valid
    if (!ipv) {
        showMessage('<BR><font color="#0000FF">'+requestBlocked+'</font>');
        trackError('/banned-ip/'+userip);
        return;
    }

    ajaxGet('/proxy.php?url='
        + servletURL + sessionID);
    buttonHit();
    frozen = false;
    currentPage = 1;
    lowestPrice = 999999999;
    matrixIsValid = false;
    matrixIsActive = false;
    sortBy = "prijs";   // sort type
    allProvidersDone = false;
    requestBusy = false;
    count = 0;          // monitor running time
    failures = 0;       // script exceptions
    // start the results monitor after timeout of 4 seconds...
    document.getElementById('results').innerHTML = '';

    cycleEntryPoint = 0;
    staticListPosition = 0;

    document.getElementById('progress').style.display = 'block';
    document.getElementById('progress').innerHTML = "";
    flights = new Array();

    if (filters['airlines'] != undefined) {
        filters = new Array();
    }

    providersArray = new Array();

    countryFilters = {'NL':true, 'BE':true, 'DE':true};
    //globalSettingsInitialized = false;
    globalAirline = undefined;
    airlineFilterInitVal = true;

    _gaq.push(['_setCustomVar', 1, 'sessionID', sessionID, 3]);

    YAHOO.util.Connect.asyncRequest('GET', '/req/' + sessionID + '.xml',
                   {success:handleSuccessXML,
                    failure:handleFailureXML});
/*
    YAHOO.util.Connect.asyncRequest('GET', '/sdb_retrieve_test.php',
                   {success:handleSuccessSDB,
                    failure:handleFailureSDB});
  */
    //showMessage("");

    if (useHashParams) {
        window.location.hash = "#" + postdat;
    }

    //alert("window loc: " + window.location);

    // Check if postdat contains lowcost reference
    if (window.location.href.indexOf("ref=lowcost") != -1 && showLowcostMask) {
        //document.getElementById('lowcostMask').style.display = "block"; // moved to checksubmitform
        removeLoader(); // replace regular busy icon
        // Show popup
        document.getElementById('lowcostPopup').style.display = "inline-block";
        document.getElementById('lowcostPopup').innerHTML = "<div id='lowcostPopupContents'>"
            + "Chase.nl zoekt vluchten..."
            + "<br><div id='lowcostLoader'><img id='loader' src='/images/circle-loader2.gif' alt='' /></div></div>";
        //return;
        // As soon as first results appear, remove the mask
        // (@setResultLayout)
    }


    progressCycle();
    if (ival1 != null) {
        clearInterval(ival1);
        clearInterval(ival2);
    }
    ival1 = window.setInterval(monitor, ivalLength * 1000);
    ival2 = window.setInterval(progressCycle, ivalLength * 777);

    var t = window.setTimeout("setMatrixActive(true)", 10000);

    if (resultLayout) { /* repeated search */
        document.getElementById('filterbox-contents').innerHTML = '';
        document.getElementById('breadcrumb').innerHTML = '';
    }
} // submitRequest
