
function handleMouseDown(evt) {

	var eventX;
	var eventY;

	if (m_sClientBrowserType != 'IE') {
		eventX = evt.clientX + window.pageXOffset;
		eventY = evt.clientY + window.pageYOffset;
	} else {
		eventX = event.clientX + document.documentElement.scrollLeft;
		eventY = event.clientY + document.documentElement.scrollTop;
	}
	// Check to see if click is over map
	if (!(isEventOverMap(eventX, eventY))) {
		return;
	} 

	switch(m_iToolMode) {
		case 1: // zoom in mode
		case 4: // select box
		case 6: //buff
			if (m_sClientBrowserType == 'IE') {
	  		// For IE, a call to "setCapture" is made to ensure that
				// new IE dragging events do not interfere with capturing 
				// the mousemove events -- effectively, this turns off 
				// drag and drop events temporarily.
				myMap.getMapObj().setCapture(); 
			}
			m_zbxZoom.show();
			m_zbxZoom.start(eventX, eventY);
			break;
		case 2: // zoom out mode
			fnMapTools(cvtX(parseFloat(eventX) - myMap.getMapLeft()), cvtY(myMap.getMapTop() + parseFloat(myMap.getHeight()) - parseFloat(eventY)), 'out')
			break;
		case 3: // pan map mode
			//fnMapTools(cvtX(parseFloat(eventX) - myMap.getMapLeft()), cvtY(myMap.getMapTop() + parseFloat(myMap.getHeight()) - parseFloat(eventY)), 'pan')
	            fnHideDHTML();
	            draggingThing=myMap.getMapObj(); //getDragParent(evt.srcElement || evt.target); 
	            offsetX=eventX-draggingThing.offsetLeft;
	            offsetY=eventY-draggingThing.offsetTop;
	            dragStartPnt = new point(cvtX(parseFloat(eventX)), cvtY(parseFloat(myMap.getHeight()) - parseFloat(eventY)));
          		draggingThing.style.cursor = 'url(images/closedhand.cur), auto;';
				if ((m_sClientBrowserType == 'IE')) {
			        draggingThing.setCapture();
				}
			break;
		case 5: //measure
			if (m_sClientBrowserType == 'IE') {
	  		// For IE, a call to "setCapture" is made to ensure that
				// new IE dragging events do not interfere with capturing 
				// the mousemove events -- effectively, this turns off 
				// drag and drop events temporarily.
			myMap.getMapObj().setCapture(); 
			}
			jg.setColor("#ff00ff") //inprocess line
			dl.setColor("#00FFFF") //stored line
			if (newLine == true) { //clear line
				m_msrLineTotal.innerHTML = 0;
				xTotal = 0;
				xLen = 0;
				lineX.length = 0;
				lineY.length = 0;
				lineSegCount = 0;
				newLine = false;
				m_msrLine.show();
				m_drawLine.hide();
				m_drawLine.clear();
			} else {  //save values for display
				xTotal = toMapLength(m_drawLine.polylen()) + toMapLength(m_msrLine.len());
				fnMeasureConvertTotal(xTotal);
				m_drawLine.show();
				lineSegCount += 1;
			}
			lineX.push(eventX - myMap.getMapLeft()); //store values
			lineY.push(eventY - myMap.getMapTop());
			m_msrLine.start(eventX - myMap.getMapLeft() , eventY - myMap.getMapTop())
			m_msrLineLen.innerHTML = 0;	
			if (lineSegCount > 0) {  //draw saved line
				m_drawLine.drawPoly(lineX, lineY, lineSegCount); 
			}
			break;
		case 7: //buffer dynamic polyline mode
			if (m_sClientBrowserType == 'IE') {
	  		// For IE, a call to "setCapture" is made to ensure that
				// new IE dragging events do not interfere with capturing 
				// the mousemove events -- effectively, this turns off 
				// drag and drop events temporarily.
			myMap.getMapObj().setCapture(); 
			}
			jg.setColor("#ff00ff") //inprocess line
			dl.setColor("#00FFFF") //stored line	
			if (newLine == true) { //clear line
				//xTotal = 0;
				//xLen = 0;
			    lineSegCount = 0;
			    lineX.length = 0;
				lineY.length = 0;
				pntX.length = 0;
				pntY.length = 0;
				newLine = false;
				m_msrLine.show();
				m_drawLine.hide();
				m_drawLine.clear();
			} else {  //save values for display
			    //alert(xLen)
			    //xTotal = toMapLength(m_drawLine.polylen()) + toMapLength(m_msrLine.len());
				m_drawLine.show();
				lineSegCount += 1;
			}
			lineX.push(eventX - myMap.getMapLeft()); //store values
			lineY.push(eventY - myMap.getMapTop());
			pntX.push(cvtX(parseFloat(eventX) - myMap.getMapLeft()))
			pntY.push(cvtY(myMap.getMapTop() + parseFloat(myMap.getHeight()) - parseFloat(eventY)))
			m_msrLine.start(eventX - myMap.getMapLeft() , eventY - myMap.getMapTop())
			if (lineSegCount > 0) {  //draw saved line
				m_drawLine.drawPoly(lineX, lineY, lineSegCount); 
			}
			break;
		case 8: //buffer dynamic point mode
			  pntX.length = 0;
			  pntY.length = 0;
			  pntX.push(cvtX(parseFloat(eventX) - myMap.getMapLeft()))
			  pntY.push(cvtY(myMap.getMapTop() + parseFloat(myMap.getHeight()) - parseFloat(eventY)))
			  myMap.bufferPoint(pntX, pntY, BufferUnits.value, BufferDistance.value);
			break;
		case 9: //identify leg/house/sen map click
			  pntX.length = 0;
			  pntY.length = 0;
			  pntX.push(cvtX(parseFloat(eventX) - myMap.getMapLeft()))
			  pntY.push(cvtY(myMap.getMapTop() + parseFloat(myMap.getHeight()) - parseFloat(eventY)))
			  myMap.IdentifyHS(pntX, pntY)
		  break;
	    case 10: //single site identify
	    	var x = fnCheckVis('YES')
			if (x == true) {
			  pntX.length = 0;
			  pntY.length = 0;
			  pntX.push(cvtX(parseFloat(eventX) - myMap.getMapLeft()));
			  pntY.push(cvtY(myMap.getMapTop() + parseFloat(myMap.getHeight()) - parseFloat(eventY)));
			  myMap.IdentifyPoint(pntX, pntY);
			} else {
				alert('You must have at least 1 layer visible to select Point feature!');
			}
		  break;
	}
	return false;
}

function handleMouseMove(evt) {

	var eventX;
	var eventY;

	if (m_sClientBrowserType != 'IE') {
		eventX = evt.clientX + window.pageXOffset;
		eventY = evt.clientY + window.pageYOffset;
	} else {
		eventX = event.clientX + document.documentElement.scrollLeft;
		eventY = event.clientY + document.documentElement.scrollTop;
	}
    // If the mouse isn't currently over the map, we
    // have nothing to do.
	if (!(isEventOverMap(eventX, eventY))) {
		return;
	} 		
	
	//reportCoords(m_mapViewer.toMapPoint(eventX, eventY)); // update the textbox to reflect
																																												 // the current coordinates.
    // If the current tool is zoom in and a zoombox is in progress, update
    // the zoom box.
  if (m_iToolMode == 1 || m_iToolMode == 4 || m_iToolMode == 6)	{
		if (m_zbxZoom.isInProgress()) {
			m_zbxZoom.update(eventX, eventY);}
  } else {if (m_iToolMode==3){
		evt=evt || event;
		if (draggingThing) {
			draggingThing.style.top=(eventY-offsetY)+'px';
			draggingThing.style.left=(eventX-offsetX)+'px';
			return true;
		}else {
       		myMap.getMapObj().style.cursor = 'url(images/openhand.cur), auto;'; 
		}
  } else {if (m_iToolMode == 5) {
		m_msrLine.update(eventX - myMap.getMapLeft(), eventY - myMap.getMapTop());
		xLen = toMapLength(m_msrLine.len());
		fnMeasureConvertLen(xLen);
  } else {if (m_iToolMode == 7) {
		m_msrLine.update(eventX - myMap.getMapLeft(), eventY - myMap.getMapTop());
  };};};}
}

function handleMouseUp(evt) {
	
	var eventX;
	var eventY;

	if (m_sClientBrowserType != 'IE') {
		eventX = evt.clientX + window.pageXOffset;
		eventY = evt.clientY + window.pageYOffset;
	} else {
		eventX = event.clientX + document.documentElement.scrollLeft;
		eventY = event.clientY + document.documentElement.scrollTop;
	}
	
	
	if (m_iToolMode == 5 || m_iToolMode == 7) {
		if (!(m_msrLine.isInProgress())) {
			return;
		}
		if (m_sClientBrowserType == 'IE') {
			document.releaseCapture();
		}	
		//m_msrLine.stop();
		//fnViewMeasure(parseInt(toMapLength(m_msrLine.len())))
		return;
	}	
		// If a ZoomBox is not in progress, we've got nothing
		// to do.
		
	if (m_iToolMode==3){
	  if (draggingThing) {
      draggingThing.style.cursor = 'url(images/openhand.cur), auto;';
	  var moveY = eventY-offsetY; //+'px';
	  var moveX = eventX-offsetX; //+'px';
	  var mtop=myMap.getMapTop();
	  var mLeft=myMap.getMapLeft();
	  dragEndPnt = new point(cvtX(parseFloat(eventX)), cvtY(parseFloat(myMap.getHeight()) - parseFloat(eventY)))
      setPanValues(dragStartPnt.x, dragStartPnt.y, dragEndPnt.x, dragEndPnt.y);
	  //document.getElementById("divLoading").style.display = 'block';
      //DefaultMap.LoadMap(xmin,ymin,xmax,ymax,setMap);
 	  draggingThing=null;
	  }
 	  if ((m_sClientBrowserType == 'IE')) {
		  document.releaseCapture();
	  }  
	}
	
	if (!(m_iToolMode == 1 || m_iToolMode == 4 || m_iToolMode == 6))  {
		return;
	}
	
	if (!(m_zbxZoom.isInProgress())) {
		return;
	}
		// Release the capture that was set in the mousedown
		// handler (again, this is something that we have to do because
		// of drag events in IE).
	if (m_sClientBrowserType == 'IE'){
		document.releaseCapture();
	}

		// Stop the current effect.
	m_zbxZoom.stop();

		// If the width of the zoom box is less than five pixels,
		// treat is as a single click and zoom in one map level.
		// Otherwise, set the extent to the zoom box.
	if ((Math.abs(m_zbxZoom.getStartX() - m_zbxZoom.getEndX()) < 5) && (Math.abs(m_zbxZoom.getStartY() - m_zbxZoom.getEndY()) < 5))  {	
		//var ptUserClick = m_mapViewer.toMapPoint(m_zbxZoom.getStartX(), m_zbxZoom.getStartY());
		//if (m_mapViewer.getLevel() == 1) {   //if we reach the minimum zoom level, zoom a fixed amount.
		  //m_mapViewer.zoom(0.5);
		//} else {
		//	m_mapViewer.setLevel(m_mapViewer.getLevel() - 1);
     //}
		//m_mapViewer.recenter(ptUserClick);
		
		if (m_iToolMode == 1) {
		  fnMapTools(cvtX(parseFloat(eventX) - myMap.getMapLeft()), cvtY(myMap.getMapTop() + parseFloat(myMap.getHeight()) - parseFloat(eventY)), 'in')
		} else {if (m_iToolMode == 6) {
		  return;
		} else {
		  //fnIdentPnt(evt)
		};}
	} else {
		setZextRect(m_zbxZoom.xmin(),m_zbxZoom.xmax(),m_zbxZoom.ymin(),m_zbxZoom.ymax())
	}
 m_zbxZoom.hide();
	//submit();
}

function handleMouseDbl() {
	if (m_iToolMode == 5) {
		newLine = true;
		m_msrLine.stop();
		m_msrLine.hide();
	} else {if (m_iToolMode == 7) {
		newLine = true;
		m_msrLine.stop();
		m_msrLine.hide();
		m_msrLine.clear();
		m_drawLine.clear();
		if (m_sClientBrowserType != 'IE') {
		  pntX.pop();
		  pntY.pop();
		}
		myMap.bufferPolyline(pntX, pntY, BufferUnits.value, BufferDistance.value)
		;};}
}

function cvtX(e) {
return e * myMap.getDeltaX()/myMap.getWidth() + parseFloat(myMap.getXmin())
}

function cvtY(e) {
return e * myMap.getDeltaY()/myMap.getHeight() + parseFloat(myMap.getYmin())
}

function toMapLength(x) {
	x  = x*myMap.getDeltaX()/myMap.getWidth()
	return (x)
}

function fnMeasureConvertLen(x) {
	var z;
	switch(m_munits){
		case "meter":
			z = x
		break;
		case "feet":
			z = x * 3.2808399
		break;
		case "mile":
			z = x * 0.000621371192
		break;
	}
	m_msrLineLen.innerHTML = Number(z).toFixed(2)
}

function fnMeasureConvertTotal(x) {
	var z;
	switch(m_munits){
		case "meter":
		    z = x
		break;
		case "feet":
			z = x * 3.2808399
		break;
		case "mile":
			z = x * 0.000621371192
		break;
	}
	m_msrLineTotal.innerHTML = Number(z).toFixed(2)
}

function fnChangeUnits(i) {
	if (i != m_munits) {
		m_munits = i
		//document.getElementById("lblUnits").innerHTML = m_munits
		fnMeasureConvertLen(xLen)
		fnMeasureConvertTotal(xTotal)
	}
}

function setPanValues(startX, startY, endX, endY) {
	var xMinStart = myMap.getXmin();
	var yMinStart = myMap.getYmin();
	var xMaxStart = myMap.getXmax();
	var yMaxStart = myMap.getYmax();
		//Update values to new extent to reload map	to	
	fnSetPreExt(myMap);
	with (myMap){
	  setXmin(xMinStart + startX - endX)
	  setXmax(xMaxStart + startX - endX)
	  setYmin(yMinStart + startY - endY)
	  setYmax(yMaxStart + startY - endY)
	  setExtent();
	}
}
