function UrbaramaLayerCallback(json, urbLayer) {
  this.urbLayer = urbLayer;

  urbLayer.clearAll();

  for (var i = 0; i < json.projects.length; i++) {
    var project = json.projects[i];
    if (!urbLayer.ids[project.project_title]) {
      var marker = this.createMarker(project, urbLayer.markerIcon);
      urbLayer.mgr.addMarker(marker, 0);
      urbLayer.ids[project.project_title] = "exists";
      urbLayer.mgr.addMarker(marker, urbLayer.map.getZoom());
    }
  }
}

UrbaramaLayerCallback.prototype.createMarker = function(project, baseIcon) {
  var me = this;
  var markerIcon = new GIcon(baseIcon);
  markerIcon.image = project.photo_icon;
  var marker = new GMarker(new GLatLng(project.latitude, project.longitude), {icon: markerIcon, title: project.project_title});

  if (project.project_title.length > 33) {
    project.project_title = project.project_title.substring(0, 33) + "&#8230;";
  }
  if (project.project_desc.length > 50) {
    project.project_desc = project.project_desc.substring(0, 50) + "&#8230;";
  }

  if(typeof(external_call) == 'undefined')
    external_call = false;

  if(external_call == true)
    target = "onclick='var w=window.open(this.href);w.focus();return false;'";
  else
    target = '';

  var html = "<div id='infowin' style='height:320px; width:240px;'>" +
            "<p><a href='http://www.urbarama.com/' "+target+">" +
             "<img src='http://www.urbarama.com/images/logo_small.png' border='0' width='94px' height='25px' alt='Urbarama logo' /><\/a></p>" +
             "<a id='project_infowin' href='" + project.project_url + "' "+target+">" +
             "<img border='0' width='" + project.photo_width + "' height='" + project.photo_height + "' src='" + project.photo_url + "'/><\/a>" +
             "<div style='overflow: hidden; width: 240px;'>" +
             "<p><a class='project_title' href='" + project.project_url +
             "' "+target+"><strong>" + project.project_title + "<\/strong><\/a></p>" +
             "<p>" + project.project_desc + "</p>" +
             "<p>Posted by <a href='" + project.owner_url + "' "+target+">" +
             project.owner_name + "<\/a></p><\/div>" +
             "<\/div>";

  marker.html = html;

  GEvent.addListener(marker, "click", function() {
    me.urbLayer.map.openInfoWindow(marker.getLatLng(), marker.html, {noCloseOnClick: true});
  });

  return marker;
}


function UrbaramaLayer(map, opt_opts) {
  var me = this;
  me.map = map;
  me.ids = {};
  me.mgr = new MarkerManager(map, {maxZoom: 19});

  var icon = new GIcon();
  icon.image = "/images/marker.png";
  icon.shadow = "/images/marker_shadow.png";
  icon.iconSize = new GSize(28, 28);
  icon.shadowSize = new GSize(29, 29);
  icon.iconAnchor = new GPoint(9, 9);
  icon.infoWindowAnchor = new GPoint(9, 0);

  me.markerIcon = icon;
  me.enabled = false;

  if(!opt_opts)
    opt_opts = {};

  GEvent.addListener(map, "moveend", function() {
    if (me.enabled) {
      var bounds = map.getBounds();
      var southWest = bounds.getSouthWest();
      var northEast = bounds.getNorthEast();

		  var curr_options = {
		    minx: southWest.lng(),
		    miny: southWest.lat(),
		    maxx: northEast.lng(),
		    maxy: northEast.lat()
		  };

		  for (optionName in opt_opts) {
		    if (opt_opts.hasOwnProperty(optionName)) {
		      curr_options[optionName] = opt_opts[optionName];
		    }
		  }

      me.load(me, curr_options);
    }
  });
}

UrbaramaLayer.prototype.enable = function() {
  this.enabled = true;
  GEvent.trigger(map, "moveend");
}

UrbaramaLayer.prototype.disable = function() {
  this.enabled = false;
  this.mgr.clearMarkers();
  this.ids = {};
}

UrbaramaLayer.prototype.clearAll = function() {
  this.mgr.clearMarkers();
  this.ids = {};
}

UrbaramaLayer.prototype.getEnabled = function() {
  return this.enabled;
}

UrbaramaLayer.prototype.load = function(urbLayer, userOptions) {
  var options = {
    order: "date",
    offset: "0",
    count: "20",
    minx: "-180",
    miny: "-90",
    maxx: "180",
    maxy: "90",
    size: "small"
  };

  for (optionName in userOptions) {
    if (userOptions.hasOwnProperty(optionName)) {
      options[optionName] = userOptions[optionName];
    }
  }

  var url = "/api/project?";
  var uniqueID = "";

  for (optionName in options) {
    if (options.hasOwnProperty(optionName)) {
      var optionVal = "" + options[optionName] + "";
      url += optionName + "=" + optionVal + "&";
      uniqueID += optionVal.replace(/[^\w]+/g,"");
    }
  }
  var callbackName = "UrbaramaLayerCallback.loader" + uniqueID;
  eval(callbackName + " = function(json) { var pa = new UrbaramaLayerCallback(json, urbLayer);}");

  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);
}

