function PhotoLayerCallback(json, photoLayer) {
	this.photoLayer = photoLayer;
	var photos = json;
	var batch = [];
	for (var i = 0; i < photos.length; i++) {
		var photo = photos[i];
		if (!this.photoLayer.ids[photo.id]) {
			var marker = this.createMarker(photo, this.photoLayer.markerIcon);
			var fixedAmount = 2;
			if (this.photoLayer.map.getZoom() > 14) fixedAmount = 4;
			var latlngHash = (marker.latlng.lat().toFixed(fixedAmount) + "" + marker.latlng.lng().toFixed(fixedAmount));
			latlngHash = latlngHash.replace(".","").replace(".", "").replace("-","");
			if (!this.photoLayer.seenLatLngs[latlngHash]) {
				this.photoLayer.seenLatLngs[latlngHash] = true;
				this.photoLayer.ids[photo.id] = "exists";
				this.photoLayer.mgr.addMarker(marker, this.photoLayer.map.getZoom());
			}
		}
	}
}

PhotoLayerCallback.prototype.createMarker = function(photo, baseIcon) {
	var me = this;
	var link = "../uploads/" + photo.original;
	var thumbnailUrl = "../uploads/thumbnail/" + photo.thumbnail;
	var imageUrl = "../uploads/medium/" + photo.medium;
	var downloadUrl = "../uploads/" + photo.download;
	var title = photo.title;

	var markerIcon = new GIcon(baseIcon);
	markerIcon.image = thumbnailUrl;
	var marker = new MarkerLight(new GLatLng(photo.lat, photo.lng), {
			image: thumbnailUrl,
			title: title
		}
	);
	if (title > 33) {
		title = title.substring(0, 33) + "&#8230;";
	}
	
	var html = '<div class="polaroidContainer">' +
					'<a rel="lightbox[gallery]" title="' + photo.description + ' (' + photo.author + ')" href="' + link + '"><img src="' + imageUrl + '" alt="' + title + '" title="' + title + '" border="0"/></a>' +
					'<div class="polaroidText"><b>' + photo.title + "</b><br/>" + photo.description + ' <br/><i>(' + photo.author + ')</i><br/><a href="' + downloadUrl + '" target="_blank">' + i18n["downloadOriginal"] + '</a></div>' +
					'</div>';

	marker.html = html;
	GEvent.addListener(marker, "click", function() {
		if (me.photoLayer.lastMarker) {
			me.photoLayer.lastMarker.resetBorder();
		}
		marker.highlightBorder();
		me.photoLayer.lastMarker = marker;

		if (me.photoLayer.sidebar) {
			me.photoLayer.sidebar.innerHTML = marker.html;
			$(me.photoLayer.sidebar.childNodes[0].childNodes[0]).lightBox({
				imageBtnPrev : "../pics/" + lang +  "/lightbox-btn-prev.gif",
				imageBtnNext : "../pics/" + lang +  "/lightbox-btn-next.gif",
				imageBtnClose : "../pics/" + lang +  "/lightbox-btn-close.gif",
				imageLoading : "../pics/lightbox-ico-loading.gif",
				txtImage : i18n["image"],
				txtOf : " / "
			});
		}
		else {
			me.photoLayer.map.openInfoWindow(marker.getPoint(), marker.html, {pixelOffset: new GSize(16, -16), noCloseOnClick: true});
		}
  });
 
  return marker;
}


function PhotoLayer(map, opt_opts) {
  var me = this;
  var opts = opt_opts || {};
  me.map = map;
  me.tag = opts.tag || "eye-fi";
  me.sidebar = opts.sidebar;
  me.ids = {};
  me.seenLatLngs = {};
  me.oldCenter = map.getBounds().toSpan();
  me.oldZoom = map.getZoom();
  me.mgr = new MarkerManager(map, {maxZoom: 19});
  
  var icon = new GIcon();
  icon.image = "http://www.panoramio.com/img/panoramio-marker.png"; 
  icon.shadow = "http://pamela.fox.googlepages.com/squareoutline.png";  
  icon.iconSize = new GSize(50, 50);
  icon.shadowSize = new GSize(60, 60);
  icon.iconAnchor = new GPoint(9, 9);  
  icon.infoWindowAnchor = new GPoint(9, 0); 

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

  GEvent.addListener(map, "moveend", function() {
    me.maybeLoadPhotos();
  });
}

PhotoLayer.prototype.maybeLoadPhotos = function(force) {
  var me = this;
  if (me.enabled) {
    var center = map.getCenter();
    var bounds = map.getBounds();
    var southWest = bounds.getSouthWest();
    var northEast = bounds.getNorthEast();
    var span = bounds.toSpan();
    var zoom = map.getZoom();
    var spanDiff = center.distanceFrom(me.oldCenter);
    var mapSpan = (northEast.distanceFrom(southWest))
    var percent = (spanDiff/mapSpan)*100;
    if (percent > 20 || (zoom != me.oldZoom) || force) {
      me.load(me, {ne: northEast, sw: southWest, north: northEast.lat(), south: southWest.lat(), east: northEast.lng(), west: southWest.lng()});
      me.oldCenter = center;
      me.oldZoom = zoom;
    }
  }

}

PhotoLayer.prototype.enable = function() {
  this.enabled = true;
  this.maybeLoadPhotos(true);
}

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

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

PhotoLayer.prototype.changeTag = function(tag) {
  this.tag = tag;
  this.disable();
  this.enable();
}

PhotoLayer.prototype.load = function(photoLayer, options) {
	var uniqueID = "";

	var tlLng = options.sw.lng();
	var tlLat = options.ne.lat();

	var brLng = options.ne.lng();
	var brLat = options.sw.lat();

	var outer = this;
	$.getJSON("load_images.php?tlLng=" + tlLng + "&tlLat=" + tlLat + "&brLng=" + brLng + "&brLat=" + brLat,
		function(data){
			new PhotoLayerCallback(data,outer);
			/*$.each(data,function(i,item) {
				var markerIcon = new GIcon(baseIcon, "../uploads/thumbnail/" + item.thumbnail);
				var marker=new GMarker(new GLatLng(item.lat,item.lng), {title:item.title, icon:markerIcon});
				marker.zIndex = i;
				map.addOverlay(marker);
			});*/
		}
	);
	return;
}


