var log = function(l) {
 	/*if(UConst.IS_FF3){
	 	if(console)
			console.log(l);
	 }else{
	  if(typeof l == 'object'){
	 	 	 for(var i in l){
	 	 	 	console.log(i + '=' + l[i]); 
	 	 	 }
	 	 }else
	 	 	 console.log(l);
	 }*/
};
var UConst = {
	IS_IE : !window.opera && navigator.userAgent.indexOf('MSIE') >= 0,
	IS_IE6 : !window.opera
			&& navigator.userAgent.toLowerCase().indexOf('msie 6') >= 0,
	IS_IE7 : !window.opera
			&& navigator.userAgent.toLowerCase().indexOf('msie 7') >= 0,
	IS_FF2 : !window.opera
			&& navigator.userAgent.toLowerCase().indexOf('firefox/2') >= 0,
	IS_FF3 : !window.opera
			&& navigator.userAgent.toLowerCase().indexOf('firefox/3') >= 0,
	currentClientHeight : 0
};
var UTool = {
	textDefaultFocus : function(inputId) {
		var input = typeof inputId == 'string' ? $('#' + inputId) : inputId;// string
																			// or
																			// jQuery
																			// object
		input.each(function() {
			if (!$(this).data('defaultText')) {
				$(this).data('defaultText', $(this).attr('value'));
				$(this).data('defaultFontColor', $(this).css('color'));
				$(this).bind('focus', function() {
					if (!($(this).attr('value') && $(this).attr('value') !== $(this)
							.data('defaultText'))) {
						$(this).attr('value', '');
						$(this).css('color', 'black');
					} else
						$(this).select();
				});
				$(this).bind('blur', function() {
					if (!($(this).attr('value') && $(this).attr('value') !== $(this)
							.data('defaultText'))) {
						$(this).css('color', $(this).data('defaultFontColor'));
						$(this).attr('value', $(this).data('defaultText'));
					}
				});
			}
		});
	},
	chkDefaultText : function(qEl){
		var value = qEl.attr('value');
		var defaultText = qEl.data('defaultText');
		if(defaultText && value == defaultText)
			value = '';
		return value;
	},
	validateEmail : function(elementValue) {
		var emailPattern = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/;
		return emailPattern.test(elementValue);
	},
	getArgs : function() {
		var args = new Object();
		var query = location.search.substring(1);
		var pairs = query.split("&");
		for (var i = 0; i < pairs.length; i++) {
			var pos = pairs[i].indexOf('=');
			if (pos == -1)
				continue;
			var argname = pairs[i].substring(0, pos);
			var value = pairs[i].substring(pos + 1);
			value = decodeURIComponent(value);
			args[argname] = value;
		}
		return args;
	},
	eventBlock : function(e){
		if(window.event)
			window.event.cancelBubble = true;
		if(e && e.stopPropagation)
			e.stopPropagation();
		//e.stopPropagation();
		if(e && e.preventDefault)
			e.preventDefault();
	},
	cloneobj : function(obj){
		var clone = {};
		for(var i in obj){
			clone[i] = obj[i];
		}
		return clone;
	},
	getScript : function(url, callback){
		var js = document.createElement("script");
		js.type = 'text/javascript';
		js.src = url;
		js.onload = function(){
			document.getElementsByTagName('head')[0].removeChild(js);
			if(callback)
				callback();
		};
		document.getElementsByTagName('head')[0].appendChild(js);
	}
};
var UINDEX = function(userInit) {
	var me = this;
	var _FIXED_DIGIT = 6;// 经纬度取到小数点第几位
	var _IS_GOODBROWSER = UConst.IS_IE7 || UConst.IS_FF3;
	var _DEFAULT_DRAW_PENSTYLE = {
		borderColor : "#3c98ff",
		borderWeight : 6,
		borderOpacity : 0.8,
		fillColor : "#ffb637",
		fillOpacity : 0.8
	};
	var _QUERY_RECORD_LIST = {};
	
	var layoutImgPath = './images/';
	var _DATA = {};
	var _resizeTimeout = null;
	var _blockUIisShow = false;
	var _USERINPUT_KEYS = [];
	var _USERINPUT_KEYS_TIMEOUT = null;
	var PID = null;
	var searchMarker = new UMarker(new ULatLng(0,0));
	var _HISTORY = [];
	var init = {
		mapConstructor : function(){
			MAP = new UMap(document.getElementById('map'));
			UEXT = new UExt(MAP);
		},
		zoombar : function(){
			//滚轮缩放
			//UEXT.enableWheelZoom();
			
		},
		map : function(){
			
			MAP.addControl(U_FULLZOOM_CONTROL, URightTop);
			MAP.addControl(U_SCALE_CONTROL, ULeftBottom, new UPoint(24, 1));
			
			
			MAP.addOverlay(searchMarker);
			searchMarker.addListener('click', searchMarkerClicked);
			
			//overview Control
			//MAP.addControl(U_LOGO_CONTROL, UCenterCenter, new UPoint(50, 50));
			//var UOverviewControl = new UOverviewMapControl(150, 150);
			//UOverviewControl.id = 'UOverviewControl';
			//UOverviewControl.boxColor = 'blue';
			//UOverviewControl.borderColor = '#000';
			//UOverviewControl.borderWeight = '5';
			//MAP.addControl(UOverviewControl, ULeftBottom, new UPoint(0, 20));//UCenterCenter || ULeftBottom || URightBottom
			
			//$("#UOverviewControl").draggable();
		},
		draw :function(){
			UDRAW = new UDraw(MAP);
			UDRAW.init();
			//框選地圖放大模式
			//UEXT.boxEnlargeMode(UDRAW)
		},
		menu : function(){
			/*
			rcmenu = new UMenu(MAP, 'orange');
			rcmenu.addMenu("在此处增加标记点", addUpinMarker);
			rcmenu.addMenu("从这儿走", setMarkerUStart);
			rcmenu.addMenu("到这儿", setMarkerUEnd);
			rcmenu.addMenu("导航测试(驾车)", function() {
						me.runRouting('car')
					});
			rcmenu.addMenu("导航测试(公交)", function() {
						me.runRouting('bus')
					});
			//rcmenu.addMenu("搜索测试(道路)", testSearch);
			rcmenu.addMenu("周边查询", function(){
				rcmenu0.show(MarkerUPin.getPoint());
				var node = rcmenu0.getNode(1);
				var text = $(node).children().children('input');
				text.focus();
				text.select();
			});
			//rcmenu.addMenu("查询经纬度座标", function(){alert(2);});
			rcmenu.addMenu("新增地标点", addpoi);
			//rcmenu.addMenu("设定个人地点", function(){alert(4);});
			//rcmenu.addMenu("回报此处地址", function(){alert(5);});
			rcmenu.addMenu("关闭选单", function(){
				hideAllLayer();
			});
			
			//MAP.addListener('moveend', function(){alert(0)});
			MAP.addListener("contextmenu", function(e, latlng){
				hideAllLayer();
				rcmenu.show(latlng);
				MarkerUPin.setPoint(latlng);
				//MAP.addOverlay(UPin);
			});
			MAP.addListener("click", function(overlay, latlng){
				//MarkerUPin.reset();
				hideAllLayer();
			});*/
		},
		windowEvent : function(){
			UTool.textDefaultFocus($('#input_search_text'));
			$(document).bind('keydown', keyDownFunction);
			$(window).resize(init.windowResize);
			$('#form_query').submit(function(){
				queryAddr($('#input_search_text').val());
				return false;
			});

			
			$('#btn_newFile').click(function(){if(confirm('您確定放棄目前編輯？')) window.location = getServerName();});
			$('#btn_saveFile').click(function(){drawControl.saveData(PID)});
			$('#btn_saveOFile').click(function(){drawControl.saveData();});
			$('#btn_printFile').click(function(){window.print();});
			$('#btn_closeFile').click(function(){if(confirm('將關閉視窗，您確定放棄目前編輯？')) window.close()});

			$('#btn_ctrlz').click(function(){drawHistory.go(-1)});
			$('#btn_ctrly').click(function(){drawHistory.go(1)});
			$('#btn_play').click(function(){drawHistory.play()});
			$('#btn_savePosition').click(function(){savePosition()});
			$('#btn_clear').click(function(){clearOverlays();});
			//$('#btn_reset').click(resetOverlays);

			$('#btn_up').click(function(){mapControl.panUp();});
			$('#btn_down').click(function(){mapControl.panDown();});
			$('#btn_left').click(function(){mapControl.panLeft();});
			$('#btn_right').click(function(){mapControl.panRight();});
			$('#btn_zoomIn').click(function(){MAP.zoomIn();});
			$('#btn_zoomOut').click(function(){MAP.zoomOut();});

			$('#tool_cancel').click(function(){drawControl.cancel();$('tool_cancel img').attr('src','img/move_b.png');});
			$('#tool_drawPen').click(function(){drawControl.pen();});
			$('#tool_drawPenPolygon').click(function(){drawControl.penPolygon();});
			$('#tool_drawCircle').click(function(){drawControl.circle();});
			$('#tool_drawBound').click(function(){drawControl.bound();});
			$('#tool_drawPolyline').click(function(){drawControl.polyline();});
			$('#tool_drawPolygon').click(function(){drawControl.polygon();});
			$('#tool_penColor').click(function(){pickColor(this.childNodes[0]);});
			$('#tool_penWeight').change(function(){changePen()});
			$('#tool_penOpacity').change(function(){changePen()});
			$('#tool_bgColor').click(function(){pickColor(this.childNodes[0]);});
			$('#tool_bgOpacity').change(function(){changePen()});
			
		},
		ajax : function(){
			var loading = function(){
				$.blockUI({ message: $('#_LOADING') , css:{'opacity':0.7}});
			};
			var complete = function(){
				$.unblockUI();
			}
			$.ajaxSetup({
				beforeSend: loading,
				error: complete,
				success: complete,
				complete: complete
			});
		},
		debug : function(){
			
		},
		ie6fix : function(){
			if(UConst.IS_IE6)
				try {
					document.execCommand('BackgroundImageCache', false, true);
				} catch(e) {}
		},
		windowResize : function(){
			//for fix IE6
			if(UConst.currentClientHeight == document.documentElement.clientHeight)
				return;
			UConst.currentClientHeight = document.documentElement.clientHeight;
			if(_resizeTimeout){
				clearTimeout(_resizeTimeout);
				_resizeTimeout = null;
			}
			_resizeTimeout = setTimeout(function(){
				var innerHeight = window.innerHeight || document.documentElement.clientHeight;
				var deltaHeight = innerHeight-500;
				var newHeight = 406 + deltaHeight;
				$("#map").animate({height:newHeight},300,null, function(){
					mapControl.refresh();
				});
				
			}, 300);
			
		},
		args : function(){
			var arg = UTool.getArgs();
			if(arg.pid){
				getOverlay(arg.pid);
				PID = arg.pid;
			}else{
				$('#btn_saveFile').parent().hide();
				MAP.centerAndZoom(new ULatLng(25.035405, 121.521255), 9);

			}
		}
	};
	var getOverlay = function(id){
		var url = 'server/getOverlay.php?pid=' + id;
		var callback = function(res){
			eval('var k = ' + res);
			k.record = eval(k.record);
			drawControl.addRecordByData(k);
			//log(k);
		};
		$.get(url, callback);
	};
	var mapControl = {
		panUp:function(e){
			if(e)
				UTool.eventBlock(e);
			var center = MAP.getCenter();
			var bounds = MAP.getBounds();
			var northEast = bounds.getNorthEast();
			var southWest = bounds.getSouthWest();
			var modifyLatlng = new ULatLng((northEast.lat()+center.lat())/2, center.lng()); 
			MAP.centerMap(modifyLatlng);
		},
		panDown:function(e){
			if(e)
				UTool.eventBlock(e);
			var center = MAP.getCenter();
			var bounds = MAP.getBounds();
			var northEast = bounds.getNorthEast();
			var southWest = bounds.getSouthWest();
			var modifyLatlng = new ULatLng((southWest.lat()+center.lat())/2, center.lng()); 
			MAP.centerMap(modifyLatlng);
		},
		panLeft:function(e){
			if(e)
				UTool.eventBlock(e);
			var center = MAP.getCenter();
			var bounds = MAP.getBounds();
			var northEast = bounds.getNorthEast();
			var southWest = bounds.getSouthWest();
			var modifyLatlng = new ULatLng(center.lat(), (southWest.lng()+center.lng())/2); 
			MAP.centerMap(modifyLatlng);
		},
		panRight:function(e){
			if(e)
				UTool.eventBlock(e);
			var center = MAP.getCenter();
			var bounds = MAP.getBounds();
			var northEast = bounds.getNorthEast();
			var southWest = bounds.getSouthWest();
			var modifyLatlng = new ULatLng(center.lat(), (northEast.lng()+center.lng())/2); 
			MAP.centerMap(modifyLatlng);
		},
		panLeftUp:function(e){
			if(e)
				UTool.eventBlock(e);
			var center = MAP.getCenter();
			var bounds = MAP.getBounds();
			var northEast = bounds.getNorthEast();
			var southWest = bounds.getSouthWest();
			var modifyLatlng = new ULatLng((northEast.lat()+center.lat())/2, (southWest.lng()+center.lng())/2); 
			MAP.centerMap(modifyLatlng);
		},
		panRightUp:function(e){
			if(e)
				UTool.eventBlock(e);
			var center = MAP.getCenter();
			var bounds = MAP.getBounds();
			var northEast = bounds.getNorthEast();
			var southWest = bounds.getSouthWest();
			var modifyLatlng = new ULatLng((northEast.lat()+center.lat())/2, (northEast.lng()+center.lng())/2); 
			MAP.centerMap(modifyLatlng);
		},
		panLeftDown:function(e){
			if(e)
				UTool.eventBlock(e);
			var center = MAP.getCenter();
			var bounds = MAP.getBounds();
			var northEast = bounds.getNorthEast();
			var southWest = bounds.getSouthWest();
			var modifyLatlng = new ULatLng((southWest.lat()+center.lat())/2, (southWest.lng()+center.lng())/2); 
			MAP.centerMap(modifyLatlng);
		},
		panRightDown:function(e){
			if(e)
				UTool.eventBlock(e);
			var center = MAP.getCenter();
			var bounds = MAP.getBounds();
			var northEast = bounds.getNorthEast();
			var southWest = bounds.getSouthWest();
			var modifyLatlng = new ULatLng((southWest.lat()+center.lat())/2, (northEast.lng()+center.lng())/2); 
			MAP.centerMap(modifyLatlng);
		},
		refresh:function(){
			MAP.checkResize();
			MAP.refreshMap();
			//UEXT.addStaticCrossCenter();
			if(UDRAW.ready)
				UDRAW.checkResize();
		}
	};
	var drawControl = {
		_checkInit : function(){
			if(!UDRAW.ready){
				UDRAW.init();
				UDRAW.isSaveDrawRecord = true;
				//UDRAW.penStyle.set(_DEFAULT_DRAW_PENSTYLE);
			}
			$('#tool_cancel img').attr('src', 'img/move_a.png');
			$('#tool_drawPen img').attr('src', 'img/pen_1a.png');
			$('#tool_drawPenPolygon img').attr('src', 'img/pen_2a.png');
			$('#tool_drawCircle img').attr('src', 'img/circle_a.png');
			$('#tool_drawBound img').attr('src', 'img/square_a.png');
			$('#tool_drawPolyline img').attr('src', 'img/polyline_a.png');
			$('#tool_drawPolygon img').attr('src', 'img/polygon_a.png');
			changePen();
		},
		point :function(){
			this._checkInit();
			UDRAW.drawPoint();
		},
		circle :function(){
			this._checkInit();
			$('#tool_drawCircle img').attr('src', 'img/circle_b.png');
			UDRAW.drawCircle(drawHistory.add);
		},
		bound :function(){
			this._checkInit();
			$('#tool_drawBound img').attr('src', 'img/square_b.png');
			UDRAW.drawBound(drawHistory.add);
		},
		polyline :function(){
			this._checkInit();
			$('#tool_drawPolyline img').attr('src', 'img/polyline_b.png');
			UDRAW.drawPolyline(drawHistory.add);
		},
		polygon :function(){
			this._checkInit();
			$('#tool_drawPolygon img').attr('src', 'img/polygon_b.png');
			UDRAW.drawPolygon(drawHistory.add);
		},
		pen :function(){
			this._checkInit();
			$('#tool_drawPen img').attr('src', 'img/pen_1b.png');
			UDRAW.drawPen(drawHistory.add);
		},
		penPolygon :function(){
			this._checkInit();
			$('#tool_drawPenPolygon img').attr('src', 'img/pen_2b.png');
			UDRAW.drawPenPolygon(drawHistory.add);
		},
		cancel :function(){
			this._checkInit();
			UDRAW.cancelDrawMode();
			
		},
		addRecord : function(type, overlay){
			this._checkInit();
			var record = UDRAW.addDrawRecord(type, overlay);
			drawHistory.add(record);
			return record;
		},
		addRecordByData : function(json){
			//log(json);
			if(typeof json  != 'object'){
				log('addRecordByData failed:'+ 'data is not an object!' + ' This is data: ' + json);
				return;
			}
			this.clearRecord();
			var list = json.record;
			var ne = json.ne;
			var sw = json.sw;
			//log(list);
			
			//alert('oh');
			//return;
			for(var i in list){
				var currentRecord = {};
				var listi = list[i];
				//var id = listi.id;
				var type = listi.t;
				//var overlay = listi.overlay;
				//currentRecord.id = id;
				currentRecord.type = listi.t;
				var overlay = null;
				switch(type){
					case('polyline'):case('pen'):{
						overlay = new UPolyline.fromEncoded(listi.p, 
							listi.c, listi.w, listi.o);
						break;
					}case('polygon'):case('penPolygon'):case('bound'):{
						overlay = new UPolygon.fromEncoded(listi.p, 
							listi.bc, listi.bw, listi.bo,
							listi.fc, listi.fo);
						/*listi.borderColor = overlay.borderColor;
						listi.borderOpacity = overlay.borderOpacity;
						listi.borderWeight = overlay.borderWeight;
						listi.fillColor = overlay.fillColor;
						listi.fillOpacity = overlay.fillOpacity;
						listi.points = overlay.getEncodePoints();*/
						break;
					}case('circle'):{
						var center = new ULatLng(listi.c, 'DES');
						overlay = new UCircle(center, listi.r,
							listi.bc, listi.bw, listi.bo,
							listi.fc, listi.fo);
						/*listi.borderColor = overlay.borderColor;
						listi.borderOpacity = overlay.borderOpacity;
						listi.borderWeight = overlay.borderWeight;
						listi.fillColor = overlay.fillColor;
						listi.fillOpacity = overlay.fillOpacity;
						listi.radius = overlay.radius;
						listi.center = overlay.center.ec();*/
						break;
					}
				}
				//saveRecord.push(listi);
				//MAP.addOverlay(overlay);
				currentRecord.overlay = overlay;
				this.addRecord(type, overlay);
			//	log(currentRecord);
			}
			var bn = new UBounds(new ULatLng(sw, 'MD5'), new ULatLng(ne, 'MD5'));
			MAP.centerAndZoom(bn.getCenter(), MAP.getBoundsZoomLevel(bn));
			drawHistory.play();
		},
		clearRecord : function(){
			this._checkInit();
			UDRAW.removeAllRecord();
			_HISTORY = [];
			_INDEX = 0;
		},
		saveData : function(pid){
			if(_INDEX <= 0){
				alert('沒有任何繪圖物件！');
				return;
			}
			//log(UDRAW.getDrawRecordList());
			var list = UDRAW.getDrawRecordList();
			//var listLen = list.length;
			//log(listLen);
			//log(_HISTORY);
			var _history = _HISTORY;
			var saveRecord = [];
			var bounds = new UBounds();
			for(var i=0; i<_INDEX; i++){// in list){
				var currentRecord = {};
				var record = list[_history[i]];
				var id = record.id;
				var type = record.type;
				var overlay = record.overlay;
				//currentRecord.id = id;
				currentRecord.t = type;
				switch(type){
					case('polyline'):case('pen'):{
						/*currentRecord.color = overlay.color;
						currentRecord.opacity = overlay.opacity;
						currentRecord.weight = overlay.weight;
						currentRecord.points = overlay.getEncodePoints();*/
						currentRecord.c = overlay.color;
						currentRecord.o = overlay.opacity;
						currentRecord.w = overlay.weight;
						currentRecord.p = overlay.getEncodePoints();
						break;
					}case('polygon'):case('penPolygon'):case('bound'):{
						/*currentRecord.borderColor = overlay.borderColor;
						currentRecord.borderOpacity = overlay.borderOpacity;
						currentRecord.borderWeight = overlay.borderWeight;
						currentRecord.fillColor = overlay.fillColor;
						currentRecord.fillOpacity = overlay.fillOpacity;
						currentRecord.points = overlay.getEncodePoints();*/
						currentRecord.bc = overlay.borderColor;
						currentRecord.bo = overlay.borderOpacity;
						currentRecord.bw = overlay.borderWeight;
						currentRecord.fc = overlay.fillColor;
						currentRecord.fo = overlay.fillOpacity;
						currentRecord.p = overlay.getEncodePoints();
						break;
					}case('circle'):{
						/*currentRecord.borderColor = overlay.borderColor;
						currentRecord.borderOpacity = overlay.borderOpacity;
						currentRecord.borderWeight = overlay.borderWeight;
						currentRecord.fillColor = overlay.fillColor;
						currentRecord.fillOpacity = overlay.fillOpacity;
						currentRecord.radius = overlay.radius;
						currentRecord.center = overlay.center.ec();*/
						currentRecord.bc = overlay.borderColor;
						currentRecord.bo = overlay.borderOpacity;
						currentRecord.bw = overlay.borderWeight;
						currentRecord.fc = overlay.fillColor;
						currentRecord.fo = overlay.fillOpacity;
						currentRecord.r = overlay.radius;
						currentRecord.c = overlay.center.ec();
						break;
					}
				}
				var bound = overlay.getBounds();
				bounds.extend(bound);
				saveRecord.push(currentRecord);
			}
			//log(saveRecord);
			var jsonString = JSON.stringify(saveRecord);
			//this.addRecordByData(saveRecord);
			var callback = function(res){
				//eval('var k = ' + jsons);
				log(res);
				var msg = '';
				var link = '';
				if(res !== 'false'){
					if(res == 'true'){
						link = '?pid='+PID;
						msg = '儲存成功！';
					}else{
						link = '?pid='+res;
						msg = '<a href="'+link+'" target="_blank">開啟您的繪圖連結(另開視窗)</a>';
						
					}
				}else{
					msg = '儲存失敗！請聯絡管理者回報此錯誤！';
				}
				link = getServerName() + link;
				msg += '<br/>';
				msg += '<button onclick="copyTxt(\''+link+'\')">複製連結位址</button>';
				msg += '<button onclick="$.unblockUI();">關閉</button>';
				setTimeout(function(){
							$.blockUI({ message: msg , css:{'opacity':0.7}});
						}, 100);	
				//drawControl.addRecordByData(k);
			};
			var url = 'server/save.php';
			var postData = {};
			postData.jsonString = jsonString;
			if(pid)
				postData.pid = pid;
			postData.sw = bounds.getSouthWest().ec();
			postData.ne = bounds.getNorthEast().ec();
			$.post(url, postData, callback);
		}/*,
		playRecord : function(){
			var list = UDRAW.getDrawRecordList();
			MAP.clearOverlays();
			log(list);
			var listIndex = [];
			for(var i in list){
				//var overlay = list[i].overlay;
				//MAP.removeOverlay(overlay);
				//listLen ++;
				listIndex.push(list[i].id);
			}
			var listLen = listIndex.length;
			var playIndex = 0;
			var setTime = setInterval(function(){
				if(playIndex < listLen){
					var id = listIndex[playIndex];
					var overlay = list[id].overlay;
					MAP.addOverlay(overlay);
					playIndex ++;
				}
			}, 180);
		}*/
	};
	var getServerName = function(){
		var _href = window.location.href;
		var indexofQuot = _href.lastIndexOf('?');
		if(indexofQuot > 0)
			_href = _href.substring(0, indexofQuot);
		return _href;
	};
	var _INDEX = 0;
	var drawHistory = {
		add : function(dRecord){
			_HISTORY.splice(_INDEX, 1, dRecord.id);
			_INDEX++;
		},
		play : function(){
			var list = UDRAW.getDrawRecordList();
			MAP.clearOverlays();
			var listIndex = _HISTORY;
			var listLen = _INDEX;
			var playIndex = 0;
			var setTime = setInterval(function(){
				if(playIndex < listLen){
					var id = listIndex[playIndex];
					var overlay = list[id].overlay;
					MAP.addOverlay(overlay);
					playIndex ++;
				}
			}, 150);
		},
		go : function(idx){
			//-1 ,1
			var historyLen = _HISTORY.length;
			var targetIndex = _INDEX;
			if(idx < 0){
				if(targetIndex > 0)
					targetIndex -= 1;
			}else if(idx > 0){
				if(targetIndex < historyLen)
					targetIndex += 1;
			}else
				targetIndex = historyLen;
			//_INDEX = idx?idx:_HISTORY.length;
			var list = UDRAW.getDrawRecordList();
			//log('targetIndex='+targetIndex + ',' + '_INDEX='+_INDEX);
			if(targetIndex < _INDEX){
				for(var i=targetIndex; i<_INDEX; i++){
					MAP.removeOverlay(list[_HISTORY[i]].overlay);
				}
			}else{
				for(var i=_INDEX; i<targetIndex; i++){
					MAP.addOverlay(list[_HISTORY[i]].overlay);
				}
			}
			
			_INDEX = targetIndex;
		}
	};
	var clearOverlays = function (){
		if(confirm('您確定清除所有繪圖？')){
			//MAP.clearOverlays();
			drawControl.clearRecord();
		}
	};
	var changePen = function (){
		/*umapExt.pen.borderColor = $('tool_penColor').style.backgroundColor;
		//umapExt.pen.borderWeight = parseInt($('borderWeight').value);
		var penWeight = $('tool_penWeight').options[$('tool_penWeight').selectedIndex].value;
		//if(
		umapExt.pen.borderWeight = parseInt(penWeight);
		var penOpacity = $('tool_penOpacity').options[$('tool_penOpacity').selectedIndex].value;
		umapExt.pen.borderOpacity = parseFloat(penOpacity);
		umapExt.pen.fillColor = $('tool_bgColor').style.backgroundColor;
		var bgOpacity = $('tool_bgOpacity').options[$('tool_bgOpacity').selectedIndex].value;
		umapExt.pen.fillOpacity = parseFloat(bgOpacity);*/
		var penStyle = {
			borderColor : $('#tool_penColor').css('backgroundColor'),
			borderWeight : $('#tool_penWeight').val(),
			borderOpacity : $('#tool_penWeight').val(),
			fillColor : $('#tool_bgColor').css('backgroundColor'),
			fillOpacity : $('#tool_bgOpacity').val()
		};
		//log(penStyle);
		UDRAW.penStyle.set(penStyle);
	};
	var keyDownFunction = function (evt){
		//evt = U.getEvent(evt);
		if(evt.keyCode == 90 && evt.ctrlKey) {//回復ctrl+z
			UTool.eventBlock(evt);
			drawHistory.go(-1);
		}
		else if(evt.keyCode == 89 && evt.ctrlKey) {//取消回復ctrl+y
			UTool.eventBlock(evt);
			drawHistory.go(1);
		}
		/*else if(evt.keyCode == 78 && evt.ctrlKey) //開新檔案ctrl+n
			if(confirm('您確定放棄目前編輯？')) window.location.reload();*/
		else if(evt.keyCode == 83 && evt.ctrlKey) {//存檔ctrl+s
			UTool.eventBlock(evt);
			drawControl.saveData(PID);
		}/*else if(evt.keyCode == 78 && evt.ctrlKey) {//儲存位置ctrl+n
			log('回復ctrl+z');
		}*/else if(evt.keyCode == 13 && evt.ctrlKey) {//播放ctrl+enter
			UTool.eventBlock(evt);
			drawHistory.play();
		}else if(evt.keyCode == 69 && evt.ctrlKey) {//重設ctrl+r
			UTool.eventBlock(evt);
			//log('重設ctrl+r');
		}else if(evt.keyCode == 38 && evt.ctrlKey) { //上移地圖ctrl+up
			UTool.eventBlock(evt);
			mapControl.panUp();
		}else if(evt.keyCode == 40 && evt.ctrlKey) { //下移地圖ctrl+down
			UTool.eventBlock(evt);
			mapControl.panDown();
		}else if(evt.keyCode == 37 && evt.ctrlKey) { //左移地圖ctrl+up
			UTool.eventBlock(evt);
			mapControl.panLeft();
		}else if(evt.keyCode == 39 && evt.ctrlKey) { //右移地圖ctrl+up
			UTool.eventBlock(evt);
			mapControl.panRight();
		}else if(evt.keyCode == 107 && evt.ctrlKey) { //放大地圖ctrl+ +
			UTool.eventBlock(evt);
			mapControl.zoomIn();
		}else if(evt.keyCode == 109 && evt.ctrlKey) { //縮小地圖ctrl+ -
			UTool.eventBlock(evt);
			mapControl.zoomOut();
		}
	}

	var queryAddr = function(qs){
		var src = "http://blackbing.net/queryAddr/proxy_addrfeedback.php?qs="+qs+"&callback=U.searchCallback";
		
		$.getScript(src);
	}
	var searchCallback = function (data){
		if(typeof data !== 'object')
			return;
		//log(data);
		var record = data['api-data-root']['records']['record'];
		var status = parseInt(record.status_code);
		if(status){
			var lat = parseFloat(record.latitude);
			var lng = parseFloat(record.longitude);
			var latlng = new ULatLng(lat, lng);
			var addr = record.address;
			var msg = record.msg;
			searchMarker.setPoint(latlng);
			//log(latlng.lat() +',' + latlng.lng());
			MAP.centerMap(latlng);
			setTimeout(function(){
				openSearchMarkerInfoWindow(searchMarker, addr, msg);
			}, 200);
			
		}else{
			alert('ohoh');
		}
		searchMarker.searchRecord = record;
	};
	var searchMarkerClicked = function(e, marker, latlng){
		var searchRecord = marker.searchRecord;
		var addr = searchRecord.address;
		var msg = searchRecord.msg;
		openSearchMarkerInfoWindow(marker, addr, msg);
	};
	var openSearchMarkerInfoWindow = function(marker, addr, msg){
		//alert(addr);
		var html = '<span style="color:red;">目前定位至' + addr + '</span>';
		html += '<br>' + msg;
		
		html += '<br>' + '<button onclick="U.removeSearchMarker();">移除查詢地標</button>';
		marker.openInfoWindow(html);
	};
	var removeSearchMarker = function(){
		MAP.removeOverlay(searchMarker);
		
	};
	//init construct
	(function(){
		for(var i in init)
			init[i]();
		//init.windowResize();
		if(userInit)
			userInit();
	})();
	this.removeSearchMarker = removeSearchMarker;
	this.searchCallback = searchCallback;
	this.changePen = changePen;
};
function pickColor(el){
	showColorPicker(el,el.nextSibling, function(){
		el.parentNode.style.backgroundColor = el.nextSibling.value;
		U.changePen();
	});
}

