var departureRequest; // JSON request
var departureResult = null; // result of the JSON request
var dstDepartureObj = null; // scroll menu
var departureSelectedValue = null; // scroll menu selected value
var departureIndex = -1; // index of the scroll menu selected value
var departureOk = false;
var departureInput = null;
var departureSrollVisible = false;
var thread = null;

function departureIn() {
    document.getElementById('la').value = '';
    
    // daca e scris ceva in inputul de plecari in momentul in care ia focusul lansam thread-ul
    departureInput = document.getElementById('dela');
    if (departureInput.value != '') {
        if (thread != null)
          clearTimeout(thread);
        thread = setTimeout('doDepartureRequest()', 300);
    }    
}

function departureOut() {
    clearTimeout(thread);
    hideDepartures();
}

function departureKeyUp(key) {
    departureInput = document.getElementById('dela');
    if (departureInput.value == '') {// daca e vid anulam call-ul si ascundem meniul
        clearTimeout(thread);
        hideDepartures();
        return;
    }

    if ((key == 9) || (key == 13) || (key == 38) || (key == 40) || (key == 16))
    // tab, enter, sageata sus, sageata jos, shift
      return true;
    if (thread != null)
      clearTimeout(thread);
    thread = setTimeout('doDepartureRequest()', 300);
}

function departureKeyDown(key) {
    departureInput = document.getElementById('dela');
    dstDepartureObj = document.getElementById('plecari')

    if (departureInput.value == '') {// daca e vid anulam call-ul si ascundem meniul
        clearTimeout(thread);
        hideDepartures();
    }
    
    if ((key == 9) && (departureSelectedValue != null) && (departureOk)) {
       departureInput.value = departureSelectedValue;
       hideDepartures();
    }

    if ((key == 13) && (departureSelectedValue != null) && (departureOk)) {
       departureInput.value = departureSelectedValue;
       hideDepartures();
    }

    // daca meniul nu este vizibil nu tinem cont de sageata sus si sageata jos
    if (! departureSrollVisible)
        return true;

    if (key == 38) {
        if (departureIndex > 0) {
            departureIndex--;
            showDepartures();
            buildDepartureTable();
        }
        return true;
    }

    if (key == 40) {
        if (departureIndex < departureResult.departures.length - 1) {
            departureIndex++;
            showDepartures();
            buildDepartureTable();
        }
        return true;
    }
}

function doDepartureRequest() {
  if (departureInput.value == '') // daca e vid nu face call-ul
    return;

  try {
    if (window.XMLHttpRequest)
        departureRequest = new XMLHttpRequest();
    else
        if (window.ActiveXObject)
            departureRequest = new ActiveXObject("Microsoft.XMLHTTP");    
  } catch (e) {
      return false;
  }

  departureRequest.onreadystatechange = waitDepartureResponse;
  departureRequest.open('GET', 'getplecari.php?' + departureInput.name + '=' +  replaceDiacritics(townMatch(departureInput.value)), true);
  departureRequest.send('');
  return true;
}

function waitDepartureResponse() {
  if (departureRequest.readyState == 4) {
    if (departureRequest.status == 200) {       
        departureResult = eval('(' + departureRequest.responseText + ')');

        if (departureResult.departures.length == 0) {
            departureResult.departures[0] = 'Localitate invalid&#259;!'
            departureOk = false;
        }
        else {
            departureOk = true;
        }
        departureIndex = 0;
        // daca nu e gol afisam meniul cu eventuala eroare
        // daca nu e un singur match, iarasi afisam meniul
        if (!((departureInput.value == '') || ((replaceDiacritics(townMatch(departureInput.value.toLowerCase())) == replaceDiacritics(departureResult.departures[0].toLowerCase())) && (departureResult.departures.length == 1)))) {
            showDepartures();
            buildDepartureTable();
        }
        // daca e un singur match si e scris deja in input, nu mai afisam meniul;
        if ((replaceDiacritics(townMatch(departureInput.value.toLowerCase())) == replaceDiacritics(departureResult.departures[0].toLowerCase())) && (departureResult.departures.length == 1))
            hideDepartures();            
    }
  }
}

function showDepartures() {
    if (dstDepartureObj == null)
        return;
    dstDepartureObj.style.top = '57px';
    dstDepartureObj.style.left = $('#dela').offset().left;
    dstDepartureObj.style.visibility = 'visible';
    dstDepartureObj.style.display = 'inline';
    departureSrollVisible = true;
}

function hideDepartures() {
    if (dstDepartureObj == null)
        return;
    while (dstDepartureObj.rows.length > 0)
        dstDepartureObj.deleteRow(0);
    dstDepartureObj.style.visibility = 'hidden';
    dstDepartureObj.style.display = 'none';
    departureSrollVisible = false;
    departureSelectedValue = null;
}


function selectDepartureTableItem() {
    var color;
    if (departureOk)
      color = '#14a143';
    else
      color = 'red';
    for (var i = 0; i < dstDepartureObj.rows.length; i++) {
        var row = dstDepartureObj.rows[i];
        var cell = row.cells[0];
        if (i == departureIndex) {
            cell.style.color = 'white';
            cell.style.backgroundColor = color;
            departureSelectedValue = departureResult.departures[i];
        }
        else {
            cell.style.color = '#666666';
            cell.style.backgroundColor = 'white';
        }
    }    
}

function getDepartureTableItemIndex(cell) {
    for (var i = 0; i < dstDepartureObj.rows.length; i++) {
        var row = dstDepartureObj.rows[i];
        if (row.cells[0] == cell)
            return i;
    }
}

function buildDepartureTable() {
    while (dstDepartureObj.rows.length > 0)
        dstDepartureObj.deleteRow(0);
    
    for (var i = 0; i < departureResult.departures.length; i++) {
        var row = dstDepartureObj.insertRow(i);
        var cell = row.insertCell(0);
        cell.innerHTML = departureResult.departures[i];
        cell.onmousemove = function() {
            departureIndex = getDepartureTableItemIndex(this);
            selectDepartureTableItem();
        }
        cell.onmousedown = function() {
            departureIndex = getDepartureTableItemIndex(this);
            selectDepartureTableItem();
            if (departureOk)
                 departureInput.value = departureSelectedValue;
             hideDepartures();
        }
    }
    selectDepartureTableItem();
}
