var plaatsRE = /(.+)( \(.*\))?/i;

$(document)
    .ready(
        function() {

          var $kalenders = $("ul#kalenders li");

          $("#aantal").append($kalenders.length + " ");
          var idRE = /http:\/\/www.google.com\/calendar\/(?:hosted\/.+\/)?embed\?src=(.+)\&ctz=Europe\/Brussels/i;

          $(
              "<p id='filter'>Zoeken: <input type='text' size='12' title='Zoek op de naam van jouw stad of gemeente.'/></p>")
              .insertBefore("ul#kalenders").keyup(function(e) {
                applyFilter(false);
              });
          $("#filter input").focus().tipsy( {
            fade : true,
            gravity : 's'
          });


          var latlng = new google.maps.LatLng(51.2, 4.304395);
          var myOptions = {
            zoom : 7,
            center : latlng,
            mapTypeId : google.maps.MapTypeId.ROADMAP,
            mapTypeControl : false
          };
          $("<div id='map' style='width: 100%; height: 200px'/>").insertBefore("ul#kalenders");
          var map = new google.maps.Map(document.getElementById("map"), myOptions);
          var geocoder = new google.maps.Geocoder();

          $kalenders
              .each(function(i) {
                var id = $(this).find("a.plaats").attr("href").match(idRE)[1];
                $(this).attr("id", id);

                var plaats = $(this).find("a.plaats").text().match(plaatsRE)[1];
                if ($(this).find("span.latlng").length == 0) {
                  alert(plaats + " is missing geo information!");
                  $(this).append("<span style='color: red; font-weight: bold;'>Geocode</span>").click(
                      function() {
                        geocoder.geocode( {
                          'address' : plaats
                        }, function(results, status) {
                          if (status == google.maps.GeocoderStatus.OK) {
                            console.log("<span class='latlng'>" + results[0].geometry.location.a + " "
                                + results[0].geometry.location.b + "</span>");
                          }
                        });
                      });
                }
                else {
                  var parts = $(this).find("span.latlng").text().split(" ", 2);
                  var marker = new google.maps.Marker( {
                    map : map,
                    title : plaats,
                    position : new google.maps.LatLng(parts[0], parts[1])
                  });
                  google.maps.event.addListener(marker, 'click', function(event) {
                    $("#filter input").val(plaats);
                    applyFilter(true);
                  });
                }

                $div = $("<div class='actions'/>");
                $($div)
                    .append(
                        " <a class='action html' href='http://www.google.com/calendar/embed?src="
                            + id
                            + "&ctz=Europe/Brussels' title='Bekijk deze afvalkalender.'><img src='images/view.gif'/>&#160;HTML</a>");
                $($div)
                    .append(
                        " <a class='action google' href='http://www.google.com/calendar/render?cid=http%3A%2F%2Fwww.google.com%2Fcalendar%2Fembed%3Fsrc%3D"
                            + id
                            + "%26ctz%3DEurope%2FBrussels' title='Voeg deze afvalkalender toe aan je eigen Google Agenda.'><img src='images/add.gif'/>&#160;Google</a>");
                $($div)
                    .append(
                        " <a class='action ical' href='http://www.google.com/calendar/ical/"
                            + id
                            + "/public/basic.ics' title='Importeer deze afvalkalender in een programma dat het iCalendar formaat ondersteunt.'><img src='images/download.gif'/>&#160;ICAL</a>");
                $($div)
                    .append(
                        " <a class='action rss' href='http://www.google.com/calendar/feeds/"
                            + id
                            + "/public/basic?orderby=starttime&sortorder=ascending&max-results=10&futureevents=true&singleevents=true' title='Voeg deze afvalkalender toe aan je RSS lezer.'><img src='images/add.gif'/>&#160;RSS</a>");
                $(this).append($div);
                $(this).append();
              });

          $("a.action").tipsy( {
            fade : true,
            gravity : 's'
          });

        });

function applyFilter(exact) {
  var filter = $("#filter input").val();
  filter = $("#filter input")[0].value.toLowerCase();
  $.each($("ul#kalenders li a.plaats"), function(index, plaats) {
    if ((!exact && $(plaats).text().toLowerCase().indexOf(filter) == -1)
        || (exact && $(plaats).text().match(plaatsRE)[1].toLowerCase() != filter)) {
      $(plaats).parent().hide();
    }
    else {
      $(plaats).parent().show();
    }
  });

}
