// Configuration
var tile_size = 250;
var tile_src = '/_map';
var admin_mode = false;

var dragging = false;
var top;
var left;
var drag_start_top;
var drag_start_left;

var zoom_level 				= 1;
var home_view_offset 	= new Array();
home_view_offset[0] 	= [0,0];
home_view_offset[1] 	= [120,0];
home_view_offset[2] 	= [-130,0];
var hvo_active				= 0;

var main_mode_view = new Array();
main_mode_view[1] = 320;
main_mode_view[2] = 540;
main_mode_view[3] = 320;
main_mode_view[4] = 540;
main_mode_view[5] = 540;

var zoom_sizes = new Array(5);        
zoom_sizes[90] = ['45000px','59500px', 1.422222, 0, 0];
zoom_sizes[50] = ['25000px','33000px', 2.56, 0, 0];
zoom_sizes[10] = ['5000px','6500px', 12.8, 0, 0];
zoom_sizes[4]  = ['2000px','2750px', 32, 0, 0];
zoom_sizes[1]  = ['2250px','1750px', 128, 1000, 750];

var visibleHobotypes = new Array();
var visibleCategories = new Array();
var visibleImmoCategories = new Array();
var visibleCompanyItems = new Array();
var visibleLocationItems = new Array();
var visibleHousenumbers;

function window_width(){
  if (window.innerWidth) {
    return window.innerWidth;
  } else if (document.body && document.body.offsetWidth) {
    return document.body.offsetWidth;
  } else {
    return 0;
  }
}

function window_height(){
  if (window.innerHeight) {
    return window.innerHeight;
  } else if (document.body && document.body.offsetHeight) {
    return document.body.offsetHeight;
  } else {
    return 0;
  }
}

function map_init(admin)
{
	if(admin)
	{
		admin_mode = true;
	}
	
	// Center View Port
	center_view_port();
	
	// Dragging listeners
	var map_c_map = getObject('map_c_map');
			map_c_map.onmousedown = startMove;
			map_c_map.onmousemove = processMove;
			map_c_map.onmouseup = stopMove;
			map_c_map.ondblclick = zoomInDblClick;

	// Necessary to enable dragging on IE
	 map_c_map.ondragstart = function() { return false; };
	
}

function map_reset()
{
	window.location.reload();
	/*
	zoom_level = 1;
	removeChildren(document.getElementById('map_c_map'));
	removeChildren(document.getElementById('map_c_items'));
	mapInit();
	*/
}

function set_mapB_size(width, height)
{
	var map_b = getObject('map_b');
	map_b.style.width = width;
	map_b.style.height = height;
}

function checkTiles()
{
	var visible_tiles = getVisibleTiles();
	var map_c_map = getObject('map_c_map');
	for (var i = 0; i < visible_tiles.length; i++)
	{
		var tile_array = visible_tiles[i];
		var tile_name = 'x' + tile_array[0] + 'y' + tile_array[1] + 'z' + zoom_level;
		var img = getObject(tile_name);
		if (!img)
		{
			var img_type = 'gif';
			if(zoom_level == '1')
			{
				img_type = 'jpg';
			}
						
			img = document.createElement('img');
			img.src = 'http:\/\/viaah.lu' + tile_src + '/' + tile_name + '.' + img_type;
			img.style.position = "absolute";
			img.style.left = (tile_array[0] * tile_size) + 'px';
			img.style.top = (tile_array[1] * tile_size) + 'px';
			img.style.zIndex = 0;
			img.id = tile_name;
		  map_c_map.appendChild(img);
			img.onerror = function(){this.src = host+'/_res/bkg/w.png';}
		}
	}
}



function fn_icon_in_view(x, y)
{
	var map_b = getObject('map_b');
	
	var view_x1 = Math.abs(Math.floor(stripPx(map_b.style.left)));
	var view_y1 = Math.abs(Math.floor(stripPx(map_b.style.top)));
	
	var view_x2 = view_x1 + window_width();
	var view_y2 = view_y1 + window_height();

	if(	(x >= view_x1 || view_x1 > 0) && 
			(y >= view_y1 || stripPx(zoom_sizes[zoom_level][0]) <= window_width()) && 
			(x <= view_x2 || view_x2 > 0) && 
			(y <= view_y2 || stripPx(zoom_sizes[zoom_level][1]) <= window_height()))
	{
		return true;
	}
	return false;
}

function getVisibleTiles()
{
	var map_b = getObject('map_b');
	
	var mapX = stripPx(map_b.style.left);
	var mapY = stripPx(map_b.style.top);
	
	var startX = Math.abs(Math.floor(mapX / tile_size)) - 1;
	var startY = Math.abs(Math.floor(mapY / tile_size)) - 1;

	if(mapX > 0)
	{
		var startX = 0;
	}
	if(mapY > 0)
	{
		var startY = 0;
	}

	var tilesX = Math.ceil(window_width() / tile_size) + 1;
	var tilesY = Math.ceil(window_height() / tile_size) + 1;
	var visible_tile_array = [];
	var counter = 0;
	for (var x = startX; x < (tilesX + startX); x++)
	{
		for (var y = startY; y < (tilesY + startY); y++)
		{
			visible_tile_array[counter++] = [x, y];
		}
	}
	
	return visible_tile_array;
}


// --------------------------------------------------- dragging functions -----------------------------------------------------

function startMove(e)
{
	if (!e) e = window.event;
	drag_start_left = e.clientX;
	drag_start_top = e.clientY;
	
	var map_b = getObject('map_b');
	map_b.style.cursor = 'move';
	
	map_top = stripPx(map_b.style.top);
	map_left = stripPx(map_b.style.left);

	dragging = true;
	return false;
}

function processMove(e)
{
	if (!e) e = window.event;
	var map_b = getObject('map_b');
	if(dragging)
	{
		map_b.style.top = parseInt(map_top) + (e.clientY - drag_start_top) + "px";
		map_b.style.left = parseInt(map_left) + (e.clientX - drag_start_left) + "px";
		
		checkTiles();
	}

	if(admin_mode)
	{
		get_coordinates_crosshair();
	}
	
	
}

function stopMove(evObj)
{
	var map_b = getObject('map_b');
	map_b.style.cursor = 'move';
	dragging = false;
	fn_zoom_icons();
	
	////if (document.getElementById('tbe').style.visibility == 'visible') { getCoordText('encoder', evObj); }
}


// ----------------------------------------------------- zoom functions -------------------------------------------------------

function fn_zoom_icons ()
{
	for(var i = 0; i < vis_arr.length; i++)
	{
		fn_set_icons (vis_arr[i].itype, vis_arr[i].mode, vis_arr[i].id, true, vis_arr[i].extra, i);
	}
}

function zoomIn(x, y)
{
	switch (parseInt(zoom_level))
	{
		case 1: 	setZoomLevel(4, x, y); 	break;
		case 4: 	setZoomLevel(10, x, y); break;
		case 10: 	setZoomLevel(50, x, y); break;
		case 50: 	setZoomLevel(90, x, y); break;
		default: 	setZoomLevel(90, x, y); break;
	}
}

function zoomOut()
{
	switch (parseInt(zoom_level))
	{
		case 90: 	setZoomLevel(50); break;
		case 50: 	setZoomLevel(10); break;
		case 10: 	setZoomLevel(4); 	break;
		case 4: 	setZoomLevel(1); 	break;
		default: 	setZoomLevel(1);	break;
	}
}

function zoomInDblClick (e)
{
	if (e === undefined) { e = window.event; }

	if (e.pageX || e.pageY)
	{
		x = e.pageX;
		y = e.pageY;
	}
	else if (e.clientX || e.clientY)
	{
		x = e.clientX + document.body.scrollLeft;
		y = e.clientY + document.body.scrollTop;
	}
	var luref_zoom = viaahToLuref(x, y);
	zoomIn(luref_zoom[0], luref_zoom[1]);
}

function setZoomLevel(new_zoom_level, x, y, mode)
{
	if(new_zoom_level != zoom_level || true)
	{
		if (x && y)
		{
			// if click out of Luxembourg
			var tmp_arr = fn_check_outer_click(x, y);
			x = tmp_arr[0];
			y = tmp_arr[1]; 
			
			var luref_center = new Array(2);
					luref_center[0] = x;
					luref_center[1] = y;
		}
		else
		{
			var luref_center = centerToLuref();
		}
	
		var old_zoom_level = zoom_level;
		zoom_level = new_zoom_level;
		set_zoom_arr_position();
		var map_b = getObject('map_b');
	
		var left_top = lurefToLeftTop(luref_center[0], luref_center[1]);

		map_b.style.left = left_top[0] + 'px';
		map_b.style.top = left_top[1] + 'px';
		set_mapB_size(zoom_sizes[zoom_level][0], zoom_sizes[zoom_level][1]);
	  removeChildren(getObject('map_c_map'));	
	
		fn_set_zoom();
		checkTiles();
		fn_zoom_icons();
	}
}

function zoomToPoint(str, zl, type)
{
	if(str != '' && str.match(/^[0-9]+-[0-9]+$/))
	{
		var coord = str.split('-');
		setZoomLevel(zl, coord[0], coord[1]);
	}
}

function fn_check_outer_click(x, y)
{
	var x1 =  49000;
	var x2 = 102500;

	var y1 =  59500;
	var y2 = 136000;
	
	var x3 =  80800;
	var y3 = 101800;
	
	var x4 =  59500;
	var y4 = 111300;
	
	
	// only zoomlevel 1
	if(zoom_level == 1)
	{
		// check west
		if(x < x1)
		{
			x = x1;
		}
		// check east
		if(x > x2)
		{
			x = x2;
		}
		// check south
		if(y < y1)
		{
			y = y1;
		}
		// check north
		if(y > y2)
		{
			y = y2;
		}
		// check northeast
		if(x > x3 && y > y3)
		{
			x = x3;
		}
		// check northwest
		if(x < x4 && y > y4)
		{
			x = x4;
		}
	}
	return new Array(x, y);
}
// ------------------------------------------------------ map functions -------------------------------------------------------

function center_map(x,y)
{
	var left_top = lurefToLeftTop(x, y);
	
	getObject('map_b').style.left = left_top[0] + 'px';
	getObject('map_b').style.top = left_top[1] + 'px';
	checkTiles();
}

function center_view_port()
{
	if(frame_mode)
	{
		return false;
	}
	
	var home_view 			= new Array();
	var viewport_width 	= 0;
	var viewport_height = 0;
	
	viewport_width = window_width();
	viewport_height =  window_height();

	// get viewport center
	home_view[0] = viewport_width/2  - 1100 + home_view_offset[hvo_active][0];
	home_view[1] = viewport_height/2 - 1100 + home_view_offset[hvo_active][1];
	
	// center map to viewport
	getObject('map_b').style.left = home_view[0] + "px";
	getObject('map_b').style.top = home_view[1] + "px";
	set_mapB_size(zoom_sizes[zoom_level][0], zoom_sizes[zoom_level][1]);

	checkTiles();
	return true;
}

function move_map(x,y)
{
	var map_b = getObject('map_b');
	var delta_x = parseInt(stripPx(map_b.style.left)) + parseInt(x);
	var delta_y = parseInt(stripPx(map_b.style.top)) 	+ parseInt(y);
	map_b.style.left = delta_x + 'px';
	map_b.style.top  = delta_y + 'px';

	checkTiles();
}

function getCenter()
{
	var x = Math.floor(window_width() / 2) + Math.floor(main_mode_view[main_mode] / 2);
	var y = Math.floor(window_height() / 2);
	
	return new Array(Math.floor(x), Math.floor(y));
}

function lurefToLeftTop(luref_x, luref_y)
{
	var center = getCenter();
	
	var left 	= (luref_x - 46000)  /  zoom_sizes[zoom_level][2] - center[0];
	var top 	= (luref_y - 141000) / -zoom_sizes[zoom_level][2] - center[1];

	left 	+= zoom_sizes[zoom_level][3];
	top 	+= zoom_sizes[zoom_level][4];
	
	left = 0 - left;
	top = 0 - top;
	
	return new Array(Math.floor(left), Math.floor(top));
}

function centerToLuref()
{
	var center = getCenter();
	var luref = viaahToLuref(center[0], center[1]);
	return luref;
}

function viaahToLuref (posX, posY)
{
	styleLeft = stripPx(getObject('map_b').style.left);
	styleTop = stripPx(getObject('map_b').style.top);
	
	lurefX = posX - zoom_sizes[zoom_level][3] - Math.round(styleLeft);
	lurefY = posY - zoom_sizes[zoom_level][4] - Math.round(styleTop);
	// Convert to LUREF
	var luref = new Array(2);
	luref[0] = Math.round((lurefX * zoom_sizes[zoom_level][2]) + 46000);
	luref[1] = Math.round((lurefY * -zoom_sizes[zoom_level][2]) + 141000);

	return luref;
}

function lurefToViaah (lurefX, lurefY, corr)
{
	/*if (corr == 'icons') { corrValue = -17; }
	else { corrValue = -13; }*/
	
	x = Math.round((lurefX - 46000) / zoom_sizes[zoom_level][2]);// + corrValue;
	y = Math.round((lurefY - 141000) / -zoom_sizes[zoom_level][2]);// + corrValue;
	
	// Correction for zl 1
	// Output

	x_y = fn_zoom_level_1_corr(Math.floor(x), Math.floor(y));
	
	return x_y;
}

function fn_zoom_level_1_corr(x, y)
{
		x += zoom_sizes[zoom_level][3];
		y += zoom_sizes[zoom_level][4];
	
	return new Array(x, y);
}
