function MapsSystemCompute(advMaps) 
{

	var obj = new Object();
	var ArrayXYKursor = new Array();

	//---------------------------------------------
	obj.EventMouseUp = function() // co gdy klawisz myszy UP
	//---------------------------------------------
	{
		if(!advMaps.OnLoad) return ;

		if(advMaps.Mode == 3)
		{
			tA = new Array();
			tA[0] = advMaps.MouseX;  //x ekranu
			tA[1] = advMaps.MouseY;  //y ekranu
			tA[2] = advMaps.MapsMx + parseInt(advMaps.MapsMw*advMaps.MouseX/advMaps.MapsIw);;  //mx ekranu
			tA[3] = advMaps.MapsMy - parseInt((advMaps.MapsIh/advMaps.MapsIw)*advMaps.MapsMw*advMaps.MouseY/advMaps.MapsIh);  //my ekranu		
			ArrayXYKursor.push(tA);
			obj.ComputePolyLineLength(ArrayXYKursor);
		}
		else if(advMaps.Mode == 4)
		{
			tA = new Array();
			tA[0] = advMaps.MouseX;  //x ekranu
			tA[1] = advMaps.MouseY;  //y ekranu
			tA[2] = advMaps.MapsMx + parseInt(advMaps.MapsMw*advMaps.MouseX/advMaps.MapsIw);;  //mx ekranu
			tA[3] = advMaps.MapsMy - parseInt((advMaps.MapsIh/advMaps.MapsIw)*advMaps.MapsMw*advMaps.MouseY/advMaps.MapsIh);  //my ekranu		
			ArrayXYKursor.push(tA);
			obj.ComputePolygonArea(ArrayXYKursor);
		}
	}

	//---------------------------------------------
	obj.ComputeClear = function() // co gdy klawisz myszy UP
	//---------------------------------------------
	{
		ArrayXYKursor = new Array();
		if(!advMaps.OnLoad) return ;
		var html = '';
		advMaps.xInnerHtml(advMaps.IdFrameMaps, obj.DivMsg, html);
		advMaps.xInnerHtml(advMaps.IdFrameMaps, obj.DivLine, html);
		advMaps.xDisplayNone(advMaps.IdFrameMaps, obj.Div);
		if(advMaps.Mode == 3) obj.ComputePolyLineLength(ArrayXYKursor); 
		else if(advMaps.Mode == 4) obj.ComputePolygonArea(ArrayXYKursor); 
	}

	//---------------------------------------------
	// Poniższa funkcja wyznacza pole powierzchni
	// dowolnego prawidłowego wielokąta tzn. takiego,
	// który nie posiada punktów przecięć z samym sobą
	// Zakładamy także, że polygon nie posiada enklaw.
	//---------------------------------------------

	//---------------------------------------------
	obj.ComputePolygonArea = function(tablica)
	//---------------------------------------------
	{
		// Wyznaczenie powierzchni dowolnego prawidłowego polygonu!
		var tmp1, tmp2;
		var area = 0.0;
		var tableLen = tablica.length;

		// jeśli liczba punktów jest mniejsza od 3 powierzchnia nie jest wyznaczana
		if(tableLen < 3) 
		{
			advMaps.xInnerHtml(advMaps.IdFrameMaps, obj.DivMsg, obj.PolygonAreaMsg1);
			advMaps.xDisplayBlock(advMaps.IdFrameMaps, obj.Div);
			
			var newDiv;
			if(tableLen > 0)
			{
				var myDiv = advMaps.xGetElementById(advMaps.IdFrameMaps, obj.DivLine);
				if(myDiv)
				{
					if(advMaps.IdFrameMaps) newDiv = window.frames[advMaps.IdFrameMaps].document.createElement("div");
					else newDiv = document.createElement("div");
					newDiv.innerHTML = '<div id="point_'+tableLen+'" style="position: absolute; top: '+(tablica[(tableLen-1)][1]-Math.round(obj.PolyWidthHeight/2))+'; left: '+(tablica[(tableLen-1)][0]-Math.round(obj.PolyWidthHeight/2))+'; z-index: 1">'+((tableLen < 2)?obj.PolyPointStart:obj.PolyPointNext)+'<\/div>';
					myDiv.appendChild(newDiv);

					if(tableLen > 1)
					{
						if(advMaps.IdFrameMaps) newDiv = window.frames[advMaps.IdFrameMaps].document.createElement("div");
						else newDiv = document.createElement("div");
						newDiv.innerHTML = obj.mkLine(tablica[(tableLen-2)][0], tablica[(tableLen-2)][1], tablica[(tableLen-1)][0], tablica[(tableLen-1)][1]);
						myDiv.appendChild(newDiv);
					}
				}
			}
		}
		else
		{
			for (var j=0;j < tableLen-1; j++) 
			{
				if( j == 0 ) 
				{
				   tmp1 = tablica[j][2]   * tablica[j+1][3];
				   tmp2 = tablica[j+1][2] * tablica[j][3];
				} 
				else 
				{
				   tmp1 += tablica[j][2]   * tablica[j+1][3];
				   tmp2 += tablica[j+1][2] * tablica[j][3];
				}
			}
			
			area = (Math.abs(((tmp1 + (tablica[tableLen-1][2] * tablica[0][3])) - (tmp2 + (tablica[0][2] * tablica[tableLen-1][3]))) / 2));
			area = parseInt(area*100)/100;

			if(area < 100000) area = area + ' [m2]';
			else 
			{
				area = parseInt(area)/1000000;
				area = parseInt(area*1000)/1000 + ' [km2]';
			}
			
			var txt = obj.PolygonAreaMsg2.replace(/<<ComputeCount>>/g, tableLen);
			txt = txt.replace(/<<ComputeArea>>/g, area);

			advMaps.xInnerHtml(advMaps.IdFrameMaps, obj.DivMsg, txt);
			
			var myDiv = advMaps.xGetElementById(advMaps.IdFrameMaps, obj.DivLine);
			if(myDiv)
			{
				if(advMaps.IdFrameMaps) newDiv = window.frames[advMaps.IdFrameMaps].document.createElement("div");
				else newDiv = document.createElement("div");
				newDiv.innerHTML = '<div id="point_'+tableLen+'" style="position: absolute; top: '+(tablica[(tableLen-1)][1]-Math.round(obj.PolyWidthHeight/2))+'; left: '+(tablica[(tableLen-1)][0]-Math.round(obj.PolyWidthHeight/2))+'; z-index: 1">'+obj.PolyPointNext+'<\/div>';
				myDiv.appendChild(newDiv);

				if(advMaps.IdFrameMaps) newDiv = window.frames[advMaps.IdFrameMaps].document.createElement("div");
				else newDiv = document.createElement("div");
				newDiv.innerHTML = obj.mkLine(tablica[(tableLen-2)][0], tablica[(tableLen-2)][1], tablica[(tableLen-1)][0], tablica[(tableLen-1)][1]);
				myDiv.appendChild(newDiv);

				// usun niepotrzebna kreske poligona - ostatnio wygenerowana....
				var elemDel;
				if(advMaps.IdFrameMaps) elemDel = window.frames[advMaps.IdFrameMaps].document.getElementById('DivLine_'+(tableLen-1));
				else elemDel = document.getElementById('DivLine_'+(tableLen-1));
				if(elemDel) myDiv.removeChild(elemDel);
				
				// kreska zamykajaca poligon - utworzona na nowo
				if(advMaps.IdFrameMaps) newDiv = window.frames[advMaps.IdFrameMaps].document.createElement("div");
				else newDiv = document.createElement("div");
				newDiv.id = 'DivLine_'+tableLen;
				newDiv.innerHTML = obj.mkLine(tablica[0][0], tablica[0][1], tablica[(tableLen-1)][0], tablica[(tableLen-1)][1]);
				myDiv.appendChild(newDiv);

			}
			advMaps.xDisplayBlock(advMaps.IdFrameMaps, obj.Div);
		}
	}


	// Poniższa funkcja wyznacza długość łamanej
	//---------------------------------------------
	obj.ComputePolyLineLength = function(tablica)
	//---------------------------------------------
	{
		// Wyznaczenie długości lini
		
		var tmp;
		var segmLen = 0.0;
		var tableLen = tablica.length;
		var txt = '';
		// jeśli liczba punktów jest mniejsza od 2 długość lini nie jest wyznaczana
		if(tableLen < 2) 
		{
			if(tableLen == 0) advMaps.xInnerHtml(advMaps.IdFrameMaps, obj.DivMsg, obj.PolyLineMsg1);
			else advMaps.xInnerHtml(advMaps.IdFrameMaps, obj.DivMsg, obj.PolyLineMsg2);
			
			var newDiv;

			if(tableLen > 0)
			{
				var myDiv = advMaps.xGetElementById(advMaps.IdFrameMaps, obj.DivLine);
				if(myDiv)
				{
					if(advMaps.IdFrameMaps) newDiv = window.frames[advMaps.IdFrameMaps].document.createElement("div");
					else newDiv = document.createElement("div");
					newDiv.innerHTML = '<div id="point_'+tableLen+'" style="position: absolute; top: '+(tablica[(tableLen-1)][1]-Math.round(obj.PolyWidthHeight/2))+'; left: '+(tablica[(tableLen-1)][0]-Math.round(obj.PolyWidthHeight/2))+'; z-index: 1">'+obj.PolyPointStart+'<\/div>';
					myDiv.appendChild(newDiv);
				}
			}
			advMaps.xDisplayBlock(advMaps.IdFrameMaps, obj.Div);
		}
		else
		{
			for (var j=0;j < tableLen-1; j++) {
				tmp = Math.pow((tablica[j+1][2]-tablica[j][2]), 2) + Math.pow((tablica[j+1][3]-tablica[j][3]), 2);
				tmp = Math.sqrt(tmp);
				segmLen += tmp;
			}

			segmLen *= 100;
			segmLen = parseInt(segmLen)/100;
			if(segmLen < 1000) segmLen = segmLen + ' [m]';
			else segmLen = parseInt(segmLen)/1000 + ' [km]';;
			
			var txt = obj.PolyLineMsg3.replace(/<<ComputeCount>>/g, tableLen);
			txt = txt.replace(/<<ComputeLength>>/g, segmLen);

			advMaps.xInnerHtml(advMaps.IdFrameMaps, obj.DivMsg, txt);


			var myDiv = advMaps.xGetElementById(advMaps.IdFrameMaps, obj.DivLine);
			if(myDiv)
			{
				var newDiv;
				if(advMaps.IdFrameMaps) newDiv = window.frames[advMaps.IdFrameMaps].document.createElement("div");
				else newDiv = document.createElement("div");
				newDiv.innerHTML = '<div id="point_'+tableLen+'" style="position: absolute; top: '+(tablica[(tableLen-1)][1]-Math.round(obj.PolyWidthHeight/2))+'; left: '+(tablica[(tableLen-1)][0]-Math.round(obj.PolyWidthHeight/2))+'; z-index: 1">'+obj.PolyPointNext+'<\/div>';
				myDiv.appendChild(newDiv);
				
				if(advMaps.IdFrameMaps) newDiv = window.frames[advMaps.IdFrameMaps].document.createElement("div");
				else newDiv = document.createElement("div");

				newDiv.innerHTML = obj.mkLine(tablica[(tableLen-2)][0], tablica[(tableLen-2)][1], tablica[(tableLen-1)][0], tablica[(tableLen-1)][1]);
				myDiv.appendChild(newDiv);
			}

			advMaps.xDisplayBlock(advMaps.IdFrameMaps, obj.Div);
		}
	}



	//---------------------------------------------
	obj.mkDiv = function(x, y, w, h)
	//---------------------------------------------
	{
		w = w <2 ? 2 : w;
		h = h <2 ? 2 : h;
		
		html = '<div style="position:absolute;'+
			'left:' + x + 'px;'+
			'top:' + y + 'px;'+
			'width:' + w + 'px;'+
			'height:' + h + 'px;'+
			'clip:rect(0,'+w+'px,'+h+'px,0);'+
			'background-color: red;' +
			'overflow:hidden'+
			';"><\/div>';

			return html;
	}

	//---------------------------------------------
	obj.mkLine = function(x1, y1, x2, y2)
	//---------------------------------------------
	{
		var punkt = '';

		if(x1 > x2)
		{
			var _x2 = x2;
			var _y2 = y2;
			x2 = x1;
			y2 = y1;
			x1 = _x2;
			y1 = _y2;
		}
		var dx = x2-x1, dy = Math.abs(y2-y1),
		x = x1, y = y1,
		yIncr = (y1 > y2)? -1 : 1;

		if(dx >= dy)
		{
			var pr = dy<<1,
			pru = pr - (dx<<1),
			p = pr-dx,
			ox = x;
			while(dx > 0)
			{--dx;
				++x;
				if(p > 0)
				{
					punkt += obj.mkDiv(ox, y, x-ox, 1);
					y += yIncr;
					p += pru;
					ox = x;
				}
				else p += pr;
			}
			punkt += obj.mkDiv(ox, y, x2-ox+1, 1);
		}

		else
		{
			var pr = dx<<1,
			pru = pr - (dy<<1),
			p = pr-dy,
			oy = y;
			if(y2 <= y1)
			{
				while(dy > 0)
				{--dy;
					if(p > 0)
					{
						punkt += obj.mkDiv(x++, y, 1, oy-y+1);
						y += yIncr;
						p += pru;
						oy = y;
					}
					else
					{
						y += yIncr;
						p += pr;
					}
				}
				punkt += obj.mkDiv(x2, y2, 1, oy-y2+1);
			}
			else
			{
				while(dy > 0)
				{--dy;
					y += yIncr;
					if(p > 0)
					{
						punkt += obj.mkDiv(x++, oy, 1, y-oy);
						p += pru;
						oy = y;
					}
					else p += pr;
				}
				punkt += obj.mkDiv(x2, oy, 1, y2-oy+1);
			}
		}

		return punkt;
	}


return obj;
}