function truncate(d, numberOfDecimals)
{
	return d.toFixed(numberOfDecimals);
}
function measureDistance(x1,y1,x2,y2)
{
	var sp = toMapUnits(x1,y1);
	var ep = toMapUnits(x2,y2);
	
	return GetDistance(sp.x,sp.y,ep.x,ep.y)*distanceConversion;
}
function measureLength(points)
{
	var d = 0;
	for(var i=0; i<points.length-1; i++)
	{
		pt1 = points[i];
		pt2 = points[i+1];
		d+=measureDistance(pt1.x,pt1.y,pt2.x,pt2.y);
	}
	
	return truncate(d, distanceDecimals);
}
function measureArea(points)
{
	var area=0; perimeter=0;
	var n=points.length;
	
	for(var i=0; i<n; i++)
	{
		var j=(i+1)%n;
		
		pt1 = points[i];
		pt2 = points[j];
		
		var sp = toMapUnits(pt1.x,pt1.y);
		var ep = toMapUnits(pt2.x,pt2.y);
		
		area+=sp.x*ep.y-sp.y*ep.x;
		perimeter+=GetDistance(sp.x,sp.y,ep.x,ep.y);
	}
	
	area = Math.abs(area*0.5)*areaConversion;
	
	perimeter = truncate(perimeter*distanceConversion, distanceDecimals);
	area = truncate(area, areaDecimals);
	
	return new Array(perimeter, area);
}

var registered=false;
var measureToolName;

function RegisterMapControlEvent()
{
    if(!registered && window.RegisterRemoveShapesEvent != null)
    {
        RegisterRemoveShapesEvent('ClearMeasureValues');
        registered = true;
    }
}

function DoMeasure()
{
    var md=getObject(measureDiv);
    if(md != null)
    {
        RegisterMapControlEvent();
        	
	    var str = '';
	    var n = GetShapeCount();
	    
	    for(i=0; i<n; i++)
	    {
		    var shape = GetShape(i);
		    if(shape != null)
		    {
			    if(IsMultiPartShape(shape))
			    {
				    for(j=0; j<shape.shapes.length; j++)
				    {
					    str+=MeasureShape(shape.shapes[j]);
				    }				
			    }
			    else
			    {
			        str+=MeasureShape(shape);
			    }
		    }
	    }
	    
	    str = measureHeaderTemplate + str + measureFooterTemplate; 	
	    md.innerHTML=str;	
    }

	return false;
}

function MeasureShape(shape)
{
    var str="";
	var values = new Array();					
	
	switch(shape.type)
	{
		case DrawMode.POINT:
		{
			pt = toMapUnits(shape.xmin,shape.ymin);
			values.push(new Array(x_str, pt.x,''));
			values.push(new Array(y_str, pt.y,''));
			break;
		}
		case DrawMode.LINE:
		{
			var distance = measureDistance(shape.xmin, shape.ymin, shape.xmax, shape.ymax);
			distance = truncate(distance, distanceDecimals);
			values.push(new Array(length_str, formatNumber(distance), distanceShortLabel));
			break;
		}
		case DrawMode.POLY_LINE:
		{
			var points = shape.points;
			var numberOfPoints = points.length;
			
			if(numberOfPoints > 1)
			{
				var totalLength = measureLength(points);
				var lastSegmentLength = measureDistance(points[numberOfPoints-2].x,points[numberOfPoints-2].y,points[numberOfPoints-1].x,points[numberOfPoints-1].y);
				lastSegmentLength = truncate(lastSegmentLength, distanceDecimals);
				
				values.push(new Array(total_str, formatNumber(totalLength), distanceShortLabel));
				values.push(new Array(last_seg_str, formatNumber(lastSegmentLength), distanceShortLabel));
			}
			break;
		}
		case DrawMode.POLYGON:
		{
			var points=shape.points;
			if(points.length > 1)
			{
				measureValues = measureArea(points);
				
				values.push(new Array(area_str, formatNumber(measureValues[1]), areaShortLabel));
				values.push(new Array(perimeter_str, formatNumber(measureValues[0]), distanceShortLabel));
			}					
			break;	
		}
		case DrawMode.CIRCLE:
		{
			if(shape.radius>0)
			{
				var rad = measureDistance(shape.xmin,shape.ymin,shape.xmax,shape.ymax);
				rad = truncate(rad, distanceDecimals);
				
				var perimeter = 2 * Math.PI * rad;
				perimeter = truncate(perimeter, distanceDecimals);
				
				var area = Math.PI * rad * rad * areaConversion / (distanceConversion * distanceConversion);
				area = truncate(area, areaDecimals)
				
				values.push(new Array(area_str, formatNumber(area), areaShortLabel));				
				values.push(new Array(perimeter_str, formatNumber(perimeter), distanceShortLabel));
				values.push(new Array(radius_str, formatNumber(rad), distanceShortLabel));

			}
			break;
		}
		case DrawMode.RECTANGLE:
		{
			if(shape.xmin>0 && shape.xmax>0)
			{
				var height = measureDistance(shape.xmin, shape.ymin, shape.xmin, shape.ymax);
				var width  = measureDistance(shape.xmin, shape.ymin, shape.xmax, shape.ymin);
				var perimeter  = truncate(2*height + 2*width, areaDecimals);
            
	            var area = (height * width * areaConversion)/(distanceConversion * distanceConversion);
				area = Math.abs(truncate(area, areaDecimals));
				
				values.push(new Array(area_str, formatNumber(area), areaShortLabel));				
				values.push(new Array(perimeter_str, formatNumber(perimeter), distanceShortLabel));
			}
			break;
		}
	}
	
	if(values.length>0)
	{
		str+=AddContent(values, i+1);	
    }
    return str;
}

function AddContent(values, ind)
{
	var str=measureRowHeaderTemplate.replace("{0}",ind);
	for(var i=0;i<values.length;i++)
		str+=measureRowTemplate.replace("{0}",values[i][0]).replace("{1}",values[i][1]).replace("{2}",values[i][2]);
	return str;
}

function formatNumber(nStr)
{
	if(window.measureFormatRegex && measureFormatRegex.length>1){
		//Format the number using the regex
	}
	else
	{
		nStr += '';
		x = nStr.split('.');
		x1 = x[0];
		x2 = x.length > 1 ? '.' + x[1] : '';
		var rgx = /(\d+)(\d{3})/;
		
		while (rgx.test(x1)) 
		{
			x1 = x1.replace(rgx, '$1' + ',' + '$2');
		}
		return x1 + x2;
	}
}

function ClearMeasure()
{
	RemoveAllShapes();
}

function ClearMeasureValues()
{
	var md=getObject(measureDiv);
	if(md){md.innerHTML='';}
}

function ChangeUnits()
{
	distanceUnitsDropDown=getObject(distanceUnitControlId);
	if(distanceUnitsDropDown){
		ind=distanceUnitsDropDown.selectedIndex;
		if(ind>=0 && ind<distanceUnitAttributes.length){
			distanceConversion=parseFloat(distanceUnitAttributes[ind][0]);
			distanceShortLabel=distanceUnitAttributes[ind][1];
			distanceDecimals=parseInt(distanceUnitAttributes[ind][2]);
		}
	}
	
	areaUnitsDropDown=getObject(areaUnitControlId);
	if(areaUnitsDropDown)
	{
		ind=areaUnitsDropDown.selectedIndex;
		if(ind>=0 && ind<areaUnitAttributes.length)
		{
			areaConversion=parseFloat(areaUnitAttributes[ind][0]);	
			areaShortLabel=areaUnitAttributes[ind][1];
			areaDeimals=parseFloat(areaUnitAttributes[ind][2]);		
		}
	}
	
	var md=getObject(measureDiv);
	if(md){md.innerHTML='';}

	DoMeasure();	
}

function measureCallback(response)
{
    hideLoading();
    
    var md=getObject(measureDiv);
    
    if(md != null)
    {
        md.innerHTML=response;
    }
}




