var map_dot_width=100;
var map_dot_height=75;
var map_ot_x, map_do_x, map_ot_y, map_do_y;
var map_ot_x_temp, map_ot_y_temp;
var map_dot_ot_x, map_dot_do_x, map_dot_ot_y, map_dot_do_y;
var map_drag;
var map_zoom=1;
var map_to_arr=new Array(1,25,125,625);
var map;
var map_zapas=2;
var map_last_dotx_ot, map_last_dotx_do, map_last_doty_ot, map_last_dott_do;
var map_x0, map_y0; // координаты центра
var map_dotx, map_doty; // координаты квадрата, который находится в центре
var map_plus_minus_x=0, map_plus_minus_y=0; // смещение
var map_plus_minus_x_temp=0, map_plus_minus_y_temp=0;
var map_dotx_ot, map_dotx_do, map_doty_ot, map_doty_do; // x и y начальных и конечных квадратов
var map_dots_container;
var map_move=false;
var map_width=190, map_height=130;
var map_last_x, map_last_y;
var map_dots_container;

jQuery.fn.canvas_map=function (params)
{
	params=$.extend({x:0, y:0, zoom:1});
	
	$(this).each(function()
	{
		
		map_dotx=params.x;
		map_doty=params.y;
		map=this;
		map_update_xy0();
		map_drag=$("<div class=\"map_drag\"></div>");
		$(map).html('').append(map_drag);
		map_update_dots_ot_do();
		map_dots_container=$("<div id=\"map_dots_container\"></div>").canvas_map_dots();
		$(map_drag).append(map_dots_container);
		map_move_dots();
		
		// zoom
			map_zoom_but=$("<div id=\"map_zoom_but\" class=\"map_zoom_but_minus pointer\" title=\""+lan("zoom")+"\"></div>").click(function ()
			{
				if (map_zoom==1)
				{
					$(map_drag).map_zoom({zoom_plus: 1});
				}
				else if (map_zoom==2)
				{
					$(map_drag).map_zoom({zoom_plus: -1});
				}
			});
			$(this).append(map_zoom_but);
		// zoom End
		
		// Move
			$(map).mousemove(function (e)
			{
				if ((map_move)&&(!paint_vkl)&&(!input_work))
				{
					add_to_potok()
					moved=true;
					var delta_x=e.pageX-_map_last_x;
					var delta_y=e.pageY-_map_last_y;
					_map_last_x=e.pageX;
					_map_last_y=e.pageY;
					
					map_mov(delta_x, delta_y);
					canvas_mov(delta_x*map_to()/zoom, delta_y*map_to()/zoom);
				}
			});
		// Move End
		
		// Wheel
			$(map).wheel(function (event, delta)
			{
				if ($.browser.msie)
				{
					delta*=-1;
				}

				if (delta==1)
				{
					$(map_drag).map_zoom({zoom_plus: 1});
				}
				else
				{
					$(map_drag).map_zoom({zoom_plus: -1});
				}
			});
		// Wheel End

		$(map).mousedown(function (e)
		{
			moved=false;
			map_move=true;
			_map_last_x=e.pageX;
			_map_last_y=e.pageY;
			map_mouse_down();
			canvas_mouse_down();
		});
		$(map).mouseup(function ()
		{
			move_dots();
			//map_move_dots();
			map_move=false;
			input_work=false;
		});
		$(map).mouseleave(function ()
		{
			move_dots();
			//map_move_dots();
			map_move=false;
			input_work=false;
		});
	});
	
	return this;
};

// Map Move
	function map_mov(delta_x, delta_y)
	{
		map_plus_minus_x+=delta_x;
		map_plus_minus_y+=delta_y;
		var _left=map_ot_x_temp+map_plus_minus_x-map_plus_minus_x_temp;
		var _top=map_ot_y_temp+map_plus_minus_y-map_plus_minus_y_temp;
		
		$(map_drag).css("left", _left);
		$(map_drag).css("top", _top);
	}
	
	function map_mouse_down()
	{
		map_ot_x_temp=map_ot_x;
		map_ot_y_temp=map_ot_y;
		map_plus_minus_x_temp=map_plus_minus_x;
		map_plus_minus_y_temp=map_plus_minus_y;
	}
// Map Move End

function map_move_dots()
{
	map_update_dots_ot_do();
	map_edit_table();
	map_set_left_top();
}


// Edit Table
	function map_edit_table()
	{
		// X
			// удалить слева
				if (map_dotx_ot>map_last_dotx_ot)
				{
					for(var delx=map_last_dotx_ot; delx<map_dotx_ot; delx++)
					{
						$(map_dots_container).find(".map_dot[_x="+delx+"]").remove();
						map_move_dots_x(-map_dot_width);
					}
				}
			// удалить слева End
			
			// Добавить слева
				if (map_dotx_ot<map_last_dotx_ot)
				{
					for(var addx=(map_last_dotx_ot-1); addx>=map_dotx_ot; addx--)
					{
						map_move_dots_x(map_dot_width);
						var top_n=0;
						for (var addy=map_last_doty_ot; addy<=map_last_doty_do; addy++)
						{
							if (!map_is_dot(addx, addy))
							{
								var _top=top_n*map_dot_height;
								var dot=$("<div></div>").map_dot({x:addx, y:addy}).data('left', 0).data('top', _top).css('left', 0).css('top', _top);
								$("#map_"+(addx+1)+"_"+addy).before(dot);
							}
							top_n++;
						}
					}
					//load_dots();
				}
			// Добавить слева End
			
			// удалить справа
				if (map_dotx_do<map_last_dotx_do)
				{
					for (var delx=map_last_dotx_do; delx>map_dotx_do; delx--)
					{
						$(map_dots_container).find(".map_dot[_x="+delx+"]").remove();
					}
				}
			// удалить справа End
			
			// Добавить справа
				if (map_dotx_do>map_last_dotx_do)
				{
					for (var addx=(map_last_dotx_do+1); addx<=map_dotx_do; addx++)
					{
						left_n=addx-map_dotx_ot;
						var _left=left_n*map_dot_width;
						var top_n=0;
						for (var addy=map_last_doty_ot; addy<=map_last_doty_do; addy++)
						{
							if (!map_is_dot(addx, addy))
							{
								var _top=top_n*map_dot_height;
								var dot=$("<div></div>").map_dot({x:addx, y:addy}).data('left', _left).css('left', _left).data('top', _top).css('top', _top);
								$("#map_"+(addx-1)+"_"+addy).after(dot);
							}
							top_n++;
						}
					}
					//load_dots();
				}
			// Добавить справа End
		// X End

		map_last_dotx_ot=map_dotx_ot;
		map_last_dotx_do=map_dotx_do;
		
		// Y
			// удалить сверху
				if (map_doty_ot>map_last_doty_ot)
				{
					for(var dely=map_last_doty_ot; dely<map_doty_ot; dely++)
					{
						$(map_dots_container).find(".map_dot[_y="+dely+"]").remove();
						map_move_dots_y(-map_dot_height);
					}
				}
			// удалить сверху End
			
			// Добавить сверху
				if (map_doty_ot<map_last_doty_ot)
				{
					for(var addy=(map_last_doty_ot-1); addy>=map_doty_ot; addy--)
					{
						map_move_dots_y(map_dot_height);
						var left_n=0;
						for (var addx=map_dotx_ot; addx<=map_dotx_do; addx++)
						{
							if (!map_is_dot(addx, addy))
							{
								var _left=left_n*map_dot_width;
								var dot=$("<div></div>").map_dot({x:addx, y:addy}).data('left', _left).data('top', 0).css('left', _left).css('top', 0);
								$(map_dots_container).append(dot);
							}
							left_n++;
						}
					}
					//load_dots();
				}
			// Добавить сверху End
			
			// удалить снизу
				if (map_doty_do<map_last_doty_do)
				{
					for (var dely=map_last_doty_do; dely>map_doty_do; dely--)
					{
						$(map_dots_container).find(".map_dot[_y="+dely+"]").remove();
					}
				}
			// удалить снизу End
			
			// Добавить снизу
				if (map_doty_do>map_last_doty_do)
				{
					for (var addy=(map_last_doty_do+1); addy<=map_doty_do; addy++)
					{
						top_n=addy-map_doty_ot;
						var _top=top_n*map_dot_height;
						var left_n=0;
						for (var addx=map_last_dotx_ot; addx<=map_last_dotx_do; addx++)
						{
							if (!map_is_dot(addx, addy))
							{
								var _left=left_n*map_dot_width;
								var dot=$("<div></div>").map_dot({x:addx, y:addy}).data('left', _left).css('left', _left).data('top', _top).css('top', _top);
								$(map_dots_container).append(dot);
							}
							left_n++;
						}
					}
					//load_dots();
				}
			// Добавить снизу End
		// Y End

		map_last_doty_ot=map_doty_ot;
		map_last_doty_do=map_doty_do;
		//load_dots();
	}
// Edit Table End


// move dots
	function map_move_dots_x(plus_x)
	{
		$(map_dots_container).find(".map_dot").each(function (i, d)
		{
			var _left=$(d).data('left')+plus_x;
			$(d).css("left", _left).data('left', _left);
		});
	}
	function map_move_dots_y(plus_y)
	{
		$(map_dots_container).find(".map_dot").each(function (i, d)
		{
			var _top=$(d).data('top')+plus_y;
			$(d).css("top", _top).data('top', _top);
		});
	}
// move dots End


function map_update_dots_ot_do()
{
	// изменение координат центра
		/*while (map_plus_minus_x<-map_dot_width/2)
		{
			map_plus_minus_x+=map_dot_width;
			map_dotx++;
		}
		while (map_plus_minus_x>=map_dot_width/2)
		{
			map_plus_minus_x-=map_dot_width;
			map_dotx--;
		}
		while (map_plus_minus_y<-map_dot_height/2)
		{
			map_plus_minus_y+=map_dot_height;
			map_doty++;
		}
		while (map_plus_minus_y>=map_dot_height/2)
		{
			map_plus_minus_y-=map_dot_height;
			map_doty--;
		}*/
		//pixel_x=-map_plus_minus_x*map_zoom()+map_dotx*map_dot_width*map_zoom();
		
		map_plus_minus_x_not_zoom=-pixel_x%(map_dot_width*map_to());
		map_dotx=(pixel_x+map_plus_minus_x_not_zoom)/(map_dot_width*map_to());
		map_plus_minus_x=map_plus_minus_x_not_zoom/map_to();

		map_plus_minus_y_not_zoom=-pixel_y%(map_dot_height*map_to());
		map_doty=(pixel_y+map_plus_minus_y_not_zoom)/(map_dot_height*map_to());
		map_plus_minus_y=map_plus_minus_y_not_zoom/map_to();
		
// изменение координат центра End
		
		
	// dotx_ot
		minus_predvar=-map_dot_width*map_zapas_();
		map_ot_x=map_x0+map_plus_minus_x-map_dot_width/2;
		map_dotx_ot=map_dotx;
		for(var xx=map_dotx-1; map_ot_x>minus_predvar; xx--)
		{
			map_dotx_ot=xx;
			map_ot_x-=map_dot_width;
		}
	// dotx_ot End

	// dotx_do
		plus_predvar=map_x0*2+map_dot_width*map_zapas_();
		map_do_x=map_x0+map_plus_minus_x+map_dot_width/2; // <<<
		map_dotx_do=map_dotx;
		for(var xx=map_dotx+1; map_do_x<plus_predvar; xx++)
		{
			map_dotx_do=xx;
			map_do_x+=map_dot_width;
		}
	// dotx_do End

	// doty_ot
		minus_predvar=-map_dot_height*map_zapas_();
		map_ot_y=map_y0+map_plus_minus_y-map_dot_height/2;
		map_doty_ot=map_doty;
		for(var yy=map_doty-1; map_ot_y>minus_predvar; yy--)
		{
			map_doty_ot=yy;
			map_ot_y-=map_dot_height;
		}
	// doty_ot End

	// doty_do
		plus_predvar=map_y0*2+map_dot_height*map_zapas_();
		map_do_y=map_y0+map_plus_minus_y+map_dot_height/2; // <<<
		map_doty_do=map_doty;
		for(var yy=map_doty+1; map_do_y<plus_predvar; yy++)
		{
			map_doty_do=yy;
			map_do_y+=map_dot_height;
		}
	// doty_do End
}

function map_update_xy0()
{
	map_h=map_height;
	map_w=map_width;
	map_x0=map_width/2;
	map_y0=map_height/2;
}

function map_set_left_top()
{
	$(map_drag).css("left", map_ot_x);
	$(map_drag).css("top", map_ot_y);
}

function map_zapas_()
{
	return map_zapas;
}
function map_is_dot(x, y)
{
	return false;
}

function map_to()
{
	return map_to_arr[map_zoom];
}