/* google map objects */
var ohttp = null;
/*GMap2 オブジェクト*/
var map = null;
/*証明写真機のアイコンオブジェクト*/
var icon = null;
/*地図の中央を表すアイコンオブジェクト*/
var centericon = null;
/*地図の位置検索用のgeocorderオブジェクト*/
var geocoder = null;
/*地図の縮尺変更用のバーコントロール*/
var olargemapctrl = null;
/*地図の種類(地図,航空写真,地図+写真)コントロール*/
var omaptypectrl = null;
/*位置登録アイコンオブジェクト*/
var regmarker = null;

/* status */
/*登録・閲覧モードフラグ(0:閲覧モード,1:登録モード)*/
var mode = 0;
/*証明写真機検索時の公開・非公開種類*/
var publictype = '';
/*右ブロックの証明写真機情報表示数*/
var pagesize = 5;
/*右ブロックの証明写真機情報表示ページカウント用*/
var idxpage = 0;
/*右ブロックの現在の証明写真機情報表示ページ*/
var thispage = 0;
/*地図の縮尺レベル*/
var thiszoomlevel = 13;
/*証明写真機の再描画フラグ(ture:描画する,false:描画しない)*/
var flgreload = true;
/*証明写真機アイコンクリック時の関数を格納する配列*/
var afuncs = new Array();
/*編集ボタンクリック時の関数を格納する配列*/
var aeditfuncs = new Array();

function mapView(vx, vy){
	var idx;

	if(!document.getElementById('map'))return false;

	ohttp = GXmlHttp.create();

	if(GBrowserIsCompatible() && ohttp){
		var defPoint;
		//map
		map = new GMap2(document.getElementById('map'));
		olargemapctrl = new GLargeMapControl();
		omaptypectrl = new GMapTypeControl();
		map.addControl(olargemapctrl);
		map.addControl(omaptypectrl);
		map.setCenter(new GLatLng(vy, vx), 16);

		//icon
		icon = new GIcon();
		icon.image = '/img/map/1.png';
		icon.shadow = '/img/map/navikage.png';
		icon.iconSize = new GSize(29, 41);
		icon.shadowSize = new GSize(48, 42);
		icon.iconAnchor = new GPoint(15, 41);
		icon.infoWindowAnchor = new GPoint(25, 20);
		//centericon
		centericon = new GIcon();
		centericon.image = '/img/map/center.png';
		//centericon.shadow = '/img/map/centerkage.png';
		centericon.iconSize = new GSize(32, 32);
		//centericon.shadowSize = new GSize(50, 32);
		centericon.iconAnchor = new GPoint(16, 25);
		centericon.infoWindowAnchor = new GPoint(16, 0);

		//geocoder
		geocoder = new GClientGeocoder();

		window.setTimeout(function(){map.panTo(new GLatLng(vy, vx));}, 1000);

		GEvent.addListener(map, 'dragstart', function(){flgreload = true;});
		GEvent.addListener(map, 'movestart', mapMovestart);
		GEvent.addListener(map, 'moveend', mapMoveend);
		GEvent.addListener(map, 'zoomend', mapZoomend);
		GEvent.addListener(map, 'click', putRegMarker);

		map.setCenter(new GLatLng(vy, vx), thiszoomlevel);

//		defPoint = new GPoint(vx, vy);
//		map.addOverlay(new GMarker(defPoint));
	}
}

/*「読み込み中」を表示させる*/
function nowloading(){
	if(document.getElementById('idnowloading')){
		document.getElementById('idnowloading').style.display = 'block';
	}
}

/*証明写真機を描画する*/
function drawSpeedPicture(){
	var nelat = map.getBounds().getNorthEast().lat();
	var nelng = map.getBounds().getNorthEast().lng();
	var swlat = map.getBounds().getSouthWest().lat();
	var swlng = map.getBounds().getSouthWest().lng();
	var picturetype = '';
	var publictype = '';

	for(var idx = 0; document.getElementsByName('conf_pt')[idx]; idx++){
		if(document.getElementsByName('conf_pt')[idx].checked == true)picturetype = document.getElementsByName('conf_pt')[idx].value;
	}

	for(var idx = 0; document.getElementsByName('conf_publictype')[idx]; idx++){
		if(document.getElementsByName('conf_publictype')[idx].checked == true)publictype = document.getElementsByName('conf_publictype')[idx].value;
	}

	thiszoomlevel = map.getZoom();
	ohttp.open('GET', '/echo/speedpicture.asp?v1=' + nelat + '&v2=' + nelng + '&v3=' + swlat + '&v4=' + swlng + '&v5=' + picturetype + '&v6=' + publictype, true);
	ohttp.onreadystatechange = viewOverlaysXML;
	ohttp.send(null);
}

/*地図移動の開始時に「読み込み中」を表示させる*/
function mapMovestart(){
	nowloading();
}

/*地図の縮尺変化が終了したタイミングで証明写真機を描画させる*/
function mapMoveend(){
	drawSpeedPicture();
}

/*地図の縮尺変化が終了したタイミングで証明写真機を描画させる*/
function mapZoomend(){
	flgreload = true;
	drawSpeedPicture();
}

/*地図上をクリックした際に登録用アイコンを置き、その緯度・経度を取得する*/
function putRegMarker(vmarker, vbounds){
	var point;
	if(!vbounds)return;
	if(mode != 1){
		document.getElementById('lat').value = '';
		document.getElementById('lng').value = '';
		return;
	}

	point = new GPoint(vbounds.lng(), vbounds.lat());
	document.getElementById('lat').value = vbounds.lat();
	document.getElementById('lng').value = vbounds.lng();
	map.clearOverlays();
	icon.image = '/img/map/new.png'
	regmarker = createRegMarker(point, icon);
	map.addOverlay(regmarker);
}

/*証明写真機アイコンを描画する*/
function viewOverlaysXML(){
	var oxml;
	var oxml2;
	var osp;
	var stxt = '';
	var center = map.getCenter();

	if(ohttp.readyState == 4){
		if(flgreload){
			afuncs = new Array();
			aeditfuncs = new Array();
			map.clearOverlays();
			oxml = ohttp.responseXML;
			osp = oxml.documentElement.getElementsByTagName('spdata');

			//centericon
			map.addOverlay(new GMarker(new GPoint(center.lng(), center.lat()), centericon));

			for(idx = 0, idxpage = 0; idx < osp.length; idx++){
				if(idx % pagesize == 0){
					idxpage = idxpage + 1;
					stxt = stxt + '<p style="float:left; margin:0px 4px 0px 0px; text-decoration:underline; color:#0000cc; cursor:pointer;" onclick="show(' + idxpage + ');">' + (idxpage) + '</p>'
				}
			}
			if(stxt.length > 0)stxt = stxt + '<br clear="all" />';

			for(idx = 0; idx < osp.length; idx++){
				var nodeID = getNodeValue(osp[idx], 'id');
				var nodeLat = getNodeValue(osp[idx], 'lat');
				var nodeLng = getNodeValue(osp[idx], 'lng');
				var nodePT = getNodeValue(osp[idx], 'picturetype');
				var nodeDVC = getNodeValue(osp[idx], 'deletevotecnt');
				var nodeDeleteVoteFlag = getNodeValue(osp[idx], 'deletevoteflg');
				var iconname = '';

				if(nodeDVC > 0 || nodeDeleteVoteFlag == '2'){iconname = 'delete' + (idx + 1);}
				else if(nodePT == '2'){iconname = 'studio' + (idx + 1);}
				else if(nodePT == '1'){iconname = (idx + 1);}

				stxt = stxt + htmlInfoBlock(osp[idx], idx + 1, nodeID, nodeLat, nodeLng, nodeDeleteVoteFlag);
				var latlng = new GPoint(nodeLng, nodeLat);
				icon.image = '/img/map/' + iconname + '.png';
				map.addOverlay(createMarker(latlng, icon, idx + 1, nodeID, htmlInfoWindow(osp[idx], nodeID, nodeLat, nodeLng, nodeDeleteVoteFlag)));
			}
			if(document.getElementById('infoblock')){
				document.getElementById('infoblock').innerHTML = stxt;
				if(osp.length == 0){document.getElementById('infoblock').innerHTML = '<p style="padding:5px; border:1px solid #ff0000; background-color:#ffcccc; color:#333333;"><b>表示中のエリアに証明写真機の設置情報がありません。</b></p>';}
				if(thispage == 0){
					show(1);
					thispage = 1;
				}else if(thispage > (parseInt((thispage - 1) / pagesize) + 1) && mode != 1){
					show(1);
					thispage = 1;
				}else if(mode != 1){
					show(thispage);
				}
			}
			flgreload = false;
		}

		if(document.getElementById('idnowloading')){
			document.getElementById('idnowloading').style.display = 'none';
		}
	}
}

/*XML文書から指定の要素名の値を取得*/
function getNodeValue(vobj, vtagname){
	if(!vobj.getElementsByTagName(vtagname)[0].firstChild)return '';
	return vobj.getElementsByTagName(vtagname)[0].firstChild.nodeValue;
}

/*右ブロックの証明写真機情報をページを指定して表示する*/
function show(vpage){
	var min = (vpage - 1) * pagesize + 1;
	var max = vpage * pagesize;

	thispage = vpage;

	for(var idx = 1; document.getElementById('infoblock' + idx); idx++){
		if(idx >= min && idx <= max){
			document.getElementById('infoblock' + idx).style.display = 'block';
		}else{
			document.getElementById('infoblock' + idx).style.display = 'none';
		}
	}
}

/*証明写真機アイコンを作成してそのオブジェクトを返す*/
function createMarker(vpoint, vicon, vidx, vid, vinfohtml){
	var marker = new GMarker(vpoint, vicon);
	var showpage = parseInt((vidx - 1) / pagesize) + 1;
	GEvent.addListener(marker, 'click', clickMarker);
	afuncs.push(clickMarker);

	return marker;

	function clickMarker(){
		if(mode == 1)return;
		//map.setCenter(new GLatLng(marker.getPoint().lat(), marker.getPoint().lng()), thiszoomlevel);
		marker.openInfoWindowHtml(vinfohtml);
	}
}

/*登録アイコンを作成してそのオブジェクトを返す*/
function createRegMarker(vpoint, vicon){
	var marker = new GMarker(vpoint, vicon);
	GEvent.addListener(marker, 'click', removeMarker);
	return marker;

	function removeMarker(){
		document.getElementById('lat').value = '';
		document.getElementById('lng').value = '';
		map.removeOverlay(marker);
	}
}

/*地図の位置情報を検索する*/
function showAddressPlace(vaddress) {
	flgreload = true;
	geocoder.getLatLng(vaddress, setPoint);

	function setPoint(point){
		if(!point) {
			alert('「' + vaddress + '」の位置が見つかりませんでした。');
		} else {
			map.setCenter(point);
		}
	}
}

/*閲覧・登録モードを切り替える*/
function chgMode(vmode){
	var owrap = document.getElementById('wrap');
	var oiptlat = document.getElementById('lat');
	var oiptlng = document.getElementById('lng');
	var oiptplace = document.getElementById('place');
	var oiptpricemonochrome = document.getElementById('pricemonochrome');
	var oiptpricecolor = document.getElementById('pricecolor');
	var oiptremark = document.getElementById('remark');
	var oimgmodeview = document.getElementById('imgmodeview');
	var oimgmoderegist = document.getElementById('imgmoderegist');
	var osearchblock = document.getElementById('searchblock');
	var oreg = document.getElementById('regblock');
	var oinfo = document.getElementById('infoblock');
	var owrapinfo = document.getElementById('informationwrap');
	var obg = document.getElementById('background');
	var oid = document.getElementById('id');
	var obtnreg = document.getElementById('btnreg');

	/* string */
	var oregtitle = document.getElementById('regtitle');
	var obtnreg = document.getElementById('btnreg');

	mode = vmode;
	if(!mode)mode = 0;

	if(mode == 0){
		oimgmodeview.src = '/img/map/modeviewon.gif';
		oimgmoderegist.src = '/img/map/moderegistoff.gif';
		owrapinfo.style.backgroundImage = 'url(/img/map/bgmodeview.png)';
		obg.style.backgroundImage = 'url(/img/map/bgbodymodeview.png)';
		owrap.style.backgroundImage = 'url(/img/map/bgmodeview.png)';
		map.enableDragging();
		map.enableInfoWindow();
		if(!olargemapctrl)olargemapctrl = new GLargeMapControl();
		if(!omaptypectrl)omaptypectrl = new GMapTypeControl();
		map.addControl(olargemapctrl);
		map.addControl(omaptypectrl);

		oid.value = '';
		oiptlat.value = '';
		oiptlng.value = '';
		oiptplace.value = '';
		oiptpricemonochrome.value = '';
		oiptpricecolor.value = '';
		oiptremark.value = '';
		obtnreg.value = '登　録';
		oreg.style.display = 'none';
		oinfo.style.display = 'block';
		osearchblock.style.display = 'block';

		viewOverlaysXML();
		show(thispage);
	}else{
		oimgmodeview.src = '/img/map/modeviewoff.gif';
		oimgmoderegist.src = '/img/map/moderegiston.gif';
		owrapinfo.style.backgroundImage = 'url(/img/map/bgmoderegist.png)';
		obg.style.backgroundImage = 'url(/img/map/bgbodymoderegist.png)';
		owrap.style.backgroundImage = 'url(/img/map/bgmoderegist.png)';
		map.disableDragging();
		map.disableInfoWindow();
		map.removeControl(olargemapctrl);
		map.removeControl(omaptypectrl);
		oreg.style.display = 'block';
		oinfo.style.display = 'none';
		osearchblock.style.display = 'none';
	}
}

/*登録モードの登録処理*/
function regist(){
	var idx;
	var aipt;
	var oiptlat = document.getElementById('lat');
	var oiptlng = document.getElementById('lng');
	var oiptplace = document.getElementById('place');
	var oiptpricemonochrome = document.getElementById('pricemonochrome');
	var oiptpricecolor = document.getElementById('pricecolor');
	var oiptremark = document.getElementById('remark');
	var oid = document.getElementById('id');
	var opassword = document.getElementById('password');
	var omail = document.getElementById('mailaddress');

	oiptlat.style.backgroundColor = '';
	oiptlng.style.backgroundColor = '';
	oiptplace.style.backgroundColor = '';
	oiptpricemonochrome.style.backgroundColor = '';
	oiptpricecolor.style.backgroundColor = '';

	if(delSpace(oiptlat.value).length == 0){
		alert('証明写真機の設置場所を指定して下さい。');
		return false;
	}
	if(delSpace(oiptlng.value).length == 0){
		alert('証明写真機の設置場所を指定して下さい。');
		return false;
	}
	if(delSpace(oiptplace.value).length == 0){
		alert('場所を入力して下さい。');
		return errInput(oiptplace);
	}
	if(oiptplace.value.match(/["'#%&;]/)){
		alert('場所に下記の文字は使用できません。\n\" \' # % ;');
		return errInput(oiptplace);
	}
	if(opassword.value.length == 0){
		alert('パスワードを入力して下さい。');
		return errInput(opassword);
	}
	if(opassword.value.length < 3 || opassword.value.length > 8){
		alert('パスワードの文字数は３～８文字です。');
		return errInput(opassword);
	}
	if(opassword.value.match(/[^\w]/)){
		alert('パスワードに記号は使用できません。英数字のみで入力して下さい。');
		return errInput(opassword);
	}
	if(ChkMail(omail.value) == false){
		alert('処理できないメールアドレスです。');
		return errInput(omail);
	}
/*
	if(delSpace(oiptpricemonochrome.value).length == 0
	&& delSpace(oiptpricecolor.value).length == 0){
		alert('料金を入力して下さい。');
		errInput(oiptpricemonochrome);
		errInput(oiptpricecolor);
		return false;
	}
*/

	document.getElementById('frmreg').submit();
}

/*登録時にエラーのある入力項目をハイライト*/
function errInput(vobj){
	if(!vobj)return false;
	vobj.style.backgroundColor = '#ffff00';
	vobj.focus();
	return false;
}

/*入力内容からスペースを除く*/
function delSpace(value){
	if(!value)return '';
	return value.replace('　','').replace(' ', '');
}

/*右ブロックの証明写真機情報一つ分のHTMLを作成して返す*/
function htmlInfoBlock(vobj, vidx, vid, vlat, vlng, vflg){
	var shtml = '';
	var splace = '<span id="viewplace' + vid + '">' + getNodeValue(vobj, 'place') + '</span>';
	var sremark = '<span id="viewremark' + vid + '">' + getNodeValue(vobj, 'remark') + '</span>';
	var spricemonochrome = getNodeValue(vobj, 'pricemonochrome');
	var spricecolor = getNodeValue(vobj, 'pricecolor');
	var supdatebutton;
	var sdeletebutton;
	if(spricemonochrome.length > 0){
		spricemonochrome = '<span id="viewpricemonochrome' + vid + '">' + spricemonochrome + '</span>円';
	}else{
		spricemonochrome = '<span id="viewpricemonochrome' + vid + '"></span>';
	}

	if(spricecolor.length > 0){
		spricecolor = '<span id="viewpricecolor' + vid + '">' + spricecolor + '</span>円';
	}else{
		spricecolor = '<span id="viewpricecolor' + vid + '"></span>';
	}

	/* button */
	supdatebutton = '<input type="button" value="編集する" onclick="document.getElementById(\'id\').value=\'' + vid + '\'; aeditfuncs[' + (vidx - 1) + '](); chgMode(1);" />';

	if(vflg == '0'){
		//sdeletebutton = '<input type="button" value="削除依頼" onclick="var sdelrsn = prompt(\'削除理由\', \'\'); if(sdelrsn){this.form.deletereason' + vid + '.value = sdelrsn; this.form.submit();}" />';
		sdeletebutton = '<input type="button" value="削除依頼" onclick="this.form.submit();" />';
	}else{
		sdeletebutton = '<input type="button" value="削除依頼済" disabled="disabled" />';
	}

	aeditfuncs.push(putEditData);

	shtml = '<table id="infoblock' + vidx + '" style="width:180px;">'
		+ '<caption style="padding:0px 5px 2px 5px; border:1px solid #006600; text-align:left; border-collapse:collapse; background-image:url(/img/snotitle.gif);"><img src="/img/map/no' + vidx + '.gif" alt="" style="cursor:pointer;" onclick="afuncs[' + (vidx - 1) + ']();" /></caption>'
		+ '<tbody>'
		+ '<tr><td valign="top" style="width:20px;"><img src="/img/map/place.gif" alt="証明写真機設置場所"></td><td style="width:180px; text-align:left;">' + splace + '</td></tr>'
		+ '<tr><td valign="top" style="width:20px;"><img src="/img/map/other.gif" alt="その他特筆事項"></td><td style="width:180px; text-align:left;">' + sremark + '</td></tr>'
		+ '<tr><td valign="top" style="width:20px;"><img src="/img/map/monochrome.gif" alt="モノクロ証明写真料金"></td><td style="width:180px; text-align:left;">' + spricemonochrome + '</td></tr>'
		+ '<tr><td valign="top" style="width:20px;"><img src="/img/map/color.gif" alt="カラー証明写真料金"></td><td style="width:180px; text-align:left;">' + spricecolor + '</td></tr>'
		+ '<tr><td colspan="2" valign="top" align="right"><form id="frmdelete' + vid + '" action="./speedpicture_del_sendmail.asp" method="post" style="margin:0px;"><input type="hidden" name="conf_deleteid" value="' + vid + '" /><input type="hidden" name="conf_lat" value="' + vlat + '" /><input type="hidden" name="conf_lng" value="' + vlng + '" />' + supdatebutton + '&nbsp;' + sdeletebutton + '</form></td></tr>'
		+ '</tbody>'
		+ '</table>';
	return shtml;

	function putEditData(){
		var olat = document.getElementById('lat');
		var olng = document.getElementById('lng');
		var opictypesp = document.getElementById('picturetypesp');
		var opictypest = document.getElementById('picturetypest');
		var oplace = document.getElementById('place');
		var oremark = document.getElementById('remark');
		var opricemonochrome = document.getElementById('pricemonochrome');
		var opricecolor = document.getElementById('pricecolor');
		var obtnreg = document.getElementById('btnreg');

		var oviewplace = document.getElementById('viewplace' + vid);
		var oviewremark = document.getElementById('viewremark' + vid);
		var oviewpricemonochrome = document.getElementById('viewpricemonochrome' + vid);
		var oviewpricecolor = document.getElementById('viewpricecolor' + vid);

		if(getNodeValue(vobj, 'picturetype') == '1'){
			opictypesp.checked = true;
			opictypest.checked = false;
		}else if(getNodeValue(vobj, 'picturetype') == '2'){
			opictypesp.checked = false;
			opictypest.checked = true;
		}

		olat.value = vlat;
		olng.value = vlng;
		oplace.value = oviewplace.innerHTML;
		oremark.value = oviewremark.innerHTML;
		opricemonochrome.value = oviewpricemonochrome.innerHTML;
		opricecolor.value = oviewpricecolor.innerHTML;
		obtnreg.value = '編　集';
	}
}

/*証明写真機オブジェクトをクリックした際の情報窓のHTMLを作成して返す*/
function htmlInfoWindow(vobj, vid, vlat, vlng, vflg){
	var shtml = '';
	var splace = getNodeValue(vobj, 'place');
	var spricemonochrome = getNodeValue(vobj, 'pricemonochrome');
	var spricecolor = getNodeValue(vobj, 'pricecolor');
	var sremark = getNodeValue(vobj, 'remark');
	if(spricemonochrome.length > 0)spricemonochrome = '￥' + spricemonochrome;
	if(spricecolor.length > 0)spricecolor = '￥' + spricecolor;

	shtml = '<table style="width:200px;">'
		+ '<tbody>'
		+ '<tr><td valign="top" style="width:20px;"><img src="/img/map/place.gif" alt="証明写真機設置場所"></td><td style="width:180px; text-align:left;">' + splace + '</td></tr>'
		+ '<tr><td valign="top" style="width:20px;"><img src="/img/map/other.gif" alt="その他特筆事項"></td><td style="width:180px; text-align:left;">' + sremark + '</td></tr>'
		+ '<tr><td valign="top" style="width:20px;"><img src="/img/map/monochrome.gif" alt="モノクロ証明写真料金"></td><td style="width:180px; text-align:left;">' + spricemonochrome + '</td></tr>'
		+ '<tr><td valign="top" style="width:20px;"><img src="/img/map/color.gif" alt="カラー証明写真料金"></td><td style="width:180px; text-align:left;">' + spricecolor + '</td></tr>'
		+ '</tbody>'
		+ '</table>';
	return shtml;
}

/*ウィンドウサイズが変更になった際の処理*/
function resize(){
	if(!map)return;
	flgreload = false;

	var obackground = document.getElementById('background');
	var oheader = document.getElementById('headerblock');
	var ofooter = document.getElementById('footerblock');
	var osearch = document.getElementById('searchblock');
	var oiconexplanation = document.getElementById('iconexplanationblock');

	var oinfo = document.getElementById('informationwrap');
	var omap = document.getElementById('map');

	/* height */
	var contentsheight = obackground.offsetHeight
		- oheader.offsetHeight - oheader.style.marginBottom
		- ofooter.offsetHeight - ofooter.style.marginBottom;
	var infoheight = contentsheight - osearch.offsetHeight - osearch.style.marginBottom;
	var mapheight = contentsheight - omap.style.marginBottom
		- oiconexplanation.offsetHeight - oiconexplanation.style.marginBottom;

	/* width */
	var contentswidth = parseInt(obackground.offsetWidth * 0.9);
	var mapwidth = contentswidth - oinfo.offsetWidth - 10;

	if(ohttp){
		if(document.body.readyState == 'complete' && ohttp.readyState == 4){
			//alert('[clientHeight]'+document.body.clientHeight+'[offsetHeight]'+obackground.offsetHeight);
			if(document.body.clientHeight == obackground.offsetHeight && document.body.clientWidth == obackground.offsetWidth){
				oinfo.style.height = infoheight;
				omap.style.height = mapheight;
				omap.style.width = mapwidth;
				drawSpeedPicture();
			}
		}
	}
}

/*メアドチェック*/
function ChkMail(vmail){
	if(vmail.match(/^[\dA-Za-z][\w\.\-]*[@][\dA-Za-z][\w\.\-]*[\.][\dA-Za-z][\w\.\-]*[\d\w]$/) != null){
		if(vmail.indexOf('..') == -1)return true;
	}
	return false;
}

function chgType(){
	document.getElementById('idnowloading').style.display = 'block';
	flgreload = true;
	mapMoveend();
}

