// this function adds he editor functions.
freevolution.prototype.extend(
	{
		movetile:function (z){
			// x,y,z
			//var z=1;
			// this function moves the selected tile by z.
			
			var x=parseInt(this.cursorover['x']);
			var y=parseInt(this.cursorover['y']);
			
			var tile=this.tiles[ x ][ y ];
			var tileimg=tile[2];	
			var moved=new Array(false,false,false,false);
			if(z>0){
				for(var zstep=0;zstep<z;zstep++){
					// increase by 1
					var lowest=tile[3].min();	
					for(var i=0;i<4;i++){
						if(tile[3][i] <= lowest ){
							moved[i]=true;
						}
					}
					
					// did north move?
					if(tile[3][0]==lowest){
						this.cursor.style.top=tileimg.style.top=parseInt(tileimg.style.top)-8+'px';
					}
					for(var i=0;i<4;i++){
						if( tile[3][i]!=lowest ){
							// decrease all other corners
							tile[3][i]--;
						}
					}
					var path=tileimg.src.split('/');
					var type=path[ path.length-2 ];
					tileimg.src=this.backgroundpath+type+'/'+tile[3][0]+'-'+tile[3][1]+'-'+tile[3][2]+'-'+tile[3][3]+'.png';
					this.cursor.src=this.backgroundpath+'cursor/'+tile[3][0]+'-'+tile[3][1]+'-'+tile[3][2]+'-'+tile[3][3]+'.png';
					//this.cursor.style.zIndex=this.cursor.style.zIndex+1;
					//tileimg.style.zIndex=tileimg.style.zIndex+1;
					
					// process neighbours
					
					if(moved[0]==true){
						// set south of top to +1
						this.move_vertex((x-1),(y-1),new Array(null,null,1,null) );
						if(moved[3]==false){
							this.move_vertex(x,(y-1),new Array(null,1,null,null) );
						}
						if(moved[1]==false){
							this.move_vertex((x-1),y,new Array(null,null,null,1) );
						}
					}
					// -y 
					if(moved[0]==true && moved[1]==true){
						// set south and west to +1
						this.move_vertex((x-1),y,new Array(null,null,1,1) );
					}
					// -y +x
					if(moved[1]==true){
						// set west to +1
						this.move_vertex((x-1),(y+1),new Array(null,null,null,1) );
						if(moved[0]==false){
							this.move_vertex((x-1),y,new Array(null,null,1,null) );
						}
						if(moved[2]==false){
							this.move_vertex(x,(y+1),new Array(1,null,null,null) );
						}
					}
					// +x
					if(moved[1]==true && moved[2]==true){
						// set north,west to +1
						this.move_vertex(x,(y+1),new Array(1,null,null,1) );
					}
					// +x +y
					if(moved[2]==true){
						// set north of lower tile to +1
						this.move_vertex((x+1),(y+1),new Array(1,null,null,null) );
						if(moved[3]==false){
							this.move_vertex((x+1),y,new Array(null,1,null,null));
						}
						if(moved[1]==false){
							this.move_vertex(x,(y+1),new Array(null,null,null,1) );
						}
					}
					// +y
					if(moved[2]==true && moved[3]==true ){
						// set north, east to +1
						this.move_vertex((x+1),y,new Array(1,1,null,null) );
					}
					// -x +y
					if(moved[3]==true){
						// set east + 1
						this.move_vertex((x+1),(y-1),new Array(null,1,null,null) );
						if(moved[2]==false){
							this.move_vertex((x+1),y,new Array(1,null,null,null) );
						}
						if(moved[0]==false){
							this.move_vertex(x,(y-1),new Array(null,null,1,null) );
						}
					}
					// -x
					if(moved[3]==true && moved[0]==true){
						// set east,south +1
						this.move_vertex(x,(y-1),new Array(null,1,1,null) );
					}
				}
				return false;
			} else if(z==0){
				return true;
			} else if(z<0) {
				for(var zstep=0;zstep>z;zstep--){
					// decrease by 1
					var heighest=tile[3].max();	
					for(var i=0;i<4;i++){
						if(tile[3][i] <= heighest ){
							moved[i]=true;
						}
					}
					
					// did north move?
					if(tile[3][0]==heighest && !(tile[3][1]>tile[3][0]+2) && !(tile[3][3]>tile[3][0]+2)){
						this.cursor.style.top=tileimg.style.top=parseInt(tileimg.style.top)+8+'px';
					}
					for(var i=0;i<4;i++){
						if( tile[3][i]!=heighest ){
							// increase all other corners
							tile[3][i]++;
						}
					}
					var path=tileimg.src.split('/');
					var type=path[ path.length-2 ];
					tileimg.src=this.backgroundpath+type+'/'+tile[3][0]+'-'+tile[3][1]+'-'+tile[3][2]+'-'+tile[3][3]+'.png';
					this.cursor.src=this.backgroundpath+'cursor/'+tile[3][0]+'-'+tile[3][1]+'-'+tile[3][2]+'-'+tile[3][3]+'.png';
					//this.cursor.style.zIndex=this.cursor.style.zIndex+1;
					//tileimg.style.zIndex=tileimg.style.zIndex+1;
					
					// process neighbours
					
					if(moved[0]==true){
						// set south of top to +1
						this.move_vertex((x-1),(y-1),new Array(null,null,-1,null) );
						if(moved[3]==false){
							this.move_vertex(x,(y-1),new Array(null,-1,null,null) );
						}
						if(moved[1]==false){
							this.move_vertex((x-1),y,new Array(null,null,null,-1) );
						}
					}
					// -y 
					if(moved[0]==true && moved[1]==true){
						// set south and west to +1
						this.move_vertex((x-1),y,new Array(null,null,-1,-1) );
					}
					// -y +x
					if(moved[1]==true){
						// set west to +1
						this.move_vertex((x-1),(y+1),new Array(null,null,null,-1) );
						if(moved[0]==false){
							this.move_vertex((x-1),y,new Array(null,null,-1,null) );
						}
						if(moved[2]==false){
							this.move_vertex(x,(y+1),new Array(-1,null,null,null) );
						}
					}
					// +x
					if(moved[1]==true && moved[2]==true){
						// set north,west to +1
						this.move_vertex(x,(y+1),new Array(-1,null,null,-1) );
					}
					// +x +y
					if(moved[2]==true){
						// set north of lower tile to +1
						this.move_vertex((x+1),(y+1),new Array(-1,null,null,null) );
						if(moved[3]==false){
							this.move_vertex((x+1),y,new Array(null,-1,null,null));
						}
						if(moved[1]==false){
							this.move_vertex(x,(y+1),new Array(null,null,null,-1) );
						}
					}
					// +y
					if(moved[2]==true && moved[3]==true ){
						// set north, east to +1
						this.move_vertex((x+1),y,new Array(-1,-1,null,null) );
					}
					// -x +y
					if(moved[3]==true){
						// set east + 1
						this.move_vertex((x+1),(y-1),new Array(null,-1,null,null) );
						if(moved[2]==false){
							this.move_vertex((x+1),y,new Array(-1,null,null,null) );
						}
						if(moved[0]==false){
							this.move_vertex(x,(y-1),new Array(null,null,-1,null) );
						}
					}
					// -x
					if(moved[3]==true && moved[0]==true){
						// set east,south +1
						this.move_vertex(x,(y-1),new Array(null,-1,-1,null) );
					}
				}
				return false;
			}
		},
		
		move_vertex:function (x,y,changes){
			if(!this.tiles[x] && !this.tiles[x][y]){
				return false;
			}
			var tile=this.tiles[x][y];
			var tileimg=tile[2];
			
			var moved=new Array(false,false,false,false);
			for(i=0;i<4;i++){
				if(changes[i]!=null){
					moved[i]=true;
					tile[3][i]=tile[3][i]+changes[i];
				}
			}
			var lowest=tile[3].min();
			if(lowest<0){
				for(i=0;i<4;i++){
					tile[3][i]=tile[3][i]-lowest;
				}
				lowest=0;
				// increase tile height in array somewhere
			}
			
			var tiletop=parseInt(tileimg.style.top);
			if(moved[0]!=false){
				if(changes[0]!=-1){
					tileimg.style.top=tiletop-(8*changes[0])+'px';
				} else {
					if(tile[3][1]<=(tile[3][0]+2) && tile[3][3]<=(tile[3][0]+2)){
						tileimg.style.top=tiletop-(8*changes[0])+'px';
					}
				}
			}
			if(tile[3][1]>(tile[3][0]+2) && moved[1]==true){
				tileimg.style.top=tiletop-(8*changes[1])+'px';
			}
			if(tile[3][3]>(tile[3][0]+2) && moved[3]==true){
				tileimg.style.top=tiletop-(8*changes[3])+'px';
			}
			var path=tileimg.src.split('/');
			var type=path[ path.length-2 ];
			tileimg.src=this.backgroundpath+type+'/'+tile[3][0]+'-'+tile[3][1]+'-'+tile[3][2]+'-'+tile[3][3]+'.png';
		},
		
		dragGo:function(event) {
			if(this.drag==true){
				this.cursor.style.top=parseInt(this.cursor.style.top)-(this.dragObj.clickY-event.layerY)+'px';
				var tile=this.tiles[ this.cursorover['x'] ][this.cursorover['y'] ][2];
				var diff=Math.floor((parseInt(tile.style.top)-parseInt(this.cursor.style.top))/8);	
				if(diff>0){
					for(var i=0;i<diff;i++){
						this.drag=false;
						this.movetile(1);
						this.drag=true;
					}
				} else {
					for(var i=0;i>diff;i--){
						this.drag=false;
						this.movetile(-1);
						this.drag=true;
					}
				}
				event.preventDefault();
			}
		},
	
		dragStop:function(event) {
			// Stop capturing mousemove and mouseup events.	
			this.drag=false;
			this.cursor.removeEventListener("mousemove",   this.dragGo, true);
			this.cursor.removeEventListener("mouseup",   this.dragStop, true);
		}
	}
);