Terrascape.ImageServer = {
	waitForMapper: function() {
		this.selectedIds = [];
		if(mapper) {
			this.initialize();
		} else {
			setTimeout(this.waitForMapper.bind(this), 500);
		}
	},

	initialize: function() {
		//Copy old viewBoxChanged so we can call it
		this.originalViewBoxChanged = mapper.viewBoxChanged.bind(mapper);

		//Bind to the viewBoxChanged so our method is called
		mapper.mapDisplay.viewBoxChanged = this.viewBoxChanged.bind(this);

		//Hijack raster changed event
		try {
			rasterTool.rasterChecked = this.rasterChecked.bind(this);
		} catch(ex) {}

		this.initialized = true;
	},

	viewBoxChanged: function() {
		this.findImage();
		//Call the original viewBoxChanged function
		this.originalViewBoxChanged();
	},
	rasterChecked: function(checkBox) {
		var id = checkBox.id.removeFirst(7);

		if(checkBox.checked) {
			this.selectedIds.add(id);
		} else {
			this.removeFromArray(id);
			var image = this.images[id];
			if(image) {
				if(image.currentSet) {
					for(t in image.currentSet.tiles) {
						if(image.currentSet.tiles[t].visible) {
							image.currentSet.tiles[t].visible = false;
							mapper.mapDisplay.applyShape(image.currentSet.tiles[t]);
						}
					}
				}
			}
		}
		this.findImage();
	},
	removeFromArray: function(id){
		for(var i =0; i< this.selectedIds.length;i++){
			if(this.selectedIds[i]==id){
				this.selectedIds[i] = null;
				this.selectedIds.remove(this.selectedIds[i]);
				return;
			}
		}

	},
	findImage: function(){
		var viewBox = mapper.mapDisplay.getViewBox();
		viewBox.x += mapper.mapDisplay.bounds.x;
		viewBox.y = mapper.mapDisplay.bounds.y - viewBox.y;
		var hmx = viewBox.w / $("map").offsetWidth;
		var vmx = viewBox.h / $("map").offsetHeight;
		viewBox.b = viewBox.y - viewBox.h;
		viewBox.r = viewBox.x + viewBox.w;

		this.selectedIds.each(function(id) {
			var image = this.images[id];
			if(image) {
				if(image.currentSet) {
					for(t in image.currentSet.tiles) {
						if(image.currentSet.tiles[t].visible) {
							image.currentSet.tiles[t].visible = false;
							mapper.mapDisplay.applyShape(image.currentSet.tiles[t]);
						}
					}
				}
				var tileSet = null;
				var greatest = image.sets[0];
				image.sets.each(function(set) {
					if(set.hmx > hmx && (tileSet == null || set.hmx < tileSet.hmx) && set.vmx > vmx && (tileSet == null || set.vmx < tileSet.vmx)) {
						tileSet = set;
					}
					if(set.hmx > greatest.hmx && set.vmx > greatest.vmx) {
						greatest = set;
					}
				});
				if(tileSet == null) {
					image.currentSet = greatest;
				} else {
					image.currentSet = tileSet;
				}
				image.currentSet.cols = Math.ceil(image.w / image.currentSet.tileW);
				var firstCol = Math.floor((viewBox.x - image.x) / image.currentSet.tileW);
				if(firstCol < 0) firstCol = 0;
				var lastCol = Math.ceil((viewBox.r - image.x) / image.currentSet.tileW);
				if(lastCol >= image.currentSet.cols) lastCol = image.currentSet.cols - 1;
				image.currentSet.rows = Math.ceil(image.h / image.currentSet.tileH);
				var firstRow = -Math.floor((viewBox.y - image.y + image.currentSet.tileH) / image.currentSet.tileH);
				if(firstRow < 0) firstRow = 0;
				var lastRow = -Math.ceil((viewBox.b - image.y) / image.currentSet.tileH);
				if(lastRow >= image.currentSet.rows) lastRow = image.currentSet.rows - 1;
				image.currentSet.firstCol = firstCol;
				image.currentSet.lastCol = lastCol;
				image.currentSet.firstRow = firstRow;
				image.currentSet.lastRow = lastRow;

				if(!image.currentSet.tiles) image.currentSet.tiles = {};
				for(var x = firstCol; x <= lastCol; ++x) {
					for(var y = firstRow; y <= lastRow; ++y) {
						var index = y * image.currentSet.rows + x;
						if(image.currentSet.tiles[index]) {
							image.currentSet.tiles[index].visible = true;
							mapper.mapDisplay.applyShape(image.currentSet.tiles[index]);
						} else {
							var width = image.currentSet.tileW;
							if(x == image.currentSet.cols - 1) width = image.currentSet.lastW;
							var height = image.currentSet.tileH;
							if(y == image.currentSet.rows - 1) height = image.currentSet.lastH;
							image.currentSet.tiles[index] = new Terrascape.Image({
								x : image.x + image.currentSet.tileW * x - mapper.mapDisplay.bounds.x,
								y : mapper.mapDisplay.bounds.y - image.y + image.currentSet.tileH * y,
								width : width + hmx,
								height : height + vmx,
								src : Terrascape.ImageServer.baseDir + image.currentSet.base + "row_" + y + "_col_" + x + ".jpg",
								id : image.id + y + "_" + x,
								visible : true
							});
							mapper.mapDisplay.addShape(image.currentSet.tiles[index], "r" + image.id);
						}
					}
				}
			}
		}.bind(this));
	}
};
Terrascape.ImageServer.baseDir = "";
Event.observe(window, "load", function() {
	Terrascape.ImageServer.waitForMapper();
});
