
var ie4 = (document.all && !document.getElementById) ? true : false;
var ie5 = (document.all && document.getElementById) ? true : false;
var ns6 = (!document.all && document.getElementById) ? true : false;
var ns4 = (document.layers) ? true : false;


var at_points;
var at_pointsOfLines;
var at_ds, at_lib, at_SG = null;
var at_started = false;
var at_meterPrPixel, areatoolArea = 0;
var at_LineColor = 'black', at_FillColor = 'red', at_SecondaryFillColor = null, at_FillStyle = 1,
	at_FontColor = 'black', at_FontBgColor = 'white';
var at_LineWidth = 1;
var at_mapLeft = 0, at_mapTop = 0, at_mapWidth = 0, at_mapHeight = 0;
var offSetX, offSetY;
var at_xdown, at_ydown;
var areatoolHandlerFunction = null;

function AreaTool (mapX_min, mapY_min, mapWidth, mapHeight) {
	mapwidth = mapWidth;
	at_mapLeft = mapX_min;
	at_mapTop = mapY_min;
	at_mapWidth = mapWidth;
	at_mapHeight = mapHeight;

	if (ie4 || ie5) {
		offSetX = Math.round(mapWidth/2) + mapX_min;
		offSetY = Math.round(mapHeight/2) + mapY_min;
		at_addSGObj(false);
		var	at_bgLyr = '<img border=0  src="' + toolImgURL + 'spacer.gif" vspace="0" hspace="0"' +
					' width=' + mapWidth + ' height=' + mapHeight + 
					' style="POSITION:ABSOLUTE; LEFT:0; TOP:0' + 
					'; cursor:crosshair' +
					';" ondblclick="areatoolDoubleClicked()" ' +
					'>';

		createLayer('at_bgLyr', null, mapX_min, mapY_min, mapWidth, mapHeight, at_bgLyr, '', 'hidden');
		this.bgLyr = document.all['at_bgLyr'];		
	    this.bgLyr.onkeyup = areatoolKeyUp;
	} else if (ns6) {
		var	at_bgLyr = '<img border=0  src="images/spacer.gif" vspace="0" hspace="0"' +
					' width=' + mapWidth + ' height=' + mapHeight + 
					' style="POSITON:ABSOLUTE; LEFT:' + mapX_min + '; TOP: ' + mapX_min + 
					'; cursor:crosshair' +
					';" ondblclick="areatoolDoubleClicked()" ' +
					'>';
		createLayer('at_bgLyr', null, mapX_min, mapY_min, mapWidth, mapHeight, at_bgLyr, null, 'hidden');
		this.bgLyr = document.getElementById('at_bgLyr');
    	document.onkeyup = areatoolKeyUp;
		at_pointsOfLines = new Array();
	} else if (ns4) {
		createLayer('at_bgLyr', null, mapX_min, mapY_min, mapWidth, mapHeight, null, null, 'hidden');
		this.bgLyr = document.layers['at_bgLyr'];
		this.bgLyr.captureEvents(Event.MOUSEDOWN | Event.MOUSEUP | Event.KEYUP);
	    this.bgLyr.onkeyup = areatoolKeyUp;
		at_pointsOfLines = new Array();
	}

    this.bgLyr.onmousedown = areatoolMouseDown;
    this.bgLyr.onmouseup = areatoolMouseUp;
	this.init = areatoolInit;
	this.start = areatoolStart;
	this.stop = areatoolStop;
	this.reset = areatoolReset;
	this.clearLastLine = areatoolClearLastLine;
	this.setLineWidth = areatoolSetLineWidth;
	this.setLineColor = areatoolSetLineColor;
	this.setFillColor = areatoolSetFillColor;
	this.setSecondaryFillColor = areatoolSetSecondaryFillColor;
	this.setFillStyle = areatoolSetFillStyle;
	this.setFontColor = areatoolSetFontColor;
	this.setFontBgColor = areatoolSetFontBgColor;
	this.getXPoints = areatoolGetXPoints;
	this.getYPoints = areatoolGetYPoints;
	this.getPoints = areatoolGetPoints;
	this.getArea = areatoolGetArea;
	this.showHideBgLyr = areatoolShowHideBgLyr;
	this.addListener = areatoolAddListener;
}

function at_addSGObj (remove) {
	var SG_id = "area_SG";
	var objStr = '';
	if (remove) {
		destroyLayer('at_lyr');
	}	
	createLayer('at_lyr', null, at_mapLeft, at_mapTop, at_mapWidth, at_mapHeight, objStr, '');
	jg3 = new jsGraphics("at_lyr");
	//at_SG = document.all[SG_id];
	//at_SG.SetIdentity();
	//at_SG.Translate(-offSetX, -offSetY, -1);
	//at_SG.mouseEventsEnabled = true;

	//at_ds = at_SG.DrawSurface;
	//at_ds.SaveGraphicsState();
	//at_lib = at_SG.Library;
}

function areatoolInit(newZoom) {
	this.reset();
	at_meterPrPixel = newZoom / mapwidth;
}

function areatoolStart() {
	jg3.clear(); 
	if (!at_started) at_started = true;
	this.showHideBgLyr (true);
}
function areatoolStop() {
	at_started = false;
	this.showHideBgLyr (false);
}
function areatoolReset() {
	areatoolClearAllLines();
	at_points = new Array();
	areatoolArea = 0;
	if (ns4||ns6) { at_pointsOfLines = new Array(); }
	areatoolClearLabel();
}
function areatoolAddListener (handlerFunction) {
	if (handlerFunction != null || handlerFunction != '') {
		areatoolHandlerFunction = handlerFunction;
		if (areatoolHandlerFunction.lastIndexOf(')') == -1) {
			areatoolHandlerFunction += '()';
		} 
	}
}
function areatoolClearLabel () {
	var labelLyr;
	if (ns4) {
		labelLyr = document.layers['at_label'];
	} else if (ns6) {
		labelLyr = document.getElementById('at_label');	
	} else if (ie4 || ie5) {
		labelLyr = document.all['at_label'];
	}
	if (labelLyr) {
		destroyLayer ('at_label')
	}
}
function areatoolShowHideBgLyr (show) {
	if (ie4 || ie5 || ns6) {
		this.bgLyr.style.visibility = (show)? 'visible' : 'hidden';
	} else if (ns4) {
		this.bgLyr.visibility = (show)? 'show' : 'hide';	
	}
}

function areaGetCenterPoint () {
	var sumx = 0, sumy = 0;
	for (var i=0; i < at_points.length; i+=2) {
		sumx += at_points[i];
		sumy += at_points[i+1];
	}
	return new Array(sumx/(at_points.length/2), sumy/(at_points.length/2));
}

function showArea () {
	var center = areaGetCenterPoint ();
	var left, top, width, height;
	var strUnit = ' m';
	var a = Math.round(getArea());
	areatoolArea = a;
	
	if (a > 1000000) {
		a /= 1000000;
		a = new String (a);
		a = a.substring(0, a.indexOf('.') + 5);
		strUnit = ' km';
	}
	a = new String(a);
	var text = '<center><font face="Verdana, Geneva, Arial, Helvetica, sans-serif"  size="0"'
			 	+ ' point-size="8" color="'+ at_FontColor + '">' + a + ' ' + strUnit + '</font>'
				+ '<font face="Verdana, Geneva, Arial, Helvetica, sans-serif" size="0"' 
			 	+ ' point-size="5" color="'+ at_FontColor + '"><sup>2</sup></font></center>';
				
	left = Math.round(center[0] - (8 * (a.length/2)) - 4);
	top = Math.round(center[1] - 10);
	width = Math.round(10 * a.length + 20);
	height = 18;
	if (left < at_mapLeft)	left = at_mapLeft;
	if (top < at_mapTop)	top = at_mapTop;

	createLayer('at_label', null, left, top, width, height, text, at_FontBgColor);
}

function getArea() {
	var area = 0;
	var nPoints = at_points.length;
	if (nPoints < 5) { 
		return 0; 
	} else {
		// Brug mapX_min som x0 (referance punkt)
	    for(var i=0; i < nPoints - 3; i+=2) {
	      // Areal = summen af ((x1 - x0) + (x2 - x0)) /2 * (y2 - y1)
	      area += ((at_points[i] - at_mapTop) + (at_points[i+2] - at_mapTop)) / 2 * (at_points[i+3] - at_points[i+1]);
	    }
	    area -= ((at_points[nPoints-2] - at_mapTop) + (at_points[0] - at_mapTop)) / 2 * (at_points[nPoints-1] - at_points[1]);
		
		area = Math.abs(area) * Math.pow(at_meterPrPixel,2);
		return area;
	}
}

function areatoolGetXPoints () {
	var nPoints = at_points.length;
	var xpoints = new Array();
	if (nPoints > 0) {
		var n = 0;
		for (var i=0; i < nPoints - 1; i+=2) {
			xpoints[n] = at_points[i];
			n++;
		}
	}
	return xpoints;
}
function areatoolGetYPoints () {
	var nPoints = at_points.length;
	var ypoints = new Array();
	if (nPoints > 0) {
		var n = 0;
		for (var i=1; i < nPoints; i+=2) {
			ypoints[n] = at_points[i];
			n++;
		}
	}
	return ypoints;
}
function areatoolGetPoints () {
	return at_points;
}

function areatoolGetArea () {
	return areatoolArea;
}
function areatoolSetFillStyle (newFillStyle) {
	at_FillStyle = newFillStyle;
}
function areatoolSetLineColor (newColor) {
	at_LineColor = newColor;
}
function areatoolSetFillColor (newColor) {
	at_FillColor = newColor;
}
function areatoolSetSecondaryFillColor (newColor) {
	at_SecondaryFillColor = newColor;
}
function areatoolSetLineWidth (newWidth) {
	at_LineWidth = newWidth;
}
function areatoolSetFontColor (newColor) {
	at_FontColor = newColor;
}
function areatoolSetFontBgColor (newColor) {
	at_FontBgColor = newColor;
}
function areatoolDraw (polygon) {
	if (ie4 || ie5) {
		jg3.clear(); 
		var tmpx = ""
		var tmpy = ""

		var nPoints = at_points.length;
		//at_ds.clear();
		if (polygon) {
			var x_array = new Array(nPoints/2);
			var y_array = new Array(nPoints/2);
			jg3.setColor("#ff0000"); // red
			
			if (nPoints > 0) {
				var n = 0;
				for (var i=0; i < nPoints - 1; i+=2) {
					x_array[n] = at_points[i] - at_mapLeft;
					y_array[n] = at_points[i+1] - at_mapTop;
					n++;
				}
			}

			jg3.fillPolygon(x_array, y_array);  
			//jg3.fillPolygon(new Array(236-at_mapLeft,1170-at_mapLeft,1254-at_mapLeft,234-at_mapLeft), new Array(129-at_mapTop,88-at_mapTop,804-at_mapTop,803-at_mapTop));  
			//jg3.fillPolygon(new Array(236,1170,1254,234), new Array(129,88,804,803));  
			jg3.paint();
			
							
		} else {
			jg3.setColor("#ff0000"); // red
			
			
			if (nPoints > 0) {
				var n = 0;
				for (var i=0; i < nPoints - 1; i+=2) {
						if (tmpx != "")
						{
							jg3.drawLine(tmpx - at_mapLeft , tmpy - at_mapTop, at_points[i] - at_mapLeft, at_points[i+1] - at_mapTop); 
						}
						tmpx = at_points[i] ;
						tmpy = at_points[i+1] ;
						
					n++;
				}
			}
			
			jg3.paint();
			//at_ds.lineColor(at_lib[at_LineColor]);
			//at_ds.LineWidth(at_LineWidth);
			//at_ds.Polyline(at_points);
		}
		//at_SG.DrawSurface = at_ds
	} else if (ns4 || ns6) {
		var nPoints = at_points.length;
		if (nPoints > 3) {
			var counter = nPoints/2 - 1;
			var linex, liney, hypo, ang, angx, angy;
			linex = eval(at_points[nPoints-2] - at_points[nPoints-4]);
			liney = eval(at_points[nPoints-1] - at_points[nPoints-3]);
			hypo = Math.sqrt(Math.pow(linex,2) + Math.pow(liney,2));
			ang = Math.atan2(linex,liney);
			angx = Math.cos(ang);
			angy = Math.sin(ang);
			
			var i = 0;
			if (!polygon) {
			for(i=0; i < hypo; i++) {			
				createLayer('areaP' + counter + (i+1),			// id
							 null,								// nestref
							 at_points[nPoints-4] + (angy*i),	// left
							 at_points[nPoints-3] + (i*angx),	// top						 
							 at_LineWidth,					// width
							 at_LineWidth,					// height
							 '',								// content
							 at_LineColor					// forground color
				);				
			}
			at_pointsOfLines[counter] = i;

			} else {
				counter++;
				linex = eval(at_points[nPoints-2] - at_points[0]);
				liney = eval(at_points[nPoints-1] - at_points[1]);
				hypo = Math.sqrt(Math.pow(linex,2) + Math.pow(liney,2));
				ang = Math.atan2(linex,liney);
				angx = Math.cos(ang);
				angy = Math.sin(ang);
				
				for(i=0; i < hypo; i++) {			
					createLayer('areaP' + counter + (i+1),			// id
								 null,								// nestref
								 at_points[0] + (angy*i),	// left
								 at_points[1] + (i*angx),	// top						 
								 at_LineWidth,				// width
								 at_LineWidth,				// height
								 '',								// content
								 at_LineColor				// forground color
					);				
				}
				at_pointsOfLines[counter] = i;
			}
		}
	}
}

function areatoolClearAllLines () {
	if (ie4 || ie5) {
		jg3.clear(); 
//		at_ds.clear();
//		at_SG.DrawSurface = at_ds;
		at_addSGObj(true);
	} else if (ns4 || ns6) {
		var counter = at_pointsOfLines.length;
		if (counter > 0) {
			for (var i=1; i < counter; i++) {
				for (var j=0; j < at_pointsOfLines[i]; j++) {
					destroyLayer('areaP' + i + (j+1));
				}
			}
		}
		at_pointsOfLines = new Array();
	}
}
function areatoolClearLastLine () {
	var nPoints = at_points.length;
	if (nPoints > 3) {
		if (nPoints == 4) {
			areatoolReset();
			return;
		}
		var newPoints = new Array(nPoints-2);
		for (var i=0; i < nPoints - 2; i++) {
			newPoints[i] = at_points[i];
		}
		at_points = newPoints;
		if (ns4 || ns6) {
			var numOfLines = at_pointsOfLines.length;
			var newPointsOfLines = new Array(numOfLines-1);
			for (var i=0; i < at_pointsOfLines[numOfLines-1]; i++) {
				destroyLayer('areaP' + (numOfLines-1) + (i+1));
			}
			for (var i=0; i < numOfLines-1; i++) {
				newPointsOfLines[i] = at_pointsOfLines[i];
			}
			at_pointsOfLines = newPointsOfLines;
		} else if (ie4 || ie5) { areatoolDraw(); }
	}
}

function areatoolDoubleClicked () {
	var nPoints = at_points.length;
	if (ie4||ie5) areatoolClearLastLine();
	if (nPoints != 4) {	areatoolDraw (true); }
	showArea();
	
	if (ThisActiveToolNum == 9 || ThisActiveToolNum == 11 || ThisActiveToolNum == 14)
	{
		
		var reqForm = getReqForm();
		var onloadfilename = reqForm.OnloadGif.value
		var onLoadGifImage = "<table><tr><td><img src='"+ onloadfilename +"' name='OnloadGif' id='OnloadGif' border='0'></td></tr></table>"
	
		if (ThisActiveToolNum == 9)	 {reqForm.DrawType.value = 'region'}
		if (ThisActiveToolNum == 14) {reqForm.PolygonSogning.value = 'ja'}
		
		
		document.all['ShowWaitGif'].innerHTML = onLoadGifImage
		reqForm.DrawLines.value = convertXY(at_points)
		areatoolReset();
		reqForm.submit();
	}
	
	if (areatoolHandlerFunction != null && areatoolHandlerFunction != '') {
		eval(areatoolHandlerFunction);
	}
}

function areatoolMouseDown (e) {
	if ((ns4 && e.which == 1) || (ns6 && e.button == 0) || ((ie4 || ie5) && window.event.button == 1)) {
    	var x = (ns4 || ns6)? e.pageX : event.x+document.body.scrollLeft;
        var y = (ns4 || ns6)? e.pageY : event.y+document.body.scrollTop;
		x = (x)
		if (at_started) {
			var nPoints = at_points.length;
			if (areatoolArea > 0) {
				areatoolReset();
			}
			if (x == at_points[nPoints-2] && y == at_points[nPoints-1]) {
				at_xdown = -1;
				if (ns4) {
					areatoolDoubleClicked();
				}			
				return false;
			}
				var nPoints = at_points.length;
				at_points[nPoints] = x;
				at_points[nPoints+1] = y;
				if (nPoints > 0) {
					areatoolDraw(false);
				}	
			at_xdown = x;
			at_ydown = y;
		}
		return false;
	}
	return true;
}
function areatoolMouseUp (e) {
	if ((ns4 && e.which == 1) || (ns6 && e.button == 0) || ((ie4 || ie5) && window.event.button == 1)) {
    	var x = (ns4 || ns6)? e.pageX : event.x+document.body.scrollLeft;
        var y = (ns4 || ns6)? e.pageY : event.y+document.body.scrollTop;		
	}
	return true;
}

function areatoolKeyUp (e) {
	// For ns6 0g ie 27: Esc, 46: Delete, 110: Del
	// For ns4 27: Esc, 0: Delete, 44: Del
	var charCode;
	if (ns4) {
		charCode = e.which;
		if (charCode == 0 || charCode == 44) {
			areatoolReset();
			return false;
		}
	} else if (ns6) {
		if (!at_started) return false;
		charCode = e.keyCode;
	} else if (ie4||ie5) {
		charCode = window.event.keyCode;
	}
	if (charCode == 27) {
		areatoolClearLastLine();
		return false;
	} else if (charCode == 46 || charCode == 110) {
		areatoolReset();
		return false;
	}	
	return true;
}
