var KzedProjection = DynmapProjection.extend({
	fromLocationToLatLng: function(location) {
		var dx = location.x;
		var dy = location.y - 127;
		var dz = location.z;
		var px = dx + dz;
		var py = dx - dz - dy;
		var scale = 1 << this.options.mapzoomout;

		var xx = (128 - px) / scale;
		var yy = py / scale;
		return new L.LatLng(xx, yy, true);
	},
	fromLatLngToLocation: function(latlon, y) {
		var scale = 1 << this.options.mapzoomout;
		var px = 128 - (latlon.lat * scale);
		var py = latlon.lng * scale;
		var x = (px + py + (y-127))/2;
		var z = (px - x);
		return { x: x, y: y, z: z };
	}
	
});

var KzedMapType = DynmapTileLayer.extend({
	options: {
		minZoom: 0,
		maxZoom: 4,
		errorTileUrl: 'images/blank.png',
		continuousWorld: true
	},
	initialize: function(options) {
		options.maxZoom = options.mapzoomin + options.mapzoomout;
		L.Util.setOptions(this, options);
		this.projection = new KzedProjection({mapzoomout: this.options.mapzoomout});
	},
	getTileName: function(tilePoint, zoom) {
		var info = this.getTileInfo(tilePoint, zoom);
		return namedReplace(this.options.bigmap
				? '{zprefix}{nightday}/{scaledx}_{scaledy}/{zoomprefix}{x}_{y}.png'
				: '{zoom}{prefix}{nightday}_{x}_{y}.png'
				, this.getTileInfo(tilePoint, zoom));
	},
	getTileInfo: function(tilePoint, zoom) {
		// Custom tile-info-calculation for KzedMap: *128 and >>12
		var izoom = this.options.maxZoom - zoom;
		var zoomoutlevel = Math.max(0, izoom - this.options.mapzoomin);
		var scale = 1 << zoomoutlevel;
		var x = -scale*tilePoint.x*128;
		var y = scale*tilePoint.y*128;
		return {
			prefix: this.options.prefix,
			nightday: (this.options.nightandday && this.options.dynmap.serverday) ? '_day' : '',
			scaledx: x >> 12,
			scaledy: y >> 12,
			zoom: this.zoomprefix(zoomoutlevel),
			zoomprefix: (zoomoutlevel<2)?"":(this.zoomprefix(zoomoutlevel-1)+"_"),
			zprefix: (zoomoutlevel==0)?this.options.prefix:("z"+this.options.prefix),
			x: x,
			y: y
		};
	}
});

maptypes.KzedMapType = function(configuration) { return new KzedMapType(configuration); };
