var selectedProvinceIds          = new Array();
var selectedCityIds              = new Array();
var selectedCityIdAndRanges      = new Array();
var selectedPostalCodesAndRanges = new Array();
var selectedDistrictIds          = new Array();
var selectedRegionIds            = new Array();

function completeLocations(searchPattern, searchtype)
{
   if (isPostalCode(searchPattern))
   {
      //Oh no search. It's a postal code!
      setAddLocationButtonEnabledState(true);
      return;
   }

   var action = xmlClientUrl + '/ajax/getlocationsbynameasxml?search=' + searchPattern + '&maxresult=20&searchtype=' + searchtype + '&provinceExceptIds=' + arrayToCommaSeparated(selectedProvinceIds) + '&cityExceptIds=' + arrayToCommaSeparated(selectedCityIds) + ','+ valueWithRangeArrayIdOnlyToCommaSeparated(selectedCityIdAndRanges) + '&districtExceptIds=' + arrayToCommaSeparated(selectedDistrictIds);
   jQuery.ajax({ url: action,
            context: document.body,
            success: completeLocationsCallback
          });

   window.status = 'Bezig met ophalen van locations.';
}

function isPostalCode(possiblePostalCode)
{
   var regExpPo_s = new RegExp("^[1-9]{1}[0-9]{3} [/s]?[A-Z]{2}$");
   var regExpPo_ns = new RegExp("^[1-9]{1}[0-9]{3}[A-Z]{2}$");
   var postalCode = possiblePostalCode.toUpperCase();
   return (regExpPo_s.test(postalCode) || regExpPo_ns.test(postalCode));
}

function rewriteProvinceName(provinceName)
{
   if (provinceName == 'Groningen' || provinceName == 'Utrecht')
   {
      provinceName += ' (provincie)';
   }

   return provinceName;
}

function completeLocationsCallback(xmlReponse)
{
   var locations = xmlReponse.getElementsByTagName('to');

   showLocationOptionsSelectBox(locations.length > 0);

   //Get projectselect and remove all items
   var locationsselect = document.getElementById('locationselect');
   locationsselect.options.length = 0;

   //for each project add the name as option
   for(var i=0; i<locations.length; i++)
   {
      var objectType = locations[i].getElementsByTagName('t')[0].firstChild.nodeValue;
      var id;
      var name;

      id = locations[i].getElementsByTagName('i')[0].firstChild.nodeValue;


      if (objectType == 'p')
      {
         //province or city
         name = rewriteProvinceName(locations[i].getElementsByTagName('n')[0].firstChild.nodeValue);
      }
      else if (objectType == 'c')
      {
         name = locations[i].getElementsByTagName('n')[0].firstChild.nodeValue;
      }
      else
      {
         //city name
         name = locations[i].getElementsByTagName('nc')[0].firstChild.nodeValue;

         //plus district
         name += ' (' + locations[i].getElementsByTagName('nd')[0].firstChild.nodeValue + ')';
      }

      var option = new Option(name, objectType + id);
      option.title = name;
      locationsselect.options.add(option);
   }
}

function showLocationOptionsSelectBox(show)
{
   if (show)
   {
      changeDisplay('locationselect_div','block');
   }
   else
   {
      changeDisplay('locationselect_div','none');
   }
}

function setAddLocationButtonEnabledState(addButtonEnabled)
{
   document.getElementById('addlocationbutton').disabled = !addButtonEnabled;
}

function locationSelectChoiceForIEWhichDoesntSelectImmediateAfterOnMouseUp()
{
   var locationValue = document.getElementById('locationselect').value;
   if (locationValue != '')
   {
      selectLocationBySelectbox(locationValue);
   }
}


//Van selectbox:
//Location
function selectLocationBySelectbox(value)
{
   if (value != '')
   {
      changeDisplay('locationselect_div','none');

      var type = value.substring(0,1);
      var id = value.substring(1);

      if (type == 'p')
      {
         selectProvince(id);
      }
      else if (type == 'c')
      {
         selectCity(id, 0);
      }
      else
      {
         selectDistrict(id);
      }

      document.getElementById('locationname_edit').value = '';
   }
    else
   {
      setTimeout(locationSelectChoiceForIEWhichDoesntSelectImmediateAfterOnMouseUp, 50);
   }
}

function selectProvince(provinceId)
{
   selectedProvinceIds = getArrayWithAddedId(selectedProvinceIds, provinceId);
   extendedSearch('provinces', arrayToCommaSeparated(selectedProvinceIds));
}

function selectCity(cityId, range)
{
   //Make sure city is not in city in any list.
   selectedCityIdAndRanges = getArrayWithRemovedValueWithRange(selectedCityIdAndRanges, new ValueWithRange(cityId, range));
   selectedCityIds         = getArrayWithRemovedId(selectedCityIds, cityId);

   if (range > 0)
   {
      selectedCityIdAndRanges = getArrayWithAddedValueWithRange(selectedCityIdAndRanges, new ValueWithRange(cityId, range));
      extendedSearch('cityranges', valueWithRangeArrayToCommaSeparated(selectedCityIdAndRanges));
   }
   else
   {
      selectedCityIds = getArrayWithAddedId(selectedCityIds, cityId);
      extendedSearch('cities', arrayToCommaSeparated(selectedCityIds));
   }
}


function selectPostalCode(postalCode, range)
{
   var allowedChars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';

   postalCode = postalCode.toUpperCase();

   var postalCodeValue = '';
   for (var i=0; i<postalCode.length; i++)
   {
      var c = postalCode.charAt(i);
      if (allowedChars.indexOf(allowedChars) > -1)
      {
         postalCodeValue += c;
      }
   }

   //Remove old, add new, then search.
   selectedPostalCodesAndRanges = getArrayWithRemovedValueWithRange(selectedPostalCodesAndRanges, new ValueWithRange(postalCodeValue, range));
   selectedPostalCodesAndRanges = getArrayWithAddedValueWithRange(selectedPostalCodesAndRanges, new ValueWithRange(postalCodeValue, range));
   extendedSearch('postalcoderanges', valueWithRangeArrayToCommaSeparated(selectedPostalCodesAndRanges));
}

function selectDistrict(districtId)
{
   selectedDistrictIds = getArrayWithAddedId(selectedDistrictIds, districtId);
   extendedSearch('districts', arrayToCommaSeparated(selectedDistrictIds));
}

function selectRegion(regionId)
{
    if (regionId != -1)
    {
        selectedRegionIds = getArrayWithAddedId(selectedRegionIds, regionId);
        extendedSearch('regions', arrayToCommaSeparated(selectedRegionIds));
    }
}

function removeRegion(regionId)
{
   selectedRegionIds = getArrayWithRemovedId(selectedRegionIds, regionId);
   extendedSearch('regions', arrayToCommaSeparated(selectedRegionIds));
}

function removeProvince(provinceId)
{
   selectedProvinceIds = getArrayWithRemovedId(selectedProvinceIds, provinceId);
   extendedSearch('provinces', arrayToCommaSeparated(selectedProvinceIds));
}

function removeCity(cityId)
{
   selectedCityIds = getArrayWithRemovedId(selectedCityIds, cityId);
   extendedSearch('cities', arrayToCommaSeparated(selectedCityIds));
}

function removeCityRange(cityId)
{
   selectedCityIdAndRanges = getArrayWithRemovedValueWithRange(selectedCityIdAndRanges, new ValueWithRange(cityId, 0));
   extendedSearch('cityranges', valueWithRangeArrayToCommaSeparated(selectedCityIdAndRanges));
}

function removePostalCodeRange(postalCode)
{
   selectedPostalCodesAndRanges = getArrayWithRemovedValueWithRange(selectedPostalCodesAndRanges, new ValueWithRange(postalCode, 0));
   extendedSearch('postalcoderanges', valueWithRangeArrayToCommaSeparated(selectedPostalCodesAndRanges));
}

function removeDistrict(districtId)
{
   selectedDistrictIds = getArrayWithRemovedId(selectedDistrictIds, districtId);
   extendedSearch('districts', arrayToCommaSeparated(selectedDistrictIds));
}

var mustCloseLocationSelect = false;
function onLocationSelectBlurTimeout()
{
   if (mustCloseLocationSelect)
   {
      changeDisplay('locationselect_div', 'none');
   }
}

function cancelMustCloseLocationSelect()
{
   mustCloseLocationSelect = false;
}
//onchange="preSelectLocation(this); document.getElementById('locationname_edit').focus();"
function onLocationSelectBlur()
{
   //Cannot immediate close select when loosing focus on edit, else select is hidden before
   //a click on the select is handled.
   mustCloseLocationSelect = true;
   setTimeout("onLocationSelectBlurTimeout();", 500);
}

function locationInputKeyDown(editbox, event)
{
   //On key up or down, if there are project results, select the first one in the list
   //and set focus on list.
   var selectbox = document.getElementById('locationselect');
   var value = editbox.value;

   if (event.keyCode == 40)
   {
      //up
      if (selectbox.options.length > 0)
      {
         selectbox.selectedIndex = 0;
         selectbox.focus();
      }
   }
   else if (event.keyCode == 38)
   {
      //down
      if (selectbox.options.length > 0)
      {
         selectbox.selectedIndex = selectbox.options.length;
         selectbox.focus();
      }
   }
   else if (event.keyCode == 13)
   {
      if (isPostalCode(value))
      {
         changeDisplay('locationselect_div','none');
         selectPostalCode(value, 1);
         document.getElementById('locationname_edit').value = '';
      }
      else if (selectbox.options.length > 0)
      {
         selectLocationBySelectbox(selectbox.options[0].value);
      }
   }
}

function locationInputKeyUp(editbox, searchtype)
{
   completeLocations(editbox.value, searchtype);
}

function selectLocationByEditBox(value)
{
   var selectbox = document.getElementById('locationselect');

   if (isPostalCode(value))
   {
      changeDisplay('locationselect_div','none');
      selectPostalCode(value, 1);
      document.getElementById('locationname_edit').value = '';
   }
   else if (selectbox.options.length > 0)
   {
      selectLocationBySelectbox(selectbox.options[0].value);
   }

}

function onLocationSelectKeyUp(event, selectbox)
{
   //On pressing enter, select this item in the list.
   if (event.keyCode == 13)
   {
      locationSelectChoice(selectbox.value);
   }
}

function locationSelectChoice(value)
{
   selectLocationBySelectbox(value);
}


function clearInitialLocationEdit(initialText, editBox)
{
   if (editBox.value == initialText)
   {
      editBox.value = '';
   }
}
