////////////////////////////////////////////////
// Write by blackbing@gmail.com 2008/08/12    //
// version 0.1                                //
////////////////////////////////////////////////
function UDraw(_UMap)
{
	var me = this;
	var canvas, canvasExt, plineCtx, plineCtxExt;
	var imgPath = "js/urmapExt/img/";
	//var imgPath = "http://192.168.10.50/urmapExt/img/";
	//var imgPath = "http://211.21.21.84/bingotest/urmapExt/img/";
	var isIE = !window.opera&&navigator.userAgent.indexOf('MSIE')>=0;
	var wheelSetTime = 0;
	var mapDiv = _UMap.baseMapDiv;
	var canvas =  mapDiv.parentNode.childNodes[2];
	var ready = false;
	var containerOffset = null;
	var chkNullObj = function(obj){
		var chk = true;
		for(var i in obj){
			chk = false;
			break;
		}
		return chk;
	};
	var adjustMousePosition = function(mobj){
		if(!containerOffset){
			containerOffset = offset(_UMap.container)
		}
		mobj.x -= containerOffset.left;
		mobj.y -= containerOffset.top;
		return mobj;
	};
	var offset = function(elem){
		var userAgent = navigator.userAgent.toLowerCase();
		var browser = {
			safari: /webkit/.test( userAgent ),
			opera: /opera/.test( userAgent ),
			msie: /msie/.test( userAgent ) && !/opera/.test( userAgent ),
			mozilla: /mozilla/.test( userAgent ) && !/(compatible|webkit)/.test( userAgent )
		}
		var left = 0, top = 0, results;
		if(elem ) with ( browser ) {
			try{
				var parent    = elem.parentNode,    
					offsetChild  = elem,  
					offsetParent = elem.offsetParent,  
					doc       = elem.ownerDocument,  
					safari2      = safari && parseInt(version) < 522 && !/adobeair/i.test(userAgent),
					fixed = elem.style.position == 'fixed';
				if(elem.getBoundingClientRect){
					var box = elem.getBoundingClientRect();
					add(box.left + Math.max(  
						doc.documentElement.scrollLeft, doc.body.scrollLeft),  
						        box.top  + Math.max(  
						doc.documentElement.scrollTop,  doc.body.scrollTop));  
					add( -doc.documentElement.clientLeft, -doc.documentElement.clientTop );
				}else{
					add( elem.offsetLeft, elem.offsetTop );
					while ( offsetParent ) {
						add( offsetParent.offsetLeft, offsetParent.offsetTop );
						if ( mozilla && !/^t(able|d|h)$/i.test(offsetParent.tagName) || safari && !safari2 )
						border( offsetParent );
						if ( !fixed && css(offsetParent, "position") == "fixed" )
							fixed = true;
						offsetChild  = /^body$/i.test(offsetParent.tagName) ? offsetChild : offsetParent;
						offsetParent = offsetParent.offsetParent;
					}
					while ( parent && parent.tagName && !/^body|html$/i.test(parent.tagName) ) {
						if ( !/^inline|table.*$/i.test(parent.style.display) )
							add( -parent.scrollLeft, -parent.scrollTop );
						if ( mozilla && parent.style.overflow != "visible" )
							border( parent );
						parent = parent.parentNode;
					}
					if ( (safari2 && (fixed || (offsetChild.style.position) == "absolute")) ||
						(mozilla && (offsetChild.style.position) != "absolute") )
							add( -doc.body.offsetLeft, -doc.body.offsetTop );
					if ( fixed )
						add(Math.max(doc.documentElement.scrollLeft, doc.body.scrollLeft),
							Math.max(doc.documentElement.scrollTop,  doc.body.scrollTop));
				}
			}catch(e){}
		}
		results = { top: top, left: left };
		function border(elem) {
			add( elem.style.borderLeftWidth, elem.style.borderTopWidth );
		}
		function add(l, t) {  
			left += parseInt(l, 10) || 0;  
			top += parseInt(t, 10) || 0;  
		}  
		
		return results;
	};
	var init = (function(){
		if(!canvas.getContext && typeof G_vmlCanvasManager!='undefined')
			canvas = G_vmlCanvasManager.initElement(canvas);
		if(!plineCtx)
			plineCtx = canvas.getContext('2d');
		if(isIE)
			CollectGarbage();
	})();
	//varible
	this.chkNullObj = chkNullObj;
	this.adjustMousePosition = adjustMousePosition;
	this._UMap = _UMap;
	this.isIE = isIE;
	//this.container = container;
	this.canvas = canvas;
	this.plineCtx = plineCtx;
	this.imgPath = imgPath;
	this.ready = ready;
}
UDraw.prototype.init = function(){
	var me = this, 
		_UMap = this._UMap, 
		mapDiv = _UMap.baseMapDiv.parentNode, 
		container = this.container, 
		isIE = this.isIE, canvasExt, 
		canvas = this.canvas, 
		plineCtx = this.plineCtx, 
		imgPath = this.imgPath,
		plineCtxExt, 
		drawType = "map";
	//提示div
	var tipDiv = document.createElement('div');
		tipDiv.className = "umnoprint";
		tipDiv.style.cssText = "display:none;position:absolute;top:-100px;font-size:12px;left:-100px;border:solid black 1px;padding:2px;background-color:#CCC;filter: alpha(opacity=70);-moz-opacity: 0.7;KhtmlOpacity: .7;opacity: .7;";
		_UMap.container.appendChild(tipDiv);
	var drawPointToolDiv = document.createElement('div');
		drawPointToolDiv.style.cssText = "display:none;position:absolute;top:-100px;left:-100px;border:solid black 1px;padding:2px;background-color:#FFF;filter: alpha(opacity=90);-moz-opacity: 0.9;KhtmlOpacity: .9;opacity: .9;";
		//drawPointToolDiv.innerHTML = "增加點";
		var drawPointToolDivAdd = document.createElement('div');
		drawPointToolDivAdd.style.cssText = "font-size:13px;cursor:pointer;";
		drawPointToolDivAdd.innerHTML = "增加點";
		drawPointToolDiv.appendChild(drawPointToolDivAdd);
		_Event.addEvent(drawPointToolDivAdd, 'mouseover', function(){this.style.backgroundColor = "#CCC"});
		_Event.addEvent(drawPointToolDivAdd, 'mouseout', function(){this.style.backgroundColor = "#FFF"});
		var drawPointToolDivDel = document.createElement('div');
		drawPointToolDivDel.style.cssText = "font-size:13px;cursor:pointer;";
		drawPointToolDivDel.innerHTML = "刪除點";
		drawPointToolDiv.appendChild(drawPointToolDivDel);
		_Event.addEvent(drawPointToolDivDel, 'mouseover', function(){this.style.backgroundColor = "#CCC"});
		_Event.addEvent(drawPointToolDivDel, 'mouseout', function(){this.style.backgroundColor = "#FFF"});
		
		_UMap.container.appendChild(drawPointToolDiv);
	var emptyMarkerIcon = new UIcon();
		//emptyMarkerIcon.image = imgPath+'emptyMarkerRound0.png';
		emptyMarkerIcon.image = imgPath+'emptyMarkerCircle0.png';
		emptyMarkerIcon.iconWidth = '12';
		emptyMarkerIcon.iconHeight = '12';
		emptyMarkerIcon.iconAnchor = new UPoint(6, 6);
		emptyMarkerIcon.infoWindowAnchor = new UPoint(6, 6);
	var emptyMarkerIconMouseOver = new UIcon(emptyMarkerIcon);
		//emptyMarkerIconMouseOver.image = imgPath+'emptyMarkerRound1.png';
		emptyMarkerIconMouseOver.image = imgPath+'emptyMarkerCircle1.png';
	var startPointMarker = null,
		tipDivPanPx = 20,//tipDiv的偏移量
		mouseDownPoint = {},
		mouseCurrentPoint = {},
		isMouseDown = false,
		mapDivOffsetLeft = _UMap.mapDivOffsetLeft(),
		mapDivOffsetTop = _UMap.mapDivOffsetTop(),
		overlay = {},//畫玩圖形之後的overlay
		drawedCallback = null,//畫完圖形之後的callback function
		latlngArray = [],//經緯度
		countDistant = 0.0,//polyline或polygon計算折線的長度(公尺)
		pointUIcon = null,
		showTooltip = true,//是否顯示提示文字
		Draw = {},
		drawingState = 'ready',
		isSaveDrawRecord = true;
	var enableEditableEvent = false;//是否開啟編輯事件(目前僅有polygon)
	Draw.record = {};
	Draw.callback = null;
	Draw.currentRecordId = '';
	Draw.markerMovedFunction = function(newLatlng, rId, pId){
		var modeStr = Draw.record[rId]['type'];
		var record = Draw.record[rId]['overlay'];
		var Overlay;
		pen.borderColor = record.borderColor?record.borderColor:record.color;
 		pen.borderWeight = record.borderWeight?record.borderWeight:record.weight;
 		pen.borderOpacity = record.borderOpacity?record.borderOpacity:record.opacity;
 		pen.fillColor = record.fillColor?record.fillColor:pen.fillColor;
 		pen.fillOpacity = record.fillOpacity?record.fillOpacity:pen.fillOpacity;
 		_canvasExt.initLine();
 		//log(pen);
		switch(modeStr){
			case('bound'):
			case('polygon'):
				Overlay = new UPolygon(newLatlng, pen.borderColor, pen.borderWeight, pen.borderOpacity, pen.fillColor, pen.fillOpacity);
				//overlay = new UPolygon(points, pen.borderColor, pen.borderWeight, pen.borderOpacity, pen.fillColor, pen.fillOpacity);
			
				break;
			case('polyline'):
				Overlay = new UPolyline(newLatlng, pen.borderColor, pen.borderWeight, pen.borderOpacity);
			//overlay = new UPolyline(latlngArray, pen.borderColor, pen.borderWeight, pen.borderOpacity);

				break;
		}
		//log(record);
		_UMap.removeOverlay(Draw.record[rId]['overlay']);
		//Draw.record[rId]['overlay'] = Overlay;
		setDrawRecord({
			id : rId,
			type: modeStr,
			overlay : Overlay
		});
		_UMap.addOverlay(Overlay);
		_canvasExt.clear();
		if(Draw.callback) Draw.callback(rId, pId);
	};
	Draw.grabMarker = null;
	Draw.overlayManager = new UOverlayManager(_UMap);
	//Draw.editableMarkerArray = [];
	Draw.cancelEditbleOverlay = function(){
		var editableMarkerArrayLen = Draw.overlayManager.getOverlaysCount();
		if(editableMarkerArrayLen > 0){
			//for(var i=0; i<editableMarkerArrayLen; i++)
			//_UMap.removeOverlay(Draw.editableMarkerArray[i]);
			Draw.overlayManager.remove();
		}
		//log(Draw.overlayManager.overlays.length);
		if(Draw.grabMarker)
			Draw.grabMarker.disableDragging();
		//Draw.editableMarkerArray = [];
	};
	Draw.grabingFunction = function(udata){
		var evt = _Event.getEvent();
		var mouse = me.adjustMousePosition(_Event.getMouseXY(evt));
		var umarker = this;
		var rId = udata.rId;
		var pId = udata.pId;
		var record = Draw.record[rId]['overlay'];
		var type = Draw.record[rId]['type'];
		switch(type){
			case('bound'):
			case('polyline'):
			case('polygon'):
				//log(record);
				var vertexCount = record.getVertexCount();
				var previousVertexLatlng = pId?record.getVertex(pId-1):(type=='polygon'?record.getVertex(vertexCount-1):null);

				var nextVertexLatlng = pId!=(vertexCount-1)?record.getVertex(pId+1):(type=='polygon'?record.getVertex(0):null);	

		 		var Point0 = previousVertexLatlng?_UMap.transformLatLngToContainerCoordinates(previousVertexLatlng):mouse;
				var Point1 = previousVertexLatlng?mouse:null;
				var Point2 = nextVertexLatlng?_UMap.transformLatLngToContainerCoordinates(nextVertexLatlng):null;
				mapDivOffsetLeft = _UMap.mapDivOffsetLeft();
				mapDivOffsetTop = _UMap.mapDivOffsetTop();
				_canvasExt.clear();
		 		plineCtxExt.beginPath();
		 		plineCtxExt.moveTo(Point0.x - mapDivOffsetLeft, Point0.y - mapDivOffsetTop);
		 		if(Point1){
		 			plineCtxExt.lineTo(Point1.x - mapDivOffsetLeft, Point1.y - mapDivOffsetTop);
		 		}
		 		if(Point2){
		 			plineCtxExt.lineTo(Point2.x - mapDivOffsetLeft, Point2.y - mapDivOffsetTop);
		 			
		 		}
		 		pen.borderColor = record.borderColor?record.borderColor:record.color;
		 		pen.borderWeight = record.borderWeight?record.borderWeight:record.weight;
		 		pen.borderOpacity = record.borderOpacity?record.borderOpacity:record.opacity;
		 		pen.fillColor = record.fillColor?record.fillColor:pen.fillColor;
		 		pen.fillOpacity = record.fillOpacity?record.fillOpacity:pen.fillOpacity;
		 		
		 		_canvasExt.initLine();
		 		if(type == 'polygon')
		 			_canvasExt.initFill();
		 		var opacity = parseFloat(pen.borderOpacity)-0.3;
		 		var borderWeight = parseInt(pen.borderWeight)-1;
			    plineCtxExt.globalAlpha = opacity>0?opacity:0.1;
			    plineCtxExt.lineWidth = borderWeight>0?borderWeight:1;
		 		plineCtxExt.stroke();
		 		break;
 		}
	};
	Draw.setEditableOverlay = function(rId, callback){
		if(!me.isSaveDrawRecord) 
			return;
		_canvasExt.init();
		Draw.cancelEditbleOverlay();
		if(callback) 
			Draw.callback = callback;
		var Overlay = Draw.record[rId]['overlay'];
		var type = Draw.record[rId]['type'];
		var markerArray = [];
		//log(Draw.record[rId]);
		if(me.chkNullObj(Overlay)) 
			return;
		switch(type){
			case('point'):
				var marker = Overlay;
				marker.rId = rId;
				Draw.grabMarker = marker;
				Draw.grabMarker.enableDragging();
				Draw.grabMarker.addListener('dragend', function(ev, mkr, latlng){
					if(Draw.callback) 
						Draw.callback(rId);
				});
				break;
			case('bound'):
			case('polyline'):
			case('polygon'):
				var vertexCount = Overlay.getVertexCount();
				for(var i=0; i<vertexCount; i++){
					var latlng = Overlay.getVertex(i);
					var marker = new UMarker(latlng, emptyMarkerIcon);
					marker.addListener('mouseover', function(ev, mkr, latlng){mkr.setIcon(emptyMarkerIconMouseOver);});
					marker.addListener('mouseout', function(ev, mkr, latlng){mkr.setIcon(emptyMarkerIcon);});
					marker.addListener('dragging', function(ev, mkr, latlng){Draw.grabingFunction.call(mkr, mkr.data);});
					marker.data = {'rId':rId, 'pId':i};
					marker.addListener('dragend', function(ev, mkr, latlng){
						markerMoved.call(mkr, mkr.data);
					});
					marker.addListener('contextmenu', Draw.showAddPointBtn);
					marker.addListener('dblclick', function(ev, mkr, latlng){
						var evt = _Event.getEvent();
						_Event.stopPropagation(evt);
						_Event.cancelDefault(evt);		
						Draw.delPoint(evt, mkr.data);
					});
					marker.enableDragging();
					markerArray.push(marker);
				}
				_UMap.removeListener('click', Draw.hidedrawPointToolDiv);
				_UMap.addListener('click', Draw.hidedrawPointToolDiv);
				Draw.overlayManager.add(markerArray);
				Draw.overlayManager.refresh();
				break;
				
		}
		
		var markerMoved = function(args){
			//log('markerMoved');
			var marker = this;
			var rId = args.rId;
			var pId = args.pId;
			var thisOverlay = Draw.record[rId]['overlay'];
			var markerLatlng = marker.getPoint();
			var vertexCount = thisOverlay.getVertexCount();
			var latLngs = [];
			for(var ii=0; ii<vertexCount; ii++){
				if(ii != pId)
					latLngs.push(thisOverlay.getVertex(ii));
				else{
					latLngs.push(markerLatlng);
				}
			}
			Draw.markerMovedFunction(latLngs, rId, pId);
			if(drawPointToolDiv.style.display !== 'none')
				drawPointToolDiv.style.display = 'none';
		};
	};
	Draw.showAddPointBtn = function(ev, mkr, latlng){
		var coordinates = _UMap.transformLatLngToContainerCoordinates(latlng);
		drawPointToolDiv.style.left = (coordinates.x +3) + "px";
		drawPointToolDiv.style.top = (coordinates.y + 3) + "px";
		drawPointToolDiv.style.display = 'block';	
		//log(mkr.data);
		drawPointToolDiv.childNodes[0].onclick = function(evt){Draw.addPoint(evt, mkr.data)};
		drawPointToolDiv.childNodes[1].onclick = function(evt){Draw.delPoint(evt, mkr.data)};
		//console.log(mkr.data);
	};
	Draw.addPoint = function(evt, udata){
		evt = _Event.getEvent(evt);
		_Event.stopPropagation(evt);
		_Event.cancelDefault(evt);		
		Draw.hidedrawPointToolDiv();
		var rId = udata.rId;
		var pId = udata.pId;
		var record = Draw.record[rId]['overlay'];
		var type = Draw.record[rId]['type'];
		//log(type);
		//if(drawType != 'polyline' || drawType != 'polygon') 
		//	return;
		var newLatlng = record.getVertex(pId);
		var vertexCount = record.getVertexCount();
		var newLatlng0 = null;
		var newLatlng1 = null;
		switch(type){
			case('polyline'):
				newLatlng0 = pId>0?record.getVertex(pId-1):null;
				newLatlng1 = pId<(vertexCount-1)?record.getVertex(pId+1):null;
				if(newLatlng1){
					newLatlng1 = new ULatLng((newLatlng.lat() + newLatlng1.lat())/2, (newLatlng.lng() + newLatlng1.lng())/2);
					//log(newLatlng1);
					record.addVertex(newLatlng1, pId+1);
				}
				if(newLatlng0){
					newLatlng0 = new ULatLng((newLatlng.lat() + newLatlng0.lat())/2, (newLatlng.lng() + newLatlng0.lng())/2);
					record.addVertex(newLatlng0, pId);
				}
				break;
			case('bound'):
			case('polygon'):{
				var idx0 = pId>0?(pId-1):(vertexCount-1);
				var idx1 = pId<(vertexCount-1)?(pId+1):(0);
				var newidx0 = pId>0?(pId):(vertexCount);
				var newidx1 = pId>0?pId+2:pId+1;
				//alert(newidx1);
				newLatlng0 = record.getVertex(idx0);
				newLatlng1 = record.getVertex(idx1);
				if(newLatlng0){
					newLatlng0 = new ULatLng((newLatlng.lat() + newLatlng0.lat())/2, (newLatlng.lng() + newLatlng0.lng())/2);
					
					record.addVertex(newLatlng0, newidx0);
				}
				if(newLatlng1){
					newLatlng1 = new ULatLng((newLatlng.lat() + newLatlng1.lat())/2, (newLatlng.lng() + newLatlng1.lng())/2);
					
					record.addVertex(newLatlng1, newidx1);
				}
				break;
			}
		}
		record.remove();
		/*var id = rObj.id;
		Draw.record[id]['type'] = rObj.type;
		Draw.record[id]['overlay'] = rObj.overlay;
		Draw.record[rId]['overlay'] = record;
		Draw.record[rId]['type'];*/
		setDrawRecord({
			id : rId,
			type: type,
			overlay : record
		});
		_UMap.addOverlay(record);
		Draw.setEditableOverlay(rId, Draw.callback);
	};
	Draw.delPoint = function(evt, udata){
		evt = _Event.getEvent(evt);
		_Event.stopPropagation(evt);
		_Event.cancelDefault(evt);			
		Draw.hidedrawPointToolDiv();
		var rId = udata.rId;
		var pId = udata.pId;
		var record = Draw.record[rId]['overlay'];
		var type = Draw.record[rId]['type'];
		switch(type){
			case('bound'):case('polyline'):case('polygon'):
			record.removeVertex(pId);
			_UMap.removeOverlay(record);
			_UMap.addOverlay(record);
			Draw.setEditableOverlay(rId, Draw.callback);
			break;
		}
		
	};
	Draw.hidedrawPointToolDiv = function(){
		drawPointToolDiv.style.display = 'none';
	};
	Draw.bindOverlayEvent = function(rId){
		//console.log(me.isSaveDrawRecord);
		//console.log(enableEditableEvent);
		if(!me.isSaveDrawRecord || !enableEditableEvent) 
			return;
		var overlay = Draw.record[rId]['overlay'];
		var type = Draw.record[rId]['type'];
		//log(Draw.record[rId]);
		switch(type){
			case('bound'):
			case('polygon'):
				overlay.data = {};
				overlay.data.rId = rId;
				overlay.mouseover = function(evt){
					//log(me.tooltip);//.innerHTML = "test";
				};
				overlay.click = function(evt){
					//_Event.stopPropagation(evt);
					//_Event.cancelDefault(evt);
					if(me.drawingState.indexOf('drawing')<0)
						//me.cancelDrawMode();
						me.setEditableOverlay(rId);
				};
				overlay.dblclick = function(evt){
					if(confirm('您確定刪除？'))
						me.removeDrawRecordListbyId(rId);
				};
				break;
		}
		//return Overlay;
	};
	var preloadImg = function(imgSrcArray){
		var imgSrcArrayLen = imgSrcArray.length;
		for(var i=0; i<imgSrcArrayLen; i++){
			var img_ = new Image();
			img_.src = imgSrcArray[i];
		}
	};
	var defaultPen = {
		borderColor : "#F00",
		borderWeight : 2,
		borderOpacity : 0.8,
		fillColor : "#FF0",
		fillOpacity : 0.4
	};
	var pen = defaultPen;
	var _canvasExt = {
		init:function(){
			if(!canvasExt) return;
			canvasExt.width = canvas.width;
			canvasExt.height = canvas.height;
			canvasExt.style.cssText = canvas.style.cssText;
			canvasExt.style.zIndex = parseInt(canvas.style.zIndex) + 1;
			canvasExt.style.display = 'block';
		},
		initLine: function(){
			if(!canvasExt) return;
			plineCtxExt.strokeStyle = pen.borderColor;
		    plineCtxExt.globalAlpha = pen.borderOpacity;
		    plineCtxExt.lineWidth = pen.borderWeight;
		    plineCtxExt.lineCap = 'round';
		    plineCtxExt.lineJoin = 'round';
		},
		initFill: function(){
			if(!canvasExt) return;
			plineCtxExt.fillStyle = pen.fillColor;
   			plineCtxExt.globalAlpha = pen.fillOpacity;
		},
		clear: function(){
			if(!canvasExt) return;
			plineCtxExt.clearRect(0,0,canvasExt.width, canvasExt.height);
		},
		showblock: function(){
			if(!canvasExt) return;
			canvasExt.style.display = 'block';
		},
		shownone: function(){
			if(!canvasExt) return;
			canvasExt.style.display = 'none';
		}
	};
	var stop = function(){
		_canvasExt.clear();
		if(startPointMarker)
			startPointMarker.setPoint(new ULatLng(0,0));
		//log('stop');
		mouseCurrentPoint = {};
		mouseDownPoint = {};
		overlay = {};
		latlngArray = [];
		me.drawingState = 'ready';
	};
	var cancel = function(){
		try{
			_UMap.removeListener('mousedown', downFunction);
			_UMap.removeListener('mousemove',moveFunction);
			_UMap.removeListener('mouseup', upFunction);
			_UMap.removeListener('click', clickFunction);
			_UMap.removeListener('dblclick', dblclickFunction);
			//_Event.removeEvent(mapDiv, 'dblclick', dblclickFunction);
			_Event.removeEvent(isIE?document.body:window, 'keypress', keyPressFunction);
		}catch(e){}
		stop();
		_canvasExt.clear();
		_canvasExt.shownone();
		overlay = {};
		drawedCallback = null;
		if(tipDiv)
			tipDiv.style.display = "none";
		mapDiv.style.cursor = "";
		setTimeout(_UMap.enableDragging,0);
		me.drawingState = 'cancel';
	};
	var moveendFunction = function(){
		_canvasExt.init();
		//mapDivOffsetLeft = _UMap.mapDivOffsetLeft();
		//mapDivOffsetTop = _UMap.mapDivOffsetTop();
	};
	var downFunction = function(evt, _latlng){
		var target = _Event.findTarget(evt);
		if(!target) return;
		isMouseDown = true;
		_UMap.disableDragging();
		evt = _Event.getEvent(evt);
		_Event.cancelDefault(evt);
		_Event.stopPropagation(evt);
		var mouse = me.adjustMousePosition(_Event.getMouseXY(evt));
		if(!mouseCurrentPoint.latlng ){
			mouseCurrentPoint.latlng = _latlng;
		}
		
		tipDiv.style.left = mouse.x + tipDivPanPx + "px";
		tipDiv.style.top = mouse.y + tipDivPanPx + "px";
		_canvasExt.showblock();
		mapDivOffsetLeft = _UMap.mapDivOffsetLeft();//這個值會改變，所以當滑鼠按下時就要重新取得
		mapDivOffsetTop = _UMap.mapDivOffsetTop();
		switch(drawType){
			case("circle"):
			case("bound"):
				tipDiv.innerHTML = "按住滑鼠拖曳";
				mouseDownPoint.latlng = _latlng;
				break;
			case("pen"):
			case("penPolygon"):
				tipDiv.style.display = "none";
				mouseDownPoint.latlng = _latlng;
				break;
			case("polyline"):
			case("polygon"):
				_UMap.enableDragging();
				break;
		}
		//me.drawingState = 'mousedown';
	};
	var moveFunction = function(evt, _latlng){
		evt = _Event.getEvent(evt);
		var mouse = me.adjustMousePosition(_Event.getMouseXY(evt));
		if(me.showTooltip){
			tipDiv.style.display = 'block';
			tipDiv.style.left = mouse.x  + tipDivPanPx + "px";
			tipDiv.style.top = mouse.y + tipDivPanPx + "px";
		}else{
			tipDiv.style.display = 'none';
		}
		mapDivOffsetLeft = _UMap.mapDivOffsetLeft();
		mapDivOffsetTop = _UMap.mapDivOffsetTop();
		mouseCurrentPoint.latlng = _latlng;
		switch(drawType){
			case("circle"):
				if(isMouseDown){//拖曳滑鼠
					_canvasExt.clear();
					var mouseDownPointDivCorrd = _UMap.transformLatLngToContainerCoordinates(mouseDownPoint.latlng);
					var mouseCurrentPointDivCorrd = _UMap.transformLatLngToContainerCoordinates(mouseCurrentPoint.latlng);
					var minX,maxX,minY,maxY;
					if(mouseCurrentPointDivCorrd.x < mouseDownPointDivCorrd.x){
						minX = mouseCurrentPointDivCorrd.x;
						maxX = mouseDownPointDivCorrd.x;
					}else{
						minX = mouseDownPointDivCorrd.x;
						maxX = mouseCurrentPointDivCorrd.x;
					}
					if(mouseCurrentPointDivCorrd.y < mouseDownPointDivCorrd.y){
						minY = mouseCurrentPointDivCorrd.y;
						maxY = mouseDownPointDivCorrd.y;
					}else{
						minY = mouseDownPointDivCorrd.y;
						maxY = mouseCurrentPointDivCorrd.y;
					}
					
					var radius = Math.sqrt(Math.pow(maxX - minX, 2)+Math.pow(maxY - minY, 2));
			 		_canvasExt.initFill();
			 		plineCtxExt.beginPath();
			 		plineCtxExt.arc(mouseDownPointDivCorrd.x-mapDivOffsetLeft, mouseDownPointDivCorrd.y-mapDivOffsetTop, radius, 0, Math.PI*2, true);
			 		plineCtxExt.fill();
			 		if(isIE) {
						plineCtxExt.beginPath();
				 		plineCtxExt.arc(mouseDownPointDivCorrd.x-mapDivOffsetLeft, mouseDownPointDivCorrd.y-mapDivOffsetTop, radius, 0, Math.PI*2, true);
				    }
			 		_canvasExt.initLine();
			 		plineCtxExt.stroke();
					var centerLatLng = _UMap.transformContainerCoordinatesToLatLng(new UPoint(mouseDownPointDivCorrd.x, mouseDownPointDivCorrd.y));
					var currentLatLng = _UMap.transformContainerCoordinatesToLatLng(new UPoint(mouseCurrentPointDivCorrd.x, mouseCurrentPointDivCorrd.y));
					//var realRadius = Math.round(Math.sqrt(Math.pow(currentLatLng.x()-centerLatLng.x(), 2)+Math.pow(currentLatLng.y()-centerLatLng.y(), 2)));
					var realRadius = currentLatLng.distanceTo(centerLatLng).toFixed(2);
					tipDiv.innerHTML=realRadius + "M";
					me.drawingState = 'drawing'+drawType;
				}else{
					tipDiv.innerHTML = "選擇中心點並按住滑鼠拖曳";
					me.drawingState = 'readyDrawing'+drawType;
				}
				break;
			case("bound"):
				if(isMouseDown){
					_canvasExt.clear();
					var mouseDownPointDivCorrd = _UMap.transformLatLngToContainerCoordinates(mouseDownPoint.latlng);
					var mouseCurrentPointDivCorrd = _UMap.transformLatLngToContainerCoordinates(mouseCurrentPoint.latlng);
					var minX = Math.min(mouseCurrentPointDivCorrd.x ,mouseDownPointDivCorrd.x );
					var minY = Math.min(mouseCurrentPointDivCorrd.y ,mouseDownPointDivCorrd.y );
					var maxX = Math.max(mouseCurrentPointDivCorrd.x ,mouseDownPointDivCorrd.x );
					var maxY = Math.max(mouseCurrentPointDivCorrd.y ,mouseDownPointDivCorrd.y );
					_canvasExt.initFill();
			 		plineCtxExt.beginPath();
			 		plineCtxExt.moveTo(minX-mapDivOffsetLeft, minY-mapDivOffsetTop);
			 		plineCtxExt.lineTo(maxX-mapDivOffsetLeft, minY-mapDivOffsetTop);
			 		plineCtxExt.lineTo(maxX-mapDivOffsetLeft, maxY-mapDivOffsetTop);
			 		plineCtxExt.lineTo(minX-mapDivOffsetLeft, maxY-mapDivOffsetTop);
					plineCtxExt.closePath();
			 		plineCtxExt.fill();
			 		_canvasExt.initLine();
			 		if(isIE) {
						plineCtxExt.beginPath();
				 		plineCtxExt.moveTo(minX-mapDivOffsetLeft, minY-mapDivOffsetTop);
				 		plineCtxExt.lineTo(maxX-mapDivOffsetLeft, minY-mapDivOffsetTop);
				 		plineCtxExt.lineTo(maxX-mapDivOffsetLeft, maxY-mapDivOffsetTop);
				 		plineCtxExt.lineTo(minX-mapDivOffsetLeft, maxY-mapDivOffsetTop);
				 		plineCtxExt.closePath();
				    }
			 		
			 		plineCtxExt.stroke();
					var leftTopLatLng = _UMap.transformContainerCoordinatesToLatLng(new UPoint(mouseDownPointDivCorrd.x, mouseDownPointDivCorrd.y));
					var rightBottomLatLng = _UMap.transformContainerCoordinatesToLatLng(new UPoint(mouseCurrentPointDivCorrd.x, mouseCurrentPointDivCorrd.y));
					var interLatlng = new ULatLng(leftTopLatLng.lat(), rightBottomLatLng.lng());
					//var realWidth = Math.abs(Math.round(rightBottomLatLng.x()-leftTopLatLng.x()));
					//var realHeight = Math.abs(Math.round(rightBottomLatLng.y()-leftTopLatLng.y()));
					var realWidth = Math.abs(rightBottomLatLng.deltaX(leftTopLatLng).toFixed(2));
					var realHeight = Math.abs(rightBottomLatLng.deltaY(leftTopLatLng).toFixed(2));
					tipDiv.innerHTML = realWidth+" M ×"+ realHeight+" M";
					me.drawingState = 'drawing'+drawType;
				}
				else{
					tipDiv.innerHTML = "選擇一點並按住滑鼠拖曳";
					me.drawingState = 'readyDrawing'+drawType;
				}
				break;
			case("polyline"):
			case("polygon"):
				if(!isMouseDown){
					_canvasExt.clear();
					_UMap.disableDragging();
					var latlngArrayLen = latlngArray.length;
					if(!latlngArrayLen){
						tipDiv.innerHTML = "選擇一點並按一下滑鼠";
						me.drawingState = 'readyDrawing'+drawType;
					}
					else{
						
						//mouseCurrentPoint.x = mouse.x;// - bodyMarginX;
						//mouseCurrentPoint.y = mouse.y;// - bodyMarginY;
						var mouseDownPointDivCorrd = _UMap.transformLatLngToContainerCoordinates(mouseDownPoint.latlng);
						var mouseCurrentPointDivCorrd = _UMap.transformLatLngToContainerCoordinates(mouseCurrentPoint.latlng);
						var minX = Math.min(mouseCurrentPointDivCorrd.x ,mouseDownPointDivCorrd.x );
						var minY = Math.min(mouseCurrentPointDivCorrd.y ,mouseDownPointDivCorrd.y );
						var maxX = Math.max(mouseCurrentPointDivCorrd.x ,mouseDownPointDivCorrd.x );
						var maxY = Math.max(mouseCurrentPointDivCorrd.y ,mouseDownPointDivCorrd.y );
					
						
				 		plineCtxExt.beginPath();
				 		
				 		plineCtxExt.moveTo(mouseDownPointDivCorrd.x-mapDivOffsetLeft, mouseDownPointDivCorrd.y-mapDivOffsetTop);
				 		
				 		plineCtxExt.lineTo(mouseCurrentPointDivCorrd.x-mapDivOffsetLeft, mouseCurrentPointDivCorrd.y-mapDivOffsetTop);
				 		
				 		_canvasExt.initLine();
				 		plineCtxExt.stroke();
						
						var currentStartLatLng = _UMap.transformContainerCoordinatesToLatLng(new UPoint(mouseDownPointDivCorrd.x, mouseDownPointDivCorrd.y));
						var currentLatLng = _UMap.transformContainerCoordinatesToLatLng(new UPoint(mouseCurrentPointDivCorrd.x, mouseCurrentPointDivCorrd.y));
						//var currentDistance = Math.round(Math.sqrt(Math.pow(currentLatLng.x()-currentStartLatLng.x(), 2)+Math.pow(currentLatLng.y()-currentStartLatLng.y(), 2)));
						var currentDistance = currentLatLng.distanceTo(currentStartLatLng).toFixed(2);
						//log(currentDistance);
						if(latlngArray.length)
							tipDiv.innerHTML = (Number(countDistant) + Number(currentDistance)).toFixed(2) + "M<br/>(點兩下結束繪圖)";
					
						me.drawingState = 'drawing'+drawType;
					}
			}
			break;
			case("pen"):
			case("penPolygon"):
				if(isMouseDown){
					_canvasExt.clear();
					latlngArray.push(mouseCurrentPoint.latlng);
					plineCtxExt.beginPath();
					var latlngArrayLen = latlngArray.length;

					for(var i=0; i<latlngArrayLen; i++) {
						var mouseCurrentPointDivCorrd = _UMap.transformLatLngToContainerCoordinates(latlngArray[i]);
						var ptX = mouseCurrentPointDivCorrd.x-mapDivOffsetLeft;
						var ptY = mouseCurrentPointDivCorrd.y-mapDivOffsetTop;
						if(i===0)
							plineCtxExt.moveTo(ptX, ptY);
						else 
							plineCtxExt.lineTo(ptX, ptY);
					}
					_canvasExt.initLine();
					plineCtxExt.stroke();
					me.drawingState = 'drawing'+drawType;
				}
				tipDiv.style.display = "none";
				me.drawingState = 'drawing';
				break;
			case("point"):
				if(me.showTooltip){
					tipDiv.innerHTML = "選擇一點並按一下滑鼠";
				}
				me.drawingState = 'drawing'+drawType;
				break;
		}
	};
	var upFunction = function(evt, _latlng){
		if(!isMouseDown)
			return;
		isMouseDown = false;
		evt = _Event.getEvent(evt);
		_Event.cancelDefault(evt);
		_Event.stopPropagation(evt);
		
		var itCanCallback = true;
		switch(drawType){
			case("circle"):
				var mouseDownPointDivCorrd = _UMap.transformLatLngToContainerCoordinates(mouseDownPoint.latlng);
				var mouseCurrentPointDivCorrd = _UMap.transformLatLngToContainerCoordinates(mouseCurrentPoint.latlng);
				var centerLatLng = _UMap.transformContainerCoordinatesToLatLng(new UPoint(mouseDownPointDivCorrd.x, mouseDownPointDivCorrd.y));
				var currentLatLng = _UMap.transformContainerCoordinatesToLatLng(new UPoint(mouseCurrentPointDivCorrd.x, mouseCurrentPointDivCorrd.y));
				//var radius = Math.round(Math.sqrt(Math.pow(currentLatLng.x()-centerLatLng.x(), 2)+Math.pow(currentLatLng.y()-centerLatLng.y(), 2)));
				
				var pixelRadius = (Math.sqrt(Math.pow(mouseCurrentPointDivCorrd.x-mouseDownPointDivCorrd.x, 2)+Math.pow(mouseCurrentPointDivCorrd.y-mouseDownPointDivCorrd.y, 2)));
				var southPoint = new UPoint(mouseDownPointDivCorrd.x, mouseDownPointDivCorrd.y - pixelRadius);
				var southLatLng =  _UMap.transformContainerCoordinatesToLatLng(new UPoint(southPoint.x, southPoint.y));
				var radius = centerLatLng.distanceTo(southLatLng);
				if(radius){
					overlay = new UCircle(centerLatLng, radius, pen.borderColor, pen.borderWeight, pen.borderOpacity, pen.fillColor, pen.fillOpacity);
				}
				else	
					overlay = null;
				itCanCallback = true;
				break;
			case("bound"):
				var mouseDownPointDivCorrd = _UMap.transformLatLngToContainerCoordinates(mouseDownPoint.latlng);
				var mouseCurrentPointDivCorrd = _UMap.transformLatLngToContainerCoordinates(mouseCurrentPoint.latlng);
				var minX = Math.min(mouseCurrentPointDivCorrd.x ,mouseDownPointDivCorrd.x );
				var minY = Math.min(mouseCurrentPointDivCorrd.y ,mouseDownPointDivCorrd.y );
				var width = Math.abs(mouseCurrentPointDivCorrd.x - mouseDownPointDivCorrd.x);
				var height = Math.abs(mouseCurrentPointDivCorrd.y - mouseDownPointDivCorrd.y);
				var latlng0 = _UMap.transformContainerCoordinatesToLatLng(new UPoint(minX, minY));
				var latlng1 = _UMap.transformContainerCoordinatesToLatLng(new UPoint(minX + width, minY));
				var latlng2 = _UMap.transformContainerCoordinatesToLatLng(new UPoint(minX + width, minY + height));
				var latlng3 = _UMap.transformContainerCoordinatesToLatLng(new UPoint(minX, minY + height));
				var points = [];
				if(width || height){
					points = [latlng0, latlng1, latlng2, latlng3];
					overlay = new UPolygon(points, pen.borderColor, pen.borderWeight, pen.borderOpacity, pen.fillColor, pen.fillOpacity);
					
					
				}
				else	overlay = null;
				break;
			case("pen"):
				overlay = new UPolyline(latlngArray, pen.borderColor, pen.borderWeight, pen.borderOpacity);
				latlngArray = [];
				break;
			case("penPolygon"):
				overlay = new UPolygon(latlngArray, pen.borderColor, pen.borderWeight, pen.borderOpacity, pen.fillColor, pen.fillOpacity);
				latlngArray = [];
				break;
			case("point"):
				var mouseCurrentPointDivCorrd = _UMap.transformLatLngToContainerCoordinates(mouseCurrentPoint.latlng);
				var currentLatLng = _UMap.transformContainerCoordinatesToLatLng(new UPoint(mouseCurrentPointDivCorrd.x, mouseCurrentPointDivCorrd.y));
				overlay = new UMarker(currentLatLng, pointUIcon);
				break;
			case("polyline"):
			case("polygon"):
				itCanCallback = false;
				_UMap.disableDragging();
				break;
		}
		if(itCanCallback && !chkIsEmptyObj(overlay)){
			_canvasExt.clear();
			_canvasExt.shownone();
			//Draw.bindOverlayEvent();
			me.addDrawRecord(drawType, overlay);
			_UMap.addOverlay(overlay);
			if(drawedCallback && overlay){
				drawedCallback(me.getDrawRecordById(Draw.currentRecordId));
			}
			//log(overlay);
			if(!me.isSaveDrawRecord)
				Draw.record = {};
			overlay = {};
			mouseCurrentPoint = {};
			mouseDownPoint = {};
			//me.drawingState = 'mouseup';
		}
	};
	var keyPressFunction = function (evt){
		evt = _Event.getEvent(evt);
		switch(evt.keyCode){
			case(27):
				_Event.cancelDefault(evt);
				_Event.stopPropagation(evt);
				if(drawType == 'polygon')
					startPointMarkerClick();
				me.addDrawRecord(drawType, overlay);
				if(drawedCallback && overlay){
					//}
					drawedCallback(me.getDrawRecordById(Draw.currentRecordId));
				}
				if(!me.isSaveDrawRecord)
					Draw.record = {};
				stop();
				break;
		}
		//me.drawingState = 'keypress';
	};
	var dblclickFunction = function(evt){
		evt = _Event.getEvent(evt);
		if(latlngArray.length > 1){
			switch(drawType){
				case('polyline'):
					_UMap.removeOverlay(overlay);
					overlay = new UPolyline(latlngArray, pen.borderColor, pen.borderWeight, pen.borderOpacity);

					//overlay = new UPolygon(latlngArray, pen.borderColor, pen.borderWeight, pen.borderOpacity, pen.fillColor, pen.fillOpacity);
					break;

				case('polygon'):
					_UMap.removeOverlay(overlay);
					overlay = new UPolygon(latlngArray, pen.borderColor, pen.borderWeight, pen.borderOpacity, pen.fillColor, pen.fillOpacity);
					break;
			}
			me.addDrawRecord(drawType, overlay);
			_UMap.addOverlay(overlay);
			if(drawedCallback){
				drawedCallback(me.getDrawRecordById(Draw.currentRecordId));
			}
			if(!me.isSaveDrawRecord)
				Draw.record = {};
			stop();
		}
	};
	var clickFunction = function(evt, _latlng){
		_UMap.disableDragging();
		evt = _Event.getEvent(evt);
		_Event.cancelDefault(evt);
		_Event.stopPropagation(evt);
		var target = _Event.findTarget(evt);
		if(!target) 
			return;
		var mouse = me.adjustMousePosition(_Event.getMouseXY(evt));
		mapDivOffsetLeft = _UMap.mapDivOffsetLeft();//這個值會改變，所以當滑鼠按下時就要重新取得
		mapDivOffsetTop = _UMap.mapDivOffsetTop();
		var latlngArrayLen = latlngArray.length;
		if(!latlngArrayLen){
			overlay = new UPolyline([], pen.borderColor, pen.borderWeight, pen.borderOpacity);
		}
		mouseDownPoint.latlng = _latlng;
		
		var mouseDownPointDivCorrd = _UMap.transformLatLngToContainerCoordinates(mouseDownPoint.latlng);
		var mouseCurrentPointDivCorrd = _UMap.transformLatLngToContainerCoordinates(mouseCurrentPoint.latlng);
		startPointLatlng = mouseCurrentPoint.latlng;//_UMap.transformContainerCoordinatesToLatLng(new UPoint(mouseDownPointDivCorrd.x, mouseDownPointDivCorrd.y));
		var currentLatLng = mouseCurrentPoint.latlng;//_UMap.transformContainerCoordinatesToLatLng(new UPoint(mouseDownPointDivCorrd.x, mouseDownPointDivCorrd.y));
		var checkDiff = true;
		if(latlngArray.length > 1){
			var lastLatlng = latlngArray[latlngArray.length-1];
			if(lastLatlng.lat() == currentLatLng.lat() &&  lastLatlng.lng() == currentLatLng.lng())
				checkDiff = false;
		}
		if(checkDiff){
			latlngArray.push(currentLatLng);
			overlay.addVertex(currentLatLng);
		}
		if(overlay){
			_UMap.removeOverlay(overlay);
		}
		_UMap.addOverlay(overlay);
		if(latlngArrayLen>0){
			var cntDistance = 0;
			for(var i=1; i<latlngArrayLen; i++){
				//cntDistance += Math.round(Math.sqrt(Math.pow(latlngArray[i].x()-latlngArray[i-1].x(), 2)+Math.pow(latlngArray[i].y()-latlngArray[i-1].y(), 2)));
				cntDistance += latlngArray[i].distanceTo(latlngArray[i-1]);
			}
			//log(cntDistance);
			countDistant = cntDistance;
		}
		else{
			if(!startPointMarker)
				startPointMarker = new UMarker(currentLatLng, emptyMarkerIcon);
			else
				startPointMarker.setPoint(currentLatLng);
			startPointMarker.addListener('click', startPointMarkerClick);
			_UMap.addOverlay(startPointMarker);
			
		}
		if(!mouseCurrentPoint.latlng){
			mouseCurrentPoint = mouseDownPoint;
		}
		_canvasExt.showblock();
		//me.drawingState = 'click';
	};
	var startPointMarkerClick = function(evt){
		evt = _Event.getEvent(evt);
		_Event.cancelDefault(evt);
		_Event.stopPropagation(evt);
		if(latlngArray.length > 1){
			switch(drawType){
				case('polyline'):
					if(latlngArray[latlngArray.length-1] != latlngArray[latlngArray.length-2]){
						latlngArray.push(latlngArray[0]);
						overlay.addVertex(latlngArray[0]);
					}
					break;
				case('polygon'):
					_UMap.removeOverlay(overlay);
					overlay = new UPolygon(latlngArray, pen.borderColor, pen.borderWeight, pen.borderOpacity, pen.fillColor, pen.fillOpacity);
					break;
			}
			me.addDrawRecord(drawType, overlay);
			_UMap.addOverlay(overlay);
			if(drawedCallback){
				drawedCallback(me.getDrawRecordById(Draw.currentRecordId));
			}
			if(!me.isSaveDrawRecord)
				Draw.record = {};
			stop();
		}
	};
	var drawCircle = function(callback){
		readyDraw('circle', callback);
	};
	var drawBound = function (callback){
		readyDraw('bound', callback);
	};
	var drawPolyline = function (callback){
		readyDraw('polyline', callback);
		
	};
	var drawPolygon = function (callback){
		readyDraw('polygon', callback);
		
	};
	var drawPen = function (callback){
		readyDraw('pen', callback);
		mapDiv.style.cursor = isIE?"url("+imgPath+"pen.cur), auto":"url("+imgPath+"pen.cur) 0 30, auto";
	};
	var drawPenPolygon = function (callback){
		readyDraw('penPolygon', callback);
		mapDiv.style.cursor = isIE?"url("+imgPath+"pen.cur), auto":"url("+imgPath+"pen.cur) 0 30, auto";
	};
	var drawPoint = function(callback){
		readyDraw('point', callback);
		setPointUIcon(pointUIcon);
	};
	var readyDraw = function(type, callback){
		drawType = type;
		cancel();
		if(callback) drawedCallback = callback;
		if(drawType == 'polyline' || drawType == 'polygon'){
			_UMap.addListener('click', clickFunction);
			_UMap.addListener('dblclick', dblclickFunction);
			//_Event.addEvent(mapDiv, 'dblclick', dblclickFunction);
		}
		_UMap.addListener('mousedown', downFunction);
		_UMap.addListener('mouseup', upFunction);
		_UMap.addListener('mousemove', moveFunction);
		_Event.addEvent(isIE?document.body:window, 'keypress', keyPressFunction);
		if(me.showTooltip)
			tipDiv.style.display = "block";
		me.drawingState = 'ready';
		_UMap.disableDragging();
		_canvasExt.init();
	};
	var penStyle = {
		set:function(style){
			//pen = style;
			for(var i in style){
				pen[i] = style[i];
			}
		},
		setDefault:function(){
			pen = defaultPen;
		}
	};
	var getDrawRecordList = function(){return Draw.record};
	var getDrawRecordById = function(id){
		if(Draw.record[id]) return Draw.record[id];
	};
	var setEditableOverlay = function(recordObj, callback){
		//_UMap.hideMapArea();
		var id = recordObj.id?recordObj.id:recordObj;
		Draw.setEditableOverlay(id, callback);
	};
	var cancelEditbleOverlay = function(){
		//_UMap.showMapArea();
		Draw.cancelEditbleOverlay();
	};
	var removeAllRecord = function(){
		for(var i in Draw.record){
			Draw.record[i]['overlay'].remove();
		}
		Draw.cancelEditbleOverlay();
		Draw.record = {};
	};
	var removeDrawRecordListbyId = function(id){
		_UMap.removeOverlay(Draw.record[id]['overlay']);
		Draw.cancelEditbleOverlay();
		delete Draw.record[id];
			//log(Draw.record);
	};
	var setDrawRecord = function(rObj){
		var id = rObj.id;
		Draw.record[id]['type'] = rObj.type;
		Draw.record[id]['overlay'] = rObj.overlay;
		Draw.bindOverlayEvent(id);
	};
	var addDrawRecord = function(modeStr, Overlay){
		var recordId = 'udraw'+new Date().getTime();
		Draw.currentRecordId = recordId;
		var recordObj = {
			'id':recordId,
			'type':modeStr,
			'overlay':Overlay
		};
		Draw.record[recordId] = recordObj;
		Draw.bindOverlayEvent(recordId);
		return recordObj;
	};
	var setPointUIcon = function(uIcon){
		//pointUIcon = uIcon;
		if(uIcon){
			pointUIcon = uIcon;
		}
	};
	var chkIsEmptyObj = function(obj){
		var chk = true;
		for(var ii in obj){
			chk = false;
			break;
		}
		return chk;
	};
	var init = function(){
		if(!plineCtx)
			plineCtx = canvas.getContext('2d');
		canvasExt = document.createElement('canvas');
		mapDiv.appendChild(canvasExt, canvas.nextSibling);
		if(!canvasExt.getContext && typeof G_vmlCanvasManager!='undefined')
			canvasExt = G_vmlCanvasManager.initElement(canvasExt);
		plineCtxExt = canvasExt.getContext('2d');
		
		_UMap.addListener('moveend', moveendFunction);
		_UMap.addListener('zoom', moveendFunction);
		preloadImg([imgPath+"pen.cur", imgPath+"emptyMarker.png"]);
		me.ready = true;
	};
	var reset = function(){
		pen = defaultPen;
		me.ready = true;
	};
	var checkResize = function(){
		_canvasExt.init();
	};
	init();
	this.drawCircle = drawCircle;
	this.drawBound = drawBound;
	this.drawPolyline = drawPolyline;
	this.drawPolygon = drawPolygon;
	this.drawPen = drawPen;
	this.drawPenPolygon = drawPenPolygon;
	this.drawPoint = drawPoint;
	
	this.showTooltip = showTooltip;//是否顯示提示div
	this.pen = pen;
	this.penStyle = penStyle;//設定筆畫penStyle.set();penStyle.setDefault
	this.cancelDrawMode = cancel;//取消繪圖模式，回到地圖模式
	this.setPointUIcon = setPointUIcon;//畫點的UIcon
	this.tooltip = tipDiv;//提示div
	this.isSaveDrawRecord = isSaveDrawRecord;//是否儲存繪圖紀錄;
	this.getDrawRecordList = getDrawRecordList;//取得繪圖紀錄清單
	this.removeDrawRecordListbyId = removeDrawRecordListbyId;//移除繪圖紀錄@id
	this.removeAllRecord = removeAllRecord;//移除所有繪圖紀錄
	this.getDrawRecordById = getDrawRecordById;//取得繪圖紀錄@id
	this.setDrawRecord = setDrawRecord;//將繪圖紀錄寫回@drawObj
	this.addDrawRecord = addDrawRecord;//增加一個繪圖紀錄
	this.setEditableOverlay = setEditableOverlay;//將繪製的overlay設為編輯模式@id,@callback
	this.cancelEditbleOverlay = cancelEditbleOverlay;//取消overlay編輯模式
	this.drawingState = drawingState;//目前狀態
	this.checkResize = checkResize;//重新檢查畫布大小
	//this.ready = ready;

};

