////////////////////////////////////////////////
// Writed by blackbing@gmail.com 2008/08/12    //
//                                            //
////////////////////////////////////////////////
var _Event = {
	getEvent : function(e) {
		var ev = e || window.event;
		if (!ev) {
			var c = this.getEvent.caller;
			while (c) {
				ev = c.arguments[0];
				if (ev && Event == ev.constructor) {
					break;
				}
				c = c.caller;
			}
		}
		return ev;
	},
	stopPropagation : function(e){
		if(window.event)
	      window.event.cancelBubble = true;
	    if(e && e.stopPropagation)
	      e.stopPropagation();
	},
	cancelDefault: function(e) {
		if(window.event)
			window.event.returnValue = false;
		if(e && e.preventDefault)
			e.preventDefault();
	},
	addEvent : function ( obj, type, fn ) {
		if(type=='mousewheel' && navigator.userAgent.match("Gecko/"))
			type = "DOMMouseScroll";
		if ( obj.attachEvent ) {
			obj['e'+type+fn] = fn;
			obj[type+fn] = function(){obj['e'+type+fn]( window.event );};
			obj.attachEvent( 'on'+type, obj[type+fn] );
		} else
			obj.addEventListener( type, fn, false );
	},
	removeEvent: function ( obj, type, fn ) {
	if ( obj.removeEventListener ) {
		obj.removeEventListener( type, fn, false );
	} else if(obj.detachEvent)
		obj.detachEvent( 'on'+type,  fn );
		obj[type+fn] = null;
	},
	
	getMouseXY : function(e) { 
		var MouseObj = {};
		if (e.pageX || e.pageY){ // this doesn't work on IE6!! (works on FF,Moz,Opera7)
			MouseObj.x = e.pageX ;
			MouseObj.y = e.pageY;
		}
		else if (e.clientX || e.clientY){ 
			MouseObj.x = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
			MouseObj.y = e.clientY + document.body.scrollTop + document.documentElement.scrollTop;
		}
		//MouseObj.x -= _UMap[container].offsetLeft;
		//MouseObj.y -= _UMap[container].offsetTop;
		return MouseObj;
	},
	findTarget: function(ev, node) {
		var target;
		if(window.event && window.event.srcElement)
			target = window.event.srcElement;
		else if(ev && ev.target)
			target = ev.target;
		while(node && target && target.nodeName.toLowerCase()!=node.toLowerCase())
			target = target.parentNode;
		return target;
	},
	wheelDelta: function(ev) {
		return ev.wheelDelta || ev.detail * -40;
	}

};

var UExt = function(_UMap){
	var uext = this;
	var MAX_LEVEL = 10;
	var MIN_LEVEL = 0;
	//var MAX_LEVEL = 15;
	//var MIN_LEVEL = 3;
	var enableWheelZoom = function(){
		var me = _UMap;
		var UMap_zoomIn,UMap_zoomOut,UMap_zoomMap;
		var mapDiv = me.baseMapDiv;
		var wheelSetTime = 0;
		var isIE = !window.opera&&navigator.userAgent.indexOf('MSIE')>=0;
		var smZoom = function(isLarge, doAction){
			//getmapDiv();
			hideDiv();
			var containerWidth = parseInt(me.container.offsetWidth);
			var containerHeifht = parseInt(me.container.offsetHeight);
			//get viewed center
			var mapCoordX = Math.round(containerWidth/2)-parseInt(mapDiv.parentNode.style.left);
			var mapCoordY = Math.round(containerHeifht/2)-parseInt(mapDiv.parentNode.style.top);
			
			var allMapImage = mapDiv.getElementsByTagName('img');
			var imgWidth = 250;//fixed image width
			var imgDegreeValueTotal = isLarge?185:130;
			var imgDegreeValue = isLarge?35:13;
			var imgDegreePerCount = Math.round(imgDegreeValueTotal/imgDegreeValue);
			var tpCount = imgDegreePerCount;
			function enlargeImg(isLarge, doAction)
			{
				var addDegree = isLarge ? 1:-1;
				var tmpLeft = 0;
				var tmpTop = 0;
				var allMapImageLen = allMapImage.length;
				for(var i=0; i<allMapImageLen; i++)
				{
					var originalW = parseInt(allMapImage[i].style.width);
					if(originalW<10)
						break;
					var newW = originalW+(addDegree*imgDegreeValue);
					var oldTop = parseInt(allMapImage[i].style.top);
					var oldLeft = parseInt(allMapImage[i].style.left);
					
					var newP = new getNewPoint(oldLeft, oldTop, originalW, isLarge);
					
					allMapImage[i].style.width = newW.toString() + "px";
					allMapImage[i].style.height = newW.toString() + "px";
					allMapImage[i].style.left = newP.nLeft + "px";
					allMapImage[i].style.top = newP.nTop + "px";
					
				}
				tpCount--;
				if(tpCount >0)	{
					setTimeout(function(){enlargeImg(isLarge, doAction)}, (isIE?10:1));
				}else	{
					tpCount = imgDegreePerCount;
					if(doAction){
						 doAction();
						 showDiv();
					}
				}
			}
			function getNewPoint(left, top, ImgW, isEnlarge)
			{
				var nImgW = ImgW + (isEnlarge ? imgDegreeValue:-imgDegreeValue);
				var percent = nImgW/ImgW;
				var centerX = mapCoordX;
				var centerY = mapCoordY;
				var nLeft = (left - centerX) * percent;
				var nTop = (top - centerY) * percent;
				nLeft += centerX;
				nTop +=  centerY;
				this.nLeft =  Math.floor(nLeft);
				this.nTop =  Math.floor(nTop);
			}
			function hideDiv(){
				var mcLen = mapDiv.parentNode.childNodes.length;
				for(var i=1; i<mcLen; i++){
					mapDiv.parentNode.childNodes[i].style.visibility = 'hidden';
				}
			}
			function showDiv(){
				var mcLen = mapDiv.parentNode.childNodes.length;
				for(var i=1; i<mcLen; i++){
					mapDiv.parentNode.childNodes[i].style.visibility = '';
				}
			}
			enlargeImg(isLarge, doAction);
		};
		var zoomMap = function(slevel){
			var level = me.getZoomLevel();
			var doActFunction = UMap_zoomMap?function(){UMap_zoomMap(slevel)}:null;
			if(level<MAX_LEVEL  && level < slevel)
				smZoom(true, doActFunction);
			else if(level>MIN_LEVEL && level > slevel)
				smZoom(false, doActFunction);
		};
		var zoomIn = function(){
			var level = me.getZoomLevel();
			var doActFunction = UMap_zoomIn?UMap_zoomIn:me.zoomIn;
			if(level<MAX_LEVEL)
				smZoom(true, doActFunction);
		};
		var zoomOut = function(){
			var level = me.getZoomLevel();
			var doActFunction = UMap_zoomOut?UMap_zoomOut:me.zoomOut;
			if(level>MIN_LEVEL)
				smZoom(false, doActFunction);
		};
		var mapMouseWheelControl = function(ev){
			_Event.stopPropagation(ev);
			_Event.cancelDefault(ev);
			if(!wheelSetTime)
				wheelSetTime = setTimeout(function(){wheelSetTime = 0}, 300);//避免滾太多次
			else
				return;
			var wheelDelta = _Event.wheelDelta(ev);
			if(wheelSetTime && wheelDelta>=120)
				zoomOut();
			else if(wheelSetTime && wheelDelta<=-120)
				zoomIn();
		};
		/*var enableWheelZoom = function(){
			alert("test");
			_Event.addEvent(me.container, 'mousewheel', mapMouseWheelControl);
		};*/
		var init = (function(){
			UMap_zoomIn = me.zoomIn;
			UMap_zoomOut = me.zoomOut;
			UMap_zoomMap = me.zoomMap;
			me.zoomIn = zoomIn;
			me.zoomOut = zoomOut;
			me.zoomMap = zoomMap;
			_Event.addEvent(me.container, 'mousewheel', mapMouseWheelControl);
		})();
	};
	var addFlash = function(url, width, height, latlng, upoint, flashvars){
		var dom = document.createElement('div');
		var currentId = 'flashobj' + new Date().getTime();
		dom.innerHTML = '<embed name="'+currentId+'" height="'+height+'" width="'+width+'" wmode="transparent" align="middle" type="application/x-shockwave-flash" flashvars="'+flashvars+'" salign="" allowscriptaccess="always" allowfullscreen="false" menu="true" bgcolor="#ffffff" devicefont="false" wmode="window" scale="showall" loop="true" play="true" pluginspage="http://www.macromedia.com/go/getflashplayer" quality="high" src="'+url+'"/>';
	    var adom = new UDom(dom, latlng, upoint);
	    _UMap.addOverlay(adom);
	    dom.flashId = currentId;
	    return dom;
	};
	//框選地圖放大模式
	var boxEnlargeMode = function(_UDraw){
		var me = this;
		_UMap.container.style.cursor = 'move';
		//var _UDraw = new UDraw(me);
		var udrawReady = _UDraw.ready;
		if(!udrawReady) 
			_UDraw.init();
		var callback = function(res){
			var polygon = res.overlay;
			var vertexCount = polygon.getVertexCount();
			var bounds = new UBounds();
			for(var i=0; i<vertexCount; i++){
				bounds.extend(polygon.getVertex(i));
			}
			try{
				var boundCenter = bounds.getCenter();
				var zoomLevel = _UMap.getBoundsZoomLevel(bounds);
				_UDraw.removeDrawRecordListbyId(res.id);
				_UMap.zoomMap(zoomLevel+1);
				_UMap.centerMap(boundCenter);
				_UDraw.cancelDrawMode();
			}finally{
				bounds = null;
			}
		};
		var myPen = {borderColor:'grey', borderWeight:'2', borderOpacity:'0.8', fillColor:'#FFF', fillOpacity:'0.5'};
		_UDraw.penStyle.set(myPen);
		_UDraw.drawBound(callback);
		_UDraw.showTooltip = false;
	};
	//增加中心交叉點在地圖上
	var addStaticCrossCenter = function(){
		var centerCross1 = document.getElementById('_centerCross1')?document.getElementById('_centerCross1'):document.createElement('div');
		centerCross1.id='_centerCross1';
		centerCross1.style.cssText = 'line-height:6px;display:block;border-right:3px solid red;border-bottom:3px solid red;width:10px;height:10px;';
		//centerCross1.innerHTML = '&nbsp;';
		var centerCross2 = document.getElementById('_centerCross2')?document.getElementById('_centerCross2'):document.createElement('div');
		centerCross2.id='_centerCross2';
		centerCross2.style.cssText = 'line-height:6px;display:block;border-left:3px solid red;border-top:3px solid red;width:10px;height:10px;';
		var centerloading = document.getElementById('_centerloading')?document.getElementById('_centerloading'):document.createElement('div');
		centerloading.id='_centerloading';
		//centerloading.style.cssText = 'background-image:url(img/ajax-loader.gif);width:16px;height:16px;display:none;';
		centerloading.style.cssText = 'background-image:url(http://www.nacldesign.com/blog_mistacar/images/xuan_sweat1.gif);width:50px;height:50px;display:none;';
		//centerCross2.innerHTML = '&nbsp;';
		var UDOMcenterCross1 = new UDom(centerCross1);
		var UDOMcenterCross2 = new UDom(centerCross2);
		var UDOMcenterloading = new UDom(centerloading);
		_UMap.addStaticOverlay(UDOMcenterCross1, UCenterCenter, new UPoint(-12,-12));
		_UMap.addStaticOverlay(UDOMcenterCross2, UCenterCenter, new UPoint(-2,-2));
		_UMap.addStaticOverlay(UDOMcenterloading, UCenterCenter, new UPoint(-25,-25));
	};
	this.enableWheelZoom = enableWheelZoom;
	this.addFlash =addFlash;
	this.boxEnlargeMode = boxEnlargeMode;
	this.addStaticCrossCenter = addStaticCrossCenter;
};





/*
var rcmenu = new UMenu(map);
	rcmenu.addMenu("設定此處為起點", function(){alert(0);});
	rcmenu.addMenu("設定此處為終點", function(){alert(1);});
	rcmenu.addMenu("查詢經緯度座標", function(){alert(2);});
	rcmenu.addMenu("新增地標點", function(){alert(3);});
	rcmenu.addMenu("設定個人地點", function(){alert(4);});
	rcmenu.addMenu("回報此處地址", function(){alert(5);});
	rcmenu.addMenu("關閉選單", null);
*/
function UMenu(_UMap, color){
	var me = this;
	var color = color?color:'orange';//green || black || orange
	//var server = 'http://127.0.0.1/urmapExt/';
	var server = 'js/urmapExt/';
	var imgSrc = server+'img/RCMenu/'+color+'/';
	var menuCssSrc = server+'img/RCMenu/rcmenu.css';
	var timeStamp = new Date().getTime()
	var menuHtml = ['<div id="contentMenu"><table border="0" cellpadding="0" cellspacing="0">',
	'<tr>',
		'<td >',
			'<img src="'+imgSrc+'tb_01.png" width="10" height="20"></td>',
		'<td align="right" background="'+imgSrc+'tb_02bg.png">',
			'<img src="'+imgSrc+'tb_02.png" width="100" height="20"></td>',
		'<td >',
			'<img src="'+imgSrc+'tb_03.png" width="10" height="20"></td>',
	'</tr>',
	'<tr>',
		'<td background="'+imgSrc+'tb_04.png">',
			'<img src="'+imgSrc+'tb_04.png" width="10" height="10"></td>',
		'<td background="'+imgSrc+'tb_05.png">',
		'<ul id="RCCONTENT">',
        //'<li><a href="#"> 設定此處為起點</a></li>',
        '</ul>',
		'</td>',
		'<td background="'+imgSrc+'tb_06.png">',
			'<img src="'+imgSrc+'tb_06.png" width="10" height="10"></td>',
	'</tr>',
	'<tr>',
		'<td >',
			'<img src="'+imgSrc+'tb_07.png" width="10" height="20"></td>',
		'<td  align="right" background="'+imgSrc+'tb_08bg.png">',
			'<img src="'+imgSrc+'tb_08.png" width="100" height="20"></td>',
		'<td >',
			'<img src="'+imgSrc+'tb_09.png" width="10" height="20"></td>',
	'</tr>',
'</table>',
  '</div>'];
	var RCMenu = null;// = document.createElement('div');
	var RCContent = null;
	var offsetW = 0;
	var offsetH = 0;
	var showMenu = function(isShow){
		//if(typeof jQuery === "function"){
		//	isShow?$('#contentMenu').parent().show('fast'):$('#contentMenu').parent().hide();
		//}else{
			RCMenu.style.display = isShow?"block":"none";
		//}
		if(isShow)
			offsetH = RCContent.clientHeight;
		//log(offsetH);
	};
	var loadCss = function(name, href){
		//避免重複loading CSS
		if(document.getElementById(name))
			return;
		var css = document.createElement('link');
		css.id = name;
		css.type = 'text/css';
		css.rel = 'stylesheet';
		css.href = href;
		try{
			document.getElementsByTagName('head')[0].appendChild(css);
		}finally{
			document.body.appendChild(css);
		}
	};
	var addMenu = function(name, func, dontHide){
		var currentMenu = document.createElement('li');
		if(func){
			var link = document.createElement('a');
			link.className = color;
			link.href = "javascript:void(0);";
			if(typeof name == 'string')
				link.innerHTML = name;
			else
				link.appendChild(name);
			link.onclick = function(evt){
				if(func)
					func();
			//	_Event.stopPropagation(evt);
			//	_Event.cancelDefault(evt);
				//log(this);
				if(!dontHide)
					setTimeout(me.hide, 0);
			};
			currentMenu.appendChild(link);
		}else{
			if(typeof name == 'string')
				currentMenu.innerHTML = name;
			else
				currentMenu.appendChild(name);
		}
		RCContent.appendChild(currentMenu);
		offsetW = RCContent.clientWidth;
		offsetH = RCContent.clientHeight;
		//log(currentMenu.clientHeight);
	};
	var getNode = function(idx){
		return RCContent.childNodes[idx];
	};
	this.show = function(latlng){
		var pt = _UMap.transformLatLngToContainerCoordinates(latlng);
		var containerPoint = new UPoint(_UMap.container.offsetWidth, _UMap.container.offsetHeight);
		//log(_UMap.container);
		var RCMenuPoint = new UPoint(offsetW, offsetH);
		//log(RCMenuPoint);
		var left = pt.x + _UMap.container.offsetLeft;
		var top = pt.y + _UMap.container.offsetTop;
		if((containerPoint.x - pt.x) < RCMenuPoint.x)
			left -= RCMenuPoint.x;
		if((containerPoint.y - pt.y) < RCMenuPoint.y)
			top -= RCMenuPoint.y;
		RCMenu.style.left = left + "px";
		RCMenu.style.top = top + "px";
		showMenu(true);
	};
	this.hide = function(){
		showMenu(false);
	};
	this.addMenu = addMenu;
	this.getNode = getNode;
    var init = (function(){
    	loadCss('RCMENU', menuCssSrc);
    	RCMenu = document.createElement('div');
		RCMenu.style.cssText = 'position:absolute;left:-1000px;top:-1000px;z-index:1000;';
		//RCMenu.style.display = 'none';
		RCMenu.innerHTML = menuHtml.join('');
		document.body.appendChild(RCMenu);
		RCContent = document.getElementById('RCCONTENT');
		RCContent.id += timeStamp;
		RCContent.className = color;
		RCContent = document.getElementById('RCCONTENT'+timeStamp);
	})();
}
//marker ext
if(UMarker){
	UMarker.prototype.reset = function(){
		this.setPoint(new ULatLng(0,0));
	};
}
