var gmap;
var geocoder;
var center_cursor;

var red_line;
var red_icons = new Array();
var red_icon_event1 = new Array();	// marker dblclick
var red_icon_event2 = new Array();	// marker dragend
var red_icon_event3 = new Array();	// marker mouseover
var red_icon_event4 = new Array();	// marker mouseout
var red_icon_event5 = new Array();	// marker dragstart

var blue_line;
var blue_icons = new Array();
var blue_icon_event1 = new Array();	// marker dblclick
var blue_icon_event2 = new Array();	// marker dragend
var blue_icon_event3 = new Array();	// marker mouseover
var blue_icon_event4 = new Array();	// marker mouseout
var blue_icon_event5 = new Array();	// marker dragstart

var z_lv = 0;
var m_type = 1;
var center = null;
var changeflg = 1;

var objRegExp1 = new RegExp();
var objRegExp2 = new RegExp();

function init(){
	$("route_url").focus();
	center = const_center;
	z_lv = const_z_lv;
	$("address").value = const_input_address;
	
	objRegExp1.compile("^-{0,1}[0-9]{1,3}\\.{0,1}[0-9]{1,6}$");
	objRegExp2.compile("^-{0,1}[0-9]{1,3}$");
	$("red").checked = true;
	gmap = new GMap2($("map"));
	//gmap.enableScrollWheelZoom();  
	gmap.enableContinuousZoom();
	readURL();
	gmap.addControl(new GLargeMapControl());
	gmap.addControl(new GScaleControl());
	gmap.addControl(new GOverviewMapControl(new GSize(100,100))); 
	gmap.addControl(new GMapTypeControl());
	new GKeyboardHandler(gmap);
	center_cursor = new CenterCursor();
	gmap.addOverlay(center_cursor);
	geocoder = new GClientGeocoder();
	GEvent.addListener(gmap,"click",ev_click);
	
	//GEvent.addDomListener(document.getElementById("map"),"DOMMouseScroll", CancelEvent); // Firefox
	//GEvent.addDomListener(document.getElementById("map"), "mousewheel", CancelEvent); // IE
	
	
	if( navigator.userAgent.match("MSIE")){ $("map").attachEvent( "onmousewheel" , mouseWheelZooming ); }
	if( navigator.userAgent.match("Gecko")){ $("map").addEventListener( "DOMMouseScroll" , mouseWheelZooming , false ); }
	if( navigator.userAgent.match("Safari")){ $("map").onmousewheel = mouseWheelZooming; }
	resize();
	
	gmap.setCenter(center,z_lv);
	
	if(getCurLine()==1){
		changeflg = 1;
	}else{
		changeflg = 2;
	}
	
	gmap.disableDoubleClickZoom();

}

function makeURL(){
	if(getCurLine()==1){
		makeURL_main(red_icons);
	}else{
		makeURL_main(blue_icons);
	}	
}

function makeURL_main(icons){
	var url = const_url;
	url = url + "?z="+gmap.getZoom();
	var cur_m_type = gmap.getCurrentMapType();
	if(cur_m_type == G_NORMAL_MAP){
		url = url + "&t=1";
	}else if(cur_m_type == G_HYBRID_MAP){
		url = url + "&t=2";
	}else if(cur_m_type == G_SATELLITE_MAP){
		url = url + "&t=3";
	}
	url = url + "&c="+gmap.getCenter().toUrlValue();
	
	var len = icons.length;
	for(idx1=0; idx1<len; idx1++){
		if(idx1==0){
			url = url + "&p=";
		}
		url = url + icons[idx1].getPoint().toUrlValue()+"_";
	}
	$("route_url").value = url;
	
	$("route_url").focus();
	$("route_url").select();
	
}

function readURL(){
	var url_str = location.search;
	if(url_str.length > 1){
		$("exp").style.display="none";
		var sp_amp = url_str.substring(1,url_str.length).split("&");
		var len = sp_amp.length;
		for(idx1=0; idx1<len; idx1++){
		 	var sq_eq = sp_amp[idx1].split("=");
		 	if(sq_eq.length == 2){
				var item_name = sq_eq[0];
				var item_val = sq_eq[1];
				if(item_name == "z" && isNum(item_val)){
					z_lv = Number(item_val);
				}
				else if(item_name == "t" && isNum(item_val)){
					m_type = Number(item_val);
				}
				else if(item_name == "c"){
					var point = item_val.split(",");
					if(point.length == 2 && isNum(point[0]) && isNum(point[1])){
						center = new GLatLng(point[0],point[1]);
					}
				}
				else if(item_name == "p"){
					gmap.setCenter(center ,z_lv);
					
					if(m_type == 1){
						gmap.setMapType(G_NORMAL_MAP);
					}else if(m_type == 2){
						gmap.setMapType(G_HYBRID_MAP);
					}else if(m_type == 3){
						gmap.setMapType(G_SATELLITE_MAP);
					}
					
					var latlngs = item_val.split("_");
					var len2 = latlngs.length;
					for(idx2=0;idx2<len2;idx2++){
						var point = latlngs[idx2].split(",");
						if(point.length == 2 && isNum(point[0]) && isNum(point[1])){
							if(getCurLine()==1){
								addIcon(new GLatLng(point[0],point[1]),red_icons,red_icon_event1,red_icon_event2,red_icon_event3,red_icon_event4,red_icon_event5);
								getDistance(red_icons);
							}else{
								addIcon(new GLatLng(point[0],point[1]),blue_icons,blue_icon_event1,blue_icon_event2,blue_icon_event3,blue_icon_event4,blue_icon_event5);
								getDistance(blue_icons);
							}
						}
					}
					if(getCurLine()==1){
						getDistance(red_icons);
					}else{
						getDistance(blue_icons);
					}
				}
			}
		}
	}
	if(!gmap.isLoaded()){

		$("exp").style.display="";
		gmap.setCenter(center ,z_lv);
	}
	
}

function isNum(item_value){
	var result = false;
	
	if(objRegExp1.test(item_value) || objRegExp2.test(item_value)){
		result = true;
	}
	
	return result;
}

function mouseWheelZooming(event){
	if( navigator.userAgent.match( "MSIE" ) ){ var delta = event.wheelDelta; event.returnValue = false; }
	if( navigator.userAgent.match( "Gecko" ) ){ var delta = event.detail * -1; event.preventDefault(); }
	if( navigator.userAgent.match( "Safari" ) ){ var delta = event.wheelDelta; event.returnValue = false; }
	if(delta < 0){
		gmap.zoomOut();
	}else{
		gmap.zoomIn();
	}
}


function resize(){
	iniSize();
	if(gmap != null){
		gmap.checkResize();
		if(center_cursor != null){
			center_cursor.redraw();
		}
	}
}

function iniSize(){
	$("map").style.height = (getHeight()-80)+"px";
	$("map").style.width  = (getWidth()-200)+"px";
}

function getHeight() {
	if (window.self && self.innerHeight) {
		return self.innerHeight;
	}
	if (document.documentElement && document.documentElement.clientHeight) {
		return document.documentElement.clientHeight;
	}
	return 300;
}

function getWidth() {
	if (window.self && self.innerWidth) {
		return self.innerWidth;
	}
	if (document.documentElement && document.documentElement.clientWidth) {
		return document.documentElement.clientWidth;
	}
	return 400;
}

function move(){

	var address = $("address").value;

	if(address.length == 0){
		return;
	}
	else if(address == const_input_address){
		return;
	}

	geocoder.getLatLng(
	  address,
	  function(point) {
		if (!point) {
		  alert("\""+address+"\""+const_cant_move);
		} else {
		  gmap.setCenter(point);
		}
	  }
	);
	
	$('exp').style.display='none';
}


function lineClear(){
	$('exp').style.display='none';
	if(getCurLine()==1){
		lineClearMain(red_icons,red_icon_event1,red_icon_event2,red_icon_event3,red_icon_event4,red_icon_event5,red_line);
		red_icons = new Array();
		red_icon_event1 = new Array();
		red_icon_event2 = new Array();
		red_icon_event3 = new Array();
		red_icon_event4 = new Array();
		red_icon_event5 = new Array();
		if(red_line != null){
			gmap.removeOverlay(red_line);
		}
	}else{
		lineClearMain(blue_icons,blue_icon_event1,blue_icon_event2,blue_icon_event3,blue_icon_event4,blue_icon_event5,blue_line);
		blue_icons = new Array();
		blue_icon_event1 = new Array();
		blue_icon_event2 = new Array();
		blue_icon_event3 = new Array();
		blue_icon_event4 = new Array();
		blue_icon_event5 = new Array();
		if(blue_line != null){
			gmap.removeOverlay(blue_line);
		}
	}
}

function lineClearMain(icons,icon_event1,icon_event2,icon_event3,icon_event4,icon_event5,line){
	getResultObj().style.display = "none";
	var len = icons.length;
	for (i=0; i < len; i++){
		if(icons[i] != null){
			GEvent.removeListener(icon_event1[i]);
			GEvent.removeListener(icon_event2[i]);
			GEvent.removeListener(icon_event3[i]);
			GEvent.removeListener(icon_event4[i]);
			GEvent.removeListener(icon_event5[i]);
			gmap.removeOverlay(icons[i]);
		}
	}
}

function ev_click(ov,pos){
	if(pos){
		$('exp').style.display='none';
		if(getCurLine()==1){
			addIcon(pos,red_icons,red_icon_event1,red_icon_event2,red_icon_event3,red_icon_event4,red_icon_event5);
			getDistance(red_icons);
		}else{
			addIcon(pos,blue_icons,blue_icon_event1,blue_icon_event2,blue_icon_event3,blue_icon_event4,blue_icon_event5);
			getDistance(blue_icons);
		}
	}else{
		
	}
}



function addIcon(pos,icons,icon_event1,icon_event2,icon_event3,icon_event4,icon_event5){
	if(icons.length >= 50){
		alert(const_too_many_point);
		return;
	}
	var idx = icons.length;
	var mk = new GMarker(pos,{draggable:true,bouncy:true,bounceGravity:2});
	gmap.addOverlay(mk);
	var len = icons.length;
	if(idx == 0){
		mk.setImage("./s_mk.png");
	}else if(idx == len){
		if(idx-1 != 0){
			icons[idx-1].setImage("./marker.png");
		}
		mk.setImage("./e_mk.png");
	}
	icons[icons.length] = mk;
	icon_event1[icon_event1.length] = GEvent.addListener(mk,"dblclick",del);
	icon_event2[icon_event2.length] = GEvent.addListener(mk,"dragend",d_end);
	icon_event3[icon_event3.length] = GEvent.addListener(mk,"mouseover",d_def);
	icon_event4[icon_event4.length] = GEvent.addListener(mk,"mouseout",c_def);
	icon_event5[icon_event5.length] = GEvent.addListener(mk,"dragstart",d_start);
		
	function del(){deleteIcon(idx,icons);}
	function d_def(){dispDef(idx,icons);}
	function c_def(){closeDef(idx,icons);}
	function d_end(){drag_end(idx,icons);}
	function d_start(){drag_start(idx,icons);}
}



function setIcon(idx,icons,icon_event1,icon_event2,icon_event3,icon_event4,icon_event5){
	pos= icons[idx].getPoint();
	getResultObj().style.display = "none";			
	var mk = new GMarker(pos,{draggable:true,bouncy:true,bounceGravity:2});
	gmap.addOverlay(mk);
	var len = icons.length;
	if(idx == 0){
		mk.setImage("./s_mk.png");
	}else if(idx == len-1){
		mk.setImage("./e_mk.png");
	}
	icons[idx] = mk;
	icon_event1[idx] = GEvent.addListener(mk,"dblclick",del);
	icon_event2[idx] = GEvent.addListener(mk,"dragend",d_end);
	icon_event3[idx] = GEvent.addListener(mk,"mouseover",d_def);
	icon_event4[idx] = GEvent.addListener(mk,"mouseout",c_def);
	icon_event5[idx] = GEvent.addListener(mk,"dragstart",d_start);
		
	function del(){deleteIcon(idx,icons);}
	function d_def(){dispDef(idx,icons);}
	function c_def(){closeDef(idx,icons);}
	function d_end(){drag_end(idx,icons);}
	function d_start(){drag_start(idx,icons);}
}

function deleteIcon(idx,icons){
	$("msg").style.display = "none";
	
	var points = new Array();
	var cnt = 0;
	var len = icons.length;
	for(i=0; i<len; i++){
		if(i != idx){
			points[cnt] = icons[i].getPoint();
			++cnt;
		}
	}

	lineClear();	
	len = points.length;
	if(getCurLine()==1){
		for(idx1=0; idx1<len; idx1++){
			addIcon(points[idx1],red_icons,red_icon_event1,red_icon_event2,red_icon_event3,red_icon_event4,red_icon_event5);
		}
		getDistance(red_icons);
	}else{
		
		for(idx2=0; idx2<len; idx2++){
			addIcon(points[idx2],blue_icons,blue_icon_event1,blue_icon_event2,blue_icon_event3,blue_icon_event4,blue_icon_event5);
		}
		getDistance(blue_icons);
	}

}

function dispDef(idx,icons){
	if(idx < 1){return;}

	var posCur = icons[idx].getPoint();
	var posPre = icons[idx-1].getPoint();
	var pix = gmap.fromLatLngToDivPixel(posCur);
	var wk = $("msg");
	
	var base_point = gmap.fromLatLngToDivPixel(gmap.fromContainerPixelToLatLng(new GPoint(0,-70)));
	
	var distance = posCur.distanceFrom(posPre);
	distance = Math.floor(distance * 10) / 10;
	var str = "";
	str = str + "<p><font style=\"font-size:90%;\">"+ Math.floor(distance/1000*100) / 100 + const_unit_km + "</font></p>";
	str = str + "<p><font style=\"font-size:90%;\">"+ distance + const_unit_m + "</font></p>";
	str = str + "<p><font style=\"font-size:90%;\">"+ Math.floor(distance/1.609344) / 1000 + const_unit_mile + "</font></p>";
	str = str + "<p><font style=\"font-size:90%;\">"+ Math.floor(distance/1.852) / 1000 + const_unit_n_mile + "</font></p>";
	str = str + "<p><font style=\"font-size:90%;\">"+ Math.floor(distance*(100/0.9144) ) / 100 + const_unit_yard + "</font></p>";
	wk.innerHTML = str;
	wk.style.left = (pix.x - base_point.x) + "px";
	wk.style.top  = (pix.y - base_point.y) + "px";
	wk.style.display = "";
	
}

function closeDef(idx,icons){
	var wk = $("msg");
	wk.innerHTML = "";
	wk.style.display = "none";
}

function drag_start(idx,icons){
	$("msg").style.display = "none";
}

function drag_end(idx,icons){
	$("msg").style.display = "none";
	if(getCurLine()==1){
		getDistance(red_icons);
	}else{
		getDistance(blue_icons);
	}
	dispDef(idx,icons);
}

function redIcon(){
	if(changeflg == 2){
		var len = blue_icons.length;
		for(idx1=0;idx1<len;idx1++){
			GEvent.removeListener(blue_icon_event1[idx1]);
			GEvent.removeListener(blue_icon_event2[idx1]);
			GEvent.removeListener(blue_icon_event3[idx1]);
			GEvent.removeListener(blue_icon_event4[idx1]);
			GEvent.removeListener(blue_icon_event5[idx1]);
			gmap.removeOverlay(blue_icons[idx1]);
		}
	
		len = red_icons.length;
		for(idx2=0;idx2<len;idx2++){
			setIcon(idx2,red_icons,red_icon_event1,red_icon_event2,red_icon_event3,red_icon_event4,red_icon_event5);
		}
		getDistance(red_icons);
		changeflg = 1;
	}
}

function blueIcon(){
	if(changeflg == 1){
		var len = red_icons.length;
		for(idx1=0;idx1<len;idx1++){
			GEvent.removeListener(red_icon_event1[idx1]);
			GEvent.removeListener(red_icon_event2[idx1]);
			GEvent.removeListener(red_icon_event3[idx1]);
			GEvent.removeListener(red_icon_event4[idx1]);
			GEvent.removeListener(red_icon_event5[idx1]);
			gmap.removeOverlay(red_icons[idx1]);			
		}
	
		len = blue_icons.length;
		for(idx2=0;idx2<len;idx2++){
			setIcon(idx2,blue_icons,blue_icon_event1,blue_icon_event2,blue_icon_event3,blue_icon_event4,blue_icon_event5);
		}
		getDistance(blue_icons);
		changeflg = 2;
	}
}

function getDistance(icons){
	
	var distance = 0;
	var prev;
	var current;
	var len = icons.length;
	for(i=0; i<len; i++){
		current = icons[i].getPoint();
		if(i>=1){
			distance = distance + wk.distanceFrom(current);
		}
		wk = current;
	}
	
	var result = getResultObj();
	result.style.display = "none";
	distance = Math.floor(distance * 10) / 10;
	var str = "";
	str = str + "<p><font style=\"font-size:90%;font-weight:bold;\">"+ Math.floor(distance/1000*100) / 100 + const_unit_km + "</font></p>";
	str = str + "<p><font style=\"font-size:90%;font-weight:bold;\">"+ distance + const_unit_m + "</font></p>";
	str = str + "<p><font style=\"font-size:90%;font-weight:bold;\">"+ Math.floor(distance/1.609344) / 1000 + const_unit_mile + "</font></p>";
	str = str + "<p><font style=\"font-size:90%;font-weight:bold;\">"+ Math.floor(distance/1.852) / 1000 + const_unit_n_mile + "</font></p>";
	str = str + "<p><font style=\"font-size:90%;font-weight:bold;\">"+ Math.floor(distance*(100/0.9144) ) / 100 + const_unit_yard + "</font></p>";
	result.innerHTML = str;
	result.style.display = "";
	
	drawLine(icons);
}

function drawLine(icons){
	if(getCurLine() == 1){
		if(red_line != null){
			gmap.removeOverlay(red_line);
		}
	}else{
		if(blue_line != null){
			gmap.removeOverlay(blue_line);
		}
	}
	var points = new Array();
	for(i=0; i<icons.length; i++){
		points[i] = icons[i].getPoint();
	}
	
	if(getCurLine() == 1){
		red_line  = new GPolyline(points, "#FF0000",10);
		gmap.addOverlay(red_line);
	}else{
		blue_line = new GPolyline(points, "#0000FF",10);
		gmap.addOverlay(blue_line);
	}
}

function disp_exp(ev){
	var exp = $("exp");
//	var left = Event.pointerX(ev)-200;
//	var top  = Event.pointerY(ev)-200;
//	if(left < 0){left=0;}
//	if(top  < 0){top=0;}
//	exp.style.left = left + "px";  
//	exp.style.top  = top + "px";


	exp.style.display = "";
}

function getCurLine(){
	if($("blue").checked == true){
		return 2;
	}else{
		return 1;
	}
}

function getResultObj(){
	if($("blue").checked == true){
		return $("result2");
	}else{
		return $("result1");
	}
}

function CancelEvent(event)
{
	e = event;
	if (typeof e.preventDefault  == 'function') 
		e.preventDefault();
	if (typeof e.stopPropagation == 'function')
		e.stopPropagation();
	if (window.event) {
		window.event.cancelBubble = true; // for IE
		window.event.returnValue = false; // for IE
	}
}


function CenterCursor(pos){}
CenterCursor.prototype = new GControl();
CenterCursor.prototype.initialize = function(map){
	this.box_ = document.createElement("div");
	var url = "./center.gif";
	this.box_.style.backgroundImage = "url("+url+")";
	this.box_.style.width = "31px";
	this.box_.style.height = "31px";
	this.box_.style.position = "absolute";
	
	var c1 = map.fromLatLngToDivPixel(map.getCenter());
	this.box_.style.left = (c1.x-16) + "px";
	this.box_.style.top  = (c1.y-16) + "px";
	
	map.getPane(G_MAP_MAP_PANE).appendChild(this.box_);
	this.map_ = map;
}
CenterCursor.prototype.redraw = function(force){
	if(force) return;
	var c1 = this.map_.fromLatLngToDivPixel(this.map_.getCenter());
	this.box_.style.left = (c1.x-16) + "px";
	this.box_.style.top  = (c1.y-16) + "px";
}
CenterCursor.prototype.copy = function(){return new CenterCursor(this.pos_);}
CenterCursor.prototype.remove = function(){this.box_.parentNode.removeChild(this.box_);}
