var geocoder = null, map = null;
window.onload = load;
window.onunload = GUnload;
var teams = null;
var divisions = null;
var results = null;
var markers = null;
var selectedClub = null;

var pendingSearch = null;

function load() {
  if (GBrowserIsCompatible()) {
    map = new GMap2(document.getElementById('map'));
    map.addControl(new GLargeMapControl());
    map.addControl(new GScaleControl());
    insertTeams(map);
    geocoder = new GClientGeocoder();
    results = document.getElementById('results');
    downloadTeams();
  }
}

function setSelectedClub(html) {
  if (selectedClub != null)
    selectedClub.style.background = "";
  selectedClub = html;
  if (html != null)
    html.style.background = "#fc6";
}

function createTeamMarker (team, x) {
  var marker;
  var loc = new GLatLng(
    team.location.Point.coordinates[1],
    team.location.Point.coordinates[0]);
  if (team.name == "UTD Chess Team/Club" || team.name == "Dallas Chess Club") {
    var icon = new GIcon(G_DEFAULT_ICON);
    icon.image = base_url + "/shared/image/markerBlue.png";
    marker = new GMarker(loc, icon);
  }
  else {
    marker = new GMarker(loc);
  }
  GEvent.addListener(marker, "click", function() {
    var name, address;
    if (team.url != "" && team.url != "http://")
      name = "<a href='" + team.url + "' target='_blank'>" + team.name + "</a>";
    else
      name = team.name;
    
    address = team.location.address.split(', ');
    address = address.slice(0, address.length - 1);
    address = address[0] + "<br />" + address.slice(1, address.length).join(', ');
    
    var tabs = [
      new GInfoWindowTab("General", "<p style='font-weight: bold; margin-top: 0'>"
        + name + "</p>" + "<p>" + address + "<br /><a href='http://"
        + "maps.google.com/maps?f=d&hl=en&ie=UTF8&om=1&saddr=&daddr="
        + team.location.address + "' target='_blank'>" + "Get directions</a></p>"),
      new GInfoWindowTab("Contact", team.contact.name + "<br />"
        + team.contact.phone + "<br /><a href='mailto:" + team.contact.email
        + "'>" + team.contact.email + "</a>")
    ];
    if (team.other != "")
      tabs = tabs.concat(new GInfoWindowTab("Other",
        "<pre style='padding: 0; margin: 0; min-width: 270px'>" + team.other
        + "</pre>"));
    marker.openInfoWindowTabsHtml(tabs);
  });
  GEvent.addListener(marker, "infowindowopen", function() {
    setSelectedClub(document.getElementById("club" + x));
  });
  GEvent.addListener(marker, "infowindowclose", function() {
    setSelectedClub(null);
  });
  return marker;
}

function downloadTeams() {
  results.innerHTML = "<p>Loading Teams...</p>";
  GDownloadUrl(base_url + "/js/divisions.js", function (text) {
    divisions = eval("(" + text + ")");
    if (teams == null)
      return;
    if (pendingSearch != null) {
      var tmp = pendingSearch;
      pendingSearch = null;
      pendingSearch();
    } else
      searchAndFill("");
  });
  GDownloadUrl(base_url + "/js/teams.js", function (text) {
    var tmp = eval(text);
    
    tmp.sort(function (a, b) {
    if (a.division != b.division)
      return a.division < b.division ? -1 : 1;
    else
      return a.name < b.name ? -1 : 1;
    });

    for (var x = 0; x < tmp.length; x++)
      tmp[x].contact.email = tmp[x].contact.email.replace(/ /, '@');

    teams = tmp;

    if (divisions == null)
      return;
    if (pendingSearch != null) {
      var tmp = pendingSearch;
      pendingSearch = null;
      pendingSearch();
    } else
      searchAndFill("");
  });
}

function searchAndFill(query) {
  if (teams == null || divisions == null) {
    pendingSearch = function () {
      searchAndFill(query);
    };
    if (teams != null && divisions != null && searchAndFill != null) {
      var tmp = pendingSearch;
      pendingSearch = null;
      pendingSearch(query);
    }
    return;
  }
  var found = search(teams, query);
  if (found.length == 0) {
    alert("No matches found");
    return;
  }
  
  markers = insertTeams(map, found);
  var string = "";
  var lastdiv = -1;
  var strings = [];
  for (var x = 0; x < found.length; x++) {
    var extra = "";
    if (found[x].division != lastdiv) {
      lastdiv = found[x].division;
      strings.push("<div style='font-weight: bold; border-bottom: 1px solid #600"
        + (x==0?"":"; margin-top: 1em") + "'>" + divisions[lastdiv] + "</div>");
    }
    strings.push("<a href='' style='color: black' "
      + "onclick='GEvent.trigger(markers[" + x + "], \"click\"); return false'>"
      + "<div class='clubfound' id='club" + x + "'>" + found[x].name
      + "</div></a>");
  }
  results.innerHTML = strings.join("\n");
}

/* Teams is an array of teams. Query is the raw query from the user. A list of
   results is returned. No boolean operators are supported */
function search(teams, query) {
  var words = query.split(" ");
  var regexs = new Array();
  for (var x = 0; x < words.length; x++) {
    /* Case insensitive search */
    regexs.push(new RegExp(words[x], "i"));
  }
  var found = new Array();
  for (var x=0; x < teams.length; x++) {
    var team = teams[x];
    if (searchTeam(team, regexs)) found.push(team);
  }
  return found;
}

/* returns boolean */
function searchTeam(team, regexs) {
  /* Search within name, location.address, contact.name, contact.phone,
     contact.email, division name */
  var searchable = new Array(team.name, team.location.address,
    team.contact.name, team.contact.phone, team.contact.email,
    divisions[team.division]);
  for (var y = 0; y < regexs.length; y++) {
    var found = false;
    var re = regexs[y];
    for (var z = 0; z < searchable.length; z++) {
      var str = searchable[z];
      if (re.test(str)) {
        found = true;
        break;
      }
    }
    if (found == false) return false;
  }
  return true;
}
