function getRandomString() {
    var sessionID = "";
    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];
        
        sessionID += random;
        i++;
    }
    while (i < stringLength);

    return sessionID;
}

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

function hideReturnBox() {
    document.getElementById('retourdatumtekst').style.display = 'none';
    document.getElementById('retourdatumbox').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 (clickdef=="false") {

        var pic = document.getElementById('Zoek');
        pic.src = pic.src.substring(0,pic.src.length - 5) + '2.gif';
    }
}
function buttonRollOut() {
    if (clickdef=="false") {
        var pic = document.getElementById('Zoek');
        pic.src = pic.src.substring(0,pic.src.length - 5) + '1.gif';
    }
}
function buttonHit() {
    clickdef = "true"; // state has changed to "Hit"
    var pic = document.getElementById('Zoek');
    pic.src = pic.src.substring(0,pic.src.length - 5) + '3.gif';
    pic.style.cursor = 'default';
}
function buttonReset() {
    formSubmitted = false;
    clickdef = "false"; // back to initial state
    var pic = document.getElementById('Zoek');
    pic.src = pic.src.substring(0,pic.src.length - 5) + '1.gif';
    pic.style.cursor = 'hand';
}

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='';
    ffClearActive = false;
}

function swapNLOrigin(checkbox) {
    if (checkbox.checked) {
        document.getElementById('ysearchinput2').value='Nederland en omstreken (NL)'
    } else {
        document.getElementById('ysearchinput2').value='';
        document.getElementById('ysearchinput2').focus()
    }
}

function formSubmitHandler() {
    if (!formSubmitted) {
        sessionID = getRandomString(); // initialize global variable sessionID
        if (checksubmitform()) {
            formSubmitted = true;
            validate(postdat);
        }
    }
}

function checksubmitform() {
    if (clickdef == "true") {
        return false;
    }
    //alert('loading form values...');
    var autocompheen = document.getElementById("ysearchinput2").value;
    var autocompterug = document.getElementById("ysearchinput3").value;
    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 maandheenint = maandheen;
    var maandterugint = maandterug;
    
    if (maandheen.length <2) {
        maandheen = "0"+maandheen;
    }
    if (maandterug.length <2) {
        maandterug = "0"+maandterug;
    }
    
    var dagheenint = dagheen;
    var dagterugint = dagterug;
    
    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;
    var retourenkel;

    for (i=0; i<2; i++) {
        if(document.f1.r1[i].checked){
            retourenkel = document.f1.r1[i].value;
            break;
        }
    }
    var aantalreiz = 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

    if (autocompheen.length < 3){
        //<?php echo 'alert("'.$set->geldige_vertrekstad[$taal].'");'; ?>
        alert("Vul a.u.b. een geldige vertrekstad in");
        return false;
    }
    if (autocompterug.length < 3){
        //<?php echo 'alert("'.$set->geldige_bestemming[$taal].'");'; ?>
        alert("Vul a.u.b. een geldige bestemming in");
        return false;

    }
    if (!checkdate( maandheenint, dagheenint, parseInt(jaarheen) )){
        //<?php echo 'alert("'.$set->geldige_heendatum[$taal].'");'; ?>
        alert("Vul a.u.b. een geldige heendatum");
        return false;

    }
    if (!checkdate( maandterugint, dagterugint, parseInt(jaarterug) )){
        alert("Vul a.u.b. een geldige retourdatum");
        //<?php echo 'alert("'.$set->geldige_retourdatum[$taal].'");'; ?>
        return false;

    }
    if (datumheenint > datumterugint) {
        alert("De retourdatum moet later zijn dan de vertrekdatum");
        //<?php echo 'alert("'.$set->retourdatum_na_vetrekdaturm[$taal].'");'; ?>
        return false;
    }

    // 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 = escape(aantalreiz);
    var prefnonstope = escape(prefnonstop);
//                    if (sessionID == undefined) {
//                        alert('sessionID undefined');
//                    }
    //<?php echo 'taal ="'.$taal.'";'; ?>
    var taal = "nl";
    postdat = "uq="+sessionID+"&autocompheen="+autocompheene+"&autocompterug="+autocompteruge+"&datumheen="+datumheene+"&datumterug="+datumteruge+"&retourenkel="+retourenkele+"&aantalreiz="+aantalreize+"&aantalkin=0"+"&aantalbab=0"+"&prefnonstop="+prefnonstope+"&lan="+taal+"&doflexible="+doflexible;
    //aantalkin = 0  //aantalbab = 0
    return true;
} // checksubmitform

function showMessage(melding, kleur) {
    var message = document.getElementById("messageBox");
    //message.style.height = '';
    message.style.display = 'block';
    if (!frozen) {
        message.innerHTML = melding;
    }
    /*kleur = typeof(kleur) != 'undefined' ? kleur : "zwart";

    if (kleur == undefined) {
        kleur = "zwart";
    }
    if (kleur == "rood") {
        document.getElementById("foutm").innerHTML = "<table width='700' border='0' align='center'><p>&nbsp;</p><font color='red' size='2'><b>"+melding+"</b></font></table>";
    }
    if (kleur == "zwart") {
        document.getElementById("foutm").innerHTML = "<table width='700' border='0' align='center' zwart_standaard><p>&nbsp;</p>"+melding+"</table>";
    }*/
}

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) {
    // New AJAX request (24-02-2011)
    //  > on success, voerDefinitiefUit is called
    //  > on failure, showMessage is called with the error
    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)) {
        submitRequest();
    } else {
        formSubmitted = false;
    }
}

function handleFailurePrepareRequest() {
    alert('prepare request failed.');
    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("Er is een fout opgetreden. We doen ons "
                    + "uiterste best om dit zo spoedig mogelijk te "
                    + "verhelpen.<BR/>Onze excuses voor het ongemak.");
        // TODO: sendAlert!
        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("Er is een fout opgetreden. We doen ons "
                + "uiterste best om dit zo spoedig mogelijk te "
                + "verhelpen. Probeer het later nogmaals.");
        }
        return false;
    }

    switch (errorcode) {
        case 1:showMessage("Er is geen verbinding met de server mogelijk. Probeert u het later nogmaals.","rood");break;
        default:break;
    }


    if (errorcode == "1") {
        showMessage("Er is geen verbinding met de server mogelijk. Probeert u het later nogmaals.","rood");
    }
    if (errorcode == "2") {
        showMessage("De opgegeven vertrekstad kan niet worden gevonden.","rood");
    }
    if (errorcode == "3") {
        showMessage("De opgegeven bestemming kan niet worden gevonden.","rood");
    }
    if (errorcode == "4") {
        showMessage("De opgegeven vertrekdatum is niet juist.","rood");
    }
    if (errorcode == "5") {
        showMessage("De opgegeven retourdatum is niet juist.","rood");
    }
    if (errorcode == "6") {
        showMessage("De vertrekdatum moet later zijn dan de retourdatum.","rood");
    }
    if (errorcode == "7") {
        showMessage("De vertrekstad moet anders zijn dan de bestemming.","rood");
    }
    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 {
            //showMessage("testing 1 2 3", "rood");
            offerSuggestions(sugg, codes, "bestemming")
        }
    }
    return false;
} // parseResponseXML

function applySuggestion(sugg, boxID) {
    document.getElementById('ysearchinput'+boxID).value = sugg;
    if (checksubmitform()) {
        formSubmitted = true;
        validate(postdat);
    }
}

function offerSuggestions(suggestions, codes, type) {
    var suggList = '<li>Suggesties:</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);
} // 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);
    buttonReset();
}

var handleSuccessXML = function(o) {
    var body = o.responseXML;
    var root = body.documentElement;
    var data = root.getElementsByTagName('d');
    var d1 = data[0];
    var hstad = d1.getAttribute('hstad');
    var tstad = d1.getAttribute('tstad');
    urchinTracker('/zoekopdracht/'+hstad+'/'+tstad);
}

var handleFailureXML = function(o) {
}

function submitRequest() {
    sid = sessionID; // FIXME: remove this line
    // Check if servlet URL has been set
    if (servletURL == '') {
        showMessage('Geen servlet url, gebruikt default...');
        servletURL = 'http://174.129.211.65/Webchaser/Search?url='
                    + rootURL + '&sid=';
    }
    // TODO: check IP against blacklist (as in zoek.php)

    ajaxGet('/proxy.php?url='
        + servletURL + sessionID);
    buttonHit();
    frozen = false;
    currentPage = 1;
    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();
    filters = new Array();
    providersArray = new Array();

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

    YAHOO.util.Connect.asyncRequest('GET', '/req/' + sessionID + '.xml',
                   {success:handleSuccessXML,
                    failure:handleFailureXML});
    
    showMessage("");
    
    if (useHashParams) {
        window.location.hash = "#" + postdat;
    }

    progressCycle();
    ival1 = window.setInterval(monitor, ivalLength * 1000);
    ival2 = window.setInterval(progressCycle, ivalLength * 777);
} // submitRequest

