
map.Engine = {};

map.Engine.intervalId = 0;

map.Engine.direction = {
	TOP		: 1,
	LEFT	: 2,
	BOTTOM	: 3,
	RIGHT	: 4
};

map.Engine.left = 0;

map.Engine.top = 0;

map.Engine.position = {
	  X : 0
	, Y : 1
};

map.Engine.dimension = {
	  WIDTH		: 0
	, HEIGHT	: 1
};

map.Engine.action = {
	  UPDATE	: 1
	, INCREMENT : 2
	, DECREMENT	: 3
};

//---

map.Engine.getScrollLeft = function(){
	return Math.abs(parseInt(map.GUI.getContainer()['style']['left']));
	//return map.GUI.getContainer().scrollLeft;
};

map.Engine.getScrollTop = function(){
	return Math.abs(parseInt(map.GUI.getContainer()['style']['top']));
	//return map.GUI.getContainer().scrollTop;
};

//---

map.Engine.init = function(){
	map.Params.init();
	map.Layers.init();
	map.GUI.init();
	map.Engine.zoomAndMove();

	/*
	if (map.Params.items.pointId != 0) {
		map.Support.visibility(map.Support.getElement('mapPoint'+map.Params.items.pointId), true);
	}
	*/

	//map.Engine.zoomInit();
	//map.Engine.moveInit();
};

map.Engine.loadByStreetId = function(streetId){
	if(streetId == ''){
		map.Params.setLevel(map.Params.defaultParams.LEVEL);
		map.Engine.zoomInit();
		map.Engine.moveCenter();
	}
	else{
		map.Params.setPointId(map.Params.defaultParams.POINT_ID);
		map.Params.setX(map.Params.defaultParams.X);
		map.Params.setY(map.Params.defaultParams.Y);
		map.Params.setStreetId(parseInt(streetId));
		map.Engine.zoomAndMove();
	}
};

map.Engine.zoomAndMove = function(){
	var level	= map.Params.defaultParams.LEVEL;
	var left	= map.Params.defaultParams.X;
	var top		= map.Params.defaultParams.Y;

	if(map.Params.isExistXY()){
		map.GUI.resetFieldStreets();
		//TODO refaktoryzacja
		var x = map.Params.getX();
		var y = map.Params.getY();
		map.Engine.zoomInit();
		map.Engine.saveXY(x, y);
	}
	else if(map.Params.isExistPointId()){
		var layerId = 0;
		var pointId = map.Params.getPointId();
		var pointItem = map.Points.getItem(pointId);
		if(pointItem != null){
			//pointId == map.Config.pointsEmptyId ? map.Levels.getLevel(): map.Levels.lastLevel();
			//var level = map.Params.getLevel();
			var level = map.Params.getPointId() == map.Config.pointsEmptyId ? map.Params.getLevel() : map.Levels.lastLevel();
			var layerId = pointItem[map.Points.itemKeys.LAYER_ID];

			var left = pointItem[map.Points.itemKeys.POSITION][level][map.Engine.position.X] - map.GUI.getMainContainerWidth() / 2;
			left = (left > 0) ? left : 0;
			var top	= pointItem[map.Points.itemKeys.POSITION][level][map.Engine.position.Y] - map.GUI.getMainContainerHeight() / 2;
			top = (top > 0) ? top : 0;
			//map.Support.debug(left + ' - ' + top);
		}
		map.Params.setLevel(level);
		map.Engine.zoomInit();
		map.Engine.saveXY(left, top);
		map.GUI.changeLayersVisibility(layerId, true);
	}
	else if(map.Params.isExistStreetId()){
		var streetId = map.Params.getStreetId();
		var streetItem = map.Streets.getItem(streetId);
		if(streetItem != null){
			var level = streetItem[map.Streets.itemKeys.LEVEL];

			var left = streetItem[map.Streets.itemKeys.POSITION][map.Engine.position.X]; //  - map.GUI.getContainerWidth() / 2;
			//left = (left > 0) ? left : 0;
			var top	= streetItem[map.Streets.itemKeys.POSITION][map.Engine.position.Y]; // - map.GUI.getContainerHeight() / 2;
			//top = (top > 0) ? top : 0;

			//map.Support.debug(left + ' - ' + top);
			//alert(left + ' - ' + top);
		}
		map.Params.setLevel(level);
		map.Engine.zoomInit();
		map.Engine.saveXY(left, top);
	}
	else{
		map.Engine.zoomInit();
		map.Engine.centerMap();
	}
};

/*
map.Engine.calculatePointPosition = function(value, postionKey){
	value = value - (postionKey == map.Engine.position.X ? map.GUI.getContainerWidth()) / 2;
	return (value > 0) ? value : 0;
};
*/

//---

// public
map.Engine.moveCenter = function(){
	map.GUI.hidePointsDescriptionLayers();
	map.Engine.centerMap();
};

// public
map.Engine.startMove = function(direction){
	map.GUI.hidePointsDescriptionLayers();
	map.Engine.intervalId = setInterval('map.Engine.move(' + direction + ');', map.Config.interval);
};

// public
map.Engine.stopMove = function(){
	clearInterval(map.Engine.intervalId);
};

map.Engine.move = function(direction){
	if(direction == map.Engine.direction.LEFT)
		map.Engine.saveX(map.Config.offset, map.Engine.action.DECREMENT);
	else if(direction == map.Engine.direction.RIGHT)
		map.Engine.saveX(map.Config.offset, map.Engine.action.INCREMENT);
	else if(direction == map.Engine.direction.TOP)
		map.Engine.saveY(map.Config.offset, map.Engine.action.DECREMENT);
	else if(direction == map.Engine.direction.BOTTOM)
		map.Engine.saveY(map.Config.offset, map.Engine.action.INCREMENT);
};

//---

// public
map.Engine.zoomIn = function(){
	var level = map.Params.getLevel();
	if(level < map.Levels.lastLevel()){
		//level++;
		map.Params.setLevel(level + 1);
		map.Engine.zoom(true);
	}
};

// public
map.Engine.zoomOut = function(){
	var level = map.Params.getLevel();
	if(level > 0){
		//level--;
		map.Params.setLevel(level - 1);
		map.Engine.zoom(false);
	}
};

map.Engine.zoomInit = function(){
	var level = map.Params.getLevel();
	if(level >= 0 && level <= map.Levels.lastLevel()){
		map.Engine.zoom(true);
	}
};

map.Engine.zoom = function(isZoom){
	//map.Params.setLevel(level);
	map.GUI.clearContainer();
	map.GUI.changeContainerDimensions();
	map.GUI.createAreas();
	/* zakomentowane tymczasowo */
	map.GUI.hidePointsDescriptionLayers();
	map.Engine.changePosition(isZoom);
	map.GUI.createPoints();
};

//--- support

map.Engine.saveX = function(value, action){
	map.Engine.savePosition('left', value, action);
	//
	map.Params.setX(map.Engine.getScrollLeft());
	map.GUI.loadLinkToMap();
};

map.Engine.saveY = function(value, action){
	map.Engine.savePosition('top', value, action);
	//
	map.Params.setY(map.Engine.getScrollTop());
	map.GUI.loadLinkToMap();
};

map.Engine.saveXY = function(left, top, action){
	map.Engine.saveX(left, action);
	map.Engine.saveY(top, action);
};

map.Engine.savePosition = function(key, value, action){
	if(typeof(action) == 'undefined'){
		var action = map.Engine.action.UPDATE;
	}
	if(action != map.Engine.action.DECREMENT){
		value *= -1; /* było 1 */
	}
	var c = map.GUI.getContainer();
	var v = (action == map.Engine.action.UPDATE) ? value : parseInt(c['style'][key]) + value;
	var max = (key == 'left') ? map.Levels.createMaxWidth() : map.Levels.createMaxHeight();
	if(v <= 0 && Math.abs(v) <= max){
		map.Engine[key] = v;
		c['style'][key] = v + 'px';
		/* TEST */
		//document.getElementById('info').innerHTML = v + '-' + max;
	}
};

//---

map.Engine.centerMap = function(){
	var level = map.Params.getLevel();
	if(level >= 0 && level <= map.Levels.lastLevel()){
		var width	= map.Levels.items[level][map.Levels.itemsKeys.MAP][map.Engine.dimension.WIDTH];
		var height	= map.Levels.items[level][map.Levels.itemsKeys.MAP][map.Engine.dimension.HEIGHT];
		var left	= (width / 2) - (map.GUI.getMainContainerWidth() / 2);
		var top		= (height / 2) - (map.GUI.getMainContainerHeight() / 2);
		map.Engine.saveXY(left, top);
	}
};

map.Engine.isEqualSizes = function(){
	var level 	= map.Params.getLevel();
	var width	= map.Levels.items[level][map.Levels.itemsKeys.MAP][map.Engine.dimension.WIDTH];
	var height	= map.Levels.items[level][map.Levels.itemsKeys.MAP][map.Engine.dimension.HEIGHT];
	return (width == map.GUI.getMainContainerWidth() && height == map.GUI.getMainContainerHeight());
};

map.Engine.changePosition = function(isZoom){
	var level = map.Params.getLevel();

	if(level == 0){
		map.Engine.saveXY(0, 0);
	}
	else{
		var scale = map.Levels.calculateScale();
		if(isZoom){
			var left = map.Engine.getScrollLeft() * scale + map.GUI.getMainContainerWidth() / 2;
			var top	= map.Engine.getScrollTop() * scale + map.GUI.getMainContainerHeight() / 2;
		}
		else{
			var left = map.Engine.getScrollLeft() - map.GUI.getMainContainerWidth() / 2;
			left = (left > 0) ? Math.round(left / scale) : 0;
			var top = map.Engine.getScrollTop() - map.GUI.getMainContainerHeight() / 2;
			top = (top > 0) ? Math.round(top / scale) : 0;
		}
		map.Engine.saveXY(left, top);

		/*
		if(map.Engine.isEqualSizes()){
			//alert(level);
			map.Engine.centerMap();
		}
		else{
			var scale = map.Levels.calculateScale();
			if(isZoom){
				var left = map.Engine.getScrollLeft() * scale + map.GUI.getMainContainerWidth() / 2;
				var top	= map.Engine.getScrollTop() * scale + map.GUI.getMainContainerHeight() / 2;
			}
			else{
				var left = map.Engine.getScrollLeft() - map.GUI.getMainContainerWidth() / 2;
				left = (left > 0) ? Math.round(left / scale) : 0;
				var top = map.Engine.getScrollTop() - map.GUI.getMainContainerHeight() / 2;
				top = (top > 0) ? Math.round(top / scale) : 0;
			}
			map.Engine.saveXY(left, top);
			document.getElementById('info').innerHTML = scale + '---' + left + '-' + top;
		}
		*/
	}
};
