var locations = new Object();
var areas     = new Object();
var zipcodes  = new Object();
var locationsByState = new Array();
var areasByState = new Array();

var locationsAutocomplete = new Array();
var areasAutocomplete     = new Array();
var zipcodesAutocomplete  = new Array();

var autocompleteInitialized = false;

function initLocationAutocompleteControls() {
  if (autocompleteInitialized) return
  
  parseLocationData();
  parseAreaData();
  parseZipcodeData();
  
  initLocationAutocomplete("input.location_autocomplete", locationsAutocomplete.concat(areasAutocomplete, zipcodesAutocomplete));
  
  autocompleteInitialized = true;
  
  $('a.select_location_and_run_search').livequery('click', function() {
    select_location_ids = $('input.selected_location')
    
    $('.location_autocomplete').attr('value', $(this).attr('location_name'));
    $('.town_autocomplete').attr('value', $(this).attr('location_name'));
    select_location_ids.attr('value', $(this).attr('value'));
    closeDialogBox();
    
    form = select_location_ids.parent('form')
    $.post(form.attr('action'), form.serialize(), null, 'script');
    return false;
  });
}

function initLocationAutocomplete(autocomplete_control, data, width, selected_location_control) {
  function formatResult(row) {
  	return row.replace(/(<.+?>)/gi, '');
  }

  $(autocomplete_control).livequery(function () {
    $(this).autocomplete(data, { 
      cacheLength: 0,
      scroll: false,
      matchContains: "word",
      width: width,
      highlight: function(value, searchTerm) {
        return value.replace(new RegExp(searchTerm, "i"), '<strong>'+value.match(new RegExp(searchTerm, "i"))+"</strong>");
      },
      formatItem: function(row, i, max) {
        if (row.aid != undefined) {
          a = areas[row.aid]
          return a.name + " - " + a.location.town + ", " + a.location.state;
    	  } else if (row.zid != undefined) {
    	    z = zipcodes[row.zid]
    	    return z.id + " - " + z.town + ", " + z.state;
        } else {
          l = locations[row.lid]
    		  return l.town + ", " + l.state;
    		}
    	},
    	formatMatch: function(row, i, max) {
    	  if (row.aid != undefined) {
          return row.name;
    	  } else if (row.zid != undefined) {
          return row.zid;
        } else {
    		  return row.name;
    		}
    	},
    	formatResult: function(row) {
    	  if (row.aid != undefined) {
          a = areas[row.aid]
          return a.name + ", " + a.location.state;
    	  } else if (row.zid != undefined) {
          z = zipcodes[row.zid]
    	    return z.id;
        } else {
          l = locations[row.lid]
    		  return l.town + ", " + l.state;
    		}
    	}
    }).result(function(event, item) {
      id = null;

      if (selected_location_control == undefined) {
        selected_location_control = "input.selected_location"
      }

      field = $(selected_location_control)
      if (field.length > 0) {
        if (item.aid != undefined) {
          id = "aid:" + item.aid;
    	  } else if (item.zid != undefined) {
          id = "zid:" + item.zid;
        } else {
          id = "lid:" + item.lid;
    		}

        field.attr('value', id);
      }
    })
  });
}

function parseLocationData() {
  rows = locationsAutocompleteRawData.split('|');

  for(var i in rows) {
    columns = rows[i].split(',');
    l = { type: "Location", id: columns[0], town: columns[1], state: columns[2], area_count: columns[3], areas: new Array() };
    locations[String(columns[0])] = l
    
    if (locationsByState[l.state] == undefined) {
      locationsByState[l.state] =  new Object();
    }
    locationsByState[l.state][l.town.toUpperCase()] = l;
    
    locationsAutocomplete.push({ lid: l.id, name: l.town });
  }
}

function parseAreaData() {
  rows = areasAutocompleteRawData.split('|');
  
  for(var i in rows) {
    columns = rows[i].split(',');
    area = { type: "Area", id: columns[0], location_id: columns[1], name: columns[2], location: null };
    areas[String(area.id)] = area;
    
    l = locations[area.location_id]
    if (l != undefined) {
      l.areas.push(area);
      area.location = l
    } else {
      log("location "+ area.location_id + "not found!");
    }
    
    if (areasByState[l.state] == undefined) {
      areasByState[l.state] = new Object();
    }
    areasByState[l.state][area.name.toUpperCase()] = area;
    
    areasAutocomplete.push({ aid: area.id, name: area.name });
  }
}

function parseZipcodeData() {
  rows = zipcodesAutocompleteRawData.split('|');
  
  for(var i in rows) {
    columns = rows[i].split(',');
    zipcode = { type: "Zipcode", id: columns[0], town: columns[1], state: columns[2] };
    zipcodes[String(zipcode.id)] = zipcode;
    
    zipcodesAutocomplete.push({ zid: zipcode.id });
  }
}