function MapCompute(advMaps)
{
	var obj = new Object();

	obj.Div				= new Array('ComputeLine', 'ComputeMsg', 'IdFrameMap'); /* div na mapie do rysowania lini, div dla komunikatu, advMaps.IdFrameMap - komunikat na mapie, '' - komunikat poza mapa*/
	obj.PolyLineMsg1	= '<div style="border:1px solid #888; background:#eee; font-family:verdana; font-size:8pt; padding:3px 5px 3px 5px;">Zbyt mało punktów by wyznaczyć długość: <b>wskaż pierwszy punkt</b>.</div>';
	obj.PolyLineMsg2	= '<div style="border:1px solid #888; background:#eee; font-family:verdana; font-size:8pt; padding:3px 5px 3px 5px;">Zbyt mało punktów by wyznaczyć długość: <b>wskaż kolejny punkt</b>.&nbsp;<img src="img/punkt_mapa_close.gif" width="11" height="11" border="0" alt="" style="cursor:pointer" onclick="parent.advMapCompute.ComputeClear();"></div>';
	obj.PolyLineMsg3	= '<div style="border:1px solid #888; background:#eee; font-family:verdana; font-size:8pt; padding:3px 5px 3px 5px;">Wskazuj kolejne punkty&nbsp;-&nbsp;pkt: <b><<ComputeCount>></b> długość: <b><<ComputeLength>></b>&nbsp;<span style="font-weight:bold; color:red;">&nbsp;-&nbsp;pomiar przybliżony!</span>&nbsp;<img src="img/punkt_mapa_close.gif" width="11" height="11" border="0" alt="" style="cursor:pointer" onclick="parent.advMapCompute.ComputeClear();"></div>';
	obj.PolygonAreaMsg1	= '<div style="border:1px solid #888; background:#eee; font-family:verdana; font-size:8pt; padding:3px 5px 3px 5px;">Zbyt mało punktów by wyznaczyć powierzchnię! <b>Wskaż minimum trzy punkty.</b></div>';
	obj.PolygonAreaMsg2	= '<div style="border:1px solid #888; background:#eee; font-family:verdana; font-size:8pt; padding:3px 5px 3px 5px;">Wskazuj kolejne punkty&nbsp;-&nbsp;pkt: <b><<ComputeCount>></b> powierzchnia: <b><<ComputeArea>></b>&nbsp;<span style="font-weight:bold; color:red;">&nbsp;-&nbsp;pomiar przybliżony!&nbsp;</span>&nbsp;<img src="img/punkt_mapa_close.gif" width="11" height="11" border="0" alt="" style="cursor:pointer" onclick="parent.advMapCompute.ComputeClear();"></div>';
	obj.PolyWidthHeight	= 10; // szerokość i wysokość punktu osadzanego na mapie po kliknięciu szerokosc = wysokość
	obj.PolyPointStart	= '<img src="img/punkt_mapa_start.gif" width="10" height="10" border="0" alt="">'; // obiekt punktu poczatkowego
	obj.PolyPointNext	= '<img src="img/punkt_mapa.gif" width="10" height="10" border="0" alt="">'; // obiekt punktu kolejnego
	

	var ArrayXYKursor = new Array();

	//---------------------------------------------
	obj.EventMouseUp = function() // co gdy klawisz myszy UP
	//---------------------------------------------
	{
		if(!advMaps.OnLoad) return ;
		if(advMaps.Mode == 4)
		{
			tA = new Array();
			tA[0] = advMaps.MouseX;  //x ekranu
			tA[1] = advMaps.MouseY;  //y ekranu
			tA[2] = advMaps.MapMx + parseInt(advMaps.MapMw*advMaps.MouseX/advMaps.MapIw);  //mx ekranu
			tA[3] = advMaps.MapMy + parseInt((advMaps.MapIh/advMaps.MapIw)*advMaps.MapMw*(advMaps.MapIh-advMaps.MouseY)/advMaps.MapIh);  //my ekranu

			ArrayXYKursor.push(tA);
			obj.ComputePolyLineLength(ArrayXYKursor);
		}
		else if(advMaps.Mode == 5)
		{
			tA = new Array();
			tA[0] = advMaps.MouseX;  //x ekranu
			tA[1] = advMaps.MouseY;  //y ekranu
			tA[2] = advMaps.MapMx + parseInt(advMaps.MapMw*advMaps.MouseX/advMaps.MapIw);;  //mx ekranu
			tA[3] = advMaps.MapMy + parseInt((advMaps.MapIh/advMaps.MapIw)*advMaps.MapMw*(advMaps.MapIh-advMaps.MouseY)/advMaps.MapIh);  //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 = '';
		
		// ukrywanie okna komunikatu - czszczenie zawartosci

		advMaps.xInnerHtml(obj.Div[2], obj.Div[1], html);
		advMaps.xDisplayNone(obj.Div[2], obj.Div[1]);

		// ukryj pole rysowanych elementów
		advMaps.xDisplayNone(advMaps.IdFrameMap, obj.Div[0]);
		advMaps.xInnerHtml(advMaps.IdFrameMap, obj.Div[0], html);

		if(advMaps.Mode == 4) obj.ComputePolyLineLength(ArrayXYKursor);
		else if(advMaps.Mode == 5) 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(obj.Div[2], obj.Div[1], obj.PolygonAreaMsg1);
			advMaps.xDisplayBlock(obj.Div[2], obj.Div[1]);

			var newDiv;
			if(tableLen > 0)
			{
				var myDiv = advMaps.xGetElementById(advMaps.IdFrameMap, obj.Div[0]);
				if(myDiv)
				{
					if(advMaps.IdFrameMap) newDiv = window.frames[advMaps.IdFrameMap].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))+'px; left:'+(tablica[(tableLen-1)][0]-Math.round(obj.PolyWidthHeight/2))+'px; z-index:1;">'+((tableLen < 2)?obj.PolyPointStart:obj.PolyPointNext)+'</div>';
					myDiv.appendChild(newDiv);

					if(tableLen > 1)
					{
						if(advMaps.IdFrameMap) newDiv = window.frames[advMaps.IdFrameMap].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.IdFrameMap, obj.Div[0]);

			}

		}
		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(obj.Div[2], obj.Div[1], txt);
			advMaps.xDisplayBlock(obj.Div[2], obj.Div[1]);


			var myDiv = advMaps.xGetElementById(advMaps.IdFrameMap, obj.Div[0]);
			if(myDiv)
			{
				if(advMaps.IdFrameMap) newDiv = window.frames[advMaps.IdFrameMap].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))+'px; left:'+(tablica[(tableLen-1)][0]-Math.round(obj.PolyWidthHeight/2))+'px; z-index:1;">'+obj.PolyPointNext+'</div>';
				myDiv.appendChild(newDiv);

				if(advMaps.IdFrameMap) newDiv = window.frames[advMaps.IdFrameMap].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.IdFrameMap) elemDel = window.frames[advMaps.IdFrameMap].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.IdFrameMap) newDiv = window.frames[advMaps.IdFrameMap].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.IdFrameMap, obj.Div[0]);
			advMaps.xDisplayBlock(advMaps.IdFrameMap, obj.Div[0]);

		}
	}


	// 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(obj.Div[2], obj.Div[1], obj.PolyLineMsg1);
			else advMaps.xInnerHtml(obj.Div[2], obj.Div[1], obj.PolyLineMsg2);
			advMaps.xDisplayBlock(obj.Div[2], obj.Div[1]);

			var newDiv;

			if(tableLen > 0)
			{
				var myDiv = advMaps.xGetElementById(advMaps.IdFrameMap, obj.Div[0]);
				if(myDiv)
				{
					if(advMaps.IdFrameMap) newDiv = window.frames[advMaps.IdFrameMap].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))+'px; left:'+(tablica[(tableLen-1)][0]-Math.round(obj.PolyWidthHeight/2))+'px; z-index:1;">'+obj.PolyPointStart+'</div>';
					myDiv.appendChild(newDiv);
				}
			}

			advMaps.xDisplayBlock(advMaps.IdFrameMap, obj.Div[0]);
		}
		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(obj.Div[2], obj.Div[1], txt);
			advMaps.xDisplayBlock(obj.Div[2], obj.Div[1]);

			var myDiv = advMaps.xGetElementById(advMaps.IdFrameMap, obj.Div[0]);
			if(myDiv)
			{
				var newDiv;
				if(advMaps.IdFrameMap) newDiv = window.frames[advMaps.IdFrameMap].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))+'px; left:'+(tablica[(tableLen-1)][0]-Math.round(obj.PolyWidthHeight/2))+'px; z-index:1;">'+obj.PolyPointNext+'</div>';
				myDiv.appendChild(newDiv);

				if(advMaps.IdFrameMap) newDiv = window.frames[advMaps.IdFrameMap].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.IdFrameMap, obj.Div[0]);
		}
	}



	//---------------------------------------------
	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;
}