function JdataLayerCallback(json, jdataLayer) {
  this.jdataLayer = jdataLayer;

  var batch = [];
  for (var i = 0; i < json.rows.length; i++) {
    var row = json.rows[i];
    if (!jdataLayer.ids[row.jdata_id]) {
      var marker = this.createMarker(row, jdataLayer.markerIcon);
      jdataLayer.mgr.addMarker(marker, 0);
      jdataLayer.ids[row.jdata_id] = "exists";
    }
  }
  jdataLayer.mgr.addMarkers(batch, jdataLayer.map.getZoom());
  jdataLayer.mgr.refresh();
}


JdataLayerCallback.prototype.createMarker = function(row, baseIcon) {
  var me = this;
  var markerIcon = new GIcon(baseIcon);
  var marker = new GMarker(new GLatLng(row.latitude, row.longitude), {icon: markerIcon, title: row.jdata_title});

  if (row.jdata_title.length > 33) {
    row.jdata_title = row.jdata_title.substring(0, 33) + "&#8230;";
  }

  var html = "<a class='link' href='" + row.jdata_url +
             "'><strong>" + row.jdata_title + "<\/strong><\/a><br />" +
             "Strekning: " + row.map_distance + " km <br />" +
             "Innsendt av: <a href='" + row.owner_url + "'>" + row.owner_name + "<\/a><br />";

  marker.html = html;

  GEvent.addListener(marker, "click", function() {
    me.jdataLayer.map.openInfoWindow(marker.getLatLng(), marker.html, {noCloseOnClick: true});
  });
 
  return marker;
}


function JdataLayer(map, opt_opts) {
  var me = this;
  me.map = map;
  me.ids = {};
  me.mgr = new MarkerManager(map, {maxZoom: 19});

	var icon = new GIcon();
	icon.image = 'http://labs.google.com/ridefinder/images/mm_20_red.png';
	icon.shadow = 'http://labs.google.com/ridefinder/images/mm_20_shadow.png';
	icon.iconSize = new GSize(12, 20);
	icon.shadowSize = new GSize(22, 20);
	icon.iconAnchor = new GPoint(6, 20);
	icon.infoWindowAnchor = new GPoint(5, 1);

  me.markerIcon = icon;
  me.enabled = false;

  GEvent.addListener(map, "moveend", function() {
    if (me.enabled) {
      var bounds = map.getBounds();
      var southWest = bounds.getSouthWest();
      var northEast = bounds.getNorthEast();
      me.load(me, {maxy: northEast.lat(), miny: southWest.lat(), maxx: northEast.lng(), minx: southWest.lng()});
    }
  });
}

JdataLayer.prototype.enable = function() {
  this.enabled = true;
  GEvent.trigger(map, "moveend");
}

JdataLayer.prototype.disable = function() {
  this.enabled = false;
  this.mgr.clearMarkers();
  this.ids = {};
}

JdataLayer.prototype.getEnabled = function() {
  return this.enabled;
}

JdataLayer.prototype.load = function(jdataLayer, userOptions) {
  var options = {
    from: "0",
    to: "10",
    minx: "-180",
    miny: "-90",
    maxx: "180",
    maxy: "90"
  };
 
  for (optionName in userOptions) {
    if (userOptions.hasOwnProperty(optionName)) {
      options[optionName] = userOptions[optionName];
    }
  }
 
  var url = "http://www.bike.no/roadtrips/feed/get_roadtrips.php?";
  var uniqueID = "";
 
  for (optionName in options) {
    if (options.hasOwnProperty(optionName)) {
      var optionVal = "" + options[optionName] + "";
      url += optionName + "=" + optionVal + "&";
      uniqueID += optionVal.replace(/[^\w]+/g,"");
    }
  }

  var callbackName = "JdataLayerCallback.loader" + uniqueID; //ask dion
  eval(callbackName + " = function(json) { var pa = new JdataLayerCallback(json, jdataLayer);}");
 
  var script = document.createElement('script');
  script.setAttribute('src', url + 'callback=' + callbackName);
  script.setAttribute('id', 'jsonScript');
  script.setAttribute('type', 'text/javascript');
  document.documentElement.firstChild.appendChild(script);

}

